[rust_crates] Add crates harfbuzz, freetype, and their dependencies

Full list of new crates:
- core-foundation       OSRB-160
- core-foundation-sys   OSRB-160
- core-graphics         OSRB-159
- core-text             OSRB-162
- foreign-types         OSRB-161
- foreign-types-shared  OSRB-161
- freetype              OSRB-148
- harfbuzz              OSRB-150
- harfbuzz-sys          OSRB-151

Also:
- Add tiny_mirrors replacements for cmake and pkg-config crates, which are
optional transitive dependencies of the harfbuzz and freetype crates, but which
we do not need or support in our build system.
- In //third_party/rust_crates/.cargo/config, add overrides to bypass building
the native harfbuzz and freetype libraries inside their wrapper crates, and
instead link to the versions of these libraries already built in our tree.

TEXT-60 #comment

Change-Id: Ieb9cfb08bcc1c909168a413f2e2af8d558728cb8
diff --git a/garnet/.cargo/config b/garnet/.cargo/config
index 31098fa..1702a9e 100644
--- a/garnet/.cargo/config
+++ b/garnet/.cargo/config
@@ -6,3 +6,26 @@
 
 [build]
 target-dir = "../out/cargo_target"
+
+# Override the harfbuzz and freetype crates' build scripts, and instead link to our existing
+# versions of the native libraries.
+# See https://doc.rust-lang.org/cargo/reference/build-scripts.html#overriding-build-scripts.
+# Keep in sync with //third_party/rust_crates/.cargo/config.
+
+[target.x86_64-fuchsia.harfbuzz]
+rustc-link-lib = ["harfbuzz"]
+
+[target.x86_64-unknown-linux-gnu.harfbuzz]
+rustc-link-lib = ["harfbuzz"]
+
+[target.x86_64-apple-darwin.harfbuzz]
+rustc-link-lib = ["harfbuzz"]
+
+[target.x86_64-fuchsia.freetype]
+rustc-link-lib = ["freetype2"]
+
+[target.x86_64-unknown-linux-gnu.freetype]
+rustc-link-lib = ["freetype2"]
+
+[target.x86_64-apple-darwin.freetype]
+rustc-link-lib = ["freetype2"]
diff --git a/third_party/rust_crates/.cargo/config b/third_party/rust_crates/.cargo/config
index 4fbd2de..0b1423f 100644
--- a/third_party/rust_crates/.cargo/config
+++ b/third_party/rust_crates/.cargo/config
@@ -6,3 +6,26 @@
 
 [build]
 target-dir = "../../out/cargo_target"
+
+# Override the harfbuzz and freetype crates' build scripts, and instead link to our existing
+# versions of the native libraries.
+# See https://doc.rust-lang.org/cargo/reference/build-scripts.html#overriding-build-scripts.
+# Keep in sync with //garnet/.cargo/config.
+
+[target.x86_64-fuchsia.harfbuzz]
+rustc-link-lib = ["harfbuzz"]
+
+[target.x86_64-unknown-linux-gnu.harfbuzz]
+rustc-link-lib = ["harfbuzz"]
+
+[target.x86_64-apple-darwin.harfbuzz]
+rustc-link-lib = ["harfbuzz"]
+
+[target.x86_64-fuchsia.freetype]
+rustc-link-lib = ["freetype2"]
+
+[target.x86_64-unknown-linux-gnu.freetype]
+rustc-link-lib = ["freetype2"]
+
+[target.x86_64-apple-darwin.freetype]
+rustc-link-lib = ["freetype2"]
diff --git a/third_party/rust_crates/Cargo.lock b/third_party/rust_crates/Cargo.lock
index f572b77..929d2658 100644
--- a/third_party/rust_crates/Cargo.lock
+++ b/third_party/rust_crates/Cargo.lock
@@ -268,6 +268,42 @@
 ]
 
 [[package]]
+name = "core-foundation"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "core-graphics"
+version = "0.17.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "core-text"
+version = "13.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "crc"
 version = "1.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -500,6 +536,27 @@
 ]
 
 [[package]]
+name = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "freetype"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "fuchsia-cprng"
 version = "0.1.1"
 
@@ -526,9 +583,11 @@
  "eui48 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "font-rs 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "freetype 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures-preview 0.3.0-alpha.13 (registry+https://github.com/rust-lang/crates.io-index)",
  "getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
  "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "harfbuzz 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -748,6 +807,25 @@
 ]
 
 [[package]]
+name = "harfbuzz"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "harfbuzz-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "harfbuzz-sys"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-text 13.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "freetype 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "heck"
 version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2216,6 +2294,14 @@
 version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[patch.unused]]
+name = "cmake"
+version = "0.1.99"
+
+[[patch.unused]]
+name = "pkg-config"
+version = "0.3.99"
+
 [metadata]
 "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c"
 "checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e"
@@ -2252,6 +2338,10 @@
 "checksum chunked_transfer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "498d20a7aaf62625b9bf26e637cf7736417cde1d0c99f1d04d1170229a85cf87"
 "checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e"
 "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
+"checksum core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4e2640d6d0bf22e82bed1b73c6aef8d5dd31e5abe6666c57e6d45e2649f4f887"
+"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b"
+"checksum core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)" = "56790968ab1c8a1202a102e6de05fc6e1ec87da99e4e93e9a7d13efbfc1e95a9"
+"checksum core-text 13.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7210eea4baa4b51d7319d90e4787d8a2b472c8d5d9926dc39be85fecac0e6df7"
 "checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb"
 "checksum crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e91d5240c6975ef33aeb5f148f35275c25eda8e8a5f95abe421978b05b8bf192"
 "checksum crossbeam 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "24ce9782d4d5c53674646a6a4c1863a21a8fc0cb649b3c94dfc16e45071dea19"
@@ -2279,6 +2369,9 @@
 "checksum flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2291c165c8e703ee54ef3055ad6188e3d51108e2ded18e9f2476e774fc5ad3d4"
 "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
 "checksum font-rs 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "33939d997b0ef798cc92c9cc49a535c9b085273e121cc8e8281561be1fd76cd2"
+"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+"checksum freetype 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "11926b2b410b469d0e9399eca4cbbe237a9ef02176c485803b29216307e8e028"
 "checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b"
 "checksum futures-channel-preview 0.3.0-alpha.13 (registry+https://github.com/rust-lang/crates.io-index)" = "d55b12e2746710757f794670bc4e0461097e8873a6d21a48b3f4bf2f5b44053b"
 "checksum futures-core-preview 0.3.0-alpha.13 (registry+https://github.com/rust-lang/crates.io-index)" = "0788448b9b2fc2ca1956f735ac7073745486d6729b44dd083e274f710d1268b0"
@@ -2294,6 +2387,8 @@
 "checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
 "checksum gzip-header 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9e59524a909fe98bb6c6f2cf1f27f2f6772887a496bf4c68cae0d94f884586"
 "checksum h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ddb2b25a33e231484694267af28fec74ac63b5ccf51ee2065a5e313b834d836e"
+"checksum harfbuzz 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "46f7426266a5ece3e49eae6f48e602c0f8c39917354a847eac9c06437dcde8da"
+"checksum harfbuzz-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "617d896521b45c5f131bc2b587c053fcdf89da2eee389b9b473310fb624d1af8"
 "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
 "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77"
 "checksum http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "1a10e5b573b9a0146545010f50772b9e8b1dd0a256564cc4307694c68832a2f5"
diff --git a/third_party/rust_crates/Cargo.toml b/third_party/rust_crates/Cargo.toml
index 008be4b..6b33d81 100644
--- a/third_party/rust_crates/Cargo.toml
+++ b/third_party/rust_crates/Cargo.toml
@@ -28,9 +28,11 @@
 eui48 = { version = "0.4.6", features = ["serde", "disp_hexstring"] }
 failure = "0.1.1"
 font-rs = "0.1.3"
+freetype = { version = "0.4", default-features = false }
 futures-preview = { version = "=0.3.0-alpha.13", features = ["io-compat"] }
 getopts = "0.2"
 glob = "0.3.0"
+harfbuzz = { version = "0.3.1", default-features = false }
 heck = "0.3.1"
 hex = "0.3.2"
 http = "0.1"
@@ -107,15 +109,20 @@
 quote = "0.6.10"
 syn = { version = "0.15.25", features = ["full", "visit-mut"] }
 
+# For crates that we don't want to vendor, create a dummy package in tiny_mirrors/ (see existing
+# examples.
 [patch.crates-io]
+# Keep this sorted alphabetically, please.
 backtrace-sys = { path = "tiny_mirrors/backtrace-sys" }
+cmake = { path = "tiny_mirrors/cmake"}
 fuchsia-cprng = { path = "../../garnet/public/rust/fuchsia-cprng" }
+pkg-config = { path = "tiny_mirrors/pkg-config" }
 rust-crypto = { path = "../rust-mirrors/rust-crypto" }
+winapi = { path = "tiny_mirrors/winapi" }
+winapi-util = { path = "tiny_mirrors/winapi-util" }
 xi-core-lib = { path = "../rust-mirrors/xi-editor/rust/core-lib" }
 xi-rope = { path = "../rust-mirrors/xi-editor/rust/rope" }
 xi-rpc = { path = "../rust-mirrors/xi-editor/rust/rpc" }
 xi-trace = { path = "..//rust-mirrors/xi-editor/rust/trace" }
 xi-trace-dump = { path = "../rust-mirrors/xi-editor/rust/trace-dump" }
 xi-unicode = { path = "../rust-mirrors/xi-editor/rust/unicode" }
-winapi = { path = "tiny_mirrors/winapi" }
-winapi-util = { path = "tiny_mirrors/winapi-util" }
diff --git a/third_party/rust_crates/tiny_mirrors/cmake/Cargo.toml b/third_party/rust_crates/tiny_mirrors/cmake/Cargo.toml
new file mode 100644
index 0000000..c14c42e
--- /dev/null
+++ b/third_party/rust_crates/tiny_mirrors/cmake/Cargo.toml
@@ -0,0 +1,4 @@
+[package]
+name = "cmake"
+version = "0.1.99"
+authors = ["The Fuchsia Authors <rust-fuchsia@fuchsia.com>"]
diff --git a/third_party/rust_crates/tiny_mirrors/cmake/src/lib.rs b/third_party/rust_crates/tiny_mirrors/cmake/src/lib.rs
new file mode 100644
index 0000000..822d3f4
--- /dev/null
+++ b/third_party/rust_crates/tiny_mirrors/cmake/src/lib.rs
@@ -0,0 +1,3 @@
+// Copyright 2019 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
diff --git a/third_party/rust_crates/tiny_mirrors/pkg-config/Cargo.toml b/third_party/rust_crates/tiny_mirrors/pkg-config/Cargo.toml
new file mode 100644
index 0000000..2da39b4
--- /dev/null
+++ b/third_party/rust_crates/tiny_mirrors/pkg-config/Cargo.toml
@@ -0,0 +1,4 @@
+[package]
+name = "pkg-config"
+version = "0.3.99"
+authors = ["The Fuchsia Authors <rust-fuchsia@fuchsia.com>"]
\ No newline at end of file
diff --git a/third_party/rust_crates/tiny_mirrors/pkg-config/src/lib.rs b/third_party/rust_crates/tiny_mirrors/pkg-config/src/lib.rs
new file mode 100644
index 0000000..822d3f4
--- /dev/null
+++ b/third_party/rust_crates/tiny_mirrors/pkg-config/src/lib.rs
@@ -0,0 +1,3 @@
+// Copyright 2019 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/.cargo-checksum.json b/third_party/rust_crates/vendor/core-foundation-sys/.cargo-checksum.json
new file mode 100644
index 0000000..72cdec6
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"Cargo.toml":"dc9a55f461f23bf82bb9b3ee7d9b74807b7a905e31f05074bb05b5e3cb1ab267","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","build.rs":"9433ed3b20cc99e716dda4c6d8507c29bc04882544cbbea8d4e48ba80fd0fa12","src/array.rs":"40c305658e16b07d86353a5ad34e7b5fb98720f19cc2b5173360d6a61ce2642f","src/attributed_string.rs":"693b6c745c5aef1929595c94363d500b4b25ebcfed0b4b8dee0103b8fc0537f8","src/base.rs":"f0f8424099a4269e2359b063c3f055e115aec6df0f6aa71695ca91257dfd64e2","src/bundle.rs":"e8ad47f9f0280e1eef7e9aea2eb88020443953ac2cda234396321450ffc3d48a","src/data.rs":"4547e98f4e25a99606d8f33e82f8de3d9889612485d445d4467138b8ad29b7e9","src/date.rs":"c064ee4c3ebd1927532c34871e2e41179d6e3c3e400f6b409a18ad9e2337477f","src/dictionary.rs":"3327a6f90f1e0db5e3fde1973e2df4143ca896716a816d03f2b17c8e988c5159","src/error.rs":"6205ebeb7631daa8bcd560862b6daa10f640c8c117ce5f6f7184f268dcbcb42a","src/filedescriptor.rs":"49580654b657811fade7adaa256f5f895cb011c9baa4731e2f44a6ec7fdba235","src/lib.rs":"af7183760214be155e2cf562bf4265bd2d73da079e35d05e29ea0146e3c87654","src/messageport.rs":"e9227d5907cba8e29cdeea41bcb3ae5c7840220442953ab19aace31a84542f47","src/number.rs":"b1154203e74cb2258ba5520e20bcd4d524f1a957e09a19dd026b18d23baa3868","src/propertylist.rs":"7ec928438826c4ce40befedf3de0a37c8ecbc0fc17896dfa629d5864000b2cfe","src/runloop.rs":"67a6c2e4773f13de9452c9f8e4791b9889e03e56c07a7bdf64dbba99e9821f45","src/set.rs":"8aef5f4ba75a067e271ad6cb960569f1d22a0acee0eb6c79e31bb8b636619d9d","src/string.rs":"3ebfa11bba928d0ab1b07ecc0bd0f11367642eb818c8e21f08c16a4be8f9494f","src/timezone.rs":"42741f556af081be32987d2705488959c60aeb794e7c737b092f0dce5851ca89","src/url.rs":"4cd2950660ad234f7f833b3f5c092f7322465085452cca8ced623564400cdef9","src/uuid.rs":"82f75efa73d0842dff2e13d299c166c6593a77fcb69c4b7629a2df1c17ae507d"},"package":"e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b"}
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/Cargo.toml b/third_party/rust_crates/vendor/core-foundation-sys/Cargo.toml
new file mode 100644
index 0000000..565583b
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/Cargo.toml
@@ -0,0 +1,27 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "core-foundation-sys"
+version = "0.6.2"
+authors = ["The Servo Project Developers"]
+build = "build.rs"
+description = "Bindings to Core Foundation for OS X"
+homepage = "https://github.com/servo/core-foundation-rs"
+license = "MIT / Apache-2.0"
+repository = "https://github.com/servo/core-foundation-rs"
+
+[dependencies]
+
+[features]
+mac_os_10_7_support = []
+mac_os_10_8_features = []
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/LICENSE-APACHE b/third_party/rust_crates/vendor/core-foundation-sys/LICENSE-APACHE
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/LICENSE-MIT b/third_party/rust_crates/vendor/core-foundation-sys/LICENSE-MIT
new file mode 100644
index 0000000..807526f
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2012-2013 Mozilla Foundation
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/build.rs b/third_party/rust_crates/vendor/core-foundation-sys/build.rs
new file mode 100644
index 0000000..1f03b06
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/build.rs
@@ -0,0 +1,14 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+fn main() {
+    if std::env::var("TARGET").unwrap().contains("-apple") {
+        println!("cargo:rustc-link-lib=framework=CoreFoundation");
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/array.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/array.rs
new file mode 100644
index 0000000..5090302
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/array.rs
@@ -0,0 +1,55 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+
+use base::{CFRange, CFIndex, CFAllocatorRef, CFTypeID, Boolean};
+use string::CFStringRef;
+
+pub type CFArrayRetainCallBack = extern "C" fn(allocator: CFAllocatorRef, value: *const c_void) -> *const c_void;
+pub type CFArrayReleaseCallBack = extern "C" fn(allocator: CFAllocatorRef, value: *const c_void);
+pub type CFArrayCopyDescriptionCallBack = extern "C" fn(value: *const c_void) -> CFStringRef;
+pub type CFArrayEqualCallBack = extern "C" fn(value1: *const c_void, value2: *const c_void) -> Boolean;
+
+#[repr(C)]
+#[derive(Clone, Copy)]
+pub struct CFArrayCallBacks {
+    pub version: CFIndex,
+    pub retain: CFArrayRetainCallBack,
+    pub release: CFArrayReleaseCallBack,
+    pub copyDescription: CFArrayCopyDescriptionCallBack,
+    pub equal: CFArrayEqualCallBack,
+}
+
+#[repr(C)]
+pub struct __CFArray(c_void);
+
+pub type CFArrayRef = *const __CFArray;
+
+extern {
+    /*
+     * CFArray.h
+     */
+    pub static kCFTypeArrayCallBacks: CFArrayCallBacks;
+
+    pub fn CFArrayCreate(allocator: CFAllocatorRef, values: *const *const c_void,
+                     numValues: CFIndex, callBacks: *const CFArrayCallBacks) -> CFArrayRef;
+    pub fn CFArrayCreateCopy(allocator: CFAllocatorRef , theArray: CFArrayRef) -> CFArrayRef;
+    
+    // CFArrayBSearchValues
+    // CFArrayContainsValue
+    pub fn CFArrayGetCount(theArray: CFArrayRef) -> CFIndex;
+    // CFArrayGetCountOfValue
+    // CFArrayGetFirstIndexOfValue
+    // CFArrayGetLastIndexOfValue
+    pub fn CFArrayGetValues(theArray: CFArrayRef, range: CFRange, values: *mut *const c_void);
+    pub fn CFArrayGetValueAtIndex(theArray: CFArrayRef, idx: CFIndex) -> *const c_void;
+    // CFArrayApplyFunction
+    pub fn CFArrayGetTypeID() -> CFTypeID;
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/attributed_string.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/attributed_string.rs
new file mode 100644
index 0000000..ecdffe6
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/attributed_string.rs
@@ -0,0 +1,56 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+use base::{CFAllocatorRef, CFTypeRef, CFIndex, CFRange, CFTypeID};
+use string::CFStringRef;
+use dictionary::CFDictionaryRef;
+
+#[repr(C)]
+pub struct __CFAttributedString(c_void);
+
+pub type CFAttributedStringRef = *const __CFAttributedString;
+pub type CFMutableAttributedStringRef = *const __CFAttributedString;
+
+extern {
+    /* CFAttributedString */
+
+    pub fn CFAttributedStringCreate(
+        allocator: CFAllocatorRef,
+        str: CFStringRef,
+        attributes: CFDictionaryRef,
+    ) -> CFAttributedStringRef;
+
+    pub fn CFAttributedStringGetLength(astr: CFAttributedStringRef) -> CFIndex;
+
+    pub fn CFAttributedStringGetTypeID() -> CFTypeID;
+
+    /* CFMutableAttributedString */
+
+    pub fn CFAttributedStringCreateMutableCopy(
+        allocator: CFAllocatorRef, max_length: CFIndex, astr: CFAttributedStringRef
+    ) -> CFMutableAttributedStringRef;
+
+    pub fn CFAttributedStringCreateMutable(
+        allocator: CFAllocatorRef,
+        max_length: CFIndex,
+    ) -> CFMutableAttributedStringRef;
+
+    pub fn CFAttributedStringReplaceString(
+        astr: CFMutableAttributedStringRef, range: CFRange, replacement: CFStringRef);
+
+    pub fn CFAttributedStringSetAttribute(
+        astr: CFMutableAttributedStringRef,
+        range: CFRange,
+        attr_name: CFStringRef,
+        value: CFTypeRef,
+    );
+
+    pub fn CFMutableAttributedStringGetTypeID() -> CFTypeID;
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/base.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/base.rs
new file mode 100644
index 0000000..8cbae380
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/base.rs
@@ -0,0 +1,154 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::cmp::Ordering;
+use std::os::raw::{c_uint, c_long, c_ulong, c_void, c_int};
+use string::CFStringRef;
+
+pub type Boolean = u8;
+pub type CFIndex = c_long;
+pub type mach_port_t = c_uint;
+pub type CFAllocatorRef = *const c_void;
+pub type CFNullRef = *const c_void;
+pub type CFHashCode = c_ulong;
+pub type CFTypeID = c_ulong;
+pub type CFTypeRef = *const c_void;
+pub type CFOptionFlags = u32;
+pub type OSStatus = i32;
+pub type SInt32 = c_int;
+
+#[repr(i64)]
+#[derive(Clone, Copy)]
+pub enum CFComparisonResult {
+    LessThan = -1,
+    EqualTo = 0,
+    GreaterThan = 1,
+}
+
+impl Into<Ordering> for CFComparisonResult {
+    fn into(self) -> Ordering {
+        match self {
+            CFComparisonResult::LessThan => Ordering::Less,
+            CFComparisonResult::EqualTo => Ordering::Equal,
+            CFComparisonResult::GreaterThan => Ordering::Greater
+        }
+    }
+}
+
+#[repr(C)]
+#[derive(Clone, Copy)]
+pub struct CFRange {
+    pub location: CFIndex,
+    pub length: CFIndex
+}
+
+// for back-compat
+impl CFRange {
+    pub fn init(location: CFIndex, length: CFIndex) -> CFRange {
+        CFRange {
+            location: location,
+            length: length,
+        }
+    }
+}
+
+pub type CFAllocatorRetainCallBack = extern "C" fn(info: *mut c_void) -> *mut c_void;
+pub type CFAllocatorReleaseCallBack = extern "C" fn(info: *mut c_void);
+pub type CFAllocatorCopyDescriptionCallBack = extern "C" fn(info: *mut c_void) -> CFStringRef;
+pub type CFAllocatorAllocateCallBack = extern "C" fn(allocSize: CFIndex, hint: CFOptionFlags, info: *mut c_void) -> *mut c_void;
+pub type CFAllocatorReallocateCallBack = extern "C" fn(ptr: *mut c_void, newsize: CFIndex, hint: CFOptionFlags, info: *mut c_void) -> *mut c_void;
+pub type CFAllocatorDeallocateCallBack = extern "C" fn(ptr: *mut c_void, info: *mut c_void);
+pub type CFAllocatorPreferredSizeCallBack = extern "C" fn(size: CFIndex, hint: CFOptionFlags, info: *mut c_void) -> CFIndex;
+
+#[repr(C)]
+#[derive(Clone, Copy)]
+pub struct CFAllocatorContext {
+    pub version: CFIndex,
+    pub info: *mut c_void,
+    pub retain: CFAllocatorRetainCallBack,
+    pub release: CFAllocatorReleaseCallBack,
+    pub copyDescription: CFAllocatorCopyDescriptionCallBack,
+    pub allocate: CFAllocatorAllocateCallBack,
+    pub reallocate: CFAllocatorReallocateCallBack,
+    pub deallocate: CFAllocatorDeallocateCallBack,
+    pub preferredSize: CFAllocatorPreferredSizeCallBack
+}
+
+/// Trait for all types which are Core Foundation reference types.
+pub trait TCFTypeRef {
+    fn as_void_ptr(&self) -> *const c_void;
+
+    unsafe fn from_void_ptr(ptr: *const c_void) -> Self;
+}
+
+impl<T> TCFTypeRef for *const T {
+    fn as_void_ptr(&self) -> *const c_void {
+        (*self) as *const c_void
+    }
+
+    unsafe fn from_void_ptr(ptr: *const c_void) -> Self {
+        ptr as *const T
+    }
+}
+
+impl<T> TCFTypeRef for *mut T {
+    fn as_void_ptr(&self) -> *const c_void {
+        (*self) as *const T as *const c_void
+    }
+
+    unsafe fn from_void_ptr(ptr: *const c_void) -> Self {
+        ptr as *const T as *mut T
+    }
+}
+
+extern {
+    /*
+     * CFBase.h
+     */
+
+    /* CFAllocator Reference */
+
+    pub static kCFAllocatorDefault: CFAllocatorRef;
+    pub static kCFAllocatorSystemDefault: CFAllocatorRef;
+    pub static kCFAllocatorMalloc: CFAllocatorRef;
+    pub static kCFAllocatorMallocZone: CFAllocatorRef;
+    pub static kCFAllocatorNull: CFAllocatorRef;
+    pub static kCFAllocatorUseContext: CFAllocatorRef;
+
+    pub fn CFAllocatorCreate(allocator: CFAllocatorRef, context: *mut CFAllocatorContext) -> CFAllocatorRef;
+    pub fn CFAllocatorAllocate(allocator: CFAllocatorRef, size: CFIndex, hint: CFOptionFlags) -> *mut c_void;
+    pub fn CFAllocatorDeallocate(allocator: CFAllocatorRef, ptr: *mut c_void);
+    pub fn CFAllocatorGetPreferredSizeForSize(allocator: CFAllocatorRef, size: CFIndex, hint: CFOptionFlags) -> CFIndex;
+    pub fn CFAllocatorReallocate(allocator: CFAllocatorRef, ptr: *mut c_void, newsize: CFIndex, hint: CFOptionFlags) -> *mut c_void;
+    pub fn CFAllocatorGetDefault() -> CFAllocatorRef;
+    pub fn CFAllocatorSetDefault(allocator: CFAllocatorRef);
+    pub fn CFAllocatorGetContext(allocator: CFAllocatorRef, context: *mut CFAllocatorContext);
+    pub fn CFAllocatorGetTypeID() -> CFTypeID;
+
+    /* CFNull Reference */
+
+    pub static kCFNull: CFNullRef;
+
+    /* CFType Reference */
+
+    //fn CFCopyTypeIDDescription
+    //fn CFGetAllocator
+    pub fn CFCopyDescription(cf: CFTypeRef) -> CFStringRef;
+    pub fn CFEqual(cf1: CFTypeRef, cf2: CFTypeRef) -> Boolean;
+    pub fn CFGetRetainCount(cf: CFTypeRef) -> CFIndex;
+    pub fn CFGetTypeID(cf: CFTypeRef) -> CFTypeID;
+    pub fn CFHash(cf: CFTypeRef) -> CFHashCode;
+    //fn CFMakeCollectable
+    pub fn CFRelease(cf: CFTypeRef);
+    pub fn CFRetain(cf: CFTypeRef) -> CFTypeRef;
+    pub fn CFShow(obj: CFTypeRef);
+
+    /* Base Utilities Reference */
+    // N.B. Some things missing here.
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/bundle.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/bundle.rs
new file mode 100644
index 0000000..687b00e
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/bundle.rs
@@ -0,0 +1,36 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+
+use base::{CFTypeID, CFAllocatorRef};
+use url::CFURLRef;
+use dictionary::CFDictionaryRef;
+use string::CFStringRef;
+
+#[repr(C)]
+pub struct __CFBundle(c_void);
+
+pub type CFBundleRef = *mut __CFBundle;
+
+extern {
+    /*
+     * CFBundle.h
+     */
+    pub fn CFBundleCreate(allocator: CFAllocatorRef, bundleURL: CFURLRef) -> CFBundleRef;
+
+    pub fn CFBundleGetBundleWithIdentifier(bundleID: CFStringRef) -> CFBundleRef;
+    pub fn CFBundleGetFunctionPointerForName(bundle: CFBundleRef, function_name: CFStringRef) -> *const c_void;
+    pub fn CFBundleGetMainBundle() -> CFBundleRef;
+    pub fn CFBundleGetInfoDictionary(bundle: CFBundleRef) -> CFDictionaryRef;
+
+    pub fn CFBundleGetTypeID() -> CFTypeID;
+    pub fn CFBundleCopyExecutableURL(bundle: CFBundleRef) -> CFURLRef;
+    pub fn CFBundleCopyPrivateFrameworksURL(bundle: CFBundleRef) -> CFURLRef;
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/data.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/data.rs
new file mode 100644
index 0000000..51b3a4c
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/data.rs
@@ -0,0 +1,31 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+
+use base::{CFAllocatorRef, CFTypeID, CFIndex};
+
+#[repr(C)]
+pub struct __CFData(c_void);
+
+pub type CFDataRef = *const __CFData;
+
+extern {
+    /*
+     * CFData.h
+     */
+
+    pub fn CFDataCreate(allocator: CFAllocatorRef,
+                        bytes: *const u8, length: CFIndex) -> CFDataRef;
+    //fn CFDataFind
+    pub fn CFDataGetBytePtr(theData: CFDataRef) -> *const u8;
+    pub fn CFDataGetLength(theData: CFDataRef) -> CFIndex;
+
+    pub fn CFDataGetTypeID() -> CFTypeID;
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/date.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/date.rs
new file mode 100644
index 0000000..f83ce1d
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/date.rs
@@ -0,0 +1,34 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+
+use base::{CFAllocatorRef, CFComparisonResult, CFTypeID};
+
+#[repr(C)]
+pub struct __CFDate(c_void);
+
+pub type CFDateRef = *const __CFDate;
+
+pub type CFTimeInterval = f64;
+pub type CFAbsoluteTime = CFTimeInterval;
+
+extern {
+    pub static kCFAbsoluteTimeIntervalSince1904: CFTimeInterval;
+    pub static kCFAbsoluteTimeIntervalSince1970: CFTimeInterval;
+
+    pub fn CFAbsoluteTimeGetCurrent() -> CFAbsoluteTime;
+
+    pub fn CFDateCreate(allocator: CFAllocatorRef, at: CFAbsoluteTime) -> CFDateRef;
+    pub fn CFDateGetAbsoluteTime(date: CFDateRef) -> CFAbsoluteTime;
+    pub fn CFDateGetTimeIntervalSinceDate(date: CFDateRef, other: CFDateRef) -> CFTimeInterval;
+    pub fn CFDateCompare(date: CFDateRef, other: CFDateRef, context: *mut c_void) -> CFComparisonResult;
+
+    pub fn CFDateGetTypeID() -> CFTypeID;
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/dictionary.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/dictionary.rs
new file mode 100644
index 0000000..d10e9c1
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/dictionary.rs
@@ -0,0 +1,91 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+
+use base::{CFAllocatorRef, CFHashCode, CFIndex, CFTypeID, Boolean};
+use string::CFStringRef;
+
+pub type CFDictionaryApplierFunction = extern "C" fn(key: *const c_void, value: *const c_void, context: *mut c_void);
+
+pub type CFDictionaryRetainCallBack = extern "C" fn(allocator: CFAllocatorRef, value: *const c_void) -> *const c_void;
+pub type CFDictionaryReleaseCallBack = extern "C" fn(allocator: CFAllocatorRef, value: *const c_void);
+pub type CFDictionaryCopyDescriptionCallBack = extern "C" fn(value: *const c_void) -> CFStringRef;
+pub type CFDictionaryEqualCallBack = extern "C" fn(value1: *const c_void, value2: *const c_void) -> Boolean;
+pub type CFDictionaryHashCallBack = extern "C" fn(value: *const c_void) -> CFHashCode;
+
+#[repr(C)]
+#[derive(Clone, Copy)]
+pub struct CFDictionaryKeyCallBacks {
+    pub version: CFIndex,
+    pub retain: CFDictionaryRetainCallBack,
+    pub release: CFDictionaryReleaseCallBack,
+    pub copyDescription: CFDictionaryCopyDescriptionCallBack,
+    pub equal: CFDictionaryEqualCallBack,
+    pub hash: CFDictionaryHashCallBack
+}
+
+#[repr(C)]
+#[derive(Clone, Copy)]
+pub struct CFDictionaryValueCallBacks {
+    pub version: CFIndex,
+    pub retain: CFDictionaryRetainCallBack,
+    pub release: CFDictionaryReleaseCallBack,
+    pub copyDescription: CFDictionaryCopyDescriptionCallBack,
+    pub equal: CFDictionaryEqualCallBack
+}
+
+#[repr(C)]
+pub struct __CFDictionary(c_void);
+
+pub type CFDictionaryRef = *const __CFDictionary;
+pub type CFMutableDictionaryRef = *mut __CFDictionary;
+
+extern {
+    /*
+     * CFDictionary.h
+     */
+
+    pub static kCFTypeDictionaryKeyCallBacks: CFDictionaryKeyCallBacks;
+    pub static kCFTypeDictionaryValueCallBacks: CFDictionaryValueCallBacks;
+
+    pub fn CFDictionaryContainsKey(theDict: CFDictionaryRef, key: *const c_void) -> Boolean;
+    pub fn CFDictionaryCreate(allocator: CFAllocatorRef, keys: *const *const c_void, values: *const *const c_void,
+                              numValues: CFIndex, keyCallBacks: *const CFDictionaryKeyCallBacks,
+                              valueCallBacks: *const CFDictionaryValueCallBacks)
+                              -> CFDictionaryRef;
+    pub fn CFDictionaryGetCount(theDict: CFDictionaryRef) -> CFIndex;
+    pub fn CFDictionaryGetTypeID() -> CFTypeID;
+    pub fn CFDictionaryGetValueIfPresent(theDict: CFDictionaryRef, key: *const c_void, value: *mut *const c_void)
+                                         -> Boolean;
+    pub fn CFDictionaryApplyFunction(theDict: CFDictionaryRef,
+                                     applier: CFDictionaryApplierFunction,
+                                     context: *mut c_void);
+    pub fn CFDictionaryGetKeysAndValues(theDict: CFDictionaryRef,
+                                        keys: *mut *const c_void,
+                                        values: *mut *const c_void);
+
+    pub fn CFDictionaryCreateMutable(allocator: CFAllocatorRef, capacity: CFIndex,
+                                     keyCallbacks: *const CFDictionaryKeyCallBacks,
+                                     valueCallbacks: *const CFDictionaryValueCallBacks) -> CFMutableDictionaryRef;
+    pub fn CFDictionaryCreateMutableCopy(allocator: CFAllocatorRef, capacity: CFIndex,
+                                         theDict: CFDictionaryRef) -> CFMutableDictionaryRef;
+    pub fn CFDictionaryAddValue(theDict: CFMutableDictionaryRef,
+                                key: *const c_void,
+                                value: *const c_void);
+    pub fn CFDictionarySetValue(theDict: CFMutableDictionaryRef,
+                                key: *const c_void,
+                                value: *const c_void);
+    pub fn CFDictionaryReplaceValue(theDict: CFMutableDictionaryRef,
+                                    key: *const c_void,
+                                    value: *const c_void);
+    pub fn CFDictionaryRemoveValue(theDict: CFMutableDictionaryRef,
+                                   key: *const c_void);
+    pub fn CFDictionaryRemoveAllValues(theDict: CFMutableDictionaryRef);
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/error.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/error.rs
new file mode 100644
index 0000000..8a4c1d4
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/error.rs
@@ -0,0 +1,32 @@
+// Copyright 2016 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+
+use base::{CFTypeID, CFIndex};
+use string::CFStringRef;
+
+#[repr(C)]
+pub struct __CFError(c_void);
+
+pub type CFErrorRef = *mut __CFError;
+
+extern "C" {
+    pub fn CFErrorGetTypeID() -> CFTypeID;
+
+    pub static kCFErrorDomainPOSIX: CFStringRef;
+    pub static kCFErrorDomainOSStatus: CFStringRef;
+    pub static kCFErrorDomainMach: CFStringRef;
+    pub static kCFErrorDomainCocoa: CFStringRef;
+
+    pub fn CFErrorGetDomain(err: CFErrorRef) -> CFStringRef;
+    pub fn CFErrorGetCode(err: CFErrorRef) -> CFIndex;
+
+    pub fn CFErrorCopyDescription(err: CFErrorRef) -> CFStringRef;
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/filedescriptor.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/filedescriptor.rs
new file mode 100644
index 0000000..3f51d10
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/filedescriptor.rs
@@ -0,0 +1,58 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::{c_int, c_void};
+
+use base::{Boolean, CFIndex, CFTypeID, CFOptionFlags, CFAllocatorRef};
+use string::CFStringRef;
+use runloop::CFRunLoopSourceRef;
+
+pub type CFFileDescriptorNativeDescriptor = c_int;
+
+#[repr(C)]
+pub struct __CFFileDescriptor(c_void);
+
+pub type CFFileDescriptorRef = *mut __CFFileDescriptor;
+
+/* Callback Reason Types */
+pub const kCFFileDescriptorReadCallBack: CFOptionFlags  = 1 << 0;
+pub const kCFFileDescriptorWriteCallBack: CFOptionFlags = 1 << 1;
+
+pub type CFFileDescriptorCallBack = extern "C" fn (f: CFFileDescriptorRef, callBackTypes: CFOptionFlags, info: *mut c_void);
+
+#[repr(C)]
+#[derive(Clone, Copy)]
+pub struct CFFileDescriptorContext {
+    pub version: CFIndex,
+    pub info: *mut c_void,
+    pub retain: Option<extern "C" fn (info: *const c_void) -> *const c_void>,
+    pub release: Option<extern "C" fn (info: *const c_void)>,
+    pub copyDescription: Option<extern "C" fn (info: *const c_void) -> CFStringRef>,
+}
+
+extern {
+    /*
+     * CFFileDescriptor.h
+     */
+    pub fn CFFileDescriptorGetTypeID() -> CFTypeID;
+
+    pub fn CFFileDescriptorCreate(allocator: CFAllocatorRef, fd: CFFileDescriptorNativeDescriptor, closeOnInvalidate: Boolean, callout: CFFileDescriptorCallBack, context: *const CFFileDescriptorContext) -> CFFileDescriptorRef;
+
+    pub fn CFFileDescriptorGetNativeDescriptor(f: CFFileDescriptorRef) -> CFFileDescriptorNativeDescriptor;
+
+    pub fn CFFileDescriptorGetContext(f: CFFileDescriptorRef, context: *mut CFFileDescriptorContext);
+
+    pub fn CFFileDescriptorEnableCallBacks(f: CFFileDescriptorRef, callBackTypes: CFOptionFlags);
+    pub fn CFFileDescriptorDisableCallBacks(f: CFFileDescriptorRef, callBackTypes: CFOptionFlags);
+
+    pub fn CFFileDescriptorInvalidate(f: CFFileDescriptorRef);
+    pub fn CFFileDescriptorIsValid(f: CFFileDescriptorRef) -> Boolean;
+
+    pub fn CFFileDescriptorCreateRunLoopSource(allocator: CFAllocatorRef, f: CFFileDescriptorRef, order: CFIndex) -> CFRunLoopSourceRef;
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/lib.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/lib.rs
new file mode 100644
index 0000000..e03cddb
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/lib.rs
@@ -0,0 +1,30 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+#![allow(non_snake_case, non_camel_case_types, non_upper_case_globals, improper_ctypes)]
+
+#![cfg_attr(all(feature="mac_os_10_7_support", feature="mac_os_10_8_features"), feature(linkage))] // back-compat requires weak linkage
+
+pub mod array;
+pub mod attributed_string;
+pub mod base;
+pub mod bundle;
+pub mod data;
+pub mod date;
+pub mod dictionary;
+pub mod error;
+pub mod filedescriptor;
+pub mod messageport;
+pub mod number;
+pub mod propertylist;
+pub mod runloop;
+pub mod set;
+pub mod string;
+pub mod timezone;
+pub mod url;
+pub mod uuid;
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/messageport.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/messageport.rs
new file mode 100644
index 0000000..e33d9aa
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/messageport.rs
@@ -0,0 +1,79 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+
+use base::{CFAllocatorRef, CFIndex, CFTypeID, Boolean};
+use data::CFDataRef;
+use date::CFTimeInterval;
+use runloop::CFRunLoopSourceRef;
+use string::CFStringRef;
+
+#[repr(C)]
+#[derive(Copy, Clone)]
+#[derive(Debug)]
+pub struct CFMessagePortContext {
+    pub version: CFIndex,
+    pub info: *mut c_void,
+    pub retain: Option<unsafe extern fn(info: *const c_void) -> *const c_void>,
+    pub release: Option<unsafe extern fn(info: *const c_void)>,
+    pub copyDescription: Option<unsafe extern fn(info: *const c_void)
+        -> CFStringRef>,
+}
+
+pub type CFMessagePortCallBack = Option<
+    unsafe extern fn(local: CFMessagePortRef,
+                     msgid: i32,
+                     data: CFDataRef,
+                     info: *mut c_void) -> CFDataRef>;
+
+pub type CFMessagePortInvalidationCallBack = Option<
+    unsafe extern "C" fn(ms: CFMessagePortRef, info: *mut c_void)>;
+
+#[repr(C)]
+pub struct __CFMessagePort(c_void);
+pub type CFMessagePortRef = *mut __CFMessagePort;
+
+extern {
+    /*
+     * CFMessagePort.h
+     */
+    pub fn CFMessagePortGetTypeID() -> CFTypeID;
+    pub fn CFMessagePortCreateLocal(allocator: CFAllocatorRef,
+                                    name: CFStringRef,
+                                    callout: CFMessagePortCallBack,
+                                    context: *const CFMessagePortContext,
+                                    shouldFreeInfo: *mut Boolean)
+        -> CFMessagePortRef;
+    pub fn CFMessagePortCreateRemote(allocator: CFAllocatorRef,
+                                     name: CFStringRef) -> CFMessagePortRef;
+    pub fn CFMessagePortIsRemote(ms: CFMessagePortRef) -> Boolean;
+    pub fn CFMessagePortGetName(ms: CFMessagePortRef) -> CFStringRef;
+    pub fn CFMessagePortSetName(ms: CFMessagePortRef, newName: CFStringRef)
+        -> Boolean;
+    pub fn CFMessagePortGetContext(ms: CFMessagePortRef,
+                                   context: *mut CFMessagePortContext);
+    pub fn CFMessagePortInvalidate(ms: CFMessagePortRef);
+    pub fn CFMessagePortIsValid(ms: CFMessagePortRef) -> Boolean;
+    pub fn CFMessagePortGetInvalidationCallBack(ms: CFMessagePortRef)
+        -> CFMessagePortInvalidationCallBack;
+    pub fn CFMessagePortSetInvalidationCallBack(ms: CFMessagePortRef,
+                                                callout: CFMessagePortInvalidationCallBack);
+    pub fn CFMessagePortSendRequest(remote: CFMessagePortRef, msgid: i32,
+                                    data: CFDataRef,
+                                    sendTimeout: CFTimeInterval,
+                                    rcvTimeout: CFTimeInterval,
+                                    replyMode: CFStringRef,
+                                    returnData: *mut CFDataRef) -> i32;
+    pub fn CFMessagePortCreateRunLoopSource(allocator: CFAllocatorRef,
+                                            local: CFMessagePortRef,
+                                            order: CFIndex)
+        -> CFRunLoopSourceRef;
+    // CFMessagePortSetDispatchQueue
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/number.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/number.rs
new file mode 100644
index 0000000..931b95d
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/number.rs
@@ -0,0 +1,60 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+
+use base::{CFAllocatorRef, CFTypeID, CFComparisonResult};
+
+#[repr(C)]
+pub struct __CFBoolean(c_void);
+
+pub type CFBooleanRef = *const __CFBoolean;
+
+pub type CFNumberType = u32;
+
+// members of enum CFNumberType
+// static kCFNumberSInt8Type:     CFNumberType = 1;
+// static kCFNumberSInt16Type:    CFNumberType = 2;
+pub static kCFNumberSInt32Type:    CFNumberType = 3;
+pub static kCFNumberSInt64Type:    CFNumberType = 4;
+pub static kCFNumberFloat32Type:   CFNumberType = 5;
+pub static kCFNumberFloat64Type:   CFNumberType = 6;
+// static kCFNumberCharType:      CFNumberType = 7;
+// static kCFNumberShortType:     CFNumberType = 8;
+// static kCFNumberIntType:       CFNumberType = 9;
+// static kCFNumberLongType:      CFNumberType = 10;
+// static kCFNumberLongLongType:  CFNumberType = 11;
+// static kCFNumberFloatType:     CFNumberType = 12;
+// static kCFNumberDoubleType:    CFNumberType = 13;
+// static kCFNumberCFIndexType:   CFNumberType = 14;
+// static kCFNumberNSIntegerType: CFNumberType = 15;
+// static kCFNumberCGFloatType:   CFNumberType = 16;
+// static kCFNumberMaxType:       CFNumberType = 16;
+
+// This is an enum due to zero-sized types warnings.
+// For more details see https://github.com/rust-lang/rust/issues/27303
+pub enum __CFNumber {}
+
+pub type CFNumberRef = *const __CFNumber;
+
+extern {
+    /*
+     * CFNumber.h
+     */
+    pub static kCFBooleanTrue: CFBooleanRef;
+    pub static kCFBooleanFalse: CFBooleanRef;
+
+    pub fn CFBooleanGetTypeID() -> CFTypeID;
+    pub fn CFNumberCreate(allocator: CFAllocatorRef, theType: CFNumberType, valuePtr: *const c_void)
+                          -> CFNumberRef;
+    //fn CFNumberGetByteSize
+    pub fn CFNumberGetValue(number: CFNumberRef, theType: CFNumberType, valuePtr: *mut c_void) -> bool;
+    pub fn CFNumberCompare(date: CFNumberRef, other: CFNumberRef, context: *mut c_void) -> CFComparisonResult;
+    pub fn CFNumberGetTypeID() -> CFTypeID;
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/propertylist.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/propertylist.rs
new file mode 100644
index 0000000..574c4d1
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/propertylist.rs
@@ -0,0 +1,46 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use base::{CFAllocatorRef, CFIndex, CFOptionFlags, CFTypeRef};
+use data::CFDataRef;
+use error::CFErrorRef;
+
+pub type CFPropertyListRef = CFTypeRef;
+
+pub type CFPropertyListFormat = CFIndex;
+pub const kCFPropertyListOpenStepFormat: CFPropertyListFormat = 1;
+pub const kCFPropertyListXMLFormat_v1_0: CFPropertyListFormat = 100;
+pub const kCFPropertyListBinaryFormat_v1_0: CFPropertyListFormat = 200;
+
+pub type CFPropertyListMutabilityOptions = CFOptionFlags;
+pub const kCFPropertyListImmutable: CFPropertyListMutabilityOptions = 0;
+pub const kCFPropertyListMutableContainers: CFPropertyListMutabilityOptions = 1;
+pub const kCFPropertyListMutableContainersAndLeaves: CFPropertyListMutabilityOptions = 2;
+
+extern "C" {
+    // CFPropertyList.h
+    //
+
+    // fn CFPropertyListCreateDeepCopy
+    // fn CFPropertyListIsValid
+    pub fn CFPropertyListCreateWithData(allocator: CFAllocatorRef,
+                                        data: CFDataRef,
+                                        options: CFPropertyListMutabilityOptions,
+                                        format: *mut CFPropertyListFormat,
+                                        error: *mut CFErrorRef)
+                                        -> CFPropertyListRef;
+    // fn CFPropertyListCreateWithStream
+    // fn CFPropertyListWrite
+    pub fn CFPropertyListCreateData(allocator: CFAllocatorRef,
+                                    propertyList: CFPropertyListRef,
+                                    format: CFPropertyListFormat,
+                                    options: CFOptionFlags,
+                                    error: *mut CFErrorRef)
+                                    -> CFDataRef;
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/runloop.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/runloop.rs
new file mode 100644
index 0000000..5de7b87
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/runloop.rs
@@ -0,0 +1,164 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+
+use array::CFArrayRef;
+use base::{Boolean, CFIndex, CFTypeID, CFAllocatorRef, CFOptionFlags, CFHashCode, mach_port_t};
+use date::{CFAbsoluteTime, CFTimeInterval};
+use string::CFStringRef;
+
+#[repr(C)]
+pub struct __CFRunLoop(c_void);
+
+pub type CFRunLoopRef = *mut __CFRunLoop;
+
+#[repr(C)]
+pub struct __CFRunLoopSource(c_void);
+
+pub type CFRunLoopSourceRef = *mut __CFRunLoopSource;
+
+#[repr(C)]
+pub struct __CFRunLoopObserver(c_void);
+
+pub type CFRunLoopObserverRef = *mut __CFRunLoopObserver;
+
+// Reasons for CFRunLoopRunInMode() to Return
+pub const kCFRunLoopRunFinished: i32      = 1;
+pub const kCFRunLoopRunStopped: i32       = 2;
+pub const kCFRunLoopRunTimedOut: i32      = 3;
+pub const kCFRunLoopRunHandledSource: i32 = 4;
+
+// Run Loop Observer Activities
+//typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
+pub type CFRunLoopActivity = CFOptionFlags;
+pub const kCFRunLoopEntry: CFOptionFlags         = 1 << 0;
+pub const kCFRunLoopBeforeTimers: CFOptionFlags  = 1 << 1;
+pub const kCFRunLoopBeforeSources: CFOptionFlags = 1 << 2;
+pub const kCFRunLoopBeforeWaiting: CFOptionFlags = 1 << 5;
+pub const kCFRunLoopAfterWaiting: CFOptionFlags  = 1 << 6;
+pub const kCFRunLoopExit: CFOptionFlags          = 1 << 7;
+pub const kCFRunLoopAllActivities: CFOptionFlags = 0x0FFFFFFF;
+
+#[repr(C)]
+pub struct CFRunLoopSourceContext {
+    pub version: CFIndex,
+    pub info: *mut c_void,
+    pub retain: extern "C" fn (info: *const c_void) -> *const c_void,
+    pub release: extern "C" fn (info: *const c_void),
+    pub copyDescription: extern "C" fn (info: *const c_void) -> CFStringRef,
+    pub equal: extern "C" fn (info1: *const c_void, info2: *const c_void) -> Boolean,
+    pub hash: extern "C" fn (info: *const c_void) -> CFHashCode,
+    pub schedule: extern "C" fn (info: *const c_void, rl: CFRunLoopRef, mode: CFStringRef),
+    pub cancel: extern "C" fn (info: *const c_void, rl: CFRunLoopRef, mode: CFStringRef),
+    pub perform: extern "C" fn (info: *const c_void),
+}
+
+#[repr(C)]
+pub struct CFRunLoopSourceContext1 {
+    pub version: CFIndex,
+    pub info: *mut c_void,
+    pub retain: extern "C" fn (info: *const c_void) -> *const c_void,
+    pub release: extern "C" fn (info: *const c_void),
+    pub copyDescription: extern "C" fn (info: *const c_void) -> CFStringRef,
+    pub equal: extern "C" fn (info1: *const c_void, info2: *const c_void) -> Boolean,
+    pub hash: extern "C" fn (info: *const c_void) -> CFHashCode,
+    // note that the following two fields are platform dependent in the C header, the ones here are for OS X
+    pub getPort: extern "C" fn (info: *mut c_void) -> mach_port_t,
+    pub perform: extern "C" fn (msg: *mut c_void, size: CFIndex, allocator: CFAllocatorRef, info: *mut c_void) -> *mut c_void,
+}
+
+#[repr(C)]
+pub struct CFRunLoopObserverContext {
+    pub version: CFIndex,
+    pub info: *mut c_void,
+    pub retain: extern "C" fn (info: *const c_void) -> *const c_void,
+    pub release: extern "C" fn (info: *const c_void),
+    pub copyDescription: extern "C" fn (info: *const c_void) -> CFStringRef,
+}
+
+pub type CFRunLoopObserverCallBack = extern "C" fn (observer: CFRunLoopObserverRef, activity: CFRunLoopActivity, info: *mut c_void);
+
+#[repr(C)]
+pub struct CFRunLoopTimerContext {
+    pub version: CFIndex,
+    pub info: *mut c_void,
+    pub retain: extern "C" fn (info: *const c_void) -> *const c_void,
+    pub release: extern "C" fn (info: *const c_void),
+    pub copyDescription: extern "C" fn (info: *const c_void) -> CFStringRef,
+}
+
+pub type CFRunLoopTimerCallBack = extern "C" fn (timer: CFRunLoopTimerRef, info: *mut c_void);
+
+#[repr(C)]
+pub struct __CFRunLoopTimer;
+
+pub type CFRunLoopTimerRef = *mut __CFRunLoopTimer;
+
+extern {
+    /*
+     * CFRunLoop.h
+     */
+    pub static kCFRunLoopDefaultMode: CFStringRef;
+    pub static kCFRunLoopCommonModes: CFStringRef;
+    pub fn CFRunLoopGetTypeID() -> CFTypeID;
+    pub fn CFRunLoopGetCurrent() -> CFRunLoopRef;
+    pub fn CFRunLoopGetMain() -> CFRunLoopRef;
+    pub fn CFRunLoopCopyCurrentMode(rl: CFRunLoopRef) -> CFStringRef;
+    pub fn CFRunLoopCopyAllModes(rl: CFRunLoopRef) -> CFArrayRef;
+    pub fn CFRunLoopAddCommonMode(rl: CFRunLoopRef, mode: CFStringRef);
+    pub fn CFRunLoopGetNextTimerFireDate(rl: CFRunLoopRef, mode: CFStringRef) -> CFAbsoluteTime;
+    pub fn CFRunLoopRun();
+    pub fn CFRunLoopRunInMode(mode: CFStringRef, seconds: CFTimeInterval, returnAfterSourceHandled: Boolean) -> i32;
+    pub fn CFRunLoopIsWaiting(rl: CFRunLoopRef) -> Boolean;
+    pub fn CFRunLoopWakeUp(rl: CFRunLoopRef);
+    pub fn CFRunLoopStop(rl: CFRunLoopRef);
+    // fn CFRunLoopPerformBlock(rl: CFRunLoopRef, mode: CFTypeRef, block: void (^)(void));
+    pub fn CFRunLoopContainsSource(rl: CFRunLoopRef, source: CFRunLoopSourceRef, mode: CFStringRef) -> Boolean;
+    pub fn CFRunLoopAddSource(rl: CFRunLoopRef, source: CFRunLoopSourceRef, mode: CFStringRef);
+    pub fn CFRunLoopRemoveSource(rl: CFRunLoopRef, source: CFRunLoopSourceRef, mode: CFStringRef);
+    pub fn CFRunLoopContainsObserver(rl: CFRunLoopRef, observer: CFRunLoopObserverRef, mode: CFStringRef) -> Boolean;
+    pub fn CFRunLoopAddObserver(rl: CFRunLoopRef, observer: CFRunLoopObserverRef, mode: CFStringRef);
+    pub fn CFRunLoopRemoveObserver(rl: CFRunLoopRef, observer: CFRunLoopObserverRef, mode: CFStringRef);
+    pub fn CFRunLoopContainsTimer(rl: CFRunLoopRef, timer: CFRunLoopTimerRef, mode: CFStringRef) -> Boolean;
+    pub fn CFRunLoopAddTimer(rl: CFRunLoopRef, timer: CFRunLoopTimerRef, mode: CFStringRef);
+    pub fn CFRunLoopRemoveTimer(rl: CFRunLoopRef, timer: CFRunLoopTimerRef, mode: CFStringRef);
+
+    pub fn CFRunLoopSourceGetTypeID() -> CFTypeID;
+    pub fn CFRunLoopSourceCreate(allocator: CFAllocatorRef, order: CFIndex, context: *mut CFRunLoopSourceContext) -> CFRunLoopSourceRef;
+    pub fn CFRunLoopSourceGetOrder(source: CFRunLoopSourceRef) -> CFIndex;
+    pub fn CFRunLoopSourceInvalidate(source: CFRunLoopSourceRef);
+    pub fn CFRunLoopSourceIsValid(source: CFRunLoopSourceRef) -> Boolean;
+    pub fn CFRunLoopSourceGetContext(source: CFRunLoopSourceRef, context: *mut CFRunLoopSourceContext);
+    pub fn CFRunLoopSourceSignal(source: CFRunLoopSourceRef);
+
+    pub fn CFRunLoopObserverGetTypeID() -> CFTypeID;
+    pub fn CFRunLoopObserverCreate(allocator: CFAllocatorRef, activities: CFOptionFlags, repeats: Boolean, order: CFIndex, callout: CFRunLoopObserverCallBack, context: *mut CFRunLoopObserverContext) -> CFRunLoopObserverRef;
+    // fn CFRunLoopObserverCreateWithHandler(allocator: CFAllocatorRef, activities: CFOptionFlags, repeats: Boolean, order: CFIndex, block: void (^) (CFRunLoopObserverRef observer, CFRunLoopActivity activity)) -> CFRunLoopObserverRef;
+    pub fn CFRunLoopObserverGetActivities(observer: CFRunLoopObserverRef) -> CFOptionFlags;
+    pub fn CFRunLoopObserverDoesRepeat(observer: CFRunLoopObserverRef) -> Boolean;
+    pub fn CFRunLoopObserverGetOrder(observer: CFRunLoopObserverRef) -> CFIndex;
+    pub fn CFRunLoopObserverInvalidate(observer: CFRunLoopObserverRef);
+    pub fn CFRunLoopObserverIsValid(observer: CFRunLoopObserverRef) -> Boolean;
+    pub fn CFRunLoopObserverGetContext(observer: CFRunLoopObserverRef, context: *mut CFRunLoopObserverContext);
+
+    pub fn CFRunLoopTimerGetTypeID() -> CFTypeID;
+    pub fn CFRunLoopTimerCreate(allocator: CFAllocatorRef, fireDate: CFAbsoluteTime, interval: CFTimeInterval, flags: CFOptionFlags, order: CFIndex, callout: CFRunLoopTimerCallBack, context: *mut CFRunLoopTimerContext) -> CFRunLoopTimerRef;
+    // fn CFRunLoopTimerCreateWithHandler(allocator: CFAllocatorRef, fireDate: CFAbsoluteTime, interval: CFTimeInterval, flags: CFOptionFlags, order: CFIndex, block: void (^) (CFRunLoopTimerRef timer)) -> CFRunLoopTimerRef;
+    pub fn CFRunLoopTimerGetNextFireDate(timer: CFRunLoopTimerRef) -> CFAbsoluteTime;
+    pub fn CFRunLoopTimerSetNextFireDate(timer: CFRunLoopTimerRef, fireDate: CFAbsoluteTime);
+    pub fn CFRunLoopTimerGetInterval(timer: CFRunLoopTimerRef) -> CFTimeInterval;
+    pub fn CFRunLoopTimerDoesRepeat(timer: CFRunLoopTimerRef) -> Boolean;
+    pub fn CFRunLoopTimerGetOrder(timer: CFRunLoopTimerRef) -> CFIndex;
+    pub fn CFRunLoopTimerInvalidate(timer: CFRunLoopTimerRef);
+    pub fn CFRunLoopTimerIsValid(timer: CFRunLoopTimerRef) -> Boolean;
+    pub fn CFRunLoopTimerGetContext(timer: CFRunLoopTimerRef, context: *mut CFRunLoopTimerContext);
+    pub fn CFRunLoopTimerGetTolerance(timer: CFRunLoopTimerRef) -> CFTimeInterval;
+    pub fn CFRunLoopTimerSetTolerance(timer: CFRunLoopTimerRef, tolerance: CFTimeInterval);
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/set.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/set.rs
new file mode 100644
index 0000000..ec4a4bd
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/set.rs
@@ -0,0 +1,58 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+
+use base::{CFAllocatorRef, CFIndex, CFTypeID};
+
+pub type CFSetApplierFunction = extern "C" fn (value: *const c_void,
+                                               context: *const c_void);
+pub type CFSetRetainCallBack = *const u8;
+pub type CFSetReleaseCallBack = *const u8;
+pub type CFSetCopyDescriptionCallBack = *const u8;
+pub type CFSetEqualCallBack = *const u8;
+pub type CFSetHashCallBack = *const u8;
+
+#[repr(C)]
+#[derive(Clone, Copy)]
+pub struct CFSetCallBacks {
+    pub version: CFIndex,
+    pub retain: CFSetRetainCallBack,
+    pub release: CFSetReleaseCallBack,
+    pub copyDescription: CFSetCopyDescriptionCallBack,
+    pub equal: CFSetEqualCallBack,
+    pub hash: CFSetHashCallBack,
+}
+
+#[repr(C)]
+pub struct __CFSet(c_void);
+
+pub type CFSetRef = *const __CFSet;
+
+extern {
+    /*
+     * CFSet.h
+     */
+
+    pub static kCFTypeSetCallBacks: CFSetCallBacks;
+
+    /* Creating Sets */
+    pub fn CFSetCreate(allocator: CFAllocatorRef, values: *const *const c_void, numValues: CFIndex,
+                       callBacks: *const CFSetCallBacks) -> CFSetRef;
+
+    /* Applying a Function to Set Members */
+    pub fn CFSetApplyFunction(theSet: CFSetRef,
+                              applier: CFSetApplierFunction,
+                              context: *const c_void);
+
+    pub fn CFSetGetCount(theSet: CFSetRef) -> CFIndex;
+
+    pub fn CFSetGetTypeID() -> CFTypeID;
+}
+
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/string.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/string.rs
new file mode 100644
index 0000000..a990d96
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/string.rs
@@ -0,0 +1,319 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::{c_char, c_ushort, c_void};
+
+use base::{Boolean, CFOptionFlags, CFIndex, CFAllocatorRef, CFRange, CFTypeID};
+
+pub type UniChar = c_ushort;
+
+// CFString.h
+
+pub type CFStringCompareFlags = CFOptionFlags;
+//static kCFCompareCaseInsensitive: CFStringCompareFlags = 1;
+//static kCFCompareBackwards: CFStringCompareFlags = 4;
+//static kCFCompareAnchored: CFStringCompareFlags = 8;
+//static kCFCompareNonliteral: CFStringCompareFlags = 16;
+//static kCFCompareLocalized: CFStringCompareFlags = 32;
+//static kCFCompareNumerically: CFStringCompareFlags = 64;
+//static kCFCompareDiacriticInsensitive: CFStringCompareFlags = 128;
+//static kCFCompareWidthInsensitive: CFStringCompareFlags = 256;
+//static kCFCompareForcedOrdering: CFStringCompareFlags = 512;
+
+pub type CFStringEncoding = u32;
+
+// OS X built-in encodings.
+
+//static kCFStringEncodingMacRoman: CFStringEncoding = 0;
+//static kCFStringEncodingWindowsLatin1: CFStringEncoding = 0x0500;
+//static kCFStringEncodingISOLatin1: CFStringEncoding = 0x0201;
+//static kCFStringEncodingNextStepLatin: CFStringEncoding = 0x0B01;
+//static kCFStringEncodingASCII: CFStringEncoding = 0x0600;
+//static kCFStringEncodingUnicode: CFStringEncoding = 0x0100;
+pub static kCFStringEncodingUTF8: CFStringEncoding = 0x08000100;
+//static kCFStringEncodingNonLossyASCII: CFStringEncoding = 0x0BFF;
+
+//static kCFStringEncodingUTF16: CFStringEncoding = 0x0100;
+//static kCFStringEncodingUTF16BE: CFStringEncoding = 0x10000100;
+//static kCFStringEncodingUTF16LE: CFStringEncoding = 0x14000100;
+//static kCFStringEncodingUTF32: CFStringEncoding = 0x0c000100;
+//static kCFStringEncodingUTF32BE: CFStringEncoding = 0x18000100;
+//static kCFStringEncodingUTF32LE: CFStringEncoding = 0x1c000100;
+
+
+// CFStringEncodingExt.h
+
+pub type CFStringEncodings = CFIndex;
+
+// External encodings, except those defined above.
+// Defined above: kCFStringEncodingMacRoman = 0
+//static kCFStringEncodingMacJapanese: CFStringEncoding = 1;
+//static kCFStringEncodingMacChineseTrad: CFStringEncoding = 2;
+//static kCFStringEncodingMacKorean: CFStringEncoding = 3;
+//static kCFStringEncodingMacArabic: CFStringEncoding = 4;
+//static kCFStringEncodingMacHebrew: CFStringEncoding = 5;
+//static kCFStringEncodingMacGreek: CFStringEncoding = 6;
+//static kCFStringEncodingMacCyrillic: CFStringEncoding = 7;
+//static kCFStringEncodingMacDevanagari: CFStringEncoding = 9;
+//static kCFStringEncodingMacGurmukhi: CFStringEncoding = 10;
+//static kCFStringEncodingMacGujarati: CFStringEncoding = 11;
+//static kCFStringEncodingMacOriya: CFStringEncoding = 12;
+//static kCFStringEncodingMacBengali: CFStringEncoding = 13;
+//static kCFStringEncodingMacTamil: CFStringEncoding = 14;
+//static kCFStringEncodingMacTelugu: CFStringEncoding = 15;
+//static kCFStringEncodingMacKannada: CFStringEncoding = 16;
+//static kCFStringEncodingMacMalayalam: CFStringEncoding = 17;
+//static kCFStringEncodingMacSinhalese: CFStringEncoding = 18;
+//static kCFStringEncodingMacBurmese: CFStringEncoding = 19;
+//static kCFStringEncodingMacKhmer: CFStringEncoding = 20;
+//static kCFStringEncodingMacThai: CFStringEncoding = 21;
+//static kCFStringEncodingMacLaotian: CFStringEncoding = 22;
+//static kCFStringEncodingMacGeorgian: CFStringEncoding = 23;
+//static kCFStringEncodingMacArmenian: CFStringEncoding = 24;
+//static kCFStringEncodingMacChineseSimp: CFStringEncoding = 25;
+//static kCFStringEncodingMacTibetan: CFStringEncoding = 26;
+//static kCFStringEncodingMacMongolian: CFStringEncoding = 27;
+//static kCFStringEncodingMacEthiopic: CFStringEncoding = 28;
+//static kCFStringEncodingMacCentralEurRoman: CFStringEncoding = 29;
+//static kCFStringEncodingMacVietnamese: CFStringEncoding = 30;
+//static kCFStringEncodingMacExtArabic: CFStringEncoding = 31;
+//static kCFStringEncodingMacSymbol: CFStringEncoding = 33;
+//static kCFStringEncodingMacDingbats: CFStringEncoding = 34;
+//static kCFStringEncodingMacTurkish: CFStringEncoding = 35;
+//static kCFStringEncodingMacCroatian: CFStringEncoding = 36;
+//static kCFStringEncodingMacIcelandic: CFStringEncoding = 37;
+//static kCFStringEncodingMacRomanian: CFStringEncoding = 38;
+//static kCFStringEncodingMacCeltic: CFStringEncoding = 39;
+//static kCFStringEncodingMacGaelic: CFStringEncoding = 40;
+//static kCFStringEncodingMacFarsi: CFStringEncoding = 0x8C;
+//static kCFStringEncodingMacUkrainian: CFStringEncoding = 0x98;
+//static kCFStringEncodingMacInuit: CFStringEncoding = 0xEC;
+//static kCFStringEncodingMacVT100: CFStringEncoding = 0xFC;
+//static kCFStringEncodingMacHFS: CFStringEncoding = 0xFF;
+// Defined above: kCFStringEncodingISOLatin1 = 0x0201
+//static kCFStringEncodingISOLatin2: CFStringEncoding = 0x0202;
+//static kCFStringEncodingISOLatin3: CFStringEncoding = 0x0203;
+//static kCFStringEncodingISOLatin4: CFStringEncoding = 0x0204;
+//static kCFStringEncodingISOLatinCyrillic: CFStringEncoding = 0x0205;
+//static kCFStringEncodingISOLatinArabic: CFStringEncoding = 0x0206;
+//static kCFStringEncodingISOLatinGreek: CFStringEncoding = 0x0207;
+//static kCFStringEncodingISOLatinHebrew: CFStringEncoding = 0x0208;
+//static kCFStringEncodingISOLatin5: CFStringEncoding = 0x0209;
+//static kCFStringEncodingISOLatin6: CFStringEncoding = 0x020A;
+//static kCFStringEncodingISOLatinThai: CFStringEncoding = 0x020B;
+//static kCFStringEncodingISOLatin7: CFStringEncoding = 0x020D;
+//static kCFStringEncodingISOLatin8: CFStringEncoding = 0x020E;
+//static kCFStringEncodingISOLatin9: CFStringEncoding = 0x020F;
+//static kCFStringEncodingISOLatin10: CFStringEncoding = 0x0210;
+//static kCFStringEncodingDOSLatinUS: CFStringEncoding = 0x0400;
+//static kCFStringEncodingDOSGreek: CFStringEncoding = 0x0405;
+//static kCFStringEncodingDOSBalticRim: CFStringEncoding = 0x0406;
+//static kCFStringEncodingDOSLatin1: CFStringEncoding = 0x0410;
+//static kCFStringEncodingDOSGreek1: CFStringEncoding = 0x0411;
+//static kCFStringEncodingDOSLatin2: CFStringEncoding = 0x0412;
+//static kCFStringEncodingDOSCyrillic: CFStringEncoding = 0x0413;
+//static kCFStringEncodingDOSTurkish: CFStringEncoding = 0x0414;
+//static kCFStringEncodingDOSPortuguese: CFStringEncoding = 0x0415;
+//static kCFStringEncodingDOSIcelandic: CFStringEncoding = 0x0416;
+//static kCFStringEncodingDOSHebrew: CFStringEncoding = 0x0417;
+//static kCFStringEncodingDOSCanadianFrench: CFStringEncoding = 0x0418;
+//static kCFStringEncodingDOSArabic: CFStringEncoding = 0x0419;
+//static kCFStringEncodingDOSNordic: CFStringEncoding = 0x041A;
+//static kCFStringEncodingDOSRussian: CFStringEncoding = 0x041B;
+//static kCFStringEncodingDOSGreek2: CFStringEncoding = 0x041C;
+//static kCFStringEncodingDOSThai: CFStringEncoding = 0x041D;
+//static kCFStringEncodingDOSJapanese: CFStringEncoding = 0x0420;
+//static kCFStringEncodingDOSChineseSimplif: CFStringEncoding = 0x0421;
+//static kCFStringEncodingDOSKorean: CFStringEncoding = 0x0422;
+//static kCFStringEncodingDOSChineseTrad: CFStringEncoding = 0x0423;
+// Defined above: kCFStringEncodingWindowsLatin1 = 0x0500
+//static kCFStringEncodingWindowsLatin2: CFStringEncoding = 0x0501;
+//static kCFStringEncodingWindowsCyrillic: CFStringEncoding = 0x0502;
+//static kCFStringEncodingWindowsGreek: CFStringEncoding = 0x0503;
+//static kCFStringEncodingWindowsLatin5: CFStringEncoding = 0x0504;
+//static kCFStringEncodingWindowsHebrew: CFStringEncoding = 0x0505;
+//static kCFStringEncodingWindowsArabic: CFStringEncoding = 0x0506;
+//static kCFStringEncodingWindowsBalticRim: CFStringEncoding = 0x0507;
+//static kCFStringEncodingWindowsVietnamese: CFStringEncoding = 0x0508;
+//static kCFStringEncodingWindowsKoreanJohab: CFStringEncoding = 0x0510;
+// Defined above: kCFStringEncodingASCII = 0x0600
+//static kCFStringEncodingANSEL: CFStringEncoding = 0x0601;
+//static kCFStringEncodingJIS_X0201_76: CFStringEncoding = 0x0620;
+//static kCFStringEncodingJIS_X0208_83: CFStringEncoding = 0x0621;
+//static kCFStringEncodingJIS_X0208_90: CFStringEncoding = 0x0622;
+//static kCFStringEncodingJIS_X0212_90: CFStringEncoding = 0x0623;
+//static kCFStringEncodingJIS_C6226_78: CFStringEncoding = 0x0624;
+//static kCFStringEncodingShiftJIS_X0213: CFStringEncoding = 0x0628;
+//static kCFStringEncodingShiftJIS_X0213_MenKuTen: CFStringEncoding = 0x0629;
+//static kCFStringEncodingGB_2312_80: CFStringEncoding = 0x0630;
+//static kCFStringEncodingGBK_95: CFStringEncoding = 0x0631;
+//static kCFStringEncodingGB_18030_2000: CFStringEncoding = 0x0632;
+//static kCFStringEncodingKSC_5601_87: CFStringEncoding = 0x0640;
+//static kCFStringEncodingKSC_5601_92_Johab: CFStringEncoding = 0x0641;
+//static kCFStringEncodingCNS_11643_92_P1: CFStringEncoding = 0x0651;
+//static kCFStringEncodingCNS_11643_92_P2: CFStringEncoding = 0x0652;
+//static kCFStringEncodingCNS_11643_92_P3: CFStringEncoding = 0x0653;
+//static kCFStringEncodingISO_2022_JP: CFStringEncoding = 0x0820;
+//static kCFStringEncodingISO_2022_JP_2: CFStringEncoding = 0x0821;
+//static kCFStringEncodingISO_2022_JP_1: CFStringEncoding = 0x0822;
+//static kCFStringEncodingISO_2022_JP_3: CFStringEncoding = 0x0823;
+//static kCFStringEncodingISO_2022_CN: CFStringEncoding = 0x0830;
+//static kCFStringEncodingISO_2022_CN_EXT: CFStringEncoding = 0x0831;
+//static kCFStringEncodingISO_2022_KR: CFStringEncoding = 0x0840;
+//static kCFStringEncodingEUC_JP: CFStringEncoding = 0x0920;
+//static kCFStringEncodingEUC_CN: CFStringEncoding = 0x0930;
+//static kCFStringEncodingEUC_TW: CFStringEncoding = 0x0931;
+//static kCFStringEncodingEUC_KR: CFStringEncoding = 0x0940;
+//static kCFStringEncodingShiftJIS: CFStringEncoding = 0x0A01;
+//static kCFStringEncodingKOI8_R: CFStringEncoding = 0x0A02;
+//static kCFStringEncodingBig5: CFStringEncoding = 0x0A03;
+//static kCFStringEncodingMacRomanLatin1: CFStringEncoding = 0x0A04;
+//static kCFStringEncodingHZ_GB_2312: CFStringEncoding = 0x0A05;
+//static kCFStringEncodingBig5_HKSCS_1999: CFStringEncoding = 0x0A06;
+//static kCFStringEncodingVISCII: CFStringEncoding = 0x0A07;
+//static kCFStringEncodingKOI8_U: CFStringEncoding = 0x0A08;
+//static kCFStringEncodingBig5_E: CFStringEncoding = 0x0A09;
+// Defined above: kCFStringEncodingNextStepLatin = 0x0B01
+//static kCFStringEncodingNextStepJapanese: CFStringEncoding = 0x0B02;
+//static kCFStringEncodingEBCDIC_US: CFStringEncoding = 0x0C01;
+//static kCFStringEncodingEBCDIC_CP037: CFStringEncoding = 0x0C02;
+//static kCFStringEncodingUTF7: CFStringEncoding = 0x04000100;
+//static kCFStringEncodingUTF7_IMAP: CFStringEncoding = 0x0A10;
+//static kCFStringEncodingShiftJIS_X0213_00: CFStringEncoding = 0x0628; /* Deprecated */
+
+#[repr(C)]
+pub struct __CFString(c_void);
+
+pub type CFStringRef = *const __CFString;
+
+extern {
+    /*
+     * CFString.h
+     */
+
+    // N.B. organized according to "Functions by task" in docs
+
+    /* Creating a CFString */
+    //fn CFSTR
+    //fn CFStringCreateArrayBySeparatingStrings
+    //fn CFStringCreateByCombiningStrings
+    //fn CFStringCreateCopy
+    //fn CFStringCreateFromExternalRepresentation
+    pub fn CFStringCreateWithBytes(alloc: CFAllocatorRef,
+                                   bytes: *const u8,
+                                   numBytes: CFIndex,
+                                   encoding: CFStringEncoding,
+                                   isExternalRepresentation: Boolean)
+                                   -> CFStringRef;
+    pub fn CFStringCreateWithBytesNoCopy(alloc: CFAllocatorRef,
+                                         bytes: *const u8,
+                                         numBytes: CFIndex,
+                                         encoding: CFStringEncoding,
+                                         isExternalRepresentation: Boolean,
+                                         contentsDeallocator: CFAllocatorRef)
+                                         -> CFStringRef;
+    //fn CFStringCreateWithCharacters
+    //fn CFStringCreateWithCharactersNoCopy
+    pub fn CFStringCreateWithCString(alloc: CFAllocatorRef,
+                                     cStr: *const c_char,
+                                     encoding: CFStringEncoding)
+                                     -> CFStringRef;
+    //fn CFStringCreateWithCStringNoCopy
+    //fn CFStringCreateWithFormat
+    //fn CFStringCreateWithFormatAndArguments
+    //fn CFStringCreateWithPascalString
+    //fn CFStringCreateWithPascalStringNoCopy
+    //fn CFStringCreateWithSubstring
+
+    /* Searching Strings */
+    //fn CFStringCreateArrayWithFindResults
+    //fn CFStringFind
+    //fn CFStringFindCharacterFromSet
+    //fn CFStringFindWithOptions
+    //fn CFStringFindWithOptionsAndLocale
+    //fn CFStringGetLineBounds
+
+    /* Comparing Strings */
+    //fn CFStringCompare
+    //fn CFStringCompareWithOptions
+    //fn CFStringCompareWithOptionsAndLocale
+    //fn CFStringHasPrefix
+    //fn CFStringHasSuffix
+
+    /* Accessing Characters */
+    //fn CFStringCreateExternalRepresentation
+    pub fn CFStringGetBytes(theString: CFStringRef,
+                            range: CFRange,
+                            encoding: CFStringEncoding,
+                            lossByte: u8,
+                            isExternalRepresentation: Boolean,
+                            buffer: *mut u8,
+                            maxBufLen: CFIndex,
+                            usedBufLen: *mut CFIndex)
+                            -> CFIndex;
+    //fn CFStringGetCharacterAtIndex
+    //fn CFStringGetCharacters
+    //fn CFStringGetCharactersPtr
+    //fn CFStringGetCharacterFromInlineBuffer
+    pub fn CFStringGetCString(theString: CFStringRef,
+                              buffer: *mut c_char,
+                              bufferSize: CFIndex,
+                              encoding: CFStringEncoding)
+                              -> Boolean;
+    pub fn CFStringGetCStringPtr(theString: CFStringRef,
+                                 encoding: CFStringEncoding)
+                                 -> *const c_char;
+    pub fn CFStringGetLength(theString: CFStringRef) -> CFIndex;
+    //fn CFStringGetPascalString
+    //fn CFStringGetPascalStringPtr
+    //fn CFStringGetRangeOfComposedCharactersAtIndex
+    //fn CFStringInitInlineBuffer
+
+    /* Working With Hyphenation */
+    //fn CFStringGetHyphenationLocationBeforeIndex
+    //fn CFStringIsHyphenationAvailableForLocale
+
+    /* Working With Encodings */
+    //fn CFStringConvertEncodingToIANACharSetName
+    //fn CFStringConvertEncodingToNSStringEncoding
+    //fn CFStringConvertEncodingToWindowsCodepage
+    //fn CFStringConvertIANACharSetNameToEncoding
+    //fn CFStringConvertNSStringEncodingToEncoding
+    //fn CFStringConvertWindowsCodepageToEncoding
+    //fn CFStringGetFastestEncoding
+    //fn CFStringGetListOfAvailableEncodings
+    //fn CFStringGetMaximumSizeForEncoding
+    //fn CFStringGetMostCompatibleMacStringEncoding
+    //fn CFStringGetNameOfEncoding
+    //fn CFStringGetSmallestEncoding
+    //fn CFStringGetSystemEncoding
+    //fn CFStringIsEncodingAvailable
+
+    /* Getting Numeric Values */
+    //fn CFStringGetDoubleValue
+    //fn CFStringGetIntValue
+
+    /* Getting String Properties */
+    //fn CFShowStr
+    pub fn CFStringGetTypeID() -> CFTypeID;
+
+    /* String File System Representations */
+    //fn CFStringCreateWithFileSystemRepresentation
+    //fn CFStringGetFileSystemRepresentation
+    //fn CFStringGetMaximumSizeOfFileSystemRepresentation
+
+    /* Getting Paragraph Bounds */
+    //fn CFStringGetParagraphBounds
+
+    /* Managing Surrogates */
+    //fn CFStringGetLongCharacterForSurrogatePair
+    //fn CFStringGetSurrogatePairForLongCharacter
+    //fn CFStringIsSurrogateHighCharacter
+    //fn CFStringIsSurrogateLowCharacter
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/timezone.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/timezone.rs
new file mode 100644
index 0000000..376cfdc
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/timezone.rs
@@ -0,0 +1,27 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+
+use base::{CFAllocatorRef, CFTypeID};
+use date::{CFTimeInterval, CFAbsoluteTime};
+
+#[repr(C)]
+pub struct __CFTimeZone(c_void);
+
+pub type CFTimeZoneRef = *const __CFTimeZone;
+
+extern {
+    pub fn CFTimeZoneCopySystem() -> CFTimeZoneRef;
+    pub fn CFTimeZoneCopyDefault() -> CFTimeZoneRef;
+    pub fn CFTimeZoneCreateWithTimeIntervalFromGMT(allocator: CFAllocatorRef, interval: CFTimeInterval) -> CFTimeZoneRef;
+    pub fn CFTimeZoneGetSecondsFromGMT(tz: CFTimeZoneRef, time: CFAbsoluteTime) -> CFTimeInterval;
+
+    pub fn CFTimeZoneGetTypeID() -> CFTypeID;
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/url.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/url.rs
new file mode 100644
index 0000000..9c4bc3e
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/url.rs
@@ -0,0 +1,164 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+
+use base::{CFOptionFlags, CFIndex, CFAllocatorRef, Boolean, CFTypeID, CFTypeRef, SInt32};
+use string::{CFStringRef, CFStringEncoding};
+use error::CFErrorRef;
+
+#[repr(C)]
+pub struct __CFURL(c_void);
+
+pub type CFURLRef = *const __CFURL;
+
+pub type CFURLBookmarkCreationOptions = CFOptionFlags;
+
+pub type CFURLPathStyle = CFIndex;
+
+/* typedef CF_ENUM(CFIndex, CFURLPathStyle) */
+pub const kCFURLPOSIXPathStyle: CFURLPathStyle   = 0;
+pub const kCFURLHFSPathStyle: CFURLPathStyle     = 1;
+pub const kCFURLWindowsPathStyle: CFURLPathStyle = 2;
+
+// static kCFURLBookmarkCreationPreferFileIDResolutionMask: CFURLBookmarkCreationOptions =
+//     (1 << 8) as u32;
+// static kCFURLBookmarkCreationMinimalBookmarkMask: CFURLBookmarkCreationOptions =
+//     (1 << 9) as u32;
+// static kCFURLBookmarkCreationSuitableForBookmarkFile: CFURLBookmarkCreationOptions =
+//     (1 << 10) as u32;
+// static kCFURLBookmarkCreationWithSecurityScope: CFURLBookmarkCreationOptions =
+//     (1 << 11) as u32;
+// static kCFURLBookmarkCreationSecurityScopeAllowOnlyReadAccess: CFURLBookmarkCreationOptions =
+//     (1 << 12) as u32;
+
+// TODO: there are a lot of missing keys and constants. Add if you are bored or need them.
+
+extern {
+    /*
+     * CFURL.h
+     */
+
+    /* Common File System Resource Keys */
+    pub static kCFURLAttributeModificationDateKey: CFStringRef;
+    pub static kCFURLContentAccessDateKey: CFStringRef;
+    pub static kCFURLContentModificationDateKey: CFStringRef;
+    pub static kCFURLCreationDateKey: CFStringRef;
+    pub static kCFURLFileResourceIdentifierKey: CFStringRef;
+    pub static kCFURLFileSecurityKey: CFStringRef;
+    pub static kCFURLHasHiddenExtensionKey: CFStringRef;
+    pub static kCFURLIsDirectoryKey: CFStringRef;
+    pub static kCFURLIsExecutableKey: CFStringRef;
+    pub static kCFURLIsHiddenKey: CFStringRef;
+    pub static kCFURLIsPackageKey: CFStringRef;
+    pub static kCFURLIsReadableKey: CFStringRef;
+    pub static kCFURLIsRegularFileKey: CFStringRef;
+    pub static kCFURLIsSymbolicLinkKey: CFStringRef;
+    pub static kCFURLIsSystemImmutableKey: CFStringRef;
+    pub static kCFURLIsUserImmutableKey: CFStringRef;
+    pub static kCFURLIsVolumeKey: CFStringRef;
+    pub static kCFURLIsWritableKey: CFStringRef;
+    pub static kCFURLLabelNumberKey: CFStringRef;
+    pub static kCFURLLinkCountKey: CFStringRef;
+    pub static kCFURLLocalizedLabelKey: CFStringRef;
+    pub static kCFURLLocalizedNameKey: CFStringRef;
+    pub static kCFURLLocalizedTypeDescriptionKey: CFStringRef;
+    pub static kCFURLNameKey: CFStringRef;
+    pub static kCFURLParentDirectoryURLKey: CFStringRef;
+    pub static kCFURLPreferredIOBlockSizeKey: CFStringRef;
+    pub static kCFURLTypeIdentifierKey: CFStringRef;
+    pub static kCFURLVolumeIdentifierKey: CFStringRef;
+    pub static kCFURLVolumeURLKey: CFStringRef;
+
+    #[cfg(feature="mac_os_10_8_features")]
+    #[cfg_attr(feature = "mac_os_10_7_support", linkage = "extern_weak")]
+    pub static kCFURLIsExcludedFromBackupKey: CFStringRef;
+    pub static kCFURLFileResourceTypeKey: CFStringRef;
+
+    /* Creating a CFURL */
+    pub fn CFURLCopyAbsoluteURL(anURL: CFURLRef) -> CFURLRef;
+    //fn CFURLCreateAbsoluteURLWithBytes
+    //fn CFURLCreateByResolvingBookmarkData
+    //fn CFURLCreateCopyAppendingPathComponent
+    //fn CFURLCreateCopyAppendingPathExtension
+    //fn CFURLCreateCopyDeletingLastPathComponent
+    //fn CFURLCreateCopyDeletingPathExtension
+    pub fn CFURLCreateFilePathURL(allocator: CFAllocatorRef, url: CFURLRef, error: *mut CFErrorRef) -> CFURLRef;
+    //fn CFURLCreateFileReferenceURL
+    pub fn CFURLCreateFromFileSystemRepresentation(allocator: CFAllocatorRef, buffer: *const u8, bufLen: CFIndex, isDirectory: Boolean) -> CFURLRef;
+    //fn CFURLCreateFromFileSystemRepresentationRelativeToBase
+    //fn CFURLCreateFromFSRef
+    pub fn CFURLCreateWithBytes(allocator: CFAllocatorRef, URLBytes: *const u8, length: CFIndex, encoding: CFStringEncoding, baseURL: CFURLRef) -> CFURLRef;
+    pub fn CFURLCreateWithFileSystemPath(allocator: CFAllocatorRef, filePath: CFStringRef, pathStyle: CFURLPathStyle, isDirectory: Boolean) -> CFURLRef;
+    pub fn CFURLCreateWithFileSystemPathRelativeToBase(allocator: CFAllocatorRef, filePath: CFStringRef, pathStyle: CFURLPathStyle, isDirectory: Boolean, baseURL: CFURLRef) -> CFURLRef;
+    //fn CFURLCreateWithString(allocator: CFAllocatorRef, urlString: CFStringRef,
+    //                         baseURL: CFURLRef) -> CFURLRef;
+
+    /* Accessing the Parts of a URL */
+    pub fn CFURLCanBeDecomposed(anURL: CFURLRef) -> Boolean;
+    pub fn CFURLCopyFileSystemPath(anURL: CFURLRef, pathStyle: CFURLPathStyle) -> CFStringRef;
+    pub fn CFURLCopyFragment(anURL: CFURLRef, charactersToLeaveEscaped: CFStringRef) -> CFStringRef;
+    pub fn CFURLCopyHostName(anURL: CFURLRef) -> CFStringRef;
+    pub fn CFURLCopyLastPathComponent(anURL: CFURLRef) -> CFStringRef;
+    pub fn CFURLCopyNetLocation(anURL: CFURLRef) -> CFStringRef;
+    pub fn CFURLCopyParameterString(anURL: CFURLRef, charactersToLeaveEscaped: CFStringRef) -> CFStringRef;
+    pub fn CFURLCopyPassword(anURL: CFURLRef) -> CFStringRef;
+    pub fn CFURLCopyPath(anURL: CFURLRef) -> CFStringRef;
+    pub fn CFURLCopyPathExtension(anURL: CFURLRef) -> CFStringRef;
+    pub fn CFURLCopyQueryString(anURL: CFURLRef, charactersToLeaveEscaped: CFStringRef) -> CFStringRef;
+    pub fn CFURLCopyResourceSpecifier(anURL: CFURLRef) -> CFStringRef;
+    pub fn CFURLCopyScheme(anURL: CFURLRef) -> CFStringRef;
+    pub fn CFURLCopyStrictPath(anURL: CFURLRef, isAbsolute: *mut Boolean) -> CFStringRef;
+    pub fn CFURLCopyUserName(anURL: CFURLRef) -> CFStringRef;
+    pub fn CFURLGetPortNumber(anURL: CFURLRef) -> SInt32;
+    pub fn CFURLHasDirectoryPath(anURL: CFURLRef) -> Boolean;
+
+    /* Converting URLs to Other Representations */
+    //fn CFURLCreateData(allocator: CFAllocatorRef, url: CFURLRef,
+    //                   encoding: CFStringEncoding, escapeWhitespace: bool) -> CFDataRef;
+    //fn CFURLCreateStringByAddingPercentEscapes
+    //fn CFURLCreateStringByReplacingPercentEscapes
+    //fn CFURLCreateStringByReplacingPercentEscapesUsingEncoding
+    pub fn CFURLGetFileSystemRepresentation(anURL: CFURLRef, resolveAgainstBase: Boolean, buffer: *mut u8, maxBufLen: CFIndex) -> Boolean;
+
+    //fn CFURLGetFSRef
+    pub fn CFURLGetString(anURL: CFURLRef) -> CFStringRef;
+
+    /* Getting URL Properties */
+    //fn CFURLGetBaseURL(anURL: CFURLRef) -> CFURLRef;
+    pub fn CFURLGetBytes(anURL: CFURLRef, buffer: *mut u8, bufferLength: CFIndex) -> CFIndex;
+    //fn CFURLGetByteRangeForComponent
+    pub fn CFURLGetTypeID() -> CFTypeID;
+    //fn CFURLResourceIsReachable
+
+    /* Getting and Setting File System Resource Properties */
+    pub fn CFURLClearResourcePropertyCache(url: CFURLRef);
+    //fn CFURLClearResourcePropertyCacheForKey
+    //fn CFURLCopyResourcePropertiesForKeys
+    //fn CFURLCopyResourcePropertyForKey
+    //fn CFURLCreateResourcePropertiesForKeysFromBookmarkData
+    //fn CFURLCreateResourcePropertyForKeyFromBookmarkData
+    //fn CFURLSetResourcePropertiesForKeys
+    pub fn CFURLSetResourcePropertyForKey(url: CFURLRef, key: CFStringRef, value: CFTypeRef, error: *mut CFErrorRef) -> Boolean;
+    //fn CFURLSetTemporaryResourcePropertyForKey
+
+    /* Working with Bookmark Data */
+    //fn CFURLCreateBookmarkData
+    //fn CFURLCreateBookmarkDataFromAliasRecord
+    //fn CFURLCreateBookmarkDataFromFile
+    //fn CFURLWriteBookmarkDataToFile
+    //fn CFURLStartAccessingSecurityScopedResource
+    //fn CFURLStopAccessingSecurityScopedResource
+}
+
+#[test]
+#[cfg(feature="mac_os_10_8_features")]
+fn can_see_excluded_from_backup_key() {
+    let _ = unsafe { kCFURLIsExcludedFromBackupKey };
+}
diff --git a/third_party/rust_crates/vendor/core-foundation-sys/src/uuid.rs b/third_party/rust_crates/vendor/core-foundation-sys/src/uuid.rs
new file mode 100644
index 0000000..42539529
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation-sys/src/uuid.rs
@@ -0,0 +1,49 @@
+// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+
+use base::{CFAllocatorRef, CFTypeID};
+
+#[repr(C)]
+pub struct __CFUUID(c_void);
+
+pub type CFUUIDRef = *const __CFUUID;
+
+#[repr(C)]
+#[derive(Clone, Copy, Default)]
+pub struct CFUUIDBytes {
+    pub byte0:  u8,
+    pub byte1:  u8,
+    pub byte2:  u8,
+    pub byte3:  u8,
+    pub byte4:  u8,
+    pub byte5:  u8,
+    pub byte6:  u8,
+    pub byte7:  u8,
+    pub byte8:  u8,
+    pub byte9:  u8,
+    pub byte10: u8,
+    pub byte11: u8,
+    pub byte12: u8,
+    pub byte13: u8,
+    pub byte14: u8,
+    pub byte15: u8
+}
+
+extern {
+    /*
+     * CFUUID.h
+     */
+    pub fn CFUUIDCreate(allocator: CFAllocatorRef) -> CFUUIDRef;
+    pub fn CFUUIDCreateFromUUIDBytes(allocator: CFAllocatorRef, bytes: CFUUIDBytes) -> CFUUIDRef;
+    pub fn CFUUIDGetUUIDBytes(uuid: CFUUIDRef) -> CFUUIDBytes;
+
+    pub fn CFUUIDGetTypeID() -> CFTypeID;
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/.cargo-checksum.json b/third_party/rust_crates/vendor/core-foundation/.cargo-checksum.json
new file mode 100644
index 0000000..12bd306
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"Cargo.toml":"072515f7973c73e5db7674b3c3f0e0c13a07800fcacb2ef1efb0c656f0ca77fe","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","src/array.rs":"c38c9364cbd53c7656959b62cb3fa93f6e2fb37f2822fed89f052ea73bb4b052","src/attributed_string.rs":"b3b998991234c3740751a21a38ad5179b9761d79fa51f975921c40d515a69825","src/base.rs":"043dc1c905fce6b3c3a2b7ebf6de937c728ca5e75766639ff45b31ec7b0a11cf","src/boolean.rs":"f5b4d295aaf6cc3681212afebeae2974c5d551125badcc066e6089ac0d2a0873","src/bundle.rs":"7e0fbe7032c8658ba5751a236eaaaa4b031fef43daf0be3aa229de4beb83b52a","src/data.rs":"a1d7e6430c745731fc7b2aee49af9f14e79c8a288951c82ea6507689a3356af8","src/date.rs":"a02f6cca7b6e8fbabc7713177429012658dba5146556e14a08e7baaf81958d83","src/dictionary.rs":"897886dd2ff5f011e838829fc82564404e9384e7bee58db7dc7d4c08c352599d","src/error.rs":"22c21087d9c2c103d1bcb2c4af33b684317bbda5d4747902e510d410f8c1a14b","src/filedescriptor.rs":"f01da404e42760a50d91a43af648e781916c0a10c23753bea94f0f67bdc4d00c","src/lib.rs":"98a1deda9e40c293dfd2410d8f9bdcbc033ec0c55e3b2807050fc6a7d68f23ce","src/number.rs":"9de607a5809dcb7f43ccce5ea2b587423dfe69aa94c1cf68a52e20b50f8c9835","src/propertylist.rs":"762e1ed2db80badd1b491767c02a62c9aa31d9751ecd45c2e4b3bec89ebd40ad","src/runloop.rs":"98334ee796cea1634a5a9baf59d62f02c25b718d45baab5230a5cc14cb2ee6d5","src/set.rs":"f8e80eefe5257084350f04fce2cf6b051f08efe7921f6459cba67ccd7ea1e1e7","src/string.rs":"1f1216a9b126e0496b0f757a42c28c59f0ee53f9b8bd45a7b2b6dc8046a3f3e7","src/timezone.rs":"65859378232ee55f04bc4544b88f5dbc21f5db01bd16f2df3e82136ee3ce26b4","src/url.rs":"ee5370a1ba88823ee0eaa8615c5dafd55cedd7bd50172e9f2caa52ed305e2233","src/uuid.rs":"c532363a1a322a88e195f8606e613a68012708454b0d61ffe7abce432ec68596","tests/use_macro_outside_crate.rs":"ed5e74ac9e988f2609c0b785189f1e6368d693f6401603ad065521f3ab51df94"},"package":"4e2640d6d0bf22e82bed1b73c6aef8d5dd31e5abe6666c57e6d45e2649f4f887"}
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/core-foundation/Cargo.toml b/third_party/rust_crates/vendor/core-foundation/Cargo.toml
new file mode 100644
index 0000000..a443f40
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/Cargo.toml
@@ -0,0 +1,39 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "core-foundation"
+version = "0.6.3"
+authors = ["The Servo Project Developers"]
+description = "Bindings to Core Foundation for OS X"
+homepage = "https://github.com/servo/core-foundation-rs"
+license = "MIT / Apache-2.0"
+repository = "https://github.com/servo/core-foundation-rs"
+[dependencies.chrono]
+version = "0.4"
+optional = true
+
+[dependencies.core-foundation-sys]
+version = "0.6.1"
+
+[dependencies.libc]
+version = "0.2"
+
+[dependencies.uuid]
+version = "0.5"
+optional = true
+
+[features]
+mac_os_10_7_support = ["core-foundation-sys/mac_os_10_7_support"]
+mac_os_10_8_features = ["core-foundation-sys/mac_os_10_8_features"]
+with-chrono = ["chrono"]
+with-uuid = ["uuid"]
diff --git a/third_party/rust_crates/vendor/core-foundation/LICENSE-APACHE b/third_party/rust_crates/vendor/core-foundation/LICENSE-APACHE
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/third_party/rust_crates/vendor/core-foundation/LICENSE-MIT b/third_party/rust_crates/vendor/core-foundation/LICENSE-MIT
new file mode 100644
index 0000000..807526f
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2012-2013 Mozilla Foundation
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/third_party/rust_crates/vendor/core-foundation/src/array.rs b/third_party/rust_crates/vendor/core-foundation/src/array.rs
new file mode 100644
index 0000000..14b5088
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/array.rs
@@ -0,0 +1,281 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Heterogeneous immutable arrays.
+
+pub use core_foundation_sys::array::*;
+pub use core_foundation_sys::base::CFIndex;
+use core_foundation_sys::base::{CFTypeRef, CFRelease, kCFAllocatorDefault};
+use std::mem;
+use std::marker::PhantomData;
+use std::os::raw::c_void;
+use std::ptr;
+use ConcreteCFType;
+
+use base::{CFIndexConvertible, TCFType, CFRange};
+use base::{FromVoid, ItemRef};
+
+/// A heterogeneous immutable array.
+pub struct CFArray<T = *const c_void>(CFArrayRef, PhantomData<T>);
+
+impl<T> Drop for CFArray<T> {
+    fn drop(&mut self) {
+        unsafe { CFRelease(self.as_CFTypeRef()) }
+    }
+}
+
+pub struct CFArrayIterator<'a, T: 'a> {
+    array: &'a CFArray<T>,
+    index: CFIndex,
+    len: CFIndex,
+}
+
+impl<'a, T: FromVoid> Iterator for CFArrayIterator<'a, T> {
+    type Item = ItemRef<'a, T>;
+
+    fn next(&mut self) -> Option<ItemRef<'a, T>> {
+        if self.index >= self.len {
+            None
+        } else {
+            let value = unsafe { self.array.get_unchecked(self.index) };
+            self.index += 1;
+            Some(value)
+        }
+    }
+}
+
+impl<'a, T: FromVoid> ExactSizeIterator for CFArrayIterator<'a, T> {
+    fn len(&self) -> usize {
+        (self.array.len() - self.index) as usize
+    }
+}
+
+impl_TCFType!(CFArray<T>, CFArrayRef, CFArrayGetTypeID);
+impl_CFTypeDescription!(CFArray);
+
+unsafe impl ConcreteCFType for CFArray<*const c_void> {}
+
+impl<T> CFArray<T> {
+    /// Creates a new `CFArray` with the given elements, which must implement `Copy`.
+    pub fn from_copyable(elems: &[T]) -> CFArray<T> where T: Copy {
+        unsafe {
+            let array_ref = CFArrayCreate(kCFAllocatorDefault,
+                                          mem::transmute(elems.as_ptr()),
+                                          elems.len().to_CFIndex(),
+                                          ptr::null());
+            TCFType::wrap_under_create_rule(array_ref)
+        }
+    }
+
+    /// Creates a new `CFArray` with the given elements, which must be `CFType` objects.
+    pub fn from_CFTypes(elems: &[T]) -> CFArray<T> where T: TCFType {
+        unsafe {
+            let elems: Vec<CFTypeRef> = elems.iter().map(|elem| elem.as_CFTypeRef()).collect();
+            let array_ref = CFArrayCreate(kCFAllocatorDefault,
+                                          mem::transmute(elems.as_ptr()),
+                                          elems.len().to_CFIndex(),
+                                          &kCFTypeArrayCallBacks);
+            TCFType::wrap_under_create_rule(array_ref)
+        }
+    }
+
+    #[inline]
+    pub fn to_untyped(&self) -> CFArray {
+        unsafe { CFArray::wrap_under_get_rule(self.0) }
+    }
+
+    /// Returns the same array, but with the type reset to void pointers.
+    /// Equal to `to_untyped`, but is faster since it does not increment the retain count.
+    #[inline]
+    pub fn into_untyped(self) -> CFArray {
+        let reference = self.0;
+        mem::forget(self);
+        unsafe { CFArray::wrap_under_create_rule(reference) }
+    }
+
+    /// Iterates over the elements of this `CFArray`.
+    ///
+    /// Careful; the loop body must wrap the reference properly. Generally, when array elements are
+    /// Core Foundation objects (not always true), they need to be wrapped with
+    /// `TCFType::wrap_under_get_rule()`.
+    #[inline]
+    pub fn iter<'a>(&'a self) -> CFArrayIterator<'a, T> {
+        CFArrayIterator {
+            array: self,
+            index: 0,
+            len: self.len(),
+        }
+    }
+
+    #[inline]
+    pub fn len(&self) -> CFIndex {
+        unsafe {
+            CFArrayGetCount(self.0)
+        }
+    }
+
+    #[inline]
+    pub unsafe fn get_unchecked<'a>(&'a self, index: CFIndex) -> ItemRef<'a, T> where T: FromVoid {
+        T::from_void(CFArrayGetValueAtIndex(self.0, index))
+    }
+
+    #[inline]
+    pub fn get<'a>(&'a self, index: CFIndex) -> Option<ItemRef<'a, T>> where T: FromVoid {
+        if index < self.len() {
+            Some(unsafe { T::from_void(CFArrayGetValueAtIndex(self.0, index)) } )
+        } else {
+            None
+        }
+    }
+
+    pub fn get_values(&self, range: CFRange) -> Vec<*const c_void> {
+        let mut vec = Vec::with_capacity(range.length as usize);
+        unsafe {
+            CFArrayGetValues(self.0, range, vec.as_mut_ptr());
+            vec.set_len(range.length as usize);
+            vec
+        }
+    }
+
+    pub fn get_all_values(&self) -> Vec<*const c_void> {
+        self.get_values(CFRange {
+            location: 0,
+            length: self.len()
+        })
+    }
+}
+
+impl<'a, T: FromVoid> IntoIterator for &'a CFArray<T> {
+    type Item = ItemRef<'a, T>;
+    type IntoIter = CFArrayIterator<'a, T>;
+
+    fn into_iter(self) -> CFArrayIterator<'a, T> {
+        self.iter()
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use std::mem;
+    use base::CFType;
+
+    #[test]
+    fn to_untyped_correct_retain_count() {
+        let array = CFArray::<CFType>::from_CFTypes(&[]);
+        assert_eq!(array.retain_count(), 1);
+
+        let untyped_array = array.to_untyped();
+        assert_eq!(array.retain_count(), 2);
+        assert_eq!(untyped_array.retain_count(), 2);
+
+        mem::drop(array);
+        assert_eq!(untyped_array.retain_count(), 1);
+    }
+
+    #[test]
+    fn into_untyped() {
+        let array = CFArray::<CFType>::from_CFTypes(&[]);
+        let array2 = array.to_untyped();
+        assert_eq!(array.retain_count(), 2);
+
+        let untyped_array = array.into_untyped();
+        assert_eq!(untyped_array.retain_count(), 2);
+
+        mem::drop(array2);
+        assert_eq!(untyped_array.retain_count(), 1);
+    }
+
+    #[test]
+    fn borrow() {
+        use string::CFString;
+
+        let string = CFString::from_static_string("bar");
+        assert_eq!(string.retain_count(), 1);
+        let x;
+        {
+            let arr: CFArray<CFString> = CFArray::from_CFTypes(&[string]);
+            {
+                let p = arr.get(0).unwrap();
+                assert_eq!(p.retain_count(), 1);
+            }
+            {
+                x = arr.get(0).unwrap().clone();
+                assert_eq!(x.retain_count(), 2);
+                assert_eq!(x.to_string(), "bar");
+            }
+        }
+        assert_eq!(x.retain_count(), 1);
+    }
+
+    #[test]
+    fn iter_untyped_array() {
+        use string::{CFString, CFStringRef};
+        use base::TCFTypeRef;
+
+        let cf_string = CFString::from_static_string("bar");
+        let array: CFArray = CFArray::from_CFTypes(&[cf_string.clone()]).into_untyped();
+
+        let cf_strings = array.iter().map(|ptr| {
+            unsafe { CFString::wrap_under_get_rule(CFStringRef::from_void_ptr(*ptr)) }
+        }).collect::<Vec<_>>();
+        let strings = cf_strings.iter().map(|s| s.to_string()).collect::<Vec<_>>();
+        assert_eq!(cf_string.retain_count(), 3);
+        assert_eq!(&strings[..], &["bar"]);
+    }
+
+    #[test]
+    fn should_box_and_unbox() {
+        use number::CFNumber;
+
+        let n0 = CFNumber::from(0);
+        let n1 = CFNumber::from(1);
+        let n2 = CFNumber::from(2);
+        let n3 = CFNumber::from(3);
+        let n4 = CFNumber::from(4);
+        let n5 = CFNumber::from(5);
+
+        let arr = CFArray::from_CFTypes(&[
+            n0.as_CFType(),
+            n1.as_CFType(),
+            n2.as_CFType(),
+            n3.as_CFType(),
+            n4.as_CFType(),
+            n5.as_CFType(),
+        ]);
+
+        assert!(arr.get_all_values() == &[n0.as_CFTypeRef(),
+                                        n1.as_CFTypeRef(),
+                                        n2.as_CFTypeRef(),
+                                        n3.as_CFTypeRef(),
+                                        n4.as_CFTypeRef(),
+                                        n5.as_CFTypeRef()]);
+
+        let mut sum = 0;
+
+        let mut iter = arr.iter();
+        assert_eq!(iter.len(), 6);
+        assert!(iter.next().is_some());
+        assert_eq!(iter.len(), 5);
+
+        for elem in iter {
+            let number: CFNumber = elem.downcast::<CFNumber>().unwrap();
+            sum += number.to_i64().unwrap()
+        }
+
+        assert!(sum == 15);
+
+        for elem in arr.iter() {
+            let number: CFNumber = elem.downcast::<CFNumber>().unwrap();
+            sum += number.to_i64().unwrap()
+        }
+
+        assert!(sum == 30);
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/attributed_string.rs b/third_party/rust_crates/vendor/core-foundation/src/attributed_string.rs
new file mode 100644
index 0000000..dea20fc
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/attributed_string.rs
@@ -0,0 +1,79 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+pub use core_foundation_sys::attributed_string::*;
+
+use base::TCFType;
+use core_foundation_sys::base::{CFIndex, CFRange, kCFAllocatorDefault};
+use std::ptr::null;
+use string::{CFString, CFStringRef};
+
+declare_TCFType!{
+    CFAttributedString, CFAttributedStringRef
+}
+impl_TCFType!(CFAttributedString, CFAttributedStringRef, CFAttributedStringGetTypeID);
+
+impl CFAttributedString {
+    #[inline]
+    pub fn new(string: &CFString) -> Self {
+        unsafe {
+            let astr_ref = CFAttributedStringCreate(
+                kCFAllocatorDefault, string.as_concrete_TypeRef(), null());
+
+            CFAttributedString::wrap_under_create_rule(astr_ref)
+        }
+    }
+
+    #[inline]
+    pub fn char_len(&self) -> CFIndex {
+        unsafe {
+            CFAttributedStringGetLength(self.0)
+        }
+    }
+}
+
+declare_TCFType!{
+    CFMutableAttributedString, CFMutableAttributedStringRef
+}
+impl_TCFType!(CFMutableAttributedString, CFMutableAttributedStringRef, CFMutableAttributedStringGetTypeID);
+
+impl CFMutableAttributedString {
+    #[inline]
+    pub fn new() -> Self {
+        unsafe {
+            let astr_ref = CFAttributedStringCreateMutable(
+                kCFAllocatorDefault, 0);
+
+            CFMutableAttributedString::wrap_under_create_rule(astr_ref)
+        }
+    }
+
+    #[inline]
+    pub fn char_len(&self) -> CFIndex {
+        unsafe {
+            CFAttributedStringGetLength(self.0)
+        }
+    }
+
+    #[inline]
+    pub fn replace_str(&mut self, string: &CFString, range: CFRange) {
+        unsafe {
+            CFAttributedStringReplaceString(
+                self.0, range, string.as_concrete_TypeRef());
+        }
+    }
+
+    #[inline]
+    pub fn set_attribute<T: TCFType>(&mut self, range: CFRange, name: CFStringRef, value: T) {
+        unsafe {
+            CFAttributedStringSetAttribute(
+                self.0, range, name, value.as_CFTypeRef());
+        }
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/base.rs b/third_party/rust_crates/vendor/core-foundation/src/base.rs
new file mode 100644
index 0000000..a4bc071
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/base.rs
@@ -0,0 +1,443 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std;
+use std::fmt;
+use std::marker::PhantomData;
+use std::mem;
+use std::mem::ManuallyDrop;
+use std::ops::{Deref, DerefMut};
+use std::os::raw::c_void;
+
+pub use core_foundation_sys::base::*;
+
+use string::CFString;
+use ConcreteCFType;
+
+pub trait CFIndexConvertible {
+    /// Always use this method to construct a `CFIndex` value. It performs bounds checking to
+    /// ensure the value is in range.
+    fn to_CFIndex(self) -> CFIndex;
+}
+
+impl CFIndexConvertible for usize {
+    #[inline]
+    fn to_CFIndex(self) -> CFIndex {
+        let max_CFIndex = CFIndex::max_value();
+        if self > (max_CFIndex as usize) {
+            panic!("value out of range")
+        }
+        self as CFIndex
+    }
+}
+
+declare_TCFType!{
+    /// Superclass of all Core Foundation objects.
+    CFType, CFTypeRef
+}
+
+impl CFType {
+    /// Try to downcast the `CFType` to a subclass. Checking if the instance is the
+    /// correct subclass happens at runtime and `None` is returned if it is not the correct type.
+    /// Works similar to [`Box::downcast`] and [`CFPropertyList::downcast`].
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// # use core_foundation::string::CFString;
+    /// # use core_foundation::boolean::CFBoolean;
+    /// # use core_foundation::base::{CFType, TCFType};
+    /// #
+    /// // Create a string.
+    /// let string: CFString = CFString::from_static_string("FooBar");
+    /// // Cast it up to a CFType.
+    /// let cf_type: CFType = string.as_CFType();
+    /// // Cast it down again.
+    /// assert!(cf_type.downcast::<CFString>().unwrap().to_string() == "FooBar");
+    /// // Casting it to some other type will yield `None`
+    /// assert!(cf_type.downcast::<CFBoolean>().is_none());
+    /// ```
+    ///
+    /// ```compile_fail
+    /// # use core_foundation::array::CFArray;
+    /// # use core_foundation::base::TCFType;
+    /// # use core_foundation::boolean::CFBoolean;
+    /// # use core_foundation::string::CFString;
+    /// #
+    /// let boolean_array = CFArray::from_CFTypes(&[CFBoolean::true_value()]).into_CFType();
+    ///
+    /// // This downcast is not allowed and causes compiler error, since it would cause undefined
+    /// // behavior to access the elements of the array as a CFString:
+    /// let invalid_string_array = boolean_array
+    ///     .downcast_into::<CFArray<CFString>>()
+    ///     .unwrap();
+    /// ```
+    ///
+    /// [`Box::downcast`]: https://doc.rust-lang.org/std/boxed/struct.Box.html#method.downcast
+    /// [`CFPropertyList::downcast`]: ../propertylist/struct.CFPropertyList.html#method.downcast
+    #[inline]
+    pub fn downcast<T: ConcreteCFType>(&self) -> Option<T> {
+        if self.instance_of::<T>() {
+            unsafe {
+                let reference = T::Ref::from_void_ptr(self.0);
+                Some(T::wrap_under_get_rule(reference))
+            }
+        } else {
+            None
+        }
+    }
+
+    /// Similar to [`downcast`], but consumes self and can thus avoid touching the retain count.
+    ///
+    /// [`downcast`]: #method.downcast
+    #[inline]
+    pub fn downcast_into<T: ConcreteCFType>(self) -> Option<T> {
+        if self.instance_of::<T>() {
+            unsafe {
+                let reference = T::Ref::from_void_ptr(self.0);
+                mem::forget(self);
+                Some(T::wrap_under_create_rule(reference))
+            }
+        } else {
+            None
+        }
+    }
+}
+
+impl fmt::Debug for CFType {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let desc = unsafe {
+            CFString::wrap_under_create_rule(CFCopyDescription(self.0))
+        };
+        desc.fmt(f)
+    }
+}
+
+impl Clone for CFType {
+    #[inline]
+    fn clone(&self) -> CFType {
+        unsafe {
+            TCFType::wrap_under_get_rule(self.0)
+        }
+    }
+}
+
+impl PartialEq for CFType {
+    #[inline]
+    fn eq(&self, other: &CFType) -> bool {
+        unsafe {
+            CFEqual(self.as_CFTypeRef(), other.as_CFTypeRef()) != 0
+        }
+    }
+}
+
+declare_TCFType!(CFAllocator, CFAllocatorRef);
+impl_TCFType!(CFAllocator, CFAllocatorRef, CFAllocatorGetTypeID);
+
+impl CFAllocator {
+    #[inline]
+    pub fn new(mut context: CFAllocatorContext) -> CFAllocator {
+        unsafe {
+            let allocator_ref = CFAllocatorCreate(kCFAllocatorDefault, &mut context);
+            TCFType::wrap_under_create_rule(allocator_ref)
+        }
+    }
+}
+
+
+/// All Core Foundation types implement this trait. The associated type `Ref` specifies the
+/// associated Core Foundation type: e.g. for `CFType` this is `CFTypeRef`; for `CFArray` this is
+/// `CFArrayRef`.
+pub trait TCFType {
+    /// The reference type wrapped inside this type.
+    type Ref: TCFTypeRef;
+
+    /// Returns the object as its concrete TypeRef.
+    fn as_concrete_TypeRef(&self) -> Self::Ref;
+
+    /// Returns an instance of the object, wrapping the underlying `CFTypeRef` subclass. Use this
+    /// when following Core Foundation's "Create Rule". The reference count is *not* bumped.
+    unsafe fn wrap_under_create_rule(obj: Self::Ref) -> Self;
+
+    /// Returns the type ID for this class.
+    fn type_id() -> CFTypeID;
+
+    /// Returns the object as a wrapped `CFType`. The reference count is incremented by one.
+    #[inline]
+    fn as_CFType(&self) -> CFType {
+        unsafe {
+            TCFType::wrap_under_get_rule(self.as_CFTypeRef())
+        }
+    }
+
+    /// Returns the object as a wrapped `CFType`. Consumes self and avoids changing the reference
+    /// count.
+    #[inline]
+    fn into_CFType(self) -> CFType
+    where
+        Self: Sized,
+    {
+        let reference = self.as_CFTypeRef();
+        mem::forget(self);
+        unsafe { TCFType::wrap_under_create_rule(reference) }
+    }
+
+    /// Returns the object as a raw `CFTypeRef`. The reference count is not adjusted.
+    fn as_CFTypeRef(&self) -> CFTypeRef;
+
+    /// Returns an instance of the object, wrapping the underlying `CFTypeRef` subclass. Use this
+    /// when following Core Foundation's "Get Rule". The reference count *is* bumped.
+    unsafe fn wrap_under_get_rule(reference: Self::Ref) -> Self;
+
+    /// Returns the reference count of the object. It is unwise to do anything other than test
+    /// whether the return value of this method is greater than zero.
+    #[inline]
+    fn retain_count(&self) -> CFIndex {
+        unsafe {
+            CFGetRetainCount(self.as_CFTypeRef())
+        }
+    }
+
+    /// Returns the type ID of this object.
+    #[inline]
+    fn type_of(&self) -> CFTypeID {
+        unsafe {
+            CFGetTypeID(self.as_CFTypeRef())
+        }
+    }
+
+    /// Writes a debugging version of this object on standard error.
+    fn show(&self) {
+        unsafe {
+            CFShow(self.as_CFTypeRef())
+        }
+    }
+
+    /// Returns true if this value is an instance of another type.
+    #[inline]
+    fn instance_of<OtherCFType: TCFType>(&self) -> bool {
+        self.type_of() == OtherCFType::type_id()
+    }
+}
+
+impl TCFType for CFType {
+    type Ref = CFTypeRef;
+
+    #[inline]
+    fn as_concrete_TypeRef(&self) -> CFTypeRef {
+        self.0
+    }
+
+    #[inline]
+    unsafe fn wrap_under_get_rule(reference: CFTypeRef) -> CFType {
+        let reference: CFTypeRef = CFRetain(reference);
+        TCFType::wrap_under_create_rule(reference)
+    }
+
+    #[inline]
+    fn as_CFTypeRef(&self) -> CFTypeRef {
+        self.as_concrete_TypeRef()
+    }
+
+    #[inline]
+    unsafe fn wrap_under_create_rule(obj: CFTypeRef) -> CFType {
+        CFType(obj)
+    }
+
+    #[inline]
+    fn type_id() -> CFTypeID {
+        // FIXME(pcwalton): Is this right?
+        0
+    }
+}
+
+/// A reference to an element inside a container
+pub struct ItemRef<'a, T: 'a>(ManuallyDrop<T>, PhantomData<&'a T>);
+
+impl<'a, T> Deref for ItemRef<'a, T> {
+    type Target = T;
+
+    fn deref(&self) -> &T {
+        &self.0
+    }
+}
+
+impl<'a, T: fmt::Debug> fmt::Debug for ItemRef<'a, T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
+        self.0.fmt(f)
+    }
+}
+
+impl<'a, T: PartialEq> PartialEq for ItemRef<'a, T> {
+    fn eq(&self, other: &Self) -> bool {
+        self.0.eq(&other.0)
+    }
+}
+
+/// A reference to a mutable element inside a container
+pub struct ItemMutRef<'a, T: 'a>(ManuallyDrop<T>, PhantomData<&'a T>);
+
+impl<'a, T> Deref for ItemMutRef<'a, T> {
+    type Target = T;
+
+    fn deref(&self) -> &T {
+        &self.0
+    }
+}
+
+impl<'a, T> DerefMut for ItemMutRef<'a, T> {
+    fn deref_mut(&mut self) -> &mut T {
+        &mut self.0
+    }
+}
+
+impl<'a, T: fmt::Debug> fmt::Debug for ItemMutRef<'a, T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
+        self.0.fmt(f)
+    }
+}
+
+impl<'a, T: PartialEq> PartialEq for ItemMutRef<'a, T> {
+    fn eq(&self, other: &Self) -> bool {
+        self.0.eq(&other.0)
+    }
+}
+
+/// A trait describing how to convert from the stored *mut c_void to the desired T
+pub unsafe trait FromMutVoid {
+    unsafe fn from_mut_void<'a>(x: *mut c_void) -> ItemMutRef<'a, Self> where Self: std::marker::Sized;
+}
+
+unsafe impl FromMutVoid for u32 {
+    unsafe fn from_mut_void<'a>(x: *mut c_void) -> ItemMutRef<'a, Self> {
+        ItemMutRef(ManuallyDrop::new(x as u32), PhantomData)
+    }
+}
+
+unsafe impl FromMutVoid for *const c_void {
+    unsafe fn from_mut_void<'a>(x: *mut c_void) -> ItemMutRef<'a, Self> {
+        ItemMutRef(ManuallyDrop::new(x), PhantomData)
+    }
+}
+
+unsafe impl<T: TCFType> FromMutVoid for T {
+    unsafe fn from_mut_void<'a>(x: *mut c_void) -> ItemMutRef<'a, Self> {
+        ItemMutRef(ManuallyDrop::new(TCFType::wrap_under_create_rule(T::Ref::from_void_ptr(x))), PhantomData)
+    }
+}
+
+/// A trait describing how to convert from the stored *const c_void to the desired T
+pub unsafe trait FromVoid {
+    unsafe fn from_void<'a>(x: *const c_void) -> ItemRef<'a, Self> where Self: std::marker::Sized;
+}
+
+unsafe impl FromVoid for u32 {
+    unsafe fn from_void<'a>(x: *const c_void) -> ItemRef<'a, Self> {
+        // Functions like CGFontCopyTableTags treat the void*'s as u32's
+        // so we convert by casting directly
+        ItemRef(ManuallyDrop::new(x as u32), PhantomData)
+    }
+}
+
+unsafe impl FromVoid for *const c_void {
+    unsafe fn from_void<'a>(x: *const c_void) -> ItemRef<'a, Self> {
+        ItemRef(ManuallyDrop::new(x), PhantomData)
+    }
+}
+
+unsafe impl<T: TCFType> FromVoid for T {
+    unsafe fn from_void<'a>(x: *const c_void) -> ItemRef<'a, Self> {
+        ItemRef(ManuallyDrop::new(TCFType::wrap_under_create_rule(T::Ref::from_void_ptr(x))), PhantomData)
+    }
+}
+
+/// A trait describing how to convert from the stored *const c_void to the desired T
+pub unsafe trait ToVoid<T> {
+    fn to_void(&self) -> *const c_void;
+}
+
+unsafe impl ToVoid<*const c_void> for *const c_void {
+    fn to_void(&self) -> *const c_void {
+        *self
+    }
+}
+
+unsafe impl<'a> ToVoid<CFType> for &'a CFType {
+    fn to_void(&self) -> *const ::std::os::raw::c_void {
+        self.as_concrete_TypeRef().as_void_ptr()
+    }
+}
+
+unsafe impl ToVoid<CFType> for CFType {
+    fn to_void(&self) -> *const ::std::os::raw::c_void {
+        self.as_concrete_TypeRef().as_void_ptr()
+    }
+}
+
+unsafe impl ToVoid<CFType> for CFTypeRef {
+    fn to_void(&self) -> *const ::std::os::raw::c_void {
+        self.as_void_ptr()
+    }
+}
+
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use std::mem;
+    use boolean::CFBoolean;
+
+    #[test]
+    fn cftype_instance_of() {
+        let string = CFString::from_static_string("foo");
+        let cftype = string.as_CFType();
+
+        assert!(cftype.instance_of::<CFString>());
+        assert!(!cftype.instance_of::<CFBoolean>());
+    }
+
+    #[test]
+    fn as_cftype_retain_count() {
+        let string = CFString::from_static_string("bar");
+        assert_eq!(string.retain_count(), 1);
+        let cftype = string.as_CFType();
+        assert_eq!(cftype.retain_count(), 2);
+        mem::drop(string);
+        assert_eq!(cftype.retain_count(), 1);
+    }
+
+    #[test]
+    fn into_cftype_retain_count() {
+        let string = CFString::from_static_string("bar");
+        assert_eq!(string.retain_count(), 1);
+        let cftype = string.into_CFType();
+        assert_eq!(cftype.retain_count(), 1);
+    }
+
+    #[test]
+    fn as_cftype_and_downcast() {
+        let string = CFString::from_static_string("bar");
+        let cftype = string.as_CFType();
+        let string2 = cftype.downcast::<CFString>().unwrap();
+        assert_eq!(string2.to_string(), "bar");
+
+        assert_eq!(string.retain_count(), 3);
+        assert_eq!(cftype.retain_count(), 3);
+        assert_eq!(string2.retain_count(), 3);
+    }
+
+    #[test]
+    fn into_cftype_and_downcast_into() {
+        let string = CFString::from_static_string("bar");
+        let cftype = string.into_CFType();
+        let string2 = cftype.downcast_into::<CFString>().unwrap();
+        assert_eq!(string2.to_string(), "bar");
+        assert_eq!(string2.retain_count(), 1);
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/boolean.rs b/third_party/rust_crates/vendor/core-foundation/src/boolean.rs
new file mode 100644
index 0000000..8c13b90
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/boolean.rs
@@ -0,0 +1,70 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! A Boolean type.
+
+pub use core_foundation_sys::number::{CFBooleanRef, CFBooleanGetTypeID, kCFBooleanTrue, kCFBooleanFalse};
+
+use base::TCFType;
+
+
+declare_TCFType!{
+    /// A Boolean type.
+    ///
+    /// FIXME(pcwalton): Should be a newtype struct, but that fails due to a Rust compiler bug.
+    CFBoolean, CFBooleanRef
+}
+impl_TCFType!(CFBoolean, CFBooleanRef, CFBooleanGetTypeID);
+impl_CFTypeDescription!(CFBoolean);
+
+impl CFBoolean {
+    pub fn true_value() -> CFBoolean {
+        unsafe {
+            TCFType::wrap_under_get_rule(kCFBooleanTrue)
+        }
+    }
+
+    pub fn false_value() -> CFBoolean {
+        unsafe {
+            TCFType::wrap_under_get_rule(kCFBooleanFalse)
+        }
+    }
+}
+
+impl From<bool> for CFBoolean {
+    fn from(value: bool) -> CFBoolean {
+        if value {
+            CFBoolean::true_value()
+        } else {
+            CFBoolean::false_value()
+        }
+    }
+}
+
+impl From<CFBoolean> for bool {
+    fn from(value: CFBoolean) -> bool {
+        value.0 == unsafe { kCFBooleanTrue }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn to_and_from_bool() {
+        let b_false = CFBoolean::from(false);
+        let b_true = CFBoolean::from(true);
+        assert_ne!(b_false, b_true);
+        assert_eq!(b_false, CFBoolean::false_value());
+        assert_eq!(b_true, CFBoolean::true_value());
+        assert!(!bool::from(b_false));
+        assert!(bool::from(b_true));
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/bundle.rs b/third_party/rust_crates/vendor/core-foundation/src/bundle.rs
new file mode 100644
index 0000000..f23f9ae
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/bundle.rs
@@ -0,0 +1,141 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Core Foundation Bundle Type
+
+pub use core_foundation_sys::bundle::*;
+use core_foundation_sys::base::kCFAllocatorDefault;
+
+use base::{CFType, TCFType};
+use url::CFURL;
+use dictionary::CFDictionary;
+use std::os::raw::c_void;
+use string::CFString;
+
+declare_TCFType!{
+    /// A Bundle type.
+    CFBundle, CFBundleRef
+}
+impl_TCFType!(CFBundle, CFBundleRef, CFBundleGetTypeID);
+
+impl CFBundle {
+    pub fn new(bundleURL: CFURL) -> Option<CFBundle> {
+        unsafe {
+            let bundle_ref = CFBundleCreate(kCFAllocatorDefault, bundleURL.as_concrete_TypeRef());
+            if bundle_ref.is_null() {
+                None
+            } else {
+                Some(TCFType::wrap_under_create_rule(bundle_ref))
+            }
+        }
+    }
+
+    pub fn bundle_with_identifier(identifier: CFString) -> Option<CFBundle> {
+        unsafe {
+            let bundle_ref = CFBundleGetBundleWithIdentifier(identifier.as_concrete_TypeRef());
+            if bundle_ref.is_null() {
+                None
+            } else {
+                Some(TCFType::wrap_under_get_rule(bundle_ref))
+            }
+        }
+    }
+
+    pub fn function_pointer_for_name(&self, function_name: CFString) -> *const c_void {
+        unsafe {
+            CFBundleGetFunctionPointerForName(self.as_concrete_TypeRef(),
+                                              function_name.as_concrete_TypeRef())
+        }
+    }
+
+    pub fn main_bundle() -> CFBundle {
+        unsafe {
+            let bundle_ref = CFBundleGetMainBundle();
+            TCFType::wrap_under_get_rule(bundle_ref)
+        }
+    }
+
+    pub fn info_dictionary(&self) -> CFDictionary<CFString, CFType> {
+        unsafe {
+            let info_dictionary = CFBundleGetInfoDictionary(self.0);
+            TCFType::wrap_under_get_rule(info_dictionary)
+        }
+    }
+
+    pub fn executable_url(&self) -> Option<CFURL> {
+        unsafe {
+            let exe_url = CFBundleCopyExecutableURL(self.0);
+            if exe_url.is_null() {
+                None
+            } else {
+                Some(TCFType::wrap_under_create_rule(exe_url))
+            }
+        }
+    }
+
+    pub fn private_frameworks_url(&self) -> Option<CFURL> {
+        unsafe {
+            let fw_url = CFBundleCopyPrivateFrameworksURL(self.0);
+            if fw_url.is_null() {
+                None
+            } else {
+                Some(TCFType::wrap_under_create_rule(fw_url))
+            }
+        }
+    }
+}
+
+
+#[test]
+fn safari_executable_url() {
+    use string::CFString;
+    use url::{CFURL, kCFURLPOSIXPathStyle};
+
+    let cfstr_path = CFString::from_static_string("/Applications/Safari.app");
+    let cfurl_path = CFURL::from_file_system_path(cfstr_path, kCFURLPOSIXPathStyle, true);
+    let cfurl_executable = CFBundle::new(cfurl_path)
+        .expect("Safari not present")
+        .executable_url();
+    assert!(cfurl_executable.is_some());
+    assert_eq!(cfurl_executable
+                   .unwrap()
+                   .absolute()
+                   .get_file_system_path(kCFURLPOSIXPathStyle)
+                   .to_string(),
+               "/Applications/Safari.app/Contents/MacOS/Safari");
+}
+
+#[test]
+fn safari_private_frameworks_url() {
+    use string::CFString;
+    use url::{CFURL, kCFURLPOSIXPathStyle};
+
+    let cfstr_path = CFString::from_static_string("/Applications/Safari.app");
+    let cfurl_path = CFURL::from_file_system_path(cfstr_path, kCFURLPOSIXPathStyle, true);
+    let cfurl_executable = CFBundle::new(cfurl_path)
+        .expect("Safari not present")
+        .private_frameworks_url();
+    assert!(cfurl_executable.is_some());
+    assert_eq!(cfurl_executable
+                   .unwrap()
+                   .absolute()
+                   .get_file_system_path(kCFURLPOSIXPathStyle)
+                   .to_string(),
+               "/Applications/Safari.app/Contents/Frameworks");
+}
+
+#[test]
+fn non_existant_bundle() {
+    use string::CFString;
+    use url::{CFURL, kCFURLPOSIXPathStyle};
+
+    let cfstr_path = CFString::from_static_string("/usr/local/foo");
+    let cfurl_path = CFURL::from_file_system_path(cfstr_path, kCFURLPOSIXPathStyle, true);
+    assert!(CFBundle::new(cfurl_path).is_none());
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/data.rs b/third_party/rust_crates/vendor/core-foundation/src/data.rs
new file mode 100644
index 0000000..2b5010a
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/data.rs
@@ -0,0 +1,63 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Core Foundation byte buffers.
+
+pub use core_foundation_sys::data::*;
+use core_foundation_sys::base::CFIndex;
+use core_foundation_sys::base::{kCFAllocatorDefault};
+use std::ops::Deref;
+use std::slice;
+
+use base::{CFIndexConvertible, TCFType};
+
+
+declare_TCFType!{
+    /// A byte buffer.
+    CFData, CFDataRef
+}
+impl_TCFType!(CFData, CFDataRef, CFDataGetTypeID);
+impl_CFTypeDescription!(CFData);
+
+impl CFData {
+    pub fn from_buffer(buffer: &[u8]) -> CFData {
+        unsafe {
+            let data_ref = CFDataCreate(kCFAllocatorDefault,
+                                        buffer.as_ptr(),
+                                        buffer.len().to_CFIndex());
+            TCFType::wrap_under_create_rule(data_ref)
+        }
+    }
+
+    /// Returns a pointer to the underlying bytes in this data. Note that this byte buffer is
+    /// read-only.
+    #[inline]
+    pub fn bytes<'a>(&'a self) -> &'a [u8] {
+        unsafe {
+            slice::from_raw_parts(CFDataGetBytePtr(self.0), self.len() as usize)
+        }
+    }
+
+    /// Returns the length of this byte buffer.
+    #[inline]
+    pub fn len(&self) -> CFIndex {
+        unsafe {
+            CFDataGetLength(self.0)
+        }
+    }
+}
+
+impl Deref for CFData {
+    type Target = [u8];
+
+    #[inline]
+    fn deref(&self) -> &[u8] {
+        self.bytes()
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/date.rs b/third_party/rust_crates/vendor/core-foundation/src/date.rs
new file mode 100644
index 0000000..57ee721
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/date.rs
@@ -0,0 +1,130 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Core Foundation date objects.
+
+pub use core_foundation_sys::date::*;
+use core_foundation_sys::base::kCFAllocatorDefault;
+
+use base::TCFType;
+
+#[cfg(feature = "with-chrono")]
+use chrono::NaiveDateTime;
+
+
+declare_TCFType!{
+    /// A date.
+    CFDate, CFDateRef
+}
+impl_TCFType!(CFDate, CFDateRef, CFDateGetTypeID);
+impl_CFTypeDescription!(CFDate);
+impl_CFComparison!(CFDate, CFDateCompare);
+
+impl CFDate {
+    #[inline]
+    pub fn new(time: CFAbsoluteTime) -> CFDate {
+        unsafe {
+            let date_ref = CFDateCreate(kCFAllocatorDefault, time);
+            TCFType::wrap_under_create_rule(date_ref)
+        }
+    }
+
+    #[inline]
+    pub fn now() -> CFDate {
+        CFDate::new(unsafe { CFAbsoluteTimeGetCurrent() })
+    }
+
+    #[inline]
+    pub fn abs_time(&self) -> CFAbsoluteTime {
+        unsafe {
+            CFDateGetAbsoluteTime(self.0)
+        }
+    }
+
+    #[cfg(feature = "with-chrono")]
+    pub fn naive_utc(&self) -> NaiveDateTime {
+        let ts = unsafe {
+            self.abs_time() + kCFAbsoluteTimeIntervalSince1970
+        };
+        let (secs, nanos) = if ts.is_sign_positive() {
+            (ts.trunc() as i64, ts.fract())
+        } else {
+            // nanoseconds can't be negative in NaiveDateTime
+            (ts.trunc() as i64 - 1, 1.0 - ts.fract().abs())
+        };
+        NaiveDateTime::from_timestamp(secs, (nanos * 1e9).floor() as u32)
+    }
+
+    #[cfg(feature = "with-chrono")]
+    pub fn from_naive_utc(time: NaiveDateTime) -> CFDate {
+        let secs = time.timestamp();
+        let nanos = time.timestamp_subsec_nanos();
+        let ts = unsafe {
+            secs as f64 + (nanos as f64 / 1e9) - kCFAbsoluteTimeIntervalSince1970
+        };
+        CFDate::new(ts)
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::CFDate;
+    use std::cmp::Ordering;
+
+    #[cfg(feature = "with-chrono")]
+    use chrono::NaiveDateTime;
+
+    #[cfg(feature = "with-chrono")]
+    fn approx_eq(a: f64, b: f64) -> bool {
+        use std::f64;
+
+        let same_sign = a.is_sign_positive() == b.is_sign_positive();
+        let equal = ((a - b).abs() / f64::min(a.abs() + b.abs(), f64::MAX)) < f64::EPSILON;
+        (same_sign && equal)
+    }
+
+    #[test]
+    fn date_comparison() {
+        let now = CFDate::now();
+        let past = CFDate::new(now.abs_time() - 1.0);
+        assert_eq!(now.cmp(&past), Ordering::Greater);
+        assert_eq!(now.cmp(&now), Ordering::Equal);
+        assert_eq!(past.cmp(&now), Ordering::Less);
+    }
+
+    #[test]
+    fn date_equality() {
+        let now = CFDate::now();
+        let same_time = CFDate::new(now.abs_time());
+        assert_eq!(now, same_time);
+    }
+
+    #[test]
+    #[cfg(feature = "with-chrono")]
+    fn date_chrono_conversion_positive() {
+        let date = CFDate::now();
+        let datetime = date.naive_utc();
+        let converted = CFDate::from_naive_utc(datetime);
+        assert!(approx_eq(date.abs_time(), converted.abs_time()));
+    }
+
+    #[test]
+    #[cfg(feature = "with-chrono")]
+    fn date_chrono_conversion_negative() {
+        use super::kCFAbsoluteTimeIntervalSince1970;
+
+        let ts = unsafe {
+            kCFAbsoluteTimeIntervalSince1970 - 420.0
+        };
+        let date = CFDate::new(ts);
+        let datetime: NaiveDateTime = date.naive_utc();
+        let converted = CFDate::from_naive_utc(datetime);
+        assert!(approx_eq(date.abs_time(), converted.abs_time()));
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/dictionary.rs b/third_party/rust_crates/vendor/core-foundation/src/dictionary.rs
new file mode 100644
index 0000000..5b808c3
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/dictionary.rs
@@ -0,0 +1,396 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Dictionaries of key-value pairs.
+
+pub use core_foundation_sys::dictionary::*;
+
+use core_foundation_sys::base::{CFTypeRef, CFRelease, kCFAllocatorDefault};
+use std::mem;
+use std::os::raw::c_void;
+use std::ptr;
+use std::marker::PhantomData;
+
+use base::{ItemRef, FromVoid, ToVoid};
+use base::{CFIndexConvertible, TCFType};
+use ConcreteCFType;
+
+// consume the type parameters with PhantomDatas
+pub struct CFDictionary<K = *const c_void, V = *const c_void>(CFDictionaryRef, PhantomData<K>, PhantomData<V>);
+
+impl<K, V> Drop for CFDictionary<K, V> {
+    fn drop(&mut self) {
+        unsafe { CFRelease(self.as_CFTypeRef()) }
+    }
+}
+
+impl_TCFType!(CFDictionary<K, V>, CFDictionaryRef, CFDictionaryGetTypeID);
+impl_CFTypeDescription!(CFDictionary);
+
+unsafe impl ConcreteCFType for CFDictionary<*const c_void, *const c_void> {}
+
+impl<K, V> CFDictionary<K, V> {
+    pub fn from_CFType_pairs(pairs: &[(K, V)]) -> CFDictionary<K, V> where K: TCFType, V: TCFType {
+        let (keys, values): (Vec<CFTypeRef>, Vec<CFTypeRef>) = pairs
+            .iter()
+            .map(|&(ref key, ref value)| (key.as_CFTypeRef(), value.as_CFTypeRef()))
+            .unzip();
+
+        unsafe {
+            let dictionary_ref = CFDictionaryCreate(kCFAllocatorDefault,
+                                                    mem::transmute(keys.as_ptr()),
+                                                    mem::transmute(values.as_ptr()),
+                                                    keys.len().to_CFIndex(),
+                                                    &kCFTypeDictionaryKeyCallBacks,
+                                                    &kCFTypeDictionaryValueCallBacks);
+            TCFType::wrap_under_create_rule(dictionary_ref)
+        }
+    }
+
+    #[inline]
+    pub fn to_untyped(&self) -> CFDictionary {
+        unsafe { CFDictionary::wrap_under_get_rule(self.0) }
+    }
+
+    /// Returns the same dictionary, but with the types reset to void pointers.
+    /// Equal to `to_untyped`, but is faster since it does not increment the retain count.
+    #[inline]
+    pub fn into_untyped(self) -> CFDictionary {
+        let reference = self.0;
+        mem::forget(self);
+        unsafe { CFDictionary::wrap_under_create_rule(reference) }
+    }
+
+    #[inline]
+    pub fn len(&self) -> usize {
+        unsafe {
+            CFDictionaryGetCount(self.0) as usize
+        }
+    }
+
+    #[inline]
+    pub fn is_empty(&self) -> bool {
+        self.len() == 0
+    }
+
+    #[inline]
+    pub fn contains_key(&self, key: &K) -> bool where K: ToVoid<K> {
+        unsafe { CFDictionaryContainsKey(self.0, key.to_void()) != 0 }
+    }
+
+    #[inline]
+    pub fn find<'a, T: ToVoid<K>>(&'a self, key: T) -> Option<ItemRef<'a, V>> where V: FromVoid, K: ToVoid<K> {
+        unsafe {
+            let mut value: *const c_void = ptr::null();
+            if CFDictionaryGetValueIfPresent(self.0, key.to_void(), &mut value) != 0 {
+                Some(V::from_void(value))
+            } else {
+                None
+            }
+        }
+    }
+
+    /// # Panics
+    ///
+    /// Panics if the key is not present in the dictionary. Use `find` to get an `Option` instead
+    /// of panicking.
+    #[inline]
+    pub fn get<'a, T: ToVoid<K>>(&'a self, key: T) -> ItemRef<'a, V> where V: FromVoid, K: ToVoid<K> {
+        let ptr = key.to_void();
+        self.find(key).expect(&format!("No entry found for key {:p}", ptr))
+    }
+
+    pub fn get_keys_and_values(&self) -> (Vec<*const c_void>, Vec<*const c_void>) {
+        let length = self.len();
+        let mut keys = Vec::with_capacity(length);
+        let mut values = Vec::with_capacity(length);
+
+        unsafe {
+            CFDictionaryGetKeysAndValues(self.0, keys.as_mut_ptr(), values.as_mut_ptr());
+            keys.set_len(length);
+            values.set_len(length);
+        }
+
+        (keys, values)
+    }
+}
+
+// consume the type parameters with PhantomDatas
+pub struct CFMutableDictionary<K = *const c_void, V = *const c_void>(CFMutableDictionaryRef, PhantomData<K>, PhantomData<V>);
+
+impl<K, V> Drop for CFMutableDictionary<K, V> {
+    fn drop(&mut self) {
+        unsafe { CFRelease(self.as_CFTypeRef()) }
+    }
+}
+
+impl_TCFType!(CFMutableDictionary<K, V>, CFMutableDictionaryRef, CFDictionaryGetTypeID);
+impl_CFTypeDescription!(CFMutableDictionary);
+
+impl<K, V> CFMutableDictionary<K, V> {
+    pub fn new() -> Self {
+        Self::with_capacity(0)
+    }
+
+    pub fn with_capacity(capacity: isize) -> Self {
+        unsafe {
+            let dictionary_ref = CFDictionaryCreateMutable(kCFAllocatorDefault,
+                                                           capacity as _,
+                                                           &kCFTypeDictionaryKeyCallBacks,
+                                                           &kCFTypeDictionaryValueCallBacks);
+            TCFType::wrap_under_create_rule(dictionary_ref)
+        }
+    }
+
+    pub fn copy_with_capacity(&self, capacity: isize) -> Self {
+        unsafe {
+            let dictionary_ref = CFDictionaryCreateMutableCopy(kCFAllocatorDefault, capacity as _, self.0);
+            TCFType::wrap_under_get_rule(dictionary_ref)
+        }
+    }
+
+    pub fn from_CFType_pairs(pairs: &[(K, V)]) -> CFMutableDictionary<K, V> where K: ToVoid<K>, V: ToVoid<V> {
+        let mut result = Self::with_capacity(pairs.len() as _);
+        for &(ref key, ref value) in pairs {
+            result.add(key, value);
+        }
+        result
+    }
+
+    #[inline]
+    pub fn to_untyped(&self) -> CFMutableDictionary {
+        unsafe { CFMutableDictionary::wrap_under_get_rule(self.0) }
+    }
+
+    /// Returns the same dictionary, but with the types reset to void pointers.
+    /// Equal to `to_untyped`, but is faster since it does not increment the retain count.
+    #[inline]
+    pub fn into_untyped(self) -> CFMutableDictionary {
+        let reference = self.0;
+        mem::forget(self);
+        unsafe { CFMutableDictionary::wrap_under_create_rule(reference) }
+    }
+
+    /// Returns a `CFDictionary` pointing to the same underlying dictionary as this mutable one.
+    #[inline]
+    pub fn to_immutable(&self) -> CFDictionary<K, V> {
+        unsafe { CFDictionary::wrap_under_get_rule(self.0) }
+    }
+
+    // Immutable interface
+
+    #[inline]
+    pub fn len(&self) -> usize {
+        unsafe {
+            CFDictionaryGetCount(self.0) as usize
+        }
+    }
+
+    #[inline]
+    pub fn is_empty(&self) -> bool {
+        self.len() == 0
+    }
+
+    #[inline]
+    pub fn contains_key(&self, key: *const c_void) -> bool {
+        unsafe {
+            CFDictionaryContainsKey(self.0, key) != 0
+        }
+    }
+
+    #[inline]
+    pub fn find<'a>(&'a self, key: &K) -> Option<ItemRef<'a, V>> where V: FromVoid, K: ToVoid<K> {
+        unsafe {
+            let mut value: *const c_void = ptr::null();
+            if CFDictionaryGetValueIfPresent(self.0, key.to_void(), &mut value) != 0 {
+                Some(V::from_void(value))
+            } else {
+                None
+            }
+        }
+    }
+
+    /// # Panics
+    ///
+    /// Panics if the key is not present in the dictionary. Use `find` to get an `Option` instead
+    /// of panicking.
+    #[inline]
+    pub fn get<'a>(&'a self, key: &K) -> ItemRef<'a, V> where V: FromVoid, K: ToVoid<K> {
+        let ptr = key.to_void();
+        self.find(&key).expect(&format!("No entry found for key {:p}", ptr))
+    }
+
+    pub fn get_keys_and_values(&self) -> (Vec<*const c_void>, Vec<*const c_void>) {
+        let length = self.len();
+        let mut keys = Vec::with_capacity(length);
+        let mut values = Vec::with_capacity(length);
+
+        unsafe {
+            CFDictionaryGetKeysAndValues(self.0, keys.as_mut_ptr(), values.as_mut_ptr());
+            keys.set_len(length);
+            values.set_len(length);
+        }
+
+        (keys, values)
+    }
+
+    // Mutable interface
+
+    /// Adds the key-value pair to the dictionary if no such key already exist.
+    #[inline]
+    pub fn add(&mut self, key: &K, value: &V) where K: ToVoid<K>, V: ToVoid<V> {
+        unsafe { CFDictionaryAddValue(self.0, key.to_void(), value.to_void()) }
+    }
+
+    /// Sets the value of the key in the dictionary.
+    #[inline]
+    pub fn set(&mut self, key: K, value: V) where K: ToVoid<K>, V: ToVoid<V> {
+        unsafe { CFDictionarySetValue(self.0, key.to_void(), value.to_void()) }
+    }
+
+    /// Replaces the value of the key in the dictionary.
+    #[inline]
+    pub fn replace(&mut self, key: K, value: V) where K: ToVoid<K>, V: ToVoid<V> {
+        unsafe { CFDictionaryReplaceValue(self.0, key.to_void(), value.to_void()) }
+    }
+
+    /// Removes the value of the key from the dictionary.
+    #[inline]
+    pub fn remove(&mut self, key: K) where K: ToVoid<K> {
+        unsafe { CFDictionaryRemoveValue(self.0, key.to_void()) }
+    }
+
+    #[inline]
+    pub fn remove_all(&mut self) {
+        unsafe { CFDictionaryRemoveAllValues(self.0) }
+    }
+}
+
+impl<'a, K, V> From<&'a CFDictionary<K, V>> for CFMutableDictionary<K, V> {
+    /// Creates a new mutable dictionary with the key-value pairs from another dictionary.
+    /// The capacity of the new mutable dictionary is not limited.
+    fn from(dict: &'a CFDictionary<K, V>) -> Self {
+        unsafe {
+            let mut_dict_ref = CFDictionaryCreateMutableCopy(kCFAllocatorDefault, 0, dict.0);
+            TCFType::wrap_under_create_rule(mut_dict_ref)
+        }
+    }
+}
+
+
+#[cfg(test)]
+pub mod test {
+    use super::*;
+    use base::{CFType, TCFType};
+    use boolean::CFBoolean;
+    use number::CFNumber;
+    use string::CFString;
+
+
+    #[test]
+    fn dictionary() {
+        let bar = CFString::from_static_string("Bar");
+        let baz = CFString::from_static_string("Baz");
+        let boo = CFString::from_static_string("Boo");
+        let foo = CFString::from_static_string("Foo");
+        let tru = CFBoolean::true_value();
+        let n42 = CFNumber::from(42);
+
+        let d = CFDictionary::from_CFType_pairs(&[
+            (bar.as_CFType(), boo.as_CFType()),
+            (baz.as_CFType(), tru.as_CFType()),
+            (foo.as_CFType(), n42.as_CFType()),
+        ]);
+
+        let (v1, v2) = d.get_keys_and_values();
+        assert!(v1 == &[bar.as_CFTypeRef(), baz.as_CFTypeRef(), foo.as_CFTypeRef()]);
+        assert!(v2 == &[boo.as_CFTypeRef(), tru.as_CFTypeRef(), n42.as_CFTypeRef()]);
+    }
+
+    #[test]
+    fn mutable_dictionary() {
+        let bar = CFString::from_static_string("Bar");
+        let baz = CFString::from_static_string("Baz");
+        let boo = CFString::from_static_string("Boo");
+        let foo = CFString::from_static_string("Foo");
+        let tru = CFBoolean::true_value();
+        let n42 = CFNumber::from(42);
+
+        let mut d = CFMutableDictionary::<CFString, CFType>::new();
+        d.add(&bar, &boo.as_CFType());
+        d.add(&baz, &tru.as_CFType());
+        d.add(&foo, &n42.as_CFType());
+        assert_eq!(d.len(), 3);
+
+        let (v1, v2) = d.get_keys_and_values();
+        assert!(v1 == &[bar.as_CFTypeRef(), baz.as_CFTypeRef(), foo.as_CFTypeRef()]);
+        assert!(v2 == &[boo.as_CFTypeRef(), tru.as_CFTypeRef(), n42.as_CFTypeRef()]);
+
+        d.remove(baz);
+        assert_eq!(d.len(), 2);
+
+        let (v1, v2) = d.get_keys_and_values();
+        assert!(v1 == &[bar.as_CFTypeRef(), foo.as_CFTypeRef()]);
+        assert!(v2 == &[boo.as_CFTypeRef(), n42.as_CFTypeRef()]);
+
+        d.remove_all();
+        assert_eq!(d.len(), 0)
+    }
+
+    #[test]
+    fn dict_find_and_contains_key() {
+        let dict = CFDictionary::from_CFType_pairs(&[
+            (
+                CFString::from_static_string("hello"),
+                CFBoolean::true_value(),
+            ),
+        ]);
+        let key = CFString::from_static_string("hello");
+        let invalid_key = CFString::from_static_string("foobar");
+
+        assert!(dict.contains_key(&key));
+        assert!(!dict.contains_key(&invalid_key));
+
+        let value = dict.find(&key).unwrap().clone();
+        assert_eq!(value, CFBoolean::true_value());
+        assert_eq!(dict.find(&invalid_key), None);
+    }
+
+    #[test]
+    fn convert_immutable_to_mutable_dict() {
+        let dict: CFDictionary<CFString, CFBoolean> = CFDictionary::from_CFType_pairs(&[
+            (CFString::from_static_string("Foo"), CFBoolean::true_value()),
+        ]);
+        let mut mut_dict = CFMutableDictionary::from(&dict);
+        assert_eq!(dict.retain_count(), 1);
+        assert_eq!(mut_dict.retain_count(), 1);
+
+        assert_eq!(mut_dict.len(), 1);
+        assert_eq!(*mut_dict.get(&CFString::from_static_string("Foo")), CFBoolean::true_value());
+
+        mut_dict.add(&CFString::from_static_string("Bar"), &CFBoolean::false_value());
+        assert_eq!(dict.len(), 1);
+        assert_eq!(mut_dict.len(), 2);
+    }
+
+    #[test]
+    fn mutable_dictionary_as_immutable() {
+        let mut mut_dict: CFMutableDictionary<CFString, CFBoolean> = CFMutableDictionary::new();
+        mut_dict.add(&CFString::from_static_string("Bar"), &CFBoolean::false_value());
+        assert_eq!(mut_dict.retain_count(), 1);
+
+        let dict = mut_dict.to_immutable();
+        assert_eq!(mut_dict.retain_count(), 2);
+        assert_eq!(dict.retain_count(), 2);
+        assert_eq!(*dict.get(&CFString::from_static_string("Bar")), CFBoolean::false_value());
+
+        mem::drop(dict);
+        assert_eq!(mut_dict.retain_count(), 1);
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/error.rs b/third_party/rust_crates/vendor/core-foundation/src/error.rs
new file mode 100644
index 0000000..f100171
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/error.rs
@@ -0,0 +1,71 @@
+// Copyright 2016 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Core Foundation errors.
+
+pub use core_foundation_sys::error::*;
+
+use std::error::Error;
+use std::fmt;
+
+use base::{CFIndex, TCFType};
+use string::CFString;
+
+
+declare_TCFType!{
+    /// An error value.
+    CFError, CFErrorRef
+}
+impl_TCFType!(CFError, CFErrorRef, CFErrorGetTypeID);
+
+impl fmt::Debug for CFError {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        fmt.debug_struct("CFError")
+           .field("domain", &self.domain())
+           .field("code", &self.code())
+           .field("description", &self.description())
+           .finish()
+    }
+}
+
+impl fmt::Display for CFError {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        write!(fmt, "{}", self.description())
+    }
+}
+
+impl Error for CFError {
+    fn description(&self) -> &str {
+        "a Core Foundation error"
+    }
+}
+
+impl CFError {
+    /// Returns a string identifying the domain with which this error is
+    /// associated.
+    pub fn domain(&self) -> CFString {
+        unsafe {
+            let s = CFErrorGetDomain(self.0);
+            CFString::wrap_under_get_rule(s)
+        }
+    }
+
+    /// Returns the code identifying this type of error.
+    pub fn code(&self) -> CFIndex {
+        unsafe { CFErrorGetCode(self.0) }
+    }
+
+    /// Returns a human-presentable description of the error.
+    pub fn description(&self) -> CFString {
+        unsafe {
+            let s = CFErrorCopyDescription(self.0);
+            CFString::wrap_under_create_rule(s)
+        }
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/filedescriptor.rs b/third_party/rust_crates/vendor/core-foundation/src/filedescriptor.rs
new file mode 100644
index 0000000..2c999b5
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/filedescriptor.rs
@@ -0,0 +1,210 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+pub use core_foundation_sys::filedescriptor::*;
+
+use core_foundation_sys::base::{Boolean, CFIndex};
+use core_foundation_sys::base::{kCFAllocatorDefault, CFOptionFlags};
+
+use base::TCFType;
+use runloop::CFRunLoopSource;
+
+use std::mem;
+use std::os::unix::io::{AsRawFd, RawFd};
+use std::ptr;
+
+declare_TCFType!{
+    CFFileDescriptor, CFFileDescriptorRef
+}
+impl_TCFType!(CFFileDescriptor, CFFileDescriptorRef, CFFileDescriptorGetTypeID);
+
+impl CFFileDescriptor {
+    pub fn new(fd: RawFd,
+               closeOnInvalidate: bool,
+               callout: CFFileDescriptorCallBack,
+               context: Option<&CFFileDescriptorContext>) -> Option<CFFileDescriptor> {
+        let context = context.map_or(ptr::null(), |c| c as *const _);
+        unsafe {
+            let fd_ref = CFFileDescriptorCreate(kCFAllocatorDefault,
+                                                fd,
+                                                closeOnInvalidate as Boolean,
+                                                callout,
+                                                context);
+            if fd_ref.is_null() {
+                None
+            } else {
+                Some(TCFType::wrap_under_create_rule(fd_ref))
+            }
+        }
+    }
+
+    pub fn context(&self) -> CFFileDescriptorContext {
+        unsafe {
+            let mut context: CFFileDescriptorContext = mem::uninitialized();
+            CFFileDescriptorGetContext(self.0, &mut context);
+            context
+        }
+    }
+
+    pub fn enable_callbacks(&self, callback_types: CFOptionFlags) {
+        unsafe {
+            CFFileDescriptorEnableCallBacks(self.0, callback_types)
+        }
+    }
+
+    pub fn disable_callbacks(&self, callback_types: CFOptionFlags) {
+        unsafe {
+            CFFileDescriptorDisableCallBacks(self.0, callback_types)
+        }
+    }
+
+    pub fn valid(&self) -> bool {
+        unsafe {
+            CFFileDescriptorIsValid(self.0) != 0
+        }
+    }
+
+    pub fn invalidate(&self) {
+        unsafe {
+            CFFileDescriptorInvalidate(self.0)
+        }
+    }
+
+    pub fn to_run_loop_source(&self, order: CFIndex) -> Option<CFRunLoopSource> {
+        unsafe {
+            let source_ref = CFFileDescriptorCreateRunLoopSource(
+                kCFAllocatorDefault,
+                self.0,
+                order
+            );
+            if source_ref.is_null() {
+                None
+            } else {
+                Some(TCFType::wrap_under_create_rule(source_ref))
+            }
+        }
+    }
+}
+
+impl AsRawFd for CFFileDescriptor {
+    fn as_raw_fd(&self) -> RawFd {
+        unsafe {
+            CFFileDescriptorGetNativeDescriptor(self.0)
+        }
+    }
+}
+
+
+#[cfg(test)]
+mod test {
+    extern crate libc;
+
+    use super::*;
+    use std::ffi::CString;
+    use std::os::raw::c_void;
+    use core_foundation_sys::base::{CFOptionFlags};
+    use core_foundation_sys::runloop::{kCFRunLoopDefaultMode};
+    use libc::O_RDWR;
+    use runloop::{CFRunLoop};
+
+    #[test]
+    fn test_consumed() {
+        let path = CString::new("/dev/null").unwrap();
+        let raw_fd = unsafe { libc::open(path.as_ptr(), O_RDWR, 0) };
+        let cf_fd = CFFileDescriptor::new(raw_fd, true, never_callback, None);
+        assert!(cf_fd.is_some());
+        let cf_fd = cf_fd.unwrap();
+
+        assert!(cf_fd.valid());
+        cf_fd.invalidate();
+        assert!(!cf_fd.valid());
+
+        // close() should fail
+        assert_eq!(unsafe { libc::close(raw_fd) }, -1);
+    }
+
+    #[test]
+    fn test_unconsumed() {
+        let path = CString::new("/dev/null").unwrap();
+        let raw_fd = unsafe { libc::open(path.as_ptr(), O_RDWR, 0) };
+        let cf_fd = CFFileDescriptor::new(raw_fd, false, never_callback, None);
+        assert!(cf_fd.is_some());
+        let cf_fd = cf_fd.unwrap();
+
+        assert!(cf_fd.valid());
+        cf_fd.invalidate();
+        assert!(!cf_fd.valid());
+
+        // close() should succeed
+        assert_eq!(unsafe { libc::close(raw_fd) }, 0);
+    }
+
+    extern "C" fn never_callback(_f: CFFileDescriptorRef,
+                                 _callback_types: CFOptionFlags,
+                                 _info_ptr: *mut c_void) {
+        unreachable!();
+    }
+
+    struct TestInfo {
+        value: CFOptionFlags
+    }
+
+    #[test]
+    fn test_callback() {
+        let mut info = TestInfo { value: 0 };
+        let context = CFFileDescriptorContext {
+            version: 0,
+            info: &mut info as *mut _ as *mut c_void,
+            retain: None,
+            release: None,
+            copyDescription: None
+        };
+
+        let path = CString::new("/dev/null").unwrap();
+        let raw_fd = unsafe { libc::open(path.as_ptr(), O_RDWR, 0) };
+        let cf_fd = CFFileDescriptor::new(raw_fd, true, callback, Some(&context));
+        assert!(cf_fd.is_some());
+        let cf_fd = cf_fd.unwrap();
+
+        assert!(cf_fd.valid());
+
+        let run_loop = CFRunLoop::get_current();
+        let source = CFRunLoopSource::from_file_descriptor(&cf_fd, 0);
+        assert!(source.is_some());
+        unsafe {
+            run_loop.add_source(&source.unwrap(), kCFRunLoopDefaultMode);
+        }
+
+        info.value = 0;
+        cf_fd.enable_callbacks(kCFFileDescriptorReadCallBack);
+        CFRunLoop::run_current();
+        assert_eq!(info.value, kCFFileDescriptorReadCallBack);
+
+        info.value = 0;
+        cf_fd.enable_callbacks(kCFFileDescriptorWriteCallBack);
+        CFRunLoop::run_current();
+        assert_eq!(info.value, kCFFileDescriptorWriteCallBack);
+
+        info.value = 0;
+        cf_fd.disable_callbacks(kCFFileDescriptorReadCallBack | kCFFileDescriptorWriteCallBack);
+
+        cf_fd.invalidate();
+        assert!(!cf_fd.valid());
+    }
+
+    extern "C" fn callback(_f: CFFileDescriptorRef, callback_types: CFOptionFlags, info_ptr: *mut c_void) {
+        assert!(!info_ptr.is_null());
+
+        let info: *mut TestInfo = info_ptr as *mut TestInfo;
+
+        unsafe { (*info).value = callback_types };
+
+        CFRunLoop::get_current().stop();
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/lib.rs b/third_party/rust_crates/vendor/core-foundation/src/lib.rs
new file mode 100644
index 0000000..d1c88aaa
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/lib.rs
@@ -0,0 +1,178 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+#![allow(non_snake_case)]
+
+extern crate core_foundation_sys;
+extern crate libc;
+
+#[cfg(feature = "with-chrono")]
+extern crate chrono;
+
+use base::TCFType;
+
+pub unsafe trait ConcreteCFType: TCFType {}
+
+#[macro_export]
+macro_rules! declare_TCFType {
+    (
+        $(#[$doc:meta])*
+        $ty:ident, $raw:ident
+    ) => {
+        $(#[$doc])*
+        pub struct $ty($raw);
+
+        impl Drop for $ty {
+            fn drop(&mut self) {
+                unsafe { $crate::base::CFRelease(self.as_CFTypeRef()) }
+            }
+        }
+    }
+}
+
+#[macro_export]
+macro_rules! impl_TCFType {
+    ($ty:ident, $ty_ref:ident, $ty_id:ident) => {
+        impl_TCFType!($ty<>, $ty_ref, $ty_id);
+        unsafe impl $crate::ConcreteCFType for $ty { }
+    };
+
+    ($ty:ident<$($p:ident $(: $bound:path)*),*>, $ty_ref:ident, $ty_id:ident) => {
+        impl<$($p $(: $bound)*),*> $crate::base::TCFType for $ty<$($p),*> {
+            type Ref = $ty_ref;
+
+            #[inline]
+            fn as_concrete_TypeRef(&self) -> $ty_ref {
+                self.0
+            }
+
+            #[inline]
+            unsafe fn wrap_under_get_rule(reference: $ty_ref) -> Self {
+                let reference = $crate::base::CFRetain(reference as *const ::std::os::raw::c_void) as $ty_ref;
+                $crate::base::TCFType::wrap_under_create_rule(reference)
+            }
+
+            #[inline]
+            fn as_CFTypeRef(&self) -> $crate::base::CFTypeRef {
+                self.as_concrete_TypeRef() as $crate::base::CFTypeRef
+            }
+
+            #[inline]
+            unsafe fn wrap_under_create_rule(reference: $ty_ref) -> Self {
+                // we need one PhantomData for each type parameter so call ourselves
+                // again with @Phantom $p to produce that
+                $ty(reference $(, impl_TCFType!(@Phantom $p))*)
+            }
+
+            #[inline]
+            fn type_id() -> $crate::base::CFTypeID {
+                unsafe {
+                    $ty_id()
+                }
+            }
+        }
+
+        impl Clone for $ty {
+            #[inline]
+            fn clone(&self) -> $ty {
+                unsafe {
+                    $ty::wrap_under_get_rule(self.0)
+                }
+            }
+        }
+
+        impl PartialEq for $ty {
+            #[inline]
+            fn eq(&self, other: &$ty) -> bool {
+                self.as_CFType().eq(&other.as_CFType())
+            }
+        }
+
+        impl Eq for $ty { }
+
+        unsafe impl<'a> $crate::base::ToVoid<$ty> for &'a $ty {
+            fn to_void(&self) -> *const ::std::os::raw::c_void {
+                use $crate::base::TCFTypeRef;
+                self.as_concrete_TypeRef().as_void_ptr()
+            }
+        }
+
+        unsafe impl $crate::base::ToVoid<$ty> for $ty {
+            fn to_void(&self) -> *const ::std::os::raw::c_void {
+                use $crate::base::TCFTypeRef;
+                self.as_concrete_TypeRef().as_void_ptr()
+            }
+        }
+
+        unsafe impl $crate::base::ToVoid<$ty> for $ty_ref {
+            fn to_void(&self) -> *const ::std::os::raw::c_void {
+                use $crate::base::TCFTypeRef;
+                self.as_void_ptr()
+            }
+        }
+
+    };
+
+    (@Phantom $x:ident) => { ::std::marker::PhantomData };
+}
+
+
+#[macro_export]
+macro_rules! impl_CFTypeDescription {
+    ($ty:ident) => {
+        // it's fine to use an empty <> list
+        impl_CFTypeDescription!($ty<>);
+    };
+    ($ty:ident<$($p:ident $(: $bound:path)*),*>) => {
+        impl<$($p $(: $bound)*),*> ::std::fmt::Debug for $ty<$($p),*> {
+            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+                self.as_CFType().fmt(f)
+            }
+        }
+    }
+}
+
+#[macro_export]
+macro_rules! impl_CFComparison {
+    ($ty:ident, $compare:ident) => {
+        impl PartialOrd for $ty {
+            #[inline]
+            fn partial_cmp(&self, other: &$ty) -> Option<::std::cmp::Ordering> {
+                unsafe {
+                    Some($compare(self.as_concrete_TypeRef(), other.as_concrete_TypeRef(), ::std::ptr::null_mut()).into())
+                }
+            }
+        }
+
+        impl Ord for $ty {
+            #[inline]
+            fn cmp(&self, other: &$ty) -> ::std::cmp::Ordering {
+                self.partial_cmp(other).unwrap()
+            }
+        }
+    }
+}
+
+pub mod array;
+pub mod attributed_string;
+pub mod base;
+pub mod boolean;
+pub mod data;
+pub mod date;
+pub mod dictionary;
+pub mod error;
+pub mod filedescriptor;
+pub mod number;
+pub mod set;
+pub mod string;
+pub mod url;
+pub mod bundle;
+pub mod propertylist;
+pub mod runloop;
+pub mod timezone;
+pub mod uuid;
diff --git a/third_party/rust_crates/vendor/core-foundation/src/number.rs b/third_party/rust_crates/vendor/core-foundation/src/number.rs
new file mode 100644
index 0000000..ce8e8f0
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/number.rs
@@ -0,0 +1,120 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Immutable numbers.
+
+use core_foundation_sys::base::kCFAllocatorDefault;
+pub use core_foundation_sys::number::*;
+use std::mem;
+
+use base::TCFType;
+
+
+declare_TCFType!{
+    /// An immutable numeric value.
+    CFNumber, CFNumberRef
+}
+impl_TCFType!(CFNumber, CFNumberRef, CFNumberGetTypeID);
+impl_CFTypeDescription!(CFNumber);
+impl_CFComparison!(CFNumber, CFNumberCompare);
+
+impl CFNumber {
+
+    #[inline]
+    pub fn to_i32(&self) -> Option<i32> {
+        unsafe {
+            let mut value: i32 = 0;
+            let ok = CFNumberGetValue(self.0, kCFNumberSInt32Type, mem::transmute(&mut value));
+            if ok { Some(value) } else { None }
+        }
+    }
+
+    #[inline]
+    pub fn to_i64(&self) -> Option<i64> {
+        unsafe {
+            let mut value: i64 = 0;
+            let ok = CFNumberGetValue(self.0, kCFNumberSInt64Type, mem::transmute(&mut value));
+            if ok { Some(value) } else { None }
+        }
+    }
+
+    #[inline]
+    pub fn to_f32(&self) -> Option<f32> {
+        unsafe {
+            let mut value: f32 = 0.0;
+            let ok = CFNumberGetValue(self.0, kCFNumberFloat32Type, mem::transmute(&mut value));
+            if ok { Some(value) } else { None }
+        }
+    }
+
+    #[inline]
+    pub fn to_f64(&self) -> Option<f64> {
+        unsafe {
+            let mut value: f64 = 0.0;
+            let ok = CFNumberGetValue(self.0, kCFNumberFloat64Type, mem::transmute(&mut value));
+            if ok { Some(value) } else { None }
+        }
+    }
+}
+
+impl From<i32> for CFNumber {
+    #[inline]
+    fn from(value: i32) -> Self {
+        unsafe {
+            let number_ref = CFNumberCreate(
+                kCFAllocatorDefault,
+                kCFNumberSInt32Type,
+                mem::transmute(&value),
+            );
+            TCFType::wrap_under_create_rule(number_ref)
+        }
+    }
+}
+
+impl From<i64> for CFNumber {
+    #[inline]
+    fn from(value: i64) -> Self {
+        unsafe {
+            let number_ref = CFNumberCreate(
+                kCFAllocatorDefault,
+                kCFNumberSInt64Type,
+                mem::transmute(&value),
+            );
+            TCFType::wrap_under_create_rule(number_ref)
+        }
+    }
+}
+
+impl From<f32> for CFNumber {
+    #[inline]
+    fn from(value: f32) -> Self {
+        unsafe {
+            let number_ref = CFNumberCreate(
+                kCFAllocatorDefault,
+                kCFNumberFloat32Type,
+                mem::transmute(&value),
+            );
+            TCFType::wrap_under_create_rule(number_ref)
+        }
+    }
+}
+
+impl From<f64> for CFNumber {
+    #[inline]
+    fn from(value: f64) -> Self {
+        unsafe {
+            let number_ref = CFNumberCreate(
+                kCFAllocatorDefault,
+                kCFNumberFloat64Type,
+                mem::transmute(&value),
+            );
+            TCFType::wrap_under_create_rule(number_ref)
+        }
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/propertylist.rs b/third_party/rust_crates/vendor/core-foundation/src/propertylist.rs
new file mode 100644
index 0000000..9a2703b
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/propertylist.rs
@@ -0,0 +1,325 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Core Foundation property lists
+
+use std::ptr;
+use std::mem;
+use std::os::raw::c_void;
+
+use error::CFError;
+use data::CFData;
+use base::{CFType, TCFType, TCFTypeRef};
+
+pub use core_foundation_sys::propertylist::*;
+use core_foundation_sys::error::CFErrorRef;
+use core_foundation_sys::base::{CFGetRetainCount, CFGetTypeID, CFIndex, CFRetain,
+                                CFShow, CFTypeID, kCFAllocatorDefault};
+
+pub fn create_with_data(data: CFData,
+                        options: CFPropertyListMutabilityOptions)
+                        -> Result<(*const c_void, CFPropertyListFormat), CFError> {
+    unsafe {
+        let mut error: CFErrorRef = ptr::null_mut();
+        let mut format: CFPropertyListFormat = 0;
+        let property_list = CFPropertyListCreateWithData(kCFAllocatorDefault,
+                                                         data.as_concrete_TypeRef(),
+                                                         options,
+                                                         &mut format,
+                                                         &mut error);
+        if property_list.is_null() {
+            Err(TCFType::wrap_under_create_rule(error))
+        } else {
+            Ok((property_list, format))
+        }
+    }
+}
+
+pub fn create_data(property_list: *const c_void, format: CFPropertyListFormat) -> Result<CFData, CFError> {
+    unsafe {
+        let mut error: CFErrorRef = ptr::null_mut();
+        let data_ref = CFPropertyListCreateData(kCFAllocatorDefault,
+                                                property_list,
+                                                format,
+                                                0,
+                                                &mut error);
+        if data_ref.is_null() {
+            Err(TCFType::wrap_under_create_rule(error))
+        } else {
+            Ok(TCFType::wrap_under_create_rule(data_ref))
+        }
+    }
+}
+
+
+/// Trait for all subclasses of [`CFPropertyList`].
+///
+/// [`CFPropertyList`]: struct.CFPropertyList.html
+pub trait CFPropertyListSubClass: TCFType {
+    /// Create an instance of the superclass type [`CFPropertyList`] for this instance.
+    ///
+    /// [`CFPropertyList`]: struct.CFPropertyList.html
+    #[inline]
+    fn to_CFPropertyList(&self) -> CFPropertyList {
+        unsafe { CFPropertyList::wrap_under_get_rule(self.as_concrete_TypeRef().as_void_ptr()) }
+    }
+
+    /// Equal to [`to_CFPropertyList`], but consumes self and avoids changing the reference count.
+    ///
+    /// [`to_CFPropertyList`]: #method.to_CFPropertyList
+    #[inline]
+    fn into_CFPropertyList(self) -> CFPropertyList
+    where
+        Self: Sized,
+    {
+        let reference = self.as_concrete_TypeRef().as_void_ptr();
+        mem::forget(self);
+        unsafe { CFPropertyList::wrap_under_create_rule(reference) }
+    }
+}
+
+impl CFPropertyListSubClass for ::data::CFData {}
+impl CFPropertyListSubClass for ::string::CFString {}
+impl CFPropertyListSubClass for ::array::CFArray {}
+impl CFPropertyListSubClass for ::dictionary::CFDictionary {}
+impl CFPropertyListSubClass for ::date::CFDate {}
+impl CFPropertyListSubClass for ::boolean::CFBoolean {}
+impl CFPropertyListSubClass for ::number::CFNumber {}
+
+
+declare_TCFType!{
+    /// A CFPropertyList struct. This is superclass to [`CFData`], [`CFString`], [`CFArray`],
+    /// [`CFDictionary`], [`CFDate`], [`CFBoolean`], and [`CFNumber`].
+    ///
+    /// This superclass type does not have its own `CFTypeID`, instead each instance has the `CFTypeID`
+    /// of the subclass it is an instance of. Thus, this type cannot implement the [`TCFType`] trait,
+    /// since it cannot implement the static [`TCFType::type_id()`] method.
+    ///
+    /// [`CFData`]: ../data/struct.CFData.html
+    /// [`CFString`]: ../string/struct.CFString.html
+    /// [`CFArray`]: ../array/struct.CFArray.html
+    /// [`CFDictionary`]: ../dictionary/struct.CFDictionary.html
+    /// [`CFDate`]: ../date/struct.CFDate.html
+    /// [`CFBoolean`]: ../boolean/struct.CFBoolean.html
+    /// [`CFNumber`]: ../number/struct.CFNumber.html
+    /// [`TCFType`]: ../base/trait.TCFType.html
+    /// [`TCFType::type_id()`]: ../base/trait.TCFType.html#method.type_of
+    CFPropertyList, CFPropertyListRef
+}
+
+impl CFPropertyList {
+    #[inline]
+    pub fn as_concrete_TypeRef(&self) -> CFPropertyListRef {
+        self.0
+    }
+
+    #[inline]
+    pub unsafe fn wrap_under_get_rule(reference: CFPropertyListRef) -> CFPropertyList {
+        let reference = mem::transmute(CFRetain(mem::transmute(reference)));
+        CFPropertyList(reference)
+    }
+
+    #[inline]
+    pub fn as_CFType(&self) -> CFType {
+        unsafe { CFType::wrap_under_get_rule(self.as_CFTypeRef()) }
+    }
+
+    #[inline]
+    pub fn into_CFType(self) -> CFType
+    where
+        Self: Sized,
+    {
+        let reference = self.as_CFTypeRef();
+        mem::forget(self);
+        unsafe { TCFType::wrap_under_create_rule(reference) }
+    }
+
+    #[inline]
+    pub fn as_CFTypeRef(&self) -> ::core_foundation_sys::base::CFTypeRef {
+        unsafe { mem::transmute(self.as_concrete_TypeRef()) }
+    }
+
+    #[inline]
+    pub unsafe fn wrap_under_create_rule(obj: CFPropertyListRef) -> CFPropertyList {
+        CFPropertyList(obj)
+    }
+
+    /// Returns the reference count of the object. It is unwise to do anything other than test
+    /// whether the return value of this method is greater than zero.
+    #[inline]
+    pub fn retain_count(&self) -> CFIndex {
+        unsafe { CFGetRetainCount(self.as_CFTypeRef()) }
+    }
+
+    /// Returns the type ID of this object. Will be one of CFData, CFString, CFArray, CFDictionary,
+    /// CFDate, CFBoolean, or CFNumber.
+    #[inline]
+    pub fn type_of(&self) -> CFTypeID {
+        unsafe { CFGetTypeID(self.as_CFTypeRef()) }
+    }
+
+    /// Writes a debugging version of this object on standard error.
+    pub fn show(&self) {
+        unsafe { CFShow(self.as_CFTypeRef()) }
+    }
+
+    /// Returns true if this value is an instance of another type.
+    #[inline]
+    pub fn instance_of<OtherCFType: TCFType>(&self) -> bool {
+        self.type_of() == OtherCFType::type_id()
+    }
+}
+
+impl Clone for CFPropertyList {
+    #[inline]
+    fn clone(&self) -> CFPropertyList {
+        unsafe { CFPropertyList::wrap_under_get_rule(self.0) }
+    }
+}
+
+impl PartialEq for CFPropertyList {
+    #[inline]
+    fn eq(&self, other: &CFPropertyList) -> bool {
+        self.as_CFType().eq(&other.as_CFType())
+    }
+}
+
+impl Eq for CFPropertyList {}
+
+impl CFPropertyList {
+    /// Try to downcast the [`CFPropertyList`] to a subclass. Checking if the instance is the
+    /// correct subclass happens at runtime and `None` is returned if it is not the correct type.
+    /// Works similar to [`Box::downcast`] and [`CFType::downcast`].
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// # use core_foundation::string::CFString;
+    /// # use core_foundation::propertylist::{CFPropertyList, CFPropertyListSubClass};
+    /// #
+    /// // Create a string.
+    /// let string: CFString = CFString::from_static_string("FooBar");
+    /// // Cast it up to a property list.
+    /// let propertylist: CFPropertyList = string.to_CFPropertyList();
+    /// // Cast it down again.
+    /// assert!(propertylist.downcast::<CFString>().unwrap().to_string() == "FooBar");
+    /// ```
+    ///
+    /// [`CFPropertyList`]: struct.CFPropertyList.html
+    /// [`Box::downcast`]: https://doc.rust-lang.org/std/boxed/struct.Box.html#method.downcast
+    pub fn downcast<T: CFPropertyListSubClass>(&self) -> Option<T> {
+        if self.instance_of::<T>() {
+            unsafe {
+                let subclass_ref = T::Ref::from_void_ptr(self.0);
+                Some(T::wrap_under_get_rule(subclass_ref))
+            }
+        } else {
+            None
+        }
+    }
+
+    /// Similar to [`downcast`], but consumes self and can thus avoid touching the retain count.
+    ///
+    /// [`downcast`]: #method.downcast
+    pub fn downcast_into<T: CFPropertyListSubClass>(self) -> Option<T> {
+        if self.instance_of::<T>() {
+            unsafe {
+                let subclass_ref = T::Ref::from_void_ptr(self.0);
+                mem::forget(self);
+                Some(T::wrap_under_create_rule(subclass_ref))
+            }
+        } else {
+            None
+        }
+    }
+}
+
+
+
+#[cfg(test)]
+pub mod test {
+    use super::*;
+    use string::CFString;
+    use boolean::CFBoolean;
+
+    #[test]
+    fn test_property_list_serialization() {
+        use base::{TCFType, CFEqual};
+        use boolean::CFBoolean;
+        use number::CFNumber;
+        use dictionary::CFDictionary;
+        use string::CFString;
+        use super::*;
+
+        let bar = CFString::from_static_string("Bar");
+        let baz = CFString::from_static_string("Baz");
+        let boo = CFString::from_static_string("Boo");
+        let foo = CFString::from_static_string("Foo");
+        let tru = CFBoolean::true_value();
+        let n42 = CFNumber::from(42);
+
+        let dict1 = CFDictionary::from_CFType_pairs(&[(bar.as_CFType(), boo.as_CFType()),
+                                                      (baz.as_CFType(), tru.as_CFType()),
+                                                      (foo.as_CFType(), n42.as_CFType())]);
+
+        let data = create_data(dict1.as_CFTypeRef(), kCFPropertyListXMLFormat_v1_0).unwrap();
+        let (dict2, _) = create_with_data(data, kCFPropertyListImmutable).unwrap();
+        unsafe {
+            assert!(CFEqual(dict1.as_CFTypeRef(), dict2) == 1);
+        }
+    }
+
+    #[test]
+    fn to_propertylist_retain_count() {
+        let string = CFString::from_static_string("Bar");
+        assert_eq!(string.retain_count(), 1);
+
+        let propertylist = string.to_CFPropertyList();
+        assert_eq!(string.retain_count(), 2);
+        assert_eq!(propertylist.retain_count(), 2);
+
+        mem::drop(string);
+        assert_eq!(propertylist.retain_count(), 1);
+    }
+
+    #[test]
+    fn downcast_string() {
+        let propertylist = CFString::from_static_string("Bar").to_CFPropertyList();
+        assert!(propertylist.downcast::<CFString>().unwrap().to_string() == "Bar");
+        assert!(propertylist.downcast::<CFBoolean>().is_none());
+    }
+
+    #[test]
+    fn downcast_boolean() {
+        let propertylist = CFBoolean::true_value().to_CFPropertyList();
+        assert!(propertylist.downcast::<CFBoolean>().is_some());
+        assert!(propertylist.downcast::<CFString>().is_none());
+    }
+
+    #[test]
+    fn downcast_into_fail() {
+        let string = CFString::from_static_string("Bar");
+        let propertylist = string.to_CFPropertyList();
+        assert_eq!(string.retain_count(), 2);
+
+        assert!(propertylist.downcast_into::<CFBoolean>().is_none());
+        assert_eq!(string.retain_count(), 1);
+    }
+
+    #[test]
+    fn downcast_into() {
+        let string = CFString::from_static_string("Bar");
+        let propertylist = string.to_CFPropertyList();
+        assert_eq!(string.retain_count(), 2);
+
+        let string2 = propertylist.downcast_into::<CFString>().unwrap();
+        assert!(string2.to_string() == "Bar");
+        assert_eq!(string2.retain_count(), 2);
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/runloop.rs b/third_party/rust_crates/vendor/core-foundation/src/runloop.rs
new file mode 100644
index 0000000..24aa9a5
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/runloop.rs
@@ -0,0 +1,199 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(non_upper_case_globals)]
+
+pub use core_foundation_sys::runloop::*;
+use core_foundation_sys::base::CFIndex;
+use core_foundation_sys::base::{kCFAllocatorDefault, CFOptionFlags};
+use core_foundation_sys::string::CFStringRef;
+
+use base::{TCFType};
+use date::{CFAbsoluteTime, CFTimeInterval};
+use filedescriptor::CFFileDescriptor;
+use string::{CFString};
+
+pub type CFRunLoopMode = CFStringRef;
+
+
+declare_TCFType!(CFRunLoop, CFRunLoopRef);
+impl_TCFType!(CFRunLoop, CFRunLoopRef, CFRunLoopGetTypeID);
+impl_CFTypeDescription!(CFRunLoop);
+
+impl CFRunLoop {
+    pub fn get_current() -> CFRunLoop {
+        unsafe {
+            let run_loop_ref = CFRunLoopGetCurrent();
+            TCFType::wrap_under_get_rule(run_loop_ref)
+        }
+    }
+
+    pub fn get_main() -> CFRunLoop {
+        unsafe {
+            let run_loop_ref = CFRunLoopGetMain();
+            TCFType::wrap_under_get_rule(run_loop_ref)
+        }
+    }
+
+    pub fn run_current() {
+        unsafe {
+            CFRunLoopRun();
+        }
+    }
+
+    pub fn stop(&self) {
+        unsafe {
+            CFRunLoopStop(self.0);
+        }
+    }
+
+    pub fn current_mode(&self) -> Option<String> {
+        unsafe {
+            let string_ref = CFRunLoopCopyCurrentMode(self.0);
+            if string_ref.is_null() {
+                return None;
+            }
+
+            let cf_string: CFString = TCFType::wrap_under_create_rule(string_ref);
+            Some(cf_string.to_string())
+        }
+    }
+
+    pub fn contains_timer(&self, timer: &CFRunLoopTimer, mode: CFRunLoopMode) -> bool {
+        unsafe {
+            CFRunLoopContainsTimer(self.0, timer.0, mode) != 0
+        }
+    }
+
+    pub fn add_timer(&self, timer: &CFRunLoopTimer, mode: CFRunLoopMode) {
+        unsafe {
+            CFRunLoopAddTimer(self.0, timer.0, mode);
+        }
+    }
+
+    pub fn remove_timer(&self, timer: &CFRunLoopTimer, mode: CFRunLoopMode) {
+        unsafe {
+            CFRunLoopRemoveTimer(self.0, timer.0, mode);
+        }
+    }
+
+    pub fn contains_source(&self, source: &CFRunLoopSource, mode: CFRunLoopMode) -> bool {
+        unsafe {
+            CFRunLoopContainsSource(self.0, source.0, mode) != 0
+        }
+    }
+
+    pub fn add_source(&self, source: &CFRunLoopSource, mode: CFRunLoopMode) {
+        unsafe {
+            CFRunLoopAddSource(self.0, source.0, mode);
+        }
+    }
+
+    pub fn remove_source(&self, source: &CFRunLoopSource, mode: CFRunLoopMode) {
+        unsafe {
+            CFRunLoopRemoveSource(self.0, source.0, mode);
+        }
+    }
+
+    pub fn contains_observer(&self, observer: &CFRunLoopObserver, mode: CFRunLoopMode) -> bool {
+        unsafe {
+            CFRunLoopContainsObserver(self.0, observer.0, mode) != 0
+        }
+    }
+
+    pub fn add_observer(&self, observer: &CFRunLoopObserver, mode: CFRunLoopMode) {
+        unsafe {
+            CFRunLoopAddObserver(self.0, observer.0, mode);
+        }
+    }
+
+    pub fn remove_observer(&self, observer: &CFRunLoopObserver, mode: CFRunLoopMode) {
+        unsafe {
+            CFRunLoopRemoveObserver(self.0, observer.0, mode);
+        }
+    }
+
+}
+
+
+declare_TCFType!(CFRunLoopTimer, CFRunLoopTimerRef);
+impl_TCFType!(CFRunLoopTimer, CFRunLoopTimerRef, CFRunLoopTimerGetTypeID);
+
+impl CFRunLoopTimer {
+    pub fn new(fireDate: CFAbsoluteTime, interval: CFTimeInterval, flags: CFOptionFlags, order: CFIndex, callout: CFRunLoopTimerCallBack, context: *mut CFRunLoopTimerContext) -> CFRunLoopTimer {
+        unsafe {
+            let timer_ref = CFRunLoopTimerCreate(kCFAllocatorDefault, fireDate, interval, flags, order, callout, context);
+            TCFType::wrap_under_create_rule(timer_ref)
+        }
+    }
+}
+
+
+declare_TCFType!(CFRunLoopSource, CFRunLoopSourceRef);
+impl_TCFType!(CFRunLoopSource, CFRunLoopSourceRef, CFRunLoopSourceGetTypeID);
+
+impl CFRunLoopSource {
+    pub fn from_file_descriptor(fd: &CFFileDescriptor, order: CFIndex) -> Option<CFRunLoopSource> {
+        fd.to_run_loop_source(order)
+    }
+}
+
+declare_TCFType!(CFRunLoopObserver, CFRunLoopObserverRef);
+impl_TCFType!(CFRunLoopObserver, CFRunLoopObserverRef, CFRunLoopObserverGetTypeID);
+
+#[cfg(test)]
+mod test {
+    use super::*;
+    use date::{CFDate, CFAbsoluteTime};
+    use std::mem;
+    use std::os::raw::c_void;
+    use std::sync::mpsc;
+
+    #[test]
+    fn wait_200_milliseconds() {
+        let run_loop = CFRunLoop::get_current();
+
+        let now = CFDate::now().abs_time();
+        let (elapsed_tx, elapsed_rx) = mpsc::channel();
+        let mut info = Info {
+            start_time: now,
+            elapsed_tx,
+        };
+        let mut context = unsafe { CFRunLoopTimerContext {
+            version: 0,
+            info: &mut info as *mut _ as *mut c_void,
+            retain: mem::zeroed(),
+            release: mem::zeroed(),
+            copyDescription: mem::zeroed(),
+        } };
+
+
+        let run_loop_timer = CFRunLoopTimer::new(now + 0.20f64, 0f64, 0, 0, timer_popped, &mut context);
+        unsafe {
+            run_loop.add_timer(&run_loop_timer, kCFRunLoopDefaultMode);
+        }
+        CFRunLoop::run_current();
+        let elapsed = elapsed_rx.try_recv().unwrap();
+        println!("wait_200_milliseconds, elapsed: {}", elapsed);
+        assert!(elapsed > 0.19 && elapsed < 0.30);
+    }
+
+    struct Info {
+        start_time: CFAbsoluteTime,
+        elapsed_tx: mpsc::Sender<f64>,
+    }
+
+    extern "C" fn timer_popped(_timer: CFRunLoopTimerRef, raw_info: *mut c_void) {
+        let info: *mut Info = unsafe { mem::transmute(raw_info) };
+        let now = CFDate::now().abs_time();
+        let elapsed = now - unsafe { (*info).start_time };
+        let _ = unsafe { (*info).elapsed_tx.send(elapsed) };
+        CFRunLoop::get_current().stop();
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/set.rs b/third_party/rust_crates/vendor/core-foundation/src/set.rs
new file mode 100644
index 0000000..6ef9f38
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/set.rs
@@ -0,0 +1,45 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! An immutable bag of elements.
+
+pub use core_foundation_sys::set::*;
+use core_foundation_sys::base::{CFTypeRef, CFRelease, kCFAllocatorDefault};
+
+use base::{CFIndexConvertible, TCFType};
+
+use std::mem;
+use std::os::raw::c_void;
+use std::marker::PhantomData;
+
+/// An immutable bag of elements.
+pub struct CFSet<T = *const c_void>(CFSetRef, PhantomData<T>);
+
+impl<T> Drop for CFSet<T> {
+    fn drop(&mut self) {
+        unsafe { CFRelease(self.as_CFTypeRef()) }
+    }
+}
+
+impl_TCFType!(CFSet<T>, CFSetRef, CFSetGetTypeID);
+impl_CFTypeDescription!(CFSet);
+
+impl CFSet {
+    /// Creates a new set from a list of `CFType` instances.
+    pub fn from_slice<T>(elems: &[T]) -> CFSet<T> where T: TCFType {
+        unsafe {
+            let elems: Vec<CFTypeRef> = elems.iter().map(|elem| elem.as_CFTypeRef()).collect();
+            let set_ref = CFSetCreate(kCFAllocatorDefault,
+                                      mem::transmute(elems.as_ptr()),
+                                      elems.len().to_CFIndex(),
+                                      &kCFTypeSetCallBacks);
+            TCFType::wrap_under_create_rule(set_ref)
+        }
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/string.rs b/third_party/rust_crates/vendor/core-foundation/src/string.rs
new file mode 100644
index 0000000..4dc0a72
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/string.rs
@@ -0,0 +1,150 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Immutable strings.
+
+pub use core_foundation_sys::string::*;
+
+use base::{CFIndexConvertible, TCFType};
+
+use core_foundation_sys::base::{Boolean, CFIndex, CFRange};
+use core_foundation_sys::base::{kCFAllocatorDefault, kCFAllocatorNull};
+use std::borrow::Cow;
+use std::fmt;
+use std::str::{self, FromStr};
+use std::ptr;
+use std::ffi::CStr;
+
+
+declare_TCFType!{
+    /// An immutable string in one of a variety of encodings.
+    CFString, CFStringRef
+}
+impl_TCFType!(CFString, CFStringRef, CFStringGetTypeID);
+
+impl FromStr for CFString {
+    type Err = ();
+
+    /// See also CFString::new for a variant of this which does not return a Result
+    #[inline]
+    fn from_str(string: &str) -> Result<CFString, ()> {
+        Ok(CFString::new(string))
+    }
+}
+
+impl<'a> From<&'a str> for CFString {
+    #[inline]
+    fn from(string: &'a str) -> CFString {
+        CFString::new(string)
+    }
+}
+
+impl<'a> From<&'a CFString> for Cow<'a, str> {
+    fn from(cf_str: &'a CFString) -> Cow<'a, str> {
+        unsafe {
+            // Do this without allocating if we can get away with it
+            let c_string = CFStringGetCStringPtr(cf_str.0, kCFStringEncodingUTF8);
+            if c_string != ptr::null() {
+                let c_str = CStr::from_ptr(c_string);
+                Cow::Borrowed(str::from_utf8_unchecked(c_str.to_bytes()))
+            } else {
+                let char_len = cf_str.char_len();
+
+                // First, ask how big the buffer ought to be.
+                let mut bytes_required: CFIndex = 0;
+                CFStringGetBytes(cf_str.0,
+                                 CFRange { location: 0, length: char_len },
+                                 kCFStringEncodingUTF8,
+                                 0,
+                                 false as Boolean,
+                                 ptr::null_mut(),
+                                 0,
+                                 &mut bytes_required);
+
+                // Then, allocate the buffer and actually copy.
+                let mut buffer = vec![b'\x00'; bytes_required as usize];
+
+                let mut bytes_used: CFIndex = 0;
+                let chars_written = CFStringGetBytes(cf_str.0,
+                                                     CFRange { location: 0, length: char_len },
+                                                     kCFStringEncodingUTF8,
+                                                     0,
+                                                     false as Boolean,
+                                                     buffer.as_mut_ptr(),
+                                                     buffer.len().to_CFIndex(),
+                                                     &mut bytes_used);
+                assert!(chars_written == char_len);
+
+                // This is dangerous; we over-allocate and null-terminate the string (during
+                // initialization).
+                assert!(bytes_used == buffer.len().to_CFIndex());
+                Cow::Owned(String::from_utf8_unchecked(buffer))
+            }
+        }
+    }
+}
+
+impl fmt::Display for CFString {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        fmt.write_str(&Cow::from(self))
+    }
+}
+
+impl fmt::Debug for CFString {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "\"{}\"", self)
+    }
+}
+
+
+impl CFString {
+    /// Creates a new `CFString` instance from a Rust string.
+    #[inline]
+    pub fn new(string: &str) -> CFString {
+        unsafe {
+            let string_ref = CFStringCreateWithBytes(kCFAllocatorDefault,
+                                                     string.as_ptr(),
+                                                     string.len().to_CFIndex(),
+                                                     kCFStringEncodingUTF8,
+                                                     false as Boolean);
+            CFString::wrap_under_create_rule(string_ref)
+        }
+    }
+
+    /// Like `CFString::new`, but references a string that can be used as a backing store
+    /// by virtue of being statically allocated.
+    #[inline]
+    pub fn from_static_string(string: &'static str) -> CFString {
+        unsafe {
+            let string_ref = CFStringCreateWithBytesNoCopy(kCFAllocatorDefault,
+                                                           string.as_ptr(),
+                                                           string.len().to_CFIndex(),
+                                                           kCFStringEncodingUTF8,
+                                                           false as Boolean,
+                                                           kCFAllocatorNull);
+            TCFType::wrap_under_create_rule(string_ref)
+        }
+    }
+
+    /// Returns the number of characters in the string.
+    #[inline]
+    pub fn char_len(&self) -> CFIndex {
+        unsafe {
+            CFStringGetLength(self.0)
+        }
+    }
+}
+
+#[test]
+fn string_and_back() {
+    let original = "The quick brown fox jumped over the slow lazy dog.";
+    let cfstr = CFString::from_static_string(original);
+    let converted = cfstr.to_string();
+    assert!(converted == original);
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/timezone.rs b/third_party/rust_crates/vendor/core-foundation/src/timezone.rs
new file mode 100644
index 0000000..66aadb7
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/timezone.rs
@@ -0,0 +1,95 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Core Foundation time zone objects.
+
+pub use core_foundation_sys::timezone::*;
+use core_foundation_sys::base::kCFAllocatorDefault;
+
+use base::TCFType;
+use date::{CFDate, CFTimeInterval};
+
+#[cfg(feature = "with-chrono")]
+use chrono::{FixedOffset, NaiveDateTime};
+
+
+declare_TCFType!{
+    /// A time zone.
+    CFTimeZone, CFTimeZoneRef
+}
+impl_TCFType!(CFTimeZone, CFTimeZoneRef, CFTimeZoneGetTypeID);
+impl_CFTypeDescription!(CFTimeZone);
+
+impl Default for CFTimeZone {
+    fn default() -> CFTimeZone {
+        unsafe {
+            let tz_ref = CFTimeZoneCopyDefault();
+            TCFType::wrap_under_create_rule(tz_ref)
+        }
+    }
+}
+
+impl CFTimeZone {
+    #[inline]
+    pub fn new(interval: CFTimeInterval) -> CFTimeZone {
+        unsafe {
+            let tz_ref = CFTimeZoneCreateWithTimeIntervalFromGMT(kCFAllocatorDefault, interval);
+            TCFType::wrap_under_create_rule(tz_ref)
+        }
+    }
+
+    #[inline]
+    pub fn system() -> CFTimeZone {
+        unsafe {
+            let tz_ref = CFTimeZoneCopySystem();
+            TCFType::wrap_under_create_rule(tz_ref)
+        }
+    }
+
+    pub fn seconds_from_gmt(&self, date: CFDate) -> CFTimeInterval {
+        unsafe {
+            CFTimeZoneGetSecondsFromGMT(self.0, date.abs_time())
+        }
+    }
+
+    #[cfg(feature = "with-chrono")]
+    pub fn offset_at_date(&self, date: NaiveDateTime) -> FixedOffset {
+        let date = CFDate::from_naive_utc(date);
+        FixedOffset::east(self.seconds_from_gmt(date) as i32)
+    }
+
+    #[cfg(feature = "with-chrono")]
+    pub fn from_offset(offset: FixedOffset) -> CFTimeZone {
+        CFTimeZone::new(offset.local_minus_utc() as f64)
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::CFTimeZone;
+
+    #[cfg(feature = "with-chrono")]
+    use chrono::{NaiveDateTime, FixedOffset};
+
+    #[test]
+    fn timezone_comparison() {
+        let system = CFTimeZone::system();
+        let default = CFTimeZone::default();
+        assert_eq!(system, default);
+    }
+
+    #[test]
+    #[cfg(feature = "with-chrono")]
+    fn timezone_chrono_conversion() {
+        let offset = FixedOffset::west(28800);
+        let tz = CFTimeZone::from_offset(offset);
+        let converted = tz.offset_at_date(NaiveDateTime::from_timestamp(0, 0));
+        assert_eq!(offset, converted);
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/url.rs b/third_party/rust_crates/vendor/core-foundation/src/url.rs
new file mode 100644
index 0000000..edf1de8
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/url.rs
@@ -0,0 +1,156 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! A URL type for Core Foundation.
+
+pub use core_foundation_sys::url::*;
+
+use base::{TCFType, CFIndex};
+use string::{CFString};
+
+use core_foundation_sys::base::{kCFAllocatorDefault, Boolean};
+use std::fmt;
+use std::ptr;
+use std::path::{Path, PathBuf};
+use std::mem;
+
+use libc::{strlen, PATH_MAX};
+
+#[cfg(unix)]
+use std::os::unix::ffi::OsStrExt;
+#[cfg(unix)]
+use std::ffi::OsStr;
+
+
+declare_TCFType!(CFURL, CFURLRef);
+impl_TCFType!(CFURL, CFURLRef, CFURLGetTypeID);
+
+impl fmt::Debug for CFURL {
+    #[inline]
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        unsafe {
+            let string: CFString = TCFType::wrap_under_get_rule(CFURLGetString(self.0));
+            write!(f, "{}", string.to_string())
+        }
+    }
+}
+
+impl CFURL {
+    pub fn from_path<P: AsRef<Path>>(path: P, isDirectory: bool) -> Option<CFURL> {
+        let path_bytes;
+        #[cfg(unix)]
+        {
+            path_bytes = path.as_ref().as_os_str().as_bytes()
+        }
+        #[cfg(not(unix))]
+        {
+            // XXX: Getting non-valid UTF8 paths into CoreFoundation on Windows is going to be unpleasant
+            // CFURLGetWideFileSystemRepresentation might help
+            path_bytes = match path.as_ref().to_str() {
+                Some(path) => path,
+                None => return None,
+            }
+        }
+
+        unsafe {
+            let url_ref = CFURLCreateFromFileSystemRepresentation(ptr::null_mut(), path_bytes.as_ptr(), path_bytes.len() as CFIndex, isDirectory as u8);
+            if url_ref.is_null() {
+                return None;
+            }
+            Some(TCFType::wrap_under_create_rule(url_ref))
+        }
+    }
+
+    pub fn from_file_system_path(filePath: CFString, pathStyle: CFURLPathStyle, isDirectory: bool) -> CFURL {
+        unsafe {
+            let url_ref = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, filePath.as_concrete_TypeRef(), pathStyle, isDirectory as u8);
+            TCFType::wrap_under_create_rule(url_ref)
+        }
+    }
+
+    #[cfg(unix)]
+    pub fn to_path(&self) -> Option<PathBuf> {
+        // implementing this on Windows is more complicated because of the different OsStr representation
+        unsafe {
+            let mut buf: [u8; PATH_MAX as usize] = mem::uninitialized();
+            let result = CFURLGetFileSystemRepresentation(self.0, true as Boolean, buf.as_mut_ptr(), buf.len() as CFIndex);
+            if result == false as Boolean {
+                return None;
+            }
+            let len = strlen(buf.as_ptr() as *const i8);
+            let path = OsStr::from_bytes(&buf[0..len]);
+            Some(PathBuf::from(path))
+        }
+    }
+
+    pub fn get_string(&self) -> CFString {
+        unsafe {
+            TCFType::wrap_under_get_rule(CFURLGetString(self.0))
+        }
+    }
+
+    pub fn get_file_system_path(&self, pathStyle: CFURLPathStyle) -> CFString {
+        unsafe {
+            TCFType::wrap_under_create_rule(CFURLCopyFileSystemPath(self.as_concrete_TypeRef(), pathStyle))
+        }
+    }
+
+    pub fn absolute(&self) -> CFURL {
+        unsafe {
+            TCFType::wrap_under_create_rule(CFURLCopyAbsoluteURL(self.as_concrete_TypeRef()))
+        }
+    }
+}
+
+#[test]
+fn file_url_from_path() {
+    let path = "/usr/local/foo/";
+    let cfstr_path = CFString::from_static_string(path);
+    let cfurl = CFURL::from_file_system_path(cfstr_path, kCFURLPOSIXPathStyle, true);
+    assert_eq!(cfurl.get_string().to_string(), "file:///usr/local/foo/");
+}
+
+#[cfg(unix)]
+#[test]
+fn non_utf8() {
+    use std::ffi::OsStr;
+    let path = Path::new(OsStr::from_bytes(b"/\xC0/blame"));
+    let cfurl = CFURL::from_path(path, false).unwrap();
+    assert_eq!(cfurl.to_path().unwrap(), path);
+    let len = unsafe { CFURLGetBytes(cfurl.as_concrete_TypeRef(), ptr::null_mut(), 0) };
+    assert_eq!(len, 17);
+}
+
+#[test]
+fn absolute_file_url() {
+    use core_foundation_sys::url::CFURLCreateWithFileSystemPathRelativeToBase;
+    use std::path::PathBuf;
+
+    let path = "/usr/local/foo";
+    let file = "bar";
+
+    let cfstr_path = CFString::from_static_string(path);
+    let cfstr_file = CFString::from_static_string(file);
+    let cfurl_base = CFURL::from_file_system_path(cfstr_path, kCFURLPOSIXPathStyle, true);
+    let cfurl_relative: CFURL = unsafe {
+        let url_ref = CFURLCreateWithFileSystemPathRelativeToBase(kCFAllocatorDefault,
+            cfstr_file.as_concrete_TypeRef(),
+            kCFURLPOSIXPathStyle,
+            false as u8,
+            cfurl_base.as_concrete_TypeRef());
+        TCFType::wrap_under_create_rule(url_ref)
+    };
+
+    let mut absolute_path = PathBuf::from(path);
+    absolute_path.push(file);
+
+    assert_eq!(cfurl_relative.get_file_system_path(kCFURLPOSIXPathStyle).to_string(), file);
+    assert_eq!(cfurl_relative.absolute().get_file_system_path(kCFURLPOSIXPathStyle).to_string(),
+        absolute_path.to_str().unwrap());
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/src/uuid.rs b/third_party/rust_crates/vendor/core-foundation/src/uuid.rs
new file mode 100644
index 0000000..8061337
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/src/uuid.rs
@@ -0,0 +1,112 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Core Foundation UUID objects.
+
+#[cfg(feature = "with-uuid")]
+extern crate uuid;
+
+pub use core_foundation_sys::uuid::*;
+use core_foundation_sys::base::kCFAllocatorDefault;
+
+use base::TCFType;
+
+#[cfg(feature = "with-uuid")]
+use self::uuid::Uuid;
+
+
+declare_TCFType! {
+    /// A UUID.
+    CFUUID, CFUUIDRef
+}
+impl_TCFType!(CFUUID, CFUUIDRef, CFUUIDGetTypeID);
+impl_CFTypeDescription!(CFUUID);
+
+impl CFUUID {
+    #[inline]
+    pub fn new() -> CFUUID {
+        unsafe {
+            let uuid_ref = CFUUIDCreate(kCFAllocatorDefault);
+            TCFType::wrap_under_create_rule(uuid_ref)
+        }
+    }
+}
+
+#[cfg(feature = "with-uuid")]
+impl Into<Uuid> for CFUUID {
+    fn into(self) -> Uuid {
+        let b = unsafe {
+            CFUUIDGetUUIDBytes(self.0)
+        };
+        let bytes = [
+            b.byte0,
+            b.byte1,
+            b.byte2,
+            b.byte3,
+            b.byte4,
+            b.byte5,
+            b.byte6,
+            b.byte7,
+            b.byte8,
+            b.byte9,
+            b.byte10,
+            b.byte11,
+            b.byte12,
+            b.byte13,
+            b.byte14,
+            b.byte15,
+        ];
+        Uuid::from_bytes(&bytes).unwrap()
+    }
+}
+
+#[cfg(feature = "with-uuid")]
+impl From<Uuid> for CFUUID {
+    fn from(uuid: Uuid) -> CFUUID {
+        let b = uuid.as_bytes();
+        let bytes = CFUUIDBytes {
+            byte0: b[0],
+            byte1: b[1],
+            byte2: b[2],
+            byte3: b[3],
+            byte4: b[4],
+            byte5: b[5],
+            byte6: b[6],
+            byte7: b[7],
+            byte8: b[8],
+            byte9: b[9],
+            byte10: b[10],
+            byte11: b[11],
+            byte12: b[12],
+            byte13: b[13],
+            byte14: b[14],
+            byte15: b[15],
+        };
+        unsafe {
+            let uuid_ref = CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault, bytes);
+            TCFType::wrap_under_create_rule(uuid_ref)
+        }
+    }
+}
+
+
+#[cfg(test)]
+#[cfg(feature = "with-uuid")]
+mod test {
+    use super::CFUUID;
+    use uuid::Uuid;
+
+    #[test]
+    fn uuid_conversion() {
+        let cf_uuid = CFUUID::new();
+        let uuid: Uuid = cf_uuid.clone().into();
+        let converted = CFUUID::from(uuid);
+        assert!(cf_uuid == converted);
+    }
+}
diff --git a/third_party/rust_crates/vendor/core-foundation/tests/use_macro_outside_crate.rs b/third_party/rust_crates/vendor/core-foundation/tests/use_macro_outside_crate.rs
new file mode 100644
index 0000000..ff1c17d
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-foundation/tests/use_macro_outside_crate.rs
@@ -0,0 +1,28 @@
+#[macro_use]
+extern crate core_foundation;
+
+use core_foundation::base::{CFComparisonResult, TCFType};
+use std::os::raw::c_void;
+
+// sys equivalent stuff that must be declared
+
+#[repr(C)]
+pub struct __CFFooBar(c_void);
+
+pub type CFFooBarRef = *const __CFFooBar;
+
+extern "C" {
+    pub fn CFFooBarGetTypeID() -> core_foundation::base::CFTypeID;
+    pub fn fake_compare(
+        this: CFFooBarRef,
+        other: CFFooBarRef,
+        context: *mut c_void,
+    ) -> CFComparisonResult;
+}
+
+// Try to use the macros outside of the crate
+
+declare_TCFType!(CFFooBar, CFFooBarRef);
+impl_TCFType!(CFFooBar, CFFooBarRef, CFFooBarGetTypeID);
+impl_CFTypeDescription!(CFFooBar);
+impl_CFComparison!(CFFooBar, fake_compare);
diff --git a/third_party/rust_crates/vendor/core-graphics/.cargo-checksum.json b/third_party/rust_crates/vendor/core-graphics/.cargo-checksum.json
new file mode 100644
index 0000000..1dd1131
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"COPYRIGHT":"ec82b96487e9e778ee610c7ab245162464782cfa1f555c2299333f8dbe5c036a","Cargo.toml":"ff714d37c339428ee9c8958414b52f0f49578de1001cd27e732b8cc965ad0326","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","README.md":"4a45abeb1e684e30bb361dfa7db59189423348e18d310cbae694b7c8c57cd86a","src/base.rs":"5faaadaf17d93c370a20f358be6c3f12958ab7d3f99ccc634421e28758fec88b","src/color.rs":"4c8ec4ab828cbc1b2a1538a34a51f5b380927f2f1daf187dff6f732f57a43656","src/color_space.rs":"b3d7ee8a21703c789160867cb8eb2188bd1daa193e3d030f21adb6f1a6f872de","src/context.rs":"6b14ec712e5d0af4af6beb0cb1a998bf1262ec6ab6ad2b3efad9e0362ade83c9","src/data_provider.rs":"22614a6ce7f857dec33e6d2dc01261b71b1bc5d5609a54ee55e04c049670c072","src/display.rs":"5b04d1fded021fc1eecb89b6350a66f6668e802b51e75cf69892ca082257443c","src/event.rs":"f2ade1c2c112bae7bc4f5df1eda63c13d1c32e5db255228f139ce17fb37c1a4b","src/event_source.rs":"d55a4f5b5e62789325028febc51bbf54c74b15ab1a4e70c6ad749a2f9753e081","src/font.rs":"63b7e50243a56254c800421df586abee59aead84f735f7df838ae04693aedf4b","src/geometry.rs":"cdeb9624df601d235bcc34d46e35bea302079ce1e3668253356a618486693a9f","src/image.rs":"0af720ee020fb1c6a2f4b1ce49e3d27f8f21f0be6b81ba4b9c824f87564efa58","src/lib.rs":"9b9601462de1bbc806e881b2b42e86b16372cad8eeefe1a96b772a9f7329958d","src/path.rs":"c429afeaed999b02ac00f89a867b5fc64f1e223039079a4e0529306b734ff117","src/private.rs":"da3fd61338bab2d8e26aa5433b2e18ecd2a0a408c62e1ac2b33a0f87f2dad88a","src/sys.rs":"cc90b690f172da51a87ffb234f6e74a9f501c4f1630d7b51fa2d5846e80fc164","src/window.rs":"2f6c3dc958ae2c0c9e2fc5033300b96e60ed0abee9823ea1f03797d64df0911a"},"package":"56790968ab1c8a1202a102e6de05fc6e1ec87da99e4e93e9a7d13efbfc1e95a9"}
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/core-graphics/COPYRIGHT b/third_party/rust_crates/vendor/core-graphics/COPYRIGHT
new file mode 100644
index 0000000..8b7291ad
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/COPYRIGHT
@@ -0,0 +1,5 @@
+Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+<LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+option. All files in the project carrying such notice may not be
+copied, modified, or distributed except according to those terms.
diff --git a/third_party/rust_crates/vendor/core-graphics/Cargo.toml b/third_party/rust_crates/vendor/core-graphics/Cargo.toml
new file mode 100644
index 0000000..e445401
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/Cargo.toml
@@ -0,0 +1,36 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "core-graphics"
+version = "0.17.3"
+authors = ["The Servo Project Developers"]
+description = "Bindings to Core Graphics for OS X"
+homepage = "https://github.com/servo/core-graphics-rs"
+license = "MIT / Apache-2.0"
+repository = "https://github.com/servo/core-foundation-rs"
+[dependencies.bitflags]
+version = "1.0"
+
+[dependencies.core-foundation]
+version = "0.6"
+
+[dependencies.foreign-types]
+version = "0.3.0"
+
+[dependencies.libc]
+version = "0.2"
+
+[features]
+default = []
+elcapitan = []
+highsierra = []
diff --git a/third_party/rust_crates/vendor/core-graphics/LICENSE-APACHE b/third_party/rust_crates/vendor/core-graphics/LICENSE-APACHE
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/third_party/rust_crates/vendor/core-graphics/LICENSE-MIT b/third_party/rust_crates/vendor/core-graphics/LICENSE-MIT
new file mode 100644
index 0000000..807526f
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2012-2013 Mozilla Foundation
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/third_party/rust_crates/vendor/core-graphics/README.md b/third_party/rust_crates/vendor/core-graphics/README.md
new file mode 100644
index 0000000..a23522d
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/README.md
@@ -0,0 +1,3 @@
+# core-graphics-rs
+
+[![Build Status](https://travis-ci.org/servo/core-graphics-rs.svg?branch=master)](https://travis-ci.org/servo/core-graphics-rs)
diff --git a/third_party/rust_crates/vendor/core-graphics/src/base.rs b/third_party/rust_crates/vendor/core-graphics/src/base.rs
new file mode 100644
index 0000000..e7b7a19
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/base.rs
@@ -0,0 +1,59 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// this file defines CGFloat, as well as stubbed data types.
+
+#![allow(non_camel_case_types)]
+#![allow(non_upper_case_globals)]
+
+use libc;
+
+#[cfg(any(target_arch = "x86",
+          target_arch = "arm",
+          target_arch = "aarch64"))]
+pub type boolean_t = libc::c_int;
+#[cfg(target_arch = "x86_64")]
+pub type boolean_t = libc::c_uint;
+
+#[cfg(target_pointer_width = "64")]
+pub type CGFloat = libc::c_double;
+#[cfg(not(target_pointer_width = "64"))]
+pub type CGFloat = libc::c_float;
+
+pub type CGError = libc::int32_t;
+
+pub const kCGImageAlphaNone: u32 = 0;
+pub const kCGImageAlphaPremultipliedLast: u32 = 1;
+pub const kCGImageAlphaPremultipliedFirst: u32 = 2;
+pub const kCGImageAlphaLast: u32 = 3;
+pub const kCGImageAlphaFirst: u32 = 4;
+pub const kCGImageAlphaNoneSkipLast: u32 = 5;
+pub const kCGImageAlphaNoneSkipFirst: u32 = 6;
+
+pub const kCGBitmapByteOrderDefault: u32 = (0 << 12);
+pub const kCGBitmapByteOrder16Little: u32 = (1 << 12);
+pub const kCGBitmapByteOrder32Little: u32 = (2 << 12);
+pub const kCGBitmapByteOrder16Big: u32 = (3 << 12);
+pub const kCGBitmapByteOrder32Big: u32 = (4 << 12);
+
+pub const kCGRenderingIntentDefault: u32 = 0;
+pub const kCGRenderingIntentAbsoluteColorimetric: u32 = 1;
+pub const kCGRenderingIntentRelativeColorimetric: u32 = 2;
+pub const kCGRenderingIntentPerceptual: u32 = 3;
+pub const kCGRenderingIntentSaturation: u32 = 4;
+
+#[cfg(target_endian = "big")]
+pub const kCGBitmapByteOrder16Host: u32 = kCGBitmapByteOrder16Big;
+#[cfg(target_endian = "big")]
+pub const kCGBitmapByteOrder32Host: u32 = kCGBitmapByteOrder32Big;
+
+#[cfg(target_endian = "little")]
+pub const kCGBitmapByteOrder16Host: u32 = kCGBitmapByteOrder16Little;
+#[cfg(target_endian = "little")]
+pub const kCGBitmapByteOrder32Host: u32 = kCGBitmapByteOrder32Little;
diff --git a/third_party/rust_crates/vendor/core-graphics/src/color.rs b/third_party/rust_crates/vendor/core-graphics/src/color.rs
new file mode 100644
index 0000000..79ef9a0
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/color.rs
@@ -0,0 +1,35 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use core_foundation::base::{CFTypeID};
+use base::CGFloat;
+use core_foundation::base::TCFType;
+use super::sys::{CGColorRef};
+
+pub use super::sys::CGColorRef as SysCGColorRef;
+
+declare_TCFType!{
+    CGColor, CGColorRef
+}
+impl_TCFType!(CGColor, CGColorRef, CGColorGetTypeID);
+
+impl CGColor {
+    pub fn rgb(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) -> Self {
+        unsafe { 
+            let ptr = CGColorCreateGenericRGB(red, green, blue, alpha);
+            CGColor::wrap_under_create_rule(ptr)
+        }
+    }
+}
+
+#[link(name = "CoreGraphics", kind = "framework")]
+extern {
+    fn CGColorCreateGenericRGB(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) -> ::sys::CGColorRef;
+    fn CGColorGetTypeID() -> CFTypeID;
+}
diff --git a/third_party/rust_crates/vendor/core-graphics/src/color_space.rs b/third_party/rust_crates/vendor/core-graphics/src/color_space.rs
new file mode 100644
index 0000000..9eef09c
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/color_space.rs
@@ -0,0 +1,69 @@
+// Copyright 2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use core_foundation::base::{CFRelease, CFRetain, CFTypeID};
+use core_foundation::string::CFStringRef;
+use foreign_types::ForeignType;
+
+foreign_type! {
+    #[doc(hidden)]
+    type CType = ::sys::CGColorSpace;
+    fn drop = |p| CFRelease(p as *mut _);
+    fn clone = |p| CFRetain(p as *const _) as *mut _;
+    pub struct CGColorSpace;
+    pub struct CGColorSpaceRef;
+}
+
+impl CGColorSpace {
+    pub fn type_id() -> CFTypeID {
+        unsafe {
+            CGColorSpaceGetTypeID()
+        }
+    }
+
+    pub fn create_with_name(name: CFStringRef) -> Option<CGColorSpace> {
+        unsafe {
+            let p = CGColorSpaceCreateWithName(name);
+            if !p.is_null() {Some(CGColorSpace::from_ptr(p))} else {None}
+        }
+    }
+
+    #[inline]
+    pub fn create_device_rgb() -> CGColorSpace {
+        unsafe {
+            let result = CGColorSpaceCreateDeviceRGB();
+            CGColorSpace::from_ptr(result)
+        }
+    }
+
+    #[inline]
+    pub fn create_device_gray() -> CGColorSpace {
+        unsafe {
+            let result = CGColorSpaceCreateDeviceGray();
+            CGColorSpace::from_ptr(result)
+        }
+    }
+}
+
+#[link(name = "CoreGraphics", kind = "framework")]
+extern {
+    pub static kCGColorSpaceSRGB: CFStringRef;
+    pub static kCGColorSpaceAdobeRGB1998: CFStringRef;
+    pub static kCGColorSpaceGenericGray: CFStringRef;
+    pub static kCGColorSpaceGenericRGB: CFStringRef;
+    pub static kCGColorSpaceGenericCMYK: CFStringRef;
+    pub static kCGColorSpaceGenericRGBLinear: CFStringRef;
+    pub static kCGColorSpaceGenericGrayGamma2_2: CFStringRef;
+
+    fn CGColorSpaceCreateDeviceRGB() -> ::sys::CGColorSpaceRef;
+    fn CGColorSpaceCreateDeviceGray() -> ::sys::CGColorSpaceRef;
+    fn CGColorSpaceCreateWithName(name: CFStringRef) -> ::sys::CGColorSpaceRef;
+    fn CGColorSpaceGetTypeID() -> CFTypeID;
+}
+
diff --git a/third_party/rust_crates/vendor/core-graphics/src/context.rs b/third_party/rust_crates/vendor/core-graphics/src/context.rs
new file mode 100644
index 0000000..1d73c236
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/context.rs
@@ -0,0 +1,401 @@
+// Copyright 2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use base::CGFloat;
+use color_space::CGColorSpace;
+use core_foundation::base::{ToVoid, CFRelease, CFRetain, CFTypeID};
+use font::{CGFont, CGGlyph};
+use geometry::CGPoint;
+use color::CGColor;
+use path::CGPathRef;
+use libc::{c_int, size_t};
+use std::os::raw::c_void;
+
+use std::cmp;
+use std::ptr;
+use std::slice;
+use geometry::{CGAffineTransform, CGRect};
+use image::CGImage;
+use foreign_types::{ForeignType, ForeignTypeRef};
+
+#[repr(C)]
+#[derive(Clone, Copy, Debug)]
+pub enum CGBlendMode {
+    Normal = 0,
+    Multiply,
+    Screen,
+    Overlay,
+    Darken,
+    Lighten,
+    ColorDodge,
+    ColorBurn,
+    SoftLight,
+    HardLight,
+    Difference,
+    Exclusion,
+    Hue,
+    Saturation,
+    Color,
+    Luminosity,
+    // 10.5 and up:
+    Clear,
+    Copy,
+    SourceIn,
+    SourceOut,
+    SourceAtop,
+    DestinationOver,
+    DestinationIn,
+    DestinationOut,
+    DestinationAtop,
+    Xor,
+    PlusDarker,
+    PlusLighter,
+}
+
+#[repr(C)]
+pub enum CGTextDrawingMode {
+    CGTextFill,
+    CGTextStroke,
+    CGTextFillStroke,
+    CGTextInvisible,
+    CGTextFillClip,
+    CGTextStrokeClip,
+    CGTextClip
+}
+
+foreign_type! {
+    #[doc(hidden)]
+    type CType = ::sys::CGContext;
+    fn drop = |cs| CFRelease(cs as *mut _);
+    fn clone = |p| CFRetain(p as *const _) as *mut _;
+    pub struct CGContext;
+    pub struct CGContextRef;
+}
+
+impl CGContext {
+    pub fn type_id() -> CFTypeID {
+        unsafe {
+            CGContextGetTypeID()
+        }
+    }
+
+    pub fn create_bitmap_context(data: Option<*mut c_void>,
+                                 width: size_t,
+                                 height: size_t,
+                                 bits_per_component: size_t,
+                                 bytes_per_row: size_t,
+                                 space: &CGColorSpace,
+                                 bitmap_info: u32)
+                                 -> CGContext {
+        unsafe {
+            let result = CGBitmapContextCreate(data.unwrap_or(ptr::null_mut()),
+                                               width,
+                                               height,
+                                               bits_per_component,
+                                               bytes_per_row,
+                                               space.as_ptr(),
+                                               bitmap_info);
+            assert!(!result.is_null());
+            Self::from_ptr(result)
+        }
+    }
+
+    pub fn data(&mut self) -> &mut [u8] {
+        unsafe {
+            slice::from_raw_parts_mut(
+                    CGBitmapContextGetData(self.as_ptr()) as *mut u8,
+                    (self.height() * self.bytes_per_row()) as usize)
+        }
+    }
+}
+
+impl CGContextRef {
+    pub fn flush(&self) {
+        unsafe {
+            CGContextFlush(self.as_ptr())
+        }
+    }
+
+    pub fn width(&self) -> size_t {
+        unsafe {
+            CGBitmapContextGetWidth(self.as_ptr())
+        }
+    }
+
+    pub fn height(&self) -> size_t {
+        unsafe {
+            CGBitmapContextGetHeight(self.as_ptr())
+        }
+    }
+
+    pub fn bytes_per_row(&self) -> size_t {
+        unsafe {
+            CGBitmapContextGetBytesPerRow(self.as_ptr())
+        }
+    }
+
+    pub fn set_fill_color(&self, color: &CGColor) {
+        unsafe {
+            CGContextSetFillColorWithColor(self.as_ptr(), color.to_void());
+        }
+    }
+
+    pub fn set_rgb_fill_color(&self, red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
+        unsafe {
+            CGContextSetRGBFillColor(self.as_ptr(), red, green, blue, alpha)
+        }
+    }
+
+    pub fn set_gray_fill_color(&self, gray: CGFloat, alpha: CGFloat) {
+        unsafe {
+            CGContextSetGrayFillColor(self.as_ptr(), gray, alpha)
+        }
+    }
+
+    pub fn set_blend_mode(&self, blend_mode: CGBlendMode) {
+        unsafe {
+            CGContextSetBlendMode(self.as_ptr(), blend_mode)
+        }
+    }
+
+    pub fn set_allows_font_smoothing(&self, allows_font_smoothing: bool) {
+        unsafe {
+            CGContextSetAllowsFontSmoothing(self.as_ptr(), allows_font_smoothing)
+        }
+    }
+
+    pub fn set_font_smoothing_style(&self, style: i32) {
+        unsafe {
+            CGContextSetFontSmoothingStyle(self.as_ptr(), style as _);
+        }
+    }
+
+    pub fn set_should_smooth_fonts(&self, should_smooth_fonts: bool) {
+        unsafe {
+            CGContextSetShouldSmoothFonts(self.as_ptr(), should_smooth_fonts)
+        }
+    }
+
+    pub fn set_allows_antialiasing(&self, allows_antialiasing: bool) {
+        unsafe {
+            CGContextSetAllowsAntialiasing(self.as_ptr(), allows_antialiasing)
+        }
+    }
+
+    pub fn set_should_antialias(&self, should_antialias: bool) {
+        unsafe {
+            CGContextSetShouldAntialias(self.as_ptr(), should_antialias)
+        }
+    }
+
+    pub fn set_allows_font_subpixel_quantization(&self, allows_font_subpixel_quantization: bool) {
+        unsafe {
+            CGContextSetAllowsFontSubpixelQuantization(self.as_ptr(), allows_font_subpixel_quantization)
+        }
+    }
+
+    pub fn set_should_subpixel_quantize_fonts(&self, should_subpixel_quantize_fonts: bool) {
+        unsafe {
+            CGContextSetShouldSubpixelQuantizeFonts(self.as_ptr(), should_subpixel_quantize_fonts)
+        }
+    }
+
+    pub fn set_allows_font_subpixel_positioning(&self, allows_font_subpixel_positioning: bool) {
+        unsafe {
+            CGContextSetAllowsFontSubpixelPositioning(self.as_ptr(), allows_font_subpixel_positioning)
+        }
+    }
+
+    pub fn set_should_subpixel_position_fonts(&self, should_subpixel_position_fonts: bool) {
+        unsafe {
+            CGContextSetShouldSubpixelPositionFonts(self.as_ptr(), should_subpixel_position_fonts)
+        }
+    }
+
+    pub fn set_text_drawing_mode(&self, mode: CGTextDrawingMode) {
+        unsafe {
+            CGContextSetTextDrawingMode(self.as_ptr(), mode)
+        }
+    }
+
+    pub fn add_path(&self, path: &CGPathRef) {
+        unsafe {
+            CGContextAddPath(self.as_ptr(), path.as_ptr());
+        }
+    }
+
+    pub fn close_path(&self) {
+        unsafe {
+            CGContextClosePath(self.as_ptr());
+        }
+    }
+
+    pub fn fill_path(&self) {
+        unsafe {
+            CGContextFillPath(self.as_ptr());
+        }
+    }
+
+    pub fn fill_rect(&self, rect: CGRect) {
+        unsafe {
+            CGContextFillRect(self.as_ptr(), rect)
+        }
+    }
+
+    pub fn draw_image(&self, rect: CGRect, image: &CGImage) {
+        unsafe {
+            CGContextDrawImage(self.as_ptr(), rect, image.as_ptr());
+        }
+    }
+
+    pub fn create_image(&self) -> Option<CGImage> {
+        let image = unsafe { CGBitmapContextCreateImage(self.as_ptr()) };
+        if !image.is_null() {
+            Some(unsafe { CGImage::from_ptr(image) })
+        } else {
+            None
+        }
+    }
+
+    pub fn set_font(&self, font: &CGFont) {
+        unsafe {
+            CGContextSetFont(self.as_ptr(), font.as_ptr())
+        }
+    }
+
+    pub fn set_font_size(&self, size: CGFloat) {
+        unsafe {
+            CGContextSetFontSize(self.as_ptr(), size)
+        }
+    }
+
+    pub fn set_text_matrix(&self, t: &CGAffineTransform) {
+        unsafe {
+            CGContextSetTextMatrix(self.as_ptr(), *t)
+        }
+    }
+
+    pub fn show_glyphs_at_positions(&self, glyphs: &[CGGlyph], positions: &[CGPoint]) {
+        unsafe {
+            let count = cmp::min(glyphs.len(), positions.len());
+            CGContextShowGlyphsAtPositions(self.as_ptr(),
+                                           glyphs.as_ptr(),
+                                           positions.as_ptr(),
+                                           count)
+        }
+    }
+
+    pub fn save(&self) {
+        unsafe {
+            CGContextSaveGState(self.as_ptr());
+        }
+    }
+
+    pub fn restore(&self) {
+        unsafe {
+            CGContextRestoreGState(self.as_ptr());
+        }
+    }
+
+    pub fn translate(&self, tx: CGFloat, ty: CGFloat) {
+        unsafe {
+            CGContextTranslateCTM(self.as_ptr(), tx, ty);
+        }
+    }
+
+    pub fn scale(&self, sx: CGFloat, sy: CGFloat) {
+        unsafe {
+            CGContextScaleCTM(self.as_ptr(), sx, sy);
+        }
+    }
+}
+
+#[test]
+fn create_bitmap_context_test() {
+    use geometry::*;
+
+    let cs = CGColorSpace::create_device_rgb();
+    let ctx = CGContext::create_bitmap_context(None,
+                                16, 8,
+                                8, 0,
+                                &cs,
+                                ::base::kCGImageAlphaPremultipliedLast);
+    ctx.set_rgb_fill_color(1.,0.,1.,1.);
+    ctx.fill_rect(CGRect::new(&CGPoint::new(0.,0.), &CGSize::new(8.,8.)));
+    let img = ctx.create_image().unwrap();
+    assert_eq!(16, img.width());
+    assert_eq!(8, img.height());
+    assert_eq!(8, img.bits_per_component());
+    assert_eq!(32, img.bits_per_pixel());
+    let data = img.data();
+    assert_eq!(255, data.bytes()[0]);
+    assert_eq!(0, data.bytes()[1]);
+    assert_eq!(255, data.bytes()[2]);
+    assert_eq!(255, data.bytes()[3]);
+}
+
+#[link(name = "CoreGraphics", kind = "framework")]
+extern {
+    fn CGBitmapContextCreate(data: *mut c_void,
+                             width: size_t,
+                             height: size_t,
+                             bitsPerComponent: size_t,
+                             bytesPerRow: size_t,
+                             space: ::sys::CGColorSpaceRef,
+                             bitmapInfo: u32)
+                             -> ::sys::CGContextRef;
+    fn CGBitmapContextGetData(context: ::sys::CGContextRef) -> *mut c_void;
+    fn CGBitmapContextGetWidth(context: ::sys::CGContextRef) -> size_t;
+    fn CGBitmapContextGetHeight(context: ::sys::CGContextRef) -> size_t;
+    fn CGBitmapContextGetBytesPerRow(context: ::sys::CGContextRef) -> size_t;
+    fn CGBitmapContextCreateImage(context: ::sys::CGContextRef) -> ::sys::CGImageRef;
+    fn CGContextGetTypeID() -> CFTypeID;
+    fn CGContextFlush(c: ::sys::CGContextRef);
+    fn CGContextSetBlendMode(c: ::sys::CGContextRef, blendMode: CGBlendMode);
+    fn CGContextSetAllowsFontSmoothing(c: ::sys::CGContextRef, allowsFontSmoothing: bool);
+    fn CGContextSetShouldSmoothFonts(c: ::sys::CGContextRef, shouldSmoothFonts: bool);
+    fn CGContextSetFontSmoothingStyle(c: ::sys::CGContextRef, style: c_int);
+    fn CGContextSetAllowsAntialiasing(c: ::sys::CGContextRef, allowsAntialiasing: bool);
+    fn CGContextSetShouldAntialias(c: ::sys::CGContextRef, shouldAntialias: bool);
+    fn CGContextSetAllowsFontSubpixelQuantization(c: ::sys::CGContextRef,
+                                                  allowsFontSubpixelQuantization: bool);
+    fn CGContextSetShouldSubpixelQuantizeFonts(c: ::sys::CGContextRef,
+                                               shouldSubpixelQuantizeFonts: bool);
+    fn CGContextSetAllowsFontSubpixelPositioning(c: ::sys::CGContextRef,
+                                                 allowsFontSubpixelPositioning: bool);
+    fn CGContextSetShouldSubpixelPositionFonts(c: ::sys::CGContextRef,
+                                               shouldSubpixelPositionFonts: bool);
+    fn CGContextSetTextDrawingMode(c: ::sys::CGContextRef, mode: CGTextDrawingMode);
+    fn CGContextSetFillColorWithColor(c: ::sys::CGContextRef, color: *const c_void);
+    fn CGContextAddPath(c: ::sys::CGContextRef, path: ::sys::CGPathRef);
+    fn CGContextClosePath(c: ::sys::CGContextRef);
+    fn CGContextFillPath(c: ::sys::CGContextRef);
+    fn CGContextSetRGBFillColor(context: ::sys::CGContextRef,
+                                red: CGFloat,
+                                green: CGFloat,
+                                blue: CGFloat,
+                                alpha: CGFloat);
+    fn CGContextSetGrayFillColor(context: ::sys::CGContextRef, gray: CGFloat, alpha: CGFloat);
+    fn CGContextFillRect(context: ::sys::CGContextRef,
+                         rect: CGRect);
+    fn CGContextDrawImage(c: ::sys::CGContextRef, rect: CGRect, image: ::sys::CGImageRef);
+    fn CGContextSetFont(c: ::sys::CGContextRef, font: ::sys::CGFontRef);
+    fn CGContextSetFontSize(c: ::sys::CGContextRef, size: CGFloat);
+    fn CGContextSetTextMatrix(c: ::sys::CGContextRef, t: CGAffineTransform);
+    fn CGContextShowGlyphsAtPositions(c: ::sys::CGContextRef,
+                                      glyphs: *const CGGlyph,
+                                      positions: *const CGPoint,
+                                      count: size_t);
+
+    fn CGContextSaveGState(c: ::sys::CGContextRef);
+    fn CGContextRestoreGState(c: ::sys::CGContextRef);
+    fn CGContextTranslateCTM(c: ::sys::CGContextRef, tx: CGFloat, ty: CGFloat);
+    fn CGContextScaleCTM(c: ::sys::CGContextRef, sx: CGFloat, sy: CGFloat);
+}
+
diff --git a/third_party/rust_crates/vendor/core-graphics/src/data_provider.rs b/third_party/rust_crates/vendor/core-graphics/src/data_provider.rs
new file mode 100644
index 0000000..b6388fc
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/data_provider.rs
@@ -0,0 +1,125 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use core_foundation::base::{CFRelease, CFRetain, CFTypeID, TCFType};
+use core_foundation::data::{CFData, CFDataRef};
+
+use libc::{size_t, off_t};
+use std::mem;
+use std::ptr;
+use std::sync::Arc;
+use std::os::raw::c_void;
+
+use foreign_types::{ForeignType, ForeignTypeRef};
+
+pub type CGDataProviderGetBytesCallback = Option<unsafe extern fn (*mut c_void, *mut c_void, size_t) -> size_t>;
+pub type CGDataProviderReleaseInfoCallback = Option<unsafe extern fn (*mut c_void)>;
+pub type CGDataProviderRewindCallback = Option<unsafe extern fn (*mut c_void)>;
+pub type CGDataProviderSkipBytesCallback = Option<unsafe extern fn (*mut c_void, size_t)>;
+pub type CGDataProviderSkipForwardCallback = Option<unsafe extern fn (*mut c_void, off_t) -> off_t>;
+
+pub type CGDataProviderGetBytePointerCallback = Option<unsafe extern fn (*mut c_void) -> *mut c_void>;
+pub type CGDataProviderGetBytesAtOffsetCallback = Option<unsafe extern fn (*mut c_void, *mut c_void, size_t, size_t)>;
+pub type CGDataProviderReleaseBytePointerCallback = Option<unsafe extern fn (*mut c_void, *const c_void)>;
+pub type CGDataProviderReleaseDataCallback = Option<unsafe extern fn (*mut c_void, *const c_void, size_t)>;
+pub type CGDataProviderGetBytesAtPositionCallback = Option<unsafe extern fn (*mut c_void, *mut c_void, off_t, size_t)>;
+
+foreign_type! {
+    #[doc(hidden)]
+    type CType = ::sys::CGDataProvider;
+    fn drop = |cs| CFRelease(cs as *mut _);
+    fn clone = |p| CFRetain(p as *const _) as *mut _;
+    pub struct CGDataProvider;
+    pub struct CGDataProviderRef;
+}
+
+impl CGDataProvider {
+    pub fn type_id() -> CFTypeID {
+        unsafe {
+            CGDataProviderGetTypeID()
+        }
+    }
+
+    /// Creates a data provider from the given reference-counted buffer.
+    ///
+    /// The `CGDataProvider` object takes ownership of the reference. Once the data provider
+    /// is destroyed, the reference count of the buffer is automatically decremented.
+    pub fn from_buffer(buffer: Arc<Vec<u8>>) -> Self {
+        unsafe {
+            let ptr = (*buffer).as_ptr() as *const c_void;
+            let len = buffer.len() as size_t;
+            let info = mem::transmute::<Arc<Vec<u8>>, *mut c_void>(buffer);
+            let result = CGDataProviderCreateWithData(info, ptr, len, Some(release));
+            return CGDataProvider::from_ptr(result);
+        }
+
+        unsafe extern "C" fn release(info: *mut c_void, _: *const c_void, _: size_t) {
+            drop(mem::transmute::<*mut c_void, Arc<Vec<u8>>>(info))
+        }
+    }
+
+    /// Creates a data prvider from a given slice. The data provider does not own the slice in this
+    /// case, so it's up to the user to ensure the memory safety here.
+    pub unsafe fn from_slice(buffer: &[u8]) -> Self {
+        let ptr = buffer.as_ptr() as *const c_void;
+        let len = buffer.len() as size_t;
+        let result = CGDataProviderCreateWithData(ptr::null_mut(), ptr, len, None);
+        CGDataProvider::from_ptr(result)
+    }
+
+    /// Creates a data provider from the given raw pointer, length, and destructor function.
+    ///
+    /// This is double-boxed because the Core Text API requires that the userdata be a single
+    /// pointer.
+    pub unsafe fn from_custom_data(custom_data: Box<Box<CustomData>>) -> Self {
+        let (ptr, len) = (custom_data.ptr() as *const c_void, custom_data.len());
+        let userdata = mem::transmute::<Box<Box<CustomData>>, &mut c_void>(custom_data);
+        let data_provider = CGDataProviderCreateWithData(userdata, ptr, len, Some(release));
+        return CGDataProvider::from_ptr(data_provider);
+
+        unsafe extern "C" fn release(info: *mut c_void, _: *const c_void, _: size_t) {
+            drop(mem::transmute::<*mut c_void, Box<Box<CustomData>>>(info))
+        }
+    }
+}
+
+impl CGDataProviderRef {
+    /// Creates a copy of the data from the underlying `CFDataProviderRef`.
+    pub fn copy_data(&self) -> CFData {
+        unsafe { CFData::wrap_under_create_rule(CGDataProviderCopyData(self.as_ptr())) }
+    }
+}
+
+/// Encapsulates custom data that can be wrapped.
+pub trait CustomData {
+    /// Returns a pointer to the start of the custom data. This pointer *must not change* during
+    /// the lifespan of this CustomData.
+    unsafe fn ptr(&self) -> *const u8;
+    /// Returns the length of this custom data. This value must not change during the lifespan of
+    /// this CustomData.
+    unsafe fn len(&self) -> usize;
+}
+
+#[link(name = "CoreGraphics", kind = "framework")]
+extern {
+    fn CGDataProviderCopyData(provider: ::sys::CGDataProviderRef) -> CFDataRef;
+    //fn CGDataProviderCreateDirect
+    //fn CGDataProviderCreateSequential
+    //fn CGDataProviderCreateWithCFData
+    fn CGDataProviderCreateWithData(info: *mut c_void,
+                                    data: *const c_void,
+                                    size: size_t,
+                                    releaseData: CGDataProviderReleaseDataCallback
+                                   ) -> ::sys::CGDataProviderRef;
+    //fn CGDataProviderCreateWithFilename(filename: *c_char) -> CGDataProviderRef;
+    //fn CGDataProviderCreateWithURL
+    fn CGDataProviderGetTypeID() -> CFTypeID;
+    //fn CGDataProviderRelease(provider: CGDataProviderRef);
+    //fn CGDataProviderRetain(provider: CGDataProviderRef) -> CGDataProviderRef;
+}
diff --git a/third_party/rust_crates/vendor/core-graphics/src/display.rs b/third_party/rust_crates/vendor/core-graphics/src/display.rs
new file mode 100644
index 0000000..bb2eec3
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/display.rs
@@ -0,0 +1,671 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(non_upper_case_globals)]
+
+use libc;
+use std::ptr;
+use std::ops::Deref;
+
+pub use base::{CGError, boolean_t};
+pub use geometry::{CGRect, CGPoint, CGSize};
+
+use core_foundation::string::{CFString, CFStringRef};
+use core_foundation::base::{CFRetain, TCFType};
+use image::CGImage;
+use foreign_types::ForeignType;
+
+pub type CGDirectDisplayID = libc::uint32_t;
+pub type CGWindowID        = libc::uint32_t;
+
+pub const kCGNullWindowID: CGWindowID = 0 as CGWindowID;
+
+
+pub type CGWindowListOption = libc::uint32_t;
+
+pub const kCGWindowListOptionAll:              CGWindowListOption    = 0;
+pub const kCGWindowListOptionOnScreenOnly:     CGWindowListOption    = 1 << 0;
+pub const kCGWindowListOptionOnScreenAboveWindow: CGWindowListOption = 1 << 1;
+pub const kCGWindowListOptionOnScreenBelowWindow: CGWindowListOption = 1 << 2;
+pub const kCGWindowListOptionIncludingWindow:  CGWindowListOption    = 1 << 3;
+pub const kCGWindowListExcludeDesktopElements: CGWindowListOption    = 1 << 4;
+
+pub type CGWindowImageOption = libc::uint32_t;
+
+pub const kCGWindowImageDefault: CGWindowImageOption = 0;
+pub const kCGWindowImageBoundsIgnoreFraming: CGWindowImageOption = 1 << 0;
+pub const kCGWindowImageShouldBeOpaque: CGWindowImageOption = 1 << 1;
+pub const kCGWindowImageOnlyShadows: CGWindowImageOption = 1 << 2;
+pub const kCGWindowImageBestResolution: CGWindowImageOption = 1 << 3;
+pub const kCGWindowImageNominalResolution: CGWindowImageOption = 1 << 4;
+
+pub const kDisplayModeValidFlag: u32               = 0x00000001;
+pub const kDisplayModeSafeFlag: u32                = 0x00000002;
+pub const kDisplayModeDefaultFlag: u32             = 0x00000004;
+pub const kDisplayModeAlwaysShowFlag: u32          = 0x00000008;
+pub const kDisplayModeNeverShowFlag: u32           = 0x00000080;
+pub const kDisplayModeNotResizeFlag: u32           = 0x00000010;
+pub const kDisplayModeRequiresPanFlag: u32         = 0x00000020;
+pub const kDisplayModeInterlacedFlag: u32          = 0x00000040;
+pub const kDisplayModeSimulscanFlag: u32           = 0x00000100;
+pub const kDisplayModeBuiltInFlag: u32             = 0x00000400;
+pub const kDisplayModeNotPresetFlag: u32           = 0x00000200;
+pub const kDisplayModeStretchedFlag: u32           = 0x00000800;
+pub const kDisplayModeNotGraphicsQualityFlag: u32  = 0x00001000;
+pub const kDisplayModeValidateAgainstDisplay: u32  = 0x00002000;
+pub const kDisplayModeTelevisionFlag: u32          = 0x00100000;
+pub const kDisplayModeValidForMirroringFlag: u32   = 0x00200000;
+pub const kDisplayModeAcceleratorBackedFlag: u32   = 0x00400000;
+pub const kDisplayModeValidForHiResFlag: u32       = 0x00800000;
+pub const kDisplayModeValidForAirPlayFlag: u32     = 0x01000000;
+pub const kDisplayModeNativeFlag: u32              = 0x02000000;
+
+pub const kDisplayModeSafetyFlags: u32             = 0x00000007;
+
+pub const IO1BitIndexedPixels: &str =     "P";
+pub const IO2BitIndexedPixels: &str =     "PP";
+pub const IO4BitIndexedPixels: &str =     "PPPP";
+pub const IO8BitIndexedPixels: &str =     "PPPPPPPP";
+pub const IO16BitDirectPixels: &str =     "-RRRRRGGGGGBBBBB";
+pub const IO32BitDirectPixels: &str =     "--------RRRRRRRRGGGGGGGGBBBBBBBB";
+pub const kIO30BitDirectPixels: &str =    "--RRRRRRRRRRGGGGGGGGGGBBBBBBBBBB";
+pub const kIO64BitDirectPixels: &str =    "-16R16G16B16";
+pub const kIO16BitFloatPixels: &str =     "-16FR16FG16FB16";
+pub const kIO32BitFloatPixels: &str =     "-32FR32FG32FB32";
+pub const IOYUV422Pixels: &str =          "Y4U2V2";
+pub const IO8BitOverlayPixels: &str =     "O8";
+
+
+pub use core_foundation::dictionary::{ CFDictionary, CFDictionaryRef, CFDictionaryGetValueIfPresent };
+pub use core_foundation::array::{ CFArray, CFArrayRef };
+pub use core_foundation::array::{ CFArrayGetCount, CFArrayGetValueAtIndex };
+pub use core_foundation::base::{  CFIndex, CFRelease, CFTypeRef };
+
+pub type CGDisplayConfigRef = *mut libc::c_void;
+
+#[repr(u32)]
+#[derive(Clone, Copy)]
+pub enum CGConfigureOption {
+    ConfigureForAppOnly = 0,
+    ConfigureForSession = 1,
+    ConfigurePermanently = 2,
+}
+
+#[derive(Copy, Clone, Debug)]
+pub struct CGDisplay {
+    pub id: CGDirectDisplayID,
+}
+
+foreign_type! {
+    #[doc(hidden)]
+    type CType = ::sys::CGDisplayMode;
+    fn drop = CGDisplayModeRelease;
+    fn clone = |p| CFRetain(p as *const _) as *mut _;
+    pub struct CGDisplayMode;
+    pub struct CGDisplayModeRef;
+}
+
+impl CGDisplay {
+    #[inline]
+    pub fn new(id: CGDirectDisplayID) -> CGDisplay {
+        CGDisplay { id: id }
+    }
+
+    /// Returns the the main display.
+    #[inline]
+    pub fn main() -> CGDisplay {
+        CGDisplay::new(unsafe { CGMainDisplayID() })
+    }
+
+    /// Returns the bounds of a display in the global display coordinate space.
+    #[inline]
+    pub fn bounds(&self) -> CGRect {
+        unsafe { CGDisplayBounds(self.id) }
+    }
+
+    /// Returns information about a display's current configuration.
+    #[inline]
+    pub fn display_mode(&self) -> Option<CGDisplayMode> {
+        unsafe {
+            let mode_ref = CGDisplayCopyDisplayMode(self.id);
+            if !mode_ref.is_null() {
+                Some(CGDisplayMode::from_ptr(mode_ref))
+            } else {
+                None
+            }
+        }
+    }
+
+    /// Begins a new set of display configuration changes.
+    pub fn begin_configuration(&self) -> Result<CGDisplayConfigRef, CGError> {
+        unsafe {
+            let mut config_ref: CGDisplayConfigRef = ptr::null_mut();
+            let result = CGBeginDisplayConfiguration(&mut config_ref);
+            if result == 0 {
+                Ok(config_ref)
+            } else {
+                Err(result)
+            }
+        }
+    }
+
+    /// Cancels a set of display configuration changes.
+    pub fn cancel_configuration(&self, config_ref: &CGDisplayConfigRef) -> Result<(), CGError> {
+        let result = unsafe { CGCancelDisplayConfiguration(*config_ref) };
+        if result == 0 {
+            Ok(())
+        } else {
+            Err(result)
+        }
+    }
+
+    /// Completes a set of display configuration changes.
+    pub fn complete_configuration(
+        &self,
+        config_ref: &CGDisplayConfigRef,
+        option: CGConfigureOption,
+    ) -> Result<(), CGError> {
+        let result = unsafe { CGCompleteDisplayConfiguration(*config_ref, option) };
+        if result == 0 {
+            Ok(())
+        } else {
+            Err(result)
+        }
+    }
+
+    /// Configures the display mode of a display.
+    pub fn configure_display_with_display_mode(
+        &self,
+        config_ref: &CGDisplayConfigRef,
+        display_mode: &CGDisplayMode,
+    ) -> Result<(), CGError> {
+        let result = unsafe {
+            CGConfigureDisplayWithDisplayMode(
+                *config_ref,
+                self.id,
+                display_mode.as_ptr(),
+                ptr::null(),
+            )
+        };
+        if result == 0 {
+            Ok(())
+        } else {
+            Err(result)
+        }
+    }
+
+    /// Returns an image containing the contents of the specified display.
+    #[inline]
+    pub fn image(&self) -> Option<CGImage> {
+        unsafe {
+            let image_ref = CGDisplayCreateImage(self.id);
+            if !image_ref.is_null() {
+                Some(CGImage::from_ptr(image_ref))
+            } else {
+                None
+            }
+        }
+    }
+
+    /// Returns a composite image based on a dynamically generated list of
+    /// windows.
+    #[inline]
+    pub fn screenshot(
+        bounds: CGRect,
+        list_option: CGWindowListOption,
+        window_id: CGWindowID,
+        image_option: CGWindowImageOption,
+    ) -> Option<CGImage> {
+        unsafe {
+            let image_ref = CGWindowListCreateImage(bounds, list_option, window_id, image_option);
+            if !image_ref.is_null() {
+                Some(CGImage::from_ptr(image_ref))
+            } else {
+                None
+            }
+        }
+    }
+
+    /// Returns a composite image of the specified windows.
+    #[inline]
+    pub fn screenshot_from_windows(
+        bounds: CGRect,
+        windows: CFArray,
+        image_option: CGWindowImageOption,
+    ) -> Option<CGImage> {
+        unsafe {
+            let image_ref = CGWindowListCreateImageFromArray(
+                bounds,
+                windows.as_concrete_TypeRef(),
+                image_option,
+            );
+            if !image_ref.is_null() {
+                Some(CGImage::from_ptr(image_ref))
+            } else {
+                None
+            }
+        }
+    }
+
+    /// Generates and returns information about the selected windows in the
+    /// current user session.
+    pub fn window_list_info(
+        option: CGWindowListOption,
+        relative_to_window: Option<CGWindowID>,
+    ) -> Option<CFArray> {
+        let relative_to_window = relative_to_window.unwrap_or(kCGNullWindowID);
+        let array_ref = unsafe { CGWindowListCopyWindowInfo(option, relative_to_window) };
+        if array_ref != ptr::null() {
+            Some(unsafe { TCFType::wrap_under_create_rule(array_ref) })
+        } else {
+            None
+        }
+    }
+
+    /// Returns a Boolean value indicating whether a display is active.
+    #[inline]
+    pub fn is_active(&self) -> bool {
+        unsafe { CGDisplayIsActive(self.id) != 0 }
+    }
+
+    /// Returns a boolean indicating whether a display is always in a
+    /// mirroring set.
+    #[inline]
+    pub fn is_always_in_mirror_set(&self) -> bool {
+        unsafe { CGDisplayIsAlwaysInMirrorSet(self.id) != 0 }
+    }
+
+    /// Returns a boolean indicating whether a display is sleeping (and is
+    /// therefore not drawable.)
+    #[inline]
+    pub fn is_asleep(&self) -> bool {
+        unsafe { CGDisplayIsAsleep(self.id) != 0 }
+    }
+
+    /// Returns a boolean indicating whether a display is built-in, such as
+    /// the internal display in portable systems.
+    #[inline]
+    pub fn is_builtin(&self) -> bool {
+        unsafe { CGDisplayIsBuiltin(self.id) != 0 }
+    }
+
+    /// Returns a boolean indicating whether a display is in a hardware
+    /// mirroring set.
+    #[inline]
+    pub fn is_in_hw_mirror_set(&self) -> bool {
+        unsafe { CGDisplayIsInHWMirrorSet(self.id) != 0 }
+    }
+
+    /// Returns a boolean indicating whether a display is in a mirroring set.
+    #[inline]
+    pub fn is_in_mirror_set(&self) -> bool {
+        unsafe { CGDisplayIsInMirrorSet(self.id) != 0 }
+    }
+
+    /// Returns a boolean indicating whether a display is the main display.
+    #[inline]
+    pub fn is_main(&self) -> bool {
+        unsafe { CGDisplayIsMain(self.id) != 0 }
+    }
+
+    /// Returns a boolean indicating whether a display is connected or online.
+    #[inline]
+    pub fn is_online(&self) -> bool {
+        unsafe { CGDisplayIsOnline(self.id) != 0 }
+    }
+
+    /// Returns a boolean indicating whether Quartz is using OpenGL-based
+    /// window acceleration (Quartz Extreme) to render in a display.
+    #[inline]
+    pub fn uses_open_gl_acceleration(&self) -> bool {
+        unsafe { CGDisplayUsesOpenGLAcceleration(self.id) != 0 }
+    }
+
+    /// Returns a boolean indicating whether a display is running in a stereo
+    /// graphics mode.
+    #[inline]
+    pub fn is_stereo(&self) -> bool {
+        unsafe { CGDisplayIsStereo(self.id) != 0 }
+    }
+
+    /// For a secondary display in a mirroring set, returns the primary
+    /// display.
+    #[inline]
+    pub fn mirrors_display(&self) -> CGDirectDisplayID {
+        unsafe { CGDisplayMirrorsDisplay(self.id) }
+    }
+
+    /// Returns the primary display in a hardware mirroring set.
+    #[inline]
+    pub fn primary_display(&self) -> CGDirectDisplayID {
+        unsafe { CGDisplayPrimaryDisplay(self.id) }
+    }
+
+    /// Returns the rotation angle of a display in degrees.
+    #[inline]
+    pub fn rotation(&self) -> f64 {
+        unsafe { CGDisplayRotation(self.id) }
+    }
+
+    /// Returns the width and height of a display in millimeters.
+    #[inline]
+    pub fn screen_size(&self) -> CGSize {
+        unsafe { CGDisplayScreenSize(self.id) }
+    }
+
+    /// Returns the serial number of a display monitor.
+    #[inline]
+    pub fn serial_number(&self) -> u32 {
+        unsafe { CGDisplaySerialNumber(self.id) }
+    }
+
+    /// Returns the logical unit number of a display.
+    #[inline]
+    pub fn unit_number(&self) -> u32 {
+        unsafe { CGDisplayUnitNumber(self.id) }
+    }
+
+    /// Returns the vendor number of the specified display's monitor.
+    #[inline]
+    pub fn vendor_number(&self) -> u32 {
+        unsafe { CGDisplayVendorNumber(self.id) }
+    }
+
+    /// Returns the model number of a display monitor.
+    #[inline]
+    pub fn model_number(&self) -> u32 {
+        unsafe { CGDisplayModelNumber(self.id) }
+    }
+
+    /// Returns the display height in pixel units.
+    #[inline]
+    pub fn pixels_high(&self) -> u64 {
+        unsafe { CGDisplayPixelsHigh(self.id) as u64 }
+    }
+
+    /// Returns the display width in pixel units.
+    #[inline]
+    pub fn pixels_wide(&self) -> u64 {
+        unsafe { CGDisplayPixelsWide(self.id) as u64 }
+    }
+
+    /// Provides a list of displays that are active (or drawable).
+    #[inline]
+    pub fn active_displays() -> Result<Vec<CGDirectDisplayID>, CGError> {
+        let count = try!(CGDisplay::active_display_count());
+        let mut buf: Vec<CGDirectDisplayID> = vec![0; count as usize];
+        let result =
+            unsafe { CGGetActiveDisplayList(count as u32, buf.as_mut_ptr(), ptr::null_mut()) };
+        if result == 0 {
+            Ok(buf)
+        } else {
+            Err(result)
+        }
+    }
+
+    /// Provides count of displays that are active (or drawable).
+    #[inline]
+    pub fn active_display_count() -> Result<u32, CGError> {
+        let mut count: libc::uint32_t = 0;
+        let result = unsafe { CGGetActiveDisplayList(0, ptr::null_mut(), &mut count) };
+        if result == 0 {
+            Ok(count as u32)
+        } else {
+            Err(result)
+        }
+    }
+
+    /// Hides the mouse cursor, and increments the hide cursor count.
+    #[inline]
+    pub fn hide_cursor(&self) -> Result<(), CGError> {
+        let result = unsafe { CGDisplayHideCursor(self.id) };
+        if result == 0 {
+            Ok(())
+        } else {
+            Err(result)
+        }
+    }
+
+    /// Decrements the hide cursor count, and shows the mouse cursor if the
+    /// count is 0.
+    #[inline]
+    pub fn show_cursor(&self) -> Result<(), CGError> {
+        let result = unsafe { CGDisplayShowCursor(self.id) };
+        if result == 0 {
+            Ok(())
+        } else {
+            Err(result)
+        }
+    }
+
+    /// Moves the mouse cursor to a specified point relative to the display
+    /// origin (the upper-left corner of the display).
+    #[inline]
+    pub fn move_cursor_to_point(&self, point: CGPoint) -> Result<(), CGError> {
+        let result = unsafe { CGDisplayMoveCursorToPoint(self.id, point) };
+        if result == 0 {
+            Ok(())
+        } else {
+            Err(result)
+        }
+    }
+
+    /// Moves the mouse cursor without generating events.
+    #[inline]
+    pub fn warp_mouse_cursor_position(point: CGPoint) -> Result<(), CGError> {
+        let result = unsafe { CGWarpMouseCursorPosition(point) };
+        if result == 0 {
+            Ok(())
+        } else {
+            Err(result)
+        }
+    }
+
+    /// Connects or disconnects the mouse and cursor while an application is
+    /// in the foreground.
+    #[inline]
+    pub fn associate_mouse_and_mouse_cursor_position(connected: bool) -> Result<(), CGError> {
+        let result = unsafe { CGAssociateMouseAndMouseCursorPosition(connected as boolean_t) };
+        if result == 0 {
+            Ok(())
+        } else {
+            Err(result)
+        }
+    }
+}
+
+impl CGDisplayMode {
+    /// Returns all display modes for the specified display id.
+    pub fn all_display_modes(
+        display_id: CGDirectDisplayID,
+        options: CFDictionaryRef,
+    ) -> Option<Vec<CGDisplayMode>> {
+        let array_opt: Option<CFArray> = unsafe {
+            let array_ref = CGDisplayCopyAllDisplayModes(display_id, options);
+            if array_ref != ptr::null() {
+                Some(CFArray::wrap_under_create_rule(array_ref))
+            } else {
+                None
+            }
+        };
+        match array_opt {
+            Some(modes) => {
+                let vec: Vec<CGDisplayMode> = modes
+                    .into_iter()
+                    .map(|value0| {
+                        let x = *value0.deref() as *mut ::sys::CGDisplayMode;
+                        unsafe { CGDisplayMode::from_ptr(x) }
+                    }).collect();
+                Some(vec)
+            }
+            None => None,
+        }
+    }
+
+    /// Returns the height of the specified display mode.
+    #[inline]
+    pub fn height(&self) -> u64 {
+        unsafe { CGDisplayModeGetHeight(self.as_ptr()) as u64 }
+    }
+
+    /// Returns the width of the specified display mode.
+    #[inline]
+    pub fn width(&self) -> u64 {
+        unsafe { CGDisplayModeGetWidth(self.as_ptr()) as u64 }
+    }
+
+    /// Returns the pixel height of the specified display mode.
+    #[inline]
+    pub fn pixel_height(&self) -> u64 {
+        unsafe { CGDisplayModeGetPixelHeight(self.as_ptr()) as u64 }
+    }
+
+    /// Returns the pixel width of the specified display mode.
+    #[inline]
+    pub fn pixel_width(&self) -> u64 {
+        unsafe { CGDisplayModeGetPixelWidth(self.as_ptr()) as u64 }
+    }
+
+    #[inline]
+    pub fn refresh_rate(&self) -> f64 {
+        unsafe { CGDisplayModeGetRefreshRate(self.as_ptr()) }
+    }
+
+    /// Returns the I/O Kit flags of the specified display mode.
+    #[inline]
+    pub fn io_flags(&self) -> u32 {
+        unsafe { CGDisplayModeGetIOFlags(self.as_ptr()) as u32 }
+    }
+
+    /// Returns the pixel encoding of the specified display mode.
+    #[inline]
+    pub fn pixel_encoding(&self) -> CFString {
+        unsafe { CFString::wrap_under_create_rule(CGDisplayModeCopyPixelEncoding(self.as_ptr())) }
+    }
+
+    /// Returns the number of bits per pixel of the specified display mode.
+    pub fn bit_depth(&self) -> usize {
+        let pixel_encoding = self.pixel_encoding().to_string();
+        // my numerical representation for kIO16BitFloatPixels and kIO32bitFloatPixels
+        // are made up and possibly non-sensical
+        if pixel_encoding.eq_ignore_ascii_case(kIO32BitFloatPixels) {
+            96
+        } else if pixel_encoding.eq_ignore_ascii_case(kIO64BitDirectPixels) {
+            64
+        } else if pixel_encoding.eq_ignore_ascii_case(kIO16BitFloatPixels) {
+            48
+        } else if pixel_encoding.eq_ignore_ascii_case(IO32BitDirectPixels) {
+            32
+        } else if pixel_encoding.eq_ignore_ascii_case(kIO30BitDirectPixels) {
+            30
+        } else if pixel_encoding.eq_ignore_ascii_case(IO16BitDirectPixels) {
+            16
+        } else if pixel_encoding.eq_ignore_ascii_case(IO8BitIndexedPixels) {
+            8
+        }else{
+            0
+        }
+    }
+}
+
+#[link(name = "CoreGraphics", kind = "framework")]
+extern "C" {
+    pub static CGRectNull: CGRect;
+    pub static CGRectInfinite: CGRect;
+
+    pub static kCGDisplayShowDuplicateLowResolutionModes: CFStringRef;
+
+    pub fn CGDisplayModeRelease(mode: ::sys::CGDisplayModeRef);
+
+    pub fn CGMainDisplayID() -> CGDirectDisplayID;
+    pub fn CGDisplayIsActive(display: CGDirectDisplayID) -> boolean_t;
+    pub fn CGDisplayIsAlwaysInMirrorSet(display: CGDirectDisplayID) -> boolean_t;
+    pub fn CGDisplayIsAsleep(display: CGDirectDisplayID) -> boolean_t;
+    pub fn CGDisplayIsBuiltin(display: CGDirectDisplayID) -> boolean_t;
+    pub fn CGDisplayIsInHWMirrorSet(display: CGDirectDisplayID) -> boolean_t;
+    pub fn CGDisplayIsInMirrorSet(display: CGDirectDisplayID) -> boolean_t;
+    pub fn CGDisplayIsMain(display: CGDirectDisplayID) -> boolean_t;
+    pub fn CGDisplayIsOnline(display: CGDirectDisplayID) -> boolean_t;
+    pub fn CGDisplayIsStereo(display: CGDirectDisplayID) -> boolean_t;
+    pub fn CGDisplayMirrorsDisplay(display: CGDirectDisplayID) -> CGDirectDisplayID;
+    pub fn CGDisplayPrimaryDisplay(display: CGDirectDisplayID) -> CGDirectDisplayID;
+    pub fn CGDisplayRotation(display: CGDirectDisplayID) -> libc::c_double;
+    pub fn CGDisplayScreenSize(display: CGDirectDisplayID) -> CGSize;
+    pub fn CGDisplaySerialNumber(display: CGDirectDisplayID) -> libc::uint32_t;
+    pub fn CGDisplayUnitNumber(display: CGDirectDisplayID) -> libc::uint32_t;
+    pub fn CGDisplayUsesOpenGLAcceleration(display: CGDirectDisplayID) -> boolean_t;
+    pub fn CGDisplayVendorNumber(display: CGDirectDisplayID) -> libc::uint32_t;
+    pub fn CGGetActiveDisplayList(
+        max_displays: libc::uint32_t,
+        active_displays: *mut CGDirectDisplayID,
+        display_count: *mut libc::uint32_t,
+    ) -> CGError;
+    pub fn CGGetDisplaysWithRect(
+        rect: CGRect,
+        max_displays: libc::uint32_t,
+        displays: *mut CGDirectDisplayID,
+        matching_display_count: *mut libc::uint32_t,
+    ) -> CGError;
+    pub fn CGDisplayModelNumber(display: CGDirectDisplayID) -> libc::uint32_t;
+    pub fn CGDisplayPixelsHigh(display: CGDirectDisplayID) -> libc::size_t;
+    pub fn CGDisplayPixelsWide(display: CGDirectDisplayID) -> libc::size_t;
+    pub fn CGDisplayBounds(display: CGDirectDisplayID) -> CGRect;
+    pub fn CGDisplayCreateImage(display: CGDirectDisplayID) -> ::sys::CGImageRef;
+
+    pub fn CGBeginDisplayConfiguration(config: *const CGDisplayConfigRef) -> CGError;
+    pub fn CGCancelDisplayConfiguration(config: CGDisplayConfigRef) -> CGError;
+    pub fn CGCompleteDisplayConfiguration(
+        config: CGDisplayConfigRef,
+        option: CGConfigureOption,
+    ) -> CGError;
+    pub fn CGConfigureDisplayWithDisplayMode(
+        config: CGDisplayConfigRef,
+        display: CGDirectDisplayID,
+        mode: ::sys::CGDisplayModeRef,
+        options: CFDictionaryRef,
+    ) -> CGError;
+
+    pub fn CGDisplayCopyDisplayMode(display: CGDirectDisplayID) -> ::sys::CGDisplayModeRef;
+    pub fn CGDisplayModeGetHeight(mode: ::sys::CGDisplayModeRef) -> libc::size_t;
+    pub fn CGDisplayModeGetWidth(mode: ::sys::CGDisplayModeRef) -> libc::size_t;
+    pub fn CGDisplayModeGetPixelHeight(mode: ::sys::CGDisplayModeRef) -> libc::size_t;
+    pub fn CGDisplayModeGetPixelWidth(mode: ::sys::CGDisplayModeRef) -> libc::size_t;
+    pub fn CGDisplayModeGetRefreshRate(mode: ::sys::CGDisplayModeRef) -> libc::c_double;
+    pub fn CGDisplayModeGetIOFlags(mode: ::sys::CGDisplayModeRef) -> libc::uint32_t;
+    pub fn CGDisplayModeCopyPixelEncoding(mode: ::sys::CGDisplayModeRef) -> CFStringRef;
+
+    pub fn CGDisplayCopyAllDisplayModes(
+        display: CGDirectDisplayID,
+        options: CFDictionaryRef,
+    ) -> CFArrayRef;
+
+    // mouse stuff
+    pub fn CGDisplayHideCursor(display: CGDirectDisplayID) -> CGError;
+    pub fn CGDisplayShowCursor(display: CGDirectDisplayID) -> CGError;
+    pub fn CGDisplayMoveCursorToPoint(display: CGDirectDisplayID, point: CGPoint) -> CGError;
+    pub fn CGWarpMouseCursorPosition(point: CGPoint) -> CGError;
+    pub fn CGAssociateMouseAndMouseCursorPosition(connected: boolean_t) -> CGError;
+
+    // Window Services Reference
+    pub fn CGWindowListCopyWindowInfo(
+        option: CGWindowListOption,
+        relativeToWindow: CGWindowID,
+    ) -> CFArrayRef;
+    pub fn CGWindowListCreateImage(
+        screenBounds: CGRect,
+        listOptions: CGWindowListOption,
+        windowId: CGWindowID,
+        imageOptions: CGWindowImageOption,
+    ) -> ::sys::CGImageRef;
+    pub fn CGWindowListCreateImageFromArray(
+        screenBounds: CGRect,
+        windowArray: CFArrayRef,
+        imageOptions: CGWindowImageOption,
+    ) -> ::sys::CGImageRef;
+}
diff --git a/third_party/rust_crates/vendor/core-graphics/src/event.rs b/third_party/rust_crates/vendor/core-graphics/src/event.rs
new file mode 100644
index 0000000..9d9ca18
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/event.rs
@@ -0,0 +1,669 @@
+#![allow(non_upper_case_globals)]
+
+use core_foundation::base::{CFRelease, CFRetain, CFTypeID};
+use geometry::CGPoint;
+use event_source::CGEventSource;
+
+use libc;
+
+use foreign_types::ForeignType;
+
+pub type CGEventField = libc::uint32_t;
+pub type CGKeyCode = libc::uint16_t;
+pub type CGScrollEventUnit = libc::uint32_t;
+
+/// Flags for events
+///
+/// [Ref](http://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-700/IOHIDSystem/IOKit/hidsystem/IOLLEvent.h)
+bitflags! {
+    #[repr(C)]
+    pub struct CGEventFlags: u64 {
+        const CGEventFlagNull = 0;
+
+        // Device-independent modifier key bits.
+        const CGEventFlagAlphaShift = 0x00010000;
+        const CGEventFlagShift = 0x00020000;
+        const CGEventFlagControl = 0x00040000;
+        const CGEventFlagAlternate = 0x00080000;
+        const CGEventFlagCommand = 0x00100000;
+
+        // Special key identifiers.
+        const CGEventFlagHelp = 0x00400000;
+        const CGEventFlagSecondaryFn = 0x00800000;
+
+        // Identifies key events from numeric keypad area on extended keyboards.
+        const CGEventFlagNumericPad = 0x00200000;
+
+        // Indicates if mouse/pen movement events are not being coalesced
+        const CGEventFlagNonCoalesced = 0x00000100;
+    }
+}
+
+/// Key codes for keys that are independent of keyboard layout.
+///
+/// [Ref](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX10.13.sdk/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Events.h)
+#[repr(C)]
+pub struct KeyCode;
+impl KeyCode {
+    pub const RETURN: CGKeyCode = 0x24;
+    pub const TAB: CGKeyCode = 0x30;
+    pub const SPACE: CGKeyCode = 0x31;
+    pub const DELETE: CGKeyCode = 0x33;
+    pub const ESCAPE: CGKeyCode = 0x35;
+    pub const COMMAND: CGKeyCode = 0x37;
+    pub const SHIFT: CGKeyCode = 0x38;
+    pub const CAPS_LOCK: CGKeyCode = 0x39;
+    pub const OPTION: CGKeyCode = 0x3A;
+    pub const CONTROL: CGKeyCode = 0x3B;
+    pub const RIGHT_COMMAND: CGKeyCode = 0x36;
+    pub const RIGHT_SHIFT: CGKeyCode = 0x3C;
+    pub const RIGHT_OPTION: CGKeyCode = 0x3D;
+    pub const RIGHT_CONTROL: CGKeyCode = 0x3E;
+    pub const FUNCTION: CGKeyCode = 0x3F;
+    pub const VOLUME_UP: CGKeyCode = 0x48;
+    pub const VOLUME_DOWN: CGKeyCode = 0x49;
+    pub const MUTE: CGKeyCode = 0x4A;
+    pub const F1: CGKeyCode = 0x7A;
+    pub const F2: CGKeyCode = 0x78;
+    pub const F3: CGKeyCode = 0x63;
+    pub const F4: CGKeyCode = 0x76;
+    pub const F5: CGKeyCode = 0x60;
+    pub const F6: CGKeyCode = 0x61;
+    pub const F7: CGKeyCode = 0x62;
+    pub const F8: CGKeyCode = 0x64;
+    pub const F9: CGKeyCode = 0x65;
+    pub const F10: CGKeyCode = 0x6D;
+    pub const F11: CGKeyCode = 0x67;
+    pub const F12: CGKeyCode = 0x6F;
+    pub const F13: CGKeyCode = 0x69;
+    pub const F14: CGKeyCode = 0x6B;
+    pub const F15: CGKeyCode = 0x71;
+    pub const F16: CGKeyCode = 0x6A;
+    pub const F17: CGKeyCode = 0x40;
+    pub const F18: CGKeyCode = 0x4F;
+    pub const F19: CGKeyCode = 0x50;
+    pub const F20: CGKeyCode = 0x5A;
+    pub const HELP: CGKeyCode = 0x72;
+    pub const HOME: CGKeyCode = 0x73;
+    pub const PAGE_UP: CGKeyCode = 0x74;
+    pub const FORWARD_DELETE: CGKeyCode = 0x75;
+    pub const END: CGKeyCode = 0x77;
+    pub const PAGE_DOWN: CGKeyCode = 0x79;
+    pub const LEFT_ARROW: CGKeyCode = 0x7B;
+    pub const RIGHT_ARROW: CGKeyCode = 0x7C;
+    pub const DOWN_ARROW: CGKeyCode = 0x7D;
+    pub const UP_ARROW: CGKeyCode = 0x7E;
+}
+
+#[repr(C)]
+pub struct ScrollEventUnit {}
+impl ScrollEventUnit {
+    pub const PIXEL: CGScrollEventUnit = 0;
+    pub const LINE: CGScrollEventUnit = 1;
+}
+
+/// Constants that specify the different types of input events.
+///
+/// [Ref](http://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-700/IOHIDSystem/IOKit/hidsystem/IOLLEvent.h)
+#[repr(C)]
+#[derive(Clone, Copy, Debug)]
+pub enum CGEventType {
+    Null = 0,
+
+    // Mouse events.
+    LeftMouseDown = 1,
+    LeftMouseUp = 2,
+    RightMouseDown = 3,
+    RightMouseUp = 4,
+    MouseMoved = 5,
+    LeftMouseDragged = 6,
+    RightMouseDragged = 7,
+
+    // Keyboard events.
+    KeyDown = 10,
+    KeyUp = 11,
+    FlagsChanged = 12,
+
+    // Specialized control devices.
+    ScrollWheel = 22,
+    TabletPointer = 23,
+    TabletProximity = 24,
+    OtherMouseDown = 25,
+    OtherMouseUp = 26,
+    OtherMouseDragged = 27,
+
+    // Out of band event types. These are delivered to the event tap callback
+    // to notify it of unusual conditions that disable the event tap.
+    TapDisabledByTimeout = 0xFFFFFFFE,
+    TapDisabledByUserInput = 0xFFFFFFFF,
+}
+
+/// Constants used as keys to access specialized fields in low-level events.
+///
+/// [Ref](https://developer.apple.com/documentation/coregraphics/cgeventfield)
+pub struct EventField;
+impl EventField {
+    /// Key to access an integer field that contains the mouse button event
+    /// number. Matching mouse-down and mouse-up events will have the same
+    /// event number.
+    pub const MOUSE_EVENT_NUMBER: CGEventField = 0;
+
+    /// Key to access an integer field that contains the mouse button click
+    /// state. A click state of 1 represents a single click. A click state of
+    /// 2 represents a double-click. A click state of 3 represents a
+    /// triple-click.
+    pub const MOUSE_EVENT_CLICK_STATE: CGEventField = 1;
+
+    /// Key to access a double field that contains the mouse button pressure.
+    /// The pressure value may range from 0 to 1, with 0 representing the
+    /// mouse being up. This value is commonly set by tablet pens mimicking a
+    /// mouse.
+    pub const MOUSE_EVENT_PRESSURE: CGEventField = 2;
+
+    /// Key to access an integer field that contains the mouse button number.
+    pub const MOUSE_EVENT_BUTTON_NUMBER: CGEventField = 3;
+
+    /// Key to access an integer field that contains the horizontal mouse
+    /// delta since the last mouse movement event.
+    pub const MOUSE_EVENT_DELTA_X: CGEventField = 4;
+
+    /// Key to access an integer field that contains the vertical mouse delta
+    /// since the last mouse movement event.
+    pub const MOUSE_EVENT_DELTA_Y: CGEventField = 5;
+
+    /// Key to access an integer field. The value is non-zero if the event
+    /// should be ignored by the Inkwell subsystem.
+    pub const MOUSE_EVENT_INSTANT_MOUSER: CGEventField = 6;
+
+    /// Key to access an integer field that encodes the mouse event subtype as
+    /// a `kCFNumberIntType'.
+    pub const MOUSE_EVENT_SUB_TYPE: CGEventField = 7;
+
+    /// Key to access an integer field, non-zero when this is an autorepeat of
+    /// a key-down, and zero otherwise.
+    pub const KEYBOARD_EVENT_AUTOREPEAT: CGEventField = 8;
+
+    /// Key to access an integer field that contains the virtual keycode of the
+    /// key-down or key-up event.
+    pub const KEYBOARD_EVENT_KEYCODE: CGEventField = 9;
+
+    /// Key to access an integer field that contains the keyboard type
+    /// identifier.
+    pub const KEYBOARD_EVENT_KEYBOARD_TYPE: CGEventField = 10;
+
+    /// Key to access an integer field that contains scrolling data. This field
+    /// typically contains the change in vertical position since the last
+    /// scrolling event from a Mighty Mouse scroller or a single-wheel mouse
+    /// scroller.
+    pub const SCROLL_WHEEL_EVENT_DELTA_AXIS_1: CGEventField = 11;
+
+    /// Key to access an integer field that contains scrolling data. This field
+    /// typically contains the change in horizontal position since the last
+    /// scrolling event from a Mighty Mouse scroller.
+    pub const SCROLL_WHEEL_EVENT_DELTA_AXIS_2: CGEventField = 12;
+
+    /// Key to access a field that contains scrolling data. The scrolling data
+    /// represents a line-based or pixel-based change in vertical position
+    /// since the last scrolling event from a Mighty Mouse scroller or a
+    /// single-wheel mouse scroller. The scrolling data uses a fixed-point
+    /// 16.16 signed integer format. If this key is passed to
+    /// `CGEventGetDoubleValueField', the fixed-point value is converted to a
+    /// double value.
+    pub const SCROLL_WHEEL_EVENT_FIXED_POINT_DELTA_AXIS_1: CGEventField = 93;
+
+    /// Key to access a field that contains scrolling data. The scrolling data
+    /// represents a line-based or pixel-based change in horizontal position
+    /// since the last scrolling event from a Mighty Mouse scroller. The
+    /// scrolling data uses a fixed-point 16.16 signed integer format. If this
+    /// key is passed to `CGEventGetDoubleValueField', the fixed-point value is
+    /// converted to a double value.
+    pub const SCROLL_WHEEL_EVENT_FIXED_POINT_DELTA_AXIS_2: CGEventField = 94;
+
+    /// Key to access an integer field that contains pixel-based scrolling
+    /// data. The scrolling data represents the change in vertical position
+    /// since the last scrolling event from a Mighty Mouse scroller or a
+    /// single-wheel mouse scroller.
+    pub const SCROLL_WHEEL_EVENT_POINT_DELTA_AXIS_1: CGEventField = 96;
+
+    /// Key to access an integer field that contains pixel-based scrolling
+    /// data. The scrolling data represents the change in horizontal position
+    /// since the last scrolling event from a Mighty Mouse scroller.
+    pub const SCROLL_WHEEL_EVENT_POINT_DELTA_AXIS_2: CGEventField = 97;
+
+    /// Key to access an integer field that indicates whether the event should
+    /// be ignored by the Inkwell subsystem. If the value is non-zero, the
+    /// event should be ignored.
+    pub const SCROLL_WHEEL_EVENT_INSTANT_MOUSER: CGEventField = 14;
+
+    /// Key to access an integer field that contains the absolute X coordinate
+    /// in tablet space at full tablet resolution.
+    pub const TABLET_EVENT_POINT_X: CGEventField = 15;
+
+    /// Key to access an integer field that contains the absolute Y coordinate
+    /// in tablet space at full tablet resolution.
+    pub const TABLET_EVENT_POINT_Y: CGEventField = 16;
+
+    /// Key to access an integer field that contains the absolute Z coordinate
+    /// in tablet space at full tablet resolution.
+    pub const TABLET_EVENT_POINT_Z: CGEventField = 17;
+
+    /// Key to access an integer field that contains the tablet button state.
+    /// Bit 0 is the first button, and a set bit represents a closed or pressed
+    /// button. Up to 16 buttons are supported.
+    pub const TABLET_EVENT_POINT_BUTTONS: CGEventField = 18;
+
+    /// Key to access a double field that contains the tablet pen pressure. A
+    /// value of 0.0 represents no pressure, and 1.0 represents maximum
+    /// pressure.
+    pub const TABLET_EVENT_POINT_PRESSURE: CGEventField = 19;
+
+    /// Key to access a double field that contains the horizontal tablet pen
+    /// tilt. A value of 0 represents no tilt, and 1 represents maximum tilt.
+    pub const TABLET_EVENT_TILT_X: CGEventField = 20;
+
+    /// Key to access a double field that contains the vertical tablet pen
+    /// tilt. A value of 0 represents no tilt, and 1 represents maximum tilt.
+    pub const TABLET_EVENT_TILT_Y: CGEventField = 21;
+
+    /// Key to access a double field that contains the tablet pen rotation.
+    pub const TABLET_EVENT_ROTATION: CGEventField = 22;
+
+    /// Key to access a double field that contains the tangential pressure on
+    /// the device. A value of 0.0 represents no pressure, and 1.0 represents
+    /// maximum pressure.
+    pub const TABLET_EVENT_TANGENTIAL_PRESSURE: CGEventField = 23;
+
+    /// Key to access an integer field that contains the system-assigned unique
+    /// device ID.
+    pub const TABLET_EVENT_DEVICE_ID: CGEventField = 24;
+
+    /// Key to access an integer field that contains a vendor-specified value.
+    pub const TABLET_EVENT_VENDOR_1: CGEventField = 25;
+
+    /// Key to access an integer field that contains a vendor-specified value.
+    pub const TABLET_EVENT_VENDOR_2: CGEventField = 26;
+
+    /// Key to access an integer field that contains a vendor-specified value.
+    pub const TABLET_EVENT_VENDOR_3: CGEventField = 27;
+
+    /// Key to access an integer field that contains the vendor-defined ID,
+    /// typically the USB vendor ID.
+    pub const TABLET_PROXIMITY_EVENT_VENDOR_ID: CGEventField = 28;
+
+    /// Key to access an integer field that contains the vendor-defined tablet
+    /// ID, typically the USB product ID.
+    pub const TABLET_PROXIMITY_EVENT_TABLET_ID: CGEventField = 29;
+
+    /// Key to access an integer field that contains the vendor-defined ID of
+    /// the pointing device.
+    pub const TABLET_PROXIMITY_EVENT_POINTER_ID: CGEventField = 30;
+
+    /// Key to access an integer field that contains the system-assigned
+    /// device ID.
+    pub const TABLET_PROXIMITY_EVENT_DEVICE_ID: CGEventField = 31;
+
+    /// Key to access an integer field that contains the system-assigned
+    /// unique tablet ID.
+    pub const TABLET_PROXIMITY_EVENT_SYSTEM_TABLET_ID: CGEventField = 32;
+
+    /// Key to access an integer field that contains the vendor-assigned
+    /// pointer type.
+    pub const TABLET_PROXIMITY_EVENT_VENDOR_POINTER_TYPE: CGEventField = 33;
+
+    /// Key to access an integer field that contains the vendor-defined
+    /// pointer serial number.
+    pub const TABLET_PROXIMITY_EVENT_VENDOR_POINTER_SERIAL_NUMBER: CGEventField = 34;
+
+    /// Key to access an integer field that contains the vendor-defined unique
+    /// ID.
+    pub const TABLET_PROXIMITY_EVENT_VENDOR_UNIQUE_ID: CGEventField = 35;
+
+    /// Key to access an integer field that contains the device capabilities
+    /// mask.
+    pub const TABLET_PROXIMITY_EVENT_CAPABILITY_MASK: CGEventField = 36;
+
+    /// Key to access an integer field that contains the pointer type.
+    pub const TABLET_PROXIMITY_EVENT_POINTER_TYPE: CGEventField = 37;
+
+    /// Key to access an integer field that indicates whether the pen is in
+    /// proximity to the tablet. The value is non-zero if the pen is in
+    /// proximity to the tablet and zero when leaving the tablet.
+    pub const TABLET_PROXIMITY_EVENT_ENTER_PROXIMITY: CGEventField = 38;
+
+    /// Key to access a field that contains the event target process serial
+    /// number. The value is a 64-bit value.
+    pub const EVENT_TARGET_PROCESS_SERIAL_NUMBER: CGEventField = 39;
+
+    /// Key to access a field that contains the event target Unix process ID.
+    pub const EVENT_TARGET_UNIX_PROCESS_ID: CGEventField = 40;
+
+    /// Key to access a field that contains the event source Unix process ID.
+    pub const EVENT_SOURCE_UNIX_PROCESS_ID: CGEventField = 41;
+
+    /// Key to access a field that contains the event source user-supplied
+    /// data, up to 64 bits.
+    pub const EVENT_SOURCE_USER_DATA: CGEventField = 42;
+
+    /// Key to access a field that contains the event source Unix effective UID.
+    pub const EVENT_SOURCE_USER_ID: CGEventField = 43;
+
+    /// Key to access a field that contains the event source Unix effective
+    /// GID.
+    pub const EVENT_SOURCE_GROUP_ID: CGEventField = 44;
+
+    /// Key to access a field that contains the event source state ID used to
+    /// create this event.
+    pub const EVENT_SOURCE_STATE_ID: CGEventField = 45;
+
+    /// Key to access an integer field that indicates whether a scrolling event
+    /// contains continuous, pixel-based scrolling data. The value is non-zero
+    /// when the scrolling data is pixel-based and zero when the scrolling data
+    /// is line-based.
+    pub const SCROLL_WHEEL_EVENT_IS_CONTINUOUS: CGEventField = 88;
+
+    /// Added in 10.5; made public in 10.7.
+    pub const MOUSE_EVENT_WINDOW_UNDER_MOUSE_POINTER: CGEventField = 91;
+    pub const MOUSE_EVENT_WINDOW_UNDER_MOUSE_POINTER_THAT_CAN_HANDLE_THIS_EVENT: CGEventField = 92;
+}
+
+// Constants that specify buttons on a one, two, or three-button mouse.
+#[repr(C)]
+#[derive(Clone, Copy, Debug)]
+pub enum CGMouseButton {
+    Left,
+    Right,
+    Center,
+}
+
+/// Possible tapping points for events.
+#[repr(C)]
+#[derive(Clone, Copy, Debug)]
+pub enum CGEventTapLocation {
+    HID,
+    Session,
+    AnnotatedSession,
+}
+
+foreign_type! {
+    #[doc(hidden)]
+    type CType = ::sys::CGEvent;
+    fn drop = |p| CFRelease(p as *mut _);
+    fn clone = |p| CFRetain(p as *const _) as *mut _;
+    pub struct CGEvent;
+    pub struct CGEventRef;
+}
+
+impl CGEvent {
+    pub fn type_id() -> CFTypeID {
+        unsafe {
+            CGEventGetTypeID()
+        }
+    }
+
+    pub fn new(source: CGEventSource) -> Result<CGEvent, ()> {
+        unsafe {
+            let event_ref = CGEventCreate(source.as_ptr());
+            if !event_ref.is_null() {
+                Ok(Self::from_ptr(event_ref))
+            } else {
+                Err(())
+            }
+        }
+    }
+
+    pub fn new_keyboard_event(
+        source: CGEventSource,
+        keycode: CGKeyCode,
+        keydown: bool
+    ) -> Result<CGEvent, ()> {
+        unsafe {
+            let event_ref = CGEventCreateKeyboardEvent(source.as_ptr(), keycode, keydown);
+            if !event_ref.is_null() {
+                Ok(Self::from_ptr(event_ref))
+            } else {
+                Err(())
+            }
+        }
+    }
+
+    pub fn new_mouse_event(
+        source: CGEventSource,
+        mouse_type: CGEventType,
+        mouse_cursor_position: CGPoint,
+        mouse_button: CGMouseButton
+    ) -> Result<CGEvent, ()> {
+        unsafe {
+            let event_ref = CGEventCreateMouseEvent(source.as_ptr(), mouse_type,
+                mouse_cursor_position, mouse_button);
+            if !event_ref.is_null() {
+                Ok(Self::from_ptr(event_ref))
+            } else {
+                Err(())
+            }
+        }
+    }
+
+    #[cfg(feature = "highsierra")]
+    pub fn new_scroll_event(
+        source: CGEventSource,
+        units: CGScrollEventUnit,
+        wheel_count: u32,
+        wheel1: i32,
+        wheel2: i32,
+        wheel3: i32,
+    ) -> Result<CGEvent, ()> {
+        unsafe {
+            let event_ref = CGEventCreateScrollWheelEvent2(
+                source.as_ptr(),
+                units,
+                wheel_count,
+                wheel1,
+                wheel2,
+                wheel3,
+            );
+            if !event_ref.is_null() {
+                Ok(Self::from_ptr(event_ref))
+            } else {
+                Err(())
+            }
+        }
+    }
+
+    pub fn post(&self, tap_location: CGEventTapLocation) {
+        unsafe {
+            CGEventPost(tap_location, self.as_ptr());
+        }
+    }
+
+    pub fn location(&self) -> CGPoint {
+        unsafe {
+            CGEventGetLocation(self.as_ptr())
+        }
+    }
+
+    #[cfg(feature = "elcapitan")]
+    pub fn post_to_pid(&self, pid: libc::pid_t) {
+        unsafe {
+            CGEventPostToPid(pid, self.as_ptr());
+        }
+    }
+
+    pub fn set_flags(&self, flags: CGEventFlags) {
+        unsafe {
+            CGEventSetFlags(self.as_ptr(), flags);
+        }
+    }
+
+    pub fn get_flags(&self) -> CGEventFlags {
+        unsafe {
+            CGEventGetFlags(self.as_ptr())
+        }
+    }
+
+    pub fn set_type(&self, event_type: CGEventType) {
+        unsafe {
+            CGEventSetType(self.as_ptr(), event_type);
+        }
+    }
+
+    pub fn get_type(&self) -> CGEventType {
+        unsafe {
+            CGEventGetType(self.as_ptr())
+        }
+    }
+
+    pub fn set_string_from_utf16_unchecked(&self, buf: &[u16]) {
+        let buflen = buf.len() as libc::c_ulong;
+        unsafe {
+            CGEventKeyboardSetUnicodeString(self.as_ptr(), buflen, buf.as_ptr());
+        }
+    }
+
+    pub fn set_string(&self, string: &str) {
+        let buf: Vec<u16> = string.encode_utf16().collect();
+        self.set_string_from_utf16_unchecked(&buf);
+    }
+
+    pub fn get_integer_value_field(&self, field: CGEventField) -> i64 {
+        unsafe { CGEventGetIntegerValueField(self.as_ptr(), field) }
+    }
+
+    pub fn set_integer_value_field(&self, field: CGEventField, value: i64) {
+        unsafe { CGEventSetIntegerValueField(self.as_ptr(), field, value) }
+    }
+
+    pub fn get_double_value_field(&self, field: CGEventField) -> f64 {
+        unsafe { CGEventGetDoubleValueField(self.as_ptr(), field) }
+    }
+
+    pub fn set_double_value_field(&self, field: CGEventField, value: f64) {
+        unsafe { CGEventSetDoubleValueField(self.as_ptr(), field, value) }
+    }
+}
+
+#[link(name = "CoreGraphics", kind = "framework")]
+extern {
+    /// Return the type identifier for the opaque type `CGEventRef'.
+    fn CGEventGetTypeID() -> CFTypeID;
+
+    /// Return a new event using the event source `source'. If `source' is NULL,
+    /// the default source is used.
+    fn CGEventCreate(source: ::sys::CGEventSourceRef) -> ::sys::CGEventRef;
+
+    /// Return a new keyboard event.
+    ///
+    /// The event source may be taken from another event, or may be NULL. Based
+    /// on the virtual key code values entered, the appropriate key down, key up,
+    /// or flags changed events are generated.
+    ///
+    /// All keystrokes needed to generate a character must be entered, including
+    /// SHIFT, CONTROL, OPTION, and COMMAND keys. For example, to produce a 'Z',
+    /// the SHIFT key must be down, the 'z' key must go down, and then the SHIFT
+    /// and 'z' key must be released:
+    fn CGEventCreateKeyboardEvent(source: ::sys::CGEventSourceRef, keycode: CGKeyCode,
+        keydown: bool) -> ::sys::CGEventRef;
+
+    /// Return a new mouse event.
+    ///
+    /// The event source may be taken from another event, or may be NULL.
+    /// `mouseType' should be one of the mouse event types. `mouseCursorPosition'
+    /// should be the position of the mouse cursor in global coordinates.
+    /// `mouseButton' should be the button that's changing state; `mouseButton'
+    /// is ignored unless `mouseType' is one of `kCGEventOtherMouseDown',
+    /// `kCGEventOtherMouseDragged', or `kCGEventOtherMouseUp'.
+    ///
+    /// The current implementation of the event system supports a maximum of
+    /// thirty-two buttons. Mouse button 0 is the primary button on the mouse.
+    /// Mouse button 1 is the secondary mouse button (right). Mouse button 2 is
+    /// the center button, and the remaining buttons are in USB device order.
+    fn CGEventCreateMouseEvent(source: ::sys::CGEventSourceRef, mouseType: CGEventType,
+        mouseCursorPosition: CGPoint, mouseButton: CGMouseButton) -> ::sys::CGEventRef;
+
+    /// A non-variadic variant version of CGEventCreateScrollWheelEvent.
+    ///
+    /// Returns a new Quartz scrolling event.
+    ///
+    /// This function allows you to create a scrolling event and customize the
+    /// event before posting it to the event system.
+    #[cfg(feature = "highsierra")]
+    fn CGEventCreateScrollWheelEvent2(
+        source: ::sys::CGEventSourceRef,
+        units: CGScrollEventUnit,
+        wheelCount: libc::uint32_t,
+        wheel1: libc::int32_t,
+        wheel2: libc::int32_t,
+        wheel3: libc::int32_t,
+    ) -> ::sys::CGEventRef;
+
+    /// Post an event into the event stream at a specified location.
+    ///
+    /// This function posts the specified event immediately before any event taps
+    /// instantiated for that location, and the event passes through any such
+    /// taps.
+    fn CGEventPost(tapLocation: CGEventTapLocation, event: ::sys::CGEventRef);
+
+    #[cfg(feature = "elcapitan")]
+    /// Post an event to a specified process ID
+    fn CGEventPostToPid(pid: libc::pid_t, event: ::sys::CGEventRef);
+
+    /// Set the event flags of an event.
+    fn CGEventSetFlags(event: ::sys::CGEventRef, flags: CGEventFlags);
+
+    /// Return the event flags of an event.
+    fn CGEventGetFlags(event: ::sys::CGEventRef) -> CGEventFlags;
+
+    /// Return the location of an event in global display coordinates.
+    /// CGPointZero is returned if event is not a valid ::sys::CGEventRef.
+    fn CGEventGetLocation(event: ::sys::CGEventRef) -> CGPoint;
+
+    /// Set the event type of an event.
+    fn CGEventSetType(event: ::sys::CGEventRef, eventType: CGEventType);
+
+    /// Return the event type of an event (left mouse down, for example).
+    fn CGEventGetType(event: ::sys::CGEventRef) -> CGEventType;
+
+    /// Set the Unicode string associated with a keyboard event.
+    ///
+    /// By default, the system translates the virtual key code in a keyboard
+    /// event into a Unicode string based on the keyboard ID in the event
+    /// source.  This function allows you to manually override this string.
+    /// Note that application frameworks may ignore the Unicode string in a
+    /// keyboard event and do their own translation based on the virtual
+    /// keycode and perceived event state.
+    fn CGEventKeyboardSetUnicodeString(event: ::sys::CGEventRef,
+                                       length: libc::c_ulong,
+                                       string: *const u16);
+
+    /// Return the integer value of a field in an event.
+    fn CGEventGetIntegerValueField(event: ::sys::CGEventRef, field: CGEventField) -> i64;
+
+    /// Set the integer value of a field in an event.
+    ///
+    /// Before calling this function, the event type must be set using a typed
+    /// event creation function such as `CGEventCreateMouseEvent', or by
+    /// calling `CGEventSetType'.
+    ///
+    /// If you are creating a mouse event generated by a tablet, call this
+    /// function and specify the field `kCGMouseEventSubtype' with a value of
+    /// `kCGEventMouseSubtypeTabletPoint' or
+    /// `kCGEventMouseSubtypeTabletProximity' before setting other parameters.
+    fn CGEventSetIntegerValueField(event: ::sys::CGEventRef, field: CGEventField, value: i64);
+
+    /// Return the floating-point value of a field in an event.
+    ///
+    /// In cases where the field value is represented within the event by a fixed
+    /// point number or an integer, the result is scaled to the appropriate range
+    /// as part of creating the floating-point representation.
+    fn CGEventGetDoubleValueField(event: ::sys::CGEventRef, field: CGEventField) -> f64;
+
+    /// Set the floating-point value of a field in an event.
+    ///
+    /// Before calling this function, the event type must be set using a typed
+    /// event creation function such as `CGEventCreateMouseEvent', or by calling
+    /// `CGEventSetType'.
+    ///
+    /// In cases where the field’s value is represented within the event by a
+    /// fixed point number or integer, the value parameter is scaled as needed
+    /// and converted to the appropriate type.
+    fn CGEventSetDoubleValueField(event: ::sys::CGEventRef, field: CGEventField, value: f64);
+}
diff --git a/third_party/rust_crates/vendor/core-graphics/src/event_source.rs b/third_party/rust_crates/vendor/core-graphics/src/event_source.rs
new file mode 100644
index 0000000..ce13f5a
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/event_source.rs
@@ -0,0 +1,48 @@
+use core_foundation::base::{CFRelease, CFRetain, CFTypeID};
+use foreign_types::ForeignType;
+
+/// Possible source states of an event source.
+#[repr(C)]
+#[derive(Clone, Copy, Debug)]
+pub enum CGEventSourceStateID {
+    Private = -1,
+    CombinedSessionState = 0,
+    HIDSystemState = 1,
+}
+
+foreign_type! {
+    #[doc(hidden)]
+    type CType = ::sys::CGEventSource;
+    fn drop = |p| CFRelease(p as *mut _);
+    fn clone = |p| CFRetain(p as *const _) as *mut _;
+    pub struct CGEventSource;
+    pub struct CGEventSourceRef;
+}
+
+impl CGEventSource {
+    pub fn type_id() -> CFTypeID {
+        unsafe {
+            CGEventSourceGetTypeID()
+        }
+    }
+
+    pub fn new(state_id: CGEventSourceStateID) -> Result<Self, ()> {
+        unsafe {
+            let event_source_ref = CGEventSourceCreate(state_id);
+            if !event_source_ref.is_null() {
+                Ok(Self::from_ptr(event_source_ref))
+            } else {
+                Err(())
+            }
+        }
+    }
+}
+
+#[link(name = "CoreGraphics", kind = "framework")]
+extern {
+    /// Return the type identifier for the opaque type `CGEventSourceRef'.
+    fn CGEventSourceGetTypeID() -> CFTypeID;
+
+    /// Return a Quartz event source created with a specified source state.
+    fn CGEventSourceCreate(stateID: CGEventSourceStateID) -> ::sys::CGEventSourceRef;
+}
diff --git a/third_party/rust_crates/vendor/core-graphics/src/font.rs b/third_party/rust_crates/vendor/core-graphics/src/font.rs
new file mode 100644
index 0000000..fc7a9ba
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/font.rs
@@ -0,0 +1,157 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::ptr;
+use core_foundation::base::{CFRelease, CFRetain, CFTypeID, TCFType};
+use core_foundation::array::{CFArray, CFArrayRef};
+use core_foundation::data::{CFData, CFDataRef};
+use core_foundation::number::CFNumber;
+use core_foundation::string::{CFString, CFStringRef};
+use core_foundation::dictionary::{CFDictionary, CFDictionaryRef};
+use data_provider::CGDataProvider;
+use geometry::CGRect;
+
+use foreign_types::ForeignType;
+
+use libc::{self, c_int, size_t};
+
+pub type CGGlyph = libc::c_ushort;
+
+foreign_type! {
+    #[doc(hidden)]
+    type CType = ::sys::CGFont;
+    fn drop = |p| CFRelease(p as *mut _);
+    fn clone = |p| CFRetain(p as *const _) as *mut _;
+    pub struct CGFont;
+    pub struct CGFontRef;
+}
+
+unsafe impl Send for CGFont {}
+unsafe impl Sync for CGFont {}
+
+impl CGFont {
+    pub fn type_id() -> CFTypeID {
+        unsafe {
+            CGFontGetTypeID()
+        }
+    }
+
+    pub fn from_data_provider(provider: CGDataProvider) -> Result<CGFont, ()> {
+        unsafe {
+            let font_ref = CGFontCreateWithDataProvider(provider.as_ptr());
+            if !font_ref.is_null() {
+                Ok(CGFont::from_ptr(font_ref))
+            } else {
+                Err(())
+            }
+        }
+    }
+
+    pub fn from_name(name: &CFString) -> Result<CGFont, ()> {
+        unsafe {
+            let font_ref = CGFontCreateWithFontName(name.as_concrete_TypeRef());
+            if !font_ref.is_null() {
+                Ok(CGFont::from_ptr(font_ref))
+            } else {
+                Err(())
+            }
+        }
+    }
+
+    pub fn create_copy_from_variations(&self, vars: &CFDictionary<CFString, CFNumber>) -> Result<CGFont, ()> {
+        unsafe {
+            let font_ref = CGFontCreateCopyWithVariations(self.as_ptr(),
+                                                          vars.as_concrete_TypeRef());
+            if !font_ref.is_null() {
+                Ok(CGFont::from_ptr(font_ref))
+            } else {
+                Err(())
+            }
+        }
+    }
+
+    pub fn postscript_name(&self) -> CFString {
+        unsafe {
+            let string_ref = CGFontCopyPostScriptName(self.as_ptr());
+            TCFType::wrap_under_create_rule(string_ref)
+        }
+    }
+
+    pub fn get_glyph_b_boxes(&self, glyphs: &[CGGlyph], bboxes: &mut [CGRect]) -> bool {
+        unsafe {
+            assert!(bboxes.len() >= glyphs.len());
+            CGFontGetGlyphBBoxes(self.as_ptr(),
+                                 glyphs.as_ptr(),
+                                 glyphs.len(),
+                                 bboxes.as_mut_ptr())
+        }
+    }
+
+    pub fn get_glyph_advances(&self, glyphs: &[CGGlyph], advances: &mut [c_int]) -> bool {
+        unsafe {
+            assert!(advances.len() >= glyphs.len());
+            CGFontGetGlyphAdvances(self.as_ptr(),
+                                   glyphs.as_ptr(),
+                                   glyphs.len(),
+                                   advances.as_mut_ptr())
+        }
+    }
+
+    pub fn get_units_per_em(&self) -> c_int {
+        unsafe {
+            CGFontGetUnitsPerEm(self.as_ptr())
+        }
+    }
+
+    pub fn copy_table_tags(&self) -> CFArray<u32> {
+        unsafe {
+            TCFType::wrap_under_create_rule(CGFontCopyTableTags(self.as_ptr()))
+        }
+    }
+
+    pub fn copy_table_for_tag(&self, tag: u32) -> Option<CFData> {
+        let data_ref = unsafe { CGFontCopyTableForTag(self.as_ptr(), tag) };
+        if data_ref != ptr::null() {
+            Some(unsafe { TCFType::wrap_under_create_rule(data_ref) })
+        } else {
+            None
+        }
+    }
+}
+
+#[link(name = "CoreGraphics", kind = "framework")]
+extern {
+    // TODO: basically nothing has bindings (even commented-out) besides what we use.
+    fn CGFontCreateWithDataProvider(provider: ::sys::CGDataProviderRef) -> ::sys::CGFontRef;
+    fn CGFontCreateWithFontName(name: CFStringRef) -> ::sys::CGFontRef;
+    fn CGFontCreateCopyWithVariations(font: ::sys::CGFontRef, vars: CFDictionaryRef) -> ::sys::CGFontRef;
+    fn CGFontGetTypeID() -> CFTypeID;
+
+    fn CGFontCopyPostScriptName(font: ::sys::CGFontRef) -> CFStringRef;
+
+    // These do the same thing as CFRetain/CFRelease, except
+    // gracefully handle a NULL argument. We don't use them.
+    //fn CGFontRetain(font: ::sys::CGFontRef);
+    //fn CGFontRelease(font: ::sys::CGFontRef);
+
+    fn CGFontGetGlyphBBoxes(font: ::sys::CGFontRef,
+                            glyphs: *const CGGlyph,
+                            count: size_t,
+                            bboxes: *mut CGRect)
+                            -> bool;
+    fn CGFontGetGlyphAdvances(font: ::sys::CGFontRef,
+                              glyphs: *const CGGlyph,
+                              count: size_t,
+                              advances: *mut c_int)
+                              -> bool;
+    fn CGFontGetUnitsPerEm(font: ::sys::CGFontRef) -> c_int;
+
+    fn CGFontCopyTableTags(font: ::sys::CGFontRef) -> CFArrayRef;
+    fn CGFontCopyTableForTag(font: ::sys::CGFontRef, tag: u32) -> CFDataRef;
+}
diff --git a/third_party/rust_crates/vendor/core-graphics/src/geometry.rs b/third_party/rust_crates/vendor/core-graphics/src/geometry.rs
new file mode 100644
index 0000000..b22c704
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/geometry.rs
@@ -0,0 +1,205 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use base::CGFloat;
+use core_foundation::base::TCFType;
+use core_foundation::dictionary::CFDictionary;
+
+pub const CG_ZERO_POINT: CGPoint = CGPoint {
+    x: 0.0,
+    y: 0.0,
+};
+
+pub const CG_ZERO_SIZE: CGSize = CGSize {
+    width: 0.0,
+    height: 0.0,
+};
+
+pub const CG_ZERO_RECT: CGRect = CGRect {
+    origin: CG_ZERO_POINT,
+    size: CG_ZERO_SIZE,
+};
+
+pub const CG_AFFINE_TRANSFORM_IDENTITY: CGAffineTransform = CGAffineTransform {
+    a: 1.0, b: 0.0,
+    c: 0.0, d: 1.0,
+    tx: 0.0, ty: 0.0,
+};
+
+#[repr(C)]
+#[derive(Clone, Copy, Debug, Default)]
+pub struct CGSize {
+    pub width: CGFloat,
+    pub height: CGFloat,
+}
+
+impl CGSize {
+    #[inline]
+    pub fn new(width: CGFloat, height: CGFloat) -> CGSize {
+        CGSize {
+            width: width,
+            height: height,
+        }
+    }
+
+    #[inline]
+    pub fn apply_transform(&self, t: &CGAffineTransform) -> CGSize {
+        unsafe {
+            ffi::CGSizeApplyAffineTransform(*self, *t)
+        }
+    }
+}
+
+#[repr(C)]
+#[derive(Clone, Copy, Debug, Default)]
+pub struct CGPoint {
+    pub x: CGFloat,
+    pub y: CGFloat,
+}
+
+impl CGPoint {
+    #[inline]
+    pub fn new(x: CGFloat, y: CGFloat) -> CGPoint {
+        CGPoint {
+            x: x,
+            y: y,
+        }
+    }
+
+    #[inline]
+    pub fn apply_transform(&self, t: &CGAffineTransform) -> CGPoint {
+        unsafe {
+            ffi::CGPointApplyAffineTransform(*self, *t)
+        }
+    }
+}
+
+#[repr(C)]
+#[derive(Clone, Copy, Debug, Default)]
+pub struct CGRect {
+    pub origin: CGPoint,
+    pub size: CGSize
+}
+
+impl CGRect {
+    #[inline]
+    pub fn new(origin: &CGPoint, size: &CGSize) -> CGRect {
+        CGRect {
+            origin: *origin,
+            size: *size,
+        }
+    }
+
+    #[inline]
+    pub fn inset(&self, size: &CGSize) -> CGRect {
+        unsafe {
+            ffi::CGRectInset(*self, size.width, size.height)
+        }
+    }
+
+    #[inline]
+    pub fn from_dict_representation(dict: &CFDictionary) -> Option<CGRect> {
+        let mut rect = CGRect::new(&CGPoint::new(0., 0.), &CGSize::new(0., 0.));
+        let result = unsafe {
+            ffi::CGRectMakeWithDictionaryRepresentation(dict.as_concrete_TypeRef(), &mut rect)
+        };
+        if result == 0 {
+            None
+        } else {
+            Some(rect)
+        }
+    }
+
+    #[inline]
+    pub fn is_empty(&self) -> bool {
+        unsafe {
+            // I use one, as it seems that `YES` is not available from this crate.
+            ffi::CGRectIsEmpty(*self) == 1
+        }
+    }
+
+    #[inline]
+    pub fn is_intersects(&self, other: &CGRect) -> bool {
+        unsafe {
+            // I use one, as it seems that `YES` is not available from this crate.
+            ffi::CGRectIntersectsRect(*self, *other) == 1
+        }
+    }
+
+    #[inline]
+    pub fn apply_transform(&self, t: &CGAffineTransform) -> CGRect {
+        unsafe {
+            ffi::CGRectApplyAffineTransform(*self, *t)
+        }
+    }
+}
+
+impl PartialEq for CGRect {
+    #[inline]
+    fn eq(&self, other: &CGRect) -> bool {
+        unsafe {
+            ffi::CGRectEqualToRect(*self, *other) != 0
+        }
+    }
+}
+
+#[repr(C)]
+#[derive(Clone, Copy, Debug, Default)]
+pub struct CGAffineTransform {
+    pub a: CGFloat,
+    pub b: CGFloat,
+    pub c: CGFloat,
+    pub d: CGFloat,
+    pub tx: CGFloat,
+    pub ty: CGFloat,
+}
+
+impl CGAffineTransform {
+    #[inline]
+    pub fn new(
+        a: CGFloat,
+        b: CGFloat,
+        c: CGFloat,
+        d: CGFloat,
+        tx: CGFloat,
+        ty: CGFloat,
+    ) -> CGAffineTransform {
+        CGAffineTransform { a, b, c, d, tx, ty }
+    }
+
+    #[inline]
+    pub fn invert(&self) -> CGAffineTransform {
+        unsafe {
+            ffi::CGAffineTransformInvert(*self)
+        }
+    }
+}
+
+mod ffi {
+    use base::{CGFloat, boolean_t};
+    use geometry::{CGAffineTransform, CGPoint, CGRect, CGSize};
+    use core_foundation::dictionary::CFDictionaryRef;
+
+    #[link(name = "CoreGraphics", kind = "framework")]
+    extern {
+        pub fn CGRectInset(rect: CGRect, dx: CGFloat, dy: CGFloat) -> CGRect;
+        pub fn CGRectMakeWithDictionaryRepresentation(dict: CFDictionaryRef,
+                                                      rect: *mut CGRect) -> boolean_t;
+        pub fn CGRectIsEmpty(rect: CGRect) -> boolean_t;
+        pub fn CGRectIntersectsRect(rect1: CGRect, rect2: CGRect) -> boolean_t;
+        pub fn CGRectEqualToRect(rect1: CGRect, rect2: CGRect) -> boolean_t;
+
+        pub fn CGAffineTransformInvert(t: CGAffineTransform) -> CGAffineTransform;
+
+        pub fn CGPointApplyAffineTransform(point: CGPoint, t: CGAffineTransform) -> CGPoint;
+        pub fn CGRectApplyAffineTransform(rect: CGRect, t: CGAffineTransform) -> CGRect;
+        pub fn CGSizeApplyAffineTransform(size: CGSize, t: CGAffineTransform) -> CGSize;
+    }
+}
+
diff --git a/third_party/rust_crates/vendor/core-graphics/src/image.rs b/third_party/rust_crates/vendor/core-graphics/src/image.rs
new file mode 100644
index 0000000..84945e8
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/image.rs
@@ -0,0 +1,165 @@
+use std::ptr;
+
+use base::CGFloat;
+use core_foundation::base::{CFRetain, CFTypeID};
+use core_foundation::data::CFData;
+use color_space::CGColorSpace;
+use data_provider::{CGDataProviderRef, CGDataProvider};
+use geometry::CGRect;
+use libc::size_t;
+use foreign_types::{ForeignType, ForeignTypeRef};
+
+#[repr(C)]
+pub enum CGImageAlphaInfo {
+    CGImageAlphaNone, /* For example, RGB. */
+    CGImageAlphaPremultipliedLast, /* For example, premultiplied RGBA */
+    CGImageAlphaPremultipliedFirst, /* For example, premultiplied ARGB */
+    CGImageAlphaLast, /* For example, non-premultiplied RGBA */
+    CGImageAlphaFirst, /* For example, non-premultiplied ARGB */
+    CGImageAlphaNoneSkipLast, /* For example, RBGX. */
+    CGImageAlphaNoneSkipFirst, /* For example, XRBG. */
+    CGImageAlphaOnly /* No color data, alpha data only */
+}
+
+#[repr(C)]
+pub enum CGImageByteOrderInfo {
+    CGImageByteOrderMask = 0x7000,
+    CGImageByteOrder16Little = (1 << 12),
+    CGImageByteOrder32Little = (2 << 12),
+    CGImageByteOrder16Big = (3 << 12),
+    CGImageByteOrder32Big = (4 << 12)
+}
+
+foreign_type! {
+    #[doc(hidden)]
+    type CType = ::sys::CGImage;
+    fn drop = CGImageRelease;
+    fn clone = |p| CFRetain(p as *const _) as *mut _;
+    pub struct CGImage;
+    pub struct CGImageRef;
+}
+
+impl CGImage {
+    pub fn new(width: size_t,
+               height: size_t,
+               bits_per_component: size_t,
+               bits_per_pixel: size_t,
+               bytes_per_row: size_t,
+               colorspace: &CGColorSpace,
+               bitmap_info: u32,
+               provider: &CGDataProvider,
+               should_interpolate: bool,
+               rendering_intent: u32)
+               -> Self {
+        unsafe {
+            let result =  CGImageCreate(width,
+                                        height,
+                                        bits_per_component,
+                                        bits_per_pixel,
+                                        bytes_per_row,
+                                        colorspace.as_ptr(),
+                                        bitmap_info,
+                                        provider.as_ptr(),
+                                        ptr::null_mut(),
+                                        should_interpolate,
+                                        rendering_intent);
+            assert!(!result.is_null());
+            Self::from_ptr(result)
+        }
+    }
+
+    pub fn type_id() -> CFTypeID {
+        unsafe {
+            CGImageGetTypeID()
+        }
+    }
+}
+
+impl CGImageRef {
+    pub fn width(&self) -> size_t {
+        unsafe {
+            CGImageGetWidth(self.as_ptr())
+        }
+    }
+
+    pub fn height(&self) -> size_t {
+        unsafe {
+            CGImageGetHeight(self.as_ptr())
+        }
+    }
+
+    pub fn bits_per_component(&self) -> size_t {
+        unsafe {
+            CGImageGetBitsPerComponent(self.as_ptr())
+        }
+    }
+
+    pub fn bits_per_pixel(&self) -> size_t {
+        unsafe {
+            CGImageGetBitsPerPixel(self.as_ptr())
+        }
+    }
+
+    pub fn bytes_per_row(&self) -> size_t {
+        unsafe {
+            CGImageGetBytesPerRow(self.as_ptr())
+        }
+    }
+
+    pub fn color_space(&self) -> CGColorSpace {
+        unsafe {
+            let cs = CGImageGetColorSpace(self.as_ptr());
+            CFRetain(cs as *mut _);
+            CGColorSpace::from_ptr(cs)
+        }
+    }
+
+    /// Returns the raw image bytes wrapped in `CFData`. Note, the returned `CFData` owns the
+    /// underlying buffer.
+    pub fn data(&self) -> CFData {
+        let data_provider = unsafe {
+            CGDataProviderRef::from_ptr(CGImageGetDataProvider(self.as_ptr()))
+        };
+        data_provider.copy_data()
+    }
+
+    /// Returns a cropped image. If the `rect` specifies a rectangle which lies outside of the
+    /// image bounds, the `None` is returned.
+    pub fn cropped(&self, rect: CGRect) -> Option<CGImage> {
+        let image_ptr = unsafe { CGImageCreateWithImageInRect(self.as_ptr(), rect) };
+        if !image_ptr.is_null() {
+            Some(unsafe { CGImage::from_ptr(image_ptr) })
+        } else {
+            None
+        }
+    }
+}
+
+#[link(name = "CoreGraphics", kind = "framework")]
+extern {
+    fn CGImageGetTypeID() -> CFTypeID;
+    fn CGImageGetWidth(image: ::sys::CGImageRef) -> size_t;
+    fn CGImageGetHeight(image: ::sys::CGImageRef) -> size_t;
+    fn CGImageGetBitsPerComponent(image: ::sys::CGImageRef) -> size_t;
+    fn CGImageGetBitsPerPixel(image: ::sys::CGImageRef) -> size_t;
+    fn CGImageGetBytesPerRow(image: ::sys::CGImageRef) -> size_t;
+    fn CGImageGetColorSpace(image: ::sys::CGImageRef) -> ::sys::CGColorSpaceRef;
+    fn CGImageGetDataProvider(image: ::sys::CGImageRef) -> ::sys::CGDataProviderRef;
+    fn CGImageRelease(image: ::sys::CGImageRef);
+    fn CGImageCreate(width: size_t,
+                     height: size_t,
+                     bitsPerComponent: size_t,
+                     bitsPerPixel: size_t,
+                     bytesPerRow: size_t,
+                     space: ::sys::CGColorSpaceRef,
+                     bitmapInfo: u32,
+                     provider: ::sys::CGDataProviderRef,
+                     decode: *const CGFloat,
+                     shouldInterpolate: bool,
+                     intent: u32)
+                     -> ::sys::CGImageRef;
+    fn CGImageCreateWithImageInRect(image: ::sys::CGImageRef, rect: CGRect) -> ::sys::CGImageRef;
+
+    //fn CGImageGetAlphaInfo(image: ::sys::CGImageRef) -> CGImageAlphaInfo;
+    //fn CGImageCreateCopyWithColorSpace(image: ::sys::CGImageRef, space: ::sys::CGColorSpaceRef) -> ::sys::CGImageRef
+}
diff --git a/third_party/rust_crates/vendor/core-graphics/src/lib.rs b/third_party/rust_crates/vendor/core-graphics/src/lib.rs
new file mode 100644
index 0000000..981883c
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/lib.rs
@@ -0,0 +1,41 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+extern crate libc;
+
+#[macro_use]
+extern crate core_foundation;
+
+#[macro_use]
+#[cfg(target_os = "macos")]
+extern crate bitflags;
+
+#[macro_use]
+extern crate foreign_types;
+
+pub mod base;
+pub mod color;
+pub mod color_space;
+pub mod context;
+pub mod data_provider;
+#[cfg(target_os = "macos")]
+pub mod display;
+#[cfg(target_os = "macos")]
+pub mod event;
+#[cfg(target_os = "macos")]
+pub mod event_source;
+pub mod font;
+pub mod geometry;
+#[cfg(target_os = "macos")]
+pub mod window;
+#[cfg(target_os = "macos")]
+pub mod private;
+pub mod image;
+pub mod path;
+mod sys;
diff --git a/third_party/rust_crates/vendor/core-graphics/src/path.rs b/third_party/rust_crates/vendor/core-graphics/src/path.rs
new file mode 100644
index 0000000..dc1c804
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/path.rs
@@ -0,0 +1,129 @@
+// Copyright 2017 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+pub use sys::CGPathRef as SysCGPathRef;
+
+use core_foundation::base::{CFRelease, CFRetain, CFTypeID};
+use foreign_types::ForeignType;
+use geometry::{CGAffineTransform, CGPoint, CGRect};
+use libc::c_void;
+use std::fmt::{self, Debug, Formatter};
+use std::marker::PhantomData;
+use std::ops::Deref;
+use std::ptr;
+use std::slice;
+
+foreign_type! {
+    #[doc(hidden)]
+    type CType = ::sys::CGPath;
+    fn drop = |p| CFRelease(p as *mut _);
+    fn clone = |p| CFRetain(p as *const _) as *mut _;
+    pub struct CGPath;
+    pub struct CGPathRef;
+}
+
+impl CGPath {
+    pub fn from_rect(rect: CGRect, transform: Option<&CGAffineTransform>) -> CGPath {
+        unsafe {
+            let transform = match transform {
+                None => ptr::null(),
+                Some(transform) => transform as *const CGAffineTransform,
+            };
+            CGPath(CGPathCreateWithRect(rect, transform))
+        }
+    }
+
+    pub fn type_id() -> CFTypeID {
+        unsafe {
+            CGPathGetTypeID()
+        }
+    }
+
+    pub fn apply<'a, F>(&'a self, mut closure: &'a F) where F: FnMut(CGPathElementRef<'a>) {
+        unsafe {
+            CGPathApply(self.as_ptr(), &mut closure as *mut _ as *mut c_void, do_apply::<F>);
+        }
+
+        unsafe extern "C" fn do_apply<'a, F>(info: *mut c_void, element: *const CGPathElement)
+                                             where F: FnMut(CGPathElementRef<'a>) {
+            let closure = info as *mut *mut F;
+            (**closure)(CGPathElementRef::new(element))
+        }
+    }
+}
+
+#[repr(i32)]
+#[derive(Clone, Copy, Debug, PartialEq)]
+pub enum CGPathElementType {
+    MoveToPoint = 0,
+    AddLineToPoint = 1,
+    AddQuadCurveToPoint = 2,
+    AddCurveToPoint = 3,
+    CloseSubpath = 4,
+}
+
+pub struct CGPathElementRef<'a> {
+    element: *const CGPathElement,
+    phantom: PhantomData<&'a CGPathElement>,
+}
+
+impl<'a> CGPathElementRef<'a> {
+    fn new<'b>(element: *const CGPathElement) -> CGPathElementRef<'b> {
+        CGPathElementRef {
+            element: element,
+            phantom: PhantomData,
+        }
+    }
+}
+
+impl<'a> Deref for CGPathElementRef<'a> {
+    type Target = CGPathElement;
+    fn deref(&self) -> &CGPathElement {
+        unsafe {
+            &*self.element
+        }
+    }
+}
+
+#[repr(C)]
+pub struct CGPathElement {
+    pub element_type: CGPathElementType,
+    points: *mut CGPoint,
+}
+
+impl Debug for CGPathElement {
+    fn fmt(&self, formatter: &mut Formatter) -> Result<(), fmt::Error> {
+        write!(formatter, "{:?}: {:?}", self.element_type, self.points())
+    }
+}
+
+impl CGPathElement {
+    pub fn points(&self) -> &[CGPoint] {
+        unsafe {
+            match self.element_type {
+                CGPathElementType::CloseSubpath => &[],
+                CGPathElementType::MoveToPoint | CGPathElementType::AddLineToPoint => {
+                    slice::from_raw_parts(self.points, 1)
+                }
+                CGPathElementType::AddQuadCurveToPoint => slice::from_raw_parts(self.points, 2),
+                CGPathElementType::AddCurveToPoint => slice::from_raw_parts(self.points, 3),
+            }
+        }
+    }
+}
+
+type CGPathApplierFunction = unsafe extern "C" fn(info: *mut c_void,
+                                                  element: *const CGPathElement);
+
+#[link(name = "CoreGraphics", kind = "framework")]
+extern {
+    fn CGPathCreateWithRect(rect: CGRect, transform: *const CGAffineTransform) -> ::sys::CGPathRef;
+    fn CGPathApply(path: ::sys::CGPathRef, info: *mut c_void, function: CGPathApplierFunction);
+    fn CGPathGetTypeID() -> CFTypeID;
+}
diff --git a/third_party/rust_crates/vendor/core-graphics/src/private.rs b/third_party/rust_crates/vendor/core-graphics/src/private.rs
new file mode 100644
index 0000000..0bc193b
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/private.rs
@@ -0,0 +1,116 @@
+// Copyright 2016 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Evil private APIs.
+//!
+//! These are liable to change at any time. Use with caution!
+
+use geometry::CGRect;
+use libc::{c_int, c_uint};
+use std::ptr;
+
+pub struct CGSRegion {
+    region: ffi::CGSRegionRef,
+}
+
+impl Drop for CGSRegion {
+    fn drop(&mut self) {
+        unsafe {
+            ffi::CGSRegionRelease(self.region)
+        }
+    }
+}
+
+impl CGSRegion {
+    #[inline]
+    pub fn from_rect(rect: &CGRect) -> CGSRegion {
+        unsafe {
+            let mut region = ptr::null_mut();
+            assert!(ffi::CGSNewRegionWithRect(rect, &mut region) == 0);
+            CGSRegion {
+                region: region,
+            }
+        }
+    }
+
+    #[inline]
+    pub fn from_rects(rects: &[CGRect]) -> CGSRegion {
+        unsafe {
+            let mut region = ptr::null_mut();
+            assert!(ffi::CGSNewRegionWithRectList(rects.as_ptr(),
+                                                  rects.len() as c_uint,
+                                                  &mut region) == 0);
+            CGSRegion {
+                region: region,
+            }
+        }
+    }
+}
+
+/// This should always be memory-safe; the window server rejects any invalid surface IDs.
+pub struct CGSSurface {
+    context_id: c_uint,
+    window_number: c_int,
+    surface_id: c_uint,
+}
+
+impl CGSSurface {
+    #[inline]
+    pub fn from_ids(context_id: c_uint, window_number: c_int, surface_id: c_uint) -> CGSSurface {
+        CGSSurface {
+            context_id: context_id,
+            window_number: window_number,
+            surface_id: surface_id,
+        }
+    }
+
+    #[inline]
+    pub fn id(&self) -> c_uint {
+        self.surface_id
+    }
+
+    #[inline]
+    pub fn set_shape(&self, region: &CGSRegion) {
+        unsafe {
+            assert!(ffi::CGSSetSurfaceShape(self.context_id,
+                                            self.window_number,
+                                            self.surface_id,
+                                            region.region) == 0)
+        }
+    }
+}
+
+mod ffi {
+    use geometry::CGRect;
+    use libc::{c_int, c_uint};
+
+    // This is an enum so that we can't easily make instances of this opaque type.
+    pub enum CGSRegionObject {}
+
+    pub type CGError = OSStatus;
+    pub type CGSRegionRef = *mut CGSRegionObject;
+    pub type OSStatus = i32;
+
+    #[link(name = "CoreGraphics", kind = "framework")]
+    extern {
+        pub fn CGSRegionRelease(region: CGSRegionRef);
+        pub fn CGSNewRegionWithRect(rect: *const CGRect, outRegion: *mut CGSRegionRef) -> CGError;
+        pub fn CGSNewRegionWithRectList(rects: *const CGRect,
+                                        rectCount: c_uint,
+                                        outRegion: *mut CGSRegionRef)
+                                        -> CGError;
+
+        pub fn CGSSetSurfaceShape(contextID: c_uint,
+                                  windowNumber: c_int,
+                                  surfaceID: c_uint,
+                                  region: CGSRegionRef)
+                                  -> CGError;
+    }
+}
+
diff --git a/third_party/rust_crates/vendor/core-graphics/src/sys.rs b/third_party/rust_crates/vendor/core-graphics/src/sys.rs
new file mode 100644
index 0000000..ccf0625
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/sys.rs
@@ -0,0 +1,39 @@
+use std::os::raw::c_void;
+
+pub enum CGImage {}
+pub type CGImageRef = *mut CGImage;
+
+#[repr(C)]
+pub struct __CGColor(c_void);
+
+pub type CGColorRef = *const __CGColor;
+
+pub enum CGColorSpace {}
+pub type CGColorSpaceRef = *mut CGColorSpace;
+
+pub enum CGPath {}
+pub type CGPathRef = *mut CGPath;
+
+pub enum CGDataProvider {}
+pub type CGDataProviderRef = *mut CGDataProvider;
+
+pub enum CGFont {}
+pub type CGFontRef = *mut CGFont;
+
+pub enum CGContext {}
+pub type CGContextRef = *mut CGContext;
+
+#[cfg(target_os = "macos")]
+mod macos {
+	pub enum CGEvent {}
+	pub type CGEventRef = *mut CGEvent;
+
+	pub enum CGEventSource {}
+	pub type CGEventSourceRef = *mut CGEventSource;
+
+	pub enum CGDisplayMode {}
+	pub type CGDisplayModeRef = *mut CGDisplayMode;
+}
+
+#[cfg(target_os = "macos")]
+pub use self::macos::*;
diff --git a/third_party/rust_crates/vendor/core-graphics/src/window.rs b/third_party/rust_crates/vendor/core-graphics/src/window.rs
new file mode 100644
index 0000000..aa7293f
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-graphics/src/window.rs
@@ -0,0 +1,149 @@
+// Copyright 2018 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(non_upper_case_globals)]
+
+use core_foundation::array::{CFArray, CFArrayRef};
+use core_foundation::base::{CFType, TCFType};
+use core_foundation::dictionary::CFDictionary;
+use core_foundation::string::{CFString, CFStringRef};
+use foreign_types::ForeignType;
+
+use geometry::CGRect;
+use image::CGImage;
+use sys;
+
+pub type CGWindowID = u32;
+
+pub type CGWindowSharingType = u32;
+pub const kCGWindowSharingNone: CGWindowSharingType = 0;
+pub const kCGWindowSharingReadOnly: CGWindowSharingType = 1;
+pub const kCGWindowSharingReadWrite: CGWindowSharingType = 1;
+
+pub type CGWindowBackingType = u32;
+pub const kCGWindowBackingStoreRetained: CGWindowBackingType = 0;
+pub const kCGWindowBackingStoreNonretained: CGWindowBackingType = 1;
+pub const kCGWindowBackingStoreBuffered: CGWindowBackingType = 2;
+
+pub type CGWindowListOption = u32;
+pub const kCGWindowListOptionAll: CGWindowListOption = 1 << 0;
+pub const kCGWindowListOptionOnScreenOnly: CGWindowListOption = 1 << 1;
+pub const kCGWindowListOptionOnScreenAboveWindow: CGWindowListOption = 1 << 2;
+pub const kCGWindowListOptionOnScreenBelowWindow: CGWindowListOption = 1 << 3;
+pub const kCGWindowListOptionIncludingWindow: CGWindowListOption = 1 << 4;
+pub const kCGWindowListOptionExcludeDesktopElements: CGWindowListOption = 1 << 5;
+
+pub type CGWindowImageOption = u32;
+pub const kCGWindowImageDefault: CGWindowImageOption = 0;
+pub const kCGWindowImageBoundsIgnoreFraming: CGWindowImageOption = 1 << 0;
+pub const kCGWindowImageShouldBeOpaque: CGWindowImageOption = 1 << 1;
+pub const kCGWindowImageOnlyShadows: CGWindowImageOption = 1 << 2;
+pub const kCGWindowImageBestResolution: CGWindowImageOption = 1 << 3;
+pub const kCGWindowImageNominalResolution: CGWindowImageOption = 1 << 4;
+
+pub const kCGNullWindowID: CGWindowID = 0;
+
+pub fn copy_window_info(option: CGWindowListOption, relative_to_window: CGWindowID)
+                        -> Option<CFArray> {
+    unsafe {
+        let array = CGWindowListCopyWindowInfo(option, relative_to_window);
+        if array.is_null() {
+            None
+        } else {
+            Some(TCFType::wrap_under_create_rule(array))
+        }
+    }
+}
+
+pub fn create_window_list(option: CGWindowListOption, relative_to_window: CGWindowID)
+                          -> Option<CFArray<CGWindowID>> {
+    unsafe {
+        let array = CGWindowListCreate(option, relative_to_window);
+        if array.is_null() {
+            None
+        } else {
+            Some(TCFType::wrap_under_create_rule(array))
+        }
+    }
+}
+
+pub fn create_description_from_array(window_array: CFArray<CGWindowID>) ->
+                                     Option<CFArray<CFDictionary<CFString, CFType>>> {
+    unsafe {
+        let array = CGWindowListCreateDescriptionFromArray(window_array.as_concrete_TypeRef());
+        if array.is_null() {
+            None
+        } else {
+            Some(TCFType::wrap_under_create_rule(array))
+        }
+    }
+}
+
+pub fn create_image(screen_bounds: CGRect,
+                    list_option: CGWindowListOption,
+                    window_id: CGWindowID,
+                    image_option: CGWindowImageOption)
+                    -> Option<CGImage> {
+    unsafe {
+        let image = CGWindowListCreateImage(screen_bounds, list_option, window_id, image_option);
+        if image.is_null() {
+            None
+        } else {
+            Some(CGImage::from_ptr(image))
+        }
+    }
+}
+
+pub fn create_image_from_array(screen_bounds: CGRect,
+                               window_array: CFArray,
+                               image_option: CGWindowImageOption)
+                               -> Option<CGImage> {
+    unsafe {
+        let image = CGWindowListCreateImageFromArray(screen_bounds,
+                                                     window_array.as_concrete_TypeRef(),
+                                                     image_option);
+        if image.is_null() {
+            None
+        } else {
+            Some(CGImage::from_ptr(image))
+        }
+    }
+}
+
+#[link(name = "CoreGraphics", kind = "framework")]
+extern {
+    pub static kCGWindowNumber: CFStringRef;
+    pub static kCGWindowStoreType: CFStringRef;
+    pub static kCGWindowLayer: CFStringRef;
+    pub static kCGWindowBounds: CFStringRef;
+    pub static kCGWindowSharingState: CFStringRef;
+    pub static kCGWindowAlpha: CFStringRef;
+    pub static kCGWindowOwnerPID: CFStringRef;
+    pub static kCGWindowMemoryUsage: CFStringRef;
+    pub static kCGWindowWorkspace: CFStringRef;
+    pub static kCGWindowOwnerName: CFStringRef;
+    pub static kCGWindowName: CFStringRef;
+    pub static kCGWindowIsOnscreen: CFStringRef;
+    pub static kCGWindowBackingLocationVideoMemory: CFStringRef;
+
+    pub fn CGWindowListCopyWindowInfo(option: CGWindowListOption, relativeToWindow: CGWindowID)
+                                      -> CFArrayRef;
+    pub fn CGWindowListCreate(option: CGWindowListOption, relativeToWindow: CGWindowID)
+                              -> CFArrayRef;
+    pub fn CGWindowListCreateDescriptionFromArray(windowArray: CFArrayRef) -> CFArrayRef;
+    pub fn CGWindowListCreateImage(screenBounds: CGRect,
+                                   listOption: CGWindowListOption,
+                                   windowID: CGWindowID,
+                                   imageOption: CGWindowImageOption)
+                                   -> *mut sys::CGImage;
+    pub fn CGWindowListCreateImageFromArray(screenBounds: CGRect,
+                                            windowArray: CFArrayRef,
+                                            imageOption: CGWindowImageOption)
+                                            -> *mut sys::CGImage;
+}
diff --git a/third_party/rust_crates/vendor/core-text/.cargo-checksum.json b/third_party/rust_crates/vendor/core-text/.cargo-checksum.json
new file mode 100644
index 0000000..39341e4
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-text/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"COPYRIGHT":"ec82b96487e9e778ee610c7ab245162464782cfa1f555c2299333f8dbe5c036a","Cargo.toml":"082fec0c609bee66033710728861105fae511e459c3f9eee5f3e99b1524513af","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","README.md":"0c82015d302c9937e6376debd961350afeaeb6dde228aac95e3a3115c5813613","src/font.rs":"f4094760cf28ad8c99a5fa427702008d0638abbc1d0adc02bc7f874744ff00dd","src/font_collection.rs":"02de0ce2a61683314897a521d31ab9cc572a8b10ceda2ac47181fbe18bf4f235","src/font_descriptor.rs":"37b6af08ceaca9f15971ea009805bed00884294a035f152c617b43b333fdb471","src/font_manager.rs":"0abebafad90fc1cc74742493c812ec617a44a80969bab64807d6e32ae70033c0","src/frame.rs":"357691ef297a437ac88c2147312e3db0cb7f1c97c28bd6c22961b9931af961f6","src/framesetter.rs":"0f60f02dbb0673ec37914196b5c88f9533769e9015b5ec715b1bebd0b9d8d80c","src/lib.rs":"39cd4e5ed5fb1d59cea94ce549b49f9f6d8901d72b1a40d230ddb275f53d1125"},"package":"7210eea4baa4b51d7319d90e4787d8a2b472c8d5d9926dc39be85fecac0e6df7"}
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/core-text/COPYRIGHT b/third_party/rust_crates/vendor/core-text/COPYRIGHT
new file mode 100644
index 0000000..8b7291ad
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-text/COPYRIGHT
@@ -0,0 +1,5 @@
+Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+<LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+option. All files in the project carrying such notice may not be
+copied, modified, or distributed except according to those terms.
diff --git a/third_party/rust_crates/vendor/core-text/Cargo.toml b/third_party/rust_crates/vendor/core-text/Cargo.toml
new file mode 100644
index 0000000..774968c
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-text/Cargo.toml
@@ -0,0 +1,34 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "core-text"
+version = "13.1.1"
+authors = ["The Servo Project Developers"]
+description = "Bindings to the Core Text framework."
+license = "MIT/Apache-2.0"
+repository = "https://github.com/servo/core-foundation-rs"
+[dependencies.core-foundation]
+version = "0.6.2"
+
+[dependencies.core-graphics]
+version = "0.17"
+
+[dependencies.foreign-types]
+version = "0.3"
+
+[dependencies.libc]
+version = "0.2"
+
+[features]
+default = ["mountainlion"]
+mountainlion = []
diff --git a/third_party/rust_crates/vendor/core-text/LICENSE-APACHE b/third_party/rust_crates/vendor/core-text/LICENSE-APACHE
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-text/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/third_party/rust_crates/vendor/core-text/LICENSE-MIT b/third_party/rust_crates/vendor/core-text/LICENSE-MIT
new file mode 100644
index 0000000..807526f
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-text/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2012-2013 Mozilla Foundation
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/third_party/rust_crates/vendor/core-text/README.md b/third_party/rust_crates/vendor/core-text/README.md
new file mode 100644
index 0000000..b72bf11
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-text/README.md
@@ -0,0 +1,3 @@
+# core-text-rs
+
+[![Build Status](https://travis-ci.org/servo/core-text-rs.svg?branch=master)](https://travis-ci.org/servo/core-text-rs)
diff --git a/third_party/rust_crates/vendor/core-text/src/font.rs b/third_party/rust_crates/vendor/core-text/src/font.rs
new file mode 100644
index 0000000..891b59e6
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-text/src/font.rs
@@ -0,0 +1,613 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(non_upper_case_globals)]
+
+use font_descriptor;
+use font_descriptor::{CTFontDescriptor, CTFontDescriptorRef, CTFontOrientation};
+use font_descriptor::{CTFontSymbolicTraits, CTFontTraits, SymbolicTraitAccessors, TraitAccessors};
+
+use core_foundation::array::{CFArray, CFArrayRef};
+use core_foundation::base::{CFIndex, CFOptionFlags, CFType, CFTypeID, CFTypeRef, TCFType};
+use core_foundation::data::{CFData, CFDataRef};
+use core_foundation::dictionary::{CFDictionary, CFDictionaryRef};
+use core_foundation::number::CFNumber;
+use core_foundation::string::{CFString, CFStringRef, UniChar};
+use core_foundation::url::{CFURL, CFURLRef};
+use core_graphics::base::CGFloat;
+use core_graphics::context::CGContext;
+use core_graphics::font::{CGGlyph, CGFont};
+use core_graphics::geometry::{CGAffineTransform, CGPoint, CGRect, CGSize};
+use core_graphics::path::CGPath;
+
+use foreign_types::ForeignType;
+use libc::{self, size_t};
+use std::os::raw::c_void;
+use std::ptr;
+
+type CGContextRef = *mut <CGContext as ForeignType>::CType;
+type CGFontRef = *mut <CGFont as ForeignType>::CType;
+type CGPathRef = *mut <CGPath as ForeignType>::CType;
+
+pub type CTFontUIFontType = u32;
+// kCTFontNoFontType: CTFontUIFontType = -1;
+pub const kCTFontUserFontType: CTFontUIFontType = 0;
+pub const kCTFontUserFixedPitchFontType: CTFontUIFontType = 1;
+pub const kCTFontSystemFontType: CTFontUIFontType = 2;
+pub const kCTFontEmphasizedSystemFontType: CTFontUIFontType = 3;
+pub const kCTFontSmallSystemFontType: CTFontUIFontType = 4;
+pub const kCTFontSmallEmphasizedSystemFontType: CTFontUIFontType = 5;
+pub const kCTFontMiniSystemFontType: CTFontUIFontType = 6;
+pub const kCTFontMiniEmphasizedSystemFontType: CTFontUIFontType = 7;
+pub const kCTFontViewsFontType: CTFontUIFontType = 8;
+pub const kCTFontApplicationFontType: CTFontUIFontType = 9;
+pub const kCTFontLabelFontType: CTFontUIFontType = 10;
+pub const kCTFontMenuTitleFontType: CTFontUIFontType = 11;
+pub const kCTFontMenuItemFontType: CTFontUIFontType = 12;
+pub const kCTFontMenuItemMarkFontType: CTFontUIFontType = 13;
+pub const kCTFontMenuItemCmdKeyFontType: CTFontUIFontType = 14;
+pub const kCTFontWindowTitleFontType: CTFontUIFontType = 15;
+pub const kCTFontPushButtonFontType: CTFontUIFontType = 16;
+pub const kCTFontUtilityWindowTitleFontType: CTFontUIFontType = 17;
+pub const kCTFontAlertHeaderFontType: CTFontUIFontType = 18;
+pub const kCTFontSystemDetailFontType: CTFontUIFontType = 19;
+pub const kCTFontEmphasizedSystemDetailFontType: CTFontUIFontType = 20;
+pub const kCTFontToolbarFontType: CTFontUIFontType = 21;
+pub const kCTFontSmallToolbarFontType: CTFontUIFontType = 22;
+pub const kCTFontMessageFontType: CTFontUIFontType = 23;
+pub const kCTFontPaletteFontType: CTFontUIFontType = 24;
+pub const kCTFontToolTipFontType: CTFontUIFontType = 25;
+pub const kCTFontControlContentFontType: CTFontUIFontType = 26;
+
+pub type CTFontTableTag = u32;
+// TODO: create bindings for enum with 'chars' values
+
+pub type CTFontTableOptions = u32;
+pub const kCTFontTableOptionsNoOptions: CTFontTableOptions = 0;
+pub const kCTFontTableOptionsExcludeSynthetic: CTFontTableOptions = (1 << 0);
+
+pub type CTFontOptions = CFOptionFlags;
+pub const kCTFontOptionsDefault: CTFontOptions = 0;
+pub const kCTFontOptionsPreventAutoActivation: CTFontOptions = (1 << 0);
+pub const kCTFontOptionsPreferSystemFont: CTFontOptions = (1 << 2);
+
+#[repr(C)]
+pub struct __CTFont(c_void);
+
+pub type CTFontRef = *const __CTFont;
+
+declare_TCFType! {
+    CTFont, CTFontRef
+}
+impl_TCFType!(CTFont, CTFontRef, CTFontGetTypeID);
+impl_CFTypeDescription!(CTFont);
+
+pub fn new_from_CGFont(cgfont: &CGFont, pt_size: f64) -> CTFont {
+    unsafe {
+        let font_ref = CTFontCreateWithGraphicsFont(cgfont.as_ptr() as *mut _,
+                                                    pt_size as CGFloat,
+                                                    ptr::null(),
+                                                    ptr::null());
+        CTFont::wrap_under_create_rule(font_ref)
+    }
+}
+
+pub fn new_from_CGFont_with_variations(cgfont: &CGFont,
+                                       pt_size: f64,
+                                       variations: &CFDictionary<CFString, CFNumber>)
+                                       -> CTFont {
+    unsafe {
+        let font_desc = font_descriptor::new_from_variations(variations);
+        let font_ref = CTFontCreateWithGraphicsFont(cgfont.as_ptr() as *mut _,
+                                                    pt_size as CGFloat,
+                                                    ptr::null(),
+                                                    font_desc.as_concrete_TypeRef());
+        CTFont::wrap_under_create_rule(font_ref)
+    }
+}
+
+pub fn new_from_descriptor(desc: &CTFontDescriptor, pt_size: f64) -> CTFont {
+    unsafe {
+        let font_ref = CTFontCreateWithFontDescriptor(desc.as_concrete_TypeRef(),
+                                                      pt_size as CGFloat,
+                                                      ptr::null());
+        CTFont::wrap_under_create_rule(font_ref)
+    }
+}
+
+pub fn new_from_name(name: &str, pt_size: f64) -> Result<CTFont, ()> {
+    unsafe {
+        let name: CFString = name.parse().unwrap();
+        let font_ref = CTFontCreateWithName(name.as_concrete_TypeRef(),
+                                            pt_size as CGFloat,
+                                            ptr::null());
+        if font_ref.is_null() {
+            Err(())
+        } else {
+            Ok(CTFont::wrap_under_create_rule(font_ref))
+        }
+    }
+}
+
+impl CTFont {
+    // Properties
+    pub fn symbolic_traits(&self) -> CTFontSymbolicTraits {
+        unsafe {
+            CTFontGetSymbolicTraits(self.0)
+        }
+    }
+}
+
+impl CTFont {
+    // Creation methods
+    pub fn copy_to_CGFont(&self) -> CGFont {
+        unsafe {
+            let cgfont_ref = CTFontCopyGraphicsFont(self.0, ptr::null_mut());
+            CGFont::from_ptr(cgfont_ref as *mut _)
+        }
+    }
+
+    pub fn clone_with_font_size(&self, size: f64) -> CTFont {
+        unsafe {
+            let font_ref = CTFontCreateCopyWithAttributes(self.0,
+                                                          size as CGFloat,
+                                                          ptr::null(),
+                                                          ptr::null());
+            CTFont::wrap_under_create_rule(font_ref)
+        }
+    }
+
+    pub fn clone_with_symbolic_traits(&self,
+                                      trait_value: CTFontSymbolicTraits,
+                                      trait_mask: CTFontSymbolicTraits)
+                                      -> Option<CTFont> {
+        unsafe {
+            let font_ref = CTFontCreateCopyWithSymbolicTraits(self.0,
+                                                              0.0,
+                                                              ptr::null(),
+                                                              trait_value,
+                                                              trait_mask);
+            if font_ref.is_null() {
+                None
+            } else {
+                Some(CTFont::wrap_under_create_rule(font_ref))
+            }
+        }
+    }
+
+    // Names
+    pub fn family_name(&self) -> String {
+        unsafe {
+            let value = get_string_by_name_key(self, kCTFontFamilyNameKey);
+            value.expect("Fonts should always have a family name.")
+        }
+    }
+
+    pub fn face_name(&self) -> String {
+        unsafe {
+            let value = get_string_by_name_key(self, kCTFontSubFamilyNameKey);
+            value.expect("Fonts should always have a face name.")
+        }
+    }
+
+    pub fn unique_name(&self) -> String {
+        unsafe {
+            let value = get_string_by_name_key(self, kCTFontUniqueNameKey);
+            value.expect("Fonts should always have a unique name.")
+        }
+    }
+
+    pub fn postscript_name(&self) -> String {
+        unsafe {
+            let value = get_string_by_name_key(self, kCTFontPostScriptNameKey);
+            value.expect("Fonts should always have a PostScript name.")
+        }
+    }
+
+    pub fn display_name(&self) -> String {
+        unsafe {
+            let value = get_string_by_name_key(self, kCTFontFullNameKey);
+            value.expect("Fonts should always have a PostScript name.")
+        }
+    }
+
+    pub fn style_name(&self) -> String {
+        unsafe {
+            let value = get_string_by_name_key(self, kCTFontStyleNameKey);
+            value.expect("Fonts should always have a style name.")
+        }
+    }
+
+    pub fn all_traits(&self) -> CTFontTraits {
+        unsafe {
+            CTFontTraits::wrap_under_create_rule(CTFontCopyTraits(self.0))
+        }
+    }
+
+    // Font metrics
+    pub fn ascent(&self) -> CGFloat {
+        unsafe {
+            CTFontGetAscent(self.0)
+        }
+    }
+
+    pub fn descent(&self) -> CGFloat {
+        unsafe {
+            CTFontGetDescent(self.0)
+        }
+    }
+
+    pub fn underline_thickness(&self) -> CGFloat {
+        unsafe {
+            CTFontGetUnderlineThickness(self.0)
+        }
+    }
+
+    pub fn underline_position(&self) -> CGFloat {
+        unsafe {
+            CTFontGetUnderlinePosition(self.0)
+        }
+    }
+
+    pub fn slant_angle(&self) -> CGFloat {
+        unsafe {
+            CTFontGetSlantAngle(self.0)
+        }
+    }
+
+    pub fn cap_height(&self) -> CGFloat {
+        unsafe {
+            CTFontGetCapHeight(self.0)
+        }
+    }
+
+    pub fn bounding_box(&self) -> CGRect {
+        unsafe {
+            CTFontGetBoundingBox(self.0)
+        }
+    }
+
+    pub fn leading(&self) -> CGFloat {
+        unsafe {
+            CTFontGetLeading(self.0)
+        }
+    }
+
+    pub fn units_per_em(&self) -> libc::c_uint {
+        unsafe {
+            CTFontGetUnitsPerEm(self.0)
+        }
+    }
+
+    pub fn x_height(&self) -> CGFloat {
+        unsafe {
+            CTFontGetXHeight(self.0)
+        }
+    }
+
+    pub fn pt_size(&self) -> CGFloat {
+        unsafe {
+            CTFontGetSize(self.0)
+        }
+    }
+
+    pub unsafe fn get_glyphs_for_characters(&self,
+                                            characters: *const UniChar,
+                                            glyphs: *mut CGGlyph,
+                                            count: CFIndex)
+                                            -> bool {
+        CTFontGetGlyphsForCharacters(self.0, characters, glyphs, count)
+    }
+
+    pub unsafe fn get_advances_for_glyphs(&self,
+                                          orientation: CTFontOrientation,
+                                          glyphs: *const CGGlyph,
+                                          advances: *mut CGSize,
+                                          count: CFIndex)
+                                          -> f64 {
+        CTFontGetAdvancesForGlyphs(self.0, orientation, glyphs, advances, count) as f64
+    }
+
+    pub unsafe fn get_vertical_translations_for_glyphs(&self,
+                                                       orientation: CTFontOrientation,
+                                                       glyphs: *const CGGlyph,
+                                                       translations: *mut CGSize,
+                                                       count: CFIndex) {
+        CTFontGetVerticalTranslationsForGlyphs(self.0,
+                                               orientation,
+                                               glyphs,
+                                               translations,
+                                               count)
+    }
+
+    pub fn get_font_table(&self, tag: u32) -> Option<CFData> {
+        unsafe {
+            let result = CTFontCopyTable(self.0,
+                                         tag as CTFontTableTag,
+                                         kCTFontTableOptionsExcludeSynthetic);
+            if result.is_null() {
+                None
+            } else {
+                Some(CFData::wrap_under_create_rule(result))
+            }
+        }
+    }
+
+    pub fn get_bounding_rects_for_glyphs(&self, orientation: CTFontOrientation, glyphs: &[CGGlyph])
+                                         -> CGRect {
+        unsafe {
+            CTFontGetBoundingRectsForGlyphs(self.as_concrete_TypeRef(),
+                                            orientation,
+                                            glyphs.as_ptr(),
+                                            ptr::null_mut(),
+                                            glyphs.len() as CFIndex)
+        }
+    }
+
+    pub fn draw_glyphs(&self, glyphs: &[CGGlyph], positions: &[CGPoint], context: CGContext) {
+        assert!(glyphs.len() == positions.len());
+        unsafe {
+            CTFontDrawGlyphs(self.as_concrete_TypeRef(),
+                             glyphs.as_ptr(),
+                             positions.as_ptr(),
+                             glyphs.len() as size_t,
+                             context.as_ptr())
+        }
+    }
+
+    pub fn url(&self) -> Option<CFURL> {
+        unsafe {
+            let result = CTFontCopyAttribute(self.0, kCTFontURLAttribute);
+            if result.is_null() {
+                None
+            } else {
+                Some(CFURL::wrap_under_create_rule(result as CFURLRef))
+            }
+        }
+    }
+
+    pub fn get_variation_axes(&self) -> Option<CFArray<CFDictionary<CFString, CFType>>> {
+        unsafe {
+            let axes = CTFontCopyVariationAxes(self.0);
+            if axes.is_null() {
+                return None;
+            }
+            Some(TCFType::wrap_under_create_rule(axes))
+        }
+    }
+
+    pub fn create_path_for_glyph(&self, glyph: CGGlyph, matrix: &CGAffineTransform)
+                                 -> Result<CGPath, ()> {
+        unsafe {
+            let path = CTFontCreatePathForGlyph(self.0, glyph, matrix);
+            if path.is_null() {
+                Err(())
+            } else {
+                Ok(CGPath::from_ptr(path))
+            }
+        }
+    }
+
+    #[inline]
+    pub fn glyph_count(&self) -> CFIndex {
+        unsafe {
+            CTFontGetGlyphCount(self.0)
+        }
+    }
+}
+
+// Helper methods
+fn get_string_by_name_key(font: &CTFont, name_key: CFStringRef) -> Option<String> {
+    unsafe {
+        let result = CTFontCopyName(font.as_concrete_TypeRef(), name_key);
+        if result.is_null() {
+            None
+        } else {
+            Some(CFString::wrap_under_create_rule(result).to_string())
+        }
+    }
+}
+
+pub fn debug_font_names(font: &CTFont) {
+    fn get_key(font: &CTFont, key: CFStringRef) -> String {
+        get_string_by_name_key(font, key).unwrap()
+    }
+
+    unsafe {
+        println!("kCTFontFamilyNameKey: {}", get_key(font, kCTFontFamilyNameKey));
+        println!("kCTFontSubFamilyNameKey: {}", get_key(font, kCTFontSubFamilyNameKey));
+        println!("kCTFontStyleNameKey: {}", get_key(font, kCTFontStyleNameKey));
+        println!("kCTFontUniqueNameKey: {}", get_key(font, kCTFontUniqueNameKey));
+        println!("kCTFontFullNameKey: {}", get_key(font, kCTFontFullNameKey));
+        println!("kCTFontPostScriptNameKey: {}", get_key(font, kCTFontPostScriptNameKey));
+    }
+}
+
+pub fn debug_font_traits(font: &CTFont) {
+    let sym = font.symbolic_traits();
+    println!("kCTFontItalicTrait: {}", sym.is_italic());
+    println!("kCTFontBoldTrait: {}", sym.is_bold());
+    println!("kCTFontExpandedTrait: {}", sym.is_expanded());
+    println!("kCTFontCondensedTrait: {}", sym.is_condensed());
+    println!("kCTFontMonoSpaceTrait: {}", sym.is_monospace());
+
+    let traits = font.all_traits();
+    println!("kCTFontWeightTrait: {}", traits.normalized_weight());
+    println!("kCTFontWidthTrait: {}", traits.normalized_width());
+//    println!("kCTFontSlantTrait: {}", traits.normalized_slant());
+}
+
+#[cfg(feature = "mountainlion")]
+pub fn cascade_list_for_languages(font: &CTFont, language_pref_list: &CFArray<CFString>) -> CFArray<CTFontDescriptor> {
+    unsafe {
+        let font_collection_ref =
+            CTFontCopyDefaultCascadeListForLanguages(font.as_concrete_TypeRef(),
+                                                     language_pref_list.as_concrete_TypeRef());
+        CFArray::wrap_under_create_rule(font_collection_ref)
+    }
+}
+
+#[link(name = "CoreText", kind = "framework")]
+extern {
+    /*
+     * CTFont.h
+     */
+
+    /* Name Specifier Constants */
+    //static kCTFontCopyrightNameKey: CFStringRef;
+    static kCTFontFamilyNameKey: CFStringRef;
+    static kCTFontSubFamilyNameKey: CFStringRef;
+    static kCTFontStyleNameKey: CFStringRef;
+    static kCTFontUniqueNameKey: CFStringRef;
+    static kCTFontFullNameKey: CFStringRef;
+    //static kCTFontVersionNameKey: CFStringRef;
+    static kCTFontPostScriptNameKey: CFStringRef;
+    //static kCTFontTrademarkNameKey: CFStringRef;
+    //static kCTFontManufacturerNameKey: CFStringRef;
+    //static kCTFontDesignerNameKey: CFStringRef;
+    //static kCTFontDescriptionNameKey: CFStringRef;
+    //static kCTFontVendorURLNameKey: CFStringRef;
+    //static kCTFontDesignerURLNameKey: CFStringRef;
+    //static kCTFontLicenseNameKey: CFStringRef;
+    //static kCTFontLicenseURLNameKey: CFStringRef;
+    //static kCTFontSampleTextNameKey: CFStringRef;
+    //static kCTFontPostScriptCIDNameKey: CFStringRef;
+
+    //static kCTFontVariationAxisIdentifierKey: CFStringRef;
+    //static kCTFontVariationAxisMinimumValueKey: CFStringRef;
+    //static kCTFontVariationAxisMaximumValueKey: CFStringRef;
+    //static kCTFontVariationAxisDefaultValueKey: CFStringRef;
+    //static kCTFontVariationAxisNameKey: CFStringRef;
+
+    //static kCTFontFeatureTypeIdentifierKey: CFStringRef;
+    //static kCTFontFeatureTypeNameKey: CFStringRef;
+    //static kCTFontFeatureTypeExclusiveKey: CFStringRef;
+    //static kCTFontFeatureTypeSelectorsKey: CFStringRef;
+    //static kCTFontFeatureSelectorIdentifierKey: CFStringRef;
+    //static kCTFontFeatureSelectorNameKey: CFStringRef;
+    //static kCTFontFeatureSelectorDefaultKey: CFStringRef;
+    //static kCTFontFeatureSelectorSettingKey: CFStringRef;
+
+    static kCTFontURLAttribute: CFStringRef;
+
+    // N.B. Unlike most Cocoa bindings, this extern block is organized according
+    // to the documentation's Functions By Task listing, because there so many functions.
+
+    /* Creating Fonts */
+    fn CTFontCreateWithName(name: CFStringRef, size: CGFloat, matrix: *const CGAffineTransform) -> CTFontRef;
+    //fn CTFontCreateWithNameAndOptions
+    fn CTFontCreateWithFontDescriptor(descriptor: CTFontDescriptorRef, size: CGFloat,
+                                      matrix: *const CGAffineTransform) -> CTFontRef;
+    //fn CTFontCreateWithFontDescriptorAndOptions
+    //fn CTFontCreateUIFontForLanguage
+    fn CTFontCreateCopyWithAttributes(font: CTFontRef, size: CGFloat, matrix: *const CGAffineTransform,
+                                      attributes: CTFontDescriptorRef) -> CTFontRef;
+    fn CTFontCreateCopyWithSymbolicTraits(font: CTFontRef,
+                                          size: CGFloat,
+                                          matrix: *const CGAffineTransform,
+                                          symTraitValue: CTFontSymbolicTraits,
+                                          symTraitMask: CTFontSymbolicTraits)
+                                          -> CTFontRef;
+    //fn CTFontCreateCopyWithFamily
+    //fn CTFontCreateForString
+
+    /* Getting Font Data */
+    //fn CTFontCopyFontDescriptor(font: CTFontRef) -> CTFontDescriptorRef;
+    fn CTFontCopyAttribute(font: CTFontRef, attribute: CFStringRef) -> CFTypeRef;
+    fn CTFontGetSize(font: CTFontRef) -> CGFloat;
+    //fn CTFontGetMatrix
+    fn CTFontGetSymbolicTraits(font: CTFontRef) -> CTFontSymbolicTraits;
+    fn CTFontCopyTraits(font: CTFontRef) -> CFDictionaryRef;
+
+    /* Getting Font Names */
+    //fn CTFontCopyPostScriptName(font: CTFontRef) -> CFStringRef;
+    //fn CTFontCopyFamilyName(font: CTFontRef) -> CFStringRef;
+    //fn CTFontCopyFullName(font: CTFontRef) -> CFStringRef;
+    //fn CTFontCopyDisplayName(font: CTFontRef) -> CFStringRef;
+    fn CTFontCopyName(font: CTFontRef, nameKey: CFStringRef) -> CFStringRef;
+    //fn CTFontCopyLocalizedName(font: CTFontRef, nameKey: CFStringRef,
+    //                           language: *CFStringRef) -> CFStringRef;
+    #[cfg(feature = "mountainlion")]
+    fn CTFontCopyDefaultCascadeListForLanguages(font: CTFontRef, languagePrefList: CFArrayRef) -> CFArrayRef;
+
+
+    /* Working With Encoding */
+    //fn CTFontCopyCharacterSet
+    //fn CTFontGetStringEncoding
+    //fn CTFontCopySupportedLanguages
+
+    /* Getting Font Metrics */
+    fn CTFontGetAscent(font: CTFontRef) -> CGFloat;
+    fn CTFontGetDescent(font: CTFontRef) -> CGFloat;
+    fn CTFontGetLeading(font: CTFontRef) -> CGFloat;
+    fn CTFontGetUnitsPerEm(font: CTFontRef) -> libc::c_uint;
+    fn CTFontGetGlyphCount(font: CTFontRef) -> CFIndex;
+    fn CTFontGetBoundingBox(font: CTFontRef) -> CGRect;
+    fn CTFontGetUnderlinePosition(font: CTFontRef) -> CGFloat;
+    fn CTFontGetUnderlineThickness(font: CTFontRef) -> CGFloat;
+    fn CTFontGetSlantAngle(font: CTFontRef) -> CGFloat;
+    fn CTFontGetCapHeight(font: CTFontRef) -> CGFloat;
+    fn CTFontGetXHeight(font: CTFontRef) -> CGFloat;
+
+    /* Getting Glyph Data */
+    fn CTFontCreatePathForGlyph(font: CTFontRef, glyph: CGGlyph, matrix: *const CGAffineTransform)
+                                -> CGPathRef;
+    //fn CTFontGetGlyphWithName
+    fn CTFontGetBoundingRectsForGlyphs(font: CTFontRef,
+                                       orientation: CTFontOrientation,
+                                       glyphs: *const CGGlyph,
+                                       boundingRects: *mut CGRect,
+                                       count: CFIndex)
+                                       -> CGRect;
+    fn CTFontGetAdvancesForGlyphs(font: CTFontRef,
+                                  orientation: CTFontOrientation,
+                                  glyphs: *const CGGlyph,
+                                  advances: *mut CGSize,
+                                  count: CFIndex)
+                                  -> libc::c_double;
+    fn CTFontGetVerticalTranslationsForGlyphs(font: CTFontRef,
+                                              orientation: CTFontOrientation,
+                                              glyphs: *const CGGlyph,
+                                              translations: *mut CGSize,
+                                              count: CFIndex);
+
+    /* Working With Font Variations */
+    fn CTFontCopyVariationAxes(font: CTFontRef) -> CFArrayRef;
+    //fn CTFontCopyVariation
+
+    /* Getting Font Features */
+    //fn CTFontCopyFeatures
+    //fn CTFontCopyFeatureSettings
+
+    /* Working with Glyphs */
+    fn CTFontGetGlyphsForCharacters(font: CTFontRef, characters: *const UniChar, glyphs: *mut CGGlyph, count: CFIndex) -> bool;
+    fn CTFontDrawGlyphs(font: CTFontRef,
+                        glyphs: *const CGGlyph,
+                        positions: *const CGPoint,
+                        count: size_t,
+                        context: CGContextRef);
+    //fn CTFontGetLigatureCaretPositions
+
+    /* Converting Fonts */
+    fn CTFontCopyGraphicsFont(font: CTFontRef, attributes: *mut CTFontDescriptorRef)
+                              -> CGFontRef;
+    fn CTFontCreateWithGraphicsFont(graphicsFont: CGFontRef, size: CGFloat,
+                                    matrix: *const CGAffineTransform,
+                                    attributes: CTFontDescriptorRef) -> CTFontRef;
+    //fn CTFontGetPlatformFont
+    //fn CTFontCreateWithPlatformFont
+    //fn CTFontCreateWithQuickdrawInstance
+
+    /* Getting Font Table Data */
+    //fn CTFontCopyAvailableTables(font: CTFontRef, options: CTFontTableOptions) -> CFArrayRef;
+    fn CTFontCopyTable(font: CTFontRef, table: CTFontTableTag, options: CTFontTableOptions) -> CFDataRef;
+
+    fn CTFontGetTypeID() -> CFTypeID;
+}
+
diff --git a/third_party/rust_crates/vendor/core-text/src/font_collection.rs b/third_party/rust_crates/vendor/core-text/src/font_collection.rs
new file mode 100644
index 0000000..8f3f2c5
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-text/src/font_collection.rs
@@ -0,0 +1,131 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use font_descriptor;
+use font_descriptor::{CTFontDescriptor, CTFontDescriptorCreateMatchingFontDescriptors};
+use font_manager::{CTFontManagerCopyAvailableFontFamilyNames, CTFontManagerCopyAvailablePostScriptNames};
+
+use core_foundation::array::{CFArray, CFArrayRef};
+use core_foundation::base::{CFTypeID, TCFType};
+use core_foundation::dictionary::{CFDictionary, CFDictionaryRef};
+use core_foundation::number::CFNumber;
+use core_foundation::set::CFSet;
+use core_foundation::string::{CFString, CFStringRef};
+
+use std::os::raw::c_void;
+
+#[repr(C)]
+pub struct __CTFontCollection(c_void);
+
+pub type CTFontCollectionRef = *const __CTFontCollection;
+
+declare_TCFType! {
+    CTFontCollection, CTFontCollectionRef
+}
+impl_TCFType!(CTFontCollection, CTFontCollectionRef, CTFontCollectionGetTypeID);
+impl_CFTypeDescription!(CTFontCollection);
+
+
+impl CTFontCollection {
+    pub fn get_descriptors(&self) -> Option<CFArray<CTFontDescriptor>> {
+        // surprise! this function follows the Get rule, despite being named *Create*.
+        // So we have to addRef it to avoid CTFontCollection from double freeing it later.
+        unsafe {
+            let font_descriptors = CTFontCollectionCreateMatchingFontDescriptors(self.0);
+            if font_descriptors.is_null() {
+                // This returns null if there are no matching font descriptors.
+                None
+            } else {
+                Some(CFArray::wrap_under_get_rule(font_descriptors))
+            }
+        }
+    }
+}
+
+pub fn new_from_descriptors(descs: &CFArray<CTFontDescriptor>) -> CTFontCollection {
+    unsafe {
+        let key = CFString::wrap_under_get_rule(kCTFontCollectionRemoveDuplicatesOption);
+        let value = CFNumber::from(1i64);
+        let options = CFDictionary::from_CFType_pairs(&[ (key.as_CFType(), value.as_CFType()) ]);
+        let font_collection_ref =
+            CTFontCollectionCreateWithFontDescriptors(descs.as_concrete_TypeRef(),
+                                                      options.as_concrete_TypeRef());
+        CTFontCollection::wrap_under_create_rule(font_collection_ref)
+    }
+}
+
+pub fn create_for_all_families() -> CTFontCollection {
+    unsafe {
+        let key = CFString::wrap_under_get_rule(kCTFontCollectionRemoveDuplicatesOption);
+        let value = CFNumber::from(1i64);
+        let options = CFDictionary::from_CFType_pairs(&[ (key.as_CFType(), value.as_CFType()) ]);
+        let font_collection_ref =
+            CTFontCollectionCreateFromAvailableFonts(options.as_concrete_TypeRef());
+        CTFontCollection::wrap_under_create_rule(font_collection_ref)
+    }
+}
+
+pub fn create_for_family(family: &str) -> Option<CTFontCollection> {
+    use font_descriptor::kCTFontFamilyNameAttribute;
+
+    unsafe {
+        let family_attr = CFString::wrap_under_get_rule(kCTFontFamilyNameAttribute);
+        let family_name: CFString = family.parse().unwrap();
+        let specified_attrs = CFDictionary::from_CFType_pairs(&[
+            (family_attr.clone(), family_name.as_CFType())
+        ]);
+
+        let wildcard_desc: CTFontDescriptor =
+            font_descriptor::new_from_attributes(&specified_attrs);
+        let mandatory_attrs = CFSet::from_slice(&[ family_attr.as_CFType() ]);
+        let matched_descs = CTFontDescriptorCreateMatchingFontDescriptors(
+                wildcard_desc.as_concrete_TypeRef(),
+                mandatory_attrs.as_concrete_TypeRef());
+        if matched_descs.is_null() {
+            return None;
+        }
+        let matched_descs = CFArray::wrap_under_create_rule(matched_descs);
+        // I suppose one doesn't even need the CTFontCollection object at this point.
+        // But we stick descriptors into and out of it just to provide a nice wrapper API.
+        Some(new_from_descriptors(&matched_descs))
+    }
+}
+
+pub fn get_family_names() -> CFArray<CFString> {
+    unsafe {
+        CFArray::wrap_under_create_rule(CTFontManagerCopyAvailableFontFamilyNames())
+    }
+}
+
+pub fn get_postscript_names() -> CFArray<CFString> {
+    unsafe {
+        CFArray::wrap_under_create_rule(CTFontManagerCopyAvailablePostScriptNames())
+    }
+}
+
+extern {
+    /*
+     * CTFontCollection.h
+     */
+
+    static kCTFontCollectionRemoveDuplicatesOption: CFStringRef;
+
+    //fn CTFontCollectionCreateCopyWithFontDescriptors(original: CTFontCollectionRef,
+    //                                                 descriptors: CFArrayRef,
+    //                                                 options: CFDictionaryRef) -> CTFontCollectionRef;
+    fn CTFontCollectionCreateFromAvailableFonts(options: CFDictionaryRef) -> CTFontCollectionRef;
+    // this stupid function doesn't actually do any wildcard expansion;
+    // it just chooses the best match. Use
+    // CTFontDescriptorCreateMatchingDescriptors instead.
+    fn CTFontCollectionCreateMatchingFontDescriptors(collection: CTFontCollectionRef) -> CFArrayRef;
+    fn CTFontCollectionCreateWithFontDescriptors(descriptors: CFArrayRef,
+                                                 options: CFDictionaryRef) -> CTFontCollectionRef;
+    //fn CTFontCollectionCreateMatchingFontDescriptorsSortedWithCallback;
+    fn CTFontCollectionGetTypeID() -> CFTypeID;
+}
diff --git a/third_party/rust_crates/vendor/core-text/src/font_descriptor.rs b/third_party/rust_crates/vendor/core-text/src/font_descriptor.rs
new file mode 100644
index 0000000..793629f
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-text/src/font_descriptor.rs
@@ -0,0 +1,369 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(non_upper_case_globals)]
+
+use core_foundation::array::CFArrayRef;
+use core_foundation::base::{CFType, CFTypeID, CFTypeRef, TCFType};
+use core_foundation::dictionary::{CFDictionary, CFDictionaryRef};
+use core_foundation::number::{CFNumber, CFNumberRef};
+use core_foundation::set::CFSetRef;
+use core_foundation::string::{CFString, CFStringRef};
+use core_foundation::url::CFURL;
+use core_graphics::base::CGFloat;
+
+use std::os::raw::c_void;
+use std::mem;
+use std::path::PathBuf;
+
+/*
+* CTFontTraits.h
+*/
+// actually, these are extern enums
+pub type CTFontFormat = u32;
+pub const kCTFontFormatUnrecognized: CTFontFormat = 0;
+pub const kCTFontFormatOpenTypePostScript: CTFontFormat = 1;
+pub const kCTFontFormatOpenTypeTrueType: CTFontFormat = 2;
+pub const kCTFontFormatTrueType: CTFontFormat = 3;
+pub const kCTFontFormatPostScript: CTFontFormat = 4;
+pub const kCTFontFormatBitmap: CTFontFormat = 5;
+
+pub const kCTFontClassMaskShift: u32 = 28;
+
+pub type CTFontSymbolicTraits = u32;
+pub const kCTFontItalicTrait: CTFontSymbolicTraits = (1 << 0);
+pub const kCTFontBoldTrait: CTFontSymbolicTraits = (1 << 1);
+pub const kCTFontExpandedTrait: CTFontSymbolicTraits = (1 << 5);
+pub const kCTFontCondensedTrait: CTFontSymbolicTraits = (1 << 6);
+pub const kCTFontMonoSpaceTrait: CTFontSymbolicTraits = (1 << 10);
+pub const kCTFontVerticalTrait: CTFontSymbolicTraits = (1 << 11);
+pub const kCTFontUIOptimizedTrait: CTFontSymbolicTraits = (1 << 12);
+pub const kCTFontColorGlyphsTrait: CTFontSymbolicTraits = (1 << 13);
+pub const kCTFontClassMaskTrait: CTFontSymbolicTraits = (15 << kCTFontClassMaskShift );
+
+pub trait SymbolicTraitAccessors {
+    fn is_italic(&self) -> bool;
+    fn is_bold(&self) -> bool;
+    fn is_expanded(&self) -> bool;
+    fn is_condensed(&self) -> bool;
+    fn is_monospace(&self) -> bool;
+    fn is_vertical(&self) -> bool;
+}
+
+impl SymbolicTraitAccessors for CTFontSymbolicTraits {
+    fn is_italic(&self) -> bool { (*self & kCTFontItalicTrait) != 0 }
+    fn is_bold(&self) -> bool { (*self & kCTFontBoldTrait) != 0 }
+    fn is_expanded(&self) -> bool { (*self & kCTFontExpandedTrait) != 0 }
+    fn is_condensed(&self) -> bool { (*self & kCTFontCondensedTrait) != 0 }
+    fn is_monospace(&self) -> bool { (*self & kCTFontMonoSpaceTrait) != 0 }
+    fn is_vertical(&self) -> bool { (*self & kCTFontVerticalTrait) != 0 }
+}
+
+pub type CTFontStylisticClass = u32;
+pub const kCTFontUnknownClass: CTFontStylisticClass = (0 << kCTFontClassMaskShift );
+pub const kCTFontOldStyleSerifsClass: CTFontStylisticClass = (1 << kCTFontClassMaskShift );
+pub const kCTFontTransitionalSerifsClass: CTFontStylisticClass = (2 << kCTFontClassMaskShift );
+pub const kCTFontModernSerifsClass: CTFontStylisticClass = (3 << kCTFontClassMaskShift );
+pub const kCTFontClarendonSerifsClass: CTFontStylisticClass = (4 << kCTFontClassMaskShift );
+pub const kCTFontSlabSerifsClass: CTFontStylisticClass = (5 << kCTFontClassMaskShift );
+pub const kCTFontFreeformSerifsClass: CTFontStylisticClass = (7 << kCTFontClassMaskShift );
+pub const kCTFontSansSerifClass: CTFontStylisticClass = (8 << kCTFontClassMaskShift );
+pub const kCTFontOrnamentalsClass: CTFontStylisticClass = (9 << kCTFontClassMaskShift );
+pub const kCTFontScriptsClass: CTFontStylisticClass = (10 << kCTFontClassMaskShift );
+pub const kCTFontSymbolicClass: CTFontStylisticClass = (12 << kCTFontClassMaskShift );
+
+pub trait StylisticClassAccessors {
+    fn is_serif(&self) -> bool;
+    fn is_sans_serif(&self) -> bool;
+    fn is_script(&self) -> bool;
+    fn is_fantasy(&self) -> bool;
+    fn is_symbols(&self) -> bool;
+}
+
+impl StylisticClassAccessors for CTFontStylisticClass {
+    fn is_serif(&self) -> bool {
+        let any_serif_class = kCTFontOldStyleSerifsClass
+            | kCTFontTransitionalSerifsClass
+            | kCTFontModernSerifsClass
+            | kCTFontClarendonSerifsClass
+            | kCTFontSlabSerifsClass
+            | kCTFontFreeformSerifsClass;
+
+        (*self & any_serif_class) != 0
+    }
+
+    fn is_sans_serif(&self) -> bool {
+        (*self & kCTFontSansSerifClass) != 0
+    }
+
+    fn is_script(&self) -> bool {
+        (*self & kCTFontScriptsClass) != 0
+    }
+
+    fn is_fantasy(&self) -> bool {
+        (*self & kCTFontOrnamentalsClass) != 0
+    }
+
+    fn is_symbols(&self) -> bool {
+        (*self & kCTFontSymbolicClass) != 0
+    }
+}
+
+pub type CTFontAttributes = CFDictionary;
+
+pub type CTFontTraits = CFDictionary<CFString, CFType>;
+
+pub trait TraitAccessors {
+    fn symbolic_traits(&self) -> CTFontSymbolicTraits;
+    fn normalized_weight(&self) -> f64;
+    fn normalized_width(&self) -> f64;
+    fn normalized_slant(&self) -> f64;
+}
+
+trait TraitAccessorPrivate {
+    fn extract_number_for_key(&self, key: CFStringRef) -> CFNumber;
+}
+
+impl TraitAccessorPrivate for CTFontTraits {
+    fn extract_number_for_key(&self, key: CFStringRef) -> CFNumber {
+        let cftype = self.get(key);
+        cftype.downcast::<CFNumber>().unwrap()
+    }
+
+}
+
+impl TraitAccessors for CTFontTraits {
+    fn symbolic_traits(&self) -> CTFontSymbolicTraits {
+        unsafe {
+            let number = self.extract_number_for_key(kCTFontSymbolicTrait);
+            number.to_i64().unwrap() as u32
+        }
+    }
+
+    fn normalized_weight(&self) -> f64 {
+        unsafe {
+            let number = self.extract_number_for_key(kCTFontWeightTrait);
+            number.to_f64().unwrap()
+        }
+    }
+
+    fn normalized_width(&self) -> f64 {
+        unsafe {
+            let number = self.extract_number_for_key(kCTFontWidthTrait);
+            number.to_f64().unwrap()
+        }
+    }
+
+    fn normalized_slant(&self) -> f64 {
+        unsafe {
+            let number = self.extract_number_for_key(kCTFontSlantTrait);
+            number.to_f64().unwrap()
+        }
+    }
+}
+
+/*
+* CTFontDescriptor.h
+*/
+pub type CTFontOrientation = u32;
+pub const kCTFontDefaultOrientation: CTFontOrientation = 0;
+pub const kCTFontHorizontalOrientation: CTFontOrientation = 1;
+pub const kCTFontVerticalOrientation: CTFontOrientation = 2;
+
+pub type CTFontPriority = u32;
+pub const kCTFontPrioritySystem: CTFontPriority = 10000;
+pub const kCTFontPriorityNetwork: CTFontPriority = 20000;
+pub const kCTFontPriorityComputer: CTFontPriority = 30000;
+pub const kCTFontPriorityUser: CTFontPriority = 40000;
+pub const kCTFontPriorityDynamic: CTFontPriority = 50000;
+pub const kCTFontPriorityProcess: CTFontPriority = 60000;
+
+#[repr(C)]
+pub struct __CTFontDescriptor(c_void);
+
+pub type CTFontDescriptorRef = *const __CTFontDescriptor;
+
+declare_TCFType! {
+    CTFontDescriptor, CTFontDescriptorRef
+}
+impl_TCFType!(CTFontDescriptor, CTFontDescriptorRef, CTFontDescriptorGetTypeID);
+impl_CFTypeDescription!(CTFontDescriptor);
+
+
+impl CTFontDescriptor {
+    fn get_string_attribute(&self, attribute: CFStringRef) -> Option<String> {
+        unsafe {
+            let value = CTFontDescriptorCopyAttribute(self.0, attribute);
+            if value.is_null() {
+                return None
+            }
+
+            let value = CFType::wrap_under_create_rule(value);
+            assert!(value.instance_of::<CFString>());
+            let s = CFString::wrap_under_get_rule(mem::transmute(value.as_CFTypeRef()));
+            Some(s.to_string())
+        }
+    }
+
+}
+
+impl CTFontDescriptor {
+    pub fn family_name(&self) -> String {
+        unsafe {
+            let value = self.get_string_attribute(kCTFontFamilyNameAttribute);
+            value.expect("A font must have a non-null family name.")
+        }
+    }
+
+    pub fn font_name(&self) -> String {
+        unsafe {
+            let value = self.get_string_attribute(kCTFontNameAttribute);
+            value.expect("A font must have a non-null name.")
+        }
+    }
+
+    pub fn style_name(&self) -> String {
+        unsafe {
+            let value = self.get_string_attribute(kCTFontStyleNameAttribute);
+            value.expect("A font must have a non-null style name.")
+        }
+    }
+
+    pub fn display_name(&self) -> String {
+        unsafe {
+            let value = self.get_string_attribute(kCTFontDisplayNameAttribute);
+            value.expect("A font must have a non-null display name.")
+        }
+    }
+
+    pub fn font_path(&self) -> Option<PathBuf> {
+        unsafe {
+            let value = CTFontDescriptorCopyAttribute(self.0, kCTFontURLAttribute);
+            if value.is_null() {
+                return None;
+            }
+
+            let value = CFType::wrap_under_create_rule(value);
+            assert!(value.instance_of::<CFURL>());
+            let url = CFURL::wrap_under_get_rule(mem::transmute(value.as_CFTypeRef()));
+            url.to_path()
+        }
+    }
+
+    pub fn traits(&self) -> CTFontTraits {
+        unsafe {
+            let value = CTFontDescriptorCopyAttribute(self.0, kCTFontTraitsAttribute);
+            assert!(!value.is_null());
+            let value = CFType::wrap_under_create_rule(value);
+            assert!(value.instance_of::<CFDictionary>());
+            CFDictionary::wrap_under_get_rule(mem::transmute(value.as_CFTypeRef()))
+        }
+    }
+}
+
+pub fn new_from_attributes(attributes: &CFDictionary<CFString, CFType>) -> CTFontDescriptor {
+    unsafe {
+        let result: CTFontDescriptorRef =
+            CTFontDescriptorCreateWithAttributes(attributes.as_concrete_TypeRef());
+        CTFontDescriptor::wrap_under_create_rule(result)
+    }
+}
+
+pub fn new_from_variations(variations: &CFDictionary<CFString, CFNumber>) -> CTFontDescriptor {
+    unsafe {
+        let var_key = CFString::wrap_under_get_rule(kCTFontVariationAttribute);
+        let var_val = CFType::wrap_under_get_rule(variations.as_CFTypeRef());
+        let attributes = CFDictionary::from_CFType_pairs(&[(var_key, var_val)]);
+        new_from_attributes(&attributes)
+    }
+}
+
+pub fn new_from_postscript_name(name: &CFString) -> CTFontDescriptor {
+    unsafe {
+        let result: CTFontDescriptorRef =
+            CTFontDescriptorCreateWithNameAndSize(name.as_concrete_TypeRef(), 0.0);
+        CTFontDescriptor::wrap_under_create_rule(result)
+    }
+}
+
+pub fn debug_descriptor(desc: &CTFontDescriptor) {
+    println!("family: {}", desc.family_name());
+    println!("name: {}", desc.font_name());
+    println!("style: {}", desc.style_name());
+    println!("display: {}", desc.display_name());
+    println!("path: {:?}", desc.font_path());
+    desc.show();
+}
+
+extern {
+    /*
+     * CTFontTraits.h
+     */
+
+    // font trait constants
+    pub static kCTFontSymbolicTrait: CFStringRef;
+    pub static kCTFontWeightTrait: CFStringRef;
+    pub static kCTFontWidthTrait: CFStringRef;
+    pub static kCTFontSlantTrait: CFStringRef;
+
+    /*
+     * CTFontDescriptor.h
+     */
+
+    // font attribute constants. Note that the name-related attributes
+    // here are somewhat flaky. Servo creates CTFont instances and
+    // then uses CTFontCopyName to get more fine-grained names.
+    pub static kCTFontURLAttribute:                  CFStringRef; // value: CFURLRef
+    pub static kCTFontNameAttribute:                 CFStringRef; // value: CFStringRef
+    pub static kCTFontDisplayNameAttribute:          CFStringRef; // value: CFStringRef
+    pub static kCTFontFamilyNameAttribute:           CFStringRef; // value: CFStringRef
+    pub static kCTFontStyleNameAttribute:            CFStringRef; // value: CFStringRef
+    pub static kCTFontTraitsAttribute:               CFStringRef;
+    pub static kCTFontVariationAttribute:            CFStringRef;
+    pub static kCTFontSizeAttribute:                 CFStringRef;
+    pub static kCTFontMatrixAttribute:               CFStringRef;
+    pub static kCTFontCascadeListAttribute:          CFStringRef;
+    pub static kCTFontCharacterSetAttribute:         CFStringRef;
+    pub static kCTFontLanguagesAttribute:            CFStringRef;
+    pub static kCTFontBaselineAdjustAttribute:       CFStringRef;
+    pub static kCTFontMacintoshEncodingsAttribute:   CFStringRef;
+    pub static kCTFontFeaturesAttribute:             CFStringRef;
+    pub static kCTFontFeatureSettingsAttribute:      CFStringRef;
+    pub static kCTFontFixedAdvanceAttribute:         CFStringRef;
+    pub static kCTFontOrientationAttribute:          CFStringRef;
+    pub static kCTFontFormatAttribute:               CFStringRef;
+    pub static kCTFontRegistrationScopeAttribute:    CFStringRef;
+    pub static kCTFontPriorityAttribute:             CFStringRef;
+    pub static kCTFontEnabledAttribute:              CFStringRef;
+
+    pub fn CTFontDescriptorCopyAttribute(descriptor: CTFontDescriptorRef,
+                                         attribute: CFStringRef) -> CFTypeRef;
+    pub fn CTFontDescriptorCopyAttributes(descriptor: CTFontDescriptorRef) -> CFDictionaryRef;
+    pub fn CTFontDescriptorCopyLocalizedAttribute(descriptor: CTFontDescriptorRef,
+                                                  attribute: CFStringRef,
+                                                  language: *mut CFStringRef) -> CFTypeRef;
+    pub fn CTFontDescriptorCreateCopyWithAttributes(original: CTFontDescriptorRef,
+                                                    attributes: CFDictionaryRef) -> CTFontDescriptorRef;
+    pub fn CTFontDescriptorCreateCopyWithFeature(original: CTFontDescriptorRef,
+                                                 featureTypeIdentifier: CFNumberRef,
+                                                 featureSelectorIdentifier: CFNumberRef) -> CTFontDescriptorRef;
+    pub fn CTFontDescriptorCreateCopyWithVariation(original: CTFontDescriptorRef,
+                                                   variationIdentifier: CFNumberRef,
+                                                   variationValue: CGFloat) -> CTFontDescriptorRef;
+    pub fn CTFontDescriptorCreateMatchingFontDescriptor(descriptor: CTFontDescriptorRef,
+                                                        mandatoryAttributes: CFSetRef) -> CTFontDescriptorRef;
+    pub fn CTFontDescriptorCreateWithAttributes(attributes: CFDictionaryRef) -> CTFontDescriptorRef;
+    pub fn CTFontDescriptorCreateWithNameAndSize(name: CFStringRef, size: CGFloat) -> CTFontDescriptorRef;
+    pub fn CTFontDescriptorGetTypeID() -> CFTypeID;
+}
+
+extern {
+    pub fn CTFontDescriptorCreateMatchingFontDescriptors(descriptor: CTFontDescriptorRef,
+                                                         mandatoryAttributes: CFSetRef) -> CFArrayRef;
+}
diff --git a/third_party/rust_crates/vendor/core-text/src/font_manager.rs b/third_party/rust_crates/vendor/core-text/src/font_manager.rs
new file mode 100644
index 0000000..6867044
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-text/src/font_manager.rs
@@ -0,0 +1,48 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use core_foundation::array::{CFArray, CFArrayRef};
+use core_foundation::base::TCFType;
+use core_foundation::string::CFString;
+use core_foundation::url::CFURLRef;
+
+pub fn copy_available_font_family_names() -> CFArray<CFString> {
+    unsafe {
+        TCFType::wrap_under_create_rule(CTFontManagerCopyAvailableFontFamilyNames())
+    }
+}
+
+extern {
+    /*
+     * CTFontManager.h
+     */
+
+    // Incomplete function bindings are mostly related to CoreText font matching, which
+    // we implement in a platform-independent manner using FontMatcher.
+
+    //pub fn CTFontManagerCompareFontFamilyNames
+    pub fn CTFontManagerCopyAvailableFontURLs() -> CFArrayRef;
+    pub fn CTFontManagerCopyAvailableFontFamilyNames() -> CFArrayRef;
+    pub fn CTFontManagerCopyAvailablePostScriptNames() -> CFArrayRef;
+    pub fn CTFontManagerCreateFontDescriptorsFromURL(fileURL: CFURLRef) -> CFArrayRef;
+    //pub fn CTFontManagerCreateFontRequestRunLoopSource
+    //pub fn CTFontManagerEnableFontDescriptors
+    //pub fn CTFontManagerGetAutoActivationSetting
+    //pub fn CTFontManagerGetScopeForURL
+    //pub fn CTFontManagerGetAutoActivationSetting
+    //pub fn CTFontManagerGetScopeForURL
+    pub fn CTFontManagerIsSupportedFont(fontURL: CFURLRef) -> bool;
+    //pub fn CTFontManagerRegisterFontsForURL
+    //pub fn CTFontManagerRegisterFontsForURLs
+    //pub fn CTFontManagerRegisterGraphicsFont
+    //pub fn CTFontManagerSetAutoActivationSetting
+    //pub fn CTFontManagerUnregisterFontsForURL
+    //pub fn CTFontManagerUnregisterFontsForURLs
+    //pub fn CTFontManagerUnregisterGraphicsFont
+}
diff --git a/third_party/rust_crates/vendor/core-text/src/frame.rs b/third_party/rust_crates/vendor/core-text/src/frame.rs
new file mode 100644
index 0000000..3336f2c
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-text/src/frame.rs
@@ -0,0 +1,38 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+use core_foundation::base::{CFTypeID, TCFType};
+use core_graphics::context::{CGContext, CGContextRef};
+use foreign_types::{ForeignType, ForeignTypeRef};
+
+#[repr(C)]
+pub struct __CTFrame(c_void);
+
+pub type CTFrameRef = *const __CTFrame;
+
+declare_TCFType! {
+    CTFrame, CTFrameRef
+}
+impl_TCFType!(CTFrame, CTFrameRef, CTFrameGetTypeID);
+impl_CFTypeDescription!(CTFrame);
+
+impl CTFrame {
+    pub fn draw(&self, context: &CGContextRef) {
+        unsafe {
+            CTFrameDraw(self.as_concrete_TypeRef(), context.as_ptr());
+        }
+    }
+}
+
+#[link(name = "CoreText", kind = "framework")]
+extern {
+    fn CTFrameGetTypeID() -> CFTypeID;
+    fn CTFrameDraw(frame: CTFrameRef, context: *mut <CGContext as ForeignType>::CType);
+}
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/core-text/src/framesetter.rs b/third_party/rust_crates/vendor/core-text/src/framesetter.rs
new file mode 100644
index 0000000..cde767c
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-text/src/framesetter.rs
@@ -0,0 +1,57 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+use core_foundation::attributed_string::CFAttributedStringRef;
+use core_foundation::base::{CFRange, CFTypeID, TCFType};
+use core_graphics::path::{CGPath, CGPathRef};
+use foreign_types::{ForeignType, ForeignTypeRef};
+use std::ptr::null;
+use super::frame::{CTFrameRef, CTFrame};
+
+#[repr(C)]
+pub struct __CTFramesetter(c_void);
+
+pub type CTFramesetterRef = *const __CTFramesetter;
+
+declare_TCFType! {
+    CTFramesetter, CTFramesetterRef
+}
+impl_TCFType!(CTFramesetter, CTFramesetterRef, CTFramesetterGetTypeID);
+impl_CFTypeDescription!(CTFramesetter);
+
+impl CTFramesetter {
+    pub fn new_with_attributed_string(string: CFAttributedStringRef) -> Self {
+        unsafe {
+            let ptr = CTFramesetterCreateWithAttributedString(string);
+            CTFramesetter::wrap_under_create_rule(ptr)
+        }
+    }
+
+    pub fn create_frame(&self, string_range: CFRange, path: &CGPathRef) -> CTFrame {
+        unsafe {
+            let ptr = CTFramesetterCreateFrame(
+                self.as_concrete_TypeRef(), string_range, path.as_ptr(), null());
+
+            CTFrame::wrap_under_create_rule(ptr)
+        }
+    }
+}
+
+#[link(name = "CoreText", kind = "framework")]
+extern {
+    fn CTFramesetterGetTypeID() -> CFTypeID;
+    fn CTFramesetterCreateWithAttributedString(string: CFAttributedStringRef) -> CTFramesetterRef;
+    fn CTFramesetterCreateFrame(
+        framesetter: CTFramesetterRef,
+        string_range: CFRange,
+        path: *mut <CGPath as ForeignType>::CType,
+        attributes: *const c_void,
+    ) -> CTFrameRef;
+}
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/core-text/src/lib.rs b/third_party/rust_crates/vendor/core-text/src/lib.rs
new file mode 100644
index 0000000..fbd0be1
--- /dev/null
+++ b/third_party/rust_crates/vendor/core-text/src/lib.rs
@@ -0,0 +1,27 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![crate_name = "core_text"]
+#![crate_type = "rlib"]
+
+#![allow(non_snake_case)]
+
+extern crate foreign_types;
+extern crate libc;
+
+#[macro_use]
+extern crate core_foundation;
+extern crate core_graphics;
+
+pub mod font;
+pub mod font_collection;
+pub mod font_descriptor;
+pub mod font_manager;
+pub mod frame;
+pub mod framesetter;
diff --git a/third_party/rust_crates/vendor/foreign-types-shared/.cargo-checksum.json b/third_party/rust_crates/vendor/foreign-types-shared/.cargo-checksum.json
new file mode 100644
index 0000000..2d6d891
--- /dev/null
+++ b/third_party/rust_crates/vendor/foreign-types-shared/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"Cargo.toml":"6b91ae600fe7b521537096b2269ab7bfd606f8a1fcd97749634dd03ba18daf53","LICENSE-APACHE":"c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08","LICENSE-MIT":"333ea3aaa3cadb819f4acd9f9153f9feee060a995ca8710f32bc5bd9a4b91734","src/lib.rs":"77aed289fd36258c273f033e766e572ee05330249083c017d045f0a75662f5df"},"package":"00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"}
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/foreign-types-shared/Cargo.toml b/third_party/rust_crates/vendor/foreign-types-shared/Cargo.toml
new file mode 100644
index 0000000..e2cb783
--- /dev/null
+++ b/third_party/rust_crates/vendor/foreign-types-shared/Cargo.toml
@@ -0,0 +1,21 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "foreign-types-shared"
+version = "0.1.1"
+authors = ["Steven Fackler <sfackler@gmail.com>"]
+description = "An internal crate used by foreign-types"
+license = "MIT/Apache-2.0"
+repository = "https://github.com/sfackler/foreign-types"
+
+[dependencies]
diff --git a/third_party/rust_crates/vendor/foreign-types-shared/LICENSE-APACHE b/third_party/rust_crates/vendor/foreign-types-shared/LICENSE-APACHE
new file mode 100644
index 0000000..8f71f43
--- /dev/null
+++ b/third_party/rust_crates/vendor/foreign-types-shared/LICENSE-APACHE
@@ -0,0 +1,202 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff --git a/third_party/rust_crates/vendor/foreign-types-shared/LICENSE-MIT b/third_party/rust_crates/vendor/foreign-types-shared/LICENSE-MIT
new file mode 100644
index 0000000..bb76d01
--- /dev/null
+++ b/third_party/rust_crates/vendor/foreign-types-shared/LICENSE-MIT
@@ -0,0 +1,19 @@
+Copyright (c) 2017 The foreign-types Developers
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/rust_crates/vendor/foreign-types-shared/src/lib.rs b/third_party/rust_crates/vendor/foreign-types-shared/src/lib.rs
new file mode 100644
index 0000000..cbebc33
--- /dev/null
+++ b/third_party/rust_crates/vendor/foreign-types-shared/src/lib.rs
@@ -0,0 +1,51 @@
+//! Internal crate used by foreign-types
+
+#![no_std]
+#![warn(missing_docs)]
+#![doc(html_root_url="https://docs.rs/foreign-types-shared/0.1")]
+
+use core::cell::UnsafeCell;
+
+/// An opaque type used to define `ForeignTypeRef` types.
+///
+/// A type implementing `ForeignTypeRef` should simply be a newtype wrapper around this type.
+pub struct Opaque(UnsafeCell<()>);
+
+/// A type implemented by wrappers over foreign types.
+pub trait ForeignType: Sized {
+    /// The raw C type.
+    type CType;
+
+    /// The type representing a reference to this type.
+    type Ref: ForeignTypeRef<CType = Self::CType>;
+
+    /// Constructs an instance of this type from its raw type.
+    unsafe fn from_ptr(ptr: *mut Self::CType) -> Self;
+
+    /// Returns a raw pointer to the wrapped value.
+    fn as_ptr(&self) -> *mut Self::CType;
+}
+
+/// A trait implemented by types which reference borrowed foreign types.
+pub trait ForeignTypeRef: Sized {
+    /// The raw C type.
+    type CType;
+
+    /// Constructs a shared instance of this type from its raw type.
+    #[inline]
+    unsafe fn from_ptr<'a>(ptr: *mut Self::CType) -> &'a Self {
+        &*(ptr as *mut _)
+    }
+
+    /// Constructs a mutable reference of this type from its raw type.
+    #[inline]
+    unsafe fn from_ptr_mut<'a>(ptr: *mut Self::CType) -> &'a mut Self {
+        &mut *(ptr as *mut _)
+    }
+
+    /// Returns a raw pointer to the wrapped value.
+    #[inline]
+    fn as_ptr(&self) -> *mut Self::CType {
+        self as *const _ as *mut _
+    }
+}
diff --git a/third_party/rust_crates/vendor/foreign-types/.cargo-checksum.json b/third_party/rust_crates/vendor/foreign-types/.cargo-checksum.json
new file mode 100644
index 0000000..7e74bd5
--- /dev/null
+++ b/third_party/rust_crates/vendor/foreign-types/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"Cargo.toml":"1a667c28f60115423b68fea369255c2dcb129b8dce10f30e0e1da73d05f9adab","LICENSE-APACHE":"c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08","LICENSE-MIT":"333ea3aaa3cadb819f4acd9f9153f9feee060a995ca8710f32bc5bd9a4b91734","README.md":"6f3f1429f2724a481df811842f318d0d3b83160ada953fd869d4b685f7fd72e4","src/lib.rs":"4f0a33bf8ec94a57d1b71e50f1af8ca410985e447f69fdc9c680545b03ea4566"},"package":"f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"}
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/foreign-types/Cargo.toml b/third_party/rust_crates/vendor/foreign-types/Cargo.toml
new file mode 100644
index 0000000..6ff5567
--- /dev/null
+++ b/third_party/rust_crates/vendor/foreign-types/Cargo.toml
@@ -0,0 +1,22 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "foreign-types"
+version = "0.3.2"
+authors = ["Steven Fackler <sfackler@gmail.com>"]
+description = "A framework for Rust wrappers over C APIs"
+readme = "README.md"
+license = "MIT/Apache-2.0"
+repository = "https://github.com/sfackler/foreign-types"
+[dependencies.foreign-types-shared]
+version = "0.1"
diff --git a/third_party/rust_crates/vendor/foreign-types/LICENSE-APACHE b/third_party/rust_crates/vendor/foreign-types/LICENSE-APACHE
new file mode 100644
index 0000000..8f71f43
--- /dev/null
+++ b/third_party/rust_crates/vendor/foreign-types/LICENSE-APACHE
@@ -0,0 +1,202 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff --git a/third_party/rust_crates/vendor/foreign-types/LICENSE-MIT b/third_party/rust_crates/vendor/foreign-types/LICENSE-MIT
new file mode 100644
index 0000000..bb76d01
--- /dev/null
+++ b/third_party/rust_crates/vendor/foreign-types/LICENSE-MIT
@@ -0,0 +1,19 @@
+Copyright (c) 2017 The foreign-types Developers
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/rust_crates/vendor/foreign-types/README.md b/third_party/rust_crates/vendor/foreign-types/README.md
new file mode 100644
index 0000000..cd15965
--- /dev/null
+++ b/third_party/rust_crates/vendor/foreign-types/README.md
@@ -0,0 +1,23 @@
+# foreign-types
+
+[![CircleCI](https://circleci.com/gh/sfackler/foreign-types.svg?style=shield)](https://circleci.com/gh/sfackler/foreign-types)
+
+[Documentation](https://docs.rs/foreign-types)
+
+A framework for Rust wrappers over C APIs.
+
+## License
+
+Licensed under either of
+
+ * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
+
+at your option.
+
+### Contribution
+
+Unless you explicitly state otherwise, any contribution intentionally
+submitted for inclusion in the work by you, as defined in the Apache-2.0
+license, shall be dual licensed as above, without any additional terms or
+conditions.
diff --git a/third_party/rust_crates/vendor/foreign-types/src/lib.rs b/third_party/rust_crates/vendor/foreign-types/src/lib.rs
new file mode 100644
index 0000000..6ce9592
--- /dev/null
+++ b/third_party/rust_crates/vendor/foreign-types/src/lib.rs
@@ -0,0 +1,306 @@
+//! A framework for Rust wrappers over C APIs.
+//!
+//! Ownership is as important in C as it is in Rust, but the semantics are often implicit. In
+//! particular, pointer-to-value is commonly used to pass C values both when transferring ownership
+//! or a borrow.
+//!
+//! This crate provides a framework to define a Rust wrapper over these kinds of raw C APIs in a way
+//! that allows ownership semantics to be expressed in an ergonomic manner. The framework takes a
+//! dual-type approach similar to APIs in the standard library such as `PathBuf`/`Path` or `String`/
+//! `str`. One type represents an owned value and references to the other represent borrowed
+//! values.
+//!
+//! # Examples
+//!
+//! ```
+//! use foreign_types::{ForeignType, ForeignTypeRef, Opaque};
+//! use std::ops::{Deref, DerefMut};
+//!
+//! mod foo_sys {
+//!     pub enum FOO {}
+//!
+//!     extern {
+//!         pub fn FOO_free(foo: *mut FOO);
+//!     }
+//! }
+//!
+//! // The borrowed type is a newtype wrapper around an `Opaque` value.
+//! //
+//! // `FooRef` values never exist; we instead create references to `FooRef`s
+//! // from raw C pointers.
+//! pub struct FooRef(Opaque);
+//!
+//! impl ForeignTypeRef for FooRef {
+//!     type CType = foo_sys::FOO;
+//! }
+//!
+//! // The owned type is simply a newtype wrapper around the raw C type.
+//! //
+//! // It dereferences to `FooRef`, so methods that do not require ownership
+//! // should be defined there.
+//! pub struct Foo(*mut foo_sys::FOO);
+//!
+//! impl Drop for Foo {
+//!     fn drop(&mut self) {
+//!         unsafe { foo_sys::FOO_free(self.0) }
+//!     }
+//! }
+//!
+//! impl ForeignType for Foo {
+//!     type CType = foo_sys::FOO;
+//!     type Ref = FooRef;
+//!
+//!     unsafe fn from_ptr(ptr: *mut foo_sys::FOO) -> Foo {
+//!         Foo(ptr)
+//!     }
+//!
+//!     fn as_ptr(&self) -> *mut foo_sys::FOO {
+//!         self.0
+//!     }
+//! }
+//!
+//! impl Deref for Foo {
+//!     type Target = FooRef;
+//!
+//!     fn deref(&self) -> &FooRef {
+//!         unsafe { FooRef::from_ptr(self.0) }
+//!     }
+//! }
+//!
+//! impl DerefMut for Foo {
+//!     fn deref_mut(&mut self) -> &mut FooRef {
+//!         unsafe { FooRef::from_ptr_mut(self.0) }
+//!     }
+//! }
+//! ```
+//!
+//! The `foreign_type!` macro can generate this boilerplate for you:
+//!
+//! ```
+//! #[macro_use]
+//! extern crate foreign_types;
+//!
+//! mod foo_sys {
+//!     pub enum FOO {}
+//!
+//!     extern {
+//!         pub fn FOO_free(foo: *mut FOO);
+//!         pub fn FOO_duplicate(foo: *mut FOO) -> *mut FOO; // Optional
+//!     }
+//! }
+//!
+//! foreign_type! {
+//!     type CType = foo_sys::FOO;
+//!     fn drop = foo_sys::FOO_free;
+//!     fn clone = foo_sys::FOO_duplicate; // Optional
+//!     /// A Foo.
+//!     pub struct Foo;
+//!     /// A borrowed Foo.
+//!     pub struct FooRef;
+//! }
+//!
+//! # fn main() {}
+//! ```
+//!
+//! If `fn clone` is specified, then it must take `CType` as an argument and return a copy of it as `CType`.
+//! It will be used to implement `ToOwned` and `Clone`.
+//!
+//! `#[derive(…)] is permitted before the lines with `pub struct`.
+//! `#[doc(hidden)]` before the `type CType` line will hide the `foreign_type!` implementations from documentation.
+//!
+//! Say we then have a separate type in our C API that contains a `FOO`:
+//!
+//! ```
+//! mod foo_sys {
+//!     pub enum FOO {}
+//!     pub enum BAR {}
+//!
+//!     extern {
+//!         pub fn FOO_free(foo: *mut FOO);
+//!         pub fn BAR_free(bar: *mut BAR);
+//!         pub fn BAR_get_foo(bar: *mut BAR) -> *mut FOO;
+//!     }
+//! }
+//! ```
+//!
+//! The documentation for the C library states that `BAR_get_foo` returns a reference into the `BAR`
+//! passed to it, which translates into a reference in Rust. It also says that we're allowed to
+//! modify the `FOO`, so we'll define a pair of accessor methods, one immutable and one mutable:
+//!
+//! ```
+//! #[macro_use]
+//! extern crate foreign_types;
+//!
+//! use foreign_types::ForeignTypeRef;
+//!
+//! mod foo_sys {
+//!     pub enum FOO {}
+//!     pub enum BAR {}
+//!
+//!     extern {
+//!         pub fn FOO_free(foo: *mut FOO);
+//!         pub fn BAR_free(bar: *mut BAR);
+//!         pub fn BAR_get_foo(bar: *mut BAR) -> *mut FOO;
+//!     }
+//! }
+//!
+//! foreign_type! {
+//!     #[doc(hidden)]
+//!     type CType = foo_sys::FOO;
+//!     fn drop = foo_sys::FOO_free;
+//!     /// A Foo.
+//!     pub struct Foo;
+//!     /// A borrowed Foo.
+//!     pub struct FooRef;
+//! }
+//!
+//! foreign_type! {
+//!     type CType = foo_sys::BAR;
+//!     fn drop = foo_sys::BAR_free;
+//!     /// A Foo.
+//!     pub struct Bar;
+//!     /// A borrowed Bar.
+//!     pub struct BarRef;
+//! }
+//!
+//! impl BarRef {
+//!     fn foo(&self) -> &FooRef {
+//!         unsafe { FooRef::from_ptr(foo_sys::BAR_get_foo(self.as_ptr())) }
+//!     }
+//!
+//!     fn foo_mut(&mut self) -> &mut FooRef {
+//!         unsafe { FooRef::from_ptr_mut(foo_sys::BAR_get_foo(self.as_ptr())) }
+//!     }
+//! }
+//!
+//! # fn main() {}
+//! ```
+#![no_std]
+#![warn(missing_docs)]
+#![doc(html_root_url="https://docs.rs/foreign-types/0.3")]
+extern crate foreign_types_shared;
+
+#[doc(inline)]
+pub use foreign_types_shared::*;
+
+/// A macro to easily define wrappers for foreign types.
+///
+/// # Examples
+///
+/// ```
+/// #[macro_use]
+/// extern crate foreign_types;
+///
+/// # mod openssl_sys { pub type SSL = (); pub unsafe fn SSL_free(_: *mut SSL) {} pub unsafe fn SSL_dup(x: *mut SSL) -> *mut SSL {x} }
+/// foreign_type! {
+///     type CType = openssl_sys::SSL;
+///     fn drop = openssl_sys::SSL_free;
+///     fn clone = openssl_sys::SSL_dup;
+///     /// Documentation for the owned type.
+///     pub struct Ssl;
+///     /// Documentation for the borrowed type.
+///     pub struct SslRef;
+/// }
+///
+/// # fn main() {}
+/// ```
+#[macro_export]
+macro_rules! foreign_type {
+    (
+        $(#[$impl_attr:meta])*
+        type CType = $ctype:ty;
+        fn drop = $drop:expr;
+        $(fn clone = $clone:expr;)*
+        $(#[$owned_attr:meta])*
+        pub struct $owned:ident;
+        $(#[$borrowed_attr:meta])*
+        pub struct $borrowed:ident;
+    ) => {
+        $(#[$owned_attr])*
+        pub struct $owned(*mut $ctype);
+
+        $(#[$impl_attr])*
+        impl $crate::ForeignType for $owned {
+            type CType = $ctype;
+            type Ref = $borrowed;
+
+            #[inline]
+            unsafe fn from_ptr(ptr: *mut $ctype) -> $owned {
+                $owned(ptr)
+            }
+
+            #[inline]
+            fn as_ptr(&self) -> *mut $ctype {
+                self.0
+            }
+        }
+
+        impl Drop for $owned {
+            #[inline]
+            fn drop(&mut self) {
+                unsafe { $drop(self.0) }
+            }
+        }
+
+        $(
+            impl Clone for $owned {
+                #[inline]
+                fn clone(&self) -> $owned {
+                    unsafe {
+                        let handle: *mut $ctype = $clone(self.0);
+                        $crate::ForeignType::from_ptr(handle)
+                    }
+                }
+            }
+
+            impl ::std::borrow::ToOwned for $borrowed {
+                type Owned = $owned;
+                #[inline]
+                fn to_owned(&self) -> $owned {
+                    unsafe {
+                        let handle: *mut $ctype = $clone($crate::ForeignTypeRef::as_ptr(self));
+                        $crate::ForeignType::from_ptr(handle)
+                    }
+                }
+            }
+        )*
+
+        impl ::std::ops::Deref for $owned {
+            type Target = $borrowed;
+
+            #[inline]
+            fn deref(&self) -> &$borrowed {
+                unsafe { $crate::ForeignTypeRef::from_ptr(self.0) }
+            }
+        }
+
+        impl ::std::ops::DerefMut for $owned {
+            #[inline]
+            fn deref_mut(&mut self) -> &mut $borrowed {
+                unsafe { $crate::ForeignTypeRef::from_ptr_mut(self.0) }
+            }
+        }
+
+        impl ::std::borrow::Borrow<$borrowed> for $owned {
+            #[inline]
+            fn borrow(&self) -> &$borrowed {
+                &**self
+            }
+        }
+
+        impl ::std::convert::AsRef<$borrowed> for $owned {
+            #[inline]
+            fn as_ref(&self) -> &$borrowed {
+                &**self
+            }
+        }
+
+        $(#[$borrowed_attr])*
+        pub struct $borrowed($crate::Opaque);
+
+        $(#[$impl_attr])*
+        impl $crate::ForeignTypeRef for $borrowed {
+            type CType = $ctype;
+        }
+    }
+}
diff --git a/third_party/rust_crates/vendor/freetype/.cargo-checksum.json b/third_party/rust_crates/vendor/freetype/.cargo-checksum.json
new file mode 100644
index 0000000..2bd8218
--- /dev/null
+++ b/third_party/rust_crates/vendor/freetype/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"COPYRIGHT":"ec82b96487e9e778ee610c7ab245162464782cfa1f555c2299333f8dbe5c036a","Cargo.toml":"52d4868f6f1e18a726bf71bcd4ce50ccd6a866744d3000efdd2f032d7bbdf3f6","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","Makefile.in":"7348b5f8a577048279b3f98e2c2b5705f506cf5b4b1e6bb542cc0b1e62468411","README.md":"755e885eb12f7b0b459c8b579f20cd941e55f0197b947591131daf048c5d7bc6","configure":"e0e6ba778e5f5784fa87abf235aa4f3da750d922bfb26a34803d9674577d56ec","etc/bindgen.sh":"39c1d5298f6e46380f0616d6080bd2c3ead5f04149bcf5b7345c56dae2000e79","etc/bindings.h":"b531980f5739536dfc1484236d436efd18f448b4ea15001d1dfbbaf381ad054f","src/freetype.rs":"445a3d48974dcf22961b612ef6cdef48c2dedc1ccc6e73a88eee53fa601859d8","src/lib.rs":"cbd3e98926f89fceffd535ea5588a1ee1fa7c7052625a579e28271c266908367","src/tt_os2.rs":"5b0e57bcd7f77eb552b0a6fe5e4512a27aab3996d6888676e6b1cbac812b3549"},"package":"11926b2b410b469d0e9399eca4cbbe237a9ef02176c485803b29216307e8e028"}
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/freetype/COPYRIGHT b/third_party/rust_crates/vendor/freetype/COPYRIGHT
new file mode 100644
index 0000000..8b7291ad
--- /dev/null
+++ b/third_party/rust_crates/vendor/freetype/COPYRIGHT
@@ -0,0 +1,5 @@
+Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+<LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+option. All files in the project carrying such notice may not be
+copied, modified, or distributed except according to those terms.
diff --git a/third_party/rust_crates/vendor/freetype/Cargo.toml b/third_party/rust_crates/vendor/freetype/Cargo.toml
new file mode 100644
index 0000000..c692f51
--- /dev/null
+++ b/third_party/rust_crates/vendor/freetype/Cargo.toml
@@ -0,0 +1,33 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "freetype"
+version = "0.4.1"
+authors = ["The Servo Project Developers"]
+description = "Bindings for Freetype used by Servo"
+documentation = "http://doc.servo.org/freetype/"
+license = "Apache-2.0 / MIT"
+repository = "https://github.com/servo/rust-freetype"
+
+[lib]
+name = "freetype"
+crate-type = ["rlib"]
+[dependencies.libc]
+version = "0.2"
+
+[dependencies.servo-freetype-sys]
+version = "4.0.2"
+optional = true
+
+[features]
+default = ["servo-freetype-sys"]
diff --git a/third_party/rust_crates/vendor/freetype/LICENSE-APACHE b/third_party/rust_crates/vendor/freetype/LICENSE-APACHE
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/third_party/rust_crates/vendor/freetype/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/third_party/rust_crates/vendor/freetype/LICENSE-MIT b/third_party/rust_crates/vendor/freetype/LICENSE-MIT
new file mode 100644
index 0000000..807526f
--- /dev/null
+++ b/third_party/rust_crates/vendor/freetype/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2012-2013 Mozilla Foundation
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/third_party/rust_crates/vendor/freetype/Makefile.in b/third_party/rust_crates/vendor/freetype/Makefile.in
new file mode 100644
index 0000000..4222835
--- /dev/null
+++ b/third_party/rust_crates/vendor/freetype/Makefile.in
@@ -0,0 +1,37 @@
+VPATH=%VPATH%
+
+RUSTC ?= rustc
+RUSTFLAGS ?=
+EXT_DEPS ?=
+RUSTDOC ?= rustdoc
+RUSTDOC_FLAGS ?=
+RUSTDOC_TARGET ?= doc
+
+ifeq ($(CFG_OSTYPE),linux-androideabi)
+RUSTFLAGS += -L./../../android/libfreetype2/.libs
+endif
+
+RUST_SRC=$(shell find $(VPATH)/src -type f -name '*.rs')
+
+.PHONY: all clean
+all:	libfreetype-servo.dummy
+
+libfreetype-servo.dummy: src/lib.rs $(RUST_SRC) $(EXT_DEPS)
+	$(RUSTC) $(RUSTFLAGS) $< --out-dir . -C extra-filename=-servo
+	touch $@
+
+freetype-test: src/lib.rs $(RUST_SRC)
+	$(RUSTC) $(RUSTFLAGS) $< -o $@ --test
+
+check: freetype-test
+	./freetype-test
+
+.PHONY: doc
+doc: $(RUSTDOC_TARGET)/freetype/index.html
+
+$(RUSTDOC_TARGET)/freetype/index.html: src/lib.rs $(RUST_SRC) $(EXT_DEPS)
+	$(RUSTDOC) $(RUSTDOC_FLAGS) $< -o $(RUSTDOC_TARGET)
+
+clean:
+	rm -f *.o *.a *.so *.dylib *.rlib *.dll *.dummy *-test
+
diff --git a/third_party/rust_crates/vendor/freetype/README.md b/third_party/rust_crates/vendor/freetype/README.md
new file mode 100644
index 0000000..e2dd125
--- /dev/null
+++ b/third_party/rust_crates/vendor/freetype/README.md
@@ -0,0 +1,3 @@
+# rust-freetype
+
+[Documentation](http://doc.servo.org/freetype/)
diff --git a/third_party/rust_crates/vendor/freetype/configure b/third_party/rust_crates/vendor/freetype/configure
new file mode 100755
index 0000000..ed6c06e
--- /dev/null
+++ b/third_party/rust_crates/vendor/freetype/configure
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+SRCDIR="$(cd $(dirname $0) && pwd)"
+sed "s#%VPATH%#${SRCDIR}#" ${SRCDIR}/Makefile.in > Makefile
+
diff --git a/third_party/rust_crates/vendor/freetype/etc/bindgen.sh b/third_party/rust_crates/vendor/freetype/etc/bindgen.sh
new file mode 100755
index 0000000..2b8b9f6
--- /dev/null
+++ b/third_party/rust_crates/vendor/freetype/etc/bindgen.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+
+cd "$(dirname $0)"
+
+# We replace the FT_ integer types of known widths, since we can do better.
+#
+# We blacklist FT_Error and import our own in order to have convenience methods
+# on it instead of being a plain integer.
+"${BINDGEN}" bindings.h -o ../src/freetype.rs \
+  --blacklist-type "FT_(Int16|UInt16|Int32|UInt32|Int16|Int64|UInt64)" \
+  --raw-line "pub type FT_Int16 = i16;" \
+  --raw-line "pub type FT_UInt16 = u16;" \
+  --raw-line "pub type FT_Int32 = i32;" \
+  --raw-line "pub type FT_UInt32 = u32;" \
+  --raw-line "pub type FT_Int64= i64;" \
+  --raw-line "pub type FT_UInt64= u64;" \
+  --blacklist-type "FT_Error" \
+  --raw-line "pub use FT_Error;" \
+  --generate=functions,types,vars       \
+  --whitelist-function="FT_.*"         \
+  --whitelist-type="FT_.*"             \
+  --whitelist-var="FT_.*"             \
+  -- -I/usr/include/freetype2
diff --git a/third_party/rust_crates/vendor/freetype/etc/bindings.h b/third_party/rust_crates/vendor/freetype/etc/bindings.h
new file mode 100644
index 0000000..34c894b
--- /dev/null
+++ b/third_party/rust_crates/vendor/freetype/etc/bindings.h
@@ -0,0 +1,6 @@
+#include <freetype2/ft2build.h>
+#include <freetype2/freetype/freetype.h>
+#include <freetype2/freetype/ftlcdfil.h>
+#include <freetype2/freetype/tttables.h>
+#include <freetype2/freetype/ftmodapi.h>
+#include <freetype2/freetype/ftoutln.h>
diff --git a/third_party/rust_crates/vendor/freetype/src/freetype.rs b/third_party/rust_crates/vendor/freetype/src/freetype.rs
new file mode 100644
index 0000000..ccf8a2b5
--- /dev/null
+++ b/third_party/rust_crates/vendor/freetype/src/freetype.rs
@@ -0,0 +1,2568 @@
+/* automatically generated by rust-bindgen */
+
+pub type FT_Int16 = i16;
+pub type FT_UInt16 = u16;
+pub type FT_Int32 = i32;
+pub type FT_UInt32 = u32;
+pub type FT_Int64= i64;
+pub type FT_UInt64= u64;
+pub use FT_Error;
+
+#[repr(C)]
+pub struct __BindgenUnionField<T>(::std::marker::PhantomData<T>);
+impl <T> __BindgenUnionField<T> {
+    #[inline]
+    pub fn new() -> Self { __BindgenUnionField(::std::marker::PhantomData) }
+    #[inline]
+    pub unsafe fn as_ref(&self) -> &T { ::std::mem::transmute(self) }
+    #[inline]
+    pub unsafe fn as_mut(&mut self) -> &mut T { ::std::mem::transmute(self) }
+}
+impl <T> ::std::default::Default for __BindgenUnionField<T> {
+    #[inline]
+    fn default() -> Self { Self::new() }
+}
+impl <T> ::std::clone::Clone for __BindgenUnionField<T> {
+    #[inline]
+    fn clone(&self) -> Self { Self::new() }
+}
+impl <T> ::std::marker::Copy for __BindgenUnionField<T> { }
+impl <T> ::std::fmt::Debug for __BindgenUnionField<T> {
+    fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+        fmt.write_str("__BindgenUnionField")
+    }
+}
+pub const FT_RENDER_POOL_SIZE: ::std::os::raw::c_uint = 16384;
+pub const FT_MAX_MODULES: ::std::os::raw::c_uint = 32;
+pub const FT_OUTLINE_NONE: ::std::os::raw::c_uint = 0;
+pub const FT_OUTLINE_OWNER: ::std::os::raw::c_uint = 1;
+pub const FT_OUTLINE_EVEN_ODD_FILL: ::std::os::raw::c_uint = 2;
+pub const FT_OUTLINE_REVERSE_FILL: ::std::os::raw::c_uint = 4;
+pub const FT_OUTLINE_IGNORE_DROPOUTS: ::std::os::raw::c_uint = 8;
+pub const FT_OUTLINE_SMART_DROPOUTS: ::std::os::raw::c_uint = 16;
+pub const FT_OUTLINE_INCLUDE_STUBS: ::std::os::raw::c_uint = 32;
+pub const FT_OUTLINE_HIGH_PRECISION: ::std::os::raw::c_uint = 256;
+pub const FT_OUTLINE_SINGLE_PASS: ::std::os::raw::c_uint = 512;
+pub const FT_CURVE_TAG_ON: ::std::os::raw::c_uint = 1;
+pub const FT_CURVE_TAG_CONIC: ::std::os::raw::c_uint = 0;
+pub const FT_CURVE_TAG_CUBIC: ::std::os::raw::c_uint = 2;
+pub const FT_CURVE_TAG_HAS_SCANMODE: ::std::os::raw::c_uint = 4;
+pub const FT_CURVE_TAG_TOUCH_X: ::std::os::raw::c_uint = 8;
+pub const FT_CURVE_TAG_TOUCH_Y: ::std::os::raw::c_uint = 16;
+pub const FT_CURVE_TAG_TOUCH_BOTH: ::std::os::raw::c_uint = 24;
+pub const FT_Curve_Tag_On: ::std::os::raw::c_uint = 1;
+pub const FT_Curve_Tag_Conic: ::std::os::raw::c_uint = 0;
+pub const FT_Curve_Tag_Cubic: ::std::os::raw::c_uint = 2;
+pub const FT_Curve_Tag_Touch_X: ::std::os::raw::c_uint = 8;
+pub const FT_Curve_Tag_Touch_Y: ::std::os::raw::c_uint = 16;
+pub const FT_RASTER_FLAG_DEFAULT: ::std::os::raw::c_uint = 0;
+pub const FT_RASTER_FLAG_AA: ::std::os::raw::c_uint = 1;
+pub const FT_RASTER_FLAG_DIRECT: ::std::os::raw::c_uint = 2;
+pub const FT_RASTER_FLAG_CLIP: ::std::os::raw::c_uint = 4;
+pub const FT_ERR_BASE: ::std::os::raw::c_uint = 0;
+pub const FT_FACE_FLAG_SCALABLE: ::std::os::raw::c_uint = 1;
+pub const FT_FACE_FLAG_FIXED_SIZES: ::std::os::raw::c_uint = 2;
+pub const FT_FACE_FLAG_FIXED_WIDTH: ::std::os::raw::c_uint = 4;
+pub const FT_FACE_FLAG_SFNT: ::std::os::raw::c_uint = 8;
+pub const FT_FACE_FLAG_HORIZONTAL: ::std::os::raw::c_uint = 16;
+pub const FT_FACE_FLAG_VERTICAL: ::std::os::raw::c_uint = 32;
+pub const FT_FACE_FLAG_KERNING: ::std::os::raw::c_uint = 64;
+pub const FT_FACE_FLAG_FAST_GLYPHS: ::std::os::raw::c_uint = 128;
+pub const FT_FACE_FLAG_MULTIPLE_MASTERS: ::std::os::raw::c_uint = 256;
+pub const FT_FACE_FLAG_GLYPH_NAMES: ::std::os::raw::c_uint = 512;
+pub const FT_FACE_FLAG_EXTERNAL_STREAM: ::std::os::raw::c_uint = 1024;
+pub const FT_FACE_FLAG_HINTER: ::std::os::raw::c_uint = 2048;
+pub const FT_FACE_FLAG_CID_KEYED: ::std::os::raw::c_uint = 4096;
+pub const FT_FACE_FLAG_TRICKY: ::std::os::raw::c_uint = 8192;
+pub const FT_FACE_FLAG_COLOR: ::std::os::raw::c_uint = 16384;
+pub const FT_STYLE_FLAG_ITALIC: ::std::os::raw::c_uint = 1;
+pub const FT_STYLE_FLAG_BOLD: ::std::os::raw::c_uint = 2;
+pub const FT_OPEN_MEMORY: ::std::os::raw::c_uint = 1;
+pub const FT_OPEN_STREAM: ::std::os::raw::c_uint = 2;
+pub const FT_OPEN_PATHNAME: ::std::os::raw::c_uint = 4;
+pub const FT_OPEN_DRIVER: ::std::os::raw::c_uint = 8;
+pub const FT_OPEN_PARAMS: ::std::os::raw::c_uint = 16;
+pub const FT_LOAD_DEFAULT: ::std::os::raw::c_uint = 0;
+pub const FT_LOAD_NO_SCALE: ::std::os::raw::c_uint = 1;
+pub const FT_LOAD_NO_HINTING: ::std::os::raw::c_uint = 2;
+pub const FT_LOAD_RENDER: ::std::os::raw::c_uint = 4;
+pub const FT_LOAD_NO_BITMAP: ::std::os::raw::c_uint = 8;
+pub const FT_LOAD_VERTICAL_LAYOUT: ::std::os::raw::c_uint = 16;
+pub const FT_LOAD_FORCE_AUTOHINT: ::std::os::raw::c_uint = 32;
+pub const FT_LOAD_CROP_BITMAP: ::std::os::raw::c_uint = 64;
+pub const FT_LOAD_PEDANTIC: ::std::os::raw::c_uint = 128;
+pub const FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH: ::std::os::raw::c_uint = 512;
+pub const FT_LOAD_NO_RECURSE: ::std::os::raw::c_uint = 1024;
+pub const FT_LOAD_IGNORE_TRANSFORM: ::std::os::raw::c_uint = 2048;
+pub const FT_LOAD_MONOCHROME: ::std::os::raw::c_uint = 4096;
+pub const FT_LOAD_LINEAR_DESIGN: ::std::os::raw::c_uint = 8192;
+pub const FT_LOAD_NO_AUTOHINT: ::std::os::raw::c_uint = 32768;
+pub const FT_LOAD_COLOR: ::std::os::raw::c_uint = 1048576;
+pub const FT_LOAD_COMPUTE_METRICS: ::std::os::raw::c_uint = 2097152;
+pub const FT_LOAD_ADVANCE_ONLY: ::std::os::raw::c_uint = 256;
+pub const FT_LOAD_SBITS_ONLY: ::std::os::raw::c_uint = 16384;
+pub const FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS: ::std::os::raw::c_uint = 1;
+pub const FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES: ::std::os::raw::c_uint = 2;
+pub const FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID: ::std::os::raw::c_uint = 4;
+pub const FT_SUBGLYPH_FLAG_SCALE: ::std::os::raw::c_uint = 8;
+pub const FT_SUBGLYPH_FLAG_XY_SCALE: ::std::os::raw::c_uint = 64;
+pub const FT_SUBGLYPH_FLAG_2X2: ::std::os::raw::c_uint = 128;
+pub const FT_SUBGLYPH_FLAG_USE_MY_METRICS: ::std::os::raw::c_uint = 512;
+pub const FT_FSTYPE_INSTALLABLE_EMBEDDING: ::std::os::raw::c_uint = 0;
+pub const FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING: ::std::os::raw::c_uint = 2;
+pub const FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING: ::std::os::raw::c_uint = 4;
+pub const FT_FSTYPE_EDITABLE_EMBEDDING: ::std::os::raw::c_uint = 8;
+pub const FT_FSTYPE_NO_SUBSETTING: ::std::os::raw::c_uint = 256;
+pub const FT_FSTYPE_BITMAP_EMBEDDING_ONLY: ::std::os::raw::c_uint = 512;
+pub const FT_MODULE_FONT_DRIVER: ::std::os::raw::c_uint = 1;
+pub const FT_MODULE_RENDERER: ::std::os::raw::c_uint = 2;
+pub const FT_MODULE_HINTER: ::std::os::raw::c_uint = 4;
+pub const FT_MODULE_STYLER: ::std::os::raw::c_uint = 8;
+pub const FT_MODULE_DRIVER_SCALABLE: ::std::os::raw::c_uint = 256;
+pub const FT_MODULE_DRIVER_NO_OUTLINES: ::std::os::raw::c_uint = 512;
+pub const FT_MODULE_DRIVER_HAS_HINTER: ::std::os::raw::c_uint = 1024;
+pub const FT_MODULE_DRIVER_HINTS_LIGHTLY: ::std::os::raw::c_uint = 2048;
+pub type FT_Fast = ::std::os::raw::c_int;
+pub type FT_UFast = ::std::os::raw::c_uint;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_MemoryRec_ {
+    pub user: *mut ::std::os::raw::c_void,
+    pub alloc: FT_Alloc_Func,
+    pub free: FT_Free_Func,
+    pub realloc: FT_Realloc_Func,
+}
+#[test]
+fn bindgen_test_layout_FT_MemoryRec_() {
+    assert_eq!(::std::mem::size_of::<FT_MemoryRec_>() , 32usize , concat ! (
+               "Size of: " , stringify ! ( FT_MemoryRec_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_MemoryRec_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_MemoryRec_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_MemoryRec_ ) ) . user as * const _ as
+                usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_MemoryRec_ ) , "::"
+                , stringify ! ( user ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_MemoryRec_ ) ) . alloc as * const _ as
+                usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_MemoryRec_ ) , "::"
+                , stringify ! ( alloc ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_MemoryRec_ ) ) . free as * const _ as
+                usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_MemoryRec_ ) , "::"
+                , stringify ! ( free ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_MemoryRec_ ) ) . realloc as * const _
+                as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_MemoryRec_ ) , "::"
+                , stringify ! ( realloc ) ));
+}
+impl Clone for FT_MemoryRec_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Memory = *mut FT_MemoryRec_;
+pub type FT_Alloc_Func =
+    ::std::option::Option<unsafe extern "C" fn(memory: FT_Memory,
+                                               size: ::std::os::raw::c_long)
+                              -> *mut ::std::os::raw::c_void>;
+pub type FT_Free_Func =
+    ::std::option::Option<unsafe extern "C" fn(memory: FT_Memory,
+                                               block:
+                                                   *mut ::std::os::raw::c_void)>;
+pub type FT_Realloc_Func =
+    ::std::option::Option<unsafe extern "C" fn(memory: FT_Memory,
+                                               cur_size:
+                                                   ::std::os::raw::c_long,
+                                               new_size:
+                                                   ::std::os::raw::c_long,
+                                               block:
+                                                   *mut ::std::os::raw::c_void)
+                              -> *mut ::std::os::raw::c_void>;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_StreamRec_ {
+    pub base: *mut ::std::os::raw::c_uchar,
+    pub size: ::std::os::raw::c_ulong,
+    pub pos: ::std::os::raw::c_ulong,
+    pub descriptor: FT_StreamDesc,
+    pub pathname: FT_StreamDesc,
+    pub read: FT_Stream_IoFunc,
+    pub close: FT_Stream_CloseFunc,
+    pub memory: FT_Memory,
+    pub cursor: *mut ::std::os::raw::c_uchar,
+    pub limit: *mut ::std::os::raw::c_uchar,
+}
+#[test]
+fn bindgen_test_layout_FT_StreamRec_() {
+    assert_eq!(::std::mem::size_of::<FT_StreamRec_>() , 80usize , concat ! (
+               "Size of: " , stringify ! ( FT_StreamRec_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_StreamRec_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_StreamRec_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_StreamRec_ ) ) . base as * const _ as
+                usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_StreamRec_ ) , "::"
+                , stringify ! ( base ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_StreamRec_ ) ) . size as * const _ as
+                usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_StreamRec_ ) , "::"
+                , stringify ! ( size ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_StreamRec_ ) ) . pos as * const _ as
+                usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_StreamRec_ ) , "::"
+                , stringify ! ( pos ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_StreamRec_ ) ) . descriptor as * const
+                _ as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_StreamRec_ ) , "::"
+                , stringify ! ( descriptor ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_StreamRec_ ) ) . pathname as * const _
+                as usize } , 32usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_StreamRec_ ) , "::"
+                , stringify ! ( pathname ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_StreamRec_ ) ) . read as * const _ as
+                usize } , 40usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_StreamRec_ ) , "::"
+                , stringify ! ( read ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_StreamRec_ ) ) . close as * const _ as
+                usize } , 48usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_StreamRec_ ) , "::"
+                , stringify ! ( close ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_StreamRec_ ) ) . memory as * const _
+                as usize } , 56usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_StreamRec_ ) , "::"
+                , stringify ! ( memory ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_StreamRec_ ) ) . cursor as * const _
+                as usize } , 64usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_StreamRec_ ) , "::"
+                , stringify ! ( cursor ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_StreamRec_ ) ) . limit as * const _ as
+                usize } , 72usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_StreamRec_ ) , "::"
+                , stringify ! ( limit ) ));
+}
+impl Clone for FT_StreamRec_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Stream = *mut FT_StreamRec_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_StreamDesc_ {
+    pub value: __BindgenUnionField<::std::os::raw::c_long>,
+    pub pointer: __BindgenUnionField<*mut ::std::os::raw::c_void>,
+    pub bindgen_union_field: u64,
+}
+#[test]
+fn bindgen_test_layout_FT_StreamDesc_() {
+    assert_eq!(::std::mem::size_of::<FT_StreamDesc_>() , 8usize , concat ! (
+               "Size of: " , stringify ! ( FT_StreamDesc_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_StreamDesc_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_StreamDesc_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_StreamDesc_ ) ) . value as * const _
+                as usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_StreamDesc_ ) , "::"
+                , stringify ! ( value ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_StreamDesc_ ) ) . pointer as * const _
+                as usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_StreamDesc_ ) , "::"
+                , stringify ! ( pointer ) ));
+}
+impl Clone for FT_StreamDesc_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_StreamDesc = FT_StreamDesc_;
+pub type FT_Stream_IoFunc =
+    ::std::option::Option<unsafe extern "C" fn(stream: FT_Stream,
+                                               offset:
+                                                   ::std::os::raw::c_ulong,
+                                               buffer:
+                                                   *mut ::std::os::raw::c_uchar,
+                                               count: ::std::os::raw::c_ulong)
+                              -> ::std::os::raw::c_ulong>;
+pub type FT_Stream_CloseFunc =
+    ::std::option::Option<unsafe extern "C" fn(stream: FT_Stream)>;
+pub type FT_StreamRec = FT_StreamRec_;
+pub type FT_Pos = ::std::os::raw::c_long;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Vector_ {
+    pub x: FT_Pos,
+    pub y: FT_Pos,
+}
+#[test]
+fn bindgen_test_layout_FT_Vector_() {
+    assert_eq!(::std::mem::size_of::<FT_Vector_>() , 16usize , concat ! (
+               "Size of: " , stringify ! ( FT_Vector_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Vector_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_Vector_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Vector_ ) ) . x as * const _ as usize
+                } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Vector_ ) , "::" ,
+                stringify ! ( x ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Vector_ ) ) . y as * const _ as usize
+                } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Vector_ ) , "::" ,
+                stringify ! ( y ) ));
+}
+impl Clone for FT_Vector_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Vector = FT_Vector_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_BBox_ {
+    pub xMin: FT_Pos,
+    pub yMin: FT_Pos,
+    pub xMax: FT_Pos,
+    pub yMax: FT_Pos,
+}
+#[test]
+fn bindgen_test_layout_FT_BBox_() {
+    assert_eq!(::std::mem::size_of::<FT_BBox_>() , 32usize , concat ! (
+               "Size of: " , stringify ! ( FT_BBox_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_BBox_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_BBox_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_BBox_ ) ) . xMin as * const _ as usize
+                } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_BBox_ ) , "::" ,
+                stringify ! ( xMin ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_BBox_ ) ) . yMin as * const _ as usize
+                } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_BBox_ ) , "::" ,
+                stringify ! ( yMin ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_BBox_ ) ) . xMax as * const _ as usize
+                } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_BBox_ ) , "::" ,
+                stringify ! ( xMax ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_BBox_ ) ) . yMax as * const _ as usize
+                } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_BBox_ ) , "::" ,
+                stringify ! ( yMax ) ));
+}
+impl Clone for FT_BBox_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_BBox = FT_BBox_;
+#[repr(u32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum FT_Pixel_Mode_ {
+    FT_PIXEL_MODE_NONE = 0,
+    FT_PIXEL_MODE_MONO = 1,
+    FT_PIXEL_MODE_GRAY = 2,
+    FT_PIXEL_MODE_GRAY2 = 3,
+    FT_PIXEL_MODE_GRAY4 = 4,
+    FT_PIXEL_MODE_LCD = 5,
+    FT_PIXEL_MODE_LCD_V = 6,
+    FT_PIXEL_MODE_BGRA = 7,
+    FT_PIXEL_MODE_MAX = 8,
+}
+pub use self::FT_Pixel_Mode_ as FT_Pixel_Mode;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Bitmap_ {
+    pub rows: ::std::os::raw::c_uint,
+    pub width: ::std::os::raw::c_uint,
+    pub pitch: ::std::os::raw::c_int,
+    pub buffer: *mut ::std::os::raw::c_uchar,
+    pub num_grays: ::std::os::raw::c_ushort,
+    pub pixel_mode: ::std::os::raw::c_uchar,
+    pub palette_mode: ::std::os::raw::c_uchar,
+    pub palette: *mut ::std::os::raw::c_void,
+}
+#[test]
+fn bindgen_test_layout_FT_Bitmap_() {
+    assert_eq!(::std::mem::size_of::<FT_Bitmap_>() , 40usize , concat ! (
+               "Size of: " , stringify ! ( FT_Bitmap_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Bitmap_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_Bitmap_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Bitmap_ ) ) . rows as * const _ as
+                usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Bitmap_ ) , "::" ,
+                stringify ! ( rows ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Bitmap_ ) ) . width as * const _ as
+                usize } , 4usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Bitmap_ ) , "::" ,
+                stringify ! ( width ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Bitmap_ ) ) . pitch as * const _ as
+                usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Bitmap_ ) , "::" ,
+                stringify ! ( pitch ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Bitmap_ ) ) . buffer as * const _ as
+                usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Bitmap_ ) , "::" ,
+                stringify ! ( buffer ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Bitmap_ ) ) . num_grays as * const _
+                as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Bitmap_ ) , "::" ,
+                stringify ! ( num_grays ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Bitmap_ ) ) . pixel_mode as * const _
+                as usize } , 26usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Bitmap_ ) , "::" ,
+                stringify ! ( pixel_mode ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Bitmap_ ) ) . palette_mode as * const
+                _ as usize } , 27usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Bitmap_ ) , "::" ,
+                stringify ! ( palette_mode ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Bitmap_ ) ) . palette as * const _ as
+                usize } , 32usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Bitmap_ ) , "::" ,
+                stringify ! ( palette ) ));
+}
+impl Clone for FT_Bitmap_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Bitmap = FT_Bitmap_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Outline_ {
+    pub n_contours: ::std::os::raw::c_short,
+    pub n_points: ::std::os::raw::c_short,
+    pub points: *mut FT_Vector,
+    pub tags: *mut ::std::os::raw::c_char,
+    pub contours: *mut ::std::os::raw::c_short,
+    pub flags: ::std::os::raw::c_int,
+}
+#[test]
+fn bindgen_test_layout_FT_Outline_() {
+    assert_eq!(::std::mem::size_of::<FT_Outline_>() , 40usize , concat ! (
+               "Size of: " , stringify ! ( FT_Outline_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Outline_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_Outline_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Outline_ ) ) . n_contours as * const _
+                as usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Outline_ ) , "::" ,
+                stringify ! ( n_contours ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Outline_ ) ) . n_points as * const _
+                as usize } , 2usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Outline_ ) , "::" ,
+                stringify ! ( n_points ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Outline_ ) ) . points as * const _ as
+                usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Outline_ ) , "::" ,
+                stringify ! ( points ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Outline_ ) ) . tags as * const _ as
+                usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Outline_ ) , "::" ,
+                stringify ! ( tags ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Outline_ ) ) . contours as * const _
+                as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Outline_ ) , "::" ,
+                stringify ! ( contours ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Outline_ ) ) . flags as * const _ as
+                usize } , 32usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Outline_ ) , "::" ,
+                stringify ! ( flags ) ));
+}
+impl Clone for FT_Outline_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Outline = FT_Outline_;
+pub type FT_Outline_MoveToFunc =
+    ::std::option::Option<unsafe extern "C" fn(to: *const FT_Vector,
+                                               user:
+                                                   *mut ::std::os::raw::c_void)
+                              -> ::std::os::raw::c_int>;
+pub type FT_Outline_LineToFunc =
+    ::std::option::Option<unsafe extern "C" fn(to: *const FT_Vector,
+                                               user:
+                                                   *mut ::std::os::raw::c_void)
+                              -> ::std::os::raw::c_int>;
+pub type FT_Outline_ConicToFunc =
+    ::std::option::Option<unsafe extern "C" fn(control: *const FT_Vector,
+                                               to: *const FT_Vector,
+                                               user:
+                                                   *mut ::std::os::raw::c_void)
+                              -> ::std::os::raw::c_int>;
+pub type FT_Outline_CubicToFunc =
+    ::std::option::Option<unsafe extern "C" fn(control1: *const FT_Vector,
+                                               control2: *const FT_Vector,
+                                               to: *const FT_Vector,
+                                               user:
+                                                   *mut ::std::os::raw::c_void)
+                              -> ::std::os::raw::c_int>;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Outline_Funcs_ {
+    pub move_to: FT_Outline_MoveToFunc,
+    pub line_to: FT_Outline_LineToFunc,
+    pub conic_to: FT_Outline_ConicToFunc,
+    pub cubic_to: FT_Outline_CubicToFunc,
+    pub shift: ::std::os::raw::c_int,
+    pub delta: FT_Pos,
+}
+#[test]
+fn bindgen_test_layout_FT_Outline_Funcs_() {
+    assert_eq!(::std::mem::size_of::<FT_Outline_Funcs_>() , 48usize , concat !
+               ( "Size of: " , stringify ! ( FT_Outline_Funcs_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Outline_Funcs_>() , 8usize , concat
+                ! ( "Alignment of " , stringify ! ( FT_Outline_Funcs_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Outline_Funcs_ ) ) . move_to as *
+                const _ as usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Outline_Funcs_ ) ,
+                "::" , stringify ! ( move_to ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Outline_Funcs_ ) ) . line_to as *
+                const _ as usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Outline_Funcs_ ) ,
+                "::" , stringify ! ( line_to ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Outline_Funcs_ ) ) . conic_to as *
+                const _ as usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Outline_Funcs_ ) ,
+                "::" , stringify ! ( conic_to ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Outline_Funcs_ ) ) . cubic_to as *
+                const _ as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Outline_Funcs_ ) ,
+                "::" , stringify ! ( cubic_to ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Outline_Funcs_ ) ) . shift as * const
+                _ as usize } , 32usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Outline_Funcs_ ) ,
+                "::" , stringify ! ( shift ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Outline_Funcs_ ) ) . delta as * const
+                _ as usize } , 40usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Outline_Funcs_ ) ,
+                "::" , stringify ! ( delta ) ));
+}
+impl Clone for FT_Outline_Funcs_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Outline_Funcs = FT_Outline_Funcs_;
+#[repr(u32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum FT_Glyph_Format_ {
+    FT_GLYPH_FORMAT_NONE = 0,
+    FT_GLYPH_FORMAT_COMPOSITE = 1668246896,
+    FT_GLYPH_FORMAT_BITMAP = 1651078259,
+    FT_GLYPH_FORMAT_OUTLINE = 1869968492,
+    FT_GLYPH_FORMAT_PLOTTER = 1886154612,
+}
+pub use self::FT_Glyph_Format_ as FT_Glyph_Format;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct FT_RasterRec_ {
+    _unused: [u8; 0],
+}
+pub type FT_Raster = *mut FT_RasterRec_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Span_ {
+    pub x: ::std::os::raw::c_short,
+    pub len: ::std::os::raw::c_ushort,
+    pub coverage: ::std::os::raw::c_uchar,
+}
+#[test]
+fn bindgen_test_layout_FT_Span_() {
+    assert_eq!(::std::mem::size_of::<FT_Span_>() , 6usize , concat ! (
+               "Size of: " , stringify ! ( FT_Span_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Span_>() , 2usize , concat ! (
+                "Alignment of " , stringify ! ( FT_Span_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Span_ ) ) . x as * const _ as usize }
+                , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Span_ ) , "::" ,
+                stringify ! ( x ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Span_ ) ) . len as * const _ as usize
+                } , 2usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Span_ ) , "::" ,
+                stringify ! ( len ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Span_ ) ) . coverage as * const _ as
+                usize } , 4usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Span_ ) , "::" ,
+                stringify ! ( coverage ) ));
+}
+impl Clone for FT_Span_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Span = FT_Span_;
+pub type FT_SpanFunc =
+    ::std::option::Option<unsafe extern "C" fn(y: ::std::os::raw::c_int,
+                                               count: ::std::os::raw::c_int,
+                                               spans: *const FT_Span,
+                                               user:
+                                                   *mut ::std::os::raw::c_void)>;
+pub type FT_Raster_BitTest_Func =
+    ::std::option::Option<unsafe extern "C" fn(y: ::std::os::raw::c_int,
+                                               x: ::std::os::raw::c_int,
+                                               user:
+                                                   *mut ::std::os::raw::c_void)
+                              -> ::std::os::raw::c_int>;
+pub type FT_Raster_BitSet_Func =
+    ::std::option::Option<unsafe extern "C" fn(y: ::std::os::raw::c_int,
+                                               x: ::std::os::raw::c_int,
+                                               user:
+                                                   *mut ::std::os::raw::c_void)>;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Raster_Params_ {
+    pub target: *const FT_Bitmap,
+    pub source: *const ::std::os::raw::c_void,
+    pub flags: ::std::os::raw::c_int,
+    pub gray_spans: FT_SpanFunc,
+    pub black_spans: FT_SpanFunc,
+    pub bit_test: FT_Raster_BitTest_Func,
+    pub bit_set: FT_Raster_BitSet_Func,
+    pub user: *mut ::std::os::raw::c_void,
+    pub clip_box: FT_BBox,
+}
+#[test]
+fn bindgen_test_layout_FT_Raster_Params_() {
+    assert_eq!(::std::mem::size_of::<FT_Raster_Params_>() , 96usize , concat !
+               ( "Size of: " , stringify ! ( FT_Raster_Params_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Raster_Params_>() , 8usize , concat
+                ! ( "Alignment of " , stringify ! ( FT_Raster_Params_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Params_ ) ) . target as * const
+                _ as usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Params_ ) ,
+                "::" , stringify ! ( target ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Params_ ) ) . source as * const
+                _ as usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Params_ ) ,
+                "::" , stringify ! ( source ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Params_ ) ) . flags as * const
+                _ as usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Params_ ) ,
+                "::" , stringify ! ( flags ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Params_ ) ) . gray_spans as *
+                const _ as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Params_ ) ,
+                "::" , stringify ! ( gray_spans ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Params_ ) ) . black_spans as *
+                const _ as usize } , 32usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Params_ ) ,
+                "::" , stringify ! ( black_spans ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Params_ ) ) . bit_test as *
+                const _ as usize } , 40usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Params_ ) ,
+                "::" , stringify ! ( bit_test ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Params_ ) ) . bit_set as *
+                const _ as usize } , 48usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Params_ ) ,
+                "::" , stringify ! ( bit_set ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Params_ ) ) . user as * const _
+                as usize } , 56usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Params_ ) ,
+                "::" , stringify ! ( user ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Params_ ) ) . clip_box as *
+                const _ as usize } , 64usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Params_ ) ,
+                "::" , stringify ! ( clip_box ) ));
+}
+impl Clone for FT_Raster_Params_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Raster_Params = FT_Raster_Params_;
+pub type FT_Raster_NewFunc =
+    ::std::option::Option<unsafe extern "C" fn(memory:
+                                                   *mut ::std::os::raw::c_void,
+                                               raster: *mut FT_Raster)
+                              -> ::std::os::raw::c_int>;
+pub type FT_Raster_DoneFunc =
+    ::std::option::Option<unsafe extern "C" fn(raster: FT_Raster)>;
+pub type FT_Raster_ResetFunc =
+    ::std::option::Option<unsafe extern "C" fn(raster: FT_Raster,
+                                               pool_base:
+                                                   *mut ::std::os::raw::c_uchar,
+                                               pool_size:
+                                                   ::std::os::raw::c_ulong)>;
+pub type FT_Raster_SetModeFunc =
+    ::std::option::Option<unsafe extern "C" fn(raster: FT_Raster,
+                                               mode: ::std::os::raw::c_ulong,
+                                               args:
+                                                   *mut ::std::os::raw::c_void)
+                              -> ::std::os::raw::c_int>;
+pub type FT_Raster_RenderFunc =
+    ::std::option::Option<unsafe extern "C" fn(raster: FT_Raster,
+                                               params:
+                                                   *const FT_Raster_Params)
+                              -> ::std::os::raw::c_int>;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Raster_Funcs_ {
+    pub glyph_format: FT_Glyph_Format,
+    pub raster_new: FT_Raster_NewFunc,
+    pub raster_reset: FT_Raster_ResetFunc,
+    pub raster_set_mode: FT_Raster_SetModeFunc,
+    pub raster_render: FT_Raster_RenderFunc,
+    pub raster_done: FT_Raster_DoneFunc,
+}
+#[test]
+fn bindgen_test_layout_FT_Raster_Funcs_() {
+    assert_eq!(::std::mem::size_of::<FT_Raster_Funcs_>() , 48usize , concat !
+               ( "Size of: " , stringify ! ( FT_Raster_Funcs_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Raster_Funcs_>() , 8usize , concat !
+                ( "Alignment of " , stringify ! ( FT_Raster_Funcs_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Funcs_ ) ) . glyph_format as *
+                const _ as usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Funcs_ ) ,
+                "::" , stringify ! ( glyph_format ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Funcs_ ) ) . raster_new as *
+                const _ as usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Funcs_ ) ,
+                "::" , stringify ! ( raster_new ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Funcs_ ) ) . raster_reset as *
+                const _ as usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Funcs_ ) ,
+                "::" , stringify ! ( raster_reset ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Funcs_ ) ) . raster_set_mode as
+                * const _ as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Funcs_ ) ,
+                "::" , stringify ! ( raster_set_mode ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Funcs_ ) ) . raster_render as *
+                const _ as usize } , 32usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Funcs_ ) ,
+                "::" , stringify ! ( raster_render ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Raster_Funcs_ ) ) . raster_done as *
+                const _ as usize } , 40usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Raster_Funcs_ ) ,
+                "::" , stringify ! ( raster_done ) ));
+}
+impl Clone for FT_Raster_Funcs_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Raster_Funcs = FT_Raster_Funcs_;
+pub type FT_Bool = ::std::os::raw::c_uchar;
+pub type FT_FWord = ::std::os::raw::c_short;
+pub type FT_UFWord = ::std::os::raw::c_ushort;
+pub type FT_Char = ::std::os::raw::c_schar;
+pub type FT_Byte = ::std::os::raw::c_uchar;
+pub type FT_Bytes = *const FT_Byte;
+pub type FT_Tag = FT_UInt32;
+pub type FT_String = ::std::os::raw::c_char;
+pub type FT_Short = ::std::os::raw::c_short;
+pub type FT_UShort = ::std::os::raw::c_ushort;
+pub type FT_Int = ::std::os::raw::c_int;
+pub type FT_UInt = ::std::os::raw::c_uint;
+pub type FT_Long = ::std::os::raw::c_long;
+pub type FT_ULong = ::std::os::raw::c_ulong;
+pub type FT_F2Dot14 = ::std::os::raw::c_short;
+pub type FT_F26Dot6 = ::std::os::raw::c_long;
+pub type FT_Fixed = ::std::os::raw::c_long;
+pub type FT_Pointer = *mut ::std::os::raw::c_void;
+pub type FT_Offset = usize;
+pub type FT_PtrDist = isize;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_UnitVector_ {
+    pub x: FT_F2Dot14,
+    pub y: FT_F2Dot14,
+}
+#[test]
+fn bindgen_test_layout_FT_UnitVector_() {
+    assert_eq!(::std::mem::size_of::<FT_UnitVector_>() , 4usize , concat ! (
+               "Size of: " , stringify ! ( FT_UnitVector_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_UnitVector_>() , 2usize , concat ! (
+                "Alignment of " , stringify ! ( FT_UnitVector_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_UnitVector_ ) ) . x as * const _ as
+                usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_UnitVector_ ) , "::"
+                , stringify ! ( x ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_UnitVector_ ) ) . y as * const _ as
+                usize } , 2usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_UnitVector_ ) , "::"
+                , stringify ! ( y ) ));
+}
+impl Clone for FT_UnitVector_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_UnitVector = FT_UnitVector_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Matrix_ {
+    pub xx: FT_Fixed,
+    pub xy: FT_Fixed,
+    pub yx: FT_Fixed,
+    pub yy: FT_Fixed,
+}
+#[test]
+fn bindgen_test_layout_FT_Matrix_() {
+    assert_eq!(::std::mem::size_of::<FT_Matrix_>() , 32usize , concat ! (
+               "Size of: " , stringify ! ( FT_Matrix_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Matrix_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_Matrix_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Matrix_ ) ) . xx as * const _ as usize
+                } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Matrix_ ) , "::" ,
+                stringify ! ( xx ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Matrix_ ) ) . xy as * const _ as usize
+                } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Matrix_ ) , "::" ,
+                stringify ! ( xy ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Matrix_ ) ) . yx as * const _ as usize
+                } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Matrix_ ) , "::" ,
+                stringify ! ( yx ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Matrix_ ) ) . yy as * const _ as usize
+                } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Matrix_ ) , "::" ,
+                stringify ! ( yy ) ));
+}
+impl Clone for FT_Matrix_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Matrix = FT_Matrix_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Data_ {
+    pub pointer: *const FT_Byte,
+    pub length: FT_Int,
+}
+#[test]
+fn bindgen_test_layout_FT_Data_() {
+    assert_eq!(::std::mem::size_of::<FT_Data_>() , 16usize , concat ! (
+               "Size of: " , stringify ! ( FT_Data_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Data_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_Data_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Data_ ) ) . pointer as * const _ as
+                usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Data_ ) , "::" ,
+                stringify ! ( pointer ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Data_ ) ) . length as * const _ as
+                usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Data_ ) , "::" ,
+                stringify ! ( length ) ));
+}
+impl Clone for FT_Data_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Data = FT_Data_;
+pub type FT_Generic_Finalizer =
+    ::std::option::Option<unsafe extern "C" fn(object:
+                                                   *mut ::std::os::raw::c_void)>;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Generic_ {
+    pub data: *mut ::std::os::raw::c_void,
+    pub finalizer: FT_Generic_Finalizer,
+}
+#[test]
+fn bindgen_test_layout_FT_Generic_() {
+    assert_eq!(::std::mem::size_of::<FT_Generic_>() , 16usize , concat ! (
+               "Size of: " , stringify ! ( FT_Generic_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Generic_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_Generic_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Generic_ ) ) . data as * const _ as
+                usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Generic_ ) , "::" ,
+                stringify ! ( data ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Generic_ ) ) . finalizer as * const _
+                as usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Generic_ ) , "::" ,
+                stringify ! ( finalizer ) ));
+}
+impl Clone for FT_Generic_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Generic = FT_Generic_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_ListNodeRec_ {
+    pub prev: FT_ListNode,
+    pub next: FT_ListNode,
+    pub data: *mut ::std::os::raw::c_void,
+}
+#[test]
+fn bindgen_test_layout_FT_ListNodeRec_() {
+    assert_eq!(::std::mem::size_of::<FT_ListNodeRec_>() , 24usize , concat ! (
+               "Size of: " , stringify ! ( FT_ListNodeRec_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_ListNodeRec_>() , 8usize , concat !
+                ( "Alignment of " , stringify ! ( FT_ListNodeRec_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_ListNodeRec_ ) ) . prev as * const _
+                as usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_ListNodeRec_ ) ,
+                "::" , stringify ! ( prev ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_ListNodeRec_ ) ) . next as * const _
+                as usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_ListNodeRec_ ) ,
+                "::" , stringify ! ( next ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_ListNodeRec_ ) ) . data as * const _
+                as usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_ListNodeRec_ ) ,
+                "::" , stringify ! ( data ) ));
+}
+impl Clone for FT_ListNodeRec_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_ListNode = *mut FT_ListNodeRec_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_ListRec_ {
+    pub head: FT_ListNode,
+    pub tail: FT_ListNode,
+}
+#[test]
+fn bindgen_test_layout_FT_ListRec_() {
+    assert_eq!(::std::mem::size_of::<FT_ListRec_>() , 16usize , concat ! (
+               "Size of: " , stringify ! ( FT_ListRec_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_ListRec_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_ListRec_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_ListRec_ ) ) . head as * const _ as
+                usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_ListRec_ ) , "::" ,
+                stringify ! ( head ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_ListRec_ ) ) . tail as * const _ as
+                usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_ListRec_ ) , "::" ,
+                stringify ! ( tail ) ));
+}
+impl Clone for FT_ListRec_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_List = *mut FT_ListRec_;
+pub type FT_ListNodeRec = FT_ListNodeRec_;
+pub type FT_ListRec = FT_ListRec_;
+pub const FT_Mod_Err_Base: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_Autofit: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_BDF: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_Bzip2: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_Cache: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_CFF: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_CID: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_Gzip: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_LZW: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_OTvalid: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_PCF: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_PFR: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_PSaux: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_PShinter: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_PSnames: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_Raster: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_SFNT: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_Smooth: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_TrueType: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_Type1: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_Type42: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_Winfonts: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_GXvalid: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Base;
+pub const FT_Mod_Err_Max: _bindgen_ty_1 = _bindgen_ty_1::FT_Mod_Err_Max;
+#[repr(u32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum _bindgen_ty_1 { FT_Mod_Err_Base = 0, FT_Mod_Err_Max = 1, }
+pub const FT_Err_Ok: _bindgen_ty_2 = _bindgen_ty_2::FT_Err_Ok;
+pub const FT_Err_Cannot_Open_Resource: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Cannot_Open_Resource;
+pub const FT_Err_Unknown_File_Format: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Unknown_File_Format;
+pub const FT_Err_Invalid_File_Format: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_File_Format;
+pub const FT_Err_Invalid_Version: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Version;
+pub const FT_Err_Lower_Module_Version: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Lower_Module_Version;
+pub const FT_Err_Invalid_Argument: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Argument;
+pub const FT_Err_Unimplemented_Feature: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Unimplemented_Feature;
+pub const FT_Err_Invalid_Table: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Table;
+pub const FT_Err_Invalid_Offset: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Offset;
+pub const FT_Err_Array_Too_Large: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Array_Too_Large;
+pub const FT_Err_Missing_Module: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Missing_Module;
+pub const FT_Err_Missing_Property: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Missing_Property;
+pub const FT_Err_Invalid_Glyph_Index: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Glyph_Index;
+pub const FT_Err_Invalid_Character_Code: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Character_Code;
+pub const FT_Err_Invalid_Glyph_Format: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Glyph_Format;
+pub const FT_Err_Cannot_Render_Glyph: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Cannot_Render_Glyph;
+pub const FT_Err_Invalid_Outline: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Outline;
+pub const FT_Err_Invalid_Composite: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Composite;
+pub const FT_Err_Too_Many_Hints: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Too_Many_Hints;
+pub const FT_Err_Invalid_Pixel_Size: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Pixel_Size;
+pub const FT_Err_Invalid_Handle: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Handle;
+pub const FT_Err_Invalid_Library_Handle: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Library_Handle;
+pub const FT_Err_Invalid_Driver_Handle: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Driver_Handle;
+pub const FT_Err_Invalid_Face_Handle: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Face_Handle;
+pub const FT_Err_Invalid_Size_Handle: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Size_Handle;
+pub const FT_Err_Invalid_Slot_Handle: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Slot_Handle;
+pub const FT_Err_Invalid_CharMap_Handle: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_CharMap_Handle;
+pub const FT_Err_Invalid_Cache_Handle: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Cache_Handle;
+pub const FT_Err_Invalid_Stream_Handle: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Stream_Handle;
+pub const FT_Err_Too_Many_Drivers: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Too_Many_Drivers;
+pub const FT_Err_Too_Many_Extensions: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Too_Many_Extensions;
+pub const FT_Err_Out_Of_Memory: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Out_Of_Memory;
+pub const FT_Err_Unlisted_Object: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Unlisted_Object;
+pub const FT_Err_Cannot_Open_Stream: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Cannot_Open_Stream;
+pub const FT_Err_Invalid_Stream_Seek: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Stream_Seek;
+pub const FT_Err_Invalid_Stream_Skip: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Stream_Skip;
+pub const FT_Err_Invalid_Stream_Read: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Stream_Read;
+pub const FT_Err_Invalid_Stream_Operation: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Stream_Operation;
+pub const FT_Err_Invalid_Frame_Operation: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Frame_Operation;
+pub const FT_Err_Nested_Frame_Access: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Nested_Frame_Access;
+pub const FT_Err_Invalid_Frame_Read: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Frame_Read;
+pub const FT_Err_Raster_Uninitialized: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Raster_Uninitialized;
+pub const FT_Err_Raster_Corrupted: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Raster_Corrupted;
+pub const FT_Err_Raster_Overflow: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Raster_Overflow;
+pub const FT_Err_Raster_Negative_Height: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Raster_Negative_Height;
+pub const FT_Err_Too_Many_Caches: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Too_Many_Caches;
+pub const FT_Err_Invalid_Opcode: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Opcode;
+pub const FT_Err_Too_Few_Arguments: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Too_Few_Arguments;
+pub const FT_Err_Stack_Overflow: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Stack_Overflow;
+pub const FT_Err_Code_Overflow: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Code_Overflow;
+pub const FT_Err_Bad_Argument: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Bad_Argument;
+pub const FT_Err_Divide_By_Zero: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Divide_By_Zero;
+pub const FT_Err_Invalid_Reference: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Reference;
+pub const FT_Err_Debug_OpCode: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Debug_OpCode;
+pub const FT_Err_ENDF_In_Exec_Stream: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_ENDF_In_Exec_Stream;
+pub const FT_Err_Nested_DEFS: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Nested_DEFS;
+pub const FT_Err_Invalid_CodeRange: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_CodeRange;
+pub const FT_Err_Execution_Too_Long: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Execution_Too_Long;
+pub const FT_Err_Too_Many_Function_Defs: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Too_Many_Function_Defs;
+pub const FT_Err_Too_Many_Instruction_Defs: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Too_Many_Instruction_Defs;
+pub const FT_Err_Table_Missing: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Table_Missing;
+pub const FT_Err_Horiz_Header_Missing: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Horiz_Header_Missing;
+pub const FT_Err_Locations_Missing: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Locations_Missing;
+pub const FT_Err_Name_Table_Missing: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Name_Table_Missing;
+pub const FT_Err_CMap_Table_Missing: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_CMap_Table_Missing;
+pub const FT_Err_Hmtx_Table_Missing: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Hmtx_Table_Missing;
+pub const FT_Err_Post_Table_Missing: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Post_Table_Missing;
+pub const FT_Err_Invalid_Horiz_Metrics: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Horiz_Metrics;
+pub const FT_Err_Invalid_CharMap_Format: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_CharMap_Format;
+pub const FT_Err_Invalid_PPem: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_PPem;
+pub const FT_Err_Invalid_Vert_Metrics: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Vert_Metrics;
+pub const FT_Err_Could_Not_Find_Context: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Could_Not_Find_Context;
+pub const FT_Err_Invalid_Post_Table_Format: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Post_Table_Format;
+pub const FT_Err_Invalid_Post_Table: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Invalid_Post_Table;
+pub const FT_Err_Syntax_Error: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Syntax_Error;
+pub const FT_Err_Stack_Underflow: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Stack_Underflow;
+pub const FT_Err_Ignore: _bindgen_ty_2 = _bindgen_ty_2::FT_Err_Ignore;
+pub const FT_Err_No_Unicode_Glyph_Name: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_No_Unicode_Glyph_Name;
+pub const FT_Err_Glyph_Too_Big: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Glyph_Too_Big;
+pub const FT_Err_Missing_Startfont_Field: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Missing_Startfont_Field;
+pub const FT_Err_Missing_Font_Field: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Missing_Font_Field;
+pub const FT_Err_Missing_Size_Field: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Missing_Size_Field;
+pub const FT_Err_Missing_Fontboundingbox_Field: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Missing_Fontboundingbox_Field;
+pub const FT_Err_Missing_Chars_Field: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Missing_Chars_Field;
+pub const FT_Err_Missing_Startchar_Field: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Missing_Startchar_Field;
+pub const FT_Err_Missing_Encoding_Field: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Missing_Encoding_Field;
+pub const FT_Err_Missing_Bbx_Field: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Missing_Bbx_Field;
+pub const FT_Err_Bbx_Too_Big: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Bbx_Too_Big;
+pub const FT_Err_Corrupted_Font_Header: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Corrupted_Font_Header;
+pub const FT_Err_Corrupted_Font_Glyphs: _bindgen_ty_2 =
+    _bindgen_ty_2::FT_Err_Corrupted_Font_Glyphs;
+pub const FT_Err_Max: _bindgen_ty_2 = _bindgen_ty_2::FT_Err_Max;
+#[repr(u32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum _bindgen_ty_2 {
+    FT_Err_Ok = 0,
+    FT_Err_Cannot_Open_Resource = 1,
+    FT_Err_Unknown_File_Format = 2,
+    FT_Err_Invalid_File_Format = 3,
+    FT_Err_Invalid_Version = 4,
+    FT_Err_Lower_Module_Version = 5,
+    FT_Err_Invalid_Argument = 6,
+    FT_Err_Unimplemented_Feature = 7,
+    FT_Err_Invalid_Table = 8,
+    FT_Err_Invalid_Offset = 9,
+    FT_Err_Array_Too_Large = 10,
+    FT_Err_Missing_Module = 11,
+    FT_Err_Missing_Property = 12,
+    FT_Err_Invalid_Glyph_Index = 16,
+    FT_Err_Invalid_Character_Code = 17,
+    FT_Err_Invalid_Glyph_Format = 18,
+    FT_Err_Cannot_Render_Glyph = 19,
+    FT_Err_Invalid_Outline = 20,
+    FT_Err_Invalid_Composite = 21,
+    FT_Err_Too_Many_Hints = 22,
+    FT_Err_Invalid_Pixel_Size = 23,
+    FT_Err_Invalid_Handle = 32,
+    FT_Err_Invalid_Library_Handle = 33,
+    FT_Err_Invalid_Driver_Handle = 34,
+    FT_Err_Invalid_Face_Handle = 35,
+    FT_Err_Invalid_Size_Handle = 36,
+    FT_Err_Invalid_Slot_Handle = 37,
+    FT_Err_Invalid_CharMap_Handle = 38,
+    FT_Err_Invalid_Cache_Handle = 39,
+    FT_Err_Invalid_Stream_Handle = 40,
+    FT_Err_Too_Many_Drivers = 48,
+    FT_Err_Too_Many_Extensions = 49,
+    FT_Err_Out_Of_Memory = 64,
+    FT_Err_Unlisted_Object = 65,
+    FT_Err_Cannot_Open_Stream = 81,
+    FT_Err_Invalid_Stream_Seek = 82,
+    FT_Err_Invalid_Stream_Skip = 83,
+    FT_Err_Invalid_Stream_Read = 84,
+    FT_Err_Invalid_Stream_Operation = 85,
+    FT_Err_Invalid_Frame_Operation = 86,
+    FT_Err_Nested_Frame_Access = 87,
+    FT_Err_Invalid_Frame_Read = 88,
+    FT_Err_Raster_Uninitialized = 96,
+    FT_Err_Raster_Corrupted = 97,
+    FT_Err_Raster_Overflow = 98,
+    FT_Err_Raster_Negative_Height = 99,
+    FT_Err_Too_Many_Caches = 112,
+    FT_Err_Invalid_Opcode = 128,
+    FT_Err_Too_Few_Arguments = 129,
+    FT_Err_Stack_Overflow = 130,
+    FT_Err_Code_Overflow = 131,
+    FT_Err_Bad_Argument = 132,
+    FT_Err_Divide_By_Zero = 133,
+    FT_Err_Invalid_Reference = 134,
+    FT_Err_Debug_OpCode = 135,
+    FT_Err_ENDF_In_Exec_Stream = 136,
+    FT_Err_Nested_DEFS = 137,
+    FT_Err_Invalid_CodeRange = 138,
+    FT_Err_Execution_Too_Long = 139,
+    FT_Err_Too_Many_Function_Defs = 140,
+    FT_Err_Too_Many_Instruction_Defs = 141,
+    FT_Err_Table_Missing = 142,
+    FT_Err_Horiz_Header_Missing = 143,
+    FT_Err_Locations_Missing = 144,
+    FT_Err_Name_Table_Missing = 145,
+    FT_Err_CMap_Table_Missing = 146,
+    FT_Err_Hmtx_Table_Missing = 147,
+    FT_Err_Post_Table_Missing = 148,
+    FT_Err_Invalid_Horiz_Metrics = 149,
+    FT_Err_Invalid_CharMap_Format = 150,
+    FT_Err_Invalid_PPem = 151,
+    FT_Err_Invalid_Vert_Metrics = 152,
+    FT_Err_Could_Not_Find_Context = 153,
+    FT_Err_Invalid_Post_Table_Format = 154,
+    FT_Err_Invalid_Post_Table = 155,
+    FT_Err_Syntax_Error = 160,
+    FT_Err_Stack_Underflow = 161,
+    FT_Err_Ignore = 162,
+    FT_Err_No_Unicode_Glyph_Name = 163,
+    FT_Err_Glyph_Too_Big = 164,
+    FT_Err_Missing_Startfont_Field = 176,
+    FT_Err_Missing_Font_Field = 177,
+    FT_Err_Missing_Size_Field = 178,
+    FT_Err_Missing_Fontboundingbox_Field = 179,
+    FT_Err_Missing_Chars_Field = 180,
+    FT_Err_Missing_Startchar_Field = 181,
+    FT_Err_Missing_Encoding_Field = 182,
+    FT_Err_Missing_Bbx_Field = 183,
+    FT_Err_Bbx_Too_Big = 184,
+    FT_Err_Corrupted_Font_Header = 185,
+    FT_Err_Corrupted_Font_Glyphs = 186,
+    FT_Err_Max = 187,
+}
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Glyph_Metrics_ {
+    pub width: FT_Pos,
+    pub height: FT_Pos,
+    pub horiBearingX: FT_Pos,
+    pub horiBearingY: FT_Pos,
+    pub horiAdvance: FT_Pos,
+    pub vertBearingX: FT_Pos,
+    pub vertBearingY: FT_Pos,
+    pub vertAdvance: FT_Pos,
+}
+#[test]
+fn bindgen_test_layout_FT_Glyph_Metrics_() {
+    assert_eq!(::std::mem::size_of::<FT_Glyph_Metrics_>() , 64usize , concat !
+               ( "Size of: " , stringify ! ( FT_Glyph_Metrics_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Glyph_Metrics_>() , 8usize , concat
+                ! ( "Alignment of " , stringify ! ( FT_Glyph_Metrics_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Glyph_Metrics_ ) ) . width as * const
+                _ as usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Glyph_Metrics_ ) ,
+                "::" , stringify ! ( width ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Glyph_Metrics_ ) ) . height as * const
+                _ as usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Glyph_Metrics_ ) ,
+                "::" , stringify ! ( height ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Glyph_Metrics_ ) ) . horiBearingX as *
+                const _ as usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Glyph_Metrics_ ) ,
+                "::" , stringify ! ( horiBearingX ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Glyph_Metrics_ ) ) . horiBearingY as *
+                const _ as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Glyph_Metrics_ ) ,
+                "::" , stringify ! ( horiBearingY ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Glyph_Metrics_ ) ) . horiAdvance as *
+                const _ as usize } , 32usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Glyph_Metrics_ ) ,
+                "::" , stringify ! ( horiAdvance ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Glyph_Metrics_ ) ) . vertBearingX as *
+                const _ as usize } , 40usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Glyph_Metrics_ ) ,
+                "::" , stringify ! ( vertBearingX ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Glyph_Metrics_ ) ) . vertBearingY as *
+                const _ as usize } , 48usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Glyph_Metrics_ ) ,
+                "::" , stringify ! ( vertBearingY ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Glyph_Metrics_ ) ) . vertAdvance as *
+                const _ as usize } , 56usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Glyph_Metrics_ ) ,
+                "::" , stringify ! ( vertAdvance ) ));
+}
+impl Clone for FT_Glyph_Metrics_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Glyph_Metrics = FT_Glyph_Metrics_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Bitmap_Size_ {
+    pub height: FT_Short,
+    pub width: FT_Short,
+    pub size: FT_Pos,
+    pub x_ppem: FT_Pos,
+    pub y_ppem: FT_Pos,
+}
+#[test]
+fn bindgen_test_layout_FT_Bitmap_Size_() {
+    assert_eq!(::std::mem::size_of::<FT_Bitmap_Size_>() , 32usize , concat ! (
+               "Size of: " , stringify ! ( FT_Bitmap_Size_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Bitmap_Size_>() , 8usize , concat !
+                ( "Alignment of " , stringify ! ( FT_Bitmap_Size_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Bitmap_Size_ ) ) . height as * const _
+                as usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Bitmap_Size_ ) ,
+                "::" , stringify ! ( height ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Bitmap_Size_ ) ) . width as * const _
+                as usize } , 2usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Bitmap_Size_ ) ,
+                "::" , stringify ! ( width ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Bitmap_Size_ ) ) . size as * const _
+                as usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Bitmap_Size_ ) ,
+                "::" , stringify ! ( size ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Bitmap_Size_ ) ) . x_ppem as * const _
+                as usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Bitmap_Size_ ) ,
+                "::" , stringify ! ( x_ppem ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Bitmap_Size_ ) ) . y_ppem as * const _
+                as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Bitmap_Size_ ) ,
+                "::" , stringify ! ( y_ppem ) ));
+}
+impl Clone for FT_Bitmap_Size_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Bitmap_Size = FT_Bitmap_Size_;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct FT_LibraryRec_ {
+    _unused: [u8; 0],
+}
+pub type FT_Library = *mut FT_LibraryRec_;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct FT_ModuleRec_ {
+    _unused: [u8; 0],
+}
+pub type FT_Module = *mut FT_ModuleRec_;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct FT_DriverRec_ {
+    _unused: [u8; 0],
+}
+pub type FT_Driver = *mut FT_DriverRec_;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct FT_RendererRec_ {
+    _unused: [u8; 0],
+}
+pub type FT_Renderer = *mut FT_RendererRec_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_FaceRec_ {
+    pub num_faces: FT_Long,
+    pub face_index: FT_Long,
+    pub face_flags: FT_Long,
+    pub style_flags: FT_Long,
+    pub num_glyphs: FT_Long,
+    pub family_name: *mut FT_String,
+    pub style_name: *mut FT_String,
+    pub num_fixed_sizes: FT_Int,
+    pub available_sizes: *mut FT_Bitmap_Size,
+    pub num_charmaps: FT_Int,
+    pub charmaps: *mut FT_CharMap,
+    pub generic: FT_Generic,
+    pub bbox: FT_BBox,
+    pub units_per_EM: FT_UShort,
+    pub ascender: FT_Short,
+    pub descender: FT_Short,
+    pub height: FT_Short,
+    pub max_advance_width: FT_Short,
+    pub max_advance_height: FT_Short,
+    pub underline_position: FT_Short,
+    pub underline_thickness: FT_Short,
+    pub glyph: FT_GlyphSlot,
+    pub size: FT_Size,
+    pub charmap: FT_CharMap,
+    pub driver: FT_Driver,
+    pub memory: FT_Memory,
+    pub stream: FT_Stream,
+    pub sizes_list: FT_ListRec,
+    pub autohint: FT_Generic,
+    pub extensions: *mut ::std::os::raw::c_void,
+    pub internal: FT_Face_Internal,
+}
+#[test]
+fn bindgen_test_layout_FT_FaceRec_() {
+    assert_eq!(::std::mem::size_of::<FT_FaceRec_>() , 248usize , concat ! (
+               "Size of: " , stringify ! ( FT_FaceRec_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_FaceRec_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_FaceRec_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . num_faces as * const _
+                as usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( num_faces ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . face_index as * const _
+                as usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( face_index ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . face_flags as * const _
+                as usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( face_flags ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . style_flags as * const
+                _ as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( style_flags ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . num_glyphs as * const _
+                as usize } , 32usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( num_glyphs ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . family_name as * const
+                _ as usize } , 40usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( family_name ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . style_name as * const _
+                as usize } , 48usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( style_name ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . num_fixed_sizes as *
+                const _ as usize } , 56usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( num_fixed_sizes ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . available_sizes as *
+                const _ as usize } , 64usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( available_sizes ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . num_charmaps as * const
+                _ as usize } , 72usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( num_charmaps ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . charmaps as * const _
+                as usize } , 80usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( charmaps ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . generic as * const _ as
+                usize } , 88usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( generic ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . bbox as * const _ as
+                usize } , 104usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( bbox ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . units_per_EM as * const
+                _ as usize } , 136usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( units_per_EM ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . ascender as * const _
+                as usize } , 138usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( ascender ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . descender as * const _
+                as usize } , 140usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( descender ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . height as * const _ as
+                usize } , 142usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( height ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . max_advance_width as *
+                const _ as usize } , 144usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( max_advance_width ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . max_advance_height as *
+                const _ as usize } , 146usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( max_advance_height ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . underline_position as *
+                const _ as usize } , 148usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( underline_position ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . underline_thickness as
+                * const _ as usize } , 150usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( underline_thickness ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . glyph as * const _ as
+                usize } , 152usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( glyph ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . size as * const _ as
+                usize } , 160usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( size ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . charmap as * const _ as
+                usize } , 168usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( charmap ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . driver as * const _ as
+                usize } , 176usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( driver ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . memory as * const _ as
+                usize } , 184usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( memory ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . stream as * const _ as
+                usize } , 192usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( stream ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . sizes_list as * const _
+                as usize } , 200usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( sizes_list ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . autohint as * const _
+                as usize } , 216usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( autohint ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . extensions as * const _
+                as usize } , 232usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( extensions ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_FaceRec_ ) ) . internal as * const _
+                as usize } , 240usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_FaceRec_ ) , "::" ,
+                stringify ! ( internal ) ));
+}
+impl Clone for FT_FaceRec_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Face = *mut FT_FaceRec_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_SizeRec_ {
+    pub face: FT_Face,
+    pub generic: FT_Generic,
+    pub metrics: FT_Size_Metrics,
+    pub internal: FT_Size_Internal,
+}
+#[test]
+fn bindgen_test_layout_FT_SizeRec_() {
+    assert_eq!(::std::mem::size_of::<FT_SizeRec_>() , 88usize , concat ! (
+               "Size of: " , stringify ! ( FT_SizeRec_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_SizeRec_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_SizeRec_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_SizeRec_ ) ) . face as * const _ as
+                usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_SizeRec_ ) , "::" ,
+                stringify ! ( face ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_SizeRec_ ) ) . generic as * const _ as
+                usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_SizeRec_ ) , "::" ,
+                stringify ! ( generic ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_SizeRec_ ) ) . metrics as * const _ as
+                usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_SizeRec_ ) , "::" ,
+                stringify ! ( metrics ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_SizeRec_ ) ) . internal as * const _
+                as usize } , 80usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_SizeRec_ ) , "::" ,
+                stringify ! ( internal ) ));
+}
+impl Clone for FT_SizeRec_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Size = *mut FT_SizeRec_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_GlyphSlotRec_ {
+    pub library: FT_Library,
+    pub face: FT_Face,
+    pub next: FT_GlyphSlot,
+    pub reserved: FT_UInt,
+    pub generic: FT_Generic,
+    pub metrics: FT_Glyph_Metrics,
+    pub linearHoriAdvance: FT_Fixed,
+    pub linearVertAdvance: FT_Fixed,
+    pub advance: FT_Vector,
+    pub format: FT_Glyph_Format,
+    pub bitmap: FT_Bitmap,
+    pub bitmap_left: FT_Int,
+    pub bitmap_top: FT_Int,
+    pub outline: FT_Outline,
+    pub num_subglyphs: FT_UInt,
+    pub subglyphs: FT_SubGlyph,
+    pub control_data: *mut ::std::os::raw::c_void,
+    pub control_len: ::std::os::raw::c_long,
+    pub lsb_delta: FT_Pos,
+    pub rsb_delta: FT_Pos,
+    pub other: *mut ::std::os::raw::c_void,
+    pub internal: FT_Slot_Internal,
+}
+#[test]
+fn bindgen_test_layout_FT_GlyphSlotRec_() {
+    assert_eq!(::std::mem::size_of::<FT_GlyphSlotRec_>() , 304usize , concat !
+               ( "Size of: " , stringify ! ( FT_GlyphSlotRec_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_GlyphSlotRec_>() , 8usize , concat !
+                ( "Alignment of " , stringify ! ( FT_GlyphSlotRec_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . library as * const
+                _ as usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( library ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . face as * const _
+                as usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( face ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . next as * const _
+                as usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( next ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . reserved as *
+                const _ as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( reserved ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . generic as * const
+                _ as usize } , 32usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( generic ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . metrics as * const
+                _ as usize } , 48usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( metrics ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . linearHoriAdvance
+                as * const _ as usize } , 112usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( linearHoriAdvance ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . linearVertAdvance
+                as * const _ as usize } , 120usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( linearVertAdvance ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . advance as * const
+                _ as usize } , 128usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( advance ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . format as * const
+                _ as usize } , 144usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( format ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . bitmap as * const
+                _ as usize } , 152usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( bitmap ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . bitmap_left as *
+                const _ as usize } , 192usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( bitmap_left ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . bitmap_top as *
+                const _ as usize } , 196usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( bitmap_top ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . outline as * const
+                _ as usize } , 200usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( outline ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . num_subglyphs as *
+                const _ as usize } , 240usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( num_subglyphs ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . subglyphs as *
+                const _ as usize } , 248usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( subglyphs ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . control_data as *
+                const _ as usize } , 256usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( control_data ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . control_len as *
+                const _ as usize } , 264usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( control_len ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . lsb_delta as *
+                const _ as usize } , 272usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( lsb_delta ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . rsb_delta as *
+                const _ as usize } , 280usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( rsb_delta ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . other as * const _
+                as usize } , 288usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( other ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_GlyphSlotRec_ ) ) . internal as *
+                const _ as usize } , 296usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_GlyphSlotRec_ ) ,
+                "::" , stringify ! ( internal ) ));
+}
+impl Clone for FT_GlyphSlotRec_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_GlyphSlot = *mut FT_GlyphSlotRec_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_CharMapRec_ {
+    pub face: FT_Face,
+    pub encoding: FT_Encoding,
+    pub platform_id: FT_UShort,
+    pub encoding_id: FT_UShort,
+}
+#[test]
+fn bindgen_test_layout_FT_CharMapRec_() {
+    assert_eq!(::std::mem::size_of::<FT_CharMapRec_>() , 16usize , concat ! (
+               "Size of: " , stringify ! ( FT_CharMapRec_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_CharMapRec_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_CharMapRec_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_CharMapRec_ ) ) . face as * const _ as
+                usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_CharMapRec_ ) , "::"
+                , stringify ! ( face ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_CharMapRec_ ) ) . encoding as * const
+                _ as usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_CharMapRec_ ) , "::"
+                , stringify ! ( encoding ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_CharMapRec_ ) ) . platform_id as *
+                const _ as usize } , 12usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_CharMapRec_ ) , "::"
+                , stringify ! ( platform_id ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_CharMapRec_ ) ) . encoding_id as *
+                const _ as usize } , 14usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_CharMapRec_ ) , "::"
+                , stringify ! ( encoding_id ) ));
+}
+impl Clone for FT_CharMapRec_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_CharMap = *mut FT_CharMapRec_;
+pub const FT_Encoding__FT_ENCODING_MS_SJIS: FT_Encoding_ =
+    FT_Encoding_::FT_ENCODING_SJIS;
+pub const FT_Encoding__FT_ENCODING_MS_GB2312: FT_Encoding_ =
+    FT_Encoding_::FT_ENCODING_GB2312;
+pub const FT_Encoding__FT_ENCODING_MS_BIG5: FT_Encoding_ =
+    FT_Encoding_::FT_ENCODING_BIG5;
+pub const FT_Encoding__FT_ENCODING_MS_WANSUNG: FT_Encoding_ =
+    FT_Encoding_::FT_ENCODING_WANSUNG;
+pub const FT_Encoding__FT_ENCODING_MS_JOHAB: FT_Encoding_ =
+    FT_Encoding_::FT_ENCODING_JOHAB;
+#[repr(u32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum FT_Encoding_ {
+    FT_ENCODING_NONE = 0,
+    FT_ENCODING_MS_SYMBOL = 1937337698,
+    FT_ENCODING_UNICODE = 1970170211,
+    FT_ENCODING_SJIS = 1936353651,
+    FT_ENCODING_GB2312 = 1734484000,
+    FT_ENCODING_BIG5 = 1651074869,
+    FT_ENCODING_WANSUNG = 2002873971,
+    FT_ENCODING_JOHAB = 1785686113,
+    FT_ENCODING_ADOBE_STANDARD = 1094995778,
+    FT_ENCODING_ADOBE_EXPERT = 1094992453,
+    FT_ENCODING_ADOBE_CUSTOM = 1094992451,
+    FT_ENCODING_ADOBE_LATIN_1 = 1818326065,
+    FT_ENCODING_OLD_LATIN_2 = 1818326066,
+    FT_ENCODING_APPLE_ROMAN = 1634889070,
+}
+pub use self::FT_Encoding_ as FT_Encoding;
+pub type FT_CharMapRec = FT_CharMapRec_;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct FT_Face_InternalRec_ {
+    _unused: [u8; 0],
+}
+pub type FT_Face_Internal = *mut FT_Face_InternalRec_;
+pub type FT_FaceRec = FT_FaceRec_;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct FT_Size_InternalRec_ {
+    _unused: [u8; 0],
+}
+pub type FT_Size_Internal = *mut FT_Size_InternalRec_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Size_Metrics_ {
+    pub x_ppem: FT_UShort,
+    pub y_ppem: FT_UShort,
+    pub x_scale: FT_Fixed,
+    pub y_scale: FT_Fixed,
+    pub ascender: FT_Pos,
+    pub descender: FT_Pos,
+    pub height: FT_Pos,
+    pub max_advance: FT_Pos,
+}
+#[test]
+fn bindgen_test_layout_FT_Size_Metrics_() {
+    assert_eq!(::std::mem::size_of::<FT_Size_Metrics_>() , 56usize , concat !
+               ( "Size of: " , stringify ! ( FT_Size_Metrics_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Size_Metrics_>() , 8usize , concat !
+                ( "Alignment of " , stringify ! ( FT_Size_Metrics_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Size_Metrics_ ) ) . x_ppem as * const
+                _ as usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Size_Metrics_ ) ,
+                "::" , stringify ! ( x_ppem ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Size_Metrics_ ) ) . y_ppem as * const
+                _ as usize } , 2usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Size_Metrics_ ) ,
+                "::" , stringify ! ( y_ppem ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Size_Metrics_ ) ) . x_scale as * const
+                _ as usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Size_Metrics_ ) ,
+                "::" , stringify ! ( x_scale ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Size_Metrics_ ) ) . y_scale as * const
+                _ as usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Size_Metrics_ ) ,
+                "::" , stringify ! ( y_scale ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Size_Metrics_ ) ) . ascender as *
+                const _ as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Size_Metrics_ ) ,
+                "::" , stringify ! ( ascender ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Size_Metrics_ ) ) . descender as *
+                const _ as usize } , 32usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Size_Metrics_ ) ,
+                "::" , stringify ! ( descender ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Size_Metrics_ ) ) . height as * const
+                _ as usize } , 40usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Size_Metrics_ ) ,
+                "::" , stringify ! ( height ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Size_Metrics_ ) ) . max_advance as *
+                const _ as usize } , 48usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Size_Metrics_ ) ,
+                "::" , stringify ! ( max_advance ) ));
+}
+impl Clone for FT_Size_Metrics_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Size_Metrics = FT_Size_Metrics_;
+pub type FT_SizeRec = FT_SizeRec_;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct FT_SubGlyphRec_ {
+    _unused: [u8; 0],
+}
+pub type FT_SubGlyph = *mut FT_SubGlyphRec_;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct FT_Slot_InternalRec_ {
+    _unused: [u8; 0],
+}
+pub type FT_Slot_Internal = *mut FT_Slot_InternalRec_;
+pub type FT_GlyphSlotRec = FT_GlyphSlotRec_;
+extern "C" {
+    pub fn FT_Init_FreeType(alibrary: *mut FT_Library) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Done_FreeType(library: FT_Library) -> FT_Error;
+}
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Parameter_ {
+    pub tag: FT_ULong,
+    pub data: FT_Pointer,
+}
+#[test]
+fn bindgen_test_layout_FT_Parameter_() {
+    assert_eq!(::std::mem::size_of::<FT_Parameter_>() , 16usize , concat ! (
+               "Size of: " , stringify ! ( FT_Parameter_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Parameter_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_Parameter_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Parameter_ ) ) . tag as * const _ as
+                usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Parameter_ ) , "::"
+                , stringify ! ( tag ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Parameter_ ) ) . data as * const _ as
+                usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Parameter_ ) , "::"
+                , stringify ! ( data ) ));
+}
+impl Clone for FT_Parameter_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Parameter = FT_Parameter_;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Open_Args_ {
+    pub flags: FT_UInt,
+    pub memory_base: *const FT_Byte,
+    pub memory_size: FT_Long,
+    pub pathname: *mut FT_String,
+    pub stream: FT_Stream,
+    pub driver: FT_Module,
+    pub num_params: FT_Int,
+    pub params: *mut FT_Parameter,
+}
+#[test]
+fn bindgen_test_layout_FT_Open_Args_() {
+    assert_eq!(::std::mem::size_of::<FT_Open_Args_>() , 64usize , concat ! (
+               "Size of: " , stringify ! ( FT_Open_Args_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Open_Args_>() , 8usize , concat ! (
+                "Alignment of " , stringify ! ( FT_Open_Args_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Open_Args_ ) ) . flags as * const _ as
+                usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Open_Args_ ) , "::"
+                , stringify ! ( flags ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Open_Args_ ) ) . memory_base as *
+                const _ as usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Open_Args_ ) , "::"
+                , stringify ! ( memory_base ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Open_Args_ ) ) . memory_size as *
+                const _ as usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Open_Args_ ) , "::"
+                , stringify ! ( memory_size ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Open_Args_ ) ) . pathname as * const _
+                as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Open_Args_ ) , "::"
+                , stringify ! ( pathname ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Open_Args_ ) ) . stream as * const _
+                as usize } , 32usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Open_Args_ ) , "::"
+                , stringify ! ( stream ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Open_Args_ ) ) . driver as * const _
+                as usize } , 40usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Open_Args_ ) , "::"
+                , stringify ! ( driver ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Open_Args_ ) ) . num_params as * const
+                _ as usize } , 48usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Open_Args_ ) , "::"
+                , stringify ! ( num_params ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Open_Args_ ) ) . params as * const _
+                as usize } , 56usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Open_Args_ ) , "::"
+                , stringify ! ( params ) ));
+}
+impl Clone for FT_Open_Args_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Open_Args = FT_Open_Args_;
+extern "C" {
+    pub fn FT_New_Face(library: FT_Library,
+                       filepathname: *const ::std::os::raw::c_char,
+                       face_index: FT_Long, aface: *mut FT_Face) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_New_Memory_Face(library: FT_Library, file_base: *const FT_Byte,
+                              file_size: FT_Long, face_index: FT_Long,
+                              aface: *mut FT_Face) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Open_Face(library: FT_Library, args: *const FT_Open_Args,
+                        face_index: FT_Long, aface: *mut FT_Face) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Attach_File(face: FT_Face,
+                          filepathname: *const ::std::os::raw::c_char)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Attach_Stream(face: FT_Face, parameters: *mut FT_Open_Args)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Reference_Face(face: FT_Face) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Done_Face(face: FT_Face) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Select_Size(face: FT_Face, strike_index: FT_Int) -> FT_Error;
+}
+#[repr(u32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum FT_Size_Request_Type_ {
+    FT_SIZE_REQUEST_TYPE_NOMINAL = 0,
+    FT_SIZE_REQUEST_TYPE_REAL_DIM = 1,
+    FT_SIZE_REQUEST_TYPE_BBOX = 2,
+    FT_SIZE_REQUEST_TYPE_CELL = 3,
+    FT_SIZE_REQUEST_TYPE_SCALES = 4,
+    FT_SIZE_REQUEST_TYPE_MAX = 5,
+}
+pub use self::FT_Size_Request_Type_ as FT_Size_Request_Type;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Size_RequestRec_ {
+    pub type_: FT_Size_Request_Type,
+    pub width: FT_Long,
+    pub height: FT_Long,
+    pub horiResolution: FT_UInt,
+    pub vertResolution: FT_UInt,
+}
+#[test]
+fn bindgen_test_layout_FT_Size_RequestRec_() {
+    assert_eq!(::std::mem::size_of::<FT_Size_RequestRec_>() , 32usize , concat
+               ! ( "Size of: " , stringify ! ( FT_Size_RequestRec_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Size_RequestRec_>() , 8usize ,
+                concat ! (
+                "Alignment of " , stringify ! ( FT_Size_RequestRec_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Size_RequestRec_ ) ) . type_ as *
+                const _ as usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Size_RequestRec_ ) ,
+                "::" , stringify ! ( type_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Size_RequestRec_ ) ) . width as *
+                const _ as usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Size_RequestRec_ ) ,
+                "::" , stringify ! ( width ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Size_RequestRec_ ) ) . height as *
+                const _ as usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Size_RequestRec_ ) ,
+                "::" , stringify ! ( height ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Size_RequestRec_ ) ) . horiResolution
+                as * const _ as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Size_RequestRec_ ) ,
+                "::" , stringify ! ( horiResolution ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Size_RequestRec_ ) ) . vertResolution
+                as * const _ as usize } , 28usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Size_RequestRec_ ) ,
+                "::" , stringify ! ( vertResolution ) ));
+}
+impl Clone for FT_Size_RequestRec_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Size_RequestRec = FT_Size_RequestRec_;
+pub type FT_Size_Request = *mut FT_Size_RequestRec_;
+extern "C" {
+    pub fn FT_Request_Size(face: FT_Face, req: FT_Size_Request) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Set_Char_Size(face: FT_Face, char_width: FT_F26Dot6,
+                            char_height: FT_F26Dot6, horz_resolution: FT_UInt,
+                            vert_resolution: FT_UInt) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Set_Pixel_Sizes(face: FT_Face, pixel_width: FT_UInt,
+                              pixel_height: FT_UInt) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Load_Glyph(face: FT_Face, glyph_index: FT_UInt,
+                         load_flags: FT_Int32) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Load_Char(face: FT_Face, char_code: FT_ULong,
+                        load_flags: FT_Int32) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Set_Transform(face: FT_Face, matrix: *mut FT_Matrix,
+                            delta: *mut FT_Vector);
+}
+#[repr(u32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum FT_Render_Mode_ {
+    FT_RENDER_MODE_NORMAL = 0,
+    FT_RENDER_MODE_LIGHT = 1,
+    FT_RENDER_MODE_MONO = 2,
+    FT_RENDER_MODE_LCD = 3,
+    FT_RENDER_MODE_LCD_V = 4,
+    FT_RENDER_MODE_MAX = 5,
+}
+pub use self::FT_Render_Mode_ as FT_Render_Mode;
+extern "C" {
+    pub fn FT_Render_Glyph(slot: FT_GlyphSlot, render_mode: FT_Render_Mode)
+     -> FT_Error;
+}
+#[repr(u32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum FT_Kerning_Mode_ {
+    FT_KERNING_DEFAULT = 0,
+    FT_KERNING_UNFITTED = 1,
+    FT_KERNING_UNSCALED = 2,
+}
+pub use self::FT_Kerning_Mode_ as FT_Kerning_Mode;
+extern "C" {
+    pub fn FT_Get_Kerning(face: FT_Face, left_glyph: FT_UInt,
+                          right_glyph: FT_UInt, kern_mode: FT_UInt,
+                          akerning: *mut FT_Vector) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Get_Track_Kerning(face: FT_Face, point_size: FT_Fixed,
+                                degree: FT_Int, akerning: *mut FT_Fixed)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Get_Glyph_Name(face: FT_Face, glyph_index: FT_UInt,
+                             buffer: FT_Pointer, buffer_max: FT_UInt)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Get_Postscript_Name(face: FT_Face)
+     -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+    pub fn FT_Select_Charmap(face: FT_Face, encoding: FT_Encoding)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Set_Charmap(face: FT_Face, charmap: FT_CharMap) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Get_Charmap_Index(charmap: FT_CharMap) -> FT_Int;
+}
+extern "C" {
+    pub fn FT_Get_Char_Index(face: FT_Face, charcode: FT_ULong) -> FT_UInt;
+}
+extern "C" {
+    pub fn FT_Get_First_Char(face: FT_Face, agindex: *mut FT_UInt)
+     -> FT_ULong;
+}
+extern "C" {
+    pub fn FT_Get_Next_Char(face: FT_Face, char_code: FT_ULong,
+                            agindex: *mut FT_UInt) -> FT_ULong;
+}
+extern "C" {
+    pub fn FT_Get_Name_Index(face: FT_Face, glyph_name: *mut FT_String)
+     -> FT_UInt;
+}
+extern "C" {
+    pub fn FT_Get_SubGlyph_Info(glyph: FT_GlyphSlot, sub_index: FT_UInt,
+                                p_index: *mut FT_Int, p_flags: *mut FT_UInt,
+                                p_arg1: *mut FT_Int, p_arg2: *mut FT_Int,
+                                p_transform: *mut FT_Matrix) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Get_FSType_Flags(face: FT_Face) -> FT_UShort;
+}
+extern "C" {
+    pub fn FT_Face_GetCharVariantIndex(face: FT_Face, charcode: FT_ULong,
+                                       variantSelector: FT_ULong) -> FT_UInt;
+}
+extern "C" {
+    pub fn FT_Face_GetCharVariantIsDefault(face: FT_Face, charcode: FT_ULong,
+                                           variantSelector: FT_ULong)
+     -> FT_Int;
+}
+extern "C" {
+    pub fn FT_Face_GetVariantSelectors(face: FT_Face) -> *mut FT_UInt32;
+}
+extern "C" {
+    pub fn FT_Face_GetVariantsOfChar(face: FT_Face, charcode: FT_ULong)
+     -> *mut FT_UInt32;
+}
+extern "C" {
+    pub fn FT_Face_GetCharsOfVariant(face: FT_Face, variantSelector: FT_ULong)
+     -> *mut FT_UInt32;
+}
+extern "C" {
+    pub fn FT_MulDiv(a: FT_Long, b: FT_Long, c: FT_Long) -> FT_Long;
+}
+extern "C" {
+    pub fn FT_MulFix(a: FT_Long, b: FT_Long) -> FT_Long;
+}
+extern "C" {
+    pub fn FT_DivFix(a: FT_Long, b: FT_Long) -> FT_Long;
+}
+extern "C" {
+    pub fn FT_RoundFix(a: FT_Fixed) -> FT_Fixed;
+}
+extern "C" {
+    pub fn FT_CeilFix(a: FT_Fixed) -> FT_Fixed;
+}
+extern "C" {
+    pub fn FT_FloorFix(a: FT_Fixed) -> FT_Fixed;
+}
+extern "C" {
+    pub fn FT_Vector_Transform(vec: *mut FT_Vector, matrix: *const FT_Matrix);
+}
+extern "C" {
+    pub fn FT_Library_Version(library: FT_Library, amajor: *mut FT_Int,
+                              aminor: *mut FT_Int, apatch: *mut FT_Int);
+}
+extern "C" {
+    pub fn FT_Face_CheckTrueTypePatents(face: FT_Face) -> FT_Bool;
+}
+extern "C" {
+    pub fn FT_Face_SetUnpatentedHinting(face: FT_Face, value: FT_Bool)
+     -> FT_Bool;
+}
+#[repr(u32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum FT_LcdFilter_ {
+    FT_LCD_FILTER_NONE = 0,
+    FT_LCD_FILTER_DEFAULT = 1,
+    FT_LCD_FILTER_LIGHT = 2,
+    FT_LCD_FILTER_LEGACY1 = 3,
+    FT_LCD_FILTER_LEGACY = 16,
+    FT_LCD_FILTER_MAX = 17,
+}
+pub use self::FT_LcdFilter_ as FT_LcdFilter;
+extern "C" {
+    pub fn FT_Library_SetLcdFilter(library: FT_Library, filter: FT_LcdFilter)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Library_SetLcdFilterWeights(library: FT_Library,
+                                          weights:
+                                              *mut ::std::os::raw::c_uchar)
+     -> FT_Error;
+}
+#[repr(u32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum FT_Sfnt_Tag_ {
+    FT_SFNT_HEAD = 0,
+    FT_SFNT_MAXP = 1,
+    FT_SFNT_OS2 = 2,
+    FT_SFNT_HHEA = 3,
+    FT_SFNT_VHEA = 4,
+    FT_SFNT_POST = 5,
+    FT_SFNT_PCLT = 6,
+    FT_SFNT_MAX = 7,
+}
+pub use self::FT_Sfnt_Tag_ as FT_Sfnt_Tag;
+extern "C" {
+    pub fn FT_Get_Sfnt_Table(face: FT_Face, tag: FT_Sfnt_Tag)
+     -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+    pub fn FT_Load_Sfnt_Table(face: FT_Face, tag: FT_ULong, offset: FT_Long,
+                              buffer: *mut FT_Byte, length: *mut FT_ULong)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Sfnt_Table_Info(face: FT_Face, table_index: FT_UInt,
+                              tag: *mut FT_ULong, length: *mut FT_ULong)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Get_CMap_Language_ID(charmap: FT_CharMap) -> FT_ULong;
+}
+extern "C" {
+    pub fn FT_Get_CMap_Format(charmap: FT_CharMap) -> FT_Long;
+}
+pub type FT_Module_Interface = FT_Pointer;
+pub type FT_Module_Constructor =
+    ::std::option::Option<unsafe extern "C" fn(module: FT_Module)
+                              -> FT_Error>;
+pub type FT_Module_Destructor =
+    ::std::option::Option<unsafe extern "C" fn(module: FT_Module)>;
+pub type FT_Module_Requester =
+    ::std::option::Option<unsafe extern "C" fn(module: FT_Module,
+                                               name:
+                                                   *const ::std::os::raw::c_char)
+                              -> FT_Module_Interface>;
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct FT_Module_Class_ {
+    pub module_flags: FT_ULong,
+    pub module_size: FT_Long,
+    pub module_name: *const FT_String,
+    pub module_version: FT_Fixed,
+    pub module_requires: FT_Fixed,
+    pub module_interface: *const ::std::os::raw::c_void,
+    pub module_init: FT_Module_Constructor,
+    pub module_done: FT_Module_Destructor,
+    pub get_interface: FT_Module_Requester,
+}
+#[test]
+fn bindgen_test_layout_FT_Module_Class_() {
+    assert_eq!(::std::mem::size_of::<FT_Module_Class_>() , 72usize , concat !
+               ( "Size of: " , stringify ! ( FT_Module_Class_ ) ));
+    assert_eq! (::std::mem::align_of::<FT_Module_Class_>() , 8usize , concat !
+                ( "Alignment of " , stringify ! ( FT_Module_Class_ ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Module_Class_ ) ) . module_flags as *
+                const _ as usize } , 0usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Module_Class_ ) ,
+                "::" , stringify ! ( module_flags ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Module_Class_ ) ) . module_size as *
+                const _ as usize } , 8usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Module_Class_ ) ,
+                "::" , stringify ! ( module_size ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Module_Class_ ) ) . module_name as *
+                const _ as usize } , 16usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Module_Class_ ) ,
+                "::" , stringify ! ( module_name ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Module_Class_ ) ) . module_version as
+                * const _ as usize } , 24usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Module_Class_ ) ,
+                "::" , stringify ! ( module_version ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Module_Class_ ) ) . module_requires as
+                * const _ as usize } , 32usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Module_Class_ ) ,
+                "::" , stringify ! ( module_requires ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Module_Class_ ) ) . module_interface
+                as * const _ as usize } , 40usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Module_Class_ ) ,
+                "::" , stringify ! ( module_interface ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Module_Class_ ) ) . module_init as *
+                const _ as usize } , 48usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Module_Class_ ) ,
+                "::" , stringify ! ( module_init ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Module_Class_ ) ) . module_done as *
+                const _ as usize } , 56usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Module_Class_ ) ,
+                "::" , stringify ! ( module_done ) ));
+    assert_eq! (unsafe {
+                & ( * ( 0 as * const FT_Module_Class_ ) ) . get_interface as *
+                const _ as usize } , 64usize , concat ! (
+                "Alignment of field: " , stringify ! ( FT_Module_Class_ ) ,
+                "::" , stringify ! ( get_interface ) ));
+}
+impl Clone for FT_Module_Class_ {
+    fn clone(&self) -> Self { *self }
+}
+pub type FT_Module_Class = FT_Module_Class_;
+extern "C" {
+    pub fn FT_Add_Module(library: FT_Library, clazz: *const FT_Module_Class)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Get_Module(library: FT_Library,
+                         module_name: *const ::std::os::raw::c_char)
+     -> FT_Module;
+}
+extern "C" {
+    pub fn FT_Remove_Module(library: FT_Library, module: FT_Module)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Property_Set(library: FT_Library, module_name: *const FT_String,
+                           property_name: *const FT_String,
+                           value: *const ::std::os::raw::c_void) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Property_Get(library: FT_Library, module_name: *const FT_String,
+                           property_name: *const FT_String,
+                           value: *mut ::std::os::raw::c_void) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Reference_Library(library: FT_Library) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_New_Library(memory: FT_Memory, alibrary: *mut FT_Library)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Done_Library(library: FT_Library) -> FT_Error;
+}
+pub type FT_DebugHook_Func =
+    ::std::option::Option<unsafe extern "C" fn(arg:
+                                                   *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub fn FT_Set_Debug_Hook(library: FT_Library, hook_index: FT_UInt,
+                             debug_hook: FT_DebugHook_Func);
+}
+extern "C" {
+    pub fn FT_Add_Default_Modules(library: FT_Library);
+}
+#[repr(u32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum FT_TrueTypeEngineType_ {
+    FT_TRUETYPE_ENGINE_TYPE_NONE = 0,
+    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED = 1,
+    FT_TRUETYPE_ENGINE_TYPE_PATENTED = 2,
+}
+pub use self::FT_TrueTypeEngineType_ as FT_TrueTypeEngineType;
+extern "C" {
+    pub fn FT_Get_TrueType_Engine_Type(library: FT_Library)
+     -> FT_TrueTypeEngineType;
+}
+extern "C" {
+    pub fn FT_Outline_Decompose(outline: *mut FT_Outline,
+                                func_interface: *const FT_Outline_Funcs,
+                                user: *mut ::std::os::raw::c_void)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Outline_New(library: FT_Library, numPoints: FT_UInt,
+                          numContours: FT_Int, anoutline: *mut FT_Outline)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Outline_New_Internal(memory: FT_Memory, numPoints: FT_UInt,
+                                   numContours: FT_Int,
+                                   anoutline: *mut FT_Outline) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Outline_Done(library: FT_Library, outline: *mut FT_Outline)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Outline_Done_Internal(memory: FT_Memory,
+                                    outline: *mut FT_Outline) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Outline_Check(outline: *mut FT_Outline) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Outline_Get_CBox(outline: *const FT_Outline,
+                               acbox: *mut FT_BBox);
+}
+extern "C" {
+    pub fn FT_Outline_Translate(outline: *const FT_Outline, xOffset: FT_Pos,
+                                yOffset: FT_Pos);
+}
+extern "C" {
+    pub fn FT_Outline_Copy(source: *const FT_Outline, target: *mut FT_Outline)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Outline_Transform(outline: *const FT_Outline,
+                                matrix: *const FT_Matrix);
+}
+extern "C" {
+    pub fn FT_Outline_Embolden(outline: *mut FT_Outline, strength: FT_Pos)
+     -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Outline_EmboldenXY(outline: *mut FT_Outline, xstrength: FT_Pos,
+                                 ystrength: FT_Pos) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Outline_Reverse(outline: *mut FT_Outline);
+}
+extern "C" {
+    pub fn FT_Outline_Get_Bitmap(library: FT_Library,
+                                 outline: *mut FT_Outline,
+                                 abitmap: *const FT_Bitmap) -> FT_Error;
+}
+extern "C" {
+    pub fn FT_Outline_Render(library: FT_Library, outline: *mut FT_Outline,
+                             params: *mut FT_Raster_Params) -> FT_Error;
+}
+pub const FT_Orientation__FT_ORIENTATION_FILL_RIGHT: FT_Orientation_ =
+    FT_Orientation_::FT_ORIENTATION_TRUETYPE;
+pub const FT_Orientation__FT_ORIENTATION_FILL_LEFT: FT_Orientation_ =
+    FT_Orientation_::FT_ORIENTATION_POSTSCRIPT;
+#[repr(u32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum FT_Orientation_ {
+    FT_ORIENTATION_TRUETYPE = 0,
+    FT_ORIENTATION_POSTSCRIPT = 1,
+    FT_ORIENTATION_NONE = 2,
+}
+pub use self::FT_Orientation_ as FT_Orientation;
+extern "C" {
+    pub fn FT_Outline_Get_Orientation(outline: *mut FT_Outline)
+     -> FT_Orientation;
+}
diff --git a/third_party/rust_crates/vendor/freetype/src/lib.rs b/third_party/rust_crates/vendor/freetype/src/lib.rs
new file mode 100644
index 0000000..e2356a9
--- /dev/null
+++ b/third_party/rust_crates/vendor/freetype/src/lib.rs
@@ -0,0 +1,32 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![crate_name = "freetype"]
+#![crate_type = "lib"]
+#![crate_type = "dylib"]
+#![crate_type = "rlib"]
+
+#![allow(non_snake_case)]
+#![allow(non_camel_case_types)]
+#![allow(non_upper_case_globals)]
+
+#[cfg(feature = "servo-freetype-sys")]
+extern crate freetype_sys;
+extern crate libc;
+
+pub type FT_Error = ::std::os::raw::c_int;
+
+#[inline]
+pub fn succeeded(error: FT_Error) -> bool {
+    error == freetype::FT_Err_Ok as FT_Error
+}
+
+#[allow(improper_ctypes)] // https://github.com/rust-lang/rust/issues/34798
+pub mod freetype;
+pub mod tt_os2;
diff --git a/third_party/rust_crates/vendor/freetype/src/tt_os2.rs b/third_party/rust_crates/vendor/freetype/src/tt_os2.rs
new file mode 100644
index 0000000..22784f9
--- /dev/null
+++ b/third_party/rust_crates/vendor/freetype/src/tt_os2.rs
@@ -0,0 +1,61 @@
+// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use freetype::{FT_Char, FT_UShort, FT_Short, FT_ULong, FT_Byte};
+
+#[repr(C)]
+pub struct TT_OS2 {
+    pub version: FT_UShort,
+    pub xAvgCharWidth: FT_Short,
+    pub usWeightClass: FT_UShort,
+    pub usWidthClass: FT_UShort,
+    pub fsType: FT_Short,
+    pub ySubscriptXSize: FT_Short,
+    pub ySubscriptYSize: FT_Short,
+    pub ySubscriptXOffset: FT_Short,
+    pub ySubscriptYOffset: FT_Short,
+    pub ySuperscriptXSize: FT_Short,
+    pub ySuperscriptYSize: FT_Short,
+    pub ySuperscriptXOffset: FT_Short,
+    pub ySuperscriptYOffset: FT_Short,
+    pub yStrikeoutSize: FT_Short,
+    pub yStrikeoutPosition: FT_Short,
+    pub sFamilyClass: FT_Short,
+
+    pub panose: [FT_Byte; 10],
+
+    pub ulUnicodeRange1: FT_ULong, /* Bits 0-31   */
+    pub ulUnicodeRange2: FT_ULong, /* Bits 32-63  */
+    pub ulUnicodeRange3: FT_ULong, /* Bits 64-95  */
+    pub ulUnicodeRange4: FT_ULong, /* Bits 96-127 */
+
+    pub achVendID: [FT_Char; 4],
+
+    pub fsSelection: FT_UShort,
+    pub usFirstCharIndex: FT_UShort,
+    pub usLastCharIndex: FT_UShort,
+    pub sTypoAscender: FT_Short,
+    pub sTypoDescender: FT_Short,
+    pub sTypoLineGap: FT_Short,
+    pub usWinAscent: FT_UShort,
+    pub usWinDescent: FT_UShort,
+
+    /* only version 1 tables */
+
+    pub ulCodePageRange1: FT_ULong, /* Bits 0-31  */
+    pub ulCodePageRange2: FT_ULong, /* Bits 32-63 */
+
+    /* only version 2 tables */
+
+    pub sxHeight: FT_Short,
+    pub sCapHeight: FT_Short,
+    pub usDefaultChar: FT_UShort,
+    pub usBreakChar: FT_UShort,
+    pub usMaxContext: FT_UShort,
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/.cargo-checksum.json b/third_party/rust_crates/vendor/harfbuzz-sys/.cargo-checksum.json
new file mode 100644
index 0000000..8facca1
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"Cargo.toml":"5a95f65fb0d321fde3c730c8e837bbe576bf9c0d2ce76c7364274400ced22a67","build.rs":"3d5f5c9a26e5097b8e4f29b5ca52363ee447e65fe52dccf73ffc20c322044f13","harfbuzz/AUTHORS":"30824946b0da50ba2514a0f8a5ac03c0f2d008e9d1724f47b71fba92962f04d7","harfbuzz/BUILD.md":"a67644b145c923bb23eb6b1b7739f0ebca12e1d1542b21706afc27f4ea27c5c5","harfbuzz/CMakeLists.txt":"68682c477cfb9b8c40d2c859b7171abeeb3f17694734976ec096ea9b0adce0ef","harfbuzz/COPYING":"2a886915de4f296cdae5ed67064f86dba01d0c55286d86e8487f2a5caaf40216","harfbuzz/ChangeLog":"e088135cf3a1880ad8f8bf29e5217038b5797a1cea1bb9190fb8f7a2b5ef1dd3","harfbuzz/INSTALL":"54be5efe708bd5a7b433ab227130c5548221151698d17eb7eb142f640cf291ec","harfbuzz/Makefile.am":"e802a06c99705219b5cf31957554ef6cd646627ba2f1b5d7f5f76fe440e968e9","harfbuzz/Makefile.in":"5d31637f9a055556b1f39d556db9be257ff8328b8fcd94ac924fc5aa363d2606","harfbuzz/NEWS":"6f21649373f8b6bcaa9a4dac9945ef2b6f5cb3556053726bd61d594ed1ff2c5f","harfbuzz/README":"557461d6bc7354e9f56e9f96c6baffeb639c79c75eab64f61c99df26e5ffe353","harfbuzz/README.python.md":"49535859d89f5efb5951deb7a97b47e9871585b63b4932018d9a1b94e33cdce5","harfbuzz/README.wine.md":"d82034ec1f09aea14a722028ed26b4cf188ea9ee2d8c6a381cb11d49b5217a73","harfbuzz/RELEASING.md":"a6a30a699fa552800adf23d313e25931437d5db3ece438ad65aa608f33ee3b57","harfbuzz/THANKS":"8a63d9306ff46ac3729d6b1396ef12901c81176008af4b839f09dae9acf2cd36","harfbuzz/TODO":"9e4fdd1faeadf61b5bd11e7d81544bcaf0423ba8f90aad2919fa1babfaa30972","harfbuzz/aclocal.m4":"a9952468733cf0880c80ba3504df108f7de619a7b5e5936fac21958ec676f3b5","harfbuzz/ar-lib":"534c7f463f702faddd50389afcbbe2615abbd436ccdfb6c2c62e148e015c9088","harfbuzz/autogen.sh":"e899624995f4dd7483e4b29a5220410d7b5925b8650d8825c14c3fdad52db709","harfbuzz/compile":"41856428226c049fa0ea4ca7a574c28416de2769b55ed7feea4ab5e60283af16","harfbuzz/config.guess":"692c20041a7231cfa08b91bae80492b13ec7508446670b098e20de084173e2b3","harfbuzz/config.h.in":"024385d9ef8051536946af826cb4367338e974ff9c24b13e27b3ce7ead3d4a52","harfbuzz/config.sub":"a248fcef6923f1cab4525f8138dd717833468d25ba69a5bdbfbd6456b7f44150","harfbuzz/configure":"9ec80efa907a38d163211c1f22ca888edf7613c6d9d7f36f238ac347af60202a","harfbuzz/configure.ac":"2ba73bcaed6d4ee5a9fa91dd965989368f3b7660ee1089d1a990e5eedeb1d573","harfbuzz/depcomp":"534cc0f4c4bfc8f2c5a674741e46abfcc033776a011c3d5bc48cad7d0394ef91","harfbuzz/docs/HarfBuzz.png":"0b9327a0960a301ebe2e9ad87ec9e7e7222915ab99c6071a5d06e18160f2b907","harfbuzz/docs/HarfBuzz.svg":"736b7522ae5aaaeb6ee5e5f571bd582dea55b6f5add892ef2edf8e58b8f892bc","harfbuzz/docs/Makefile.am":"501d3cce7a5025c3e5079b97d58674f5d1bbfaa891d32ac6fee463e64d060e31","harfbuzz/docs/Makefile.in":"6412775f9d75ea7ea636b1500dce6a37e225a3b40bea07df66805fd5843a2196","harfbuzz/docs/harfbuzz-docs.xml":"bcbb59deb8cc6a85015f944c68800fef71c5f77c7c3a8caa47b905bb7fa87985","harfbuzz/docs/harfbuzz-overrides.txt":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","harfbuzz/docs/harfbuzz-sections.txt":"ae5fa5ff910caa945eda0370129ff7529ed714d662b0e8ef5f228b8d734afd1d","harfbuzz/docs/harfbuzz.types":"6e627db8c8d9181eb747f479fee6b274d98eb239ce1613b4871bec24c0abe600","harfbuzz/docs/html/HarfBuzz.png":"0b9327a0960a301ebe2e9ad87ec9e7e7222915ab99c6071a5d06e18160f2b907","harfbuzz/docs/html/HarfBuzz.svg":"736b7522ae5aaaeb6ee5e5f571bd582dea55b6f5add892ef2edf8e58b8f892bc","harfbuzz/docs/html/a-clustering-example-for-levels-0-and-1.html":"0cc7eea1d9d3c6525c01a2e99d5c6d87b0572a2350d54dba11fc05aa3d2bd99d","harfbuzz/docs/html/aat-shaping.html":"3853018cfca401e475562295b1f34e5c063376f43f46b5d1c4adc1b6921df87b","harfbuzz/docs/html/adding-text-to-the-buffer.html":"2f787d5b6d645dd4e9e728583eb3a23737656e82417107e81bf5ddde0d38541c","harfbuzz/docs/html/annotation-glossary.html":"e1b5f8d13ac688c1dc3ad454de7bd8a99f521b7cc5a86de837f2a5ce2e072c5d","harfbuzz/docs/html/api-index-0-9-10.html":"ef3d613fdc7b79fb29bfb3584e105cc7abfac35d770b3ce14d0b5bbe4ecf7d6f","harfbuzz/docs/html/api-index-0-9-11.html":"e67a4225a59e0dd68aedb2cd17ffbad97bc56046e4040e548faeb502b8a03414","harfbuzz/docs/html/api-index-0-9-2.html":"b7a2e3fa07f9221db2b71a08f1d95346a0680639feed7d2cde7805f3fc8b2fac","harfbuzz/docs/html/api-index-0-9-20.html":"83bcb377a8a55cd41af3d137f6757a1ba1508c0cd5015ffd46ca26f91ff9ec68","harfbuzz/docs/html/api-index-0-9-22.html":"c3137bfdd888e10b7c3550e72fd66547adee78eda4f98ae0f95fad742214d86b","harfbuzz/docs/html/api-index-0-9-28.html":"57b599c5054fb480c1f6db2748ed478de8e9a92e747de78ce61b753b4524136c","harfbuzz/docs/html/api-index-0-9-30.html":"0b6b4d5514a397c579192a1054040fd65d35a849145883d78a2d38ceb4962b62","harfbuzz/docs/html/api-index-0-9-31.html":"651f5142a7dfc369f8e85aca5d271ec479ab8a689383fe484c4a79b3ee57a0d7","harfbuzz/docs/html/api-index-0-9-38.html":"0bbbdaf715af6a905cdacfb936f6760d28a05f879cffd6955d0f5480f6dcf4d7","harfbuzz/docs/html/api-index-0-9-39.html":"643e97025ccf40c76cd1897b30abd8e2abfe4fad209e65bfdd23b0b5caefe5d2","harfbuzz/docs/html/api-index-0-9-41.html":"2743a425f06474567c99aac667314048dff8a597e8053fba90c467112dc16083","harfbuzz/docs/html/api-index-0-9-42.html":"079c773d4210d4100e0c53690aa54392ab9ad9787b025bae4abeaf990c80b512","harfbuzz/docs/html/api-index-0-9-5.html":"19eb6f3be50ee0deaf9fb8f89f81db0e671440cf268b3c4441d4be517a7d2f60","harfbuzz/docs/html/api-index-0-9-7.html":"d2803fd4d9071a3561dd7a32e1fbb22897ecaa2c4a43c9a734a642f383a3a057","harfbuzz/docs/html/api-index-0-9-8.html":"6725583993ef5e7411e93053d807aec6b6f353087adb64a6482cd45694259281","harfbuzz/docs/html/api-index-1-0-5.html":"52c02d044b389777947a472a949a522db792af01750ad350d654d61649ec928e","harfbuzz/docs/html/api-index-1-1-2.html":"860caa66ec140219f6ef20a7f119b3a61035868dee7cacffb0ef0f21c040641a","harfbuzz/docs/html/api-index-1-1-3.html":"4fc96c6988afdffe16185a9bdf71b5800c62cf468dde2674c270f3956ff1b082","harfbuzz/docs/html/api-index-1-2-3.html":"a9ff4c1e3eedd797706ba2176938204760495082ff504af87a8133c02bcc8ce0","harfbuzz/docs/html/api-index-1-3-3.html":"622fccf2101f697e3ff4f9eec7e31c2e4bb151833de3df5d1637c35698c0233c","harfbuzz/docs/html/api-index-1-4-0.html":"469496165eb3e020ee69e5b00c38b61a6b6aa783b229f57ce9731f0b0202e4d0","harfbuzz/docs/html/api-index-1-4-2.html":"6b8131f1b0815a6040df2e05209af11ea540e3bc8152c7d70c531a72ffbc6328","harfbuzz/docs/html/api-index-1-4-3.html":"e6bb650900d4f9db157fd716cd8fb6527171c4a62064e52a01310e7cdf55527e","harfbuzz/docs/html/api-index-1-5-0.html":"f5616bc3fbd956329c7d6d5636787f30722a7bc4374aecb3569f5999ddb61b01","harfbuzz/docs/html/api-index-1-6-0.html":"2830e6d716702e677641854398b3f97119c1ea25b542b6b177c1df143e675d3e","harfbuzz/docs/html/api-index-1-7-5.html":"378fd9e7fe3996dd540034f49d36a2078bfd5f42b43a5963aff90d97b32efdbb","harfbuzz/docs/html/api-index-1-7-7.html":"970ebba422d51d9d9bc1b5cdcc86947743288b77fc3b64bea9c92af940ec9c68","harfbuzz/docs/html/api-index-1-8-0.html":"e038d7d69cfa5a10e8a18942c0907a5d8a809d4fcfc834d1dd9a00e2e3d0bf07","harfbuzz/docs/html/api-index-1-8-1.html":"f4dd36085e9ebadf51a78a796f9f4fdf98d3bbed562e289a7095e6a582a24a6e","harfbuzz/docs/html/api-index-1-8-5.html":"73218ed5cc63c79ebc49467595e5701f3981e50fee8c6056affc646fedacec9b","harfbuzz/docs/html/api-index-1-8-6.html":"ebba4be0d35ec3cb98fe7d6bd4f701dcfaa2a7e3374745cd8e635d4746fccfba","harfbuzz/docs/html/api-index-1-9-0.html":"22f60d1894a2cb6742456ac91d2507045171e63074f2c816ff5d3e2ee0ba80f7","harfbuzz/docs/html/api-index-2-0-0.html":"67f08bdb0c6bbdad1a00fb54b8edf80bc479eb739ea323cbfe8dfe135415e6fe","harfbuzz/docs/html/api-index-2-1-0.html":"06ba2fc378ad1a6a5c43b5052f69b9da278748acaffc69df993d0bf7b67021c3","harfbuzz/docs/html/api-index-full.html":"4b0222fb26fa5ca7cbd0a36ab9c37e099cd47961e9f0789fbaf20de52f9da6da","harfbuzz/docs/html/buffers-language-script-and-direction.html":"51735f4037ac1bf876a38a1df1ce373b7b2b9f039de8fffc6640ea8c89a8f960","harfbuzz/docs/html/building.html":"4ec6de6efa5db865d75346ce4d7e867fa0f1a5ef85a691879bfafdb70511aefe","harfbuzz/docs/html/ch01s03.html":"73ac7a940b423b62c2b744ade57843065244717d4f17ea3e11d16ec44f619960","harfbuzz/docs/html/ch03s02.html":"693fde654ed19a8e665e3e9272259dd76805c456f1657ff088a8f75979f5fc23","harfbuzz/docs/html/ch03s03.html":"795f24afcd4089109ff8108240c165b7113baabf7ed54c2cb4553bc656b36e17","harfbuzz/docs/html/ch09.html":"4c14152afe121bb487b9b7b340cf96d2de830194b54f9e2d8912e9d75ad7eda6","harfbuzz/docs/html/ch10.html":"9b7352477f905e16ca74c6d69aff296b46b24b8eafd782c99b32eb2c8bb59383","harfbuzz/docs/html/ch11.html":"f54b75c854ac3862e080f07459db082225d2cbf92af7233be33c009ce78af04c","harfbuzz/docs/html/ch12.html":"25cf57c09497e4cfe82f5fbc4a811058c03aa1bbb76beb5753a9b8e0353ecfbd","harfbuzz/docs/html/clusters.html":"af0c5d94aed9d01920cad164b31124170f69976db66741eeb472ae4011016f3a","harfbuzz/docs/html/complex-scripts.html":"b734484295268750db701edd9ed00a308f578d3b650bbabcc4793f56f11bb0f0","harfbuzz/docs/html/customizing-unicode-functions.html":"6a17920ee0c82d0ed494331fd871423f3bb82f3bcf256c54c33531f5fc4092c1","harfbuzz/docs/html/deprecated-api-index.html":"0c51378a134eaaead53255440da7c1fb0f85aea2ca4a735fb75d93112161a6c8","harfbuzz/docs/html/fonts-and-faces.html":"4bd47b2574b2ec1e46b8e8db81ba11fbc5d5fc04dd309f1afdc9b255cf52aa9e","harfbuzz/docs/html/getting-started.html":"11c952059eabf28beff6a07f95d7c4fcccd6a79f518e04599ade2a65af61d73b","harfbuzz/docs/html/graphite-shaping.html":"aaa2a995d3cd7f87e8966313375072f938a7d698773d066d19566da16a41e7c6","harfbuzz/docs/html/harfbuzz-hb-aat-layout.html":"0446cb57435f21f7338205b03ab1a5f7ac918013780598ecf84a0e7bd9ba1d35","harfbuzz/docs/html/harfbuzz-hb-blob.html":"ff72ea110e647bb4909fe13f43c4850e2dc08d3037b3aad62ee071c8489e95d8","harfbuzz/docs/html/harfbuzz-hb-buffer.html":"d6f3441516aaeab0ee7e198e73c73937e997ec2fd054ae68657b433a1c8cb9d9","harfbuzz/docs/html/harfbuzz-hb-common.html":"5f301c0cc1090e15687d094c241f498fce5e34f2399ef45bf95b2ee90806297f","harfbuzz/docs/html/harfbuzz-hb-coretext.html":"5eab6ba4a5068b7c5a13df1d656874f274f9beeb4afacff9af67adf148a9a00a","harfbuzz/docs/html/harfbuzz-hb-deprecated.html":"389e62c9b166b4c571484ff430c858b7cae22e1af273625a08d15e8741d212a3","harfbuzz/docs/html/harfbuzz-hb-face.html":"9675546feb4257e05d1d198bdf3cca97f2366456fff77bcf60dab9958f88053b","harfbuzz/docs/html/harfbuzz-hb-font.html":"4e5a52a141d5717b00db1c7f336f4d6f37133a16c34d88765db3c0e6d1d90670","harfbuzz/docs/html/harfbuzz-hb-ft.html":"e89b0e9f3b27ec8ebf3428d53fa61d564ed1c79a4eac636f6f08a576f4f5623d","harfbuzz/docs/html/harfbuzz-hb-glib.html":"4d5d31155b7b017251620464ad2c2f8f4bc6e219b2ae996426511cbcc10ebaa7","harfbuzz/docs/html/harfbuzz-hb-gobject.html":"f9fe2e791ced536f5869750b2ab4ac727a1b5f365be5649d3685d3acb3262a3e","harfbuzz/docs/html/harfbuzz-hb-graphite2.html":"1ba88839edb37c4a0c02db6d15da5f3493bdaf72e06d71b834393477aee83f5a","harfbuzz/docs/html/harfbuzz-hb-icu.html":"2fbd669459741a33b6a4efcce1e298cc7797645d188149a4ebbc781395e70566","harfbuzz/docs/html/harfbuzz-hb-map.html":"9dc3d0e8d4ffbcae9a347b1b435a0dda21fe8f4de4dea4a36fd3ed20060092af","harfbuzz/docs/html/harfbuzz-hb-ot-color.html":"96409b88a9877a7197087d27ac8f853522b5734f43a65bbe555e708410723aae","harfbuzz/docs/html/harfbuzz-hb-ot-font.html":"1bf4732221e2d41c4a125e4133f0cc294c3c7ac8582f74a6c24ee7d1bc101212","harfbuzz/docs/html/harfbuzz-hb-ot-layout.html":"8b2017bc511f0243e729dffe0f2f32a885e86c3a2b91ffd17cd31177a8fee7d1","harfbuzz/docs/html/harfbuzz-hb-ot-math.html":"b626ba601ede0533b7127cb0082a1f53ae1dcccaef0b14ebb1f17fa73a84305e","harfbuzz/docs/html/harfbuzz-hb-ot-name.html":"de59771c0b16f45957e7f1e053bb0741bd81c11cf1c51900fa3f498fc742bec1","harfbuzz/docs/html/harfbuzz-hb-ot-shape.html":"fc201c643ef69ab9f73dd850c44e2d5cc8a32f9badb193091af35b0df02e93a6","harfbuzz/docs/html/harfbuzz-hb-ot-var.html":"f777067cf451e813d36ac5bf76f91a8cc7857decfc6c98894eefcf24883efe36","harfbuzz/docs/html/harfbuzz-hb-set.html":"1d08fb864e7cd29cf475ce6c4516eaaf41967c0d37c809092e9aacc4af875876","harfbuzz/docs/html/harfbuzz-hb-shape-plan.html":"6a7ddc6a0a7bea585c9feba91145fdbe510239f8b45f11c97900b4d46ab5bd60","harfbuzz/docs/html/harfbuzz-hb-shape.html":"523679329a4e5e54cd1758eec3056bb7571568c9a315f42cf165251ab27fbad3","harfbuzz/docs/html/harfbuzz-hb-unicode.html":"6e88f6a24dc7d6d60a16287d0a41b16c22036daee884029a4dcbbdebbdde48af","harfbuzz/docs/html/harfbuzz-hb-uniscribe.html":"0b67bf9e52b89a38e770d21415ee03bd850da0c0da7c9a10412c6c9a1f8b6461","harfbuzz/docs/html/harfbuzz-hb-version.html":"a2a754b7416fa67a797ac5747b143255420dad16adcafcfdd48d68e01c2c20ff","harfbuzz/docs/html/harfbuzz.devhelp2":"7db3a49d63784175d62dbb0e2b824e1f14cfcaa39288d3e888bccfb239b25283","harfbuzz/docs/html/home.png":"8fce96f002a3f3775fa00d61df88301f00aa6fc338e554eb80717edcc49a02bc","harfbuzz/docs/html/index.html":"06ae0351494af87f1e90a259ec6cdd2fdb49c1ad27a7e39fbc00e89ceb3cd8c9","harfbuzz/docs/html/install-harfbuzz.html":"1333638c3c59a86343079065752bd7a20f9f4ba8bf00b17b09f55766ecce8f98","harfbuzz/docs/html/left-insensitive.png":"c0ab08368fb7fc3ac87de8cbe239ae4cdc774bcf64bf259951ec57b8fe03e199","harfbuzz/docs/html/left.png":"b53df0513c8ed45dad3c32b3e22eee64863977dba6949c639acd98bf19d5766a","harfbuzz/docs/html/level-2.html":"b95aaf2d51a7428294c8b4822716c3315c80bdbfa6890cb36b289d7b1f2d8c14","harfbuzz/docs/html/opentype-shaping-models.html":"a1282c6d19fcc835f3950e76e4b15eb777b3a9784e9fe072ee2bb0cabd089a6c","harfbuzz/docs/html/plans-and-caching.html":"5436a264dfe360f73bfbc17d0c914a6ee3704f011ee279b2bd2a5b00aafebbae","harfbuzz/docs/html/pt01.html":"675794eb70ba1289d203af852fc08e981ac6cdf82f756c07d34c9c388b2f6a52","harfbuzz/docs/html/pt02.html":"0218ff3c3615200cb1470df84a99bc957da0acadf0874ecdaeef705a3e4d660e","harfbuzz/docs/html/reordering-in-levels-0-and-1.html":"e61b0b6d112650be9d7cd53c7347d3a277ae444e1778135da8b7e6df8d8e2bae","harfbuzz/docs/html/right-insensitive.png":"d3668b2371a077cc6502e8315a5bd0e3f202b386cda11ab05f0d7f759835476c","harfbuzz/docs/html/right.png":"fe132576a0fcf49f758fac05b87eed3ee934bad71a0289d10470563b480f0a55","harfbuzz/docs/html/setting-buffer-properties.html":"0b90e77919e8311d969ff4b17c7e6b0d2467d1240f4776625f21cdc49a29a3ef","harfbuzz/docs/html/shaping-and-shape-plans.html":"d72895a698964006d4089ae109355010e8cd7bf3189dc35a0a230e02a60e224e","harfbuzz/docs/html/shaping-concepts.html":"24b4073eafada2ce0f7db685ddea9f4e0bcbad59fdc5b16cedccdb65d16b31f3","harfbuzz/docs/html/shaping-operations.html":"a844a05532ee0401b42ded00c325e14bbd8e7fd5d48bc82097f8377394aa8884","harfbuzz/docs/html/style.css":"852c77f7f01fe8d2828a4878390416a8e7c7359f8edefaf881b05cd516a88007","harfbuzz/docs/html/text-runs.html":"66f27eeb75c8588f31ed4a9bf7e2f82bc04b36f7744431f331529645066d31d4","harfbuzz/docs/html/the-distinction-between-levels-0-and-1.html":"04f83e3e6816fed5e9d389950fe666ae447a0550404e5f556de02c1d726dc883","harfbuzz/docs/html/unicode-character-categories.html":"ab2c567174cde50c85b4d15bb1e6cf03266fb4cfb98aadbf86e8d8b165dd55db","harfbuzz/docs/html/up-insensitive.png":"565f5906491db8d5b66a82dd572a24a035816bba6284e568becf96c43b4811d2","harfbuzz/docs/html/up.png":"b90297387d900c5cea6f34c5b5a54aa5d21eb4781bf3c7ae8a1f4f13f90ff051","harfbuzz/docs/html/using-harfbuzzs-native-opentype-implementation.html":"2b7eb9d150e7840a403b6d0489a860a530dd0719e9b16ea1ae1a71068848dcdc","harfbuzz/docs/html/using-your-own-font-functions.html":"77000361c11c77e0991b2787bc84eb98e131a9c33140ea65e6323fb677e012bd","harfbuzz/docs/html/what-about-the-other-scripts.html":"d2e8c5240525d64e07c2412204b9676e7ec7ecd9abdda4deba57f1dfd1fd42bb","harfbuzz/docs/html/what-harfbuzz-doesnt-do.html":"dd430ec9e57ff2ab1e0045dfe49e8b6521dcd8af9c6d675a13c57b5d1f6cd0b6","harfbuzz/docs/html/what-is-harfbuzz.html":"2bc3f91ad8593f020c8a3a1a5f9afd0a1c416c443d7f2ac801e52c9c053a66e1","harfbuzz/docs/html/why-do-i-need-a-shaping-engine.html":"197048621ebda3cb1da32173feb3f0fe652fc334237f2c850d3ba8d0d7b40131","harfbuzz/docs/html/why-is-it-called-harfbuzz.html":"8159bee99fb94ca96fc5fa20e6b81250b8f2513e1c4b2642eaaebe47f57193ae","harfbuzz/docs/html/working-with-harfbuzz-clusters.html":"2af0d443a6163046eb3997ed555a5568e1dbfca152207827559ccee3a44b67df","harfbuzz/docs/usermanual-buffers-language-script-and-direction.xml":"b2b06c98acf9b76b2ee895afe574d36d16c2d11c949b60437ca7e189e6da87cc","harfbuzz/docs/usermanual-clusters.xml":"113408fe6b82a4c05876be7dcb7ebb7f5c36e9557c4324e0835b2e9e3111bedc","harfbuzz/docs/usermanual-fonts-and-faces.xml":"860d08bd48bcbca32d76cfa89e17a5d500fd1c112ca23cb67e83c434ac1e3508","harfbuzz/docs/usermanual-getting-started.xml":"4f0890ffb5162b4376a212bcf54aa114e9aa94114d25f2eff2383956ba0a28a8","harfbuzz/docs/usermanual-glyph-information.xml":"aa6e4f95130f8bcc49fc86d72c4ff6b44c5191513600f095ff02e04a24241253","harfbuzz/docs/usermanual-install-harfbuzz.xml":"8355d9f4eb1a2f53aef13193569ddc0067349c6c0574a095dc3c1f89aeeb0194","harfbuzz/docs/usermanual-opentype-features.xml":"3d8c4c4df4922c11828a1f230171d29103639fa633a64d47d20d80da3466ec96","harfbuzz/docs/usermanual-shaping-concepts.xml":"bb422d2096506f94dbd996e8a4fa761758774d393b8dcebdfac2e6d6c7c01707","harfbuzz/docs/usermanual-what-is-harfbuzz.xml":"4101205096ed054e50ca43293a1d3a4d8ca8a3a2e3f4f7bfd6f12cdcec78cea2","harfbuzz/docs/version.xml":"ad8650bc9057d9dfd809961b69dbad640c288d809fa44437d44d83d3b118c821","harfbuzz/docs/version.xml.in":"00af02f37b9c48f2d783ac23cdf6689072f70e375d9c6e7b6c673ec3ab96d670","harfbuzz/gtk-doc.make":"7504b98145f88c10cac929e3fd6b26722caafed6cbd0c2f79bdbc9619a4cc418","harfbuzz/harfbuzz.doap":"59517b4eebb9525a14d435b97d4b48b3305cd4171e1ffd4dc200e8537ff1bc6b","harfbuzz/install-sh":"fb968adf6c7fa83071ad294c8a5a13a63c92a8f109f78bae51a80d6eee59990d","harfbuzz/ltmain.sh":"cd1ff57339d0c757dd9cbe04de126d4645167db629c787d5cb885a2cd033deea","harfbuzz/m4/ax_check_link_flag.m4":"602348be096fb9883e6a12a5619021e8daa2d6b41294ae8ef7701dd62f3d2662","harfbuzz/m4/ax_code_coverage.m4":"d5a192a34439a34d54b038eb03b6cf6e2c81dad18fb2a22e82fd241699a4c5f9","harfbuzz/m4/ax_pthread.m4":"3c84ad5b7c2cacb880686b0a1bf9975f2381daf3a133c79efe5139c4b5694bde","harfbuzz/m4/gtk-doc.m4":"4bd121b9da51fe57dcc47ac3d8bb058235fce91c99d948083ae4823948aacd16","harfbuzz/m4/libtool.m4":"37f8897d5f68d7d484e5457832a8f190ddb7507fa2a467cb7ee2be40a4364643","harfbuzz/m4/ltoptions.m4":"e77ebba8361b36f14b4d0927173a034b98c5d05049697a9ded84d85eb99a7990","harfbuzz/m4/ltsugar.m4":"5a6735cda60e0ba0d1b706c0ef648f5d096298da46daefd9cdecdb6a0f4584d3","harfbuzz/m4/ltversion.m4":"a27b754709de61575197bf5a980696c98ae49da3f92f0de8ee7f42dd543b7465","harfbuzz/m4/lt~obsolete.m4":"26fa3285c35dd6ab00ed1e466ba92a17e4655e01897731ec18a587a4cf5e4f8d","harfbuzz/missing":"b1a337b731bbb58846d31ca2f5143c293a455fa41b481e236e89a9016d96b034","harfbuzz/replace-enum-strings.cmake":"61ef04a7876f3c511693a546dbe3e234b86e16ce4d41250651a5d3da025ee98c","harfbuzz/src/Makefile.am":"5146e1b37661078fd13a11587b0648cd209c01eb4eebc7b029e93560101bbd97","harfbuzz/src/Makefile.in":"9f6a57f8983d4088726ae98ce0ed34ba9ce99dac2bcf25e638718890744980bd","harfbuzz/src/Makefile.sources":"cc5ce49cb949d51b32e2b3e80c6c2bc82f7acf4f285cac9aee96c34b5df107ee","harfbuzz/src/check-c-linkage-decls.sh":"f353606c9e935d9bb500194b390f26f03af5cb8a83066631331ba426425ed082","harfbuzz/src/check-externs.sh":"3a25d0be93d529de5ec9acb59555796ca329bff659118625cfae124aa71ff964","harfbuzz/src/check-header-guards.sh":"89e0672a99c2cf215e5c9a59be74dfbed995f5beef479d87a4ea0c8e9e883677","harfbuzz/src/check-includes.sh":"ae826012d6affbc8b130e952af66b87fc1ff531fd16e36f3af7522a608d5a4cd","harfbuzz/src/check-libstdc++.sh":"3bece97c237eaec5bc62475ad76162737c580b65e81c34a298c12d5b475e4688","harfbuzz/src/check-static-inits.sh":"1c1682cec02fdd085247cffc63ae883c8cd388e5dbb425b4c2bbe14b0837d5e0","harfbuzz/src/check-symbols.sh":"522c389d265862a62483e41037b07676ccc58bf019c717b4c9b3fc03dd041531","harfbuzz/src/dump-indic-data.cc":"4cfa448157daa728054a08bef0449755f81db878403fe29b92b7977d0740b235","harfbuzz/src/dump-khmer-data.cc":"24ad35251fb1f43b8795a89ea13982d4a66e7bc54e094b9ad0557e539c8d1db1","harfbuzz/src/dump-myanmar-data.cc":"513a60073f5ea6d00b17d23122b40548553768db3d679df5636264588765ba9e","harfbuzz/src/dump-use-data.cc":"1e0cf03ee6a714a6684e8b3c714b1cc447e59ef6b52ccde0f4522dedb05c8db3","harfbuzz/src/gen-arabic-table.py":"c9dfdd224ca7c0781cf5a8602e348821f33bd42b954b36f2428ed993a625df44","harfbuzz/src/gen-def.py":"efed47fdf9f61a295607658f4032234df923796af4940f43bb239875dfaef650","harfbuzz/src/gen-emoji-table.py":"d28cac33c0332ac0bbb8541689aab441e218ddbcc17307082fd6595c77773915","harfbuzz/src/gen-indic-table.py":"070a00b0488099ba0772e6af1e835c1c95e1a357ab31250b94165bf5a61fe09a","harfbuzz/src/gen-os2-unicode-ranges.py":"030f0d4332f46f2cc5eded5aa85c72b83b813aa3dfa8d2de2f4980fa6b8c46e1","harfbuzz/src/gen-tag-table.py":"de7ada26797a5a4a5eac0ac7abfe85de32981336b346eb49c629f25f18219c48","harfbuzz/src/gen-use-table.py":"7062f63e1741c4d4e040b631c41d39e0cb2ebef1716ca595fcb17d587416b816","harfbuzz/src/gen-vowel-constraints.py":"8bdcea6a9ec988c91325ee0ce637da73d4ee13e25ba0b14933bfe2e8c36c1a79","harfbuzz/src/harfbuzz-config.cmake.in":"efbd235a39ab48d31b040026f163bc87424959900515d238266b8645db6c80b7","harfbuzz/src/harfbuzz-gobject.pc.in":"9f625a1c8d709b41d0a896d38ed8b440aabb8a61932ce02052a90e24d4374009","harfbuzz/src/harfbuzz-icu.pc.in":"3963c697dd7bc1bd9b68d98285979c508a4172184c5eefe29c9ceedbd5c30066","harfbuzz/src/harfbuzz-subset.pc.in":"2798440fd1faa9459c7a50d2435b3343561cebc8780453e269324f02435f1852","harfbuzz/src/harfbuzz.pc.in":"4ffa3013f9f1ed7bc5dab1b201052543f1a8e2ef7123c0a34625766f61d66a64","harfbuzz/src/hb-aat-fdsc-table.hh":"c13e0474efcb2417e49c4d38334751eb717ca9ae19b765a3a3e13d210b923914","harfbuzz/src/hb-aat-layout-ankr-table.hh":"07af632813d3bb4b01e5b18632a73bb550461b4217ef3d96a360be55804aaec6","harfbuzz/src/hb-aat-layout-bsln-table.hh":"585b177f4f9644fc0ee48543a4fe2feea40ba2cc4b7dd7c6e22cb3c7b50146f0","harfbuzz/src/hb-aat-layout-common.hh":"8d42f3e6117ec4ef826a7cbfd7bc743adf0af6655195f671886a3e8d92328a20","harfbuzz/src/hb-aat-layout-feat-table.hh":"928b112b4088aa06cb535be2498db65ab4edd673819428bf175ccba38e04b398","harfbuzz/src/hb-aat-layout-just-table.hh":"a14d369f028bdd52afdf32ed660d5e39b89ec740d7ee4b187bf183aa641bb8db","harfbuzz/src/hb-aat-layout-kerx-table.hh":"90874a658ea5ecaee385aac59cb3db372e392259943ee86dcda48672a5d7362e","harfbuzz/src/hb-aat-layout-lcar-table.hh":"8b4054d1ca7e4a5853f086a8684589d546d35206c6b09de905c775094d7a1fec","harfbuzz/src/hb-aat-layout-morx-table.hh":"5904b06118b0c90c672e7d5aa25d9b274455c14da2bbb897acd75351dcf183e0","harfbuzz/src/hb-aat-layout-trak-table.hh":"57525e6e22e46d1f1f3da9328b0606622bc6e9d81a0e4141c8d24b038cca3a55","harfbuzz/src/hb-aat-layout.cc":"d450e7a396975ae6922793a02db0dbf08c5796c3868ca0ead01de5f8d3b2d770","harfbuzz/src/hb-aat-layout.h":"c8475b431219100c2516651befa595d34ca9578d3c31c9a1e23b0134e9daef8b","harfbuzz/src/hb-aat-layout.hh":"1f7fced14a0480e641f3df5c4afdce6fcfb0714ae9ce785dc0286763d0b8ee2c","harfbuzz/src/hb-aat-ltag-table.hh":"8026902c913ef75977c7126803e0490ed9564337275880ef83a5ecbde35194b5","harfbuzz/src/hb-aat-map.cc":"95760726b7f58b2d015b34e63f0039d48e61bc63bc4ca5cdcdc11c73fff45e79","harfbuzz/src/hb-aat-map.hh":"33ac15d9222a88532a04cf04a9b55ee88fb2cd8737625a61bf0fb552690920a2","harfbuzz/src/hb-aat.h":"bce10093cad39cfbd5355d763368b22a04ae2bec9289ef0642e5f752bd6e79ff","harfbuzz/src/hb-array.hh":"04dcc3079e88380942d72ddb6504b2f8b878e72da5c9358fee5338c30f82e53d","harfbuzz/src/hb-atomic.hh":"a407a5fa9a751cc58e811f02504a9d8265111782b8912979a30735934d665ac2","harfbuzz/src/hb-blob.cc":"9c29f9b0f03531c269ca96c77db5d3dc5feb9811506e2f60adab2f510bb6cdfb","harfbuzz/src/hb-blob.h":"c294f76a904b9532e3b3b91095dbbdc2ed15c52f49188f66a05b0ce0cd0fc243","harfbuzz/src/hb-blob.hh":"5c7bb8c9552a823f3cd96bb3116ad9b7c5dc6ce43e95212b503818ba0a49cab9","harfbuzz/src/hb-buffer-deserialize-json.hh":"89f56f8b754a337044188cf30adeb8df479a5ee98e7f1314d61d0865fc5b14eb","harfbuzz/src/hb-buffer-deserialize-json.rl":"c42d2692de6a20252c3b24cf170c6d6599226dfe85d91d363398372aa4234452","harfbuzz/src/hb-buffer-deserialize-text.hh":"01d0a7620da81722392dd2cd66652451b8349fa8301620dcb3e1a8431f2351cc","harfbuzz/src/hb-buffer-deserialize-text.rl":"d23c09777b5e2941e62641cc338eb3ced2030c982f7d086ca1273bde357d9933","harfbuzz/src/hb-buffer-serialize.cc":"24f317ce4befc74396b0481e83056362b3458c561e43b0d119304e5b79c79f03","harfbuzz/src/hb-buffer.cc":"bae053439a33f56bbb2644e43bfaa1c971f9c1333cbfd91c1d3bfb3a91ac0756","harfbuzz/src/hb-buffer.h":"f35ec8fbacac30432f8cfe5fa859597b53ad115603591985b1abad1f0dd3d617","harfbuzz/src/hb-buffer.hh":"dc5a4c7d36d4fbcba674d8dee584967bdcf11fe39137cac9323f3f068b68ca5e","harfbuzz/src/hb-cache.hh":"cdbdb8233e8fa8d252ccba96e5d57f94dbafd6f280f9504e3435a9e4c1d6795b","harfbuzz/src/hb-cff-interp-common.hh":"7a3c8ecdec3cdd30f3ef5b301ceb4953e607d6b66d72a6fcb993296ea4a9085a","harfbuzz/src/hb-cff-interp-cs-common.hh":"1828ddae0443237f22a71aa639414a7cd5134c625b670aca0aa22634449ef84e","harfbuzz/src/hb-cff-interp-dict-common.hh":"19c22d33dd8402cbf049f6db714e8411000bde907318982f3c81f40e473ae6c3","harfbuzz/src/hb-cff1-interp-cs.hh":"adb4eb6eb9e55e042f54232e5587bc1abb2ca19ef421f6d588cf125ebdd2fe1c","harfbuzz/src/hb-cff2-interp-cs.hh":"3907159502fa96158f5b23e8f970be77817184791c562c231a00745bf3331340","harfbuzz/src/hb-common.cc":"dafc5805d865564953c0cffc1ab6ab278595eb40a75dee1b41b4bccf8f2242e0","harfbuzz/src/hb-common.h":"93ca1d954f10a5a59b52512579eeb355fb11c42a7ac8875713490537dbd85e0c","harfbuzz/src/hb-coretext.cc":"ce5f73f3a579c4ddb5b9b784212f41e146eb4ef03e1a82d0a87413af7b1efada","harfbuzz/src/hb-coretext.h":"66b295273cf4872c9775a841cd6661753505d132d0ca2828643e00309f46f7a2","harfbuzz/src/hb-debug.hh":"9e2cc47294f4fe20549a084724f52f61691eeff42b6d9aaf95a68f8456ab0f3b","harfbuzz/src/hb-deprecated.h":"e3db0353da22c3a8c6821255f4296cfa2516203d71ffd85ee14a97a9a4708cef","harfbuzz/src/hb-directwrite.cc":"59a858563494e5a953caafd1c64923e74658c5df0b1800adc188d3978b8734a5","harfbuzz/src/hb-directwrite.h":"02d87bba4a67de4561f10d557d9701028aeaa6037aad7c92fdc9f8ef31a94397","harfbuzz/src/hb-dsalgs.hh":"6a29bdf1d58f7fa8d0f3d58b5465a028d8e4c6ede9e96b6038f4aa7087f25c57","harfbuzz/src/hb-face.cc":"bc5f83692a93f0c7f52684fe6c959232c600cc7e0286538bc64b83c5e86a5e89","harfbuzz/src/hb-face.h":"c8b28c1f8bd6ecee4e9cc6288d6328ba5724a01f81b98a0b5462d0ff9e89d5ea","harfbuzz/src/hb-face.hh":"064878b60188f6e0e0907b19401b77e325afae6d1660063f14de615c2d48bb14","harfbuzz/src/hb-fallback-shape.cc":"2f9e29b2dccf085a02903cb1c5cb95d38fe83ad3d3a4f1ee99e300e7fff510a0","harfbuzz/src/hb-font.cc":"00b61b8836528a49cfb055d29309d14b2a4639e53aebdd8bccdd6d62dba040ff","harfbuzz/src/hb-font.h":"1b2a4659420e42c994e80ac457581b428f4b70a2f625f7d8e36332454df84754","harfbuzz/src/hb-font.hh":"9f2495196779605de9af5b877db210c9777c8721e83529e737c2eb7e9f25f9fa","harfbuzz/src/hb-ft.cc":"d9305f3d52dd5a85e635bc3ee01671aa0f455ebec78abc1e9eb9c65ee98bdfcb","harfbuzz/src/hb-ft.h":"9af154a09f95bd125400c16913f90dc399b25b2653bd0eefa29f29d33913085b","harfbuzz/src/hb-glib.cc":"d5af8846541ec48beba7727764df4d5a010fca7d78affb5e451b2bd8eba35c27","harfbuzz/src/hb-glib.h":"05402cbae1f44fc2587ea8f59afa235107f9e568e5a4aa93c12ed2727de74aac","harfbuzz/src/hb-gobject-enums.cc.tmpl":"c90340a71ce53ef0f19956e6ced8dce24f1505809bcdd2232e699bb08a4034de","harfbuzz/src/hb-gobject-enums.h.tmpl":"bae47557cf4ec7673b3525425791673b0761ad081b6123f21d9f74bb26369b21","harfbuzz/src/hb-gobject-structs.cc":"f8d5cdfb580a640697c95b243a5fec371ca0878a4b5fc53d09dd951ac87f48df","harfbuzz/src/hb-gobject-structs.h":"0c0733f4ae59a752cd47f2835a39adb704c242700f2a1aa754c25c96145750f5","harfbuzz/src/hb-gobject.h":"d8d14409803fc534a79d3f78d99264727392c2ac78d18e19eadb03f30c44693a","harfbuzz/src/hb-graphite2.cc":"6a027e1aba8b6014886652b9c8b442e0b5940733ab049d11a0665227927c1fc0","harfbuzz/src/hb-graphite2.h":"6dc0e2f2f75d07a004f2d1d9f66d94982f46f0d40c5f46da17c90e9cd5f636af","harfbuzz/src/hb-icu.cc":"834bec641c8d492101437197ae9c501982d67f1190f28f182f6de39bf0d28416","harfbuzz/src/hb-icu.h":"f2eaa478e7ecc533be912d75288e6fa8c2157191edbc03b2bd68c302bbcd0f6e","harfbuzz/src/hb-iter.hh":"807078b2178aa2c873aa2196c4496e1ff1084be689d0139cd1dd45c24d1bb639","harfbuzz/src/hb-kern.hh":"5173a1d28293317a724b4d1b0a049022daf0cee568aa5372602e178b878ecae9","harfbuzz/src/hb-machinery.hh":"fec4fcd7d73cdc4d2cef05bd3d0e8e17e8ac79faa9cfe56150e87693f98b2770","harfbuzz/src/hb-map.cc":"5978b927c7ff721e7de84ab72462cbb526a1a917c1e713adb5f29ff8bc0560f6","harfbuzz/src/hb-map.h":"bac86f7cb93b8fc7f3fe04d71a6bbc4a2ac8b03dc44b7abda26a8acc9fc94e23","harfbuzz/src/hb-map.hh":"83a977ef47e7950c2dc726a4524e257f24736ba1502b39cfb94c6a5ac5213239","harfbuzz/src/hb-mutex.hh":"9e43d245da5e7d54394c1b27fc064dcaaeafe30d500a6654705108d259de98a4","harfbuzz/src/hb-null.hh":"bcc1ef3976b4382c9e994de4accc77b453a11e03d3914066fc423e51f0c38a2e","harfbuzz/src/hb-object.hh":"27d424306b6565968f3a114644d3aaafe56a4a63d35a7a1059303250ea4c3c08","harfbuzz/src/hb-open-file.hh":"8982cef0aa02c2e004d1a7018109614dea1f2f02e1c8d84f2aaa54e5df3b3c3d","harfbuzz/src/hb-open-type.hh":"0def790a43f47e59dda662bf7108fcdcfa269e3269baf590a53a77876bde9143","harfbuzz/src/hb-ot-cff-common.hh":"646cd1c26a4f7209fa679ce01b897f3dd06d72ab30ae4b63e9bbd0d36f3e56f0","harfbuzz/src/hb-ot-cff1-table.cc":"e5869d4a819d265c026ea099fc1869a68f5a9eed43bfa2a384f85d153b1b12d4","harfbuzz/src/hb-ot-cff1-table.hh":"1397182b918951f8d80323a632e38adb83f70b7bf89a415bc0ae33a892c4afb1","harfbuzz/src/hb-ot-cff2-table.cc":"6b03a464c7056cc6b30c31ae25a4a9c38758b2b30843cc5e5828e3314a27bc65","harfbuzz/src/hb-ot-cff2-table.hh":"6e4cd5557f61faded1bd839049f29cfc6bb9a6b059c0ba1698452083aeb25c92","harfbuzz/src/hb-ot-cmap-table.hh":"367f5010c6e2aef0b639f451f5db7a317bba330f3dd2988f67c2aeb789bbd0e4","harfbuzz/src/hb-ot-color-cbdt-table.hh":"c4e537df38e13862246b1c09427c1fd72d572d4531fc64db46bf85ae25c110a9","harfbuzz/src/hb-ot-color-colr-table.hh":"60cfe7cf80cdc1760f18dc57f87762553ff250ec25095a7d157b1373f935e9b1","harfbuzz/src/hb-ot-color-cpal-table.hh":"21d37f14a33128de2674313fb0be4633cce590e1c4491c930406b986915be0d3","harfbuzz/src/hb-ot-color-sbix-table.hh":"ebae863424e1e75ff7ab7ef90d5716a533fd4c9bd44e726a396ecb302ddc4a88","harfbuzz/src/hb-ot-color-svg-table.hh":"979eba3f754b9d62b7ba8c76f15d3befd3febe0f5d83c6082bbe2a1be5feb908","harfbuzz/src/hb-ot-color.cc":"879737a2d15d2b48e090a1f02120a11d0d7bf4b72b4f67a6e37a70b62c16f9d8","harfbuzz/src/hb-ot-color.h":"8524c0289e2e744c0149909f8a01e2498161aa472d16a0f7b404810a4f861115","harfbuzz/src/hb-ot-deprecated.h":"2101d21e5967308bb187f891fde20c3b5342041051caf6ea683d1dc87262b550","harfbuzz/src/hb-ot-face.cc":"f83833ac6763c6a37c0e7952732acfcf78326a21db3d5fcc8ec4b52e6e175707","harfbuzz/src/hb-ot-face.hh":"387a71bb82eed503caac28f29a76a40e98012e0cb31fd98d21c763455c9dab58","harfbuzz/src/hb-ot-font.cc":"63bb2e2eb4643da80c73a505827955e647afd7d85e122544d9c391e2c27c215c","harfbuzz/src/hb-ot-font.h":"7c927795ca0daa3f0f18768ef998af82c7f9a82eb6034780380db8ceadca27fb","harfbuzz/src/hb-ot-gasp-table.hh":"102ecbbba9a5bb28b422e1232bdb40c3ce8b9b859f15af71b995034e9e8eb5c8","harfbuzz/src/hb-ot-glyf-table.hh":"97efd3d51c1a3d9c4785a438407bb908f6c23721a3af493e4532208df89e8a1f","harfbuzz/src/hb-ot-hdmx-table.hh":"8520d47d20770afdbd0dbe5f2d111342f086c15f0b0ab017a170fca277547ec9","harfbuzz/src/hb-ot-head-table.hh":"c0a8638412ff37230674b5b16da063b37151d847dac4fba45a9b5fb0742e2c16","harfbuzz/src/hb-ot-hhea-table.hh":"30b7baa84b795b15f790aaa8e82243e638b121b3cc303a4e9b2c6a431a00f4e4","harfbuzz/src/hb-ot-hmtx-table.hh":"956eade25bca8112484b99ce025900339eeaadbefa9d42ea5609014894803dba","harfbuzz/src/hb-ot-kern-table.hh":"f895215b782feb88af81deb4c39fd56fde7da0d86b2958486a44ade13ecce57b","harfbuzz/src/hb-ot-layout-base-table.hh":"eb9aa0af64ae3d63a1ce4f5d7af65e78ed7666c765898f8dd6b31340946eed58","harfbuzz/src/hb-ot-layout-common.hh":"8569f67bd802139a9284bf0940784a57794ceaf92e13c6817c3623f897d6f62a","harfbuzz/src/hb-ot-layout-gdef-table.hh":"087388ed91b02fc1b16cfc08ad6f4ee89687bfb63130223903050da22314cb9e","harfbuzz/src/hb-ot-layout-gpos-table.hh":"278e4c3bda773fc2537c0b2cb5fd49f42d2008a19fb6992ae61e496b54ba6a15","harfbuzz/src/hb-ot-layout-gsub-table.hh":"29c98cf62042231bbe93b07f25439fd0e9a6901a4696aa65475cd1737177c598","harfbuzz/src/hb-ot-layout-gsubgpos.hh":"73118ec71f628a3b3f95dd4154dd27ad74e6a6fd57a418cd60382fba5093ce4b","harfbuzz/src/hb-ot-layout-jstf-table.hh":"05adf27bc48c3d868f265ab521a54cfbd3d70d159b9fec0f09eacb474fe6b8b0","harfbuzz/src/hb-ot-layout.cc":"deba40d5dd67bdbbbff30e7c10d9221c7d7794a09c7ae44d9fbe7202bc63d932","harfbuzz/src/hb-ot-layout.h":"3f2b8ccdb7e136eda2716c341e63fb92454249253b9161a9c9b9778606b65a06","harfbuzz/src/hb-ot-layout.hh":"eea458b9aa491322dd86e979adece7e0969055fb93ba0e3a1760914fe0cedccb","harfbuzz/src/hb-ot-map.cc":"86c53628669ac67505f27b4d535d286dda877e7a9feb7e30ee2351d43ae4815a","harfbuzz/src/hb-ot-map.hh":"c144af1e74597f5fb99ac10c386d8644bee6eb1bda3946ac94749aa9e0fd180b","harfbuzz/src/hb-ot-math-table.hh":"bea95123faa95bd0c5a43ba1c17904b57839305fd3160cfd1130b5cdc0d1676e","harfbuzz/src/hb-ot-math.cc":"328f5df5baf76ebcf48358f148c0e08c4cd2d113e191a846cca3e85c9d399509","harfbuzz/src/hb-ot-math.h":"6e8fc103fe9ae99fbf078e02759683552da6393c99e7464bc87a6274b55314ed","harfbuzz/src/hb-ot-maxp-table.hh":"d2aae9a25cb1a1176916c5fe8d6acfa2402337592235a403fedb9120cce2a14a","harfbuzz/src/hb-ot-name-language.cc":"6731ebe19c1536306cd1a3ff2a288693e0b83bccc22177d167548a4c74d04887","harfbuzz/src/hb-ot-name-language.hh":"a70e2231ad126d79c75009034485ff1c205ba584df1a4d711c3c5232d4745288","harfbuzz/src/hb-ot-name-table.hh":"9ba3802bf4983d1cc2277dd8dc0005aa1aaa1ddf680263cc86ddbfe5589d4cad","harfbuzz/src/hb-ot-name.cc":"76f938f5787cc23d4b1aed82acd4efc3d423d83fb679067cbb86fae158c42463","harfbuzz/src/hb-ot-name.h":"c17d85a541d179c6cc43ac67bfd5627926617681cf2c88e9e40333b1f7d2193b","harfbuzz/src/hb-ot-os2-table.hh":"6d01c714749b78d9f4fde54af86481fb076f851d94fb9a23f4761299e2225af4","harfbuzz/src/hb-ot-os2-unicode-ranges.hh":"ee2f8f4caa21c8e7f7bdf6028ce2b3b2bad40a58187ef75005fd3d380d83f8a1","harfbuzz/src/hb-ot-post-macroman.hh":"490556ad4c97daecf2c06b1774507560eb193b6657be70c5ec73b72a02d35433","harfbuzz/src/hb-ot-post-table.hh":"ca272638446110aa6a7be3d5a978a62360139380236c379b272e686d9120a57d","harfbuzz/src/hb-ot-shape-complex-arabic-fallback.hh":"f16bd514f1bc1a624b1c0f045bc1bf6f460a273d32e07c7507eafc97926ef48b","harfbuzz/src/hb-ot-shape-complex-arabic-table.hh":"09ed2f4bee089a73e1ab8f989419c970f08f8f4c76188d165c7fa9872cb50699","harfbuzz/src/hb-ot-shape-complex-arabic-win1256.hh":"153d29ed2a67610d214504bcddfa88c8e103d8aae930721a874b7c1e3820de40","harfbuzz/src/hb-ot-shape-complex-arabic.cc":"1648c9bf154522c86447665f49aed985392d4e090067ede60dc85586013b6d24","harfbuzz/src/hb-ot-shape-complex-arabic.hh":"d249e8102d9c81a373a159f81bcd197bb6c0e6824ccc3b9ed30e7d4553a89795","harfbuzz/src/hb-ot-shape-complex-default.cc":"e9844d296f0e67f622bee35d8699e2d29af15e40aac84fa6c78a8de161ba97e5","harfbuzz/src/hb-ot-shape-complex-hangul.cc":"ac62d75ad221d2e681e6e36b0396aacce5e93c8453e5348af0b7c8d59c7d131a","harfbuzz/src/hb-ot-shape-complex-hebrew.cc":"ac42a33b75cc3894806e616345ee6f537e44a17beb4b161500e9c7d444e91c9d","harfbuzz/src/hb-ot-shape-complex-indic-machine.hh":"a2e6ebc477ce62b6109908740917b395d90a32300d11812f5b1462625da6a83c","harfbuzz/src/hb-ot-shape-complex-indic-machine.rl":"2a40246194ffca267f767a11348d035561f6c6f992fcaae36391346fb3cd28c9","harfbuzz/src/hb-ot-shape-complex-indic-table.cc":"3929f6113521c1623504ece31bc9f12d68034dc200af75b293001da35c4a7787","harfbuzz/src/hb-ot-shape-complex-indic.cc":"558b859a23519d02d4b3fc8a9cc2c2efa97823b82da6cd49ac900aeb44c7e350","harfbuzz/src/hb-ot-shape-complex-indic.hh":"1b49aac7052a047f8b42711828aa1074db887a3d6ce506d188a3731ef5447f92","harfbuzz/src/hb-ot-shape-complex-khmer-machine.hh":"333c66a1968dd24197387a97430b5706d83f41850dd8cf72ba62e3b37809b1d5","harfbuzz/src/hb-ot-shape-complex-khmer-machine.rl":"92a3e906a62b6e80b7ace9578e876b944cb0e758cda68d24566e91b024bd286c","harfbuzz/src/hb-ot-shape-complex-khmer.cc":"0a387e9a8364e07e34e0cb6b6ab9a171342bde971cb1a84b0d3af47e7bc7ba4f","harfbuzz/src/hb-ot-shape-complex-khmer.hh":"8dc5eab0e66b5fbb7dbd6e6b67c930aa34b943fb335fe47d75d1e6eea91b6162","harfbuzz/src/hb-ot-shape-complex-myanmar-machine.hh":"115c041f2deb5cb2c718d704c7dabe3fd7c703832f476566588069447855f811","harfbuzz/src/hb-ot-shape-complex-myanmar-machine.rl":"3e9043d7b89bda16d6d2603d287510a01b21b1a59993bc9d6b0aedf06d530c07","harfbuzz/src/hb-ot-shape-complex-myanmar.cc":"f1f9714102c621e22381151f1448558aebdb6db966fb57ffd859fff7e7260e96","harfbuzz/src/hb-ot-shape-complex-myanmar.hh":"f086483e9236cc1b5b5a9e7793adbd7167b5a014c8bce8f525380416a35ae932","harfbuzz/src/hb-ot-shape-complex-thai.cc":"2a69fa784db7e57848dbf8542d0eb2b6224ab37b78a2f435edd7c4c3ceb965a2","harfbuzz/src/hb-ot-shape-complex-use-machine.hh":"7f66ccb945dfe2b24c9f69e1a6c30051e98e0fcd5d59a7d0b7c2eb79297380b4","harfbuzz/src/hb-ot-shape-complex-use-machine.rl":"e6c31255475c5f97bdd82c05d225446f9bba62f66690043b7d5862f6eeba1dd0","harfbuzz/src/hb-ot-shape-complex-use-table.cc":"be13846e52935b6bb31e942cc8115329727cc0035c576b06d8639ec01f8ca14f","harfbuzz/src/hb-ot-shape-complex-use.cc":"214351161bef6b73d1f19aacee2a404e84b316790f3025ca8de2eb525c2b7a3c","harfbuzz/src/hb-ot-shape-complex-use.hh":"b13fac699570fab2f16f1b8f97cebe414591ca4c7ecc1f0ff9b01cf47564d7b1","harfbuzz/src/hb-ot-shape-complex-vowel-constraints.cc":"1df07463c35072220d10c48a0995f145b7a890900e1206dbdb3cf3990926b005","harfbuzz/src/hb-ot-shape-complex-vowel-constraints.hh":"618ba8e8cac65894b4e073ccd134f866a664aa063aab95e8565386bcb5fb8f22","harfbuzz/src/hb-ot-shape-complex.hh":"68d4f2de0d392ea0473d26aafe6a91989001e04e40704afad547fde971b25260","harfbuzz/src/hb-ot-shape-fallback.cc":"2afa39a7b6fa1541b5f66c114c94b7f2050deaf1b458d76aba6196d626abb507","harfbuzz/src/hb-ot-shape-fallback.hh":"7b6deee5ae42fd6ce433b4d64425fb47e3511c2c4feecfc7a68856ae0711f6f0","harfbuzz/src/hb-ot-shape-normalize.cc":"5a64f045d09d59232a1502866d19ca1bad42c5191c971c11f7f1a75a9cb4672b","harfbuzz/src/hb-ot-shape-normalize.hh":"61b35e56c8bca4aff1591806681070c992f43ed7db482874a9f4a333367dde9f","harfbuzz/src/hb-ot-shape.cc":"6d98c8e1fbf18af5e3f98822e8216c004c4452fa82a6d61a058c86d6dc5a6b3c","harfbuzz/src/hb-ot-shape.h":"11e8c236b85317c700f89ac1b7ecae093876366ac73fb94ed96f04ed0dc2b5d2","harfbuzz/src/hb-ot-shape.hh":"ee488a42062bd4ee53790c55a73677ef7318682fc6532b6a51af232fb6a10e95","harfbuzz/src/hb-ot-stat-table.hh":"2d2b3d2fa05e27c1d17bce2e6c54fb13ddf60b7d4b8c8c64f9104414bb77a841","harfbuzz/src/hb-ot-tag-table.hh":"0700851caaee8b6dd5c9c885c83b04cea1038cb4f947baa1f8d497910df34d96","harfbuzz/src/hb-ot-tag.cc":"7ebb2f1ba2dbd1e0e8c3a7cf52a06ee1cc9893cc428a565468f0972ef6f32d64","harfbuzz/src/hb-ot-var-avar-table.hh":"031bd57e29bb12cfb714028f0b9acc2c462ef61b9d8ad0cb8627569667ea4233","harfbuzz/src/hb-ot-var-fvar-table.hh":"610a74c215abac4b6584a2287b23c145bea459aca75fcd0f68a6ac12fc6399f7","harfbuzz/src/hb-ot-var-hvar-table.hh":"44636125558d830092ca0bee2b28ba87c7c40db2b26f793a219ebda97498af49","harfbuzz/src/hb-ot-var-mvar-table.hh":"4835ea09ac5ff7bea0ece1b1afa2b0a154bff91a783b4063d581720ae696a2a1","harfbuzz/src/hb-ot-var.cc":"1d43f753518057eb72133bd5a4da2c98ed4deae98621da15d4a0aafecbaac8a2","harfbuzz/src/hb-ot-var.h":"cd4f0a778b42a94aface110036fb80b2387a9c06b7d73082bfa1e4fe511542e0","harfbuzz/src/hb-ot-vorg-table.hh":"8efa52109819dfe6fa660992f4c999b495bfd172f7b5a463e846be8a147962d8","harfbuzz/src/hb-ot.h":"c1821a7ae6ba6564535393aa07b6dedeb93d0bd90faf9a62dcd47f8dca393b4c","harfbuzz/src/hb-set-digest.hh":"bd3baa8421b8cb1a015cfaf053e482cdf6919c5615e6c811573f9ac901a6f1bc","harfbuzz/src/hb-set.cc":"1f2d585a27288425731a2c1f4825d7bb51a790ba10e5a7027eececcefe7b3551","harfbuzz/src/hb-set.h":"cd0fcae81bdb221e2022887cd83b22b802b7d4677d6fc21f6fe17f4ee2393915","harfbuzz/src/hb-set.hh":"04047d7218635b5fcdf4757aec020eeedc507bbcca1f0ed4524f009dc3ef946f","harfbuzz/src/hb-shape-plan.cc":"03aa415657255aa0ceaad3e7317e8162f94727cd0051cefe8980aa810cdaf56b","harfbuzz/src/hb-shape-plan.h":"f1633ba7cd03d97ff0a9fb27afbe96e66d2f3e9b109ed141336115157f3ee84a","harfbuzz/src/hb-shape-plan.hh":"e676cf7b6daec4a72b8448bd9a0b54bb4af5a8afee1bbb0c98fdd936fa5e972d","harfbuzz/src/hb-shape.cc":"f334a63d35f15e9550567787ef8e28ac5d543228c02b32f501f723268104d65f","harfbuzz/src/hb-shape.h":"80dc9aa79717b46e84a9ba7d78414493bda2564cc2a06e6799bb023c2a1de299","harfbuzz/src/hb-shaper-impl.hh":"459fb7af72bdcce6a46899f23f3d5fcd68dbc311c65973a533bcb53051a3f485","harfbuzz/src/hb-shaper-list.hh":"70953861ce9a71d1ec2311e1f34e00e5608e0bd6247bbba8b0b67f49a3e60852","harfbuzz/src/hb-shaper.cc":"038c66dee955ad9de1c11cb278d42046240221596d348288f9d451fa662f3085","harfbuzz/src/hb-shaper.hh":"99bbb63938b535a54c12e06386f4ed0c5576aca408116114a20e5211c2c924ea","harfbuzz/src/hb-static.cc":"67df5072c6100ee795429b243f4d398a17195d0c662b14a888193114e90f23cd","harfbuzz/src/hb-string-array.hh":"cb7c55553c1d5d08193a9eae5c742326510c8147ded1534ed537bd474fbaa679","harfbuzz/src/hb-subset-cff-common.cc":"9f97496be18a747184ab0cbb5cf545e9ddf893164a908575b2dc567a9f58a149","harfbuzz/src/hb-subset-cff-common.hh":"fdb65a8f098eda674562021ab14b8db2ab7153dad748e9d9a8c00d76dc06bb5f","harfbuzz/src/hb-subset-cff1.cc":"bae56c639a8fcb1db99fd7b1165d165897052c47664150c0b7486bc7b8b9175c","harfbuzz/src/hb-subset-cff1.hh":"84b5a4cf2c1d51a3070342b60419f1183f466b9bf6bdfa8133c9676d2f480b6b","harfbuzz/src/hb-subset-cff2.cc":"42634ce15695e9056371d7f27ed2a6528a0baa6d93de324499c2fff7ec6da4d1","harfbuzz/src/hb-subset-cff2.hh":"522199a24ce0005575f4603caa7d417751f9b9ed385aa33bb75a81df13a58d43","harfbuzz/src/hb-subset-glyf.cc":"70d83c360eeb3278489684d26e4999700564294e61c5a2f6bcac771823693285","harfbuzz/src/hb-subset-glyf.hh":"c08e6b21373329b1f5f72ffa16524f3f1e511722a4c1ec7879e2847c75fe91dd","harfbuzz/src/hb-subset-input.cc":"f3ad4b3c058baab6a732b0860c7375f4a0f238835e4aff89e2e2aff53f59b42b","harfbuzz/src/hb-subset-input.hh":"a392aeba8e6fe7d8c7de25e988b9388010e7b87fbebbc03cf7ef1317aea813ea","harfbuzz/src/hb-subset-plan.cc":"1cdbb3cd963f2b22e0b7c76d2e2f871bd8e70568a21d518cf3395e9d0f6f9b76","harfbuzz/src/hb-subset-plan.hh":"20365d1687cd2a338a3c1a31d50eed8a017c441c817f7327c10f9d30d9bda5bf","harfbuzz/src/hb-subset.cc":"f08b399cc1098253621485b9c8e155d6b8ae6d1b26446161a355fc8acc9faa4f","harfbuzz/src/hb-subset.h":"ea26606e35026758be3af01f49a3b14b24ce76ba4fbbe285f587131eeeb985cd","harfbuzz/src/hb-subset.hh":"6f4b122c7813edce53189198a29580cfecc0500c2068cc406d3e32da9cd4a1bd","harfbuzz/src/hb-ucdn.cc":"ba8dce5512d25865fbb1fadea616745b7b27d80d0d9e1f5ba58555a032ee2a26","harfbuzz/src/hb-ucdn/COPYING":"ec20cbe051200fc846caf4dc253cf660e874a2d9e4f3a682e08354b567fae409","harfbuzz/src/hb-ucdn/Makefile.am":"583261768533a270e55c7a8af0f4e72a62083e5802a9839b37d4d6e055191ffb","harfbuzz/src/hb-ucdn/Makefile.in":"30966e51748c2ea18627b55b3e0e4e0afc30e285f969f2f7ec8277d81fa6e04c","harfbuzz/src/hb-ucdn/Makefile.sources":"fa63e3ce44cfcae25816863c3939104469d68dd43206f53cfea9ba1a1e88d11e","harfbuzz/src/hb-ucdn/README":"704ab120a012045987cb9781098c572ff33339bbd505e350113244c7d36a0e0a","harfbuzz/src/hb-ucdn/ucdn.c":"8c321d88060798acbe3895fd0f3c96710672b1f44c685ae47dc1bfa3228a92ec","harfbuzz/src/hb-ucdn/ucdn.h":"e3bbb6b01a66f852a3849ded8ad27154ee5727befd1593751757ecbc0dd9ee5e","harfbuzz/src/hb-ucdn/ucdn_db.h":"c02a78b90cc812fa6aa1bab70939de42471259f5f2213c58d96514d330405308","harfbuzz/src/hb-unicode-emoji-table.hh":"bdb513a5c179544cdb395085083630b05274665e2ed5ac724a00d9bdea3acb6f","harfbuzz/src/hb-unicode.cc":"576568a67d56c796910d9afbfe1592c36f72fb38a9f016fbb599e8c73b7b465d","harfbuzz/src/hb-unicode.h":"3be16f5e72abd5fccee95b37ec4196a6b9ef54921da7b7f8b3ac2c119e9245f4","harfbuzz/src/hb-unicode.hh":"d8068ee5b5c867caed9cf9674ce7d10f5779321cf06a4fbded23bb9a1eff458e","harfbuzz/src/hb-uniscribe.cc":"2625f49a7af968ba4d00ab51b3c16346e63a7229c083b429250ebf02d61be895","harfbuzz/src/hb-uniscribe.h":"fad494ab421c382ef5d0264472e2f1b6527e0af165444103b71cc7447e9dc5e2","harfbuzz/src/hb-utf.hh":"d7df06fee0cd043213b1b0171decc1d62e9f10857bcfc0286124211cf39c39ea","harfbuzz/src/hb-vector.hh":"6ba2a19f351e1f784b40a7de5d357b58ffeeb06517f7d8a8a7de6e9a4a21dbcc","harfbuzz/src/hb-version.h":"4273cf85b1e230048ecd0b445acc05b95b4e9dd0209b874e59fd4194cdd2e7b2","harfbuzz/src/hb-version.h.in":"d5d4dc17d7b08a046354f0f8d6f07a2ea137ad260af96afb494abdf6e960d6d7","harfbuzz/src/hb-warning.cc":"91f9ce56c931b6d492c641c66b058669b8377adec7cc3f7d9823f28dfabec617","harfbuzz/src/hb.h":"6080a32063a4d59617d6ad33bebe72640a39908944b793736d6b24fc3fde82cc","harfbuzz/src/hb.hh":"044de446063d48fd85ff0c710809834db5077d24b05cfae816e0c897ce887555","harfbuzz/src/main.cc":"c21f374d505aa1bce1380447c9aa67324e70cde2eaaf9dae7981f4f4edc93690","harfbuzz/src/test-buffer-serialize.cc":"f24250ba0eeba451a1720a176f41743a1897642afdb666f4fd44768a3a7db57e","harfbuzz/src/test-iter.cc":"8ad9c426aa27cdea5182f81cc19e3be5976e9d08394a5c4dd9d8ef7a69fc2a22","harfbuzz/src/test-name-table.cc":"860232edcf82a3c46650baf5d8a953246b62d446e7dac1aeed6d00b7104b7496","harfbuzz/src/test-ot-color.cc":"54dd72124c198a24ac075168ae840e756655a5cdeb5109078835092886e48ced","harfbuzz/src/test-size-params.cc":"1c69a6368b369e10f6cd14105fd5ba03fb124210450ded80c03b87ce88d7a335","harfbuzz/src/test-unicode-ranges.cc":"4eb1e89952306ba49fc181aec56e48836ee906079ba691a196abba6d106c240c","harfbuzz/src/test-would-substitute.cc":"5e827f4c4ee0e4699d336dd27e632c5076a96c153a8b6011529542e9f3372502","harfbuzz/src/test.cc":"22ce8e6ec1ae0c0622ef65aa63583834768a2602364926cc74a44c57ebd83316","harfbuzz/test-driver":"7c1ae35455771ae32050c2ed109e3d297160b6d1a2f70b0278cf6968e5e7e98c","harfbuzz/util/Makefile.am":"54e5f492f800b00fe660eed80b0a583581f99590efa441330a35f8a706888a71","harfbuzz/util/Makefile.in":"1be53e6f19c1ea392871205cfb2d5c75877d9a4b1e58f3167c45bb92d2201503","harfbuzz/util/Makefile.sources":"fda382905d625f33ec10b10a4acb4fec1fbd34f14e506cc224f4006ed789a4d8","harfbuzz/util/ansi-print.cc":"38d025a035d2b5a00b5070286f48246d1c91117f0019aa66d650d13b71cb567b","harfbuzz/util/ansi-print.hh":"ab83c75add48e0f788958270a6252f04e898e4a5e02ca7d93a45dc97131952c3","harfbuzz/util/hb-ot-shape-closure.cc":"b1abfd95f459a635f012ec5cb8bd5a4b9e428e29308a5554078f693ccaabe9fc","harfbuzz/util/hb-shape.cc":"8b8895ad83606b712f8a45db842e03b2bed530a769c3d41b27a59022df158d57","harfbuzz/util/hb-subset.cc":"ecccb06d528b31e8250bcc988015bd6f6202b38211ec52664396ce87330d2f54","harfbuzz/util/hb-view.cc":"5a1085e13674415311148bd6d623e726bad18aacb270c8ee311245e33d059512","harfbuzz/util/helper-cairo-ansi.cc":"174613d6892d781d2cec82a910b1423b493c8c832b7641fcca46afbad8d90a55","harfbuzz/util/helper-cairo-ansi.hh":"17b005855dae58b12fffbfe93d9db877ebe5452dabe38e408393a2882b44c05a","harfbuzz/util/helper-cairo.cc":"11bb928d7e9b962051aa33077debb3c13c4bfb435dcd2f1e7cdc5fd52a0888cd","harfbuzz/util/helper-cairo.hh":"4e16bf52a46cf444b368331fc79ef495b858b76bfd0191c1571a3ae826edebc5","harfbuzz/util/main-font-text.hh":"0017d5d71c2ad0632b535a99c70b73ff6a118c7ae16064977597d0057f4348ca","harfbuzz/util/options.cc":"cb432157da16e206f6da3c58739db2fe9c1f231e7771be58e4d914f65937ebce","harfbuzz/util/options.hh":"5ae9bf711f1f13b5ba37a3540800cc44fa0e5c301e0fafef08e6754c23f67a75","harfbuzz/util/shape-consumer.hh":"47932607ebf8c513e103c48e0b46929c16d3fcfff14a64ae3b0f1601a1f1a9cb","harfbuzz/util/view-cairo.cc":"450bbc969b2c36357205af43eeb3ac87da1d05e9b217e12b60ed4f3bf815fbd6","harfbuzz/util/view-cairo.hh":"d35ef453ec01e260d36aee2540b56ae27cd2d490216760350a2821e62cb17a97","makefile.cargo":"c307d23840ee82d94073d32da10981a54577257c5ea69f5018af5264f13081a1","src/coretext.rs":"cab7ba4badc778ee7807c9649444362fb23eb17db249017c202808deb2c59425","src/lib.rs":"0e54ac9765855e6ea9ee3e90c8394fd75dccd4ee74b34528263c0595a58e4469"},"package":"617d896521b45c5f131bc2b587c053fcdf89da2eee389b9b473310fb624d1af8"}
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/Cargo.toml b/third_party/rust_crates/vendor/harfbuzz-sys/Cargo.toml
new file mode 100644
index 0000000..b0717a4
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/Cargo.toml
@@ -0,0 +1,48 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "harfbuzz-sys"
+version = "0.3.1"
+authors = ["The Servo Project Developers"]
+build = "build.rs"
+links = "harfbuzz"
+exclude = ["harfbuzz/test/*"]
+description = "Rust bindings to the HarfBuzz text shaping engine"
+documentation = "https://docs.rs/harfbuzz-sys/"
+keywords = ["opentype", "font", "text", "layout", "unicode"]
+categories = ["external-ffi-bindings", "internationalization"]
+license = "MIT"
+repository = "https://github.com/servo/rust-harfbuzz"
+[build-dependencies.cmake]
+version = "0.1"
+optional = true
+
+[build-dependencies.pkg-config]
+version = "0.3"
+optional = true
+
+[features]
+build-native-freetype = ["freetype/servo-freetype-sys"]
+build-native-harfbuzz = ["cmake", "pkg-config"]
+default = ["build-native-harfbuzz", "build-native-freetype"]
+[target."cfg(any(target_os = \"android\", all(unix, not(target_os = \"macos\"))))".dependencies.freetype]
+version = "0.4"
+default-features = false
+[target."cfg(target_os = \"macos\")".dependencies.core-graphics]
+version = "0.17"
+
+[target."cfg(target_os = \"macos\")".dependencies.core-text]
+version = "13"
+
+[target."cfg(target_os = \"macos\")".dependencies.foreign-types]
+version = "0.3"
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/LICENSE b/third_party/rust_crates/vendor/harfbuzz-sys/LICENSE
new file mode 100644
index 0000000..916d2b6
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/LICENSE
@@ -0,0 +1,231 @@
+https://raw.githubusercontent.com/servo/rust-harfbuzz/master/LICENSE-APACHE:
+
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+========================================
+https://raw.githubusercontent.com/servo/rust-harfbuzz/master/LICENSE-MIT:
+
+Copyright (c) 2012-2013 Mozilla Foundation
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/build.rs b/third_party/rust_crates/vendor/harfbuzz-sys/build.rs
new file mode 100644
index 0000000..3b00ea0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/build.rs
@@ -0,0 +1,56 @@
+#[cfg(feature = "build-native-harfbuzz")]
+extern crate cmake;
+#[cfg(feature = "build-native-harfbuzz")]
+extern crate pkg_config;
+
+#[cfg(feature = "build-native-harfbuzz")]
+fn main() {
+    use std::env;
+    use std::process::Command;
+    use std::path::PathBuf;
+
+    println!("cargo:rerun-if-env-changed=HARFBUZZ_SYS_NO_PKG_CONFIG");
+    if env::var_os("HARFBUZZ_SYS_NO_PKG_CONFIG").is_none() {
+        if pkg_config::find_library("harfbuzz").is_ok() {
+            return;
+        }
+    }
+
+    // On Windows, HarfBuzz configures atomics directly; otherwise,
+    // it needs assistance from configure to do so.  Just use the makefile
+    // build for now elsewhere.
+    let target = env::var("TARGET").unwrap();
+    if target.contains("windows") {
+        let dst = cmake::Config::new("harfbuzz").build();
+        println!("cargo:rustc-link-search=native={}/lib", dst.display());
+        println!("cargo:rustc-link-lib=static=harfbuzz");
+        if target.contains("gnu") {
+            println!("cargo:rustc-link-lib=stdc++");
+        }
+    } else {
+        assert!(
+            Command::new("make")
+                .env("MAKEFLAGS", env::var("CARGO_MAKEFLAGS").unwrap_or_default())
+                .args(&["-R", "-f", "makefile.cargo"])
+                .status()
+                .unwrap()
+                .success()
+        );
+
+        let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap());
+        println!(
+            "cargo:rustc-link-search=native={}",
+            out_dir.join("lib").to_str().unwrap()
+        );
+        println!("cargo:rustc-link-lib=static=harfbuzz");
+    }
+
+    // Dependent crates that need to find hb.h can use DEP_HARFBUZZ_INCLUDE from their build.rs.
+    println!(
+        "cargo:include={}",
+        env::current_dir().unwrap().join("harfbuzz/src").display()
+    );
+}
+
+#[cfg(not(feature = "build-native-harfbuzz"))]
+fn main() {}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/AUTHORS b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/AUTHORS
new file mode 100644
index 0000000..0763761
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/AUTHORS
@@ -0,0 +1,11 @@
+Behdad Esfahbod
+David Turner
+Ebrahim Byagowi
+Jonathan Kew
+Khaled Hosny
+Lars Knoll
+Martin Hosken
+Owen Taylor
+Roozbeh Pournader
+Simon Hausmann
+Werner Lemberg
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/BUILD.md b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/BUILD.md
new file mode 100644
index 0000000..4c1c306
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/BUILD.md
@@ -0,0 +1,50 @@
+On Linux, install the development packages for FreeType,
+Cairo, and GLib. For example, on Ubuntu / Debian, you would do:
+
+    sudo apt-get install gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev
+
+whereas on Fedora, RHEL, CentOS, and other Red Hat based systems you would do:
+
+    sudo yum install gcc gcc-c++ freetype-devel glib2-devel cairo-devel
+
+on Windows, consider using [vcpkg](https://github.com/Microsoft/vcpkg),
+provided by Microsoft, for building HarfBuzz and other open-source libraries
+but if you need to build harfbuzz from source, put ragel binary on your
+PATH and follow appveyor CI's cmake
+[build steps](https://github.com/harfbuzz/harfbuzz/blob/master/appveyor.yml).
+
+on macOS, using MacPorts:
+
+    sudo port install freetype glib2 cairo
+
+or using Homebrew:
+
+    brew install freetype glib cairo
+
+If you are using a tarball, you can now proceed to running configure and make
+as with any other standard package. That should leave you with a shared
+library in `src/`, and a few utility programs including `hb-view` and `hb-shape`
+under `util/`.
+
+If you are bootstrapping from git, you need a few more tools before you can
+run `autogen.sh` for the first time. Namely, `pkg-config` and `ragel`.
+
+Again, on Ubuntu / Debian:
+
+    sudo apt-get install autoconf automake libtool pkg-config ragel gtk-doc-tools
+
+and on Fedora, RHEL, CentOS:
+
+    sudo yum install autoconf automake libtool pkgconfig ragel gtk-doc
+
+on the Mac, using MacPorts:
+
+    sudo port install autoconf automake libtool pkgconfig ragel gtk-doc
+
+or using Homebrew:
+
+    brew install autoconf automake libtool pkgconfig ragel gtk-doc
+
+To build the Python bindings, you also need:
+
+    brew install pygobject3
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/CMakeLists.txt b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/CMakeLists.txt
new file mode 100644
index 0000000..6a1a36d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/CMakeLists.txt
@@ -0,0 +1,906 @@
+cmake_minimum_required(VERSION 2.8.0)
+project(harfbuzz)
+
+enable_testing()
+
+## Limit framework build to Xcode generator
+if (BUILD_FRAMEWORK)
+  # for a framework build on macOS, use:
+  # cmake -DBUILD_FRAMEWORK=ON -Bbuild -H. -GXcode && cmake --build build
+  if (NOT "${CMAKE_GENERATOR}" STREQUAL "Xcode")
+    message(FATAL_ERROR
+      "You should use Xcode generator with BUILD_FRAMEWORK enabled")
+  endif ()
+  set (CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_64_BIT)")
+  set (CMAKE_MACOSX_RPATH ON)
+  set (BUILD_SHARED_LIBS ON)
+endif ()
+
+
+## Disallow in-source builds, as CMake generated make files can collide with autotools ones
+if (NOT MSVC AND "${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
+  message(FATAL_ERROR
+    "
+In-source builds are not permitted!  Make a separate folder for"
+    " building, e.g.,"
+    "
+  mkdir build; cd build; cmake .."
+    "
+Before that, remove the files created by this failed run with"
+    "
+  rm -rf CMakeCache.txt CMakeFiles")
+endif ()
+
+
+## HarfBuzz build configurations
+option(HB_HAVE_FREETYPE "Enable freetype interop helpers" OFF)
+option(HB_HAVE_GRAPHITE2 "Enable Graphite2 complementary shaper" OFF)
+option(HB_BUILTIN_UCDN "Use HarfBuzz provided UCDN" ON)
+option(HB_HAVE_GLIB "Enable glib unicode functions" OFF)
+option(HB_HAVE_ICU "Enable icu unicode functions" OFF)
+if (APPLE)
+  option(HB_HAVE_CORETEXT "Enable CoreText shaper backend on macOS" ON)
+  set (CMAKE_MACOSX_RPATH ON)
+endif ()
+if (WIN32)
+  option(HB_HAVE_UNISCRIBE "Enable Uniscribe shaper backend on Windows" OFF)
+  option(HB_HAVE_DIRECTWRITE "Enable DirectWrite shaper backend on Windows" OFF)
+endif ()
+option(HB_BUILD_UTILS "Build harfbuzz utils, needs cairo, freetype, and glib properly be installed" OFF)
+if (HB_BUILD_UTILS)
+  set (HB_HAVE_GLIB ON)
+  set (HB_HAVE_FREETYPE ON)
+endif ()
+
+option(HB_BUILD_SUBSET "Build harfbuzz-subset" ON)
+option(HB_BUILD_TESTS "Build harfbuzz tests" ON)
+
+option(HB_HAVE_GOBJECT "Enable GObject Bindings" OFF)
+if (HB_HAVE_GOBJECT)
+  set (HB_HAVE_GLIB ON)
+endif ()
+
+option(HB_HAVE_INTROSPECTION "Enable building introspection (.gir/.typelib) files" OFF)
+if (HB_HAVE_INTROSPECTION)
+  set (HB_HAVE_GOBJECT ON)
+  set (HB_HAVE_GLIB ON)
+endif ()
+
+option(HB_CHECK OFF "Do a configuration suitable for testing (shared library and enable all options)")
+if (HB_CHECK)
+  set (BUILD_SHARED_LIBS ON)
+  set (HB_BUILD_UTILS ON)
+  set (HB_BUILTIN_UCDN ON)
+  set (HB_HAVE_ICU)
+  set (HB_HAVE_GLIB ON)
+  #set (HB_HAVE_GOBJECT ON)
+  #set (HB_HAVE_INTROSPECTION ON)
+  set (HB_HAVE_FREETYPE ON)
+  set (HB_HAVE_GRAPHITE2 ON)
+  if (WIN32)
+    set (HB_HAVE_UNISCRIBE ON)
+    set (HB_HAVE_DIRECTWRITE ON)
+  elseif (APPLE)
+    set (HB_HAVE_CORETEXT ON)
+  endif ()
+endif ()
+
+include_directories(AFTER
+  ${PROJECT_SOURCE_DIR}/src
+  ${PROJECT_BINARY_DIR}/src
+)
+
+add_definitions(-DHAVE_FALLBACK)
+
+# We need PYTHON_EXECUTABLE to be set for running the tests...
+include (FindPythonInterp)
+
+## Functions and headers
+include (CheckFunctionExists)
+include (CheckIncludeFile)
+macro (check_funcs) # Similar to AC_CHECK_FUNCS of autotools
+  foreach (func_name ${ARGN})
+    string(TOUPPER ${func_name} definition_to_add)
+    check_function_exists(${func_name} HAVE_${definition_to_add})
+    if (${HAVE_${definition_to_add}})
+      add_definitions(-DHAVE_${definition_to_add})
+    endif ()
+  endforeach ()
+endmacro ()
+if (UNIX)
+  list(APPEND CMAKE_REQUIRED_LIBRARIES m)
+endif ()
+check_funcs(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l round)
+check_include_file(unistd.h HAVE_UNISTD_H)
+if (${HAVE_UNISTD_H})
+  add_definitions(-DHAVE_UNISTD_H)
+endif ()
+check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
+if (${HAVE_SYS_MMAN_H})
+  add_definitions(-DHAVE_SYS_MMAN_H)
+endif ()
+check_include_file(xlocale.h HAVE_XLOCALE_H)
+if (${HAVE_XLOCALE_H})
+  add_definitions(-DHAVE_XLOCALE_H)
+endif ()
+check_include_file(stdbool.h HAVE_STDBOOL_H)
+if (${HAVE_STDBOOL_H})
+  add_definitions(-DHAVE_STDBOOL_H)
+endif ()
+
+
+if (MSVC)
+  add_definitions(-wd4244 -wd4267 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS)
+endif ()
+
+
+## Detect if we are running inside a distribution or regular repository folder
+# if (EXISTS "${PROJECT_SOURCE_DIR}/ChangeLog")
+#   # perhaps we are on dist directory
+#   set (IN_HB_DIST TRUE)
+#   #set (HB_VERSION_H "${PROJECT_SOURCE_DIR}/src/hb-version.h")
+# endif ()
+
+
+## Extract variables from Makefile files
+function (extract_make_variable variable makefile_source)
+  string(REGEX MATCH "${variable} = ([^$]+)\\$" temp ${makefile_source})
+  string(REGEX MATCHALL "[^ \n\t\\]+" listVar ${CMAKE_MATCH_1})
+  set (${variable} ${listVar} PARENT_SCOPE)
+endfunction ()
+
+# http://stackoverflow.com/a/27630120
+function (add_prefix_to_list var prefix)
+  set (listVar "")
+  foreach (f ${${var}})
+    list(APPEND listVar "${prefix}${f}")
+  endforeach ()
+  set (${var} "${listVar}" PARENT_SCOPE)
+endfunction ()
+
+file(READ ${PROJECT_SOURCE_DIR}/src/Makefile.sources SRCSOURCES)
+file(READ ${PROJECT_SOURCE_DIR}/util/Makefile.sources UTILSOURCES)
+file(READ ${PROJECT_SOURCE_DIR}/src/hb-ucdn/Makefile.sources UCDNSOURCES)
+
+extract_make_variable(HB_BASE_sources ${SRCSOURCES})
+add_prefix_to_list(HB_BASE_sources "${PROJECT_SOURCE_DIR}/src/")
+extract_make_variable(HB_BASE_headers ${SRCSOURCES})
+add_prefix_to_list(HB_BASE_headers "${PROJECT_SOURCE_DIR}/src/")
+extract_make_variable(HB_FALLBACK_sources ${SRCSOURCES})
+add_prefix_to_list(HB_FALLBACK_sources "${PROJECT_SOURCE_DIR}/src/")
+
+extract_make_variable(HB_SUBSET_sources ${SRCSOURCES})
+add_prefix_to_list(HB_SUBSET_sources "${PROJECT_SOURCE_DIR}/src/")
+
+extract_make_variable(HB_SUBSET_headers ${SRCSOURCES})
+add_prefix_to_list(HB_SUBSET_headers "${PROJECT_SOURCE_DIR}/src/")
+
+extract_make_variable(HB_BASE_RAGEL_GENERATED_sources ${SRCSOURCES})
+#if (IN_HB_DIST)
+  add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src/")
+#else ()
+#  add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/")
+#endif ()
+
+extract_make_variable(HB_VIEW_sources ${UTILSOURCES})
+add_prefix_to_list(HB_VIEW_sources "${PROJECT_SOURCE_DIR}/util/")
+extract_make_variable(HB_SHAPE_sources ${UTILSOURCES})
+add_prefix_to_list(HB_SHAPE_sources "${PROJECT_SOURCE_DIR}/util/")
+extract_make_variable(HB_SUBSET_CLI_sources ${UTILSOURCES})
+add_prefix_to_list(HB_SUBSET_CLI_sources "${PROJECT_SOURCE_DIR}/util/")
+extract_make_variable(HB_OT_SHAPE_CLOSURE_sources ${UTILSOURCES})
+add_prefix_to_list(HB_OT_SHAPE_CLOSURE_sources "${PROJECT_SOURCE_DIR}/util/")
+
+extract_make_variable(LIBHB_UCDN_sources ${UCDNSOURCES})
+add_prefix_to_list(LIBHB_UCDN_sources "${PROJECT_SOURCE_DIR}/src/hb-ucdn/")
+
+
+file(READ configure.ac CONFIGUREAC)
+string(REGEX MATCH "\\[(([0-9]+)\\.([0-9]+)\\.([0-9]+))\\]" HB_VERSION_MATCH ${CONFIGUREAC})
+set (HB_VERSION ${CMAKE_MATCH_1})
+set (HB_VERSION_MAJOR ${CMAKE_MATCH_2})
+set (HB_VERSION_MINOR ${CMAKE_MATCH_3})
+set (HB_VERSION_MICRO ${CMAKE_MATCH_4})
+
+
+## Define ragel tasks
+# if (NOT IN_HB_DIST)
+#  foreach (ragel_output IN ITEMS ${HB_BASE_RAGEL_GENERATED_sources})
+#    string(REGEX MATCH "([^/]+)\\.hh" temp ${ragel_output})
+#    set (target_name ${CMAKE_MATCH_1})
+#    add_custom_command(OUTPUT ${ragel_output}
+#      COMMAND ${RAGEL} -G2 -o ${ragel_output} ${PROJECT_SOURCE_DIR}/src/${target_name}.rl -I ${PROJECT_SOURCE_DIR} ${ARGN}
+#      DEPENDS ${PROJECT_SOURCE_DIR}/src/${target_name}.rl
+#    )
+#    add_custom_target(harfbuzz_${target_name} DEPENDS ${PROJECT_BINARY_DIR}/src/${target_name})
+#  endforeach ()
+
+#  mark_as_advanced(RAGEL)
+# endif ()
+
+
+## Generate hb-version.h
+# if (NOT IN_HB_DIST)
+#  set (HB_VERSION_H_IN "${PROJECT_SOURCE_DIR}/src/hb-version.h.in")
+#  set (HB_VERSION_H "${PROJECT_BINARY_DIR}/src/hb-version.h")
+#  set_source_files_properties("${HB_VERSION_H}" PROPERTIES GENERATED true)
+#  configure_file("${HB_VERSION_H_IN}" "${HB_VERSION_H}.tmp" @ONLY)
+#  execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_if_different
+#    "${HB_VERSION_H}.tmp"
+#    "${HB_VERSION_H}"
+#  )
+#  file(REMOVE "${HB_VERSION_H}.tmp")
+# endif ()
+
+
+## Define sources and headers of the project
+set (project_sources
+  ${HB_BASE_sources}
+  ${HB_BASE_RAGEL_GENERATED_sources}
+
+  ${HB_FALLBACK_sources}
+)
+
+set (subset_project_sources
+  ${HB_SUBSET_sources}
+)
+
+set (project_extra_sources)
+
+set (project_headers
+  #${HB_VERSION_H}
+
+  ${HB_BASE_headers}
+)
+
+set (subset_project_headers
+  ${HB_SUBSET_headers}
+)
+
+
+## Find and include needed header folders and libraries
+if (HB_HAVE_FREETYPE)
+  include (FindFreetype)
+  if (NOT FREETYPE_FOUND)
+    message(FATAL_ERROR "HB_HAVE_FREETYPE was set, but we failed to find it. Maybe add a CMAKE_PREFIX_PATH= to your Freetype2 install prefix")
+  endif ()
+
+  list(APPEND THIRD_PARTY_LIBS ${FREETYPE_LIBRARIES})
+  include_directories(AFTER ${FREETYPE_INCLUDE_DIRS})
+  add_definitions(-DHAVE_FREETYPE=1)
+
+  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-ft.cc)
+  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-ft.h)
+
+  # So check_funcs can find its headers
+  set (CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${FREETYPE_INCLUDE_DIRS})
+  set (CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${FREETYPE_LIBRARIES})
+
+  check_funcs(FT_Get_Var_Blend_Coordinates FT_Set_Var_Blend_Coordinates FT_Done_MM_Var)
+endif ()
+
+if (HB_HAVE_GRAPHITE2)
+  add_definitions(-DHAVE_GRAPHITE2)
+
+  find_path(GRAPHITE2_INCLUDE_DIR graphite2/Font.h)
+  find_library(GRAPHITE2_LIBRARY graphite2)
+
+  include_directories(${GRAPHITE2_INCLUDE_DIR})
+
+  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-graphite2.cc)
+  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-graphite2.h)
+
+  list(APPEND THIRD_PARTY_LIBS ${GRAPHITE2_LIBRARY})
+
+  mark_as_advanced(GRAPHITE2_INCLUDE_DIR GRAPHITE2_LIBRARY)
+endif ()
+
+if (HB_BUILTIN_UCDN)
+  include_directories(src/hb-ucdn)
+  add_definitions(-DHAVE_UCDN)
+
+  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-ucdn.cc)
+  list(APPEND project_extra_sources ${LIBHB_UCDN_sources})
+endif ()
+
+if (HB_HAVE_GLIB)
+  add_definitions(-DHAVE_GLIB)
+
+  # https://github.com/WebKit/webkit/blob/master/Source/cmake/FindGLIB.cmake
+  find_package(PkgConfig)
+  pkg_check_modules(PC_GLIB QUIET glib-2.0)
+
+  find_library(GLIB_LIBRARIES NAMES glib-2.0 HINTS ${PC_GLIB_LIBDIR} ${PC_GLIB_LIBRARY_DIRS})
+  find_path(GLIBCONFIG_INCLUDE_DIR NAMES glibconfig.h HINTS ${PC_LIBDIR} ${PC_LIBRARY_DIRS} ${PC_GLIB_INCLUDEDIR} ${PC_GLIB_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0/include)
+  find_path(GLIB_INCLUDE_DIR NAMES glib.h HINTS ${PC_GLIB_INCLUDEDIR} ${PC_GLIB_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0)
+
+  include_directories(${GLIBCONFIG_INCLUDE_DIR} ${GLIB_INCLUDE_DIR})
+
+  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-glib.cc)
+  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-glib.h)
+
+  list(APPEND THIRD_PARTY_LIBS ${GLIB_LIBRARIES})
+
+  mark_as_advanced(GLIB_LIBRARIES GLIBCONFIG_INCLUDE_DIR GLIB_INCLUDE_DIR)
+endif ()
+
+if (HB_HAVE_ICU)
+  add_definitions(-DHAVE_ICU)
+
+  # https://github.com/WebKit/webkit/blob/master/Source/cmake/FindICU.cmake
+  find_package(PkgConfig)
+  pkg_check_modules(PC_ICU QUIET icu-uc)
+
+  find_path(ICU_INCLUDE_DIR NAMES unicode/utypes.h HINTS ${PC_ICU_INCLUDE_DIRS} ${PC_ICU_INCLUDEDIR})
+  find_library(ICU_LIBRARY NAMES libicuuc cygicuuc cygicuuc32 icuuc HINTS ${PC_ICU_LIBRARY_DIRS} ${PC_ICU_LIBDIR})
+
+  include_directories(${ICU_INCLUDE_DIR})
+
+  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-icu.cc)
+  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-icu.h)
+
+  list(APPEND THIRD_PARTY_LIBS ${ICU_LIBRARY})
+
+  mark_as_advanced(ICU_INCLUDE_DIR ICU_LIBRARY)
+endif ()
+
+if (APPLE AND HB_HAVE_CORETEXT)
+  # Apple Advanced Typography
+  add_definitions(-DHAVE_CORETEXT)
+
+  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-coretext.cc)
+  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-coretext.h)
+
+  if (HB_IOS)
+    find_library(COREFOUNDATION CoreFoundation)
+    if (COREFOUNDATION)
+      list(APPEND THIRD_PARTY_LIBS ${COREFOUNDATION})
+    endif ()
+    mark_as_advanced(COREFOUNDATION)
+
+    find_library(CORETEXT CoreText)
+    if (CORETEXT)
+      list(APPEND THIRD_PARTY_LIBS ${CORETEXT})
+    endif ()
+    mark_as_advanced(CORETEXT)
+
+    find_library(COREGRAPHICS CoreGraphics)
+    if (COREGRAPHICS)
+      list(APPEND THIRD_PARTY_LIBS ${COREGRAPHICS})
+    endif ()
+    mark_as_advanced(COREGRAPHICS)
+  else ()
+    find_library(APPLICATION_SERVICES_FRAMEWORK ApplicationServices)
+    if (APPLICATION_SERVICES_FRAMEWORK)
+      list(APPEND THIRD_PARTY_LIBS ${APPLICATION_SERVICES_FRAMEWORK})
+    endif ()
+
+    mark_as_advanced(APPLICATION_SERVICES_FRAMEWORK)
+  endif ()
+endif ()
+
+if (WIN32 AND HB_HAVE_UNISCRIBE)
+  add_definitions(-DHAVE_UNISCRIBE)
+
+  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-uniscribe.cc)
+  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-uniscribe.h)
+
+  list(APPEND THIRD_PARTY_LIBS usp10 gdi32 rpcrt4)
+endif ()
+
+if (WIN32 AND HB_HAVE_DIRECTWRITE)
+  add_definitions(-DHAVE_DIRECTWRITE)
+
+  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-directwrite.cc)
+  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-directwrite.h)
+
+  list(APPEND THIRD_PARTY_LIBS dwrite rpcrt4)
+endif ()
+
+if (HB_HAVE_GOBJECT)
+  include (FindPerl)
+
+  # Use the hints from glib-2.0.pc to find glib-mkenums
+  find_package(PkgConfig)
+  pkg_check_modules(PC_GLIB QUIET glib-2.0)
+  find_program(GLIB_MKENUMS glib-mkenums
+    HINTS ${PC_glib_mkenums}
+  )
+  set (GLIB_MKENUMS_CMD)
+
+  if (WIN32 AND NOT MINGW)
+    # In Visual Studio builds, shebang lines are not supported
+    # in the standard cmd.exe shell that we use, so we need to
+    # first determine whether glib-mkenums is a Python or PERL
+    # script
+    execute_process(COMMAND "${PYTHON_EXECUTABLE}" "${GLIB_MKENUMS}" --version
+      RESULT_VARIABLE GLIB_MKENUMS_PYTHON
+      OUTPUT_QUIET ERROR_QUIET
+    )
+    if (GLIB_MKENUMS_PYTHON EQUAL 0)
+      message("${GLIB_MKENUMS} is a Python script.")
+      set (GLIB_MKENUMS_CMD "${PYTHON_EXECUTABLE}" "${GLIB_MKENUMS}")
+    else ()
+      execute_process(COMMAND "${PERL_EXECUTABLE}" "${GLIB_MKENUMS}" --version
+        RESULT_VARIABLE GLIB_MKENUMS_PERL
+        OUTPUT_QUIET ERROR_QUIET
+      )
+      if (GLIB_MKENUMS_PERL EQUAL 0)
+        message("${GLIB_MKENUMS} is a PERL script.")
+        set (GLIB_MKENUMS_CMD "${PERL_EXECUTABLE}" "${GLIB_MKENUMS}")
+      endif ()
+      if (NOT GLIB_MKENUMS_PERL EQUAL 0 AND NOT GLIB_MKENUMS_PYTHON EQUAL 0)
+        message(FATAL_ERROR "Unable to determine type of glib-mkenums script")
+      endif ()
+    endif ()
+  else ()
+    set (GLIB_MKENUMS_CMD "${GLIB_MKENUMS}")
+  endif ()
+  if (NOT GLIB_MKENUMS_CMD)
+    message(FATAL_ERROR "HB_HAVE_GOBJECT was set, but we failed to find glib-mkenums, which is required")
+  endif ()
+
+  pkg_check_modules(PC_GOBJECT QUIET gobject-2.0)
+
+  find_library(GOBJECT_LIBRARIES NAMES gobject-2.0 HINTS ${PC_GLIB_LIBDIR} ${PC_GLIB_LIBRARY_DIRS})
+  find_path(GOBJECT_INCLUDE_DIR NAMES glib-object.h HINTS ${PC_GLIB_INCLUDEDIR} ${PC_GLIB_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0)
+
+  include_directories(${GOBJECTCONFIG_INCLUDE_DIR} ${GOBJECT_INCLUDE_DIR})
+  mark_as_advanced(GOBJECT_LIBRARIES GOBJECT_INCLUDE_DIR)
+
+  list(APPEND hb_gobject_sources ${PROJECT_SOURCE_DIR}/src/hb-gobject-structs.cc)
+  list(APPEND hb_gobject_gen_sources
+    ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc
+  )
+  list(APPEND hb_gobject_structs_headers
+    ${PROJECT_SOURCE_DIR}/src/hb-gobject-structs.h
+  )
+  list(APPEND hb_gobject_headers
+    ${PROJECT_SOURCE_DIR}/src/hb-gobject.h
+    ${hb_gobject_structs_headers}
+  )
+  list(APPEND hb_gobject_gen_headers
+    ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
+  )
+
+  add_custom_command(
+    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
+    COMMAND ${GLIB_MKENUMS_CMD}
+      --template=${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.h.tmpl
+      --identifier-prefix hb_
+      --symbol-prefix hb_gobject
+      ${hb_gobject_structs_headers}
+      ${project_headers}
+      > ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h.tmp
+    COMMAND "${CMAKE_COMMAND}"
+      "-DENUM_INPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h.tmp"
+      "-DENUM_OUTPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h"
+      -P ${PROJECT_SOURCE_DIR}/replace-enum-strings.cmake
+    DEPENDS ${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.h.tmpl
+      ${hb_gobject_header}
+      ${project_headers}
+  )
+
+  add_custom_command(
+    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc
+    COMMAND ${GLIB_MKENUMS_CMD}
+      --template=${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.cc.tmpl
+      --identifier-prefix hb_
+      --symbol-prefix hb_gobject
+      ${hb_gobject_header}
+      ${project_headers}
+      > ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc.tmp
+    COMMAND "${CMAKE_COMMAND}"
+      "-DENUM_INPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc.tmp"
+      "-DENUM_OUTPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc"
+      -P ${PROJECT_SOURCE_DIR}/replace-enum-strings.cmake
+    DEPENDS ${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.cc.tmpl
+      ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
+      ${hb_gobject_header}
+      ${project_headers}
+  )
+endif ()
+
+
+## Atomic ops availability detection
+file(WRITE "${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c"
+"		void memory_barrier (void) { __sync_synchronize (); }
+		int atomic_add (int *i) { return __sync_fetch_and_add (i, 1); }
+		int mutex_trylock (int *m) { return __sync_lock_test_and_set (m, 1); }
+		void mutex_unlock (int *m) { __sync_lock_release (m); }
+		int main () { return 0; }
+")
+try_compile(HB_HAVE_INTEL_ATOMIC_PRIMITIVES
+  ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives
+  ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c)
+if (HB_HAVE_INTEL_ATOMIC_PRIMITIVES)
+  add_definitions(-DHAVE_INTEL_ATOMIC_PRIMITIVES)
+endif ()
+
+file(WRITE "${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c"
+"		#include <atomic.h>
+		/* This requires Solaris Studio 12.2 or newer: */
+		#include <mbarrier.h>
+		void memory_barrier (void) { __machine_rw_barrier (); }
+		int atomic_add (volatile unsigned *i) { return atomic_add_int_nv (i, 1); }
+		void *atomic_ptr_cmpxchg (volatile void **target, void *cmp, void *newval) { return atomic_cas_ptr (target, cmp, newval); }
+		int main () { return 0; }
+")
+try_compile(HB_HAVE_SOLARIS_ATOMIC_OPS
+  ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops
+  ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c)
+if (HB_HAVE_SOLARIS_ATOMIC_OPS)
+  add_definitions(-DHAVE_SOLARIS_ATOMIC_OPS)
+endif ()
+
+
+## Define harfbuzz library
+add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_headers})
+target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS})
+
+## Define harfbuzz-subset library
+if (HB_BUILD_SUBSET)
+  add_library(harfbuzz-subset ${subset_project_sources} ${subset_project_headers})
+  add_dependencies(harfbuzz-subset harfbuzz)
+  target_link_libraries(harfbuzz-subset harfbuzz ${THIRD_PARTY_LIBS})
+
+  if (BUILD_SHARED_LIBS)
+    set_target_properties(harfbuzz harfbuzz-subset PROPERTIES VISIBILITY_INLINES_HIDDEN TRUE)
+  endif ()
+endif ()
+
+if (UNIX OR MINGW)
+  # Make symbols link locally
+  include (CheckCXXCompilerFlag)
+  CHECK_CXX_COMPILER_FLAG(-Bsymbolic-functions CXX_SUPPORTS_FLAG_BSYMB_FUNCS)
+  if (CXX_SUPPORTS_FLAG_BSYMB_FUNCS)
+    link_libraries(-Bsymbolic-functions)
+  endif ()
+
+  if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+    # Make sure we don't link to libstdc++
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions")
+    set (CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "m") # libm
+    set (CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "")
+    set_target_properties(harfbuzz PROPERTIES LINKER_LANGUAGE C)
+    if (HB_BUILD_SUBSET)
+      set_target_properties(harfbuzz-subset PROPERTIES LINKER_LANGUAGE C)
+    endif ()
+
+    # No threadsafe statics as we do it ourselves
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics")
+  endif ()
+
+  CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
+  if (COMPILER_SUPPORTS_CXX11)
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+  else()
+    message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
+  endif()
+endif ()
+
+
+## Define harfbuzz-gobject library
+if (HB_HAVE_GOBJECT)
+  add_library(harfbuzz-gobject
+    ${hb_gobject_sources}
+    ${hb_gobject_gen_sources}
+    ${hb_gobject_headers}
+    ${hb_gobject_gen_headers}
+  )
+  include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/src)
+  add_dependencies(harfbuzz-gobject harfbuzz)
+  target_link_libraries(harfbuzz-gobject harfbuzz ${GOBJECT_LIBRARIES} ${THIRD_PARTY_LIBS})
+
+  if (BUILD_SHARED_LIBS)
+    set_target_properties(harfbuzz-gobject PROPERTIES VISIBILITY_INLINES_HIDDEN TRUE)
+  endif ()
+endif ()
+
+if (BUILD_SHARED_LIBS AND WIN32 AND NOT MINGW)
+  add_definitions("-DHB_DLL_EXPORT")
+endif ()
+
+# On Windows, g-ir-scanner requires a DLL build in order for it to work
+if (WIN32)
+  if (NOT BUILD_SHARED_LIBS)
+    message("Building introspection files on Windows requires BUILD_SHARED_LIBS to be enabled.")
+    set (HB_HAVE_INTROSPECTION OFF)
+  endif ()
+endif ()
+
+if (HB_HAVE_INTROSPECTION)
+
+  find_package(PkgConfig)
+  pkg_check_modules(PC_GI QUIET gobject-introspection-1.0)
+
+  find_program(G_IR_SCANNER g-ir-scanner
+    HINTS ${PC_g_ir_scanner}
+  )
+
+  find_program(G_IR_COMPILER g-ir-compiler
+    HINTS ${PC_g_ir_compiler}
+  )
+
+  if (WIN32 AND NOT MINGW)
+    # Note that since we already enable HB_HAVE_GOBJECT
+    # we would already have PYTHON_EXECUTABLE handy
+    set (G_IR_SCANNER_CMD "${PYTHON_EXECUTABLE}" "${G_IR_SCANNER}")
+  else ()
+    set (G_IR_SCANNER_CMD "${G_IR_SCANNER}")
+  endif ()
+
+  # We need to account for the varying output directories
+  # when we build using Visual Studio projects
+  if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio*")
+    set (hb_libpath "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>")
+  else ()
+    set (hb_libpath "$<TARGET_FILE_DIR:harfbuzz-gobject>")
+  endif ()
+
+  # Get the CFlags that we used to build HarfBuzz/HarfBuzz-GObject
+  set (hb_defines_cflags "")
+  foreach (hb_cflag ${hb_cflags})
+    list(APPEND hb_defines_cflags "-D${hb_cflag}")
+  endforeach (hb_cflag)
+
+  # Get the other dependent libraries we used to build HarfBuzz/HarfBuzz-GObject
+  set (extra_libs "")
+  foreach (extra_lib ${THIRD_PARTY_LIBS})
+    # We don't want the .lib extension here...
+    string(REPLACE ".lib" "" extra_lib_stripped "${extra_lib}")
+    list(APPEND extra_libs "--extra-library=${extra_lib_stripped}")
+  endforeach ()
+
+  set (introspected_sources)
+  foreach (f
+    ${project_headers}
+    ${project_sources}
+    ${hb_gobject_gen_sources}
+    ${hb_gobject_gen_headers}
+    ${hb_gobject_sources}
+    ${hb_gobject_headers}
+  )
+    if (WIN32)
+      # Nasty issue: We need to make drive letters lower case,
+      # otherwise g-ir-scanner won't like it and give us a bunch
+      # of invalid items and unresolved types...
+      STRING(SUBSTRING "${f}" 0 1 drive)
+      STRING(SUBSTRING "${f}" 1 -1 path)
+      if (drive MATCHES "[A-Z]")
+        STRING(TOLOWER ${drive} drive_lower)
+        list(APPEND introspected_sources "${drive_lower}${path}")
+      else ()
+        list(APPEND introspected_sources "${f}")
+      endif ()
+    else ()
+      list(APPEND introspected_sources "${f}")
+    endif ()
+  endforeach ()
+
+  file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/src/hb_gir_list)
+  foreach (s ${introspected_sources})
+    file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/src/hb_gir_list "${s}\n")
+  endforeach ()
+
+  # Finally, build the introspection files...
+  add_custom_command(
+    TARGET harfbuzz-gobject
+    POST_BUILD
+    COMMAND ${G_IR_SCANNER_CMD}
+      --warn-all --no-libtool --verbose
+      -n hb
+      --namespace=HarfBuzz
+      --nsversion=0.0
+      --identifier-prefix=hb_
+      --include GObject-2.0
+      --pkg-export=harfbuzz
+      --cflags-begin
+      -I${PROJECT_SOURCE_DIR}/src
+      -I${PROJECT_BINARY_DIR}/src
+      ${hb_includedir_cflags}
+      ${hb_defines_cflags}
+      -DHB_H
+      -DHB_H_IN
+      -DHB_OT_H
+      -DHB_OT_H_IN
+      -DHB_AAT_H
+      -DHB_AAT_H_IN
+      -DHB_GOBJECT_H
+      -DHB_GOBJECT_H_IN
+      -DHB_EXTERN=
+      --cflags-end
+      --library=harfbuzz-gobject
+      --library=harfbuzz
+      -L${hb_libpath}
+      ${extra_libs}
+      --filelist ${CMAKE_CURRENT_BINARY_DIR}/src/hb_gir_list
+      -o ${hb_libpath}/HarfBuzz-0.0.gir
+    DEPENDS harfbuzz-gobject harfbuzz ${CMAKE_CURRENT_BINARY_DIR}/src/hb_gir_list
+  )
+
+  add_custom_command(
+    TARGET harfbuzz-gobject
+    POST_BUILD
+    COMMAND "${G_IR_COMPILER}"
+      --verbose --debug
+      --includedir ${CMAKE_CURRENT_BINARY_DIR}
+      ${hb_libpath}/HarfBuzz-0.0.gir
+      -o ${hb_libpath}/HarfBuzz-0.0.typelib
+    DEPENDS ${hb_libpath}/HarfBuzz-0.0.gir harfbuzz-gobject
+  )
+endif ()
+
+
+## Additional framework build configs
+if (BUILD_FRAMEWORK)
+  set (CMAKE_MACOSX_RPATH ON)
+  set_target_properties(harfbuzz PROPERTIES
+    FRAMEWORK TRUE
+    PUBLIC_HEADER "${project_headers}"
+    XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
+  )
+  set (MACOSX_FRAMEWORK_IDENTIFIER "harfbuzz")
+  set (MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${HB_VERSION}")
+  set (MACOSX_FRAMEWORK_BUNDLE_VERSION "${HB_VERSION}")
+endif ()
+
+
+## Additional harfbuzz build artifacts
+if (HB_BUILD_UTILS)
+  # https://github.com/WebKit/webkit/blob/master/Source/cmake/FindCairo.cmake
+  find_package(PkgConfig)
+  pkg_check_modules(PC_CAIRO QUIET cairo)
+
+  find_path(CAIRO_INCLUDE_DIRS NAMES cairo.h HINTS ${PC_CAIRO_INCLUDEDIR} ${PC_CAIRO_INCLUDE_DIRS} PATH_SUFFIXES cairo)
+  find_library(CAIRO_LIBRARIESNAMES cairo HINTS ${PC_CAIRO_LIBDIR} ${PC_CAIRO_LIBRARY_DIRS})
+
+  add_definitions("-DPACKAGE_NAME=\"HarfBuzz\"")
+  add_definitions("-DPACKAGE_VERSION=\"${HB_VERSION}\"")
+  include_directories(${CAIRO_INCLUDE_DIRS})
+
+  add_executable(hb-view ${HB_VIEW_sources})
+  target_link_libraries(hb-view harfbuzz ${CAIRO_LIBRARIESNAMES})
+
+  add_executable(hb-shape ${HB_SHAPE_sources})
+  target_link_libraries(hb-shape harfbuzz)
+
+  add_executable(hb-subset ${HB_SUBSET_CLI_sources})
+  target_link_libraries(hb-subset harfbuzz harfbuzz-subset)
+
+  add_executable(hb-ot-shape-closure ${HB_OT_SHAPE_CLOSURE_sources})
+  target_link_libraries(hb-ot-shape-closure harfbuzz)
+
+  mark_as_advanced(CAIRO_INCLUDE_DIRS CAIRO_LIBRARIESNAMES)
+endif ()
+
+
+## Install
+include (GNUInstallDirs)
+
+if (NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
+  install(FILES ${project_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz)
+  if (HB_HAVE_GOBJECT)
+    install(FILES ${hb_gobject_headers} ${hb_gobject_gen_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz)
+  endif ()
+endif ()
+
+if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
+  install(TARGETS harfbuzz
+    EXPORT harfbuzzConfig
+    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    FRAMEWORK DESTINATION Library/Frameworks
+  )
+  install(EXPORT harfbuzzConfig
+      NAMESPACE harfbuzz::
+      DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/harfbuzz
+  )
+  if (HB_BUILD_UTILS)
+    if (WIN32 AND BUILD_SHARED_LIBS)
+      install(TARGETS harfbuzz-subset
+        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+      )
+    endif ()
+    install(TARGETS hb-view
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    )
+    install(TARGETS hb-subset
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    )
+
+    install(TARGETS hb-shape
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    )
+
+    install(TARGETS hb-ot-shape-closure
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    )
+  endif ()
+  if (HB_HAVE_GOBJECT)
+    install(TARGETS harfbuzz-gobject
+      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    )
+    if (HB_HAVE_INTROSPECTION)
+      if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio*")
+        set (hb_libpath "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>")
+      else ()
+        set (hb_libpath "$<TARGET_FILE_DIR:harfbuzz-gobject>")
+      endif ()
+
+      install(FILES "${hb_libpath}/HarfBuzz-0.0.gir"
+        DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/gir-1.0
+      )
+
+      install(FILES "${hb_libpath}/HarfBuzz-0.0.typelib"
+        DESTINATION ${CMAKE_INSTALL_LIBDIR}/girepository-1.0
+      )
+    endif ()
+  endif ()
+endif ()
+
+if (UNIX AND CMAKE_GENERATOR STREQUAL "Ninja")
+  if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcolor-diagnostics")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcolor-diagnostics")
+  endif ()
+  if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-color")
+  endif ()
+endif ()
+
+
+if (HB_BUILD_TESTS)
+  ## src/ executables
+  foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag test-unicode-ranges)
+    set (prog_name ${prog})
+    if (${prog_name} STREQUAL "test")
+      # test can not be used as a valid executable name on cmake, lets special case it
+      set (prog_name test-test)
+    endif ()
+    add_executable(${prog_name} ${PROJECT_SOURCE_DIR}/src/${prog}.cc)
+    target_link_libraries(${prog_name} harfbuzz ${THIRD_PARTY_LIBS})
+  endforeach ()
+  set_target_properties(hb-ot-tag PROPERTIES COMPILE_FLAGS "-DMAIN")
+
+  ## Tests
+  if (UNIX OR MINGW)
+    if (BUILD_SHARED_LIBS)
+      # generate harfbuzz.def after build completion
+      add_custom_command(TARGET harfbuzz POST_BUILD
+        COMMAND "${PYTHON_EXECUTABLE}" ${PROJECT_SOURCE_DIR}/src/gen-def.py ${PROJECT_BINARY_DIR}/harfbuzz.def ${project_headers}
+        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src)
+
+      add_test(NAME check-static-inits.sh
+        COMMAND ${PROJECT_SOURCE_DIR}/src/check-static-inits.sh
+        WORKING_DIRECTORY ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/harfbuzz.dir/src # ugly hack
+      )
+      add_test(NAME check-libstdc++.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-libstdc++.sh)
+      add_test(NAME check-symbols.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-symbols.sh)
+
+      set_tests_properties(
+        check-static-inits.sh check-libstdc++.sh check-symbols.sh
+        PROPERTIES
+          ENVIRONMENT "libs=.;srcdir=${PROJECT_SOURCE_DIR}/src"
+          SKIP_RETURN_CODE 77)
+    endif ()
+
+    add_test(NAME check-c-linkage-decls.sh COMMAND ./check-c-linkage-decls.sh)
+    add_test(NAME check-header-guards.sh COMMAND ./check-header-guards.sh)
+    add_test(NAME check-externs.sh COMMAND ./check-externs.sh)
+    add_test(NAME check-includes.sh COMMAND ./check-includes.sh)
+    set_tests_properties(
+      check-c-linkage-decls.sh check-header-guards.sh check-externs.sh check-includes.sh
+      PROPERTIES
+        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src
+        SKIP_RETURN_CODE 77)
+  endif ()
+
+  # Needs to come last so that variables defined above are passed to
+  # subdirectories.
+  add_subdirectory(test)
+endif ()
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/COPYING b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/COPYING
new file mode 100644
index 0000000..9d1056f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/COPYING
@@ -0,0 +1,36 @@
+HarfBuzz is licensed under the so-called "Old MIT" license.  Details follow.
+For parts of HarfBuzz that are licensed under different licenses see individual
+files names COPYING in subdirectories where applicable.
+
+Copyright © 2010,2011,2012  Google, Inc.
+Copyright © 2012  Mozilla Foundation
+Copyright © 2011  Codethink Limited
+Copyright © 2008,2010  Nokia Corporation and/or its subsidiary(-ies)
+Copyright © 2009  Keith Stribley
+Copyright © 2009  Martin Hosken and SIL International
+Copyright © 2007  Chris Wilson
+Copyright © 2006  Behdad Esfahbod
+Copyright © 2005  David Turner
+Copyright © 2004,2007,2008,2009,2010  Red Hat, Inc.
+Copyright © 1998-2004  David Turner and Werner Lemberg
+
+For full copyright notices consult the individual files in the package.
+
+
+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.
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/ChangeLog b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/ChangeLog
new file mode 100644
index 0000000..135b034
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/ChangeLog
@@ -0,0 +1,104125 @@
+commit fe532923101586e316b300d419a337d357cd93da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 28 20:47:58 2019 -0500
+
+    [CI] Peg CircleCI badge link to master branch
+
+    [skip ci]
+
+ README.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9569819e24f72926a5b26e4c8a86d815c0132745
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 28 20:43:43 2019 -0500
+
+    [ci] Peg build status badges to master branch
+
+    [skip ci]
+
+ README.md | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1e29906a77c275c34a440a416654a514810485e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 28 20:38:15 2019 -0500
+
+    Switch README / README.md
+
+    [skip ci]
+
+ README    | 19 +------------------
+ README.md | 19 ++++++++++++++++++-
+ 2 files changed, 19 insertions(+), 19 deletions(-)
+
+commit 9a1df82e3f13fbd4488ee9955814bbb5d0957074
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 28 14:15:18 2019 -0500
+
+    [uniscribe] Whitelist function type cast
+
+ src/hb-uniscribe.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 6e1c3eaf7005d06c89f0807f693aadd835aa0468
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 28 14:12:41 2019 -0500
+
+    Fix sign comparison error
+
+ src/hb-open-file.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 9db7a7da6339eacbb6c699fa1939bbd7e9e148f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 28 14:09:59 2019 -0500
+
+    Fix warning
+
+    c:\projects\harfbuzz\src\hb-ot-color-cbdt-table.hh(59): warning C4146:
+    unary minus operator applied to unsigned type, result still unsigned
+    [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
+
+ src/hb-ot-color-cbdt-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 51b584880e550545ced3aa8ba4ccad3cf79bb53e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 28 14:09:45 2019 -0500
+
+    [pragma] Silence MSVC unknown-pragma warning
+
+ src/hb.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 60022ecced202760daa7f75516bba6a4689a49de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 26 14:04:51 2019 +0100
+
+    Fix -Wcast-function-type warnings in util/ with gcc 4.8
+
+ src/hb.hh       | 1 +
+ util/options.hh | 5 ++++-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit a9321cb5f88cae1dafbd623b8bf7c68a82a3c211
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 25 16:11:45 2019 +0100
+
+    Fix mac test
+
+ test/shaping/data/in-house/tests/macos.tests | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f39809752909f193a9c60f4357a88ea1c3ce1162
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 25 16:08:25 2019 +0100
+
+    More static constexpr
+
+ src/hb-machinery.hh  | 10 +++++-----
+ src/hb-set-digest.hh | 14 +++++++-------
+ 2 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 06358ae9746ae72c0917e8a5f294d14fd695f380
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 25 15:11:47 2019 +0100
+
+    [AAT] Add test for recent Ligature stack fix, using Zapfino on Mac
+
+ test/shaping/data/in-house/tests/macos.tests | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit e970de48bcbdccd29350f331288c0a98f7846c16
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 18:16:17 2019 +0100
+
+    [AAT] Minor sign
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a371a28cda23805cbea22867e0a3ed53ecb811ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 18:12:25 2019 +0100
+
+    [AAT] Use a ring buffer for ligature stack
+
+    I think Apple does very similarly, but probably with a stack size
+    of 16.
+    We do it with a stack size that is currently set to 64.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1531
+
+ src/hb-aat-layout-morx-table.hh | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+commit 7886b1578fceee368ae5afe206ff98f50e1c42e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 18:06:17 2019 +0100
+
+    Whitespace
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b976940243bf1f174bd6abb85955789ef2631d24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 18:01:07 2019 +0100
+
+    [AAT] Handle transition errors during machine operation
+
+    Before we used to give up.  Now, just ignore error and continue
+    processing.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1531
+
+ src/hb-aat-layout-common.hh     |  3 +--
+ src/hb-aat-layout-kerx-table.hh | 21 +++++++--------------
+ src/hb-aat-layout-morx-table.hh | 34 +++++++++++++---------------------
+ 3 files changed, 21 insertions(+), 37 deletions(-)
+
+commit e234bb6a428cd6c8ddf57eb078cd51b9d1f25ba8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 17:23:11 2019 +0100
+
+    [AAT] Ignore machine errors and continue
+
+ src/hb-aat-layout-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1ec90514f69efc329691186466f62373efa863b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 17:21:41 2019 +0100
+
+    [AAT] Minor
+
+ src/hb-aat-layout-common.hh     | 12 ++++----
+ src/hb-aat-layout-kerx-table.hh | 38 +++++++++++------------
+ src/hb-aat-layout-morx-table.hh | 68
+ ++++++++++++++++++++---------------------
+ 3 files changed, 59 insertions(+), 59 deletions(-)
+
+commit 299eca0c3b28c99add006420bc667431d874fb2e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 17:17:00 2019 +0100
+
+    [AAT] Handle out-of-bounds classes
+
+ src/hb-aat-layout-common.hh | 13 ++++++-------
+ 1 file changed, 6 insertions(+), 7 deletions(-)
+
+commit c4623db4a3f963394db940449007fa3312460993
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 17:10:12 2019 +0100
+
+    [AAT] Minor
+
+ src/hb-aat-layout-common.hh | 11 ++++-------
+ 1 file changed, 4 insertions(+), 7 deletions(-)
+
+commit c4e36f97b6df1eb5fba588b09ae1630bb5c49589
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 17:06:16 2019 +0100
+
+    [AAT] Minor
+
+ src/hb-aat-layout-common.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit f60282c5bff4a317ba3180e3519274963c6e8849
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 16:29:09 2019 +0100
+
+    More pragma control
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=924848
+
+ src/hb.hh | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+commit fd0889f903ac1ba2da06e77eed8424395ea85a90
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 16:12:52 2019 +0100
+
+    Comment
+
+ src/hb-ot-shape.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 00f06d1aa61e9a6d01b5943ce55ba2b0c40237ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 16:11:05 2019 +0100
+
+    Fix test
+
+ test/shaping/data/in-house/tests/cluster.tests | 1 -
+ test/shaping/data/in-house/tests/emoji.tests   | 3 ++-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 9f314177336f9551756944e0e555614c9189c7a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 16:08:33 2019 +0100
+
+    Form cluster for Emoji sub-region tag sequences
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1556
+
+ src/hb-ot-shape.cc                                       |  13
+ +++++++++++++
+ .../fonts/8d9c4b193808b8bde94389ba7831c1fc6f9e794e.ttf   | Bin 0 ->
+ 1548 bytes
+ test/shaping/data/in-house/tests/cluster.tests           |   1 +
+ 3 files changed, 14 insertions(+)
+
+commit 5034f8f2ab8f53eb0395e6f6ce2f8da69a08460d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 12:50:38 2019 +0100
+
+    Fix macos tests with previous commit
+
+ test/shaping/data/in-house/tests/macos.tests | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 3ecda71041a7239ca37ec7b888809efe8f595a19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 12:08:23 2019 +0100
+
+    Adjust mark offsets when zeroing from fallback mark positioning code
+
+    Adjust tests.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1532
+
+ src/hb-ot-shape-fallback.cc                        | 31
+ +++++++++++++++-------
+ src/hb-ot-shape-fallback.hh                        |  3 ++-
+ src/hb-ot-shape.cc                                 |  3 ++-
+ .../in-house/tests/arabic-fallback-shaping.tests   |  2 +-
+ test/shaping/data/in-house/tests/cluster.tests     |  2 +-
+ .../data/in-house/tests/fallback-positioning.tests |  4 +--
+ 6 files changed, 30 insertions(+), 15 deletions(-)
+
+commit 36fb2b4da9718a86978fa07c99ba4345f7ca9b4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 23 20:53:57 2019 +0100
+
+    [AAT] In InsertionChain, set mark to previous-position if inserting
+
+    Fixes MORX-31
+
+ src/hb-aat-layout-morx-table.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit cbe0ed117ac86179183c389977d15981d26524f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 23 20:45:18 2019 +0100
+
+    [AAT] Re-enable tests MORX-31 and MORX-41
+
+ test/shaping/data/text-rendering-tests/DISABLED         | 3 ---
+ test/shaping/data/text-rendering-tests/Makefile.sources | 2 ++
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit baf4d6a68a031bf65e17ccd5dac15fe7d0df33b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 23 20:36:07 2019 +0100
+
+    [AAT] Remove mark_set from InsertionChain
+
+ src/hb-aat-layout-morx-table.hh | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit 410731d3fb678365c07a4d1745b72b6bb3142b70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 23 20:30:48 2019 +0100
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/extract-tests.py    | 2 +-
+ test/shaping/data/text-rendering-tests/tests/MORX-14.tests | 2 +-
+ test/shaping/data/text-rendering-tests/tests/MORX-32.tests | 8 ++++----
+ test/shaping/data/text-rendering-tests/tests/MORX-41.tests | 4 ++--
+ 4 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 0b2fa342de88bbe609b2147444e56c94680cbd38
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 16:36:00 2019 +0100
+
+    More of previous
+
+ src/hb-subset-cff1.cc | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit a5e5dd8b42b40c3647e06e6bb62580af77bed42b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 16:30:07 2019 +0100
+
+    Fix sign-compare error resulted from promoting unsigned integers to
+    signed larger ints
+
+    Clang and gcc know not to warn in these cases, but not nonmainstream
+    compilers
+
+ src/hb-subset-cff2.cc | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 32379bbf10726bb7ed2e507d0a6b5917c350e056
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 12:55:29 2019 +0100
+
+    Cast HB_UNTAG results to uint8_t
+
+ src/hb-common.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 83d4aa5ca9a39dbe66db9b81b34f5b568503bd7e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 12:52:23 2019 +0100
+
+    More -Wcast-error fix
+
+ src/hb-dsalgs.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 447323b85a7b68bd41561a87c91431cd05227b97
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 12:45:40 2019 +0100
+
+    Better fix for -Wcast-align errors
+
+ src/hb-font.cc          | 33 +++++++++------------------------
+ src/hb-ft.cc            | 14 ++++----------
+ src/hb-machinery.hh     | 16 ++++++++++++++++
+ src/hb-ot-cmap-table.hh |  7 ++-----
+ src/hb-ot-font.cc       | 14 ++++----------
+ 5 files changed, 35 insertions(+), 49 deletions(-)
+
+commit 81ec543d800c4a94b5e608fd87e84d33d7dae8ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 12:43:12 2019 +0100
+
+    More -Wcast-error fixes
+
+ src/hb-font.cc    | 8 ++++----
+ src/hb-ft.cc      | 2 +-
+ src/hb-ot-font.cc | 4 ++--
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 90772725493108c79487a67620f0240e5d68f4ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 12:40:18 2019 +0100
+
+    pragma GCC diagnostic error   "-Wsign-compare"
+
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8d05bf7dc0094e75be07ca1f7ef852a1e45d0687
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 12:34:05 2019 +0100
+
+    Fix cast-align error
+
+    If compiler doesn't inline StructAtOffset, this was an error since we
+    only disable cast-align at call-site.  So, move the cast out.
+
+    ../src/hb-machinery.hh: In instantiation of 'const Type&
+    StructAtOffset(const void*, unsigned int) [with Type = unsigned int]':
+    ../src/hb-font.cc:146:85:   required from here
+    ../src/hb-machinery.hh:63:12: error: cast from 'const char*' to
+    'const unsigned int*' increases required alignment of target type
+    [-Werror=cast-align]
+     { return * reinterpret_cast<const Type*> ((const char *) P +
+     offset); }
+                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+    ../src/hb-machinery.hh: In instantiation of 'Type&
+    StructAtOffset(void*, unsigned int) [with Type = unsigned int]':
+    ../src/hb-font.cc:147:79:   required from here
+    ../src/hb-machinery.hh:66:12: error: cast from 'char*' to 'unsigned
+    int*' increases required alignment of target type [-Werror=cast-align]
+     { return * reinterpret_cast<Type*> ((char *) P + offset); }
+                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ src/hb-font.cc          | 8 ++++----
+ src/hb-ft.cc            | 6 +++---
+ src/hb-ot-cmap-table.hh | 4 ++--
+ src/hb-ot-font.cc       | 4 ++--
+ 4 files changed, 11 insertions(+), 11 deletions(-)
+
+commit b270cee6c5800c019aafb55e9ca9d7e92a92d3ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 12:29:05 2019 +0100
+
+    [CI] Remove gcc 4.2 bots
+
+    We don't support that version anymore.
+
+ .circleci/config.yml | 25 -------------------------
+ 1 file changed, 25 deletions(-)
+
+commit 70a52d6bd8c45630ca90e945fc4d716fe9114010
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 12:15:23 2019 +0100
+
+    Convert all other enum class consts to static constexpr
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1553
+
+ src/hb-cff-interp-common.hh |  2 +-
+ src/hb-iter.hh              |  2 +-
+ src/hb-machinery.hh         | 12 ++++++------
+ src/hb-open-type.hh         |  8 ++++----
+ src/hb-set-digest.hh        |  4 ++--
+ src/hb-set.hh               | 10 +++++-----
+ src/hb-vector.hh            |  2 +-
+ 7 files changed, 20 insertions(+), 20 deletions(-)
+
+commit 5d4b0377b99ddc4112b8ffb2b787eac0b383081c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 12:11:24 2019 +0100
+
+    Convert unsigned enum class consts to static constexpr
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1553
+
+ src/hb-aat-layout-common.hh     | 6 +++---
+ src/hb-aat-layout-kerx-table.hh | 2 +-
+ src/hb-buffer.hh                | 2 +-
+ src/hb-open-type.hh             | 2 +-
+ src/hb-ot-kern-table.hh         | 4 ++--
+ src/hb-ot-layout-common.hh      | 2 +-
+ src/hb-ot-layout.cc             | 4 ++--
+ 7 files changed, 11 insertions(+), 11 deletions(-)
+
+commit ef00654962204ae706b276871e2b6758fbbf69e0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 12:08:57 2019 +0100
+
+    Convert tag enum class consts to static constexpr
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1553
+
+ src/hb-aat-fdsc-table.hh        |  2 +-
+ src/hb-aat-layout-ankr-table.hh |  2 +-
+ src/hb-aat-layout-bsln-table.hh |  2 +-
+ src/hb-aat-layout-feat-table.hh |  2 +-
+ src/hb-aat-layout-just-table.hh |  2 +-
+ src/hb-aat-layout-kerx-table.hh |  2 +-
+ src/hb-aat-layout-lcar-table.hh |  2 +-
+ src/hb-aat-layout-morx-table.hh |  6 +++---
+ src/hb-aat-layout-trak-table.hh |  2 +-
+ src/hb-aat-ltag-table.hh        |  2 +-
+ src/hb-ot-cff1-table.hh         |  2 +-
+ src/hb-ot-cff2-table.hh         |  2 +-
+ src/hb-ot-cmap-table.hh         |  2 +-
+ src/hb-ot-color-cbdt-table.hh   |  4 ++--
+ src/hb-ot-color-colr-table.hh   |  2 +-
+ src/hb-ot-color-cpal-table.hh   |  2 +-
+ src/hb-ot-color-sbix-table.hh   |  2 +-
+ src/hb-ot-color-svg-table.hh    |  2 +-
+ src/hb-ot-gasp-table.hh         |  2 +-
+ src/hb-ot-glyf-table.hh         |  4 ++--
+ src/hb-ot-hdmx-table.hh         |  2 +-
+ src/hb-ot-head-table.hh         |  2 +-
+ src/hb-ot-hhea-table.hh         |  4 ++--
+ src/hb-ot-hmtx-table.hh         | 12 ++++++------
+ src/hb-ot-kern-table.hh         |  6 +++---
+ src/hb-ot-layout-base-table.hh  |  2 +-
+ src/hb-ot-layout-gdef-table.hh  |  2 +-
+ src/hb-ot-layout-gpos-table.hh  |  2 +-
+ src/hb-ot-layout-gsub-table.hh  |  2 +-
+ src/hb-ot-layout-jstf-table.hh  |  2 +-
+ src/hb-ot-math-table.hh         |  2 +-
+ src/hb-ot-maxp-table.hh         |  2 +-
+ src/hb-ot-name-table.hh         |  2 +-
+ src/hb-ot-os2-table.hh          |  2 +-
+ src/hb-ot-post-table.hh         |  2 +-
+ src/hb-ot-stat-table.hh         |  2 +-
+ src/hb-ot-var-avar-table.hh     |  2 +-
+ src/hb-ot-var-fvar-table.hh     |  2 +-
+ src/hb-ot-var-hvar-table.hh     |  8 ++++----
+ src/hb-ot-var-mvar-table.hh     |  2 +-
+ src/hb-ot-vorg-table.hh         |  2 +-
+ 41 files changed, 56 insertions(+), 56 deletions(-)
+
+commit 39e1b6d03f71ccb8f18d64dfbff64acfaf02970b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 12:07:43 2019 +0100
+
+    Convert boolean enum class consts to static constexpr
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1553
+
+ src/hb-aat-layout-common.hh     |  4 ++--
+ src/hb-aat-layout-kerx-table.hh |  4 ++--
+ src/hb-aat-layout-morx-table.hh |  8 ++++----
+ src/hb-dsalgs.hh                | 16 ++++++++--------
+ src/hb-ot-kern-table.hh         |  4 ++--
+ src/hb-ot-layout.cc             |  4 ++--
+ 6 files changed, 20 insertions(+), 20 deletions(-)
+
+commit 271cb7c1c0f49c7af786daa5d5310b9f08142148
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 12:05:35 2019 +0100
+
+    Make some enum constants unsigned
+
+ src/hb-aat-layout-common.hh | 6 +++---
+ src/hb-buffer.hh            | 2 +-
+ src/hb-ot-layout.cc         | 8 ++++----
+ 3 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 3d9a6e62662fb769e0f785fa7a43df806988d2a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 12:02:06 2019 +0100
+
+    Whitespace
+
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c81f02fd06fcbc4426c9e3255833f8d7057cc97a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 22 12:00:44 2019 +0100
+
+    pragma GCC diagnostic error   "-Wvla"
+
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ff98109455bfbf92f7633262bc570b05d15d5d01
+Author: Alfie John <alfie@alfie.wtf>
+Date:   Tue Jan 22 19:58:36 2019 +1100
+
+    Fix grammar
+
+ docs/usermanual-clusters.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e9c0f5e714cc62bcf6349b86b13e1c031f9bb764
+Author: Alfie John <alfie@alfie.wtf>
+Date:   Tue Jan 22 00:03:02 2019 +0000
+
+    Grammar fix
+
+ docs/usermanual-clusters.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 789396ed6bf2c76c1bb955e80efb43f75e3c61d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 20 20:09:10 2019 -0500
+
+    Remove wrongly added files
+
+ test/api/test-ot-extents-cff                        | Bin 8574336 ->
+ 0 bytes
+ .../test-ot-extents-cff.dSYM/Contents/Info.plist    |  20
+ --------------------
+ .../Contents/Resources/DWARF/test-ot-extents-cff    | Bin 7650053 ->
+ 0 bytes
+ 3 files changed, 20 deletions(-)
+
+commit 380c3cffb9353083913a3bb505c2c62367613096
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 20 19:51:08 2019 -0500
+
+    Use enum for class constant
+
+ src/hb-cff-interp-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6d042a18e7079e07a2b2f465a6a56483a42ef189
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 20 19:49:59 2019 -0500
+
+    [CFF] Use enum for tableTag
+
+ src/hb-ot-cff1-table.hh | 2 +-
+ src/hb-ot-cff2-table.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit c1cbbb94595641f0609cc8d2dbe8415540c10f77
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 20 19:47:52 2019 -0500
+
+    Use static constexpr for large class constants
+
+ src/hb-map.hh | 2 +-
+ src/hb-set.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 30ae62779f1a68c5657ab27bc7e77496ba8a906c
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Jan 21 16:44:48 2019 +0200
+
+    Regular spaces will do
+
+ docs/usermanual-getting-started.xml | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit ed62551d67ac5bb8dbfaf3fa5eb51013157b214a
+Author: Alfie John <alfie@alfie.wtf>
+Date:   Mon Jan 21 05:00:01 2019 +0000
+
+    Adding leading space for code example
+
+ docs/usermanual-getting-started.xml | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 3e332544db35ca08de767ecab01b489a9905c559
+Author: Alfie John <alfie@alfie.wtf>
+Date:   Mon Jan 21 04:54:27 2019 +0000
+
+    Fix description of example
+
+ docs/usermanual-getting-started.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2144ca9f01d01b6de386d17ada73a288372ee553
+Author: Alfie John <alfie@alfie.wtf>
+Date:   Mon Jan 21 04:47:05 2019 +0000
+
+    Added option to build docs to docs
+
+ docs/usermanual-install-harfbuzz.xml | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 043b610fa698ed247347dfaa042f032f3fd3f572
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 19 09:20:46 2019 -0500
+
+    Fix sign compare warnings
+
+    ../../third_party/harfbuzz-ng/src/src/hb-map.hh(56,45):  warning:
+    comparison of integers of different signs: 'const hb_codepoint_t'
+    (aka 'const unsigned int') and 'hb_map_t::(anonymous enum
+    at ../../third_party/harfbuzz-ng/src/src/hb-map.hh:169:3)'
+    [-Wsign-compare]
+        bool is_unused () const    { return key == INVALID; }
+
+ src/hb-map.hh | 2 +-
+ src/hb-set.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit ce317d032061d81c520180a338172ce38b427135
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 19 09:18:03 2019 -0500
+
+    Fix warning
+
+    warning: '_WIN64' is not defined, evaluates to 0 [-Wundef]
+
+ src/hb-dsalgs.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0c2bd1b160fda4e77919889ac80f9460967fa251
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jan 19 16:30:07 2019 +0330
+
+    [dwrite] Fix delete-non-virtual-dtor warning (#1550)
+
+ src/hb-directwrite.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 89bcfb204c736f5962d377896af2c1350f179882
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 14:59:18 2019 -0500
+
+    Remove TRACE_COLLECT_GLYPHS
+
+ src/hb-debug.hh                | 13 -------------
+ src/hb-ot-layout-gpos-table.hh | 26 ++++----------------------
+ src/hb-ot-layout-gsub-table.hh | 21 +++------------------
+ src/hb-ot-layout-gsubgpos.hh   | 12 +-----------
+ 4 files changed, 8 insertions(+), 64 deletions(-)
+
+commit f13b6786f0aefd2060ca976f7e42db7387b49450
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 14:53:54 2019 -0500
+
+    [pragma] Only add if GCC or clang
+
+ src/hb.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit c2ea7a9da463c567d321233b23813c59762841bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 13:45:33 2019 -0500
+
+    [directwrite] More fix
+
+ src/hb-directwrite.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9714d3ec5c45b2fe460fa6b21bdb3487c62029d3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 18 21:55:21 2019 +0330
+
+    [dwrite] Try to fix delete-non-virtual-dtor warnings
+
+    Fixes #1548 hopefully
+
+ src/hb-directwrite.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0772c06f96c3f5a319485c390416531b8125251b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 12:53:06 2019 -0500
+
+    Remove tracing from closure
+
+ src/hb-debug.hh                | 13 -------------
+ src/hb-ot-layout-gsub-table.hh | 15 ++-------------
+ src/hb-ot-layout-gsubgpos.hh   | 14 +-------------
+ 3 files changed, 3 insertions(+), 39 deletions(-)
+
+commit d9f6be3a61edfe9e1bce01ea9b11e2bcb16f9618
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 12:48:01 2019 -0500
+
+    Fix -Wundef errors with __GNUC__
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1549
+
+ src/hb-common.h |  4 ++--
+ src/hb.hh       | 10 +++++-----
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 28917e58f973e5875d3ef3004c16e1ee1a5a973c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Jan 18 09:43:51 2019 -0800
+
+    init interp_env_t::hintmask_size
+
+    fixes issue #1547
+
+ src/hb-cff-interp-cs-common.hh                      |   1 +
+ test/api/test-ot-extents-cff                        | Bin 0 ->
+ 8574336 bytes
+ .../test-ot-extents-cff.dSYM/Contents/Info.plist    |  20
+ ++++++++++++++++++++
+ .../Contents/Resources/DWARF/test-ot-extents-cff    | Bin 0 ->
+ 7650053 bytes
+ 4 files changed, 21 insertions(+)
+
+commit 9b4e51b2e44d7dea026b1f9201d2f83277bab1cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 12:23:02 2019 -0500
+
+    [pragma] Enable error -Wdelete-non-virtual-dtor
+
+    Currently fails directwrite backend.
+
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit e65272281c71d416f0ff886a55536597665b9dc3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 12:22:07 2019 -0500
+
+    [directwrite] Fix error
+
+    hb-directwrite.cc: In constructor 'TextAnalysis::TextAnalysis(const
+    wchar_t*, uint32_t, const wchar_t*, DWRITE_READING_DIRECTION)':
+    hb-directwrite.cc:489:18: error: 'TextAnalysis::mText' will be
+    initialized after [-Werror=reorder]
+       const wchar_t* mText;
+                      ^~~~~
+    hb-directwrite.cc:488:12: error:   'uint32_t
+    TextAnalysis::mTextLength' [-Werror=reorder]
+       uint32_t mTextLength;
+                ^~~~~~~~~~~
+    hb-directwrite.cc:282:3: error:   when initialized here
+    [-Werror=reorder]
+       TextAnalysis (const wchar_t* text, uint32_t textLength,
+       ^~~~~~~~~~~~
+    hb-directwrite.cc: In function 'hb_bool_t
+    _hb_directwrite_shape_full(hb_shape_plan_t*, hb_font_t*, hb_buffer_t*,
+    const hb_feature_t*, unsigned int, float)':
+
+ src/hb-directwrite.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b900f78088abb87ebec263474b2802593afa0264
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 10:08:23 2019 -0500
+
+    [pragma] More cast-align whitelist
+
+ src/hb-font.cc          | 20 +++++++++++++++-----
+ src/hb-ft.cc            |  6 ++++++
+ src/hb-ot-cmap-table.hh |  3 +++
+ src/hb-ot-font.cc       |  6 ++++++
+ 4 files changed, 30 insertions(+), 5 deletions(-)
+
+commit 0d8b931bbeee9743d2e3bd37dd2fa9dffb807eaa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 10:03:43 2019 -0500
+
+    [pragma] Allow cast-align in hb-font.cc
+
+    ../src/hb-machinery.hh: In instantiation of 'const Type&
+    StructAtOffset(const void*, unsigned int) [with Type = unsigned int]':
+    ../src/hb-font.cc:144:85:   required from here
+    ../src/hb-machinery.hh:63:12: error: cast from 'const char*' to
+    'const unsigned int*' increases required alignment of target type
+    [-Werror=cast-align]
+     { return * reinterpret_cast<const Type*> ((const char *) P +
+     offset); }
+                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+    ../src/hb-machinery.hh: In instantiation of 'Type&
+    StructAtOffset(void*, unsigned int) [with Type = unsigned int]':
+    ../src/hb-font.cc:145:79:   required from here
+    ../src/hb-machinery.hh:66:12: error: cast from 'char*' to 'unsigned
+    int*' increases required alignment of target type [-Werror=cast-align]
+     { return * reinterpret_cast<Type*> ((char *) P + offset); }
+                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+    ../src/hb-machinery.hh: In instantiation of 'Type&
+    StructAtOffset(void*, unsigned int) [with Type = int]':
+
+ src/hb-font.cc | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit a25174a56b8fc334a050aa63be3654f53a7d8893
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 09:59:36 2019 -0500
+
+    [pragma] GCC diagnostic error   "-Wreorder"
+
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 4660090569efbf64d3acc99ef6fa33e01abc9701
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 09:53:16 2019 -0500
+
+    [pragma] GCC diagnostic warning "-Wmaybe-uninitialized"
+
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 7a634d7d5b859eb1121acd0b17c727c541a7f540
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 09:49:14 2019 -0500
+
+    [pragma] Massage more
+
+ src/hb.hh | 106
+ ++++++++++++++++++++++++++++++++------------------------------
+ 1 file changed, 55 insertions(+), 51 deletions(-)
+
+commit 16e5ba85b1822ff9d2b2f85f45ddd44f1a05f4b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 09:46:17 2019 -0500
+
+    [pragma] More
+
+ src/hb.hh | 17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
+
+commit 2bd530d59883cce437a5093323625f94b9618d89
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 09:28:22 2019 -0500
+
+    [pragma] Reorg again
+
+    https://github.com/harfbuzz/harfbuzz/issues/1546
+
+ src/hb.hh | 91
+ ++++++++++++++++++++++++++++++++-------------------------------
+ 1 file changed, 46 insertions(+), 45 deletions(-)
+
+commit c04272fac81cac48b6310182d58d54569117f298
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 08:49:45 2019 -0500
+
+    [pragma] GCC diagnostic ignored "-Wunknown-warning-option"
+
+    Try at fixing https://github.com/harfbuzz/harfbuzz/issues/1546
+
+ src/hb.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 4d3c8f9685b1744077ab264ffc0e0457d63c4b9a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 19:58:54 2019 -0500
+
+    [uniscribe] More warnings
+
+ src/hb-uniscribe.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6a5d2b21d8457001a59537e85596461feba3dbd5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 19:57:17 2019 -0500
+
+    [uniscribe] Fix warnings
+
+ src/hb-uniscribe.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 5b13e458c34d16fef6540a9389225e0597a99df5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 19:52:32 2019 -0500
+
+    Fix build
+
+ src/hb-directwrite.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit a77bd6bb8960ecff35aac07f221653c65d08e58e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 19:33:41 2019 -0500
+
+    [pragma] GCC diagnostic ignored "-Wclass-memaccess"
+
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e1302842d9c589ccbed90d29c953fea503d3901f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 19:12:07 2019 -0500
+
+    [ci] Remove unnecessary warning declarations
+
+    clang -Weverything still left to be ported to pragmas
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 436c7b294ab12ae338aaa879fe4280caae6c6155
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 19:03:33 2019 -0500
+
+    [pragma] ignored -Wunsafe-loop-optimizations // TODO fix
+
+ src/hb.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e3b3181e9ddd8b76428d7eaca64a3e03a99fcdd5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 19:02:06 2019 -0500
+
+    [pragma] error -Wclass-memaccess
+
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1a6b97a491f2ba4f84e52c89517b7a02faa70cc3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 18:55:03 2019 -0500
+
+    [pragma] More
+
+ src/hb.hh | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit 06e8091661352873c4d6040fd06a940136497e6f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 18:47:32 2019 -0500
+
+    [pragma] More
+
+ src/hb.hh | 18 +++++++++++++++++-
+ 1 file changed, 17 insertions(+), 1 deletion(-)
+
+commit 1077e40bf12f998976df4bf509c69df9f9e2a590
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 18:36:10 2019 -0500
+
+    [pragma] Flesh out more
+
+ src/hb.hh | 22 +++++++++++++++++-----
+ 1 file changed, 17 insertions(+), 5 deletions(-)
+
+commit 7e6bd510fc695c423a7fa6b25c15805482f7d185
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 18:24:18 2019 -0500
+
+    Use NNOffsetTo<> in rest of places
+
+ src/hb-aat-layout-common.hh     |  8 ++++----
+ src/hb-aat-layout-kerx-table.hh | 22 +++++++++++-----------
+ src/hb-aat-layout-morx-table.hh | 10 +++++-----
+ 3 files changed, 20 insertions(+), 20 deletions(-)
+
+commit b1152d5e66d7463a30af8ca2a485f75e0c8e6ffd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 18:17:04 2019 -0500
+
+    Use NNOffsetTo<>
+
+ src/hb-aat-layout-ankr-table.hh |  6 +++---
+ src/hb-aat-layout-trak-table.hh |  2 +-
+ src/hb-aat-ltag-table.hh        |  2 +-
+ src/hb-open-file.hh             | 10 +++++-----
+ src/hb-ot-cff2-table.hh         |  6 +++---
+ src/hb-ot-color-cbdt-table.hh   |  2 +-
+ src/hb-ot-color-colr-table.hh   |  4 ++--
+ src/hb-ot-color-cpal-table.hh   |  8 ++++----
+ src/hb-ot-color-svg-table.hh    |  2 +-
+ src/hb-ot-name-table.hh         |  2 +-
+ src/hb-ot-stat-table.hh         |  4 ++--
+ 11 files changed, 24 insertions(+), 24 deletions(-)
+
+commit 205d72a198805ba276c1d0e63b1ca313c7bd517f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 18:10:38 2019 -0500
+
+    Add NNOffsetTo<>
+
+ src/hb-open-type.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit c99d13d860e3d34e16cd2c070070d4f5d7d58cf4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 17:56:27 2019 -0500
+
+    [AAT] Comment
+
+ src/hb-aat-layout-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f39b5603ffa0452528b2366f8641e7e770960847
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 17:49:55 2019 -0500
+
+    Comment
+
+ src/hb-ot-layout-gpos-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 347ad454b88b89fc4bc30fca86c9ca37bea0be5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 17:47:29 2019 -0500
+
+    [AAT] Remove unused code
+
+ src/hb-aat-layout-ankr-table.hh |  3 +--
+ src/hb-aat-layout-common.hh     |  3 +--
+ src/hb-aat-layout-kerx-table.hh |  6 ++----
+ src/hb-aat-layout.cc            | 14 +++-----------
+ 4 files changed, 7 insertions(+), 19 deletions(-)
+
+commit b344d4385af5bc9adac2a24850cb963929d4ae9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 17:44:39 2019 -0500
+
+    [AAT] Allow null in ankr lookupTable offset
+
+ src/hb-aat-layout-ankr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 14a560a245109376b7314c949895968d0a54452c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 17:42:44 2019 -0500
+
+    [pragma GCC] Ignore -Wtype-limits
+
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 41b4312e936a0dfc396e6f0ef13c2c691dac6e40
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 16:07:27 2019 -0500
+
+    [ci] Remove -Werror from Travis
+
+    hb-machinery.hh:111:37: warning: comparison of unsigned expression >=
+    0 is always true [-Wtype-limits]
+
+    Also ignore -Wtype-limits.
+
+ .travis.yml | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 3f2daae63073bd536bceb1ae71dffd3187afce11
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 15:27:31 2019 -0500
+
+    More GCC pragmas
+
+ src/hb.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit d6c5473e1f86cae7f1060abe18f73ccb8e536d6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 15:22:46 2019 -0500
+
+    Rename macro
+
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a9946b7cfef185d53304e804169d6e53e9d522a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 15:22:28 2019 -0500
+
+    Add more GCC warning pragmas
+
+ src/hb.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 868b0c0c2e2f1a2dea9b0d3c8eb6e56ded8b1a14
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 15:08:36 2019 -0500
+
+    Move -Wcast-align to hb.hh
+
+ configure.ac | 3 ---
+ src/hb.hh    | 4 ++++
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 8874eef8ff70de6416266d719fa74eec39e5d8f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 15:04:44 2019 -0500
+
+    Add pragram GCC diagnostic ignored "-Wunused-macros"
+
+ src/gen-indic-table.py                 | 3 +++
+ src/gen-use-table.py                   | 3 +++
+ src/hb-blob.cc                         | 3 +++
+ src/hb-ot-shape-complex-indic-table.cc | 3 +++
+ src/hb-ot-shape-complex-use-table.cc   | 3 +++
+ 5 files changed, 15 insertions(+)
+
+commit cc8e9a436fa408a1c63f4b9afb7643cea76a079c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 14:54:32 2019 -0500
+
+    [AAT] Fully sanitize ankr table at sanitize time
+
+    Third try to fix access. Followup
+    6879efc2c1596d11a6a6ad296f80063b558d5e0f
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=12532
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=922303
+
+ src/hb-aat-layout-ankr-table.hh | 13 ++++---------
+ 1 file changed, 4 insertions(+), 9 deletions(-)
+
+commit 6879efc2c1596d11a6a6ad296f80063b558d5e0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 14:06:37 2019 -0500
+
+    [AAT] Fix anchor bound checking, again
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=12532
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=922303
+
+ src/hb-aat-layout-ankr-table.hh                           |   3 ++-
+ ...zz-testcase-minimized-harfbuzz_fuzzer-5166320261529600 | Bin 0 ->
+ 393 bytes
+ ...zz-testcase-minimized-hb-shape-fuzzer-5667182741028864 | Bin 0 ->
+ 407 bytes
+ 3 files changed, 2 insertions(+), 1 deletion(-)
+
+commit a262eb3d0b7009aabd9e0beebc77e5c0a2a65548
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 17 14:06:32 2019 -0500
+
+    [aat] Minor
+
+ src/hb-aat-layout-kerx-table.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit c986ca15a6320d78471adf950394f391e8729b15
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 15 13:58:19 2019 -0500
+
+    Improve overflow avoidance
+
+    Better fix for 480406cd3ef9e5ab8476ddfa04498bf23906c508
+    This way we behave the same on 32bit and 64bit archs.
+
+ src/hb-machinery.hh | 10 +++-------
+ 1 file changed, 3 insertions(+), 7 deletions(-)
+
+commit 0d2727f4fe734af146785df10a44e3505e410ba1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 14 18:23:17 2019 -0800
+
+    fix FDSelect fuzzing bug (#1539)
+
+    Rewrote struct FDSelect3_4.ranges as ArrayOf
+    Updated FDSelect3_4::sanitize () to call ranges.sanitize ()
+    nRanges now a function to return a reference to ranges.len
+
+ src/hb-ot-cff-common.hh     | 29 +++++++++++++++--------------
+ src/hb-subset-cff-common.cc |  2 +-
+ 2 files changed, 16 insertions(+), 15 deletions(-)
+
+commit 9f6172d669d53abbf3bf2a3546429cb5036e3d5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 14 20:45:31 2019 -0500
+
+    Move _POSIX_SOURCE definition
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1308
+
+ src/hb-blob.cc | 9 +++++++++
+ src/hb.hh      | 4 ----
+ 2 files changed, 9 insertions(+), 4 deletions(-)
+
+commit 91d774712fa76dd26c441526712bddddca5b4bdd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 14 15:31:31 2019 -0500
+
+    [test] Add test for previous commit
+
+ ...uzz-testcase-minimized-harfbuzz_fuzzer-5662548265009152 | Bin 0 ->
+ 28 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 480406cd3ef9e5ab8476ddfa04498bf23906c508
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 14 15:27:34 2019 -0500
+
+    Fix assertion on address overflow
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=917031
+
+ src/hb-machinery.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 7a6686a589ed6bf17a5af0b8012501e4d4ee2ded
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 14 15:09:14 2019 -0500
+
+    [AAT] Fix mort ContextualSubtable offset access
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=12312
+
+ src/hb-aat-layout-morx-table.hh                           |   3 ++-
+ ...zz-testcase-minimized-hb-shape-fuzzer-5631444412530688 | Bin 0 ->
+ 336 bytes
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit a3fa7d33360a58df5333dbbd121328e580f08849
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 14 14:37:36 2019 -0500
+
+    [AAT] Fix ankr table access
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=918340
+
+ src/hb-aat-layout-ankr-table.hh                          |   7 ++++---
+ ...z-testcase-minimized-harfbuzz_fuzzer-5126525414014976 | Bin 0 ->
+ 1141 bytes
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 760303d411b1561533f8f08c7c15db331c71ece8
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Jan 11 15:27:35 2019 -0800
+
+    deleted a duplicate fontdicts_mod.fini() call (#1538)
+
+ src/hb-subset-cff1.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 5110f3da9a4711a35bfb780ea06cda677cc00209
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jan 9 16:01:11 2019 +0330
+
+    Add an initial .clang-format config
+
+    There are things can be improved on clang-format side I guess before
+    the full assertion, but is the best we can get for now I guess.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1536
+
+ .clang-format | 38 ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 38 insertions(+)
+
+commit 099bca6d406af9c8e12a66b93fcc9a38ff7914f9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jan 9 15:56:32 2019 +0330
+
+    Minor, hack .editorconfig for vscode use
+
+    As VSCode and Atom https://github.com/Microsoft/vscode/issues/44438
+    don't support it
+
+ .editorconfig | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit 7b48641aa8551115d21c534940ac4fb364e5ab92
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Jan 8 12:37:48 2019 -0800
+
+    fix leak in subset_enc_supp_codes (#1537)
+
+    oss-fuzz issue 12310
+
+ src/hb-subset-cff1.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 97f67a3c3d499959d33e66aeed449e2957a14bc6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 4 23:10:39 2019 +0330
+
+    [ci] Enable more of GCC compile warnings (#1533)
+
+ .circleci/config.yml      | 16 ++++++++--------
+ src/hb-gobject-structs.cc |  4 ++--
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+commit ad954870383a880262edcd01acd8e171c4614a68
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon Dec 3 12:49:44 2018 -0600
+
+    Usermanual: small formatting and wording fixes.
+
+ docs/usermanual-getting-started.xml  |  3 +++
+ docs/usermanual-install-harfbuzz.xml | 30 ++++++++++++++----------------
+ docs/usermanual-what-is-harfbuzz.xml | 11 ++++++-----
+ 3 files changed, 23 insertions(+), 21 deletions(-)
+
+commit ed13caddf2de68312608e12c37d0e6287c1ac0a0
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Wed Nov 28 13:48:38 2018 -0600
+
+    Usermanual: small updates.
+
+ ...anual-buffers-language-script-and-direction.xml |   7 +-
+ docs/usermanual-clusters.xml                       | 279
+ ++++++++++++++++-----
+ docs/usermanual-getting-started.xml                |  91 ++++++-
+ docs/usermanual-install-harfbuzz.xml               |   3 +-
+ docs/usermanual-shaping-concepts.xml               |  11 +-
+ 5 files changed, 314 insertions(+), 77 deletions(-)
+
+commit 26c5b54fb09fb45e02c9c4618bcea4958c698953
+Author: cclauss <cclauss@me.com>
+Date:   Mon Dec 31 04:30:43 2018 +0100
+
+    CircleCI: Test for Python 3 syntax errors and undefined names (#1522)
+
+    Catch missing imports and errors like #1520 and #1521
+
+    __E901,E999,F821,F822,F823__ are the "_showstopper_"
+    [flake8](http://flake8.pycqa.org) issues that can halt the runtime
+    with a SyntaxError, NameError, etc. Most other flake8 issues are
+    merely "style violations" -- useful for readability but they do not
+    effect runtime safety.
+    * F821: undefined name `name`
+    * F822: undefined name `name` in `__all__`
+    * F823: local variable name referenced before assignment
+    * E901: SyntaxError or IndentationError
+    * E999: SyntaxError -- failed to compile a file into an Abstract
+    Syntax Tree
+
+ .circleci/config.yml             | 3 ++-
+ src/gen-use-table.py             | 4 +++-
+ test/subset/subset_test_suite.py | 2 +-
+ 3 files changed, 6 insertions(+), 3 deletions(-)
+
+commit 686e6f2e40da378e031b4c9871a471599c6d61cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 30 11:27:42 2018 -0500
+
+    Fix automake warnings
+
+    [skip ci]
+
+ test/api/Makefile.am         | 1 -
+ test/subset/data/Makefile.am | 2 +-
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit b5c12b9f4d2c32a5013c340f7e40649cb5f2b41a
+Author: cclauss <cclauss@me.com>
+Date:   Sun Dec 30 13:07:28 2018 +0100
+
+    print() is a function in Python 3 (#1520)
+
+ test/subset/generate-expected-outputs.py | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit f4da28b1f153ccf293b367363a1a4d83c056e4e1
+Author: cclauss <cclauss@me.com>
+Date:   Sun Dec 30 12:58:34 2018 +0100
+
+    Python 3 fixes to gen-os2-unicode-ranges.py (#1521)
+
+    In Python 3, __reload()__ was moved and __sys.setdefaultencoding()__
+    because the default is already utf-8.  Also __Error()__ is an
+    _undefined name_ and __Exception()__ creates a generic exception.
+
+ src/gen-os2-unicode-ranges.py | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+commit e5989e0962309b27b2486d8fd20f3cbc05c3d79a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Dec 30 10:23:47 2018 +0330
+
+    [cmake] Enable C++11 on CMake (#1519)
+
+ CMakeLists.txt | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit d092fb27198f24423e51ce07375ebd6d486f64d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 30 01:53:03 2018 -0500
+
+    Ouch! Fix build on C++<11
+
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 89949ed28db96edabeb09433fcc09f28168163d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 30 01:52:19 2018 -0500
+
+    Fix ubsan with passing nullptr to qsort()
+
+ src/hb-array.hh | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 357a0a7ad344caf898eb1697fcdb859d118b7a13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 27 18:29:23 2018 -0500
+
+    Fix build on C++ < 11
+
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 54c0a1731069a17ae4f3b79b419af75709f03f5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 27 18:27:36 2018 -0500
+
+    [vector] Fix warning
+
+ src/hb-vector.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1043ddbee878a14df0ad8d83fbaa893370ef5a75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 27 18:27:11 2018 -0500
+
+    [aat] Minor
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ src/hb-aat-map.hh               | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 71da9ca62fa87bd3e0fa9d40924bb4c220313a03
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 27 18:01:06 2018 -0500
+
+    [vector] Remove use of arrayZ() by using casts
+
+ src/hb-ot-name-table.hh | 2 +-
+ src/hb-ot-name.cc       | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit fa333e34d6230210bc73a88b0ba6df2102dcda51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 27 17:56:22 2018 -0500
+
+    [vector] Remove static_array
+
+    Was good idea, but with C++ types with constructor/destructor,
+    was getting in
+    the way as compiler was destructing those items where it was not
+    desired.
+    Since C++ does not allow zero-sized arrays, just remove it...
+
+ src/hb-aat-map.hh            |  4 ++--
+ src/hb-cff-interp-common.hh  |  2 +-
+ src/hb-face.cc               |  2 +-
+ src/hb-object.hh             |  2 +-
+ src/hb-ot-cff-common.hh      |  2 +-
+ src/hb-ot-layout-gsubgpos.hh |  2 +-
+ src/hb-ot-map.hh             | 10 +++++-----
+ src/hb-ot-post-table.hh      |  2 +-
+ src/hb-set.hh                |  4 ++--
+ src/hb-vector.hh             | 34 +++++++++++-----------------------
+ src/hb.hh                    |  3 +++
+ 11 files changed, 29 insertions(+), 38 deletions(-)
+
+commit ab2258a419abbace9ff27916143b46f88e8ccef3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 27 17:45:05 2018 -0500
+
+    [vector] Use allocated = -1 to signify failure
+
+ src/hb-vector.hh | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit 09fa536d89d969998fe6bbe274a9964c73d1d982
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Dec 27 08:33:09 2018 -0800
+
+    fix lealk with cff2::accelerator_templ_t::topDict (#1517)
+
+ src/hb-ot-cff2-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3b81442cd5c11099ae9245074d24ef679b4473fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 24 11:31:04 2018 -0500
+
+    [vector] Change pre-alloced count from 8 to 2
+
+    I'm thinking about dropping it to zero, but that needs slight code
+    changes.
+
+ src/hb-vector.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d25a2f1496d13846ddaea123ac6fb9807dc5669a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 23 20:19:52 2018 -0500
+
+    Fix a few warnings
+
+ src/hb-aat-layout-common.hh | 12 ++++++------
+ src/hb-iter.hh              |  8 ++++----
+ src/hb-null.hh              |  2 +-
+ src/hb-ot-cff1-table.hh     |  2 +-
+ src/hb-ot-cff2-table.hh     |  2 +-
+ src/hb-subset-cff-common.hh |  3 ++-
+ src/hb.hh                   |  3 ++-
+ 7 files changed, 17 insertions(+), 15 deletions(-)
+
+commit 85003b594b3aa1f6638e274bc89f18999a5de9f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 22 16:19:10 2018 -0500
+
+    [iter] Fix warning
+
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e4355b1ca177200db6769136ead1ee25da86ec85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 22 16:11:22 2018 -0500
+
+    [set] Add iter_t as alias to const_iter_t
+
+ src/hb-set.hh    | 6 ++++--
+ src/test-iter.cc | 2 ++
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 33f8de61863efa538c488121c476fd0e907020d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 22 15:10:18 2018 -0500
+
+    [set] Change to const_iter
+
+ src/hb-set.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit f88fed5cd8787e3deeec05dac4353337dc02abdd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 22 11:11:10 2018 -0500
+
+    [set] Cache length in iterator
+
+ src/hb-set.hh | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit d0a706c7fdb72a1d224b4a5bdbad0fb8c90e3186
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Dec 22 19:47:48 2018 +0330
+
+    Minor, remove redundant inline
+
+ src/hb-ot-layout.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit ae6e348d642194585543f0d548fb94d210575fe4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Dec 22 19:47:29 2018 +0330
+
+    Minor, tweak spaces
+
+ src/hb-ot-glyf-table.hh     |  8 ++++----
+ src/hb-subset-cff-common.hh | 15 ++++++---------
+ 2 files changed, 10 insertions(+), 13 deletions(-)
+
+commit 29f0b6bce7da4c599f54066f7e7f6000f10d2f29
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Dec 22 07:47:04 2018 -0800
+
+    CFF renaming (#1507)
+
+    * reimplement ByteStr as byte_str_t based on hb_ubytes_t
+
+    Unuse start_embed<ByteStr>
+    Also renamed SubByteStr to byte_str_ref_t
+    More renaming to come
+
+    * substr renamed to str_ref in line with its type byte_str_ref_t
+
+    * uncamelize non-table struct names
+
+    * uncamelized non-struct types OpCode etc
+
+    * add byte_str_t copy ctor
+
+    * test
+
+    * test2
+
+    * undo tests
+
+    * fix bot failure
+
+    * undo the previous change
+
+    * fixed tabs, added inline
+
+    * Revert "fixed tabs, added inline"
+
+    This reverts commit 21163c30e9d18759414f7fe2518628241599f039.
+
+    * fix tabs
+
+ src/hb-cff-interp-common.hh      | 215 +++++++++++++++------------------
+ src/hb-cff-interp-cs-common.hh   | 250
+ +++++++++++++++++++--------------------
+ src/hb-cff-interp-dict-common.hh |  64 +++++-----
+ src/hb-cff1-interp-cs.hh         |  26 ++--
+ src/hb-cff2-interp-cs.hh         |  56 ++++-----
+ src/hb-ot-cff-common.hh          |  59 ++++-----
+ src/hb-ot-cff1-table.cc          |  56 ++++-----
+ src/hb-ot-cff1-table.hh          | 147 ++++++++++++-----------
+ src/hb-ot-cff2-table.cc          |  28 ++---
+ src/hb-ot-cff2-table.hh          | 128 ++++++++++----------
+ src/hb-subset-cff-common.cc      |  10 +-
+ src/hb-subset-cff-common.hh      | 232
+ ++++++++++++++++++------------------
+ src/hb-subset-cff1.cc            | 244
+ +++++++++++++++++++-------------------
+ src/hb-subset-cff2.cc            | 100 ++++++++--------
+ 14 files changed, 796 insertions(+), 819 deletions(-)
+
+commit 89d04129e2f4dedb865635dcb8f0fd020e4218c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 20:07:52 2018 -0500
+
+    [set] Actually derive iterator from hb_sorted_iter_t<>
+
+ src/hb-set.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fc35919d015c5b8d231933d6bc6ea640c83af6b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 20:06:17 2018 -0500
+
+    [set] Implement unified iterator
+
+ src/hb-set.hh | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+commit 4911e67d2d2188ee9bdc0315e121e51d9967b567
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 20:00:52 2018 -0500
+
+    [set] Mark some internals protected
+
+ src/hb-set.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 954b985422a8964f6e7da9f71ab7a68074017111
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 19:55:02 2018 -0500
+
+    [iter] Add hb_sorted_iter_t<>
+
+ src/hb-array.hh |  2 +-
+ src/hb-iter.hh  | 11 +++++++++++
+ 2 files changed, 12 insertions(+), 1 deletion(-)
+
+commit b205105c9e1c6295b17cfd88ffb8ca7d963ef173
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 19:48:21 2018 -0500
+
+    [iter] Change operator[] operand to be signed
+
+    To fix older compilers again (this was the case in hb_array_t).
+
+    hb-ot-layout-common.hh:1353: note: candidate 2: operator[](T*,
+    int) <built-in>
+    hb-ot-layout-common.hh:1354: error: ISO C++ says that these are
+    ambiguous, even though the worst conversion for the first is better
+    than the worst conversion for the second:
+    hb-iter.hh:63: note: candidate 1: Item& hb_iter_t<Iter,
+    Item>::operator[](unsigned int) const [with Iter = hb_array_t<const
+    OT::IntType<short unsigned int, 2u> >, Item = const OT::IntType<short
+    unsigned int, 2u>]
+    hb-ot-layout-common.hh:1354: note: candidate 2: operator[](T*,
+    int) <built-in>
+    hb-ot-layout-common.hh: In member function 'bool
+    OT::ClassDef::serialize(hb_serialize_context_t*, hb_array_t<const
+    OT::IntType<short unsigned int, 2u> >, hb_array_t<const
+    OT::IntType<short unsigned int, 2u> >)':
+    hb-ot-layout-common.hh:1490: error: ISO C++ says that these are
+    ambiguous, even though the worst conversion for the first is better
+    than the worst conversion for the second:
+    hb-iter.hh:63: note: candidate 1: Item& hb_iter_t<Iter,
+    Item>::operator[](unsigned int) const [with Iter = hb_array_t<const
+    OT::IntType<short unsigned int, 2u> >, Item = const OT::IntType<short
+    unsigned int, 2u>]
+    hb-ot-layout-common.hh:1490: note: candidate 2: operator[](T*,
+    int) <built-in>
+
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 25786f49c1df36fdb5f78681055a1f4aa4b17f86
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 19:29:00 2018 -0500
+
+    [array] Port to hb_iter_t<>
+
+    hb_array_t is its own iterator...
+
+ src/hb-array.hh | 75
+ +++++++++++++++++++++++++--------------------------------
+ src/hb-iter.hh  |  5 ++--
+ 2 files changed, 36 insertions(+), 44 deletions(-)
+
+commit 2a33ab0560a13cb8fef5983bfe0f6d68dfd47b14
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 18:49:27 2018 -0500
+
+    [iter] Change __more__ to fallback to __len__
+
+ src/hb-iter.hh   | 15 ++++++---------
+ src/test-iter.cc |  1 -
+ 2 files changed, 6 insertions(+), 10 deletions(-)
+
+commit 474a12058d681f2d7cef84db0cf20f9f784fa400
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 18:46:51 2018 -0500
+
+    [array/vector] Rename len to length
+
+ src/hb-aat-layout-feat-table.hh |  5 ++-
+ src/hb-aat-layout-lcar-table.hh |  2 +-
+ src/hb-aat-map.cc               |  4 +--
+ src/hb-array.hh                 | 72
+ ++++++++++++++++++++---------------------
+ src/hb-cff-interp-common.hh     | 10 +++---
+ src/hb-cff2-interp-cs.hh        |  6 ++--
+ src/hb-coretext.cc              | 12 +++----
+ src/hb-face.cc                  |  4 +--
+ src/hb-object.hh                | 23 +++++++------
+ src/hb-open-file.hh             |  4 +--
+ src/hb-open-type.hh             |  8 ++---
+ src/hb-ot-cff-common.hh         | 38 +++++++++++-----------
+ src/hb-ot-cff1-table.hh         | 28 ++++++++--------
+ src/hb-ot-cmap-table.hh         | 24 +++++++-------
+ src/hb-ot-color-colr-table.hh   |  6 ++--
+ src/hb-ot-hdmx-table.hh         |  6 ++--
+ src/hb-ot-hmtx-table.hh         |  8 ++---
+ src/hb-ot-layout-common.hh      | 32 +++++++++---------
+ src/hb-ot-layout-gdef-table.hh  |  4 +--
+ src/hb-ot-layout-gsub-table.hh  | 24 +++++++-------
+ src/hb-ot-layout-gsubgpos.hh    |  2 +-
+ src/hb-ot-layout.cc             |  2 +-
+ src/hb-ot-map.cc                | 22 ++++++-------
+ src/hb-ot-map.hh                |  4 +--
+ src/hb-ot-math-table.hh         |  4 +--
+ src/hb-ot-maxp-table.hh         |  2 +-
+ src/hb-ot-name-table.hh         |  8 ++---
+ src/hb-ot-name.cc               |  4 +--
+ src/hb-ot-post-table.hh         |  8 ++---
+ src/hb-ot-var-fvar-table.hh     |  2 +-
+ src/hb-ot-vorg-table.hh         | 10 +++---
+ src/hb-set.hh                   | 36 ++++++++++-----------
+ src/hb-subset-cff-common.cc     |  8 ++---
+ src/hb-subset-cff-common.hh     | 50 ++++++++++++++--------------
+ src/hb-subset-cff1.cc           | 48 +++++++++++++--------------
+ src/hb-subset-cff2.cc           | 16 ++++-----
+ src/hb-subset-glyf.cc           | 14 ++++----
+ src/hb-subset-plan.cc           |  2 +-
+ src/hb-uniscribe.cc             | 26 +++++++--------
+ src/hb-vector.hh                | 56 ++++++++++++++++----------------
+ src/test-iter.cc                |  4 +--
+ 41 files changed, 325 insertions(+), 323 deletions(-)
+
+commit 2fc1860a5b40f5deba720c0c1099fdd0450b77c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 18:09:45 2018 -0500
+
+    [iter] Split hb_iter_t<> into hb_iter_t<> and hb_iter_mixin_t<>
+
+ src/hb-iter.hh   | 31 ++++++++++++++++++++-----------
+ src/test-iter.cc |  2 +-
+ 2 files changed, 21 insertions(+), 12 deletions(-)
+
+commit 865deeb3be1cb40efe3d7c42db48b0cdf977de47
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 17:35:58 2018 -0500
+
+    Adjust internal header dependencies
+
+ src/hb-array.hh            |  5 ++++-
+ src/hb-dsalgs.hh           |  1 -
+ src/hb-iter.hh             |  1 +
+ src/hb-vector.hh           |  1 +
+ src/hb.hh                  | 15 +++++++++------
+ src/test-iter.cc           |  1 +
+ src/test-unicode-ranges.cc |  1 +
+ 7 files changed, 17 insertions(+), 8 deletions(-)
+
+commit 8e5c2bc60bd9a800dacc96cc29c6ff831a852ae3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 17:29:11 2018 -0500
+
+    [Makefile.am] Minor
+
+ src/Makefile.am | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit f419cef4174c5447bf5031e771483f3274ae4dce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 17:22:09 2018 -0500
+
+    [iter] Include from hb.hh
+
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 7557e34872c846433c2465b21b99bf7c5f961673
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 17:21:19 2018 -0500
+
+    [iter] Move hb_fill() and hb_copy() to hb-iter.hh
+
+ src/hb-iter.hh   | 18 ++++++++++++++++++
+ src/test-iter.cc | 16 ----------------
+ 2 files changed, 18 insertions(+), 16 deletions(-)
+
+commit 5e1840e031cff1127842fc5cc8ee93e5959f02d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 16:39:57 2018 -0500
+
+    [iter] Disallow copy-construction or assignment of hb_iter_t<>
+
+    Should only be done by subclass.
+
+ src/hb-iter.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 65e8bd56ad26912636fbdc400a83cc48db2a13ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 16:20:30 2018 -0500
+
+    [iter] Fix hb_copy() return value
+
+ src/test-iter.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 40d71211a8969ec4414d2476a209e60d0a3525d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 16:19:44 2018 -0500
+
+    [iter] Add const_iter_t / const_iter()
+
+ src/hb-iter.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit aaddfaa57a841726a8b49653af3f8b702831da1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 16:04:38 2018 -0500
+
+    [iter] Make hb_fill() take collection type, not iter
+
+    Starting to get the hang of when take which.
+
+ src/test-iter.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 7b4eea853c36fd59db6e5d68bbef9b8cebad760e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 16:02:16 2018 -0500
+
+    [array] Add more hb_array() / hb_sorted_array() variants
+
+ src/hb-array.hh | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+commit 09740148e310021a4a690666c2e2836c2005353d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 15:56:01 2018 -0500
+
+    [serialize] Use component_list by reference, as a supplier
+
+ src/hb-ot-layout-gsub-table.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 3dbe1e364c19d82ab436b9ea7b41c9754d43e923
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 15:53:09 2018 -0500
+
+    [iter] Add .random_access()
+
+ src/hb-iter.hh   | 4 ++++
+ src/test-iter.cc | 1 +
+ 2 files changed, 5 insertions(+)
+
+commit 20f14b4aa6311d8fb2ed80c47bb15e8d87d2f6b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 15:19:22 2018 -0500
+
+    [iter] Fix __end__()
+
+ src/hb-iter.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 95265aeab7da54f31d4f68590af7730054b6be16
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 15:12:55 2018 -0500
+
+    [array] Remove copy constructor
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1502
+
+ src/hb-array.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 69d232eaea323b8c42e5fa1788553ac4e8bf3a50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 15:08:06 2018 -0500
+
+    Fix bot
+
+      C:\projects\harfbuzz\src\hb-uniscribe.cc(709): error C2666:
+      'hb_vector_t<OPENTYPE_FEATURE_RECORD,8>::operator
+      +': 3 overloads have similar conversions
+      [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
+
+ src/hb-uniscribe.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b9a51f531009ce201b86a0326aff662fd19a68a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 15:05:00 2018 -0500
+
+    Minor
+
+ src/hb-ot-layout-gpos-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit bdb6da72267c8fa4802a2183ba69a1535653378b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 11:20:27 2018 -0500
+
+    [iter] Fix test again
+
+ src/test-iter.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e9520752489298e0ce1a08da10ec3d439f9356d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 11:15:16 2018 -0500
+
+    Minor
+
+ src/Makefile.am  | 6 +++---
+ src/test-iter.cc | 1 -
+ 2 files changed, 3 insertions(+), 4 deletions(-)
+
+commit 35503d7d7324293162b605ffe0bd712656dd52b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 03:03:46 2018 -0500
+
+    [iter] More prototyping
+
+ src/test-iter.cc | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+commit 73c7a896d1395539e3c9e71b073ce5094c835aa0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 02:48:28 2018 -0500
+
+    [iter] Make hb_fill() and hb_copy() take iterators
+
+    I'm still going back and force...
+
+ src/test-iter.cc | 11 ++++-------
+ 1 file changed, 4 insertions(+), 7 deletions(-)
+
+commit 12e506fda4bfd82d67e4beede29ae7dbc02ad8f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 02:47:04 2018 -0500
+
+    [iter] Add hb_fill()
+
+ src/test-iter.cc | 20 ++++++++++++++------
+ 1 file changed, 14 insertions(+), 6 deletions(-)
+
+commit ad3ed58de5297930826c67d18b99991b93d29654
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 02:12:55 2018 -0500
+
+    [iter] Start prototyping hb_copy()
+
+ src/test-iter.cc | 18 ++++++++++++++----
+ 1 file changed, 14 insertions(+), 4 deletions(-)
+
+commit 44af738d19486095c0fbc2ef2b359a298126ac2b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 01:59:37 2018 -0500
+
+    [iter] Showcase implicit casts
+
+ src/test-iter.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 879faa2aee74e237594901426096ceeb78a716a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 01:57:40 2018 -0500
+
+    Rename
+
+ src/hb-array.hh     | 2 +-
+ src/hb-open-type.hh | 4 ++--
+ src/hb-vector.hh    | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit aeb696a91cd1cdc73bf5b87e56163c7f64778616
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 01:57:02 2018 -0500
+
+    [iter] Rename
+
+ src/hb-iter.hh | 44 ++++++++++++++++++++++----------------------
+ 1 file changed, 22 insertions(+), 22 deletions(-)
+
+commit 8001e00a470ad06f0307002b4cade5612ee7b521
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 01:53:27 2018 -0500
+
+    [iter] First sample use
+
+ src/Makefile.am  |  5 ++++-
+ src/hb-iter.hh   | 25 +++++++++++--------------
+ src/test-iter.cc | 25 ++++++++++++++++++++-----
+ 3 files changed, 35 insertions(+), 20 deletions(-)
+
+commit 19d2b5013d8ac7aa45b3b8e8c61ad90773c86925
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 01:17:35 2018 -0500
+
+    [iter] Add bidirectionality
+
+ src/hb-iter.hh | 14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+commit 314d8698d0746416efd332f5fae45aecb26df7ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 00:54:55 2018 -0500
+
+    [iter] Sketch new iterator design
+
+ src/hb-iter.hh   | 154
+ +++++++++++++++++++------------------------------------
+ src/test-iter.cc |  16 ++++++
+ 2 files changed, 69 insertions(+), 101 deletions(-)
+
+commit f6d5f1e91ced2b6b1114ad765f568f799dd3612f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 00:23:34 2018 -0500
+
+    [iter] Add empty test
+
+ src/Makefile.am            |  7 +++++--
+ src/hb-machinery.hh        |  1 -
+ src/test-iter.cc           | 33 +++++++++++++++++++++++++++++++++
+ src/test-unicode-ranges.cc |  2 --
+ 4 files changed, 38 insertions(+), 5 deletions(-)
+
+commit b80b97b549dacc10d314bf8b5fd4ace596ccdfe1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 00:08:05 2018 -0500
+
+    Revert "Remove unused hb-iter.hh"
+
+    This reverts commit 969ff3c7aadbe721cdd414488eb170433f10d00c.
+
+ src/Makefile.sources |   1 +
+ src/hb-iter.hh       | 146
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-machinery.hh  |   1 +
+ 3 files changed, 148 insertions(+)
+
+commit a728c63a98281fd4a0661e17fc01171bc3205b27
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 20 23:15:49 2018 -0500
+
+    [vector] Add operator bool
+
+ src/hb-vector.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit bd369773921b4891996bd21f325702e490f47ca4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 20 23:14:24 2018 -0500
+
+    Rename
+
+ src/hb-array.hh     | 2 +-
+ src/hb-open-type.hh | 4 ++--
+ src/hb-vector.hh    | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit e6ebc9b6f89e62d888b3bcf926afd624f16f3e95
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 20 23:13:36 2018 -0500
+
+    Remove unused typedef
+
+ src/hb-machinery.hh | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 4941e95f10fe0fe658752134a42b58896fb19c42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 20 21:48:57 2018 -0500
+
+    2.3.0
+
+ NEWS                 | 15 +++++++++++++++
+ configure.ac         |  2 +-
+ src/hb-aat-layout.cc |  6 +++---
+ src/hb-version.h     |  4 ++--
+ 4 files changed, 21 insertions(+), 6 deletions(-)
+
+commit 87f7c83fffb7e64970be23c8e3c620d32a3b8f5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 20 15:54:17 2018 -0500
+
+    [serializer] Add operator <<
+
+    Not sure if we are going to use it.  But might incentivize us to.
+
+ src/hb-machinery.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5b70074edf1c12a9442037d54c03d3025bd93995
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 20 15:38:59 2018 -0500
+
+    Add hb_assign(obj, value)
+
+ src/hb-machinery.hh |  2 +-
+ src/hb-null.hh      | 24 +++++++++++++++++++++++-
+ src/hb-open-type.hh |  5 +++--
+ 3 files changed, 27 insertions(+), 4 deletions(-)
+
+commit 6124123393eabb77d34830c971ec463998d50aba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 20 12:26:30 2018 -0500
+
+    [serialize] Adjust ClassDef
+
+    [skip ci]
+
+ src/hb-ot-layout-common.hh | 32 ++++++++++++++++----------------
+ 1 file changed, 16 insertions(+), 16 deletions(-)
+
+commit 4220b7bdd7706622563401bf8f055c4b1482b4e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 20 11:48:45 2018 -0500
+
+    Fix code on big-endian gcc / clang
+
+    Ouch!  We need a bigendian bot...
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1498
+
+ src/hb-machinery.hh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit c87ee72232416099a73b563ca7aaf293b1c87b2a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 19 22:28:16 2018 -0500
+
+    Minor [skip ci]
+
+ src/hb-dsalgs.hh | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit 5000a59a6391d588c2cbdda132839b1fb1f75bf2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 19 21:07:53 2018 -0500
+
+    [saitnize] Minor
+
+ src/hb-machinery.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 3ee4ea945674c4b96c9aa6b0367bbf22dc8745d1
+Author: fanc999 <fanc999@yahoo.com.tw>
+Date:   Thu Dec 20 11:26:54 2018 +0800
+
+    Fix build on older Visual Studio versions (#1499)
+
+    * src/hb-cff-interp-dict-common.hh: Use ull for unsigned int64_t
+
+    The llu suffix does not work for older Visual Studio versions
+    (pre-2013), but ull works for all the compilers that we attempt to
+    support.
+
+    * test/api: Fix build on pre-C99 compilers
+
+    Ensure variables are declared at the top of the block.
+
+    * src/hb-dsalgs.hh: Add specialization for hb_is_signed<> for __int8
+
+    Pre-Visual Studio 2010 does not consider __int8 (which is typedef'ed
+    to
+    int8_t) to be equivilant to signed char, so the compiler cannot
+    find the
+    corresponding hb_is_signed<> specialization that is needed.
+
+    The interesting thing is unsigned __int8 is considered to be
+    equivilant
+    to unsigned char, so as the other types (short, int, long) that
+    we look
+    for here, so only the specialization for __int8 is added here.
+
+    This will fix builds on Visual Studio 2008 at least.
+
+ src/hb-cff-interp-dict-common.hh |  2 +-
+ src/hb-dsalgs.hh                 |  9 +++++++++
+ test/api/test-aat-layout.c       |  3 ++-
+ test/api/test-subset-cff1.c      | 12 ++++++++----
+ 4 files changed, 20 insertions(+), 6 deletions(-)
+
+commit a62870506d16949582bf0b54e3dc8846b9747a4a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 19 21:05:00 2018 -0500
+
+    [sanitize] Use hb_static_size instead of ::static_size
+
+    https://github.com/harfbuzz/harfbuzz/issues/1496#issuecomment-448818112
+
+ src/hb-machinery.hh | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+commit 0c9cd5d5f4d96df77e4298e16c786e67b83f9bc4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Dec 19 21:18:30 2018 +0330
+
+    [test] Fix test-name-table.cc leak issue
+
+    Spotted it accidentally but wanted to see if is anything serious so
+    went for fixing it
+
+ src/test-name-table.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 3d9d7dc4dd4be8e746507282569504b511afa709
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 18 22:11:23 2018 -0500
+
+    [arrays] Add hb_ubytes_t for unsigned char
+
+ src/hb-array.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f1e95e40edc871c840abe8a8a695efc252af40f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 18 16:49:08 2018 -0500
+
+    [arrays] Remove hb_supplier_t<>
+
+ src/hb-array.hh                            |  11 --
+ src/hb-cff2-interp-cs.hh                   |   2 +-
+ src/hb-face.cc                             |   6 +-
+ src/hb-open-file.hh                        |  15 +-
+ src/hb-open-type.hh                        |  18 +-
+ src/hb-ot-cmap-table.hh                    |   3 +-
+ src/hb-ot-layout-common.hh                 | 104 ++++--------
+ src/hb-ot-layout-gsub-table.hh             | 257
+ +++++++++++++----------------
+ src/hb-ot-shape-complex-arabic-fallback.hh |  23 +--
+ 9 files changed, 170 insertions(+), 269 deletions(-)
+
+commit f9417af29bd5a1d2f5b55389a1cc6f4280b347d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 18 13:23:32 2018 -0500
+
+    [serialize] Propagate error from hb-face
+
+ src/hb-face.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 9aebfb418222427a324d911b32abfc11256ca9e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 18 13:22:17 2018 -0500
+
+    [serialize] Streamline error propagation
+
+ src/hb-buffer.hh               |  2 ++
+ src/hb-machinery.hh            | 35 ++++++++++++++++++++++++++---------
+ src/hb-map.hh                  |  2 ++
+ src/hb-ot-layout-common.hh     |  4 ++--
+ src/hb-ot-layout-gsub-table.hh |  4 ++--
+ src/hb-set.hh                  |  2 ++
+ src/hb-subset.cc               |  2 +-
+ 7 files changed, 37 insertions(+), 14 deletions(-)
+
+commit 969ff3c7aadbe721cdd414488eb170433f10d00c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 22:43:00 2018 -0500
+
+    Remove unused hb-iter.hh
+
+    The ideas there are all part of hb-array.hh now.  To be determined
+    how we
+    want to use generic iterator patterns.
+
+ src/Makefile.sources |   1 -
+ src/hb-iter.hh       | 146
+ ---------------------------------------------------
+ src/hb-machinery.hh  |   1 -
+ 3 files changed, 148 deletions(-)
+
+commit b1094fc2d2b614c1407b502d15bd98407a5ffb56
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 22:41:04 2018 -0500
+
+    [arrays] Minor tweaks to hb_supplier_t
+
+    I think I like to keep this hb_supplier_t thing separately from
+    hb_array_t.
+
+ src/hb-array.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit cf39c242057636feebafce347f8e7ac2b305112a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 22:36:23 2018 -0500
+
+    [arrays] Rename Supplier to hb_supplier_t
+
+ src/hb-array.hh                            |   6 +-
+ src/hb-face.cc                             |   2 +-
+ src/hb-open-file.hh                        |   4 +-
+ src/hb-open-type.hh                        |   4 +-
+ src/hb-ot-cmap-table.hh                    |   2 +-
+ src/hb-ot-layout-common.hh                 |  34 ++++-----
+ src/hb-ot-layout-gsub-table.hh             | 108
+ ++++++++++++++---------------
+ src/hb-ot-shape-complex-arabic-fallback.hh |  14 ++--
+ 8 files changed, 87 insertions(+), 87 deletions(-)
+
+commit 6b5eaa753047b6b0389cb7521c52efbaccf72daf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 21:55:33 2018 -0500
+
+    Hide hb_addressof()
+
+ src/hb-dsalgs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6befa75cdf83d561de69fb342f68694cd7b46f5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 20:34:51 2018 -0500
+
+    Enable __builtin_* on clang
+
+    We'll see which old clang versions this breaks...
+
+ src/hb-dsalgs.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 8d2d41025619e24160ed80edd1c413168a2dda36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 20:23:26 2018 -0500
+
+    Add hb_addressof() and use it to fix bug after hb_bytes_t merge
+
+    We cannot take address hb_bytes_t direction.  We need to use the
+    newly added hb_addressof(), ala std::addressof().
+
+ src/hb-dsalgs.hh        | 9 +++++++++
+ src/hb-ot-post-table.hh | 3 ++-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 49334f9b509fc15e8baa93d49b86886ca933de04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 18:27:36 2018 -0500
+
+    Enable system extensions in hb.hh
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1491
+
+ configure.ac |  1 -
+ src/hb.hh    | 26 ++++++++++++++++++++++++++
+ 2 files changed, 26 insertions(+), 1 deletion(-)
+
+commit 37c14bc7459e8b9cc0840b68223123ffb950b4cc
+Author: prrace <philip.race@oracle.com>
+Date:   Mon Dec 17 14:59:37 2018 -0800
+
+    Fix Solaris use after free (#1495)
+
+ src/hb-atomic.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 483f2491e40ccf660836ed2797738297e40bd100
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 17:56:10 2018 -0500
+
+    Remove define GNU_SOURCE
+
+    Not needed.  We get it in our config.h automatically thanks to
+    AC_USE_SYSTEM_EXTENSIONS.  Let's see whose build it breaks...
+    If we end up putting it back, we should add other things from
+    that macro and remove the macro.
+
+ src/hb.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 87ff65aea117391c732d51d874964b3e32d6fa94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 17:19:42 2018 -0500
+
+    Fix more warnings
+
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f9d219a17417f61fa2c6152d2181504866583a72
+Author: prrace <philip.race@oracle.com>
+Date:   Mon Dec 17 14:18:47 2018 -0800
+
+    Fix Solaris Trailing comma in enum warnings (#1490)
+
+ src/hb-ot-color.h | 2 +-
+ src/hb-ot-name.h  | 2 +-
+ src/hb-ot-var.h   | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 244a8627f7b0ed651d6010c7ee7e54fa8fcca400
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Dec 17 21:31:43 2018 +0330
+
+    Lower coretext_aat shaper priority (#1488)
+
+    Related to https://github.com/harfbuzz/harfbuzz/issues/1478
+
+ src/hb-shaper-list.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit e41200859997ccf8fd7d36fff654f3ceea3a4160
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Dec 17 21:31:01 2018 +0330
+
+    Remove redundant void from C++ sources (#1486)
+
+ src/dump-indic-data.cc           |   2 +-
+ src/dump-khmer-data.cc           |   2 +-
+ src/dump-myanmar-data.cc         |   2 +-
+ src/dump-use-data.cc             |   2 +-
+ src/hb-aat-fdsc-table.hh         |   4 +-
+ src/hb-aat-layout-common.hh      |  23 +++---
+ src/hb-aat-layout-feat-table.hh  |   8 +--
+ src/hb-aat-layout-just-table.hh  |   2 +-
+ src/hb-aat-layout-kerx-table.hh  |  21 +++---
+ src/hb-aat-layout-morx-table.hh  |  10 +--
+ src/hb-aat-layout-trak-table.hh  |   4 +-
+ src/hb-aat-layout.cc             |   6 +-
+ src/hb-aat-map.hh                |   4 +-
+ src/hb-array.hh                  |  24 +++----
+ src/hb-atomic.hh                 |  18 ++---
+ src/hb-blob.cc                   |   8 +--
+ src/hb-blob.hh                   |  33 ++++-----
+ src/hb-buffer-serialize.cc       |   2 +-
+ src/hb-buffer.cc                 |  24 +++----
+ src/hb-buffer.hh                 |  51 ++++++-------
+ src/hb-cache.hh                  |   6 +-
+ src/hb-cff-interp-common.hh      | 113 +++++++++++++----------------
+ src/hb-cff-interp-cs-common.hh   |  26 +++----
+ src/hb-cff-interp-dict-common.hh |  12 ++--
+ src/hb-cff1-interp-cs.hh         |   4 +-
+ src/hb-cff2-interp-cs.hh         |  24 +++----
+ src/hb-common.cc                 |  20 +++---
+ src/hb-coretext.cc               |   2 +-
+ src/hb-debug.hh                  |   6 +-
+ src/hb-directwrite.cc            |  16 ++---
+ src/hb-dsalgs.hh                 |   2 +-
+ src/hb-face.cc                   |   6 +-
+ src/hb-face.hh                   |   8 +--
+ src/hb-font.cc                   |   6 +-
+ src/hb-font.hh                   |   6 +-
+ src/hb-ft.cc                     |  18 ++---
+ src/hb-glib.cc                   |   8 +--
+ src/hb-gobject-enums.cc.tmpl     |   2 +-
+ src/hb-gobject-enums.h.tmpl      |   2 +-
+ src/hb-gobject-structs.cc        |   2 +-
+ src/hb-icu.cc                    |   8 +--
+ src/hb-iter.hh                   |  15 ++--
+ src/hb-machinery.hh              | 150
+ ++++++++++++++++-----------------------
+ src/hb-map.cc                    |   4 +-
+ src/hb-map.hh                    |  24 +++----
+ src/hb-mutex.hh                  |  10 +--
+ src/hb-null.hh                   |  32 ++++-----
+ src/hb-object.hh                 |  22 +++---
+ src/hb-open-file.hh              |  32 ++++-----
+ src/hb-open-type.hh              |  66 +++++++++--------
+ src/hb-ot-cff-common.hh          |  30 ++++----
+ src/hb-ot-cff1-table.cc          |  17 ++---
+ src/hb-ot-cff1-table.hh          |  52 ++++++--------
+ src/hb-ot-cff2-table.cc          |   8 +--
+ src/hb-ot-cff2-table.hh          |  34 ++++-----
+ src/hb-ot-cmap-table.hh          |  10 +--
+ src/hb-ot-color-cbdt-table.hh    |   4 +-
+ src/hb-ot-color-colr-table.hh    |   2 +-
+ src/hb-ot-color-cpal-table.hh    |  10 +--
+ src/hb-ot-color-sbix-table.hh    |  11 ++-
+ src/hb-ot-color-svg-table.hh     |   7 +-
+ src/hb-ot-face.cc                |   2 +-
+ src/hb-ot-face.hh                |   2 +-
+ src/hb-ot-font.cc                |   8 +--
+ src/hb-ot-glyf-table.hh          |   6 +-
+ src/hb-ot-hdmx-table.hh          |   4 +-
+ src/hb-ot-head-table.hh          |   8 +--
+ src/hb-ot-hmtx-table.hh          |   2 +-
+ src/hb-ot-kern-table.hh          |  20 +++---
+ src/hb-ot-layout-base-table.hh   |  10 +--
+ src/hb-ot-layout-common.hh       |  67 +++++++++--------
+ src/hb-ot-layout-gdef-table.hh   |  20 +++---
+ src/hb-ot-layout-gpos-table.hh   |  34 ++++-----
+ src/hb-ot-layout-gsub-table.hh   |  24 +++----
+ src/hb-ot-layout-gsubgpos.hh     |  92 +++++++++++-------------
+ src/hb-ot-layout-jstf-table.hh   |   8 +--
+ src/hb-ot-map.cc                 |   2 +-
+ src/hb-ot-map.hh                 |   8 +--
+ src/hb-ot-math-table.hh          |  11 ++-
+ src/hb-ot-maxp-table.hh          |   5 +-
+ src/hb-ot-name-table.hh          |   6 +-
+ src/hb-ot-os2-table.hh           |  18 ++---
+ src/hb-ot-post-table.hh          |   4 +-
+ src/hb-ot-shape.cc               |   2 +-
+ src/hb-ot-shape.hh               |   2 +-
+ src/hb-ot-tag.cc                 |   4 +-
+ src/hb-ot-var-fvar-table.hh      |   9 ++-
+ src/hb-ot-var-hvar-table.hh      |   9 +--
+ src/hb-ot-vorg-table.hh          |   2 +-
+ src/hb-set-digest.hh             |   4 +-
+ src/hb-set.cc                    |   4 +-
+ src/hb-set.hh                    |  38 +++++-----
+ src/hb-shape-plan.cc             |   2 +-
+ src/hb-shape-plan.hh             |   5 +-
+ src/hb-shape.cc                  |  10 +--
+ src/hb-shaper.cc                 |  14 ++--
+ src/hb-shaper.hh                 |   6 +-
+ src/hb-static.cc                 |   4 +-
+ src/hb-subset-cff-common.hh      |  91 +++++++++++-------------
+ src/hb-subset-cff1.cc            |  20 ++----
+ src/hb-subset-cff2.cc            |   8 +--
+ src/hb-subset-input.cc           |   2 +-
+ src/hb-subset.hh                 |   4 +-
+ src/hb-ucdn.cc                   |  10 +--
+ src/hb-unicode.cc                |  64 ++++++++---------
+ src/hb-uniscribe.cc              |  12 ++--
+ src/hb-vector.hh                 |  38 +++++-----
+ src/hb.hh                        |   6 +-
+ src/test-unicode-ranges.cc       |   4 +-
+ util/ansi-print.cc               |   6 +-
+ util/hb-fc.cc                    |   2 +-
+ util/hb-shape.cc                 |   5 +-
+ util/helper-cairo.cc             |   2 +-
+ util/helper-cairo.hh             |   2 +-
+ util/main-font-text.hh           |   2 +-
+ util/options.cc                  |   8 +--
+ util/options.hh                  |  22 +++---
+ util/view-cairo.hh               |  14 ++--
+ 118 files changed, 861 insertions(+), 1024 deletions(-)
+
+commit 7ace10078c23d00da4af0480f91b877faeed3d38
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Dec 17 20:07:04 2018 +0330
+
+    Minor, fix two more ArrayOf incorrect operator logic
+
+ src/hb-open-type.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a1240383aa82fd88e922a1e751444d14033ae882
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 10:44:14 2018 -0500
+
+    [arrays] Minor fix
+
+ src/hb-open-type.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 381c3548e9022a421bcf88db148cc11f337f3b79
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 00:39:30 2018 -0500
+
+    [array] Add cast operator to add const to Type
+
+    In lieu of constructor removed in previous commit.
+
+ src/hb-array.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 15acf33c228e0c8e0f8cc6a04e566970164dd5f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 00:38:13 2018 -0500
+
+    [array] Remove problematic constructor
+
+ src/hb-array.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 470369a871791b610e0c42212558e83baeb83409
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 00:20:19 2018 -0500
+
+    [array] Add arithmetic operators
+
+ src/hb-array.hh | 22 ++++++++++++++++++----
+ 1 file changed, 18 insertions(+), 4 deletions(-)
+
+commit 6cd60c2f2aa17e3f02b50c19cf640b3f183f3354
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 00:09:06 2018 -0500
+
+    [array] Return Crap instead of Null if Type is not const
+
+    Ouch!
+
+ src/hb-array.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 94e72cf1c9af563fbf522efb7f2e0b1fcd616418
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 00:06:40 2018 -0500
+
+    [array] Add operator *
+
+ src/hb-array.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 68d4a5eee0f248891d20d69b897201d105951aef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 00:02:42 2018 -0500
+
+    [array] Add constructor from fixed-size array
+
+ src/hb-array.hh | 1 +
+ src/hb-iter.hh  | 4 ++--
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit a4354d2fd36377ec8b544c7b88a231cb1273dccd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 23:57:27 2018 -0500
+
+    [array] Organize
+
+ src/hb-array.hh | 75
+ ++++++++++++++++++++++++++++++++++++---------------------
+ 1 file changed, 48 insertions(+), 27 deletions(-)
+
+commit 84c1865821151d83a8798ae11ebba3329a12c560
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 23:52:17 2018 -0500
+
+    [arrays] Reduce Supplier<> even further
+
+ src/hb-array.hh | 24 +++---------------------
+ 1 file changed, 3 insertions(+), 21 deletions(-)
+
+commit 1bcc4fc9f34ab518fc822c9464a73ba3e90f5f1c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 23:47:56 2018 -0500
+
+    Whitespace
+
+ src/hb-ot-shape-complex-arabic-fallback.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit f85f6e815f439075f8c6f5391e5c8dfe77e0f00d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 23:45:07 2018 -0500
+
+    [array] Add operator +=
+
+ src/hb-array.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 7c0e3e9b2b077fced829a10f616ed3d6b51c15c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 23:43:17 2018 -0500
+
+    [array] Add constructor from hb_array_t<const Type>
+
+ src/hb-array.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 92680361ec68734ad38e2158626feebaf18eec88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 23:38:51 2018 -0500
+
+    [arrays] Move Supplier<> to hb-array.hh
+
+ src/hb-array.hh     | 33 +++++++++++++++++++++++++++++++++
+ src/hb-machinery.hh | 32 --------------------------------
+ 2 files changed, 33 insertions(+), 32 deletions(-)
+
+commit 2a3fa3f82ffdb778a2d21fc01e859579161237c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 23:33:03 2018 -0500
+
+    [arrays] Remove unnecessary constructor from Supplier<>
+
+    Looks like operator hb_array_t<> from vector works here. :)
+
+ src/hb-machinery.hh | 5 -----
+ 1 file changed, 5 deletions(-)
+
+commit 507cac4943e987879b95d842fe60643abbf22efa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 23:31:19 2018 -0500
+
+    [arrays] Start moving Supplier<> to hb_array_t<>
+
+ src/hb-machinery.hh | 31 +++++++++++--------------------
+ 1 file changed, 11 insertions(+), 20 deletions(-)
+
+commit 1e2c98126e8500ace31483b05d77478afd59bab8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 22:30:44 2018 -0500
+
+    [arrays] Remove unused stride from Supplier
+
+ src/hb-machinery.hh | 10 +++-------
+ 1 file changed, 3 insertions(+), 7 deletions(-)
+
+commit 0d0fe9df46c645538feaee1ec99a0108383a3669
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 22:29:40 2018 -0500
+
+    [arrays] Remove need of stride in Supplier<>
+
+ src/hb-face.cc      |  6 ++----
+ src/hb-open-file.hh | 19 +++++++++----------
+ src/hb-vector.hh    |  2 +-
+ 3 files changed, 12 insertions(+), 15 deletions(-)
+
+commit dcfa4a8d711716de88b94a370663e9564e3e7ccc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 20:40:07 2018 -0500
+
+    [array] Remove custom hb_bytes_t implementation
+
+ src/hb-array.hh         | 67
+ +++++++++++++++++--------------------------------
+ src/hb-machinery.hh     |  2 +-
+ src/hb-ot-name-table.hh |  8 +++---
+ src/hb-ot-name.cc       | 10 ++++----
+ 4 files changed, 33 insertions(+), 54 deletions(-)
+
+commit 3656f56d47cf6b89a25990d7836704fef79fa5b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 20:35:11 2018 -0500
+
+    [arrays] Minor
+
+ src/hb-array.hh     |  3 ++-
+ src/hb-open-type.hh | 10 ++++------
+ src/hb-vector.hh    |  4 +---
+ 3 files changed, 7 insertions(+), 10 deletions(-)
+
+commit aa8f94714ee720c56be1a3406df7bacb0550158c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 20:20:35 2018 -0500
+
+    [array] Minor
+
+ src/hb-array.hh | 4 ++++
+ src/hb-iter.hh  | 2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 5a552f75468d777d8d4bd3168e28f56a3369eafd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 20:07:44 2018 -0500
+
+    [array] Move hb_array_t and related types to hb-array.hh
+
+ src/Makefile.sources |   1 +
+ src/hb-array.hh      | 241
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-dsalgs.hh     | 206 -------------------------------------------
+ src/hb-machinery.hh  |   1 +
+ src/hb-vector.hh     |   2 +-
+ 5 files changed, 244 insertions(+), 207 deletions(-)
+
+commit 01d06e34ffa746d3737df00bb692cdb1e859c1c6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 16 14:27:43 2018 -0500
+
+    Minor change to explicit_operator aesthetics
+
+ src/hb-iter.hh      | 2 +-
+ src/hb-machinery.hh | 2 +-
+ src/hb-vector.hh    | 4 ++--
+ src/hb.hh           | 4 ++--
+ 4 files changed, 6 insertions(+), 6 deletions(-)
+
+commit b2ebaa9afac0f57006283db92d1f3b4df3d6bd7e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Dec 16 22:38:10 2018 +0330
+
+    Remove redundant 'inline' from methods (#1483)
+
+ src/hb-aat-fdsc-table.hh         |  12 +-
+ src/hb-aat-layout-ankr-table.hh  |  12 +-
+ src/hb-aat-layout-bsln-table.hh  |  13 +-
+ src/hb-aat-layout-common.hh      | 150 +++++++-------
+ src/hb-aat-layout-feat-table.hh  |  46 ++---
+ src/hb-aat-layout-just-table.hh  |  26 +--
+ src/hb-aat-layout-kerx-table.hh  | 120 +++++------
+ src/hb-aat-layout-lcar-table.hh  |  14 +-
+ src/hb-aat-layout-morx-table.hh  | 104 +++++-----
+ src/hb-aat-layout-trak-table.hh  |  28 +--
+ src/hb-aat-layout.hh             |   2 +-
+ src/hb-aat-ltag-table.hh         |   6 +-
+ src/hb-aat-map.hh                |   7 +-
+ src/hb-atomic.hh                 |  26 +--
+ src/hb-blob.hh                   |  32 ++-
+ src/hb-buffer.hh                 |  76 ++++---
+ src/hb-cache.hh                  |  10 +-
+ src/hb-cff-interp-common.hh      | 197 +++++++++---------
+ src/hb-cff-interp-cs-common.hh   | 166 +++++++--------
+ src/hb-cff-interp-dict-common.hh |  26 +--
+ src/hb-cff1-interp-cs.hh         |  21 +-
+ src/hb-cff2-interp-cs.hh         |  48 ++---
+ src/hb-common.cc                 |  13 +-
+ src/hb-debug.hh                  |  20 +-
+ src/hb-directwrite.cc            |   2 +-
+ src/hb-dsalgs.hh                 |  84 ++++----
+ src/hb-face.cc                   |   2 +-
+ src/hb-face.hh                   |   6 +-
+ src/hb-font.hh                   | 216 ++++++++++----------
+ src/hb-ft.cc                     |   8 +-
+ src/hb-glib.cc                   |   2 +-
+ src/hb-icu.cc                    |   2 +-
+ src/hb-iter.hh                   |  18 +-
+ src/hb-kern.hh                   |   8 +-
+ src/hb-machinery.hh              | 210 +++++++++----------
+ src/hb-map.hh                    |  38 ++--
+ src/hb-mutex.hh                  |  12 +-
+ src/hb-null.hh                   |  26 +--
+ src/hb-object.hh                 |  34 ++--
+ src/hb-open-file.hh              |  92 ++++-----
+ src/hb-open-type.hh              | 253 ++++++++++++-----------
+ src/hb-ot-cff-common.hh          | 177 ++++++++--------
+ src/hb-ot-cff1-table.cc          |  32 +--
+ src/hb-ot-cff1-table.hh          | 160 +++++++--------
+ src/hb-ot-cff2-table.cc          |  16 +-
+ src/hb-ot-cff2-table.hh          |  62 +++---
+ src/hb-ot-cmap-table.hh          | 185 +++++++++--------
+ src/hb-ot-color-cbdt-table.hh    |  40 ++--
+ src/hb-ot-color-colr-table.hh    |  18 +-
+ src/hb-ot-color-cpal-table.hh    |  55 +++--
+ src/hb-ot-color-sbix-table.hh    |  48 ++---
+ src/hb-ot-color-svg-table.hh     |  20 +-
+ src/hb-ot-font.cc                |   2 +-
+ src/hb-ot-gasp-table.hh          |   6 +-
+ src/hb-ot-glyf-table.hh          |  37 ++--
+ src/hb-ot-hdmx-table.hh          |  36 ++--
+ src/hb-ot-head-table.hh          |  10 +-
+ src/hb-ot-hhea-table.hh          |   2 +-
+ src/hb-ot-hmtx-table.hh          |  18 +-
+ src/hb-ot-kern-table.hh          |  44 ++--
+ src/hb-ot-layout-base-table.hh   | 104 +++++-----
+ src/hb-ot-layout-common.hh       | 425
+ ++++++++++++++++++++-------------------
+ src/hb-ot-layout-gdef-table.hh   | 126 ++++++------
+ src/hb-ot-layout-gpos-table.hh   | 209 +++++++++----------
+ src/hb-ot-layout-gsub-table.hh   | 360 ++++++++++++++++-----------------
+ src/hb-ot-layout-gsubgpos.hh     | 353 ++++++++++++++++----------------
+ src/hb-ot-layout-jstf-table.hh   |  44 ++--
+ src/hb-ot-map.hh                 |  38 ++--
+ src/hb-ot-math-table.hh          | 142 ++++++-------
+ src/hb-ot-maxp-table.hh          |  12 +-
+ src/hb-ot-name-table.hh          |  21 +-
+ src/hb-ot-os2-table.hh           |  34 ++--
+ src/hb-ot-post-table.hh          |  26 +--
+ src/hb-ot-shape-complex-indic.cc |  10 +-
+ src/hb-ot-shape-complex-khmer.cc |  10 +-
+ src/hb-ot-shape.hh               |   6 +-
+ src/hb-ot-stat-table.hh          |  16 +-
+ src/hb-ot-var-avar-table.hh      |   8 +-
+ src/hb-ot-var-fvar-table.hh      |  55 +++--
+ src/hb-ot-var-hvar-table.hh      |  16 +-
+ src/hb-ot-var-mvar-table.hh      |  10 +-
+ src/hb-ot-vorg-table.hh          |  22 +-
+ src/hb-set-digest.hh             |  41 ++--
+ src/hb-set.hh                    | 114 +++++------
+ src/hb-shape.cc                  |  14 +-
+ src/hb-shaper.cc                 |  14 +-
+ src/hb-shaper.hh                 |  10 +-
+ src/hb-subset-cff-common.hh      | 175 ++++++++--------
+ src/hb-subset-cff1.cc            |  91 ++++-----
+ src/hb-subset-cff2.cc            |  36 ++--
+ src/hb-subset-plan.hh            |  12 +-
+ src/hb-subset.hh                 |   4 +-
+ src/hb-ucdn.cc                   |   2 +-
+ src/hb-unicode.hh                |  26 +--
+ src/hb-uniscribe.cc              |  16 +-
+ src/hb-utf.hh                    |  54 +++--
+ src/hb-vector.hh                 |  86 ++++----
+ 97 files changed, 2911 insertions(+), 2987 deletions(-)
+
+commit 7251c7729061b7df29efe2b466315e96c81ad03f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 15 21:00:55 2018 -0500
+
+    Whitespace
+
+ src/hb-buffer-serialize.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 829b56b1a22736eac49132b2e56dc480157afca2
+Author: Behdad Esfahbod <behdad@google.com>
+Date:   Sat Dec 15 13:02:13 2018 -0500
+
+    Whitespace
+
+ src/hb-ot-cff-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 42a1012562c1f020f470526a34b68ed21ad138cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 13 19:39:59 2018 -0500
+
+    [subset] Actually subset GDEF
+
+ src/hb-subset.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit c9c746c7f6091e575fd74ba8f8cae2c4fd44a1ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 13 18:37:37 2018 -0500
+
+    [subset] Fix up ClassDef some more
+
+ src/hb-ot-layout-common.hh | 13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
+
+commit 7ee6128902333716dd8d8df6e38a8d1ebacb0a46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 13 18:32:04 2018 -0500
+
+    [subset] Fix ClassDefFormat1 subsetting
+
+ src/hb-ot-layout-common.hh | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+commit 1b6d0c44b3067f5840d3fdac99fbc7448d0f37bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 13 18:10:48 2018 -0500
+
+    [subset] Sketch GDEF subsetting
+
+ src/hb-ot-layout-gdef-table.hh | 20 ++++++++++++++++++++
+ src/hb-ot-layout-gsubgpos.hh   |  2 ++
+ 2 files changed, 22 insertions(+)
+
+commit 705e2f5056d60c28154004e0c5d3b0ec67fe93c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 13 17:48:42 2018 -0500
+
+    [subset] Implement for ClassDef
+
+ src/hb-ot-layout-common.hh     | 80
+ ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-gsub-table.hh |  8 ++---
+ 2 files changed, 84 insertions(+), 4 deletions(-)
+
+commit 6e33a3955df77b9d1fda5ea44302d97b21e7871c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 13 16:40:01 2018 -0500
+
+    Minor
+
+ src/hb-machinery.hh            | 12 +++++++++---
+ src/hb-ot-cmap-table.hh        |  3 +--
+ src/hb-ot-layout-gsub-table.hh |  8 ++++----
+ 3 files changed, 14 insertions(+), 9 deletions(-)
+
+commit cc65901ca7185df926570d5067ace763a2cc759e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 13 16:01:45 2018 -0500
+
+    [serialize] Implement for ClassDef
+
+ src/hb-ot-layout-common.hh | 33 +++++++++++++++++++++++++++++++--
+ 1 file changed, 31 insertions(+), 2 deletions(-)
+
+commit e5309e4fd8583aa5c5ad9f3934d8aa593c850468
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 13 15:57:12 2018 -0500
+
+    [serialize] Implement for ClassDefFormat2
+
+ src/hb-ot-layout-common.hh | 50
+ ++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 46 insertions(+), 4 deletions(-)
+
+commit c8b43cbe316b07507aece4dc769f38226cd706da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 13 15:50:13 2018 -0500
+
+    [serialize] Implement for ClassDefFormat1
+
+ src/hb-ot-layout-common.hh | 34 ++++++++++++++++++++++++++++++++++
+ 1 file changed, 34 insertions(+)
+
+commit 576103132945c9d916514720d4034b398e099cfa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 12 21:21:26 2018 -0500
+
+    [subset] Minor
+
+ src/hb-subset.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 798e98c47bd9fa4d434487ae92e2c88ebb8a19a5
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 12 18:08:15 2018 -0800
+
+    [CFF] bad offset in Index (#1476)
+
+    * Update hb-ot-cff-common.hh
+
+    * fix bug
+
+    * bummer fix wasn't hit. refix
+
+    * additional sanity check
+
+    * Added test cases for oss-fuzz issues 11805, 11806
+
+ src/hb-ot-cff-common.hh                                   |  10
+ ++++++++--
+ ...clusterfuzz-testcase-hb-subset-fuzzer-5643036478930944 | Bin 0 ->
+ 369 bytes
+ ...clusterfuzz-testcase-hb-subset-fuzzer-5686186874503168 | Bin 0 ->
+ 962 bytes
+ 3 files changed, 8 insertions(+), 2 deletions(-)
+
+commit bcb4ecaf68c7219e89a801352bfc6a682b1581ef
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 12 17:36:01 2018 -0800
+
+    [CFF] check out of range FD index (#1477)
+
+    * add fd index checks to subr subsetter
+
+    also added oss-fuzz test case
+
+    * undid SubrSubsetParam::is_valid
+
+    because already validated by SubrClosures.valid
+
+ src/hb-subset-cff-common.hh                              |  10 ++++++++++
+ ...lusterfuzz-testcase-hb-subset-fuzzer-5762137968869376 | Bin 0 ->
+ 2037 bytes
+ 2 files changed, 10 insertions(+)
+
+commit 3f8e7a98d3cc10fefe65b9638c8abdf3ebe152cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 12 11:32:57 2018 -0500
+
+    [util/hb-subset] Add --layout to keep GDEF/GSUB/GPOS
+
+    Will become default and option removed in the future.
+
+ util/hb-subset.cc | 1 +
+ util/options.cc   | 1 +
+ util/options.hh   | 2 ++
+ 3 files changed, 4 insertions(+)
+
+commit 2cc993e035cb37711f894968246817e53a9e823d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 12 10:07:38 2018 -0500
+
+    [dispatch] Minor
+
+ src/hb-ot-layout-gpos-table.hh | 4 +---
+ src/hb-ot-layout-gsub-table.hh | 4 +---
+ 2 files changed, 2 insertions(+), 6 deletions(-)
+
+commit 602fbfe3c96b3f18b0109239528ba18a19be4948
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 12 09:56:47 2018 -0500
+
+    [sanitize] Fix sanitizing sublookup array
+
+ src/hb-ot-layout-common.hh | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit c78e4784fbe06ceb27b54a1d8908016ade071cb4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 12 09:50:18 2018 -0500
+
+    [dispatch] Minor
+
+ src/hb-machinery.hh          | 1 +
+ src/hb-ot-layout-gsubgpos.hh | 3 ---
+ src/hb-subset.hh             | 1 -
+ 3 files changed, 1 insertion(+), 4 deletions(-)
+
+commit f9d211af1d6d78d092038d263b222ec8a65cf09d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 12 09:44:30 2018 -0500
+
+    Revert "Minor fix re sanitize of Lookup subtables"
+
+    This reverts commit 7146718bef81492e13aede0a2801cda1da41ce35.
+
+    Fixing differently.
+
+ src/hb-ot-layout-common.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 7ee5c52345c122436e054062084cd51292b90ad1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Dec 12 15:14:37 2018 +0330
+
+    minor style fix, use void in methods on no argument
+
+ src/hb-aat-fdsc-table.hh        |   4 +-
+ src/hb-aat-layout-common.hh     |   6 +-
+ src/hb-aat-layout-feat-table.hh |   4 +-
+ src/hb-aat-layout-trak-table.hh |  18 +--
+ src/hb-aat-layout.cc            |   4 +-
+ src/hb-buffer.cc                |  48 +++----
+ src/hb-directwrite.cc           | 297
+ +++++++++++++++++++---------------------
+ src/hb-dsalgs.hh                |   5 +-
+ src/hb-map.hh                   |  20 +--
+ src/hb-ot-cmap-table.hh         |   2 +-
+ src/hb-ot-color-cbdt-table.hh   |   2 +-
+ src/hb-ot-color-cpal-table.hh   |   4 +-
+ src/hb-ot-color-sbix-table.hh   |  10 +-
+ src/hb-ot-color-svg-table.hh    |  15 +-
+ src/hb-ot-glyf-table.hh         |   2 +-
+ src/hb-ot-hdmx-table.hh         |   6 +-
+ src/hb-ot-layout-base-table.hh  |  11 +-
+ src/hb-ot-os2-table.hh          |  15 +-
+ 18 files changed, 211 insertions(+), 262 deletions(-)
+
+commit a33f238f8888cc969e1e393deda0518fb8dd6b13
+Merge: 7146718b 1e09add2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Dec 12 12:44:06 2018 +0330
+
+    Merge pull request #1474 from fanc999/master.msvc
+
+    Few fixes for Visual Studio builds
+
+commit 7146718bef81492e13aede0a2801cda1da41ce35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 11 23:44:29 2018 -0500
+
+    Minor fix re sanitize of Lookup subtables
+
+    We were dereferencing Null pointers and trying to sanitize them,
+    which is not necessary...
+
+ src/hb-ot-layout-common.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit ce069d193229cde12c77a3f464fc10286bedf5f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 11 23:07:48 2018 -0500
+
+    Minor
+
+ src/hb-open-type.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 1aea86944605e7e18acfd2c0a77ba60e62239274
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 11 22:53:58 2018 -0500
+
+    [subset] Map glyphs during SingleSubst subsetting
+
+    Ha!
+
+ src/hb-ot-layout-gsub-table.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 41d1a1c10f7e5ca69a337ae164d270e09b5f93ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 11 22:48:27 2018 -0500
+
+    [subset] Minor
+
+ src/hb-machinery.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2aba2c6c73301396f7e0e5dee819ab6863e74900
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 11 21:18:47 2018 -0500
+
+    [serialize] Break down assert
+
+ src/hb-machinery.hh | 18 ++++++++----------
+ 1 file changed, 8 insertions(+), 10 deletions(-)
+
+commit 9844c880e280e9cd28dcbeac2e581ac923c5ddf3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 11 17:28:04 2018 -0500
+
+    Minor
+
+ test/shaping/Makefile.am | 2 ++
+ util/Makefile.am         | 2 ++
+ 2 files changed, 4 insertions(+)
+
+commit 2941208f1eedabec2715b2a67d40f058df7eb5e6
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 11 12:21:24 2018 -0800
+
+    [CFF] oss-fuzz issue 11690 ASSERT: substr.offset >= opStart (#1461)
+
+    * fix oss-fuzz 11690: substr.offset >= opStart
+
+    detect recursive subroutine call & handle as error
+
+    * fix build failure
+
+    * add minimized test case for oss-fuzz 11690
+
+    * removed asserts
+
+ src/hb-cff-interp-common.hh                             |   9 ++++-----
+ src/hb-subset-cff-common.hh                             |  12
+ ++++++++++--
+ src/hb-subset-cff1.cc                                   |   4 ++--
+ src/hb-subset-cff2.cc                                   |   4 ++--
+ ...testcase-minimized-hb-subset-fuzzer-5750420593442816 | Bin 0 ->
+ 96091 bytes
+ 5 files changed, 18 insertions(+), 11 deletions(-)
+
+commit 333586245cb37668c8a29af17920474c09667f4b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 11 12:20:20 2018 -0800
+
+    minimize use of assert: removed or changed to error handling (#1467)
+
+ src/hb-ot-cff-common.hh     |  2 +-
+ src/hb-ot-cff1-table.hh     | 12 ++++++++----
+ src/hb-subset-cff-common.cc |  6 ++++--
+ src/hb-subset-cff-common.hh |  1 -
+ src/hb-subset-cff1.cc       | 22 +++++++++++++++++-----
+ src/hb-subset-cff2.cc       | 14 +++++++++++---
+ 6 files changed, 41 insertions(+), 16 deletions(-)
+
+commit f24498c1e95e816889eb7a2f8b1062bbf15bed1b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Dec 11 23:02:52 2018 +0330
+
+    [ci] Fix Travis macOS bot ICU issue (#1472)
+
+ .travis.yml | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 9f3a51ddb952e1281f9a656fde7193c3e3b8dad2
+Author: 👻 <sarabi@Corsac-Fox.local>
+Date:   Tue Dec 11 13:38:05 2018 -0500
+
+    [ucdn] Fix header
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1470
+
+ src/hb-ucdn/ucdn.h | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit b225593d6baf3455e1ac951efc0df5015fdf7c69
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Dec 11 13:19:17 2018 -0500
+
+    Correct REPLACEMENT CHARACTER's code point to FFFD (#1471)
+
+ test/shaping/hb_test_tools.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1e09add232e14ef61d2f222a5ee05a2105af64f0
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Wed Dec 12 01:32:01 2018 +0800
+
+    test/api: Fix building on pre-C99 compilers
+
+    Ensure variables are declared at the top of the block.
+
+ test/api/hb-test.h         |  3 ++-
+ test/api/test-aat-layout.c |  3 ++-
+ test/api/test-font.c       |  2 +-
+ test/api/test-map.c        |  9 ++++++---
+ test/api/test-ot-color.c   |  9 +++++----
+ test/api/test-ot-face.c    | 14 ++++++++------
+ test/api/test-ot-name.c    | 30 ++++++++++++++++--------------
+ test/api/test-ot-tag.c     | 11 ++++++-----
+ 8 files changed, 46 insertions(+), 35 deletions(-)
+
+commit 09b16c536d31376de771eedde54620dd6c8f39d7
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Wed Dec 12 01:23:53 2018 +0800
+
+    CMake: Fix Introspection builds
+
+    We need to add -DHB_AAT_H and -DHB_AAT_H_IN to the flags that
+    are passed
+    to g-ir-scanner, so that introspection builds can proceed normally.
+
+ CMakeLists.txt | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 1683bb2c9337fa34e5e80d459ab5eab99d7a9804
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Dec 8 13:57:39 2018 +0330
+
+    [glyf] minor
+
+ src/hb-ot-glyf-table.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit f7cfe99815c07f82d5ad253af1e811db734bf92b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Dec 8 13:40:44 2018 +0330
+
+    [os2] Move typometrics detection logic to the table (#1465)
+
+ src/hb-ot-hmtx-table.hh | 14 +++++---------
+ src/hb-ot-os2-table.hh  |  7 ++++---
+ 2 files changed, 9 insertions(+), 12 deletions(-)
+
+commit 47cf9a9633bbff12fef1131e7179dfc351f7e5f3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Dec 8 10:20:25 2018 +0330
+
+    Apply non-controversial parts of ot-style (#1464)
+
+    Things to be used in https://github.com/harfbuzz/harfbuzz/pull/1459
+
+ src/hb-aat-fdsc-table.hh    | 29 +++++++++++++++++++++++++---
+ src/hb-aat-layout-common.hh |  1 +
+ src/hb-ot-head-table.hh     | 13 +++++++++++++
+ src/hb-ot-os2-table.hh      | 46
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-stat-table.hh     | 38 ++++++++++++++++++-------------------
+ 5 files changed, 105 insertions(+), 22 deletions(-)
+
+commit 4d809696ef4db046d11072e5433ea5ff36bd7b26
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Dec 7 20:49:39 2018 -0800
+
+    fix for issue #1447 (#1462)
+
+    Added case for OpCode_BaseFontName. This opcode in spec but
+    practically unused.
+    Added a comment for default case which can't be hit
+
+ src/hb-ot-cff1-table.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 1abd4fcaec31053b442525d7f240af489c5974b1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Dec 7 22:34:12 2018 +0330
+
+    [fdsc] minor
+
+ src/hb-aat-fdsc-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 59345cdef38cf1f514a6a0eb6e8852350acb6166
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Dec 6 13:36:26 2018 -0800
+
+    [CFF] Refix oss-fuzz 11714: set_blends (PR #1458) (#1460)
+
+    * pass subarray of stack to set_blends
+
+    * get_subarray to return a value, not ref
+
+    * restored error check (with tweak)
+
+ src/hb-cff-interp-common.hh |  5 +++++
+ src/hb-cff2-interp-cs.hh    | 14 +++++++++-----
+ 2 files changed, 14 insertions(+), 5 deletions(-)
+
+commit 20245f0000a0f04f2ba172b51ce69ee7ebb256aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 6 10:27:37 2018 -0800
+
+    Fix likely check
+
+    Ouch!
+
+ src/hb-cff-interp-dict-common.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d866e905fd555d393464ed58d5fc11ee453c7ea4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 6 10:26:32 2018 -0800
+
+    Add default value to first argument of sub_array()
+
+ src/hb-dsalgs.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit f1352f7486caaf6d3480ef2ac6b4719acf73e6a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 6 10:21:06 2018 -0800
+
+    Add sub_array to hb_vector_t
+
+ src/hb-vector.hh | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+commit ca23b719357b01e98a5cf533bbf637d6706a4ec2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 6 10:19:03 2018 -0800
+
+    Add default-value for second arg of sub_array()
+
+ src/hb-dsalgs.hh    | 7 +++----
+ src/hb-open-type.hh | 8 ++++----
+ 2 files changed, 7 insertions(+), 8 deletions(-)
+
+commit 6ad3fcddaf2ba8ebc9ad49ff9e7b33b60fcad16a
+Merge: f95324a3 ae087d10
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Dec 6 10:21:00 2018 +0330
+
+    Merge pull request #1458 from harfbuzz/cff-check-blends
+
+    [CFF] oss-fuzz issue 11714: set_blends
+
+commit ae087d10c22249f3aec3239e4eac98a728f71f75
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 5 21:47:34 2018 -0800
+
+    add minimized test case for oss-fuzz issue 11714
+
+ ...-testcase-minimized-hb-subset-fuzzer-5710107829075968 | Bin 0 ->
+ 3660 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 1ccbdcf73bbc967f5f94c0bc7f7e869bd87d9fa0
+Merge: 14d29a10 f95324a3
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 5 21:37:38 2018 -0800
+
+    Merge branch 'master' into cff-check-blends
+
+commit 14d29a10437205566c4bd7bcfa2282d34d9f4f2f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 5 21:33:29 2018 -0800
+
+    check number of blends against args on stack
+
+ src/hb-cff2-interp-cs.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit f95324a3351c1f699214ad84d073268218ea83a3
+Merge: 6727c4b6 9d8f3b0d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Dec 6 08:33:44 2018 +0330
+
+    Merge pull request #1457 from harfbuzz/cff-varstore-sanitize
+
+    [CFF] oss-fuzz issue 11713 (CFF2VariationStore::serialize)
+
+commit 6727c4b6f0356b08803b4d5cde608ec004e3533f
+Merge: d9dabc00 34e3ef8f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 5 17:37:21 2018 -0800
+
+    Merge pull request #1456 from harfbuzz/cff-subr-sanitize
+
+    [CFF] fix oss-fuzz issue 11691 (BlendArg::set_blends)
+
+commit 9d8f3b0dfbf39f5dfa25d52f47e8af6ad318eb17
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 5 17:14:51 2018 -0800
+
+    add minimized test case for oss-fuzz issue 11713
+
+ ...z-testcase-minimized-hb-subset-fuzzer-5660711141769216 | Bin 0 ->
+ 383 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit c31092ab34641072606f854408eb1bea18ed2507
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 5 17:04:55 2018 -0800
+
+    sanitize variationStore in CFF2 against its size
+
+ src/hb-ot-cff2-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 34e3ef8ff394f281b8d7e2c08f346a9495692edc
+Merge: 72d8f763 d9dabc00
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 5 15:50:05 2018 -0800
+
+    Merge branch 'master' into cff-subr-sanitize
+
+commit 72d8f76368b264a42fe58438fe15811d458a7935
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 5 15:49:11 2018 -0800
+
+    add minimized test case for oss-fuzz issue 11691
+
+ ...z-testcase-minimized-hb-shape-fuzzer-5686369209286656 | Bin 0 ->
+ 2880 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit d9dabc00e9278a346e85538212c126da7e610d55
+Merge: 81cfd3c7 010e2ddb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 5 15:39:34 2018 -0800
+
+    Merge pull request #1454 from harfbuzz/cff-fixbcd
+
+    [CFF] fix oss-fuzz issue 11674: parse_bcd
+
+commit 81cfd3c775dbc470f57d7fe2775cc068ffa367b6
+Merge: 8394a6cb 6708c559
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 5 15:37:15 2018 -0800
+
+    Merge pull request #1455 from harfbuzz/cff-strinc_assert
+
+    [CFF] fix oss-fuzz issue 11675 (ASSERT: count <= str.len)
+
+commit 6dcfda92c17a7701479118751a8290246e9a3c05
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 5 15:07:46 2018 -0800
+
+    sanitize CFF1 & CFF2 global subrs
+
+ src/hb-ot-cff1-table.hh | 2 +-
+ src/hb-ot-cff2-table.hh | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 6708c5595fc6babdae0132f8a23cbe3558a58703
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 5 12:51:18 2018 -0800
+
+    fix oss-fuzz issue 11675 (ASSERT: count <= str.len)
+
+    Also added an additional error check to avail ()
+
+ src/hb-cff-interp-common.hh                           |  18
+ ++++++++++++++++--
+ ...stcase-minimized-hb-subset-fuzzer-5768186323009536 | Bin 0 ->
+ 337 bytes
+ 2 files changed, 16 insertions(+), 2 deletions(-)
+
+commit 010e2ddb384b5a721172fd7466aafec58dbf8063
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 5 12:23:58 2018 -0800
+
+    minimized test case for oss-fuzz issue 11674
+
+ ...zz-testcase-minimized-hb-subset-fuzzer-5672006905757696 | Bin 0 ->
+ 73 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 2cb9d4c183afc838ecf2ba0d47814e9eaa6f09c6
+Merge: a5fa843c 8394a6cb
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 5 11:25:29 2018 -0800
+
+    Merge branch 'master' into cff-fixbcd
+
+commit a5fa843c746e20aaca48ece6cff057deb8d916ca
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 5 11:18:16 2018 -0800
+
+    fixed a bug with fractional part in a negative value
+
+ src/hb-cff-interp-dict-common.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 8394a6cb252dd8b4230c2b59e8c346ec5403bf88
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Dec 5 15:23:41 2018 +0330
+
+    [os2] Make newer table fields accessible (#1452)
+
+ src/hb-ot-os2-table.hh | 88
+ +++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 66 insertions(+), 22 deletions(-)
+
+commit 5ab086ebb18112ef48bf6c913acc91b2009a9bed
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Dec 5 14:17:37 2018 +0330
+
+    [fdsc] Implement the table parsing
+
+    Related to https://github.com/harfbuzz/harfbuzz/issues/1337
+
+    May used in addition to an API related to STAT.
+
+    Lots of Apple fonts have it.
+
+ src/Makefile.sources     |   1 +
+ src/hb-aat-fdsc-table.hh | 103
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.cc     |   1 +
+ 3 files changed, 105 insertions(+)
+
+commit 8f80e53341a3d5bac6c2c39ab6d6973eedb0b074
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Dec 5 13:51:14 2018 +0330
+
+    [gasp] Implement the table parsing
+
+    May or may not be used in
+    https://github.com/harfbuzz/harfbuzz/pull/1432
+
+ src/Makefile.sources    |  1 +
+ src/hb-ot-gasp-table.hh | 84
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout.cc     |  5 +--
+ 3 files changed, 88 insertions(+), 2 deletions(-)
+
+commit 79e7e3445efef2dc57f8a10c7e355e802af08868
+Merge: cf4b7db6 78f639b8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Dec 5 13:25:18 2018 +0330
+
+    Merge pull request #1449 from harfbuzz/cff-fixcharset
+
+    [CFF] fix for oss-fuzz 11657: Charset overrun
+
+commit cf4b7db6b1e01c11d7a8a26d95cf947935a234a7
+Merge: 32cc46c7 803d2f92
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Dec 5 13:23:23 2018 +0330
+
+    Merge pull request #1448 from harfbuzz/cff-leak
+
+    [CFF] fix leak: oss-fuzz 11662
+
+commit 620d1ef588c6ce25644891cfe4b9c20fd8a9d1db
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 5 00:36:11 2018 -0800
+
+    fix unsigned long const
+
+ src/hb-cff-interp-dict-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 28dfb4c14280b05ad0a519f9df2b0eda41a62540
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Dec 5 00:26:03 2018 -0800
+
+    fix signed/unsigned comparison
+
+ src/hb-cff-interp-dict-common.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f9cee08edd32182044407bf6ffde00df0feb09b7
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 23:58:26 2018 -0800
+
+    use sized int types in parse_bcd
+
+ src/hb-cff-interp-dict-common.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit c01a5f32a33fa875de68ca29a4672fd36a05245b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 23:23:23 2018 -0800
+
+    refix
+
+ src/hb-cff-interp-dict-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 755fefc92113e469a1aadee2546958fede156c01
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 23:18:28 2018 -0800
+
+    fix bug
+
+ src/hb-cff-interp-dict-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0e81b153aff1f2e301e73ca1a15a9bc5b2e7bb82
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 22:40:07 2018 -0800
+
+    fix typo
+
+ src/hb-cff-interp-dict-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 85d4b15cd88ce9a6ffccccf90300f9c184166058
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 22:30:33 2018 -0800
+
+    include float.h
+
+ src/hb-cff-interp-dict-common.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5a7c371e4c6f1775ebbfe120fafe92afe402a954
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 22:24:38 2018 -0800
+
+    check overflow & clamp
+
+ src/hb-cff-interp-dict-common.hh | 36
+ +++++++++++++++++++++++++++---------
+ 1 file changed, 27 insertions(+), 9 deletions(-)
+
+commit 32cc46c75a5f163f254b7998ed9193d5bbc85e4b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 21:32:34 2018 -0800
+
+    [CFF] fix oss-fuzz issue 11670: NULL dereference (#1450)
+
+    * guard against no subr access
+
+    * code tweak
+
+    * add minimized testcase for oss-fuzz 11670 (Null deference)
+
+ src/hb-cff-interp-cs-common.hh                     |  22
+ ++++++++++++++++-----
+ src/hb-ot-cff-common.hh                            |   2 +-
+ ...ase-minimized-hb-subset-fuzzer-5672913680728064 | Bin 0 -> 861 bytes
+ 3 files changed, 18 insertions(+), 6 deletions(-)
+
+commit 78f639b8bf508ccfb27224f12442f8e8a1460e08
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 14:17:03 2018 -0800
+
+    added minimized testcase for oss-fuzz issue 11657
+
+ ...zz-testcase-minimized-hb-shape-fuzzer-5700264032468992 | Bin 0 ->
+ 648 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit d3d2f32c6e85de1d7fbbb18afef356e09110e61c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 13:51:26 2018 -0800
+
+    fix oss-fuzz 11657: buffer overrun
+
+    Check overrun in Charset1_2::get_glyph
+
+ src/hb-ot-cff1-table.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit d0a250a7b15f1099c2005bc2427d62e7370dcc33
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Dec 4 23:42:13 2018 +0330
+
+    Reuse hb_aat_layout_has_* logic in coretext-aat detection logic
+    (#1442)
+
+ src/hb-coretext.cc | 16 ++--------------
+ 1 file changed, 2 insertions(+), 14 deletions(-)
+
+commit 803d2f92dca329a84d92c224a73e13906e8b8d56
+Merge: 6ce8d10b c775adc1
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 11:01:26 2018 -0800
+
+    Merge branch 'master' into cff-leak
+
+commit 6ce8d10b45598f5f6dade38e65486f793f33d0b6
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 10:39:17 2018 -0800
+
+    add unlikely to error handling
+
+ src/hb-ot-cff1-table.hh | 2 +-
+ src/hb-ot-cff2-table.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit b61f74f69a84f427b40deefefed429fbc915981c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 10:30:35 2018 -0800
+
+    added minimized test case for oss-fuzz issue 11662
+
+ ...testcase-minimized-hb-shape-fuzzer-5175735354916864 | Bin 0 ->
+ 354461 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 0b952e6026c8be13d16d97f464034ee477e6282f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 10:22:35 2018 -0800
+
+    more leak fixes
+
+ src/hb-ot-cff1-table.hh | 2 +-
+ src/hb-ot-cff2-table.hh | 3 ++-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit c775adc1383f72f02b1329628b3eba1dc377a0f7
+Merge: c968869f 04f2ca94
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Dec 4 21:30:07 2018 +0330
+
+    Merge pull request #1444 from harfbuzz/cff-assert
+
+    removed assert, fixes https://github.com/harfbuzz/harfbuzz/issues/1443
+
+commit 9473463f5c884fcb1de8a7ba7410da2601e6ffa8
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 09:58:48 2018 -0800
+
+    fix attempt for oss-fuzz 11662 leak
+
+ src/hb-ot-cff1-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 04f2ca94212983d675ed2cd36350be23ff2a6e19
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Dec 4 09:24:07 2018 -0800
+
+    removed assert
+
+ src/hb-ot-cff1-table.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit c968869f212dbfcb86d42fb36049328521cbf00c
+Merge: 8c05b955 c48f53d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 4 04:14:13 2018 -0500
+
+    Merge pull request #1441 from harfbuzz/cff-doublenum
+
+    use double as CFF Number implementation
+
+commit c48f53d30901dfc20b7432c2947e66642010dc4e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Dec 3 16:59:41 2018 -0800
+
+    more double changes
+
+ src/hb-cff2-interp-cs.hh       | 4 ++--
+ test/api/test-ot-extents-cff.c | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 9424e8052686a6a93e0d30e38aecbe927db9d787
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Dec 3 16:18:10 2018 -0800
+
+    added minimized test cases
+
+ ...zz-testcase-minimized-hb-shape-fuzzer-5647267827023872 | Bin 0 ->
+ 655 bytes
+ ...zz-testcase-minimized-hb-shape-fuzzer-5725855502827520 | Bin 0 ->
+ 655 bytes
+ ...zz-testcase-minimized-hb-shape-fuzzer-5736657639178240 | Bin 0 ->
+ 459 bytes
+ 3 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 5fff6ab0024547a8ac47723a0047f4b17416d6ce
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Dec 3 16:06:58 2018 -0800
+
+    additional precision made a difference in extents test
+
+ src/hb-cff-interp-common.hh    | 2 +-
+ src/hb-cff2-interp-cs.hh       | 2 +-
+ test/api/test-ot-extents-cff.c | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 9e5180cd444b6900a0fa0c3df4c8138f9a663383
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Dec 3 15:32:42 2018 -0800
+
+    more double changes
+
+ src/hb-cff-interp-common.hh      |  8 ++++----
+ src/hb-cff-interp-dict-common.hh | 10 +++++-----
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 9af33d7a2ad5ce88fc508bc5c6a56be4650d2621
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Dec 3 14:48:46 2018 -0800
+
+    Number to use double for all types
+
+ src/hb-cff-interp-common.hh | 84
+ +++++++--------------------------------------
+ 1 file changed, 13 insertions(+), 71 deletions(-)
+
+commit 8c05b955eb4aa088b2b5df9b6415863486eaf59c
+Merge: d19b1680 01f628cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 3 14:30:51 2018 -0500
+
+    Merge pull request #1439 from ebraminio/tracking
+
+    [aat] Expose hb_aat_layout_has_tracking API
+
+commit 01f628cf5571b8b58108ab66cfc3e929c9840e31
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Dec 3 22:04:48 2018 +0330
+
+    [aat] Expose hb_aat_layout_has_tracking API
+
+ docs/harfbuzz-sections.txt  |   7 ++++---
+ src/hb-aat-layout.cc        |   9 ++++++++-
+ src/hb-aat-layout.h         |   8 ++++++++
+ src/hb-aat-layout.hh        |   3 ---
+ test/api/fonts/aat-morx.ttf | Bin 0 -> 1620 bytes
+ test/api/fonts/aat-trak.ttf | Bin 0 -> 2456 bytes
+ test/api/test-aat-layout.c  |  13 +++++++++++++
+ 7 files changed, 33 insertions(+), 7 deletions(-)
+
+commit d19b1680b53e54f449736432f369a676c394ebf8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 3 10:41:37 2018 -0500
+
+    [aat] Expose a couple APIs
+
+    New API:
+    +hb_aat_layout_has_substitution()
+    +hb_aat_layout_has_positioning()
+
+ docs/harfbuzz-sections.txt |  2 ++
+ src/hb-aat-layout.cc       | 20 ++++++++++++++++----
+ src/hb-aat-layout.h        | 16 ++++++++++++++++
+ src/hb-aat-layout.hh       |  6 ------
+ 4 files changed, 34 insertions(+), 10 deletions(-)
+
+commit 84efe0438e1cfc5b070e114b70e8c070be6119ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 2 12:38:53 2018 -0500
+
+    [aat] Fix division sign fallout
+
+    Happened after 11d2f49af8f53340134c844173f4d8655b00dea3
+    since now nClasses is unsigned int...
+
+ src/hb-aat-layout-common.hh                               |   2 +-
+ ...zz-testcase-minimized-hb-shape-fuzzer-5768046065483776 | Bin 0 ->
+ 342 bytes
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 2087f5a2a743380b36399ba8a2b4ff9e93890fcf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 1 20:04:45 2018 -0500
+
+    Add casts to hb_array_t<>
+
+ src/hb-open-type.hh | 13 ++++++++++---
+ src/hb-vector.hh    |  2 ++
+ 2 files changed, 12 insertions(+), 3 deletions(-)
+
+commit 58d4d19947794aded4e966290b01e1034f216a7d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 1 19:34:18 2018 -0500
+
+    Simplify build source list
+
+ CMakeLists.txt       |  12 +--
+ src/Makefile.am      |   6 --
+ src/Makefile.sources | 231
+ ++++++++++++++++++++++++---------------------------
+ 3 files changed, 111 insertions(+), 138 deletions(-)
+
+commit 967a204ee92548163a0d19678a237dcaf3720c20
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 1 19:28:17 2018 -0500
+
+    Minor
+
+ test/api/hb-subset-test.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 11d2f49af8f53340134c844173f4d8655b00dea3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 1 13:12:21 2018 -0500
+
+    New approach to change BigEndian casts to be int-sized
+
+    Fixes spurious warnings like:
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1436
+
+ src/hb-open-type.hh | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+commit 50e0273ab18acd2fbb21bcf18ad487092e890b4e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 1 13:03:52 2018 -0500
+
+    Change hb_assert_unsigned_t<> to hb_is_signed<>
+
+ src/hb-dsalgs.hh | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+commit c3a8b047aab47e40dc107a952b3a1472068ec932
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 1 00:14:48 2018 -0500
+
+    Revert "Change BigEndian casts to be int-sized"
+
+    This reverts commit eb5ddd32bf4e458ca0af8d5784f8fd46485ad225.
+
+    Broke tests, badly.  To be investigated and reenabled.
+
+ src/hb-open-type.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit be45677ab605efc711a433323d66e4051c289252
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 1 00:04:29 2018 -0500
+
+    Minor
+
+ src/hb-ot-layout-gsub-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit eb5ddd32bf4e458ca0af8d5784f8fd46485ad225
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 1 00:03:01 2018 -0500
+
+    Change BigEndian casts to be int-sized
+
+    Fixes spurious warnings like:
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1436
+
+ src/hb-open-type.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit e8860fdcaa69e3452edd903f78599bc8fa9d109c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 23:38:24 2018 -0500
+
+    Fix more warning
+
+ src/hb-ot-cff-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit af349ee3487b31c2328f0a37a43d31b248ed14e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 23:20:50 2018 -0500
+
+    Fix warning
+
+ src/hb-ot-cff-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 825df6dbc7fd013c68d7b5672f81e69b69bc14e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 23:04:59 2018 -0500
+
+    [CFF] Change spaces to tabs
+
+ src/hb-cff-interp-common.hh      | 389 ++++++++++++++++-----------------
+ src/hb-cff-interp-cs-common.hh   | 324 ++++++++++++++--------------
+ src/hb-cff-interp-dict-common.hh | 190 ++++++++--------
+ src/hb-cff1-interp-cs.hh         |  72 +++----
+ src/hb-cff2-interp-cs.hh         |  76 +++----
+ src/hb-ot-cff-common.hh          | 128 +++++------
+ src/hb-ot-cff1-table.cc          |   4 +-
+ src/hb-ot-cff1-table.hh          | 456
+ +++++++++++++++++++--------------------
+ src/hb-ot-cff2-table.cc          |   4 +-
+ src/hb-ot-cff2-table.hh          | 216 +++++++++----------
+ src/hb-subset-cff-common.cc      |  76 +++----
+ src/hb-subset-cff-common.hh      | 384 ++++++++++++++++-----------------
+ src/hb-subset-cff1.cc            | 416
+ +++++++++++++++++------------------
+ src/hb-subset-cff1.hh            |   2 +-
+ src/hb-subset-cff2.cc            | 240 ++++++++++-----------
+ src/hb-subset-cff2.hh            |   2 +-
+ 16 files changed, 1492 insertions(+), 1487 deletions(-)
+
+commit 592f39b3c4ed04a6f6cf129020358e64782c7108
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 22:54:57 2018 -0500
+
+    [CFF] Whitespace
+
+ src/hb-cff-interp-common.hh      |  7 +++----
+ src/hb-cff-interp-cs-common.hh   |  6 +++---
+ src/hb-cff-interp-dict-common.hh |  6 +++---
+ src/hb-cff2-interp-cs.hh         |  2 +-
+ src/hb-ot-cff-common.hh          | 12 ++++++------
+ src/hb-ot-cff1-table.hh          | 30 +++++++++++++++---------------
+ src/hb-ot-cff2-table.hh          | 12 ++++++------
+ src/hb-subset-cff-common.cc      |  8 ++++----
+ src/hb-subset-cff-common.hh      | 34 +++++++++++++++++-----------------
+ src/hb-subset-cff1.cc            | 20 ++++++++++----------
+ src/hb-subset-cff2.cc            | 18 +++++++++---------
+ 11 files changed, 77 insertions(+), 78 deletions(-)
+
+commit a2e8d1d455c5d0ae22927567cf8a9a2539cd3470
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 22:54:20 2018 -0500
+
+    Minor
+
+ src/Makefile.sources | 27 +++++++++++++--------------
+ 1 file changed, 13 insertions(+), 14 deletions(-)
+
+commit e3dc47c6357813d2dd098aad312d79e9d7c2aa18
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 22:43:22 2018 -0500
+
+    Remove generated files that were accidentally added by CFF2 branch
+
+ gtk-doc.make      |  320 --
+ m4/libtool.m4     | 8369
+ -----------------------------------------------------
+ m4/ltoptions.m4   |  437 ---
+ m4/ltsugar.m4     |  124 -
+ m4/ltversion.m4   |   23 -
+ m4/lt~obsolete.m4 |   99 -
+ 6 files changed, 9372 deletions(-)
+
+commit 5e64e0f53259dbc0a3ea8e220ded15e85bbc1782
+Merge: 09096aa8 d8c69137
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 22:40:54 2018 -0500
+
+    Merge pull request #1113 from harfbuzz/cff-subset
+
+    CFF/CFF2 subsetter
+
+commit 09096aa89f1944dff94a5518bce578eba8989e74
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Sat Dec 1 10:22:49 2018 +0700
+
+    Use nullptr instead of 0/NULL. (#1435)
+
+    * Use nullptr instead of 0/NULL.
+
+    * Update test-name-table.cc
+
+ src/hb-debug.hh        | 2 +-
+ src/test-name-table.cc | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit d8c69137655fbe9678d1dfef0eb3c4172f8bbfc0
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 30 18:58:14 2018 -0800
+
+    undo 0u
+
+ src/hb-cff2-interp-cs.hh    | 2 +-
+ src/hb-ot-cff1-table.hh     | 4 ++--
+ src/hb-ot-vorg-table.hh     | 2 +-
+ src/hb-subset-cff-common.hh | 4 ++--
+ src/hb-subset-cff1.cc       | 4 ++--
+ 5 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 2c859b3880868b30823eb00bed90dc0de873628b
+Merge: 9483da14 bb72de66
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 30 18:47:34 2018 -0800
+
+    Merge branch 'master' into cff-subset
+
+commit bb72de66ddf3ae9ae53cf68642cb228e88aa64f5
+Merge: fedd8e6c fb059082
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 21:36:35 2018 -0500
+
+    Merge pull request #1433 from harfbuzz/overload-overload
+
+    Fix ambiguous overload errors with old compilers
+
+commit fb059082138bf17a5a8616410d9a35f927f9fd85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 20:45:40 2018 -0500
+
+    Revert ugly fixes
+
+    Now that we have 6daf45e0, revert cryptic hacks...
+
+    This reverts commit abd81ed4f5cbc5a94171747909bc6b77551cb929.
+    This reverts commit 9c6921c08c905a0cf45ba0182134e6ff910fac51.
+    This reverts commit d39760cabfe4007cefdfc45231e85e93fababac2.
+    This reverts commit fedd8e6c176dea85194693399e50243eb1c117c4.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1374
+
+ src/hb-aat-layout-morx-table.hh |  4 ++--
+ src/hb-face.cc                  |  4 ++--
+ src/hb-machinery.hh             |  4 ++--
+ src/hb-ot-color-cpal-table.hh   |  2 +-
+ src/hb-ot-kern-table.hh         |  2 +-
+ src/hb-ot-layout-gpos-table.hh  | 32 ++++++++++++++++----------------
+ src/hb-ot-layout-gsubgpos.hh    | 14 +++++++-------
+ 7 files changed, 31 insertions(+), 31 deletions(-)
+
+commit dfad19ad5aefdacecca6af81917abc2670d4416f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 19:57:12 2018 -0500
+
+    Make operator [] take signed int
+
+    The built-in operator takes signed int.  So, match it, such that
+    the built-in is never a better or equally-good match to our operator.
+    Fixes "ambiguous overload" errors from gcc 4.2 and VS 2008.
+
+    See https://github.com/harfbuzz/harfbuzz/issues/1374
+
+ src/hb-dsalgs.hh    |  3 ++-
+ src/hb-open-type.hh | 42 ++++++++++++++++++++++++++++--------------
+ src/hb-vector.hh    |  6 ++++--
+ 3 files changed, 34 insertions(+), 17 deletions(-)
+
+commit 9483da145d6da1bdfa3224fe13a5b4e9b449d19f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 30 16:59:41 2018 -0800
+
+    redo fixes
+
+ src/hb-cff2-interp-cs.hh    | 2 +-
+ src/hb-ot-cff1-table.hh     | 4 ++--
+ src/hb-subset-cff-common.hh | 6 +++---
+ src/hb-subset-cff1.cc       | 4 ++--
+ 4 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 291da448237cdc0b5534fbc1ce2288e1aa8e7b8a
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 30 16:50:46 2018 -0800
+
+    yet another
+
+ src/hb-subset-cff-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b1821b9d092e4fd7fd888f4bffc341283bace461
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 30 16:31:01 2018 -0800
+
+    some more
+
+ src/hb-subset-cff-common.hh | 4 ++--
+ src/hb-subset-cff1.cc       | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 9784cff55688d1ee93275e39c2339d5a486ed78b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 30 16:07:08 2018 -0800
+
+    fix another pesky gcc error
+
+ src/hb-cff2-interp-cs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 23a797b44365ed76fc7db25be13bd9c3580a8695
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 30 15:15:31 2018 -0800
+
+    silence picky gcc errors
+
+ src/hb-ot-cff1-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9ae954f43ad1eb703d54db98ce46157370b71a9c
+Merge: 471db3aa fedd8e6c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 30 15:00:52 2018 -0800
+
+    Merge branch 'master' into cff-subset
+
+commit fedd8e6c176dea85194693399e50243eb1c117c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 16:50:30 2018 -0500
+
+    One more.........
+
+    I wonder if there's something better to do about these :(.
+
+    In file included from hb-ot-color.cc:31:
+    hb-ot-color-cpal-table.hh: In member function 'unsigned int
+    OT::CPAL::get_size() const':
+    hb-ot-color-cpal-table.hh:118: error: ISO C++ says that these are
+    ambiguous, even though the worst conversion for the first is better
+    than the worst conversion for the second:
+
+ src/hb-ot-color-cpal-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bc5db9b0807767ac04d6e50070d69cb9c520f06e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 16:04:52 2018 -0500
+
+    One more....
+
+    hb-ot-vorg-table.hh:96: error: ISO C++ says that these are ambiguous,
+    even though the worst conversion for the first is better than the
+    worst conversion for the second:
+    hb-vector.hh:87: note: candidate 1: const Type& hb_vector_t<Type,
+    PreallocedCount>::operator[](unsigned int) const [with Type =
+    OT::VertOriginMetric, unsigned int PreallocedCount = 8u]
+    hb-ot-vorg-table.hh:96: note: candidate 2: operator[](const T*,
+    int) <built-in>
+
+ src/hb-ot-vorg-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d39760cabfe4007cefdfc45231e85e93fababac2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 15:55:30 2018 -0500
+
+    One more...
+
+    Sigh.
+
+    hb-ot-kern-table.hh: In member function 'int
+    OT::KernSubTableFormat3<KernSubTableHeader>::get_kerning(hb_codepoint_t,
+    hb_codepoint_t) const':
+    hb-ot-kern-table.hh:59: error: ambiguous overload for 'operator[]'
+    in 'kernValue[kernIndex[i]]'
+    hb-ot-kern-table.hh:59: note: candidates are: operator[](T*, int)
+    <built-in>
+    hb-dsalgs.hh:574: note:                 Type&
+    hb_array_t<Type>::operator[](unsigned int) const [with Type = const
+    OT::IntType<short int, 2u>]
+
+ src/hb-ot-kern-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9c6921c08c905a0cf45ba0182134e6ff910fac51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 15:16:57 2018 -0500
+
+    More...
+
+    hb-ot-layout-gsubgpos.hh:1707: error: ISO C++ says that these are
+    ambiguous, even though the worst conversion for the first is better
+    than the worst conversion for the second:
+    ...
+
+ src/hb-aat-layout-morx-table.hh |  4 ++--
+ src/hb-ot-layout-gpos-table.hh  | 32 ++++++++++++++++----------------
+ src/hb-ot-layout-gsubgpos.hh    | 16 ++++++++--------
+ 3 files changed, 26 insertions(+), 26 deletions(-)
+
+commit f998bb2086342d6fdcd4295593eddea91396e0b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 12:52:21 2018 -0500
+
+    More weird fixes
+
+    In file included from hb-ot-name.cc:29:
+    hb-ot-name-table.hh: In member function 'unsigned int
+    OT::name::get_size() const':
+    hb-ot-name-table.hh:157: error: ISO C++ says that these are ambiguous,
+    even though the worst conversion for the first is better than the
+    worst conversion for the second:
+    hb-open-type.hh:354: note: candidate 1: const Type&
+    OT::UnsizedArrayOf<Type>::operator[](unsigned int) const [with Type
+    = OT::NameRecord]
+    hb-ot-name-table.hh:157: note: candidate 2: operator[](const T*,
+    int) <built-in>
+    hb-ot-name-table.hh: In member function 'void
+    OT::name::accelerator_t::init(hb_face_t*)':
+    hb-ot-name-table.hh:196: error: ISO C++ says that these are ambiguous,
+    even though the worst conversion for the first is better than the
+    worst conversion for the second:
+    hb-dsalgs.hh:574: note: candidate 1: Type&
+    hb_array_t<Type>::operator[](unsigned int) const [with Type =
+    const OT::NameRecord]
+    hb-ot-name-table.hh:196: note: candidate 2: operator[](T*, int)
+    <built-in>
+    hb-ot-name-table.hh:197: error: ISO C++ says that these are ambiguous,
+    even though the worst conversion for the first is better than the
+    worst conversion for the second:
+    hb-dsalgs.hh:574: note: candidate 1: Type&
+    hb_array_t<Type>::operator[](unsigned int) const [with Type =
+    const OT::NameRecord]
+    hb-ot-name-table.hh:197: note: candidate 2: operator[](T*, int)
+    <built-in>
+    hb-ot-name-table.hh:198: error: ISO C++ says that these are ambiguous,
+    even though the worst conversion for the first is better than the
+    worst conversion for the second:
+    hb-dsalgs.hh:574: note: candidate 1: Type&
+    hb_array_t<Type>::operator[](unsigned int) const [with Type =
+    const OT::NameRecord]
+    hb-ot-name-table.hh:198: note: candidate 2: operator[](T*, int)
+    <built-in>
+    make[4]: *** [libharfbuzz_la-hb-ot-name.lo] Error 1
+    make[3]: *** [all-recursive] Error 1
+
+ src/hb-ot-name-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 67fd94da98f950b5feb719ac805f2a45379fc935
+Merge: abd81ed4 ae79fdaa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 11:53:30 2018 -0500
+
+    Merge commit 'ae79fdaa7774d3f886a8f03926577c3bd2010b03'
+
+commit abd81ed4f5cbc5a94171747909bc6b77551cb929
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 11:51:26 2018 -0500
+
+    Umm.  Cryptic, yes
+
+    In file included from hb-face.cc:35:
+    hb-ot-cmap-table.hh: In member function 'void
+    OT::CmapSubtableFormat4::_compiles_assertion_on_line_388() const':
+    hb-ot-cmap-table.hh:388: error: ISO C++ says that these are ambiguous,
+    even though the worst conversion for the first is better than the
+    worst conversion for the second:
+    hb-open-type.hh:354: note: candidate 1: const Type&
+    OT::UnsizedArrayOf<Type>::operator[](unsigned int) const [with Type =
+    OT::IntType<short unsigned int, 2u>]
+    hb-ot-cmap-table.hh:388: note: candidate 2: operator[](const T*,
+    int) <built-in>
+    hb-ot-cmap-table.hh: In member function 'void
+    OT::CmapSubtableFormat4::_instance_assertion_on_line_388() const':
+    hb-ot-cmap-table.hh:388: error: ISO C++ says that these are ambiguous,
+    even though the worst conversion for the first is better than the
+    worst conversion for the second:
+    hb-open-type.hh:354: note: candidate 1: const Type&
+    OT::UnsizedArrayOf<Type>::operator[](unsigned int) const [with Type =
+    OT::IntType<short unsigned int, 2u>]
+    hb-ot-cmap-table.hh:388: note: candidate 2: operator[](const T*,
+    int) <built-in>
+    hb-face.cc: In function 'hb_blob_t*
+    _hb_face_builder_data_reference_blob(hb_face_builder_data_t*)':
+    hb-face.cc:650: error: ISO C++ says that these are ambiguous, even
+    though the worst conversion for the first is better than the worst
+    conversion for the second:
+    hb-vector.hh:81: note: candidate 1: Type& hb_vector_t<Type,
+    PreallocedCount>::operator[](unsigned int) [with Type =
+    hb_face_builder_data_t::table_entry_t, unsigned int PreallocedCount
+    = 32u]
+    hb-face.cc:650: note: candidate 2: operator[](T*, int) <built-in>
+    hb-face.cc:650: error: ISO C++ says that these are ambiguous, even
+    though the worst conversion for the first is better than the worst
+    conversion for the second:
+    hb-vector.hh:81: note: candidate 1: Type& hb_vector_t<Type,
+    PreallocedCount>::operator[](unsigned int) [with Type =
+    hb_face_builder_data_t::table_entry_t, unsigned int PreallocedCount
+    = 32u]
+    hb-face.cc:650: note: candidate 2: operator[](const T*, int)
+    <built-in>
+    hb-face.cc:651: error: ISO C++ says that these are ambiguous, even
+    though the worst conversion for the first is better than the worst
+    conversion for the second:
+    hb-vector.hh:81: note: candidate 1: Type& hb_vector_t<Type,
+    PreallocedCount>::operator[](unsigned int) [with Type =
+    hb_face_builder_data_t::table_entry_t, unsigned int PreallocedCount
+    = 32u]
+    hb-face.cc:651: note: candidate 2: operator[](T*, int) <built-in>
+    hb-face.cc:651: error: ISO C++ says that these are ambiguous, even
+    though the worst conversion for the first is better than the worst
+    conversion for the second:
+    hb-vector.hh:81: note: candidate 1: Type& hb_vector_t<Type,
+    PreallocedCount>::operator[](unsigned int) [with Type =
+    hb_face_builder_data_t::table_entry_t, unsigned int PreallocedCount
+    = 32u]
+    hb-face.cc:651: note: candidate 2: operator[](const T*, int)
+    <built-in>
+
+ src/hb-face.cc      | 4 ++--
+ src/hb-machinery.hh | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit ae79fdaa7774d3f886a8f03926577c3bd2010b03
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 11:51:26 2018 -0500
+
+    Umm.  Cryptic, yes
+
+    hb-face.cc:650: error: ISO C++ says that these are ambiguous, even
+    though the worst conversion for the first is better than the worst
+    conversion for the second:
+    hb-vector.hh:81: note: candidate 1: Type& hb_vector_t<Type,
+    PreallocedCount>::operator[](unsigned int) [with Type =
+    hb_face_builder_data_t::table_entry_t, unsigned int PreallocedCount
+    = 32u]
+    hb-face.cc:650: note: candidate 2: operator[](T*, int) <built-in>
+
+ src/hb-face.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0f32c95e1487ffcc37439635c3294f941eae857a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 11:31:39 2018 -0500
+
+    Fix a few more sizeof(vector[0]) errors with weird compilers
+
+ src/hb-face.cc | 4 ++--
+ src/hb-set.hh  | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 88630a458b21b811075bed9e761a94c50736dc11
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 01:11:04 2018 -0500
+
+    Fix build for realz
+
+ src/hb-ot-deprecated.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 346286d04eb616c43ba8c796211fa2e5e7bf1983
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 00:44:40 2018 -0500
+
+    Fix build
+
+ src/hb-ot-deprecated.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 31f39cb41e1497a76c5838c93f9b4034089049f2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 00:38:08 2018 -0500
+
+    [post] Rename v2 to v2X
+
+ src/hb-ot-post-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e3dd47e6025a7f082af4830ba483d90d9b44381f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 00:32:12 2018 -0500
+
+    Move things
+
+ src/Makefile.sources   |   1 +
+ src/hb-deprecated.h    |  61 +---------------------------
+ src/hb-ot-deprecated.h | 106
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot.h            |   1 +
+ 4 files changed, 109 insertions(+), 60 deletions(-)
+
+commit 27a6b0a2f7255ed6fc7bfe1f10052c2e344e319b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 16:29:30 2018 -0500
+
+    Fix build for realz
+
+ src/hb-coretext.cc  |  2 +-
+ src/hb-uniscribe.cc | 10 +++++-----
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit e2af4dd1ecbe398c60fe5f3f370dd35400d7e1eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 16:03:15 2018 -0500
+
+    [uniscribe] Fix build
+
+ src/hb-uniscribe.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bf738ba3ba80778c7feb95ece446607a250d9382
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Nov 30 00:06:40 2018 +0330
+
+    [test][aat] Remove extra --shaper ot
+
+    As run-tests.py already adds it
+
+ test/shaping/data/in-house/tests/macos.tests | 64
+ ++++++++++++++--------------
+ 1 file changed, 32 insertions(+), 32 deletions(-)
+
+commit b65645bbafb3f1f9f956df3028cf4479a4bdc265
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 29 23:57:50 2018 +0330
+
+    [ci] Re-enable llvm-gcc-4.2 bots (#1429)
+
+ .circleci/config.yml | 48
+ ++++++++++++++++++++++++------------------------
+ 1 file changed, 24 insertions(+), 24 deletions(-)
+
+commit e7bd29ea11bd6301a332b471120a4a2cd8575d09
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 29 23:47:20 2018 +0330
+
+    Limit __builtin_bswap16 to GCC >= 5 as it was implemented on 4.8
+
+ src/hb-machinery.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ac0264717b949df8840b179d882a9bed2993fb74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 15:07:44 2018 -0500
+
+    [coretext] Fix compile
+
+    Fingers crossed.
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5c4fead734b082e0168e6811bec4bcaa19acc36a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 15:04:34 2018 -0500
+
+    Convert "static const hb_tag_t" constants to enum
+
+ src/hb-aat-layout-ankr-table.hh |  2 +-
+ src/hb-aat-layout-bsln-table.hh |  2 +-
+ src/hb-aat-layout-feat-table.hh |  2 +-
+ src/hb-aat-layout-just-table.hh |  2 +-
+ src/hb-aat-layout-kerx-table.hh |  2 +-
+ src/hb-aat-layout-lcar-table.hh |  2 +-
+ src/hb-aat-layout-morx-table.hh |  6 +++---
+ src/hb-aat-layout-trak-table.hh |  2 +-
+ src/hb-aat-ltag-table.hh        |  2 +-
+ src/hb-ot-cmap-table.hh         |  2 +-
+ src/hb-ot-color-cbdt-table.hh   |  4 ++--
+ src/hb-ot-color-colr-table.hh   |  2 +-
+ src/hb-ot-color-cpal-table.hh   |  2 +-
+ src/hb-ot-color-sbix-table.hh   |  2 +-
+ src/hb-ot-color-svg-table.hh    |  2 +-
+ src/hb-ot-glyf-table.hh         |  4 ++--
+ src/hb-ot-hdmx-table.hh         |  2 +-
+ src/hb-ot-head-table.hh         |  2 +-
+ src/hb-ot-hhea-table.hh         |  4 ++--
+ src/hb-ot-hmtx-table.hh         | 14 +++++++-------
+ src/hb-ot-kern-table.hh         |  6 +++---
+ src/hb-ot-layout-base-table.hh  |  2 +-
+ src/hb-ot-layout-gdef-table.hh  |  2 +-
+ src/hb-ot-layout-gpos-table.hh  |  2 +-
+ src/hb-ot-layout-gsub-table.hh  |  2 +-
+ src/hb-ot-layout-jstf-table.hh  |  2 +-
+ src/hb-ot-math-table.hh         |  2 +-
+ src/hb-ot-maxp-table.hh         |  2 +-
+ src/hb-ot-name-table.hh         |  2 +-
+ src/hb-ot-os2-table.hh          |  2 +-
+ src/hb-ot-post-table.hh         |  2 +-
+ src/hb-ot-stat-table.hh         |  2 +-
+ src/hb-ot-var-avar-table.hh     |  2 +-
+ src/hb-ot-var-fvar-table.hh     |  2 +-
+ src/hb-ot-var-hvar-table.hh     |  8 ++++----
+ src/hb-ot-var-mvar-table.hh     |  2 +-
+ src/hb-ot-vorg-table.hh         |  2 +-
+ 37 files changed, 53 insertions(+), 53 deletions(-)
+
+commit 9e4138c82548c2b29a1ae8801d2c6c7c1f1a9c7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 15:01:10 2018 -0500
+
+    Convert misc "static const" constants to enum
+
+ src/hb-aat-layout-kerx-table.hh |  4 ++--
+ src/hb-map.hh                   |  2 +-
+ src/hb-ot-kern-table.hh         |  4 ++--
+ src/hb-set-digest.hh            | 14 +++++++-------
+ 4 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 44cbd2ea3dc36312bd80860983b6616586e78c6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 14:53:43 2018 -0500
+
+    Convert "static const bool" constants to anonymous enum
+
+ src/hb-aat-layout-common.hh     |  4 ++--
+ src/hb-aat-layout-kerx-table.hh |  4 ++--
+ src/hb-aat-layout-morx-table.hh |  8 ++++----
+ src/hb-dsalgs.hh                | 16 ++++++++--------
+ src/hb-ot-kern-table.hh         |  4 ++--
+ src/hb-ot-layout.cc             |  4 ++--
+ 6 files changed, 20 insertions(+), 20 deletions(-)
+
+commit 861bc75349257f74c12b261abfcd5ab9e2f04863
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 14:34:44 2018 -0500
+
+    [vector] Make pointer cast explicit
+
+    Too bad this doesn't help MSVC 2008 build, as explicit operators are
+    C++11.
+
+ src/hb-machinery.hh     | 2 +-
+ src/hb-ot-cmap-table.hh | 3 ++-
+ src/hb-set.hh           | 4 ++--
+ src/hb-subset.cc        | 2 +-
+ src/hb-vector.hh        | 4 ++--
+ 5 files changed, 8 insertions(+), 7 deletions(-)
+
+commit 72955e68256806f082439d65e6f9b5cf2e35fa8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 14:28:44 2018 -0500
+
+    Hand-hold older compilers
+
+ src/hb-set.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1a182e97ee71de0e78a70ff823ae17fa93a31830
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 12:39:52 2018 -0500
+
+    [test/text-rendering-tests] Update from upstream
+
+ .../text-rendering-tests/fonts/TestGVAR-Composite-0.ttf  | Bin 0 ->
+ 3136 bytes
+ .../fonts/TestGVAR-Composite-Missing.ttf                 | Bin 0 ->
+ 2984 bytes
+ 2 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 000d4b128eba58677acdc3b361829ff2f9a257b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 12:32:47 2018 -0500
+
+    Make shaper's override_features() override user features as well
+
+    The override_features is used to override features that are normally
+    discretionary features, but in a specific shaper are for various
+    reasons desired to be bolted on or off, because they've been used
+    for inherent shaping.  As such, it makes sense that they also
+    override user features.  Ie. if user turned 'liga' on, we don't
+    want Khmer shaping to become broken...  Or turn 'clig' off...
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1310
+
+ src/hb-ot-shape.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit a95d9d8c8465ebc927bc2194dffe4ea95542e54c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 12:30:14 2018 -0500
+
+    [khmer] Move 'clig' to overrides
+
+    Prerequisite for https://github.com/harfbuzz/harfbuzz/issues/1310
+
+ src/hb-ot-shape-complex-khmer.cc | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit 282ce7230b8bd8ad65c408cdaf1499504038247d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 12:18:14 2018 -0500
+
+    Fix "typename outside template" issues
+
+    Nothing an extra template class wouldn't fix...
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1419
+
+ src/hb-null.hh | 25 +++++++++++++++++++------
+ 1 file changed, 19 insertions(+), 6 deletions(-)
+
+commit dc41ecef85b094b30c612113606597b91c55351c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 11:53:53 2018 -0500
+
+    2.2.0
+
+ NEWS                 | 35 +++++++++++++++++++++++++++++++++++
+ configure.ac         |  2 +-
+ src/hb-aat-layout.cc |  6 +++---
+ src/hb-aat-layout.h  |  4 ++--
+ src/hb-deprecated.h  |  4 ++--
+ src/hb-ot-var.cc     |  8 ++++----
+ src/hb-ot-var.h      |  4 ++--
+ src/hb-version.h     |  6 +++---
+ 8 files changed, 52 insertions(+), 17 deletions(-)
+
+commit 7b85081be4fbd6cad75dc28ae933ce920f71b22d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 11:34:22 2018 -0500
+
+    [icu] Minor
+
+ src/hb-icu.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0bcb1de1265368a27e53c6d935c965cbcb4130a0
+Merge: e0307de8 a85886fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 29 10:39:18 2018 -0500
+
+    Merge pull request #1418 from gvictor/replace_icu_deprecated
+
+    Replace @Deprecated ICU API - USCRIPT_CODE_LIMIT
+
+commit e0307de818ad1f70ef96938642bda61d7a62532a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 29 11:36:05 2018 +0330
+
+    [test][aat.kern] More (#1427)
+
+ test/shaping/data/in-house/tests/macos.tests | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 471db3aa6f963ecd4ebaf66daa81ef245d30d3b8
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Nov 28 17:06:11 2018 -0800
+
+    workaround for issue #1417
+
+ src/hb-cff-interp-common.hh | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 32d291ae899eb095500052bed2a22e5255a34838
+Merge: 1ecbf4d3 949655aa
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Nov 28 16:27:45 2018 -0800
+
+    Merge branch 'master' into cff-subset
+
+commit 949655aa7853a4513af6b5247b9822be38f5d322
+Merge: 7b78d223 d3d0f15f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 28 17:21:57 2018 -0500
+
+    Merge pull request #1425 from mbutterick/patch-1
+
+    update simple shaping example (closes #298)
+
+commit d3d0f15f7d20bedf7018fb2fb652f92ff4159bd7
+Author: Matthew Butterick <mbutterick@users.noreply.github.com>
+Date:   Wed Nov 28 13:46:12 2018 -0800
+
+    update simple shaping example (closes #298)
+
+    add call to `FT_Set_Char_Size`, otherwise default size remains at
+    `0`, and glyph positions come back as `0` too
+
+ docs/usermanual-getting-started.xml | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7b78d2233df0e51e2967bc54a9202b3f9e05059a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 29 00:55:05 2018 +0330
+
+    [test][aat] Update expectency
+
+    It is not visually noticeable but apparently affected by kern format2
+    correct implementation.
+    I should've checked CoreText result which can't as CircleCI outage.
+
+ test/shaping/data/in-house/tests/macos.tests | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5155067e10011f78f1ce35b3dadb062bccd3a706
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 29 00:07:00 2018 +0330
+
+    [test] Add test for format2 kern (#1423)
+
+ test/shaping/data/in-house/Makefile.sources             |   1 +
+ .../fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf  | Bin 0 ->
+ 34116 bytes
+ test/shaping/data/in-house/tests/kern-format2.tests     |   3 +++
+ 3 files changed, 4 insertions(+)
+
+commit 42a2b496e428521151ff5cb07454d2e993f892cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 28 15:24:30 2018 -0500
+
+    [kerx] Fix Format2 index calc again
+
+ src/hb-aat-layout-common.hh     | 14 ++++++++++++++
+ src/hb-aat-layout-kerx-table.hh |  2 +-
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+commit 9e4f03b6ed80a81f8aee5ba93564f5eabab4299c
+Merge: 19863c80 a3267cf8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 28 15:08:01 2018 -0500
+
+    Merge remote-tracking branch 'fdo/master'
+
+commit a3267cf803082af157a7f2b0026af2633b14f8e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 28 15:06:01 2018 -0500
+
+    [kern] Fix kern table Format2 offsetToIndex
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1421
+
+ src/hb-aat-layout-kerx-table.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit f9a9c0fd1e561715d696c7bd840bab552d0718ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 28 14:51:56 2018 -0500
+
+    [kerx] Fix ClassTable implementation for 'kern' table Format 2
+
+ src/hb-aat-layout-common.hh     |  8 +++++---
+ src/hb-aat-layout-kerx-table.hh | 10 ++--------
+ 2 files changed, 7 insertions(+), 11 deletions(-)
+
+commit 5b4a789ca857664668ff69936574dcd09bee6065
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 28 14:46:26 2018 -0500
+
+    [aat] Towards adding two ClassTable's
+
+ src/hb-aat-layout-common.hh | 40 ++++++++++++++++++++--------------------
+ 1 file changed, 20 insertions(+), 20 deletions(-)
+
+commit 19863c805982d5d1d059d4dd9376039d3fdaabcd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Nov 28 20:28:42 2018 +0330
+
+    [test][aat] Add a test and make macOS runners faster (#1422)
+
+ .circleci/config.yml                         | 15 +++-----
+ test/shaping/data/in-house/tests/macos.tests | 54
+ ++++++++++++++--------------
+ 2 files changed, 33 insertions(+), 36 deletions(-)
+
+commit 987f4187722a05e3f360b85c66309a351fc5d6ad
+Merge: 1042d9fb 4e2a03b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 27 17:40:32 2018 -0500
+
+    Merge pull request #1398 from Adenilson/bigInt01
+
+    Optimize harfbuzz big integer conversions
+
+commit 4e2a03b6b6e0c0d1c4edea10dc1aae63eeb6c581
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 27 17:40:09 2018 -0500
+
+    Comment
+
+ src/hb-machinery.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 4a719a7f4c997ea7e47588bc0288c97706dae015
+Author: Adenilson Cavalcanti <adenilson.cavalcanti@arm.com>
+Date:   Tue Nov 20 14:41:19 2018 -0800
+
+    Optimize harfbuzz big integer conversions
+
+    Profiling showed that type conversions were adding considerable
+    cycles in time
+    spent doing text shaping.
+
+    The idea is to optimize it using native processor instructions to
+    help Blink
+    layout performance.
+
+    Doing further investigation revelead that compilers may not use the
+    proper instruction on ARM 32bits builds (i.e. REV16).
+
+    One way to insure that the generated ASM was ideal for both gcc/clang
+    was using __builtin_bswap16.
+
+    Added bonus is that we no longer need to test for CPU architecture.
+
+ src/hb-machinery.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit a85886fc77083084e9a12ee15b47eab7876f9f53
+Author: Victor Chang <vichang@google.com>
+Date:   Tue Nov 27 11:34:56 2018 +0000
+
+    Replace @Deprecated ICU API - USCRIPT_CODE_LIMIT
+
+    Use of the deprecated API USCRIPT_CODE_LIMIT prevents harfbuzz
+    using the ICU4C as a shared library.
+
+    The API has been replaced by u_getIntPropertyMaxValue(UCHAR_SCRIPT)
+
+ src/hb-icu.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 1042d9fbc05aff9d51f15c2824a8521e963d0acd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Nov 26 18:58:39 2018 +0330
+
+    [ci] Add .codecov.yml
+
+    Similar to
+    https://github.com/GoogleChrome/lighthouse/blob/master/.codecov.yml
+
+    No strong preference on commenting, feel free to enable it again
+
+ .codecov.yml | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 97eaedca5de76c74534bab41562aee130098558a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Nov 26 16:58:58 2018 +0330
+
+    [test][aat] Enable Tamil MN test (#1414)
+
+ test/shaping/data/in-house/tests/macos.tests | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 574d888c8a409295a952361a39c8e83a52a0fc3d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 25 16:51:22 2018 -0500
+
+    [aat] Ignore GSUB table of Muthu Foundry if they have morx table
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1410
+
+ src/hb-ot-layout-gpos-table.hh |  3 +++
+ src/hb-ot-layout-gsub-table.hh |  3 +++
+ src/hb-ot-layout-gsubgpos.hh   |  5 +++++
+ src/hb-ot-layout.cc            | 36 +++++++++++++++++++++++++++++++++++-
+ 4 files changed, 46 insertions(+), 1 deletion(-)
+
+commit 4151c2848d8df75b6d0a4f5d79bee843158aa4a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 25 16:38:36 2018 -0500
+
+    [GDEF] Move more code
+
+ src/hb-ot-layout-gdef-table.hh | 10 +++++++++-
+ src/hb-ot-layout.cc            | 11 -----------
+ 2 files changed, 9 insertions(+), 12 deletions(-)
+
+commit 4f21703f225b6977196ef180e8d7300ea86d2cc3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 25 15:59:18 2018 -0500
+
+    [GDEF] Move code around
+
+ src/hb-ot-layout-gdef-table.hh |  3 +++
+ src/hb-ot-layout.cc            | 16 +++++++---------
+ 2 files changed, 10 insertions(+), 9 deletions(-)
+
+commit 4ed9fb1a0050f3151f9332f08c8bb2c13652c607
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 25 15:51:01 2018 -0500
+
+    [GDEF] Minor
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0e3a48e54248d69197e8fb23c824d987f91b3bf7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Nov 25 13:37:23 2018 +0330
+
+    [test][aat] fix 10.13.6 Helvetica expectation
+
+ test/shaping/data/in-house/tests/macos.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cbc541b426f01717641f1f3529a7c9703aec7a28
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Nov 25 12:50:30 2018 +0330
+
+    [aat] Add m grave test (#1412)
+
+ test/shaping/data/in-house/tests/macos.tests | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit fa26ad0f48462063f2160a43cb62b018bb21e251
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Nov 25 11:25:17 2018 +0330
+
+    [aat] Fix macos expectation
+
+ test/shaping/data/in-house/tests/macos.tests | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 926f512f354835f8323bb2c2e58789dd918a9b65
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 25 01:14:40 2018 -0500
+
+    [aat.feat] Rework API and implementation
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/1346
+
+ docs/harfbuzz-docs.xml          |  5 +++
+ docs/harfbuzz-sections.txt      |  7 ++--
+ src/hb-aat-layout-feat-table.hh | 89
+ +++++++++++++++++++++++------------------
+ src/hb-aat-layout.cc            | 80 ++++++++++++++++--------------------
+ src/hb-aat-layout.h             | 32 +++++++++------
+ test/api/test-aat-layout.c      | 58 ++++++++++++++-------------
+ 6 files changed, 141 insertions(+), 130 deletions(-)
+
+commit 84dacbca7ea54a3ca2d5d711d50272a7f3baf456
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 12:08:36 2018 -0500
+
+    [aat.feat] Add _MAX_VALUE to enums
+
+ src/hb-aat-layout.h | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 3922aae1620958768d3257c0988432d5609dca1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 11:02:04 2018 -0500
+
+    [aat.feat] Minor
+
+ src/hb-aat-layout-feat-table.hh | 12 ++----------
+ 1 file changed, 2 insertions(+), 10 deletions(-)
+
+commit 0f8e98eca2463da3b83d1b66a19259a584df1682
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 11:00:42 2018 -0500
+
+    [aat.feat] Whitespace
+
+ src/hb-aat-layout-feat-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit c2256068339c9e10c8e6df5d1749be4b4eb04ad4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 10:54:40 2018 -0500
+
+    [aat.feat] Port to SortedUnsizedArrayOf.bsearch()
+
+ src/hb-aat-layout-feat-table.hh | 19 +++++++------------
+ 1 file changed, 7 insertions(+), 12 deletions(-)
+
+commit 52ae9867efd6520d17306b9f3ad612fe5463e93d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 10:46:56 2018 -0500
+
+    [AAT.feat] Use lsearch for looking up SettingName's
+
+    They are not sorted.
+
+ src/hb-aat-layout-feat-table.hh | 18 ++++++------------
+ src/hb-open-type.hh             | 16 ++++++++--------
+ src/hb-static.cc                |  6 ++++--
+ 3 files changed, 18 insertions(+), 22 deletions(-)
+
+commit 44b9331f663c09174d94e06baf36d48a50599c42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 10:30:35 2018 -0500
+
+    [aat] Fix include issues
+
+ src/Makefile.am | 2 ++
+ src/hb-aat.h    | 2 ++
+ 2 files changed, 4 insertions(+)
+
+commit b206133d1f616339a57996b634dadc7f0a2c4cfb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 14:05:11 2018 -0500
+
+    [aat] Move contents of hb-aat.h to hb-aat-layout.h
+
+    Since it was pages and pages...
+
+ src/Makefile.sources |   1 +
+ src/hb-aat-layout.cc |   1 -
+ src/hb-aat-layout.h  | 452
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.hh |   1 -
+ src/hb-aat-map.hh    |   1 -
+ src/hb-aat.h         | 417
+ +----------------------------------------------
+ src/hb.hh            |   2 +
+ 7 files changed, 458 insertions(+), 417 deletions(-)
+
+commit 2cb235d0210e74ea4ee123767b489301a9c340ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 12:23:35 2018 -0500
+
+    [aat.feat] Fix enum namespace
+
+ src/hb-aat-layout-feat-table.hh |   2 +-
+ src/hb-aat-layout-morx-table.hh |   4 +-
+ src/hb-aat-layout.cc            | 150 ++++++------
+ src/hb-aat.h                    | 502
+ ++++++++++++++++++++--------------------
+ test/api/test-aat-layout.c      |   2 +-
+ 5 files changed, 330 insertions(+), 330 deletions(-)
+
+commit 712762cabbbe85e6ab8361cd115c22a176827734
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 12:21:02 2018 -0500
+
+    Minor
+
+ src/hb-aat.h | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit e20f81f4fa977a8d22c6afee1e46fbf46bc182d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 11:57:42 2018 -0500
+
+    [aat] Rename feat API a bit more
+
+ docs/harfbuzz-sections.txt      | 10 +++++-----
+ src/hb-aat-layout-feat-table.hh |  8 ++++----
+ src/hb-aat-layout.cc            | 32 ++++++++++++++++----------------
+ src/hb-aat.h                    | 26 +++++++++++++-------------
+ test/api/test-aat-layout.c      | 28 ++++++++++++++--------------
+ 5 files changed, 52 insertions(+), 52 deletions(-)
+
+commit 54f4c17f0a932b0ca0317e1ad5e5e43a11a83fd1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Nov 23 12:05:06 2018 +0330
+
+    [feat] Rename API uses of setting to selector
+
+ docs/harfbuzz-sections.txt      |  6 +--
+ src/hb-aat-layout-feat-table.hh | 52 ++++++++++++------------
+ src/hb-aat-layout-morx-table.hh |  2 +-
+ src/hb-aat-layout.cc            | 88
+ ++++++++++++++++++++---------------------
+ src/hb-aat-layout.hh            |  4 +-
+ src/hb-aat-map.cc               |  2 +-
+ src/hb-aat-map.hh               |  2 +-
+ src/hb-aat.h                    | 20 +++++-----
+ test/api/test-aat-layout.c      | 46 ++++++++++-----------
+ 9 files changed, 111 insertions(+), 111 deletions(-)
+
+commit 9c64b216ec7ae2c2c124ebd00dc6fa568752be78
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Nov 23 11:44:53 2018 +0330
+
+    [feat] Apply renamings and add documentation
+
+ docs/harfbuzz-sections.txt | 10 ++++++++++
+ src/hb-aat-layout.cc       | 44
+ ++++++++++++++++++++++++++++++++++++++------
+ src/hb-aat.h               |  6 +++---
+ test/api/test-aat-layout.c | 28 ++++++++++++++--------------
+ 4 files changed, 65 insertions(+), 23 deletions(-)
+
+commit a8726cb4830f51a820db4bc6346ed09c91493817
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Nov 17 14:23:11 2018 +0330
+
+    [feat] Use bsearch
+
+ src/hb-aat-layout-feat-table.hh | 36 ++++++++++++++++++++++--------------
+ src/hb-aat-layout-morx-table.hh |  2 +-
+ src/hb.hh                       |  2 ++
+ 3 files changed, 25 insertions(+), 15 deletions(-)
+
+commit 4009a05ca7de21fff2176621597cd0cd01e9d80e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Nov 17 11:30:50 2018 +0330
+
+    [feat] Address Behdad comments
+
+ src/hb-aat-layout-feat-table.hh | 114 ++++---
+ src/hb-aat-layout.cc            |  14 +-
+ src/hb-aat.h                    | 673
+ +++++++++++++++++-----------------------
+ test/api/test-aat-layout.c      |  88 +++---
+ 4 files changed, 423 insertions(+), 466 deletions(-)
+
+commit 19b6025534a98df96d67eee45c5c1ea6fbc1cc43
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Nov 17 01:07:09 2018 +0330
+
+    [feat] Address @behdad comments
+
+ src/Makefile.sources            |   2 +-
+ src/hb-aat-layout-feat-table.hh |  82 +++----
+ src/hb-aat-layout-morx-table.hh |   2 +-
+ src/hb-aat-layout.cc            | 104 ++++----
+ src/hb-aat-map.cc               |   2 +-
+ src/hb-aat.h                    | 533
+ ++++++++++++----------------------------
+ src/hb-ot.h                     |   1 -
+ test/api/test-aat-layout.c      |  84 +++----
+ 8 files changed, 282 insertions(+), 528 deletions(-)
+
+commit 9212ec203c948e290a1d92b701619ccdbc89377c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Nov 9 00:50:10 2018 +0330
+
+    [feat] Complete feature types list
+
+ src/hb-aat-layout-morx-table.hh |   2 +-
+ src/hb-aat-layout.cc            | 154 ++++-----
+ src/hb-aat.h                    | 697
+ ++++++++++++++++++++++++++++++++++++++--
+ 3 files changed, 752 insertions(+), 101 deletions(-)
+
+commit fbad794bd2c574363a0c5c5fefabce764496f93c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 1 22:24:42 2018 +0330
+
+    [feat] Add feature iteration API
+
+ src/hb-aat-layout-feat-table.hh | 36 +++++++++++++++++++++--------
+ src/hb-aat-layout.cc            | 26 +++++++++++----------
+ src/hb-aat.h                    | 23 +++++++++++++++++--
+ test/api/test-aat-layout.c      | 51
+ +++++++++++++++++++++++++++--------------
+ 4 files changed, 96 insertions(+), 40 deletions(-)
+
+commit 7a0471aa356bcd062d31a59bdb19c335249116c7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 1 21:38:54 2018 +0330
+
+    [feat] Turn AAT feature id into enum
+
+ src/hb-aat-layout-feat-table.hh |  20 ++---
+ src/hb-aat-layout-morx-table.hh |  10 +--
+ src/hb-aat-layout.cc            | 170
+ ++++++++++++++++++++--------------------
+ src/hb-aat-layout.hh            |   6 +-
+ src/hb-aat-map.cc               |   2 +-
+ src/hb-aat-map.hh               |   4 +-
+ src/hb-aat.h                    |  64 +++++++++------
+ test/api/test-aat-layout.c      |   8 +-
+ test/api/test-c.c               |   1 +
+ 9 files changed, 150 insertions(+), 135 deletions(-)
+
+commit b233fa4bc9cdb1c6677b37106d96d878d6e03bfd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 1 20:02:57 2018 +0330
+
+    [feat] Rename records to selectors as @drott
+
+ src/hb-aat-layout-feat-table.hh | 20 ++++++++++----------
+ src/hb-aat-layout.cc            | 10 +++++-----
+ src/hb-aat.h                    |  4 ++--
+ 3 files changed, 17 insertions(+), 17 deletions(-)
+
+commit a157b3e4ebd57ad29f217c4cef6519e7398cfa5c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 1 19:56:16 2018 +0330
+
+    [feat] Apply @behdad comments
+
+ src/Makefile.sources              |  2 +-
+ src/hb-aat-layout-feat-table.hh   |  1 +
+ src/hb-aat-layout.cc              | 16 ++++++++--------
+ src/hb-aat-layout.hh              |  2 +-
+ src/hb-aat-map.hh                 |  2 +-
+ src/{hb-aat-layout.h => hb-aat.h} | 22 +++++++++++++---------
+ src/hb-ot.h                       |  1 +
+ test/api/test-aat-layout.c        | 14 +++++++-------
+ test/api/test-c.c                 |  1 -
+ 9 files changed, 33 insertions(+), 28 deletions(-)
+
+commit 3aff3f822f0d7bf7a2b5160ad93df3fe413c7c47
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 1 19:20:20 2018 +0330
+
+    [feat] Apply @drott and @jfkthame comments
+
+ src/hb-aat-layout-feat-table.hh | 14 ++++++--------
+ src/hb-aat-layout.cc            | 12 +++++++-----
+ src/hb-aat-layout.h             | 10 +++++-----
+ test/api/test-aat-layout.c      |  4 ++--
+ 4 files changed, 20 insertions(+), 20 deletions(-)
+
+commit b791bbbae47aa19709da640a1dc5e84590c5c2c2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 1 15:15:56 2018 +0330
+
+    [feat] Apply @jfkthame reviews
+
+ src/hb-aat-layout-feat-table.hh |  27 +++++++++++++++------------
+ src/hb-aat-layout.cc            |  23 ++++++++++++-----------
+ src/hb-aat-layout.h             |  14 +++++++++-----
+ test/api/fonts/aat-feat.ttf     | Bin 0 -> 1132 bytes
+ test/api/test-aat-layout.c      |  30 ++++++++++++++++++------------
+ 5 files changed, 54 insertions(+), 40 deletions(-)
+
+commit 95abd53758e281325b9124f0942aafb382a89090
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 1 13:14:29 2018 +0330
+
+    [feat] Expose public API
+
+    * hb_aat_get_feature_settings
+
+ src/Makefile.sources            |  1 +
+ src/hb-aat-layout-feat-table.hh | 68 ++++++++++++++++++++++++++++++-
+ src/hb-aat-layout-morx-table.hh |  6 +--
+ src/hb-aat-layout.cc            | 33 +++++++++++++++
+ src/hb-aat-layout.h             | 75 ++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.hh            |  7 ++--
+ src/hb-aat-map.hh               |  5 ++-
+ src/hb-ot-face.hh               |  1 +
+ test/api/Makefile.am            |  1 +
+ test/api/test-aat-layout.c      | 89
+ +++++++++++++++++++++++++++++++++++++++++
+ test/api/test-c.c               |  1 +
+ 11 files changed, 278 insertions(+), 9 deletions(-)
+
+commit 264c4a539cbfd8d5e5f143206d9d27230a186897
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 25 00:30:08 2018 -0500
+
+    [test] Reorder test suites
+
+    aots is less interesting.  Run text-rendering-tests before aots.
+
+ test/shaping/data/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9326912941e5927bcfb4689689c954b9a3995baa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 25 00:27:23 2018 -0500
+
+    [kerx] Fix crash
+
+ src/hb-machinery.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 6ee401049d475b2a2d9c859e6dbf8ff2750a1609
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 25 00:21:13 2018 -0500
+
+    Simplify sanitize set_object() / fix bots
+
+ src/hb-machinery.hh | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit c5a6b355e165e90d8d90454ceeca7b100282945f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 23:49:23 2018 -0500
+
+    [kerx] Port to hb_sanitize_with_object_t
+
+ src/hb-aat-layout-kerx-table.hh | 19 +++++++------------
+ 1 file changed, 7 insertions(+), 12 deletions(-)
+
+commit c405ed0509afaa7c3846e8e461bedfbceb0cd937
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 23:46:15 2018 -0500
+
+    [morx] Port to hb_sanitize_with_object_t
+
+ src/hb-aat-layout-morx-table.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 1e8994221fb5cfdb1902d5249c7a75cde6d6e3c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 23:38:06 2018 -0500
+
+    Add hb_sanitize_with_object_t
+
+    Context manager.
+
+ src/hb-machinery.hh | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+commit b3c5affc05a3c7bbcfbd98521703d3d3447fcd7d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 23:34:34 2018 -0500
+
+    Simplify sanitize set_object()
+
+ src/hb-aat-layout-kerx-table.hh | 12 ++++++------
+ src/hb-aat-layout-morx-table.hh | 10 +++++-----
+ src/hb-machinery.hh             | 26 +++++++++++++-------------
+ 3 files changed, 24 insertions(+), 24 deletions(-)
+
+commit 3d3097269995aa227b4b198d4da2baf942b65c66
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 23:12:28 2018 -0500
+
+    [aat] Skip terminator in VarSizedBinSearchArray<>
+
+    Fixes shaping with Apple Chancery on 10.13 again.  In that font,
+    there was a terminator segment, that was tripping off sanitize().
+
+ src/hb-aat-layout-common.hh |  6 ++++++
+ src/hb-open-type.hh         | 21 ++++++++++++++++++++-
+ 2 files changed, 26 insertions(+), 1 deletion(-)
+
+commit 4202a3cde3b6065124feb7f4c662563de1e08126
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 22:48:34 2018 -0500
+
+    Minor
+
+ src/hb-open-type.hh | 21 ++++++++++++++++-----
+ 1 file changed, 16 insertions(+), 5 deletions(-)
+
+commit 1c2302bbf1d2d0e66f49ab54ad98d1b61bc5603d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 22:32:17 2018 -0500
+
+    [debug] Print function in return_trace()
+
+ src/hb-debug.hh | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+commit 748198a6718adbb200ee24ac013c617f62c946a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 22:16:59 2018 -0500
+
+    Revert "[aat.morx] Remove set_object() business"
+
+    This reverts commit ae8ed58a6e53441d9ccbf67afd8a00b815cde99e.
+
+    Apparently this broke Apple Chancery from OS X 10.12 :(.
+    Investigating...
+
+ src/hb-aat-layout-morx-table.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit c8a2dc820eb0ee3124e3762cb1167ac9e528ad28
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 22:16:53 2018 -0500
+
+    Revert "[aat.kerx] Remove kerx subtable boundary enforcement"
+
+    This reverts commit 15905a2a2998f7ddd964f920a4828602235d6b00.
+
+ src/hb-aat-layout-kerx-table.hh | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit 9eeebd8ddedb96c03860ce7eb5500aafa3969d6b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 22:16:47 2018 -0500
+
+    Revert "[sanitize] Remove now-unused set_object() machinery"
+
+    This reverts commit bbdb6edb3e1cea4c5b7076c4f6b3e6998ae36dae.
+
+ src/hb-machinery.hh | 25 ++++++++++++++++++++++++-
+ 1 file changed, 24 insertions(+), 1 deletion(-)
+
+commit 248ce22857c8918bf3468ef48d906de4c19c3d4d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 22:01:06 2018 -0500
+
+    [tests] Minor
+
+ test/shaping/run-tests.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f47c5da0aa04a88b37d9c3af4730204319a9a36b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 21:36:57 2018 -0500
+
+    [arrays] Use hb_array_t<> in all places with sub_array()
+
+ src/hb-aat-layout-lcar-table.hh |  6 +++---
+ src/hb-ot-layout-gdef-table.hh  | 14 ++++++++------
+ src/hb-ot-math-table.hh         | 10 ++++------
+ 3 files changed, 15 insertions(+), 15 deletions(-)
+
+commit 3246a8ebbd900bcc3e3c70532eab0f406b8f5c4a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 21:32:00 2018 -0500
+
+    [arrays] Merge ArrayOf's sub_array into hb_array_t's
+
+ src/hb-dsalgs.hh    | 44 +++++++++++++++++++++++++++-----------------
+ src/hb-open-type.hh | 30 ++++++++++++++++++------------
+ 2 files changed, 45 insertions(+), 29 deletions(-)
+
+commit e6877e28cd30e89af7cce59d903184a5a01ec970
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Nov 25 02:12:40 2018 +0330
+
+    [test] Add the missed aots fonts
+
+ test/shaping/data/aots/fonts/classdef1_font1.otf   | Bin 0 -> 6004 bytes
+ test/shaping/data/aots/fonts/classdef1_font2.otf   | Bin 0 -> 6020 bytes
+ test/shaping/data/aots/tests/classdef1_empty.tests |   2 +-
+ 3 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 825ea5a4607fafa11c56a72a82bda773f6b44e79
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Nov 25 01:59:54 2018 +0330
+
+    [test] Merge 10.12.6 and 10.13.6 tests, update to Apple Chancery fix
+
+ test/shaping/data/in-house/Makefile.sources        |  3 +--
+ .../data/in-house/tests/macos-10.12.6.tests        | 11 ---------
+ .../data/in-house/tests/macos-10.13.6.tests        | 13 -----------
+ test/shaping/data/in-house/tests/macos.tests       | 26
+ ++++++++++++++++++++++
+ 4 files changed, 27 insertions(+), 26 deletions(-)
+
+commit bbdb6edb3e1cea4c5b7076c4f6b3e6998ae36dae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 17:15:38 2018 -0500
+
+    [sanitize] Remove now-unused set_object() machinery
+
+ src/hb-machinery.hh | 25 +------------------------
+ 1 file changed, 1 insertion(+), 24 deletions(-)
+
+commit 15905a2a2998f7ddd964f920a4828602235d6b00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 17:14:39 2018 -0500
+
+    [aat.kerx] Remove kerx subtable boundary enforcement
+
+    Have not encountered fonts needing this, but same reasoning as
+    for morx (see previos commit.)
+
+ src/hb-aat-layout-kerx-table.hh | 21 ---------------------
+ 1 file changed, 21 deletions(-)
+
+commit ae8ed58a6e53441d9ccbf67afd8a00b815cde99e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 17:11:09 2018 -0500
+
+    [aat.morx] Remove set_object() business
+
+    With OS X 10.13 Apple Chancery fails to ligate if we limit each morx
+    sub-chain to its declared length.  Perhaps their newer compiler does
+    object-sharing across sub-chains.  Anyway, since that's a valid, if
+    unspecified, way to compile tables, remove enforcement.
+
+    Probably do the same with kern/kerx.
+
+ src/hb-aat-layout-morx-table.hh | 8 --------
+ 1 file changed, 8 deletions(-)
+
+commit b518e5af9f66414396752069bb8f43466a9236fa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Nov 25 01:39:00 2018 +0330
+
+    Add 10.13.6 aat fonts tests and bot (#1409)
+
+ .circleci/config.yml                                     | 16
+ ++++++++++++++--
+ test/shaping/data/in-house/Makefile.sources              |  3 ++-
+ .../in-house/tests/{macos.tests => macos-10.12.6.tests}  |  2 --
+ test/shaping/data/in-house/tests/macos-10.13.6.tests     | 13
+ +++++++++++++
+ 4 files changed, 29 insertions(+), 5 deletions(-)
+
+commit b7f7950e8fc4b9e229b466ac2453d57b8da9a5a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 15:56:17 2018 -0500
+
+    [aat] Add test for recent regression
+
+ test/shaping/data/in-house/tests/macos.tests | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit ea9512e61a7ed333b810918e74cce4c8bd2291b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 15:49:33 2018 -0500
+
+    [tests] Redo test runner logging a  bit
+
+ test/shaping/run-tests.py | 44
+ +++++++++++++++++++++++---------------------
+ 1 file changed, 23 insertions(+), 21 deletions(-)
+
+commit 5020affc3877d39377506245ecaf01a659eef82a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 15:42:11 2018 -0500
+
+    [tests] Minor
+
+ test/shaping/data/in-house/tests/macos.tests | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ee3a3e10d45f5df1a74b65fbe3df77f8dd8f902e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 15:37:01 2018 -0500
+
+    [tests/shaping] Allow comments in test files
+
+    Line should start with "# ".
+
+ test/shaping/run-tests.py | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+commit ed900ee9afa0dabdbf6bf9d2af46c2343a16773f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 15:22:09 2018 -0500
+
+    [tests] Rename
+
+ test/shaping/data/in-house/Makefile.sources                         |
+ 2 +-
+ test/shaping/data/in-house/tests/{macos-10.12.tests => macos.tests} | 0
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 20edc70d537b01e8a384ee05673335f2f8a18238
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 14:52:34 2018 -0500
+
+    [morx/kerx] Fix sanitize regression
+
+    Broke in 8dcc1913a1670ede7b124f7b5b775d7ab8791386
+
+    If sanitizer is left with another object, it wouldn't work.
+
+    Better fix coming soon.
+
+ src/hb-aat-layout-kerx-table.hh | 6 +-----
+ src/hb-aat-layout-morx-table.hh | 4 +---
+ 2 files changed, 2 insertions(+), 8 deletions(-)
+
+commit 3cc14e78aeb1c70eb82891ab4513c0e7d0f59928
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Nov 24 20:49:21 2018 +0330
+
+    [test] Enable more of aots tests (#1408)
+
+    The ones commented out in this change should've be passed :/
+    a closer look is needed.
+
+ test/shaping/data/aots/Makefile.sources            | 76
+ +++++++++++-----------
+ test/shaping/data/aots/hb-aots-tester.cpp          |  1 +
+ test/shaping/data/aots/tests/classdef1_empty.tests |  2 +-
+ test/shaping/data/aots/tests/gsub3_1_simple.tests  |  2 +-
+ .../data/aots/tests/lookupflag_ignore_attach.tests | 10 +--
+ 5 files changed, 46 insertions(+), 45 deletions(-)
+
+commit 24887d1115ee41cfad70577eb243382f6c23ab6e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Nov 24 20:07:24 2018 +0330
+
+    Add Adobe AOTS tests (#1395)
+
+    Annotated OpenType Specification or aots,
+    https://github.com/adobe-type-tools/aots
+    provides a set of tests for OpenType specification, this change add
+    those tests in addition
+    to modified version of their HarfBuzz test runner for generating
+    harfbuzz project specific tests.
+
+ configure.ac                                       |   1 +
+ test/shaping/CMakeLists.txt                        |  13 +-
+ test/shaping/data/Makefile.am                      |   1 +
+ test/shaping/data/aots/COPYING                     |  13 +
+ test/shaping/data/aots/Makefile.am                 |  37 +++
+ test/shaping/data/aots/Makefile.sources            | 126 ++++++++
+ test/shaping/data/aots/fonts/classdef1_font3.otf   | Bin 0 -> 6060 bytes
+ test/shaping/data/aots/fonts/classdef1_font4.otf   | Bin 0 -> 5984 bytes
+ test/shaping/data/aots/fonts/classdef2_font1.otf   | Bin 0 -> 6004 bytes
+ test/shaping/data/aots/fonts/classdef2_font2.otf   | Bin 0 -> 6016 bytes
+ test/shaping/data/aots/fonts/classdef2_font3.otf   | Bin 0 -> 6052 bytes
+ test/shaping/data/aots/fonts/classdef2_font4.otf   | Bin 0 -> 5984 bytes
+ test/shaping/data/aots/fonts/cmap0_font1.otf       | Bin 0 -> 5196 bytes
+ test/shaping/data/aots/fonts/cmap10_font1.otf      | Bin 0 -> 4968 bytes
+ test/shaping/data/aots/fonts/cmap10_font2.otf      | Bin 0 -> 4960 bytes
+ test/shaping/data/aots/fonts/cmap12_font1.otf      | Bin 0 -> 4980 bytes
+ test/shaping/data/aots/fonts/cmap14_font1.otf      | Bin 0 -> 5028 bytes
+ test/shaping/data/aots/fonts/cmap2_font1.otf       | Bin 0 -> 6000 bytes
+ test/shaping/data/aots/fonts/cmap4_font1.otf       | Bin 0 -> 4964 bytes
+ test/shaping/data/aots/fonts/cmap4_font2.otf       | Bin 0 -> 4956 bytes
+ test/shaping/data/aots/fonts/cmap4_font3.otf       | Bin 0 -> 4956 bytes
+ test/shaping/data/aots/fonts/cmap4_font4.otf       | Bin 0 -> 4972 bytes
+ test/shaping/data/aots/fonts/cmap6_font1.otf       | Bin 0 -> 4948 bytes
+ test/shaping/data/aots/fonts/cmap6_font2.otf       | Bin 0 -> 4944 bytes
+ test/shaping/data/aots/fonts/cmap8_font1.otf       | Bin 0 -> 13224 bytes
+ .../data/aots/fonts/cmap_composition_font1.otf     | Bin 0 -> 5096 bytes
+ .../aots/fonts/cmap_subtableselection_font1.otf    | Bin 0 -> 6412 bytes
+ .../aots/fonts/cmap_subtableselection_font2.otf    | Bin 0 -> 6140 bytes
+ .../aots/fonts/cmap_subtableselection_font3.otf    | Bin 0 -> 5872 bytes
+ .../aots/fonts/cmap_subtableselection_font4.otf    | Bin 0 -> 5600 bytes
+ .../aots/fonts/cmap_subtableselection_font5.otf    | Bin 0 -> 5332 bytes
+ .../data/aots/fonts/gpos1_1_lookupflag_f1.otf      | Bin 0 -> 5208 bytes
+ test/shaping/data/aots/fonts/gpos1_1_simple_f1.otf | Bin 0 -> 5136 bytes
+ test/shaping/data/aots/fonts/gpos1_1_simple_f2.otf | Bin 0 -> 5136 bytes
+ test/shaping/data/aots/fonts/gpos1_1_simple_f3.otf | Bin 0 -> 5136 bytes
+ test/shaping/data/aots/fonts/gpos1_1_simple_f4.otf | Bin 0 -> 5136 bytes
+ test/shaping/data/aots/fonts/gpos1_2_font1.otf     | Bin 0 -> 5108 bytes
+ test/shaping/data/aots/fonts/gpos1_2_font2.otf     | Bin 0 -> 5148 bytes
+ test/shaping/data/aots/fonts/gpos2_1_font6.otf     | Bin 0 -> 5120 bytes
+ test/shaping/data/aots/fonts/gpos2_1_font7.otf     | Bin 0 -> 5132 bytes
+ .../data/aots/fonts/gpos2_1_lookupflag_f1.otf      | Bin 0 -> 5220 bytes
+ .../data/aots/fonts/gpos2_1_lookupflag_f2.otf      | Bin 0 -> 5220 bytes
+ .../data/aots/fonts/gpos2_1_next_glyph_f1.otf      | Bin 0 -> 5180 bytes
+ .../data/aots/fonts/gpos2_1_next_glyph_f2.otf      | Bin 0 -> 5176 bytes
+ test/shaping/data/aots/fonts/gpos2_1_simple_f1.otf | Bin 0 -> 5148 bytes
+ test/shaping/data/aots/fonts/gpos2_2_font1.otf     | Bin 0 -> 5148 bytes
+ test/shaping/data/aots/fonts/gpos2_2_font2.otf     | Bin 0 -> 5188 bytes
+ test/shaping/data/aots/fonts/gpos2_2_font3.otf     | Bin 0 -> 5188 bytes
+ test/shaping/data/aots/fonts/gpos2_2_font4.otf     | Bin 0 -> 5148 bytes
+ test/shaping/data/aots/fonts/gpos2_2_font5.otf     | Bin 0 -> 5140 bytes
+ test/shaping/data/aots/fonts/gpos3_font1.otf       | Bin 0 -> 5120 bytes
+ test/shaping/data/aots/fonts/gpos3_font2.otf       | Bin 0 -> 5160 bytes
+ test/shaping/data/aots/fonts/gpos3_font3.otf       | Bin 0 -> 5164 bytes
+ .../data/aots/fonts/gpos4_lookupflag_f1.otf        | Bin 0 -> 5256 bytes
+ .../data/aots/fonts/gpos4_lookupflag_f2.otf        | Bin 0 -> 5240 bytes
+ .../data/aots/fonts/gpos4_multiple_anchors_1.otf   | Bin 0 -> 5352 bytes
+ test/shaping/data/aots/fonts/gpos4_simple_1.otf    | Bin 0 -> 5200 bytes
+ test/shaping/data/aots/fonts/gpos5_font1.otf       | Bin 0 -> 5284 bytes
+ test/shaping/data/aots/fonts/gpos6_font1.otf       | Bin 0 -> 5176 bytes
+ test/shaping/data/aots/fonts/gpos7_1_font1.otf     | Bin 0 -> 5160 bytes
+ test/shaping/data/aots/fonts/gpos9_font1.otf       | Bin 0 -> 5096 bytes
+ test/shaping/data/aots/fonts/gpos9_font2.otf       | Bin 0 -> 5124 bytes
+ .../data/aots/fonts/gpos_chaining1_boundary_f1.otf | Bin 0 -> 5496 bytes
+ .../data/aots/fonts/gpos_chaining1_boundary_f2.otf | Bin 0 -> 5500 bytes
+ .../data/aots/fonts/gpos_chaining1_boundary_f3.otf | Bin 0 -> 5496 bytes
+ .../data/aots/fonts/gpos_chaining1_boundary_f4.otf | Bin 0 -> 5496 bytes
+ .../aots/fonts/gpos_chaining1_lookupflag_f1.otf    | Bin 0 -> 5520 bytes
+ .../fonts/gpos_chaining1_multiple_subrules_f1.otf  | Bin 0 -> 5592 bytes
+ .../fonts/gpos_chaining1_multiple_subrules_f2.otf  | Bin 0 -> 5592 bytes
+ .../aots/fonts/gpos_chaining1_next_glyph_f1.otf    | Bin 0 -> 5540 bytes
+ .../data/aots/fonts/gpos_chaining1_simple_f1.otf   | Bin 0 -> 5488 bytes
+ .../data/aots/fonts/gpos_chaining1_simple_f2.otf   | Bin 0 -> 5488 bytes
+ .../aots/fonts/gpos_chaining1_successive_f1.otf    | Bin 0 -> 5524 bytes
+ .../data/aots/fonts/gpos_chaining2_boundary_f1.otf | Bin 0 -> 5704 bytes
+ .../data/aots/fonts/gpos_chaining2_boundary_f2.otf | Bin 0 -> 5708 bytes
+ .../data/aots/fonts/gpos_chaining2_boundary_f3.otf | Bin 0 -> 5704 bytes
+ .../data/aots/fonts/gpos_chaining2_boundary_f4.otf | Bin 0 -> 5704 bytes
+ .../aots/fonts/gpos_chaining2_lookupflag_f1.otf    | Bin 0 -> 5728 bytes
+ .../fonts/gpos_chaining2_multiple_subrules_f1.otf  | Bin 0 -> 5800 bytes
+ .../fonts/gpos_chaining2_multiple_subrules_f2.otf  | Bin 0 -> 5800 bytes
+ .../aots/fonts/gpos_chaining2_next_glyph_f1.otf    | Bin 0 -> 5744 bytes
+ .../data/aots/fonts/gpos_chaining2_simple_f1.otf   | Bin 0 -> 5696 bytes
+ .../data/aots/fonts/gpos_chaining2_simple_f2.otf   | Bin 0 -> 5696 bytes
+ .../aots/fonts/gpos_chaining2_successive_f1.otf    | Bin 0 -> 5732 bytes
+ .../data/aots/fonts/gpos_chaining3_boundary_f1.otf | Bin 0 -> 5504 bytes
+ .../data/aots/fonts/gpos_chaining3_boundary_f2.otf | Bin 0 -> 5508 bytes
+ .../data/aots/fonts/gpos_chaining3_boundary_f3.otf | Bin 0 -> 5500 bytes
+ .../data/aots/fonts/gpos_chaining3_boundary_f4.otf | Bin 0 -> 5500 bytes
+ .../aots/fonts/gpos_chaining3_lookupflag_f1.otf    | Bin 0 -> 5548 bytes
+ .../aots/fonts/gpos_chaining3_next_glyph_f1.otf    | Bin 0 -> 5524 bytes
+ .../data/aots/fonts/gpos_chaining3_simple_f1.otf   | Bin 0 -> 5496 bytes
+ .../data/aots/fonts/gpos_chaining3_simple_f2.otf   | Bin 0 -> 5516 bytes
+ .../aots/fonts/gpos_chaining3_successive_f1.otf    | Bin 0 -> 5544 bytes
+ .../data/aots/fonts/gpos_context1_boundary_f1.otf  | Bin 0 -> 5480 bytes
+ .../data/aots/fonts/gpos_context1_boundary_f2.otf  | Bin 0 -> 5480 bytes
+ .../data/aots/fonts/gpos_context1_expansion_f1.otf | Bin 0 -> 5492 bytes
+ .../aots/fonts/gpos_context1_lookupflag_f1.otf     | Bin 0 -> 5508 bytes
+ .../aots/fonts/gpos_context1_lookupflag_f2.otf     | Bin 0 -> 5500 bytes
+ .../fonts/gpos_context1_multiple_subrules_f1.otf   | Bin 0 -> 5568 bytes
+ .../fonts/gpos_context1_multiple_subrules_f2.otf   | Bin 0 -> 5568 bytes
+ .../aots/fonts/gpos_context1_next_glyph_f1.otf     | Bin 0 -> 5500 bytes
+ .../data/aots/fonts/gpos_context1_simple_f1.otf    | Bin 0 -> 5476 bytes
+ .../data/aots/fonts/gpos_context1_simple_f2.otf    | Bin 0 -> 5468 bytes
+ .../aots/fonts/gpos_context1_successive_f1.otf     | Bin 0 -> 5508 bytes
+ .../data/aots/fonts/gpos_context2_boundary_f1.otf  | Bin 0 -> 5492 bytes
+ .../data/aots/fonts/gpos_context2_boundary_f2.otf  | Bin 0 -> 5496 bytes
+ .../data/aots/fonts/gpos_context2_classes_f1.otf   | Bin 0 -> 5540 bytes
+ .../data/aots/fonts/gpos_context2_classes_f2.otf   | Bin 0 -> 5564 bytes
+ .../data/aots/fonts/gpos_context2_expansion_f1.otf | Bin 0 -> 5524 bytes
+ .../aots/fonts/gpos_context2_lookupflag_f1.otf     | Bin 0 -> 5540 bytes
+ .../aots/fonts/gpos_context2_lookupflag_f2.otf     | Bin 0 -> 5532 bytes
+ .../fonts/gpos_context2_multiple_subrules_f1.otf   | Bin 0 -> 5600 bytes
+ .../fonts/gpos_context2_multiple_subrules_f2.otf   | Bin 0 -> 5600 bytes
+ .../aots/fonts/gpos_context2_next_glyph_f1.otf     | Bin 0 -> 5512 bytes
+ .../data/aots/fonts/gpos_context2_simple_f1.otf    | Bin 0 -> 5508 bytes
+ .../data/aots/fonts/gpos_context2_simple_f2.otf    | Bin 0 -> 5484 bytes
+ .../aots/fonts/gpos_context2_successive_f1.otf     | Bin 0 -> 5544 bytes
+ .../data/aots/fonts/gpos_context3_boundary_f1.otf  | Bin 0 -> 5476 bytes
+ .../data/aots/fonts/gpos_context3_boundary_f2.otf  | Bin 0 -> 5472 bytes
+ .../aots/fonts/gpos_context3_lookupflag_f1.otf     | Bin 0 -> 5512 bytes
+ .../aots/fonts/gpos_context3_lookupflag_f2.otf     | Bin 0 -> 5504 bytes
+ .../aots/fonts/gpos_context3_next_glyph_f1.otf     | Bin 0 -> 5496 bytes
+ .../data/aots/fonts/gpos_context3_simple_f1.otf    | Bin 0 -> 5480 bytes
+ .../aots/fonts/gpos_context3_successive_f1.otf     | Bin 0 -> 5516 bytes
+ .../data/aots/fonts/gsub1_1_lookupflag_f1.otf      | Bin 0 -> 5208 bytes
+ test/shaping/data/aots/fonts/gsub1_1_modulo_f1.otf | Bin 0 -> 5216 bytes
+ test/shaping/data/aots/fonts/gsub1_1_simple_f1.otf | Bin 0 -> 5136 bytes
+ .../data/aots/fonts/gsub1_2_lookupflag_f1.otf      | Bin 0 -> 5212 bytes
+ test/shaping/data/aots/fonts/gsub1_2_simple_f1.otf | Bin 0 -> 5140 bytes
+ .../data/aots/fonts/gsub2_1_lookupflag_f1.otf      | Bin 0 -> 5224 bytes
+ .../aots/fonts/gsub2_1_multiple_sequences_f1.otf   | Bin 0 -> 5248 bytes
+ test/shaping/data/aots/fonts/gsub2_1_simple_f1.otf | Bin 0 -> 5144 bytes
+ .../data/aots/fonts/gsub3_1_lookupflag_f1.otf      | Bin 0 -> 5224 bytes
+ .../data/aots/fonts/gsub3_1_multiple_f1.otf        | Bin 0 -> 5168 bytes
+ test/shaping/data/aots/fonts/gsub3_1_simple_f1.otf | Bin 0 -> 5144 bytes
+ .../data/aots/fonts/gsub4_1_lookupflag_f1.otf      | Bin 0 -> 5220 bytes
+ .../aots/fonts/gsub4_1_multiple_ligatures_f1.otf   | Bin 0 -> 5252 bytes
+ .../aots/fonts/gsub4_1_multiple_ligatures_f2.otf   | Bin 0 -> 5252 bytes
+ .../aots/fonts/gsub4_1_multiple_ligsets_f1.otf     | Bin 0 -> 5240 bytes
+ test/shaping/data/aots/fonts/gsub4_1_simple_f1.otf | Bin 0 -> 5148 bytes
+ test/shaping/data/aots/fonts/gsub7_font1.otf       | Bin 0 -> 5096 bytes
+ test/shaping/data/aots/fonts/gsub7_font2.otf       | Bin 0 -> 5116 bytes
+ .../data/aots/fonts/gsub_chaining1_boundary_f1.otf | Bin 0 -> 5516 bytes
+ .../data/aots/fonts/gsub_chaining1_boundary_f2.otf | Bin 0 -> 5520 bytes
+ .../data/aots/fonts/gsub_chaining1_boundary_f3.otf | Bin 0 -> 5520 bytes
+ .../data/aots/fonts/gsub_chaining1_boundary_f4.otf | Bin 0 -> 5520 bytes
+ .../aots/fonts/gsub_chaining1_lookupflag_f1.otf    | Bin 0 -> 5544 bytes
+ .../fonts/gsub_chaining1_multiple_subrules_f1.otf  | Bin 0 -> 5616 bytes
+ .../fonts/gsub_chaining1_multiple_subrules_f2.otf  | Bin 0 -> 5616 bytes
+ .../aots/fonts/gsub_chaining1_next_glyph_f1.otf    | Bin 0 -> 5560 bytes
+ .../data/aots/fonts/gsub_chaining1_simple_f1.otf   | Bin 0 -> 5508 bytes
+ .../data/aots/fonts/gsub_chaining1_simple_f2.otf   | Bin 0 -> 5512 bytes
+ .../aots/fonts/gsub_chaining1_successive_f1.otf    | Bin 0 -> 5544 bytes
+ .../data/aots/fonts/gsub_chaining2_boundary_f1.otf | Bin 0 -> 5724 bytes
+ .../data/aots/fonts/gsub_chaining2_boundary_f2.otf | Bin 0 -> 5728 bytes
+ .../data/aots/fonts/gsub_chaining2_boundary_f3.otf | Bin 0 -> 5728 bytes
+ .../data/aots/fonts/gsub_chaining2_boundary_f4.otf | Bin 0 -> 5728 bytes
+ .../aots/fonts/gsub_chaining2_lookupflag_f1.otf    | Bin 0 -> 5752 bytes
+ .../fonts/gsub_chaining2_multiple_subrules_f1.otf  | Bin 0 -> 5824 bytes
+ .../fonts/gsub_chaining2_multiple_subrules_f2.otf  | Bin 0 -> 5824 bytes
+ .../aots/fonts/gsub_chaining2_next_glyph_f1.otf    | Bin 0 -> 5764 bytes
+ .../data/aots/fonts/gsub_chaining2_simple_f1.otf   | Bin 0 -> 5716 bytes
+ .../data/aots/fonts/gsub_chaining2_simple_f2.otf   | Bin 0 -> 5720 bytes
+ .../aots/fonts/gsub_chaining2_successive_f1.otf    | Bin 0 -> 5752 bytes
+ .../data/aots/fonts/gsub_chaining3_boundary_f1.otf | Bin 0 -> 5528 bytes
+ .../data/aots/fonts/gsub_chaining3_boundary_f2.otf | Bin 0 -> 5532 bytes
+ .../data/aots/fonts/gsub_chaining3_boundary_f3.otf | Bin 0 -> 5524 bytes
+ .../data/aots/fonts/gsub_chaining3_boundary_f4.otf | Bin 0 -> 5524 bytes
+ .../aots/fonts/gsub_chaining3_lookupflag_f1.otf    | Bin 0 -> 5572 bytes
+ .../aots/fonts/gsub_chaining3_next_glyph_f1.otf    | Bin 0 -> 5548 bytes
+ .../data/aots/fonts/gsub_chaining3_simple_f1.otf   | Bin 0 -> 5520 bytes
+ .../data/aots/fonts/gsub_chaining3_simple_f2.otf   | Bin 0 -> 5540 bytes
+ .../aots/fonts/gsub_chaining3_successive_f1.otf    | Bin 0 -> 5568 bytes
+ .../data/aots/fonts/gsub_context1_boundary_f1.otf  | Bin 0 -> 5500 bytes
+ .../data/aots/fonts/gsub_context1_boundary_f2.otf  | Bin 0 -> 5504 bytes
+ .../data/aots/fonts/gsub_context1_expansion_f1.otf | Bin 0 -> 5516 bytes
+ .../aots/fonts/gsub_context1_lookupflag_f1.otf     | Bin 0 -> 5532 bytes
+ .../aots/fonts/gsub_context1_lookupflag_f2.otf     | Bin 0 -> 5524 bytes
+ .../fonts/gsub_context1_multiple_subrules_f1.otf   | Bin 0 -> 5592 bytes
+ .../fonts/gsub_context1_multiple_subrules_f2.otf   | Bin 0 -> 5592 bytes
+ .../aots/fonts/gsub_context1_next_glyph_f1.otf     | Bin 0 -> 5520 bytes
+ .../data/aots/fonts/gsub_context1_simple_f1.otf    | Bin 0 -> 5500 bytes
+ .../data/aots/fonts/gsub_context1_simple_f2.otf    | Bin 0 -> 5492 bytes
+ .../aots/fonts/gsub_context1_successive_f1.otf     | Bin 0 -> 5528 bytes
+ .../data/aots/fonts/gsub_context2_boundary_f1.otf  | Bin 0 -> 5516 bytes
+ .../data/aots/fonts/gsub_context2_boundary_f2.otf  | Bin 0 -> 5516 bytes
+ .../data/aots/fonts/gsub_context2_classes_f1.otf   | Bin 0 -> 5564 bytes
+ .../data/aots/fonts/gsub_context2_classes_f2.otf   | Bin 0 -> 5584 bytes
+ .../data/aots/fonts/gsub_context2_expansion_f1.otf | Bin 0 -> 5544 bytes
+ .../aots/fonts/gsub_context2_lookupflag_f1.otf     | Bin 0 -> 5560 bytes
+ .../aots/fonts/gsub_context2_lookupflag_f2.otf     | Bin 0 -> 5552 bytes
+ .../fonts/gsub_context2_multiple_subrules_f1.otf   | Bin 0 -> 5620 bytes
+ .../fonts/gsub_context2_multiple_subrules_f2.otf   | Bin 0 -> 5620 bytes
+ .../aots/fonts/gsub_context2_next_glyph_f1.otf     | Bin 0 -> 5536 bytes
+ .../data/aots/fonts/gsub_context2_simple_f1.otf    | Bin 0 -> 5528 bytes
+ .../data/aots/fonts/gsub_context2_simple_f2.otf    | Bin 0 -> 5504 bytes
+ .../aots/fonts/gsub_context2_successive_f1.otf     | Bin 0 -> 5568 bytes
+ .../data/aots/fonts/gsub_context3_boundary_f1.otf  | Bin 0 -> 5500 bytes
+ .../data/aots/fonts/gsub_context3_boundary_f2.otf  | Bin 0 -> 5496 bytes
+ .../aots/fonts/gsub_context3_lookupflag_f1.otf     | Bin 0 -> 5536 bytes
+ .../aots/fonts/gsub_context3_lookupflag_f2.otf     | Bin 0 -> 5528 bytes
+ .../aots/fonts/gsub_context3_next_glyph_f1.otf     | Bin 0 -> 5520 bytes
+ .../data/aots/fonts/gsub_context3_simple_f1.otf    | Bin 0 -> 5504 bytes
+ .../aots/fonts/gsub_context3_successive_f1.otf     | Bin 0 -> 5540 bytes
+ .../aots/fonts/lookupflag_ignore_attach_f1.otf     | Bin 0 -> 5416 bytes
+ .../data/aots/fonts/lookupflag_ignore_base_f1.otf  | Bin 0 -> 5256 bytes
+ .../fonts/lookupflag_ignore_combination_f1.otf     | Bin 0 -> 5408 bytes
+ .../aots/fonts/lookupflag_ignore_ligatures_f1.otf  | Bin 0 -> 5320 bytes
+ .../data/aots/fonts/lookupflag_ignore_marks_f1.otf | Bin 0 -> 5288 bytes
+ test/shaping/data/aots/hb-aots-tester.cpp          | 343
+ +++++++++++++++++++++
+ test/shaping/data/aots/tests/classdef1.tests       |   1 +
+ test/shaping/data/aots/tests/classdef1_empty.tests |   1 +
+ .../data/aots/tests/classdef1_multiple.tests       |   1 +
+ .../shaping/data/aots/tests/classdef1_single.tests |   1 +
+ test/shaping/data/aots/tests/classdef2.tests       |   1 +
+ test/shaping/data/aots/tests/classdef2_empty.tests |   1 +
+ .../data/aots/tests/classdef2_multiple.tests       |   1 +
+ .../shaping/data/aots/tests/classdef2_single.tests |   1 +
+ .../data/aots/tests/gpos1_1_lookupflag.tests       |   1 +
+ test/shaping/data/aots/tests/gpos1_1_simple.tests  |   4 +
+ test/shaping/data/aots/tests/gpos1_2.tests         |   1 +
+ .../data/aots/tests/gpos1_2_lookupflag.tests       |   1 +
+ test/shaping/data/aots/tests/gpos2_1.tests         |   2 +
+ .../data/aots/tests/gpos2_1_lookupflag.tests       |   2 +
+ .../data/aots/tests/gpos2_1_next_glyph.tests       |   2 +
+ test/shaping/data/aots/tests/gpos2_1_simple.tests  |   2 +
+ test/shaping/data/aots/tests/gpos2_2.tests         |   5 +
+ test/shaping/data/aots/tests/gpos3.tests           |  11 +
+ .../shaping/data/aots/tests/gpos3_lookupflag.tests |   2 +
+ .../shaping/data/aots/tests/gpos4_lookupflag.tests |   2 +
+ .../data/aots/tests/gpos4_multiple_anchors.tests   |   1 +
+ test/shaping/data/aots/tests/gpos4_simple.tests    |   5 +
+ test/shaping/data/aots/tests/gpos5.tests           |   2 +
+ test/shaping/data/aots/tests/gpos6.tests           |   3 +
+ test/shaping/data/aots/tests/gpos7_1.tests         |   2 +
+ test/shaping/data/aots/tests/gpos9.tests           |   2 +
+ .../data/aots/tests/gpos_chaining1_boundary.tests  |   4 +
+ .../aots/tests/gpos_chaining1_lookupflag.tests     |   1 +
+ .../tests/gpos_chaining1_multiple_subrules.tests   |   2 +
+ .../aots/tests/gpos_chaining1_next_glyph.tests     |   1 +
+ .../data/aots/tests/gpos_chaining1_simple.tests    |  11 +
+ .../aots/tests/gpos_chaining1_successive.tests     |   1 +
+ .../data/aots/tests/gpos_chaining2_boundary.tests  |   4 +
+ .../aots/tests/gpos_chaining2_lookupflag.tests     |   1 +
+ .../tests/gpos_chaining2_multiple_subrules.tests   |   2 +
+ .../aots/tests/gpos_chaining2_next_glyph.tests     |   1 +
+ .../data/aots/tests/gpos_chaining2_simple.tests    |  11 +
+ .../aots/tests/gpos_chaining2_successive.tests     |   1 +
+ .../data/aots/tests/gpos_chaining3_boundary.tests  |   4 +
+ .../aots/tests/gpos_chaining3_lookupflag.tests     |   1 +
+ .../aots/tests/gpos_chaining3_next_glyph.tests     |   1 +
+ .../data/aots/tests/gpos_chaining3_simple.tests    |  11 +
+ .../aots/tests/gpos_chaining3_successive.tests     |   1 +
+ .../data/aots/tests/gpos_context1_boundary.tests   |   2 +
+ .../data/aots/tests/gpos_context1_expansion.tests  |   1 +
+ .../data/aots/tests/gpos_context1_lookupflag.tests |   2 +
+ .../tests/gpos_context1_multiple_subrules.tests    |   2 +
+ .../data/aots/tests/gpos_context1_next_glyph.tests |   1 +
+ .../data/aots/tests/gpos_context1_simple.tests     |   3 +
+ .../data/aots/tests/gpos_context1_successive.tests |   1 +
+ .../data/aots/tests/gpos_context2_boundary.tests   |   2 +
+ .../data/aots/tests/gpos_context2_classes.tests    |   2 +
+ .../data/aots/tests/gpos_context2_expansion.tests  |   1 +
+ .../data/aots/tests/gpos_context2_lookupflag.tests |   2 +
+ .../tests/gpos_context2_multiple_subrules.tests    |   2 +
+ .../data/aots/tests/gpos_context2_next_glyph.tests |   1 +
+ .../data/aots/tests/gpos_context2_simple.tests     |   3 +
+ .../data/aots/tests/gpos_context2_successive.tests |   1 +
+ .../data/aots/tests/gpos_context3_boundary.tests   |   2 +
+ .../data/aots/tests/gpos_context3_lookupflag.tests |   2 +
+ .../data/aots/tests/gpos_context3_next_glyph.tests |   1 +
+ .../data/aots/tests/gpos_context3_simple.tests     |   2 +
+ .../data/aots/tests/gpos_context3_successive.tests |   1 +
+ .../data/aots/tests/gsub1_1_lookupflag.tests       |   1 +
+ test/shaping/data/aots/tests/gsub1_1_modulo.tests  |   1 +
+ test/shaping/data/aots/tests/gsub1_1_simple.tests  |   1 +
+ .../data/aots/tests/gsub1_2_lookupflag.tests       |   1 +
+ test/shaping/data/aots/tests/gsub1_2_simple.tests  |   1 +
+ .../data/aots/tests/gsub2_1_lookupflag.tests       |   1 +
+ .../aots/tests/gsub2_1_multiple_sequences.tests    |   1 +
+ test/shaping/data/aots/tests/gsub2_1_simple.tests  |   2 +
+ .../data/aots/tests/gsub3_1_lookupflag.tests       |   1 +
+ .../shaping/data/aots/tests/gsub3_1_multiple.tests |   1 +
+ test/shaping/data/aots/tests/gsub3_1_simple.tests  |   1 +
+ .../data/aots/tests/gsub4_1_lookupflag.tests       |   1 +
+ .../aots/tests/gsub4_1_multiple_ligatures.tests    |   2 +
+ .../data/aots/tests/gsub4_1_multiple_ligsets.tests |   1 +
+ test/shaping/data/aots/tests/gsub4_1_simple.tests  |   1 +
+ test/shaping/data/aots/tests/gsub7.tests           |   2 +
+ .../data/aots/tests/gsub_chaining1_boundary.tests  |   4 +
+ .../aots/tests/gsub_chaining1_lookupflag.tests     |   1 +
+ .../tests/gsub_chaining1_multiple_subrules.tests   |   2 +
+ .../aots/tests/gsub_chaining1_next_glyph.tests     |   1 +
+ .../data/aots/tests/gsub_chaining1_simple.tests    |  11 +
+ .../aots/tests/gsub_chaining1_successive.tests     |   1 +
+ .../data/aots/tests/gsub_chaining2_boundary.tests  |   4 +
+ .../aots/tests/gsub_chaining2_lookupflag.tests     |   1 +
+ .../tests/gsub_chaining2_multiple_subrules.tests   |   2 +
+ .../aots/tests/gsub_chaining2_next_glyph.tests     |   1 +
+ .../data/aots/tests/gsub_chaining2_simple.tests    |  11 +
+ .../aots/tests/gsub_chaining2_successive.tests     |   1 +
+ .../data/aots/tests/gsub_chaining3_boundary.tests  |   4 +
+ .../aots/tests/gsub_chaining3_lookupflag.tests     |   1 +
+ .../aots/tests/gsub_chaining3_next_glyph.tests     |   1 +
+ .../data/aots/tests/gsub_chaining3_simple.tests    |  11 +
+ .../aots/tests/gsub_chaining3_successive.tests     |   1 +
+ .../data/aots/tests/gsub_context1_boundary.tests   |   2 +
+ .../data/aots/tests/gsub_context1_expansion.tests  |   1 +
+ .../data/aots/tests/gsub_context1_lookupflag.tests |   2 +
+ .../tests/gsub_context1_multiple_subrules.tests    |   2 +
+ .../data/aots/tests/gsub_context1_next_glyph.tests |   1 +
+ .../data/aots/tests/gsub_context1_simple.tests     |   3 +
+ .../data/aots/tests/gsub_context1_successive.tests |   1 +
+ .../data/aots/tests/gsub_context2_boundary.tests   |   2 +
+ .../data/aots/tests/gsub_context2_classes.tests    |   2 +
+ .../data/aots/tests/gsub_context2_expansion.tests  |   1 +
+ .../data/aots/tests/gsub_context2_lookupflag.tests |   2 +
+ .../tests/gsub_context2_multiple_subrules.tests    |   2 +
+ .../data/aots/tests/gsub_context2_next_glyph.tests |   1 +
+ .../data/aots/tests/gsub_context2_simple.tests     |   3 +
+ .../data/aots/tests/gsub_context2_successive.tests |   1 +
+ .../data/aots/tests/gsub_context3_boundary.tests   |   2 +
+ .../data/aots/tests/gsub_context3_lookupflag.tests |   2 +
+ .../data/aots/tests/gsub_context3_next_glyph.tests |   1 +
+ .../data/aots/tests/gsub_context3_simple.tests     |   2 +
+ .../data/aots/tests/gsub_context3_successive.tests |   1 +
+ .../data/aots/tests/lookupflag_ignore_attach.tests |   5 +
+ .../data/aots/tests/lookupflag_ignore_base.tests   |   2 +
+ .../aots/tests/lookupflag_ignore_combination.tests |   3 +
+ .../aots/tests/lookupflag_ignore_ligatures.tests   |   3 +
+ .../data/aots/tests/lookupflag_ignore_marks.tests  |   1 +
+ test/shaping/run-tests.py                          |   9 +-
+ 332 files changed, 815 insertions(+), 3 deletions(-)
+
+commit ae96c98dfaef3a789227ffecd40b92518dface8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 10:25:10 2018 -0500
+
+    [color] Use SortedUnsizedArrayOf<>
+
+ src/hb-ot-color-colr-table.hh | 16 ++--------------
+ 1 file changed, 2 insertions(+), 14 deletions(-)
+
+commit 4a3b20738fca3231e5d9a36adba333b5bce05f4a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 10:17:59 2018 -0500
+
+    [trak] Coment
+
+ src/hb-aat-layout-trak-table.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 918b1ee54d43eb493c9226bff7677ed8ec07934b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 10:09:17 2018 -0500
+
+    [arrays] Add not_found to reference bsearch as well
+
+ src/hb-open-type.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit d77a098b735cf14aa601feab5bdb9f4e474c794f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 10:06:13 2018 -0500
+
+    [arrays] Improve bfind() interface
+
+    Much more useful now. :)
+
+ src/hb-dsalgs.hh           | 29 +++++++++++++++++++++++++----
+ src/hb-open-file.hh        |  9 +--------
+ src/hb-open-type.hh        | 12 ++++++++----
+ src/hb-ot-layout-common.hh | 10 ++--------
+ src/hb-set.hh              |  6 +++---
+ src/hb-vector.hh           |  6 ++++--
+ 6 files changed, 43 insertions(+), 29 deletions(-)
+
+commit 1204a247a5d9a4da39675d3da85d4fd3268a5b66
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 09:49:21 2018 -0500
+
+    [fuzzing] Add tests for previous commit
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11526
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11522
+
+ ...zz-testcase-minimized-hb-shape-fuzzer-5634620935110656 | Bin 0 ->
+ 41 bytes
+ ...zz-testcase-minimized-hb-shape-fuzzer-5716208469409792 | Bin 0 ->
+ 243 bytes
+ 2 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 8dcc1913a1670ede7b124f7b5b775d7ab8791386
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 09:47:45 2018 -0500
+
+    [kerx/morx] Make sure object length is sanitized before accessing it
+
+ src/hb-aat-layout-kerx-table.hh | 5 +++++
+ src/hb-aat-layout-morx-table.hh | 5 +++++
+ 2 files changed, 10 insertions(+)
+
+commit 70d80c90fe2f4eca66bec3e1d313bbf7e4d0ab65
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:59:50 2018 -0500
+
+    [arrays] Port ArrayOf.qsort() and hb_vector_t.qsort() to hb_array_t
+
+ src/hb-dsalgs.hh    | 14 ++++++++++++--
+ src/hb-open-type.hh | 14 ++++++++++++--
+ 2 files changed, 24 insertions(+), 4 deletions(-)
+
+commit 073d837aa2394d29dda72679802d583c559c3c5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:48:48 2018 -0500
+
+    [arrays] Port ArrayOf.qsort() to hb_array_t's
+
+ src/hb-open-type.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit ad5c871d801b481f95dd32c8b65ecc70def597be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:47:49 2018 -0500
+
+    [arrays] Add copy-constructor to hb_array_t and hb_sorted_array_t
+
+ src/hb-dsalgs.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 61de55bf496c1edb120e4d096140eb1125552bbe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:45:58 2018 -0500
+
+    [arrays] Port hb_vector_t.qsort() to hb_array_t's
+
+ src/hb-dsalgs.hh | 16 +++++++++++++---
+ src/hb-vector.hh | 10 ++--------
+ 2 files changed, 15 insertions(+), 11 deletions(-)
+
+commit e3face8e791d677f94154e8a7f3d787d0d69a02f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:42:17 2018 -0500
+
+    [arrays] Remove one flavor of hb_vector_t.qsort()
+
+ src/hb-vector.hh | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
+
+commit 7c1600dcd9813ca560ecccc5c54877a5750caf4e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:37:11 2018 -0500
+
+    [arrays] Add (unused) SortedUnsizedArrayOf<>
+
+ src/hb-open-type.hh | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit e700392f5cbf366f1e03dc7e7b1a2eb6c3027b92
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:31:00 2018 -0500
+
+    [arrays] Port SortedArrayOf.bsearch/bfind to hb_sorted_array_t's
+
+ src/hb-dsalgs.hh    |  9 +++------
+ src/hb-open-type.hh | 50
+ ++++++++++----------------------------------------
+ src/hb-vector.hh    | 35 ++++++++++-------------------------
+ 3 files changed, 23 insertions(+), 71 deletions(-)
+
+commit e604306f2829804e9016966c1378166253b19d29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:24:48 2018 -0500
+
+    [arrays] Port hb_vector_t.bsearch/bfind to (new) hb_sorted_array_t's
+
+ src/hb-dsalgs.hh    | 63
+ +++++++++++++++++++++++++++++++++++++++++++++++++----
+ src/hb-open-type.hh | 12 ++++++----
+ src/hb-vector.hh    | 57 +++++++++++++++++++-----------------------------
+ 3 files changed, 89 insertions(+), 43 deletions(-)
+
+commit 268eca24921e85eda98f4f0cce05d40c7235ba62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:11:12 2018 -0500
+
+    [arrays] Port (unused) ArrayOf.lsearch() to hb_array_t's
+
+ src/hb-open-type.hh | 12 ++----------
+ 1 file changed, 2 insertions(+), 10 deletions(-)
+
+commit 830856ba6b9454bf507e00416f9d45e9975fb7dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:09:28 2018 -0500
+
+    [arrays] Port hb_vector_t.lsearch() to hb_array_t's
+
+ src/hb-dsalgs.hh | 26 +++++++++++++++++++++++---
+ src/hb-vector.hh | 16 ++++------------
+ 2 files changed, 27 insertions(+), 15 deletions(-)
+
+commit 96cf0889804b7d72a96274b25641bb18f7dd2e1e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:07:15 2018 -0500
+
+    [arrays] More
+
+ src/hb-face.cc   | 6 +++---
+ src/hb-vector.hh | 4 ++--
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 3e26c8d2b10fc08642c25c7f13aef68b0b1008f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 00:58:44 2018 -0500
+
+    [arrays] Update ArrayOf.lsearch()
+
+    Currently unused apparently
+
+ src/hb-open-type.hh | 17 +++++++++++++----
+ 1 file changed, 13 insertions(+), 4 deletions(-)
+
+commit 22e1857b01c71714245ddca05cb3fa0127bf7da2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 00:53:19 2018 -0500
+
+    [arrays] Change argument type of cmp called by hb_vector_t.bsearch()
+
+    Towards consolidating all array bsearch/...
+
+ src/hb-aat-map.hh | 4 ++--
+ src/hb-ot-map.hh  | 4 ++--
+ src/hb-set.hh     | 2 +-
+ src/hb-vector.hh  | 4 ++--
+ 4 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 5fdf7b724eb3cb5ac60cd7f90d3250877ad7ca06
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Thu Nov 15 17:40:21 2018 -0600
+
+    Usermanual: clusters chapter; add brief grapheme definition and
+    clarify monotonous cluster handling.
+
+ docs/usermanual-clusters.xml | 56
+ ++++++++++++++++++++++++++++++--------------
+ 1 file changed, 39 insertions(+), 17 deletions(-)
+
+commit 939220e57da613e090d247aa1af2396c28370af4
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Thu Nov 15 15:47:03 2018 -0600
+
+    Usermanual: clusters chapter, minor updates.
+
+ docs/usermanual-clusters.xml | 25 ++++++++++++++++---------
+ 1 file changed, 16 insertions(+), 9 deletions(-)
+
+commit 53ac46e974cf0ee8720b40ef394714eb97ff53b9
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon Nov 12 12:17:06 2018 -0600
+
+    Usermanual: expand clusters chapter.
+
+ docs/usermanual-clusters.xml | 743
+ +++++++++++++++++++++++++++----------------
+ 1 file changed, 473 insertions(+), 270 deletions(-)
+
+commit 30cb45b3eaacda15cc45435815cae3fd50e87557
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 00:35:31 2018 -0500
+
+    Change ArrayOf.bsearch() return semantics
+
+    Towards consolidating all array bsearch/...
+
+ src/hb-aat-layout-kerx-table.hh | 16 +++-------------
+ src/hb-open-file.hh             | 12 ++++++++----
+ src/hb-open-type.hh             | 42
+ ++++++++++++++++++++++++++++++++---------
+ src/hb-ot-cmap-table.hh         | 30 ++++++++++++-----------------
+ src/hb-ot-color-svg-table.hh    |  3 +--
+ src/hb-ot-layout-common.hh      | 29 +++++++++++-----------------
+ src/hb-ot-vorg-table.hh         |  9 ++++-----
+ src/hb-vector.hh                | 14 +++++++++-----
+ 8 files changed, 81 insertions(+), 74 deletions(-)
+
+commit 5cd9546ba73d9f8c8b7b8db0960d657c50b70f64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 00:38:36 2018 -0500
+
+    Minor
+
+ src/hb-ot-layout-common.hh | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit fd94e729cb50f2b6bd83b80cbf400e10ac633a1c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 00:45:55 2018 -0500
+
+    Whitespace
+
+ src/hb-ot-layout-common.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bb2a2065080a3099eb0dc82d1df0891ad2601316
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 00:31:40 2018 -0500
+
+    Assert that item-type of arrays have static size
+
+ src/hb-dsalgs.hh    | 2 ++
+ src/hb-open-type.hh | 4 ++++
+ src/hb-vector.hh    | 2 ++
+ 3 files changed, 8 insertions(+)
+
+commit 690d9eb83d3421b397b0cb824cd768d6d73cbf12
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 00:29:22 2018 -0500
+
+    [vector] Rename
+
+ src/hb-vector.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit ba38378fd4374f3d44bdc9aa0de902401b60b13d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 00:27:57 2018 -0500
+
+    [aat] Minor
+
+ src/hb-aat-layout-common.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 39b9d63b014380d421cc9b94a49dd411c7a5aabf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 00:25:40 2018 -0500
+
+    Add hb_static_size(T)
+
+ src/hb-null.hh | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+commit f99abcc37990a478189dda691d1fdac7b9d51386
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 00:22:21 2018 -0500
+
+    Add template-function convenience macros
+
+ src/hb-atomic.hh |  2 +-
+ src/hb-blob.hh   |  4 ++--
+ src/hb-common.cc |  2 +-
+ src/hb-ft.cc     |  2 +-
+ src/hb-null.hh   | 11 ++++++-----
+ src/hb.hh        |  3 +++
+ 6 files changed, 14 insertions(+), 10 deletions(-)
+
+commit ec83b2228e0bbb6df7e7b94dad49db32b041af4a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 19:58:49 2018 -0500
+
+    Add null bytes for CmapSubtableLongGroup
+
+ src/hb-ot-cmap-table.hh | 1 +
+ src/hb-static.cc        | 4 +++-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit e2ffb33a534a427c760dae53d0469eeced4343ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 16:24:28 2018 -0500
+
+    Remove lsearch for small TableDirectorys
+
+ src/hb-open-file.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 04f7e5536924e7f277d72b8cb9d878239877c331
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 16:07:43 2018 -0500
+
+    [arrays] Add as_array() to hb_vector_t<>
+
+ src/hb-vector.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit c514f65181390ab98b0f738632f71cda31e46b68
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 16:04:56 2018 -0500
+
+    [arrays] Add as_array() to ArrayOf<>
+
+ src/hb-open-type.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 9552f4ef0da0b7e1fb28cb2738b865888e7941d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 15:24:17 2018 -0500
+
+    [kern] Don't enforce length of last subtable
+
+ src/hb-aat-layout-kerx-table.hh | 19 +++++++++++++++++--
+ 1 file changed, 17 insertions(+), 2 deletions(-)
+
+commit 992b7128656e72f935089dc2e12c2d2a25511886
+Merge: c9cc96c0 018ba46e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 13:49:34 2018 -0500
+
+    Merge pull request #1407 from harfbuzz/at-sign
+
+    Don't canonicalize '@' to '-' in language tags
+
+commit 018ba46e4d003a5dd0f6d2d899226129c4ef0c60
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Nov 23 13:21:22 2018 -0500
+
+    Don't canonicalize '@' to '-' in language tags
+
+    Fixes #1406.
+
+ src/hb-common.cc       | 2 +-
+ test/api/test-ot-tag.c | 3 +++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit c9cc96c0cfbbb87b9292e413d500a454182be9f4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Nov 23 19:58:56 2018 +0330
+
+    [aat] Update expectation
+
+ test/shaping/data/in-house/tests/macos-10.12.tests | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 748962264a9f098b32b9cb3fe4d18c786907a184
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 11:10:17 2018 -0500
+
+    [aat] Disable mark advance zeroing if kern table has state-machines
+
+    Geeza Pro for example, relies on that for fancy mark positioning.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1405
+
+ src/hb-aat-layout-kerx-table.hh | 15 +++++++++++++++
+ src/hb-ot-kern-table.hh         |  9 +++++++++
+ src/hb-ot-layout.cc             |  6 ++++++
+ src/hb-ot-layout.hh             |  3 +++
+ src/hb-ot-shape.cc              |  4 +++-
+ 5 files changed, 36 insertions(+), 1 deletion(-)
+
+commit 3d2b98ef14af29acd74f01647bef60cd410825fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 10:45:44 2018 -0500
+
+    Minor
+
+ src/hb.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 341851efe158599a34d241a97593058a4333852e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Nov 23 15:40:05 2018 +0330
+
+    [aat] Add macOS specific tests (#1404)
+
+ .circleci/config.yml                               | 46
+ ++++++++++++++--------
+ test/shaping/CMakeLists.txt                        |  2 +
+ test/shaping/data/in-house/Makefile.sources        |  1 +
+ test/shaping/data/in-house/tests/macos-10.12.tests | 10 +++++
+ test/shaping/run-tests.py                          | 38
+ ++++++++++++++----
+ 5 files changed, 73 insertions(+), 24 deletions(-)
+
+commit 22798e93c414a2655c757a6e41b300f67e04a9a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 22:47:51 2018 -0500
+
+    [use] Minor clarification
+
+ src/hb-ot-shape-complex-use.cc | 34 +++++++++++++++++-----------------
+ 1 file changed, 17 insertions(+), 17 deletions(-)
+
+commit a2d6c1075a5595a08ef09357293919d9df8eb64a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 22:40:57 2018 -0500
+
+    Minor tweak to FLAG64
+
+ src/hb.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 8280459e74cff2dec3de012abd309cda9578b759
+Merge: e4a4555d 3c7792ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 22:39:12 2018 -0500
+
+    Merge pull request #1291 from harfbuzz/use-reordering
+
+    [use] Fix reordering
+
+commit e4a4555d1e40dacdf72452805e9e6b6109627d63
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 22:17:49 2018 -0500
+
+    [cmap] Move code around
+
+ src/hb-ot-cmap-table.hh | 18 ++++++++++--------
+ 1 file changed, 10 insertions(+), 8 deletions(-)
+
+commit 758c9d68e2143493978d8ac8391f4af2a2abc26a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 22:16:12 2018 -0500
+
+    [morx/kerx] Limit range to subtable when sanitizing
+
+ src/hb-aat-layout-kerx-table.hh | 2 ++
+ src/hb-aat-layout-morx-table.hh | 2 ++
+ 2 files changed, 4 insertions(+)
+
+commit a9fe787a11fc391d9a43a4ea19e6eb1c474199bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 22:12:36 2018 -0500
+
+    [sanitizer] Add reset_object(), make set_object() do bounds-check
+
+    Affects morx/kerx run-time only currently.  Will adjust their
+    sanitize next.
+
+ src/hb-aat-layout-kerx-table.hh |  1 +
+ src/hb-aat-layout-morx-table.hh |  1 +
+ src/hb-machinery.hh             | 30 +++++++++++++++++++-----------
+ 3 files changed, 21 insertions(+), 11 deletions(-)
+
+commit 2c8188bf599e351a4e0804d74612f9643b3d2443
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 22:02:19 2018 -0500
+
+    [kerx] Make sure subtables are non-zero-length
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11400
+
+ src/hb-aat-layout-kerx-table.hh                          |   1 +
+ src/hb-aat-layout-morx-table.hh                          |   2 +-
+ ...z-testcase-minimized-hb-shape-fuzzer-5722888989048832 | Bin 0 ->
+ 3608 bytes
+ 3 files changed, 2 insertions(+), 1 deletion(-)
+
+commit a9e0bdc35dfcbead7d4b6fa249d60ebedd7d43ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 21:30:04 2018 -0500
+
+    [GSUB] Don't flush glyphset during recursion in closure()
+
+    See comment.
+
+    Supercedes https://github.com/harfbuzz/harfbuzz/pull/1401
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11366
+
+ src/hb-ot-layout-gsub-table.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 8982830d3ec54f50cc951de9569520fafc735e75
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Nov 19 13:00:24 2018 -0800
+
+    [subset] add fuzzer testcase.
+
+ ...z-testcase-minimized-hb-subset-fuzzer-5067936541179904 | Bin 0 ->
+ 172 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit d0e81b2cc85d09d01905c5fc5b3382c25eaa3bb3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 21:20:39 2018 -0500
+
+    [set] Rename
+
+ src/hb-set.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit e866910579e9cdc5b1ffa2e401fd0c056d44ca6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 18:07:59 2018 -0500
+
+    Enforce requiring null_size even if min_size is 0
+
+    This concludes null-size enforcement changes
+
+ src/hb-null.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4d4fd64ff47da04a7008d410c92e8fb4ad970781
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 18:07:36 2018 -0500
+
+    Allow non-nullable OffsetTo<> to non-Null'able objects
+
+ src/hb-open-type.hh | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+commit fa9f585ec53bc7145d3bed1a4bd756d64dae1e55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 17:56:51 2018 -0500
+
+    [glyf] Don't mark structs UNBOUNDED
+
+    See comments.
+
+ src/hb-ot-glyf-table.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit f47a60a7543dbaf41086c25a1a22ae518d8b92a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 17:53:29 2018 -0500
+
+    Mark UnsizedArrayOf<> as UNBOUNDED
+
+    Since min_size is 0, Null() still accepts this type.
+
+ src/hb-open-type.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 199a0f7b41b691e371487fd569c0d0146da3c3f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 17:31:07 2018 -0500
+
+    [ot-shape] Simplify logic
+
+ src/hb-ot-shape.cc | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 014e4980ed9c8c473001abdb3a44121eb73fd50d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 16:21:49 2018 -0500
+
+    Move
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 62890dee18b88865a2014fb6a1322c1c9218bd49
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 16:20:29 2018 -0500
+
+    [aat] Zero mark advances if decided so even if there's cross-kerning
+
+    Cross-kerning can only take care of positioning vertically.
+    It doesn't
+    adjust mark advance...
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a201fa74cd67f36a402a5c8093889c9d793e9fd5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 15:52:29 2018 -0500
+
+    [aat] Tweak fallback positioning logic when applying morx
+
+    Such that for Indic-like scripts (eg. Khmer), we don't do any
+    fallback mark
+    advance-zeroing / positioning, but we do for Latin, etc.  Reuses
+    preferences
+    of our script-specific OpenType shapers for those.
+
+    Fixes regression: https://github.com/harfbuzz/harfbuzz/issues/1393
+    Which means, fixes again:
+    https://github.com/harfbuzz/harfbuzz/issues/1264
+    While not regressing: https://github.com/harfbuzz/harfbuzz/issues/1357
+
+ src/hb-ot-shape.cc | 38 +++++++++++++++++++++++---------------
+ src/hb-ot-shape.hh |  3 +++
+ 2 files changed, 26 insertions(+), 15 deletions(-)
+
+commit fa0bd8964d110c168a918bc331dcd350c3fed8c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 14:46:39 2018 -0500
+
+    [myanmar] Minor move
+
+ src/hb-ot-shape-complex.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 7dc561984bdb1f29f09ae0793195b5fbf772522b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 14:45:46 2018 -0500
+
+    [myanmar] If there's no GSUB table, pick myanmar shaper
+
+    Needed for morx+kern mark-zeroing interaction.  All other scripts
+    work this way.
+
+ src/hb-ot-shape-complex.hh | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+commit 25f52f58c20715cc0dee2dd2885669078a128b08
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 14:41:01 2018 -0500
+
+    [myanmar] Remove myanmar_old shaper
+
+    Over time it has become the same as default shaper.  So, remove.
+
+ src/hb-ot-shape-complex-myanmar.cc | 21 ---------------------
+ src/hb-ot-shape-complex.hh         |  4 +---
+ 2 files changed, 1 insertion(+), 24 deletions(-)
+
+commit eeed802b1d0f932c61a088d3e0156ae70645b9e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 01:53:36 2018 -0500
+
+    Fix spurious gcc warnings
+
+    ../../src/hb-null.hh:53:39: warning: enum constant in boolean context
+    [-Wint-in-bool-context]
+
+ src/hb-null.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b96ecb9971a9ad089a631d0139f05ae9d880fc55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 01:49:12 2018 -0500
+
+    More
+
+    This makes more of the gcc spurious warning:
+
+    ../../src/hb-null.hh:53:39: warning: enum constant in boolean context
+    [-Wint-in-bool-context]
+
+    But not going to let that defeat correct code.  Type to switch
+    to clang
+    as my main compiler...
+
+ src/hb-blob.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2737aa81e5aee721e868bf0c72f19c0245c721fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 01:44:27 2018 -0500
+
+    Fix up recent change
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1300
+
+ src/hb-null.hh          | 12 +++++++++---
+ src/hb-open-type.hh     |  5 -----
+ src/hb-ot-glyf-table.hh |  4 ++--
+ 3 files changed, 11 insertions(+), 10 deletions(-)
+
+commit fffea5aff7a631eedd13c38c1fb7ea4f5f950930
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 01:25:34 2018 -0500
+
+    Minor
+
+ src/hb-open-type.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 209b58ef731f102b92179ed76551e2fd6b5ed075
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 01:22:33 2018 -0500
+
+    Minor
+
+ src/hb-ot-kern-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3b9fd176e83bbebc4d0b5fc967c15b08fdef7015
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 01:18:55 2018 -0500
+
+    Disallow taking Null() of unbounded structs
+
+    Not sure I've marked all such structs.  To be done as we discover.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1300
+
+ src/hb-aat-layout-common.hh |  2 +-
+ src/hb-machinery.hh         |  4 ++++
+ src/hb-ot-kern-table.hh     |  2 +-
+ src/hb-ot-var-fvar-table.hh | 31 ++++++++++++++++---------------
+ 4 files changed, 22 insertions(+), 17 deletions(-)
+
+commit f2b91d6510face95008151bb0d25837723536f9f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 01:10:22 2018 -0500
+
+    Use Type::null_size for our structs in Null(), sizeof() for other
+    types
+
+ src/hb-null.hh | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+commit 7dd945a8764cbbf76f686fd9387918b63f7d2fb4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 01:05:02 2018 -0500
+
+    One more time..
+
+ src/hb-machinery.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d062ad10de6c63d94676660b76526a160cf4299e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 00:39:14 2018 -0500
+
+    Fix bots happy again, hopefully
+
+    So, our fallback static_assert cannot be had more than once per line
+    of source.
+
+ src/hb-machinery.hh | 16 +++++++---------
+ 1 file changed, 7 insertions(+), 9 deletions(-)
+
+commit fb10c021c8a32f8dc054f008caf86af82667e109
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 00:21:49 2018 -0500
+
+    Revert alignof() == 1 check
+
+    Bots not happy with using "this" inside assertion...
+
+    This reverts 2656644887e77a9d814bb12374af3c26b42fd935
+
+ src/hb-machinery.hh | 12 ++++--------
+ 1 file changed, 4 insertions(+), 8 deletions(-)
+
+commit 8d778877b88155dec1808a994416ead0b3d98ae7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 21 23:46:09 2018 -0500
+
+    ..
+
+ src/hb-machinery.hh | 8 ++++++--
+ src/hb-null.hh      | 4 ++--
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+commit 8cfeed99486e87c3217dc141bc24b7768a460f32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 21 23:42:31 2018 -0500
+
+    Minor
+
+ src/hb-machinery.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e5d954a2fb0c390ea67e83763e3c3a47caa2eb50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 21 23:30:50 2018 -0500
+
+    Minor
+
+ src/hb-machinery.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e987059c618e03d2346c31ed64429d67ce0e367a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 21 23:25:06 2018 -0500
+
+    Minor
+
+ src/hb-machinery.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit a2b6d308a40d737f54a79f00bc7ace226bad5aaf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 21 23:23:49 2018 -0500
+
+    Remove DEFINE_SIZE_ARRAY2
+
+ src/hb-machinery.hh        | 6 ------
+ src/hb-ot-layout-common.hh | 8 ++++----
+ src/hb-ot-post-table.hh    | 6 +++---
+ 3 files changed, 7 insertions(+), 13 deletions(-)
+
+commit 2656644887e77a9d814bb12374af3c26b42fd935
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 21 23:23:21 2018 -0500
+
+    Check alignof() structs are 1
+
+ src/hb-machinery.hh | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+commit 6321fdf7040ce48e3de8d34fdcc57caa6433cb66
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 21 23:19:00 2018 -0500
+
+    Whitespace
+
+ src/hb-machinery.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f961c1eb88af0d178e5d3431b9d57bdf79669488
+Merge: ecdceea8 264439c6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 21 17:27:27 2018 -0500
+
+    Merge pull request #1400 from harfbuzz/sharada-sandhi-mark
+
+    Test U+111C9 SHARADA SANDHI MARK
+
+commit 264439c6c308ac5f01c4ba4faf64daa2d642236a
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Nov 21 16:33:45 2018 -0500
+
+    Test U+111C9 SHARADA SANDHI MARK
+
+ .../fonts/86cdd983c4e4c4d7f27dd405d6ceb7d4b9ed3d35.ttf    | Bin 0 ->
+ 968 bytes
+ test/shaping/data/in-house/tests/use-syllable.tests       |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit ecdceea861952be003e1d435aa3282a4e3e200a9
+Merge: b89c7fd3 b3d5b0a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 21 16:12:32 2018 -0500
+
+    Merge pull request #1399 from harfbuzz/sharada-sandhi-mark
+
+    Fix USE categories for U+111C9 SHARADA SANDHI MARK
+
+commit b89c7fd3dc505a958dd4b6acec0e0f8e57224fd8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 21 12:32:48 2018 -0500
+
+    Allow defining HB_USE_ATEXIT to 0
+
+    That's better use of that value than requiring extra macro
+    HB_NO_ATEXIT
+
+ src/hb-common.cc    | 10 +++++-----
+ src/hb-ft.cc        | 12 ++++++------
+ src/hb-glib.cc      |  6 +++---
+ src/hb-icu.cc       |  6 +++---
+ src/hb-ot-font.cc   |  6 +++---
+ src/hb-shape.cc     |  6 +++---
+ src/hb-shaper.cc    |  6 +++---
+ src/hb-ucdn.cc      |  6 +++---
+ src/hb-uniscribe.cc |  4 ++--
+ src/hb.hh           |  5 ++++-
+ 10 files changed, 35 insertions(+), 32 deletions(-)
+
+commit b3d5b0a5d92115ca672b8103999ab7ac88e39a4a
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Nov 21 11:35:44 2018 -0500
+
+    Fix USE categories for U+111C9 SHARADA SANDHI MARK
+
+ src/gen-use-table.py                 | 7 ++++++-
+ src/hb-ot-shape-complex-use-table.cc | 2 +-
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit f48bb9a3939067f24a81007e642caaac77cc7167
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 20 20:40:55 2018 -0500
+
+    [var] Deprecated axis enumeration API and add new version
+
+    New version has axis flags.
+
+    New API:
+    +hb_ot_var_axis_info_t
+    +hb_ot_var_find_axis_info()
+    +hb_ot_var_get_axis_infos()
+
+    Deprecated API:
+    -HB_OT_VAR_NO_AXIS_INDEX
+    -hb_ot_var_axis_t
+    -hb_ot_var_find_axis()
+    -hb_ot_var_get_axes()
+
+ docs/harfbuzz-sections.txt  |  14 +++---
+ src/hb-deprecated.h         |  37 +++++++++++++++
+ src/hb-ot-var-fvar-table.hh | 112
+ ++++++++++++++++++++++++++++++++------------
+ src/hb-ot-var.cc            |  43 ++++++++++++++---
+ src/hb-ot-var.h             |  61 ++++++++++++------------
+ test/api/test-ot-face.c     |   2 +-
+ 6 files changed, 192 insertions(+), 77 deletions(-)
+
+commit b2d803cef6974519d5892af2c9efeb8dfba87618
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 20 11:42:25 2018 -0500
+
+    Remove newly-added -hb_ot_var_axis_get_flags()
+
+ src/hb-ot-var-fvar-table.hh |  6 ------
+ src/hb-ot-var.cc            | 12 ------------
+ src/hb-ot-var.h             |  4 ----
+ 3 files changed, 22 deletions(-)
+
+commit 736897d7a1410fd281fbcedc084b85bf4ba1410c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 20 11:40:43 2018 -0500
+
+    [var] Make sure hb_ot_var_axis_flags_t is int-sized
+
+ src/hb-ot-var.h | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit eab5d15f6156e771cb606b760dd170b96c5cd398
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 20 11:33:33 2018 -0500
+
+    [var] Move code
+
+ src/hb-ot-var.h | 27 ++++++++++++++-------------
+ 1 file changed, 14 insertions(+), 13 deletions(-)
+
+commit 1ecbf4d3e3de7edc86651c6f805788747d6d89af
+Merge: 515f1a16 064f703c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Nov 20 17:19:05 2018 -0800
+
+    Merge branch 'master' into cff-subset
+
+commit 064f703c7ac5a28803a8221720e922ea6dbd2505
+Merge: be1828da 82951182
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 20 16:29:30 2018 -0500
+
+    Merge pull request #1397 from harfbuzz/small-emoji-table
+
+    Shrink the emoji table by merging adjacent ranges
+
+commit 82951182799772a642d32195dd87e6f0c116f545
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Nov 20 15:41:45 2018 -0500
+
+    Shrink the emoji table by merging adjacent ranges
+
+ src/gen-emoji-table.py        |  13 +--
+ src/hb-unicode-emoji-table.hh | 189
+ ++++--------------------------------------
+ 2 files changed, 23 insertions(+), 179 deletions(-)
+
+commit be1828daaa1e1a72d971aed8d34fff54688d0f41
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 20 11:16:23 2018 -0500
+
+    [var] Fix type of coords returned
+
+    Ouch.  Wonder how none of the bots caught the float->int truncation.
+
+ src/hb-ot-var-fvar-table.hh | 2 +-
+ src/hb-ot-var.cc            | 2 +-
+ src/hb-ot-var.h             | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 8f3ee17ae468950a34439785d2e6ac4182efb65c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 20 01:38:23 2018 -0500
+
+    [travis] Update Coverity token
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f9552362986efd0973b2637d21b787edbc8479f2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 20 01:21:36 2018 -0500
+
+    Add codecov.io badge
+
+ README | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit 831ba74382e35f110006539f22bebce4d57c8502
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 20 01:16:08 2018 -0500
+
+    Fix Codacy "issues"
+
+ src/test-name-table.cc  |  2 +-
+ src/test-ot-color.cc    | 14 +++++++-------
+ test/api/test-buffer.c  |  5 +++--
+ test/api/test-object.c  |  2 +-
+ test/api/test-ot-name.c |  2 +-
+ 5 files changed, 13 insertions(+), 12 deletions(-)
+
+commit c49e43c1ffee0e9664da6202ace493d932b725a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 20 01:06:50 2018 -0500
+
+    [travis] Another push for codecov.io after setting token
+
+ .travis.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 96b24c5124a085b7601215360eed847ce5302699
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 20 01:03:42 2018 -0500
+
+    [travis] Add codecov.io
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3c7792ca326abfb989285f794d6ee71ad9f6bf89
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Sat Oct 20 15:02:26 2018 -0400
+
+    [use] Fix reordering
+
+    Fixes #1235.
+
+ src/hb-ot-shape-complex-use.cc                     |  48
+ ++++++++++++++-------
+ src/hb.hh                                          |   2 +
+ .../4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf   | Bin 0 -> 1824 bytes
+ test/shaping/data/in-house/tests/use.tests         |   3 ++
+ 4 files changed, 38 insertions(+), 15 deletions(-)
+
+commit 587d49fc657c10c8a20f2409a04d72bf80bb361e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 19 14:27:19 2018 -0500
+
+    [fvar] Add named-instance API
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1241
+
+ docs/harfbuzz-sections.txt  |  4 ++++
+ src/hb-ot-var-fvar-table.hh | 55
+ ++++++++++++++++++++++++++++++++++++++++++---
+ src/hb-ot-var.cc            | 33 +++++++++++++++++++++++++++
+ src/hb-ot-var.h             | 32 ++++++++++++++++++++++++++
+ 4 files changed, 121 insertions(+), 3 deletions(-)
+
+commit 46c0da820fc313bad8afaf019d2cd9065fa5f514
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 19 13:32:48 2018 -0500
+
+    Fix build
+
+ src/hb-dsalgs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 56c9238d3da8c034336cf80ba37e03e33c493718
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 19 13:09:53 2018 -0500
+
+    [fvar] Rewrite sanitize
+
+ src/hb-ot-var-fvar-table.hh | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit 4a6a692e3ea4fab632a0162c6d513dc151054d8f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 19 13:04:43 2018 -0500
+
+    [fvar] Use hb_array_t for axes
+
+ src/hb-dsalgs.hh            |  6 ++++++
+ src/hb-ot-var-fvar-table.hh | 14 ++++----------
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+commit e0097396010c40cf62641cd12ceb12dd5d79c9c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 19 12:53:53 2018 -0500
+
+    [fvar] Minor
+
+ src/hb-ot-var-fvar-table.hh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 1a2eb108b857de9c5e84cc5de0c12c7657e04498
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 19 12:36:56 2018 -0500
+
+    [ot-var] Add hb_ot_var_axis_get_flags()
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1241
+
+    New API:
+    +hb_ot_var_axis_flags_t
+    +hb_ot_var_axis_get_flags
+
+ docs/harfbuzz-sections.txt  |  2 ++
+ src/hb-buffer.h             |  2 ++
+ src/hb-ot-var-fvar-table.hh |  9 +++++++++
+ src/hb-ot-var.cc            | 12 ++++++++++++
+ src/hb-ot-var.h             | 13 +++++++++++++
+ 5 files changed, 38 insertions(+)
+
+commit bd6b2ba1d3910cc259db7abeb6c9bd7ed9494857
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 19 11:34:56 2018 -0500
+
+    [ot-var] Add flags
+
+    Unfortunate that we don't have room in hb_ot_var_axis_t to expose
+    flags :(.
+
+ src/hb-ot-var-fvar-table.hh | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit c076c7b85ce4d069ae8b2b04143aca4c4f052ae9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 19 11:30:40 2018 -0500
+
+    [ot-var] Use hb_ot_name_id_t
+
+ src/hb-ot-var.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 515f1a16140f78c9ec379854851f77a1b44af145
+Merge: a6da9b94 e3a1a835
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 16 17:38:47 2018 -0800
+
+    Merge branch 'master' into cff-subset
+
+commit a6da9b9415bae43c58f12a8e43b77ba31dd432a6
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 16 17:29:03 2018 -0800
+
+    fixed Charset format selection
+
+ src/hb-subset-cff1.cc | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit e3a1a8350a6a7933b0a100194985f4425ab9de19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 16:53:25 2018 -0800
+
+    2.1.3
+
+ NEWS             | 6 ++++++
+ configure.ac     | 2 +-
+ src/hb-version.h | 4 ++--
+ 3 files changed, 9 insertions(+), 3 deletions(-)
+
+commit 9714e114b88893bd962b1bcf36382bdacbc4866c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 16:52:42 2018 -0800
+
+    Fix recent commits
+
+ src/hb-open-type.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0328a1ce41611ed981d41384ae5727479699f3a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 16:48:28 2018 -0800
+
+    Revert b4c61130324455bfd42095b01fa14ac901e441f1
+
+    Was causing more trouble than it solved.  We use unsigned for
+    indexing,
+    and it's not helpful to allow that wrapping to negative integers on
+    32bit machines.  The only way we could work around it would have been
+    by accepting int64_t arg, but that's overkill.
+
+    Ignore the MSVC 2008 build issue.  We don't support that compiler.
+
+ src/hb-open-type.hh | 17 ++++-------------
+ 1 file changed, 4 insertions(+), 13 deletions(-)
+
+commit 52f61cdb87b67ef42a25288d8624170d0b6d3a25
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 16:41:59 2018 -0800
+
+    Detect over/under-flow in UnsizedArray::operator[]
+
+    Was causing bad substitutions in mort table because of
+    WordOffsetToIndex()
+    producing negative numbers that were cast to unsigned int and
+    returned as
+    large numbers (which was desirable, so they would be rejected),
+    but then
+    they were cast to int when passed to this operator and acting as small
+    negative integers, which was bad...
+
+    Detect overflow.  Ouch, however, now I see this still fails on 32-bit.
+    Guess I'm going to revert an earlier change.
+
+ src/hb-open-type.hh | 21 ++++++++++++++++-----
+ 1 file changed, 16 insertions(+), 5 deletions(-)
+
+commit 6910ff03e66f5f4c9eb5592262d414ef7d91df04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 16:11:02 2018 -0800
+
+    [aat] Fix mort shaping
+
+    Ouch!
+
+ src/hb-aat-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fdb29ab2b0058c9813f9fc44c83dd9048db92d16
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 15:38:11 2018 -0800
+
+    2.1.2
+
+ NEWS             | 13 ++++++++++++-
+ configure.ac     |  2 +-
+ src/hb-version.h |  4 ++--
+ 3 files changed, 15 insertions(+), 4 deletions(-)
+
+commit cff4c6087fdb667a40f54f20ca3c49251bf076de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 15:04:41 2018 -0800
+
+    Fix vertical fallback space sign
+
+    Ouch!
+
+    Follow-up to cf203af8a33591c163b63dbdf0fd341bc4606190
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1343
+
+ src/hb-ot-shape-fallback.cc                   |  8 ++++----
+ test/shaping/data/in-house/tests/spaces.tests | 22 +++++++++++-----------
+ 2 files changed, 15 insertions(+), 15 deletions(-)
+
+commit 7a97f7074052a5d746af29f0743abd20682b09a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 14:46:40 2018 -0800
+
+    Don't apply GPOS if applying morx
+
+    That's what Apple does, and it wouldn't degrade our OpenType
+    performance.
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1348
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit eafd515639497098436ecf4c7b836e231bced323
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 14:45:56 2018 -0800
+
+    Prefer morx table if GSUB is empty (no scripts)
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1348
+
+ src/hb-ot-shape.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit aa06574823e27c4dbb378d2467a3e6f6f36af9fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 14:31:05 2018 -0800
+
+    Minor
+
+ src/hb-aat-layout-trak-table.hh | 2 +-
+ src/hb-ot-layout-gdef-table.hh  | 2 +-
+ src/hb-ot-layout-gsubgpos.hh    | 2 +-
+ src/hb-ot-math-table.hh         | 2 +-
+ src/hb-ot-var-fvar-table.hh     | 2 +-
+ 5 files changed, 5 insertions(+), 5 deletions(-)
+
+commit b6903bd6c4b0c792c821e37a8e223088ae40e5fa
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 16 13:46:58 2018 -0800
+
+    ensure fdmap initialized as identity for single-FD (non-CID) fonts
+
+ src/hb-subset-cff1.cc | 13 ++++++++++---
+ src/hb-subset-cff2.cc |  2 ++
+ 2 files changed, 12 insertions(+), 3 deletions(-)
+
+commit b403be8ad98ffd2dbe95dad73e96c7ed1295d9fc
+Merge: b67a7c73 50d1a41c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 16 12:29:18 2018 -0800
+
+    Merge branch 'master' into cff-subset
+
+commit b67a7c731f041323c19ab245f0285c304d9ae3d2
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 16 12:28:24 2018 -0800
+
+    drop dotsection as hint along with test case
+
+ src/hb-subset-cff-common.hh             |   4 ++++
+ src/hb-subset-cff1.cc                   |   1 +
+ test/api/fonts/cff1_dotsect.nohints.otf | Bin 0 -> 3132 bytes
+ test/api/fonts/cff1_dotsect.otf         | Bin 0 -> 3220 bytes
+ test/api/test-subset-cff1.c             |  21 +++++++++++++++++++++
+ 5 files changed, 26 insertions(+)
+
+commit 50d1a41c08ad3508a94240b52df03c383ae8f1f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 08:52:57 2018 -0500
+
+    [coretext] Hopefully the last one
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0aab861f9cda6fba5ce71562d9f087d924e8a161
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 08:43:25 2018 -0500
+
+    [coretext] Another round
+
+ src/hb-coretext.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 0809b76a9a1d7bd53818df7e83a9c81e664dfe0e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 08:29:47 2018 -0500
+
+    [coretext] One more try..
+
+ src/hb-coretext.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 78bd4475946f2d255539306e4b1115f408c54b54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 04:10:53 2018 -0500
+
+    [coretext] One more try
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fd27a23c824bbbd4f4c7e75701cc5d287289704b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 03:57:12 2018 -0500
+
+    [coretext] Another build fix attemt
+
+ src/hb-coretext.cc | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 729aedf0da90cbf11235a35588cfdc06ba87a784
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 03:26:46 2018 -0500
+
+    [directwrite] Fix build
+
+ src/hb-directwrite.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit cfb9771a3b096006cbae98438f1ba101d222e0e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 03:24:22 2018 -0500
+
+    [coretext] Try to fix
+
+ src/hb-coretext.cc  | 48 ++++++++++++++++++++++++++++++++++++++----------
+ src/hb-machinery.hh | 15 +++++----------
+ src/hb-shaper.hh    | 44 --------------------------------------------
+ 3 files changed, 43 insertions(+), 64 deletions(-)
+
+commit e3e9547365417e547beec84494c8bf6e4e2947fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 02:55:29 2018 -0500
+
+    [coretext] Unbreak build
+
+ src/hb-coretext.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ce5da0f36a2ece29c387810a060531df15ad6c7b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 02:29:13 2018 -0500
+
+    [shaper] Rewrite shaper data code to be more template-driven than
+    macro-driven
+
+ src/hb-coretext.cc       |  17 +++----
+ src/hb-directwrite.cc    |   9 +---
+ src/hb-face.cc           |  12 +----
+ src/hb-face.hh           |  13 ++----
+ src/hb-fallback-shape.cc |   5 --
+ src/hb-font.cc           |  14 ++----
+ src/hb-font.hh           |  12 ++---
+ src/hb-graphite2.cc      |  11 ++---
+ src/hb-machinery.hh      |  14 ++----
+ src/hb-ot-shape.cc       |   5 --
+ src/hb-shape-plan.cc     |   4 +-
+ src/hb-shaper-impl.hh    |   9 +---
+ src/hb-shaper.hh         | 117
+ ++++++++++++++++++++++++++++++++---------------
+ src/hb-uniscribe.cc      |  32 +++++--------
+ 14 files changed, 127 insertions(+), 147 deletions(-)
+
+commit cb4bf85b14afb3761a85e3da130f2844ac94a49d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 02:02:24 2018 -0500
+
+    [hdmx] Fix bounds checking
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11351
+
+ src/hb-ot-hdmx-table.hh | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+commit af727b4e629f8b07d7afb809be69d053827f6a51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 01:55:39 2018 -0500
+
+    [hdmx] Minor
+
+ src/hb-ot-hdmx-table.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 9e9f16c92debecb4caf533fa112898dfec116d98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 01:48:26 2018 -0500
+
+    [subset] Remove invalid glyphs from glypset to retain
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/1388
+
+ src/hb-subset-plan.cc | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit 072c7aba92d3c92c84454a12578264f12439bb0d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 15 15:41:46 2018 -0800
+
+    use 2-byte offset instead of 4-byte for local subrs
+
+    more than enough since local subrs immediately follow its
+    corresponding private dict, as the result 2-byte redunction for each
+    font dict with local subrs
+    updated api test expected subset fonts accordingly
+
+ src/hb-subset-cff-common.hh                           |   4 ++--
+ test/api/fonts/AdobeVFPrototype.abc.otf               | Bin 7460 ->
+ 7456 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nohints.otf        | Bin 6780 ->
+ 6780 bytes
+ test/api/fonts/AdobeVFPrototype.ac.otf                | Bin 6996 ->
+ 6996 bytes
+ .../fonts/SourceHanSans-Regular.41,4C2E.nohints.otf   | Bin 2380 ->
+ 2376 bytes
+ test/api/fonts/SourceHanSans-Regular.41,4C2E.otf      | Bin 2576 ->
+ 2572 bytes
+ test/api/fonts/SourceSansPro-Regular.abc.otf          | Bin 1812 ->
+ 1808 bytes
+ test/api/fonts/SourceSansPro-Regular.ac.nohints.otf   | Bin 1592 ->
+ 1592 bytes
+ test/api/fonts/SourceSansPro-Regular.ac.otf           | Bin 1708 ->
+ 1704 bytes
+ test/api/fonts/cff1_seac.C0.otf                       | Bin 1604 ->
+ 1600 bytes
+ 10 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 9d0231cfe7c404da3b5bc360ad76180a7aded62c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 15 15:39:43 2018 -0800
+
+    fixed a subset bug when no font dicts reduce
+
+ src/hb-ot-cff-common.hh     | 11 +++++++++++
+ src/hb-subset-cff-common.cc | 24 +++++++++++++-----------
+ src/hb-subset-cff1.cc       | 27 ++++++---------------------
+ src/hb-subset-cff2.cc       | 25 +++++--------------------
+ 4 files changed, 35 insertions(+), 52 deletions(-)
+
+commit 11aa0468ac2c62ff734ba6b0f6eb43d1bd6f602b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 15 23:10:56 2018 +0330
+
+    [subset] minor, adjust spaces
+
+ src/hb-open-type.hh            |  70 ++++++------
+ src/hb-ot-cmap-table.hh        | 182 +++++++++++++++----------------
+ src/hb-ot-glyf-table.hh        | 242
+ ++++++++++++++++++++---------------------
+ src/hb-ot-hdmx-table.hh        |  20 ++--
+ src/hb-ot-hmtx-table.hh        |  14 +--
+ src/hb-ot-layout-common.hh     |  77 ++++++-------
+ src/hb-ot-layout-gpos-table.hh |  16 +--
+ src/hb-ot-layout-gsub-table.hh |   4 +-
+ src/hb-ot-layout-gsubgpos.hh   |  88 +++++++--------
+ src/hb-ot-os2-table.hh         |  24 ++--
+ src/hb-ot-post-table.hh        |  26 ++---
+ src/hb-subset-glyf.cc          | 182 +++++++++++++++----------------
+ src/hb-subset-glyf.hh          |   6 +-
+ src/hb-subset-input.cc         |   4 +-
+ src/hb-subset-plan.cc          |  32 +++---
+ src/hb-subset-plan.hh          |  12 +-
+ src/hb-subset.cc               |  46 ++++----
+ src/hb-subset.h                |   7 +-
+ util/hb-subset.cc              |   2 +-
+ 19 files changed, 510 insertions(+), 544 deletions(-)
+
+commit d7c50ff0d65192fd2b7b80704e227fa108c06de3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 15 23:10:49 2018 +0330
+
+    [math] minor, adjust spaces
+
+ src/hb-ot-math-table.hh | 28 ++++++++++++++--------------
+ 1 file changed, 14 insertions(+), 14 deletions(-)
+
+commit 13735570f051c4131cdc481939799d76c38c758b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 15 12:10:23 2018 -0800
+
+    reject nested seac
+
+ src/hb-cff1-interp-cs.hh |  4 ++++
+ src/hb-ot-cff1-table.cc  | 11 ++++++-----
+ 2 files changed, 10 insertions(+), 5 deletions(-)
+
+commit c37aecd41c5b55e5ef496f3c4cc255a1e2ce7f9f
+Merge: ecdb77f0 cabe433f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 15 11:03:46 2018 -0800
+
+    Merge branch 'master' into cff-subset
+
+commit ecdb77f0ae1ef9b129cf9195dbdaa9f6c4425ed5
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 15 10:54:15 2018 -0800
+
+    fixed CFF1 subset of std encoding & non-std charset combo
+
+ src/hb-ot-cff-common.hh | 2 --
+ src/hb-ot-cff1-table.hh | 2 ++
+ src/hb-subset-cff1.cc   | 5 +++--
+ 3 files changed, 5 insertions(+), 4 deletions(-)
+
+commit cabe433fbb81d314ad9e3cbed768dd13983a4477
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 02:48:50 2018 -0500
+
+    [base] Add TODO items
+
+ src/hb-ot-layout-base-table.hh | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 3bf1ce748fa89316dd32de28bfdc636495e657fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 21:08:54 2018 -0500
+
+    [shaper] Rename
+
+ src/hb-shape-plan.cc |  2 +-
+ src/hb-shape.cc      |  2 +-
+ src/hb-shaper.cc     | 16 ++++++++--------
+ src/hb-shaper.hh     |  4 ++--
+ 4 files changed, 12 insertions(+), 12 deletions(-)
+
+commit c221dc0ba70fd4af94d8f735a9cef1ab92cc6ede
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 14:49:34 2018 -0500
+
+    [ot-shape] Move code around
+
+ src/hb-aat-layout-common.hh |  4 ++--
+ src/hb-aat-layout.cc        |  8 ++++----
+ src/hb-aat-layout.hh        |  6 +++---
+ src/hb-ot-layout.cc         |  2 +-
+ src/hb-ot-layout.hh         |  2 +-
+ src/hb-ot-shape.cc          | 44
+ +++++++++++++++++++++++++++++---------------
+ src/hb-ot-shape.hh          |  6 +++---
+ 7 files changed, 43 insertions(+), 29 deletions(-)
+
+commit 892ab37e7c9580e35b35a4d82a99e2ea73ac7b0b
+Merge: 3787c078 7867c2ba
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Nov 14 13:54:07 2018 -0800
+
+    Merge branch 'master' into cff-subset
+
+commit 3787c078561f1157bd04644f092c4467f63c717c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Nov 14 13:38:03 2018 -0800
+
+    Implemented seac for extents & subset along with API tests
+
+ gtk-doc.make                    | 321
+ +++++++++++++++++++++++++++++++++++++++-
+ src/hb-cff-interp-common.hh     |   2 +-
+ src/hb-cff-interp-cs-common.hh  |   7 +
+ src/hb-cff1-interp-cs.hh        |  29 +++-
+ src/hb-ot-cff1-table.cc         | 256 +++++++++++++++++++++++++-------
+ src/hb-ot-cff1-table.hh         |  88 ++++++++---
+ src/hb-subset-plan.cc           |  19 +++
+ test/api/fonts/cff1_seac.C0.otf | Bin 0 -> 1604 bytes
+ test/api/fonts/cff1_seac.otf    | Bin 0 -> 2260 bytes
+ test/api/test-ot-extents-cff.c  |  31 ++++
+ test/api/test-subset-cff1.c     |  19 +++
+ 11 files changed, 699 insertions(+), 73 deletions(-)
+
+commit 7867c2bad05fe48f9e4a1b776fb7da67b747fb4e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Nov 14 22:13:50 2018 +0330
+
+    [STAT] Add table parsing (#1384)
+
+ src/Makefile.sources    |   1 +
+ src/hb-ot-face.hh       |   2 +
+ src/hb-ot-font.cc       |   4 +-
+ src/hb-ot-hmtx-table.hh |  11 +-
+ src/hb-ot-stat-table.hh | 280
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 290 insertions(+), 8 deletions(-)
+
+commit 48d16c2ab2b181c733accd4fd9730963e59b6323
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 09:56:30 2018 -0500
+
+    [hmtx] Fix signedness issue
+
+    Fixes
+    https://github.com/harfbuzz/harfbuzz/issues/1248#issuecomment-438689499
+
+ src/hb-ot-hmtx-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 29db2a44a6b7a28ade5e288779dbf5a200b43acd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Nov 14 12:13:16 2018 +0330
+
+    [ot-color/svg] Note that it can be gzipped
+
+ src/hb-ot-color.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a9c27d576ffe4452d1a3dae73964a8f4d6dcc088
+Merge: 3c3eb5ea e543e1a0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Nov 14 08:29:17 2018 +0330
+
+    Merge pull request #1383 from punchcutter/master
+
+    Add test for https://github.com/harfbuzz/harfbuzz/issues/1379
+
+commit e543e1a0858bb5d7384d82600a789d40b62d9821
+Author: punchcutter <zarijoscha@gmail.com>
+Date:   Tue Nov 13 20:44:27 2018 -0800
+
+    Add Grantha test
+
+ .../fonts/dcf774ca21062e7439f98658b18974ea8b956d0c.ttf   | Bin 0 ->
+ 2568 bytes
+ test/shaping/data/in-house/tests/use.tests               |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit 3c3eb5ea9ccf34d33e94f83b9961b3a5e903d196
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 21:10:10 2018 -0500
+
+    [aat] Disable fallback mark advance zeroing and positioning if
+    morx applied
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1357
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit dc4225ccd1d16a1139cbc6092353db9ed03e8980
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 20:48:46 2018 -0500
+
+    Don't retry creating again and again in lazy_loader if create failed
+
+    Still does that if get_null() returns nullptr.  Our shaper data
+    objects
+    are like that.  Shrug.
+
+ src/hb-machinery.hh | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+commit 086235f59310ed77542d4916d31a4285c68630ff
+Merge: 2092f595 c565fc3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 19:50:25 2018 -0500
+
+    Merge pull request #1382 from punchcutter/master
+
+    Change USE Category for Grantha Virama
+
+commit 2092f595c7a4c591cace41cb99d31620fa6d5fa4
+Merge: 475be9d5 eee5b5ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 19:49:06 2018 -0500
+
+    Merge pull request #1380 from kbrow1i/cygwin
+
+    Don't use Win32 API on Cygwin
+
+commit c565fc3fb3b14c02e30af28b9d4d4289b0d2e162
+Author: punchcutter <zarijoscha@gmail.com>
+Date:   Tue Nov 13 12:51:10 2018 -0800
+
+    Change USE Category for Grantha Virama
+    https://github.com/harfbuzz/harfbuzz/issues/1379
+
+ src/gen-use-table.py                 | 3 ++-
+ src/hb-ot-shape-complex-use-table.cc | 2 +-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 475be9d5c672db6e1764d9425ed7fdaa0dff35c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 13:01:13 2018 -0500
+
+    Fix Windows build
+
+ src/hb-atomic.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit fc44dea341f1750fec801faed66656b8a58dcded
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 11:54:33 2018 -0500
+
+    Use atomic ints for upem and num_glyphs on face
+
+ src/hb-aat-layout-lcar-table.hh |  3 ++-
+ src/hb-face.cc                  | 10 +++++-----
+ src/hb-face.hh                  | 24 ++++++++++++++----------
+ src/hb-ot-color-sbix-table.hh   |  2 +-
+ src/hb-static.cc                | 13 +++++++++----
+ 5 files changed, 31 insertions(+), 21 deletions(-)
+
+commit 9579ed9755d7c3e47435c55881c9841a5f60ad7e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 11:45:12 2018 -0500
+
+    Make atomic types' internal values non-mutable
+
+    This resulted from confusion previously...
+
+ src/hb-atomic.hh | 10 +++++-----
+ src/hb-object.hh |  2 +-
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit c52d5bcd9405dbaa9289d720d9f0853aeac6b244
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 11:41:29 2018 -0500
+
+    [ot-face] Add 'head' table
+
+ src/hb-ot-face.hh       |  1 +
+ src/hb-ot-glyf-table.hh | 11 +++--------
+ src/hb-static.cc        |  5 +----
+ 3 files changed, 5 insertions(+), 12 deletions(-)
+
+commit eee5b5ed04f588f618a2251397dd5b850c378627
+Author: Ken Brown <kbrown@cornell.edu>
+Date:   Mon Nov 12 21:05:39 2018 -0500
+
+    Don't use Win32 API on Cygwin
+
+    Cygwin is a Posix platform to the extent possible.  It should use the
+    Posix API except in special circumstances.
+
+ src/hb-atomic.hh                           |  2 +-
+ src/hb-blob.cc                             | 10 +++++-----
+ src/hb-mutex.hh                            |  2 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh |  2 +-
+ src/hb.hh                                  |  2 +-
+ 5 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 56f541d0001f6d7e2e35cdd15217bdf52ebf8391
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 19:46:37 2018 -0500
+
+    [shape-plan] Remove unused code
+
+ src/hb-shape-plan.hh | 12 +-----------
+ 1 file changed, 1 insertion(+), 11 deletions(-)
+
+commit 6c22f3fd95617a8c3cd558858c6758a0d548d370
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 19:26:01 2018 -0500
+
+    [shape-plan] Implement fine-grained caching plans with user-features
+
+    Only tag, value, and global-ness of features are considered, not their
+    start/end offsets.
+
+ src/hb-shape-plan.cc | 69
+ ++++++++++++++++++++++++++++++----------------------
+ src/hb-shape-plan.hh | 17 ++-----------
+ 2 files changed, 42 insertions(+), 44 deletions(-)
+
+commit cc8428756a1b18b0445c2c5fbb38e05453693dad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 18:48:10 2018 -0500
+
+    [shape-plan] Cache shape plans with variations based on variation
+    indices
+
+ src/hb-aat-map.cc    |  4 +---
+ src/hb-aat-map.hh    |  4 +---
+ src/hb-ot-map.cc     | 18 +++++------------
+ src/hb-ot-map.hh     |  6 +++---
+ src/hb-ot-shape.cc   | 13 +++++--------
+ src/hb-ot-shape.hh   | 28 +++++++++++++++++++++++---
+ src/hb-shape-plan.cc | 55
+ ++++------------------------------------------------
+ src/hb-shape-plan.hh | 23 ++++++++++++++++++----
+ 8 files changed, 63 insertions(+), 88 deletions(-)
+
+commit 8284cb9fb3600268e06d8a2ba8400700510de7a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 18:18:20 2018 -0500
+
+    [shape-plan] Refactor more
+
+ src/hb-shape-plan.cc | 46 ++++++++++++++++++++++++++--------------------
+ 1 file changed, 26 insertions(+), 20 deletions(-)
+
+commit 1082338525c96206f43785e283e41b3e959871fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 18:05:02 2018 -0500
+
+    [shape-plan] Only use shape-plan key to initialize hb_ot_shape_plan_t
+
+    Such that we don't accidentally use info not in the cache key.
+
+ src/hb-ot-shape.cc   | 25 +++++++++++--------------
+ src/hb-ot-shape.hh   |  8 +++-----
+ src/hb-shape-plan.cc |  7 +------
+ 3 files changed, 15 insertions(+), 25 deletions(-)
+
+commit 7ac03f88a22325fb4d6b77ee7694ad11f6a99bcb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 17:50:30 2018 -0500
+
+    [shape-plan] Minor
+
+ src/hb-shape-plan.cc | 32 ++++++++++++++++----------------
+ 1 file changed, 16 insertions(+), 16 deletions(-)
+
+commit c7be933439af1bc8251b2b19df75b42bd0f3bdb5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 17:49:15 2018 -0500
+
+    [shape-plan] Refactor some more
+
+ src/hb-shape-plan.cc | 147
+ ++++++++++++++++++++++++++++-----------------------
+ src/hb-shape-plan.hh |  15 ++++++
+ 2 files changed, 95 insertions(+), 67 deletions(-)
+
+commit fc27777833e052dab91ca5777802e6c4e956deb4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 17:27:34 2018 -0500
+
+    [shape-plan] Refactor more
+
+ src/hb-shape-plan.cc | 44 +++++++++++++++++++++++---------------------
+ 1 file changed, 23 insertions(+), 21 deletions(-)
+
+commit 566612295b7c9bc003e9f1723f2491113724b788
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 17:19:45 2018 -0500
+
+    [shape-plan] Turn hb_shape_plan_proposal_t into hb_shape_plan_key_t
+
+    And include it in hb_shape_plan_t itself.
+
+ src/hb-shape-plan.cc | 206
+ +++++++++++++++++++--------------------------------
+ src/hb-shape-plan.hh |  27 +++----
+ 2 files changed, 92 insertions(+), 141 deletions(-)
+
+commit af123bd1b814b4fb881ea3d11f1ef0bcced75942
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 16:27:08 2018 -0500
+
+    Add hb_memcmp()
+
+ src/hb-dsalgs.hh | 17 ++++++++++++-----
+ src/hb-set.hh    |  2 +-
+ 2 files changed, 13 insertions(+), 6 deletions(-)
+
+commit 65456bff37ef61094c35574a35c96f6437fd6015
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 16:15:26 2018 -0500
+
+    [shape-plan] Minor
+
+ src/hb-shape-plan.cc | 15 ++++++++-------
+ src/hb-shape-plan.hh |  9 +++++----
+ 2 files changed, 13 insertions(+), 11 deletions(-)
+
+commit 1db672a5e903de39f955e70b8814c275ccbe1b5c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 16:05:09 2018 -0500
+
+    [shaper] Rename
+
+ src/hb-shape-plan.cc |  2 +-
+ src/hb-shape.cc      |  2 +-
+ src/hb-shaper.cc     | 16 ++++++++--------
+ src/hb-shaper.hh     |  4 ++--
+ 4 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 5212cd8af2171b9d0e9b78196e7758c37f148b80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 14:25:18 2018 -0500
+
+    [fuzzing] Add new test
+
+ ...zz-testcase-minimized-hb-shape-fuzzer-5754863779053568 | Bin 0 ->
+ 100 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 274f4c726f461f49f54a79557d63bf95d22903cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 14:24:36 2018 -0500
+
+    Rename check_array2() to check_array()
+
+ src/hb-aat-layout-kerx-table.hh | 2 +-
+ src/hb-machinery.hh             | 8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit e014405a214bceff3a1ce80f0b98273c44078e82
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 14:23:31 2018 -0500
+
+    Rename check_array(array, a, b) to check_range()
+
+ src/hb-aat-layout-common.hh    |  8 ++++++--
+ src/hb-machinery.hh            | 31 +++++++++++++++++++++++--------
+ src/hb-open-type.hh            |  4 +++-
+ src/hb-ot-layout-common.hh     |  5 +++--
+ src/hb-ot-layout-gpos-table.hh | 11 ++++++++---
+ src/hb-ot-var-hvar-table.hh    |  4 +++-
+ src/hb-ot-var-mvar-table.hh    |  4 +++-
+ 7 files changed, 49 insertions(+), 18 deletions(-)
+
+commit c8f4cc49272d8bcd47706a6306a625d724349f5a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 14:11:29 2018 -0500
+
+    [kerx] Fix integer overflow in multiply
+
+    Fixes https://oss-fuzz.com/v2/testcase-detail/5754863779053568
+
+ src/hb-aat-layout-kerx-table.hh |  2 +-
+ src/hb-machinery.hh             | 29 ++++++++++++++++-------------
+ 2 files changed, 17 insertions(+), 14 deletions(-)
+
+commit 1300f027a938d8898cdc9abbcad71afadf70e6e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 13:56:48 2018 -0500
+
+    [kerx] Minor tweak on previous commit
+
+ src/hb-aat-layout-kerx-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit d6666b3866037c9d3e8a497958af9ba8d2f47a73
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 13:21:14 2018 -0500
+
+    [fuzzing] Remove limited-edition build of libraries
+
+    Use normal, production, shared libraries.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1237
+
+ src/Makefile.am          | 31 -------------------------------
+ test/fuzzing/Makefile.am | 39 +++++++++++++--------------------------
+ 2 files changed, 13 insertions(+), 57 deletions(-)
+
+commit a549aa14a0b60436a16f7f8924a5b5f82b4d5b7e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 13:01:22 2018 -0500
+
+    [kerx] Protect against stack underflow
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11367
+
+ src/hb-aat-layout-kerx-table.hh                            |   2 +-
+ ...uzz-testcase-minimized-hb-shape-fuzzer-5691469793329152 | Bin 0 ->
+ 69 bytes
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 41a8bc7fd9399def8f580b02627a77f3972cc0e9
+Merge: 0dfa584c 77bd0a64
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Nov 12 08:49:00 2018 -0800
+
+    Merge branch 'master' into cff-subset
+
+commit 0dfa584cb4af6be2852d038e9bd591f67ea9fc6e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Nov 12 08:47:07 2018 -0800
+
+    changed Adobe company name
+
+ src/hb-cff-interp-common.hh      | 2 +-
+ src/hb-cff-interp-cs-common.hh   | 2 +-
+ src/hb-cff-interp-dict-common.hh | 2 +-
+ src/hb-cff1-interp-cs.hh         | 2 +-
+ src/hb-cff2-interp-cs.hh         | 2 +-
+ src/hb-ot-cff-common.hh          | 2 +-
+ src/hb-ot-cff1-table.cc          | 2 +-
+ src/hb-ot-cff1-table.hh          | 2 +-
+ src/hb-ot-cff2-table.cc          | 2 +-
+ src/hb-ot-cff2-table.hh          | 2 +-
+ src/hb-ot-vorg-table.hh          | 2 +-
+ src/hb-subset-cff-common.cc      | 2 +-
+ src/hb-subset-cff-common.hh      | 2 +-
+ src/hb-subset-cff1.cc            | 2 +-
+ src/hb-subset-cff1.hh            | 2 +-
+ src/hb-subset-cff2.cc            | 2 +-
+ src/hb-subset-cff2.hh            | 2 +-
+ test/api/test-ot-extents-cff.c   | 2 +-
+ test/api/test-subset-cff1.c      | 2 +-
+ test/api/test-subset-cff2.c      | 2 +-
+ 20 files changed, 20 insertions(+), 20 deletions(-)
+
+commit 3e284e02c2a5da758526360a45364a330b8ab8e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 22:51:34 2018 -0500
+
+    [shape-plan] Minor
+
+ src/hb-ot-shape.cc   | 26 ++++++++++++++------------
+ src/hb-ot-shape.hh   | 15 ++++++++-------
+ src/hb-shape-plan.cc |  3 ++-
+ 3 files changed, 24 insertions(+), 20 deletions(-)
+
+commit 420c9de6447cdb491184e7f8caf0811b0c962c05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 22:38:05 2018 -0500
+
+    [shape-plan] Minor rename
+
+ src/hb-shape-plan.cc | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 77bd0a6458a9169df59f6be667a8eb79bd353dc9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 22:08:48 2018 -0500
+
+    Add variation coords to shape_plan proposal
+
+    This is the root cause of bug worked around in
+    19e77e01bc13f44138e1d50533327d314dd0a018.
+
+    Still no shape plan caching for variations though.
+
+ src/hb-shape-plan.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 9c767d075d0be85227b8dc146061de9bd24f3fec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 22:03:15 2018 -0500
+
+    Minor
+
+ src/hb-shape-plan.cc | 31 +++++++++++++------------------
+ 1 file changed, 13 insertions(+), 18 deletions(-)
+
+commit f521a28b4aad1566664cf14d70a911728ee0b962
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 21:32:01 2018 -0500
+
+    Embed hb_ot_shape_plan_t into hb_shape_plan_t
+
+    No other shaper will need shape_plan_data, by definition.  So, remove
+    abstraction layer and always create hb_ot_shape_plan_t as part of
+    hb_shape_plan_t.
+
+ src/hb-coretext.cc       | 45 ----------------------
+ src/hb-directwrite.cc    | 21 ----------
+ src/hb-fallback-shape.cc | 22 -----------
+ src/hb-graphite2.cc      | 22 -----------
+ src/hb-ot-shape.cc       | 99
+ ++++++++++++++++++++++--------------------------
+ src/hb-ot-shape.hh       | 21 +++++-----
+ src/hb-shape-plan.cc     | 22 ++++++-----
+ src/hb-shape-plan.hh     |  3 +-
+ src/hb-uniscribe.cc      | 22 -----------
+ 9 files changed, 70 insertions(+), 207 deletions(-)
+
+commit fabb01210433ce1c6d5f630bc270f82a8a4a4014
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 17:10:23 2018 -0500
+
+    Remove wrong comment
+
+ src/hb-shape-plan.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 1fd183ee1c40e2eedf86b5e82d1b547c5650ebf5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 16:47:52 2018 -0500
+
+    Finish off eecccc919ce15f60ae7ef9da5cfb311b4aa05c63
+
+ src/hb-machinery.hh | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit 1beacdded9cd1e4467b52244cdfd8497516eb107
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 16:35:28 2018 -0500
+
+    Minor
+
+ src/hb-coretext.cc       | 8 ++++----
+ src/hb-directwrite.cc    | 4 ++--
+ src/hb-fallback-shape.cc | 4 ++--
+ src/hb-graphite2.cc      | 4 ++--
+ src/hb-ot-shape.cc       | 4 ++--
+ src/hb-shaper.hh         | 3 ++-
+ src/hb-uniscribe.cc      | 4 ++--
+ 7 files changed, 16 insertions(+), 15 deletions(-)
+
+commit e88d47b7f2f9aee5b0b3cdc0b8f708884175a71f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 16:25:43 2018 -0500
+
+    Minor
+
+ src/hb-face.cc | 2 +-
+ src/hb-face.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 55c66c7c56c1ecd493f51fe66fd434b28addfb41
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 16:09:38 2018 -0500
+
+    Revert "Declare Null() constexpr"
+
+    This reverts commit 442a72d95ab1fb3a47b486d8d1eb68e909d0ffb8.
+
+    Doesn't make sense.  No idea how my local compilers where happy
+    with it!
+
+ src/hb-null.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 98c6f03ccdd0630282ea0b166f66dcfb2a9c1f51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 15:54:20 2018 -0500
+
+    Minor
+
+ src/hb-face.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 442a72d95ab1fb3a47b486d8d1eb68e909d0ffb8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 15:51:23 2018 -0500
+
+    Declare Null() constexpr
+
+ src/hb-null.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit eecccc919ce15f60ae7ef9da5cfb311b4aa05c63
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 15:48:47 2018 -0500
+
+    Don't store to null object
+
+    Ouch :).
+
+ src/hb-machinery.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 903856ab505cbc6b756d7b904650df72e90f67a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 15:45:58 2018 -0500
+
+    Remove unused function
+
+ src/hb-machinery.hh | 5 -----
+ 1 file changed, 5 deletions(-)
+
+commit 0e0af11c62c6a55248a5d3c8868da91ef36384c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 12:54:16 2018 -0500
+
+    [hdmx] Renames
+
+ src/hb-ot-hdmx-table.hh | 46
+ +++++++++++++++++++++++-----------------------
+ 1 file changed, 23 insertions(+), 23 deletions(-)
+
+commit da6aa3b0333de3f2169a5cfcb33374e1b2fe346e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 11:40:57 2018 -0500
+
+    Add hb_blob_ptr_t.destroy()
+
+ src/hb-blob.hh                 | 1 +
+ src/hb-ot-cmap-table.hh        | 2 +-
+ src/hb-ot-color-cbdt-table.hh  | 4 ++--
+ src/hb-ot-color-sbix-table.hh  | 2 +-
+ src/hb-ot-color-svg-table.hh   | 2 +-
+ src/hb-ot-glyf-table.hh        | 4 ++--
+ src/hb-ot-hmtx-table.hh        | 6 +++---
+ src/hb-ot-layout-gdef-table.hh | 2 +-
+ src/hb-ot-layout-gsubgpos.hh   | 2 +-
+ src/hb-ot-name-table.hh        | 2 +-
+ src/hb-ot-post-table.hh        | 2 +-
+ 11 files changed, 15 insertions(+), 14 deletions(-)
+
+commit bb9abb4efd7d72198ffe8abb137ccf07ae17743e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 00:39:52 2018 -0500
+
+    [hmtx/port] Use hb_blob_ptr_t
+
+ src/hb-ot-hmtx-table.hh | 24 ++++++++++--------------
+ src/hb-ot-post-table.hh | 11 +++++------
+ 2 files changed, 15 insertions(+), 20 deletions(-)
+
+commit 0e2680a6e8d16afd38ffdb6e8cf244150a5e3837
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 00:28:47 2018 -0500
+
+    [cmap] Port to hb_blob_ptr_t
+
+    Although didn't need it...
+
+ src/hb-ot-cmap-table.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 0b0fad3ea8888d57d1e077077f5897d1901c5371
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 00:26:55 2018 -0500
+
+    [color] Port to hb_blob_ptr_t
+
+    Fix hb_blob_ptr_t::get_length () as well.
+
+ src/hb-blob.hh                |  2 +-
+ src/hb-ot-color-cbdt-table.hh | 38 +++++++++++++-------------------------
+ src/hb-ot-color-sbix-table.hh | 10 ++++------
+ src/hb-ot-color-svg-table.hh  | 11 +++++------
+ src/hb-ot-glyf-table.hh       | 22 ++++++++--------------
+ 5 files changed, 31 insertions(+), 52 deletions(-)
+
+commit 925b7a214f06b83b6f2278052656dabc4ebdd6b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 00:17:30 2018 -0500
+
+    Comment
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dcb63868333ba8e229fd8756377151440dd9fd23
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 00:16:17 2018 -0500
+
+    [shape-plan] Remove use of custom null object
+
+ src/hb-shape-plan.cc | 24 ------------------------
+ src/hb-shape-plan.hh |  1 -
+ 2 files changed, 25 deletions(-)
+
+commit 109891d49876de4de14a91adefbdf681c2b9acc2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 00:15:08 2018 -0500
+
+    [shape-plan] Make null object all zeros
+
+    To remove custom null object next..
+
+ src/hb-shape-plan.cc | 8 ++++----
+ src/hb-shape-plan.hh | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 34185ff3bc7ece5620145fc05da07c79da950f34
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 00:12:30 2018 -0500
+
+    [blob] Use default null object
+
+ src/hb-blob.cc | 12 ------------
+ src/hb-blob.hh |  1 -
+ 2 files changed, 13 deletions(-)
+
+commit 2ee1d9f555fba60342bab63294a6dacca10466de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 11 00:11:28 2018 -0500
+
+    [blob] Change null object memory mode to DUPLICATE
+
+    We never rely on that being equal to readonly.  Just not being
+    writable.  Maybe not even that given that the object is inert.
+
+    In prep for next commit, using default null pool.
+
+ src/hb-blob.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5d0078a48b246e713817e5bb6b4efada9618bea3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 23:52:15 2018 -0500
+
+    Add hb_blob_ptr_t
+
+    Use in a couple of places.  Push to bots to see how many unhappy
+    before
+    I convert the rest.
+
+ src/hb-blob.hh                 | 23 +++++++++++++++++++++++
+ src/hb-ot-layout-gdef-table.hh |  5 ++---
+ src/hb-ot-layout-gsubgpos.hh   |  8 +++-----
+ src/hb-ot-layout.cc            | 14 ++++++--------
+ src/hb-ot-name-table.hh        | 12 +++++-------
+ 5 files changed, 39 insertions(+), 23 deletions(-)
+
+commit e44046ec499949884b9b77c4c9937ad381386850
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 22:41:35 2018 -0500
+
+    Minor
+
+ src/hb-ot-layout.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 752bd8a192af209f44dacaf1d3510d0bfc6354b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 21:13:13 2018 -0500
+
+    [kerx] Fix Format1 tupleKern sanitization
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11312
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11305
+
+ src/hb-aat-layout-kerx-table.hh                            |   6 +++---
+ ...uzz-testcase-minimized-hb-shape-fuzzer-5629524117553152 | Bin 0 ->
+ 93 bytes
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit f9e0552debc45afedd86c848484bcd169af62dc2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 21:01:49 2018 -0500
+
+    [fuzzing] Make "make lib" faster and more usable
+
+ src/Makefile.am          |  2 +-
+ test/fuzzing/Makefile.am | 12 +++++++-----
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+commit 4674655841bb810e7b68f03431d7b5a7c34c6f20
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 20:11:10 2018 -0500
+
+    Minor
+
+ src/hb-ot-shape-complex-arabic-fallback.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit a953b647507fe2ae8f5187fbfb04e69d2a2952e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 20:10:03 2018 -0500
+
+    Revert parts of previous commit that made clang unhappy
+
+ src/hb-machinery.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1d66cdcf770e45d995a318592352e4349faecb71
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 19:54:08 2018 -0500
+
+    Better fix for MSVC 2008
+
+    Follow up on b4c61130324455bfd42095b01fa14ac901e441f1
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1374
+
+ src/hb-machinery.hh            | 8 ++++----
+ src/hb-open-type.hh            | 8 ++++++++
+ src/hb-ot-cmap-table.hh        | 4 ++--
+ src/hb-ot-layout-gpos-table.hh | 4 ++--
+ src/hb-ot-var-avar-table.hh    | 9 ++++-----
+ 5 files changed, 20 insertions(+), 13 deletions(-)
+
+commit fb2a037f54f3cd323a447925f6534eccd1c709c1
+Merge: 87984165 b4c61130
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Nov 10 16:23:11 2018 -0800
+
+    Merge branch 'master' into cff-subset
+
+commit b4c61130324455bfd42095b01fa14ac901e441f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 16:35:39 2018 -0500
+
+    Try fixing MSVC 2008 build
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1374
+
+ src/hb-open-type.hh | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+commit f2e942f3023e3c5cb3e732ee7b4782b3df170a85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 16:11:14 2018 -0500
+
+    Fix hb_bytes_t's unused template array constructor
+
+ src/hb-dsalgs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6213a75b68825037fbaf6f5ad4eef66e8bad4b3c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 16:09:21 2018 -0500
+
+    Add trivial casts to hb_bytes_t
+
+ src/hb-dsalgs.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 8bb97d2ce140b7fe81d0726c32e024d887e0be1c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 15:54:33 2018 -0500
+
+    Revert back hb_bytes_t.cmp() to the scheme it was
+
+    But fix UBSan complaint.
+
+    There's nothing in hb_bytes_t that guarantees lexical ordering, and
+    ordering by length first is much faster.
+
+ src/hb-dsalgs.hh | 13 ++++++-------
+ 1 file changed, 6 insertions(+), 7 deletions(-)
+
+commit 534e1d7694c96f61e853daef481b41274d5d16d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 15:43:16 2018 -0500
+
+    Fix hb_bytes_t.cmp() for realz this time
+
+ src/hb-dsalgs.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 929f07dbfc8b8c40771d27a502f6e5842c1c1e90
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 15:38:48 2018 -0500
+
+    Fix hb_bytes_t.cmp()
+
+    Ouch!
+
+ src/hb-dsalgs.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 5547bfa9f2815df727fa524b0ea0f136a6f955b7
+Merge: 3a9fa8c0 1d82b476
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 15:35:12 2018 -0500
+
+    Merge pull request #1376 from ebraminio/minor
+
+    [colr/feat/trak] minor
+
+commit 1d82b4761d0a2e2e0be002e8a6bfe060f7b6dec3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Nov 10 18:08:11 2018 +0330
+
+    [colr/feat/trak] minor
+
+ src/hb-aat-layout-feat-table.hh | 14 +++++++-------
+ src/hb-aat-layout-trak-table.hh | 35 +++++++++++++++++++----------------
+ src/hb-ot-color-colr-table.hh   | 18 ++++++------------
+ 3 files changed, 32 insertions(+), 35 deletions(-)
+
+commit 3a9fa8c026bf28bf87e20ec95327f74fd7070b74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 01:56:37 2018 -0500
+
+    [qsort] Fix O(N^2) behavior if all array elements are the same
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11327
+
+    Reported as https://github.com/noporpoise/sort_r/issues/7
+
+ src/hb-dsalgs.hh                                        |  15
+ +++++++++++----
+ ...-testcase-minimized-hb-shape-fuzzer-5634443633491968 | Bin 0 ->
+ 41814 bytes
+ 2 files changed, 11 insertions(+), 4 deletions(-)
+
+commit b308aaccf0773e252880b9b887f3d3d1dec00168
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 00:37:17 2018 -0500
+
+    [post] Minor
+
+ src/hb-ot-post-table.hh | 22 +++++++++-------------
+ 1 file changed, 9 insertions(+), 13 deletions(-)
+
+commit 4111c3b8cd1b1c44f722877614ec1ee25111e78c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 00:26:36 2018 -0500
+
+    [post] Move sanitize close to data fields
+
+ src/hb-ot-post-table.hh | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit e26e6dbb336e48a5898738dbbd9e56e3a00b7bed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 10 00:19:50 2018 -0500
+
+    [post] Remove unnecessary hb_nonnull_ptr_t<>
+
+ src/hb-ot-post-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6b8178c6499f8d0ee45a57332af778af0e48d1b5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Nov 10 02:42:08 2018 +0330
+
+    [glyf] minor
+
+ src/hb-ot-glyf-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 87984165877c90bf4e0a0418a6407e44c048335d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 9 08:59:18 2018 -0800
+
+    fixed vstem handling (lack thereof) in check_width
+
+    bug exposed by U+2261 equivalence in SourceCodePro-Regular.otf
+
+ src/hb-cff1-interp-cs.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 5f97fe9956274d9de4e7813d7f2e850d9ffd8224
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 9 10:01:50 2018 -0500
+
+    Fix a few MSVC 2008 warnings
+
+    https://github.com/harfbuzz/harfbuzz/issues/1374
+
+ src/hb-set.hh    | 4 ++--
+ src/hb-vector.hh | 3 +++
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit f51bb6ee7bd4ebca9b432851adc527ec086360fe
+Merge: 2d987110 b986fead
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 8 14:42:40 2018 -0500
+
+    Merge pull request #1358 from ebraminio/lcar
+
+    Hook AAT's lcar to _get_ligature_carets
+
+commit b986fead0aee52d219ce85dd49c9109bfaf31801
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Nov 5 12:31:58 2018 +0330
+
+    Hook AAT's lcar to _get_ligature_carets
+
+ src/Makefile.sources               |   1 +
+ src/hb-aat-layout-lcar-table.hh    |  92
+ +++++++++++++++++++++++++++++++++++++
+ src/hb-ot-face.hh                  |   1 +
+ src/hb-ot-layout-gdef-table.hh     |   6 +--
+ src/hb-ot-layout.cc                |  17 ++++---
+ test/api/Makefile.am               |   1 +
+ test/api/fonts/lcar.ttf            | Bin 0 -> 808 bytes
+ test/api/test-ot-ligature-carets.c |  67 +++++++++++++++++++++++++++
+ 8 files changed, 175 insertions(+), 10 deletions(-)
+
+commit 2d987110c067ccbf63b1399d2a87820121925e39
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 8 21:46:26 2018 +0330
+
+    [aat] Minor
+
+ src/hb-aat-layout-just-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9fae611740f514e5fc101a18c4551a20b4a47b59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 8 12:17:09 2018 -0500
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |  1 +
+ test/shaping/data/text-rendering-tests/Makefile.sources  |  2 +-
+ .../data/text-rendering-tests/tests/MORX-31.tests        | 16
+ ++++++++--------
+ 3 files changed, 10 insertions(+), 9 deletions(-)
+
+commit b989507fa6b36eb9950001d4e28f3946ffbe75f9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 8 20:48:54 2018 +0330
+
+    [aat] Minor (#1369)
+
+ src/hb-aat-layout-just-table.hh | 11 ++++++-----
+ src/hb-aat-layout-trak-table.hh | 12 ++++++------
+ 2 files changed, 12 insertions(+), 11 deletions(-)
+
+commit 26c291aaa023d31c793b6f505c76e0dd7acbff9b
+Merge: 417963dd f9042384
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 8 09:06:49 2018 -0800
+
+    Merge branch 'master' into cff-subset
+
+commit 417963dd9f93a316e672c77493e763978bfdbc28
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 8 09:01:20 2018 -0800
+
+    got rid of Remap::fullset() as incorrect, redundant, inefficient
+
+ src/hb-ot-cff-common.hh | 22 ----------------------
+ 1 file changed, 22 deletions(-)
+
+commit f90423847b07ff9c9f66be6dfa3b6071f9c7d9d3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 8 19:17:02 2018 +0330
+
+    [just] Initial table implementation (#1364)
+
+    A starting point, its sanitization is not tested however
+
+ src/Makefile.sources            |   1 +
+ src/hb-aat-layout-just-table.hh | 416
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.cc            |   1 +
+ 3 files changed, 418 insertions(+)
+
+commit b8b00fb3c60d23efca5720db15555c4a01c56a45
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 8 18:53:14 2018 +0330
+
+    [aat] Support Lookup<OffsetTo<>>, needed by just and lcar (#1368)
+
+ src/hb-aat-layout-common.hh | 57
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-open-type.hh         | 11 +++++++++
+ 2 files changed, 68 insertions(+)
+
+commit 073d0a9fbcf4f9cf44878f3f91afa27615b14e5c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 8 10:59:50 2018 +0330
+
+    [ci] minor
+
+ .circleci/config.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 15326826bf20f1f3d5ef3ddde2ad17b0ccbfa605
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 21:58:04 2018 -0500
+
+    [aat] Ignore cross-stream offset of deleted-glyphs
+
+    I think it makes sense to accumulate it, but Ned tells me that's
+    what CoreText does.
+
+ src/hb-aat-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 636a6833c57eb88ebaa92034c1f4722471f70781
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Nov 7 17:58:45 2018 -0800
+
+    fixed ends_in_hint bug
+
+    subr ends in hint itself should be regarded as hint
+    this flag should propagate to its caller if the call itself is at
+    the end of the caller
+
+ src/hb-subset-cff-common.hh | 15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+commit 0bf76154f1bb15aa2fc361eb725977313f103a58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 19:11:43 2018 -0500
+
+    [fuzzing] Take whatever text we can
+
+ test/fuzzing/hb-shape-fuzzer.cc | 24 +++++++++++++-----------
+ 1 file changed, 13 insertions(+), 11 deletions(-)
+
+commit 517a1bac97b6273e03562deefcca129648698c31
+Merge: 9d502769 b18a56a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 18:40:48 2018 -0500
+
+    Merge pull request #1362 from harfbuzz/cross-kern
+
+    Vastly improve kern/kerx tables, including cross-stream "kerning"
+
+commit b18a56a290bf5330e81019b33f15e6951dd86a8b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 18:13:22 2018 -0500
+
+    [kerx] Comment
+
+ src/hb-aat-layout-kerx-table.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 4d740206943ecb72e4be7cc4815e0a3aa3edaa9d
+Merge: e0c30b96 9d502769
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Nov 7 15:09:30 2018 -0800
+
+    Merge branch 'master' into cff-subset
+
+commit e0c30b961de87d38bff8dd49e86785a5b74fcad3
+Merge: 0996c0ff ae8fd0db
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Nov 7 15:08:55 2018 -0800
+
+    merge with cff-subset branch
+
+commit 006386be3a069199ebaf22bcc55fa7233c62e0d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 18:04:53 2018 -0500
+
+    [kern] Implement negative state numbers
+
+    Let the fuzzing bots rip this code apart...
+
+ src/hb-aat-layout-common.hh     | 90
+ ++++++++++++++++++++++++++++++-----------
+ src/hb-aat-layout-kerx-table.hh | 10 -----
+ 2 files changed, 66 insertions(+), 34 deletions(-)
+
+commit 0996c0ff6279f377e2b14f08663df2ce82de2b14
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Nov 7 14:48:37 2018 -0800
+
+    implented no-desubroutinize with CFF2 along with API test
+
+    replaced AdobeVFPrototype.abc.otf with a hinted (maually) &
+    subroutinized copy
+    replaced expected results as well
+
+ src/hb-cff-interp-dict-common.hh                   |   4 +-
+ src/hb-cff2-interp-cs.hh                           |  16 +-
+ src/hb-ot-cff-common.hh                            |  22 +--
+ src/hb-subset-cff-common.hh                        |  64 +++++---
+ src/hb-subset-cff2.cc                              | 180
+ ++++++++++++++++++---
+ test/api/fonts/AdobeVFPrototype.abc.nohints.otf    | Bin 7800 -> 0 bytes
+ test/api/fonts/AdobeVFPrototype.abc.otf            | Bin 7800 ->
+ 7460 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nohints.otf     | Bin 7152 ->
+ 6780 bytes
+ .../fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf  | Bin 0 -> 6844 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf     | Bin 0 -> 7060 bytes
+ test/api/fonts/AdobeVFPrototype.ac.otf             | Bin 7336 ->
+ 6996 bytes
+ test/api/test-subset-cff2.c                        |  51 +++++-
+ 12 files changed, 271 insertions(+), 66 deletions(-)
+
+commit 29c5302376ff2bc8f04b0fc0efba3ce40ef564a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 17:29:37 2018 -0500
+
+    [morx] Minor
+
+ src/hb-aat-layout-morx-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 385f78b3123f268e4c7ff423621e5ce9e8a5c54b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 17:19:21 2018 -0500
+
+    [aat] Remove deleted-glyhs after applying kerx/kern
+
+    Finally:  Fixes https://github.com/harfbuzz/harfbuzz/issues/1356
+
+    Test case:
+    $ ./hb-shape GeezaPro.ttc -u U+0628,U+064A,U+064E,U+0651,U+0629
+    [u0629.final.tehMarbuta=4+713|u064e_u0651.shaddaFatha=1@0,-200+0|u064a.medial.yeh=1+656|u0628.initial.beh=0+656]
+
+    The mark positioning (kern table CrossStream kerning) only works
+    if deleted
+    glyph (as result of ligation) is still in stream and pushed through
+    the
+    state machine.
+
+ src/hb-aat-layout-morx-table.hh |  16 -------
+ src/hb-aat-layout.cc            |  30 ++++++++++--
+ src/hb-aat-layout.hh            |  12 +++--
+ src/hb-ot-layout-gpos-table.hh  |   6 +--
+ src/hb-ot-layout.cc             |  60 +++++++++++++++++++++--
+ src/hb-ot-layout.hh             |  23 +++++----
+ src/hb-ot-shape.cc              | 102
+ ++++++++++++++--------------------------
+ 7 files changed, 142 insertions(+), 107 deletions(-)
+
+commit 1909072235e59eb80f9169300279b65779b932a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 16:42:16 2018 -0500
+
+    [aat] Add debug info to state machine
+
+ src/hb-aat-layout-common.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit ca23567f41a2d6389f6fd2483a994cf5aa6aeaf8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 16:19:51 2018 -0500
+
+    Disable fallback mark positioning if kern table has cross-stream
+    kerning
+
+    Happens even if the cross-stream kerning is for cursive attachment
+    only.  Oh well..
+
+ src/hb-ot-layout.cc |  6 ++++++
+ src/hb-ot-layout.hh |  3 +++
+ src/hb-ot-shape.cc  | 14 ++++++--------
+ src/hb-ot-shape.hh  |  2 +-
+ 4 files changed, 16 insertions(+), 9 deletions(-)
+
+commit 5cf6f94dfd30a468ab8464435e846811c39d9226
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 16:07:22 2018 -0500
+
+    Don't apply both kerx and kern
+
+    Ouch!
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 41cff7afc916048810a7ea4aa33ecdee7401df74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 16:05:36 2018 -0500
+
+    Minor
+
+ src/hb-ot-shape.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 9af983af24788afad4b37bd2297b86cdca7c5c29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 16:03:09 2018 -0500
+
+    [kern] Switch to dispatch
+
+ src/hb-aat-layout-kerx-table.hh |  7 +++++--
+ src/hb-ot-kern-table.hh         | 28 +++++++++++++++-------------
+ src/hb-ot-layout.cc             |  6 ++----
+ 3 files changed, 22 insertions(+), 19 deletions(-)
+
+commit bc06e2805ae55f5c152dfb70ee91c75830ad8f54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 16:02:40 2018 -0500
+
+    [kerx/kern] Add has_cross_stream()
+
+ src/hb-aat-layout-kerx-table.hh | 15 +++++++++++++++
+ src/hb-ot-kern-table.hh         |  9 +++++++++
+ 2 files changed, 24 insertions(+)
+
+commit ea579f9ccc87718d4c2ca8945a997e6679428a12
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 15:44:40 2018 -0500
+
+    [kerx] Fix peculiar indexing that was needed previously
+
+    Not needed now that we use GPOS attachment for cursive kerx.
+
+ src/hb-aat-layout-kerx-table.hh | 20 +++++++-------------
+ 1 file changed, 7 insertions(+), 13 deletions(-)
+
+commit 6ee6cd93d8c61389cf242e42a531cc6e7214b21a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 15:40:55 2018 -0500
+
+    [GPOS] Only mark unsafe-to-break if kerning happened
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1365
+
+ src/hb-ot-layout-gpos-table.hh | 56
+ ++++++++++++++++++++++++------------------
+ 1 file changed, 32 insertions(+), 24 deletions(-)
+
+commit 501a364d9bb6c5828f9d660bae8b6e93b158b275
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 15:02:16 2018 -0500
+
+    [GPOS] Add TODO item
+
+ src/hb-ot-layout-gpos-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 7a9629f2f11a11d1c064662a08a0172ac2001668
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 14:52:36 2018 -0500
+
+    [kerx] Implement CrossStream kerning for non-state-machine subtables
+
+    Untested.
+
+ src/hb-aat-layout-kerx-table.hh | 12 ++++++------
+ src/hb-kern.hh                  | 43
+ +++++++++++++++++++++++++++++------------
+ src/hb-ot-kern-table.hh         |  4 ++--
+ 3 files changed, 39 insertions(+), 20 deletions(-)
+
+commit 0eb4157011e78c332d781e28b54b020aa08957c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 14:42:15 2018 -0500
+
+    [kerx] Disable backwards-kerning for non-state-machine tables
+
+    That's what the spec says for Backwards flag, only applicable to
+    formats 1 and 4.
+
+ src/hb-aat-layout-kerx-table.hh | 8 +++-----
+ src/hb-ot-kern-table.hh         | 2 +-
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+commit b2f687c2569a3cc0b1cd0335c5ca0f8d193f8a39
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 14:38:29 2018 -0500
+
+    [kerx] Use GPOS attachment facilities for CrossStream kerning
+
+ src/hb-aat-layout-kerx-table.hh | 51
+ ++++++++++++++++++++++++++++-------------
+ 1 file changed, 35 insertions(+), 16 deletions(-)
+
+commit e10a856eb24ae45e301c3ffa778caa4c0a995bb9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 14:11:48 2018 -0500
+
+    [kerx] Format
+
+ src/hb-aat-layout-kerx-table.hh | 58
+ ++++++++++++++++++++---------------------
+ 1 file changed, 28 insertions(+), 30 deletions(-)
+
+commit 649cc3ef2773950b0b5884d9d1caf414aac888bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 14:04:04 2018 -0500
+
+    [kerx] Don't disable crossKerning if kern feature is off
+
+ src/hb-aat-layout-kerx-table.hh | 9 +++++----
+ src/hb-ot-shape.cc              | 2 +-
+ 2 files changed, 6 insertions(+), 5 deletions(-)
+
+commit 0c3b061ac244fa8a8657366e1b95523503fdf7be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 13:58:41 2018 -0500
+
+    [kern] Apply erlier, where GPOS/kerx are applied
+
+ src/hb-aat-layout-kerx-table.hh |  3 +--
+ src/hb-ot-shape-fallback.cc     |  9 +++++++++
+ src/hb-ot-shape.cc              | 12 +++++-------
+ 3 files changed, 15 insertions(+), 9 deletions(-)
+
+commit f4bad0086e40c70d66d6514f038ddda1411657c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 13:51:17 2018 -0500
+
+    [kerx] Implement tupleKerning for Format1
+
+    Untested.
+
+ src/hb-aat-layout-kerx-table.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 39b4ef6f18605e85c68cbcec534e137fc831dbca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 13:48:45 2018 -0500
+
+    [kerx] Better sanitize tupleKerning
+
+ src/hb-aat-layout-kerx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 14772da06f9c67d0d40712369e26064e3dee2a91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 13:40:22 2018 -0500
+
+    [kern/kerx] Share KernTable, renamed to KerxTable
+
+ src/hb-aat-layout-kerx-table.hh |  77 ++++++++++++++++++++++--------
+ src/hb-ot-kern-table.hh         | 103
+ ++--------------------------------------
+ 2 files changed, 61 insertions(+), 119 deletions(-)
+
+commit c038f5be6b70b8edffc701dd3e4e3cd08d14e2f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 13:35:06 2018 -0500
+
+    [fallback] Minor
+
+ src/hb-ot-shape-fallback.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit db6e658e8c0c4953c2f026f6a67a5d2fb4bdc204
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 13:33:23 2018 -0500
+
+    [kern/kerx] More towards sharing KernTable
+
+ src/hb-aat-layout-kerx-table.hh | 48 ++++++++++++++++++---------------
+ src/hb-ot-kern-table.hh         | 59
+ ++++++++++++++++++++++++++++-------------
+ 2 files changed, 67 insertions(+), 40 deletions(-)
+
+commit 89ec095979bde94bd203ed2c394f6e40629e9e78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 13:10:05 2018 -0500
+
+    [kern] Disable Format1 and Format3 for OT-style tables
+
+ src/hb-ot-kern-table.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit ab57bcae0fd4505c80bb4ccdef6838bb2805ce79
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 13:04:21 2018 -0500
+
+    [kern] Minor
+
+ src/hb-ot-kern-table.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 30af5b4a4c2071599dc87bc092a7329befcc45cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 12:57:10 2018 -0500
+
+    [kern] Move code
+
+ src/hb-ot-kern-table.hh | 118
+ +++++++++++++++++++++++++-----------------------
+ 1 file changed, 62 insertions(+), 56 deletions(-)
+
+commit 1ff300464a1075b8cd5311970afbbcf4bb3b6f3d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 12:51:49 2018 -0500
+
+    [kern] Massage more
+
+ src/hb-ot-kern-table.hh | 15 +++++++--------
+ 1 file changed, 7 insertions(+), 8 deletions(-)
+
+commit 8e9f6cd0fddd572e048487aae3141d3dbb1b99cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 12:49:20 2018 -0500
+
+    [kerx] More minor
+
+ src/hb-aat-layout-kerx-table.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit f8c3df7d4a685bb86a1c15a5ef95485e8ef30305
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 12:48:06 2018 -0500
+
+    [kern/kerx] Minor
+
+ src/hb-aat-layout-kerx-table.hh |  5 +++--
+ src/hb-ot-kern-table.hh         | 19 ++++++++++---------
+ 2 files changed, 13 insertions(+), 11 deletions(-)
+
+commit f5e0a63a22f91720a997f5070b84e982e57de661
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 12:32:39 2018 -0500
+
+    [kern/kerx] Towards sharing KernTable
+
+ src/hb-aat-layout-kerx-table.hh |  4 ++--
+ src/hb-ot-kern-table.hh         | 19 +++++++------------
+ 2 files changed, 9 insertions(+), 14 deletions(-)
+
+commit 330508497d301c0ba5d5fb5d0900b62c191aabb5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 12:27:44 2018 -0500
+
+    [kern/kerx] Minor
+
+ src/hb-aat-layout-kerx-table.hh | 2 +-
+ src/hb-ot-kern-table.hh         | 5 +++--
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 1a5ef8490034f4bd8965a3c71d34a5930ebe11b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 12:19:52 2018 -0500
+
+    [kern/kerx] Share Format2
+
+    This, enables Format2 for kern table, which was disabled before.
+
+ src/hb-aat-layout-kerx-table.hh |  6 ++++
+ src/hb-ot-kern-table.hh         | 73
+ +----------------------------------------
+ 2 files changed, 7 insertions(+), 72 deletions(-)
+
+commit 8faec4e33486616fdc0d690ad80d4a38a73c8182
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 12:16:38 2018 -0500
+
+    [kerx] Towards merging Format2
+
+ src/hb-aat-layout-kerx-table.hh | 17 ++++++++++-------
+ 1 file changed, 10 insertions(+), 7 deletions(-)
+
+commit ae8fd0dbfb57afadfe815c5bde4ad4a6485fd950
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Nov 7 09:16:12 2018 -0800
+
+    clear stack after vsindex op
+
+ src/hb-cff2-interp-cs.hh | 1 +
+ src/hb-ot-cff2-table.hh  | 1 +
+ 2 files changed, 2 insertions(+)
+
+commit 7fed7d80f72b35900b41878ae59e38fd1cb49dc8
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Nov 7 09:09:13 2018 -0800
+
+    fixed off-by-one error in CFF1 Encoding lookup
+
+ src/hb-ot-cff1-table.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit d5c0ca210fef315fd039e5b1825a865f36606a3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 12:08:44 2018 -0500
+
+    [aat] Minor
+
+ src/hb-aat-layout-common.hh | 16 ++++++++++------
+ src/hb-ot-kern-table.hh     |  4 ++--
+ 2 files changed, 12 insertions(+), 8 deletions(-)
+
+commit e72e041c3cda164b2ffb02d770b35d0d70954818
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 11:56:36 2018 -0500
+
+    [kerx] Rename
+
+ src/hb-aat-layout-kerx-table.hh | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 241ba7da518adee334fff105ae19dfb051868a57
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 11:51:40 2018 -0500
+
+    [morx/kerx] Rename types
+
+ src/hb-aat-layout-common.hh     |  4 ++--
+ src/hb-aat-layout-kerx-table.hh | 17 +++++++++--------
+ src/hb-aat-layout-morx-table.hh |  4 ++--
+ src/hb-ot-kern-table.hh         |  4 ++--
+ 4 files changed, 15 insertions(+), 14 deletions(-)
+
+commit c808e444da12840ac3ab1d78569504b9b7e876f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 11:28:36 2018 -0500
+
+    [kern/kerx] Share Format1 subtable
+
+ src/hb-aat-layout-kerx-table.hh |   9 +-
+ src/hb-ot-kern-table.hh         | 187
+ +---------------------------------------
+ 2 files changed, 4 insertions(+), 192 deletions(-)
+
+commit a244190afa90ac253724a2ff23a3bdf0c507d0e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 11:43:25 2018 -0500
+
+    [kerx] Minor
+
+ src/hb-aat-layout-kerx-table.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 2a720911964a00ad607ff712be09ea3ea0925c9b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 11:25:55 2018 -0500
+
+    [kerx] Minor
+
+ src/hb-aat-layout-kerx-table.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit f5f4ca7871ec2be2b5666a7b9e6e5e28133b8393
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 11:21:09 2018 -0500
+
+    [kern/kerx] Enable crossStream kerning in vertical
+
+    CoreText doesn't, but no reason we shouldn't do.
+
+ src/hb-aat-layout-kerx-table.hh | 8 ++++----
+ src/hb-ot-kern-table.hh         | 8 ++++----
+ 2 files changed, 8 insertions(+), 8 deletions(-)
+
+commit d5c88af4a23bffc09840c43e6b1403b64a9f74d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 11:20:14 2018 -0500
+
+    [kerx] More towards sharing Format1
+
+ src/hb-aat-layout-kerx-table.hh | 35 +++++++++++++++++++++++++++++++----
+ src/hb-aat-layout-morx-table.hh | 10 ++++++----
+ 2 files changed, 37 insertions(+), 8 deletions(-)
+
+commit b693fd0dc6c7979dcacdff060ecf12a2e107071d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 11:05:28 2018 -0500
+
+    [morx] Simplify
+
+ src/hb-aat-layout-morx-table.hh | 27 +++++++++++----------------
+ 1 file changed, 11 insertions(+), 16 deletions(-)
+
+commit ce3451dc2aad2241c148953842e696e9f53b5deb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 11:02:04 2018 -0500
+
+    [kerx] Towards sharing Format1
+
+ src/hb-aat-layout-kerx-table.hh | 61
+ +++++++++++++++++++++++++++++++----------
+ 1 file changed, 47 insertions(+), 14 deletions(-)
+
+commit e890753ebbf0d20c1c86796837918d530610df3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 10:58:50 2018 -0500
+
+    [morx] Minor
+
+ src/hb-aat-layout-morx-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 5b17853547ca6848ee652ef6990a81bb345ac06f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 10:45:25 2018 -0500
+
+    [kern/kerx] Share Format0
+
+ src/hb-aat-layout-kerx-table.hh | 22 +++++++++++++-----
+ src/hb-ot-kern-table.hh         | 50
+ ++++++-----------------------------------
+ 2 files changed, 23 insertions(+), 49 deletions(-)
+
+commit c97dde5d55929df394fbe57c1ba1a725592c6732
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 10:39:39 2018 -0500
+
+    [kern/kerx] Towards merge more
+
+ src/hb-aat-layout-kerx-table.hh | 75
+ ++++++++++++++++++++++++++++++-----------
+ src/hb-kern.hh                  | 33 ------------------
+ src/hb-ot-kern-table.hh         |  7 ++--
+ 3 files changed, 58 insertions(+), 57 deletions(-)
+
+commit 540ccc38b0f95804d08047f8b2d059bfd1e09337
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 10:33:46 2018 -0500
+
+    [kern/kerx] More towards sharing
+
+ src/hb-aat-layout-kerx-table.hh |  7 ++++---
+ src/hb-ot-kern-table.hh         | 10 +++++++---
+ 2 files changed, 11 insertions(+), 6 deletions(-)
+
+commit d0f8f4c200670bc0bfbffbf301139a3613865a7f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 10:25:25 2018 -0500
+
+    [kern] Move kern machine to hb-kern.hh
+
+ src/Makefile.sources            |   1 +
+ src/hb-aat-layout-kerx-table.hh |   5 +-
+ src/hb-kern.hh                  | 153
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-kern-table.hh         | 115 +-----------------------------
+ src/hb-ot-shape-fallback.cc     |   2 +-
+ 5 files changed, 157 insertions(+), 119 deletions(-)
+
+commit a6acff252c72457ecfa856fd6c57081b3a4290dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 10:19:46 2018 -0500
+
+    [kerx] Towards sharing subtables with kern
+
+ src/hb-aat-layout-kerx-table.hh | 41
+ +++++++++++++++++++++++------------------
+ 1 file changed, 23 insertions(+), 18 deletions(-)
+
+commit befac337ca2c705e2cea60a9a92e40e0dbbc40aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 09:53:02 2018 -0500
+
+    [kern] Remove Override business
+
+    Not used in any fonts.  Not well-specified when mixing kerning with
+    Cross-Stream positioning.
+
+ src/hb-ot-kern-table.hh | 16 ----------------
+ 1 file changed, 16 deletions(-)
+
+commit 9d5027696e418b7c2a5ccbc18faafe6b9290d08b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 09:16:53 2018 -0500
+
+    [post] Return true on truncation
+
+    Client can check that buffer was completely filled out and reallocate.
+
+ src/hb-ot-post-table.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 7d91f07edf29c4923716af6cee8eb94f948ac91f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 09:14:42 2018 -0500
+
+    [post] Protect against huge empty tables
+
+ src/hb-ot-post-table.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 5ed816ab5900ac4ff7feca3d98cbd92e62fd1754
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 09:13:51 2018 -0500
+
+    [post] Minor
+
+ src/hb-ot-post-table.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 64f0becd89cc2b0136c7dc1609abc9f957525cf8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 09:10:55 2018 -0500
+
+    [post] Fix bound checking
+
+ src/hb-ot-post-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7ec694ddf25a313483044256f7ed88b644432e15
+Author: HinTak <htl10@users.sourceforge.net>
+Date:   Wed Nov 7 13:19:36 2018 +0000
+
+    Use non-GRID-fitted values for metrics (#1363)
+
+    * Use non-GRID-fitted values for metrics
+
+    See freetype/src/base/ftobjs.c:ft_recompute_scaled_metrics() and
+    the usage of GRID_FIT_METRICS inside.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/1262
+
+    * Update hb-ft.cc
+
+ src/hb-ft.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 59e04e42312293c30714a666c4479e209aec3c0e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 00:25:48 2018 -0500
+
+    [kern/kerx] Fix cursive joining
+
+    Tested with Waseem TTC:
+
+    $ hb-shape Waseem.ttc جحخج
+    [F1Jeem_R2=3@0,180+479|M1Khah_L2_R2=2@0,682+403|M1Hah_L2_R2=1@0,1184+403|I1Jeem_L2=0@0,1184+744]
+
+ src/hb-aat-layout-kerx-table.hh | 2 ++
+ src/hb-ot-kern-table.hh         | 2 ++
+ 2 files changed, 4 insertions(+)
+
+commit 8d0f797139e853d13cb2383d541c2e691d9dbae3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 7 00:04:40 2018 -0500
+
+    [kern/kerx] Fix "reset" magic value
+
+ src/hb-aat-layout-kerx-table.hh | 2 +-
+ src/hb-ot-kern-table.hh         | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 0123976a0c1e2f629252969a7ff632dc2b1dbbc9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 21:45:40 2018 -0500
+
+    [kerx] Adjust CrossStream kern to match 'kern' table
+
+ src/hb-aat-layout-kerx-table.hh | 62
+ +++++++++++++++++++++++++++++++----------
+ 1 file changed, 48 insertions(+), 14 deletions(-)
+
+commit 80a33b9ac351d81793f35a92e0255ffbf5ceb8b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 21:41:28 2018 -0500
+
+    [kern] More tweaks
+
+    Solves a mystery or two.  I'm fairly confident this is what CoreText
+    does now.
+
+ src/hb-ot-kern-table.hh | 40 ++++++++++++++++++++++------------------
+ 1 file changed, 22 insertions(+), 18 deletions(-)
+
+commit 564e8ac0465d8ced3a98ecb55d09ffaa45eefc2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 21:04:40 2018 -0500
+
+    [kern] Adjust some more
+
+    Getting closer.  So many open questions still...
+
+ src/hb-ot-kern-table.hh | 36 ++++++++++++++++++++++--------------
+ 1 file changed, 22 insertions(+), 14 deletions(-)
+
+commit 4d003b8503f9c984abe2ac0de8c526a276ea8e54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 21:04:02 2018 -0500
+
+    [kern] Add TODO
+
+ src/hb-ot-kern-table.hh | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 9810f0b80e5b6580a7a15debcec073dfc9ca759f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 19:24:04 2018 -0500
+
+    [kern] Minor
+
+ src/hb-ot-kern-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9c04b6058306cd4b2123a33a7cbeb47505434217
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 18:35:58 2018 -0500
+
+    [kern] In Format1, adjust how kerning is done
+
+    In a series of kerns in one action, kern all but last glyph forward,
+    and the last one backward.  Seems to better match what CoreText
+    is doing.
+
+    Test cases, with GeezaPro Arabic:
+
+    $ ./hb-shape GeezaPro_10_10.ttc -u U+0631,U+0628
+    [u0628.beh=1+1415|u0631.reh=0@-202,0+700]
+
+    $ ./hb-shape GeezaPro_10_10.ttc -u U+0628,U+064F
+    [u064f.damma=0@0,-250+-250|u0628.beh=0@250,0+1665]
+
+    In a later change, I'll make kern machine avoid producing negative
+    kerns.
+
+ src/hb-ot-kern-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e8c47724638c29d78001905610c662de99c59cad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 17:16:04 2018 -0500
+
+    [kern] XXX Negate CrossKerning sign
+
+    Not sure why, but seems to better match GeezaPro Arabic w CoreText.
+
+    Quite possibly I'm doing something very wrong...
+
+ src/hb-ot-kern-table.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 01bf43ac01576a6415336cc56c74bb1a872566d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 14:48:42 2018 -0500
+
+    [kern] Implement CrossStream kerning
+
+ src/hb-aat-layout-kerx-table.hh | 75
+ ++++++++++++++++++++++++++---------------
+ src/hb-ot-kern-table.hh         | 63 ++++++++++++++++++++++++++++------
+ 2 files changed, 101 insertions(+), 37 deletions(-)
+
+commit b11830c09e0d78bbdaf86ef02191d00b3d8256c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 15:23:18 2018 -0500
+
+    [kern] Improve Format 2
+
+    Still disabled.
+
+ src/hb-aat-layout-common.hh | 20 +++++++++-----------
+ src/hb-ot-kern-table.hh     | 35 ++++++-----------------------------
+ 2 files changed, 15 insertions(+), 40 deletions(-)
+
+commit c0383c6bb725bed2a48485988a427348384f3f87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 15:07:19 2018 -0500
+
+    Minor
+
+ src/hb-aat-layout-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 10e6f708f30986bab9f7b506935f2555d6b79ff4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 13:32:13 2018 -0500
+
+    [kern] Minor
+
+ src/hb-ot-kern-table.hh | 30 +++++++++++-------------------
+ 1 file changed, 11 insertions(+), 19 deletions(-)
+
+commit 164eedd9181345d84d5f8059475ad4b97784fd46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 13:18:27 2018 -0500
+
+    [kern] Minor
+
+ src/hb-ot-kern-table.hh | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit 220a5991baa213b7bd173ea02090dc6fc8aef655
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 13:51:39 2018 -0500
+
+    [kern/kerx] Fix trace numbering
+
+ src/hb-aat-layout-kerx-table.hh | 1 +
+ src/hb-ot-kern-table.hh         | 1 +
+ 2 files changed, 2 insertions(+)
+
+commit 7b21319edfd6531a444846f71e87303bc09f4621
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Nov 6 13:59:07 2018 -0800
+
+    don't reject empty Dict
+
+ src/hb-cff-interp-dict-common.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 43ee0e4d006ce7b4ade4483f2c8ec3d39723fc94
+Merge: ec6817c1 bfafe208
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Nov 6 09:57:17 2018 -0800
+
+    Merge branch 'master' into cff-subset
+
+commit bfafe208da11817b5ebf3751f02af2dcdf57bd19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 12:11:45 2018 -0500
+
+    [kern] Switch to dispatch
+
+ src/hb-aat-layout-kerx-table.hh | 12 ++++++------
+ src/hb-ot-kern-table.hh         | 31 +++++++++++++++----------------
+ 2 files changed, 21 insertions(+), 22 deletions(-)
+
+commit 213fa3bf711dae5028e3d041e305cdd35223de77
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 12:07:15 2018 -0500
+
+    [kern] Refactor to include header in each subtable type
+
+ src/hb-ot-kern-table.hh | 189
+ +++++++++++++++++++++++-------------------------
+ 1 file changed, 91 insertions(+), 98 deletions(-)
+
+commit b0da2cd0b9c1346b7cda5997fb799e895e34aace
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 11:16:45 2018 -0500
+
+    [kern] Some more
+
+ src/hb-ot-kern-table.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 75b00b51c8fca5d605c479333eb3abd608623613
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 11:13:40 2018 -0500
+
+    [kern] Renames
+
+ src/hb-ot-kern-table.hh | 20 +++++++++-----------
+ 1 file changed, 9 insertions(+), 11 deletions(-)
+
+commit 5c3ccbc634158ba9f84d365c9a31a596f6d8825b
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Nov 6 18:10:56 2018 +0200
+
+    Another missing backlash
+
+    Did this ever work?
+
+ test/api/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d29602b962c13836f4c0d46796bc693f66f9b9fe
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Nov 6 18:07:47 2018 +0200
+
+    Add missing backslash
+
+ test/api/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9bddfde25dc8c302c765a1e9a8a2c38c4a836e2e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 11:03:34 2018 -0500
+
+    [util] Fix up previous commit
+
+ util/options.cc | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 3ec2e4fa7bec07ec181a0390e5f5fd695abee611
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 10:49:19 2018 -0500
+
+    [util] Don't terminate string after a a 0 in -u
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1361
+
+ util/options.cc | 4 +++-
+ util/options.hh | 2 ++
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 8790b2740a334f1789fb0cf329f2b8ac9733793c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 10:24:54 2018 -0500
+
+    [fuzzing] Fix test
+
+ test/fuzzing/hb-shape-fuzzer.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 3af0a7edd0c99aaef846ae787056d7664bc69d35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 10:20:57 2018 -0500
+
+    [fuzzing] Add make check-valgrind
+
+ test/fuzzing/Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit b062378ce640eb418cb413b595b79cc81a193209
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 10:20:36 2018 -0500
+
+    [test] Minor
+
+ test/api/.valgrind-suppressions | 0
+ test/api/Makefile.am            | 2 +-
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 37f421c951c853dff165df6731d0ab9c46350790
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 6 10:03:38 2018 -0500
+
+    Minor
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b6112e5ea4d08fcbfa8f7cb4ef3903514a6e99f3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Nov 6 11:42:47 2018 +0330
+
+    [test] Fix -Weverything bot complain
+
+ test/api/test-ot-name.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a49df419f04b4065fc7f70a77c5cbc453e6ba906
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Nov 6 11:26:30 2018 +0330
+
+    [test] Test hb_ot_name_{list_names,get_utf8} on test-ot-name
+
+ test/api/test-ot-name.c | 27 ++++++++++++++++++++++++---
+ 1 file changed, 24 insertions(+), 3 deletions(-)
+
+commit 9139cc23ea9fb339be9426860e0c72038d32a2ab
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Nov 6 11:17:14 2018 +0330
+
+    Fix link issue of some of the bots
+
+    e.g. https://circleci.com/gh/harfbuzz/harfbuzz/52410
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 98b37f0c109d0f7454e91c9563c56d1903d6d496
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Nov 6 09:16:28 2018 +0330
+
+    [mort] Fix table detection logic
+
+    mort really needs some initial tests at least.
+
+ src/hb-aat-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fa3ebf845fcffa827600fc4ca9fdde3aaa99f4c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 23:34:07 2018 -0500
+
+    Simplify some more
+
+ src/hb-aat-layout.cc | 10 +++++-----
+ src/hb-ot-layout.cc  |  2 +-
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 61f52231f430c72e1b66b76dabb018cfe45a01d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 23:28:52 2018 -0500
+
+    [math] Shorten names a bit
+
+ src/hb-ot-math-table.hh |  4 ++--
+ src/hb-ot-math.cc       | 33 +++++++++++++++++++--------------
+ 2 files changed, 21 insertions(+), 16 deletions(-)
+
+commit 737efbe65583a71d7df9ae7b423d9fb1d68599b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 23:26:29 2018 -0500
+
+    [ot-layout] Simplify GSUB/GPOS access
+
+    This concludes simplifying table access to face->table.XXXX.
+
+ src/hb-ot-layout.cc | 31 +++++++++++++------------------
+ 1 file changed, 13 insertions(+), 18 deletions(-)
+
+commit 5e68cec17913e9f6e98e5017a56c78a5614e4030
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 23:23:57 2018 -0500
+
+    [ot-layout] Simplify GDEF access
+
+ src/hb-ot-layout.cc | 44 ++++++++++++++++----------------------------
+ 1 file changed, 16 insertions(+), 28 deletions(-)
+
+commit 33b006cc51b0d27cbe1d8ed498bbf2b548cb6554
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 23:19:04 2018 -0500
+
+    [ot-layout] Simplify some access
+
+ src/hb-ot-layout-gdef-table.hh |  2 +-
+ src/hb-ot-layout-gpos-table.hh |  9 +++++----
+ src/hb-ot-layout-gsub-table.hh |  9 +++++----
+ src/hb-ot-layout-gsubgpos.hh   |  2 +-
+ src/hb-ot-layout.hh            | 12 +-----------
+ 5 files changed, 13 insertions(+), 21 deletions(-)
+
+commit db35409f0db9faf91a10defc81e4d6d60dc7822a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 23:11:46 2018 -0500
+
+    [ot-layout] Remove ensures
+
+ src/hb-ot-layout.cc | 14 ++++----------
+ 1 file changed, 4 insertions(+), 10 deletions(-)
+
+commit 9198de7b9b6020c1e3d6a48783e36db7e1f7e99a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 23:10:37 2018 -0500
+
+    [ot-font] Remove ensure
+
+ src/hb-ot-font.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit ea6d9b661fc3cf6bc4366feeb7694c0b712abfae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 23:09:29 2018 -0500
+
+    [ot-face] Remove a few ensures
+
+ src/hb-face.cc | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 0fe7a745c9a323a3fc76beb011b6ab8919cf905b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 23:08:33 2018 -0500
+
+    [ot-face] Simplify more table access
+
+ src/hb-face.cc      |  6 +++---
+ src/hb-ot-face.hh   |  3 ---
+ src/hb-ot-font.cc   |  4 +---
+ src/hb-ot-layout.cc | 34 +++++++++++++++++-----------------
+ 4 files changed, 21 insertions(+), 26 deletions(-)
+
+commit a35c92cbe771a75df40412fd248ad06f6a0cfebf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 22:58:43 2018 -0500
+
+    [ot-face] Simplify table access
+
+    Yoohoo!
+
+ src/hb-aat-layout.cc | 107
+ ++++++++++-----------------------------------------
+ src/hb-ot-color.cc   |  66 ++++++++-----------------------
+ src/hb-ot-layout.cc  |  20 ++--------
+ src/hb-ot-math.cc    |  47 ++++++++--------------
+ src/hb-ot-name.cc    |  11 +-----
+ src/hb-ot-var.cc     |  33 ++++------------
+ 6 files changed, 64 insertions(+), 220 deletions(-)
+
+commit 914b595f2598d5bdb2c750832d567a57d45db84e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 22:39:50 2018 -0500
+
+    [ot-face] Include hb-ot-face directly in hb_face_t
+
+    Simplifying access coming next.
+
+ src/hb-face.cc     |  4 ++++
+ src/hb-face.hh     |  3 +++
+ src/hb-ot-face.cc  | 24 ++----------------------
+ src/hb-ot-face.hh  | 39 +++++++++++++++------------------------
+ src/hb-ot-font.cc  | 24 ++++++++++++------------
+ src/hb-ot-math.cc  |  3 +--
+ src/hb-ot-shape.cc |  5 +++--
+ 7 files changed, 40 insertions(+), 62 deletions(-)
+
+commit 56ba998cddbb2ba5d24fb0b02d2bf77a46c0f23f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 19:49:54 2018 -0500
+
+    [cmap] Push get_nominal_glyphs down into cmap accelerator
+
+ src/hb-ot-cmap-table.hh | 21 +++++++++++++++++++++
+ src/hb-ot-font.cc       | 13 +++----------
+ 2 files changed, 24 insertions(+), 10 deletions(-)
+
+commit 36d85dce25abd079252d973f804220bf7b97e987
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 19:46:29 2018 -0500
+
+    [cmap] Use hb_nonnullptr_t
+
+ src/hb-ot-cmap-table.hh | 34 ++++++++++++++--------------------
+ 1 file changed, 14 insertions(+), 20 deletions(-)
+
+commit 8be74d85534534dbdd39a0a6f496e26e9f3e661d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 18:47:22 2018 -0500
+
+    2.1.1
+
+ NEWS             | 8 ++++++++
+ configure.ac     | 2 +-
+ src/hb-version.h | 4 ++--
+ 3 files changed, 11 insertions(+), 3 deletions(-)
+
+commit 6482fda519ca7d173e3bcb3717aa30e237f04b25
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 15:03:18 2018 -0500
+
+    [fuzzing] Fuzz glyph-id etc in test-ot-face
+
+ test/api/test-ot-face.c         | 57
+ +++++++++++++++++++++--------------------
+ test/fuzzing/hb-shape-fuzzer.cc | 19 +-------------
+ 2 files changed, 30 insertions(+), 46 deletions(-)
+
+commit 252632c477b963f305116d69fcafacd8bf7b97bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 14:33:41 2018 -0500
+
+    [uniscribe] Fix use of deprecated API
+
+ src/hb-uniscribe.cc | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit bb380ec18394b2c581b672ecbf98991e14897f2e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 13:45:12 2018 -0500
+
+    [cmap] Make null accelerator safe
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1146
+
+ src/hb-ot-cmap-table.hh | 50
+ ++++++++++++++++++++++++-------------------------
+ 1 file changed, 25 insertions(+), 25 deletions(-)
+
+commit f6fc5574d3dae177a54b10195e0d1f368a74f768
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 13:23:54 2018 -0500
+
+    Add pointer magic operators to hb_atomic_ptr_t
+
+ src/hb-atomic.hh                  | 3 +++
+ src/hb-common.cc                  | 6 +++---
+ src/hb-face.cc                    | 2 +-
+ src/hb-graphite2.cc               | 8 ++++----
+ src/hb-machinery.hh               | 1 +
+ src/hb-ot-shape-complex-arabic.cc | 4 ++--
+ src/hb-shape-plan.cc              | 2 +-
+ 7 files changed, 15 insertions(+), 11 deletions(-)
+
+commit f6e7cb51b13aabb447dc97a59602d65eb42edc4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 13:23:07 2018 -0500
+
+    Fix const-confusion in hb_array_t as well
+
+ src/hb-dsalgs.hh | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit 0da22fb0ada8a54fc59739057f281a406a993212
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 13:13:39 2018 -0500
+
+    [null] Tweak hb_nonnull_ptr_t some more
+
+ src/hb-null.hh | 18 ++++++------------
+ 1 file changed, 6 insertions(+), 12 deletions(-)
+
+commit 03348ce0051cfae7172ac0d09b83ed5f82fa842a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 12:59:32 2018 -0500
+
+    Minor
+
+ src/hb-aat-layout.cc | 12 ++++++------
+ src/hb-ot-color.cc   | 10 +++++-----
+ src/hb-ot-font.cc    | 18 +++++++++---------
+ src/hb-ot-layout.cc  |  2 +-
+ src/hb-ot-math.cc    |  2 +-
+ src/hb-ot-name.cc    |  2 +-
+ src/hb-ot-var.cc     |  6 ++----
+ 7 files changed, 25 insertions(+), 27 deletions(-)
+
+commit ec6817c1bd82a60b84cb868e4d7ff4c65cb80ccc
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Nov 5 07:59:08 2018 -0800
+
+    remove build files accidentally pushed
+
+ INSTALL                 |   370 -
+ Makefile                |   954 --
+ Makefile.in             |   954 --
+ aclocal.m4              |  1496 ---
+ ar-lib                  |   270 -
+ autom4te.cache/output.0 | 23333
+ ----------------------------------------------
+ autom4te.cache/output.1 | 23333
+ ----------------------------------------------
+ autom4te.cache/output.2 | 23333
+ ----------------------------------------------
+ autom4te.cache/requests |   555 --
+ autom4te.cache/traces.0 |  3823 --------
+ autom4te.cache/traces.1 |  1229 ---
+ autom4te.cache/traces.2 |  3823 --------
+ compile                 |   347 -
+ config.guess            |  1421 ---
+ config.h                |   227 -
+ config.h.in             |   226 -
+ config.log              |  1560 ----
+ config.status           |  2420 -----
+ config.sub              |  1807 ----
+ configure               | 23333
+ ----------------------------------------------
+ depcomp                 |   791 --
+ install-sh              |   501 -
+ libtool                 | 11805 -----------------------
+ ltmain.sh               | 11147 ----------------------
+ missing                 |   215 -
+ stamp-h1                |     1 -
+ test-driver             |   148 -
+ 27 files changed, 139422 deletions(-)
+
+commit b721fdae662673ab706da897aaa1db126f8ca1a5
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Nov 4 16:19:15 2018 -0800
+
+    fixed leaks in CFF subr subset
+
+ src/hb-ot-cff-common.hh     | 10 +++++++++-
+ src/hb-subset-cff-common.hh | 10 +++++++++-
+ 2 files changed, 18 insertions(+), 2 deletions(-)
+
+commit 85f5644e8e9fe18032e37d4153c3c928d087ac6a
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Nov 4 14:17:30 2018 -0800
+
+    added missing switch breaks
+
+ src/hb-subset-cff-common.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 1682d1bbecaeeddc8a1678a01c57c0e0023bf7c4
+Merge: d8fadec0 b605db2f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Nov 4 13:25:41 2018 -0800
+
+    Merge branch 'master' into cff-subset
+
+commit d8fadec098935335e69e46c1101da3f142824638
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Nov 4 13:12:20 2018 -0800
+
+    added desubroutinize full font test profiles & expected fonts
+
+    modified subset_test_suite.py to apply desubroutinize profiles to
+    CFF only (not to TT)
+
+ ...urceSansPro-Regular.default.1FC,21,41,20,62,63.otf | Bin 3640 ->
+ 3784 bytes
+ .../SourceSansPro-Regular.default.61,62,63.otf        | Bin 3400 ->
+ 3496 bytes
+ .../SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf  | Bin 3596 ->
+ 3612 bytes
+ ...sPro-Regular.desubroutinize.1FC,21,41,20,62,63.otf | Bin 0 ->
+ 3640 bytes
+ .../SourceSansPro-Regular.desubroutinize.61,62,63.otf | Bin 0 ->
+ 3400 bytes
+ ...eSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf | Bin 0 ->
+ 3596 bytes
+ ...eSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 3480 ->
+ 3564 bytes
+ .../SourceSansPro-Regular.drop-hints.61,62,63.otf     | Bin 3276 ->
+ 3340 bytes
+ ...ourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf | Bin 3448 ->
+ 3464 bytes
+ ...r.drop-hints.desubroutinize.1FC,21,41,20,62,63.otf | Bin 0 ->
+ 3480 bytes
+ ...Pro-Regular.drop-hints.desubroutinize.61,62,63.otf | Bin 0 ->
+ 3276 bytes
+ ...gular.drop-hints.desubroutinize.D7,D8,D9,DA,DE.otf | Bin 0 ->
+ 3448 bytes
+ ...-Regular.default.3042,3044,3046,3048,304A,304B.otf | Bin 6248 ->
+ 6324 bytes
+ ...-Regular.default.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 6432 ->
+ 6568 bytes
+ .../SourceHanSans-Regular.default.61,63,65,6B.otf     | Bin 5428 ->
+ 5500 bytes
+ ...-Regular.default.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6552 ->
+ 6780 bytes
+ .../japanese/SourceHanSans-Regular.default.660E.otf   | Bin 5196 ->
+ 5248 bytes
+ ....otf => SourceHanSans-Regular.desubroutinize..otf} | Bin
+ ...r.desubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 0 ->
+ 6248 bytes
+ ...r.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 ->
+ 6432 bytes
+ ...urceHanSans-Regular.desubroutinize.61,63,65,6B.otf | Bin 0 ->
+ 5428 bytes
+ ...r.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 ->
+ 6552 bytes
+ .../SourceHanSans-Regular.desubroutinize.660E.otf     | Bin 0 ->
+ 5196 bytes
+ ...gular.drop-hints.3042,3044,3046,3048,304A,304B.otf | Bin 6076 ->
+ 6132 bytes
+ ...gular.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 6180 ->
+ 6304 bytes
+ .../SourceHanSans-Regular.drop-hints.61,63,65,6B.otf  | Bin 5312 ->
+ 5344 bytes
+ ...gular.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6248 ->
+ 6472 bytes
+ .../SourceHanSans-Regular.drop-hints.660E.otf         | Bin 5088 ->
+ 5140 bytes
+ ...rceHanSans-Regular.drop-hints.desubroutinize..otf} | Bin
+ ...s.desubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 0 ->
+ 6076 bytes
+ ...s.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 ->
+ 6180 bytes
+ ...-Regular.drop-hints.desubroutinize.61,63,65,6B.otf | Bin 0 ->
+ 5312 bytes
+ ...s.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 ->
+ 6248 bytes
+ ...HanSans-Regular.drop-hints.desubroutinize.660E.otf | Bin 0 ->
+ 5140 bytes
+ test/subset/data/profiles/desubroutinize.txt          |   1 +
+ .../data/profiles/drop-hints-desubroutinize.txt       |   2 ++
+ test/subset/generate-expected-outputs.py              |   1 -
+ test/subset/subset_test_suite.py                      |   7 ++++++-
+ 38 files changed, 9 insertions(+), 2 deletions(-)
+
+commit b605db2f65e62ad6727a61481f78015933dbf207
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 4 12:58:02 2018 -0500
+
+    [aat] Clean up ankr table include mess
+
+ src/hb-aat-layout-ankr-table.hh |  2 ++
+ src/hb-aat-layout-common.hh     | 31 +++++++++---------------------
+ src/hb-aat-layout-kerx-table.hh | 16 ++++++++--------
+ src/hb-aat-layout.cc            | 42
+ +++++++++++++++++++++++++++++++++++++++--
+ src/hb-ot-kern-table.hh         |  1 -
+ src/hb-static.cc                |  1 -
+ 6 files changed, 59 insertions(+), 34 deletions(-)
+
+commit bce437cf0b71e9b60bbf058eaf61593fed30ae33
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 4 02:47:34 2018 -0500
+
+    [test] Call test-ot-face.c test from hb-shape-fuzzer
+
+    Should increase coverage...
+
+ test/api/test-ot-face.c         | 28 ++++++++++++++++++----------
+ test/fuzzing/hb-shape-fuzzer.cc |  6 ++++++
+ 2 files changed, 24 insertions(+), 10 deletions(-)
+
+commit 777c22425cae97009ca4dc5b1e400670c4aa0799
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 4 02:40:20 2018 -0500
+
+    [test] More funcs in test-ot-face
+
+ test/api/test-font.c    |  5 +++++
+ test/api/test-ot-face.c | 21 +++++++++++++++++++--
+ 2 files changed, 24 insertions(+), 2 deletions(-)
+
+commit 17335a8161e674e630287e18a6d304ec0c33767c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 4 02:25:07 2018 -0500
+
+    Clean up buffer->swap_buffers() calls
+
+    That function checks for buffer->successful already.  No need
+    to check at call site.
+
+ src/gen-vowel-constraints.py                 | 4 +---
+ src/hb-aat-layout-common.hh                  | 3 +--
+ src/hb-aat-layout-morx-table.hh              | 3 +--
+ src/hb-ot-shape-complex-indic.cc             | 1 -
+ src/hb-ot-shape-complex-khmer.cc             | 1 -
+ src/hb-ot-shape-complex-myanmar.cc           | 1 -
+ src/hb-ot-shape-complex-thai.cc              | 3 +--
+ src/hb-ot-shape-complex-use.cc               | 1 -
+ src/hb-ot-shape-complex-vowel-constraints.cc | 5 ++---
+ src/hb-ot-shape.cc                           | 1 -
+ 10 files changed, 6 insertions(+), 17 deletions(-)
+
+commit 191ca0f15b7fc9ab959e1f6472c48839687402ec
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Nov 3 22:42:22 2018 -0700
+
+    CFF1 no-desubr fixes
+
+    make sure charstring/subrs not ending with endchar/return handled
+    correctly
+    if no local subrs, skip serializing Subrs op in Private
+    misc fixes
+
+ src/hb-ot-cff-common.hh     | 13 +++++++++-
+ src/hb-subset-cff-common.hh | 59
+ +++++++++++++++++++++++----------------------
+ src/hb-subset-cff1.cc       | 27 +++++++++++++++------
+ 3 files changed, 62 insertions(+), 37 deletions(-)
+
+commit 4eb52460c8c6dc48af240f2254f76fae065bfa97
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 21:45:39 2018 -0400
+
+    Fix >>
+
+ src/hb-ot-post-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ae9ad1076e536aee370f9863cde8351b79f01b3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 21:41:50 2018 -0400
+
+    Fix "Warning: extra ";" ignored."
+
+ src/hb.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit d0163afb7bed83935c6a54d57a0e7366caeba0b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 21:38:24 2018 -0400
+
+    Revert "Add operator char * to the naked array types as well"
+
+    This reverts commit db889c182ee5f54127285bfaab5bc94dafe46bda.
+
+    Was resulting in ambigious overloads...
+
+ src/hb-dsalgs.hh    | 4 +---
+ src/hb-open-type.hh | 2 --
+ 2 files changed, 1 insertion(+), 5 deletions(-)
+
+commit c8f94a1ca6928f07749285da910b63087d485537
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 21:07:39 2018 -0400
+
+    Minor
+
+ src/hb-ot-name.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9779e602ed7ac214c0da2c90e104b38460422476
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 20:50:56 2018 -0400
+
+    [test] Add test for empty face
+
+ test/api/Makefile.am    |  1 +
+ test/api/test-ot-face.c | 94
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 95 insertions(+)
+
+commit 1da4de7e7b71dfde734cb77ec6acb31f574585f2
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Nov 3 15:41:29 2018 -0700
+
+    fix for subset fuzzer failure
+
+    A called subr must be freshly parsed or completely parsed. otherwise
+    the prevoius parse must have terminated prematurely
+
+ src/hb-subset-cff1.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 0b0b38ec1e6a815a30bef98193043d255b52c4a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 16:15:30 2018 -0400
+
+    Fix null accelerator's
+
+    Fixes all except for cmap.  To be done separately.
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1146
+
+ src/hb-ot-color-cbdt-table.hh  | 10 ++--------
+ src/hb-ot-color-sbix-table.hh  | 11 ++++-------
+ src/hb-ot-color-svg-table.hh   | 11 ++++-------
+ src/hb-ot-glyf-table.hh        |  6 +++---
+ src/hb-ot-layout-gdef-table.hh |  2 +-
+ src/hb-ot-layout-gsubgpos.hh   |  2 +-
+ src/hb-ot-name-table.hh        |  2 +-
+ src/hb-ot-post-table.hh        |  2 +-
+ 8 files changed, 17 insertions(+), 29 deletions(-)
+
+commit db889c182ee5f54127285bfaab5bc94dafe46bda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 16:04:19 2018 -0400
+
+    Add operator char * to the naked array types as well
+
+ src/hb-dsalgs.hh    | 4 +++-
+ src/hb-open-type.hh | 2 ++
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit d6fdae310f2a98ca624c3a77c3aa03b8b3bd393a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 16:02:03 2018 -0400
+
+    Add operator char * to hb_nonnull_ptr_t
+
+ src/hb-null.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 7430ff604aa54bedcb07cc1c2962eae85fcade76
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 15:59:13 2018 -0400
+
+    Template casts in hb_nonnull_ptr_t
+
+ src/hb-null.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit da408fce98153e0fab3d82fe28813085feed0974
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 15:49:37 2018 -0400
+
+    [blob] Allow null parent in create_sub_blob()
+
+    Like font and unicode.
+
+ src/hb-blob.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fb0f30f55a5d654b2f1f9b99efa9b8abc51dbf34
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 15:24:14 2018 -0400
+
+    Add hb_nonnull_ptr_t
+
+    Towards fixing https://github.com/harfbuzz/harfbuzz/issues/1146
+
+ src/hb-null.hh | 28 ++++++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+commit 8d98c51d133b058a845ed7a84bfe8a43083bbb03
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 15:14:57 2018 -0400
+
+    [kern] Third try fix access violation in Format3
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11245
+
+ src/hb-ot-kern-table.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit f074da8c2b6a7061c71d12213a6c494c119eb20e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 15:06:45 2018 -0400
+
+    [kern] Really fix access violation in Format3
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11245
+
+ src/hb-ot-kern-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 93ef20a83b31e6528bb1835d2b4b83b913805885
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 15:03:06 2018 -0400
+
+    Replace most uses of is_inert with is_immutable
+
+ src/hb-buffer.cc     | 32 ++++++++++++++++----------------
+ src/hb-coretext.cc   |  2 +-
+ src/hb-font.cc       |  2 +-
+ src/hb-set.hh        |  8 +++++---
+ src/hb-shape-plan.cc |  2 +-
+ 5 files changed, 24 insertions(+), 22 deletions(-)
+
+commit 0589787ff55bff9bd5849c4443229e926cc574a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 14:58:54 2018 -0400
+
+    [kern] Fix access violation in Format3
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11245
+
+ src/hb-ot-kern-table.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 5570c87f21f061cc197e02bd0526ab44c63ed6f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 14:51:38 2018 -0400
+
+    Port objects to use header.writable instead of immutable
+
+    Saves 4 or 8 bytes per object on 64bit archs.
+
+ src/hb-blob.cc    | 12 ++++--------
+ src/hb-blob.hh    |  2 --
+ src/hb-face.cc    | 16 ++++++----------
+ src/hb-face.hh    |  2 --
+ src/hb-font.cc    | 46 +++++++++++++++++++---------------------------
+ src/hb-font.hh    |  4 ----
+ src/hb-ft.cc      |  2 +-
+ src/hb-object.hh  | 11 ++++++++---
+ src/hb-unicode.cc | 11 ++++-------
+ src/hb-unicode.hh |  2 --
+ 10 files changed, 42 insertions(+), 66 deletions(-)
+
+commit ee351a38ec0c62b76dd1b3f20fe56cb4d63e62be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 3 14:28:55 2018 -0400
+
+    [object] Add "writable"
+
+ src/hb-object.hh | 14 +++++++++++++-
+ 1 file changed, 13 insertions(+), 1 deletion(-)
+
+commit b8a78ce201608e9ac6d7f77447b2bbef6f09e9ff
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Nov 3 22:28:30 2018 +0330
+
+    [BASE] Improvements (#1347)
+
+ src/hb-ot-layout-base-table.hh | 610
+ ++++++++++++++++++-----------------------
+ src/hb-ot-layout.cc            |  65 ++++-
+ src/hb-ot-layout.h             |  16 --
+ test/api/Makefile.am           |   1 +
+ test/api/fonts/base.ttf        | Bin 0 -> 5596 bytes
+ test/api/test-baseline.c       |  58 ++++
+ 6 files changed, 380 insertions(+), 370 deletions(-)
+
+commit c560ca92512c0283e826c059431273ffecf5d993
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Nov 3 13:03:36 2018 +0330
+
+    [fuzz] A new testcase
+
+ ...uzz-testcase-minimized-hb-shape-fuzzer-5735679418433536 | Bin 0 ->
+ 36 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 34b06d994a79124963d2a7432d0ec945e72bfdbd
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 2 16:40:20 2018 -0700
+
+    fixed FDSelect size calcluation
+
+ src/hb-ot-cff-common.hh                               |   2 +-
+ src/hb-subset-cff-common.cc                           |   6 +++---
+ test/api/fonts/SourceHanSans-Regular.41,3041,4C2E.otf | Bin 2576 ->
+ 3892 bytes
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 481fdfdc23f557400ad3aceeceeab07add78f005
+Merge: 1bc710a8 2840a104
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 2 15:28:09 2018 -0700
+
+    Merge branch 'cff-subset' of https://github.com/harfbuzz/harfbuzz
+    into cff-subset
+
+commit 1bc710a8c94fbe08ca3a3e535c7b6597a57883df
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Nov 2 15:28:01 2018 -0700
+
+    added CFF1 desubr api test cases & bug fixes
+
+ src/hb-cff1-interp-cs.hh                           |   7 --
+ src/hb-ot-cff-common.hh                            |  56 ++++++----
+ src/hb-subset-cff-common.hh                        | 100
+ +++++++++--------
+ src/hb-subset-cff1.cc                              |  53 ++++-----
+ .../fonts/SourceHanSans-Regular.41,3041,4C2E.otf   | Bin 3892 ->
+ 2576 bytes
+ .../SourceHanSans-Regular.41,4C2E.nohints.otf      | Bin 0 -> 2380 bytes
+ ...urceHanSans-Regular.41,4C2E.nosubrs.nohints.otf | Bin 0 -> 2360 bytes
+ .../SourceHanSans-Regular.41,4C2E.nosubrs.otf      | Bin 0 -> 2548 bytes
+ test/api/fonts/SourceHanSans-Regular.41,4C2E.otf   | Bin 2548 ->
+ 2576 bytes
+ test/api/fonts/SourceSansPro-Regular.abc.otf       | Bin 3412 ->
+ 1812 bytes
+ .../api/fonts/SourceSansPro-Regular.ac.nohints.otf | Bin 3228 ->
+ 1592 bytes
+ .../SourceSansPro-Regular.ac.nosubrs.nohints.otf   | Bin 0 -> 1540 bytes
+ .../api/fonts/SourceSansPro-Regular.ac.nosubrs.otf | Bin 0 -> 1632 bytes
+ test/api/fonts/SourceSansPro-Regular.ac.otf        | Bin 3332 ->
+ 1708 bytes
+ test/api/test-subset-cff1.c                        | 122
+ +++++++++++++++++++++
+ 15 files changed, 232 insertions(+), 106 deletions(-)
+
+commit 2c68f34bddbe506d0b22948562f2f59b9a5b6050
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Nov 2 23:06:00 2018 +0200
+
+    [os2] Capitalize table tag and struct
+
+    Other tables follow the case of the OT tag, except this one.
+
+ src/hb-ot-hmtx-table.hh |  6 +++---
+ src/hb-ot-os2-table.hh  | 12 ++++++------
+ src/hb-subset.cc        |  4 ++--
+ 3 files changed, 11 insertions(+), 11 deletions(-)
+
+commit 8034d1dda091998d356e77f249d3c9f50501cc77
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 14:47:42 2018 -0400
+
+    [kern] Implement Format1
+
+    Also, implement backwards kerning for Format1 in kern and kerx.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1350
+
+ src/hb-aat-layout-kerx-table.hh |  11 +++-
+ src/hb-ot-kern-table.hh         | 127
+ ++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 136 insertions(+), 2 deletions(-)
+
+commit 46b3885c1a8ea3b85efbdd1704edcee385797c5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 14:43:38 2018 -0400
+
+    [kern] Set subtable on sanitizer
+
+ src/hb-ot-kern-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 74c7a2c6c892446dcec574986e128967bd570e47
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 14:26:04 2018 -0400
+
+    [kern] Respect more flags
+
+ src/hb-ot-kern-table.hh | 21 +++++++++++++++------
+ 1 file changed, 15 insertions(+), 6 deletions(-)
+
+commit 9f880bad0d7291eaab10d814567c7a680e139c48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 13:57:41 2018 -0400
+
+    [kern] Minor
+
+    We like check_struct() more.
+
+ src/hb-ot-kern-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 04b82b181d06c229a98314c1620d3ae8a2825267
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 13:47:33 2018 -0400
+
+    Remove pointer cast operators from ArrayOf<>
+
+    ArrayOf<>, unlike UnsizedArrayOf<>, has data before the array.
+    This was confusing.  Remove.
+
+ src/hb-open-type.hh | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit f1df441bedaf5b2c7fadf9954ea39616af87702a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 13:26:15 2018 -0400
+
+    [kern] Comment
+
+ src/hb-ot-kern-table.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 095f5add0b1ca39dd09842594b80fae92f0796e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 13:23:54 2018 -0400
+
+    [kern] Push apply loop to each subtable
+
+ src/hb-ot-kern-table.hh | 153
+ ++++++++++++++++++++++++++++++++++++++----------
+ src/hb-ot-layout.cc     |  28 ++++++---
+ src/hb-ot-layout.hh     |   8 ++-
+ src/hb-ot-shape.cc      |   2 +-
+ 4 files changed, 149 insertions(+), 42 deletions(-)
+
+commit 949dad89a81ff5b6ef92e8737962b667249a3f2b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 12:47:55 2018 -0400
+
+    [kern] Remove accelerator
+
+    It wasn't doing anything.
+
+ src/hb-ot-face.hh       |  2 +-
+ src/hb-ot-kern-table.hh | 55
+ ++++++++++++++-----------------------------------
+ src/hb-ot-layout.cc     |  4 ++--
+ 3 files changed, 18 insertions(+), 43 deletions(-)
+
+commit 0382b7184addf5b3723db40a57790e5e62ac1703
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 12:23:26 2018 -0400
+
+    Use as_array in more places
+
+ src/hb-aat-layout-morx-table.hh |  4 ++--
+ src/hb-ot-layout-gsubgpos.hh    | 22 +++++++++++++---------
+ 2 files changed, 15 insertions(+), 11 deletions(-)
+
+commit 91de9dfcf3bba7cbeef1e709679c8e24ab684c97
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 12:14:21 2018 -0400
+
+    Fix &array_of<>
+
+ src/hb-dsalgs.hh    | 3 +++
+ src/hb-open-type.hh | 4 ++--
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 9b7cb137946013592c9a5a9f0a3464fb4613577b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 12:00:55 2018 -0400
+
+    Fixup
+
+ src/hb-dsalgs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6e06fe162ed79bb47f62aae03669cd72b99014a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 11:56:55 2018 -0400
+
+    [kern] Implement Format3
+
+    Untested.
+
+ src/hb-ot-kern-table.hh | 51
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 51 insertions(+)
+
+commit c6ef5dbd5c40cc8934756456221e080012a82530
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 11:51:21 2018 -0400
+
+    Add cast operators to hb_array_t
+
+ src/hb-dsalgs.hh | 21 +++++++++++++--------
+ 1 file changed, 13 insertions(+), 8 deletions(-)
+
+commit 72462eb76584a2892f1d961c90fd289240ea9380
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 11:46:24 2018 -0400
+
+    Add UnsizedArrayOf::as_array() instead of hb_array() template
+
+ src/hb-aat-layout-trak-table.hh |  2 +-
+ src/hb-dsalgs.hh                |  2 --
+ src/hb-open-file.hh             |  2 +-
+ src/hb-open-type.hh             | 11 +++--------
+ src/hb-ot-color-cpal-table.hh   |  6 +++---
+ 5 files changed, 8 insertions(+), 15 deletions(-)
+
+commit 1cf075ecb674cc0c7043bffe2fef5ef187c15335
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 11:38:00 2018 -0400
+
+    Add get_size to UnsizedArrayOf
+
+ src/hb-open-type.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit a4a7a623893fd4c8db3a987d81a1c80243006f1e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 11:16:43 2018 -0400
+
+    [kern] Add buffer message
+
+ src/hb-ot-kern-table.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 0b2870085ddecdde8370eebc7c2bb346b1992b93
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 1 22:43:17 2018 -0700
+
+    removed unused code
+
+ src/hb-cff-interp-common.hh | 18 ------------------
+ 1 file changed, 18 deletions(-)
+
+commit 6186dbf1be4da88d9c4f1ef5cea19fd7779f29ab
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 1 17:25:23 2018 -0700
+
+    added hb_subset_input_set_desubroutinize API
+
+    hooked up with CFF1 subroutinizer
+    a renaming
+
+ src/hb-subset-cff-common.hh |  2 +-
+ src/hb-subset-cff1.cc       |  4 ++--
+ src/hb-subset-input.cc      | 13 +++++++++++++
+ src/hb-subset.h             |  5 +++++
+ util/hb-subset.cc           |  1 +
+ util/options.cc             |  2 +-
+ 6 files changed, 23 insertions(+), 4 deletions(-)
+
+commit b1d0c589154d080ff519c3e80aea923185787b13
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 1 16:33:46 2018 -0700
+
+    removed extraneous ;s
+
+ src/hb-cff-interp-common.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 2840a104c1288af79cbda720afa9e37aec6fb29d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 1 16:18:13 2018 -0700
+
+    tweaks to build with new merge
+
+ src/hb-cff2-interp-cs.hh    | 11 +++++++----
+ src/hb-ot-cff2-table.cc     |  9 +++++----
+ src/hb-ot-cff2-table.hh     |  7 +++----
+ src/hb-subset-cff-common.cc | 12 ++++--------
+ src/hb-subset-cff-common.hh |  3 +--
+ src/hb-subset-cff1.cc       |  3 +--
+ src/hb-subset-cff2.cc       |  3 +--
+ 7 files changed, 22 insertions(+), 26 deletions(-)
+
+commit e600e5440b3b77294df47fae947758137ea02501
+Merge: 82248b92 de96e5c8
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 1 16:13:56 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit de96e5c81c7f473520df93052ecea162baa5a350
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 1 18:13:58 2018 -0400
+
+    [Crap] Avoid operator=
+
+ src/hb-null.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f9353bd68c112dea8962dd586bf5e664f75a2a07
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 1 18:05:22 2018 -0400
+
+    [aat] Rely on vector auto initialization
+
+ src/hb-aat-map.hh | 10 +---------
+ 1 file changed, 1 insertion(+), 9 deletions(-)
+
+commit 5a18d97b35d05c826c242e6847764c2418831a55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 1 18:01:26 2018 -0400
+
+    [aat] Remove unused forward declaration
+
+ src/hb-aat-map.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 82248b9287e7b208c304e761393b745604a51c6e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 1 10:36:50 2018 -0700
+
+    fix leak attempt ^2
+
+ src/hb-subset-cff2.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a9c305c2b00b7e793dc3d8333eee43d677aebd42
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 1 10:31:21 2018 -0700
+
+    fix leaks
+
+ src/hb-subset-cff1.cc | 4 ++--
+ src/hb-subset-cff2.cc | 3 +--
+ 2 files changed, 3 insertions(+), 4 deletions(-)
+
+commit 049ce078e51bebce50b17889f3edae3db3ea39f5
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Nov 1 08:46:21 2018 -0700
+
+    fix bogus width with --no-hinting
+
+ src/hb-cff1-interp-cs.hh | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit 07ec792212063851ee41eae33792d3d90d31e6a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 1 10:31:12 2018 -0400
+
+    Warning fix
+
+ src/test-ot-color.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c32280b30fb3844addda31a0d97ae7cb55ef07d2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 1 15:31:14 2018 +0330
+
+    [ot-layout] minor
+
+ src/hb-ot-layout.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit cad90be4ea56a85ddc084f86f36dd7129850f6d7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 1 13:39:06 2018 +0330
+
+    [test] minor
+
+ test/api/test-ot-color.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit d56e338a903a5a7c4f8ccd0f4d983cd492243ed6
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Oct 31 22:30:34 2018 -0700
+
+    CFF1 no-desubroutinize + no-hinting
+
+    no-desubroutinize option is disabled for now
+    code cleanup (esp. CFF1 width handling)
+    bug fixes & renaming
+
+ src/hb-cff-interp-common.hh      |  49 +++
+ src/hb-cff-interp-cs-common.hh   |  93 +++++-
+ src/hb-cff-interp-dict-common.hh |  45 +--
+ src/hb-cff1-interp-cs.hh         |  66 +++-
+ src/hb-cff2-interp-cs.hh         |   1 +
+ src/hb-ot-cff-common.hh          |  85 ++---
+ src/hb-ot-cff1-table.hh          |  20 +-
+ src/hb-ot-cff2-table.hh          |  25 +-
+ src/hb-subset-cff-common.hh      | 702
+ ++++++++++++++++++++++++++++++++++++---
+ src/hb-subset-cff1.cc            | 242 +++++++++++---
+ src/hb-subset-cff2.cc            |  45 +--
+ src/hb-subset-input.hh           |   1 +
+ src/hb-subset-plan.cc            |   1 +
+ src/hb-subset-plan.hh            |   1 +
+ util/options.cc                  |   2 +
+ util/options.hh                  |   2 +
+ 16 files changed, 1130 insertions(+), 250 deletions(-)
+
+commit 52a00cd87f63c8ab32413a1a9ce792a3e2ec84e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 19:05:53 2018 -0700
+
+    [aat] Implement 'aalt' mapping
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1160
+
+ src/hb-aat-map.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 6e3ea269fa1fe0a3de7a8a13c6e853c91231808e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 19:00:11 2018 -0700
+
+    [aat] Add 'afrc' feature mapping
+
+    https://github.com/harfbuzz/harfbuzz/issues/1342#issuecomment-434829028
+
+ src/hb-aat-layout.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 40b19fd46951e2f9b402e59e1fbbf06fde7ecd61
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 18:51:45 2018 -0700
+
+    [aat] Fallback to old style "Letter Case" small caps
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1342
+
+ src/hb-aat-layout-morx-table.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit f9289319481a1e9762ad366b287e781c44ba9fc6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 18:25:05 2018 -0700
+
+    [test] Minor
+
+ test/shaping/run-tests.py | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit cf203af8a33591c163b63dbdf0fd341bc4606190
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 18:21:48 2018 -0700
+
+    Implement space fallback in vertical direction
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1343
+
+ src/hb-ot-shape-fallback.cc                   | 36
+ +++++++++++++++++++--------
+ test/shaping/data/in-house/tests/spaces.tests | 17 +++++++++++++
+ 2 files changed, 42 insertions(+), 11 deletions(-)
+
+commit e01250230b1ad85e49cc0021365d1ee43feb9855
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 18:14:00 2018 -0700
+
+    [hmtx/vmtx] Fix a crasher
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 36e90ef56e6c0643ef61e947d7361c6fa4eadf10
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 15:09:09 2018 -0700
+
+    [mort] Massage some more
+
+ src/hb-aat-layout-common.hh     | 28 ++++++++++++++++++++++++++++
+ src/hb-aat-layout-morx-table.hh | 21 +++++----------------
+ 2 files changed, 33 insertions(+), 16 deletions(-)
+
+commit cbaff4ef1910e2872bfff61f3d5427c076b3673d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 15:06:12 2018 -0700
+
+    [mort] Some more
+
+ src/hb-aat-layout-morx-table.hh | 34 ++++++++++++++++------------------
+ 1 file changed, 16 insertions(+), 18 deletions(-)
+
+commit 3087046d3144afb50bcc13e4afa2d20d9f71f2c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 14:59:14 2018 -0700
+
+    [mort] Refactor offset-to-index mapping
+
+ src/hb-aat-layout-morx-table.hh | 27 ++++++++++++++++-----------
+ 1 file changed, 16 insertions(+), 11 deletions(-)
+
+commit b9db610add702da0a257db2eb21f3a7fb56682f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 14:22:31 2018 -0700
+
+    Minor
+
+ src/hb-font.cc | 28 ++++++++++++++--------------
+ src/hb-font.h  |  2 +-
+ 2 files changed, 15 insertions(+), 15 deletions(-)
+
+commit 995bf6c6f82d6b2dabcb81e1426910ee82b91b44
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 13:21:33 2018 -0700
+
+    [sbix] Rely on blob->as<> checking size against Type::min_size
+
+ src/hb-ot-color-sbix-table.hh | 6 ------
+ 1 file changed, 6 deletions(-)
+
+commit 4d4e526b5cc703111eb445b7e319a4cd1917489f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 13:19:42 2018 -0700
+
+    Improve blob->as<>
+
+    It's true that blob->as<> should only be called on null or sanitized
+    data.  But this change is safe, so keep it.
+
+ src/hb-blob.hh          | 2 +-
+ src/hb-ot-glyf-table.hh | 3 ++-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 5854d3fa251069f8158b97a831d1439c2ff8b510
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 10:42:49 2018 -0700
+
+    [set] Warning fix with gcc 8.1
+
+    https://github.com/harfbuzz/harfbuzz/pull/1334
+
+ src/hb-dsalgs.hh | 6 ++++--
+ src/hb-set.hh    | 4 ++--
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+commit 850a7af3a419c6c4ab92bff59991758a2951d41f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Oct 31 14:20:23 2018 +0330
+
+    [ot-color-test] Remove the non-working exact strike size storing
+    (#1339)
+
+ src/test-ot-color.cc | 135
+ +++++++++++++++++++++++----------------------------
+ 1 file changed, 62 insertions(+), 73 deletions(-)
+
+commit 2e639c47c9d35ff7dc4dde21f744f9ee695a27f3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Oct 31 14:20:14 2018 +0330
+
+    [aat] Fix older compilers by not referencing enum directly (#1340)
+
+ src/hb-aat-layout-morx-table.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 642c9dcf1b34b51ffdbf88ccbef4762aa12a5cbe
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Oct 31 14:02:37 2018 +0330
+
+    [aat] Minor, remove extra semicolons
+
+ src/hb-aat-layout-morx-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit c962d5e714a6f88c4cb20bed219177b1bc4a2dfd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 01:16:33 2018 -0700
+
+    [mort] Make ligatures work
+
+     ./hb-shape Apple_Chancery_10_12.ttf  "Th th ll te to tr fr fu fj"
+    [T_h=0+2308|space=2+569|t_h=3+1687|space=5+569|l_l=6+1108|space=8+569|t_e=9+1408|space=11+569|t_o=12+1531|space=14+569|t_r=15+1385|space=17+569|f_r=18+1432|space=20+569|f_u=21+1733|space=23+569|f_j=24+1098]
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1331
+
+ src/hb-aat-layout-morx-table.hh | 25 +++++++++++++++++--------
+ 1 file changed, 17 insertions(+), 8 deletions(-)
+
+commit c07798960004439fcd8fa0f4ae33e225428d1065
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 00:36:03 2018 -0700
+
+    [mort] More Ligature work
+
+ src/hb-aat-layout-morx-table.hh | 54
+ ++++++++++++++++++++++++++++++-----------
+ 1 file changed, 40 insertions(+), 14 deletions(-)
+
+commit 431c6e496be56e441ee4b9b705f40a1246bdd0d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 00:15:00 2018 -0700
+
+    [mort] Some Ligature work
+
+ src/hb-aat-layout-morx-table.hh | 38
+ +++++++++++++++++++++++++++++++-------
+ 1 file changed, 31 insertions(+), 7 deletions(-)
+
+commit 28b68cffe4e5ebf82217ebf439f428431d672af3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 23:33:30 2018 -0700
+
+    [mort] Implement / adjust Contextual substitution
+
+ src/hb-aat-layout-morx-table.hh | 70
+ ++++++++++++++++++++++++++++++-----------
+ src/hb-open-type.hh             |  7 +++++
+ 2 files changed, 59 insertions(+), 18 deletions(-)
+
+commit 11dbf0f12926b80d0c308c70a218342280045c23
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 21:49:59 2018 -0700
+
+    [mort] More fixes]
+
+ src/hb-aat-layout-common.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit e1552af95b6c17571f7ee58ebac92f48d93c8f98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 21:09:05 2018 -0700
+
+    [maxp] Minor
+
+ src/hb-ot-maxp-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0cf282a32e5b0fe1fec454ff293ffe04b33f1112
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 20:51:44 2018 -0700
+
+    [mort] Grind some more
+
+ src/hb-aat-layout-common.hh | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+commit 90667b31bc3e61e68e27966e4781aba456c6b93b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 20:15:28 2018 -0700
+
+    [mort] Hook up more
+
+ src/hb-aat-layout.cc | 14 +++++++++++++-
+ 1 file changed, 13 insertions(+), 1 deletion(-)
+
+commit 9346b1f158dfd7d25ed0057b40aaa6980a85ea17
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 20:04:13 2018 -0700
+
+    [morx] Remove stale comment
+
+ src/hb-aat-layout-morx-table.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit f864ef215e1354a1e5a3c8796afafba761404e08
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 19:42:21 2018 -0700
+
+    [mort] More massaging towards mort
+
+ src/hb-aat-layout-morx-table.hh | 53
+ +++++++++++++++++++++--------------------
+ 1 file changed, 27 insertions(+), 26 deletions(-)
+
+commit 2d9467340b1498ccc0cd47bf915b84ab12dfa025
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 19:33:31 2018 -0700
+
+    [mort] Fix version check in sanitize
+
+ src/hb-aat-layout-morx-table.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit c2527a1bc2b493473f06ea6ae79f0a87b722c4d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 19:26:16 2018 -0700
+
+    [mort] Make it compile / hook it up
+
+    Untested.
+
+ src/hb-aat-layout-common.hh     | 11 +++++-----
+ src/hb-aat-layout-morx-table.hh |  2 +-
+ src/hb-aat-layout.cc            | 47
+ ++++++++++++++++++++++++++---------------
+ 3 files changed, 36 insertions(+), 24 deletions(-)
+
+commit 933babdc075c27fbcc1b726c3c9b2aa67338c6ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 19:22:43 2018 -0700
+
+    [mort] Fixup on previous commit
+
+ src/hb-aat-layout-morx-table.hh | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit b053cabacd99ff69144a1459fe02ffd574c2416c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 30 18:41:34 2018 +0330
+
+    [mort] Bring back mort generalizations
+
+    Started by reverting
+    https://github.com/harfbuzz/harfbuzz/commit/1f1c85a5
+
+    Just a starting point, if we agree even mort can come back.
+
+ src/hb-aat-layout-common.hh     |  76 +++++++++++++++++++----
+ src/hb-aat-layout-kerx-table.hh |  17 ++---
+ src/hb-aat-layout-morx-table.hh | 133
+ ++++++++++++++++++++++++----------------
+ src/hb-aat-layout.cc            |  16 ++++-
+ src/hb-ot-face.hh               |   1 +
+ 5 files changed, 171 insertions(+), 72 deletions(-)
+
+commit 5cd544a621f10b307bb97aea27ea54e55aacb2e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 19:16:00 2018 -0700
+
+    Fix build
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1338
+
+ src/test-ot-color.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 69297bb21640677532b7030332f803c0768c6579
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 19:06:21 2018 -0700
+
+    [fuzzing] Call hb-ot-color API
+
+ test/fuzzing/hb-shape-fuzzer.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 1019391046cf01524c4ef20c9256a47b7411610b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 15:52:26 2018 -0700
+
+    2.1.0
+
+ NEWS                   | 81
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ RELEASING.md           |  3 +-
+ configure.ac           |  2 +-
+ docs/harfbuzz-docs.xml |  1 +
+ src/hb-ot-color.cc     | 22 +++++++++-----
+ src/hb-ot-color.h      |  4 +--
+ src/hb-version.h       |  6 ++--
+ 7 files changed, 105 insertions(+), 14 deletions(-)
+
+commit bfd549daaa078e7edba5a65971b1d3e872664f2d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 14:47:27 2018 -0700
+
+    Fix everything-bot
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0e1ad5a075c6858ca60bad0e2da58b5256e15815
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Oct 30 11:29:58 2018 -0700
+
+    [subset] Limit the number of scripts and langsys' that should be
+    checked when collecting features.
+
+ src/hb-ot-layout-common.hh |  8 ++++++++
+ src/hb-ot-layout.cc        | 11 ++++++++++-
+ 2 files changed, 18 insertions(+), 1 deletion(-)
+
+commit a7aba99baab2d6e6105675ceedbe22222fa0f166
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 14:04:09 2018 -0700
+
+    [name] Rename hb_name_id_t to hb_ot_name_id_t
+
+    https://github.com/harfbuzz/harfbuzz/pull/1254
+
+ docs/harfbuzz-sections.txt    |  3 +-
+ src/hb-ot-color-cpal-table.hh | 12 +++---
+ src/hb-ot-color.cc            |  6 +--
+ src/hb-ot-color.h             |  4 +-
+ src/hb-ot-layout.cc           | 44 +++++++++----------
+ src/hb-ot-layout.h            | 28 ++++++-------
+ src/hb-ot-name-table.hh       |  6 +--
+ src/hb-ot-name.cc             | 38 ++++++++---------
+ src/hb-ot-name.h              | 98
+ +++++++++++++++++++++----------------------
+ test/api/test-ot-color.c      | 30 ++++++-------
+ test/api/test-ot-name.c       |  8 ++--
+ 11 files changed, 139 insertions(+), 138 deletions(-)
+
+commit 881e1054bc66fd07489d661dd5c3f84a5d077edc
+Author: Simon Tooke <stooke@redhat.com>
+Date:   Tue Oct 30 14:16:23 2018 -0400
+
+    fix various GCC function pointer warnings
+
+ src/hb-debug.hh | 6 +++---
+ src/hb-set.hh   | 4 ++--
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit dc9bd29feac6675c79343b88a06f03f356f9175b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 13:16:07 2018 -0700
+
+    [CBDT] Implement Format18 get_extens
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1327
+
+ src/hb-ot-color-cbdt-table.hh | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit a2a7422aaf47dd43c2c55ad48dd15513f9d5b081
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 13:14:56 2018 -0700
+
+    [CBDT] Bound checks in reference_png
+
+ src/hb-ot-color-cbdt-table.hh | 57
+ ++++++++++++++++++++++++++-----------------
+ 1 file changed, 34 insertions(+), 23 deletions(-)
+
+commit f236f790884d7b5c7afb73768724c360d4ea5212
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Tue Oct 30 11:24:56 2018 -0500
+
+    Docs Makefile: sync SGML list to harfbuzz-docs.xml include
+    list. Hopefully fixes distcheck failure.
+
+ docs/Makefile.am | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 9f4b375e396fe65b30c792b9524a732da0b477d1
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon Oct 29 17:10:53 2018 -0500
+
+    Usermanual: minor wording updates, build fixes.
+
+ ...rmanual-buffers-language-script-and-direction.xml |  8 +++++++-
+ docs/usermanual-clusters.xml                         |  6 ++++++
+ docs/usermanual-fonts-and-faces.xml                  |  8 +++++++-
+ docs/usermanual-getting-started.xml                  |  6 ++++++
+ docs/usermanual-glyph-information.xml                |  8 +++++++-
+ docs/usermanual-install-harfbuzz.xml                 | 20
+ +++++++++++++++++---
+ docs/usermanual-opentype-features.xml                |  8 +++++++-
+ docs/usermanual-shaping-concepts.xml                 |  6 ++++++
+ docs/usermanual-what-is-harfbuzz.xml                 | 12 +++++++-----
+ 9 files changed, 70 insertions(+), 12 deletions(-)
+
+commit e110032b914db9f417cc152b2beb51cda0a91dd7
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon Oct 29 16:42:59 2018 -0500
+
+    Usermanual: update DTD in chapter XML to avoid HTML entity parsing
+    errors.
+
+ docs/usermanual-what-is-harfbuzz.xml | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit 01400f7425f7aec852f39ebee17aa502a74025fb
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sat Oct 20 17:21:49 2018 +0100
+
+    Usermanual; minor wording changes.
+
+ docs/usermanual-getting-started.xml  | 14 +++++++-------
+ docs/usermanual-install-harfbuzz.xml | 10 +++++++++-
+ docs/usermanual-what-is-harfbuzz.xml | 31 ++++++++++---------------------
+ 3 files changed, 26 insertions(+), 29 deletions(-)
+
+commit e89f43dc0884cb4a73beff86e49b7bd8565a01f1
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Oct 20 16:12:45 2018 +0100
+
+    Minor; rewording unsafe-to-break note.
+
+    Co-Authored-By: n8willis <nwillis@glyphography.com>
+
+ docs/usermanual-getting-started.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ccdfb634382596a6114380c72f2f344b1af23f94
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Oct 20 15:46:04 2018 +0100
+
+    Trivial; typo.
+
+    Co-Authored-By: n8willis <nwillis@glyphography.com>
+
+ docs/usermanual-what-is-harfbuzz.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 722099487be72346e7109872b6abf30696f3b7c3
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Oct 20 15:45:24 2018 +0100
+
+    Minor; simplify example code
+
+    Co-Authored-By: n8willis <nwillis@glyphography.com>
+
+ docs/usermanual-getting-started.xml | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 6e4dd58a4af003eeec93cbe90d1258d91a38b53c
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Oct 20 15:44:51 2018 +0100
+
+    Minor: simplify example code
+
+    Co-Authored-By: n8willis <nwillis@glyphography.com>
+
+ docs/usermanual-getting-started.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f9ee0deceebd8952a8d80f3fd7b264b33e70f703
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Oct 20 15:41:00 2018 +0100
+
+    Minor; drop 'OpenType' from sentence
+
+    Co-Authored-By: n8willis <nwillis@glyphography.com>
+
+ docs/usermanual-what-is-harfbuzz.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f028da59d902c39e61021b48fc73f2821a9f3be2
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sat Oct 20 15:18:29 2018 +0100
+
+    Minor.
+
+ docs/harfbuzz-docs.xml | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit ed5547f828fe7559cc3331f05780ae9f041b1e0f
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Oct 20 15:00:52 2018 +0100
+
+    Use 'glyphs' instead of 'text'
+
+    Co-Authored-By: n8willis <nwillis@glyphography.com>
+
+ docs/harfbuzz-docs.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 236285545b5da8513f2b61fc8066ba78308a555a
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Wed Oct 17 10:10:48 2018 -0500
+
+    Docs: minor, update Makefile w new file name.
+
+ docs/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 163ab81ab0f4000d968cc55b418402497e605e6c
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Tue Oct 16 17:48:15 2018 -0500
+
+    Docs: rename Hello HarfBuzz to Getting Started.
+
+ docs/harfbuzz-docs.xml                                                 |
+ 2 +-
+ docs/{usermanual-hello-harfbuzz.xml => usermanual-getting-started.xml}
+ | 0
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 9e7efa3f47557a77852a15d89619787fd9933ed1
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Tue Oct 16 17:46:03 2018 -0500
+
+    Docs: usermanual, add API Overview to Hello HarfBuzz chapter. Start
+    Terminology section.
+
+ docs/usermanual-hello-harfbuzz.xml | 309
+ +++++++++++++++++++++++++------------
+ 1 file changed, 212 insertions(+), 97 deletions(-)
+
+commit 3a27e8fb97f716c17b03e3a4a634a4900bcb6045
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Fri Oct 12 18:23:26 2018 -0500
+
+    Docs: usermanual, add Shaping Concepts chapter.
+
+ docs/harfbuzz-docs.xml               |   5 +-
+ docs/usermanual-shaping-concepts.xml | 368
+ +++++++++++++++++++++++++++++++++++
+ 2 files changed, 371 insertions(+), 2 deletions(-)
+
+commit 9aa865dcc68ec207741e07ba3f7aacf4ac750c1c
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Fri Oct 12 18:22:41 2018 -0500
+
+    Docs: usermanual, minor cleanup to What Is HarfBuzz chapter.
+
+ docs/usermanual-what-is-harfbuzz.xml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 443f87213272be5ae0579dce4749b2036dfe3815
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Thu Oct 11 15:40:08 2018 -0500
+
+    Docs: move harfbuzz-ng-vs-old discussion down below the TOC; put
+    in note.
+
+ docs/harfbuzz-docs.xml | 63
+ ++++++++++++++++++++++++++++++++++----------------
+ 1 file changed, 43 insertions(+), 20 deletions(-)
+
+commit 792af5d254fddcdc4292dffb76b81d65754e65a9
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Thu Oct 11 14:05:59 2018 -0500
+
+    Docs: flesh out config options in Usermanual:Install chapter.
+
+ docs/usermanual-install-harfbuzz.xml | 108
+ +++++++++++++++++++++++++++--------
+ 1 file changed, 85 insertions(+), 23 deletions(-)
+
+commit 325e2745cfa55f9ef114ee8eeaf7bd8176743822
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Wed Oct 10 17:01:21 2018 -0500
+
+    Docs: add basic config-options section to Usermanual Installation
+    chapter.
+
+ docs/usermanual-install-harfbuzz.xml | 132
+ ++++++++++++++++++++++++++++++++++-
+ 1 file changed, 131 insertions(+), 1 deletion(-)
+
+commit 97c1c46cd2241d77b531a582dd1a2432af976357
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Wed Oct 10 16:38:22 2018 -0500
+
+    Docs: update and linearize build instructions; add installation
+    overview material.
+
+ docs/usermanual-install-harfbuzz.xml | 229
+ ++++++++++++++++++++++++++++-------
+ 1 file changed, 188 insertions(+), 41 deletions(-)
+
+commit 088755f9e654d2ec638dce0c68d523084b9eaf5a
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Wed Oct 10 16:37:29 2018 -0500
+
+    Docs: update usermanual What Is HarfBuzz material.
+
+ docs/usermanual-what-is-harfbuzz.xml | 220
+ +++++++++++++++++++++++++++--------
+ 1 file changed, 172 insertions(+), 48 deletions(-)
+
+commit 0956ab41851d30f50c39c28730cf30ea0bbc5466
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Fri Sep 28 17:15:59 2018 -0500
+
+    Docs: Move What-HarfBuzz-doesnt-do to Usermanual-what-is-HarfBuzz.
+
+ docs/usermanual-hello-harfbuzz.xml   |  98
+ +++------------------------------
+ docs/usermanual-what-is-harfbuzz.xml | 101
+ +++++++++++++++++++++++++++++++++--
+ 2 files changed, 104 insertions(+), 95 deletions(-)
+
+commit fd270beedb331c4685e918f5a3ef5789a23ffaeb
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Fri Sep 28 16:36:38 2018 -0500
+
+    Docs: Usermanual- What is HarfBuzz; add intro to shaping concepts.
+
+ docs/usermanual-what-is-harfbuzz.xml | 51
+ ++++++++++++++++++++++++++++++++++++
+ 1 file changed, 51 insertions(+)
+
+commit d9fd92721002726c4aeaae9cc3a519a41f694e48
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Fri Sep 28 16:07:37 2018 -0500
+
+    Docs: update Usermanual-What Is HarfBuzz.
+
+ docs/usermanual-what-is-harfbuzz.xml | 199
+ +++++++++++++++++++++++------------
+ 1 file changed, 130 insertions(+), 69 deletions(-)
+
+commit 0af3d176a64c0a57c7acb2a64ce8b9d08f449241
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Oct 30 17:05:28 2018 +0200
+
+    [sbix] Fix memory leak in early return
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11210
+
+ src/hb-ot-color-sbix-table.hh                             |   3 +++
+ ...zz-testcase-minimized-hb-shape-fuzzer-5768601332613120 | Bin 0 ->
+ 108 bytes
+ 2 files changed, 3 insertions(+)
+
+commit edaa768253cfeb97d614537253f90d47aa93ff6f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 01:35:58 2018 -0700
+
+    [util] Use fgets instead of getline such that windows passes
+
+ util/hb-shape.cc | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit 56738429d667f6c35e5c7af30b51604fc133c23c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 01:33:22 2018 -0700
+
+    [test] Fix warnings
+
+ test/api/test-ot-tag.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 138f9e0f25752bbf7f8e867f230ca91442f40028
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 01:31:13 2018 -0700
+
+    Minor
+
+ src/hb-machinery.hh | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit 83a612739accf6b0f2e1cb1be15097402f7ecf33
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 01:24:23 2018 -0700
+
+    [util] Minor
+
+ util/options.cc | 6 ------
+ util/options.hh | 8 ++------
+ 2 files changed, 2 insertions(+), 12 deletions(-)
+
+commit 64e41d2c89c533f554e49ffbd18e6653a70ab999
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 01:08:34 2018 -0700
+
+    [test] Fix Python3
+
+ test/shaping/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f7a08cd41df1ff3e44aa838306218ae0565b7273
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 30 11:29:09 2018 +0330
+
+    Fix extra semicolon issues and test that on CI (#1330)
+
+ .circleci/config.yml         |  2 +-
+ src/hb-machinery.hh          | 16 ++++++++--------
+ src/hb-ot-layout-common.hh   |  6 +++---
+ src/hb-ot-layout-gsubgpos.hh |  2 +-
+ src/hb.hh                    |  2 +-
+ util/options.hh              |  2 +-
+ 6 files changed, 15 insertions(+), 15 deletions(-)
+
+commit 422debb830fe150c26e1628f77531f41f0871325
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 00:51:43 2018 -0700
+
+    [test/shaping] Spawn one hb-shape per test file
+
+    Speeds up runnings in-house tests from over 20s to 2s.
+
+ test/shaping/run-tests.py | 32 ++++++++++++--------------------
+ 1 file changed, 12 insertions(+), 20 deletions(-)
+
+commit 58e20f53bf61244e3eef09be8ebed60aaf52fb11
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 00:50:18 2018 -0700
+
+    [util] Add hb-shape --batch
+
+ util/hb-shape.cc | 30 ++++++++++++++++++++++++++++++
+ 1 file changed, 30 insertions(+)
+
+commit 6131fb6283cff87333db14b9b32e92be6139c3d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 30 00:38:01 2018 -0700
+
+    [util] Don't close stdin/stdout
+
+ util/options.cc | 6 ++++++
+ util/options.hh | 8 ++++++--
+ 2 files changed, 12 insertions(+), 2 deletions(-)
+
+commit 7e998d193a1429b42bb69582f9e5738aa6fd1a72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 23:31:42 2018 -0700
+
+    Fix spurious warning re uninitialized use
+
+ src/hb-ot-layout-common.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1b7bfb5e1864fc355715b536faac6693b5ce0218
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 30 10:19:40 2018 +0330
+
+    [cmake] Make build of tests and subset optional (#1329)
+
+ .circleci/config.yml |  2 +-
+ CMakeLists.txt       | 19 ++++++-------------
+ 2 files changed, 7 insertions(+), 14 deletions(-)
+
+commit b186274362725b7501211c2a782c1a0badd57107
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 23:21:14 2018 -0700
+
+    [set/map] Fix uninitialized memory
+
+    I keep forgetting that primitive types are NOT initialized during
+    construction. :|
+
+ src/hb-map.hh    | 4 ++--
+ src/hb-object.hh | 1 +
+ src/hb-set.hh    | 4 ++--
+ 3 files changed, 5 insertions(+), 4 deletions(-)
+
+commit ad3cededdd5ee6a364161e9d27e4cf4d95a80177
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 22:53:16 2018 -0700
+
+    [fuzzing] Make test runners less verbose
+
+ test/fuzzing/run-shape-fuzzer-tests.py  | 3 ++-
+ test/fuzzing/run-subset-fuzzer-tests.py | 1 -
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 4ef671f25f38895e3f87cd69687670c3d8ea4600
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 22:46:19 2018 -0700
+
+    [unicode] Fix a long-standing double-declaration warning
+
+ src/hb-unicode.cc | 31 +++++++------------------------
+ 1 file changed, 7 insertions(+), 24 deletions(-)
+
+commit 166ae8b0aa3b1e7298a1bbb872647cb352a0f924
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 22:40:37 2018 -0700
+
+    Remove now unused hb_auto_t<>
+
+ src/hb-dsalgs.hh | 20 --------------------
+ 1 file changed, 20 deletions(-)
+
+commit 56e0fd345c4e68753123a05cd80291e933d71061
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 22:35:44 2018 -0700
+
+    Remove last use of hb_auto_t<>
+
+ src/hb-ot-cmap-table.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit ca5e5a4979fa4aca873ba986e60b3010aaf0b1de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 22:30:21 2018 -0700
+
+    Port Coverage::Iter off hb_auto_t<>
+
+ src/hb-ot-layout-common.hh     |  4 +---
+ src/hb-ot-layout-gpos-table.hh |  2 +-
+ src/hb-ot-layout-gsub-table.hh | 26 +++++++++++++-------------
+ src/hb-ot-layout-gsubgpos.hh   |  8 ++++----
+ 4 files changed, 19 insertions(+), 21 deletions(-)
+
+commit 3a4e5dd425a2a37ff4c37db953943386c0b6e5d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 18:05:25 2018 -0700
+
+    Remove a few unnecessary hb_auto_t<>'s
+
+    See a85641446c30247c4e948263f0f8c1147ed4efb9
+
+ src/hb-coretext.cc             |  8 ++++----
+ src/hb-ot-cmap-table.hh        |  6 ++----
+ src/hb-ot-layout-gsub-table.hh |  8 ++++----
+ src/hb-ot-layout-gsubgpos.hh   |  2 +-
+ src/hb-ot-layout.cc            | 10 +++++-----
+ src/hb-subset-plan.cc          |  2 +-
+ src/hb-subset.cc               |  2 +-
+ src/hb-uniscribe.cc            | 12 ++++++------
+ 8 files changed, 24 insertions(+), 26 deletions(-)
+
+commit 67a22f377dee0dbd89f301f0a1fec6f787867b5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 17:37:41 2018 -0700
+
+    [set/map/vector] Make constructable, but not copy or assignable
+
+    Disable copy/assign on them, as they shouldn't.
+
+    Make constructor / destructor call init_shallow/fini_shallow,
+    and make those idempotent.  So, these three can be constructed
+    on stack now and no init/fini call is needed.  As such,
+    hb_auto_t<> is not needed anymore.  I'll remove that separately.
+
+ src/hb-map.hh    |  6 ++++++
+ src/hb-set.hh    |  5 +++++
+ src/hb-vector.hh | 37 ++++++++++++++++++++-----------------
+ src/hb.hh        | 12 ++++++++++++
+ 4 files changed, 43 insertions(+), 17 deletions(-)
+
+commit ea0e51d1b161245aaf5ad0f844bb5316b1cbcd5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 16:00:23 2018 -0700
+
+    Add HB_NO_CREATE_COPY_ASSIGN
+
+ src/hb-open-type.hh | 10 +++++-----
+ src/hb.hh           | 15 +++++++++------
+ 2 files changed, 14 insertions(+), 11 deletions(-)
+
+commit 5b563640b2df5b100130c9901b666713b2e1767e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 15:58:44 2018 -0700
+
+    Remove HB_DISALLOW_COPY_AND_ASSIGN from hb_ot_shape_planner_t
+
+    It was arbitrary that this struct had it and not dozens of others.
+
+ src/hb-ot-shape.hh | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 14b353c1852be64db244f84bf5e95b4b7f3e65b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 15:29:13 2018 -0700
+
+    One more iteration
+
+ src/hb.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit c7c5df9ffd4f7bcc84a9a02a565ccc1807cca529
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 15:16:52 2018 -0700
+
+    Try fixing older bots
+
+    Older C++ doesn't allow struct-with-constructor in union.
+
+ src/hb.hh | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+commit be87959a67b8ccf2b21d3cfdb7d16202f18df670
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 15:16:38 2018 -0700
+
+    [cmap] Minor
+
+ src/hb-ot-cmap-table.hh | 16 ++--------------
+ 1 file changed, 2 insertions(+), 14 deletions(-)
+
+commit 35d410f2bad62e98f3634c5ee156d0aea9031067
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 14:45:44 2018 -0700
+
+    Remove ASSERT_POD
+
+    Newer compilers / language allows structs with constructor in union.
+    So, this was not actually testing anything.  Indeed, the recent
+    change in DISALLOW_COPY *is* making some of our types non-POD.
+    That broke some bots.
+
+    Just remove this since it wasn't doing much, and I'd rather have
+    DISALLOW_COPY.
+
+ src/hb-blob.hh                             |  1 -
+ src/hb-buffer.hh                           |  1 -
+ src/hb-face.hh                             |  1 -
+ src/hb-font.hh                             |  2 --
+ src/hb-machinery.hh                        |  5 +----
+ src/hb-object.hh                           |  6 +-----
+ src/hb-ot-shape-complex-arabic-fallback.hh |  2 --
+ src/hb-ot-shape-complex-arabic.cc          |  2 --
+ src/hb-ot-shape-complex-hangul.cc          |  2 --
+ src/hb-ot-shape-complex-indic.cc           |  2 --
+ src/hb-ot-shape-complex-khmer.cc           |  2 --
+ src/hb-ot-shape-complex-use.cc             |  2 --
+ src/hb-set-digest.hh                       |  4 ----
+ src/hb-shape-plan.hh                       |  1 -
+ src/hb-subset-input.hh                     |  1 -
+ src/hb-subset-plan.hh                      |  1 -
+ src/hb-unicode.hh                          |  1 -
+ src/hb.hh                                  | 26
+ --------------------------
+ 18 files changed, 2 insertions(+), 60 deletions(-)
+
+commit 6f0454e176efdb8b99c8aa59b5ad765ca455b8d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 13:51:15 2018 -0700
+
+    Fix extra-semicolon warnings
+
+ src/hb-machinery.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit a256a92b3fbb72487cf073a63e646eab952b42ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 11:25:35 2018 -0700
+
+    Make Array types uncopyable-unassignable
+
+    Finally!  Catches hard-to-find errors like this:
+
+    -    const SortedArrayOf<SVGDocumentIndexEntry> docs =
+    this+svgDocEntries;
+    +    const SortedArrayOf<SVGDocumentIndexEntry> &docs =
+    this+svgDocEntries;
+
+    We implement this for our array types.  This, in turn, trickles down
+    into all types that embed the arrays.  So, as long as we define all
+    open-ended structs in terms of Array types (all can be done using
+    UnsizedArrayOf), this achieves the goal of making uncopyable all
+    structs that are variable-sized.  Yay!
+
+ src/hb-open-type.hh | 11 +++++++++++
+ src/hb.hh           |  6 ++++++
+ 2 files changed, 17 insertions(+)
+
+commit 31cc1f74b7028ef88fa0e93e7f12166c7e06de8e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 11:14:37 2018 -0700
+
+    [svg] Minor
+
+ src/hb-ot-color-svg-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 1366bb9760d0f171f8f655e5739e74dfd2537652
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 11:01:25 2018 -0700
+
+    Fix g-i warnings
+
+ src/hb-ot-color.h | 4 +++-
+ src/hb-ot-name.cc | 4 ++--
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit ae802c2c6e001492f8f639e4c24546f0e21d86c7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 29 13:42:14 2018 +0330
+
+    [test-ot-color] Minor
+
+ src/test-ot-color.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7170e35096f0afd084be1350d080695c70c65d40
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 29 13:11:01 2018 +0330
+
+    Rename deprecated symbols list file name and clean it up (#1328)
+
+ src/Makefile.am      | 6 +++---
+ src/gen-def.py       | 9 ++++-----
+ test/api/Makefile.am | 2 +-
+ 3 files changed, 8 insertions(+), 9 deletions(-)
+
+commit 1dfe964378e97e45eedf9db9b9a7f675fe38c0bf
+Merge: f10252b4 9c692e5b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 29 12:34:33 2018 +0330
+
+    Merge pull request #1326 from ebraminio/test-ot-color
+
+    Revive and rename dump-emoji to test-ot-color but use public APIs
+    instead
+
+commit 9c692e5b8d195d8e82538594d89865c609d708f3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 29 11:36:11 2018 +0330
+
+    [test-ot-color] Use public APIs on the tool
+
+ src/Makefile.am      |   9 +++
+ src/test-ot-color.cc | 184
+ +++++++++++++++++++++++++++++----------------------
+ 2 files changed, 113 insertions(+), 80 deletions(-)
+
+commit fb525f8943b43fe241424c93461bee2b94af28e3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 29 09:43:17 2018 +0330
+
+    Rename dump-emoji to test-ot-color
+
+ src/{dump-emoji.cc => test-ot-color.cc} | 0
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 81bcf47e9ea7eb447ff95ce48ecbc5c4439cb53f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 29 09:40:39 2018 +0330
+
+    Revive dump-emoji
+
+ src/dump-emoji.cc | 322
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 322 insertions(+)
+
+commit f10252b4b637b4aa0b74bb75963ae1e1a41b5b9f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 29 10:29:58 2018 +0330
+
+    [svg] Fix incorrect array referencing
+
+ src/hb-ot-color-svg-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5eb251aab041d89b06b0d3f65906ff6712608263
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 23:16:13 2018 -0700
+
+    [cbdt] Implement strike selection logic
+
+ src/hb-ot-color-cbdt-table.hh | 25 ++++++++++++++++++++-----
+ 1 file changed, 20 insertions(+), 5 deletions(-)
+
+commit 98bddbc8ef3330bc5635f6255e6b9c16593a1934
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 23:14:15 2018 -0700
+
+    [sbix] Minor
+
+ src/hb-ot-color-sbix-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 8cffee0577284839a24d9fb863206886d2373974
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 23:07:59 2018 -0700
+
+    [cbdt] Simplify more
+
+ src/hb-ot-color-cbdt-table.hh | 22 +++++++---------------
+ 1 file changed, 7 insertions(+), 15 deletions(-)
+
+commit 574579d3766b7b42e62495cb9a98f3ffd91079e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 23:04:37 2018 -0700
+
+    [color] Rename get_strike() to choose_strike()
+
+ src/hb-ot-color-cbdt-table.hh |  8 ++++----
+ src/hb-ot-color-sbix-table.hh | 10 +++++-----
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 0aa90271fdbb2b85389cd5af029b6d4468fb8146
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 23:03:20 2018 -0700
+
+    [tests] Fix for recent rounding change in CBDT
+
+ test/shaping/data/in-house/tests/color-fonts.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e2ba96da4c39ba5fe941bf2704c1e7cc5f98034f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 23:01:57 2018 -0700
+
+    [cbdt] Refactor get_strike()
+
+ src/hb-ot-color-cbdt-table.hh | 39
+ ++++++++++++++++-----------------------
+ src/hb-ot-color.cc            |  2 +-
+ 2 files changed, 17 insertions(+), 24 deletions(-)
+
+commit 6983cca9c865752fe0a9a065f9b0278b686c3abc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 22:46:18 2018 -0700
+
+    [cbdt] Minor
+
+ src/hb-ot-color-cbdt-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e998fb9fbfbd79b476d758238af60f6a4ddff20c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 22:45:53 2018 -0700
+
+    [color] Round extents when scaling
+
+ src/hb-ot-color-cbdt-table.hh | 12 +++++++-----
+ src/hb-ot-color-sbix-table.hh | 12 ++++++------
+ 2 files changed, 13 insertions(+), 11 deletions(-)
+
+commit c929ccfcea18c5c35d6d41ae921845eeffba978a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 29 08:41:13 2018 +0330
+
+    [ot-color/png] Consider strike ppem on scaling
+
+ src/hb-ot-color-cbdt-table.hh |  5 +++--
+ src/hb-ot-color-sbix-table.hh | 23 +++++++++++++++++++----
+ src/hb-ot-color.cc            |  2 +-
+ src/hb-ot-font.cc             |  2 +-
+ test/api/test-ot-color.c      |  4 ++--
+ 5 files changed, 26 insertions(+), 10 deletions(-)
+
+commit a8c9facf7a73cca39e3fed1f637db4858e64414a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 18:32:37 2018 -0700
+
+    [svg] Cosmetic
+
+ src/hb-ot-color-svg-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9c1460e5685448ad4eac8faff9f05e456f87ed28
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 18:29:14 2018 -0700
+
+    [svg] Use SortedArrayOf.bsearch
+
+ src/hb-ot-color-svg-table.hh | 18 +++---------------
+ 1 file changed, 3 insertions(+), 15 deletions(-)
+
+commit 18dd6363a5021cfd770b431a6320386f94447674
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 18:26:49 2018 -0700
+
+    [svg] Minor
+
+ src/hb-ot-color-svg-table.hh | 23 +++++++++++------------
+ 1 file changed, 11 insertions(+), 12 deletions(-)
+
+commit 4876c938a20af356988d566ba95472d3bcbb133d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 18:01:25 2018 -0700
+
+    [sbix] Comment
+
+ src/hb-ot-color-sbix-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 519fca101466283ca5c993dec2ec2c6891d8add5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 16:32:20 2018 -0700
+
+    [color] Minor
+
+ src/hb-ot-color.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e8ff27c2082ffcf3bd213e7a77d823dc1809857e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 16:29:09 2018 -0700
+
+    Minor
+
+ src/hb-open-type.hh        | 6 ++++--
+ src/hb-ot-layout-common.hh | 4 ++--
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+commit 65621723815138150e8a6354413ed14d53cf35b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 16:27:18 2018 -0700
+
+    [sbix] Use LOffsetLArrayOf<>
+
+ src/hb-open-type.hh           | 2 ++
+ src/hb-ot-color-sbix-table.hh | 2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit a3ddd8067f266e49d9451c53a0fd40aff8551af7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 16:26:03 2018 -0700
+
+    [sbix] Add get_strike
+
+ src/hb-ot-color-sbix-table.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 95524ed9bccdcd0d6a46c5dcc372e96a0c34b5f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:58:48 2018 -0700
+
+    [sbix] Remove sbix_len
+
+ src/hb-ot-color-sbix-table.hh | 29 +++++++++++++++++++++--------
+ 1 file changed, 21 insertions(+), 8 deletions(-)
+
+commit 69e9846452f829f82f6866a683845167b3d3d6e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:53:11 2018 -0700
+
+    [sbix] Fix get_glyph_blob() on Null object
+
+ src/hb-ot-color-sbix-table.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 4e0ee2af091634198c4b9b17036d9391a4e6b084
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:44:40 2018 -0700
+
+    [sbix] Simplify ppem access
+
+    If struct members are simple and needed publicly, we make them public.
+
+ src/hb-ot-color-sbix-table.hh | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+commit 6ac9a4eaa3a47c9b9f2c7aa123255e82ccc53551
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:43:54 2018 -0700
+
+    [sbix] Simplify glyph_length calc
+
+ src/hb-ot-color-sbix-table.hh | 22 +++++-----------------
+ 1 file changed, 5 insertions(+), 17 deletions(-)
+
+commit 0730d623854dc17ce0c3f1f2755a90b656c8e52c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:38:42 2018 -0700
+
+    [sbix] Check glyph data end is in range
+
+ src/hb-ot-color-sbix-table.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit b76dc03108d04975335dbf3580f8d02321cb5d25
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:36:17 2018 -0700
+
+    [sbix] Reduce code
+
+ src/hb-ot-color-sbix-table.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 50fb02a219dbf168d300c4ccf9f29aee38a78e6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:33:12 2018 -0700
+
+    [sbix] Check glyph id before looking into unsafe array
+
+    That 'Z' at end of imageOffsetsZ is a reminder that you should
+    check...
+
+ src/hb-ot-color-sbix-table.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit a8cb9c73da29afa89b0253b6475ff220613e100a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:30:57 2018 -0700
+
+    [sbix] Simplify 'dupe' handling logic
+
+ src/hb-ot-color-sbix-table.hh | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+commit d7eb534e59064633732959c3771b6557cc97005e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:27:04 2018 -0700
+
+    [sbix] Check offsets before proceeding
+
+ src/hb-ot-color-sbix-table.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit c8380bd3e4a2e51dfbe2e44e19738445be16ac75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:20:33 2018 -0700
+
+    [color] Remove more dump-emoji cruft
+
+ src/hb-ot-color-cbdt-table.hh | 53
+ -------------------------------------------
+ src/hb-ot-color-sbix-table.hh | 13 -----------
+ 2 files changed, 66 deletions(-)
+
+commit 68f2c832c894d71715073d4748ad321a9d271a0e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:18:55 2018 -0700
+
+    Remove dump-emoji
+
+ src/Makefile.am               |   9 --
+ src/dump-emoji.cc             | 322
+ ------------------------------------------
+ src/hb-ot-color-sbix-table.hh |   4 +-
+ 3 files changed, 3 insertions(+), 332 deletions(-)
+
+commit b46de42b3a4bdf110154f4f067656f153f5a7d1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:13:45 2018 -0700
+
+    [sbix] Fix order of parameters
+
+ src/hb-ot-color-sbix-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a91cda72abdfc5e401510474c59dd14026e8b6cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:12:05 2018 -0700
+
+    [sbix] Remove redundant parameter
+
+ src/hb-ot-color-sbix-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c712005f55b2a1e5c782302d8a548cf1231c01f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:11:10 2018 -0700
+
+    [sbix] Add get_strike()
+
+ src/hb-ot-color-sbix-table.hh | 23 +++++++++++++----------
+ 1 file changed, 13 insertions(+), 10 deletions(-)
+
+commit 400bc3f030b4ffebe24aa3562d8eb5fcc1cf4bdd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:05:40 2018 -0700
+
+    [sbix] Remove a couple of extra checks
+
+ src/hb-ot-color-sbix-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3770282c837aacbf49b16be1986c91a608faa7da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:02:53 2018 -0700
+
+    [sbix] Rename sbix_table to table in accelerator
+
+ src/hb-ot-color-sbix-table.hh | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit 7346841807ad96fc65bfc6ee9e78c3f190488f2a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 15:00:13 2018 -0700
+
+    [cbdt] Rename reference_blob_for_glyph() to reference_png()
+
+ src/hb-ot-color-cbdt-table.hh | 8 ++++----
+ src/hb-ot-color.cc            | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 1f33b8525d578323d6c798c08fc23c56896f9de0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 14:56:55 2018 -0700
+
+    [sbix] Rename ugly reference_blob_for_glyph() to reference_png()
+
+ src/hb-ot-color-sbix-table.hh | 16 +++++++---------
+ src/hb-ot-color.cc            |  4 +---
+ 2 files changed, 8 insertions(+), 12 deletions(-)
+
+commit 946b5344193183133bfc9799e26d3d0436d86404
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 14:52:25 2018 -0700
+
+    [sbix] Fix uninitialized variables
+
+ src/hb-ot-color-sbix-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 01c7d53fb739b547f3633972194893f68a4738bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 14:51:18 2018 -0700
+
+    [sbix] Select best strike based on ppem
+
+ src/hb-ot-color-sbix-table.hh | 50
+ ++++++++++++++++++++++++-------------------
+ src/hb-ot-color.cc            |  3 +--
+ src/hb-ot-font.cc             |  2 +-
+ 3 files changed, 30 insertions(+), 25 deletions(-)
+
+commit f9f26bff4c79d65a92affd6b73e2b3de017f2d6d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 14:20:50 2018 -0700
+
+    [sbix] Move code around. Add get_extents()
+
+ src/hb-ot-color-sbix-table.hh | 15 +++++++++++++--
+ src/hb-ot-font.cc             |  2 +-
+ 2 files changed, 14 insertions(+), 3 deletions(-)
+
+commit 48bc3039cb46d2b8cf672d86b63b4235a86252e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 14:16:52 2018 -0700
+
+    [sbix] Check blob length against PNG header leangth
+
+ src/hb-ot-color-sbix-table.hh | 37 +++++++++++++++++++++++--------------
+ 1 file changed, 23 insertions(+), 14 deletions(-)
+
+commit d3ec31a57cb99048fb33bca65041da9dc884d8cb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 29 00:28:44 2018 +0330
+
+    [ot-color] More on PNGHeader fields
+
+ src/hb-ot-color-sbix-table.hh | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+commit 35fa3d326096639a33635e19f204a9cb31f20826
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 29 00:07:26 2018 +0330
+
+    [ot-color] Apply Behdad comment
+
+ src/hb-ot-color-sbix-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 307d61867a2b70073eecd1e0cb9b7d912e1c3f06
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 29 00:03:01 2018 +0330
+
+    [ot-color] Make PNGHeader reading actually work
+
+ src/hb-ot-color-sbix-table.hh | 6 +++---
+ test/api/test-ot-color.c      | 4 ++--
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 632e9af862aba49ab31343c4fd07dffef6d2749f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 28 23:43:50 2018 +0330
+
+    [ot-color] Implement PNGHeader and test it, it doesn't work however
+
+ src/hb-ot-color-sbix-table.hh | 20 +++++++++++++++-----
+ src/hb-ot-font.cc             |  4 +---
+ test/api/test-ot-color.c      | 16 ++++++++++++++++
+ 3 files changed, 32 insertions(+), 8 deletions(-)
+
+commit 38706a0746822865008f810f9f577740c32580fa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 28 23:19:04 2018 +0330
+
+    [ot-color] Preparation for setting PNG width/height in extents
+
+ src/dump-emoji.cc             |  7 +++---
+ src/hb-ot-color-sbix-table.hh | 52
+ +++++++++++++++++++++++++++++++++++--------
+ src/hb-ot-color.cc            | 14 +++++-------
+ src/hb-ot-font.cc             |  7 +++++-
+ 4 files changed, 59 insertions(+), 21 deletions(-)
+
+commit d6d6f3bc225bab57c1ab29b41876c98ac4ec1e4d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 11:41:33 2018 -0700
+
+    [docs] Add comment
+
+ src/hb-ot-font.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 3d4c1f6a41022ec99adefa2bdd2489622e2f9a66
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 28 21:38:56 2018 +0330
+
+    [ot-color] Apply Behdad reviews
+
+ docs/harfbuzz-sections.txt    |  4 ++--
+ src/hb-ot-color-cbdt-table.hh | 15 ++++-----------
+ src/hb-ot-color-sbix-table.hh |  6 ++----
+ src/hb-ot-color.cc            |  8 ++++----
+ src/hb-ot-color.h             |  4 ++--
+ test/api/test-ot-color.c      | 14 +++++++-------
+ 6 files changed, 21 insertions(+), 30 deletions(-)
+
+commit 8ef0d2ef928ac47278d7c6db8c8040a47f076e85
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 28 20:09:40 2018 +0330
+
+    [ot-color] Apply Behdad comment
+
+ src/dump-emoji.cc             |  2 +-
+ src/hb-ot-color-cbdt-table.hh | 16 +++++++---------
+ src/hb-ot-color-sbix-table.hh | 14 ++++----------
+ src/hb-ot-color.cc            | 22 +++++++---------------
+ src/hb-ot-color.h             |  5 +----
+ test/api/test-ot-color.c      | 15 ++++-----------
+ 6 files changed, 24 insertions(+), 50 deletions(-)
+
+commit dbd419bedef06a07c844b6a748a5e2868016000c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 27 15:15:24 2018 +0330
+
+    [ot-color] Add public API for CBDT/sbix/SVG color Emojis
+
+ docs/harfbuzz-sections.txt |  4 ++++
+ src/dump-emoji.cc          |  4 ++--
+ src/hb-ot-color.cc         | 39 ++++-----------------------------------
+ src/hb-ot-color.h          | 24 ++++++++++++++++++++++++
+ test/api/test-ot-color.c   |  8 ++------
+ 5 files changed, 36 insertions(+), 43 deletions(-)
+
+commit 6ce49a921a80f1238ddc537f77a1fceea5274a21
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 08:26:30 2018 -0700
+
+    [name] Change hb_name_id_t back to unsigned int
+
+    https://github.com/harfbuzz/harfbuzz/commit/d941f66c75fe26f909b1ba248535cc372bbde851#commitcomment-31076011
+
+ docs/harfbuzz-sections.txt    |  2 --
+ src/hb-ot-color-cpal-table.hh |  4 ++--
+ src/hb-ot-layout.cc           | 12 ++++++------
+ src/hb-ot-name-table.hh       |  2 +-
+ src/hb-ot-name.h              |  6 +++---
+ src/test-size-params.cc       |  2 +-
+ 6 files changed, 13 insertions(+), 15 deletions(-)
+
+commit a4f4f5ba5f64174dea931e02367aa4067d034383
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 08:23:36 2018 -0700
+
+    [docs] Fix titles here as well
+
+ src/hb-map.cc        | 2 +-
+ src/hb-set.cc        | 2 +-
+ src/hb-shape-plan.cc | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 213b6dd33564d0273b1db1c17a4e82548b727dfe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 18:36:24 2018 -0700
+
+    [name] Make sure hb_name_id_t is int-sized
+
+    https://github.com/harfbuzz/harfbuzz/commit/d941f66c75fe26f909b1ba248535cc372bbde851#commitcomment-31068905
+
+ src/hb-ot-name.h | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 4740a3593d6bbb97758593b7d5cd1b86eccbed78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 05:07:54 2018 -0700
+
+    [docs] Divide reference API into three chapters
+
+ docs/harfbuzz-docs.xml | 213
+ +++++++++++++------------------------------------
+ 1 file changed, 56 insertions(+), 157 deletions(-)
+
+commit 1d40d72f291ed5e11850f8bd51a8562b57de1997
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 05:00:42 2018 -0700
+
+    [docs] Hook up hb-var
+
+ docs/harfbuzz-docs.xml |  1 +
+ src/hb-ot-var.cc       | 11 +++++++++++
+ 2 files changed, 12 insertions(+)
+
+commit 80d9a427cf61f61512de13cd88bdc63d881019fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 04:58:32 2018 -0700
+
+    [docs] Document remaining sections
+
+ src/hb-ot-color.cc  | 10 ++++++++++
+ src/hb-ot-font.cc   | 10 ++++++++++
+ src/hb-ot-layout.cc | 10 ++++++++++
+ src/hb-ot-math.cc   | 11 +++++++++++
+ src/hb-ot-name.cc   | 10 ++++++++++
+ src/hb-ot-shape.cc  | 10 ++++++++++
+ 6 files changed, 61 insertions(+)
+
+commit cf5fa57f00613d324b55732d9e21c779ba0d2de2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 04:50:38 2018 -0700
+
+    [docs] Change section titles again
+
+    I think I like the uniform "hb-*" more.
+
+ src/hb-blob.cc      |  2 +-
+ src/hb-buffer.cc    |  2 +-
+ src/hb-common.cc    |  4 ++--
+ src/hb-deprecated.h | 12 ++++++++++++
+ src/hb-face.cc      |  2 +-
+ src/hb-font.cc      |  2 +-
+ src/hb-shape.cc     |  2 +-
+ src/hb-unicode.cc   |  2 +-
+ 8 files changed, 20 insertions(+), 8 deletions(-)
+
+commit 04981ee05d83ed30c9f818106589a4de9c3e9b7f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 04:40:43 2018 -0700
+
+    [docs] More
+
+ src/hb-coretext.cc        | 10 ++++++++++
+ src/hb-ft.cc              | 11 +++++++++++
+ src/hb-glib.cc            | 10 ++++++++++
+ src/hb-gobject-structs.cc | 12 ++++++++++++
+ src/hb-graphite2.cc       | 10 ++++++++++
+ src/hb-icu.cc             | 10 ++++++++++
+ src/hb-uniscribe.cc       | 10 ++++++++++
+ 7 files changed, 73 insertions(+)
+
+commit 5dd86aa33b4e52a0de4fcd96b2ea7bafcae8dd34
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 04:28:40 2018 -0700
+
+    [docs] Rename section titles to object names
+
+    More useful.
+
+ src/hb-blob.cc       | 2 +-
+ src/hb-buffer.cc     | 2 +-
+ src/hb-face.cc       | 4 ++--
+ src/hb-font.cc       | 4 ++--
+ src/hb-map.cc        | 2 +-
+ src/hb-set.cc        | 2 +-
+ src/hb-shape-plan.cc | 2 +-
+ src/hb-unicode.cc    | 2 +-
+ 8 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 524fb70216d7fec17f5327237faa4d092ae15a00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 04:27:36 2018 -0700
+
+    [docs] More
+
+ src/hb-map.cc | 11 ++++++++++-
+ src/hb-set.cc | 11 ++++++++++-
+ 2 files changed, 20 insertions(+), 2 deletions(-)
+
+commit 46072b7cb55bfeb8c46a78cbdb335dfdcce48298
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 04:21:20 2018 -0700
+
+    [ot] Fold hb-ot-tag.h into hb-ot-layout.h
+
+ docs/harfbuzz-docs.xml     |  1 -
+ docs/harfbuzz-sections.txt | 20 +++++-------
+ src/Makefile.sources       |  1 -
+ src/hb-graphite2.cc        |  2 +-
+ src/hb-ot-layout.h         | 42 ++++++++++++++++++++++++-
+ src/hb-ot-tag.h            | 78
+ ----------------------------------------------
+ src/hb-ot.h                |  1 -
+ src/hb-uniscribe.cc        |  2 +-
+ 8 files changed, 51 insertions(+), 96 deletions(-)
+
+commit 00cf4e5eb6dcb04406d5a519712da799277cec2e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 04:07:33 2018 -0700
+
+    [docs] Fill in some sections
+
+ docs/harfbuzz-docs.xml     | 20 ++++++--------
+ docs/harfbuzz-sections.txt | 65
+ +++++++++++++++++++---------------------------
+ src/hb-blob.cc             | 13 ++++++++++
+ src/hb-buffer.cc           |  3 ++-
+ src/hb-common.cc           | 23 ++++++++++++++++
+ src/hb-face.cc             | 13 ++++++++++
+ src/hb-font.cc             | 13 ++++++++++
+ src/hb-shape-plan.cc       | 13 ++++++++++
+ src/hb-shape.cc            |  4 ++-
+ src/hb-unicode.cc          | 14 ++++++++++
+ 10 files changed, 129 insertions(+), 52 deletions(-)
+
+commit 55a19d73b4d5e7ddd328263d241a442f16f005b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 04:01:19 2018 -0700
+
+    Move HB_EXTERN
+
+ src/hb-common.h | 4 ++++
+ src/hb.h        | 4 ----
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 524e854c15f9d6c50c5456ae0e188f039dcf153c
+Merge: 4ee3c827 8180c37d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 27 15:04:43 2018 +0330
+
+    Merge pull request #1318 from ebraminio/png
+
+    Add a non-hooked _png _svg get emoji blob
+
+commit 8180c37df0a856dbc3564c0aefd8b2acab8baf8a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 27 14:45:00 2018 +0330
+
+    [ot-color] Remove _png and _svg public APIs
+
+ docs/harfbuzz-sections.txt |  4 ----
+ src/dump-emoji.cc          | 11 ++++++++---
+ src/hb-ot-color.cc         | 39 +++++++++++++++++++++++++++++++++++----
+ src/hb-ot-color.h          | 24 ------------------------
+ test/api/test-ot-color.c   |  8 ++++++--
+ 5 files changed, 49 insertions(+), 37 deletions(-)
+
+commit 9aa6279a2d64ab8057b0d7acbcc77044442c6d0e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 27 14:24:58 2018 +0330
+
+    [ot-color/png] Try to get image blob from sbix first options.aat
+    is set
+
+ src/hb-ot-color.cc | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+commit b42661ee91ea92309e827a970f370cacc62c73aa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 27 14:15:38 2018 +0330
+
+    [ot-color] Add some documentation
+
+ src/hb-ot-color.cc | 37 +++++++++++++++++++------------------
+ src/hb-ot-color.h  |  2 +-
+ 2 files changed, 20 insertions(+), 19 deletions(-)
+
+commit 4ee3c8272c31736980218cba95f97fed53d24e14
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 03:18:45 2018 -0700
+
+    [docs] Fix hb_name_id_t
+
+    Yep, was not recognized without this patch!
+
+ src/hb-ot-name.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9435fb24daadf08add9a701816da01bd54c0cd78
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 27 13:32:14 2018 +0330
+
+    [ot-color/png] Implement CBDT part
+
+ src/hb-ot-color-cbdt-table.hh | 56
+ +++++++++++++++++++++++++++++++++++++++----
+ src/hb-ot-color.cc            | 19 ++-------------
+ src/hb-ot-color.h             |  4 ++++
+ test/api/test-ot-color.c      | 25 ++++++++++++++++---
+ 4 files changed, 79 insertions(+), 25 deletions(-)
+
+commit 9457cfd7bcc9c2fff38194f2bb82ab7be881bfeb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 03:15:34 2018 -0700
+
+    [docs] Hook up hb-map
+
+ docs/harfbuzz-docs.xml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d941f66c75fe26f909b1ba248535cc372bbde851
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 02:55:52 2018 -0700
+
+    [name] Make hb_name_id_t be the enum
+
+    This is like hb_script_t.
+
+    We had this exposed as unsigned int since 2.0.0 release in two APIs,
+    as well as hb_ot_layout_get_size_params() from earlier.
+    But since no one uses those (right?!), let's just fix this now.
+
+ docs/harfbuzz-docs.xml        |  6 ++++--
+ docs/harfbuzz-sections.txt    |  4 +++-
+ src/hb-ot-color-cpal-table.hh | 12 ++++++------
+ src/hb-ot-layout.cc           | 16 ++++++++--------
+ src/hb-ot-name-table.hh       |  2 +-
+ src/hb-ot-name.h              | 15 ++++-----------
+ src/test-size-params.cc       |  2 +-
+ 7 files changed, 27 insertions(+), 30 deletions(-)
+
+commit 40496a54a03864c5e6a1224c18b4b93a1f578eed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 02:49:32 2018 -0700
+
+    [name] Move HB_NAME_ID_INVALID into the enum
+
+    Don't know how to document anonymous enum members.
+
+ src/hb-ot-name.h | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit a8a55b9f892a5e4f086b20bbe337dc29182210af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 02:45:57 2018 -0700
+
+    [name] Move around
+
+ src/hb-ot-name.h | 74
+ ++++++++++++++++++++++++++++----------------------------
+ 1 file changed, 37 insertions(+), 37 deletions(-)
+
+commit 3b7e5f131383956e19642d28c938f1bc0d16295f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 02:39:20 2018 -0700
+
+    [name] Rename hb_ot_name_get_names() to hb_ot_name_list_names()
+
+    And swap return value positions, so can be annotated for
+    gobject-introspectin.
+
+ docs/harfbuzz-sections.txt |  2 +-
+ src/hb-ot-name.cc          | 17 ++++++++---------
+ src/hb-ot-name.h           |  6 +++---
+ src/test-name-table.cc     |  4 ++--
+ 4 files changed, 14 insertions(+), 15 deletions(-)
+
+commit 4025ad804383dc8d5ace9654ae21d4d726d0dbc4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 02:35:06 2018 -0700
+
+    Document new API
+
+ src/hb-common.h     | 30 +++++++++++++++++++++++++-
+ src/hb-ot-color.cc  | 16 +++++++-------
+ src/hb-ot-layout.cc |  2 +-
+ src/hb-ot-name.cc   | 61
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-ot-name.h    | 15 +++++++++++++
+ 5 files changed, 113 insertions(+), 11 deletions(-)
+
+commit 5e2a52f71a8d081441fbc1c57a3550e3a9573e46
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 27 12:44:33 2018 +0330
+
+    [sbix] Remove dump method from sbix accelerator
+
+ src/dump-emoji.cc             | 36 ++++++++++++++++++++++++------------
+ src/hb-ot-color-sbix-table.hh | 26 ++++++++++----------------
+ 2 files changed, 34 insertions(+), 28 deletions(-)
+
+commit 0353ac6cde47df8f5386733f5c12cc60732a5bf4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 27 12:24:53 2018 +0330
+
+    Fix test-name-table on older bots
+
+ src/test-name-table.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dc11a38107ac1f0a2d3edacae33ff7f10f5e894c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 27 12:15:25 2018 +0330
+
+    [sbix] Set num_glyphs on accelerator
+
+    dump-emoji was broken without it
+
+ src/hb-ot-color-sbix-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 6a38fd68a8f4e66d9248e0c943ae3a1cf45c521b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 27 10:50:53 2018 +0330
+
+    [ot-color/png] sbix runtime memory check
+
+ src/hb-ot-color-cbdt-table.hh | 16 +++++++---------
+ src/hb-ot-color-sbix-table.hh | 18 ++++++++++++------
+ src/hb-ot-color-svg-table.hh  |  4 ++--
+ 3 files changed, 21 insertions(+), 17 deletions(-)
+
+commit ca645accb97841e01846e45cda32e6bd2ad15940
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 00:39:31 2018 -0700
+
+    Comment
+
+ src/hb-ot-shape-complex-indic.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 265ad408ca41e9d0b5a1056a751d834d4eadc911
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 26 23:55:11 2018 +0330
+
+    [ot-color/png] Implement sbix part
+
+ docs/harfbuzz-sections.txt    |  2 +
+ src/dump-emoji.cc             |  5 ++-
+ src/hb-ot-color-cbdt-table.hh | 27 ++++++++----
+ src/hb-ot-color-sbix-table.hh | 98
+ +++++++++++++++++++++++++++++++++++++------
+ src/hb-ot-color.cc            | 64 ++++++++++++++++++++++++++++
+ src/hb-ot-color.h             |  9 ++++
+ test/api/test-ot-color.c      | 32 ++++++++++++++
+ 7 files changed, 215 insertions(+), 22 deletions(-)
+
+commit 7f5941e162bf7806299656edafd452a47b5a55b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 27 00:06:48 2018 -0700
+
+    Remove stale comment
+
+    Ugliness was fixed in 30eab97a0072fbc22d353082249e0e6e546cd86b
+    But yeah, my smell detector was working.  Ugliness was buggy.
+
+ src/hb-ot-shape-normalize.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit e7400c0275cad4f584eeaf21ce6d5c6adca29bbb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 26 22:09:17 2018 -0700
+
+    [docs] Hook up new symbols
+
+ docs/harfbuzz-docs.xml     | 46
+ +++++++++++++++++++++++++++++++++++++++++-----
+ docs/harfbuzz-sections.txt | 21 +++++++++++++++++++++
+ src/hb-ot-color.cc         |  2 +-
+ 3 files changed, 63 insertions(+), 6 deletions(-)
+
+commit 6aa019c4af6b64bb732205e6051f3e73e1b70721
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 26 22:02:17 2018 -0700
+
+    [morx] Fix merge_cluster to end at last ligature component
+
+    Don't assume current position was a component in the ligature.
+
+ src/hb-aat-layout-morx-table.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 00ae4be6bf8b1d0800043167c5cf95187ac12515
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 26 21:59:20 2018 -0700
+
+    [morx] Fix bailing out ligation at end-of-text
+
+    Check was after a move_to, which wouldn't work.
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11147
+
+ src/hb-aat-layout-morx-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 30eab97a0072fbc22d353082249e0e6e546cd86b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 26 21:54:07 2018 -0700
+
+    Fix invalid memory read
+
+    Buffer might be relocated inside replace_glyphs().
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=895117
+
+ src/hb-ot-shape-normalize.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 79b2fa62ca7eb5a875778d3a2ecae63350083ba3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 26 21:21:18 2018 -0700
+
+    [indic] Fix infinite loop
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=863044
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 39bd07aed5fe6ccddde53206bafceec32d56dcc1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 26 21:01:11 2018 -0700
+
+    Fix bunch of unused parameter warnings
+
+    Show up with gcc -O0.
+
+    There's a few more but those are functions that need to be filled in.
+
+    Maybe this is a lost battle...
+
+ src/gen-vowel-constraints.py                 |  4 ++--
+ src/hb-aat-layout-common.hh                  |  7 +++++--
+ src/hb-aat-layout-kerx-table.hh              |  4 ++--
+ src/hb-aat-layout-morx-table.hh              | 10 +++++-----
+ src/hb-face.cc                               |  2 +-
+ src/hb-font.cc                               | 29
+ ++++++++++++++--------------
+ src/hb-graphite2.cc                          |  9 ++++++---
+ src/hb-machinery.hh                          |  4 ++--
+ src/hb-ot-color-cbdt-table.hh                |  2 +-
+ src/hb-ot-glyf-table.hh                      |  4 ++--
+ src/hb-ot-hmtx-table.hh                      |  2 +-
+ src/hb-ot-layout-gpos-table.hh               |  2 +-
+ src/hb-ot-math-table.hh                      |  2 +-
+ src/hb-ot-maxp-table.hh                      |  2 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh   |  6 +++---
+ src/hb-ot-shape-complex-arabic.cc            |  6 +++---
+ src/hb-ot-shape-complex-hangul.cc            |  2 +-
+ src/hb-ot-shape-complex-khmer.cc             |  2 +-
+ src/hb-ot-shape-complex-myanmar.cc           |  6 +++---
+ src/hb-ot-shape-complex-use.cc               |  8 ++++----
+ src/hb-ot-shape-complex-vowel-constraints.cc |  4 ++--
+ src/hb-ot-shape-fallback.cc                  |  4 ++--
+ src/hb-ot-shape-normalize.cc                 |  4 +++-
+ src/hb-ot-shape.cc                           |  2 +-
+ src/hb-ot-tag.cc                             |  3 +--
+ src/hb-ot-vorg-table.hh                      |  2 +-
+ src/hb-set.cc                                |  2 +-
+ src/hb-shape-plan.cc                         |  2 +-
+ src/hb-utf.hh                                |  2 +-
+ 29 files changed, 73 insertions(+), 65 deletions(-)
+
+commit b2e1ec374cbd2a6e4d79419bd5601a4e2ecb9864
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 26 20:45:28 2018 -0700
+
+    [subset] Fix warning
+
+ src/hb-subset.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 337ea0b7175793305e9d8935aecf385b707a5bc4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 26 20:31:14 2018 -0700
+
+    [fuzzing] Remove HB_NDEBUG
+
+    Not sure why it ever was added.
+
+ src/Makefile.am | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 12058e44d100c28816f42c91c63a0f960a662181
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 26 16:23:50 2018 -0700
+
+    [fuzzing] Add more test
+
+ ...z-testcase-minimized-harfbuzz_fuzzer-5659690013556736 | Bin 0 ->
+ 2732 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit c965eeadbc71943f2336a20dc16ac691c805b90e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 13:43:25 2018 -0700
+
+    [name] Default to "en" if language is not specified
+
+ src/hb-ot-name.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 3fd6e5dbefe52a4a2e604c28a4edfbd40ed16027
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 24 13:42:38 2018 -0700
+
+    [name] Add pre-defined nameIDs
+
+ src/hb-ot-name.h | 29 +++++++++++++++++++++++++++++
+ 1 file changed, 29 insertions(+)
+
+commit 20d0171d20cf9f3f93bdd6878bbc1d7d8329e75f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 24 13:20:19 2018 -0700
+
+    [name] Fill out most missing language codes
+
+ src/hb-ot-name-language.cc | 114
+ +++++++++++++++++++++++----------------------
+ 1 file changed, 58 insertions(+), 56 deletions(-)
+
+commit 622b014faf7bbe7a97f9aff959c434d1664c10d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 24 12:40:15 2018 -0700
+
+    [name] Skip enumerating names with unknown language
+
+ src/hb-ot-name-table.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 2c39f359e4a7312e3b518f76815d79e42ee96a32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 24 12:34:30 2018 -0700
+
+    [utf] Remove unused typedef
+
+ src/hb-utf.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit ce81c7429810ad3902c37e50016ca54b9bae6f91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 24 12:34:03 2018 -0700
+
+    [utf] Fix ASCII
+
+ src/hb-utf.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 327546e633b590d6dedfb901810ccf490a0bf922
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 23:33:44 2018 -0700
+
+    [name] Hook up ltag table
+
+ src/hb-aat-layout.cc     | 15 ++++++++++++++-
+ src/hb-aat-layout.hh     |  5 +++++
+ src/hb-aat-ltag-table.hh | 17 +++++++++++++++--
+ src/hb-ot-face.hh        |  3 ++-
+ src/hb-ot-name-table.hh  |  9 +++++----
+ 5 files changed, 41 insertions(+), 8 deletions(-)
+
+commit dc9a5f88b401fcad598946fcf735010c563741ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 23:16:06 2018 -0700
+
+    [name] Do record sanitization at run-time
+
+ src/hb-dsalgs.hh        | 62
+ +++++++++++++++++++++++++++----------------------
+ src/hb-ot-name-table.hh | 22 +++++++++++-------
+ src/hb-ot-name.cc       |  2 +-
+ 3 files changed, 49 insertions(+), 37 deletions(-)
+
+commit a53d301b1c9f72cb42cc0fc321e2ad4dbac8e064
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 23:05:55 2018 -0700
+
+    [name] Minor
+
+ src/hb-ot-name-table.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit c442fd9a10b3e91ab18720188afff08325adf6dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 22:45:45 2018 -0700
+
+    [name] Add src/test-name-table tool to show all font names
+
+ src/Makefile.am        | 17 ++++++++-----
+ src/test-name-table.cc | 67
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 78 insertions(+), 6 deletions(-)
+
+commit 7007bd9dff9f8eef3263f1b39327552ff1ebae3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 22:44:36 2018 -0700
+
+    [name] Rebuild language list, include missing entries
+
+ src/hb-ot-name-language.cc | 634
+ ++++++++++++++++++++++++++-------------------
+ 1 file changed, 370 insertions(+), 264 deletions(-)
+
+commit 68f172101c1228a7d669d71da1d0eeb96a10565e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 22:19:09 2018 -0700
+
+    [name] Fix cmp for invalid language
+
+ src/hb-ot-name-table.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 888a65615c7b11222749ae85c124aaa9a36fe863
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 22:16:32 2018 -0700
+
+    [name] Fix nul-termination bug
+
+ src/hb-ot-name.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9b532e2ed432611005b19c40cac7e626afcccd08
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 22:00:19 2018 -0700
+
+    [name] Add language mapping
+
+ src/Makefile.sources       |   2 +
+ src/hb-ot-name-language.cc | 349
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-name-language.hh |  40 ++++++
+ src/hb-ot-name-table.hh    |  21 ++-
+ 4 files changed, 399 insertions(+), 13 deletions(-)
+
+commit e2f9b657758cda3708c0a9db971c467ca59d5c19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 21:19:56 2018 -0700
+
+    [name] Start adding language support
+
+ src/hb-ot-name-table.hh | 25 ++++++++++++++++++++++++-
+ 1 file changed, 24 insertions(+), 1 deletion(-)
+
+commit 6db6bbe64bd63554919647c5b527e03aedbaee4e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 21:12:58 2018 -0700
+
+    [name] Remove unused cmp function
+
+ src/hb-ot-name-table.hh | 16 ----------------
+ 1 file changed, 16 deletions(-)
+
+commit 4668a05006e6c4797df19651489b4589817e1e01
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 20:51:53 2018 -0700
+
+    [name] Hook things up
+
+    Accept Mac Latin name entries as ASCII as well.
+
+ src/hb-ot-name-table.hh | 24 +++++++++++++++------
+ src/hb-ot-name.cc       |  8 +++++--
+ src/hb-utf.hh           | 55
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 79 insertions(+), 8 deletions(-)
+
+commit 69f5da0629f1e5a307fc49fe58490aa92d1bd0e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 20:30:40 2018 -0700
+
+    [name] More
+
+    It assumes all names are encoded in UTF16-BE.  Other than that,
+    and not
+    listing languages correctly, it's *supposed* to work.
+
+ src/hb-dsalgs.hh                | 21 +++++++++++++++++++++
+ src/hb-ot-name-table.hh         | 37
+ ++++++++++++++++++++++++++++++-------
+ src/hb-ot-name.cc               | 12 ++++++++----
+ src/hb-ot-os2-unicode-ranges.hh | 10 +++++-----
+ src/hb-unicode.cc               |  8 ++++----
+ src/hb-unicode.hh               |  2 +-
+ 6 files changed, 69 insertions(+), 21 deletions(-)
+
+commit 64334aff8c2ea5aa066d77a95844bc6f84efe725
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 20:15:53 2018 -0700
+
+    [name] Fix check
+
+ src/hb-ot-name.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5531bd068e759a5acb3b8d301c0ff9c64844166e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 20:04:05 2018 -0700
+
+    [name] Flesh out UTF-X to UTF-X conversion routines
+
+ src/hb-ot-name.cc |  84 ++++++++++++++++++++++++++++++++++++------
+ src/hb-ot-name.h  |  10 ++---
+ src/hb-utf.hh     | 107
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 182 insertions(+), 19 deletions(-)
+
+commit 84811a06a26508effe9f4a9eaf1be15297ecf0cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 03:16:03 2018 -0700
+
+    [name] Fix for rebase changes to hb_array_t
+
+ src/hb-ot-name-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1046b1938b16ab6be861b0828b446fa13cf0377b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 17 05:42:23 2018 -0700
+
+    [name] Some more
+
+ src/hb-ot-name.cc | 19 +++++++++++++------
+ 1 file changed, 13 insertions(+), 6 deletions(-)
+
+commit b4d4d1ea787c829dea023d99f974a38bdc3de0ae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 19:55:17 2018 -0700
+
+    [name] Return full string length from API
+
+ src/hb-ot-name.cc | 6 +++---
+ src/hb-ot-name.h  | 6 +++---
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 8d304ef7f9094a71fabc3efd87b37a030c437adf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 19:04:48 2018 -0700
+
+    [utf] Add UTF16-BE and UTF32-BE
+
+ src/hb-buffer.cc |  4 +--
+ src/hb-utf.hh    | 80
+ ++++++++++++++++++++++++++++++++------------------------
+ 2 files changed, 48 insertions(+), 36 deletions(-)
+
+commit a826a8730f21ae996ae8f4d12c44dc18b9e8e933
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 13:06:56 2018 -0700
+
+    [name] Hide internal details from public API
+
+ src/hb-ot-name-table.hh | 23 +++++++++++++----------
+ src/hb-ot-name.h        |  3 +--
+ 2 files changed, 14 insertions(+), 12 deletions(-)
+
+commit e7c595a9f09ba1552b2de1f8d56cbdcf376b9cad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 23:34:54 2018 -0700
+
+    [name] More
+
+ src/hb-ot-name.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 75cd8c86bd9b0973864bb92e0244bf038980765e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 23:32:08 2018 -0700
+
+    [name] Add hb_ot_name_get_utf()
+
+ src/hb-ot-name.cc | 24 ++++++++++++++++++------
+ 1 file changed, 18 insertions(+), 6 deletions(-)
+
+commit c783d36324dd1e2031d3387064afab1ce5d90b6f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 23:28:49 2018 -0700
+
+    [name] Pre-allocate array
+
+ src/hb-ot-name-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c2aa409537c3e8a7b8592ef90f8304bd6588561d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 23:09:28 2018 -0700
+
+    [name] Start implementing hb_ot_name_get_utf16()
+
+ src/hb-ot-name-table.hh |  6 ++++--
+ src/hb-ot-name.cc       | 22 ++++++++++++++++++++++
+ src/hb-ot-name.h        |  8 ++++++--
+ 3 files changed, 32 insertions(+), 4 deletions(-)
+
+commit 740cde8991283b8b4e1e77e022175251eb37d3d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 23:00:27 2018 -0700
+
+    [name] Implement hb_bytes_t get_name()
+
+ src/hb-ot-name-table.hh | 24 +++++-------------------
+ 1 file changed, 5 insertions(+), 19 deletions(-)
+
+commit c3425f2401dffb1f3b5bd6fdbc0c3e9aad0f4306
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 22:53:40 2018 -0700
+
+    [name] Add hb-ot-name.cc for realz
+
+ src/hb-ot-name.cc | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 50 insertions(+)
+
+commit 90420ed8cb297f1ceff75f5a75c8fa7b6ea6f65e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 22:48:48 2018 -0700
+
+    [name] Implement hb_ot_name_get_names()
+
+ src/Makefile.sources    | 1 +
+ src/hb-ot-name-table.hh | 3 +--
+ src/hb-ot-name.h        | 4 ++--
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 9a6c87c17d51fd57e4225c776a0fabbfd313f4f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 22:42:04 2018 -0700
+
+    [name] Finish accelerator sorting
+
+ src/hb-ot-name-table.hh | 61
+ +++++++++++++++++++++++++++++++++++++++++--------
+ src/hb-ot-name.h        |  3 ++-
+ 2 files changed, 53 insertions(+), 11 deletions(-)
+
+commit 2157e56b34e7b932dd144ee3563f5bd682bbed30
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 22:22:50 2018 -0700
+
+    [name] Start implementing public API infrastructure
+
+ src/hb-ot-face.cc       |  1 +
+ src/hb-ot-face.hh       |  7 +++---
+ src/hb-ot-name-table.hh | 60
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-name.h        |  3 +++
+ 4 files changed, 68 insertions(+), 3 deletions(-)
+
+commit 0bf93ec0fb549d838b0a246de02a95559a9b2772
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 21:34:10 2018 -0700
+
+    [name] Add public API declarations
+
+ src/hb-ot-name.h | 34 ++++++++++++++++++++++++++++++++++
+ 1 file changed, 34 insertions(+)
+
+commit 982c2f4a65d127e56e09e7ab583f84099b8136bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 26 15:40:12 2018 -0700
+
+    [indic/khmer/myanmar/use] Clarify clear_syllable
+
+    No logic change.
+
+ src/hb-ot-shape-complex-indic.cc   |  3 ++-
+ src/hb-ot-shape-complex-khmer.cc   |  4 +---
+ src/hb-ot-shape-complex-myanmar.cc | 40
+ ++++++++++++++++++--------------------
+ src/hb-ot-shape-complex-use.cc     | 22 +++++++++++++++------
+ 4 files changed, 38 insertions(+), 31 deletions(-)
+
+commit 143ffe65aa7f20d6c53219905cbc2520d680b8dd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 26 12:14:30 2018 +0330
+
+    [fuzz] Add a new testcase
+
+ ...z-testcase-minimized-hb-shape-fuzzer-5658272078495744 | Bin 0 ->
+ 2252 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 30f18039b3c0e5748101f8934ae82aebfc5a83f7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 26 09:34:34 2018 +0330
+
+    [svg] Rename _svg_create_blob to _glyph_reference_blob_svg
+
+ docs/harfbuzz-sections.txt | 2 ++
+ src/dump-emoji.cc          | 2 +-
+ src/hb-ot-color.cc         | 4 ++--
+ src/hb-ot-color.h          | 2 +-
+ test/api/test-ot-color.c   | 6 +++---
+ 5 files changed, 9 insertions(+), 7 deletions(-)
+
+commit 5cb1ce868138a10c0663a18c3891bc717aa4bc64
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 25 22:39:58 2018 +0330
+
+    [svg] Collapse SVGDocumentIndex into SVG
+
+ src/hb-ot-color-svg-table.hh | 54
+ +++++++++++++++-----------------------------
+ src/hb-ot-color.cc           |  2 +-
+ test/api/test-ot-color.c     |  2 +-
+ 3 files changed, 20 insertions(+), 38 deletions(-)
+
+commit 4ceabb8c2126fe365303b8d69e667005276c0241
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 25 21:52:35 2018 +0330
+
+    [svg] Hide start_glyph and end_glyph from API
+
+ src/dump-emoji.cc            | 21 ++++++++-------------
+ src/hb-ot-color-svg-table.hh | 42
+ ++++++++++++------------------------------
+ src/hb-ot-color.cc           |  9 ++-------
+ src/hb-ot-color.h            |  5 +----
+ test/api/test-ot-color.c     | 11 ++---------
+ 5 files changed, 25 insertions(+), 63 deletions(-)
+
+commit c7a4e3dfb5c8dd4f8faf08e327bb1900c0096cf6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 23 18:00:48 2018 +0330
+
+    [svg] Add public API
+
+    * hb_ot_color_has_svg
+    * hb_ot_color_glyph_svg_create_blob
+
+ src/dump-emoji.cc             | 51 +++++++++++++++----------
+ src/hb-open-type.hh           |  1 -
+ src/hb-ot-color-sbix-table.hh |  2 +
+ src/hb-ot-color-svg-table.hh  | 86
+ ++++++++++++++++++++++++++++++++-----------
+ src/hb-ot-color.cc            | 53 ++++++++++++++++++++++----
+ src/hb-ot-color.h             | 13 +++++++
+ src/hb-ot-face.cc             |  2 +
+ src/hb-ot-face.hh             |  4 +-
+ src/hb-ot-layout.cc           |  4 --
+ test/api/test-ot-color.c      | 43 +++++++++++++++++++---
+ 10 files changed, 199 insertions(+), 60 deletions(-)
+
+commit e98af6d1eda33346f72de8a45fbd317fc0e15935
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 22:25:29 2018 -0700
+
+    [layout] Try to speed up collect_lookups some more
+
+    Barely made a dent :(.
+
+ src/hb-ot-layout-common.hh |  2 ++
+ src/hb-ot-layout.cc        | 23 ++++-------------------
+ 2 files changed, 6 insertions(+), 19 deletions(-)
+
+commit eb44bfc864f91c0c833c3156475d191ac1b79c72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 21:42:19 2018 -0700
+
+    [layout] Memoize collect_features
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/1317
+    Fixes https://oss-fuzz.com/v2/testcase-detail/6543700493598720
+
+ src/hb-ot-layout.cc | 55
+ ++++++++++++++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 48 insertions(+), 7 deletions(-)
+
+commit 84098b1639775aea5bf3f5d91fa6e657b612ce3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 21:33:12 2018 -0700
+
+    [layout] Remove unintentionally added code
+
+ src/hb-ot-layout-common.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 941600a9e06309f148d51403fa07dc56ce542572
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 21:26:08 2018 -0700
+
+    [layout] Add hb_collect_features_context_t
+
+    Towards https://github.com/harfbuzz/harfbuzz/pull/1317
+
+ src/hb-ot-layout.cc | 66
+ +++++++++++++++++++++++++++++------------------------
+ 1 file changed, 36 insertions(+), 30 deletions(-)
+
+commit c237cdfcc74d33f77b2399b4d08228c2fcf50df5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 21:17:30 2018 -0700
+
+    [lookup] Fold another function inline
+
+ src/hb-ot-layout.cc | 48 +++++++++++++++++++++---------------------------
+ 1 file changed, 21 insertions(+), 27 deletions(-)
+
+commit fe5520ddea3941f7a72888d908fd2b895e2f388e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 20:58:34 2018 -0700
+
+    [layout] More prep work to memoize collect_features() work
+
+ src/hb-ot-layout.cc | 62
+ ++++++++++++++++++++---------------------------------
+ 1 file changed, 23 insertions(+), 39 deletions(-)
+
+commit e8e67503ff0a50eb10ad410d6a76a282ea494cf4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 20:48:20 2018 -0700
+
+    [lookup] More prep work for memoizing collect_features
+
+    https://github.com/harfbuzz/harfbuzz/pull/1317
+
+ src/hb-ot-layout-common.hh |  2 ++
+ src/hb-ot-layout.cc        | 83
+ +++++++++++++++++++++-------------------------
+ 2 files changed, 40 insertions(+), 45 deletions(-)
+
+commit 96828b97a8fc2c50721ce040bdde63c462908791
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 20:34:29 2018 -0700
+
+    [layout] Minor
+
+    We were returning the accelerator's lookup count.  Returns table's.
+    They are the same except for OOM cases.  Just shorter code.
+
+ src/hb-ot-layout.cc | 14 +-------------
+ 1 file changed, 1 insertion(+), 13 deletions(-)
+
+commit 73449cd213c3a12468e99b9c3d840fc60a334902
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 20:32:05 2018 -0700
+
+    [layout] Fold one function inline
+
+    Preparation for fixing https://github.com/harfbuzz/harfbuzz/pull/1317
+
+ src/hb-ot-layout.cc | 22 +++-------------------
+ 1 file changed, 3 insertions(+), 19 deletions(-)
+
+commit ba5ca6a762cb46a17f41673b14996a12e6cfe3d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 17:41:26 2018 -0700
+
+    [morx] Use deleted-glyph, instead of actual deletion, in Ligation
+
+    Closer to what CoreText does.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1302
+
+ src/hb-aat-layout-morx-table.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 5c272e3613667ca532f32764824784c63d797f57
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 17:36:33 2018 -0700
+
+    [morx] Remove deleted-glyph at the end of processing
+
+ src/hb-aat-layout-morx-table.hh | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+commit 1bb8ed86d6cfec0fc87c8e1930d9a86426b42001
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 17:33:48 2018 -0700
+
+    [aat] Minor
+
+ src/hb-aat-layout-common.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 102af615f15d04da20c17d80eb38f5948020f9ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 17:29:32 2018 -0700
+
+    [aat] Start adding support for DELETED-GLYPH
+
+    https://github.com/harfbuzz/harfbuzz/issues/1302
+
+ src/hb-aat-layout-common.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 955aa56b11e4fa14bc6d5b1b56cb810e28fab6cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 16:50:38 2018 -0700
+
+    [vector] Make it act more like pointer
+
+    Add pointer cast operator and plus operator.
+
+ src/hb-coretext.cc      |  2 +-
+ src/hb-machinery.hh     |  2 +-
+ src/hb-ot-cmap-table.hh |  2 +-
+ src/hb-set.hh           |  8 ++++----
+ src/hb-subset.cc        |  2 +-
+ src/hb-uniscribe.cc     | 12 ++++++------
+ src/hb-vector.hh        |  6 ++++++
+ 7 files changed, 20 insertions(+), 14 deletions(-)
+
+commit 8d55e2adef9a376a5cf83c20aff2dba27dd64da8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 16:37:53 2018 -0700
+
+    [set] Minor
+
+ src/hb-set.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 64c32edfe18f5ef3b348e5c84077ee1f6faf4f48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 16:35:36 2018 -0700
+
+    [set] Make array access more explicit
+
+    Follow up on 94e421abbfc7ede9aaf3c8d86bb0ff9992ea3123
+
+ src/hb-set.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit e3ceb2dde3525824de68914e12ad4e8a873ab90a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 14:30:24 2018 -0700
+
+    Fix again
+
+ test/shaping/data/in-house/fonts/DFONT.dfont | Bin 0 -> 3505 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit eceeb85666814023f57ee3517bbb304830a60c55
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 26 00:23:45 2018 +0330
+
+    [docs] Add hb-ot-color section
+
+ docs/harfbuzz-sections.txt | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit be746009e9b7063dcb57e30e342f9410387ef8b6
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Oct 25 13:40:40 2018 -0700
+
+    dropped support of legacy CFF CharString ops
+
+    along with test & font
+
+ src/hb-cff1-interp-cs.hh          | 135
+ +-------------------------------------
+ test/api/fonts/cff1_legacyops.otf | Bin 3104 -> 0 bytes
+ test/api/test-ot-extents-cff.c    |  23 -------
+ 3 files changed, 1 insertion(+), 157 deletions(-)
+
+commit 1cfe702872058ebc50d6cb5543daa38fb3a7ebfb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 13:37:08 2018 -0700
+
+    Fixup
+
+ test/shaping/data/in-house/fonts/{TRAK.tff => TRAK.ttf} | Bin
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 5739c876d0d080e7feaefd323245702c663f33be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 13:23:33 2018 -0700
+
+    [test] Rename some fonts
+
+    If we have duplicae font files in different directories, that would
+    break the oss-fuzz build currently.  So, rename some to avoid
+    name class with text-rendering-test.  Would be better to find
+    another solution.
+
+ ...TestMORXTwentyeight.ttf => MORXTwentyeight.ttf} | Bin
+ .../data/in-house/fonts/{TestTRAK.ttf => TRAK.tff} | Bin
+ .../data/in-house/fonts/{TestTTC.ttc => TTC.ttc}   | Bin
+ test/shaping/data/in-house/fonts/TestDFONT.dfont   | Bin 3505 -> 0 bytes
+ test/shaping/data/in-house/tests/aat-morx.tests    |   2 +-
+ test/shaping/data/in-house/tests/aat-trak.tests    |  22
+ ++++++++++-----------
+ test/shaping/data/in-house/tests/collections.tests |  12 +++++------
+ 7 files changed, 18 insertions(+), 18 deletions(-)
+
+commit 21ede867df28d1214ca677a24ac65ab0b7e95f42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 13:19:34 2018 -0700
+
+    Fix possible overflow in bsearch impls
+
+    From bungeman.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/1314
+
+ src/hb-dsalgs.hh               | 2 +-
+ src/hb-open-type.hh            | 4 ++--
+ src/hb-ot-cmap-table.hh        | 2 +-
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-vector.hh               | 2 +-
+ 5 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 2ebf36010206cebdbe58bab6edf4e3bc011b6479
+Merge: 36c2c374 94e421ab
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Oct 25 13:05:06 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit 94e421abbfc7ede9aaf3c8d86bb0ff9992ea3123
+Author: Ben Wagner <bungeman@chromium.org>
+Date:   Thu Oct 25 13:44:27 2018 -0400
+
+    Remove some use of Crap in hb-set.
+
+    When hb_set_t::page_for_insert needs to insert at the end of the
+    page_map
+    it ends up evaluating '&page_map[i + 1]' which has hb_vector return an
+    lvalue of a Crap so that nothing can be moved to its address. This
+    turns
+    into issues with ThreadSanitizer on Crap when two threads modify
+    different
+    hb_set_t instances. This can be avoided by using '&page_map[i] + 1'
+    instead.
+
+ src/hb-set.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2798ac1c28edc4ba6f2283784d1027393f588f8c
+Author: azure-pipelines[bot]
+<azure-pipelines[bot]@users.noreply.github.com>
+Date:   Thu Oct 25 15:22:54 2018 +0000
+
+    Set up CI with Azure Pipelines
+
+ azure-pipelines.yml | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit 9a830a17318446dab86e1439f7167d8a698eb856
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Oct 25 01:55:10 2018 +0200
+
+    [appveyor] Drop Cygwin builds again
+
+    They are so slow and we had only a couple of Cygwin build failure
+    reported in ~5 years.
+
+ appveyor.yml | 11 -----------
+ 1 file changed, 11 deletions(-)
+
+commit 00e51a10832965f4c1d65a6d71c9582782f02c2b
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Oct 24 22:58:22 2018 +0200
+
+    [appveyor] Limit make to three jobs
+
+    https://github.com/harfbuzz/harfbuzz/pull/1309#issuecomment-432778270
+
+ appveyor.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ae9e8f292b2ad79b01776ae5785a94afbfc4b3e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 24 16:46:07 2018 -0700
+
+    [vowel-constraints] Reset continuation on all dottedcircles
+
+    One of the was missed before.  Not intentional.
+
+ src/gen-vowel-constraints.py                 | 9 +++++++--
+ src/hb-ot-shape-complex-vowel-constraints.cc | 9 +++++++--
+ 2 files changed, 14 insertions(+), 4 deletions(-)
+
+commit d2b20ba18dfe3fe507ee7cb64fd73e3f1e1e5ae0
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Oct 24 11:37:09 2018 +0200
+
+    [appveyor] Build on Cygwin and msys2 in parallel
+
+ appveyor.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0d2fa7fd4c4df0dcf7800b1267d1126e5a4b1ab1
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Oct 24 11:23:21 2018 +0200
+
+    [appveyor] Do not update msys2
+
+    Looks like AppVeyor has new enough packages for our needs. Cuts
+    CI build
+    time by 5 minutes.
+
+ appveyor.yml | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 6a3ad245609ce8496d08404b28217dca8d01c10b
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Oct 24 09:49:08 2018 +0200
+
+    [appveyor] Organize config file a bit
+
+ appveyor.yml | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 0cd7d041d83ae28e8c7d8a156750464af76de291
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Oct 24 09:43:10 2018 +0200
+
+    [appveyor] Don’t build branches with open PR twice
+
+ appveyor.yml | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 401cdf07922f66c762dabfd8e3d45c35e33de7c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 17:00:49 2018 -0700
+
+    [ot-font] Fix sign of ascent/descent
+
+    Some fonts, like msmincho, have positive number as descent
+    in vhea table.  That's wrong.  Just enforce sign on ascent/descent
+    when reading both horizontal and vertical metrics.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1248
+
+ src/hb-ot-hmtx-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit ba502dea1e81981f3893b5353400909bf60e354f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 16:46:10 2018 -0700
+
+    [morx] Fix cluster-merging when ligating
+
+    Only merge when actual ligature happened.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1305
+
+ src/hb-aat-layout-morx-table.hh                          |   7 ++++---
+ test/shaping/data/in-house/Makefile.sources              |   1 +
+ test/shaping/data/in-house/fonts/TestMORXTwentyeight.ttf | Bin 0 ->
+ 2660 bytes
+ test/shaping/data/in-house/tests/aat-morx.tests          |   1 +
+ 4 files changed, 6 insertions(+), 3 deletions(-)
+
+commit aa5af8d041521507f8bc8ded8a365ee56098388c
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Oct 23 15:45:35 2018 -0700
+
+    Fix size calculation in DEFINE_SIZE_ARRAY_SIZED.
+
+ src/hb-machinery.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 36c2c374bf9c2d0ca903e601760e69bfc3da5388
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Oct 23 15:11:09 2018 -0700
+
+    removed unused multi_val from DictVal
+
+ src/hb-cff-interp-common.hh      | 16 ----------------
+ src/hb-cff-interp-dict-common.hh |  3 ---
+ src/hb-ot-cff1-table.hh          |  2 +-
+ src/hb-ot-cff2-table.hh          |  1 -
+ 4 files changed, 1 insertion(+), 21 deletions(-)
+
+commit f33ad6d69216a983624e832177895481549bdc07
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 14:31:51 2018 -0700
+
+    [aat] Fix up previous commit and add files
+
+ src/hb-aat-map.cc  |  62 +++++++++++++++++++++++++++++++
+ src/hb-aat-map.hh  | 106
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-map.cc   |   1 +
+ src/hb-ot-shape.cc |  15 ++++++--
+ 4 files changed, 181 insertions(+), 3 deletions(-)
+
+commit ffe347844803a6a9036d8357b744a982f5e5a6c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 14:14:03 2018 -0700
+
+    [aat] Allow enabling/disabling features
+
+    Only works at entire-buffer range, not sub-ranges.
+
+    Test with:
+
+    $ hb-shape Zapfino.dfont Zapfino
+    [Z_a_p_f_i_n_o=0+2333]
+
+    $ hb-shape Zapfino.dfont Zapfino --features=-dlig
+    [Z=0+416|a=1@-21,0+264|p_f=2+433|i=4+181|n=5+261|o=6+250]
+
+    $ hb-shape Zapfino.dfont Zapfino --features=+dlig
+    [Z_a_p_f_i_n_o=0+2333]
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1303
+
+ src/Makefile.sources            |  2 ++
+ src/hb-aat-layout-morx-table.hh | 29 +++++++++++++++++++++++++----
+ src/hb-aat-layout.cc            |  8 ++++++++
+ src/hb-aat-layout.hh            |  3 +++
+ src/hb-ot-shape.cc              |  4 ++++
+ src/hb-ot-shape.hh              |  5 +++++
+ 6 files changed, 47 insertions(+), 4 deletions(-)
+
+commit 8be0e5fd4540b18e26b28b414bd99af3bb1548b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 13:39:50 2018 -0700
+
+    [ot-map] Minor
+
+ src/hb-ot-map.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e8fccbc36b2cc5e1c9f218c83cad7f606c03e7a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 13:25:03 2018 -0700
+
+    Minor
+
+ src/hb-ot-map.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 76324d95caa4b83cd4b515f516c2d3674455ea5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 13:09:30 2018 -0700
+
+    Shift code around
+
+ src/hb-ot-shape.cc | 18 ++++++++++--------
+ src/hb-ot-shape.hh |  9 +++------
+ 2 files changed, 13 insertions(+), 14 deletions(-)
+
+commit e1241636d60a63cbfd741288716b55797a4dc8ee
+Merge: 960267fc cf92d657
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Oct 23 11:25:51 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit cf92d6579e91d326598dcff93457fe85dfa962c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 03:10:56 2018 -0700
+
+    [trak] Allow disabling tracking for ranges of text
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1303
+
+ src/hb-aat-layout-trak-table.hh                 |  4 ++++
+ src/hb-ot-shape.cc                              | 11 +++++++----
+ src/hb-ot-shape.hh                              |  5 ++++-
+ test/shaping/data/in-house/tests/aat-trak.tests |  1 +
+ 4 files changed, 16 insertions(+), 5 deletions(-)
+
+commit 8869436cb8a338b46c138305966a4b7b2c3ee374
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 03:07:48 2018 -0700
+
+    When parsing feature ranges, accept ';' instead of ':'
+
+ src/hb-common.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 22ecefd88e1ea1841f363057b948aa792ac871a6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 23 00:52:05 2018 +0330
+
+    Make tracking optout possible using 'trak' ot feature
+
+    So '--features=-trak' or 'font-feature-settings: 'trak' 0;'
+    can prevent
+    applying of tracking if used.
+
+ src/hb-ot-shape.cc                              | 10 +++++++---
+ test/shaping/data/in-house/tests/aat-trak.tests |  2 ++
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+commit 6d40eb8372a2c74a6e1294b44a2b19c99d11e7da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 02:51:42 2018 -0700
+
+    Touch up on previous commit
+
+    https://github.com/harfbuzz/harfbuzz/pull/1273
+
+ src/HBIndicVowelConstraints.txt              |  97 ++++++
+ src/Makefile.am                              |   6 +-
+ src/Makefile.sources                         |   1 +
+ src/gen-vowel-constraints.py                 | 124 ++------
+ src/hb-ot-shape-complex-indic.cc             |  10 +-
+ src/hb-ot-shape-complex-use.cc               |  11 +-
+ src/hb-ot-shape-complex-vowel-constraints.cc | 433
+ ++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-vowel-constraints.hh | 447
+ ++-------------------------
+ 8 files changed, 606 insertions(+), 523 deletions(-)
+
+commit 205737acdc268b1c90cf00bde2d2038519a8bf48
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Oct 12 16:54:54 2018 -0400
+
+    [use] Prohibit visually ambiguous vowel sequences
+
+ src/Makefile.am                                    |   7 +-
+ src/Makefile.sources                               |   1 +
+ src/gen-vowel-constraints.py                       | 286 ++++++++++++++
+ src/hb-ot-shape-complex-indic.cc                   | 272 +------------
+ src/hb-ot-shape-complex-use.cc                     |   3 +-
+ src/hb-ot-shape-complex-vowel-constraints.hh       | 434
+ +++++++++++++++++++++
+ test/shaping/README.md                             |   4 +-
+ .../46669c8860cbfea13562a6ca0d83130ee571137b.ttf   | Bin 0 -> 7184 bytes
+ .../in-house/tests/use-vowel-letter-spoofing.tests |  94 +++++
+ 9 files changed, 827 insertions(+), 274 deletions(-)
+
+commit 48ed598a356983f4623029dd5e87254fb59e3691
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 02:19:32 2018 -0700
+
+    [VORG] Hook up to hb-ot-font's v_origin
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/544
+
+    Test added with NotoSansCJK, eg. with U+FF38.
+
+ src/hb-ot-face.cc                                        |   1 -
+ src/hb-ot-font.cc                                        |  11
+ +++++++++--
+ src/hb-ot-vorg-table.hh                                  |   6 ++++--
+ .../fonts/4cbbc461be066fccc611dcc634af6e8cb2705537.ttf   | Bin 0 ->
+ 2808 bytes
+ test/shaping/data/in-house/tests/vertical.tests          |   1 +
+ 5 files changed, 14 insertions(+), 5 deletions(-)
+
+commit 097ecfd4a991d4fa306bab7330d9952966e94d1f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 02:09:42 2018 -0700
+
+    [VORG] Add get_y_origin()
+
+    Unhooked.
+
+ src/hb-ot-vorg-table.hh | 16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+commit 6fb24d5e3e0cf61c0ed3574e5bcf4598a13d6b69
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 01:58:59 2018 -0700
+
+    [VORG] Add VORG table
+
+    Cherry-picked from cff-subset branch.
+
+ src/Makefile.sources    |   1 +
+ src/hb-ot-face.cc       |   1 +
+ src/hb-ot-face.hh       |   1 +
+ src/hb-ot-vorg-table.hh | 168
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 171 insertions(+)
+
+commit 531f9822b2e8a60f03c43d6f86ef9ed32c951f0e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 01:32:08 2018 -0700
+
+    [morx] Add a few debug messages to Ligature chain
+
+ src/hb-aat-layout-morx-table.hh | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 0e5bcdef7fb592f986ad5b4e07b80d2efb5e3344
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 23 00:39:44 2018 -0700
+
+    [morx] Clear stack upon underflow when acting ligatures
+
+ src/hb-aat-layout-morx-table.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 1bfb96a9c8d7653f0dee5c5fab3c6e85cea900cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 23:41:47 2018 -0700
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   2 +-
+ .../data/text-rendering-tests/fonts/TestTRAKOne.ttf      | Bin 0 ->
+ 1752 bytes
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 792071de4075cb9af0793f0d7c70da0780923bb6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 23:38:34 2018 -0700
+
+    [morx] Leave ligature on stack after ligating
+
+    Test with Apple Color Emoji.ttf of ~66MB and following sequence:
+
+    ./hb-shape Apple\ Color\ Emoji-old.ttf --font-funcs=ot -u
+    U+1F468,200d,U+1F469,200d,U+1F467,200d,1f466
+
+    Should form full family if matching works correctly.  It first makes
+    family of three, then makes family of four out of that and the last
+    two characters.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1292
+
+ src/hb-aat-layout-morx-table.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit e1b8e933f099efae3c3e1f5706be19120b44de20
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 23 09:23:48 2018 +0330
+
+    [ci] Disable llvm-gcc
+
+      #define Null(Type) Null<typename hb_remove_const<typename
+      hb_remove_reference<Type>::value>::value>()
+
+    raises:
+      hb-blob.cc: In function 'hb_blob_t* hb_blob_get_empty()':
+      hb-blob.cc:194: error: using 'typename' outside of template
+      hb-blob.cc:194: error: using 'typename' outside of template
+
+    Removing "typename"s fixes the issue but makes newer compiler fail
+    apparently.
+
+    Probably downstream can patch that locally till we get a solution.
+
+ .circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8c78ced95b639730efd0edc521e4e81ad50af501
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 21:49:42 2018 -0700
+
+    Unbreak builds
+
+ src/hb-dsalgs.hh    | 2 +-
+ src/hb-open-type.hh | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 8d689f8a7bccda861bcb286d52f1a90fca52df0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 21:33:18 2018 -0700
+
+    Add hb_array<>() specialization for UnsizedArrayOf
+
+    Related https://github.com/harfbuzz/harfbuzz/issues/1301
+
+ src/hb-aat-layout-trak-table.hh | 2 +-
+ src/hb-open-file.hh             | 2 +-
+ src/hb-open-type.hh             | 8 ++++++++
+ src/hb-ot-color-cpal-table.hh   | 6 +++---
+ 4 files changed, 13 insertions(+), 5 deletions(-)
+
+commit abfbba191141c3e3cf2a391f365b5323f9dc37c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 21:27:45 2018 -0700
+
+    Add hb_array<>()
+
+    Simplifies transient object creation.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1301
+
+ src/hb-aat-layout-trak-table.hh | 2 +-
+ src/hb-dsalgs.hh                | 2 ++
+ src/hb-open-file.hh             | 3 +--
+ src/hb-ot-color-cpal-table.hh   | 6 +++---
+ 4 files changed, 7 insertions(+), 6 deletions(-)
+
+commit 17ffbc070ff4190d8ebaf88f8db62f19e6fa370d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 21:22:25 2018 -0700
+
+    [color] Use Index for colorIdx
+
+    Doesn't matter, but matches the description.
+
+ src/hb-ot-color-colr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 07386ea410af13e8fc844eb939a6c6e47c2adaf1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 21:18:27 2018 -0700
+
+    Remove const and references when binding Null()
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1299
+
+    Removes anomaly I was seeing in cpal table trying to use implicit
+    Null(NameID).
+
+ src/hb-atomic.hh              | 5 +----
+ src/hb-common.cc              | 2 +-
+ src/hb-ft.cc                  | 2 +-
+ src/hb-null.hh                | 4 ++--
+ src/hb-open-type.hh           | 6 ++----
+ src/hb-ot-color-cpal-table.hh | 8 ++------
+ src/hb-static.cc              | 1 -
+ src/hb.hh                     | 9 +++++++++
+ 8 files changed, 18 insertions(+), 19 deletions(-)
+
+commit b18acab7bce062fef397d3d8b0efc7826f473b50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 18:20:57 2018 -0700
+
+    [color] Add HB_COLOR
+
+    Normally I would have added to_string / from_string like other types
+    have.  But since we don't use hb_color_t much, I'm not going to
+    do that.
+    Although, if we did, we could use it in hb-view to parse colors...
+
+ src/hb-common.h | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit 228f96c9d09272c8f677935a640e75e173b817a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 16:55:12 2018 -0700
+
+    [color] Finish reviewing / revamping CPAL
+
+    Now to hb_color_t.
+
+ src/hb-ot-color-cpal-table.hh | 52
+ ++++++++++++++++++++++---------------------
+ src/hb-ot-color.cc            | 33 +++++----------------------
+ src/hb-ot-color.h             | 10 ++++-----
+ 3 files changed, 38 insertions(+), 57 deletions(-)
+
+commit 960267fc4315a138f0963e78407e3af2ec6007af
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Oct 22 16:37:39 2018 -0700
+
+    fix build attempt ^4
+
+ src/hb-ot-cff-common.hh | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit 683fad062792a199e2fe86fe161f41b9389d08c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 16:35:03 2018 -0700
+
+    [color] Minor
+
+ src/hb-ot-color.cc | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit 14474d21040bf9b025b53bb9b0df599eaf260119
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 16:30:30 2018 -0700
+
+    [color] Rely on CPALV1Tail Null object
+
+ src/hb-ot-color-cpal-table.hh | 39
+ ++++++++++++++-------------------------
+ 1 file changed, 14 insertions(+), 25 deletions(-)
+
+commit d7865107ea4664e04c03a1d79678cdcadc0d5ea5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 16:18:34 2018 -0700
+
+    Remove const from hb_array_t details
+
+    Will come in through <T> if desired.
+
+ src/hb-aat-layout-trak-table.hh | 6 +++---
+ src/hb-dsalgs.hh                | 6 +++---
+ src/hb-open-file.hh             | 4 ++--
+ 3 files changed, 8 insertions(+), 8 deletions(-)
+
+commit f3336580dd0c6959a1871f92b4a37f7c0a4b2160
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 16:16:21 2018 -0700
+
+    [color] Use hb_array_t in CPAL
+
+    Doesn't work though, ouch :(.  Need to figure out if it's unreasonable
+    to expect Null(T) inside hb_array_t<T> to see the later specialization
+    of Null for NameID.
+
+ src/hb-open-type.hh           |  3 ++-
+ src/hb-ot-color-cpal-table.hh | 47
+ ++++++++++++++++++++++---------------------
+ src/hb-static.cc              |  1 +
+ 3 files changed, 27 insertions(+), 24 deletions(-)
+
+commit 5ae18855d115577ff796158d483db7b890d9956f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 14:54:55 2018 -0700
+
+    [color] Check for null CPAL arrays
+
+    We cannot use a nullable offset here though.
+
+ src/hb-ot-color-cpal-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 69ab72e4aa7cbf197873d38f7e623866b4e40502
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 14:51:40 2018 -0700
+
+    [color] More CPAL rename
+
+ src/hb-ot-color-cpal-table.hh | 104
+ +++++++++++++++++++++---------------------
+ src/hb-ot-color.cc            |   6 +--
+ 2 files changed, 54 insertions(+), 56 deletions(-)
+
+commit 0befb06c468aa36f3337b5ef2235f6d69dda8397
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 14:46:21 2018 -0700
+
+    [color] More CPAL rename
+
+ src/hb-ot-color-cpal-table.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 3600d206037ef23d6448c79a3f010c4f903a971c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 14:43:12 2018 -0700
+
+    [color] Rename vars in CPAL
+
+ src/hb-ot-color-cpal-table.hh | 32 ++++++++++++++++----------------
+ src/hb-ot-color.cc            |  1 +
+ 2 files changed, 17 insertions(+), 16 deletions(-)
+
+commit ba055a8d53595ab49747ed3e02d90c9b6a3cf4f3
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Oct 22 16:20:04 2018 -0700
+
+    fix build attempt ^3
+
+ test/api/test-ot-extents-cff.c | 2 +-
+ test/api/test-subset-cff1.c    | 1 +
+ test/api/test-subset-cff2.c    | 1 +
+ 3 files changed, 3 insertions(+), 1 deletion(-)
+
+commit b11032afaefb2c84f9a4bbffe95c91f6374df802
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Oct 22 15:52:37 2018 -0700
+
+    fix build attempt ^2
+
+ src/hb-ot-cff-common.hh        | 2 +-
+ test/api/test-ot-extents-cff.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 3d3df5575c5be0e3c69b99ca1d8df2cea1672aaf
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Oct 22 15:23:39 2018 -0700
+
+    fix build attempt
+
+ src/hb-ot-cff-common.hh        |  5 ++++-
+ test/api/test-ot-extents-cff.c | 11 +++++------
+ test/api/test-subset-cff1.c    | 19 +++++++++----------
+ test/api/test-subset-cff2.c    | 11 +++++------
+ 4 files changed, 23 insertions(+), 23 deletions(-)
+
+commit 0babf761c986855f9cdd1a2679380ee6a02390c8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 23 01:33:45 2018 +0330
+
+    Adopt dump-emoji with latest unreleased APIs changes (#1297)
+
+ src/dump-emoji.cc | 24 +++++++++++-------------
+ 1 file changed, 11 insertions(+), 13 deletions(-)
+
+commit 7997144b5f08c81b2cce2c7c2a085fb7eeb506e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 13:02:04 2018 -0700
+
+    [color] Revamp palette API
+
+ src/hb-ot-color.cc       |  81 ++++++++++++++---------------
+ src/hb-ot-color.h        |  26 +++++-----
+ test/api/test-ot-color.c | 130
+ +++++++++++++++++++++++------------------------
+ 3 files changed, 117 insertions(+), 120 deletions(-)
+
+commit 3bf91bd2690cda34a7687ed5465dc4bb0672f2b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 12:40:38 2018 -0700
+
+    [color] Rewrite colr access
+
+    COLR table has one function: return layers for a glyph, and we
+    expose exactly
+    that, so should just wire it through.  Also use sub_array() for
+    verifiable
+    safety.
+
+    Also, BaseGlyphRecord's null object is enough.  We don't need to
+    special-case
+    the not-found.
+
+ src/hb-dsalgs.hh              | 11 +++++++++
+ src/hb-open-type.hh           |  2 +-
+ src/hb-ot-color-colr-table.hh | 53
+ +++++++++++++++++++++++--------------------
+ src/hb-ot-color.cc            | 19 +---------------
+ 4 files changed, 41 insertions(+), 44 deletions(-)
+
+commit 1de17bdb80b0668f4d4a4700e3f80c8caee3303d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 22 10:29:01 2018 -0700
+
+    [colr] Add hb_ot_color_layer_t
+
+    We never return parallel arrays from functions.  That's inconvenient
+    and hard to bind.
+
+ src/hb-ot-color.cc       | 18 ++++++++----------
+ src/hb-ot-color.h        | 22 ++++++++++++++++------
+ test/api/test-ot-color.c | 33 +++++++++++++++------------------
+ 3 files changed, 39 insertions(+), 34 deletions(-)
+
+commit 3b3668acc8b16afacb96d8c525eff603ef5f411f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 21 19:23:11 2018 -0700
+
+    [color] Rename / reorder a bit
+
+    Implement has_data() for realz.
+
+ src/hb-ot-color-colr-table.hh |  2 ++
+ src/hb-ot-color-cpal-table.hh |  2 ++
+ src/hb-ot-color.cc            | 78
+ ++++++++++++++++++++++++-------------------
+ src/hb-ot-color.h             | 33 ++++++++++++------
+ test/api/test-ot-color.c      | 30 ++++++++---------
+ 5 files changed, 85 insertions(+), 60 deletions(-)
+
+commit 570b77f7d2b41262ccb20fadbee2c6b455cd06c6
+Merge: 857c5827 d440c8d3
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Oct 22 13:06:47 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit 9085a72deb041cf10edfa61d24b7c25f947f736b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 21 19:08:25 2018 -0700
+
+    [cpal] Touch up palette flags
+
+ src/hb-ot-color.h        | 16 ++++++++++------
+ test/api/test-ot-color.c |  4 ++--
+ 2 files changed, 12 insertions(+), 8 deletions(-)
+
+commit ee11fae9d0d2c16a3a4b4ecf5cf328ffe950bb03
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 21 19:02:47 2018 -0700
+
+    [color] Rename "gid" to "glyph"
+
+    We don't expose "gid" in API.
+
+ src/hb-ot-color.cc | 12 ++++++------
+ src/hb-ot-color.h  |  8 ++++----
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 228fa71bf9186faedff48b3a259d696c7c07b5b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 21 17:43:29 2018 -0700
+
+    [colr] Move sanitize
+
+ src/hb-ot-color-colr-table.hh | 17 ++++++++---------
+ 1 file changed, 8 insertions(+), 9 deletions(-)
+
+commit d440c8d3fbb907f17b1eb9287918009ced27a8c1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 22 22:07:59 2018 +0330
+
+    Add chromacheck Emoji test fonts and minor preparations (#1294)
+
+ src/hb-ot-color.cc                  |  26 ++++++++++++++++++++++++++
+ src/hb-ot-face.hh                   |   8 +++++---
+ test/api/fonts/README               |   2 ++
+ test/api/fonts/chromacheck-cbdt.ttf | Bin 0 -> 792 bytes
+ test/api/fonts/chromacheck-colr.ttf | Bin 0 -> 652 bytes
+ test/api/fonts/chromacheck-sbix.ttf | Bin 0 -> 864 bytes
+ test/api/fonts/chromacheck-svg.ttf  | Bin 0 -> 792 bytes
+ test/api/hb-test.h                  |   2 +-
+ test/api/test-ot-color.c            |  21 +++++++++++++++++++++
+ 9 files changed, 55 insertions(+), 4 deletions(-)
+
+commit 857c58279e82897ed69e8ade2f736073fa12883b
+Merge: 51fba41c b92b9d7e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Oct 22 09:57:20 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit b92b9d7e5290eaa83e94fd40cddaee71628a3c2a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 21 17:42:51 2018 -0700
+
+    [colr] Move compare function into a static
+
+    Not sure if MSVC would be unhappy about this.
+
+ src/hb-ot-color-colr-table.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit b6b171732a12b396a704984699bd0da906f5dc24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 21 17:41:49 2018 -0700
+
+    [colr] Minor
+
+ src/hb-ot-color-colr-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit a6ade3471e730d7a8b56e4ed706a8eb126e957f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 21 17:39:39 2018 -0700
+
+    [colr] Move sanitize() to right place
+
+    Sanitize always comes just before data member definitions, so
+    it's easy to cross-check.
+
+ src/hb-ot-color-colr-table.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 24adc1575745a711558dab79488760f1ceb24750
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 21 17:39:00 2018 -0700
+
+    [colr] Touch up a bit
+
+    When a struct is plain old data with no references, etc, it's okay
+    to mark its members public.
+
+ src/hb-ot-color-colr-table.hh | 36 +++++++++++++++++++++++-------------
+ 1 file changed, 23 insertions(+), 13 deletions(-)
+
+commit cc6e77ca98e90fb531dd90a5c9c41d14d1dda9c4
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sun Oct 21 13:29:40 2018 +0200
+
+    [color] Fix documentation a bit
+
+ src/hb-ot-color.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 37ba2413c19f6a1d62868178fc80f870ee44e7ab
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 21 11:46:51 2018 +0330
+
+    Minor
+
+ src/hb-ot-color-cpal-table.hh | 10 +++++-----
+ src/hb-ot-color.cc            | 25 ++++++++++++++-----------
+ src/hb-ot-color.h             | 12 ++++++------
+ 3 files changed, 25 insertions(+), 22 deletions(-)
+
+commit 44f79b4bf8ac341c5968a27f6a2a13a8af48b34f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 21 10:17:34 2018 +0330
+
+    Remove _palette_entry_count as can be done with _palette_colors
+
+ src/hb-ot-color.cc       | 18 ++----------------
+ src/hb-ot-color.h        |  3 ---
+ test/api/test-ot-color.c |  8 ++------
+ 3 files changed, 4 insertions(+), 25 deletions(-)
+
+commit 6795dcfc0884b87b72fce8d902654f28ffe1366c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 21 09:51:15 2018 +0330
+
+    [test] Test hb_ot_color_has_{colr,cpal}_data
+
+ src/dump-emoji.cc        |  3 ++-
+ src/hb-ot-color.cc       |  7 ++++---
+ test/api/test-ot-color.c | 23 +++++++++++++++++++++++
+ 3 files changed, 29 insertions(+), 4 deletions(-)
+
+commit b8ee3a0ec89d63721618ac90c01ac6da228f5055
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 21 09:44:16 2018 +0330
+
+    [CPAL] Add palette entry and enable palette flag API
+
+ src/hb-ot-color-cpal-table.hh |  66 +++++++++++++++----------
+ src/hb-ot-color.cc            | 109
+ ++++++++++++++++++++++++------------------
+ src/hb-ot-color.h             |  23 +++++++++
+ test/api/test-ot-color.c      |  35 ++++++++++++--
+ 4 files changed, 158 insertions(+), 75 deletions(-)
+
+commit d4261b4bb6d20fac7deebacfbe120fb84a92e423
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 21 08:48:07 2018 +0330
+
+    Add API test for hb_ot_color_get_color_layers
+
+ src/dump-emoji.cc        |  3 ++-
+ src/hb-ot-color.cc       |  2 +-
+ src/hb-ot-color.h        |  2 ++
+ test/api/test-ot-color.c | 31 +++++++++++++++++++++++++++++--
+ 4 files changed, 34 insertions(+), 4 deletions(-)
+
+commit 456978d408cd41156e1123abfc3689800558e89b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 21 08:26:40 2018 +0330
+
+    Address COLR/CPAL reviews and revive cpal_v1 tests
+
+ src/dump-emoji.cc             |  26 ++++----
+ src/hb-common.h               |  12 ++++
+ src/hb-ot-color-cpal-table.hh |  37 +++++-------
+ src/hb-ot-color.cc            | 136
+ +++++++++++++++++++++++++-----------------
+ src/hb-ot-color.h             |  38 +++---------
+ test/api/test-ot-color.c      | 101 +++++++++++++++----------------
+ 6 files changed, 179 insertions(+), 171 deletions(-)
+
+commit 687f679b80c071c69d0924f07a315f9d2691b7fc
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 20 17:50:39 2018 +0330
+
+    [color] Fix alpha channel value and adjust spaces
+
+ src/dump-emoji.cc          | 36 ++++++++++++++++++------------------
+ src/hb-buffer-serialize.cc | 14 +++++++-------
+ src/hb-ot-color.cc         | 10 +++++-----
+ 3 files changed, 30 insertions(+), 30 deletions(-)
+
+commit 00e94ce24efb1f5b3a9cd13c0b9f81f405ad8055
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 20 00:31:04 2018 +0330
+
+    [dump-emoji] Formatting
+
+ src/dump-emoji.cc | 26 ++++++++++++++++----------
+ 1 file changed, 16 insertions(+), 10 deletions(-)
+
+commit e9d798dc12d42e97ae8c19e7b73e25abc34d265a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 19 18:30:01 2018 +0330
+
+    [test] Use hb_test_open_font_file
+
+ test/api/test-ot-color.c | 16 ++--------------
+ 1 file changed, 2 insertions(+), 14 deletions(-)
+
+commit e8a6f5b8039cce3f7ec568fd90fe73690e49a037
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 19 18:23:42 2018 +0330
+
+    Add three macros for separating color channels
+
+ src/dump-emoji.cc        |  8 ++++----
+ src/hb-ot-color.cc       |  1 -
+ src/hb-ot-color.h        | 15 ++++++++++-----
+ test/api/test-ot-color.c | 10 +++++-----
+ 4 files changed, 19 insertions(+), 15 deletions(-)
+
+commit 0e33467e52942e62e04cf825a6bd105fa311c864
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 19 17:44:06 2018 +0330
+
+    Make ot-color tests pass
+
+ test/api/test-ot-color.c | 52
+ ++++++++++++++++++++++++------------------------
+ 1 file changed, 26 insertions(+), 26 deletions(-)
+
+commit d4e928b1421c154adbda9b6e1f2cf804b21654cb
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue May 1 17:16:46 2018 +0200
+
+    [color] Minimal API for COLR/CPAL
+
+ src/Makefile.sources                               |   1 +
+ src/dump-emoji.cc                                  | 114
+ +++++++++++----------
+ src/hb-ot-color-colr-table.hh                      |  12 +--
+ src/hb-ot-color-cpal-table.hh                      |  51 +++------
+ src/hb-ot-color.cc                                 |  87 +++++++++++-----
+ src/hb-ot-color.h                                  |  85 +++++++++++++++
+ src/hb-ot-face.hh                                  |   3 +
+ src/hb-ot.h                                        |   1 +
+ .../fonts/cpal-v0.ttf}                             | Bin
+ .../fonts/cpal-v1.ttf}                             | Bin
+ test/api/test-ot-color.c                           |  43 +++++---
+ 11 files changed, 257 insertions(+), 140 deletions(-)
+
+commit 0229eaea299443b4faa3bd086f23ec1496d6112c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 22 10:51:37 2018 +0330
+
+    [fuzz] Add a found hb-subset testcase
+
+ ...z-testcase-minimized-hb-subset-fuzzer-5725847365877760 | Bin 0 ->
+ 880 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 0ecddad7c5948ecd7879bc7507f8a7a2d99eee86
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 22 00:44:28 2018 +0330
+
+    [ci] Disable flaky -windows-x64 and add a comment for iOS
+
+ .circleci/config.yml | 20 +++++++++++---------
+ 1 file changed, 11 insertions(+), 9 deletions(-)
+
+commit 9b3461574f6473c8ff7c995202858cf46012eed8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 21 11:37:38 2018 +0330
+
+    [fuzz] Add more testcases
+
+    Fixed already but better to have anyway.
+
+    One didn't have minimized but it was only 164 B, so
+
+ ...uzz-testcase-minimized-hb-shape-fuzzer-5706010589659136 | Bin 0 ->
+ 52 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 4fa94a3e39c21bc1dcdbbd5bda99bff1e1490b0e
+Merge: 217a3728 c110878c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 21 11:36:41 2018 +0330
+
+    Merge pull request #1290 from ebraminio/testopenfont
+
+    [test] Unify font file opening across the tests
+
+commit c110878cb61f5df99e9d97dda253f2987ddce58e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 21 11:07:17 2018 +0330
+
+    [test] Unify font file opening across the tests
+
+ test/api/hb-subset-test.h        | 21 ---------------------
+ test/api/hb-test.h               | 21 +++++++++++++++++++++
+ test/api/test-collect-unicodes.c |  6 +++---
+ test/api/test-multithread.c      | 26 +++++---------------------
+ test/api/test-ot-name.c          | 27 ++++-----------------------
+ test/api/test-subset-cmap.c      |  8 ++++----
+ test/api/test-subset-glyf.c      | 28 ++++++++++++++--------------
+ test/api/test-subset-hdmx.c      | 14 +++++++-------
+ test/api/test-subset-hmtx.c      | 20 ++++++++++----------
+ test/api/test-subset-os2.c       |  4 ++--
+ test/api/test-subset-post.c      |  4 ++--
+ test/api/test-subset-vmtx.c      |  6 +++---
+ test/api/test-subset.c           |  6 +++---
+ 13 files changed, 78 insertions(+), 113 deletions(-)
+
+commit 217a3728b4991a855070678bc079cb400eee605a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 20 20:39:56 2018 -0700
+
+    [fuzzing] Add more font
+
+ .../clusterfuzz-testcase-hb-shape-fuzzer-5097734906839040 | Bin 0 ->
+ 164 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 1e39833ba8547c90a0a4ed7f265a6c4bc8eb8fe1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 20 16:56:06 2018 -0700
+
+    [docs] Minor
+
+ src/hb-buffer.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit a5ad8c658dac1fbe63d1034cdfe8df33f50462b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 20 16:52:55 2018 -0700
+
+    [docs] More fixes
+
+ src/hb-ot-layout.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 2d9198f205fafda557520d7206f9cfbf3373353f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 20 16:50:39 2018 -0700
+
+    [docs] Fix for hb-version.h being in src tree
+
+ docs/Makefile.am | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 314b1af74f1fb71ea5cfcb5a58766773f0b2a5a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 20 16:49:16 2018 -0700
+
+    [docs] Fix warning
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1260
+
+ src/hb-deprecated.h | 6 ------
+ src/hb-unicode.cc   | 1 +
+ 2 files changed, 1 insertion(+), 6 deletions(-)
+
+commit b713c1397718bf1f702a2ead2afb4dcee2c1505a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 20 14:56:28 2018 -0700
+
+    [kerx] Implement tuple-kerning in Format0
+
+ src/hb-aat-layout-kerx-table.hh | 44
+ ++++++++++++++++++++++++++++-------------
+ 1 file changed, 30 insertions(+), 14 deletions(-)
+
+commit 0a3b7a0fb0734a66926dfda5d95d3cacea8890ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 20 13:14:07 2018 -0700
+
+    2.0.2
+
+ NEWS             | 6 ++++++
+ configure.ac     | 2 +-
+ src/hb-version.h | 4 ++--
+ 3 files changed, 9 insertions(+), 3 deletions(-)
+
+commit 8931bc4a6b41a2a41069b99cb5c551fa30216f0b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 20 23:23:32 2018 +0330
+
+    [test] Fix -Wunused-parameter on test-font.c
+
+ test/api/test-font.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 68b705076808d4b0a4ac3bfa945b8f9ae23db1df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 20 12:09:41 2018 -0700
+
+    [kerx] Fix sanitize of KerxSubtableFormat2::array read
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11033
+
+ src/hb-aat-layout-kerx-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 00fdbca4f6a5c4623b9c4838da502cccce8aaa74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 20 12:04:51 2018 -0700
+
+    [aat] Fix LookupFormat10 sanitize
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11060
+
+ src/hb-aat-layout-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f11c557662dee16a59bb54276c50a96e4e675201
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 20 11:56:30 2018 -0700
+
+    [test] Fix leak
+
+ test/api/test-font.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 440a675c7cc72c7c77b4ad7b20c855c53808ef48
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 20 21:13:25 2018 +0330
+
+    [TODO] Remove BCP 47 language handling item
+
+    Closes https://github.com/harfbuzz/harfbuzz/issues/1286
+
+ TODO | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit d39acc5a95f968b0dbfd5a942abda606d9aa3343
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 20 12:20:30 2018 +0330
+
+    [fuzzing] Add new testcases
+
+ .../clusterfuzz-testcase-hb-shape-fuzzer-5688420752424960 | Bin 0 ->
+ 163 bytes
+ ...zz-testcase-minimized-hb-shape-fuzzer-5688420752424960 | Bin 0 ->
+ 69 bytes
+ 2 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 1e55e21dea78aaaddc0715e7df96fd198ec8f78a
+Merge: 964ae32a d084719f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 20 07:45:46 2018 +0330
+
+    Merge pull request #1283 from khaledhosny/cygwin
+
+    Cygwin fixes and CI build
+
+commit 964ae32aac793540a49c44efab878592394d48db
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 20 07:39:18 2018 +0330
+
+    Run valgrind on run-shape-fuzzer only when RUN_VALGRIND is set (#1285)
+
+ .circleci/config.yml                   | 2 +-
+ test/fuzzing/run-shape-fuzzer-tests.py | 4 +++-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+commit f70f994112b2577271c20a929f7b980fa1d17428
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 19 20:00:36 2018 -0700
+
+    Minor
+
+ test/api/test-ot-name.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4e09fb8f7a93ec0c8d7f71cd58772ba468b5523f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 19 19:59:41 2018 -0700
+
+    Oops. Fix build
+
+ test/api/test-map.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9e288d29d86ef27acacd397b1abf04d512f1e61e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 19 19:47:27 2018 -0700
+
+    [test-map] Cosmetic
+
+ test/api/test-map.c | 11 ++++-------
+ 1 file changed, 4 insertions(+), 7 deletions(-)
+
+commit 7c2c8ac301b526da8b5384d6b90f156ca096568e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 19 19:37:46 2018 -0700
+
+    2.0.1
+
+ NEWS             | 15 ++++++++++++++-
+ configure.ac     |  2 +-
+ src/hb-version.h |  4 ++--
+ 3 files changed, 17 insertions(+), 4 deletions(-)
+
+commit 5a24ea15e0c242c3e2a4a49980da3ab7dd61a3df
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Sat Oct 20 08:09:52 2018 +0700
+
+    Make more 'coords' params const.
+
+ src/hb-ot-layout-common.hh   | 8 ++++----
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ src/hb-ot-var-hvar-table.hh  | 2 +-
+ src/hb-ot-var-mvar-table.hh  | 2 +-
+ 4 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 08b7172969b442cc83b47f44e685a0495b2d8cd4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 19 19:12:33 2018 -0700
+
+    [font] Fix parallel funcs passing to eachover in infinite-loop
+
+    Fixes test just added.
+
+ src/hb-font.cc | 20 +++++++++++++-------
+ src/hb-font.hh |  8 ++++++++
+ 2 files changed, 21 insertions(+), 7 deletions(-)
+
+commit 77d5c3df07bec8e9d2dd57f89d5810b768bdc4f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 19 19:01:01 2018 -0700
+
+    [font] Add failing test amongst font-func parallels infinite-looping
+
+    Reported by Nona while updating Android to HarfBuzz 2.0.0.
+
+ test/api/test-font.c | 64
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 64 insertions(+)
+
+commit d084719ff5a9e0e363bf352037f85b884bff11a7
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Oct 20 00:18:36 2018 +0200
+
+    Add Cygwin CI build
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1274
+
+ appveyor.yml | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+commit 29d877518fc2c29083cd7b955b422087966235f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 19 16:06:54 2018 -0700
+
+    [kerx] Implement variation-kerning tables (without the variation part)
+
+    SFSNDisplay uses these.  We just apply the default kern without
+    variations right now.  But at least makes the default kern work.
+
+ src/hb-aat-layout-kerx-table.hh | 37
+ +++++++++++++++++++++++++++++--------
+ 1 file changed, 29 insertions(+), 8 deletions(-)
+
+commit f7c0b4319c6f82f1e0020a0029469d8953a7a161
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 19 15:23:49 2018 -0700
+
+    [aat] Implement LookupFormat10
+
+ src/hb-aat-layout-ankr-table.hh |  6 +++--
+ src/hb-aat-layout-common.hh     | 55
+ ++++++++++++++++++++++++++++++++++++++---
+ src/hb-machinery.hh             |  4 +++
+ src/hb-open-type.hh             |  3 +++
+ 4 files changed, 63 insertions(+), 5 deletions(-)
+
+commit cf92cb7e002f479505fed8c2c55ab12dcbea2d83
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Oct 19 22:21:39 2018 +0200
+
+    Use g_strdup instead of strdup
+
+    Cygwin does not seem to have strdup.
+
+ util/options.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 30cbe6158de1ddc0546d55e4edc1fe264e1b86ef
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Oct 19 22:04:56 2018 +0200
+
+    Use O_BINARY instead of _O_BINARY
+
+    Cygwin does not seem to have the later
+
+ src/hb-blob.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 257ded1f9ec653d15e79d2ea0a83bd8c5c53d831
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 19 11:20:14 2018 -0700
+
+    [trak] Fix test for previous fix
+
+ test/shaping/data/in-house/tests/aat-trak.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 72bb139b807c21f1569058fb5fb260dcdd81eba4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 19 11:15:35 2018 -0700
+
+    [RELEASING] Post-mortem
+
+    Re https://github.com/harfbuzz/harfbuzz/issues/1271
+
+ RELEASING.md | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 79b63561552bdfe8dc67a450d740fda8802486ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 19 11:00:20 2018 -0700
+
+    [trak] Fix extrapolation at end side
+
+ src/hb-aat-layout-trak-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2352cc3539b2e58d0481cdb8b9cd48cbc09a778e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 19 09:58:45 2018 -0700
+
+    [kerx] Whitespace
+
+ src/hb-aat-layout-kerx-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 114f66dda6a07d61b5e64da5c44b05db7aa51cc9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 19 12:05:26 2018 +0330
+
+    Fix hb_map_is_empty logic
+
+    This needs reviewing
+
+ src/hb-map.hh       |  2 +-
+ test/api/test-map.c | 13 ++++++++-----
+ 2 files changed, 9 insertions(+), 6 deletions(-)
+
+commit 9df2fb1611e03e401f0d5a9432b440641085ba1e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 19 12:04:47 2018 +0330
+
+    Add API tests for hb_map_t
+
+ src/Makefile.am      |   2 +-
+ test/api/Makefile.am |   6 ++-
+ test/api/test-map.c  | 114
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 120 insertions(+), 2 deletions(-)
+
+commit 8a5eba711069285e8d8b6d682eea0090256527bb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 19 10:20:16 2018 +0330
+
+    [test] cosmetic, use g_assert_cmpint
+
+ test/api/test-ot-name.c | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit c6eb5e852c24e12fec3138cf9def5eb76acedfd6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 19 10:14:25 2018 +0330
+
+    Don't report deprecated symbols as unused symbols
+
+ src/Makefile.am      | 2 ++
+ test/api/Makefile.am | 4 +++-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 34f357c78a7a530fdb3580ec9d3d865600c06128
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 19 10:13:53 2018 +0330
+
+    Add test for hb_set_del
+
+ test/api/test-set.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 4594730f64e534e975065afce925b581fd9c6acd
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Fri Oct 19 22:12:25 2018 +0700
+
+    Remove redundant return at end of void-returning function.
+
+ src/hb-ot-layout-gsubgpos.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 093c7c4a54b37f5b12ad21e2d67f109597d068b1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 19 18:46:41 2018 +0330
+
+    [ci] Run valgrind on test/api
+
+    run-shape-fuzzer-tests.py automatically runs valgrind if see available
+    but test/api runs it by request, we probably should normalize the
+    approaches
+    later
+
+ .circleci/config.yml | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 8d1e479d1dcf7789be99a6cd0db0b883a90299dc
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Thu Oct 18 22:18:42 2018 +0700
+
+    Use bool literals instead of 0/1.
+
+ src/hb-common.cc               | 2 +-
+ src/hb-coretext.cc             | 4 ++--
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-ot-tag.cc               | 2 +-
+ src/hb-shape-plan.cc           | 8 ++++----
+ 5 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 257d0e5aa36fd5b3e54e04918ce12bb7d7e0d177
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Fri Oct 19 22:49:21 2018 +0700
+
+    Fix typos.
+
+ BUILD.md                       | 2 +-
+ CMakeLists.txt                 | 8 ++++----
+ README.python.md               | 2 +-
+ README.wine.md                 | 6 +++---
+ src/hb-machinery.hh            | 2 +-
+ src/hb-null.hh                 | 4 ++--
+ src/hb-open-file.hh            | 2 +-
+ src/hb-ot-layout-common.hh     | 2 +-
+ src/hb-ot-layout-gdef-table.hh | 2 +-
+ src/hb-ot-layout-gsub-table.hh | 2 +-
+ src/hb-ot-layout-gsubgpos.hh   | 2 +-
+ 11 files changed, 17 insertions(+), 17 deletions(-)
+
+commit b7cef8cb1dfaf1f0f2c0d79b96b171049b69466a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 19 09:24:21 2018 +0330
+
+    Enable valgrind and dedicate a bot to it
+
+ .circleci/config.yml                   | 13 +++++++++++++
+ test/fuzzing/run-shape-fuzzer-tests.py | 31
+ +++++++++++++++++++++++++++++++
+ 2 files changed, 44 insertions(+)
+
+commit bccd09d6c7baa99fdaccb8c5b3ff7e1834edd3bf
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 19 09:06:42 2018 +0330
+
+    Minor, tweak spaces on hb-shape-fuzzer.cc
+
+ test/fuzzing/hb-shape-fuzzer.cc | 42
+ ++++++++++++++++++++---------------------
+ 1 file changed, 21 insertions(+), 21 deletions(-)
+
+commit fbf665b307c8cc9f16f5897671bfdd8719a195b5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 19 08:09:53 2018 +0330
+
+    [fuzz] Add more found cases (#1275)
+
+ ...clusterfuzz-testcase-hb-shape-fuzzer-5728971283496960 | Bin 0 ->
+ 101 bytes
+ ...terfuzz-testcase-minimized-hb-fuzzer-5713868010553344 | Bin 0 ->
+ 370 bytes
+ ...terfuzz-testcase-minimized-hb-fuzzer-6278851874258944 | Bin 0 ->
+ 598 bytes
+ ...z-testcase-minimized-hb-shape-fuzzer-5649959857160192 | Bin 0 ->
+ 3608 bytes
+ ...z-testcase-minimized-hb-shape-fuzzer-5664873493561344 | Bin 0 ->
+ 400 bytes
+ ...z-testcase-minimized-hb-shape-fuzzer-5762953198960640 | Bin 0 ->
+ 62 bytes
+ ...z-testcase-minimized-hb-shape-fuzzer-5764636557705216 | Bin 0 ->
+ 2184 bytes
+ ...-testcase-minimized-hb-subset-fuzzer-5690658895953920 | Bin 0 ->
+ 2735 bytes
+ ...-testcase-minimized-hb-subset-fuzzer-5695279609675776 | Bin 0 ->
+ 135 bytes
+ ...-testcase-minimized-hb-subset-fuzzer-5718215406125056 | Bin 0 ->
+ 107 bytes
+ ...-testcase-minimized-hb-subset-fuzzer-5743250149736448 | Bin 0 ->
+ 103 bytes
+ ...-testcase-minimized-hb-subset-fuzzer-5765071062958080 | Bin 0 ->
+ 329 bytes
+ ...ized-hb-subset-get-codepoints-fuzzer-5930139383758848 | Bin 0 ->
+ 9410 bytes
+ 13 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 51fba41cc958ded3afc6c1e738895b0a81993e18
+Merge: e555ed96 3d9a0306
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Oct 18 13:08:42 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit e555ed961e86104e059861efe4245b7b146dbd3b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Oct 18 13:04:41 2018 -0700
+
+    added flex extents test
+
+ test/api/fonts/cff1_flex.otf   | Bin 0 -> 3152 bytes
+ test/api/test-ot-extents-cff.c |  23 +++++++++++++++++++++++
+ 2 files changed, 23 insertions(+)
+
+commit 8679d02b4b3f2f9147c4ea0319eb39851c4e40e6
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Oct 18 13:04:21 2018 -0700
+
+    implement flex ops for glyph extents/subset
+
+    also removed unused CSInterpEnv::move_[xy]_with_arg
+    fixed bug a width being left over on argStack with CFF1
+
+ src/hb-cff-interp-cs-common.hh | 157
+ +++++++++++++++++++++++++++++++++++------
+ src/hb-cff1-interp-cs.hh       |   1 +
+ src/hb-subset-cff1.cc          |   4 --
+ src/hb-subset-cff2.cc          |   4 --
+ 4 files changed, 138 insertions(+), 28 deletions(-)
+
+commit 3d9a0306ebb48706778fd2c487c3cacc7d508d6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 18 05:58:17 2018 -0700
+
+    2.0.0
+
+ NEWS                | 68
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ configure.ac        |  2 +-
+ src/hb-buffer.cc    |  4 ++--
+ src/hb-common.h     |  4 ++--
+ src/hb-deprecated.h | 18 +++++++-------
+ src/hb-font.cc      |  6 ++---
+ src/hb-font.h       |  2 +-
+ src/hb-ot-layout.cc |  8 +++----
+ src/hb-ot-name.h    |  4 ++--
+ src/hb-ot-tag.cc    |  4 ++--
+ src/hb-ot-tag.h     |  4 ++--
+ src/hb-version.h    |  6 ++---
+ 12 files changed, 99 insertions(+), 31 deletions(-)
+
+commit 535ca678bf9c8ab470ebf5ad84a090328d79d42b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 18 05:58:04 2018 -0700
+
+    [test] Don't use newer glib API
+
+ test/api/test-ot-tag.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 03e144135b5c691e3942d1aef917fe2246665fb6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 18 11:06:37 2018 +0330
+
+    [ubsan] Use unsigned int instead enum where needed (#1270)
+
+    Actually the check is right,
+
+    On -myanmar.hh, on that particular switch, OT_C is indic_category_t
+    but OT_D is myanmar_category_t so we are mixing the types in one
+    variable.
+
+    And on -arabic.cc, step can goes one number higher than step_t enum
+    in the
+    loop so we are actually using it as an unsinged int.
+
+ .circleci/config.yml               |  2 +-
+ src/hb-ot-shape-complex-arabic.cc  |  4 ++--
+ src/hb-ot-shape-complex-myanmar.hh | 48
+ +++++++++++++++++++-------------------
+ 3 files changed, 27 insertions(+), 27 deletions(-)
+
+commit 64df6b0b0f9d221e14811084f2412a01cf4deb46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 18 00:35:01 2018 -0700
+
+    [AUTHORS] Add Ebrahim and Khaled
+
+ AUTHORS | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit f1ced9be378d7c7ad3ea35a1cee6f9aff7a44a13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 17 23:06:53 2018 -0700
+
+    More warning fix
+
+    Okay, let's see if the gods are happy now...
+
+ src/hb-static.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 40606abd0cd40faf3973d0a8c30af90d36ae8231
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 17 23:06:37 2018 -0700
+
+    Fix build
+
+ src/hb-static.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c406aca19303e61fa5ba15d215386cfc6d920124
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 17 22:58:43 2018 -0700
+
+    Fix warning
+
+ src/hb-machinery.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 270a37c3244b32dd839a99eb379be241613ee895
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 17 22:42:47 2018 -0700
+
+    Kick bots
+
+ src/hb-aat-layout-common.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6da8ef3f9f4706fe88715fabdba7904ff279539b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 17 22:37:34 2018 -0700
+
+    Fix some wierdness...
+
+ src/hb-static.cc | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 83780308b41b029513ac2568b6688d3eaad77338
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 17 22:34:16 2018 -0700
+
+    [aat] Fix sanitize slowdown
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11034
+
+ src/hb-aat-layout-common.hh | 4 ++++
+ src/hb-machinery.hh         | 2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit b9478e28ac4361353e4920d749cc5d29e5bfef67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 17 21:52:14 2018 -0700
+
+    Revert "[test] Remove not-fixed yet testcases (#1268)"
+
+    This reverts commit 191eef823fe95355425621f8e002dfe7fe632383.
+
+ ...rfuzz-testcase-minimized-hb-fuzzer-4548492505645056 | Bin 0 ->
+ 122 bytes
+ ...rfuzz-testcase-minimized-hb-fuzzer-6210176798425088 | Bin 0 ->
+ 1420 bytes
+ ...testcase-minimized-hb-shape-fuzzer-5738888765636608 | Bin 0 ->
+ 267731 bytes
+ 3 files changed, 0 insertions(+), 0 deletions(-)
+
+commit af99b20dfddbca75e68f84c5aa465a54728990a6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 18 08:35:20 2018 +0330
+
+    [ci/ubsan] Disable enum sanitization
+
+    Behdad apparently not interested on them
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9e8a9b846ec24e9124d61706272a0e5fa58d7a24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 17 21:41:25 2018 -0700
+
+    [aat] Another try at fixing Lookup null objects...
+
+    Ugly as hell, and don't even understand why some bits are needed.
+    But the logic is sound.
+
+ src/hb-aat-layout-common.hh | 23 ++++++++++++++++++++---
+ src/hb-static.cc            |  4 ++++
+ 2 files changed, 24 insertions(+), 3 deletions(-)
+
+commit 191eef823fe95355425621f8e002dfe7fe632383
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 18 08:04:18 2018 +0330
+
+    [test] Remove not-fixed yet testcases (#1268)
+
+    I added them but now that I think, it is a bad idea to have them as
+    fuzzing bots will find good seeds to tweak in order to find easy new
+    testcases which causes duplicated issues.
+
+ ...rfuzz-testcase-minimized-hb-fuzzer-4548492505645056 | Bin 122 ->
+ 0 bytes
+ ...rfuzz-testcase-minimized-hb-fuzzer-6210176798425088 | Bin 1420 ->
+ 0 bytes
+ ...testcase-minimized-hb-shape-fuzzer-5738888765636608 | Bin 267731 ->
+ 0 bytes
+ 3 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 392e1f4ddd7eb649e1a71755b9bcf6431739f98f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 18 07:42:20 2018 +0330
+
+    [test/shape-fuzzer] fail on timeout and ubsan errors (#1267)
+
+ test/fuzzing/run-shape-fuzzer-tests.py | 38
+ ++++++++++++++++++++++++++++++----
+ 1 file changed, 34 insertions(+), 4 deletions(-)
+
+commit eeddda3ec6c28b411d33c74938ec6198c7f6888d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 18 07:38:47 2018 +0330
+
+    [util] Better file-not-found error from hb-shape / hb-view
+
+    fixes #1266
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 751c10e55e43e2266a5bba024d560c5127fae4b8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 18 06:36:48 2018 +0330
+
+    [fuzz] Add more new testcases
+
+ ...testcase-minimized-hb-shape-fuzzer-5718464350650368 | Bin 0 ->
+ 41 bytes
+ ...testcase-minimized-hb-shape-fuzzer-5738888765636608 | Bin 0 ->
+ 267731 bytes
+ 2 files changed, 0 insertions(+), 0 deletions(-)
+
+commit fd282eb3285e6d20f77e8a3a7237b677433ccbb4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 18 06:33:39 2018 +0330
+
+    [fuzz] Add a new testcase
+
+ .../clusterfuzz-testcase-hb-shape-fuzzer-5634395566768128 | Bin 0 ->
+ 106 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 9d42d70269b879e67f3c7724beab8e4cdbfc877a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 17 17:55:47 2018 -0700
+
+    [trak] Fix calc
+
+    We were getting the first track record always.  Ie. this line:
+
+           if (trackTable[i].get_track_value () == 0.f)
+           {
+    -       trackTableEntry = &trackTable[0];
+    +       trackTableEntry = &trackTable[i];
+            break;
+           }
+
+    The rest is cleanup.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1263 for the
+    most part.
+
+ src/hb-aat-layout-trak-table.hh | 17 ++++++++---------
+ 1 file changed, 8 insertions(+), 9 deletions(-)
+
+commit 3341c7fbfb9bc8e137afd9f16da8cf18eb67b25b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 17 15:04:35 2018 -0700
+
+    [fuzzing] Move fuzzing fonts from api/ here
+
+ ...estcase-minimized-hb-subset-fuzzer-5521982557782016 | Bin 1228 ->
+ 0 bytes
+ ...estcase-minimized-hb-subset-fuzzer-5542653037903872 | Bin 160249 ->
+ 0 bytes
+ ...estcase-minimized-hb-subset-fuzzer-5609911946838016 | Bin 313 ->
+ 0 bytes
+ ...estcase-minimized-hb-subset-fuzzer-5670861909524480 | Bin 1298 ->
+ 0 bytes
+ ...estcase-minimized-hb-subset-fuzzer-5750092395970560 | Bin 72435 ->
+ 0 bytes
+ ...estcase-minimized-hb-subset-fuzzer-6651660668502016 | Bin 15229 ->
+ 0 bytes
+ ...ed-hb-subset-get-codepoints-fuzzer-5973295416475648 | Bin 109 ->
+ 0 bytes
+ ...ed-hb-subset-get-codepoints-fuzzer-6136125075750912 | Bin 65816 ->
+ 0 bytes
+ test/api/test-subset-glyf.c                            |   2 +-
+ test/api/test-subset-hdmx.c                            |   4 ++--
+ test/api/test-subset-hmtx.c                            |   2 +-
+ test/api/test-subset.c                                 |   6 +++---
+ .../crash-4b60576767ee4d9fe1cc10959d89baf73d4e8249     | Bin
+ .../crash-b577db318b30f2851828a4c9ef97cb30678b1b54     | Bin
+ .../crash-ccc61c92d589f895174cdef6ff2e3b20e9999a1a     | Bin
+ .../crash-e4e0bb1458a91b692eba492c907ae1f94e635480     | Bin
+ .../fonts/oom-6ef8c96d3710262511bcc730dce9c00e722cb653 | Bin
+ .../fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a | Bin
+ 18 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 1f34388e8b40a77157f61c8e1a2fc7c4846c192e
+Merge: 9ade3e7b 2e7c7165
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Oct 17 09:34:48 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit 2e7c716511e8b2cfcd059fa2a2ed4cdd48b351bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 18:35:03 2018 -0700
+
+    [buffer] Add an assert
+
+    See if it helps debugging
+    https://bugs.chromium.org/p/chromium/issues/detail?id=895117
+
+ src/hb-buffer.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5842756b1398253d38749c4c8a23a1450e642caf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 18:28:55 2018 -0700
+
+    [fuzzing] Delete blink fuzzed data
+
+    These are text, not font.
+
+ ...minimized-blink_harfbuzz_shaper_fuzzer-5099655095123968 | Bin 88 ->
+ 0 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 25fe7e7e1031401d38db1efed360cd75ea7910b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 18:22:54 2018 -0700
+
+    [aat] Comment
+
+ src/hb-aat-layout-common.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 26092bb3d1aa239de5e933700e0371619d147f65
+Author: HinTak <htl10@users.sourceforge.net>
+Date:   Wed Oct 17 00:54:39 2018 +0100
+
+    "allow-none" annotation for "out" parameters
+
+    Fixes the following warnings:
+    hb-ot-tag.cc:330: Warning: HarfBuzz: invalid "allow-none" annotation:
+    only valid for pointer types and out parameters
+    hb-ot-tag.cc:334: Warning: HarfBuzz: invalid "allow-none" annotation:
+    only valid for pointer types and out parameters
+
+ src/hb-ot-tag.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ba42651608da1be0d152e03ad42ea96fc8476ac7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 17:35:46 2018 -0700
+
+    Fix indent
+
+ test/fuzzing/run-shape-fuzzer-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 49bdb54427b17d439eadf31732a5f2a0add46bf5
+Author: HinTak <htl10@users.sourceforge.net>
+Date:   Wed Oct 17 00:36:04 2018 +0100
+
+    typo in gobject annotation - "in/out" should be "inout"
+
+    "in/out" should be "inout"
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c0c190c16a2c1b281f40dacdcf515dc5a59ab3bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 16:39:29 2018 -0700
+
+    [fuzzing] Run tests against fuzzing fonts
+
+    Some disable.
+
+ test/fuzzing/run-shape-fuzzer-tests.py        | 12 ++--
+ test/fuzzing/run-subset-fuzzer-tests.py       | 35 ++++++-----
+ test/shaping/data/in-house/Makefile.sources   |  1 -
+ test/shaping/data/in-house/tests/fuzzed.tests | 84
+ ---------------------------
+ 4 files changed, 24 insertions(+), 108 deletions(-)
+
+commit 7b37705fb579a39334be0618c6215c1b887bf9fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 16:33:06 2018 -0700
+
+    [fuzzing] Rename
+
+ ...ebdebc6.ttf => 0509e80afb379d16560e9e47bdd7d888bebdebc6} | Bin
+ ...63b6daf.ttf => 1a6f1687b7a221f9f2c834b0b360d3c8463b6daf} | Bin
+ ...28b22cb.ttf => 205edd09bd3d141cc9580f650109556cc28b22cb} | Bin
+ ...f026462.ttf => 217a934cfe15c548b572c203dceb2befdf026462} | Bin
+ ...ac34f18.ttf => 3511ff5c1647150595846ac414c595cccac34f18} | Bin
+ ...675d5a3.ttf => 375d6ae32a3cbe52fbf81a4e5777e3377675d5a3} | Bin
+ ...9c9a56b.ttf => 43979b90b2dd929723cf4fe1715990bcb9c9a56b} | Bin
+ ...1a8e2b0.ttf => 558661aa659912f4d30ecd27bd09835171a8e2b0} | Bin
+ ...0655fa8.ttf => 5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8} | Bin
+ ...c149ddc.ttf => 641bd9db850193064d17575053ae2bf8ec149ddc} | Bin
+ ...bcf861f.ttf => 8240789f6d12d4cfc4b5e8e6f246c3701bcf861f} | Bin
+ ...1386016.ttf => a34a9191d9376bda419836effeef7e75c1386016} | Bin
+ ...bdae30e.ttf => a69118c2c2ada48ff803d9149daa54c9ebdae30e} | Bin
+ ...6b31fe2.ttf => b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2} | Bin
+ ...14a0467.ttf => e88c339237f52d21e01c55f01b9c1b4cc14a0467} | Bin
+ ...1395725.ttf => fab39d60d758cb586db5a504f218442cd1395725} | Bin
+ 16 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 3676c685d407cc7b9b813b4a08e7c5bcd9a47ea1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 16:32:26 2018 -0700
+
+    [fuzzing] Move rest of fuzzing tests here
+
+ .../fonts/0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf  | Bin
+ .../fonts/1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf  | Bin
+ .../fonts/205edd09bd3d141cc9580f650109556cc28b22cb.ttf  | Bin
+ .../fonts/217a934cfe15c548b572c203dceb2befdf026462.ttf  | Bin
+ .../fonts/3511ff5c1647150595846ac414c595cccac34f18.ttf  | Bin
+ .../fonts/375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf  | Bin
+ .../fonts/43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf  | Bin
+ .../fonts/558661aa659912f4d30ecd27bd09835171a8e2b0.ttf  | Bin
+ .../fonts/5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf  | Bin
+ .../fonts/641bd9db850193064d17575053ae2bf8ec149ddc.ttf  | Bin
+ .../fonts/8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf  | Bin
+ .../fonts/a34a9191d9376bda419836effeef7e75c1386016.ttf  | Bin
+ .../fonts/a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf  | Bin
+ .../fonts/b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf  | Bin
+ .../fonts/e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf  | Bin
+ .../fonts/fab39d60d758cb586db5a504f218442cd1395725.ttf  | Bin
+ test/shaping/data/in-house/tests/fuzzed.tests           |  16
+ ----------------
+ 17 files changed, 16 deletions(-)
+
+commit 1487173dcf4137fb210b15d9a869aa1f0c626d15
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 16:30:38 2018 -0700
+
+    [fuzzing] Delete duplicate fonts
+
+ .../233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf      | Bin 1048576 ->
+ 0 bytes
+ .../243798dd281c1c77c065958e1ff467420faa9bde.ttf      | Bin 225 ->
+ 0 bytes
+ .../9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf      | Bin 4545 ->
+ 0 bytes
+ .../b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf      | Bin 3301 ->
+ 0 bytes
+ .../bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf      | Bin 204 ->
+ 0 bytes
+ .../dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf      | Bin 2786 ->
+ 0 bytes
+ .../ef2511f215aa3ca847cbfffbf861793b42170875.ttf      | Bin 1152 ->
+ 0 bytes
+ test/shaping/data/in-house/tests/fuzzed.tests         |   7 -------
+ 8 files changed, 7 deletions(-)
+
+commit 49c041f7c5b135cbcbd1663e18047afd54fc948b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 16:25:24 2018 -0700
+
+    Minor
+
+ test/fuzzing/clusterfuzz-testcase-6107935408390144 | Bin 16800 -> 0 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 36f38ea7033b4e52c6cd94a8a0d686a95c0cc148
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 16:24:03 2018 -0700
+
+    [gpos] Protect mark attachment against out-of-bounds
+
+    Not sure how can happen, but does...
+
+ src/hb-ot-layout-gpos-table.hh | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+commit 1147ce2392ac6b3d12fdabe69ac5da9bae97e30d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 16:18:32 2018 -0700
+
+    [fuzzing] Add more tests
+
+ .../fuzzing/fonts/clusterfuzz-testcase-6107935408390144 | Bin 0 ->
+ 16800 bytes
+ ...-testcase-minimized-harfbuzz_fuzzer-5973566991106048 | Bin 0 ->
+ 4047 bytes
+ ...-testcase-minimized-hb-shape-fuzzer-5633985665826816 | Bin 0 ->
+ 73 bytes
+ 3 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 12cbe195ae65656dbc9e32b4d50696bc4223136b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 16:13:53 2018 -0700
+
+    [aat] Another non-null offset
+
+ src/hb-aat-layout-ankr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 87205ef935ede70365187549d133014669ea47f2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 15:40:44 2018 -0700
+
+    [aat] Make sure Lookup offset is never nulled
+
+    It has unbounded size...
+
+    Fixes https://oss-fuzz.com/v2/testcase-detail/5718889451749376
+
+ src/hb-aat-layout-ankr-table.hh |  2 +-
+ src/hb-aat-layout-common.hh     |  3 ++-
+ src/hb-aat-layout-kerx-table.hh | 18 ++++++++----------
+ src/hb-aat-layout-morx-table.hh |  4 ++--
+ src/hb-open-type.hh             | 12 ++++++------
+ 5 files changed, 19 insertions(+), 20 deletions(-)
+
+commit 1aa353e4fc79dfa880559ff75113ed58fac8392b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 15:26:51 2018 -0700
+
+    Fix tests
+
+ test/shaping/data/in-house/tests/fuzzed.tests | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 98d4ad02b97628e5a9a7bfe3187ccc3851c00b18
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 15:17:31 2018 -0700
+
+    [fuzzing] One more
+
+ test/fuzzing/clusterfuzz-testcase-6107935408390144 | Bin 0 -> 16800 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit e6f267c3dfe3e93dfc726266672da5a235fbd930
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 15:16:20 2018 -0700
+
+    [fuzzing] Add more clusterfuzz tests I had lying around
+
+ .../fonts/clusterfuzz-testcase-5517117891805184       | Bin 0 ->
+ 178 bytes
+ ...sterfuzz-testcase-hb-shape-fuzzer-5746142327865344 | Bin 0 ->
+ 219 bytes
+ ...sterfuzz-testcase-hb-shape-fuzzer-5750379279548416 | Bin 0 ->
+ 317 bytes
+ .../clusterfuzz-testcase-minimized-4884742786777088   | Bin 0 ->
+ 393 bytes
+ .../clusterfuzz-testcase-minimized-5255344882188288   | Bin 0 -> 65 bytes
+ .../clusterfuzz-testcase-minimized-5720051798769664   | Bin 0 ->
+ 1048576 bytes
+ .../clusterfuzz-testcase-minimized-5924299061854208   | Bin 0 ->
+ 2786 bytes
+ .../clusterfuzz-testcase-minimized-6460279560863744   | Bin 0 ->
+ 589 bytes
+ ...ized-blink_harfbuzz_shaper_fuzzer-5099655095123968 | Bin 0 -> 88 bytes
+ ...estcase-minimized-hb-shape-fuzzer-5650286710882304 | Bin 0 -> 76 bytes
+ ...stcase-minimized-hb-shape-fuzzer-5672261407735808} | Bin
+ 11 files changed, 0 insertions(+), 0 deletions(-)
+
+commit e53206271db4a83834433ab5f82d16815a18b998
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Oct 17 01:42:04 2018 +0330
+
+    Add all the fonts found by fuzzers to the repo (#1258)
+
+ test/fuzzing/Makefile.am                           |   1 +
+ ...clusterfuzz-testcase-hb-fuzzer-4666056377368576 | Bin 0 -> 1152 bytes
+ ...clusterfuzz-testcase-hb-fuzzer-5662671558934528 | Bin 0 -> 242272
+ bytes
+ ...clusterfuzz-testcase-hb-fuzzer-6243458541944832 | Bin 0 -> 370187
+ bytes
+ ...clusterfuzz-testcase-hb-fuzzer-6303297511096320 | Bin 0 -> 4545 bytes
+ ...clusterfuzz-testcase-hb-fuzzer-6696647723581440 | Bin 0 -> 3266 bytes
+ ...z-testcase-minimized-hb-fuzzer-4523479581851648 | Bin 0 -> 322 bytes
+ ...z-testcase-minimized-hb-fuzzer-4535496598355968 | Bin 0 -> 2786 bytes
+ ...z-testcase-minimized-hb-fuzzer-4548492505645056 | Bin 0 -> 122 bytes
+ ...z-testcase-minimized-hb-fuzzer-4595692015190016 | Bin 0 -> 225 bytes
+ ...z-testcase-minimized-hb-fuzzer-4687441845813248 | Bin 0 -> 162 bytes
+ ...z-testcase-minimized-hb-fuzzer-4706238090706944 | Bin 0 -> 350 bytes
+ ...z-testcase-minimized-hb-fuzzer-4769173588672512 | Bin 0 -> 37 bytes
+ ...z-testcase-minimized-hb-fuzzer-4827735151083520 | Bin 0 -> 1384 bytes
+ ...z-testcase-minimized-hb-fuzzer-4841745322868736 | Bin 0 -> 660 bytes
+ ...z-testcase-minimized-hb-fuzzer-4884742786777088 | Bin 0 -> 393 bytes
+ ...z-testcase-minimized-hb-fuzzer-5216838347653120 | Bin 0 -> 157600
+ bytes
+ ...z-testcase-minimized-hb-fuzzer-5255344882188288 | Bin 0 -> 65 bytes
+ ...z-testcase-minimized-hb-fuzzer-5294584596791296 | Bin 0 -> 1602 bytes
+ ...z-testcase-minimized-hb-fuzzer-5303930168803328 | Bin 0 -> 7321 bytes
+ ...z-testcase-minimized-hb-fuzzer-5331901587914752 | Bin 0 -> 3301 bytes
+ ...z-testcase-minimized-hb-fuzzer-5388906574905344 | Bin 0 -> 9937 bytes
+ ...z-testcase-minimized-hb-fuzzer-5517117891805184 | Bin 0 -> 178 bytes
+ ...z-testcase-minimized-hb-fuzzer-5617496443846656 | Bin 0 -> 195 bytes
+ ...z-testcase-minimized-hb-fuzzer-5672141338968064 | Bin 0 -> 176 bytes
+ ...z-testcase-minimized-hb-fuzzer-5700697074958336 | Bin 0 -> 878 bytes
+ ...z-testcase-minimized-hb-fuzzer-5720051798769664 | Bin 0 -> 1048576
+ bytes
+ ...z-testcase-minimized-hb-fuzzer-5924299061854208 | Bin 0 -> 2786 bytes
+ ...z-testcase-minimized-hb-fuzzer-6023178755244032 | Bin 0 -> 2261 bytes
+ ...z-testcase-minimized-hb-fuzzer-6111685556305920 | Bin 0 -> 586 bytes
+ ...z-testcase-minimized-hb-fuzzer-6160439919509504 | Bin 0 -> 204 bytes
+ ...z-testcase-minimized-hb-fuzzer-6210176798425088 | Bin 0 -> 1420 bytes
+ ...z-testcase-minimized-hb-fuzzer-6260579246276608 | Bin 0 -> 700 bytes
+ ...z-testcase-minimized-hb-fuzzer-6264625609834496 | Bin 0 -> 1731 bytes
+ ...z-testcase-minimized-hb-fuzzer-6424351550210048 | Bin 0 -> 73 bytes
+ ...z-testcase-minimized-hb-fuzzer-6460279560863744 | Bin 0 -> 589 bytes
+ ...z-testcase-minimized-hb-fuzzer-6576177596596224 | Bin 0 -> 385 bytes
+ ...z-testcase-minimized-hb-fuzzer-6595199411159040 | Bin 0 -> 1862 bytes
+ ...z-testcase-minimized-hb-fuzzer-6624904746106880 | Bin 0 -> 42 bytes
+ ...z-testcase-minimized-hb-fuzzer-6723367514144768 | Bin 0 -> 1074 bytes
+ ...case-minimized-hb-shape-fuzzer-5630246225707008 | Bin 0 -> 109 bytes
+ ...case-minimized-hb-shape-fuzzer-5635082459545600 | Bin 0 -> 52 bytes
+ ...case-minimized-hb-shape-fuzzer-5652019562414080 | Bin 0 -> 49 bytes
+ ...case-minimized-hb-shape-fuzzer-5656511058018304 | Bin 0 -> 28 bytes
+ ...case-minimized-hb-shape-fuzzer-5659641787187200 | Bin 0 -> 3498 bytes
+ ...case-minimized-hb-shape-fuzzer-5668791174823936 | Bin 0 -> 3608 bytes
+ ...ase-minimized-hb-shape-fuzzer-56722614077358084 | Bin 0 -> 192 bytes
+ ...case-minimized-hb-shape-fuzzer-5674361600606208 | Bin 0 -> 518 bytes
+ ...case-minimized-hb-shape-fuzzer-5677421274071040 | Bin 0 -> 3608 bytes
+ ...case-minimized-hb-shape-fuzzer-5679244475105280 | Bin 0 -> 256 bytes
+ ...case-minimized-hb-shape-fuzzer-5685596677210112 | Bin 0 -> 58 bytes
+ ...case-minimized-hb-shape-fuzzer-5695615258853376 | Bin 0 -> 194 bytes
+ ...case-minimized-hb-shape-fuzzer-5696686572175360 | Bin 0 -> 256 bytes
+ ...case-minimized-hb-shape-fuzzer-5718889451749376 | Bin 0 -> 1680 bytes
+ ...case-minimized-hb-shape-fuzzer-5719982789361664 | Bin 0 -> 3608 bytes
+ ...case-minimized-hb-shape-fuzzer-5725129603022848 | Bin 0 -> 3608 bytes
+ ...case-minimized-hb-shape-fuzzer-5726089628876800 | Bin 0 -> 76 bytes
+ ...case-minimized-hb-shape-fuzzer-5729361857085440 | Bin 0 -> 2250 bytes
+ ...case-minimized-hb-shape-fuzzer-5733166795456512 | Bin 0 -> 78 bytes
+ ...case-minimized-hb-shape-fuzzer-5734736291430400 | Bin 0 -> 66 bytes
+ ...case-minimized-hb-shape-fuzzer-5740171484463104 | Bin 0 -> 186 bytes
+ ...case-minimized-hb-shape-fuzzer-5750379279548416 | Bin 0 -> 219 bytes
+ ...case-minimized-hb-shape-fuzzer-5762490181353472 | Bin 0 -> 101 bytes
+ ...ase-minimized-hb-subset-fuzzer-5359635656605696 | Bin 0 -> 393270
+ bytes
+ ...ase-minimized-hb-subset-fuzzer-5521982557782016 | Bin 0 -> 1228 bytes
+ ...ase-minimized-hb-subset-fuzzer-5542653037903872 | Bin 0 -> 160249
+ bytes
+ ...ase-minimized-hb-subset-fuzzer-5609911946838016 | Bin 0 -> 313 bytes
+ ...ase-minimized-hb-subset-fuzzer-5629878397829120 | Bin 0 -> 3746 bytes
+ ...ase-minimized-hb-subset-fuzzer-5651059347816448 | Bin 0 -> 2648 bytes
+ ...ase-minimized-hb-subset-fuzzer-5669437462544384 | Bin 0 -> 284427
+ bytes
+ ...ase-minimized-hb-subset-fuzzer-5670861909524480 | Bin 0 -> 1298 bytes
+ ...ase-minimized-hb-subset-fuzzer-5696607199166464 | Bin 0 -> 28 bytes
+ ...ase-minimized-hb-subset-fuzzer-5711951464759296 | Bin 0 -> 284521
+ bytes
+ ...ase-minimized-hb-subset-fuzzer-5747265633779712 | Bin 0 -> 177090
+ bytes
+ ...ase-minimized-hb-subset-fuzzer-5750092395970560 | Bin 0 -> 72435 bytes
+ ...ase-minimized-hb-subset-fuzzer-5758598970343424 | Bin 0 -> 64 bytes
+ ...ase-minimized-hb-subset-fuzzer-6543700493598720 | Bin 0 -> 138425
+ bytes
+ ...ase-minimized-hb-subset-fuzzer-6651660668502016 | Bin 0 -> 15229 bytes
+ ...b-subset-get-codepoints-fuzzer-5203067375976448 | Bin 0 -> 16310 bytes
+ ...b-subset-get-codepoints-fuzzer-5630904853069824 | Bin 0 -> 580 bytes
+ ...b-subset-get-codepoints-fuzzer-5687638085337088 | Bin 0 -> 1206 bytes
+ ...b-subset-get-codepoints-fuzzer-5736539338833920 | Bin 0 -> 512 bytes
+ ...b-subset-get-codepoints-fuzzer-5973295416475648 | Bin 0 -> 109 bytes
+ ...b-subset-get-codepoints-fuzzer-6136125075750912 | Bin 0 -> 65816 bytes
+ ...b-subset-get-codepoints-fuzzer-6394290358976512 | Bin 0 -> 1868 bytes
+ test/fuzzing/run-shape-fuzzer-tests.py             |   4 +
+ test/shaping/data/in-house/tests/fuzzed.tests      |  84
+ +++++++++++++++++++++
+ 87 files changed, 89 insertions(+)
+
+commit 2137582c9696b6e38d70b4a0d4199b315c9fd4ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 14:46:07 2018 -0700
+
+    [morx] Reword ligation
+
+    Still fails MORX-41.  Am talking to Sascha to better understand
+    what CoreText
+    is doing.
+
+ src/hb-aat-layout-morx-table.hh                    | 25
+ ++++++++++++----------
+ test/shaping/data/text-rendering-tests/DISABLED    |  2 ++
+ .../data/text-rendering-tests/Makefile.sources     |  2 +-
+ 3 files changed, 17 insertions(+), 12 deletions(-)
+
+commit c53a25c6579a4d3fe8e6a6fc198d70add41035ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 13:57:35 2018 -0700
+
+    [morx] Comment
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c46d42f8f2c303817467c6a4e19d69d0e433dba6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 13:39:54 2018 -0700
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   1 +
+ .../text-rendering-tests/fonts/TestMORXFourtyone.ttf     | Bin 0 ->
+ 2248 bytes
+ .../data/text-rendering-tests/tests/MORX-41.tests        |   4 ++++
+ 3 files changed, 5 insertions(+)
+
+commit 5eb7e7f6461bcf5b1e1d8ccb49eb904382762533
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 13:32:52 2018 -0700
+
+    Revert "[vector] Simplify Sort" and "More of the same"
+
+    This reverts commit de0b9a466490c2c13d6ec6f59d5122b0a87d3180.
+    This reverts commit 921f0e6ec722940a1e37660e1291aa69f9f39db8.
+
+    Annnnd, revert.  MSVC doesn't like it.
+
+ src/hb-vector.hh | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit 661340c475dc928f227d54b3f36eaf6f41c2b6e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 16 13:24:29 2018 -0700
+
+    [kern] Scale kern pairs before applying
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1255
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1252
+
+ src/hb-ot-kern-table.hh     | 18 ++++++++++++------
+ src/hb-ot-shape-fallback.cc |  2 +-
+ 2 files changed, 13 insertions(+), 7 deletions(-)
+
+commit de0b9a466490c2c13d6ec6f59d5122b0a87d3180
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 22:20:26 2018 -0700
+
+    [vector] More of the same
+
+ src/hb-vector.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 921f0e6ec722940a1e37660e1291aa69f9f39db8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 22:19:17 2018 -0700
+
+    [vector] Simplify sort
+
+    Hopefully this fits fine with SFINAE with all our compilers.
+
+ src/hb-vector.hh | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit 61510b63c15e91d80e36a497260db0e2d6d36c66
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 16 14:17:21 2018 +0330
+
+    [test] Minor cleanup in test-multithread and test-ot-name (#1256)
+
+ test/api/CMakeLists.txt                       |  2 +-
+ test/api/Makefile.am                          |  2 +-
+ test/api/test-multithread.c                   |  6 ++-
+ test/api/{test-ot-nameid.c => test-ot-name.c} | 58
+ ++++++++++++++-------------
+ 4 files changed, 36 insertions(+), 32 deletions(-)
+
+commit 42b75dc3a701b13665115e2a234bfa5dedafef3f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 16 10:58:09 2018 +0330
+
+    [kerx] Minor, remove debug bit
+
+ src/hb-aat-layout-kerx-table.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 11703afce6cebbb4c5e7cdea59ca59a1787608b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 21:16:58 2018 -0700
+
+    [kerx] Fix Format6 sanitize
+
+    Fixes https://oss-fuzz.com/v2/testcase-detail/5650286710882304
+
+ src/hb-aat-layout-kerx-table.hh | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+commit 4c27da7638f6d072c3ff93223488c4ab316236c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 19:46:45 2018 -0700
+
+    [CBDT] Fix more offsetting
+
+    Fixes https://oss-fuzz.com/v2/testcase-detail/5750379279548416
+
+ src/hb-ot-color-cbdt-table.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 9ade3e7bb81be43b3c0811614b9b9533127894b0
+Merge: 6420ffe0 0f85edb7
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Oct 15 14:03:23 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit 6420ffe00fc4f4c6ffa63b80d961f70bc36c2caf
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Oct 15 14:03:18 2018 -0700
+
+    fixed type casting bug
+
+ src/hb-cff-interp-common.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0f85edb7781f4d5ec2de676979be75a0f6559d80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 11:15:54 2018 -0700
+
+    [morx] Another end-of-text corner case
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10990
+
+ src/hb-aat-layout-morx-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 55d5ea666c25f75e9b1bc2eb43cfb104a16ebe04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 11:04:49 2018 -0700
+
+    [kerx] Merge clusters in Ligature
+
+ src/hb-aat-layout-morx-table.hh | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit bb35725cd760f07fdb0586453512a106e534b739
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 10:20:39 2018 -0700
+
+    [kerx/morx] More end-of-text protection
+
+ src/hb-aat-layout-kerx-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8f3048a1f838484babc4948754c16dda8f53daf1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 15 12:16:47 2018 +0330
+
+    [dump-emoji] minor
+
+ src/dump-emoji.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 27e095a613ed0a753231405cab887da19e9aecd1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 15 12:04:14 2018 +0330
+
+    [dump-emoji] better explaination of the usage
+
+ src/dump-emoji.cc | 21 ++++++++++++++++++++-
+ 1 file changed, 20 insertions(+), 1 deletion(-)
+
+commit 8dc6296818e3a52c003852aa185f2b7eb6afa5d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 15 01:09:05 2018 -0700
+
+    [ot-font] Implement TrueType v_origin
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/537
+
+ src/hb-ot-font.cc                               | 31 +++++++++++++++++-
+ src/hb-ot-hmtx-table.hh                         | 43
+ ++++++++++++++++---------
+ test/shaping/data/in-house/tests/vertical.tests |  2 +-
+ 3 files changed, 59 insertions(+), 17 deletions(-)
+
+commit 6e07076fd094afc8c9c8ad8f08453e7882294592
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 14 22:22:45 2018 -0700
+
+    [blob] Fix UBSan error
+
+ src/hb-blob.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit fc812faaa96aa4e67814a92376b2da751d5a0aba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 14 21:32:09 2018 -0700
+
+    [CBDT] Fix more offsetting issues
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/960
+
+    dump-emoji still segfaults.  Needs debugging.
+
+ src/hb-ot-color-cbdt-table.hh | 28 +++++++++++++++-------------
+ 1 file changed, 15 insertions(+), 13 deletions(-)
+
+commit 6aee3bb87cee88525b745a640df294cb721245f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 14 21:08:42 2018 -0700
+
+    [CBDT] Fix offset handling
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/960
+
+ src/hb-ot-color-cbdt-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit da744c6b3e79b778f414ec9f4d9070d06ec2a706
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 14 20:49:21 2018 -0700
+
+    [CBDT] More UnsizedArrayOf cleanup
+
+ src/hb-ot-color-cbdt-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2995b4465bce52b30de2cb6ba24cc80d8602413d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 14 20:37:57 2018 -0700
+
+    [CBDT] Simplify sanitize
+
+ src/hb-ot-color-cbdt-table.hh | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit 1c76c8f6ff7877e486f6e94d04b2dc65348b26d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 14 19:39:31 2018 -0700
+
+    [morx] Handle end-of-text conditions in Insertion
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10955
+
+ src/hb-aat-layout-morx-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 60c13976733ea05e71c66c486d62e31ffbb71bac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 14 19:36:46 2018 -0700
+
+    [buffer] Fix output_glyph at end of buffer
+
+    Part of https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10955
+
+ src/hb-buffer.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 7efa38257b6f79d1c6e2a9bad29c33af276abe29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 14 19:30:44 2018 -0700
+
+    [aat] More protection against buffer fail
+
+ src/hb-aat-layout-common.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit e1add2a275a8afa5efc22aa44a4e62646f0b0ba4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 14 16:26:03 2018 -0700
+
+    [hmtx] Whitespace
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 62376a7d983442408059b0b8987e7ca8d1de154e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 14 15:20:50 2018 -0700
+
+    Ignore signed-integer-overflow while kerning
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1247
+
+ src/hb-ot-kern-table.hh | 1 +
+ src/hb.hh               | 9 +++++++++
+ 2 files changed, 10 insertions(+)
+
+commit 40f2b9355cf827c7b82ea5e55b112ce0032a9abf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 14 14:56:32 2018 -0700
+
+    [kerx] Fix Format1 sanitize
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10948
+
+ src/hb-aat-layout-kerx-table.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 44af1f93ee32e236a5c14085c72d3fa102a14f5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 14 14:52:17 2018 -0700
+
+    [aat] Whitespace
+
+ src/hb-aat-layout-common.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit db0d83ddc73ecf50ec4489fc10eddf3fa5835ae2
+Merge: 9228db06 56b8dd17
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Oct 13 17:25:38 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit 9228db06f46908afd0e62f5964470c37c66ba91f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Oct 13 17:25:09 2018 -0700
+
+    added CFF1 Expert Encoding subset test & bug fixes
+
+ src/hb-ot-cff1-table.hh                     |   8 +++++++-
+ src/hb-subset-cff1.cc                       |  10 ++++++++--
+ test/api/fonts/cff1_expert.2D,F6E9,FB00.otf | Bin 0 -> 3096 bytes
+ test/api/fonts/cff1_expert.otf              | Bin 0 -> 3656 bytes
+ test/api/test-subset-cff1.c                 |  21 +++++++++++++++++++++
+ 5 files changed, 36 insertions(+), 3 deletions(-)
+
+commit 56b8dd17f677ffe97e4d917c47924e1ac7632c71
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 13 19:03:33 2018 -0400
+
+    [aat] Finish off massaging table
+
+ src/hb-aat-layout.cc | 163
+ +++++++++++++++++++++++++--------------------------
+ 1 file changed, 81 insertions(+), 82 deletions(-)
+
+commit e0c5e0d91bbc0c8b2bb547ba5cb118989affc617
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 13 18:37:14 2018 -0400
+
+    [aat] WIP remove feature mapping here from hb-coretext
+
+    Need to map enum values to numerics since we don't have CoreText
+    headers.
+
+ src/hb-aat-layout.cc |  94 +++++++++++++++++++++++++
+ src/hb-aat-layout.hh |  22 ++++++
+ src/hb-coretext.cc   | 189
+ +--------------------------------------------------
+ 3 files changed, 117 insertions(+), 188 deletions(-)
+
+commit cb057749131826dd89bc3b92527116a974ae3bbe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 13 17:03:32 2018 -0400
+
+    [coretext] Prepare AAT feature mapping to be moved
+
+ src/hb-coretext.cc | 39 ++++++++++++++++++++++-----------------
+ 1 file changed, 22 insertions(+), 17 deletions(-)
+
+commit de6e414c565de5f27b9da8c7b8b11f88659a4c42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 13 13:48:22 2018 -0400
+
+    [kerx] Sanitize more
+
+ src/hb-aat-layout-kerx-table.hh | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 71f76f2f39c88998b430b171c99b85818d4fa0ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 13 13:36:27 2018 -0400
+
+    [kerx] Fix-up previous commit
+
+    A "&" was missing.  Go back to using pointers that are less
+    error-prone.
+
+ src/hb-aat-layout-kerx-table.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 6d4b054234b4736ca9927268ee3e2d9a0f8f6ead
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 13 12:20:33 2018 -0400
+
+    [kerx] Use sanitizer instead of handcoded runtime sanitization
+
+ src/hb-aat-layout-kerx-table.hh | 24 +++++++++---------------
+ 1 file changed, 9 insertions(+), 15 deletions(-)
+
+commit 5733113662e668a25187e0042935d955e44fb488
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 13 12:16:12 2018 -0400
+
+    [kerx] Wire up context down to get_kerning
+
+ src/hb-aat-layout-kerx-table.hh | 32 ++++++++++++++------------------
+ 1 file changed, 14 insertions(+), 18 deletions(-)
+
+commit c4502833b711a76cce1af0c5bf075692b965c991
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 13 11:48:49 2018 -0400
+
+    [kerx] Use sanitizer.get_num_glyphs() instead of
+    face->get_num_glyphs()
+
+ src/hb-aat-layout-kerx-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit fc45e698f2d8a6d577f33b1e69a83714aceae528
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 13 11:39:12 2018 -0400
+
+    [kerx] Protext against overflows
+
+ src/hb-aat-layout-kerx-table.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit ed2ee78136c40de8e7b915dfdfd3ca92880912c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 13 09:47:51 2018 -0400
+
+    [hangul] Fix use-after-free issue
+
+    out_info might have moved since we copied it's position into local
+    info var.
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=894937
+
+ src/hb-ot-shape-complex-hangul.cc | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit 63109432cf61333e01af4ef5163d4202bb43f84d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 13 14:00:05 2018 +0330
+
+    Cosmetic and minor changes
+
+ src/hb-buffer-serialize.cc   |   4 +-
+ src/hb-ot-cmap-table.hh      |   4 +-
+ src/hb-ot-layout-common.hh   |   4 +-
+ src/hb-ot-layout-gsubgpos.hh |   8 +--
+ src/hb-ot-layout.cc          | 127
+ +++++++++++++++++++------------------------
+ src/hb-ot-layout.h           |  25 +++++----
+ src/hb-ot-math-table.hh      |   8 +--
+ src/hb-ot-name.h             |   1 -
+ src/hb-ot-shape-complex.hh   |  18 +++---
+ 9 files changed, 93 insertions(+), 106 deletions(-)
+
+commit b64ef69b9e3d9cd4e81a2149cea3fe6e9e371cac
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Oct 12 14:14:21 2018 -0700
+
+    from encode_int removed assert hit by fuzzer
+
+    clamp the value instead
+
+ src/hb-subset-cff-common.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit c0a6814b49e376984a0cae9d385a6f6ba8c73579
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 12 16:05:56 2018 -0400
+
+    Touch up new API
+
+    New API:
+    +hb_ot_layout_feature_get_name_ids()
+    +hb_ot_layout_feature_get_characters()
+
+ src/hb-ot-layout.cc       | 16 +++++++++-------
+ src/hb-ot-layout.h        |  2 --
+ test/api/test-ot-nameid.c | 16 ++++++++++------
+ 3 files changed, 19 insertions(+), 15 deletions(-)
+
+commit 477bc9aafeaf89708d13a436869126351e2d9b50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 12 15:52:31 2018 -0400
+
+    Add hb-ot-name.h
+
+    Actual name-fetching API to come later.
+
+    New API:
+    hb_name_id_t
+    HB_NAME_ID_INVALID
+
+ src/Makefile.sources       |  1 +
+ src/hb-ot-layout-common.hh |  2 +-
+ src/hb-ot-layout.h         | 12 ++---------
+ src/hb-ot-name.h           | 54
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot.h                |  1 +
+ 5 files changed, 59 insertions(+), 11 deletions(-)
+
+commit dc49bd8d813571fe16d9e5342e4a3926ff947bd6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 12 03:00:59 2018 +0330
+
+    Add two APIs for getting stylistic set labels
+
+    * hb_ot_layout_feature_get_characters
+    * hb_ot_layout_feature_get_name_ids
+
+    However HarfBuzz currently doesn't expose an API for retrieving
+    the actual
+    information associated with NameId from the `name` table and that
+    should be
+    done separately.
+
+ docs/harfbuzz-sections.txt |   2 +
+ src/hb-ot-layout-common.hh |  14 +++++
+ src/hb-ot-layout.cc        | 133
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout.h         |  29 ++++++++++
+ test/api/CMakeLists.txt    |   2 +
+ test/api/Makefile.am       |   1 +
+ test/api/fonts/cv01.otf    | Bin 0 -> 1956 bytes
+ test/api/test-ot-nameid.c  |  96 ++++++++++++++++++++++++++++++++
+ 8 files changed, 277 insertions(+)
+
+commit e9f9c0d81c73d8b6d87700aadb5b886bd289769a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 21:37:45 2018 -0400
+
+    [sanitize] Reorder condition to silence bogus gcc warning
+
+    Was givin a dozen of:
+
+    ../../src/hb-machinery.hh: In member function ‘bool
+    AAT::ankr::sanitize(hb_sanitize_context_t*) const’:
+    ../../src/hb-machinery.hh:307:23: warning: missed loop optimization,
+    the loop counter may overflow [-Wunsafe-loop-optimizations]
+         bool ok = --this->max_ops > 0 &&
+                   ~~~~~~~~~~~~~~~~~~~~~~
+            this->start <= p &&
+            ~~~~~~~~~~~~~~~~~~~
+            p <= this->end &&
+            ~~~~~~~~~~~~~~~^~
+            (unsigned int) (this->end - p) >= len;
+            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    I believe those are bogus, but this silences them and does not
+    introduce
+    logic issues I believe.
+
+ src/hb-machinery.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1a6b5ac6c300ed2ccdcd8eadde433120f6e07f2a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 21:22:49 2018 -0400
+
+    Add HB_DEPRECATED_FOR and mark relevant symbols
+
+ src/hb-common.h     |  8 ++++++++
+ src/hb-deprecated.h | 10 +++++-----
+ src/hb-graphite2.h  |  2 +-
+ 3 files changed, 14 insertions(+), 6 deletions(-)
+
+commit c9413d7bb575093411b39ac21974795b6ad91454
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 21:19:39 2018 -0400
+
+    [graphite] Add HB_DEPRECATED annotation
+
+ src/hb-graphite2.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 68c86af187ff645a1305ac3b64832f3bb2350519
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 21:18:20 2018 -0400
+
+    Always compile deprecated symbols
+
+    We haven't been keeping this updated.  So, while we don't expose the
+    symbols in the headers if HB_DISABLE_DEPRECATED is defined, we still
+    always build them.
+
+ src/hb-font.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit fc0153a1d4903a57b21974cc8d0b0a82d7bc43dc
+Merge: 7d99a6ce c5510000
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Oct 12 12:16:50 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit 7d99a6cef80ec178c10dcf0e848394614c5e6912
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Oct 12 02:16:07 2018 -0700
+
+    overhauled error handling in CFF interpreter
+
+    minimized "if (error) return false" idiom
+
+ src/hb-cff-interp-common.hh      | 138
+ +++++++++++++++++++++++----------------
+ src/hb-cff-interp-cs-common.hh   |  43 ++++++------
+ src/hb-cff-interp-dict-common.hh |  72 +++++++++++---------
+ src/hb-cff1-interp-cs.hh         |  72 +++++++++++---------
+ src/hb-cff2-interp-cs.hh         |  50 +++++++-------
+ src/hb-ot-cff1-table.hh          |  91 +++++++++++---------------
+ src/hb-ot-cff2-table.hh          |  71 +++++++++-----------
+ 7 files changed, 281 insertions(+), 256 deletions(-)
+
+commit c55100000bc20d7c8319cfc54294215a923ffc25
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Oct 11 22:08:14 2018 -0400
+
+    Add missing colons to GObject annotations
+
+ src/hb-ot-tag.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1e816d62efe1b3540ef605092b97794e68ec0832
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Oct 11 20:37:49 2018 -0400
+
+    Fix Indic script tags in Graphite
+
+ src/hb-graphite2.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit bf8469be9a8932cc407b60daf4d494fef46e233b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 20:45:00 2018 -0400
+
+    Attach CursivePositioning backwards, not forward
+
+    This is how Uniscribe does it.  So, adjust.  This is only relevant
+    to fonts that apply cursive positioning from a contextual lookup.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1181
+
+ src/hb-ot-layout-gpos-table.hh                      |  20
+ ++++++++++----------
+ .../9fc3e6960b3520e5304033ef5fd540285f72f14d.ttf    | Bin 0 -> 2380 bytes
+ .../data/in-house/tests/cursive-positioning.tests   |   1 +
+ 3 files changed, 11 insertions(+), 10 deletions(-)
+
+commit bdb53ca24a5ad9671d8e29e17d1d8981505bd882
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 20:20:00 2018 -0400
+
+    [myanmar] Implement Zawgyi shaper
+
+    Enabled if script tag 'Qaag' is passed to HarfBuzz.  Disables mark
+    advance-zeroing and fallback mark-positioning.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1162
+
+ src/hb-ot-shape-complex-myanmar.cc                 |  22
+ +++++++++++++++++++++
+ src/hb-ot-shape-complex.hh                         |   5 +++++
+ src/hb.hh                                          |   8 ++++++++
+ test/shaping/data/in-house/Makefile.sources        |   1 +
+ .../ab14b4eb9d7a67e293f51d30d719add06c9d6e06.ttf   | Bin 0 -> 1792 bytes
+ .../data/in-house/tests/myanmar-zawgyi.tests       |   1 +
+ 6 files changed, 37 insertions(+)
+
+commit 00c5c4a79dfb352a679a5c56bf9c756ab0fa98d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 20:15:31 2018 -0400
+
+    [myanmar] Shuffle
+
+ src/hb-ot-shape-complex-myanmar.cc | 33 +++++++++++++++++----------------
+ 1 file changed, 17 insertions(+), 16 deletions(-)
+
+commit ec8f493bf9fefc33f027db24c4b175990b2d751c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 20:15:00 2018 -0400
+
+    [graphite] Remove assert
+
+ src/hb-graphite2.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 5646dcbd1125049c3af342fadfcfcbd523ce53d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 19:39:07 2018 -0400
+
+    Minor
+
+ src/hb-ot-tag.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 788e1478557603d30966f12449eef0d0bd51c880
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 19:24:52 2018 -0400
+
+    [test] Add test for USE indic3
+
+ test/shaping/data/in-house/Makefile.sources              |   1 +
+ .../fonts/3c96e7a303c58475a8c750bf4289bbe73784f37d.ttf   | Bin 0 ->
+ 3364 bytes
+ test/shaping/data/in-house/tests/use-indic3.tests        |   1 +
+ 3 files changed, 2 insertions(+)
+
+commit a11972787a2a90b541f92cc56bb885859390a0c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 19:23:36 2018 -0400
+
+    Minor
+
+ test/shaping/record-test.sh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 654365dc894326f04abaaba415f48ca5ba2d1286
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 17:51:21 2018 -0400
+
+    Pass indic3 tags to USE shaper
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/539
+
+ src/hb-ot-shape-complex.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 28d091d045b042506a1ec2cdefe7cf0d718e8b22
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Oct 11 17:15:22 2018 -0400
+
+    Parse Indic3 tags
+
+ src/hb-ot-tag.cc       | 11 ++++++++---
+ test/api/test-ot-tag.c | 44 +++++++++++++++++++++++++-------------------
+ 2 files changed, 33 insertions(+), 22 deletions(-)
+
+commit 211cd3691ba01b1cb2eeb8a91ac3532181791a8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 17:31:29 2018 -0400
+
+    Remove remains of get-codepoint-fuzzer
+
+ test/fuzzing/CMakeLists.txt             |  7 +------
+ test/fuzzing/run-subset-fuzzer-tests.py | 12 ------------
+ 2 files changed, 1 insertion(+), 18 deletions(-)
+
+commit 120ed0272569e6a34172a511d4a5a70a3a18f1d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 17:08:12 2018 -0400
+
+    [fuzzing] Fold get-codepoints-fuzzer into subset-fuzzer
+
+ test/fuzzing/Makefile.am                        | 16 ----------------
+ test/fuzzing/hb-subset-fuzzer.cc                |  5 +++++
+ test/fuzzing/hb-subset-get-codepoints-fuzzer.cc | 23
+ -----------------------
+ 3 files changed, 5 insertions(+), 39 deletions(-)
+
+commit 2c824d3644e16643c2bbe85fb88f9fb6fed53ce7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 16:41:01 2018 -0400
+
+    [aat] Fix two wrongs that made a right before!
+
+    Unfortunately our static asserts (DEFINE_SIZE_STATIC) don't actually
+    fail when used in templates, thanks to SFINAE.  Le sighs.
+
+    Probably fixes
+    https://oss-fuzz.com/v2/testcase-detail/5740171484463104
+
+ src/hb-aat-layout-common.hh | 4 ++--
+ src/hb-open-type.hh         | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit e940530c9723c3a581a5d5b31e5f419865dd6cc7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 15:56:17 2018 -0400
+
+    [aat] Fix mul overflow
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10897
+
+ src/hb-aat-layout-common.hh | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit 1d995a340b9e17fc8dca7a3e88e0918de2d8f02c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 15:42:54 2018 -0400
+
+    Minor
+
+ test/api/hb-subset-test.h   | 6 ++----
+ test/api/test-multithread.c | 5 +----
+ test/fuzzing/main.cc        | 2 +-
+ 3 files changed, 4 insertions(+), 9 deletions(-)
+
+commit 0744a02cb12e4d800abb611dfa5d268bb2dfd9f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 15:14:18 2018 -0400
+
+    [arabic] Update to latest UTR#53
+
+    From Lorna Evans: "That was a new character added to Unicode 11.0"
+
+ src/hb-ot-shape-complex-arabic.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 57b05210b1a8968d18ccbbe70879b2e11b6a09f2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 15:03:21 2018 -0400
+
+    [test] Fix use of deprecated symbols
+
+ test/api/test-ot-tag.c | 60
+ ++++++++++++++++++++++++++++++++++++++------------
+ 1 file changed, 46 insertions(+), 14 deletions(-)
+
+commit ca37172ee3908bac12cc3d97768b95ae571530d2
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Oct 11 11:55:55 2018 -0700
+
+    fixed leak
+
+ test/api/test-ot-extents-cff.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 4f9e36e8cf5d9d3d3e5a1ed46149355ee5f5e9fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 14:32:59 2018 -0400
+
+    [graphite] Remove deprecated symbol use
+
+ src/hb-graphite2.cc | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit da591f2a9d2ae2a5878d3b2ef78a6d589b19aab0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 14:30:15 2018 -0400
+
+    Whitespace
+
+ src/hb-ot-tag.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 4d205f0462b19f371df495b9cc12c0128f507de9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 14:25:48 2018 -0400
+
+    [graphite] Fix deva/dev2 resolution
+
+    See
+    https://github.com/harfbuzz/harfbuzz/pull/730#issuecomment-428277800
+
+ src/hb-graphite2.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8061664ad1a5933098adc3bc1dca0b5be48586ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 14:16:55 2018 -0400
+
+    Add doc stubs for recently added API
+
+    Thanks to David Corbett who revamped our script and language
+    processing
+    and implemented full BCP 47 support.
+
+    https://github.com/harfbuzz/harfbuzz/pull/730
+
+    New API:
+    +hb_ot_layout_table_select_script()
+    +hb_ot_layout_script_select_language()
+    +HB_OT_MAX_TAGS_PER_SCRIPT
+    +HB_OT_MAX_TAGS_PER_LANGUAGE
+    +hb_ot_tags_from_script_and_language()
+    +hb_ot_tags_to_script_and_language()
+
+    Deprecated API:
+    -hb_ot_layout_table_choose_script()
+    -hb_ot_layout_script_find_language()
+    -hb_ot_tags_from_script()
+    -hb_ot_tag_from_language()
+
+ src/hb-ot-layout.cc | 10 ++++++++++
+ src/hb-ot-tag.cc    | 21 ++++++++++++++++-----
+ src/hb-ot-tag.h     | 10 ++++++++++
+ src/hb-unicode.h    |  2 +-
+ 4 files changed, 37 insertions(+), 6 deletions(-)
+
+commit cf975ac653bff369f4ed7ba7fc04fae6ce2cec95
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 14:07:44 2018 -0400
+
+    Remove use of deprecated function
+
+ src/hb-ot-layout.cc | 23 ++++++++++++-----------
+ src/hb-ot-layout.h  | 12 ++++++------
+ 2 files changed, 18 insertions(+), 17 deletions(-)
+
+commit 66790d64c7120b75c72bf91c769dc52d95858909
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Sep 10 13:15:00 2018 -0400
+
+    Increase HB_OT_MAX_TAGS_PER_SCRIPT to 3
+
+    No script has 3 tags yet, but the plan is for the Indic scripts
+    to each
+    get a third tag someday.
+
+ src/hb-ot-tag.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bca7a16938609539e4adb5cdf943734b7dfa1561
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Sep 10 12:05:51 2018 -0400
+
+    Update language system tag registry to OT 1.8.3
+
+ src/gen-tag-table.py   | 10 +++++++++-
+ src/hb-ot-tag-table.hh | 44 +++++++++++++++++++++++++++++++++-----------
+ 2 files changed, 42 insertions(+), 12 deletions(-)
+
+commit 7f1fbfe2e312f397db9271dd17a8e701489ffc79
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Jul 23 21:19:23 2018 -0400
+
+    Add hb_ot_tags_to_script_and_language
+
+ docs/harfbuzz-sections.txt |  3 +-
+ src/hb-ot-map.cc           |  2 +-
+ src/hb-ot-tag.cc           | 75
+ ++++++++++++++++++++++++++++++++++++++++------
+ src/hb-ot-tag.h            | 18 +++++++----
+ test/api/test-ot-tag.c     | 33 ++++++++++++++++++--
+ 5 files changed, 112 insertions(+), 19 deletions(-)
+
+commit 3f8877473fb4c72a6f3edfcfc927b9993a5f3616
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Jul 19 13:48:07 2018 -0400
+
+    Switch on the first char of a complex language tag
+
+    This results in a tenfold speed-up for the common case of tags
+    that are
+    not complex, in the sense of `hb_ot_tags_from_complex_language`.
+
+ src/gen-tag-table.py   |  171 ++++--
+ src/hb-ot-tag-table.hh | 1580
+ ++++++++++++++++++++++++------------------------
+ 2 files changed, 922 insertions(+), 829 deletions(-)
+
+commit a754d44195021603306af2a296d06187eda95409
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Jul 16 21:14:48 2018 -0400
+
+    Map Quechua languages to closest ones with tags
+
+    OpenType only officially maps four ISO 639 codes to Quechua languages,
+    but prior versions of HarfBuzz also mapped qu to 'QUZ '. Because qu
+    is a
+    macrolanguage, the mapping now applies to all individual Quechua
+    languages. OpenType calls 'QUZ ' "Quechua", but it really corresponds
+    to
+    Cusco Quechua, so the individual Quechua languages should not all
+    necessarily be mapped to it.
+
+ src/gen-tag-table.py   | 32 ++++++++++++++++++++++++++
+ src/hb-ot-tag-table.hh | 62
+ +++++++++++++++++++++++++++-----------------------
+ 2 files changed, 65 insertions(+), 29 deletions(-)
+
+commit 65d01f77552a5102ee114d9917fd2ecf091a35c3
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Jan 18 16:33:39 2018 -0500
+
+    Test deprecated tag fallback in a font
+
+    The font supports the deprecated tag 'DHV ' instead of 'DIV '. dv is
+    mapped to 'DIV ' and 'DHV ', in that order. The test specifies
+    `--language=dv`, demonstrating that if a font does not support
+    the first
+    OpenType tag mapped to a BCP 47 tag, it will fall back to the
+    next tag.
+
+ .../fonts/d3129450fafe5e5c98cfc25a4e71809b1b4d2855.ttf    | Bin 0 ->
+ 956 bytes
+ test/shaping/data/in-house/tests/language-tags.tests      |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit 7c7cb2a98907d99ca86bdbfca0bf9c48bfa4ed49
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Sat Jan 20 15:53:09 2018 -0500
+
+    Match extlang subtags
+
+    If the second subtag of a BCP 47 tag is three letters long, it denotes
+    an extended language. The tag converter ignores the language
+    subtag and
+    uses the extended language instead.
+
+    There are some grandfathered exceptions, which are handled earlier.
+
+ src/gen-tag-table.py   |  2 +-
+ src/hb-ot-tag-table.hh | 21 +++++++++++++++++++++
+ src/hb-ot-tag.cc       | 10 +++++++++-
+ test/api/test-ot-tag.c |  7 +++++++
+ 4 files changed, 38 insertions(+), 2 deletions(-)
+
+commit 2f1f961cc0f0f907916b4b00342d8a2dda8b4ee1
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Dec 8 22:45:52 2017 -0500
+
+    Autogenerate the BCP 47 to OpenType mappings
+
+    The new script, gen-tag-table.py, generates `ot_languages`
+    automatically
+    from the [OpenType language system tag registry][ot] and the [IANA
+    Language Subtag Registry][bcp47] with some manual modifications. If an
+    OpenType tag maps to a BCP 47 macrolanguage, all the macrolanguage's
+    individual languages are mapped to the same OpenType tag, except for
+    individual languages with their own OpenType mappings. Deprecated
+    BCP 47 tags are canonicalized.
+
+    [ot]:
+    https://docs.microsoft.com/en-us/typography/opentype/spec/languagetags
+    [bcp47]:
+    https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
+
+    Some OpenType tags correspond to multiple ISO 639 codes. The mapping
+    from ISO 639 codes lists OpenType tags in priority order, such
+    that more
+    specific or more likely tags appear first.
+
+    Some OpenType tags have no corresponding ISO 639 code in the
+    registry so
+    their mappings use BCP 47 subtags besides the language. For example,
+    any
+    BCP 47 tag with a fonipa variant subtag is mapped to 'IPPH', and
+    'IPPH'
+    is mapped back to und-fonipa.
+
+    Other OpenType tags have no corresponding ISO 639 code because it
+    is not
+    clear what they are for. HarfBuzz just ignores these tags.
+
+    One such ignored tag is 'ZHP ' (Chinese Phonetic). It probably means
+    zh-Latn. However, it is used in Microsoft JhengHei and Microsoft YaHei
+    with the script tag 'hani', implying that it is not a romanization
+    scheme after all. It would be simple enough to add this mapping to
+    gen-tag-table.py once a definitive mapping is determined.
+
+    The manual modifications are mainly either obvious mappings that the
+    OpenType registry omits or mappings for compatibility with previous
+    versions of HarfBuzz. Some of the old mappings were discarded, though,
+    for homophonous language names. For example, OpenType maps 'KUI ' to
+    kxu; previous versions of HarfBuzz also mapped it to kvd, because kvd
+    and kxu both happen to be called "Kui".
+
+    gen-tag-table.py also generates a function to convert multi-subtag
+    tags
+    like el-polyton and zh-HK to OpenType tags, replacing
+    `ot_languages_zh`
+    and the hard-coded list of special cases in
+    `hb_ot_tags_from_language`.
+    It also generates a function to convert OpenType tags to BCP 47,
+    replacing the hard-coded list of special cases in
+    `hb_ot_tag_to_language`.
+
+ src/Makefile.am        |    9 +-
+ src/Makefile.sources   |    1 +
+ src/gen-tag-table.py   | 1013 ++++++++++++++++++++++++
+ src/hb-ot-tag-table.hh | 1997
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-tag.cc       |  842 +-------------------
+ src/hb-ot-tag.h        |    2 +-
+ test/api/test-ot-tag.c |   66 +-
+ 7 files changed, 3092 insertions(+), 838 deletions(-)
+
+commit 2c7d4db7af16e228bb30eddf7334a524b74ae26c
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Dec 29 20:19:05 2017 +0800
+
+    Deprecate obsolete functions
+
+    `hb_ot_tags` replaces `hb_ot_tags_from_script` and
+    `hb_ot_tag_from_language`.
+
+    `hb_ot_layout_table_select_script` replaces
+    `hb_ot_layout_table_choose_script`.
+
+    `hb_ot_layout_script_select_language` replaces
+    `hb_ot_layout_script_find_language`.
+
+ docs/harfbuzz-sections.txt |  8 ++++----
+ src/hb-deprecated.h        | 23 +++++++++++++++++++++++
+ src/hb-ot-layout.h         | 15 ---------------
+ src/hb-ot-tag.h            |  8 --------
+ 4 files changed, 27 insertions(+), 27 deletions(-)
+
+commit 91067716f5e7b15d9a642f69019246c83fc7c108
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Dec 8 11:21:14 2017 -0500
+
+    Refactor the selection of script and language tags
+
+    The old hb-ot-tag.cc functions, `hb_ot_tags_from_script` and
+    `hb_ot_tag_from_language`, are now wrappers around a new function:
+    `hb_ot_tags`. It converts a script and a language to arrays of script
+    tags and language tags. This will make it easier to add new script
+    tags
+    to scripts, like 'dev3'. It also allows for language fallback chains;
+    nothing produces more than one language yet though.
+
+    Where the old functions return the default tags 'DFLT' and 'dflt',
+    `hb_ot_tags` returns an empty array. The caller is responsible for
+    using the default tag in that case.
+
+    The new function also adds a new private use subtag syntax for script
+    overrides: "x-hbscabcd" requests a script tag of 'abcd'.
+
+    The old hb-ot-layout.cc functions,`hb_ot_layout_table_choose_script`
+    and
+    `hb_ot_layout_script_find_language` are now wrappers around the new
+    functions `hb_ot_layout_table_select_script` and
+    `hb_ot_layout_script_select_language`. They are essentially the
+    same as
+    the old ones plus a tag count parameter.
+
+    Closes #495.
+
+ docs/harfbuzz-sections.txt |    5 +
+ src/hb-ot-layout.cc        |   43 +-
+ src/hb-ot-layout.h         |   16 +
+ src/hb-ot-map.cc           |   13 +-
+ src/hb-ot-tag.cc           | 1639
+ ++++++++++++++++++++++++--------------------
+ src/hb-ot-tag.h            |   11 +
+ test/api/test-ot-tag.c     |  107 +++
+ 7 files changed, 1070 insertions(+), 764 deletions(-)
+
+commit a03f5f4dfbbf885db567c3909241a55eb5869fce
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Dec 28 22:59:29 2017 +0800
+
+    Replace "ISO 639" with "BCP 47"
+
+    `hb_language_from_string` accepts not only ISO 639 but also BCP
+    47. Not
+    all ISO 639 codes are valid BCP 47 tags but the function does
+    not accept
+    overlong language subtags anyway.
+
+ src/hb-buffer.cc | 2 +-
+ src/hb-common.cc | 6 +++---
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit ce6639cd27f79856466a5e8abf58f544f069e25d
+Merge: a6b6faf2 0b9d60e1
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Oct 11 10:53:48 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit a6b6faf2b87f113fb23cf8e040f8b7875e2daf80
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Oct 11 10:53:44 2018 -0700
+
+    Replaced CFF1 J subset font for better coverage
+
+    in api test-ot-extents-cff
+
+ test/api/fonts/SourceHanSans-Regular.41,3041,4C2E.otf | Bin 0 ->
+ 3892 bytes
+ test/api/fonts/SourceHanSans-Regular.41,3041,4E9D.otf | Bin 5864 ->
+ 0 bytes
+ test/api/fonts/SourceHanSans-Regular.41,4C2E.otf      | Bin 0 ->
+ 2548 bytes
+ test/api/fonts/SourceHanSans-Regular.41,4E9D.otf      | Bin 5500 ->
+ 0 bytes
+ test/api/test-ot-extents-cff.c                        |  15
+ +++++++++++++++
+ test/api/test-subset-cff1.c                           |  18
+ +++++++++---------
+ 6 files changed, 24 insertions(+), 9 deletions(-)
+
+commit 0b9d60e1a1c4b7867ac907bbd7c004191a14e697
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 13:26:58 2018 -0400
+
+    [aat] Apply kerx if GPOS kern was not applied
+
+    Ned tells me this is what Apple does.
+
+ src/hb-ot-shape.cc | 18 ++++++++----------
+ 1 file changed, 8 insertions(+), 10 deletions(-)
+
+commit b59a428af08d6451a47f40ed01e594815ebf6303
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 13:24:17 2018 -0400
+
+    Minor
+
+ src/hb-ot-shape.cc | 6 +++++-
+ src/hb-ot-shape.hh | 5 +++--
+ 2 files changed, 8 insertions(+), 3 deletions(-)
+
+commit 100e95f48e3d137c654d206e858d6419ea62a12c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 11:30:45 2018 -0400
+
+    [trak] Add tests
+
+ test/shaping/data/in-house/Makefile.sources     |   1 +
+ test/shaping/data/in-house/fonts/TestTRAK.ttf   | Bin 0 -> 2456 bytes
+ test/shaping/data/in-house/tests/aat-trak.tests |   8 ++++++++
+ 3 files changed, 9 insertions(+)
+
+commit 04f72e8990ea61ffc6b62105c75e0a3e1b1ebab4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 11:25:07 2018 -0400
+
+    [trak] Implement extrapolation
+
+    This concludes trak, as well as AAT shaping support!
+
+ src/hb-aat-layout-trak-table.hh | 39
+ ++++++++++++++++++++-------------------
+ 1 file changed, 20 insertions(+), 19 deletions(-)
+
+commit d6a12dba6da6262fd9e5d8397b46ac8516136cae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 11:10:06 2018 -0400
+
+    [trak] Fix, and hook up
+
+    Works beautifully!  Test coming.
+
+ src/hb-aat-layout-common.hh     |  4 ++--
+ src/hb-aat-layout-trak-table.hh |  6 ++++--
+ src/hb-aat-layout.cc            | 25 ++++++++++++++++++++++++-
+ src/hb-aat-layout.hh            |  8 ++++++++
+ src/hb-ot-shape.cc              |  2 ++
+ 5 files changed, 40 insertions(+), 5 deletions(-)
+
+commit 3d7dea6dfdc9e75dcca100a79525aa3736dbe29c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 10:32:08 2018 -0400
+
+    [trak] Handle nSizes=0 and 1
+
+ src/hb-aat-layout-trak-table.hh | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit 451f3de521ff1b7f4d3b8ebb2cc0b95d88c9314a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 10:30:32 2018 -0400
+
+    [trak] Fix counting
+
+ src/hb-aat-layout-trak-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit a5be380cae9b49ed85c8620f1921209ef61a72ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 10:29:02 2018 -0400
+
+    [trak] More
+
+ src/hb-aat-layout-trak-table.hh | 26 +++++++++++++++++---------
+ 1 file changed, 17 insertions(+), 9 deletions(-)
+
+commit d06c4a867f0d383d8c27f2957e646d9e3fe6853b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 10:22:01 2018 -0400
+
+    [trak] Only adjust around first glyph
+
+    Assumes graphemes only have one base glyph.
+
+ src/hb-aat-layout-trak-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 071a2cbcddcbafae9458e674c21db5001b39518d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 10:18:46 2018 -0400
+
+    [trak] Clean up
+
+ src/hb-aat-layout-trak-table.hh | 67
+ +++++++++++++++++++++++------------------
+ 1 file changed, 37 insertions(+), 30 deletions(-)
+
+commit fbbd926dba163d9a2a6a62f380951f03363c2b14
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 01:22:29 2018 -0400
+
+    [kerx] Implement Format4 action_type=1 contour-point-based attachment
+
+    Untested.
+
+    This concludes kerx table support!
+
+ src/hb-aat-layout-kerx-table.hh | 17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
+
+commit b6bc0d4ff62e4509643db3b304306a72bbcb2c38
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 01:17:57 2018 -0400
+
+    [kerx] Implement Format4 action_type=2 coordinate-based attachment
+
+    Untested.
+
+ src/hb-aat-layout-kerx-table.hh | 21 ++++++++++++---------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
+
+commit 1622ba5943d14b2d50d45dc17fb723f4c9ddb0bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 01:14:18 2018 -0400
+
+    [kerx] Implement Format4 'ankr'-based mark attachment
+
+    Tested with Kannada MN:
+
+    $ HB_OPTIONS=aat ./hb-shape Kannada\ MN.ttc -u 0CCD,0C95,0CD6
+    [kn_ka.vattu=0+230|kn_ai_length_mark=1@326,0+607]
+
+ src/hb-aat-layout-common.hh     |  8 ++++++--
+ src/hb-aat-layout-kerx-table.hh | 20 +++++++++++++++++---
+ src/hb-aat-layout.cc            | 20 ++++++++++++++++----
+ src/hb-ot-layout-gpos-table.hh  |  4 ----
+ 4 files changed, 39 insertions(+), 13 deletions(-)
+
+commit 7bb4da7d9538f3d4b1d28030d43e0c3d720d821b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 00:52:07 2018 -0400
+
+    [aat] Wire up 'ankr' table to apply context
+
+ src/hb-aat-layout-common.hh | 7 +++++--
+ src/hb-aat-layout.cc        | 8 +++++++-
+ 2 files changed, 12 insertions(+), 3 deletions(-)
+
+commit 28f0367aab648c486d6e8d0e13dbbb2af1b65dcc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 11 00:12:49 2018 -0400
+
+    [kerx] Flesh out Format4
+
+    Doesn't apply actions yet.
+
+ src/hb-aat-layout-kerx-table.hh | 122
+ ++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 118 insertions(+), 4 deletions(-)
+
+commit 947962a287d9aca2cb509c11f44cb5150aa6daf1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 23:07:03 2018 -0400
+
+    [ankr] Implement table access
+
+ src/hb-aat-layout-ankr-table.hh | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+commit 7281cb3eeb00091c6e6085895afd4a38a0516f35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 22:56:52 2018 -0400
+
+    [ankr] Start fixing
+
+ src/hb-aat-layout-ankr-table.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 34caadc5c78e3d09faf11ef60bfade8f64f55de2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 22:17:07 2018 -0400
+
+    Ugh. Re-enable accidentally disabled GPOS
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f7c45bc33ec1559c960a039b770d5c37bd82f057
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 22:15:13 2018 -0400
+
+    [kerx] Allow granularly disabling kerning
+
+ src/hb-aat-layout-kerx-table.hh | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit 2b72c4b63d29eea39b646c8a1a1cfc2db732e1a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 21:53:14 2018 -0400
+
+    [kerx] Comment
+
+ src/hb-aat-layout-kerx-table.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 9f450f07b0a1593962e3b45d00f2cf93916f3466
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 21:46:58 2018 -0400
+
+    [kerx] Make Format1 work
+
+    Tested using Kannada MN:
+
+    $ HB_OPTIONS=aat ./hb-shape Kannada\ MN.ttc -u 0C95,0CCd,C95,CCD
+    [kn_ka.virama=0+1299|kn_ka.vattu=0+115|_blank=0@-115,0+385]
+
+    $ HB_OPTIONS=aat ./hb-shape Kannada\ MN.ttc -u 0C95,0CCd,C95,CCD
+    --features=-kern
+    [kn_ka.virama=0+1799|kn_ka.vattu=0+230|_blank=0+0]
+
+    I don't see the GPOS table in the font do the same.  ¯\_(ツ)_/¯
+
+ src/hb-aat-layout-kerx-table.hh | 15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+commit b5aa5dbb1158a5dfba29f7b119df9b4b319e8489
+Merge: af61c3b1 ab1f30bd
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Oct 10 18:36:35 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit af61c3b10f83a00b4862cc0cb92fc9f0856e7dd6
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Oct 10 18:35:12 2018 -0700
+
+    added vsindex test & fixed process_vsindex
+
+ src/hb-cff2-interp-cs.hh                    |  12 +++++-----
+ test/api/fonts/AdobeVFPrototype_vsindex.otf | Bin 0 -> 7036 bytes
+ test/api/test-ot-extents-cff.c              |  33
+ ++++++++++++++++++++++++++++
+ 3 files changed, 40 insertions(+), 5 deletions(-)
+
+commit 504cb68fc972c7f606bf9fc62015376382f78f45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 21:29:46 2018 -0400
+
+    Disable mark advance zeroing as well as mark fallback positioning
+    if doing kerx
+
+ src/hb-ot-shape.cc | 50
+ ++++++++++++++++++++++++++------------------------
+ 1 file changed, 26 insertions(+), 24 deletions(-)
+
+commit 84967537966a76297c89460d95e7336f1bfc332d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 21:18:37 2018 -0400
+
+    [kerx] Implement Format1
+
+    Untested.
+
+ src/hb-aat-layout-kerx-table.hh | 62
+ +++++++++++++++++++++++++++++++++--------
+ src/hb-aat-layout-morx-table.hh |  2 +-
+ 2 files changed, 52 insertions(+), 12 deletions(-)
+
+commit c9165f5450b99e6d93e2a168b198384a221eef58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 20:43:21 2018 -0400
+
+    [kerx] More UnsizedArrayOf<>
+
+ src/hb-aat-layout-kerx-table.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit ca54eba4846d0afda4601929556617a7ebe51714
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 20:41:16 2018 -0400
+
+    [kerx] Fix bound-checking error introduced a couple commits past
+
+ src/hb-aat-layout-kerx-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 339036dd970625e03696b4533ced1e25fc4fd131
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 20:37:22 2018 -0400
+
+    [kerx] Start fleshing out Format1
+
+ src/hb-aat-layout-kerx-table.hh | 59
+ +++++++++++++++++++++++++++++++++++------
+ src/hb-aat-layout-morx-table.hh |  2 +-
+ 2 files changed, 52 insertions(+), 9 deletions(-)
+
+commit ab1f30bd059f1d2270793e9726b60666b328d2b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 20:10:20 2018 -0400
+
+    [kerx] Implement Format6
+
+    Untested.  The only Apple font shipping with this format is San
+    Francisco fonts
+    that use this for their kerx variation tables, which we don't support.
+
+ src/hb-aat-layout-kerx-table.hh | 73
+ +++++++++++++++++++++++++++++++++--------
+ 1 file changed, 60 insertions(+), 13 deletions(-)
+
+commit c9a2ce9e05f91730a2150b9214dc6a49f31555c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 20:00:44 2018 -0400
+
+    [kerx] Move bounds-checking to subtable length itself
+
+ src/hb-aat-layout-kerx-table.hh | 12 +++++-------
+ 1 file changed, 5 insertions(+), 7 deletions(-)
+
+commit 22955b23cdeb48e46cdffd0eb906a855a420c4d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 19:58:20 2018 -0400
+
+    [kerx] Start fleshing out Format6
+
+ src/hb-aat-layout-kerx-table.hh | 42
+ ++++++++++++++++++++++++++++++++---------
+ src/hb-open-type.hh             |  3 +++
+ 2 files changed, 36 insertions(+), 9 deletions(-)
+
+commit f6aaad9b4ffb42e6cd8398f6439fe420e393c8f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 19:20:06 2018 -0400
+
+    [kerx] When rejecting variable kerning, also check for tupleCount
+
+ src/hb-aat-layout-kerx-table.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7ed5366d3cfca9c533250cb419e8cc878f32505d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 19:11:30 2018 -0400
+
+    [kerx] No-op
+
+    Tested that Format0 works with Kannada MN font:
+
+    $ make -j5 lib -s && HB_OPTIONS=aat ./hb-shape Kannada\ MN.ttc
+    -u 0C95,0CC2
+    [kn_ka=0+1000|kn_matra_uu=0@-30,0+1345]
+
+    $ make -j5 lib -s && HB_OPTIONS=aat ./hb-shape Kannada\ MN.ttc -u
+    0C95,0CC2 --features=-kern
+    [kn_ka=0+1030|kn_matra_uu=0+1375]
+
+    Note that GPOS does the same with 'dist' feature, and applies the
+    whole difference to the
+    same glyph:
+
+    $ make -j5 lib -s && ./hb-shape Kannada\ MN.ttc -u 0C95,0CC2
+    [kn_ka=0+970|kn_matra_uu=0+1375]
+
+    $ make -j5 lib -s && ./hb-shape Kannada\ MN.ttc -u 0C95,0CC2
+    --features=-dist
+    [kn_ka=0+1030|kn_matra_uu=0+1375]
+
+ src/hb-aat-layout-kerx-table.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 7fa69e92ca3dd9d8fa92aba0e01098165d2b7975
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 19:02:32 2018 -0400
+
+    Comment
+
+ src/hb-machinery.hh | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 7e6e5bf6147596d6d096e2ba37f3a6eefd7429cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 18:59:07 2018 -0400
+
+    Fix option string matching
+
+ src/hb-common.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5d34164d98f04816aafaa0abfc44cd899c7d70b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 18:14:41 2018 -0400
+
+    [kern/kerx] Fix offset base
+
+    Disable kern Format2.
+
+    Fix kerx Format2.  Manually tested this with Tamil MN font and
+    it works:
+
+    $ HB_OPTIONS=aat ./hb-shape Tamil\ MN.ttc -u 0B94,0B95
+    [tgv_au=0+3435|tgc_ka=1@-75,0+1517]
+
+     HB_OPTIONS=aat ./hb-shape Tamil\ MN.ttc -u 0B94,0B95 --features=-kern
+    [tgv_au=0+3510|tgc_ka=1+1592]
+
+ src/hb-aat-layout-kerx-table.hh | 73
+ +++++++++++++++++++++++++----------------
+ src/hb-ot-kern-table.hh         |  7 ++++
+ 2 files changed, 52 insertions(+), 28 deletions(-)
+
+commit 60f86d32d7c735ccf783b382e18ecdc096eaa682
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 18:10:05 2018 -0400
+
+    [kerx] Don't loop over kerning subtables if kerning disabled
+
+ src/hb-aat-layout-kerx-table.hh | 12 ++++++++++++
+ src/hb-ot-shape.cc              |  4 ++--
+ src/hb-ot-shape.hh              |  1 +
+ 3 files changed, 15 insertions(+), 2 deletions(-)
+
+commit 38a7a8a89ed035a1d1fc34a675a1860ad660b6ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 17:44:46 2018 -0400
+
+    Allow HB_OPTIONS=aat to prefer AAT tables over OT
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/322
+
+ src/hb-common.cc   | 23 +++++++++++++++++++++--
+ src/hb-debug.hh    |  7 ++++---
+ src/hb-ot-shape.cc | 24 ++++++++++++++++--------
+ 3 files changed, 41 insertions(+), 13 deletions(-)
+
+commit 44f09afd5bd4f4f1ea47ca54ac9d605219b06910
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 17:32:32 2018 -0400
+
+    [kerx] Skip variation subtables
+
+ src/hb-aat-layout-kerx-table.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 1e8fdd285f90b7b715b6d9ca9222a3c91cbea6b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 16:32:35 2018 -0400
+
+    Remove HAVE_OT
+
+    We never tested compiling without it.  Just kill it.  We always build
+    our own shaper.
+
+ CMakeLists.txt        | 1 -
+ configure.ac          | 6 ------
+ src/Makefile.am       | 2 --
+ src/hb-shaper-list.hh | 2 --
+ src/hb.hh             | 2 --
+ test/api/Makefile.am  | 4 +---
+ test/api/test-c.c     | 5 +----
+ util/Makefile.am      | 4 ----
+ util/options.cc       | 4 ----
+ util/options.hh       | 2 --
+ 10 files changed, 2 insertions(+), 30 deletions(-)
+
+commit 7727e737566ddc826647e19fc645b296ad5a0cac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 13:24:51 2018 -0400
+
+    [kerx] Actually hook up, and fix crash
+
+ src/hb-aat-layout-common.hh     | 6 ++++++
+ src/hb-aat-layout-kerx-table.hh | 4 ++--
+ src/hb-ot-shape.cc              | 4 ++--
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit b3390990f508def9c375716614b92fc7b0038228
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 12:07:49 2018 -0400
+
+    Add per-subtable set-digests
+
+    This speeds up Roboto shaping by ~10%.  I was hoping for more.
+    Still, good defense against lookups with many subtables.
+
+ src/hb-null.hh               |   2 +-
+ src/hb-ot-layout-gsubgpos.hh | 108
+ +++++++++++++++++++++++--------------------
+ 2 files changed, 59 insertions(+), 51 deletions(-)
+
+commit e78549edfb4df617128a5f5ddd12692f1d0af4bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 11:54:48 2018 -0400
+
+    Move apply down into subtables accel
+
+ src/hb-ot-layout-gsubgpos.hh | 10 +++++++++-
+ src/hb-ot-layout.cc          | 17 +++--------------
+ 2 files changed, 12 insertions(+), 15 deletions(-)
+
+commit 78c09bf21335a0f2b538b37de6647af08e3b1161
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 11:50:46 2018 -0400
+
+    Move subtable array into lookup accel
+
+ src/hb-null.hh               |  2 +-
+ src/hb-ot-layout-gsubgpos.hh | 14 +++++++++++---
+ src/hb-ot-layout.cc          | 16 ++++++----------
+ 3 files changed, 18 insertions(+), 14 deletions(-)
+
+commit 97e5913d5ac2cd313fb3923e9602358d7f75f11d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 11:41:05 2018 -0400
+
+    Move more code
+
+ src/hb-ot-layout-gsubgpos.hh               | 17 +++++++++++++++++
+ src/hb-ot-layout.cc                        | 12 ++++++------
+ src/hb-ot-layout.hh                        | 20 ++------------------
+ src/hb-ot-shape-complex-arabic-fallback.hh |  2 +-
+ 4 files changed, 26 insertions(+), 25 deletions(-)
+
+commit c8f2d9334c0f91ec30f1c7821eb44bb5149bd31c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 11:36:28 2018 -0400
+
+    Move code
+
+    In preparation to move add per-subtable set digests...
+
+ src/hb-ot-layout-gsubgpos.hh | 50 ++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout.cc          | 57
+ ++++----------------------------------------
+ 2 files changed, 54 insertions(+), 53 deletions(-)
+
+commit a03850a3567d532c3a4d7655aa71bfe73dfb0e33
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 10:57:28 2018 -0400
+
+    Fix GPOS/kern interaction
+
+    Oops.  Was checking for kern feature in GSUB, not GPOS.
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d1be805e784dfaadf2ce9caa830a3f851fdd67da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 10:49:45 2018 -0400
+
+    More rewriting plan compile
+
+    Hopefully more clear.
+
+ src/hb-ot-shape.cc | 55
+ ++++++++++++++++++++++++++++++++++++++----------------
+ src/hb-ot-shape.hh |  1 -
+ 2 files changed, 39 insertions(+), 17 deletions(-)
+
+commit 961ab46b24ca9f3ef42a56398646191f106bf5bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 10:42:10 2018 -0400
+
+    More reshuffle plan compile
+
+ src/hb-ot-shape.cc | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 2091b509e3e3b7fb7315539679fae81da2879280
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 10:41:08 2018 -0400
+
+    [kerx] Hook up to shaper
+
+ src/hb-aat-layout.cc | 31 ++++++++++++++++++++++++-------
+ src/hb-aat-layout.hh |  3 +++
+ src/hb-ot-shape.cc   |  6 ++++--
+ src/hb-ot-shape.hh   |  1 +
+ 4 files changed, 32 insertions(+), 9 deletions(-)
+
+commit 8d00c39bfc558895c63e22148d88db51cde39164
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 10:18:39 2018 -0400
+
+    [kern] Minor
+
+ src/hb-ot-shape-fallback.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit e655fd38cf20eefb1c071a52282a4caccb6f08ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 10:16:09 2018 -0400
+
+    Apply TT or fallback kerning when GPOS does not have kern feature
+
+    Previously we only did if there was no GPOS whatsoever.  This applies
+    to Arial, Times New Roman, etc in Win7.  Was not kerning before.  It
+    is now.
+
+ src/hb-ot-shape.cc | 25 ++++++++++++++++---------
+ 1 file changed, 16 insertions(+), 9 deletions(-)
+
+commit 754cf440bf80ced36461a98a5d4607a700f44fd3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 10 10:04:05 2018 -0400
+
+    Minor
+
+ src/hb-ot-shape-fallback.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 187df7d7a9a1d9cd67cb2f72d4d6ed8cae1eed61
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Oct 10 17:12:52 2018 +0330
+
+    [circleci] Add an iOS bot (#1233)
+
+ .circleci/config.yml |  12 +++++
+ CMakeLists.txt       | 140
+ ++++++++++++++++++++++++++++++++-------------------
+ 2 files changed, 100 insertions(+), 52 deletions(-)
+
+commit c06a5dff0b0f8d1c5aba53bcfd7fb0b680f1ca92
+Merge: 83c5298f 0537a401
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Oct 9 22:00:10 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit 83c5298f33e66cfd3d84d246297683f0de80c57d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Oct 9 21:59:36 2018 -0700
+
+    added cff1_legacyops.otf as test-ot-extents-cff test case
+
+    fixed roll operator bugs uncovered by the test
+
+ src/hb-cff-interp-common.hh       |   4 ++--
+ test/api/fonts/cff1_legacyops.otf | Bin 0 -> 3104 bytes
+ test/api/test-ot-extents-cff.c    |  23 +++++++++++++++++++++++
+ 3 files changed, 25 insertions(+), 2 deletions(-)
+
+commit 0537a40193e803d50a99cd6b993d6d9301e84ebf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 23:35:07 2018 -0400
+
+    [kerx] Comment
+
+ src/hb-aat-layout-kerx-table.hh | 2 +-
+ src/hb-ot-kern-table.hh         | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 362d3241195bb7054c395fb4b029b6d55da4612a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 23:27:00 2018 -0400
+
+    [aat] Rename
+
+ src/hb-aat-layout-kerx-table.hh | 4 ++--
+ src/hb-aat-layout-morx-table.hh | 6 +++---
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 54c9ecb92d196e62901eef3f8bc025c024ed16bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 23:18:19 2018 -0400
+
+    [morx] Use subtable range for embedded sanitizer here as well
+
+ src/hb-aat-layout-morx-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit d35315cc028e70dd1b3ffc8cb079a2336b22a0c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 23:17:32 2018 -0400
+
+    [aat] Fixup recent commit
+
+    For 329f2401082011007d9ce12b15ce0225cd267c57
+
+    max_ops is signed.
+
+ src/hb-aat-layout-common.hh | 2 +-
+ src/hb-machinery.hh         | 5 ++++-
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 948f59a13a4c643ae310f5fc643e29fefd6c3787
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 23:07:47 2018 -0400
+
+    [kerx] Use subtable range for runtime checks
+
+ src/hb-aat-layout-kerx-table.hh | 4 +++-
+ src/hb-machinery.hh             | 8 ++++++++
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 329f2401082011007d9ce12b15ce0225cd267c57
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 23:02:53 2018 -0400
+
+    [aat] Set embedded sanitizer max ops really high
+
+    Since we consume it legitimately during shaping.
+
+ src/hb-aat-layout-common.hh | 1 +
+ src/hb-machinery.hh         | 2 ++
+ 2 files changed, 3 insertions(+)
+
+commit ad763074861da60ed51211931788ca5b27fc1512
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 22:57:00 2018 -0400
+
+    [kerx] Comment
+
+ src/hb-aat-layout-kerx-table.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit db9600bbe15035cea6c2d4e8e9d184a5e23e357e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 22:55:47 2018 -0400
+
+    [kerx] Remove junk
+
+ src/hb-aat-layout-kerx-table.hh | 16 ----------------
+ 1 file changed, 16 deletions(-)
+
+commit 27db859416c0362f211e2b42dc9a2ebb53b0e0f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 22:52:41 2018 -0400
+
+    [kern/kerx] Adjust bounds check
+
+ src/hb-aat-layout-kerx-table.hh | 8 +++-----
+ src/hb-ot-kern-table.hh         | 8 +++-----
+ 2 files changed, 6 insertions(+), 10 deletions(-)
+
+commit c66f7f8c5deaac109e34bf65fc16cff92b74e69a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 22:49:33 2018 -0400
+
+    [kerx] Implement Format2 apply()
+
+    Still, not hooked.
+
+ src/hb-aat-layout-kerx-table.hh | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit 4b461785bdf356e4b5586cb6e5b226f47da04b7d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 22:46:30 2018 -0400
+
+    Fix check
+
+ src/hb-aat-layout-kerx-table.hh | 2 ++
+ src/hb-aat-layout.cc            | 4 +++-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 4df8eb200def767d342762654b96d5d9314e5b21
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 22:46:12 2018 -0400
+
+    [kern] Use kern subtable length for sanitizing in the accelerator
+
+ src/hb-ot-kern-table.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 8bff1d2994876a5202c8605d1cc37522431c6c84
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 22:39:31 2018 -0400
+
+    [kern] Minor
+
+ src/hb-ot-kern-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 53e55945000347fb19168bb4c13a470d30d46251
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 22:35:22 2018 -0400
+
+    [kerx] Implement Format0 apply()
+
+    Not hooked up to be called yet.
+
+ src/hb-aat-layout-common.hh     |  6 ++++--
+ src/hb-aat-layout-kerx-table.hh | 29 ++++++++++++++++++++++++++---
+ src/hb-aat-layout.cc            |  6 ++++--
+ src/hb-aat-layout.hh            | 12 +++++++-----
+ src/hb-ot-shape.cc              |  2 +-
+ 5 files changed, 42 insertions(+), 13 deletions(-)
+
+commit 60318f87153b559e5da103f0bfcce6bad8bab3b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 22:25:53 2018 -0400
+
+    Minor
+
+ src/hb-mutex.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 210f899acad1959d60892538ac1968a36dbbb51b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 21:56:37 2018 -0400
+
+    [kern] Sanitize 4 bytes, not 2
+
+ src/hb-ot-kern-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 588518ea51b2226bdb41417946848d18c3913a67
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Oct 9 14:48:04 2018 -0700
+
+    fixed test-ot-extents-cff failure on some platforms
+
+ test/api/test-ot-extents-cff.c | 11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+commit be2f148da474d6dd30132c22dd467ea33a942edf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 16:24:50 2018 -0400
+
+    [ft] Use mutex to lock access to FT_Face
+
+    Makes our FT-backed hb_font_t safe to use from multiple threads.
+    Still,
+    the underlying FT_Face should NOT be used from other threads by client
+    or other libraries.
+
+    Maybe I add a lock()/unlock() public API ala PangoFT2 and cairo-ft.
+    Maybe not.
+
+ src/hb-ft.cc                | 18 +++++++++++++++++-
+ src/hb-mutex.hh             |  8 ++++++++
+ test/api/test-multithread.c |  7 ++-----
+ 3 files changed, 27 insertions(+), 6 deletions(-)
+
+commit d18c3c5861d40291077eb8b8667dc2f12b649cf2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 16:07:55 2018 -0400
+
+    [ft] Remove (probably) stale comment
+
+ src/hb-ft.cc | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit 7003b601afd02b0ba7e839510a7d0b886da09aaa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 15:55:26 2018 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 07899435b8065d494e563f83e0a35300c828eefe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 15:39:51 2018 -0400
+
+    Install ot-funcs on newly created funcs
+
+    **Finally**!  Casual users can stop caring about font-funcs
+    completely now,
+    like they haven't been needing to care re unicode-funcs for a
+    few years.
+
+ src/hb-font.cc | 39 ++++++++++++++++++++++++++-------------
+ 1 file changed, 26 insertions(+), 13 deletions(-)
+
+commit 55153553675445e8aad06e363295d399aa79c54f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 15:12:09 2018 -0400
+
+    [ot-font] Don't pre-load cmap table
+
+    Now that we have get_h_advances() and get_nominal_glyphs()
+    implemented, the
+    overhead of doing a proper atomic load would be once per run, NOT
+    once per
+    glyph.  So, no need to pre-load the tables to avoid that overhead.
+
+    As such, hb_ot_font_set_funcs() has become really cheap.
+    Can *finally* make
+    it be default font functions on all newly created fonts!
+
+ src/hb-ot-font.cc | 9 +++------
+ 1 file changed, 3 insertions(+), 6 deletions(-)
+
+commit ec84460e46fdaa5f8a3c16c8d48dabe2b0c869da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 15:07:04 2018 -0400
+
+    [ot/ft] Implement get_nominal_glyphs() callback
+
+    Some more measurable speedup.  The recent commits' speedups are
+    as follows:
+
+    Testing with Roboto, ****when disabling kern and liga****:
+
+    Before:
+
+    FT --features=-kern,-liga
+    user↦   0m0.521s
+
+    OT --features=-liga,-kern
+    user↦   0m0.568s
+
+    After:
+
+    FT --features=-liga,-kern
+    user↦   0m0.428s
+
+    OT --features=-liga,-kern
+    user↦   0m0.470s
+
+    So, 17% speedup.
+
+    Note that FT callbacks are faster than OT these days since we added
+    an advance
+    cache to FT.  I don't think the difference is enough to justify
+    adding a cache
+    to OT.
+
+    When not disabling kern, the thing is three times slower, so the
+    speedups
+    are three times less impressive...  Still, 5% not bad for a codebase
+    that I
+    otherwise thought is optimized out.
+
+    Note that, because of this and other optimiztions in our main shaper,
+    disabling kern and liga, the OT shaper is now *faster* than the
+    fallback
+    shaper.  So, that's my recommendation to clients that need the
+    absolute
+    fastest...
+
+ src/hb-ft.cc      | 26 ++++++++++++++++++++++++++
+ src/hb-ot-font.cc | 24 ++++++++++++++++++++++++
+ 2 files changed, 50 insertions(+)
+
+commit e883f52732a25f5495ec30656489954afd8cc3a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 14:50:57 2018 -0400
+
+    Call get_nominal_glyphs() for runs of simple clusters at a time
+
+    Even without FT or OT font funcs implementing get_nominal_glyphs(),
+    there's measurable
+    speedup.
+
+ src/hb-buffer.hh             | 20 +++++++++++++++++++-
+ src/hb-ot-shape-normalize.cc |  9 +++++++++
+ 2 files changed, 28 insertions(+), 1 deletion(-)
+
+commit 8008bca83b0bb310fc434dbdd339545af951193b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 14:38:23 2018 -0400
+
+    Whitespace
+
+ src/hb-font.hh               |  2 +-
+ src/hb-ot-shape-normalize.cc | 52
+ ++++++++++++++++++++++++--------------------
+ 2 files changed, 29 insertions(+), 25 deletions(-)
+
+commit 30c114ffec335770452e60729224b1634586c5b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 14:37:08 2018 -0400
+
+    Avoid sort and recompose stages if all clusters simple
+
+    Even has measurable speedup...
+
+ src/hb-ot-shape-normalize.cc | 52
+ ++++++++++++++++++++++++--------------------
+ 1 file changed, 29 insertions(+), 23 deletions(-)
+
+commit 9f79365c3b183278d14352ba6241c7d4ec274984
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 14:36:25 2018 -0400
+
+    Fix warning
+
+    How come this one is not generated by clang everything bot?!
+
+    ../../../test/api/test-multithread.c:37:26: warning: initialization
+    discards ‘const’ qualifier from pointer target type
+    [-Wdiscarded-qualifiers]
+     static char *font_path = "fonts/Inconsolata-Regular.abc.ttf";
+                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+    ../../../test/api/test-multithread.c:38:21: warning: initialization
+    discards ‘const’ qualifier from pointer target type
+    [-Wdiscarded-qualifiers]
+
+ test/api/test-multithread.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 24382debe893450088acd1e4b387ac31145d4553
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 14:33:24 2018 -0400
+
+    Rewrite main normalizer loop to isolate runs of simple clusters
+
+ src/hb-ot-shape-normalize.cc | 24 +++++++++++++++++++-----
+ 1 file changed, 19 insertions(+), 5 deletions(-)
+
+commit b5371f18effbeb91565fd8c554c120b911641f0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 14:12:59 2018 -0400
+
+    Inline decompose_cluster
+
+    Towards separating the common case into its own loop.
+
+ src/hb-ot-shape-normalize.cc | 14 ++++----------
+ 1 file changed, 4 insertions(+), 10 deletions(-)
+
+commit f5f505b5120c316f06306318c6c2f0db4496ba04
+Merge: 8b349040 4035158d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Oct 9 10:10:35 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit b314c4e9abf4236c6650a63d1287471b61f64885
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 09:23:51 2018 -0400
+
+    [font] Add get_nominal_glyphs() callback (note the plural)
+
+    Unused as of now.  To be wired up to normalizer, which would remove
+    overhead and allow hb-ot-font initialization to become a no-op, so
+    we can enable it by default.
+
+ docs/harfbuzz-sections.txt |  3 +++
+ src/hb-font.cc             | 33 +++++++++++++++++++++++++++++++++
+ src/hb-font.h              | 24 ++++++++++++++++++++++++
+ src/hb-font.hh             | 13 +++++++++++++
+ 4 files changed, 73 insertions(+)
+
+commit ca6a317012a13ee84b58a69e14e74c94c5b158ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 09:06:07 2018 -0400
+
+    Minor
+
+ src/hb-font.cc | 6 +++---
+ src/hb-font.h  | 8 ++++----
+ src/hb-font.hh | 2 +-
+ 3 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 4035158de46ce373b7521daf61c5b6df83312968
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Wed Jul 25 18:26:10 2018 +0800
+
+    test/api/test-subset-*.c: Fix build on pre-C99
+
+    Ensure that we have the variables at the beginning of the block.
+    These
+    are the only fixes that we need for building HarfBuzz on older
+    compilers.
+
+ test/api/test-collect-unicodes.c |  9 ++++++---
+ test/api/test-subset-glyf.c      | 19 +++++++++++++------
+ test/api/test-subset-hdmx.c      |  8 ++++++--
+ test/api/test-subset-hmtx.c      |  3 ++-
+ test/api/test-subset-post.c      |  3 ++-
+ test/api/test-subset-vmtx.c      |  6 ++++--
+ test/api/test-subset.c           | 12 +++++++++---
+ 7 files changed, 42 insertions(+), 18 deletions(-)
+
+commit 8e4ad1d7a0a35298ca04828ef1ef18b4c019ec03
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Wed Jul 25 18:12:34 2018 +0800
+
+    builds: Fix and clean up MSVC DLL builds
+
+    Instead of passing a CFLAG/CXXFLAG to define HB_EXTERN, define it
+    directly in src/hb.hh as __declspec(dllexport) extern when we are
+    building HarfBuzz as DLLs on Visual Studio.  Define HB_INTERNAL
+    as nothing without defining HB_NO_VISIBILITY when building HarfBuzz as
+    DLLs to avoid linker errors on Visual Studio builds.
+
+    Also "install" harfbuzz-subset.dll into $(PREFIX)\bin as the
+    hb-subset utility will depend on that DLL at runtime, when HarfBuzz is
+    built as DLLs.  Since it consists of private APIs that are subject to
+    change, we do not install its headers nor .lib file.
+
+ CMakeLists.txt |  7 ++++++-
+ src/hb.hh      | 10 ++++++++--
+ 2 files changed, 14 insertions(+), 3 deletions(-)
+
+commit e640f3a6b16f41cee5f7868ec738fda01244e96a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 08:28:07 2018 -0400
+
+    Another old bot fix
+
+ src/hb-aat-layout-kerx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e4f27f368f8f0509fa47f6a28f3984e90b40588f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 08:20:10 2018 -0400
+
+    Try fixing older bots
+
+ src/hb-ot-shape-fallback.cc | 42
+ +++++++++++++++++++++---------------------
+ 1 file changed, 21 insertions(+), 21 deletions(-)
+
+commit bee93e269711a3eda4e7d762b730522564fe6e87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 08:01:49 2018 -0400
+
+    Add const to get_*_advances API
+
+    Ouch!
+
+ src/hb-font.cc    | 10 +++++-----
+ src/hb-font.h     |  8 ++++----
+ src/hb-font.hh    |  6 +++---
+ src/hb-ft.cc      |  2 +-
+ src/hb-ot-font.cc |  4 ++--
+ 5 files changed, 15 insertions(+), 15 deletions(-)
+
+commit eb2be97f864c726feaa2434e290f962ddfa97069
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 07:48:52 2018 -0400
+
+    Port test off deprecated API
+
+ test/api/test-shape.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit cc126f2817844a2e83e973129e5b2caa18de599f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 01:10:15 2018 -0400
+
+    Minor
+
+ src/Makefile.am          | 2 +-
+ test/shaping/Makefile.am | 2 ++
+ test/subset/Makefile.am  | 2 +-
+ 3 files changed, 4 insertions(+), 2 deletions(-)
+
+commit b2fbe55b828ea5864bc0aed54db7109a2e189de2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 01:07:36 2018 -0400
+
+    [icu] Unbreak
+
+ src/hb-icu.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a353c1768dc1d7934b8ac293761620f561304bb2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 01:05:28 2018 -0400
+
+    Remove test for deprecated hb_set_invert()
+
+ test/api/test-set.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit a52bc039c33b3c01dbb96b815dc24df7f03bc4be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 00:56:33 2018 -0400
+
+    Properly remove deprecated stuff
+
+ src/hb-glib.cc | 15 ++++++---------
+ src/hb-icu.cc  | 15 ++++++---------
+ src/hb-ucdn.cc | 15 ++++++---------
+ 3 files changed, 18 insertions(+), 27 deletions(-)
+
+commit 8b349040e92b8894a7f8a609fac8070bcb110f96
+Merge: df964a09 fc509165
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Oct 8 21:46:23 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit fc50916589a300e49183b5ee598e64ca28d0bd9a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 00:39:42 2018 -0400
+
+    Remove deprecated decompose_compatibility stuff
+
+ src/hb-glib.cc          | 31 +-----------------------------
+ src/hb-icu.cc           | 33 +-------------------------------
+ src/hb-ucdn.cc          |  8 +-------
+ test/api/test-unicode.c | 51
+ -------------------------------------------------
+ 4 files changed, 3 insertions(+), 120 deletions(-)
+
+commit eed737f6726d3408191a4e64592805b70d8bb247
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 00:33:30 2018 -0400
+
+    Remove deprecated eastasian_width
+
+ src/hb-glib.cc          |  8 +------
+ src/hb-icu.cc           | 19 +--------------
+ src/hb-ucdn.cc          |  9 +------
+ test/api/test-unicode.c | 64
+ -------------------------------------------------
+ 4 files changed, 3 insertions(+), 97 deletions(-)
+
+commit 47030b1855f04c0d75899ffb6f5021fea3c19b90
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 00:30:45 2018 -0400
+
+    [ft/ot] Remove implementation of deprecated kerning funcs
+
+ src/hb-ft.cc      | 19 -------------------
+ src/hb-ot-font.cc | 13 -------------
+ 2 files changed, 32 deletions(-)
+
+commit 977c8a8e5c811995f47b0eb721199d0dc3689e48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 00:22:08 2018 -0400
+
+    [kern] Minor
+
+ src/hb-ot-kern-table.hh | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit ed5cfa42c7fb8d5ff2d74bdb452a0590174f4e19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 00:20:35 2018 -0400
+
+    [kern] Minor
+
+ src/hb-aat-layout-kerx-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d219f899f4b2fb4b39ebc1dff9fb648fc5d6d112
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 9 00:01:09 2018 -0400
+
+    Deprecate font kern API
+
+ docs/harfbuzz-sections.txt | 16 +++++++-------
+ src/hb-deprecated.h        | 54
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-font.cc             |  3 +++
+ src/hb-font.h              | 51
+ -------------------------------------------
+ 4 files changed, 65 insertions(+), 59 deletions(-)
+
+commit a51958819fcf51ade3f8eb38001e680a419ebbba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 8 23:57:45 2018 -0400
+
+    Apply TrueType/OpenType kern table when GPOS kern feature is not
+    available
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/250
+
+ src/hb-ot-kern-table.hh     | 24 +++++++++++--------
+ src/hb-ot-layout.cc         | 57
+ ++++++++++++++++++++-------------------------
+ src/hb-ot-layout.hh         | 13 +++++++++++
+ src/hb-ot-shape-fallback.cc |  4 ++--
+ src/hb-ot-shape.cc          | 10 +++++---
+ src/hb-ot-shape.hh          |  1 +
+ 6 files changed, 62 insertions(+), 47 deletions(-)
+
+commit 09ad2613c8d8a60dac69a878c2d568adfea054c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 8 23:30:24 2018 -0400
+
+    Separate fallback kern vs mark positioning
+
+ src/hb-ot-shape-fallback.cc | 12 ++++++------
+ src/hb-ot-shape-fallback.hh | 12 ++++++------
+ src/hb-ot-shape.cc          | 15 ++++++++-------
+ src/hb-ot-shape.hh          |  4 ++--
+ 4 files changed, 22 insertions(+), 21 deletions(-)
+
+commit 3c23ff9b7c4241ec23054a95f1fdfbdef2c51f40
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 8 23:26:26 2018 -0400
+
+    [kern] Add kerning driver to TT kern table
+
+ src/hb-ot-kern-table.hh     | 19 +++++++++++++++++--
+ src/hb-ot-shape-fallback.cc |  2 +-
+ 2 files changed, 18 insertions(+), 3 deletions(-)
+
+commit 683c3a95330928129cfbb1488650f708414d68ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 8 23:09:48 2018 -0400
+
+    [kern] Abstract away kerning machine
+
+ src/hb-font.hh              |  2 +-
+ src/hb-ot-kern-table.hh     | 71
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-fallback.cc | 67
+ +++++++++++-------------------------------
+ 3 files changed, 89 insertions(+), 51 deletions(-)
+
+commit fb4f43838154a77912a9fc3437110c81e9d34aac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 8 22:44:16 2018 -0400
+
+    Add HB_DEPRECATED
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1232
+
+ src/hb-common.h     |  9 +++++++++
+ src/hb-deprecated.h | 12 ++++++------
+ 2 files changed, 15 insertions(+), 6 deletions(-)
+
+commit 80e3102b8a216f9a751d073f9a2f7900ca758086
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 8 22:41:08 2018 -0400
+
+    [kerx] Process coverage flags
+
+ src/hb-aat-layout-kerx-table.hh | 27 +++++++++++++++++++++++++++
+ 1 file changed, 27 insertions(+)
+
+commit 26d7305da7a7e2cf765b068f565836442872ffe7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 8 22:31:35 2018 -0400
+
+    Deprecate decompose_compatibility stuff
+
+ docs/harfbuzz-sections.txt |  7 +++---
+ src/hb-deprecated.h        | 63
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-unicode.h           | 47 ----------------------------------
+ 3 files changed, 67 insertions(+), 50 deletions(-)
+
+commit 42b51eee54f143854b7c6c3be5d84bfbbd895100
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 8 22:26:39 2018 -0400
+
+    Deprecate eastasian_width stuff
+
+ docs/harfbuzz-sections.txt |  5 +++--
+ src/hb-deprecated.h        | 37 +++++++++++++++++++++++++++++++++++++
+ src/hb-unicode.h           | 28 ----------------------------
+ 3 files changed, 40 insertions(+), 30 deletions(-)
+
+commit df964a09319bbf5b0a7528b906311726d4f640d6
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Oct 8 15:38:05 2018 -0700
+
+    fixed test-subset-cff2
+
+ src/hb-cff2-interp-cs.hh | 7 +++----
+ src/hb-ot-cff2-table.cc  | 2 +-
+ 2 files changed, 4 insertions(+), 5 deletions(-)
+
+commit a90fd8b9feeee3b02d139f2e7db774766d7855cb
+Merge: b51418f5 e42cd58c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Oct 8 15:07:58 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit b51418f596097aa5d1b28fb0a02b613c36bacd8e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Oct 8 15:05:36 2018 -0700
+
+    added CFF2 get_extents
+
+    added source hb-ot-cff2-table.cc
+    augmented VariationData to return scalars
+    misc bug fixes, renaming, cleanup
+
+ src/Makefile.sources             |   2 +
+ src/hb-cff-interp-common.hh      |  37 ++++++-----
+ src/hb-cff-interp-cs-common.hh   | 134
+ +++++++++++++++++++-------------------
+ src/hb-cff-interp-dict-common.hh |   6 +-
+ src/hb-cff2-interp-cs.hh         | 102 ++++++++++++++++++++++++-----
+ src/hb-ot-cff1-table.hh          |   4 +-
+ src/hb-ot-cff2-table.cc          | 135
+ +++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-cff2-table.hh          |  71 ++++++++++++--------
+ src/hb-ot-face.cc                |   1 +
+ src/hb-ot-face.hh                |   1 +
+ src/hb-ot-font.cc                |   4 ++
+ src/hb-ot-layout-common.hh       |  28 +++++++-
+ src/hb-subset-cff1.cc            |   2 +-
+ src/hb-subset-cff2.cc            |   4 +-
+ test/api/test-ot-extents-cff.c   |  36 +++++++++++
+ 15 files changed, 426 insertions(+), 141 deletions(-)
+
+commit 286a45641fc6732bb7cab02f06c90396834541b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 8 16:41:08 2018 -0400
+
+    Minor
+
+ src/hb-ot-shape-normalize.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c0d3bf1bafe7b6d2e8f2798c1f55aaec71350d90
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 8 16:32:44 2018 -0400
+
+    Minor
+
+ src/hb-ot-shape.cc | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit 9c1bb81f5c5ca64ad1c665edd16947e4bc6f6c46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 8 16:10:54 2018 -0400
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED            | 3 ---
+ test/shaping/data/text-rendering-tests/Makefile.sources    | 2 +-
+ test/shaping/data/text-rendering-tests/tests/MORX-35.tests | 4 ++--
+ 3 files changed, 3 insertions(+), 6 deletions(-)
+
+commit 1a5a3325a26f4989ab8c4bb91515d4898ffa4631
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 23:08:39 2018 -0400
+
+    [kerx] Minor
+
+ src/hb-aat-layout-kerx-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d62b4011cc600ade2b130f81a077dd08d4e4464f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 22:58:06 2018 -0400
+
+    [kern] Shout less
+
+ src/hb-ot-kern-table.hh | 36 +++++++++++++++++++-----------------
+ 1 file changed, 19 insertions(+), 17 deletions(-)
+
+commit c6bb3a588f493630b40d8823532b482f407bacbf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 22:52:53 2018 -0400
+
+    [kerx] Clean up Format2
+
+ src/hb-aat-layout-kerx-table.hh | 48
+ ++++++++---------------------------------
+ 1 file changed, 9 insertions(+), 39 deletions(-)
+
+commit 8aa83d97f9e7f63e2fcb4ae965b75a39961c7d87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 22:43:59 2018 -0400
+
+    [kern/kerx] Fix Format2 offsetting
+
+    "The values in the right class table are stored pre-multiplied by the
+    number of bytes in a single kerning value, and the values in the left
+    class table are stored pre-multiplied by the number of bytes in one
+    row. This eliminates needing to multiply the row and column values
+    together to determine the location of the kerning value. The array can
+    be indexed by doing the right- and left-hand class mappings,
+    adding the
+    class values to the address of the array, and fetching the kerning
+    value to which the new address points."
+
+ src/hb-aat-layout-kerx-table.hh | 2 +-
+ src/hb-ot-kern-table.hh         | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit ed2a404272bc99234c6f71f22b5a642834e59e6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 22:33:41 2018 -0400
+
+    [kerx] Clean up Format0
+
+ src/hb-aat-layout-kerx-table.hh | 48
+ +++++++++++------------------------------
+ 1 file changed, 12 insertions(+), 36 deletions(-)
+
+commit 4c3b19d52ec7a1fa46f8d0971e377a7d29b87e27
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 22:30:42 2018 -0400
+
+    Support HBUINT32 BinSearchArrayOf
+
+ src/hb-open-type.hh | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit 456a68c506238e9c6b019244237d4443bd3589af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 22:28:45 2018 -0400
+
+    Move code
+
+ src/hb-aat-layout-common.hh | 105
+ --------------------------------------------
+ src/hb-open-type.hh         | 105
+ +++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 104 insertions(+), 106 deletions(-)
+
+commit 3515c8b187e2316dcf3abaefc84917b09449d485
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 22:27:00 2018 -0400
+
+    [aat] Rename
+
+ src/hb-aat-layout-common.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit e42cd58c997adafca5517faa9aacf651b90520f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 20:46:11 2018 -0400
+
+    Rename invisible_codepoint to invisible_glyph in API
+
+    Deleted recently added API:
+        hb_buffer_set_invisible_codepoint()
+        hb_buffer_get_invisible_codepoint()
+
+        hb-shape / hb-view --invisible-codepoint
+
+    New API:
+        hb_buffer_set_invisible_glyph()
+        hb_buffer_get_invisible_glyph()
+
+        hb-shape / hb-view --invisible-glyph
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1216
+
+ docs/harfbuzz-sections.txt |  4 ++--
+ src/hb-buffer.cc           | 12 ++++++------
+ src/hb-buffer.h            |  6 +++---
+ util/options.cc            |  2 +-
+ util/options.hh            |  6 +++---
+ 5 files changed, 15 insertions(+), 15 deletions(-)
+
+commit 2a5cb37fdb43230217e055f3d7c770a35cfd5c21
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 20:36:46 2018 -0400
+
+    Revert "[morx] Fix MORX-35"
+
+    This reverts commit f62f6e90ad1f1a83f77771ad65ee1ffb79470a8a.
+
+ src/hb-aat-layout-morx-table.hh                         | 14
+ +++++---------
+ test/shaping/data/text-rendering-tests/DISABLED         |  3 +++
+ test/shaping/data/text-rendering-tests/Makefile.sources |  2 +-
+ 3 files changed, 9 insertions(+), 10 deletions(-)
+
+commit 14ebf8af0c04efcae6ca788ac85601bfe462f28d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 20:35:06 2018 -0400
+
+    [buffer] Improve shift_forward()
+
+    "Improve" is a strong word in this case though, I understand.
+
+ src/hb-buffer.cc | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+commit f62f6e90ad1f1a83f77771ad65ee1ffb79470a8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 18:06:53 2018 -0400
+
+    [morx] Fix MORX-35
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1224
+
+ src/hb-aat-layout-morx-table.hh                         | 14
+ ++++++++++----
+ test/shaping/data/text-rendering-tests/DISABLED         |  3 ---
+ test/shaping/data/text-rendering-tests/Makefile.sources |  2 +-
+ 3 files changed, 11 insertions(+), 8 deletions(-)
+
+commit 94368855c6bd7201d562cab3d2107685589e69c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 18:52:12 2018 -0400
+
+    Remove some code
+
+    We use scratch-flags to short-circuit this function.  No need for
+    previous
+    early loop.
+
+ src/hb-ot-shape.cc | 16 +++-------------
+ 1 file changed, 3 insertions(+), 13 deletions(-)
+
+commit c07b91b812dc66b38b11329cd6a93258a3769f9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 18:00:14 2018 -0400
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   6 +++++-
+ .../data/text-rendering-tests/fonts/TestMORXForty.ttf    | Bin 0 ->
+ 2408 bytes
+ .../text-rendering-tests/fonts/TestMORXThirtyeight.ttf   | Bin 0 ->
+ 2444 bytes
+ .../text-rendering-tests/fonts/TestMORXThirtynine.ttf    | Bin 0 ->
+ 2436 bytes
+ .../text-rendering-tests/fonts/TestMORXThirtyseven.ttf   | Bin 0 ->
+ 2444 bytes
+ .../data/text-rendering-tests/tests/MORX-35.tests        |   4 ++--
+ .../data/text-rendering-tests/tests/MORX-37.tests        |   4 ++++
+ .../data/text-rendering-tests/tests/MORX-38.tests        |   4 ++++
+ .../data/text-rendering-tests/tests/MORX-39.tests        |   4 ++++
+ .../data/text-rendering-tests/tests/MORX-40.tests        |   4 ++++
+ 10 files changed, 23 insertions(+), 3 deletions(-)
+
+commit fdce1e15434f14b7f4802edd67f7af737cf2b075
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 14:01:33 2018 -0400
+
+    [kerx] Clean up kerx and KerxTable structures
+
+ src/hb-aat-layout-kerx-table.hh | 169
+ ++++++++++++++++++++++++++--------------
+ src/hb-aat-layout-morx-table.hh |   2 +-
+ 2 files changed, 113 insertions(+), 58 deletions(-)
+
+commit 71b65eb27dd0867f51d9906887b9e372eb37f54a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 18:41:52 2018 +0200
+
+    Add API for setting invisible-codepoint
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1216
+
+    New API:
+    hb_buffer_set_invisible_codepoint()
+    hb_buffer_get_invisible_codepoint()
+
+    hb-shape / hb-view --invisible-codepoint
+
+ docs/harfbuzz-sections.txt |  2 ++
+ src/hb-buffer.cc           | 42
+ ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.h            |  7 +++++++
+ src/hb-buffer.hh           |  1 +
+ src/hb-ot-shape.cc         |  8 ++++----
+ util/options.cc            |  1 +
+ util/options.hh            |  3 +++
+ 7 files changed, 60 insertions(+), 4 deletions(-)
+
+commit 13da3be0b342e8e2f060eba8753c6957c477c4ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 18:23:45 2018 +0200
+
+    [ot-font] Load hmtx/vmtx lazily
+
+    Since we have get_*_advanes() API now, the overhead is once per shape,
+    not once per glyph.
+
+    Only cmap is warmed-up at set_funcs() time now.
+
+ src/hb-ot-font.cc | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit 856db4c9184e39c0457cc07c815f90058937c8a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 18:21:15 2018 +0200
+
+    Minor
+
+ src/hb-ot-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f92330b5e0b1a5a61768494bd7081e3fc235b182
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 17:51:50 2018 +0200
+
+    Minor
+
+ test/api/test-multithread.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit b2e398c077cf9437298bfe2ee53b7407a5865c14
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 16:31:33 2018 +0200
+
+    [coretext] Fix OS X check
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1230
+
+ src/hb-coretext.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 55942ad5c1ee999c9f590b8cc8fbde12e937aa6f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Oct 6 14:49:44 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+ TODO                                               |  10 +--
+ configure.ac                                       |   2 +-
+ src/hb-aat-layout-common.hh                        |   4 +-
+ src/hb-aat-layout-morx-table.hh                    |   9 +-
+ src/hb-aat-layout.cc                               |   6 ++
+ src/hb-aat-layout.hh                               |   2 +
+ src/hb-face.cc                                     |   2 +-
+ src/hb-machinery.hh                                |   2 +-
+ src/hb-ot-cmap-table.hh                            |   2 +-
+ src/hb-ot-post-table.hh                            |   2 +-
+ src/hb-ot-shape.cc                                 |  27 ++++--
+ src/hb-ot-shape.hh                                 |   5 ++
+ src/hb-set.hh                                      |   4 +-
+ src/hb-subset.cc                                   |   2 +-
+ src/hb-vector.hh                                   | 100
+ ++++++++++++++-------
+ test/shaping/data/text-rendering-tests/DISABLED    |  35 +-------
+ .../data/text-rendering-tests/Makefile.sources     |  18 ++--
+ .../data/text-rendering-tests/extract-tests.py     |  18 +++-
+ .../text-rendering-tests/fonts/TestGSUBThree.ttf   | Bin 0 -> 1504 bytes
+ .../fonts/TestMORXThirtyfive.ttf                   | Bin 0 -> 1968 bytes
+ .../fonts/TestMORXThirtyfour.ttf                   | Bin 0 -> 3608 bytes
+ .../fonts/TestMORXThirtysix.ttf                    | Bin 0 -> 1836 bytes
+ .../fonts/TestMORXThirtythree.ttf                  | Bin 0 -> 1520 bytes
+ .../fonts/TestMORXTwentyfour.ttf                   | Bin 0 -> 1828 bytes
+ .../data/text-rendering-tests/tests/GSUB-3.tests   |   1 +
+ .../data/text-rendering-tests/tests/MORX-24.tests  |   1 +
+ .../data/text-rendering-tests/tests/MORX-32.tests  |   8 +-
+ .../data/text-rendering-tests/tests/MORX-33.tests  |   3 +
+ .../data/text-rendering-tests/tests/MORX-34.tests  |   1 +
+ .../data/text-rendering-tests/tests/MORX-35.tests  |   2 +
+ .../data/text-rendering-tests/tests/MORX-36.tests  |   1 +
+ test/shaping/run-tests.py                          |  19 ++--
+ util/view-cairo.hh                                 |   2 +-
+ 33 files changed, 173 insertions(+), 115 deletions(-)
+
+commit 7ee50af8366547c382047a30a94f7f5f739aabcb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 6 21:31:44 2018 +0200
+
+    [morx] Fix memory access issues with unsafe_to_break
+
+ src/hb-aat-layout-common.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit f58c5175890e666503b6f140d238e1abca91598e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 6 22:42:56 2018 +0330
+
+    Make msan output a little more readable
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e9abe33963739f753cdfb007eed40101ce33f550
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 6 12:19:33 2018 +0330
+
+    Use tempfile in run-tests as a fix for Windows CI fails (#1228)
+
+ test/shaping/run-tests.py | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 0816a549789a1b647443c2b33cfda3f4400a0f87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 6 02:40:57 2018 +0200
+
+    [uniscribe/coretext] Fix for previous change
+
+ src/hb-coretext.cc  |  2 +-
+ src/hb-uniscribe.cc | 12 ++++++------
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 341206eb609202e4b2f0d03d29cb577ebe8390b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 5 18:39:48 2018 +0200
+
+    [vector] Make hb_vector_t relocatable / nestable
+
+    Ugly, but...
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1227
+
+ src/hb-face.cc          |  2 +-
+ src/hb-machinery.hh     |  2 +-
+ src/hb-ot-cmap-table.hh |  2 +-
+ src/hb-ot-post-table.hh |  2 +-
+ src/hb-set.hh           |  4 +--
+ src/hb-subset.cc        |  2 +-
+ src/hb-vector.hh        | 94
+ +++++++++++++++++++++++++++++++------------------
+ 7 files changed, 66 insertions(+), 42 deletions(-)
+
+commit 5469d80707d32c733b1c60f79ab2f217e879de55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 5 18:21:08 2018 +0200
+
+    Add hb_vector_t::fini_deep ()
+
+ src/hb-vector.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 4831e615d173be9c7e140be0fa9017e4d9e499af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 5 18:14:13 2018 +0200
+
+    [morx] Fix memory access issue
+
+    If buffer was enlarged, info was being outdated.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1225
+
+ src/hb-aat-layout-common.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 5a41cf6be69adb0b5b29976a33c4c6dd6ce7afc5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 5 11:33:19 2018 +0200
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   3 +++
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   2 ++
+ .../text-rendering-tests/fonts/TestMORXThirtyfive.ttf    | Bin 0 ->
+ 1968 bytes
+ .../text-rendering-tests/fonts/TestMORXThirtysix.ttf     | Bin 0 ->
+ 1836 bytes
+ .../data/text-rendering-tests/tests/MORX-35.tests        |   2 ++
+ .../data/text-rendering-tests/tests/MORX-36.tests        |   1 +
+ 6 files changed, 8 insertions(+)
+
+commit a62f37d6fa412b799b7247b813f6e65a968e7645
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 5 02:49:29 2018 +0200
+
+    Change vendor features from Harf/Buzz to HARF/BUZZ
+
+    https://github.com/harfbuzz/harfbuzz/commit/a01194aaf4c15160330b4042066263b2c963b658#commitcomment-30772041
+
+    "The tag space of tags consisting of four uppercase letters (A-Z)
+    with no punctuation,
+    spaces, or numbers, is reserved as a vendor space. Font vendors may
+    use such tags to
+    identify private features."
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e7a045e4db39e037badcab0ad1239c0cb56c1170
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Oct 4 14:16:07 2018 -0700
+
+    fixed leak exposed by test-ot-extents-cff
+
+ src/hb-cff-interp-common.hh      | 3 +++
+ src/hb-cff-interp-dict-common.hh | 4 ++++
+ 2 files changed, 7 insertions(+)
+
+commit 6238edbd8b654d105bbd191dffabc7820f0a3223
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Oct 4 13:59:36 2018 -0700
+
+    added CFF glyph extents API test
+
+ test/api/Makefile.am           |  1 +
+ test/api/test-ot-extents-cff.c | 65
+ ++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 66 insertions(+)
+
+commit 0222d57c357c775f25866653700b9dcb7d5bb807
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Oct 4 09:37:57 2018 -0700
+
+    tweaked previous warning fixes
+
+ src/hb-cff-interp-common.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7b3ae5ffd202346cb3742fe0f8cfafe8c36a4bd5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 4 16:36:42 2018 +0200
+
+    More bot fixes
+
+ test/shaping/run-tests.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 310bdac4a08b99a25de6a16a20464873f90b52e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 4 16:31:14 2018 +0200
+
+    Fix a warning
+
+ util/view-cairo.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0abce58139bb58b8b97171db6387d2ac7eebdee0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 4 16:23:42 2018 +0200
+
+    [test] Choose 'ot' shaper specifically
+
+    Now that we added morx support, our OS X bot is running them through
+    CoreText
+    and failing (with a DoS / infinite loop no less!).  Always run
+    tests through
+    our own shaper.
+
+ test/shaping/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c93d379bf2414eb6ee6d38fb9753ddf818a777ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 4 13:28:13 2018 +0200
+
+    [TODO] Clean up
+
+ TODO | 10 +---------
+ 1 file changed, 1 insertion(+), 9 deletions(-)
+
+commit a01194aaf4c15160330b4042066263b2c963b658
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 4 13:00:37 2018 +0200
+
+    Enable two OpenType features, 'Harf' and 'Buzz'
+
+    One early, before script-specific features, one late, after.
+    Allows font
+    developers to detect us and behave differently if needed.
+
+ src/hb-ot-shape.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 55468ca01b4cdf274900fb752fbf9ae05a78705e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 4 12:13:55 2018 +0200
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   6 +++++-
+ test/shaping/data/text-rendering-tests/extract-tests.py  |  12
+ ++++++++++++
+ .../data/text-rendering-tests/fonts/TestGSUBThree.ttf    | Bin 0 ->
+ 1504 bytes
+ .../text-rendering-tests/fonts/TestMORXThirtyfour.ttf    | Bin 0 ->
+ 3608 bytes
+ .../text-rendering-tests/fonts/TestMORXThirtythree.ttf   | Bin 0 ->
+ 1520 bytes
+ .../text-rendering-tests/fonts/TestMORXTwentyfour.ttf    | Bin 0 ->
+ 1828 bytes
+ .../shaping/data/text-rendering-tests/tests/GSUB-3.tests |   1 +
+ .../data/text-rendering-tests/tests/MORX-24.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-32.tests        |   8 ++++----
+ .../data/text-rendering-tests/tests/MORX-33.tests        |   3 +++
+ .../data/text-rendering-tests/tests/MORX-34.tests        |   1 +
+ test/shaping/run-tests.py                                |  15
+ +++++++++------
+ 12 files changed, 36 insertions(+), 11 deletions(-)
+
+commit 6ff8a8a10b62a54a87d53b0af66ccaba5d58b107
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 4 12:09:45 2018 +0200
+
+    Minor
+
+ test/shaping/data/text-rendering-tests/extract-tests.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 14ff3cbe0f30dea24e1bb175b1e8e41039f6afdc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 4 11:34:21 2018 +0200
+
+    Apply morx if there's no GSUB!
+
+ src/hb-ot-shape.cc                                 | 23 ++++++++++++----
+ src/hb-ot-shape.hh                                 |  5 ++++
+ test/shaping/data/text-rendering-tests/DISABLED    | 32
+ ----------------------
+ .../data/text-rendering-tests/Makefile.sources     | 14 +++++-----
+ 4 files changed, 29 insertions(+), 45 deletions(-)
+
+commit 3417037eb13a59dce6add0b1691ddb1b2b54c1e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 4 11:08:15 2018 +0200
+
+    [aat] Add +hb_aat_layout_has_substitution
+
+ src/hb-aat-layout-morx-table.hh | 2 ++
+ src/hb-aat-layout.cc            | 6 ++++++
+ src/hb-aat-layout.hh            | 2 ++
+ 3 files changed, 10 insertions(+)
+
+commit 1f14107f71a6c3da8270ed21c3588f945fa91733
+Author: Sascha Brawer <sascha@brawer.ch>
+Date:   Thu Oct 4 09:17:08 2018 +0200
+
+    Minor: Fix autoconf warning
+
+    Before this change, autoconf was emitting the following warnings:
+
+    ```
+    configure.ac:22: warning: AC_COMPILE_IFELSE was called before
+    AC_USE_SYSTEM_EXTENSIONS
+    ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is
+    expanded from...
+    configure.ac:22: the top level
+    configure.ac:22: warning: AC_RUN_IFELSE was called before
+    AC_USE_SYSTEM_EXTENSIONS
+    ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is
+    expanded from...
+    configure.ac:22: the top level
+    configure.ac:22: warning: AC_COMPILE_IFELSE was called before
+    AC_USE_SYSTEM_EXTENSIONS
+    ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is
+    expanded from...
+    configure.ac:22: the top level
+    configure.ac:22: warning: AC_RUN_IFELSE was called before
+    AC_USE_SYSTEM_EXTENSIONS
+    ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is
+    expanded from...
+    configure.ac:22: the top level
+    configure.ac:22: warning: AC_COMPILE_IFELSE was called before
+    AC_USE_SYSTEM_EXTENSIONS
+    ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is
+    expanded from...
+    configure.ac:22: the top level
+    configure.ac:22: warning: AC_RUN_IFELSE was called before
+    AC_USE_SYSTEM_EXTENSIONS
+    ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is
+    expanded from...
+    configure.ac:22: the top level
+    configure.ac:22: warning: AC_COMPILE_IFELSE was called before
+    AC_USE_SYSTEM_EXTENSIONS
+    ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is
+    expanded from...
+    configure.ac:22: the top level
+    configure.ac:22: warning: AC_RUN_IFELSE was called before
+    AC_USE_SYSTEM_EXTENSIONS
+    ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is
+    expanded from...
+    configure.ac:22: the top level
+    ```
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7810bb1a59ea71afeed7ea489400801ebdf642e4
+Author: Sascha Brawer <sascha@brawer.ch>
+Date:   Thu Oct 4 09:24:08 2018 +0200
+
+    [morx] Only insert glyphs at mark when a mark has been set before
+
+    This reverts commit f4072e8cb81072cd6d51a2607efedb76c02e7db1.
+    https://github.com/harfbuzz/harfbuzz/issues/1195
+
+ src/hb-aat-layout-morx-table.hh | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 3ef358909eb7e26ca9630e61c7ba142d9e94389e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Oct 3 18:08:25 2018 -0700
+
+    fixed warnings
+
+ src/hb-cff-interp-common.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1aeaee9dfc7ee3ca410919c41e55452a0b6b9bf6
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Oct 3 17:44:45 2018 -0700
+
+    fixed cff2 subset test data
+
+ test/api/fonts/AdobeVFPrototype.abc.nohints.otf | Bin 0 -> 7800 bytes
+ test/api/test-subset-cff2.c                     |   4 ++--
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 8be5a9186be3ca4c50c73f372be4dbad08ac1863
+Merge: d7b384ad 5de2d9cd
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Oct 3 17:06:18 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit 5de2d9cdbdca870901c0ba9472f5b78c48ba0a58
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 4 02:14:18 2018 +0330
+
+    Minor, fix double-promotion warnings (#1221)
+
+ .circleci/config.yml        | 2 +-
+ src/dump-emoji.cc           | 2 +-
+ src/hb-common.cc            | 2 +-
+ src/hb-ot-var-fvar-table.hh | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit c2c7e6471ca912c91c82f6d71338082978f13dc6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 4 00:29:40 2018 +0330
+
+    State our graphite2 dependency no-deprecated compile flag (#1220)
+
+ .circleci/config.yml | 2 +-
+ .travis.yml          | 2 --
+ configure.ac         | 2 +-
+ 3 files changed, 2 insertions(+), 4 deletions(-)
+
+commit e4e74c2751ac24178086cce2811d34d8019b6f85
+Author: mhosken <mhosken@users.noreply.github.com>
+Date:   Thu Oct 4 02:33:26 2018 +0700
+
+    Update Graphite API to latest (#1215)
+
+ src/hb-graphite2.cc | 28 +++++++++++++++++++++++++++-
+ 1 file changed, 27 insertions(+), 1 deletion(-)
+
+commit 81f5eb09eca010337ffb3369000a3d5c1e8e2cda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 21:30:48 2018 +0200
+
+    Add emoji test for recent work
+
+ test/shaping/data/in-house/Makefile.sources             |   2 +-
+ .../fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf  | Bin 0 ->
+ 16596 bytes
+ test/shaping/data/in-house/tests/emoji-flag-tags.tests  |   2 --
+ test/shaping/data/in-house/tests/emoji.tests            |   4 ++++
+ 4 files changed, 5 insertions(+), 3 deletions(-)
+
+commit 9e2824cca0e42a53fafda7b2feb095986df40675
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Oct 3 22:49:02 2018 +0330
+
+    [ci] Delete azure-pipelines
+
+    End of experiment, we might get back to it later
+
+ azure-pipelines.yml | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+commit b710ea4fdeb1a620b396bd07665fc129fe5fc074
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 21:17:59 2018 +0200
+
+    Clean Fitzpatrick hack
+
+ src/hb-ot-layout.hh |  2 +-
+ src/hb-ot-shape.cc  |  9 +++++++--
+ src/hb-unicode.hh   | 20 --------------------
+ 3 files changed, 8 insertions(+), 23 deletions(-)
+
+commit 95e5f1ae69036108f318b93b11d85b2ebc19109b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 21:11:13 2018 +0200
+
+    Unbreak Fitzpatrick
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1159
+
+ src/hb-ot-layout.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 03fb6dd4c7d12a98cc0ef325432658c3c76ab208
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 21:02:16 2018 +0200
+
+    Rewrite grapheme-formation in terms of new work
+
+    Also, don't attach ZWNJ to previous cluster.  Closer to Unicode
+    graphemes.
+
+ src/hb-coretext.cc                                 |  2 +-
+ src/hb-ot-shape.cc                                 | 48
+ ++++++----------------
+ .../in-house/tests/indic-joiner-candrabindu.tests  |  2 +-
+ .../data/in-house/tests/indic-joiners.tests        |  6 +--
+ 4 files changed, 18 insertions(+), 40 deletions(-)
+
+commit 68106b1d9b96caf79b0a778a7da75caf54e7d44a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 20:50:12 2018 +0200
+
+    Minor
+
+ src/hb-ot-layout.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 3f1c741b7a85d9c2d66e7f2446e988470c538b49
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 20:45:19 2018 +0200
+
+    [test] Split a test
+
+ .../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf | Bin 0 ->
+ 51924 bytes
+ .../fonts/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf | Bin 74856 ->
+ 0 bytes
+ .../in-house/tests/mongolian-variation-selector.tests  |  17
+ ++++++++++++++++-
+ 3 files changed, 16 insertions(+), 1 deletion(-)
+
+commit ba813aab0909375af0c8f8e0c34595680c2762a4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Oct 3 21:52:15 2018 +0330
+
+    Update azure-pipelines.yml
+
+ azure-pipelines.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 06922acbc4558699e43a4ed98ffb21f1e84abfc6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 20:19:17 2018 +0200
+
+    Fix distcheck
+
+ src/Makefile.sources | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 4eea2e279b019ac627b2b9e2234a194957971022
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 20:16:03 2018 +0200
+
+    [thai] Set continuation on decomposed nikhahit
+
+ src/hb-ot-shape-complex-thai.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 8edc91022c3943fb306cee26ed6eb85381b5ea76
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 20:13:20 2018 +0200
+
+    [indic] Reset continuation on inserted dottedcircle
+
+ src/hb-ot-shape-complex-indic.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 2a6f15213ec30e5eb07465dd9dc81c2c386cb1e0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 20:09:14 2018 +0200
+
+    [buffer] Inline some more
+
+ src/hb-buffer.cc | 44 --------------------------------------------
+ src/hb-buffer.hh | 52
+ ++++++++++++++++++++++++++++++++++++++++++++--------
+ 2 files changed, 44 insertions(+), 52 deletions(-)
+
+commit 6f39c22029867c6d00cf70d7df242a28ca8f12bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 20:06:32 2018 +0200
+
+    Add code
+
+ src/hb-ot-layout.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 19d50aa2620f1464da8e00185b746e46fb0d80c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 20:05:28 2018 +0200
+
+    [indic] Simplify dottedcircle
+
+ src/hb-ot-shape-complex-indic.cc | 23 +++++++++++++++--------
+ 1 file changed, 15 insertions(+), 8 deletions(-)
+
+commit 3b7831851052ecf2611a115cc2b80ef970d83df8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 19:44:15 2018 +0200
+
+    [emoji] Mark emoji contination sequences as continuation
+
+    This adds a new grapheme bit.  Not used yet.
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1159
+
+ src/hb-ot-layout.hh | 83
+ +++++++++++++++++++++++++----------------------------
+ src/hb-ot-shape.cc  | 24 ++++++++++++++++
+ src/hb-unicode.hh   |  5 ----
+ 3 files changed, 63 insertions(+), 49 deletions(-)
+
+commit 123326e20a30a51e25339c2eca272e4e6c847742
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 19:19:51 2018 +0200
+
+    Dotted-circle all marks, not just non-spacing, at text beginning
+
+ src/hb-ot-shape.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 4146c00caa29e53ee9a29def151f12792ac76596
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Oct 3 21:26:58 2018 +0330
+
+    [test] Use an in-repo font for test-multithread (#1218)
+
+    As Khaled's suggestion, hard-coded font paths was only for my own
+    testing.
+
+ test/api/hb-subset-test.h   | 13 +++++++++----
+ test/api/test-multithread.c | 41
+ ++++++++++++++++++++++++++---------------
+ test/fuzzing/main.cc        |  6 ++++++
+ 3 files changed, 41 insertions(+), 19 deletions(-)
+
+commit fde9b8852d7cd6224afeffcfe363f4b445ab1ece
+Author: azure-pipelines[bot]
+<azure-pipelines[bot]@users.noreply.github.com>
+Date:   Wed Oct 3 17:47:05 2018 +0000
+
+    [ci] Add a test Azure Pipelines Linux bot
+
+    Related #1219
+
+ azure-pipelines.yml | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 674560cf244054a7e8c16073a59aa1b01e1ba5ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 19:10:28 2018 +0200
+
+    Fix build
+
+ src/test-unicode-ranges.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 45e55f70801e2ccd28e1ee30bdf5341b1ac6efe5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 18:07:49 2018 +0200
+
+    [indic] Fix clang everything
+
+ src/hb-ot-shape-complex-indic.cc | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+commit 4df02e3240ada0734748a47572baa2fc1c6afbd1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 17:54:09 2018 +0200
+
+    Minor
+
+ src/hb-ot-os2-unicode-ranges.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1e8f195b96765480007808da60789de9ac501c3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 17:46:48 2018 +0200
+
+    [emoji] Add emoji Extended_Pictographic table and function
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1159
+
+    .
+
+ src/Makefile.am                 |  12 +-
+ src/gen-emoji-table.py          |  64 ++++++++++
+ src/hb-ot-os2-table.hh          |   2 +-
+ src/hb-ot-os2-unicode-ranges.hh |   6 +-
+ src/hb-unicode-emoji-table.hh   | 269
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-unicode.cc               |  16 +++
+ src/hb-unicode.hh               |  37 +++++-
+ 7 files changed, 398 insertions(+), 8 deletions(-)
+
+commit 1dc601b04a816a5b5ed12ae1c01ddcfd60a8398f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 17:27:46 2018 +0200
+
+    [os2] Minor rename/shuffle
+
+ ...unicode-ranges.py => gen-os2-unicode-ranges.py} |  2 +-
+ src/hb-ot-os2-unicode-ranges.hh                    | 45
+ +++++++++++-----------
+ 2 files changed, 24 insertions(+), 23 deletions(-)
+
+commit 7a1ab0464d3ee1ca5c9b31215fbffb8601ae860d
+Author: lantw44 <lantw44@gmail.com>
+Date:   Wed Oct 3 23:22:43 2018 +0800
+
+    Fix test-multithread build on FreeBSD (#1217)
+
+    Add the default font path used by FreeBSD ports.
+
+ test/api/test-multithread.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit df32eaae42b505b00de4a8b5efce9ab948bed847
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 14:44:25 2018 +0200
+
+    [indic] Disallow vowel mark combinations that spoof other vowel marks
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1019
+
+    New numbers:
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707261 out of 707394 tests passed. 133 failed (0.0188014%)
+    GUJARATI: 366353 out of 366457 tests passed. 104 failed (0.0283799%)
+    GURMUKHI: 60729 out of 60747 tests passed. 18 failed (0.0296311%)
+    KANNADA: 951300 out of 951913 tests passed. 613 failed (0.0643966%)
+    MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed
+    (0.0188871%)
+    ORIYA: 42327 out of 42329 tests passed. 2 failed (0.00472489%)
+    SINHALA: 271596 out of 271847 tests passed. 251 failed (0.0923313%)
+    TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+    Devanagari regressed because Uniscribe doesn't enforce the full set.
+
+    Tests added with the *-vowel-letters.txt files in tree and Noto fonts.
+
+ src/hb-ot-shape-complex-indic.cc                   | 256
+ ++++++++++++++++++++-
+ test/shaping/data/in-house/Makefile.sources        |   1 +
+ .../03e3f463c3a985bc42096620cc415342818454fb.ttf   | Bin 0 -> 2904 bytes
+ .../1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf   | Bin 0 -> 8188 bytes
+ .../2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf   | Bin 0 -> 2460 bytes
+ .../604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf   | Bin 0 -> 4120 bytes
+ .../738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf   | Bin 0 -> 2336 bytes
+ .../7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf   | Bin 0 -> 3452 bytes
+ .../881642af1667ae30a54e58de8be904566d00508f.ttf   | Bin 0 -> 2760 bytes
+ .../af85624080af5627fb050f570d148a62f04fda74.ttf   | Bin 0 -> 2656 bytes
+ .../tests/indic-vowel-letter-spoofing.tests        |  53 +++++
+ 11 files changed, 309 insertions(+), 1 deletion(-)
+
+commit 1b8d5e999192035c08f918aa1fcfcebdea67d82e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 14:44:19 2018 +0200
+
+    [thai] Minor
+
+ src/hb-ot-shape-complex-thai.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit d3d0cbd27831a6ea41b89f50d380296565c0016d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 13:54:21 2018 +0200
+
+    Typo
+
+ .../{bengali-vowel-leters.txt => bengali-vowel-letters.txt}
+ | 0
+ .../{gujarati-vowel-letter.txt => gujarati-vowel-letters.txt}
+ | 0
+ 2 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 0dd9101fd0ddff80fff10ba98e93523aed95c8f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 13:26:26 2018 +0200
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 9c4ffd10c4040ada9b1ffeb13c35f1330336359e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 12:53:54 2018 +0200
+
+    Minor
+
+ src/hb-ot-shape-complex.hh | 11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+commit bd1be8738fc4c73635cab7d77965264748d747cc
+Author: HinTak <htl10@users.sourceforge.net>
+Date:   Wed Oct 3 07:11:22 2018 +0800
+
+    Missing colon for gobject annotation
+
+    There should be a colon separating "(transfer full)" and the
+    rest. Warned by g-ir-scanner.
+
+ src/hb-face.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 75114e01d29b90f72a9398ed5dbc4298aba5a6b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 3 12:29:56 2018 +0200
+
+    [use] Add Halant_Or_Vowel_Modifier category
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1102
+
+ src/gen-use-table.py                               |   7 +-
+ src/hb-ot-shape-complex-use-machine.hh             | 518
+ +++++++++++----------
+ src/hb-ot-shape-complex-use-machine.rl             |   9 +-
+ src/hb-ot-shape-complex-use-table.cc               |   4 +-
+ src/hb-ot-shape-complex-use.hh                     |   5 +-
+ .../28f497629c04ceb15546c9a70e0730125ed6698d.ttf   | Bin 0 -> 1496 bytes
+ .../shaping/data/in-house/tests/use-syllable.tests |   3 +
+ 7 files changed, 301 insertions(+), 245 deletions(-)
+
+commit d7b384ad0d0a3e1d35ef92a6e98a97bb9c367f48
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Oct 2 21:08:36 2018 -0700
+
+    silence warning ^3
+
+ src/hb-subset-cff1.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e9cc71ac86bd771d9fcb2ee1eb620060db92ac1a
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Oct 2 20:44:30 2018 -0700
+
+    silence warning ^2
+
+ src/hb-subset-cff1.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2700db9ade23cbf69d17a7a1802a7f144c25f8dc
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Oct 2 15:05:26 2018 -0700
+
+    rm build files
+
+ build/test/api/.libs/test-collect-unicodes | Bin 14336 -> 0 bytes
+ build/test/api/.libs/test-multithread      | Bin 10936 -> 0 bytes
+ build/test/api/test-collect-unicodes       | 210
+ -----------------------------
+ build/test/api/test-multithread            | 210
+ -----------------------------
+ 4 files changed, 420 deletions(-)
+
+commit 51d5bf4ca2ebb9b8aa3b2777781e328fb93ceea7
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Oct 2 14:38:06 2018 -0700
+
+    silence warnings
+
+ src/hb-cff-interp-cs-common.hh | 2 +-
+ src/hb-subset-cff1.cc          | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 35b64dfb57cac0d949363e9b19352dd4274c2584
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Oct 2 14:13:36 2018 -0700
+
+    silence & fix new warnings
+
+ src/hb-cff-interp-dict-common.hh | 3 ++-
+ src/hb-cff1-interp-cs.hh         | 9 +++++----
+ src/hb-ot-cff-common.hh          | 4 ++--
+ src/hb-subset-cff1.cc            | 4 ++--
+ src/hb-subset-cff2.cc            | 4 ++--
+ 5 files changed, 13 insertions(+), 11 deletions(-)
+
+commit eed7e6bbc8e7be99d59a7822a1c37bc715c379b3
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Oct 2 13:45:14 2018 -0700
+
+    redefine OpCodes as define instead of enum
+
+    in order to eradicate duplicate enum warnings
+
+ src/hb-cff-interp-common.hh | 348
+ ++++++++++++++++++++++----------------------
+ 1 file changed, 174 insertions(+), 174 deletions(-)
+
+commit 9cdd70b344b9dc34a29aeca79028cbb5d949ca1d
+Merge: 3dd43f02 6353cc1f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Oct 2 13:43:21 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit 6353cc1f83c862910860976411a1157f7ed571bc
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 2 21:39:19 2018 +0330
+
+    [circleci] Fix some of warnings from clang-everything bot (#1211)
+
+    * -Wshift-sign-overflow
+    * -Wmissing-prototypes
+
+ .circleci/config.yml             |  4 ++--
+ src/dump-emoji.cc                | 19 ++++++++++---------
+ src/hb-ucdn.cc                   |  3 +++
+ src/test-unicode-ranges.cc       |  4 ++--
+ test/fuzzing/hb-subset-fuzzer.cc | 32 +++++++++++++++++---------------
+ util/ansi-print.cc               |  4 ++--
+ 6 files changed, 36 insertions(+), 30 deletions(-)
+
+commit 9f1dee32fbad3b1486725c18570199156b57a94d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 18:56:20 2018 +0200
+
+    [tests] Allow test-runner to ignore shaping output
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1212
+
+ test/shaping/data/in-house/tests/fuzzed.tests | 46
+ +++++++++++++--------------
+ test/shaping/run-tests.py                     |  2 +-
+ 2 files changed, 24 insertions(+), 24 deletions(-)
+
+commit fef7af1e22efb399517137b35d0ba9f307411ca3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 18:46:13 2018 +0200
+
+    [tibetan] Remove unused Tibetan shaper
+
+ src/Makefile.sources               |  1 -
+ src/hb-ot-shape-complex-tibetan.cc | 63
+ --------------------------------------
+ src/hb-ot-shape-complex.hh         |  1 -
+ 3 files changed, 65 deletions(-)
+
+commit 32a438166fbccac6e0d9a615a492fc8cabfd21ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 18:43:29 2018 +0200
+
+    [tibetan] Route Tibetan through USE
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/933
+    https://github.com/harfbuzz/harfbuzz/issues/1012
+
+    Tibetan failures go from 0 to 2:
+
+    TIBETAN: 208467 out of 208469 tests passed. 2 failed (0.000959375%)
+
+ src/gen-use-table.py                 | 30 ++++++++++------
+ src/hb-ot-shape-complex-use-table.cc | 70
+ ++++++++++++++++++++++--------------
+ src/hb-ot-shape-complex.hh           |  8 +----
+ 3 files changed, 65 insertions(+), 43 deletions(-)
+
+commit 77792187be1405599e6aecfc3ed1fc771d505ddb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 18:20:16 2018 +0200
+
+    [khmer] Remove unused khmer_position()
+
+ src/dump-khmer-data.cc           | 8 +++-----
+ src/hb-ot-shape-complex-khmer.hh | 1 -
+ 2 files changed, 3 insertions(+), 6 deletions(-)
+
+commit 5101abd42f4027edf182eddfa58c629b11c2a7f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 17:49:06 2018 +0200
+
+    [indic/use] Factor common expressions in ragel machine
+
+    No machine change.
+
+ src/hb-ot-shape-complex-indic-machine.hh | 46
+ ++++++++++++++++----------------
+ src/hb-ot-shape-complex-indic-machine.rl | 10 ++++---
+ src/hb-ot-shape-complex-use-machine.hh   | 38 +++++++++++++-------------
+ src/hb-ot-shape-complex-use-machine.rl   | 20 +++++++-------
+ 4 files changed, 58 insertions(+), 56 deletions(-)
+
+commit 6f457f8370de5d96452ee3a2d1b0a97b025ef1d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 17:46:27 2018 +0200
+
+    [indic] Minor flip grammar around
+
+    No behavior change.
+
+ src/hb-ot-shape-complex-indic-machine.rl | 2 +-
+ src/hb-ot-shape-complex-use-machine.rl   | 1 -
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit d992982d23ef0c39ea42595ed0e8a4752977d1a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 17:16:01 2018 +0200
+
+    [indic] Add some confusable sequences from Unicode Standard
+
+ .../script-bengali/bengali-vowel-leters.txt        |  3 ++
+ .../devanagari-atomic-consonants.txt               | 33
+ ++++++++++++++++++++++
+ .../script-devanagari/devanagari-vowel-letters.txt | 17 +++++++++++
+ .../script-gujarati/gujarati-vowel-letter.txt      |  8 ++++++
+ .../script-gurmukhi/gurmukhi-vowel-letters.txt     |  9 ++++++
+ .../script-kannada/kannada-vowel-letters.txt       |  3 ++
+ .../script-malayalam/malayalam-vowel-letters.txt   |  5 ++++
+ .../script-oriya/oriya-vowel-letters.txt           |  3 ++
+ .../script-telugu/telugu-vowel-letters.txt         |  5 ++++
+ 9 files changed, 86 insertions(+)
+
+commit 40d5d19d5b875eef526a2a66892c3f638f633fa3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 17:04:05 2018 +0200
+
+    [ragel] Use ts/te (token-start / token-end) instead of manual tracking
+
+ src/hb-ot-shape-complex-indic-machine.hh   | 22 ++++++++++------------
+ src/hb-ot-shape-complex-indic-machine.rl   |  8 +++-----
+ src/hb-ot-shape-complex-khmer-machine.hh   | 22 ++++++++++------------
+ src/hb-ot-shape-complex-khmer-machine.rl   |  8 +++-----
+ src/hb-ot-shape-complex-myanmar-machine.hh | 22 ++++++++++------------
+ src/hb-ot-shape-complex-myanmar-machine.rl |  8 +++-----
+ src/hb-ot-shape-complex-use-machine.hh     | 22 ++++++++++------------
+ src/hb-ot-shape-complex-use-machine.rl     |  8 +++-----
+ 8 files changed, 52 insertions(+), 68 deletions(-)
+
+commit 9efddb9de821fc909a3ea8354f3dfd39c823e97b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 16:05:26 2018 +0200
+
+    Treat a base+mark... ligature as base, not ligature
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/746
+
+ src/hb-ot-layout-gsubgpos.hh | 22 +++++++++++++++-------
+ 1 file changed, 15 insertions(+), 7 deletions(-)
+
+commit 3cca978723db43233d25402254d297dfccf991a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 15:02:16 2018 +0200
+
+    Move code around
+
+ src/hb-ot-layout-gsub-table.hh |  3 ---
+ src/hb-ot-layout-gsubgpos.hh   | 22 +++++++++++-----------
+ 2 files changed, 11 insertions(+), 14 deletions(-)
+
+commit 0a371fee4d22ed63207aa76c00b05b75bbc95f5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 14:48:39 2018 +0200
+
+    Minor
+
+ src/hb-ot-map.hh                   | 6 ++++--
+ src/hb-ot-shape-complex-arabic.cc  | 6 +++---
+ src/hb-ot-shape-complex-myanmar.cc | 4 ++--
+ src/hb-ot-shape-complex-use.cc     | 8 ++++----
+ src/hb-ot-shape.cc                 | 4 ++--
+ 5 files changed, 15 insertions(+), 13 deletions(-)
+
+commit 94d15528f80dbb7110d816fb5845f257f605a0be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 14:45:09 2018 +0200
+
+    Minor
+
+ src/hb-ot-map.hh   |  1 +
+ src/hb-ot-shape.cc | 39 ++++++++++++++++++---------------------
+ 2 files changed, 19 insertions(+), 21 deletions(-)
+
+commit 729f634728fb553300021d52089495271dfb19fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 14:40:14 2018 +0200
+
+    Disable joiner-skipping when looking back for base to attach mark to
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1189
+
+ src/hb-ot-shape.cc                                      |   5 ++++-
+ test/shaping/data/in-house/Makefile.sources             |   1 +
+ .../fonts/641ca9d7808b01cafa9a666c13811c9b56eb9c52.ttf  | Bin 0 ->
+ 11492 bytes
+ .../data/in-house/tests/arabic-mark-attach.tests        |   1 +
+ 4 files changed, 6 insertions(+), 1 deletion(-)
+
+commit c36f3f5bef52e660541933f003fafa6e3a14785d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 14:34:29 2018 +0200
+
+    [arabic] Use manual-zwj instead of flipping joiners
+
+ src/hb-buffer.hh                  |  3 +--
+ src/hb-ot-layout.hh               | 12 ++----------
+ src/hb-ot-shape-complex-arabic.cc | 41
+ ++++++---------------------------------
+ 3 files changed, 9 insertions(+), 47 deletions(-)
+
+commit 48c513fec978819927535bc86b43be74315f746c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 14:17:42 2018 +0200
+
+    Minor
+
+ src/hb-ot-shape-complex-arabic.cc  |  2 +-
+ src/hb-ot-shape-complex-default.cc |  2 +-
+ src/hb-ot-shape-complex-hangul.cc  |  2 +-
+ src/hb-ot-shape-complex-hebrew.cc  | 14 +-------------
+ src/hb-ot-shape-complex-indic.cc   |  2 +-
+ src/hb-ot-shape-complex-indic.hh   |  2 --
+ src/hb-ot-shape-complex-khmer.cc   |  2 +-
+ src/hb-ot-shape-complex-myanmar.cc |  4 ++--
+ src/hb-ot-shape-complex-thai.cc    |  2 +-
+ src/hb-ot-shape-complex-tibetan.cc |  2 +-
+ src/hb-ot-shape-complex-use.cc     |  2 +-
+ src/hb-ot-shape-complex.hh         | 11 ++++-------
+ src/hb-ot-shape.cc                 |  8 ++++----
+ 13 files changed, 19 insertions(+), 36 deletions(-)
+
+commit cca757ae56d6a82cfad35edc6dbae58049a34f91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 13:27:11 2018 +0200
+
+    Minor
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 96eca87f89588126d3fa5c7f3884ae2f302a91e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 13:24:40 2018 +0200
+
+    Move things
+
+ src/hb-ot-shape.cc | 22 ++++++++++------------
+ src/hb-ot-shape.hh |  3 +++
+ 2 files changed, 13 insertions(+), 12 deletions(-)
+
+commit 588a4ac8bc9fd20464c7a77ead27ae34478c9bc8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 13:13:47 2018 +0200
+
+    Rename
+
+ src/hb-ot-face.cc | 20 +++++++-------
+ src/hb-ot-face.hh | 78
+ +++++++++++++++++++++++++++----------------------------
+ 2 files changed, 49 insertions(+), 49 deletions(-)
+
+commit 10b6c7c63870fa04cd8adcf9f38644c2a799db8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 13:11:18 2018 +0200
+
+    Minor include cleanup
+
+ src/hb-ot-shape-complex.hh | 1 +
+ src/hb-ot-shape.cc         | 4 +---
+ src/hb-ot-shape.hh         | 2 +-
+ 3 files changed, 3 insertions(+), 4 deletions(-)
+
+commit 1d1734e985e1f2a746b4fff0cd82d96d477577d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 13:04:05 2018 +0200
+
+    Shuffle code around
+
+ src/hb-ot-shape-complex-hebrew.cc |  2 +-
+ src/hb-ot-shape-fallback.cc       |  2 +-
+ src/hb-ot-shape-normalize.cc      |  2 +-
+ src/hb-ot-shape.cc                | 32 ++++++++++++++++++++++++++++----
+ src/hb-ot-shape.hh                | 29 ++++++-----------------------
+ 5 files changed, 37 insertions(+), 30 deletions(-)
+
+commit bf5088b3dcd94106937290c180f3f40bc8524b48
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 2 11:07:06 2018 +0330
+
+    Minor, fix -Weverthing bot warnings (#1210)
+
+ test/api/test-buffer.c      | 8 ++++----
+ test/api/test-multithread.c | 3 +--
+ 2 files changed, 5 insertions(+), 6 deletions(-)
+
+commit d27e5ec3a236b8eb37ef9ce558ad54077e46b003
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Oct 2 08:25:29 2018 +0200
+
+    Skip BOM in the Python sample file
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1208
+
+ src/sample.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit f9ea3dc4c6e85c417dd4c8546e5ebe02b67131b9
+Author: HinTak <htl10@users.sourceforge.net>
+Date:   Tue Oct 2 06:43:06 2018 +0100
+
+    Missing "out" indicator (#1209)
+
+    Missing "out" indicator. Affect gobject introspection.
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9742679b8253919f8bfec8a77532092044e951aa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 2 03:20:48 2018 +0330
+
+    [circleci] Remove some of the not needed flags
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f72b748371da2d7ce327a5d15feea46960aa7dd3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 2 00:16:08 2018 +0330
+
+    [circleci] Fix "msan" and "everything" bots (#1205)
+
+ .circleci/config.yml                    | 13 ++++++-------
+ src/check-symbols.sh                    |  2 --
+ test/fuzzing/main.cc                    | 22 +++++++++-------------
+ test/fuzzing/run-shape-fuzzer-tests.py  |  2 --
+ test/fuzzing/run-subset-fuzzer-tests.py |  2 --
+ 5 files changed, 15 insertions(+), 26 deletions(-)
+
+commit 8bf4027d23318c7e1ff7fe9f5e7ad8b0380e5415
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 1 20:05:00 2018 +0200
+
+    [indic] Remove Consonant_Medial from grammar and code
+
+    The only Indic CM is U+0A75 GURMUKHI SIGN YAKASH, which Uniscribe
+    doesn't treat
+    specially, and font designers design for that.  So, do the same.
+
+ src/hb-ot-shape-complex-indic-machine.hh | 1244
+ ++++++++++++++----------------
+ src/hb-ot-shape-complex-indic-machine.rl |   10 +-
+ src/hb-ot-shape-complex-indic.cc         |    2 +-
+ src/hb-ot-shape-complex-indic.hh         |    6 +-
+ 4 files changed, 589 insertions(+), 673 deletions(-)
+
+commit ab4c37f73a7d4fcf48584cda3fff94e98a672086
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 1 19:35:48 2018 +0200
+
+    [khmer] Add mark-ordering tests
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/667
+
+ test/shaping/data/in-house/Makefile.sources        |   2 ++
+ .../b6031119874ae9ff1dd65383a335e361c0962220.ttf   | Bin 0 -> 2564 bytes
+ .../data/in-house/tests/khmer-mark-order.tests     |  25
+ +++++++++++++++++++++
+ 3 files changed, 27 insertions(+)
+
+commit 51436547162a18e88144e7125ad6ce4a69a08d4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 1 19:09:58 2018 +0200
+
+    [khmer] Rewrite grammar completely
+
+    Based on experimenting with Uniscribe to extract grammar and
+    categories.
+
+    Failures down from 44 to 35:
+
+    KHMER: 299089 out of 299124 tests passed. 35 failed (0.0117008%)
+
+    We still don't enforce the one-matra rule pre-decomposition,
+    but enforce
+    an order and one-matra-per-position post-decomposition.
+
+    https://github.com/harfbuzz/harfbuzz/issues/667
+
+ src/hb-ot-shape-complex-indic.hh         |   2 +-
+ src/hb-ot-shape-complex-khmer-machine.hh | 300
+ ++++++++++++++++++++-----------
+ src/hb-ot-shape-complex-khmer-machine.rl |  42 +++--
+ src/hb-ot-shape-complex-khmer.cc         |   4 +-
+ src/hb-ot-shape-complex-khmer.hh         |  99 +++++-----
+ 5 files changed, 270 insertions(+), 177 deletions(-)
+
+commit 3dd43f0234febd434d89927adf2ee19f0489c5a7
+Merge: ab16b24c eb1e6028
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Oct 1 10:22:06 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit aaaa65baa7fcfb65ae814528bdd93cc5c4ea540d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 1 16:59:48 2018 +0200
+
+    [khmer] Remove unused code
+
+ src/hb-ot-shape-complex-khmer.hh | 12 ------------
+ 1 file changed, 12 deletions(-)
+
+commit eb1e60287732ede6040ce6f7498c10909448d248
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 1 15:31:50 2018 +0200
+
+    [test] Try import unicodedata2 as unicodedata
+
+ test/shaping/hb_test_tools.py | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 81afdbe803ca949d915d03cab4a6ed6c6e6ff304
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 1 15:01:04 2018 +0200
+
+    [use] Disable automatic ZWJ for 'akhn' feature
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/746
+
+ src/hb-ot-shape-complex-use.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ceef311dcaea7e1ecfedb4f1257a705572611f0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 1 12:45:06 2018 +0200
+
+    [use] Change categories for Left_And_* matras
+
+    These are only relevant to Sinhala, because they decompose in other
+    cases.  The USE spec categorizes them all as VPst.  No idea why we
+    weren't following that before.
+
+ src/gen-use-table.py                 |  4 ++--
+ src/hb-ot-shape-complex-use-table.cc | 24 ++++++++++++------------
+ 2 files changed, 14 insertions(+), 14 deletions(-)
+
+commit 3426a361571a1996b5a895fb9374ce3a4a7f9af3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 1 12:55:57 2018 +0200
+
+    Unbreak bots
+
+ src/hb-cache.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 98ac01d3b3deb7c7f5411f6f25c6e7588d84b5f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 1 12:10:00 2018 +0200
+
+    [morx] Break out if buffer gets into error
+
+    Was getting stuck not making progress somehow.
+
+ src/hb-aat-layout-common.hh     | 2 ++
+ src/hb-aat-layout-morx-table.hh | 4 ++++
+ 2 files changed, 6 insertions(+)
+
+commit df827a6ab88cd8bde346176fc53a5c2d57eee808
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 1 11:34:20 2018 +0200
+
+    [cache] Fix cache coherency corner-case
+
+    If key_bits+value_bits-cache_bits==32 then -1 is ambiguous...
+
+ src/hb-cache.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 0fa1edbd3bbf825be078677dc46c3440f9802551
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 1 09:40:29 2018 +0330
+
+    [circleci] Couple of fixes (#1200)
+
+    * Raise error on warnings on -everything
+    * Enable fontconfig to two bots
+    * Fix msan bot now that all of its real complain are gone
+
+ .circleci/config.yml                    | 14 ++++++--------
+ src/check-symbols.sh                    |  2 ++
+ src/hb-ucdn.cc                          |  2 ++
+ test/fuzzing/run-shape-fuzzer-tests.py  |  2 ++
+ test/fuzzing/run-subset-fuzzer-tests.py |  2 ++
+ util/helper-cairo.cc                    |  2 ++
+ 6 files changed, 16 insertions(+), 8 deletions(-)
+
+commit 3babb0813c69d2b419f06773f366a44a9ad32cdb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 20:02:30 2018 +0200
+
+    [msan] Disable icu explicitly
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dc9b47ae87096d34d146e50e44e742a76861976f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 18:35:12 2018 +0200
+
+    [msan] Remove uninstrumented libraries
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ad1c190ecfbac66ffeef69db769073a33331eed3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 18:26:45 2018 +0200
+
+    Correct fix for glib-mkenum warning
+
+ src/hb-buffer.h | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 1dd1e56bf42af5b11afc3e34f78869e93d39867e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 18:25:58 2018 +0200
+
+    Revert "Fix glib-mkenum warning"
+
+    This reverts commit 247756a7d89008ee6a7d1171dc07ba22454c6034.
+
+    Was wrong.  Right fix coming.
+
+ src/hb-buffer.h | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 3f08750fa6772e7e342b96192b84cb9963f7335b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 18:23:34 2018 +0200
+
+    Move _POSIX_SOURCE to hb.hh
+
+ src/hb-blob.cc | 5 -----
+ src/hb.hh      | 4 ++++
+ 2 files changed, 4 insertions(+), 5 deletions(-)
+
+commit 90dd255e570bf8ea3436e2f29242068845256e55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 18:19:54 2018 +0200
+
+    Change _HB_SCRIPT_MAX_VALUE from 0xFFFFFFFF to 0x7FFFFFFF
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/504
+
+ src/hb-common.h | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit dcfcb950b81a2865ef01f5a69087264b79ed1bfd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 18:14:50 2018 +0200
+
+    [test] Fix -Wunused-parameter warnings
+
+ test/api/hb-test.h          |  1 +
+ test/api/test-blob.c        |  2 +-
+ test/api/test-c.c           |  2 +-
+ test/api/test-font.c        | 16 ++++++++--------
+ test/api/test-multithread.c |  2 +-
+ test/api/test-ot-color.c    |  2 +-
+ test/api/test-shape.c       | 14 +++++++-------
+ test/api/test-unicode.c     | 10 +++++-----
+ 8 files changed, 25 insertions(+), 24 deletions(-)
+
+commit be0b2ed3162f465dbf44a0f018d4e2af5dcdf87c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 18:01:20 2018 +0200
+
+    More warning fixes
+
+ test/api/test-multithread.c | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 5c65ed800de4caef5ee9ad2111225fa5d8235737
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 17:48:55 2018 +0200
+
+    Fix bug introduced in 9b0b40b3c1ac8155c80ed5dc976228f4d3ec7e1f
+
+    Also discovered by msan bot.
+
+ src/hb-ot-shape-fallback.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 247756a7d89008ee6a7d1171dc07ba22454c6034
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 13:10:54 2018 +0200
+
+    Fix glib-mkenum warning
+
+      GEN      hb-gobject-enums.h
+    WARNING: Failed to parse "/*< private >*/" in ../../src/hb-buffer.h
+
+ src/hb-buffer.h | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 0a89f9572fe2d0d9fbf0297e0a69307f0ba1a17c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Sep 30 17:44:15 2018 +0330
+
+    [circleci] Pass ‌freetype compile flags to right place
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ad701f05cc86c22e8e53b7f5458887457e3a5e5f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Sep 30 17:30:42 2018 +0330
+
+    [circleci] Use an instrumented freetype on msan bot
+
+ .circleci/config.yml | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 57aabbc29ec6dfa7f1b57da7b6c62fdc547f8ef8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Sep 30 16:31:28 2018 +0330
+
+    [circleci] Another on fixing msan
+
+ .circleci/config.yml | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 24f148df3ecc899c9cf6d5359d3d35ee5e84a98c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Sep 30 14:46:56 2018 +0330
+
+    [circleci] minor
+
+ .circleci/config.yml | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 0a9aab672287149540e8d90b5063ad4c562c423c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Sep 30 14:45:43 2018 +0330
+
+    [circleci] Try to fix msan bot
+
+ .circleci/config.yml | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit b5285b34798cb7ee672343d00cbe066ea8a2ef83
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 12:23:01 2018 +0200
+
+    [util] Remove unneeded virtual
+
+    clang warning:
+
+    ../../util/options.hh:72:13: warning: destination for this 'memset'
+    call is a pointer to dynamic class
+          'option_parser_t'; vtable pointer will be overwritten
+          [-Wdynamic-class-memaccess]
+        memset (this, 0, sizeof (*this));
+        ~~~~~~  ^
+    ../../util/options.hh:72:13: note: explicitly cast the pointer to
+    silence this warning
+        memset (this, 0, sizeof (*this));
+                ^
+                (void*)
+
+ util/options.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 89ed040b21b366c927199bedd0e4cb060389d076
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 06:06:26 2018 -0400
+
+    [util] Fix more non-virtual-destructor warnings
+
+ util/options.hh | 28 ++++++++++++++++++----------
+ 1 file changed, 18 insertions(+), 10 deletions(-)
+
+commit 2382dd07fa6ff49638b146a523e9d2e93cf69ceb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 05:54:47 2018 -0400
+
+    Minor
+
+ util/options.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 9caa432d0c5c09c8151cfce1e2cc184fbdd89594
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 05:49:08 2018 -0400
+
+    [util] Use HB_FALLTHROUGH
+
+    Sure, gcc knows to warn about this as well:
+
+    ../../util/options.cc:175:17: warning: this statement may fall through
+    [-Wimplicit-fallthrough=]
+         case 1: m.r = m.t;
+                 ~~~~^~~~~
+    ../../util/options.cc:176:5: note: here
+         case 2: m.b = m.t;
+         ^~~~
+
+    But HOLY SMOKES, look at clang -Weverything bot message:
+
+    options.cc:176:5: warning: unannotated fall-through between switch
+    labels [-Wimplicit-fallthrough]
+        case 2: m.b = m.t;
+        ^
+    options.cc:176:5: note: insert 'HB_FALLTHROUGH;' to silence this
+    warning
+        case 2: m.b = m.t;
+        ^
+        HB_FALLTHROUGH;
+
+    Right, it's telling me to insert "HB_FALLTHROUGH;" there!!!!!!!!!
+
+ util/options.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 2e728a7d86c714d845524a0722c2b653feb9d915
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 05:47:36 2018 -0400
+
+    [util] Mark var static
+
+    From clang -Weverything bot:
+
+    options.cc:39:3: warning: no previous extern declaration
+    for non-static variable 'supported_font_funcs'
+    [-Wmissing-variable-declarations]
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e910a1aef4b2413c627240fc06d2a5696b24747a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 05:46:20 2018 -0400
+
+    [util] Add empty virtual destructor to option_group_t
+
+    From clang -Weverything bot:
+
+    ./options.hh:57:8: warning: 'option_group_t' has virtual functions
+    but non-virtual destructor [-Wnon-virtual-dtor]
+    struct option_group_t
+           ^
+
+ util/options.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit b1e07e1e6cc7a8e5445c7aeb9491ae629029011b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 05:43:22 2018 -0400
+
+    [indic/khmer] Remove use of global constructors
+
+    Alternative woul have been to resurrect F_COMBINE that I removed in
+    70136a78cb9eda244767f8e8a3d30d0f3c569d01
+
+    But this does it for now.  I'm not sure why check-static-inits.sh
+    didn't
+    catch this before.  Clang -Weverything bot did:
+
+      CXX      libharfbuzz_la-hb-ot-shape-complex-indic.lo
+    hb-ot-shape-complex-indic.cc:99:1: warning: declaration requires a
+    global constructor [-Wglobal-constructors]
+    indic_features[] =
+    ^
+    1 warning generated.
+      CXX      libharfbuzz_la-hb-ot-shape-complex-khmer.lo
+    hb-ot-shape-complex-khmer.cc:36:1: warning: declaration requires a
+    global constructor [-Wglobal-constructors]
+    khmer_features[] =
+    ^
+    1 warning generated.
+
+ src/hb-ot-map.hh                 |  2 ++
+ src/hb-ot-shape-complex-indic.cc | 34 +++++++++++++++++-----------------
+ src/hb-ot-shape-complex-khmer.cc | 18 +++++++++---------
+ 3 files changed, 28 insertions(+), 26 deletions(-)
+
+commit 00cd00e64130694ff7b49456d4bc421a153b4e6d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 05:34:30 2018 -0400
+
+    Tweak HB_TAG and HB_UNTAG
+
+    uint32_t was getting promoted to signed int, which is not what
+    we wanted...
+
+    Wow, clang has become good at generating warnings...
+
+    ../../src/hb-common.h:349:29: warning: signed shift result
+    (0xFF000000) sets the sign bit of the shift expression's type ('int')
+    and becomes negative [-Wshift-sign-overflow]
+      _HB_SCRIPT_MAX_VALUE                          = HB_TAG_MAX, /*<
+      skip >*/
+                                                      ^~~~~~~~~~
+    ../../src/hb-common.h:93:20: note: expanded from macro 'HB_TAG_MAX'
+     define HB_TAG_MAX HB_TAG(0xff,0xff,0xff,0xff)
+                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~
+    ../../src/hb-common.h:89:57: note: expanded from macro 'HB_TAG'
+     define HB_TAG(c1,c2,c3,c4)
+     ((hb_tag_t)((((uint8_t)(c1))<<24)|(((uint8_t)(c2))<<16)|(((uint8_t)(c3))<<8)|((uint8_t)(c4))))
+                                             ~~~~~~~~~~~~~~~^ ~~
+    ../../src/hb-common.h:349:3: warning: ISO C restricts enumerator
+    values to range of 'int' (4294967295 is too large) [-Wpedantic]
+      _HB_SCRIPT_MAX_VALUE                          = HB_TAG_MAX, /*<
+      skip >*/
+      ^                                               ~~~~~~~~~~
+
+ src/hb-common.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8a31e406291f4cb27480fc85049f08abd739cb59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 05:27:39 2018 -0400
+
+    [font] Make *_advance() fallback to *_advances
+
+    And remove redundant implementations.
+
+ src/hb-font.cc    | 12 ++++++++++++
+ src/hb-ft.cc      | 19 -------------------
+ src/hb-ot-font.cc | 22 ----------------------
+ 3 files changed, 12 insertions(+), 41 deletions(-)
+
+commit bd07d2878ff28baecf7b4b587a18ffbb744b7eb1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 03:54:40 2018 -0400
+
+    Use buffer scratch_flags to remember if we had any joiners
+
+ src/hb-buffer.hh                  |  3 ++-
+ src/hb-ot-layout.hh               | 12 ++++++++++--
+ src/hb-ot-shape-complex-arabic.cc |  3 +++
+ 3 files changed, 15 insertions(+), 3 deletions(-)
+
+commit ba0f0f156fe05bda760efcb0c8d34f303fa26ab0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 30 03:49:52 2018 -0400
+
+    Document setlocale() threadsafety issue
+
+    "Fixes" //github.com/harfbuzz/harfbuzz/issues/1191
+
+ src/hb-buffer.cc | 2 ++
+ src/hb-common.cc | 7 +++++++
+ 2 files changed, 9 insertions(+)
+
+commit 06be2aa93fa6ea8cc32684a4b51bfe927c5202bb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Sep 30 00:15:25 2018 +0330
+
+    [ci] Build glib and freetype and enable msan bot (#1198)
+
+ .circleci/config.yml | 41 +++++++++++++++++++++--------------------
+ 1 file changed, 21 insertions(+), 20 deletions(-)
+
+commit cefdef0247026f941eba8930c73b66b0498bb63c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 29 10:19:54 2018 +0330
+
+    Minor on test-multithread, align the actual and expected results
+
+ test/api/test-multithread.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 678beff64ca3b2963de25d8a76a2bf3710c3d7a6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 29 10:16:14 2018 +0330
+
+    [circleci] Add -Wno-reserved-id-macro to clang-everything
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c763b9440189b541316054ba4f623e728b5aae77
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 28 20:53:07 2018 -0400
+
+    [test-multithread] Disable FreeType funcs
+
+ test/api/test-multithread.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 9b0b40b3c1ac8155c80ed5dc976228f4d3ec7e1f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 28 11:16:18 2018 -0400
+
+    Fix fallback kerning to check for current glyph's mask
+
+ src/hb-ot-shape-fallback.cc | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 909a07b587884e9cd1d92ba9f3d5b96d8774c67a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 29 03:10:13 2018 +0330
+
+    [circleci] Improve clang-everything bot log, more to come
+
+    #1196
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9be8062b4d241f02bb96df436e98f10f08bda4f8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 29 02:11:05 2018 +0330
+
+    [ci] Another try on mingw bot
+
+ appveyor.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit d4d261a97723b27fb9ad9a69b8dc7fd8c560a98b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 29 01:57:50 2018 +0330
+
+    [ci] Another try on fixing mingw bots
+
+    Per
+    https://github.com/Alexpux/MSYS2-packages/issues/163#issuecomment-73555971
+
+ appveyor.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7b68edf2abc7680199360d52ed283cfc4f49b7d5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Sep 28 20:53:48 2018 +0330
+
+    [tests] Don't try to get glyph names on failures
+
+    As it may cause a race unrelated to the issue actually happened
+
+ test/api/test-multithread.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d289d6381864649504abfb1196ac20a1d4664a4e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Sep 28 20:47:21 2018 +0330
+
+    [ci] Trying to fix mingw bot
+
+    As https://github.com/Alexpux/MSYS2-packages/issues/702
+
+ appveyor.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 33231a855f0e3d2a14e5e2fcb921c6fc773ae6cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 28 11:06:49 2018 -0400
+
+    Fix pthread fail for real
+
+    Using a hack...
+
+ test/api/Makefile.am | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 8cb8209c911a69442f23f744981e3ed01e44a3fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 28 10:55:28 2018 -0400
+
+    Fix bot fails
+
+ test/api/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f4072e8cb81072cd6d51a2607efedb76c02e7db1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 28 10:14:23 2018 -0400
+
+    [morx] Remove mark_set from Insertion
+
+    text-rendering-tests test MORX-32 shows that for Insertion, an unset
+    mark is treated
+    as mark set at 0.  This is unlike the Reordering lookup where un
+    unset mark performs
+    nothing.
+
+    Fixes MORX-32.
+
+ src/hb-aat-layout-morx-table.hh | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit 0d18ec5467818fa8f763ec2871146a64d39987e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 28 10:00:07 2018 -0400
+
+    [morx] unsafe-to-break in Insertion
+
+    Makes MORX-29, MORX-30, MORX-31 pass.
+
+ src/hb-aat-layout-morx-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 02bebe42c1ffbd8e11b232c943317c8cd8141afb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 28 09:51:35 2018 -0400
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   4 ++++
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   4 ++++
+ .../text-rendering-tests/fonts/TestMORXThirtyone.ttf     | Bin 0 ->
+ 2964 bytes
+ .../text-rendering-tests/fonts/TestMORXThirtytwo.ttf     | Bin 0 ->
+ 2948 bytes
+ .../text-rendering-tests/fonts/TestMORXTwentynine.ttf    | Bin 0 ->
+ 3012 bytes
+ .../data/text-rendering-tests/tests/MORX-29.tests        |   4 ++++
+ .../data/text-rendering-tests/tests/MORX-30.tests        |   4 ++++
+ .../data/text-rendering-tests/tests/MORX-31.tests        |   8 ++++++++
+ .../data/text-rendering-tests/tests/MORX-32.tests        |   4 ++++
+ 9 files changed, 28 insertions(+)
+
+commit 4cd342baea323bf9709340bbabfc092c976c239c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 28 09:47:45 2018 -0400
+
+    Fix ubsan bot
+
+ test/api/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b435df3a5b6f7fddc091c4362a36840305144a57
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 28 09:13:14 2018 -0400
+
+    More atomic tuneup
+
+ src/hb-atomic.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 7e6e094abd27fd022fe9aea1872ef82f6a0cdcec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 28 08:45:57 2018 -0400
+
+    [test-multithread] Install ot funcs before filling ref buffer
+
+ test/api/test-multithread.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 21fbee831e0eab2c2f4513825c939158f4578156
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 28 08:43:37 2018 -0400
+
+    [test-multithread] Take num-threads and num-iters from command-line
+
+ test/api/test-multithread.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 598be3bb38fd11a288f8155b8c27ffef4ebdd8b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 28 08:33:26 2018 -0400
+
+    Minor
+
+ test/api/test-multithread.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c09bf3d50589c8eb95b322ef3e4eb8a288dacebe
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Sep 28 16:13:01 2018 +0330
+
+    test-multithread, check the results on every iteration (#1194)
+
+ test/api/test-multithread.c | 59
+ ++++++++++++++++++++++++---------------------
+ 1 file changed, 32 insertions(+), 27 deletions(-)
+
+commit dbc3070a15290310bb5aade11d04eb24fe958094
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Sep 28 16:01:15 2018 +0330
+
+    Make test-multithread pass the tsan bot test (#1193)
+
+ test/api/test-multithread.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit d2542cd28c70b2ba7ab28c0fe5459a1b4a873478
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 27 17:23:24 2018 -0400
+
+    More atomic fixup
+
+ src/hb-atomic.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3ee96984f4633852736b33640c89d1706bc77e0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 27 17:20:26 2018 -0400
+
+    Fixup atomics from recent change
+
+ src/hb-atomic.hh | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit 305468708dc9ce9dadad36c117c380f13bcc6a26
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 27 16:54:23 2018 -0400
+
+    [cache] Use atomic writes in clear()
+
+    To help TSan.
+
+ src/hb-cache.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 9e9a36ee651502b69717895385387951a2d0802a
+Author: Volker Krause <vkrause@kde.org>
+Date:   Thu Sep 27 16:33:49 2018 +0200
+
+    Fix infinite loop when walking up the directory hierarchy (#1183)
+
+    A single find_package(harfbuzz) line in user code resulted in
+    this loop
+    getting stuck when _harfbuzz_libdir_iter became "/".
+
+ src/harfbuzz-config.cmake.in | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 0c1d852bc41a4f69f890be4817c84bd7de56e07a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Sep 27 11:53:17 2018 +0330
+
+    Use clang for compiling freetype for tsan bot
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ab16b24cc94389ac66a9353327d2a87a7c230ed4
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Sep 26 18:51:36 2018 -0700
+
+    tweaked get_fd fix
+
+ src/hb-ot-cff-common.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit dac70f252a84e1a255375eaacffc2cb3f3fc6e58
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Sep 26 16:30:26 2018 -0700
+
+    Added CFF1 J font subset to api test
+
+    Also fixed FDSelect3_4::get_fd
+    Fixed test_subset_cff1_strip_hints (wrong font names!)
+
+ src/hb-ot-cff-common.hh                            |   2 +-
+ .../fonts/SourceHanSans-Regular.41,3041,4E9D.otf   | Bin 0 -> 5864 bytes
+ test/api/fonts/SourceHanSans-Regular.41,4E9D.otf   | Bin 0 -> 5500 bytes
+ test/api/test-subset-cff1.c                        |  25
+ +++++++++++++++++++--
+ 4 files changed, 24 insertions(+), 3 deletions(-)
+
+commit 662f7d7e8bfa77b21ffa05e853f61dda993dcc8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 26 18:42:37 2018 -0400
+
+    [arabic] Do the joiner-flipping only for rlig feature
+
+    See comment.
+
+ src/hb-ot-shape-complex-arabic.cc | 24 +++++++++++++++++++-----
+ 1 file changed, 19 insertions(+), 5 deletions(-)
+
+commit 7f30629cddcf0196d7b754df0cb2d4a8e5fed4b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 26 16:40:23 2018 -0400
+
+    [ft] Make TSan happy
+
+ src/hb-ft.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit ec743fce2a72a1cb76ac9401747a442a03a051d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 26 16:37:18 2018 -0400
+
+    Add more atomic intrinsics
+
+ src/hb-atomic.hh | 21 ++++++++++++++++++---
+ 1 file changed, 18 insertions(+), 3 deletions(-)
+
+commit d183b33c1dd42055a9432f4a756ea20856913201
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 26 16:29:35 2018 -0400
+
+    Rename test
+
+ test/api/Makefile.am                                           | 2 +-
+ test/api/{test-subset-codepoints.c => test-collect-unicodes.c} | 0
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit c9c75fe3d9eb36f166d594ceb5889a1dc0b14fe6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Sep 27 00:08:06 2018 +0330
+
+    [ci] Compile freetype on tsan and put sanitizer flags on correct
+    places (#1188)
+
+ .circleci/config.yml | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 39da1914b4fd1c58d61cb29c78a0904ff6b905c6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Sep 26 23:32:45 2018 +0330
+
+    Test freetype funcs on test-multithread (#1187)
+
+ test/api/Makefile.am        |  6 ++++--
+ test/api/test-multithread.c | 25 +++++++++++++++++--------
+ 2 files changed, 21 insertions(+), 10 deletions(-)
+
+commit e88009a93f5d13ed31b6262f928761e9574dcef1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Sep 26 22:53:02 2018 +0330
+
+    Minor, remove the no longer needed comment on test-multithread
+
+ test/api/test-multithread.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 90a0f9fa0c020c268ac3ba31c7f1337eed85f35e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 26 15:03:07 2018 -0400
+
+    Make TSan happy with make_immutable()
+
+ src/hb-blob.cc    | 2 ++
+ src/hb-face.cc    | 2 ++
+ src/hb-font.cc    | 4 ++++
+ src/hb-unicode.cc | 2 ++
+ 4 files changed, 10 insertions(+)
+
+commit 34d5a2595331c568ae524057d031c9d5d2573978
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 26 15:02:21 2018 -0400
+
+    Fix test-multithread and increase num_threads to 30
+
+    What were you thinking? ;)
+
+ test/api/test-multithread.c | 56
+ +++++++++++++++++++++------------------------
+ 1 file changed, 26 insertions(+), 30 deletions(-)
+
+commit 8bb73dad7f3279e1f1362cf9a137504e8ef08985
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Sep 26 20:50:51 2018 +0330
+
+    Add a multithreaded test (#1184)
+
+ test/api/Makefile.am        |   6 ++
+ test/api/test-multithread.c | 146
+ ++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 152 insertions(+)
+
+commit 04caf11608d2db13eb6ed2ecc3d406e284b4c13c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 26 12:13:47 2018 -0400
+
+    [hb-view] Change subpixel bits from 8 to 6
+
+    To match FreeType units, such that FreeType gets correct size from us.
+    This matters more now that we allow setting --ft-load-flags.
+
+ util/hb-view.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 824111d4842b9a7bbbdcd147325f8f372ed3d37c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 25 12:47:37 2018 -0400
+
+    Fix iOS build
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/1179
+
+ src/hb-coretext.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4b4be7701f635f8378e7f868cfbe8d4571fc841f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 25 09:24:35 2018 +0330
+
+    [circle] Add an obsessive clang bot (#1178)
+
+ .circleci/config.yml | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+commit ae7f0e83d4417fac2455c44eaea15b3cca03d18e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Sep 24 22:49:44 2018 -0700
+
+    fixed memory leaks
+
+    in CFF1 & CFF2 accelerators, VORG subsetter
+
+ src/hb-ot-cff1-table.hh | 2 ++
+ src/hb-ot-cff2-table.hh | 2 ++
+ src/hb-ot-vorg-table.hh | 3 +++
+ 3 files changed, 7 insertions(+)
+
+commit 258b456566abd266657725b3fc4e70f18b370d5d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Sep 24 16:50:47 2018 -0700
+
+    Added CFF1 & CFF2 api tests
+
+ test/api/Makefile.am                               |   4 +
+ test/api/fonts/AdobeVFPrototype.abc.otf            | Bin 0 -> 7800 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nohints.otf     | Bin 0 -> 7152 bytes
+ test/api/fonts/AdobeVFPrototype.ac.otf             | Bin 0 -> 7336 bytes
+ test/api/fonts/SourceSansPro-Regular.abc.otf       | Bin 0 -> 3412 bytes
+ .../api/fonts/SourceSansPro-Regular.ac.nohints.otf | Bin 0 -> 3228 bytes
+ test/api/fonts/SourceSansPro-Regular.ac.otf        | Bin 0 -> 3332 bytes
+ test/api/test-subset-cff1.c                        | 104
+ +++++++++++++++++++++
+ test/api/test-subset-cff2.c                        | 104
+ +++++++++++++++++++++
+ 9 files changed, 212 insertions(+)
+
+commit 8282e881b51363811078bce53fad6aa5b41f7b41
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 19:43:01 2018 -0400
+
+    Disable msan bot again
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1175
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6c0e7eb6a6f3f888442c0a97ce6a771631990ed6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 19:07:23 2018 -0400
+
+    Minor
+
+ src/hb-ot-map.hh                 |  1 +
+ src/hb-ot-shape-complex-indic.cc | 34 +++++++++++++++++-----------------
+ src/hb-ot-shape-complex-khmer.cc | 18 +++++++++---------
+ 3 files changed, 27 insertions(+), 26 deletions(-)
+
+commit d748dc76644f28d4130f9cb1dee7a22cbe81c25d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 18:30:50 2018 -0400
+
+    More iter inits
+
+ src/hb-ot-layout-gsubgpos.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit d9867497d09af929554eaa89cc6fee865b018646
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 18:11:59 2018 -0400
+
+    Minor
+
+ src/hb-ot-shape.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 70136a78cb9eda244767f8e8a3d30d0f3c569d01
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 18:03:34 2018 -0400
+
+    Remove F_COMBINE
+
+    Now I wonder if any bots will be unhappy we calling | in static
+    const initializations...
+    Or would that cost runtime init?  Our tests don't detect any..
+
+ src/hb-ot-map.hh                  | 2 --
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 2 files changed, 1 insertion(+), 3 deletions(-)
+
+commit f048ead84a4d3fe0bb712ed228c2f39c01ce9705
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 18:01:53 2018 -0400
+
+    Some more
+
+ src/hb-ot-map.cc                   |  5 +++--
+ src/hb-ot-map.hh                   | 13 +++++++------
+ src/hb-ot-shape-complex-arabic.cc  | 18 +++++++++---------
+ src/hb-ot-shape-complex-hangul.cc  |  2 +-
+ src/hb-ot-shape-complex-indic.cc   |  8 ++++----
+ src/hb-ot-shape-complex-khmer.cc   |  8 ++++----
+ src/hb-ot-shape-complex-myanmar.cc | 10 +++++-----
+ src/hb-ot-shape-complex-tibetan.cc |  2 +-
+ src/hb-ot-shape-complex-use.cc     | 20 ++++++++++----------
+ src/hb-ot-shape.cc                 | 30 +++++++++++++++---------------
+ 10 files changed, 59 insertions(+), 57 deletions(-)
+
+commit 1676f608c8e4f880789252ca448bb008f6dd51b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 17:55:03 2018 -0400
+
+    Minor refactoring
+
+ src/hb-ot-map.hh                   | 15 ++++++++++-
+ src/hb-ot-shape-complex-hangul.cc  |  2 +-
+ src/hb-ot-shape-complex-indic.cc   | 52
+ +++++++++++++++-----------------------
+ src/hb-ot-shape-complex-khmer.cc   | 38 ++++++++++------------------
+ src/hb-ot-shape-complex-myanmar.cc |  2 +-
+ 5 files changed, 51 insertions(+), 58 deletions(-)
+
+commit 10203339600e85d6aaffba6034ac250e72fdfc12
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 25 01:00:32 2018 +0330
+
+    [circleci] Update sanitizer bots with newer clang and Ubuntu version
+    (#1176)
+
+ .circleci/config.yml | 48
+ ++++++++++++++++++++++++++++++++----------------
+ 1 file changed, 32 insertions(+), 16 deletions(-)
+
+commit 12b8baa7653741ba13a89cd40f1f36b8bac11666
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 17:22:39 2018 -0400
+
+    [msan] Enable again to get a build log, and try to play with
+    suppressions
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit aec0d3cbc923a8801c5bd9e9ae05801a31a7260c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 13:12:15 2018 -0400
+
+    [ubsan] Re-enable now that it passes locally
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4839807340cc73d5ba826dff4b4ba358775a213d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 13:11:34 2018 -0400
+
+    [check-static-inits.sh] Allow some if ubsan is in effect
+
+ src/check-static-inits.sh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0604bf2b3846b200c56447ffe542bf69c0529a06
+Merge: 76e54d2b 45f5aa97
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Sep 24 10:09:25 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit e45ba31dc723988150ef766758fa89fecd50ca03
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 13:04:48 2018 -0400
+
+    [check-symbols.sh] Allow weak objects "V"
+
+    ubsan generates these.
+
+ src/check-symbols.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d07f3111b4bc38798e16a2459b80a16d7a9f9ff1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 13:01:35 2018 -0400
+
+    Link API test programs with C++ linker
+
+    Needed to make ubsan work.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1174
+
+ test/api/Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit a96508cfc9bd9013d24b18547fcd9c03e08fe2f2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 12:52:42 2018 -0400
+
+    [msan] Add MSAN_OPTIONS=exitcode=42
+
+    Default exit value is 77, which causes autotools to "skip" test.
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 45f5aa97905996e3486c6dbba8493b11cfa0cf15
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 12:43:29 2018 -0400
+
+    [circleci] Disable msan and ubsan builds
+
+    https://github.com/harfbuzz/harfbuzz/issues/1174
+    https://github.com/harfbuzz/harfbuzz/issues/1175
+
+ .circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2d93148a0f915bb52433ecc9d66845191a2f9135
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 11:52:22 2018 -0400
+
+    Ignore weak symbols in check-symbols.sh
+
+    Some clang versions leave a std::round(float) weak symbol around...
+
+ src/check-symbols.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 55bae6825ed2058255a512a73293e3cdff0e78a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 10:43:06 2018 -0400
+
+    [docs] A few improvements
+
+    If we wrote just this much every day...
+
+ src/hb-buffer.cc |  4 ++++
+ src/hb-buffer.h  | 20 +++++++++++++++-----
+ src/hb-face.cc   | 11 +++++++----
+ src/hb-font.cc   | 12 +++++++-----
+ 4 files changed, 33 insertions(+), 14 deletions(-)
+
+commit 57fa2c23de8b6b66894d6872d192ac90ec8bf05a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 09:57:52 2018 -0400
+
+    Readjust Hebrew composition again
+
+ src/hb-ot-shape-complex-hebrew.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7f335390f3a498119319a0e6c3ce7656a3902066
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 09:56:18 2018 -0400
+
+    Revert change that would decompose text if GPOS mark feature is
+    available
+
+    https://github.com/harfbuzz/harfbuzz/issues/653#issuecomment-423905920
+
+ src/hb-ot-shape-normalize.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit a6f4b2f7cd088aeb44e1aac672434641f4f9e484
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 09:54:37 2018 -0400
+
+    Fix normalization
+
+    https://github.com/harfbuzz/harfbuzz/commit/62d1e0852a5549a1b510ad46a4b89f12730bb708#commitcomment-30613091
+
+ src/hb-ot-shape-normalize.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 3583fb03b14a10ec5ab5f9c480e150934101fd0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 23 22:33:38 2018 -0400
+
+    Simplify ZWJ-skipping a bit
+
+    Towards disabling ZWJ-skipping in certain GPOS contexts.
+
+    Part of https://github.com/flutter/flutter/issues/16886
+
+ src/hb-ot-layout-gsubgpos.hh       |  6 +++---
+ src/hb-ot-shape-complex-indic.cc   | 21 ++++++++++++++++-----
+ src/hb-ot-shape-complex-khmer.cc   | 21 ++++++++++++++-------
+ src/hb-ot-shape-complex-myanmar.cc | 15 ++++++++++++++-
+ src/hb-ot-shape-complex-use.cc     | 15 +++++++++++++--
+ 5 files changed, 60 insertions(+), 18 deletions(-)
+
+commit 9516cbd3df7ccdb40b27a7ba99a1e0da8a6b170c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 23 22:00:34 2018 -0400
+
+    Reinit skippy iters when auto_zwj / auto_zwnj change
+
+    Ouch.  How did we not hit this bug before...
+
+ src/hb-ot-layout-gsubgpos.hh | 17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
+
+commit 62d1e0852a5549a1b510ad46a4b89f12730bb708
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 23 21:32:18 2018 -0400
+
+    Prefer decomposed form if font has GPOS mark feature
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/653
+
+ src/hb-ot-shape-complex-hebrew.cc |   2 +-
+ src/hb-ot-shape-normalize.cc      | 126
+ ++++++++++++++++++++------------------
+ src/hb-ot-shape-normalize.hh      |   7 ++-
+ 3 files changed, 72 insertions(+), 63 deletions(-)
+
+commit d7f21777e6a797758ab234555f5f7e07c87278f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 23 19:12:52 2018 -0400
+
+    [ot-font] Fix leak
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1171
+
+    I'm glad we have leak-detector bots now.
+
+ src/hb-ot-post-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit ae39a53f55e6b812defb4c7b48562651c9eb13a3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 22 14:22:17 2018 +0330
+
+    Add bots with address- and thread-sanitizer
+
+ .circleci/config.yml | 52
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 52 insertions(+)
+
+commit 24dd6c1a9d8d571c30dce4d39c1975b1d1cedc2a
+Author: Matt Oliver <protogonoi@gmail.com>
+Date:   Sun Sep 23 18:08:30 2018 +1000
+
+    src/hb-blob.cc: Fix mmap functionality with UWP.
+
+ src/hb-blob.cc | 27 +++++++++++++++++++++++++++
+ src/hb.hh      |  4 +++-
+ 2 files changed, 30 insertions(+), 1 deletion(-)
+
+commit b7f1bbc2f8b14a402fa9e42e88919dc0173373ce
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Sep 22 16:41:56 2018 +0200
+
+    [test] Fix printing subprocess error messages
+
+    Decode the string as Python 3 returns bytes string, and also don’t
+    assume that it ends with a new line.
+
+ test/shaping/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 403019482b0d7f17fbdb5def2be5f43e28bafcf3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 22 17:24:03 2018 +0330
+
+    Fix test-subset-* leak issues
+
+    See also https://github.com/harfbuzz/harfbuzz/pull/1169
+
+ test/api/hb-subset-test.h | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+commit f6ebe1f4dc95a7c4b3a0af23086873a11867c1d9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 22 17:05:52 2018 +0330
+
+    Fix test-ot-math leak issue
+
+    See also https://github.com/harfbuzz/harfbuzz/pull/1169
+
+ test/api/test-ot-math.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 669ac81ac52e9d559324db851a9ee46ef651e7b0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 22 16:49:23 2018 +0330
+
+    Fix test-set leak issue
+
+    See also https://github.com/harfbuzz/harfbuzz/pull/1169
+
+ test/api/test-set.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit ef9307fd2227bf0f750d8f7fafae466affc81454
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 22 16:45:31 2018 +0330
+
+    Fix test-font leak issue
+
+    See also https://github.com/harfbuzz/harfbuzz/pull/1169
+
+ test/api/test-font.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 76e54d2bd804414183858ca198157050419dfe6c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Sep 21 12:16:36 2018 -0700
+
+    fixed subroutinized CFF2 flattening
+
+    and some code cleanup
+
+ src/hb-cff-interp-common.hh    |  2 +-
+ src/hb-cff-interp-cs-common.hh | 13 -------------
+ src/hb-cff2-interp-cs.hh       |  7 ++++---
+ 3 files changed, 5 insertions(+), 17 deletions(-)
+
+commit 321e592333014f713557e8ce8041dcb5de710218
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Sep 20 10:31:06 2018 -0700
+
+    Added desubroutinize option to generate-expected-outputs.py
+
+    Currently hb-subset always desubroutinizes CFF fonts.
+    Note that even with this option fonttools won't generate the expected
+    subset CFF fonts. They were manually created & tweaked to match
+    hb-subset output.
+
+ test/subset/generate-expected-outputs.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f212c050ad50898d5105d1d3a6ea3498f94ee462
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Sep 20 09:45:43 2018 -0700
+
+    Added VORG struct and its subsetter
+
+    new file: hb-ot-vorg-table.hh
+
+ src/Makefile.sources    |   1 +
+ src/hb-ot-vorg-table.hh | 163
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc        |   5 +-
+ 3 files changed, 168 insertions(+), 1 deletion(-)
+
+commit 5fd8bce945e7efaa48d0c29eb8b2700027bd3c0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 19 22:34:09 2018 -0400
+
+    [morx] Fix mark_set check
+
+ src/hb-aat-layout-morx-table.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 1377adc8a88c627891cb8b9cea511d8f9f5324f9
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Sep 19 17:00:10 2018 -0700
+
+    Added SourceHanSans-Regular for CFF subset test
+
+    Disabled FDSelect serialization to format 0 for compatibility with
+    fonttools
+
+ src/hb-subset-cff-common.cc                          |  16
+ +++++++++++++---
+ .../japanese/SourceHanSans-Regular.default..otf      | Bin 0 ->
+ 2340 bytes
+ ...Regular.default.3042,3044,3046,3048,304A,304B.otf | Bin 0 ->
+ 6248 bytes
+ ...Regular.default.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 ->
+ 6432 bytes
+ .../SourceHanSans-Regular.default.61,63,65,6B.otf    | Bin 0 ->
+ 5428 bytes
+ ...Regular.default.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 ->
+ 6552 bytes
+ .../japanese/SourceHanSans-Regular.default.660E.otf  | Bin 0 ->
+ 5196 bytes
+ .../japanese/SourceHanSans-Regular.drop-hints..otf   | Bin 0 ->
+ 2188 bytes
+ ...ular.drop-hints.3042,3044,3046,3048,304A,304B.otf | Bin 0 ->
+ 6076 bytes
+ ...ular.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 ->
+ 6180 bytes
+ .../SourceHanSans-Regular.drop-hints.61,63,65,6B.otf | Bin 0 ->
+ 5312 bytes
+ ...ular.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 ->
+ 6248 bytes
+ .../SourceHanSans-Regular.drop-hints.660E.otf        | Bin 0 ->
+ 5088 bytes
+ test/subset/data/fonts/SourceHanSans-Regular.otf     | Bin 0 ->
+ 16427580 bytes
+ test/subset/data/tests/japanese.tests                |   1 +
+ 15 files changed, 14 insertions(+), 3 deletions(-)
+
+commit 0739b28169eb63332b31420deb5bf58b5446f154
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 19 17:32:21 2018 -0400
+
+    [aat] Minor
+
+ src/hb-aat-layout-common.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7671cb9b04770d50b1b2a05a24f6fadc35993cd1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 19 17:10:26 2018 -0400
+
+    [coretext] Minor
+
+ src/hb-coretext.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit dc8ed45292ce4e522c3bda03fd83873da7b6591e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 19 16:46:41 2018 -0400
+
+    [morx] Implement forward/backward processing
+
+    We reverse too many times. Can be optimized. But I doubt many fonts
+    use reverse lookups, so doesn't matter.
+
+    Other than not applying user features, this completes morx table
+    implementation.
+
+ src/hb-aat-layout-morx-table.hh | 40
+ ++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 40 insertions(+)
+
+commit 3bccd62196b5dff70d446c3fe053b1b47bb9c19e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 19 16:24:34 2018 -0400
+
+    [morx] Implement horiz-only/vert-only subtables
+
+ src/hb-aat-layout-morx-table.hh | 24 +++++++++++++++++++++++-
+ 1 file changed, 23 insertions(+), 1 deletion(-)
+
+commit 041a08de3d0ca74d3e2fdccfa5311ff26a8b97e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 19 16:02:56 2018 -0400
+
+    [morx] Improve buffer position in Insertion w DontAdvance and wo
+
+    Just speculation. Needs tests to determine which is correct behavior.
+
+ src/hb-aat-layout-morx-table.hh | 23 ++++++++++++++++++-----
+ 1 file changed, 18 insertions(+), 5 deletions(-)
+
+commit ebeccf3e63bff96b7a7766dea566704a9cbeae44
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Sep 18 17:24:30 2018 -0700
+
+    fixed char widths & standard Encoding in subset CFF
+
+    also merged flush_n_args to flush_args into one
+    takes start index of the arguments on stack instead of count
+
+ src/hb-cff-interp-cs-common.hh | 20 +++++---------------
+ src/hb-cff1-interp-cs.hh       | 11 +++++++----
+ src/hb-cff2-interp-cs.hh       |  2 +-
+ src/hb-subset-cff1.cc          | 22 ++++++++++++++++------
+ src/hb-subset-cff2.cc          | 12 ++++++------
+ 5 files changed, 35 insertions(+), 32 deletions(-)
+
+commit bf4eb2e4cf8d08b674f81954e22b331cca2b3721
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Sep 18 15:53:37 2018 -0700
+
+    Added SourceSansPro-Regular along as CFF full-font test case
+
+    derived "expected" subset fonts from fonttools then manually tweaked
+    further so they resemble hb-subset output
+
+ ...ourceSansPro-Regular.default.1FC,21,41,20,62,63.otf | Bin 0 ->
+ 3640 bytes
+ .../SourceSansPro-Regular.default.61,62,63.otf         | Bin 0 ->
+ 3400 bytes
+ .../SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf   | Bin 0 ->
+ 3596 bytes
+ ...ceSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 0 ->
+ 3480 bytes
+ .../SourceSansPro-Regular.drop-hints.61,62,63.otf      | Bin 0 ->
+ 3276 bytes
+ ...SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf | Bin 0 ->
+ 3448 bytes
+ test/subset/data/fonts/SourceSansPro-Regular.otf       | Bin 0 ->
+ 220852 bytes
+ test/subset/data/tests/full-font.tests                 |   1 +
+ test/subset/run-tests.py                               |   4 ++--
+ test/subset/subset_test_suite.py                       |   5 +++++
+ 10 files changed, 8 insertions(+), 2 deletions(-)
+
+commit e75e7224c9c02ab99e132a51fe8801e29827cac5
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Sep 17 15:34:39 2018 -0700
+
+    include curve control points in extents
+
+    this makes results consistent with FT
+    also optimized handling of path end points
+
+ src/hb-cff-interp-cs-common.hh |  6 +++---
+ src/hb-ot-cff1-table.cc        | 27 +++++++++++++++++++++++++--
+ 2 files changed, 28 insertions(+), 5 deletions(-)
+
+commit 98b94f8ba53276887ab583eeeb4cb097c7b84b2c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Sep 17 13:56:39 2018 -0700
+
+    fix static_assert failure in OffsetTo<TopDict>
+
+ src/hb-ot-cff2-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d050ab8d3e73debfb414fc8c9426180459150b61
+Merge: f0a4e0c2 388ab916
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Sep 17 13:07:29 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit f0a4e0c2ca5ee0225765590384216d5d5367de7e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Sep 17 12:11:56 2018 -0700
+
+    fix build attempt ^3
+
+ src/hb-ot-cff1-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f0d74971aee5ce309bdfa2a4397667f14ee15f42
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Sep 17 12:02:12 2018 -0700
+
+    fix attempt ^2: unuse INT32_MAX/MIN
+
+ src/hb-ot-cff1-table.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 4d963a2711e6035e97e246241d8420273363f857
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Sep 17 11:28:33 2018 -0700
+
+    fix build attempt
+
+ src/hb-ot-cff1-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 388ab91642734e1ba0d7a4a4f29a17b15f1b249d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 17 19:29:34 2018 +0200
+
+    [morx] Implement InsertionChain
+
+ src/hb-aat-layout-morx-table.hh | 87
+ ++++++++++++++++-------------------------
+ 1 file changed, 33 insertions(+), 54 deletions(-)
+
+commit c0c85b852d37dad75eeef473e6dd3ec91a3b559b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Sep 17 11:14:56 2018 -0700
+
+    implemented get_glyph_extents with CFF1
+
+    Implemented path operators in a new struct PathProc hooked up
+    to CSOpSet
+    Added current point to CSInterpEnv
+
+ src/hb-cff-interp-common.hh    |  86 ++++++++-
+ src/hb-cff-interp-cs-common.hh | 425
+ +++++++++++++++++++++++++++++++++++++++--
+ src/hb-cff1-interp-cs.hh       |  18 +-
+ src/hb-cff2-interp-cs.hh       |  10 +-
+ src/hb-null.hh                 |   2 +-
+ src/hb-ot-cff1-table.cc        |  82 ++++++++
+ src/hb-ot-cff1-table.hh        |  95 +++++----
+ src/hb-ot-face.cc              |   1 +
+ src/hb-ot-face.hh              |   1 +
+ src/hb-ot-font.cc              |   2 +
+ src/hb-subset-cff1.cc          |   4 +-
+ src/hb-subset-cff2.cc          |  10 +-
+ 12 files changed, 657 insertions(+), 79 deletions(-)
+
+commit d8d1e7df0057c79f54d855b7bfec2d21f59b09e8
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Sep 17 11:09:51 2018 -0400
+
+    Don't enforce a native direction for Old Hungarian
+
+ src/hb-common.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6a97d0f3d377a35ea691d15ac142ce043f953e71
+Author: Simon Hausmann <hausmann@gmail.com>
+Date:   Mon Sep 17 10:33:34 2018 +0200
+
+    Fix installation of cmake config when building with cmake (#1161)
+
+    When building with the auto tools, the manually mantained
+    harfbuzz-config.cmake is installed. When building with cmake, we
+    can use
+    cmake to generate the correct config files for us and install them.
+
+ CMakeLists.txt | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 606bf57430370810f7bb62ba12b9685d8943685d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 16 19:33:48 2018 +0200
+
+    Revert forcing use of single-parameter static_assert()
+
+    Some clang versions define static_assert as a macro apparently,
+    so we cannot
+    redefine it...
+
+    This reverts commit 94bfea0ce6a7b4d5641c198d50751748a353df11.
+    This reverts commit 4e62627831e7457ed60ff87712570065b14b200a.
+
+ src/hb-atomic.hh                           |  4 ++--
+ src/hb-buffer.cc                           |  2 +-
+ src/hb-buffer.hh                           |  4 ++--
+ src/hb-cache.hh                            |  4 ++--
+ src/hb-coretext.cc                         |  2 +-
+ src/hb-debug.hh                            |  2 +-
+ src/hb-dsalgs.hh                           |  4 ++--
+ src/hb-machinery.hh                        |  4 ++--
+ src/hb-null.hh                             |  8 +++----
+ src/hb-open-type.hh                        |  4 ++--
+ src/hb-ot-layout-common.hh                 |  2 +-
+ src/hb-ot-layout-gdef-table.hh             |  6 +++---
+ src/hb-ot-layout.cc                        | 14 ++++++------
+ src/hb-ot-map.cc                           |  2 +-
+ src/hb-ot-math-table.hh                    |  2 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh |  2 +-
+ src/hb-ot-shape-complex-indic.hh           |  2 +-
+ src/hb-ot-shape-complex-use.cc             |  2 +-
+ src/hb-set-digest.hh                       |  4 ++--
+ src/hb-set.hh                              |  6 +++---
+ src/hb-uniscribe.cc                        |  2 +-
+ src/hb.hh                                  | 34
+ +++++++++++++-----------------
+ util/options.cc                            |  3 ++-
+ 23 files changed, 58 insertions(+), 61 deletions(-)
+
+commit cbcaba6ffdf6b147d45baa95d62fd29cec67ed54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 16 19:25:19 2018 +0200
+
+    One more bot fix
+
+ src/hb-unicode.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 94bfea0ce6a7b4d5641c198d50751748a353df11
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 16 19:12:19 2018 +0200
+
+    Fix build, another try
+
+ util/options.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 89dd4b959773d35981299551074ccc7a1eb332bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 16 18:11:46 2018 +0200
+
+    Fix bots
+
+    "Unused private member" warning turned error.  ugh.
+
+ src/hb-aat-layout-morx-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 4e62627831e7457ed60ff87712570065b14b200a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 16 18:09:36 2018 +0200
+
+    Enforce single-param static_assert() only
+
+    So we don't accidentally break it again.
+
+ src/hb-atomic.hh                           |  4 ++--
+ src/hb-buffer.cc                           |  2 +-
+ src/hb-buffer.hh                           |  4 ++--
+ src/hb-cache.hh                            |  4 ++--
+ src/hb-coretext.cc                         |  2 +-
+ src/hb-debug.hh                            |  2 +-
+ src/hb-dsalgs.hh                           |  4 ++--
+ src/hb-machinery.hh                        |  4 ++--
+ src/hb-null.hh                             |  8 +++----
+ src/hb-open-type.hh                        |  4 ++--
+ src/hb-ot-layout-common.hh                 |  2 +-
+ src/hb-ot-layout-gdef-table.hh             |  6 +++---
+ src/hb-ot-layout.cc                        | 14 ++++++------
+ src/hb-ot-map.cc                           |  2 +-
+ src/hb-ot-math-table.hh                    |  2 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh |  2 +-
+ src/hb-ot-shape-complex-indic.hh           |  2 +-
+ src/hb-ot-shape-complex-use.cc             |  2 +-
+ src/hb-set-digest.hh                       |  4 ++--
+ src/hb-set.hh                              |  6 +++---
+ src/hb-uniscribe.cc                        |  2 +-
+ src/hb.hh                                  | 34
+ +++++++++++++++++-------------
+ 22 files changed, 60 insertions(+), 56 deletions(-)
+
+commit f1a86e1e6f3906f33fc89de694a4bbbc3e40d2bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 16 18:01:32 2018 +0200
+
+    Remove unused try
+
+ src/hb-null.hh | 13 -------------
+ 1 file changed, 13 deletions(-)
+
+commit ebd50b3c83a22a0fdba53271275b8619a23739aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 16 17:57:12 2018 +0200
+
+    Fix static_assert
+
+ src/hb-open-type.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 10642b3fbfbc1776e784b190c43a9e0693dd423a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 15 19:43:33 2018 +0200
+
+    Disallow null-enabled offsets to unsized structures...
+
+    ...like UnsizedArrayOf<>.
+
+    This fixes a class of crasher bugs, mostly with color and AAT tables.
+    We
+    cannot use nullable offsets to varsized data that does not declare
+    min_size,
+    because it's nost safe to use our fixed-size null pool for types
+    that have
+    their size external.  So, use non_null'able offsets for these.
+
+    A further enhancement would be to make use of min_size in Null<>
+    itself.
+    Will try that after.
+
+ src/hb-aat-layout-common.hh     |  8 ++++----
+ src/hb-aat-layout-feat-table.hh |  2 +-
+ src/hb-aat-layout-morx-table.hh | 10 +++++-----
+ src/hb-aat-layout-trak-table.hh |  4 ++--
+ src/hb-aat-ltag-table.hh        |  2 +-
+ src/hb-open-type.hh             |  5 +++++
+ src/hb-ot-color-cbdt-table.hh   |  4 +---
+ src/hb-ot-color-colr-table.hh   |  4 ++--
+ src/hb-ot-color-cpal-table.hh   |  8 ++++----
+ src/hb-ot-color-svg-table.hh    |  2 +-
+ src/hb-ot-layout-common.hh      | 18 ++++++++++--------
+ src/hb-ot-layout-jstf-table.hh  |  4 ++--
+ 12 files changed, 38 insertions(+), 33 deletions(-)
+
+commit 9ff76c6025b55d184c96b193f23aa935ab32f1fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 15 18:31:14 2018 +0200
+
+    [morx] Respect default feature settings
+
+    Does NOT apply user-selected features.  But at least now enables
+    correct subtables.
+
+ src/hb-aat-layout-morx-table.hh | 34 +++++++++++++++++++++++-----------
+ 1 file changed, 23 insertions(+), 11 deletions(-)
+
+commit 2f97da6e2d6629e112789d399765d90f96952c0a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 15 14:51:50 2018 +0200
+
+    [aat] Change version field
+
+ src/hb-aat-layout-morx-table.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 29c2bd1795b933a611512af50a14f25e25d43159
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 15 14:47:18 2018 +0200
+
+    [morx] Add stub for InsertionChain
+
+ src/hb-aat-layout-morx-table.hh | 209
+ ++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 200 insertions(+), 9 deletions(-)
+
+commit f8ccb545c47abe8f0f4ed318ff7b5bf176913893
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 14 18:59:53 2018 +0200
+
+    [dfont] Disable null-processsing for offsets
+
+    An offset to unsized arrayis not safe to be redirected to our
+    fixed-sized
+    null pool.  Plus, we want to reject, not repair, bad-looking dfonts.
+
+ src/hb-open-file.hh | 8 ++++----
+ src/hb-open-type.hh | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 01b9148d9ae7d18228538774243e49840cfd2499
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 14 14:23:09 2018 +0200
+
+    [unicode] Move Fitzpatrick hack from ot-layout into unicode.hh
+
+ src/hb-ot-layout.hh | 12 +-----------
+ src/hb-unicode.hh   | 36 +++++++++++++++++++++++++++---------
+ 2 files changed, 28 insertions(+), 20 deletions(-)
+
+commit 6ebbf514ac90712fe089b2b64f68d1cf681edd5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 14 12:15:53 2018 +0200
+
+    Minor
+
+ src/hb-ot-layout.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 957dbed388fc3214248f6aca65902ad277d070fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 14 12:14:42 2018 +0200
+
+    Fix builds
+
+ src/hb-aat-layout-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4653e6cf3c1ef5005886d901df30e952d57eed6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 14 11:31:33 2018 +0200
+
+    [aat] Add enums for pre-defined state and classes
+
+    Not sure how I didn't add before...
+
+ src/hb-aat-layout-common.hh | 19 ++++++++++++++++---
+ 1 file changed, 16 insertions(+), 3 deletions(-)
+
+commit 67449c39331babb88f7d29d737895d786cd5da33
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 14 10:58:00 2018 +0200
+
+    Don't dereference offset before check_struct()
+
+ src/hb-open-file.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit f2c4720ae696096d90493db218ef1283681561e7
+Merge: 1234a813 ca746f26
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Sep 13 12:44:00 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit ca746f261e1e54cec2f9c8bc7a6f930491e19418
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 20:35:21 2018 +0200
+
+    [dfont] Also check dataLen range in sanitize
+
+    Just to disagree with myself re being done with this code...
+
+ src/hb-open-file.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3789c557ca06aef430726f4942cafecac6fe4eef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 20:30:04 2018 +0200
+
+    [dfont] Solve the mystery +2 offset thing!
+
+    Previously, ResourceForkHeader was defined as 30 bytes, having the
+    typeCountM1 as last member.
+    There was a mysterious offset-by-2 in the code, derived from FontTools
+    and JDK code this was
+    ported from.
+
+    In testing, I observed that typeListZ offset is actually 28.
+    Suggesting that the typeCountM1
+    does NOT actually belong to ResourceForkHeader, but belongs to the
+    array itself.  Adjusting for
+    that resolves the mystery +2 offset hack, so everything is clean
+    and good now.
+
+    This, concludes my dfont hacking.  The code looks great now, and
+    I'm happy to leave it.
+    Fuzzers might disagree though, we will see!
+
+ src/hb-open-file.hh | 30 ++++++++++++------------------
+ src/hb-open-type.hh | 44 ++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 56 insertions(+), 18 deletions(-)
+
+commit effc7ced72a6ce0fea328a8b68dc3d55f09774f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 20:21:54 2018 +0200
+
+    Rename HeadlessArrayOf::len to lenP1
+
+    So it doesn't accidentally match our templates, etc.
+
+ src/hb-open-type.hh            | 14 +++++++-------
+ src/hb-ot-layout-gsub-table.hh | 10 +++++-----
+ src/hb-ot-layout-gsubgpos.hh   | 10 +++++-----
+ 3 files changed, 17 insertions(+), 17 deletions(-)
+
+commit 1234a8136891429bb7353f47480595f44615f322
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Sep 13 10:55:56 2018 -0700
+
+    add head table to CFF/CFF2
+
+ src/hb-ot-cff1-table.hh | 4 ++++
+ src/hb-ot-cff2-table.hh | 4 ++++
+ 2 files changed, 8 insertions(+)
+
+commit 180a88a96ce327e4103df3635c73559de65d1546
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 19:19:57 2018 +0200
+
+    [dfont] Some more
+
+ src/hb-open-file.hh | 21 ++++++++-------------
+ 1 file changed, 8 insertions(+), 13 deletions(-)
+
+commit 0ab0f1e5ac5ccb07c57364e9f5be0b991398eb6f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 19:13:01 2018 +0200
+
+    [dfont] Push methods further down
+
+ src/hb-open-file.hh | 58
+ ++++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 33 insertions(+), 25 deletions(-)
+
+commit 8c9bdcc1feeab321a642bdaac50b716e48ce4263
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 19:08:22 2018 +0200
+
+    [dfont] Minor
+
+ src/hb-open-file.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 4479d3a2eda57d278700f5c78414ef6ef617d2a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 19:05:59 2018 +0200
+
+    [dfon]t Sanitize OpenTypeFontFace
+
+ src/hb-dsalgs.hh    |  6 ------
+ src/hb-open-file.hh | 21 +++++++++------------
+ 2 files changed, 9 insertions(+), 18 deletions(-)
+
+commit 3fba41906fba28c5ea01cc0749654de862453bf4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 18:49:16 2018 +0200
+
+    [dfont] Minor
+
+ src/hb-open-file.hh | 9 +++------
+ 1 file changed, 3 insertions(+), 6 deletions(-)
+
+commit bf852f0e62a8bdbb809af6a975f8ae8eed708d70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 18:47:53 2018 +0200
+
+    [dfont] Make test pass
+
+    Offset 0 is not null in this context.
+
+ src/hb-open-file.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 29faebe911a13916aa3d737e93d38deedc53567f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 18:45:35 2018 +0200
+
+    Allow Offset<>'s that have no 0==null
+
+ src/hb-open-type.hh | 43 +++++++++++++++++++++----------------------
+ 1 file changed, 21 insertions(+), 22 deletions(-)
+
+commit 82f4d776c21b7c1224dd7073ce69cdf76d85f16b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 18:27:20 2018 +0200
+
+    [dfont] Minor
+
+ src/hb-open-file.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 07e0ca930c29757217c2f9e4e0e6954657b6b82d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 17:39:09 2018 +0200
+
+    [bytes] Rename content to arrayZ
+
+ src/hb-dsalgs.hh        | 16 ++++++++--------
+ src/hb-ot-post-table.hh |  2 +-
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+commit dbb764dceb61365b7360a48d581ba5a4b3526e98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 16:49:26 2018 +0200
+
+    [dfont] Clean up sanitize()
+
+    I don't think I broke anything.  Fuzzers will let me know..
+
+ src/hb-dsalgs.hh    |   8 ++++
+ src/hb-open-file.hh | 122
+ ++++++++++++++++++++++++----------------------------
+ 2 files changed, 64 insertions(+), 66 deletions(-)
+
+commit 361fc2686152ad8c0ebaf19e0522e0fc58ba3953
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 16:47:33 2018 +0200
+
+    Fix OffsetTo::sanitize() after reshuffling
+
+ src/hb-open-type.hh | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 4c6b0fb5f6668a6e562260d16f629ad3c41e8961
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 16:39:30 2018 +0200
+
+    OffsetTo::sanitize() Add version with three user_data
+
+ src/hb-open-type.hh | 18 +++++++++++++-----
+ 1 file changed, 13 insertions(+), 5 deletions(-)
+
+commit a73bea69c599787b4cfeac92a3afd00749e00434
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 16:31:31 2018 +0200
+
+    OffsetTo::sanitize() more shuffling
+
+ src/hb-open-type.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit b482e5231cd5987082dd2c05fd649c3653f3c67a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 13 16:29:49 2018 +0200
+
+    OffsetTo::sanitize() reshuffling
+
+ src/hb-open-type.hh | 26 +++++++++++++++++++-------
+ 1 file changed, 19 insertions(+), 7 deletions(-)
+
+commit 3cae9c75153277b9cfaaba20e0de84e420aeb1eb
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Sep 12 17:23:08 2018 -0700
+
+    fixed hb_plan_subset_cff_fdselect
+
+    FDSelect3/4 sentinel size wasn't taken into account
+
+ src/hb-subset-cff-common.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0f159a38a62bbf1b7fb267694a5d91d8135da625
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Sep 12 16:08:54 2018 -0700
+
+    fixed serialize_fdselect_3_4
+
+ src/hb-ot-cff-common.hh     |  6 ++++
+ src/hb-ot-cff1-table.hh     |  6 ----
+ src/hb-subset-cff-common.cc | 68
+ ++++++++++++++++++++++++++-------------------
+ src/hb-subset-cff-common.hh | 10 +++----
+ src/hb-subset-cff1.cc       | 12 ++++----
+ src/hb-subset-cff2.cc       | 12 ++++----
+ 6 files changed, 63 insertions(+), 51 deletions(-)
+
+commit 1608481d88919ca748e367146e3a78458d5bbe8f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Sep 12 13:22:19 2018 -0700
+
+    fixed bugs in Charset serialization
+
+    also some code cleanup
+
+ src/hb-ot-cff1-table.hh |  4 ++--
+ src/hb-subset-cff1.cc   | 44 ++++++++++++++++++++------------------------
+ 2 files changed, 22 insertions(+), 26 deletions(-)
+
+commit f45ac6296add6435ea5a902f7519187414aa8092
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Sep 11 22:41:50 2018 -0700
+
+    fixed name mixup in Remap::reset
+
+    it was causing inconsistent Strings Index subset results
+
+ src/hb-ot-cff-common.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 497e7fb264ec5cb799c038cbe693b70410b18da3
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Sep 11 16:47:55 2018 -0700
+
+    misc bug fixes
+
+    Added OpCode_FontMatrix to TopDictOpSet (yet to parse values)
+    fixed a wrong assert in encode_int
+
+ src/hb-cff-interp-dict-common.hh | 3 +++
+ src/hb-subset-cff-common.hh      | 2 +-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 5b453f77f804cd8421a45d8276ed3e04041da23c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Sep 11 16:20:39 2018 -0700
+
+    fixed off-by-one error with offSize
+
+ src/hb-ot-cff-common.hh | 5 +++--
+ src/hb-subset-cff1.cc   | 4 ++--
+ src/hb-subset-cff2.cc   | 2 +-
+ 3 files changed, 6 insertions(+), 5 deletions(-)
+
+commit 1499029a9695e26beaf72e11287be60ad9e40cfe
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Sep 11 13:56:52 2018 -0700
+
+    fixed a bug
+
+ src/hb-cff-interp-dict-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0bd5912a08698fb7880e1354e45bf63ef45125a5
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Sep 11 13:24:27 2018 -0700
+
+    make parse_bcd locale free
+
+ src/hb-cff-interp-dict-common.hh | 92
+ +++++++++++++++++++++++++++++-----------
+ 1 file changed, 68 insertions(+), 24 deletions(-)
+
+commit bb38d0f66388ec37ee9b0e81176d60c66fc17a19
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Sep 11 10:43:15 2018 -0700
+
+    Implement parse_bcd
+
+ src/hb-cff-interp-common.hh      | 15 --------------
+ src/hb-cff-interp-dict-common.hh | 44
+ ++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 44 insertions(+), 15 deletions(-)
+
+commit 45e564a51917475ef6481825a6efb5b99bf1912e
+Merge: c6f75c30 d5c50927
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Sep 11 09:46:37 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit bd75fd45cdbd0edb24568326bb7fde59d299a82c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 18:12:26 2018 +0200
+
+    [dfont] Some renaming, plus add link to reference doc
+
+ src/hb-open-file.hh | 79
+ ++++++++++++++++++++++++-----------------------------
+ 1 file changed, 35 insertions(+), 44 deletions(-)
+
+commit 4134ec1307bbaff24972e238bc5e4a403cd3f1c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 17:56:03 2018 +0200
+
+    [dfont] Sanitize only sfnt resources as OpenTypeFontFile
+
+ src/hb-open-file.hh | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+commit 6b5e4d07adb6b739dc294da513c4a7acd03977f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 17:26:24 2018 +0200
+
+    [dfont] Minor
+
+ src/hb-open-file.hh | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+commit d5c509272f2fbd1b4c56e3b530da7e42e7f03901
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 17:18:21 2018 +0200
+
+    [dfont] Fix test expecatation and minor touch up
+
+    I have no way to authoritatively know, but looks like test font only
+    has one
+    face.  So, adjust test expectation instead.
+
+ src/hb-open-file.hh                                | 18
+ ++++++------------
+ test/shaping/data/in-house/tests/collections.tests |  2 +-
+ 2 files changed, 7 insertions(+), 13 deletions(-)
+
+commit 2b2ed1e536061cfd3a0f29522118f42b451678bd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 2 17:26:43 2018 +0430
+
+    [dfont] Add test
+
+ test/shaping/data/in-house/Makefile.sources        |   1 +
+ test/shaping/data/in-house/fonts/TestDFONT.dfont   | Bin 0 -> 3505 bytes
+ test/shaping/data/in-house/fonts/TestTTC.ttc       | Bin 0 -> 2608 bytes
+ test/shaping/data/in-house/tests/collections.tests |   6 ++++++
+ 4 files changed, 7 insertions(+)
+
+commit 9479ffefbfa3ea4ee39747e34177d26ab1ebbec9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 16:41:26 2018 +0200
+
+    [dfont] Re-enable and fix offset handling
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/1085
+
+ src/hb-face.cc      |  5 +++--
+ src/hb-open-file.hh | 19 +++++++++++++------
+ 2 files changed, 16 insertions(+), 8 deletions(-)
+
+commit a1814e2bec3a43b9eeb4d50a67daae3fc52fd0a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 14:45:23 2018 +0200
+
+    Whitespace
+
+ src/hb-open-file.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 383060cc3354e12611dec3082a6fe08fdb25f652
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 14:41:19 2018 +0200
+
+    [ft] Invalidate advance cache if font size changed
+
+ src/hb-ft.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 54998befc43ef38e47b74b3153380adbcf6279d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 14:35:26 2018 +0200
+
+    [ft] Cache advances
+
+    I decided to always use the cache, instead of my previous sketch
+    direction
+    that was to only allocate and use cache if fast advances are not
+    available.
+    The cache is a mere 1kb, so just use it...
+
+    TODO: Invalidate cache on font size change.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/651
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/1082
+
+ src/hb-cache.hh |  2 +-
+ src/hb-ft.cc    | 37 +++++++++++++++++--------------------
+ 2 files changed, 18 insertions(+), 21 deletions(-)
+
+commit f90bab8560816b60b4b3f2379b36c08756b21e6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 14:21:15 2018 +0200
+
+    [util] Add --ft-load-flags
+
+    Useful for performance testing.
+
+    Not hooked to cairo yet.  Just changes shaping, not rasterization.
+
+ util/helper-cairo.cc | 2 +-
+ util/options.cc      | 4 ++++
+ util/options.hh      | 2 ++
+ 3 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 93f7596254808d567b9e1e01fb4855efcd34677c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 14:11:10 2018 +0200
+
+    [util] Add -n shorthand for --num-iterations
+
+    Meh.
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 047a84c5dd76cdfc072de25c572e30866f87a1f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 14:05:16 2018 +0200
+
+    [ft] Towards caching slow get_h_advance results
+
+    Related to https://github.com/harfbuzz/harfbuzz/pull/1082
+
+ src/hb-ft.cc | 24 ++++++++++++++++++++----
+ 1 file changed, 20 insertions(+), 4 deletions(-)
+
+commit 237f21537842e6b471cdd6c86b98edfc0da0756c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 13:05:47 2018 +0200
+
+    [ft] Add advances() callback
+
+ src/hb-ft.cc | 27 +++++++++++++++++++++++++++
+ 1 file changed, 27 insertions(+)
+
+commit cbea7d49ab8d4765a2d72dcbf608d326bdf9af3d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 12:56:17 2018 +0200
+
+    [ot-font] Rename
+
+ src/hb-ot-font.cc | 74
+ +++++++++++++++++++++++++++----------------------------
+ 1 file changed, 37 insertions(+), 37 deletions(-)
+
+commit d8a67dac2a673138bb4d41cd7eab97c9ee987958
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 12:55:54 2018 +0200
+
+    [ot-font] Add advances() callbacks
+
+ src/hb-ot-font.cc | 43 ++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 42 insertions(+), 1 deletion(-)
+
+commit 0ea42e117ba2c76e118974fe114ae5d9ceef5743
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 12:22:42 2018 +0200
+
+    [cache] Minor
+
+ src/hb-cache.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0f520adaacca3c7b6d8e84a7722343184105f612
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 12:02:34 2018 +0200
+
+    Revert "Remove unused hb_cache_t"
+
+    This reverts commit 473b17af4d421f4ce7ac18c769731bb2aa4088f8.
+
+    Updates to recent changes.
+
+ src/Makefile.sources |  1 +
+ src/hb-cache.hh      | 75
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ft.cc         |  1 +
+ 3 files changed, 77 insertions(+)
+
+commit cfdea884754ed40ffa5cc00cb1ecaa86cb46a394
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 10:57:48 2018 +0200
+
+    [random] Switch to 32bit RNG
+
+ src/hb-ot-layout-gsubgpos.hh                | 7 ++++---
+ test/shaping/data/in-house/tests/rand.tests | 4 ++--
+ 2 files changed, 6 insertions(+), 5 deletions(-)
+
+commit 08260c708ae6adc4efa9bde5e9ede01b7e4d42cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 10:51:19 2018 +0200
+
+    [random] Shuffle
+
+ src/hb-ot-layout-gsub-table.hh | 5 +----
+ src/hb-ot-layout-gsubgpos.hh   | 6 ++++++
+ 2 files changed, 7 insertions(+), 4 deletions(-)
+
+commit 71c9f84e7c0afe41a8987b8a4ebc2b45a22fac56
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 22:37:19 2018 +0200
+
+    Make --features rand=1 available to the user
+
+    Use rand=255 to mean "randomize".
+
+    Part of https://github.com/harfbuzz/harfbuzz/pull/803
+
+ src/hb-ot-layout-gsub-table.hh | 11 ++++-------
+ src/hb-ot-layout-gsubgpos.hh   |  1 +
+ src/hb-ot-map.cc               |  4 ++--
+ src/hb-ot-map.hh               |  3 +++
+ src/hb-ot-shape.cc             |  2 +-
+ 5 files changed, 11 insertions(+), 10 deletions(-)
+
+commit cc1c4fdf88f6953dcd07fb42ee963404657cdef4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 16:36:05 2018 +0200
+
+    Respect user's wish if they set rand feature manually
+
+    Except if the set it to 1, which would mean "randomize"... Ugly.
+
+ src/hb-ot-layout-gsub-table.hh | 30 ++++++++++++++++--------------
+ 1 file changed, 16 insertions(+), 14 deletions(-)
+
+commit 80de4bcd2677bfb0907ea7059524f918b109ac37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 16:24:52 2018 +0200
+
+    Minor clean up of 'rand' patchset
+
+ src/hb-ot-layout-gsub-table.hh              |  7 +++++--
+ src/hb-ot-layout-gsubgpos.hh                |  7 ++++---
+ src/hb-ot-shape.cc                          | 13 ++++++-------
+ test/shaping/data/in-house/tests/rand.tests |  2 +-
+ 4 files changed, 16 insertions(+), 13 deletions(-)
+
+commit b545e27d8891f1e7f1fd034dd84abe44c839c380
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Feb 23 12:22:32 2018 -0500
+
+    Don't seed the RNG from the contents of the buffer
+
+ src/hb-ot-layout-gsubgpos.hh                | 7 ++-----
+ src/hb-ot-layout.cc                         | 5 +----
+ test/shaping/data/in-house/tests/rand.tests | 2 +-
+ 3 files changed, 4 insertions(+), 10 deletions(-)
+
+commit 2de96e846844d21888af6893378b21a33fc19232
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Sat Jan 27 19:48:38 2018 -0500
+
+    Test 'rand'
+
+ test/shaping/data/in-house/Makefile.sources              |   1 +
+ .../fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf   | Bin 0 ->
+ 1352 bytes
+ test/shaping/data/in-house/tests/rand.tests              |   3 +++
+ 3 files changed, 4 insertions(+)
+
+commit f05df643b44d9bbfd742e93f02c235fc821190d0
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Jan 26 21:36:15 2018 -0500
+
+    Allow requesting a specific glyph for 'rand'
+
+    Randomization only happens by default. If the user specifies a
+    value for
+    'rand', that value is respected.
+
+ src/hb-ot-map.cc   | 3 ++-
+ src/hb-ot-map.hh   | 4 +++-
+ src/hb-ot-shape.cc | 7 ++++++-
+ 3 files changed, 11 insertions(+), 3 deletions(-)
+
+commit c2a75e07e54314f6c611dda0f050ed5f09909e43
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Jan 25 14:22:03 2018 -0500
+
+    Implement 'rand'
+
+ src/hb-ot-layout-gsub-table.hh | 19 ++++++++++++-------
+ src/hb-ot-layout-gsubgpos.hh   |  8 ++++++++
+ src/hb-ot-layout.cc            |  8 ++++++++
+ src/hb-ot-map.cc               |  7 +++++--
+ src/hb-ot-map.hh               |  4 +++-
+ src/hb-ot-shape.cc             |  1 +
+ 6 files changed, 37 insertions(+), 10 deletions(-)
+
+commit c6f75c3049685440d166bd4169b36abac2df4fdd
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Sep 10 17:02:31 2018 -0700
+
+    fix build attempt
+
+ src/hb-ot-cff1-table.hh | 70
+ ++++++++++++++++++++++++-------------------------
+ src/hb-subset-cff1.cc   | 16 +++++------
+ 2 files changed, 43 insertions(+), 43 deletions(-)
+
+commit 96471fe8593575deceb44d3757c227f65f10a25e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 01:39:23 2018 +0200
+
+    [uniscribe] Fix build
+
+ src/hb-uniscribe.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cc52e53cf0cb76809145ae7407a8b613e9e61153
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Sep 10 16:27:49 2018 -0700
+
+    Removed unused subr subset code
+
+ src/hb-subset-cff-common.hh | 98
+ ++-------------------------------------------
+ src/hb-subset-cff1.cc       | 92
+ +++++-------------------------------------
+ src/hb-subset-cff2.cc       | 90
+ ++++-------------------------------------
+ 3 files changed, 22 insertions(+), 258 deletions(-)
+
+commit becd84aa2f2902ea9d2d1677b28945e103a68816
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 01:26:18 2018 +0200
+
+    Add HB_FEATURE_GLOBAL_START/END
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1141
+
+    New API:
+    HB_FEATURE_GLOBAL_START
+    HB_FEATURE_GLOBAL_END
+
+ docs/harfbuzz-sections.txt |  2 ++
+ src/hb-common.cc           |  4 ++--
+ src/hb-common.h            | 13 +++++++++++++
+ 3 files changed, 17 insertions(+), 2 deletions(-)
+
+commit 13a8786c7c580651d8a6db9345b9aa85ca8ed956
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 01:07:06 2018 +0200
+
+    Add (unused) hb_array_t<>
+
+ src/hb-dsalgs.hh | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+commit bccf3e1827eec07433340eea705597201b6d0a32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 11 01:04:50 2018 +0200
+
+    Minor
+
+ src/hb-open-type.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit dff2c45f1e2a30767f6813d3cb6a70978d98d424
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 23:29:26 2018 +0200
+
+    Port rest from VAR to UnsizedArrayOf<>
+
+ src/hb-aat-layout-common.hh     | 14 +++++++-------
+ src/hb-aat-layout-morx-table.hh | 16 ++++++++--------
+ src/hb-open-type.hh             | 10 +++++-----
+ src/hb-ot-cmap-table.hh         |  8 +++++---
+ src/hb-ot-color-cbdt-table.hh   | 16 ++++++++--------
+ src/hb-ot-glyf-table.hh         | 10 +++++-----
+ src/hb-ot-hdmx-table.hh         | 30 +++++++++++++-----------------
+ src/hb-ot-hmtx-table.hh         |  8 ++++----
+ src/hb-ot-kern-table.hh         | 20 ++++++++++----------
+ src/hb-ot-layout-common.hh      |  9 +++++----
+ src/hb-ot-layout-gpos-table.hh  | 26 +++++++++++++-------------
+ src/hb-ot-math-table.hh         | 36 +++++++++++++++++++-----------------
+ src/hb-ot-maxp-table.hh         |  2 +-
+ src/hb-ot-name-table.hh         | 13 +++++++------
+ src/hb-ot-post-table.hh         |  5 +++--
+ 15 files changed, 113 insertions(+), 110 deletions(-)
+
+commit 1666b89e300c86347dc82131423463cbfed8cc0f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Sep 10 16:00:20 2018 -0700
+
+    subset CFF1 String Index
+
+    Repurposed FDMap as Remap then subclassed for remapping SIDs
+    misc code cleanup
+
+ src/hb-cff-interp-common.hh      |   2 -
+ src/hb-cff-interp-dict-common.hh |  12 +-
+ src/hb-ot-cff-common.hh          |  96 +++++++++--
+ src/hb-ot-cff1-table.hh          | 251 +++++++++++++++++++----------
+ src/hb-ot-cff2-table.hh          |  12 +-
+ src/hb-subset-cff-common.cc      |  24 +--
+ src/hb-subset-cff-common.hh      |  20 ++-
+ src/hb-subset-cff1.cc            | 334
+ ++++++++++++++++++++++++++++++++-------
+ src/hb-subset-cff2.cc            |   8 +-
+ 9 files changed, 565 insertions(+), 194 deletions(-)
+
+commit 9507b05a7a65962d5d02eb424e4f5d8570976f4e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 23:18:07 2018 +0200
+
+    Simplify sanitize->check_array()
+
+    Fix a bug in CBDT sanitize, and redundant check in avar.
+
+ src/hb-aat-layout-common.hh     | 10 ++++------
+ src/hb-aat-layout-morx-table.hh |  2 +-
+ src/hb-machinery.hh             |  3 ++-
+ src/hb-open-type.hh             |  6 +++---
+ src/hb-ot-color-cbdt-table.hh   |  4 ++--
+ src/hb-ot-kern-table.hh         |  2 +-
+ src/hb-ot-layout-common.hh      |  2 +-
+ src/hb-ot-layout-gpos-table.hh  |  8 ++++----
+ src/hb-ot-layout-gsubgpos.hh    |  4 ++--
+ src/hb-ot-math-table.hh         |  8 ++------
+ src/hb-ot-name-table.hh         |  2 +-
+ src/hb-ot-var-avar-table.hh     |  4 ++--
+ src/hb-ot-var-fvar-table.hh     |  2 +-
+ src/hb-ot-var-hvar-table.hh     |  2 +-
+ src/hb-ot-var-mvar-table.hh     |  2 +-
+ 15 files changed, 28 insertions(+), 33 deletions(-)
+
+commit bc485a98122131efc4768fef9147823f2bce146b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 23:02:24 2018 +0200
+
+    Port some VAR arrays to UnsizedArrayOf<>
+
+    Fix avar sanitize().
+
+ src/hb-ot-layout-gsubgpos.hh | 59
+ +++++++++++++++++++++++---------------------
+ src/hb-ot-var-avar-table.hh  | 10 +++++---
+ src/hb-ot-var-fvar-table.hh  |  7 +++---
+ src/hb-ot-var-hvar-table.hh  |  9 ++++---
+ src/hb-ot-var-mvar-table.hh  |  9 ++++---
+ 5 files changed, 51 insertions(+), 43 deletions(-)
+
+commit 1bc7a8d6c4deb9fa6e010d7be08b68cad88579ae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 22:51:26 2018 +0200
+
+    [indic] Cache hb_options().uniscribe_bug_compatible on indic_plan
+
+ src/hb-ot-shape-complex-indic.cc | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+commit 24f1d9622489a016904314a5d4e3c637da2e1c77
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 18:19:37 2018 +0200
+
+    Unbreak HB_OPTIONS
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1154
+
+ src/hb-debug.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit e46c51f1e985ac9c0ffa90fda4ea436d54b4009c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 17:38:19 2018 +0200
+
+    [indic] Do NOT allow matra after Halant,ZWJ
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/556
+
+    Devanagari regresses 12 tests, and Gujarati 2.  See:
+
+      https://github.com/harfbuzz/harfbuzz/issues/556#issuecomment-419957472
+
+    New numbers:
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707299 out of 707394 tests passed. 95 failed (0.0134296%)
+    GUJARATI: 366353 out of 366457 tests passed. 104 failed (0.0283799%)
+    GURMUKHI: 60729 out of 60747 tests passed. 18 failed (0.0296311%)
+    KANNADA: 951300 out of 951913 tests passed. 613 failed (0.0643966%)
+    MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed
+    (0.0188871%)
+    ORIYA: 42327 out of 42329 tests passed. 2 failed (0.00472489%)
+    SINHALA: 271596 out of 271847 tests passed. 251 failed (0.0923313%)
+    TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+ src/hb-ot-shape-complex-indic-machine.hh | 1688
+ ++++++++++++++----------------
+ src/hb-ot-shape-complex-indic-machine.rl |    2 +-
+ 2 files changed, 784 insertions(+), 906 deletions(-)
+
+commit 5dfd6e07626a9022a995eb7fa16767eff66c6047
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 15:45:32 2018 +0200
+
+    Fix sanitize or Context Rule
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1110
+
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 20a11a824d2a07a8544649477ad03e809bdd8e19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 13:56:28 2018 +0200
+
+    Revert "[subset] Disable GSUB/GPOS subsetting for now"
+
+    This reverts commit 616fd34a69bb69bc35c7e4ea939e71c3ea2e92cb.
+
+ src/hb-subset.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 54d332dd9b0263821376161cdffb60ffb3c7847f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 11:37:24 2018 +0200
+
+    1.9.0
+
+ NEWS             | 19 +++++++++++++++++++
+ configure.ac     |  2 +-
+ src/hb-face.cc   | 10 +++++-----
+ src/hb-unicode.h |  5 +++++
+ src/hb-version.h |  6 +++---
+ 5 files changed, 33 insertions(+), 9 deletions(-)
+
+commit 616fd34a69bb69bc35c7e4ea939e71c3ea2e92cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 11:19:49 2018 +0200
+
+    [subset] Disable GSUB/GPOS subsetting for now
+
+    So I can get a release out.  I haven't debugged those yet, and they
+    are producing bad tables.
+
+ src/hb-subset.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d42f0e5809964136911cbbd845bc423a8dfd5e31
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 11:05:33 2018 +0200
+
+    [atomic] Fix pointer type passed to InterlockedExchangeAdd()
+
+    John Emmas reported on mailing list that build with MSVC is failing.
+    Not sure why bots don't catch it, but this should fix.
+
+ src/hb-atomic.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit fda994e1d45c4d34601af7272f37ea257f92a3d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 7 15:02:57 2018 -0400
+
+    Use enum instead of "static const" in class scope
+
+    Technically, static const needs an out-of-class definition.  Eg:
+
+      CXXLD    libharfbuzz-subset.la
+    Undefined symbols for architecture x86_64:
+      "OT::FeatureVariationRecord::min_size", referenced from:
+          bool OT::GSUBGPOS::subset<OT::PosLookup>(hb_subset_context_t*)
+          constin libharfbuzz_subset_la-hb-subset.o
+          bool OT::GSUBGPOS::subset<OT::SubstLookup>(hb_subset_context_t*)
+          constin libharfbuzz_subset_la-hb-subset.o
+      "OT::Record<OT::LangSys>::min_size", referenced from:
+          OT::Script::subset(hb_subset_context_t*) constin
+          libharfbuzz_subset_la-hb-subset.o
+      "OT::IntType<unsigned short, 2u>::min_size", referenced from:
+          OT::Script::subset(hb_subset_context_t*) constin
+          libharfbuzz_subset_la-hb-subset.o
+          OT::RecordListOf<OT::Feature>::subset(hb_subset_context_t*)
+          const  in libharfbuzz_subset_la-hb-subset.o
+    ld: symbol(s) not found for architecture x86_64
+    collect2: ld returned 1 exit status
+    make[4]: *** [libharfbuzz-subset.la] Error 1
+    make[3]: *** [all-recursive] Error 1
+    make[2]: *** [all] Error 2
+    make[1]: *** [all-recursive] Error 1
+    make: *** [all] Error 2
+    Exited with code 2
+
+ src/hb-buffer.hh           |  2 +-
+ src/hb-machinery.hh        |  8 ++++----
+ src/hb-open-file.hh        |  2 +-
+ src/hb-open-type.hh        |  2 +-
+ src/hb-ot-layout-common.hh |  2 +-
+ src/hb-ot-layout.cc        |  4 ++--
+ src/hb-set-digest.hh       |  4 ++--
+ src/hb-set.hh              | 12 ++++++------
+ 8 files changed, 18 insertions(+), 18 deletions(-)
+
+commit 1e88b1755c37eaa171c08f7bedb93f110238c80f
+Merge: 22b88632 ebe67137
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Sep 7 10:50:55 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit ebe67137ab3559c2c6aaf53442ca223cb34df5af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 7 10:46:13 2018 -0400
+
+    Try fixing bots
+
+ src/hb-ot-layout-common.hh | 32 ++++++++++++++++++--------------
+ 1 file changed, 18 insertions(+), 14 deletions(-)
+
+commit 5f17dbc3025093308d2191a4abd2eec24db35c0e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 7 10:24:22 2018 -0400
+
+    [subset] Fix div-by-zero
+
+ src/hb-subset.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 22b88632d5bd3676642b0a1d93f27e47438c140b
+Merge: 2a74536a 21bf1470
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Sep 6 22:27:44 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit 2a74536aae443a8b7f23ed018dec14a013c04dfe
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Sep 6 18:26:13 2018 -0700
+
+    fix build attempt ^2
+
+    Added hb-ot-cff1-table.cc to hb-subset sources
+    Deleted unused variable (charset)
+
+ src/Makefile.sources  | 1 +
+ src/hb-subset-cff1.cc | 1 -
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 55268df9d4b287883c8266e316cda44f4011f424
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Sep 6 17:56:05 2018 -0700
+
+    fix build attempt
+
+    Added HB_INTERNAL to static funtion declarations
+
+ src/hb-ot-cff1-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit aca73c9df2054f62cf10a5c27bc5fa7823747f8b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Sep 6 17:28:15 2018 -0700
+
+    subset CFF1 Encoding & Charset
+
+    fixed misc Charset bugs
+    added source file hb-ot-cff1.table.cc
+    renamed things for clarity & consistency
+
+ src/Makefile.sources             |   1 +
+ src/hb-cff-interp-dict-common.hh |  15 +-
+ src/hb-ot-cff-common.hh          |  34 ++--
+ src/hb-ot-cff1-table.cc          | 130 +++++++++++++
+ src/hb-ot-cff1-table.hh          | 403
+ ++++++++++++++++++++++++++++++++-------
+ src/hb-ot-cff2-table.hh          |  24 +--
+ src/hb-subset-cff1.cc            | 247 ++++++++++++++++++++----
+ src/hb-subset-cff2.cc            |  30 +--
+ 8 files changed, 737 insertions(+), 147 deletions(-)
+
+commit 21bf147054f6b5bd1c430c0e02a8c4058ed229a1
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Sep 5 18:04:52 2018 -0700
+
+    [subset] Fix hdmx subsetted size calculation.
+
+ src/hb-ot-hdmx-table.hh                         |  14 ++++++++++----
+ test/api/fonts/Roboto-Regular.multihdmx.a.ttf   | Bin 0 -> 2052 bytes
+ test/api/fonts/Roboto-Regular.multihdmx.abc.ttf | Bin 0 -> 2468 bytes
+ test/api/test-subset-hdmx.c                     |  20
+ ++++++++++++++++++++
+ 4 files changed, 30 insertions(+), 4 deletions(-)
+
+commit 1e6599f59680c81356b2e9ddddb61252490337a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 5 19:29:42 2018 -0700
+
+    Fix older compilers re '>>' at nested template declarations
+
+ src/hb-ot-layout-gsub-table.hh | 8 ++++----
+ src/hb-subset.cc               | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit a1e5e07c735091e82d66ac56a4e27341f589369d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 5 16:24:28 2018 -0700
+
+    [subset] Hook up GSUB/GPOS, but still disabled
+
+    They are still in the drop list.
+
+ src/hb-ot-hdmx-table.hh |  3 +-
+ src/hb-subset.cc        | 75
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 77 insertions(+), 1 deletion(-)
+
+commit 0d160d5ff5158fd4190201becd652c8f28ef4430
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 3 20:50:11 2018 -0700
+
+    [subset] Implement subsetting of SingleSubst
+
+ src/hb-machinery.hh            |  2 ++
+ src/hb-null.hh                 | 43 +++++++++++++++++++-----------
+ src/hb-ot-layout-gsub-table.hh | 59
+ +++++++++++++++++++++++++++++++++++-------
+ src/hb-vector.hh               |  2 ++
+ 4 files changed, 81 insertions(+), 25 deletions(-)
+
+commit 5ea03d2951375bfcc1258c2c0b5c33efc6ebf7f8
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Sep 4 11:29:15 2018 -0700
+
+    fix build by untemplatizing DictOpSet & DictVal
+
+    as they aren't instantiated with BlendArg (yet)
+
+ src/hb-cff-interp-dict-common.hh | 21 +++++++++------------
+ src/hb-cff2-interp-cs.hh         |  1 -
+ src/hb-ot-cff1-table.hh          |  8 ++++----
+ src/hb-ot-cff2-table.hh          | 16 ++++++++--------
+ src/hb-subset-cff-common.hh      |  4 ++--
+ 5 files changed, 23 insertions(+), 27 deletions(-)
+
+commit f2d299b0b75fd110cdc6b16de31e7212e292cc14
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Sep 4 10:25:21 2018 -0700
+
+    Drop hints from CFF2 charstrings
+
+    Templatized ArgStack so it may store the default value along with
+    blend deltas as BlendArg while parsing blend operator arguments in
+    CFF2 charstring
+    Added get_region_count() method to VarRegionList & VariationStore
+
+ src/hb-cff-interp-common.hh | 67 +++++++++++++++++++++++++++------
+ src/hb-cff1-interp-cs.hh    |  5 ++-
+ src/hb-cff2-interp-cs.hh    | 91
+ +++++++++++++++++++++++++++++++++++++++------
+ src/hb-ot-cff2-table.hh     | 22 ++++++-----
+ src/hb-ot-layout-common.hh  |  6 +++
+ src/hb-subset-cff-common.hh | 60 ++++++++++++++++--------------
+ src/hb-subset-cff1.cc       |  5 ++-
+ src/hb-subset-cff2.cc       | 54 ++++++++++++++++++++++-----
+ 8 files changed, 235 insertions(+), 75 deletions(-)
+
+commit 3f00d0b0df14d69859b15568ff28a810d08f59ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 3 18:54:32 2018 -0700
+
+    [subset] Keep glyph set in plan
+
+    Should remove the vector version at some point...
+
+ src/hb-subset-plan.cc | 19 ++++++++++---------
+ src/hb-subset-plan.hh |  3 +--
+ 2 files changed, 11 insertions(+), 11 deletions(-)
+
+commit dc50493a8da05d6561242136d63cae836486c150
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 3 18:23:23 2018 -0700
+
+    [subset] Towards subsetting SingleSubstFormat1
+
+    Why does subset plan not have a hb_set_t of glyphs?
+
+ src/hb-machinery.hh            | 10 +++++++++-
+ src/hb-ot-layout-gsub-table.hh | 12 +++++++++++-
+ 2 files changed, 20 insertions(+), 2 deletions(-)
+
+commit 339d3603b916cebf24ff86d9842b766261e1b262
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 3 17:33:34 2018 -0700
+
+    [subset] Wire up subset() call down to subtables
+
+ src/hb-ot-layout-common.hh     | 36 +++++++++++++++++++++++
+ src/hb-ot-layout-gpos-table.hh | 67
+ +++++++++++++++++++++++++++++++++++++++---
+ src/hb-ot-layout-gsub-table.hh | 54 ++++++++++++++++++++++++++++------
+ src/hb-ot-layout-gsubgpos.hh   | 42 ++++++++++++++++++++++++++
+ 4 files changed, 186 insertions(+), 13 deletions(-)
+
+commit 7b2ef551da0d53cd94106035b1f065a759cf3cd5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 3 17:16:09 2018 -0700
+
+    Templatize Lookup::sanitize()
+
+ src/hb-ot-layout-common.hh     | 40
+ ++++++++++++++++++++++++++++------------
+ src/hb-ot-layout-gpos-table.hh |  7 ++-----
+ src/hb-ot-layout-gsub-table.hh | 25 +++----------------------
+ 3 files changed, 33 insertions(+), 39 deletions(-)
+
+commit 9c3747c5e50423e0a7202f249728d5c5b2b09073
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 3 16:53:03 2018 -0700
+
+    [subset] More
+
+ src/hb-ot-layout-gpos-table.hh | 10 +++++----
+ src/hb-ot-layout-gsub-table.hh | 48
+ +++++++++++++++++++++---------------------
+ src/hb-ot-layout-gsubgpos.hh   | 22 +++++++++++++------
+ 3 files changed, 45 insertions(+), 35 deletions(-)
+
+commit 6d618522d63a94230ad708fc49c1c73927da0137
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 3 16:41:28 2018 -0700
+
+    Templatize GSUBGPOS::sanitize()
+
+ src/hb-ot-layout-gpos-table.hh |  6 +-----
+ src/hb-ot-layout-gsub-table.hh | 14 +++++---------
+ src/hb-ot-layout-gsubgpos.hh   |  4 +++-
+ 3 files changed, 9 insertions(+), 15 deletions(-)
+
+commit 49c44b58f6c2536ea5f403c54a40cab41b905150
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 3 16:37:17 2018 -0700
+
+    [subset] Fix serialize_subset() calls
+
+    Ouch.
+
+ src/hb-open-type.hh            |  2 +-
+ src/hb-ot-layout-common.hh     |  6 +++---
+ src/hb-ot-layout-gsub-table.hh | 13 ++++++-------
+ src/hb-ot-layout-gsubgpos.hh   |  6 +++---
+ 4 files changed, 13 insertions(+), 14 deletions(-)
+
+commit 7c9cfa2b4002c18585a26134ab987ceb7ebc97a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 2 19:47:50 2018 -0700
+
+    Add intersects() method to GSUB/GPOS lookups
+
+ src/hb-ot-layout-common.hh     |  77 +++++++++--
+ src/hb-ot-layout-gpos-table.hh | 103 ++++++++++----
+ src/hb-ot-layout-gsub-table.hh | 205 +++++++++++++++++++--------
+ src/hb-ot-layout-gsubgpos.hh   | 306
+ ++++++++++++++++++++++++++++++++---------
+ 4 files changed, 528 insertions(+), 163 deletions(-)
+
+commit 61ce62e55455bb0d6c9db3b076676ab18e51d449
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 2 17:00:27 2018 -0700
+
+    [subset] Minor
+
+    Remove Lookup::subset().
+
+ src/hb-ot-layout-common.hh   | 11 -----------
+ src/hb-ot-layout-gsubgpos.hh |  2 +-
+ 2 files changed, 1 insertion(+), 12 deletions(-)
+
+commit bfa72a9a72a15d977f503f12eef376a355679d76
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 1 18:34:50 2018 -0700
+
+    [subset] Towards GSUB/GPOS subsetting
+
+    Add subset() call for GSUBGPOS struct and its dependencies.
+    Not hooked up anywhere.
+
+ src/hb-machinery.hh            | 10 ++++--
+ src/hb-open-type.hh            | 25 ++++++++++++-
+ src/hb-ot-layout-common.hh     | 80
+ +++++++++++++++++++++++++++++++++++-------
+ src/hb-ot-layout-gdef-table.hh | 33 ++++++++++-------
+ src/hb-ot-layout-gsub-table.hh | 11 ++++--
+ src/hb-ot-layout-gsubgpos.hh   | 19 ++++++++++
+ 6 files changed, 145 insertions(+), 33 deletions(-)
+
+commit 6803ed8674028a656957910381150ab28d75a5f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 31 17:11:08 2018 -0700
+
+    [serialize] Add reset()
+
+ src/hb-machinery.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit e58b190292f85c9676fe14cf63d2831d4d6e6bab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 31 16:46:35 2018 -0700
+
+    [subset] De-templatize hb_subset_context_t
+
+    We're going to (finally) use virtual methods for
+    hb_serialize_context_t
+    customization, so don't need to carry a Serializer template variable
+    around...  Simplifies code.
+
+ src/hb-machinery.hh            | 2 +-
+ src/hb-ot-layout-gsub-table.hh | 5 ++---
+ src/hb-subset.hh               | 7 +++----
+ 3 files changed, 6 insertions(+), 8 deletions(-)
+
+commit 22acd424ca77c16d28405021f06c5562497920ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 31 16:38:04 2018 -0700
+
+    [serialize] Add a couple small methods
+
+ src/hb-machinery.hh            | 25 +++++++++++++++++--------
+ src/hb-open-file.hh            |  3 +--
+ src/hb-ot-layout-gsub-table.hh |  1 +
+ 3 files changed, 19 insertions(+), 10 deletions(-)
+
+commit d1f29908c281b1685eea00b71bae934d9f1f20eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 31 16:31:00 2018 -0700
+
+    [subset] Add hb_subset_context_t<>
+
+ src/hb-open-type.hh            |  1 +
+ src/hb-ot-cmap-table.hh        |  1 -
+ src/hb-ot-hdmx-table.hh        |  1 -
+ src/hb-ot-hmtx-table.hh        |  1 -
+ src/hb-ot-layout-gsub-table.hh |  9 +++++++++
+ src/hb-ot-maxp-table.hh        |  1 -
+ src/hb-ot-os2-table.hh         |  1 -
+ src/hb-ot-post-table.hh        |  1 -
+ src/hb-subset.hh               | 21 +++++++++++++++++++++
+ 9 files changed, 31 insertions(+), 6 deletions(-)
+
+commit fcf177885b4c3d732ffeb82936da906969a269d3
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Aug 31 16:28:47 2018 -0700
+
+    templatized ArgStack as a prep to store blends
+
+ src/hb-cff-interp-common.hh      | 46
+ +++++++++++++++++++++---------------
+ src/hb-cff-interp-cs-common.hh   | 41 ++++++++++++++++++--------------
+ src/hb-cff-interp-dict-common.hh | 35 ++++++++++++++++-----------
+ src/hb-cff1-interp-cs.hh         | 15 +++++++-----
+ src/hb-cff2-interp-cs.hh         | 14 +++++++----
+ src/hb-ot-cff1-table.hh          | 32 ++++++++++++-------------
+ src/hb-ot-cff2-table.hh          | 51
+ ++++++++++++++++++++++++++--------------
+ src/hb-subset-cff-common.hh      |  4 ++--
+ src/hb-subset-cff1.cc            |  1 -
+ src/hb-subset-cff2.cc            |  2 +-
+ 10 files changed, 142 insertions(+), 99 deletions(-)
+
+commit 968168bf0e369927cd6a7f63608d844abe123a7b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Aug 31 13:28:16 2018 -0700
+
+    drop hints from CFF1 charstrings
+
+    renamed confusing Stack.size to Stack.count
+
+ src/hb-cff-interp-common.hh      |  43 +++++++-----
+ src/hb-cff-interp-cs-common.hh   | 140
+ +++++++++++++++++----------------------
+ src/hb-cff-interp-dict-common.hh |   4 +-
+ src/hb-cff1-interp-cs.hh         |  14 ++--
+ src/hb-cff2-interp-cs.hh         |  18 ++---
+ src/hb-ot-cff1-table.hh          |  26 ++++----
+ src/hb-ot-cff2-table.hh          |  20 +++---
+ src/hb-subset-cff1.cc            |  53 ++++++++-------
+ src/hb-subset-cff2.cc            |  69 +++++++++----------
+ 9 files changed, 190 insertions(+), 197 deletions(-)
+
+commit aba0a945c5f8724cc7bd1a9b7f7b5df1c64b03f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 31 13:25:19 2018 -0700
+
+    [subset] Add hb-subset-input.hh and make hb-subset.hh toplevel include
+
+ src/Makefile.sources    |  1 +
+ src/hb-ot-cmap-table.hh |  2 +-
+ src/hb-ot-glyf-table.hh |  2 --
+ src/hb-ot-hdmx-table.hh |  2 +-
+ src/hb-ot-hmtx-table.hh |  2 +-
+ src/hb-ot-maxp-table.hh |  2 +-
+ src/hb-ot-os2-table.hh  |  2 +-
+ src/hb-ot-post-table.hh |  2 +-
+ src/hb-subset-glyf.cc   |  1 -
+ src/hb-subset-glyf.hh   |  2 +-
+ src/hb-subset-input.hh  | 57
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset-plan.cc   |  3 +--
+ src/hb-subset-plan.hh   |  2 +-
+ src/hb-subset.cc        |  3 +--
+ src/hb-subset.hh        | 23 +++-----------------
+ 15 files changed, 71 insertions(+), 35 deletions(-)
+
+commit 18d01eac7f2870e2804ceed2c70a604a5dc6a320
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 31 13:00:57 2018 -0700
+
+    Minor
+
+ src/hb-ot-shape-complex-arabic-fallback.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 8c5e03b5415f83312719ebb3cd284229e52a4843
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Aug 30 17:21:56 2018 -0700
+
+    Added drop_hints to SubrFlattener
+
+ src/hb-cff-interp-cs-common.hh | 20 +++++++++++++++++++-
+ src/hb-subset-cff-common.hh    | 18 ++++++++++++++----
+ src/hb-subset-cff1.cc          | 35 ++++++++++++++++++++++------------
+ src/hb-subset-cff2.cc          | 43
+ ++++++++++++++++++++++++++----------------
+ 4 files changed, 83 insertions(+), 33 deletions(-)
+
+commit a23b892fe6cc4859a30edc7ffc003ab7624aa5f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 29 18:28:39 2018 -0700
+
+    Shuffle
+
+ src/hb-machinery.hh | 62
+ +++++++++++++++++++++++++++--------------------------
+ 1 file changed, 32 insertions(+), 30 deletions(-)
+
+commit 93fe0faaee45b8fb646f7aa33620105c62193885
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 29 18:24:03 2018 -0700
+
+    [subset] Clean up hb_subset_input_t API
+
+ src/hb-subset-input.cc           | 44
+ +++++++++++++++++++---------------------
+ src/hb-subset-plan.cc            |  4 ++--
+ src/hb-subset-plan.hh            | 10 ++++-----
+ src/hb-subset.cc                 |  2 +-
+ src/hb-subset.h                  | 14 +++++++++----
+ src/hb-subset.hh                 |  4 ++--
+ test/api/test-subset-glyf.c      | 10 ++++-----
+ test/fuzzing/hb-subset-fuzzer.cc | 10 ++++-----
+ util/hb-subset.cc                |  3 +--
+ 9 files changed, 52 insertions(+), 49 deletions(-)
+
+commit 9fd08cc238f8e2f7be1eaefca110021382efe606
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 29 18:18:18 2018 -0700
+
+    CFF2 subroutine flattner
+
+    Factored out CFF1 & CFF2 common subsetting code in
+    hb-subset-cff-common.hh
+
+ src/hb-cff2-interp-cs.hh    |  34 +++++--
+ src/hb-subset-cff-common.hh | 154 +++++++++++++++++++++++++++++
+ src/hb-subset-cff1.cc       | 135 +++-----------------------
+ src/hb-subset-cff2.cc       | 229
+ ++++++++++++++++++--------------------------
+ 4 files changed, 285 insertions(+), 267 deletions(-)
+
+commit d237ce71810045ee400c52740cd8ab6e1113aada
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 29 18:13:07 2018 -0700
+
+    [subset] Bail if subsetting a table failed
+
+ src/hb-subset.cc | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit f39166f0c0c09fac7874fda6b0b0825f20768e3e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 29 18:09:55 2018 -0700
+
+    [subset] Remove unused hb_subset_profile_t
+
+    We might reintroduce it later, but for now remove, as it was unused.
+    Some things that should have been in this object (drop_hints, etc)
+    are already in hb_subset_input_t.  So, for now, keep everything there.
+
+ src/hb-subset-plan.cc            |  3 +--
+ src/hb-subset-plan.hh            |  1 -
+ src/hb-subset.cc                 | 39
+ +++------------------------------------
+ src/hb-subset.h                  | 16 +---------------
+ test/api/hb-subset-test.h        |  4 +---
+ test/api/test-subset-hdmx.c      |  8 ++------
+ test/api/test-subset-hmtx.c      |  4 +---
+ test/api/test-subset.c           | 12 +++---------
+ test/fuzzing/hb-subset-fuzzer.cc |  5 +----
+ util/hb-subset.cc                |  4 +---
+ 10 files changed, 14 insertions(+), 82 deletions(-)
+
+commit 2ccc322cf88a01248aa5df88a5073db3dfb40eea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 29 16:38:04 2018 -0700
+
+    [ot-font] Clean up cmap with gid=0
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1145
+
+ src/hb-ot-cmap-table.hh | 25 +++++++++++++++----------
+ 1 file changed, 15 insertions(+), 10 deletions(-)
+
+commit 0c7b633f528bae4a0cf5ca816f75a0d84206b3fb
+Author: Ross Burton <ross@burtonini.com>
+Date:   Wed Aug 29 22:37:39 2018 +0100
+
+    Delete pkg.m4
+
+    pkg.m4 is provided by pkg-config, which is a requirement to build,
+    and this copy is ancient.  Delete it to avoid it being used instead
+    of the host copy.
+
+ m4/pkg.m4 | 157
+ --------------------------------------------------------------
+ 1 file changed, 157 deletions(-)
+
+commit b95bf075d7b62baf7d6fa1d8f0d1f16fad934975
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 29 14:41:52 2018 -0700
+
+    fix build attempt ^2
+
+ src/hb-subset-cff1.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 1d1afddfd21155ef136c2d96b1d6c286bdc8925f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 29 13:36:39 2018 -0700
+
+    corrected preprocessor guards
+
+ src/hb-cff-interp-common.hh      | 6 +++---
+ src/hb-cff-interp-cs-common.hh   | 6 +++---
+ src/hb-cff-interp-dict-common.hh | 6 +++---
+ src/hb-ot-cff-common.hh          | 6 +++---
+ src/hb-subset-cff-common.hh      | 6 +++---
+ 5 files changed, 15 insertions(+), 15 deletions(-)
+
+commit 8af9690ac7ce41fb1db878d556df5c4ee624eaa0
+Merge: 0ad081ec fee0f41c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 29 13:26:17 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+    Renamed cff "private" source/headers without the suffix
+
+commit 0ad081ec324e734cfca60d4d2c36a1be5bc8a067
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 29 12:56:48 2018 -0700
+
+    attempt to fix build failure
+
+ src/hb-subset-cff1.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a11420b48c405e1a43e2ba62893e9a0872e5f496
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 29 12:14:30 2018 -0700
+
+    Subroutine flattener for CFF1
+
+    Subr-flattened charstrings are temporarily re-encoded in ByteStrBuff
+    during "plan" phase, then copied to hb_serialize_context_t during
+    "write" phase
+
+    CSOpSet may callback opcode processing "virtual" functions via CRTP
+
+    Numer struct may store a value as fixed optionally in addition to
+    int and float
+
+ src/hb-cff-interp-common-private.hh    |  53 ++++++++++--
+ src/hb-cff-interp-cs-common-private.hh | 109 ++++++++++++++++++-----
+ src/hb-cff1-interp-cs.hh               |  35 +++++---
+ src/hb-cff2-interp-cs.hh               |  14 +--
+ src/hb-ot-cff-common-private.hh        |  10 +--
+ src/hb-subset-cff-common-private.hh    | 102 +++++++++++++++++++++-
+ src/hb-subset-cff1.cc                  | 152
+ ++++++++++++++++++++++-----------
+ src/hb-subset-cff2.cc                  |   7 +-
+ 8 files changed, 372 insertions(+), 110 deletions(-)
+
+commit fee0f41c6c1e50621d10b07802ca36a9b295b53d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 28 18:27:41 2018 -0700
+
+    Don't declare extern symbols as inline
+
+    clang -O3 was completely removing _get_gdef(), causing link
+    failure when needed from another compilation unit.  Surprisingly,
+    "extern inline" didn't fix it.
+
+ src/hb-ot-layout.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 967741e4c468ebf0a40f91934ed1923506099806
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 28 18:18:02 2018 -0700
+
+    Add explicit to hb_auto_t 1param constructors
+
+ src/hb-dsalgs.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit c0a3f38f78362a183b30afd109dcebfca563d144
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 28 17:22:38 2018 -0700
+
+    Fix distcheck
+
+ src/Makefile.sources | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 2dde6c803a9e50c5bff74095187b0cb2e12eebdd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 28 11:02:00 2018 -0700
+
+    Explicitly pass reference in hb_auto_t constructor
+
+    Fixes clang bots as well as fuzzer issue.
+
+ src/hb-dsalgs.hh | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit a26806801005c28115ae9e48bdcf3bbbc1bcd767
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 15:18:46 2018 -0700
+
+    [ot-face] Remove tables_t. The face_data_t is what tables_t was
+
+ src/hb-aat-layout.cc |  4 ++--
+ src/hb-face.cc       |  6 +++---
+ src/hb-ot-face.cc    |  8 ++++----
+ src/hb-ot-face.hh    | 28 ++++++++++++----------------
+ src/hb-ot-font.cc    | 25 +++++++++++--------------
+ src/hb-ot-layout.cc  | 36 ++++++++++++++++++------------------
+ src/hb-ot-math.cc    |  4 ++--
+ src/hb-ot-var.cc     |  4 ++--
+ 8 files changed, 54 insertions(+), 61 deletions(-)
+
+commit 3a0b3a29cc246d0b1e5989c9e8c1e6d544046dcc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 15:11:24 2018 -0700
+
+    Free up hb-ot-face.hh from includes
+
+    There might be a better way to do this, but I couldn't find...
+
+ src/hb-face.cc                 |  1 +
+ src/hb-ot-cmap-table.hh        |  1 +
+ src/hb-ot-color-cbdt-table.hh  |  2 ++
+ src/hb-ot-face.cc              | 10 ++++++++++
+ src/hb-ot-face.hh              | 15 ++-------------
+ src/hb-ot-font.cc              |  7 +++++++
+ src/hb-ot-glyf-table.hh        |  2 ++
+ src/hb-ot-hmtx-table.hh        |  3 +++
+ src/hb-ot-kern-table.hh        |  2 ++
+ src/hb-ot-layout-gdef-table.hh |  1 +
+ src/hb-ot-layout-gpos-table.hh |  2 ++
+ src/hb-ot-layout-gsub-table.hh |  1 +
+ src/hb-ot-post-table.hh        |  2 ++
+ 13 files changed, 36 insertions(+), 13 deletions(-)
+
+commit a84309afc8817cd386e555af21dfcdc03388b329
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 09:33:01 2018 -0700
+
+    [face] Use saved cmap in collect_unicodes() APIs
+
+ src/hb-face.cc | 18 ++++++++----------
+ 1 file changed, 8 insertions(+), 10 deletions(-)
+
+commit c624e18a24311c66737dde4ce515aa1eca892b94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 09:19:20 2018 -0700
+
+    [OT] Move code around
+
+ src/hb-ot-layout-gsub-table.hh | 18 ------------------
+ src/hb-ot-layout.cc            | 23 +++++++++++++++++++++--
+ 2 files changed, 21 insertions(+), 20 deletions(-)
+
+commit 399909468204b76769857508e74f802d648ca0a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 09:12:25 2018 -0700
+
+    [OT] Use relaxed ops for recursing into GSUB/GPOS lookups again
+
+ src/hb-ot-layout-gpos-table.hh |  4 ++--
+ src/hb-ot-layout-gsub-table.hh |  4 ++--
+ src/hb-ot-layout.cc            | 12 ++++++++++--
+ src/hb-ot-layout.hh            |  4 ++--
+ 4 files changed, 16 insertions(+), 8 deletions(-)
+
+commit d8c57e85d9981b4c7a11fae4f31100359574cf13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 09:03:31 2018 -0700
+
+    [GDEF] Move code around
+
+ src/hb-ot-layout-gdef-table.hh | 118 +-----------------------------------
+ src/hb-ot-layout.cc            | 134
+ ++++++++++++++++++++++++++++++++++++++---
+ src/hb-ot-layout.hh            |  14 +----
+ 3 files changed, 128 insertions(+), 138 deletions(-)
+
+commit 453e0c60b1c87d2cd2527d6d2de673f65458a9fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 01:30:52 2018 -0700
+
+    Add template keyword
+
+    I swear I have no idea why this is needed, but it is...
+
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c44b0caf0d0cddb7228dcec0b9d25bb62f641abc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 01:29:30 2018 -0700
+
+    Fixup
+
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4096fbe487d90de04020e32e8487295ecd4d8836
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 01:25:54 2018 -0700
+
+    [ot-face] Port GDEF to unified table accelerator model as well
+
+ src/hb-ot-face.cc              | 108 ----------------------------------
+ src/hb-ot-face.hh              |   2 +-
+ src/hb-ot-layout-gdef-table.hh | 129
+ +++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout.cc            |  14 ++++-
+ src/hb-ot-layout.hh            |   5 +-
+ 5 files changed, 147 insertions(+), 111 deletions(-)
+
+commit b929100f8782816c2621715f6c007ecefc419d83
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 01:15:47 2018 -0700
+
+    [ot-face] Unify GSUB/GPOS accelerators in the table accelerator
+    framework
+
+ src/hb-aat-layout.cc           |  4 +---
+ src/hb-ot-face.cc              | 40
+ ++--------------------------------------
+ src/hb-ot-face.hh              | 25 +++++++++++--------------
+ src/hb-ot-layout-gpos-table.hh |  2 +-
+ src/hb-ot-layout-gsub-table.hh |  6 +++---
+ src/hb-ot-layout-gsubgpos.hh   | 24 +++++++++++++-----------
+ src/hb-ot-layout.cc            | 33 +++++++++++++++++----------------
+ src/hb-ot-layout.hh            | 17 +++++++++++++++++
+ src/hb-ot-shape.cc             |  1 +
+ 9 files changed, 66 insertions(+), 86 deletions(-)
+
+commit 963413fc5454d92621ae83a8d9c9324e404b8166
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 00:47:55 2018 -0700
+
+    WIP
+
+ src/hb-ot-cmap-table.hh        |  1 -
+ src/hb-ot-face.hh              | 22 ----------------------
+ src/hb-ot-layout-gpos-table.hh |  2 ++
+ src/hb-ot-layout-gsub-table.hh |  2 ++
+ src/hb-ot-layout-gsubgpos.hh   | 31 ++++++++++++++++++++++++++++++-
+ src/hb-ot-layout.hh            | 18 +++++++++++++++++-
+ 6 files changed, 51 insertions(+), 25 deletions(-)
+
+commit e6cb9380651c753485f721bd3df523d03be41d91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 00:21:29 2018 -0700
+
+    [ot-face] Unify accelerators and tables
+
+ src/hb-machinery.hh     |  4 ++--
+ src/hb-ot-cmap-table.hh |  3 ++-
+ src/hb-ot-face.cc       |  6 +++--
+ src/hb-ot-face.hh       | 58
+ +++++++++++++------------------------------------
+ src/hb-ot-font.cc       |  6 ++---
+ 5 files changed, 26 insertions(+), 51 deletions(-)
+
+commit 7f8b6fe67d64b41786edbf8650efb1c0deba573f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 00:07:12 2018 -0700
+
+    Minor
+
+ src/hb-ot-face.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 59bca0d2cb6010bc237afb2255ccda3b8dd0585d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 00:06:12 2018 -0700
+
+    [ot-font] Rename
+
+ src/hb-ot-face.hh | 12 ++++++------
+ src/hb-ot-font.cc | 24 ++++++++++++------------
+ 2 files changed, 18 insertions(+), 18 deletions(-)
+
+commit 1c48a7ef06b82ef9ca013066d1fb3c6fda82aa0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 23:54:06 2018 -0700
+
+    [ot-font] Cache tables on face, not font
+
+ src/hb-ot-cmap-table.hh      |  1 +
+ src/hb-ot-face.cc            |  2 ++
+ src/hb-ot-face.hh            | 55 +++++++++++++++++++++++++++-----
+ src/hb-ot-font.cc            | 75
+ ++++----------------------------------------
+ src/hb-ot-layout-gsubgpos.hh |  1 +
+ src/hb-ot-layout.hh          |  1 -
+ 6 files changed, 58 insertions(+), 77 deletions(-)
+
+commit 71f8893eff56bff651e3df6288becc68ecea6cd1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 23:27:45 2018 -0700
+
+    [ot-font] Use init0
+
+ src/hb-ot-font.cc | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit f36ae6f8a82485bbf727f24dfd7da8f32002cad6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 23:19:34 2018 -0700
+
+    [ot-font] Make everything (cmap/metrics) lazy
+
+ src/hb-machinery.hh |  5 +++++
+ src/hb-ot-font.cc   | 51
+ ++++++++++++++++++++++++++-------------------------
+ 2 files changed, 31 insertions(+), 25 deletions(-)
+
+commit 62fc54725a3863473829f3a3748c9336e4dc0787
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 23:15:52 2018 -0700
+
+    [ot-font] Fallback vertical advance to UPEM
+
+    Used to be ascent+descent.  Whatever. This is more convenient for
+    upcoming changes.
+
+ src/hb-ot-font.cc                               | 2 +-
+ test/shaping/data/in-house/tests/vertical.tests | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit d950022c8ae3f85546272b38b187d6ed9f5ff16f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 23:06:37 2018 -0700
+
+    Add hb-ot-face.cc/hh
+
+ src/Makefile.sources |   2 +
+ src/hb-ot-face.cc    | 206
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-face.hh    | 144 +++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout.cc  | 172 ------------------------------------------
+ src/hb-ot-layout.hh  | 108 +--------------------------
+ src/hb-ot-math.cc    |   2 +-
+ src/hb-ot-var.cc     |   2 +-
+ 7 files changed, 355 insertions(+), 281 deletions(-)
+
+commit dae39c58fb63c2211e2842121bbe6d5b8b18651b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 22:44:39 2018 -0700
+
+    [face] Introduce character-map API
+
+    New API:
+    +hb_face_collect_unicodes
+    +hb_face_collect_variation_selectors
+    +hb_face_collect_variation_unicodes
+
+ docs/harfbuzz-sections.txt                      |  3 ++
+ src/hb-face.cc                                  | 61
+ ++++++++++++++++++++++++-
+ src/hb-face.h                                   | 19 ++++++++
+ src/hb-subset.cc                                | 53
+ ---------------------
+ src/hb-subset.h                                 | 15 ------
+ test/api/test-subset-codepoints.c               |  6 +--
+ test/fuzzing/hb-subset-get-codepoints-fuzzer.cc |  2 +-
+ 7 files changed, 86 insertions(+), 73 deletions(-)
+
+commit 66384db97c439a64d729f9206657d0b37ec0cb32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 22:39:17 2018 -0700
+
+    Minor
+
+ src/hb-subset.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit c77ae40852aabb1698da9e8d488f75bae2f4e734
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 22:36:36 2018 -0700
+
+    Rename hb-*private.hh to hb-*.hh
+
+    Sorry for the noise, downstream custom builders.  Please adjust.
+
+ src/Makefile.sources                               | 75
+ +++++++++++-----------
+ src/check-includes.sh                              |  8 +--
+ src/dump-indic-data.cc                             |  2 +-
+ src/dump-khmer-data.cc                             |  2 +-
+ src/dump-myanmar-data.cc                           |  2 +-
+ src/dump-use-data.cc                               |  2 +-
+ src/gen-indic-table.py                             |  2 +-
+ src/gen-use-table.py                               |  2 +-
+ src/hb-aat-layout-ankr-table.hh                    |  2 +-
+ src/hb-aat-layout-bsln-table.hh                    |  2 +-
+ ...t-common-private.hh => hb-aat-layout-common.hh} |  8 +--
+ src/hb-aat-layout-feat-table.hh                    |  2 +-
+ src/hb-aat-layout-kerx-table.hh                    |  4 +-
+ src/hb-aat-layout-morx-table.hh                    |  6 +-
+ src/hb-aat-layout-trak-table.hh                    |  6 +-
+ src/hb-aat-layout.cc                               |  8 +--
+ src/{hb-aat-layout-private.hh => hb-aat-layout.hh} | 14 ++--
+ src/hb-aat-ltag-table.hh                           |  2 +-
+ src/{hb-atomic-private.hh => hb-atomic.hh}         |  8 +--
+ src/hb-blob.cc                                     |  4 +-
+ src/{hb-blob-private.hh => hb-blob.hh}             |  8 +--
+ src/hb-buffer-deserialize-json.hh                  |  2 +-
+ src/hb-buffer-deserialize-json.rl                  |  2 +-
+ src/hb-buffer-deserialize-text.hh                  |  2 +-
+ src/hb-buffer-deserialize-text.rl                  |  2 +-
+ src/hb-buffer-serialize.cc                         |  2 +-
+ src/hb-buffer.cc                                   |  4 +-
+ src/{hb-buffer-private.hh => hb-buffer.hh}         | 10 +--
+ src/hb-common.cc                                   |  4 +-
+ src/hb-coretext.cc                                 |  4 +-
+ src/hb-debug.hh                                    |  4 +-
+ src/hb-directwrite.cc                              |  4 +-
+ src/hb-dsalgs.hh                                   |  2 +-
+ src/hb-face.cc                                     |  8 +--
+ src/{hb-face-private.hh => hb-face.hh}             | 12 ++--
+ src/hb-fallback-shape.cc                           |  2 +-
+ src/hb-font.cc                                     |  6 +-
+ src/{hb-font-private.hh => hb-font.hh}             | 12 ++--
+ src/hb-ft.cc                                       |  6 +-
+ src/hb-glib.cc                                     |  6 +-
+ src/hb-gobject-enums.cc.tmpl                       |  2 +-
+ src/hb-gobject-structs.cc                          |  2 +-
+ src/hb-graphite2.cc                                |  2 +-
+ src/hb-icu.cc                                      |  6 +-
+ src/{hb-iter-private.hh => hb-iter.hh}             |  8 +--
+ src/{hb-machinery-private.hh => hb-machinery.hh}   | 12 ++--
+ src/hb-map.cc                                      |  2 +-
+ src/{hb-map-private.hh => hb-map.hh}               |  8 +--
+ src/{hb-mutex-private.hh => hb-mutex.hh}           |  8 +--
+ src/hb-null.hh                                     |  2 +-
+ src/{hb-object-private.hh => hb-object.hh}         | 14 ++--
+ src/{hb-open-file-private.hh => hb-open-file.hh}   |  8 +--
+ src/{hb-open-type-private.hh => hb-open-type.hh}   | 14 ++--
+ src/hb-ot-cmap-table.hh                            |  4 +-
+ src/hb-ot-color-cbdt-table.hh                      |  2 +-
+ src/hb-ot-color-colr-table.hh                      |  2 +-
+ src/hb-ot-color-cpal-table.hh                      |  2 +-
+ src/hb-ot-color-sbix-table.hh                      |  2 +-
+ src/hb-ot-color-svg-table.hh                       |  2 +-
+ src/hb-ot-color.cc                                 |  6 +-
+ src/hb-ot-font.cc                                  |  6 +-
+ src/hb-ot-glyf-table.hh                            |  4 +-
+ src/hb-ot-hdmx-table.hh                            |  2 +-
+ src/hb-ot-head-table.hh                            |  2 +-
+ src/hb-ot-hhea-table.hh                            |  2 +-
+ src/hb-ot-hmtx-table.hh                            |  2 +-
+ src/hb-ot-kern-table.hh                            |  2 +-
+ src/hb-ot-layout-base-table.hh                     |  4 +-
+ ...ut-common-private.hh => hb-ot-layout-common.hh} | 14 ++--
+ src/hb-ot-layout-gdef-table.hh                     |  4 +-
+ src/hb-ot-layout-gpos-table.hh                     |  2 +-
+ src/hb-ot-layout-gsub-table.hh                     |  2 +-
+ ...subgpos-private.hh => hb-ot-layout-gsubgpos.hh} | 14 ++--
+ src/hb-ot-layout-jstf-table.hh                     |  2 +-
+ src/hb-ot-layout.cc                                |  8 +--
+ src/{hb-ot-layout-private.hh => hb-ot-layout.hh}   | 16 ++---
+ src/hb-ot-map.cc                                   |  4 +-
+ src/{hb-ot-map-private.hh => hb-ot-map.hh}         |  8 +--
+ src/hb-ot-math-table.hh                            |  4 +-
+ src/hb-ot-math.cc                                  |  4 +-
+ src/hb-ot-maxp-table.hh                            |  2 +-
+ src/hb-ot-name-table.hh                            |  2 +-
+ src/hb-ot-os2-table.hh                             |  2 +-
+ src/hb-ot-os2-unicode-ranges.hh                    |  2 +-
+ src/hb-ot-post-macroman.hh                         |  2 +-
+ src/hb-ot-post-table.hh                            |  2 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh         |  4 +-
+ src/hb-ot-shape-complex-arabic-win1256.hh          |  2 +-
+ src/hb-ot-shape-complex-arabic.cc                  |  6 +-
+ ...ic-private.hh => hb-ot-shape-complex-arabic.hh} | 10 +--
+ src/hb-ot-shape-complex-default.cc                 |  2 +-
+ src/hb-ot-shape-complex-hangul.cc                  |  2 +-
+ src/hb-ot-shape-complex-hebrew.cc                  |  2 +-
+ src/hb-ot-shape-complex-indic-machine.hh           |  2 +-
+ src/hb-ot-shape-complex-indic-machine.rl           |  2 +-
+ src/hb-ot-shape-complex-indic-table.cc             |  2 +-
+ src/hb-ot-shape-complex-indic.cc                   |  4 +-
+ ...dic-private.hh => hb-ot-shape-complex-indic.hh} | 12 ++--
+ src/hb-ot-shape-complex-khmer-machine.hh           |  2 +-
+ src/hb-ot-shape-complex-khmer-machine.rl           |  2 +-
+ src/hb-ot-shape-complex-khmer.cc                   |  4 +-
+ ...mer-private.hh => hb-ot-shape-complex-khmer.hh} | 10 +--
+ src/hb-ot-shape-complex-myanmar-machine.hh         |  2 +-
+ src/hb-ot-shape-complex-myanmar-machine.rl         |  2 +-
+ src/hb-ot-shape-complex-myanmar.cc                 |  2 +-
+ ...r-private.hh => hb-ot-shape-complex-myanmar.hh} | 10 +--
+ src/hb-ot-shape-complex-thai.cc                    |  2 +-
+ src/hb-ot-shape-complex-tibetan.cc                 |  2 +-
+ src/hb-ot-shape-complex-use-machine.hh             |  2 +-
+ src/hb-ot-shape-complex-use-machine.rl             |  2 +-
+ src/hb-ot-shape-complex-use-table.cc               |  2 +-
+ src/hb-ot-shape-complex-use.cc                     |  4 +-
+ ...x-use-private.hh => hb-ot-shape-complex-use.hh} | 10 +--
+ ...e-complex-private.hh => hb-ot-shape-complex.hh} | 12 ++--
+ src/hb-ot-shape-fallback.cc                        |  4 +-
+ ...fallback-private.hh => hb-ot-shape-fallback.hh} | 10 +--
+ src/hb-ot-shape-normalize.cc                       |  6 +-
+ ...rmalize-private.hh => hb-ot-shape-normalize.hh} |  8 +--
+ src/hb-ot-shape.cc                                 | 20 +++---
+ src/{hb-ot-shape-private.hh => hb-ot-shape.hh}     | 12 ++--
+ src/hb-ot-tag.cc                                   |  2 +-
+ src/hb-ot-var-avar-table.hh                        |  2 +-
+ src/hb-ot-var-fvar-table.hh                        |  2 +-
+ src/hb-ot-var-hvar-table.hh                        |  2 +-
+ src/hb-ot-var-mvar-table.hh                        |  2 +-
+ src/hb-ot-var.cc                                   |  4 +-
+ src/{hb-set-digest-private.hh => hb-set-digest.hh} |  8 +--
+ src/hb-set.cc                                      |  2 +-
+ src/{hb-set-private.hh => hb-set.hh}               |  8 +--
+ src/hb-shape-plan.cc                               | 10 +--
+ src/{hb-shape-plan-private.hh => hb-shape-plan.hh} | 10 +--
+ src/hb-shape.cc                                    | 12 ++--
+ ...hb-shaper-impl-private.hh => hb-shaper-impl.hh} | 16 ++---
+ src/hb-shaper.cc                                   |  6 +-
+ src/{hb-shaper-private.hh => hb-shaper.hh}         |  8 +--
+ src/hb-static.cc                                   |  8 +--
+ src/hb-string-array.hh                             |  2 +-
+ src/hb-subset-glyf.cc                              |  2 +-
+ src/hb-subset-glyf.hh                              |  2 +-
+ src/hb-subset-input.cc                             |  4 +-
+ src/hb-subset-plan.cc                              |  6 +-
+ src/hb-subset-plan.hh                              |  6 +-
+ src/hb-subset.cc                                   |  8 +--
+ src/{hb-subset-private.hh => hb-subset.hh}         | 10 +--
+ src/hb-ucdn.cc                                     |  6 +-
+ src/hb-unicode.cc                                  |  6 +-
+ src/{hb-unicode-private.hh => hb-unicode.hh}       |  8 +--
+ src/hb-uniscribe.cc                                |  6 +-
+ src/{hb-utf-private.hh => hb-utf.hh}               |  8 +--
+ src/{hb-vector-private.hh => hb-vector.hh}         |  8 +--
+ src/hb-warning.cc                                  |  6 +-
+ src/{hb-private.hh => hb.hh}                       | 12 ++--
+ src/main.cc                                        |  4 +-
+ src/test-buffer-serialize.cc                       |  2 +-
+ src/test-size-params.cc                            |  2 +-
+ src/test-unicode-ranges.cc                         |  2 +-
+ src/test-would-substitute.cc                       |  2 +-
+ src/test.cc                                        |  2 +-
+ test/api/test-common.c                             |  1 -
+ util/Makefile.am                                   |  4 +-
+ util/ansi-print.hh                                 |  3 +-
+ util/hb-subset.cc                                  |  2 +-
+ util/helper-cairo-ansi.hh                          |  2 +-
+ util/helper-cairo.hh                               |  2 +-
+ util/main-font-text.hh                             |  2 +-
+ util/options.hh                                    |  2 +-
+ util/shape-consumer.hh                             |  2 +-
+ util/view-cairo.hh                                 |  2 +-
+ 168 files changed, 452 insertions(+), 455 deletions(-)
+
+commit 82b12bcadd50c9e86bbe82623a1cbc0b4afdd237
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 22:07:17 2018 -0700
+
+    [unicode] Add HB_UNICODE_MAX
+
+    New API:
+    HB_UNICODE_MAX
+
+ docs/harfbuzz-sections.txt | 1 +
+ src/hb-ot-cmap-table.hh    | 8 ++------
+ src/hb-unicode.h           | 3 +++
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit b09a0336ca856a2b1040e7fabd5819b64749e308
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 22:04:39 2018 -0700
+
+    [cmap] More hb_auto_t<>(...)
+
+ src/hb-subset.cc | 12 +++---------
+ 1 file changed, 3 insertions(+), 9 deletions(-)
+
+commit 28634db07e6ecbdb7e59ed8f989212272a97de86
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 21:23:43 2018 -0700
+
+    [cmap] Fix skipping gid0 in Format4 collect_unicodes()
+
+ src/hb-ot-cmap-table.hh | 20 ++++++++++++++++++--
+ 1 file changed, 18 insertions(+), 2 deletions(-)
+
+commit acce1fa3ea9707d0883cd66397fd187d3268905c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 21:15:39 2018 -0700
+
+    Use new hb_auto_t<> constructor with Coverage::Iter
+
+ src/hb-ot-layout-common-private.hh | 65
+ ++++++++++++++++++++++++--------------
+ src/hb-ot-layout-gsub-table.hh     | 30 ++++++------------
+ 2 files changed, 52 insertions(+), 43 deletions(-)
+
+commit ddea4d19cf6d64270e14418f02e7ff1f1b9458db
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 21:08:15 2018 -0700
+
+    Add 1-param passthrough constructor to hb_auto_t<>
+
+    And use.
+
+ src/hb-dsalgs.hh        | 1 +
+ src/hb-ot-cmap-table.hh | 7 +++----
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit c8cfb702e96bf4e89495fcc56f965c88bfa77dca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 16:14:32 2018 -0700
+
+    [cmap] Minor
+
+ src/hb-ot-cmap-table.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 1dcf5fb038e7c2d3d03a50c4cd9869a922f9adf7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 16:11:26 2018 -0700
+
+    [cmap Add hb_subset_collect_variation_unicodes()
+
+    To be moved to hb-face.h later.
+
+ src/hb-ot-cmap-table.hh | 59
+ +++++++++++++++++++++++++++++++++++++++++--------
+ src/hb-subset.cc        | 25 ++++++++++++++++++++-
+ src/hb-subset.h         | 10 +++++++--
+ 3 files changed, 82 insertions(+), 12 deletions(-)
+
+commit 4806b3800d77603c203e8bb2e88baeb2b3a14f05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 15:56:07 2018 -0700
+
+    [cmap] Add hb_subset_collect_variation_selectors()
+
+    To be moved to hb-face later.
+
+ src/hb-ot-cmap-table.hh | 20 ++++++++++++++++----
+ src/hb-subset.cc        | 30 ++++++++++++++++++++++++++----
+ src/hb-subset.h         |  8 +++++++-
+ 3 files changed, 49 insertions(+), 9 deletions(-)
+
+commit 3336de24790ac1a12852ac2a3e2fff4d6bb19bc7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 15:41:25 2018 -0700
+
+    [cmap] Remove unused code
+
+ src/hb-ot-cmap-table.hh | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+commit 1becabe06c0c58aaf69a9ba641508e77a60f3451
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 15:37:56 2018 -0700
+
+    [cmap] Use bsearch to find subtables
+
+ src/hb-ot-cmap-table.hh                       | 5 +----
+ test/shaping/data/in-house/tests/fuzzed.tests | 2 +-
+ 2 files changed, 2 insertions(+), 5 deletions(-)
+
+commit 02fe03e09a3258e07d2d6749990f6d31dd2a8525
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 15:33:05 2018 -0700
+
+    [cmap] Factor out find_best_subtable
+
+ src/hb-ot-cmap-table.hh | 52
+ +++++++++++++++++++++++++++++--------------------
+ 1 file changed, 31 insertions(+), 21 deletions(-)
+
+commit b41c43b4e112bfa38fef35694842f242c28a7da2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 15:25:03 2018 -0700
+
+    Minor
+
+ src/hb-ot-cmap-table.hh | 48
+ ++++++++++++++++++++++++++----------------------
+ 1 file changed, 26 insertions(+), 22 deletions(-)
+
+commit 7d382fa276f44b7b163e98d434cc79f958bf87fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 09:35:45 2018 -0700
+
+    [cmap] Implement collect_unicodes() for Format0/6/10
+
+ src/hb-ot-cmap-table.hh | 23 +++++++++++++++++++----
+ 1 file changed, 19 insertions(+), 4 deletions(-)
+
+commit bd0e542525d41d9ebe51cbcab8151d65eb984b2e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 09:33:30 2018 -0700
+
+    [cmap] Simplify collect_unicodes()
+
+    Don't use accelerator (almost).  Hooks up Format13 as well.
+
+ src/hb-ot-cmap-table.hh | 52
+ +++++++++++++++++++++++++++----------------------
+ 1 file changed, 29 insertions(+), 23 deletions(-)
+
+commit d60c465627d76fcfbeb37d6b8f9382f3b84ace6e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 08:47:06 2018 -0700
+
+    Rename get_all_codepoints() to collect_unicodes()
+
+ src/hb-ot-cmap-table.hh                         | 26
+ ++++++++++++-------------
+ src/hb-subset.cc                                |  6 +++---
+ src/hb-subset.h                                 |  4 ++--
+ test/api/test-subset-codepoints.c               | 18 ++++++++---------
+ test/fuzzing/hb-subset-get-codepoints-fuzzer.cc |  2 +-
+ 5 files changed, 28 insertions(+), 28 deletions(-)
+
+commit 531051b8b904cf4eb6a50bacebc11c2d85e40140
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 08:44:18 2018 -0700
+
+    [ot-font] Return char-not-found if mapped to gid 0
+
+    OpenType cmap table can use gid=0 to mean "not covered" to produce
+    more optimized cmap subtables.  Return false from get_nominal_glyph()
+    for those.  hb-ft already does this.
+
+ src/hb-ot-cmap-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit aadb2a9188f143126392c0b0f139326dcf7f9c8d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 25 08:18:53 2018 -0700
+
+    Add face-builder
+
+    New API:
+    +hb_face_builder_create
+    +hb_face_builder_add_table
+
+ docs/harfbuzz-sections.txt |   5 +-
+ src/hb-face.cc             | 149
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-face.h              |  14 +++++
+ src/hb-subset-plan.cc      |   2 +-
+ src/hb-subset-plan.hh      |   2 +-
+ src/hb-subset-private.hh   |   7 ---
+ src/hb-subset.cc           | 129 ---------------------------------------
+ 7 files changed, 169 insertions(+), 139 deletions(-)
+
+commit 6cac9dc9ccb76945e9dfacafc169afad4a6e1e88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 24 10:29:45 2018 -0700
+
+    [blob] Add as_bytes()
+
+ src/hb-blob-private.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 29a9a0883877c598413de78cd0c61f07bc393b2c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 24 10:24:45 2018 -0700
+
+    [sanitize] Document how sanitize machinery works
+
+ src/hb-machinery-private.hh | 62
+ +++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 62 insertions(+)
+
+commit 142ac5a6be6088771e0ee4b135ba753c80036a9a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 24 10:07:49 2018 -0700
+
+    [serialize] Add copy_bytes() and copy_blob()
+
+ src/hb-dsalgs.hh            |  3 +++
+ src/hb-machinery-private.hh | 21 ++++++++++++++++++++-
+ 2 files changed, 23 insertions(+), 1 deletion(-)
+
+commit 1c6b3693245d38103cab224d75262d45dc88c71c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 15 20:12:25 2018 -0700
+
+    [ot] Rename hb_ot_layout_t to hb_ot_face_data_t
+
+ src/hb-aat-layout.cc                 |  17 +-----
+ src/hb-ot-color.cc                   |   6 +--
+ src/hb-ot-layout-gpos-table.hh       |   6 +--
+ src/hb-ot-layout-gsub-table.hh       |   8 ++-
+ src/hb-ot-layout-gsubgpos-private.hh |   2 +-
+ src/hb-ot-layout-private.hh          |  12 ++---
+ src/hb-ot-layout.cc                  | 100
+ +++++++++++++++++------------------
+ src/hb-ot-math.cc                    |   2 +-
+ src/hb-ot-shape.cc                   |   5 +-
+ src/hb-ot-var.cc                     |   4 +-
+ 10 files changed, 71 insertions(+), 91 deletions(-)
+
+commit 27c32d8afbdf5b587b14f3b194f79882680348ba
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 22 11:36:39 2018 -0700
+
+    fixed "Fixed" number decoding
+
+ src/hb-cff-interp-common-private.hh    | 11 ++++++++++-
+ src/hb-cff-interp-cs-common-private.hh |  4 ++--
+ 2 files changed, 12 insertions(+), 3 deletions(-)
+
+commit 811a651bbd3f1bda7ed8eaee9af8e9dbbc8f80de
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Aug 20 14:04:46 2018 -0700
+
+    fixed bugs with empty CFFIndex, fullset FDMap
+
+ src/hb-ot-cff-common-private.hh | 21 ++++++++++++++++++---
+ 1 file changed, 18 insertions(+), 3 deletions(-)
+
+commit 5cde2f55cd2f8917954f3a3f60bd571c86b3aa59
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Aug 17 16:50:13 2018 -0700
+
+    drop hints from CFF & CFF2 Private
+
+ src/hb-cff-interp-dict-common-private.hh | 24 ++++++++++++++
+ src/hb-subset-cff1.cc                    | 53
+ +++++++++++++++++++++++++++---
+ src/hb-subset-cff2.cc                    | 55
+ +++++++++++++++++++++++++++++---
+ 3 files changed, 123 insertions(+), 9 deletions(-)
+
+commit cef75ea41a513a612a683bced27ced31761204b5
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Aug 17 13:13:18 2018 -0700
+
+    Added CFF2 Subr nullifier
+
+    along with CFF2 charstring interpreter
+    factored out common code between CFF1 & CFF2 to CSInterpreter
+    moved fetch_op from Interpreter to InterpEnv
+    misc code clean up & bug fixes
+
+ src/Makefile.sources                     |  1 +
+ src/hb-cff-interp-common-private.hh      | 44 +++++++--------
+ src/hb-cff-interp-cs-common-private.hh   | 95
+ +++++++++++++++++++++++++++++--
+ src/hb-cff-interp-dict-common-private.hh |  3 +-
+ src/hb-cff1-interp-cs.hh                 | 82 ---------------------------
+ src/hb-cff2-interp-cs.hh                 | 97
+ ++++++++++++++++++++++++++++++++
+ src/hb-ot-cff-common-private.hh          |  4 ++
+ src/hb-ot-cff2-table.hh                  |  7 ++-
+ src/hb-subset-cff1.cc                    |  1 +
+ src/hb-subset-cff2.cc                    | 62 ++++++++++++++++++--
+ 10 files changed, 278 insertions(+), 118 deletions(-)
+
+commit f57d6bcbca276cec54d1e5308c308265e8e983b9
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Aug 16 08:03:46 2018 -0700
+
+    renamed CFF::Index to CFF::CFFIndex
+
+    to avoid confusion with OT::Index
+
+ src/hb-ot-cff-common-private.hh | 38
+ +++++++++++++++++++-------------------
+ src/hb-ot-cff1-table.hh         |  4 ++--
+ src/hb-ot-cff2-table.hh         |  2 +-
+ src/hb-subset-cff2.cc           |  4 ++--
+ 4 files changed, 24 insertions(+), 24 deletions(-)
+
+commit c4ae426a3d3f9411b94d35745ca0e14677cd7bdb
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Aug 16 00:59:46 2018 -0700
+
+    treat h/vstem the same as h/vstemhm
+
+ src/hb-cff1-interp-cs.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit e67bb3fbcf39385ea1db136aeca61291364fb75b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Aug 16 00:25:57 2018 -0700
+
+    renamed OT::cff to OT::cff1 for consistency
+
+    along with HB_OT_TAG_cff1
+
+ src/hb-ot-cff1-table.hh | 14 +++++++-------
+ src/hb-subset-cff1.cc   | 16 ++++++++--------
+ src/hb-subset.cc        |  4 ++--
+ 3 files changed, 17 insertions(+), 17 deletions(-)
+
+commit fdbfa1848b2f279c0f7a885bc1a985fa3375cfcd
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Aug 16 00:13:09 2018 -0700
+
+    renamed CFF version 1 structs and sources to CFF1 from CFF
+
+    "CFF" is used for shared structs & sources between CFF1 & CFF2
+    except OT:cff is for CFF version 1 table
+
+ src/Makefile.sources                              |   8 +-
+ src/{hb-cff-interp-cs.hh => hb-cff1-interp-cs.hh} |  22 ++--
+ src/{hb-ot-cff-table.hh => hb-ot-cff1-table.hh}   | 150
+ +++++++++++-----------
+ src/hb-ot-font.cc                                 |   2 +-
+ src/{hb-subset-cff.cc => hb-subset-cff1.cc}       |  86 ++++++-------
+ src/{hb-subset-cff.hh => hb-subset-cff1.hh}       |   8 +-
+ src/hb-subset.cc                                  |   2 +-
+ 7 files changed, 139 insertions(+), 139 deletions(-)
+
+commit 867f68bd8a74634ac6220bd76c8bafe3e2226041
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 15 15:53:50 2018 -0700
+
+    fix build attempt ^7
+
+ src/hb-subset-cff2.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 685db67bb07505729fdb997129ffd068bbe3c40d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 15 15:45:17 2018 -0700
+
+    fix build attempt ^6
+
+ src/hb-subset-cff2.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 2810caafeb9a621d53653f454dab0fa3e7f5c4a3
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 15 15:30:24 2018 -0700
+
+    fix build attempt ^5
+
+ src/hb-subset-cff2.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 25b8310b2a3e074c9d1d723ab6d10a29f8d189be
+Merge: 7aa23f35 22defe09
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 15 15:00:55 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit 7aa23f3597e4783b88ad526021cc4cafc05395f2
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 15 15:00:32 2018 -0700
+
+    fix build attempt ^4
+
+ src/hb-cff-interp-cs.hh | 10 +++++-----
+ src/hb-subset-cff.cc    |  2 +-
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 270452a44653773b3dc584729ec438ff922e2739
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 15 13:15:08 2018 -0700
+
+    fix build attempt ^3
+
+ src/hb-cff-interp-common-private.hh    | 2 --
+ src/hb-cff-interp-cs-common-private.hh | 1 +
+ src/hb-cff-interp-cs.hh                | 1 +
+ src/hb-subset-cff.cc                   | 2 +-
+ 4 files changed, 3 insertions(+), 3 deletions(-)
+
+commit c234839f25e68700c3489c55fda2773f2e00eecb
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 15 13:04:43 2018 -0700
+
+    fix build attempt ^2
+
+ src/hb-cff-interp-common-private.hh      | 2 ++
+ src/hb-cff-interp-cs-common-private.hh   | 6 +++---
+ src/hb-cff-interp-cs.hh                  | 6 +++---
+ src/hb-cff-interp-dict-common-private.hh | 6 +++---
+ src/hb-subset-cff.cc                     | 6 +++---
+ 5 files changed, 14 insertions(+), 12 deletions(-)
+
+commit eab07e713a67da2c5b368c59808f7e2db1cf0b0b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 15 12:15:55 2018 -0700
+
+    fix build
+
+ src/Makefile.sources | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 633ce88de93f5c565ee7fb8acdbd93c57779524b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 15 12:00:19 2018 -0700
+
+    CFF Subrs subsetting
+
+    Unreferenced subroutines are nullified (not removed) in a subset font
+
+    Separate Interpreter struct from hb-ot-cff-common-private.hh in a
+    set of four header files, augmented for CharString (CS):
+    hb-cff-interp-common-private.hh
+    hb-cff-interp-dict-common-private.hh
+    hb-cff-interp-cs-common-private.hh
+    hb-cff-interp-cs.hh
+
+    Interpreter runtime is separated off as a new struct InterpEnv
+    sub-classed differently for Dict and CharString (CS)
+
+ src/Makefile.sources                     |   8 +-
+ src/hb-cff-interp-common-private.hh      | 581
+ +++++++++++++++++++++++++++++++
+ src/hb-cff-interp-cs-common-private.hh   | 174 +++++++++
+ src/hb-cff-interp-cs.hh                  | 282 +++++++++++++++
+ src/hb-cff-interp-dict-common-private.hh | 183 ++++++++++
+ src/hb-ot-cff-common-private.hh          | 562
+ ++----------------------------
+ src/hb-ot-cff-table.hh                   | 165 ++++-----
+ src/hb-ot-cff2-table.hh                  | 147 ++++----
+ src/hb-subset-cff-common-private.hh      |  83 +++++
+ src/hb-subset-cff.cc                     | 118 +++++--
+ src/hb-subset-cff2.cc                    |  38 +-
+ 11 files changed, 1585 insertions(+), 756 deletions(-)
+
+commit 22defe0965adddaa09eebc13df7fa6c64e2abba3
+Author: Emil A Eklund <eae@chromium.org>
+Date:   Tue Aug 14 14:47:20 2018 -0700
+
+    Add guard around free_static_C_locale
+
+    Add HB_USE_ATEXIT guard around free_static_C_locale missed by previous
+    commit.
+
+ src/hb-common.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7112c6413ca7a1773847fe258145cc5162420953
+Author: Emil A Eklund <eae@chromium.org>
+Date:   Tue Aug 14 13:50:24 2018 -0700
+
+    Guard free_static function definitions with macro
+
+    Add HB_USE_ATEXIT macros around free_static function definitions to
+    avoid unused function compiler warnings/errors.
+
+ src/hb-ft.cc      | 5 ++++-
+ src/hb-glib.cc    | 3 ++-
+ src/hb-icu.cc     | 3 ++-
+ src/hb-ot-font.cc | 3 ++-
+ src/hb-shape.cc   | 4 +++-
+ src/hb-shaper.cc  | 3 ++-
+ 6 files changed, 15 insertions(+), 6 deletions(-)
+
+commit 63be5dcdde61275822d931b2924425478bc1dac1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 14 10:59:34 2018 -0700
+
+    1.8.8
+
+ NEWS             | 18 ++++++++++++++++++
+ configure.ac     |  2 +-
+ src/hb-version.h |  4 ++--
+ 3 files changed, 21 insertions(+), 3 deletions(-)
+
+commit c9a22fa124310c98c73b8d7b495ed354542a75de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 13 17:02:21 2018 -0700
+
+    [icu] Pass normalizer instance down as user_data
+
+ src/hb-icu.cc | 23 +++++++++--------------
+ 1 file changed, 9 insertions(+), 14 deletions(-)
+
+commit f0ef096b8cab33aa9e26edba9b15696bf907e268
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 13 10:30:41 2018 -0700
+
+    Don't add reference in get_unicode_funcs() functions
+
+    Users don't expect a new reference returned from a get() function.
+    Indeed, all users of that API I foud where NOT destroying the
+    reference.
+    Just change the implementations to NOT return a reference.
+
+    This applies to the following APIs:
+    hb_unicode_funcs_get_default()
+    hb_glib_get_unicode_funcs()
+    hb_icu_get_unicode_funcs()
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1134
+
+ src/hb-buffer.cc | 3 +--
+ src/hb-glib.cc   | 2 +-
+ src/hb-icu.cc    | 2 +-
+ src/hb-ucdn.cc   | 2 +-
+ 4 files changed, 4 insertions(+), 5 deletions(-)
+
+commit 9bbd1cdf068635f4a737f1fc9ab54ba075601a5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 18:20:53 2018 -0700
+
+    [uniscribe] Use lazy loader
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1129
+
+ src/hb-uniscribe.cc | 56
+ +++++++++++++++++++++++++++--------------------------
+ 1 file changed, 29 insertions(+), 27 deletions(-)
+
+commit 266368993625e0cfb6eef9188f8b9aa29fb97391
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 18:10:59 2018 -0700
+
+    Another clang bot fix
+
+ src/hb-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 989e71a982658145f28f83f2111bdab9561f3db0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 17:47:59 2018 -0700
+
+    Silence clang
+
+ src/hb-machinery-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6750ec692cdd682bd33cb1c37b137cf3bb641d43
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 17:42:16 2018 -0700
+
+    [lazy] Use for C_locale
+
+ src/hb-common.cc | 60
+ ++++++++++++++++++++++++++++----------------------------
+ 1 file changed, 30 insertions(+), 30 deletions(-)
+
+commit 747d2564e6bdcc15cf6a197e543fb732924159c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 17:32:10 2018 -0700
+
+    [lazy] Port more
+
+ src/hb-machinery-private.hh |  1 -
+ src/hb-shaper.cc            | 78
+ ++++++++++++++++++++-------------------------
+ src/hb-uniscribe.cc         |  3 +-
+ 3 files changed, 37 insertions(+), 45 deletions(-)
+
+commit 7bd508a0c4ce426f474bfcc729cb39207dd1f7b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 17:19:55 2018 -0700
+
+    [lazy] Rename free()
+
+ src/hb-ft.cc                | 4 ++--
+ src/hb-glib.cc              | 2 +-
+ src/hb-icu.cc               | 2 +-
+ src/hb-machinery-private.hh | 4 ++--
+ src/hb-ot-font.cc           | 2 +-
+ src/hb-shape.cc             | 6 +++---
+ src/hb-ucdn.cc              | 2 +-
+ 7 files changed, 11 insertions(+), 11 deletions(-)
+
+commit a3b97db910662e26bafe6e6bc1c36b437f4ed931
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 17:14:32 2018 -0700
+
+    [lazy] Port more to it
+
+ src/hb-shape.cc | 75
+ +++++++++++++++++++++++++++++----------------------------
+ 1 file changed, 38 insertions(+), 37 deletions(-)
+
+commit 6901090945d7e16102f3a2b168465434032b9a09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 16:57:06 2018 -0700
+
+    [lazy] Make hb_lazy_loader_t<> more usable
+
+ src/hb-ft.cc                |  7 +++---
+ src/hb-machinery-private.hh | 57
+ +++++++++++++++++++++++++++------------------
+ 2 files changed, 37 insertions(+), 27 deletions(-)
+
+commit bb905e9afcc3eb28a22ba78c09e661a814d04c1f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 16:40:08 2018 -0700
+
+    [lazy] Minor
+
+ src/hb-machinery-private.hh | 36 ++++++++++++++++++------------------
+ src/hb-ot-font.cc           |  8 ++++----
+ 2 files changed, 22 insertions(+), 22 deletions(-)
+
+commit 3945cd78a96bdd287e203a0261bac490df1314b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 16:33:48 2018 -0700
+
+    Minor
+
+ src/hb-machinery-private.hh | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit c21a1b95dffedb6ed66b384f4adf07e6d05d4b9f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 16:30:39 2018 -0700
+
+    [icu] Use get_relaxed for normalizer access
+
+    We've had the proper barriers already.  No need for more with
+    every access.
+
+ src/hb-icu.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 125fefa2a6b23cf7eb4559904b23aff3731d5dba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 16:29:41 2018 -0700
+
+    [icu] Fix for breakage after recent change
+
+ src/hb-icu.cc | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 53442be1edc73993bdcaffc4b895c07f1ea03ba0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 16:20:11 2018 -0700
+
+    [lazy] Use for ft_library
+
+ src/hb-ft.cc                | 61
+ ++++++++++++++++++++++-----------------------
+ src/hb-glib.cc              |  2 +-
+ src/hb-icu.cc               |  2 +-
+ src/hb-machinery-private.hh |  2 +-
+ src/hb-ot-font.cc           |  2 +-
+ src/hb-ucdn.cc              |  2 +-
+ 6 files changed, 35 insertions(+), 36 deletions(-)
+
+commit 7a8d480378af4094645dfb1527a61a94b4786b54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 16:00:13 2018 -0700
+
+    [lazy] Add .free()
+
+ src/hb-ft.cc                | 2 +-
+ src/hb-glib.cc              | 2 +-
+ src/hb-icu.cc               | 2 +-
+ src/hb-machinery-private.hh | 4 ++++
+ src/hb-ot-font.cc           | 2 +-
+ src/hb-ucdn.cc              | 2 +-
+ 6 files changed, 9 insertions(+), 5 deletions(-)
+
+commit c7ca30a5337cb660e650d51ddd17d389909357c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 13:46:53 2018 -0700
+
+    [ot/ft] Port font_funcs statis to lazy-loader
+
+ src/hb-ft.cc                | 56
+ ++++++++++++++++++++++-----------------------
+ src/hb-machinery-private.hh | 14 ++++++++++++
+ src/hb-ot-font.cc           | 49 +++++++++++++++++----------------------
+ 3 files changed, 62 insertions(+), 57 deletions(-)
+
+commit cb3fc3685c03c8ed07bcf05188f5d6c582fd5aaa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 13:39:01 2018 -0700
+
+    [ucdn/glib/icu] Port unicode_funcs statics to lazy-loader
+
+ src/hb-glib.cc              | 50 ++++++++++++++++++--------------------
+ src/hb-icu.cc               | 59
+ ++++++++++++++++-----------------------------
+ src/hb-machinery-private.hh | 28 ++++++++++++++++-----
+ src/hb-ucdn.cc              | 51 +++++++++++++++++----------------------
+ 4 files changed, 88 insertions(+), 100 deletions(-)
+
+commit 1b6b481262465ae1865c66c4d499b4b2c8d297fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 13:16:40 2018 -0700
+
+    [lazy] Allow calling fini() multiple times
+
+ src/hb-machinery-private.hh | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 918ad9f5d9b85384f24157523272a4ffc1927d16
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 13:12:29 2018 -0700
+
+    [lazy] More
+
+ src/hb-machinery-private.hh | 45
+ +++++++++++++++++++++++++++++++++++++--------
+ 1 file changed, 37 insertions(+), 8 deletions(-)
+
+commit 5abdf5eebadf9a4fbd50c1a893c9654de74d22ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 12:40:24 2018 -0700
+
+    [lazy] More shuffle
+
+ src/hb-machinery-private.hh | 80
+ +++++++++++++++++++--------------------------
+ 1 file changed, 34 insertions(+), 46 deletions(-)
+
+commit 5d9863be6ecf873033cbab732207dd420f3866e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 12:27:47 2018 -0700
+
+    Minor
+
+ src/hb-machinery-private.hh | 6 ++++--
+ src/hb-ot-layout-private.hh | 2 +-
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit f9a3eab81008c01a458d16f274b1a0eaaae00e7c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 12:21:56 2018 -0700
+
+    Add explicit_operator
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1127
+
+ src/hb-iter-private.hh |  2 +-
+ src/hb-private.hh      | 15 ++++++++++++++-
+ 2 files changed, 15 insertions(+), 2 deletions(-)
+
+commit 470acb6c322fc64556d59847d829d95caa2d51e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 12:09:20 2018 -0700
+
+    Rename
+
+ src/hb-machinery-private.hh | 19 ++++++++++++-------
+ 1 file changed, 12 insertions(+), 7 deletions(-)
+
+commit 39607dc98e433ef577c1de0f309ce40fc40529be
+Author: Martin Hosken <martin_hosken@sil.org>
+Date:   Thu Aug 9 15:16:32 2018 +0700
+
+    Support _ in feature ids
+
+ src/hb-common.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a3a8c85b027779365bb33e2063221b4650fbac3b
+Merge: 145f371d 652cd45c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Aug 10 13:41:42 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit 145f371d71965b86635025c73117db0e24f2df75
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Aug 10 13:07:53 2018 -0700
+
+    fixed TRACE build failure
+
+ src/hb-ot-cff-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a97ed342d18bdb262400c8ab6501df110fe4e18f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Aug 10 12:55:22 2018 -0700
+
+    fixed inclusion of excluded Private & local Subrs
+
+    It was bloating a multi-FD subset font unnecessarily
+    defined a wrapper struct FDMap for fdmap
+
+ src/hb-ot-cff-common-private.hh     | 34 ++++++++++++++++++++-----
+ src/hb-subset-cff-common-private.cc |  6 ++---
+ src/hb-subset-cff-common-private.hh |  4 +--
+ src/hb-subset-cff.cc                | 48
+ +++++++++++++++++++----------------
+ src/hb-subset-cff2.cc               | 50
+ ++++++++++++++++++++-----------------
+ 5 files changed, 87 insertions(+), 55 deletions(-)
+
+commit 64c541226457907ec1801a5766050ee64feb67e8
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Aug 10 11:07:07 2018 -0700
+
+    Added CFF support
+
+    Added sources hb-ot-cff-table.hh, hb-subset-cff.cc & hh
+    Templatized Index because CFF uses 16-bit count while CFF2 uses 32-bit
+    Misc code cleanup & bug fixes
+
+ src/Makefile.sources                |   9 +-
+ src/hb-ot-cff-common-private.hh     | 477 ++++++++++++-------
+ src/hb-ot-cff-table.hh              | 919
+ ++++++++++++++++++++++++++++++++++++
+ src/hb-ot-cff2-table.hh             | 235 ++++-----
+ src/hb-ot-font.cc                   |   1 +
+ src/hb-subset-cff-common-private.cc |   6 +-
+ src/hb-subset-cff-common-private.hh |   4 +-
+ src/hb-subset-cff.cc                | 560 ++++++++++++++++++++++
+ src/hb-subset-cff.hh                |  38 ++
+ src/hb-subset-cff2.cc               | 104 ++--
+ src/hb-subset.cc                    |   4 +
+ 11 files changed, 1991 insertions(+), 366 deletions(-)
+
+commit 652cd45c650b1cdce2585dcee614e5a9cdda530c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 9 01:02:02 2018 -0700
+
+    [coretext] Another try
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3f3585ca1406edd74138f78739612c167ab57913
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 9 00:58:17 2018 -0700
+
+    Fix coretext build (hopefully)
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit aa3b6017ed71fc251522ff1bedcdae965b4c1c1c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 9 00:56:28 2018 -0700
+
+    Revert "[iter] Make operator bool explicit"
+
+    This reverts commit 66920a6bace7c54c8166c4ed938b6ffc5fabcf2b.
+
+    Some of our bots (Oracle Studio and Apple gcc 4.2) do not allow
+    explicit except for constructors.
+
+    https://github.com/harfbuzz/harfbuzz/issues/1127
+
+ src/hb-iter-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e1a2354220c369bd5a62d255acc42c60cd14c473
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 9 00:53:25 2018 -0700
+
+    [atomic] More
+
+ src/hb-atomic-private.hh | 2 --
+ src/hb-object-private.hh | 7 +++++--
+ 2 files changed, 5 insertions(+), 4 deletions(-)
+
+commit f1f4b45ac3d228a6b11e33357725de065e2ba2be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 9 00:28:40 2018 -0700
+
+    Fix lazy_loader fini()
+
+    Was creating object even if wasn't there.
+
+ src/hb-machinery-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1f7380944df9aa81cd48a4764c763d692533c4a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 9 00:22:37 2018 -0700
+
+    [atomic] Add hb_atomic_ptr_t<> and port all uses
+
+    Found and fixed a couple bugs.
+
+    Found a couple multithreading issues.  Marked them with "XXX-MT-bug".
+
+ src/hb-atomic-private.hh          | 34 +++++++++++++++++++++++++++++++---
+ src/hb-common.cc                  | 34 ++++++++++++++++++----------------
+ src/hb-face-private.hh            |  3 ++-
+ src/hb-face.cc                    |  6 +++---
+ src/hb-font.cc                    |  2 +-
+ src/hb-ft.cc                      | 22 ++++++++++++----------
+ src/hb-glib.cc                    | 11 ++++++-----
+ src/hb-graphite2.cc               | 16 +++++++++-------
+ src/hb-icu.cc                     | 22 ++++++++++++----------
+ src/hb-machinery-private.hh       | 17 +++++++++--------
+ src/hb-object-private.hh          | 29 +++++++++++++++--------------
+ src/hb-ot-font.cc                 | 11 ++++++-----
+ src/hb-ot-layout-private.hh       |  2 +-
+ src/hb-ot-post-table.hh           |  9 +++++----
+ src/hb-ot-shape-complex-arabic.cc |  9 +++++----
+ src/hb-shape-plan.cc              | 19 +++++++++++--------
+ src/hb-shape.cc                   | 11 ++++++-----
+ src/hb-shaper-impl-private.hh     |  2 +-
+ src/hb-shaper-private.hh          | 16 +++++++++-------
+ src/hb-shaper.cc                  | 18 ++++++++++--------
+ src/hb-ucdn.cc                    | 11 ++++++-----
+ src/hb-uniscribe.cc               | 14 +++++++-------
+ 22 files changed, 185 insertions(+), 133 deletions(-)
+
+commit 6e42f4c53ff52cc242051e80600e19513136f6d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 22:51:35 2018 -0700
+
+    [atomic] Remove hb_atomic_int_impl_t now that it's always int
+
+ src/hb-atomic-private.hh | 14 +++++---------
+ 1 file changed, 5 insertions(+), 9 deletions(-)
+
+commit 1227a9e5a5befffa688c1cce141533fd80144d14
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 22:45:49 2018 -0700
+
+    [atomic] Unify typedef
+
+    Removes volatile from fallback implementation.  That was handwavy
+    anyway.
+
+ src/hb-atomic-private.hh | 22 ++++++++--------------
+ 1 file changed, 8 insertions(+), 14 deletions(-)
+
+commit 5cd1888c9dcb8b32bcfe08be38bdd13fd8a09b5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 22:43:53 2018 -0700
+
+    [atomic] Change Mac atomic int type to int
+
+    If ever int is not 32bit, we'll fix this...
+
+ src/hb-atomic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e1de86eac188e804c6737fcad66ae09cf25ef221
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 22:42:33 2018 -0700
+
+    [atomic] Change Windows atomic int type to int
+
+ src/hb-atomic-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit aee2d10b2bf09814b32bccdecd4c3fbebafc542e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 22:40:10 2018 -0700
+
+    [atomic] Change Solaris atomic int to signed
+
+ src/hb-atomic-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b6fdcf4f8bd09e065c767939125861c9dc8ff18f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 21:54:08 2018 -0700
+
+    1.8.7
+
+ NEWS             | 6 ++++++
+ RELEASING.md     | 3 +++
+ configure.ac     | 2 +-
+ src/hb-version.h | 4 ++--
+ 4 files changed, 12 insertions(+), 3 deletions(-)
+
+commit 51ffc3e65aacbece63995be99e2bc20538e3eb75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 22:01:04 2018 -0700
+
+    Fix previous commit to use atomic operations
+
+ src/hb-machinery-private.hh | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+commit 883957688cc4aa4335e5131a60b3ac3b53290726
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 21:42:18 2018 -0700
+
+    Fix assertion failure
+
+    https://bugzilla.mozilla.org/show_bug.cgi?id=1476334
+
+ src/hb-machinery-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit e49a38b20e82e50bca96751470e945cbe0524880
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 09:55:42 2018 -0700
+
+    1.8.6
+
+ NEWS             | 15 +++++++++++++++
+ configure.ac     |  2 +-
+ src/hb-font.cc   |  6 +++---
+ src/hb-font.h    |  4 ++--
+ src/hb-version.h |  4 ++--
+ 5 files changed, 23 insertions(+), 8 deletions(-)
+
+commit b0ff79acd804e47a2a3db73746cf9c6dc986950a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 09:52:06 2018 -0700
+
+    Add +hb_font_get_glyph_advances_for_direction
+
+    New API:
+    +hb_font_get_glyph_advances_for_direction
+
+ docs/harfbuzz-sections.txt |  1 +
+ src/hb-font-private.hh     | 12 ++++++++++++
+ src/hb-font.cc             | 20 ++++++++++++++++++++
+ src/hb-font.h              |  8 ++++++++
+ 4 files changed, 41 insertions(+)
+
+commit 28e2f467e1c7dd5e82d105efa8c4580dbfc93960
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 09:47:00 2018 -0700
+
+    Actually add hb_font_get_glyph_[hv]_advances
+
+    New API:
+    +hb_font_get_glyph_h_advances
+    +hb_font_get_glyph_v_advances
+
+ src/hb-font.cc | 37 +++++++++++++++++++++++++++++++++++++
+ src/hb-font.h  | 15 +++++++++++++++
+ 2 files changed, 52 insertions(+)
+
+commit 996775191a3fdeeeaee80e3123ef2240e6390b3d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 09:44:01 2018 -0700
+
+    Minor
+
+ src/hb-font-private.hh | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit 3d7c555a19ca0725c386aa6da648ecf2ae50fc19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 09:37:52 2018 -0700
+
+    Remove get_advances_nil and alias it to get_advances_default
+
+ src/hb-font.cc | 36 ++----------------------------------
+ 1 file changed, 2 insertions(+), 34 deletions(-)
+
+commit 66920a6bace7c54c8166c4ed938b6ffc5fabcf2b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 15:32:13 2018 -0700
+
+    [iter] Make operator bool explicit
+
+    We would need to write:
+
+      for (Iter<T> it (...); bool (t); t++)
+
+    instead of:
+
+      for (Iter<T> it (...); t; t++)
+
+    But I think it's an improvement in code readability in the long term.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1127
+
+ src/hb-iter-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 161ece4c3097096f355dc5ea514320a8dc678bea
+Merge: e8d695eb 79e21984
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Aug 6 11:23:50 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit e8d695ebaa4b5d36d907042fb6930244e87b1e29
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Aug 6 11:13:06 2018 -0700
+
+    removed CMakeCache.txt
+
+ build/CMakeCache.txt | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 9fae33b9f3fd7fce816c3db71089db4ce0c82d4c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Aug 6 10:44:12 2018 -0700
+
+    Silence Codacy
+
+ build/CMakeCache.txt                | 1 +
+ src/hb-subset-cff-common-private.cc | 8 +++++---
+ src/hb-subset-cff2.cc               | 4 +++-
+ 3 files changed, 9 insertions(+), 4 deletions(-)
+
+commit 5561b818498431adb52f958d1e9589620f0e6539
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Aug 6 10:04:53 2018 -0700
+
+    subset FDSelect and FDArray
+
+    Added a set of sources hb-subset-cff-common-private.cc & .hh for
+    FDSelect subseting code.
+    Added FDSelect format 4 (CFF2 only) support. Shared its implementation
+    with format 3 as a template.
+
+ src/Makefile.sources                |   2 +
+ src/hb-ot-cff-common-private.hh     | 130 ++++++++++++++++-------
+ src/hb-ot-cff2-table.hh             |  71 ++++++++++++-
+ src/hb-subset-cff-common-private.cc | 200
+ ++++++++++++++++++++++++++++++++++++
+ src/hb-subset-cff-common-private.hh |  54 ++++++++++
+ src/hb-subset-cff2.cc               |  71 ++++++++++---
+ 6 files changed, 476 insertions(+), 52 deletions(-)
+
+commit 79e21984b13bdb879f3007ba9a97fde47df340d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 09:45:17 2018 -0700
+
+    Add batch advance width callback function
+
+    New API:
+    +hb_font_funcs_set_glyph_h_advances_func
+    +hb_font_funcs_set_glyph_v_advances_func
+    +hb_font_get_glyph_h_advances
+    +hb_font_get_glyph_h_advances_func_t
+    +hb_font_get_glyph_v_advances
+    +hb_font_get_glyph_v_advances_func_t
+
+ docs/harfbuzz-sections.txt |   6 +
+ src/hb-font-private.hh     |  41 +++++--
+ src/hb-font.cc             | 299
+ +++++++++++++++++++++++++++------------------
+ src/hb-font.h              |  53 ++++++--
+ src/hb-ot-shape.cc         |   3 +-
+ 5 files changed, 255 insertions(+), 147 deletions(-)
+
+commit 9533364cc3a8cccbae793de1873a727de73f64d5
+Author: Koji Ishii <kojii@chromium.org>
+Date:   Wed Aug 1 13:01:08 2018 +0900
+
+    batchwidth
+
+ src/hb-font-private.hh | 13 +++++++++++++
+ src/hb-font.cc         | 37 +++++++++++++++++++++++++++++++++++++
+ src/hb-font.h          | 15 +++++++++++++++
+ src/hb-ot-shape.cc     |  4 ++--
+ 4 files changed, 67 insertions(+), 2 deletions(-)
+
+commit b912fbea17c50e229977345012227810ed7641e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 06:30:12 2018 -0700
+
+    Remove most uses of direct comparison to Null objects
+
+ src/hb-ot-glyf-table.hh                    | 6 +++---
+ src/hb-ot-head-table.hh                    | 4 ++--
+ src/hb-ot-layout-gdef-table.hh             | 1 +
+ src/hb-ot-layout-gsubgpos-private.hh       | 1 +
+ src/hb-ot-layout.cc                        | 6 +++---
+ src/hb-ot-math-table.hh                    | 2 ++
+ src/hb-ot-math.cc                          | 2 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh | 3 ++-
+ src/hb-ot-var-fvar-table.hh                | 2 ++
+ src/hb-ot-var.cc                           | 2 +-
+ src/hb-subset.cc                           | 2 +-
+ src/main.cc                                | 2 +-
+ 12 files changed, 20 insertions(+), 13 deletions(-)
+
+commit 3506672ce9d8685ce4e113716b0d06adbc7981b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 06:17:48 2018 -0700
+
+    Port _nil objects to Null() machinery
+
+    Finally, unified!
+
+ src/hb-blob-private.hh                     |  1 +
+ src/hb-blob.cc                             | 29 ++++++-------
+ src/hb-buffer-private.hh                   |  4 +-
+ src/hb-buffer.cc                           | 44 ++++++++++----------
+ src/hb-face-private.hh                     |  6 +--
+ src/hb-face.cc                             |  5 ++-
+ src/hb-font-private.hh                     | 10 +++--
+ src/hb-font.cc                             | 66
+ ++++++++++++++++--------------
+ src/hb-null.hh                             | 11 ++++-
+ src/hb-ot-shape-complex-arabic-fallback.hh | 11 +++--
+ src/hb-shape-plan-private.hh               |  1 +
+ src/hb-shape-plan.cc                       | 50 +++++++++++-----------
+ src/hb-unicode-private.hh                  |  7 ++--
+ src/hb-unicode.cc                          |  5 ++-
+ 14 files changed, 137 insertions(+), 113 deletions(-)
+
+commit 1abd427acfb7229b8607646bdde59f29306b86e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 05:53:35 2018 -0700
+
+    [BASE] Rename horzi/vert to h/v
+
+ src/hb-ot-layout-base-table.hh | 68
+ +++++++++++++++++++++---------------------
+ 1 file changed, 34 insertions(+), 34 deletions(-)
+
+commit da48aca1be89efbb8b3ca4471f542aa54aff17c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 05:52:12 2018 -0700
+
+    [BASE] Misc fixes
+
+    The code was badly broken.  In better shape now, but still, needs
+    a full review before ever working.
+
+ src/hb-ot-layout-base-table.hh | 163
+ +++++++++++++++++------------------------
+ 1 file changed, 68 insertions(+), 95 deletions(-)
+
+commit f9cfa5cb0e70203279e74fb6adb0cd4570238ff8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 05:29:15 2018 -0700
+
+    Change null-pool specialization to min_size again
+
+ src/hb-null.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 25147ff8086ab65995fe046cfdf8007604de6962
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 05:01:52 2018 -0700
+
+    Move Null system to hb-null.hh
+
+ src/Makefile.sources |  1 +
+ src/hb-null.hh       | 97
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-private.hh    | 65 +----------------------------------
+ 3 files changed, 99 insertions(+), 64 deletions(-)
+
+commit f800368df33e7ec15c3e77bdb9f4b464899322d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 04:58:34 2018 -0700
+
+    Remove unused macros
+
+ src/hb-object-private.hh | 1 -
+ src/hb-vector-private.hh | 1 -
+ 2 files changed, 2 deletions(-)
+
+commit 19e0091299f06856002c702792b448b06da637a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 04:54:31 2018 -0700
+
+    Minor
+
+ src/hb-private.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 37be774af921812018f723521b90f2ab54f661c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 04:51:38 2018 -0700
+
+    Minor
+
+ src/hb-private.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit e1acff806b469e58f568bf5ad6ba578207821e87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 04:42:46 2018 -0700
+
+    Move hb_vector_t to hb-vector-private.hh
+
+ src/Makefile.sources     |   1 +
+ src/hb-dsalgs.hh         | 297
+ -----------------------------------------------
+ src/hb-object-private.hh | 109 ++++++++++++++++-
+ src/hb-vector-private.hh | 239 ++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 346 insertions(+), 300 deletions(-)
+
+commit be336dadc07460a53de51be32dd5d1f218b398b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 04:32:51 2018 -0700
+
+    Move some more code around
+
+ src/hb-dsalgs.hh  | 43 +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-private.hh | 51
+ +--------------------------------------------------
+ 2 files changed, 44 insertions(+), 50 deletions(-)
+
+commit 92806ee055c8efb68fcbe9e1750ce2532a1f8ab3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 5 21:41:52 2018 -0700
+
+    Move null data definitions to hb-static.cc
+
+    Also remove "    " null data for Tag.  Just use zeroes.
+
+ src/hb-open-type-private.hh        |  3 +--
+ src/hb-ot-layout-common-private.hh |  5 ++---
+ src/hb-private.hh                  | 12 +++++++-----
+ src/hb-static.cc                   | 10 +++++++++-
+ 4 files changed, 19 insertions(+), 11 deletions(-)
+
+commit 1b4d5a2402302e90867c178b6b2ad07541091a74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 3 19:55:09 2018 -0700
+
+    Minor
+
+ src/hb-ot-layout-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7df7963b46223f47e89a5a38c597c874aaa93141
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 3 19:54:33 2018 -0700
+
+    Make lazy loader deal with OOM
+
+ src/hb-machinery-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 30ff8ac865a266c8dca11eeac155c2cd3d1aa159
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 3 17:32:00 2018 -0700
+
+    Rename
+
+ src/hb-machinery-private.hh | 6 +++---
+ src/hb-ot-font.cc           | 8 ++++----
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 85ba4a190f30da5147d3b2ddac4d58dda31181f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 3 17:06:42 2018 -0700
+
+    [ot] Comment
+
+ src/hb-ot-layout-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 07afc1a213bde91fdfc44dd613f2e82ac1617c9f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 3 17:03:32 2018 -0700
+
+    [ot] Add misc tables to tables_t
+
+    Most unused.
+
+ src/hb-ot-layout-private.hh | 36 ++++++++++++++++++++++--------------
+ 1 file changed, 22 insertions(+), 14 deletions(-)
+
+commit 74b4df2cdef68b74536d9c29426b242199a63a6f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 3 16:57:40 2018 -0700
+
+    [ot] Move GDEF into tables_t
+
+ src/hb-machinery-private.hh          |  6 ++++++
+ src/hb-ot-layout-gsub-table.hh       |  2 +-
+ src/hb-ot-layout-gsubgpos-private.hh |  2 +-
+ src/hb-ot-layout-private.hh          |  7 +------
+ src/hb-ot-layout.cc                  | 15 +++++----------
+ 5 files changed, 14 insertions(+), 18 deletions(-)
+
+commit 0271c7ab3b76dbf8a4e3e92eaf67d9d61b7a63dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 3 16:45:57 2018 -0700
+
+    [ot] Move GSUB/GPOS into tables_t
+
+ src/hb-machinery-private.hh    |  6 ++----
+ src/hb-ot-layout-gpos-table.hh |  4 ++--
+ src/hb-ot-layout-gsub-table.hh |  4 ++--
+ src/hb-ot-layout-private.hh    |  7 ++----
+ src/hb-ot-layout.cc            | 49
+ +++++++++++++++++++-----------------------
+ 5 files changed, 30 insertions(+), 40 deletions(-)
+
+commit f73d2775cf649d148ace7c2593da9666d60fc1be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 3 16:34:25 2018 -0700
+
+    [ot] More shuffling
+
+    Misc. table loading now properly automated.
+
+ src/hb-ot-layout-private.hh | 67
+ +++++++++++++++++++++++++++++----------------
+ src/hb-ot-layout.cc         | 25 +++++++++++------
+ src/hb-ot-math.cc           |  2 +-
+ 3 files changed, 61 insertions(+), 33 deletions(-)
+
+commit 52fbd23d868a989d51b7df5be40be582890d13e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 3 16:22:16 2018 -0700
+
+    [ot] Minor
+
+ src/hb-aat-layout.cc        |  4 ++--
+ src/hb-face-private.hh      |  7 ++-----
+ src/hb-machinery-private.hh |  1 +
+ src/hb-ot-layout-private.hh | 15 +++++++++------
+ src/hb-ot-layout.cc         | 20 ++++++++++----------
+ src/hb-ot-math.cc           |  2 +-
+ src/hb-ot-var.cc            |  4 ++--
+ 7 files changed, 27 insertions(+), 26 deletions(-)
+
+commit cc3f4e00aa5da1d9f0430adefe30689b3daa8282
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Aug 3 15:00:37 2018 -0700
+
+    silence gcc
+
+ src/hb-ot-cff2-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 00970dd2420c3dcc58c25568be4abe6586c159df
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Aug 3 14:35:09 2018 -0700
+
+    Removed parsed hint fields from CFF2PrivateDictValues
+
+    Instead moved & stored uniformly in values vector (renamed from
+    opstrs)
+    This should be fine as we aren't likely going to use them as hints
+    after all
+    Templatized DictValues whether to parse them out
+    For subsetter, they aren't parsed
+
+ src/hb-ot-cff-common-private.hh | 113 ++++++++++++++----------
+ src/hb-ot-cff2-table.hh         | 185
+ ++++++++++++----------------------------
+ src/hb-subset-cff2.cc           |   2 +-
+ 3 files changed, 120 insertions(+), 180 deletions(-)
+
+commit 6a0a298aabe777e2c1ed443f100fe6142c83e3b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 23:13:19 2018 -0700
+
+    [ot] Move code around
+
+ src/hb-ot-layout.cc | 211
+ ++++++++++++++++++++++++++--------------------------
+ 1 file changed, 106 insertions(+), 105 deletions(-)
+
+commit 5e718a751efdda89511c9f30238b500125193499
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 23:04:42 2018 -0700
+
+    [ot] Use switch for checking for blacklisted GDEF tables
+
+    Faster / more compact code.
+
+ src/hb-ot-layout.cc | 107
+ +++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 59 insertions(+), 48 deletions(-)
+
+commit b5cdf5280d5b00df5356cc5c3236844ca0576bd0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 22:56:42 2018 -0700
+
+    [ot] In GDEF blacklisting logic, remove the glyph index check
+    for Times
+
+    Just blacklist based on table sizes like we do for other fonts.
+
+ src/hb-ot-layout.cc | 12 ------------
+ 1 file changed, 12 deletions(-)
+
+commit c988b119994ef78d400bc7d3139785312da0be75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 20:04:37 2018 -0700
+
+    Move code around
+
+ src/hb-ot-font.cc | 41 ++++++++++++++++++++++++++---------------
+ 1 file changed, 26 insertions(+), 15 deletions(-)
+
+commit 76f7397c10832b891a082e30afc74222bd5ffd7b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Aug 2 16:28:10 2018 -0700
+
+    templatized CFF2 accelerator for lean Private dict interpretting
+    for subset
+
+    also fixed local subrs serialization
+
+ src/hb-ot-cff-common-private.hh |   8 ++-
+ src/hb-ot-cff2-table.hh         | 119
+ ++++++++++++++++++++++++++++++++--------
+ src/hb-subset-cff2.cc           |  13 +++--
+ 3 files changed, 109 insertions(+), 31 deletions(-)
+
+commit 43040564e661fdd616d39e84fde07612d55bb785
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Aug 2 12:23:10 2018 -0700
+
+    removed TRACE_SERIALIZE from non-member function _write_cff2
+
+ src/hb-subset-cff2.cc | 29 ++++++++++++++---------------
+ 1 file changed, 14 insertions(+), 15 deletions(-)
+
+commit e2fd49e4779663e3138bd1990736a9cf850303bf
+Merge: 693ae804 d4d1bf81
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Aug 2 11:39:22 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit 693ae804743c60968d4339465fa6480e0ed8396c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Aug 2 11:22:42 2018 -0700
+
+    more silencing fixes
+
+ src/hb-ot-cff2-table.hh | 2 +-
+ src/hb-subset-cff2.cc   | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit f6da44983178e345ddbac1bcd1691ddb330399c6
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Aug 2 10:52:08 2018 -0700
+
+    silence archlinux
+
+ src/hb-ot-cff-common-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 58279c3db4f31bf3f9a509d1d88bca01b57c6b81
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Aug 2 10:18:01 2018 -0700
+
+    silence Codacy
+
+ src/hb-ot-cff-common-private.hh | 25 +++++++++++++++++++------
+ src/hb-ot-cff2-table.hh         | 14 +++++++-------
+ 2 files changed, 26 insertions(+), 13 deletions(-)
+
+commit 574b37e933f98e35c2bdae04458a95522bbfbb82
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 02:22:38 2018 -0700
+
+    Minor
+
+ src/hb-ot-font.cc           | 2 +-
+ src/hb-ot-layout-private.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit d4d1bf8177b127caa57b146c932f553dca1ad933
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 02:04:02 2018 -0700
+
+    Fix for recent rename
+
+ src/hb-graphite2.cc | 2 +-
+ src/hb-uniscribe.cc | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 91126aa11a5fa2bff72137df4768ad13fc9b7803
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 02:03:13 2018 -0700
+
+    [uniscribe] Update for recent changes
+
+ src/hb-uniscribe.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 66952ec47b5f09d88b83fb6a71b1cdb26c53668d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 01:44:20 2018 -0700
+
+    Remove unused table reference
+
+ src/hb-ot-layout-private.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 443de26fa56dd1ef149d3ce4206f4495eceec2eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 01:41:19 2018 -0700
+
+    Minor
+
+ src/hb-face.cc              |  1 -
+ src/hb-ot-layout-private.hh | 12 ++++++------
+ 2 files changed, 6 insertions(+), 7 deletions(-)
+
+commit ee35af738b5c802ca62eb1c39b77f0bd992329df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 01:37:57 2018 -0700
+
+    Make lazy-loader safe for nil objectification
+
+ src/hb-machinery-private.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 6404c49d0735d92779089ddef5c1d34aad1542d7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 01:36:08 2018 -0700
+
+    Minor
+
+ src/hb-machinery-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit ff7826e90bce46985651015059872d1d8559b6ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 01:27:40 2018 -0700
+
+    Reduce storage by sharing face amongst lazy_loaders
+
+ src/hb-machinery-private.hh | 113
+ ++++++++++++++++++++++++--------------------
+ src/hb-ot-font.cc           |  19 ++++----
+ src/hb-ot-layout-private.hh |  11 +++--
+ src/hb-ot-layout.cc         |   9 ++--
+ 4 files changed, 85 insertions(+), 67 deletions(-)
+
+commit bdd3c11a19d87999eeaff2c82f21c6938d1d9342
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 00:38:46 2018 -0700
+
+    Internal templatization of lazy-loaders
+
+ src/hb-machinery-private.hh | 74
+ ++++++++++++++++++++-------------------------
+ 1 file changed, 32 insertions(+), 42 deletions(-)
+
+commit ed7b2e58fc9afb547656cf28eb4a253d989de43c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 23:59:09 2018 -0700
+
+    Remove OT namespace from hb-machinery-private.hh
+
+ src/dump-emoji.cc                          |  4 ++--
+ src/hb-aat-layout.cc                       |  2 +-
+ src/hb-face.cc                             |  4 ++--
+ src/hb-machinery-private.hh                | 14 +++++---------
+ src/hb-ot-font.cc                          |  8 ++++----
+ src/hb-ot-layout-private.hh                | 10 +++++-----
+ src/hb-ot-layout.cc                        |  8 ++++----
+ src/hb-ot-shape-complex-arabic-fallback.hh | 18 +++++++++---------
+ src/hb-static.cc                           |  4 ++--
+ src/hb-subset-glyf.cc                      |  2 +-
+ src/hb-subset.cc                           |  8 ++++----
+ src/hb-uniscribe.cc                        |  2 +-
+ 12 files changed, 40 insertions(+), 44 deletions(-)
+
+commit cb1491f92e24649433988ff81a89347dccf07c8b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 22:50:45 2018 -0700
+
+    Minor
+
+ src/hb-blob-private.hh      |  5 -----
+ src/hb-machinery-private.hh | 10 ++++++----
+ 2 files changed, 6 insertions(+), 9 deletions(-)
+
+commit 16ccfafbbd48c7a9737ce1d12e75406a050b71a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 22:50:06 2018 -0700
+
+    [face] Sprinkle const in the API
+
+ src/hb-face.cc | 17 +++++++++--------
+ src/hb-face.h  | 16 ++++++++--------
+ 2 files changed, 17 insertions(+), 16 deletions(-)
+
+commit 3d22aefedebb5277c5d79011e48e7be1a26a53c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 18:03:32 2018 -0700
+
+    Rename
+
+ src/hb-coretext.cc       | 46
+ +++++++++++++++++++++++-----------------------
+ src/hb-directwrite.cc    | 28 ++++++++++++++--------------
+ src/hb-fallback-shape.cc | 24 ++++++++++++------------
+ src/hb-graphite2.cc      | 26 +++++++++++++-------------
+ src/hb-ot-shape.cc       | 20 ++++++++++----------
+ src/hb-shaper-private.hh |  2 +-
+ src/hb-uniscribe.cc      | 34 +++++++++++++++++-----------------
+ 7 files changed, 90 insertions(+), 90 deletions(-)
+
+commit 1a624c6e06763a8a61bc686d2d44272d4ef50d4a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 17:53:30 2018 -0700
+
+    Add comment re (our only) race condition
+
+ src/hb-shaper-private.hh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 19ce0b24c0173fed11104a8ab039e856cbf40924
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 1 17:34:59 2018 -0700
+
+    removed unused field OpStr::update
+
+ src/hb-ot-cff-common-private.hh |  4 +---
+ src/hb-ot-cff2-table.hh         | 22 +++++++++++-----------
+ 2 files changed, 12 insertions(+), 14 deletions(-)
+
+commit 3bda54c43b248ee2bc18a9210fb4d880bb4d82ac
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 1 16:32:27 2018 -0700
+
+    fixed Index::serialize
+
+    The bug was causing CharString of the last glyph corrupt
+
+ src/hb-ot-cff-common-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 16f4dc9b73a197a5ab0ad29dcf5a7ed7495ec4e1
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 1 16:06:52 2018 -0700
+
+    fixed CFF2VariationStore::serialize
+
+    also get_size
+
+ src/hb-ot-cff2-table.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 44d1fb37efa20852cc466c0f0bba95dbd24ce288
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 14:51:51 2018 -0700
+
+    1.8.5
+
+ NEWS                | 8 ++++++++
+ configure.ac        | 2 +-
+ src/hb-ot-layout.cc | 2 +-
+ src/hb-version.h    | 4 ++--
+ 4 files changed, 12 insertions(+), 4 deletions(-)
+
+commit 13f4c137c686aed5c2888b5c47d9f16892be0d5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 14:13:59 2018 -0700
+
+    [atomic] Fix Solaris ones to add proper barriers
+
+ src/hb-atomic-private.hh | 52
+ +++++++++++++++++++++++++++++++++---------------
+ 1 file changed, 36 insertions(+), 16 deletions(-)
+
+commit 19dfaa351568887a74cee2c46d6acfcc3fa718ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 14:02:39 2018 -0700
+
+    [atomic] Remove volatile from IBM impl signature
+
+ src/hb-atomic-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2093a3e0cbb98c2daa39f308d50a12f0a719bc81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 14:00:46 2018 -0700
+
+    [atomic] Oops
+
+ src/hb-atomic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 19b98348ffc660501e518bf48cd63d232f7585e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 13:59:59 2018 -0700
+
+    [atomic] Use read-barrier for get()
+
+ src/hb-atomic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 006d4f031a30dd04f5bb9c3d1daca187ef6b7f1e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 13:59:31 2018 -0700
+
+    [atomic] Some more minor tweaks
+
+ src/hb-atomic-private.hh | 31 ++++++++++++++++++++-----------
+ 1 file changed, 20 insertions(+), 11 deletions(-)
+
+commit 28d03a8afcc1f0ba6d9d0d88f669cc53bb030dd8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 2 00:11:43 2018 +0430
+
+    [ci] Fix Appveyor bot (#1123)
+
+ appveyor.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b2ff582c8c1a0fea60ee323dc820ce6fe807b063
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Aug 1 11:30:38 2018 -0700
+
+    Implemented hb_subset_cff2
+
+    Added serialize functions to CFF2 structs
+    Fixed issues & bugs & code cleanup
+    Now subsetting CFF2 table outputs something
+
+ src/hb-ot-cff-common-private.hh | 428
+ +++++++++++++++++++++++++++++++++++-----
+ src/hb-ot-cff2-table.hh         | 237 +++++++++++++++++-----
+ src/hb-private.hh               |   2 +-
+ src/hb-subset-cff2.cc           | 392
+ +++++++++++++++++++++++++++++++-----
+ 4 files changed, 914 insertions(+), 145 deletions(-)
+
+commit 1a7fed631880fff8a947ebec9c7427efff581916
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 1 12:15:44 2018 +0430
+
+    Revert "Add a new API, hb_ot_layout_get_feature_name_ids (#976)"
+    (#1121)
+
+    This reverts commit 0c1b287b72e91e0898d75acb5d5acf1c6b9a7498.
+
+ docs/harfbuzz-sections.txt         |  1 -
+ src/hb-ot-layout-common-private.hh | 14 -------
+ src/hb-ot-layout.cc                | 86
+ --------------------------------------
+ src/hb-ot-layout.h                 |  8 ----
+ 4 files changed, 109 deletions(-)
+
+commit dfc86e4b35ffdeb8f73e83511712e75413bbb7d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 00:22:18 2018 -0700
+
+    [atomic] Fix cast to fallback ptr_get()
+
+ src/hb-atomic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7a4d576e81c4de68ea66b2d5fe7712e29d715272
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 00:19:25 2018 -0700
+
+    [gobject] Fix copy/paste error
+
+ src/hb-gobject-structs.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ad275627425c9b3c4fb1e69aa408067bd0bb77da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 23:01:05 2018 -0700
+
+    [atomic] On IBM, use light-weight sync for everything
+
+    lwsync() is a full read/write-barrier.  That's all we need, never
+    need sync().  I'm not sure why an isync() was used in fetch_and_add,
+    but since that's a read-modify-write, I just changed it to have
+    lwsync() on both sides.
+
+ src/hb-atomic-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit fd638d215feb058c2294e447cc68f6f50e2b481d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 23:00:15 2018 -0700
+
+    [atomic] Add XXX items around Solaris ops
+
+    Since add_int and cas are both read-modify-write, I wonder if we
+    also need a barrier after them.
+
+ src/hb-atomic-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 896ff15ae60a4a4b94c62946e69196b877839bb5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 22:51:38 2018 -0700
+
+    [atomic] Fix get() impl
+
+    Originally, glib's atomic_get was implemented as "memory_barrier;
+    load".
+    I copied this into cairo, fontconfig, and harfbuzz.  However, that's
+    wrong.  Correct way is "load; memory_barrier".  The details are long
+    and hard to fully grasp.  Best to read:
+
+      https://www.kernel.org/doc/Documentation/memory-barriers.txt
+
+    Also see my report against GNOME:
+
+      https://gitlab.gnome.org/GNOME/glib/issues/1449
+
+    Note that this is irrelevant if C++11-like atomic ops are available.
+
+ src/hb-atomic-private.hh | 28 +++++++++++++++++-----------
+ 1 file changed, 17 insertions(+), 11 deletions(-)
+
+commit d7a15799d40dac1f9521674a82c3293a7cb42ee4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 22:28:28 2018 -0700
+
+    [gobject] Hook up hb_map_t
+
+ docs/harfbuzz-sections.txt | 2 ++
+ src/hb-gobject-structs.cc  | 1 +
+ src/hb-gobject-structs.h   | 4 ++++
+ src/hb-map.cc              | 6 ++----
+ 4 files changed, 9 insertions(+), 4 deletions(-)
+
+commit 63c74e8d1d85067cbeffe635eb5ed4e8aa130776
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 22:21:21 2018 -0700
+
+    [atomic] Fix fallback impl
+
+ src/hb-atomic-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4bc16aca4760ac9ffd8c63bbaea24fc7d234f715
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 21:05:51 2018 -0700
+
+    [atomic] Add get_relaxed / set_relaxed
+
+    To help TSan and be more "correct".
+
+ src/hb-atomic-private.hh         | 37 ++++++++++++++++++++++-------------
+ src/hb-common.cc                 |  4 ++--
+ src/hb-debug.hh                  | 42
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-object-private.hh         | 12 ++++++------
+ src/hb-ot-shape-complex-indic.cc | 22 +++++++++++----------
+ src/hb-private.hh                | 28 ---------------------------
+ 6 files changed, 86 insertions(+), 59 deletions(-)
+
+commit 3dd1b88765f6ce91bd0558a16cdd8cf0c1e15d1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 19:33:37 2018 -0700
+
+    [atomic] Use CONSUME, not ACQUIRE, memory-order for get()
+
+    Although, all implementations just elevate that to ACQUIRE.
+    But requirement for us is just CONSUME.
+
+ src/hb-atomic-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 06b91d935da1a40ef9de6697717eb0af1015989e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 19:29:49 2018 -0700
+
+    Revert "[atomic] Make pointer get op relaxed instead of acquire"
+
+    This reverts commit b1e5650c67266dc158f22355fed206cd1c413f70.
+
+    After lots of head-scratching and finally finding the only truly
+    readable source to be the good old:
+
+      https://www.kernel.org/doc/Documentation/memory-barriers.txt
+
+    I've convinced myself that we need consume memory-ordering on get().
+    The location of memory-barrier in a load should be after, not before
+    the load.  That needs fixing.  I'll do that separately.
+
+ src/hb-atomic-private.hh | 34 +++++++++++++++++++++++++---------
+ 1 file changed, 25 insertions(+), 9 deletions(-)
+
+commit 2bdd903c69eb3a34f3d3bf5e4f4c94cd66337117
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jul 31 17:44:02 2018 -0700
+
+    [subset] limit the max codepoint value to the unicode limit.
+    When collecting all codepoints in the cmap avoid using large amount
+    of memory for fonts that declare coverage over all 32 bit integers.
+
+ src/hb-ot-cmap-table.hh                                   |   9 +++++++--
+ ...mized-hb-subset-get-codepoints-fuzzer-5973295416475648 | Bin 0 ->
+ 109 bytes
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 7278d9df3093a87f99cec9b4cea38bd688c5d020
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jul 31 17:59:19 2018 -0700
+
+    [subset] Add hb_ot_layout_collect_features to harfbuzz-sections.txt.
+    Add the fuzzer test case for feature collection timeout.
+
+ docs/harfbuzz-sections.txt                             |   1 +
+ ...estcase-minimized-hb-subset-fuzzer-5542653037903872 | Bin 0 ->
+ 160249 bytes
+ 2 files changed, 1 insertion(+)
+
+commit 89733755a48feef0a663e1ea7b8294949581ce7e
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Jul 30 18:10:43 2018 -0700
+
+    [subset] use add_array to populate feature_indexes.
+    This is much faster then calling a bunch of individual add()'s.
+
+ src/hb-ot-layout-common-private.hh |  7 +++++++
+ src/hb-ot-layout.cc                | 40
+ +++++++++++++++++++-------------------
+ 2 files changed, 27 insertions(+), 20 deletions(-)
+
+commit 7d92bef9c5afb319d125f60b0fce4763afeaa686
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Jul 30 17:17:43 2018 -0700
+
+    [subset] collect features first, then use those to collect lookups.
+
+ src/hb-ot-layout.cc | 148
+ +++++++++++++++++++++++++---------------------------
+ src/hb-ot-layout.h  |   7 +++
+ 2 files changed, 78 insertions(+), 77 deletions(-)
+
+commit af876cce3066833c7c34d213a578eec6b09dd5c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 15:27:29 2018 -0700
+
+    [indic] Flip default logic for double-halants in old-school
+
+    Oriya went down from 9 to 2.
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707311 out of 707394 tests passed. 83 failed (0.0117332%)
+    GUJARATI: 366355 out of 366457 tests passed. 102 failed (0.0278341%)
+    GURMUKHI: 60729 out of 60747 tests passed. 18 failed (0.0296311%)
+    KANNADA: 951300 out of 951913 tests passed. 613 failed (0.0643966%)
+    MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed
+    (0.0188871%)
+    MYANMAR: 1115830 out of 1123883 tests passed. 8053 failed (0.716534%)
+    ORIYA: 42327 out of 42329 tests passed. 2 failed (0.00472489%)
+    SINHALA: 271596 out of 271847 tests passed. 251 failed (0.0923313%)
+    TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+ src/hb-ot-shape-complex-indic.cc | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit 92ba9905caa060466230f63b428ccee767696464
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 15:19:32 2018 -0700
+
+    [indic] Allow double-halant in old-spec Devanagari
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1071
+
+ src/hb-ot-shape-complex-indic.cc                      |  18
+ ++++++++++++------
+ .../b722a7d09e60421f3efbc706ad348ab47b88567b.ttf      | Bin 0 ->
+ 4672 bytes
+ test/shaping/data/in-house/tests/indic-old-spec.tests |   2 ++
+ 3 files changed, 14 insertions(+), 6 deletions(-)
+
+commit fe099a844b9b8fe05dd4eb187b5ca3769441f012
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 14:20:31 2018 -0700
+
+    [test] Add Khmer tests, with NotoSansKhmer-Regular.ttf
+
+    Note that there's minor positioning differences, and ONE reordering
+    difference between what we get for these and what Uniscribe gets.
+    Probably same as what's described in commit message for
+    1a96cc825dc9c8e3b6eef1403fe0864a1cfc0245
+
+ .../3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf   | Bin 0 -> 24392 bytes
+ test/shaping/data/in-house/tests/khmer-misc.tests  |  89
+ +++++++++++++++++++++
+ 2 files changed, 89 insertions(+)
+
+commit 5772edc0ea8f697c6123e439c5d0c3e813ebeb45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 14:10:31 2018 -0700
+
+    [khmer] Typo
+
+ src/hb-ot-shape-complex-khmer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2d6edc9008182c1446951f2c5c04df20094597f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 13:56:55 2018 -0700
+
+    [test] Add Khmer test texts from recent bugs
+
+ test/shaping/texts/in-house/shaper-khmer/misc.txt | 66
+ +++++++++++++++++++++++
+ 1 file changed, 66 insertions(+)
+
+commit df26a32c8fd22cbd486e2a1014d30b9f38f51cd1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 13:55:53 2018 -0700
+
+    [test] Move things around for shaper updates
+
+ .../texts/in-house/shaper-indic/{indic => }/script-assamese/utrrs/LICENSE
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-assamese/utrrs/README
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-assamese/utrrs/SOURCES
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+ | 0
+ .../script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+ | 0
+ .../script-assamese/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+ | 0
+ .../script-assamese/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
+ | 0
+ .../{indic => }/script-assamese/utrrs/gsub/IndicFontFeatureGSUB.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-bengali/misc/misc.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-bengali/misc/reph.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-bengali/utrrs/LICENSE
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-bengali/utrrs/README
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-bengali/utrrs/SOURCES
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+ | 0
+ .../script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+ | 0
+ .../script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+ | 0
+ .../script-bengali/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+ | 0
+ .../script-bengali/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
+ | 0
+ .../{indic => }/script-bengali/utrrs/gsub/IndicFontFeatureGSUB.txt
+ | 0
+ .../shaper-indic/{indic => }/script-devanagari/misc/dottedcircle.txt
+ | 0
+ .../in-house/shaper-indic/{indic => }/script-devanagari/misc/eyelash.txt
+ | 0
+ .../in-house/shaper-indic/{indic => }/script-devanagari/misc/joiners.txt
+ | 0
+ .../in-house/shaper-indic/{indic => }/script-devanagari/misc/misc.txt
+ | 0
+ .../shaper-indic/{indic => }/script-devanagari/misc/spec-deviations.txt
+ | 0
+ .../shaper-indic/{indic => }/script-devanagari/misc/tricky-reordering.txt
+ | 0
+ .../in-house/shaper-indic/{indic => }/script-devanagari/utrrs/LICENSE
+ | 0
+ .../in-house/shaper-indic/{indic => }/script-devanagari/utrrs/README
+ | 0
+ .../in-house/shaper-indic/{indic => }/script-devanagari/utrrs/SOURCES
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+ | 0
+ .../codepoint/IndicFontFeatureCodepoint-DevnagariSpecificAddition.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-GenericPunctuation.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+ | 0
+ .../script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+ | 0
+ .../script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
+ | 0
+ .../{indic => }/script-devanagari/utrrs/gsub/IndicFontFeatureGSUB.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-gujarati/utrrs/LICENSE
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-gujarati/utrrs/README
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-gujarati/utrrs/SOURCES
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+ | 0
+ .../script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+ | 0
+ .../script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+ | 0
+ .../script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
+ | 0
+ .../{indic => }/script-gujarati/utrrs/gsub/IndicFontFeatureGSUB.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-gurmukhi/misc/misc.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-gurmukhi/utrrs/LICENSE
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-gurmukhi/utrrs/README
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-gurmukhi/utrrs/SOURCES
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+ | 0
+ .../script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-GurmukhiSpecific.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+ | 0
+ .../script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+ | 0
+ .../script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
+ | 0
+ .../{indic => }/script-gurmukhi/utrrs/gsub/IndicFontFeatureGSUB.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-kannada/misc/misc.txt
+ | 0
+ .../shaper-indic/{indic => }/script-kannada/misc/right-matras.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-kannada/utrrs/LICENSE
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-kannada/utrrs/README
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-kannada/utrrs/SOURCES
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+ | 0
+ .../script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+ | 0
+ .../script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+ | 0
+ .../script-kannada/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+ | 0
+ .../{indic => }/script-kannada/utrrs/gsub/IndicFontFeatureGSUB.txt
+ | 0
+ .../in-house/shaper-indic/{indic => }/script-malayalam/misc/cibu.txt
+ | 0
+ .../in-house/shaper-indic/{indic => }/script-malayalam/misc/dot-reph.txt
+ | 0
+ .../in-house/shaper-indic/{indic => }/script-malayalam/misc/misc.txt
+ | 0
+ .../in-house/shaper-indic/{indic => }/script-malayalam/utrrs/LICENSE
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-malayalam/utrrs/README
+ | 0
+ .../in-house/shaper-indic/{indic => }/script-malayalam/utrrs/SOURCES
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+ | 0
+ .../script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+ | 0
+ .../{indic => }/script-malayalam/utrrs/gsub/IndicFontFeatureGSUB.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-oriya/misc/bindu.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-oriya/misc/misc.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-oriya/utrrs/LICENSE
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-oriya/utrrs/README
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-oriya/utrrs/SOURCES
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+ | 0
+ .../script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+ | 0
+ .../script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-OriyaSpecific.txt
+ | 0
+ .../script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+ | 0
+ .../{indic => }/script-oriya/utrrs/gsub/IndicFontFeatureGSUB.txt
+ | 0
+ .../in-house/shaper-indic/{indic => }/script-sinhala/misc/extensive.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-sinhala/misc/misc.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-sinhala/misc/reph.txt
+ | 0
+ .../shaper-indic/{indic => }/script-sinhala/misc/split-matras.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-sinhala/utrrs/LICENSE
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-sinhala/utrrs/README
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-sinhala/utrrs/SOURCES
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Punctuation.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+ | 0
+ .../{indic => }/script-sinhala/utrrs/gpos/IndicFontFeatureGPOS.txt
+ | 0
+ .../script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt
+ | 0
+ .../script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt
+ | 0
+ .../{indic => }/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt
+ | 0
+ .../script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Special-Cases.txt
+ | 0
+ .../script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-TouchingLetters.txt
+ | 0
+ .../script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt
+ | 0
+ .../{indic => }/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-tamil/misc/misc.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-tamil/utrrs/LICENSE
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-tamil/utrrs/README
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-tamil/utrrs/SOURCES
+ | 0
+ .../script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-CurrencySymbols.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+ | 0
+ .../script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+ | 0
+ .../script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Numerics.txt
+ | 0
+ .../script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+ | 0
+ .../script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Symbols.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-TamilSymbol.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+ | 0
+ .../script-tamil/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+ | 0
+ .../script-tamil/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
+ | 0
+ .../{indic => }/script-tamil/utrrs/gsub/IndicFontFeatureGSUB.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-telugu/misc/misc.txt
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-telugu/utrrs/LICENSE
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-telugu/utrrs/README
+ | 0
+ .../texts/in-house/shaper-indic/{indic => }/script-telugu/utrrs/SOURCES
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+ | 0
+ .../script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+ | 0
+ .../script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+ | 0
+ .../script-telugu/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+ | 0
+ .../{indic => }/script-telugu/utrrs/gsub/IndicFontFeatureGSUB.txt
+ | 0
+ .../south-east-asian/script-khmer/misc => shaper-khmer}/misc.txt
+ | 0
+ .../script-khmer/misc => shaper-khmer}/other-marks-invalid.txt
+ | 0
+ .../south-east-asian/script-khmer/misc => shaper-khmer}/other-marks.txt
+ | 0
+ .../south-east-asian => shaper-use}/script-javanese/misc.txt
+ | 0
+ 174 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 6ddd669e205cf2c1c3b0a362330b686386f68519
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 13:38:07 2018 -0700
+
+    [khmer] Clear syllables before presentation features
+
+    Probably not what Uniscribe does, but good idea?
+
+ src/hb-ot-shape-complex-khmer.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 8eef1964a708c3db52e5e7312689c4664afa9839
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 13:35:10 2018 -0700
+
+    [khmer] Revert previous change, and remove pauses
+
+    This makes test suite happy again (at 44) while fixing the sequences
+    we were fixing, which were the following with KhmerUI.ttf:
+
+      U+1789,U+17BC
+      U+1789,U+17D2,U+1789
+      U+1789,U+17D2,U+1789,U+17BC
+
+    Fixes rest of https://github.com/harfbuzz/harfbuzz/issues/974
+
+ src/hb-ot-shape-complex-khmer.cc | 23 ++++++++++-------------
+ 1 file changed, 10 insertions(+), 13 deletions(-)
+
+commit 7c658ea2f20a77cac35e8988e54316425396198a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 12:49:02 2018 -0700
+
+    [khmer] Apply ccmp after basic features
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/974
+
+ src/hb-ot-shape-complex-khmer.cc | 22 +++++++++++++++++-----
+ 1 file changed, 17 insertions(+), 5 deletions(-)
+
+commit 1a96cc825dc9c8e3b6eef1403fe0864a1cfc0245
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 11:45:32 2018 -0700
+
+    [khmer] Rewrite most of shaper to better follow spec
+
+    Khmer spec has only one reordering phase, and only simple prebase
+    matra and Coeng-Ro reordering.  Implement that.  Specifically,
+    this was done to address recognizing different orders of the matra
+    and Coeng-Ro sequence.  That said, some combinations are now
+    reordered differently from Uniscribe.  Not clear if that's intended
+    or a bug in Uniscribe.  The following two sequences render the same
+    in Uniscribe whereas we reorder them differently:
+
+      U+17A0,U+17D2,U+179A,U+17C2
+      U+17A0,U+17C2,U+17D2,U+179A
+
+    For that reason, our test suite numbers regressed slightly.  Used
+    to be at 34 for fails, now at:
+
+    KHMER: 299080 out of 299124 tests passed. 44 failed (0.0147096%)
+
+    But generally a good change, and removed lots of code.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1026
+
+ src/hb-ot-shape-complex-indic-private.hh |   4 +-
+ src/hb-ot-shape-complex-khmer.cc         | 460
+ ++++---------------------------
+ src/hb-ot-shape-complex-private.hh       |  13 -
+ 3 files changed, 64 insertions(+), 413 deletions(-)
+
+commit f5152cea423947cd8a85332566443b4e2e091672
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 01:27:04 2018 -0700
+
+    [shaper] Move code around
+
+ src/hb-shaper-private.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 36d0fbbc52bdf2c71da022fb1fdc31eca17078ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 01:15:04 2018 -0700
+
+    [shaper] Remove a macro
+
+ src/hb-shaper-private.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit b1e5650c67266dc158f22355fed206cd1c413f70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 01:02:31 2018 -0700
+
+    [atomic] Make pointer get op relaxed instead of acquire
+
+    We only use it before cmpexch, so relaxed is fine and faster for
+    common case.
+
+ src/hb-atomic-private.hh | 34 +++++++++-------------------------
+ 1 file changed, 9 insertions(+), 25 deletions(-)
+
+commit 66ccd8ac405c9c25b37de9eb467a7382880dda35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 17:03:06 2018 -0700
+
+    [serialize] Increase stage count from 8 to 32
+
+    Indic shaper uses many stages.  Now we are provably not limiting
+    functionality whereas the previous limit of 8 was assuming real-world
+    practices.
+
+ src/hb-ot-layout-common-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit ee8cf919654cb191e955fe1f89b1ebfb2b8b32ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 16:59:41 2018 -0700
+
+    [serialize] Remove unused truncate() method
+
+ src/hb-machinery-private.hh | 6 ------
+ 1 file changed, 6 deletions(-)
+
+commit 8782f80cce147c101b605501d9fd9c7d64338314
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Jul 30 15:27:20 2018 -0700
+
+    fixed FDSelect0::sanitize
+
+ src/hb-ot-cff-common-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 9c4cadaef01733b32ab6190dd91552ee7145f3c3
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Jul 30 14:28:40 2018 -0700
+
+    Added sanitize functions & calls
+
+    Added sanitize functions to FDSelect
+    Added satnitize calls for FDSelect, VariationStore, FDArray, TopDict
+
+ src/hb-ot-cff-common-private.hh | 67
+ ++++++++++++++++++++++++++++++++---------
+ src/hb-ot-cff2-table.hh         | 26 +++++++++++-----
+ src/hb-subset-cff2.cc           |  2 +-
+ 3 files changed, 72 insertions(+), 23 deletions(-)
+
+commit 161b642ec5babc7e4b81d41f725d81ad2caa9330
+Merge: 3a61c3e9 5edf454a
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Jul 30 12:22:09 2018 -0700
+
+    Merge branch 'master' into cff-subset
+
+commit 5edf454aa64aad461c90bd991e7eaf27668b7e6b
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jul 26 17:42:02 2018 -0700
+
+    [subset] During lookup collection remember the features we've
+    already processed.
+
+ src/hb-ot-layout.cc                                |  26
+ +++++++++++++++++----
+ ...ase-minimized-hb-subset-fuzzer-5670861909524480 | Bin 0 -> 1298 bytes
+ ...b-subset-get-codepoints-fuzzer-6136125075750912 | Bin 0 -> 65816 bytes
+ 3 files changed, 21 insertions(+), 5 deletions(-)
+
+commit 42c183f80355fe7cadac2931a23d389285c8b98c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 27 14:55:29 2018 -0700
+
+    Minor
+
+ src/hb-ft.cc       | 5 +++--
+ src/hb-ot-shape.cc | 5 +++--
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+commit ecab6604e57ea2bb4e78250a7a400e15b3e86f7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 25 17:37:38 2018 -0700
+
+    [serialize] Allocate for markFilteringSet
+
+ src/hb-ot-layout-common-private.hh | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 7f08818c441517f73c5bea0a2a88f494dfc8fa58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 25 17:22:05 2018 -0700
+
+    Minor
+
+ src/hb-iter-private.hh      | 8 +++++---
+ src/hb-machinery-private.hh | 1 -
+ 2 files changed, 5 insertions(+), 4 deletions(-)
+
+commit 2e25d8f49181ab1d7fda520ae6587d293a982acf
+Author: prrace <philip.race@oracle.com>
+Date:   Fri Jul 27 13:58:27 2018 -0700
+
+    Fix unlikely leaks
+
+ src/hb-ft.cc       | 4 +++-
+ src/hb-ot-shape.cc | 4 +++-
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 3c2842cbcf8cded73d1e310379e1a4ca124a6fc2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 25 17:07:17 2018 -0700
+
+    Add hb-iter-private.hh
+
+    Unused so far.
+
+ src/Makefile.sources        |   1 +
+ src/hb-iter-private.hh      | 147
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-machinery-private.hh |   1 +
+ 3 files changed, 149 insertions(+)
+
+commit 92b1e025c639d006f55400bf68fc23bdeaa1c716
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 25 16:58:47 2018 -0700
+
+    Move some code from hb-open-type-private.hh to hb-machinery-private.hh
+
+ src/Makefile.sources        |   1 +
+ src/hb-machinery-private.hh | 702
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-open-type-private.hh | 669
+ +----------------------------------------
+ 3 files changed, 706 insertions(+), 666 deletions(-)
+
+commit 6b11fea99716e22522b563d919ef7c72fe9a3c45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 25 16:01:37 2018 -0700
+
+    [closure] Allocate out set on the stack
+
+ src/hb-ot-layout-gsubgpos-private.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 74467b790154838e86c3ca8df0eaafe82e87f976
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 25 14:30:07 2018 -0700
+
+    Fix compile
+
+ src/hb-shaper-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit bf90f35302c319ec4699ccbcd1e28b15ef2ec423
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 18:00:14 2018 -0700
+
+    [coretext] Add note
+
+ src/hb-shaper-private.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit fb58cb4b5ca7043fa746b1a01790abf53bedfa86
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jul 25 13:39:17 2018 -0700
+
+    [subset] Only used reachable lookups for gsub closure.
+
+ src/hb-subset-plan.cc | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit c38bd4025f3f6ff4c1a39cc106b8618361a0c62b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 09:43:27 2018 -0700
+
+    [closure] Separate in and out glyphs
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1107
+
+ src/hb-ot-layout-gsub-table.hh       | 26 ++++++++++++++++++--------
+ src/hb-ot-layout-gsubgpos-private.hh | 16 +++++++++++++++-
+ 2 files changed, 33 insertions(+), 9 deletions(-)
+
+commit 85646fdadb2f102333485e07425361795b4e0412
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Jul 23 15:37:18 2018 -0700
+
+    [subset] Limit the iterations of the closure algorithm.
+    Prevents O(n^2) run times.
+
+ src/hb-ot-layout-common-private.hh | 7 +++++++
+ src/hb-ot-layout.cc                | 5 ++++-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 94759d4cf8986388399026ef5204ac55ee187180
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 15:01:39 2018 -0700
+
+    Fix visibility on mingw32
+
+    Should fix bots again.
+
+ src/hb-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 61eddbd8ef64dc66e3c42723533d53967e61c9af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 14:44:10 2018 -0700
+
+    Fix infinite loop in loading num_glyphs within sanitizer
+
+ src/hb-open-type-private.hh | 13 ++++++++++---
+ src/hb-static.cc            |  4 +++-
+ 2 files changed, 13 insertions(+), 4 deletions(-)
+
+commit e22a48ac95a60fac5e1bca26eed7f5623d73a7be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 13:24:26 2018 -0700
+
+    One more visibility trick
+
+    Should fix Windows build again.
+
+ src/hb-common.cc  |  9 +++++++++
+ src/hb-private.hh | 20 ++------------------
+ src/hb-static.cc  |  4 +++-
+ 3 files changed, 14 insertions(+), 19 deletions(-)
+
+commit e57a638bdec378eed8e83513818c8add3ffae896
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 12:00:02 2018 -0700
+
+    One more
+
+ src/hb-ot-cmap-table.hh | 40 ++++++++++++++++++++--------------------
+ 1 file changed, 20 insertions(+), 20 deletions(-)
+
+commit 36ed163fdd50419e4619c665a4a9dbf97f66c349
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 11:57:45 2018 -0700
+
+    Remove unnecessary OT:: namespace specifiers
+
+ src/hb-ot-cmap-table.hh       | 30 +++++++++++++++---------------
+ src/hb-ot-color-sbix-table.hh |  4 ++--
+ src/hb-ot-color-svg-table.hh  |  4 ++--
+ src/hb-ot-glyf-table.hh       |  4 ++--
+ src/hb-ot-hmtx-table.hh       |  2 +-
+ src/hb-ot-maxp-table.hh       |  6 +++---
+ src/hb-ot-os2-table.hh        |  4 ++--
+ src/hb-ot-post-table.hh       |  2 +-
+ 8 files changed, 28 insertions(+), 28 deletions(-)
+
+commit c6bc7c38314ea831418fdd1434bbe5afc0875f33
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 11:46:46 2018 -0700
+
+    Set num glyphs on sanitizer reference_table()
+
+    Move out-of-class definitions of two methods to hb-static so they
+    are accessible in libharfbuzz-subset.
+
+ src/hb-face.cc              | 20 --------------------
+ src/hb-open-type-private.hh |  1 +
+ src/hb-static.cc            | 22 ++++++++++++++++++++++
+ 3 files changed, 23 insertions(+), 20 deletions(-)
+
+commit 9401829d4e93f6f433957fa2d053f3b9d42da557
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 22 22:50:58 2018 -0700
+
+    Remove Sanitizer<>
+
+ src/hb-open-type-private.hh | 16 +---------------
+ 1 file changed, 1 insertion(+), 15 deletions(-)
+
+commit 8e3e41272b3896274459c5961aac813ef2666321
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 22 22:49:26 2018 -0700
+
+    Port rest of code away from Sanitizer<>
+
+ src/hb-face.cc | 4 ++--
+ src/main.cc    | 3 +--
+ 2 files changed, 3 insertions(+), 4 deletions(-)
+
+commit d6a8f64045ca3bf4c7d01520909fa0c7dfca4d64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 22 22:47:19 2018 -0700
+
+    Port dump-emoji away from Sanitizer<>
+
+ src/dump-emoji.cc | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit 14f78d2b3bb1e1292efbd6a3e3f0d618179c171a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 22 22:45:26 2018 -0700
+
+    .
+
+ src/hb-aat-layout.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 4547051f48ca6aa53309b81a768b5b44c4ab6e3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 22 22:44:22 2018 -0700
+
+    Minor
+
+ src/hb-open-file-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 740ae27d5c0f5ff87e2ff489fb49d5db1a0c95be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 22 22:40:56 2018 -0700
+
+    Port sbix off of Sanitizer<>
+
+ src/hb-ot-color-sbix-table.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 9583e0077d0a3a043f8b5bd23925014e04da8d32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 22 22:40:32 2018 -0700
+
+    Port more off of Sanitizer<>
+
+ src/hb-face.cc                |  4 ++--
+ src/hb-open-type-private.hh   |  2 +-
+ src/hb-ot-cmap-table.hh       |  2 +-
+ src/hb-ot-color-cbdt-table.hh |  4 ++--
+ src/hb-ot-color-svg-table.hh  |  4 +---
+ src/hb-ot-glyf-table.hh       |  8 ++++----
+ src/hb-ot-hmtx-table.hh       | 10 +++++-----
+ src/hb-ot-kern-table.hh       |  2 +-
+ src/hb-ot-layout.cc           |  6 +++---
+ src/hb-ot-maxp-table.hh       |  2 +-
+ src/hb-ot-os2-table.hh        |  2 +-
+ src/hb-ot-post-table.hh       |  2 +-
+ src/hb-subset.cc              |  4 +---
+ 13 files changed, 24 insertions(+), 28 deletions(-)
+
+commit e7737b41d793bfce9455d1797eb5e0af60794f23
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 22 22:24:31 2018 -0700
+
+    Add sanitizer reference_table, also fix clang build
+
+    Clang is being really peculiar.  Fix with:
+
+    -  inline hb_blob_t *sanitize (hb_blob_t *blob) { return
+    c->sanitize<Type> (blob); }
+    +  inline hb_blob_t *sanitize (hb_blob_t *blob) { return
+    c[0].template/*clang idiosyncrasy*/sanitize_blob<Type> (blob); }
+
+ src/hb-open-type-private.hh | 10 ++++++++--
+ src/hb-ot-post-table.hh     |  2 +-
+ src/hb-subset-glyf.cc       |  2 +-
+ src/hb-uniscribe.cc         |  2 +-
+ 4 files changed, 11 insertions(+), 5 deletions(-)
+
+commit 62fa7cd1ccff4d4448ef84f9cc146464672636aa
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Apr 13 18:45:37 2018 -0400
+
+    Order Chakma split vowels in accordance with NFC
+
+    Fixes #1105.
+
+ src/gen-use-table.py                               |  10 ++++++++++
+ src/hb-ot-shape-complex-use-table.cc               |   4 ++--
+ src/hb-ot-shape-complex-use.cc                     |  21
+ +--------------------
+ .../2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf   | Bin 0 -> 1344 bytes
+ test/shaping/data/in-house/tests/use.tests         |   5 +++++
+ 5 files changed, 18 insertions(+), 22 deletions(-)
+
+commit 0c1b287b72e91e0898d75acb5d5acf1c6b9a7498
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 21 21:14:48 2018 +0430
+
+    Add a new API, hb_ot_layout_get_feature_name_ids (#976)
+
+    This new API returns cvXX and ssXX related NameId, things like
+    featUiLabelNameId, featUiTooltipTextNameId, sampleTextNameId,
+    ... of cvXX
+    and UINameId of ssXX, in a unified way.
+
+    However HarfBuzz currently doesn't expose an API for retrieving
+    the actual
+    information associated with NameId from the `name` table and that
+    should be
+    done separately.
+
+ docs/harfbuzz-sections.txt         |  1 +
+ src/hb-ot-layout-common-private.hh | 14 +++++++
+ src/hb-ot-layout.cc                | 86
+ ++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout.h                 |  8 ++++
+ 4 files changed, 109 insertions(+)
+
+commit 3a61c3e935cf649ba65ef0cb4daa9f06ab5d3c0a
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Jul 18 14:17:52 2018 -0700
+
+    first push of CFF/CFF2 work
+
+    Index, Dict structs
+    hooked up to hb-subset (takes CFF2, outputs empty CFF2)
+
+ src/Makefile.sources            |   4 +
+ src/hb-ot-cff-common-private.hh | 475
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-cff2-table.hh         | 386 ++++++++++++++++++++++++++++++++
+ src/hb-ot-font.cc               |   2 +
+ src/hb-subset-cff2.cc           | 121 ++++++++++
+ src/hb-subset-cff2.hh           |  38 ++++
+ src/hb-subset.cc                |   4 +
+ 7 files changed, 1030 insertions(+)
+
+commit 93b65d9fe331a217640069fad4159cb7c3ec35e6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 17 23:29:16 2018 +0430
+
+    Remove dump-fon (#1100)
+
+    It had interesting stuffs like EXE parsing and
+    big-endian parsers but added in an attempt to find
+    a solution for #681 which later found not related.
+
+ src/Makefile.am |   4 -
+ src/dump-fon.cc | 555
+ --------------------------------------------------------
+ 2 files changed, 559 deletions(-)
+
+commit d5cd47a69c40966b4d5b5aed87dd7ac6f070c37a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 17 22:32:37 2018 +0430
+
+    Remove AAT's gcid/fmtx (#1099)
+
+    We are not going to use them, at least in the foreseeable future
+
+ src/Makefile.sources     |  2 --
+ src/hb-aat-fmtx-table.hh | 67
+ --------------------------------------------
+ src/hb-aat-gcid-table.hh | 73
+ ------------------------------------------------
+ src/hb-aat-layout.cc     |  2 --
+ 4 files changed, 144 deletions(-)
+
+commit 1e9e344b2ba076a5fd6d57d1705e17a59c3875ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 19:17:59 2018 +0200
+
+    Fix hb_face_count() sanitize referencing
+
+ src/hb-face.cc | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit a8cc0b5907e61199334a3a886fe22efe9cc17149
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 19:09:03 2018 +0200
+
+    Remove TODO that is not gonna be done
+
+    Previously the idea was to cache sanitize results externally (think,
+    in Fontconfig) and avoid resanitizing every time.  That's, not a good
+    idea.
+
+ src/hb-open-type-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit be7073840097c873ce4954c6cffadab175a007d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 18:45:25 2018 +0200
+
+    Move sanitizer code around a bit
+
+ src/hb-aat-layout-common-private.hh |  4 +-
+ src/hb-open-type-private.hh         | 95
+ ++++++++++++++++++++-----------------
+ src/hb-ot-color-sbix-table.hh       | 12 ++---
+ src/hb-ot-layout-common-private.hh  |  3 --
+ 4 files changed, 58 insertions(+), 56 deletions(-)
+
+commit db5d430effce67db57ddea2545694b7275ee8b35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 18:14:45 2018 +0200
+
+    [aat] Update for blob changes
+
+    Also, uncomment code again, just "if (0)" it out, so it doesn't get
+    stale again.
+
+ src/hb-aat-layout.cc        | 58
+ ++-------------------------------------------
+ src/hb-open-type-private.hh | 27 +++++++++++++--------
+ src/hb-ot-layout-private.hh |  1 +
+ src/hb-ot-layout.cc         |  2 ++
+ src/hb-ot-shape.cc          |  6 ++---
+ 5 files changed, 25 insertions(+), 69 deletions(-)
+
+commit 68310a65cba7eed20f8696f4c670bb195677f467
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 13:20:40 2018 +0200
+
+    1.8.4
+
+ NEWS             | 7 +++++++
+ configure.ac     | 2 +-
+ src/hb-version.h | 4 ++--
+ 3 files changed, 10 insertions(+), 3 deletions(-)
+
+commit 04b7b81bcbf19cb85d06d930192d6591ba45ef72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 10:57:01 2018 +0200
+
+    Reland "Implement C++11-style GCC builtin atomic ops"
+
+    Fixed the crasher in it.
+
+ src/hb-atomic-private.hh | 22 +++++++++++++++++++---
+ src/hb-object-private.hh |  2 +-
+ 2 files changed, 20 insertions(+), 4 deletions(-)
+
+commit 019d18e9ae643134bfc3861be65ac618a5892c92
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 10:59:19 2018 +0200
+
+    Minor
+
+ src/Makefile.am      | 1 +
+ test/api/Makefile.am | 2 ++
+ 2 files changed, 3 insertions(+)
+
+commit 3edef5a19b5c0f30381ae6fe01c3370ded37f6ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 10:50:01 2018 +0200
+
+    Revert "Implement C++11-style GCC builtin atomic ops"
+
+    This reverts commit 21fa170f0bfb0109c506ed17f5aff8b062564ffa.
+
+    Is crashing.  Oops.
+
+ src/hb-atomic-private.hh | 22 +++-------------------
+ src/hb-object-private.hh |  2 +-
+ 2 files changed, 4 insertions(+), 20 deletions(-)
+
+commit 21fa170f0bfb0109c506ed17f5aff8b062564ffa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 17:58:02 2018 +0200
+
+    Implement C++11-style GCC builtin atomic ops
+
+    Hopefully fixes bots.
+
+ src/hb-atomic-private.hh | 22 +++++++++++++++++++---
+ src/hb-object-private.hh |  2 +-
+ 2 files changed, 20 insertions(+), 4 deletions(-)
+
+commit 804b59cf4901d471253016e0cbf82cc1bbbc1d15
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 15:44:58 2018 +0200
+
+    Relax C++11 atomic ops memory order to acquire-release
+
+ src/hb-atomic-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bda242409fc0cbb79a0ff00eba9856c4b0a9c7a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 15:41:09 2018 +0200
+
+    Implement C++11 <atomic> operations
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/345
+
+ src/hb-atomic-private.hh          | 27 ++++++++++++++++++++++++---
+ src/hb-open-type-private.hh       |  2 +-
+ src/hb-ot-shape-complex-arabic.cc |  2 +-
+ 3 files changed, 26 insertions(+), 5 deletions(-)
+
+commit 524411224054b23bab4adad7343314df45c9c183
+Merge: 2aae617a 269eb456
+Author: Cosimo Lupo <cosimo@anthrotype.com>
+Date:   Mon Jul 16 14:42:43 2018 +0200
+
+    Merge pull request #1094 from anthrotype/fix-appveyor-msys2
+
+    appveyor.yml: try updating msys2 to fix failing mingw-w64-x86_64 build
+
+commit 269eb45650be66901627da7f1014339065a948a5
+Author: Cosimo Lupo <cosimo@anthrotype.com>
+Date:   Mon Jul 16 14:14:42 2018 +0200
+
+    appveyor.yml: try only updating msys2 core, not the rest of the
+    packages
+
+    maybe it'll get a bit faster
+
+ appveyor.yml | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 3ab52c6cb5c405366af804d278216e2d02a39ecb
+Author: Cosimo Lupo <cosimo@anthrotype.com>
+Date:   Mon Jul 16 12:57:27 2018 +0200
+
+    appveyor.yml: pass --needed option to pacman
+
+    so it won't attempt reinstalling packages which are already installed
+
+ appveyor.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5631d70d36aa7952d343ea794bd5169a730706ae
+Author: Cosimo Lupo <cosimo@anthrotype.com>
+Date:   Mon Jul 16 12:41:59 2018 +0200
+
+    appveyor.yml: try updating msys2 to fix failing mingw-w64-x86_64 build
+
+    https://github.com/harfbuzz/harfbuzz/pull/1093#issuecomment-405201903
+    https://ci.appveyor.com/project/harfbuzz/harfbuzz/build/job/ky7lao1ii1bi7ew4#L71
+
+ appveyor.yml | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 2aae617a84f47836f10efd30df43e13e3a9447e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 11 17:27:23 2018 +0200
+
+    Move _hb_alignof later again
+
+    It uses constexpr...
+
+ src/hb-private.hh | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit f3a74c16ecafdca135a647ebe85117c35c1ef585
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 11 17:23:53 2018 +0200
+
+    Make hb_vector_t 8 bytes smaller
+
+ src/hb-dsalgs.hh | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit 44999f8b758374015f5d48c83f9adcb464607c2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 11 17:00:59 2018 +0200
+
+    Align NullPool and CrapPool to HB_VECTOR_SIZE
+
+ src/hb-dsalgs.hh  |  3 +--
+ src/hb-private.hh | 64
+ ++++++++++++++++++++++++++++++++-----------------------
+ src/hb-static.cc  |  4 ++--
+ 3 files changed, 40 insertions(+), 31 deletions(-)
+
+commit 20a318d06acaabdee0090339dfa621aab46f1441
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 11 17:00:13 2018 +0200
+
+    Fix return type of alignof() fallback
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 58cb4d9f73f1292454e3673d5e7ae5a58a566522
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 11 16:44:21 2018 +0200
+
+    Minor
+
+ test/api/test-ot-math.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7796857c93b779e3c93eedd1cceb217d691dfd81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 11 15:27:37 2018 +0200
+
+    Minor
+
+ RELEASING.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2b76767bf572364d3d647cdd139f2044a7ad06b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 11 15:27:13 2018 +0200
+
+    1.8.3
+
+ NEWS             | 8 ++++++++
+ configure.ac     | 2 +-
+ src/hb-version.h | 4 ++--
+ 3 files changed, 11 insertions(+), 3 deletions(-)
+
+commit 718dfd4189275b1e4233dc7c12ab457352fccfcb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 16:34:31 2018 +0200
+
+    Fix shift
+
+ src/hb-dsalgs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 25aa411ac524ed08624033da473a5e050ff41633
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 16:05:03 2018 +0200
+
+    Put back include dependencies
+
+ src/hb-object-private.hh | 2 ++
+ src/hb-private.hh        | 7 ++++---
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+commit 491d93bf74dd0483715ecca430715b69664e1211
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 16:03:31 2018 +0200
+
+    Move more stuff from hb-private.hh to hb-dsalgs.hh
+
+ src/hb-debug.hh   |   1 +
+ src/hb-dsalgs.hh  | 237
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-private.hh | 246
+ +-----------------------------------------------------
+ 3 files changed, 240 insertions(+), 244 deletions(-)
+
+commit f477765661c196ac17b2c86731881a3da36a5ae6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 15:49:05 2018 +0200
+
+    Move more stuff to hb-dsalgs.hh
+
+ src/hb-dsalgs.hh  | 83
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-private.hh | 81
+ -----------------------------------------------------
+ 2 files changed, 83 insertions(+), 81 deletions(-)
+
+commit be7f664f723fb4e7bcf15c1c2b7c6bec46f90393
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 15:23:08 2018 +0200
+
+    Move hb_bytes_t to hb-dsalgs.hh
+
+ src/hb-dsalgs.hh  | 45 ++++++++++++++++++++++++++++++++++-----------
+ src/hb-private.hh | 26 --------------------------
+ 2 files changed, 34 insertions(+), 37 deletions(-)
+
+commit 7a00f7eb2e3859db4563071934e76142bfd13916
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 14:42:10 2018 +0200
+
+    Remove hb_auto_array_t
+
+ src/hb-dsalgs.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit be458eb05962dd5f5c60a25f54cf0b20e7d8b055
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 14:41:04 2018 +0200
+
+    Include more basic internal headers from hb-private.hh
+
+ src/hb-blob-private.hh               | 2 --
+ src/hb-blob.cc                       | 1 -
+ src/hb-buffer-private.hh             | 1 -
+ src/hb-common.cc                     | 2 --
+ src/hb-coretext.cc                   | 1 -
+ src/hb-directwrite.cc                | 1 -
+ src/hb-face-private.hh               | 1 -
+ src/hb-font-private.hh               | 1 -
+ src/hb-ft.cc                         | 1 -
+ src/hb-map-private.hh                | 1 -
+ src/hb-object-private.hh             | 4 ----
+ src/hb-open-type-private.hh          | 1 -
+ src/hb-ot-layout-common-private.hh   | 1 -
+ src/hb-ot-layout-gsubgpos-private.hh | 1 -
+ src/hb-ot-shape-complex-arabic.cc    | 1 -
+ src/hb-private.hh                    | 6 +++++-
+ src/hb-set-private.hh                | 1 -
+ src/hb-shape-plan-private.hh         | 1 -
+ src/hb-shape-plan.cc                 | 1 -
+ src/hb-subset-input.cc               | 1 -
+ src/hb-subset-plan.hh                | 1 -
+ src/hb-subset.cc                     | 1 -
+ src/hb-unicode-private.hh            | 1 -
+ src/hb-uniscribe.cc                  | 1 -
+ src/hb-warning.cc                    | 4 +---
+ 25 files changed, 6 insertions(+), 32 deletions(-)
+
+commit bddeb2b10ca2f4b4bee6f7eaaf5615875a67111d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 14:12:37 2018 +0200
+
+    Minor renamings of internal inline functions
+
+ src/hb-buffer.cc               |  4 ++--
+ src/hb-dsalgs.hh               |  2 +-
+ src/hb-map-private.hh          |  2 +-
+ src/hb-open-type-private.hh    |  4 ++--
+ src/hb-ot-cmap-table.hh        |  2 +-
+ src/hb-ot-hdmx-table.hh        |  2 +-
+ src/hb-ot-layout-gpos-table.hh |  4 ++--
+ src/hb-ot-layout-gsub-table.hh |  2 +-
+ src/hb-ot-map.cc               |  4 ++--
+ src/hb-ot-shape.cc             |  4 ++--
+ src/hb-private.hh              | 27 ++++++++++++++-------------
+ src/hb-set-private.hh          |  6 +++---
+ src/hb-subset.cc               |  2 +-
+ 13 files changed, 33 insertions(+), 32 deletions(-)
+
+commit d652ef299d123f28409e755ed2d2411295293f19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 14:05:00 2018 +0200
+
+    Move hb_vector_t and hb_lockable_set_t to hb-dsalgs.hh
+
+ src/hb-dsalgs.hh  | 311
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-private.hh | 315
+ ------------------------------------------------------
+ 2 files changed, 311 insertions(+), 315 deletions(-)
+
+commit 9e53b083295ad910a87e778ebd16cbe69ebe2130
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 14:03:58 2018 +0200
+
+    Move hb_stable_sort to hb-dsalgs.hh
+
+    Also, include hb-dsalgs.hh from end of hb-pricate.hh
+
+ src/hb-dsalgs.hh                | 51
+ +++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-os2-unicode-ranges.hh |  1 -
+ src/hb-ot-post-table.hh         |  1 -
+ src/hb-private.hh               | 51
+ ++---------------------------------------
+ 4 files changed, 53 insertions(+), 51 deletions(-)
+
+commit 39f11d8e72c6b2568f3b70847c6c9d1f374cd49c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 14:01:39 2018 +0200
+
+    Minor
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 763f878cc0595162255c58ffe7a82ac1ca51cb0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 13:47:41 2018 +0200
+
+    Fix syntax
+
+    Oops.
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 83ea277178544cd7e417bdfb7b600ede94910e13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 13:17:27 2018 +0200
+
+    Add posix_memalign() fallback
+
+ configure.ac      |  2 +-
+ src/hb-private.hh | 40 ++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 41 insertions(+), 1 deletion(-)
+
+commit 292c100d6141eb2e981fa632602d73768f748727
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 13:16:52 2018 +0200
+
+    Always compile (but not use) alignof() and round() fallback codes
+
+    Catches compile-errors in them better.
+
+ src/hb-private.hh | 23 ++++++++++++-----------
+ 1 file changed, 12 insertions(+), 11 deletions(-)
+
+commit 27c5317d918971c2fb67c213621a19ac790440e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 13:03:42 2018 +0200
+
+    Fix alignof impl
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bca83618cda7ee4f683b4685d10db9e1bef4983c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 12:58:13 2018 +0200
+
+    Add fallback implementation for constexpr and alignof
+
+ src/hb-private.hh | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+commit 7cb47d0f3f202843ebc7fb8801bf388bb90ba3aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 10 12:51:29 2018 +0200
+
+    Minor
+
+ src/hb-set-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit bf9e9676dda686f5b76826b4e3148f4a0b512e3c
+Merge: 46d8f0d5 53f73409
+Author: Cosimo Lupo <cosimo@anthrotype.com>
+Date:   Mon Jul 9 20:24:22 2018 +0200
+
+    Merge pull request #1091 from anthrotype/fix-gen-def-py
+
+    gen-def.py: pass headers as arguments so that msys2 can convert
+    posix paths
+
+commit 53f73409a91241765ae6a0cadf7600676988b6af
+Author: Cosimo Lupo <cosimo@anthrotype.com>
+Date:   Mon Jul 9 18:54:23 2018 +0100
+
+    CMakeLists.txt: don't pass header args as single space-separated
+    string
+
+    let python's parse command-line args as usual
+
+ CMakeLists.txt | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 83d2233a5c47cf1feadcdece5bd4a6b498c6ee7a
+Author: Cosimo Lupo <cosimo@anthrotype.com>
+Date:   Mon Jul 9 18:48:20 2018 +0100
+
+    CMakeLists.txt: pass headers as arguments to gen-def.py; call using
+    PYTHON_EXECUTABLE
+
+ CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ccdd15655480fe35226c0b757e28d3527fe2e6af
+Author: Cosimo Lupo <cosimo@anthrotype.com>
+Date:   Mon Jul 9 18:26:44 2018 +0100
+
+    src/Makefile.am: pass headers to gen-def.py as arguments, not env vars
+
+ src/Makefile.am | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit e3a931ef0b86419b5e4ba17de51535393471ed9d
+Author: Cosimo Lupo <cosimo@anthrotype.com>
+Date:   Mon Jul 9 18:11:29 2018 +0100
+
+    gen-def.py: pass headers as arguments so that msys2 can convert
+    posix paths
+
+    When one is not using the msys2 python, the header files that are
+    passed in as environment
+    variable cannot be found.
+
+    https://ci.appveyor.com/project/fonttools/ttfautohint-py/build/1.0.65/job/rkremny4jjid9nl2#L803
+
+    This is because msys2 shell and make use POSIX paths
+    (e.g. /c/Users/clupo/...)
+    whereas non-msys2 python.exe uses native Windows paths
+    (e.g. C:\Users\clupo\...).
+
+    Msys2 will automatically convert command line arguments (but not
+    environment variables) from
+    POSIX to Windows paths when calling a native win32 executable,
+    so we pass the header paths
+    as arguments instead of environment variables.
+
+    This way the gen-def.py script can support both mingw python running
+    in an MSYS2 shell, and
+    native win32 python.
+
+ src/gen-def.py | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+commit 46d8f0d5521c3dd0b10c78e66153faefdb9046db
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Jul 6 15:47:03 2018 -0400
+
+    Do not enforce a native direction of LTR for Runic
+
+    Fixes #481
+
+ src/hb-common.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 936dadc6610666aa5781e8662b859f18f9baa636
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Sat Jul 7 11:08:17 2018 -0400
+
+    Regenerate the USE table for Grantha and Bhaiksuki (#1090)
+
+    Completes #1037 and fixes #1035.
+
+ src/hb-ot-shape-complex-use-table.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1ebaa090d80bf0b59308d2c70f5e58dd8da47450
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 5 14:04:13 2018 +0430
+
+    Disable vectorization
+
+    Disable vectorization for now.  To correctly use them, we should
+    use posix_memalign() to allocate them.  Otherwise, can cause
+    misaligned access.
+
+    https://bugs.chromium.org/p/chromium/issues/detail?id=860184
+
+ src/hb-private.hh | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 18a06f8a662ca7a9e63f74c6443e24a035c40655
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 5 14:03:48 2018 +0430
+
+    Fix warning
+
+    ../../src/hb-ot-layout-gsubgpos-private.hh:391:18: warning:
+    missed loop optimization, the loop counter may overflow
+    [-Wunsafe-loop-optimizations]
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 058708a665cdd9e796581dbcf60a5778d3f5e240
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 5 13:16:00 2018 +0430
+
+    Allow disabling vector_size use
+
+ src/hb-private.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit d8a7dedc83042c5a643195172830acf78f2e59ff
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 4 15:33:39 2018 +0430
+
+    Use CreateFileW explicitly and pass wchar_t to it (#1087)
+
+ src/hb-blob.cc | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+commit 9940504e933d6766f87dca7fccc3c2f889976a22
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 3 14:29:25 2018 +0430
+
+    [indic] Adjust left-matra repositioning and Halant,ZWJ sequence
+
+    From the new code (first paragraph is from the OT Devanagari spec.):
+
+      /*   o Reorder matras:
+       *
+       *     If a pre-base matra character had been reordered before
+       applying basic
+       *     features, the glyph can be moved closer to the main consonant
+       based on
+       *     whether half-forms had been formed. Actual position for
+       the matra is
+       *     defined as “after last standalone halant glyph, after
+       initial matra
+       *     position and before the main consonant”. If ZWJ or ZWNJ
+       follow this
+       *     halant, position is moved after it.
+       *
+       * IMPLEMENTATION NOTES:
+       *
+       * It looks like the last sentence is wrong.  Testing, with Windows
+       7 Uniscribe
+       * and Devanagari shows that the behavior is best described as:
+       *
+       * "If ZWJ follows this halant, matra is NOT repositioned after
+       this halant.
+       *  If ZWNJ follows this halant, position is moved after it."
+       *
+       * Test case, with Adobe Devanagari or Nirmala UI:
+       *
+       *   U+091F,U+094D,U+200C,U+092F,U+093F
+       *   (Matra moves to the middle, after ZWNJ.)
+       *
+       *   U+091F,U+094D,U+200D,U+092F,U+093F
+       *   (Matra does NOT move, stays to the left.)
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1070
+
+    Test case added with Adobe Devanagari.
+
+ src/hb-ot-shape-complex-indic.cc                   |  37
+ +++++++++++++++++++++
+ .../8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf   | Bin 0 -> 4364 bytes
+ .../data/in-house/tests/indic-joiners.tests        |   4 +++
+ 3 files changed, 41 insertions(+)
+
+commit 2cb075fe26201f3e370fccfff6c1bc242b5acc79
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 3 13:04:05 2018 +0430
+
+    Fix unused function '_hb_mapped_file_destroy' if no mmap
+
+ src/hb-blob.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 343e8c694b03eea625523229a9468fbb456e3aea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 3 12:43:59 2018 +0430
+
+    1.8.2
+
+ NEWS             | 8 ++++++++
+ configure.ac     | 2 +-
+ src/hb-version.h | 4 ++--
+ 3 files changed, 11 insertions(+), 3 deletions(-)
+
+commit 29e7879bcf3fe955a0be3bb41e929e68f39ad01e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 3 12:38:21 2018 +0430
+
+    Disable .dfont code for now
+
+    The get_table imple was wrong, as table offsets in a dfont are
+    relative to the resource.  We were treating them as relative to
+    the big blob itself.  To be fixed.
+
+    Part of https://github.com/harfbuzz/harfbuzz/pull/1085
+
+ src/hb-open-file-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 32348a43c154eac6bfb21b9e8044b38ed763601e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 1 15:32:43 2018 +0430
+
+    Fix trak table apply logic
+
+    In collaboration with Behdad
+
+ src/hb-aat-layout-trak-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 225b92b7d4437360f8779850ee0aae85966679b5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 1 14:32:00 2018 +0430
+
+    Support dfont font files (#949)
+
+ src/hb-open-file-private.hh | 196
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-open-type-private.hh |   1 +
+ src/main.cc                 |   3 +
+ 3 files changed, 200 insertions(+)
+
+commit 5d8cafcf6a47ce73afff06499f6be23c72ab6797
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 1 01:54:14 2018 +0430
+
+    Improve nommap naming and use C style comments on create_from_file
+    (#1084)
+
+ .circleci/config.yml |  2 +-
+ src/hb-blob.cc       | 16 ++++++++--------
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+commit d3c0980ac234698627cb281e5526cc99139eed30
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 30 15:59:25 2018 +0430
+
+    Adjust MarkBasePos heuristic in presence of MultipleSubst
+
+    From the issue:
+    "In this font, the virama,ya first forms a ligature, then decomposes
+    back to
+    virama,ya. This causes those two to be marked parts of a MultipleSubst
+    sequence. When attaching the matra, we look for the first of the
+    MultipleSubst
+    sequence because that's where we attach to (because of eg #740). In
+    this case,
+    the first glyph in the MultipleSubst sequence is a mark, so we skip
+    it and
+    attach to the base char before it."
+
+    Font in question is Nirmala UI from Windows 10. Test sequence:
+
+      U+0926,U+094D,U+092F,U+0941
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1020
+
+ src/hb-ot-layout-gpos-table.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 8b9cbe3b24be2ae0166e682103e22ec916316ecf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 30 12:28:03 2018 +0430
+
+    [indic] Tweak for old-spec Bengali and halant-ya-halant
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1073
+
+ src/hb-ot-shape-complex-indic.cc | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+commit 9541c9dae10156fb61e4786545d1976cdcfb6bda
+Author: punchcutter <zarijoscha@gmail.com>
+Date:   Sun Jun 24 22:54:57 2018 -0700
+
+    Rebase and update USE overrides for Bhaiksuki Gap Fillers and
+    Grantha Anusvara
+
+ src/gen-use-table.py | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 7b8dfac560abe89d48cfc2f6efb4a61820bd28bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 30 09:16:54 2018 +0430
+
+    [khmer] Fix infinite-loop in cluster merging
+
+    Indic shaper already had this check.  We removed it when forking
+    Khmer shaper by mistake.
+
+    Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1464623
+
+ src/hb-ot-shape-complex-khmer.cc | 31 +++++++++++++++++--------------
+ 1 file changed, 17 insertions(+), 14 deletions(-)
+
+commit 25970a93aa6596d50ae538c6274625f95153572c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 28 14:32:36 2018 +0430
+
+    armcc compatibility, don't use EINTR if doesn't exist
+
+    Fixes #1081
+
+ src/hb-blob.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 8a51f91b7035bbfaf39af1b962faf1613d2ea3b7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 28 13:22:21 2018 +0430
+
+    Minor on hb_blob_create_from_file, reuse ferror result
+
+    Oops
+
+ src/hb-blob.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 71971800ed1c0501a58e6ff7730e3cebec2ef2f8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jun 27 18:14:52 2018 +0430
+
+    [ci] Don't fail on apt update and revive clang-O3-O0
+
+ .circleci/config.yml | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7b4099f35f766d33d483a4b9d0805ef16020ea23
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jun 27 16:54:44 2018 +0430
+
+    Minor, rename blob to data on blob_from_file
+
+ src/hb-blob.cc | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit fa090ed4d47df12b2e611c9a667c398742f7e4ba
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jun 27 14:13:26 2018 +0430
+
+    Minor touches on hb_blob_create_from_file (#1079)
+
+    * Handle EINTR on fallback reader
+    * Increase fallback reader limitation size limitation to 2 << 28
+    * Ensure _O_BINARY does exist if MMAP is used on Windows
+      (maybe superfluous but makes me more confident)
+
+ src/hb-blob.cc | 22 +++++++++++++---------
+ 1 file changed, 13 insertions(+), 9 deletions(-)
+
+commit 01dff1ea1aa871fa19a92c2afd63c8cb5dd6e455
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 26 18:00:58 2018 -0400
+
+    Make round() fallback portable to systems that do have round()
+
+    Makes compiling without HAVE_ROUND on systems that do have it work.
+
+ src/hb-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7db2e9ea38329b9393c9e8cc905b180735c9b0f4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 26 10:46:10 2018 +0430
+
+    Minor on hb_blob_create_from_file
+
+    Add one more "unlikely" annotation and use explicit nullptr check
+    for more consistency.
+
+ src/hb-blob.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4f8753464ae44dfb60bee81ede10448175db7b90
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jun 22 15:29:34 2018 -0700
+
+    [subset] Add fuzzer test case that caused a timeout to the corpus.
+
+ ...testcase-minimized-hb-subset-fuzzer-5750092395970560 | Bin 0 ->
+ 72435 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 35ce8f31d37cf7c2a1f8265d36ba4c2c9a3efb2c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 25 22:23:43 2018 +0430
+
+    Unify our pipe reader with the fallback reader (#1068)
+
+    And assign one bot to use the path always using NOMMAPFILEREADER
+    token.
+
+    It's limited to 200mb so no more fun with using /dev/zero on hb-view!
+
+ .circleci/config.yml |   6 +-
+ src/hb-blob.cc       | 152
+ ++++++++++++++++++++++-----------------------------
+ 2 files changed, 68 insertions(+), 90 deletions(-)
+
+commit f57804a8a596e88843ddc8b88afac7526349b89b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 25 18:45:49 2018 +0430
+
+    Resolve ttx absolute path before use (#1075)
+
+ test/subset/run-tests.py | 101
+ ++++++++++++++++++++++++++---------------------
+ 1 file changed, 57 insertions(+), 44 deletions(-)
+
+commit 159ddb872986f121818e816d2ea75d271075ba1f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 24 23:09:16 2018 +0430
+
+    Treat - just as /dev/stdin and remove one extra file reader (#1065)
+
+ util/options.cc | 27 +++++++++------------------
+ 1 file changed, 9 insertions(+), 18 deletions(-)
+
+commit b2a187918757a0faaf0f564ec2b0766c09fa364c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 23 10:32:28 2018 -0400
+
+    In Coverage iterator, bail out if table smells
+
+    In particular, if CoverageFormat2 has unsorted ranges, bail out.
+    Otherwise, 64k ranges of each 64k glyphs can DoS closure() method.
+
+    We can do the same for CoverageFormat1, but that one does not expose
+    the quadratic behavior, so, fine.
+
+ src/hb-ot-layout-common-private.hh | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+commit 941f2b85489b344698bf036922c589483034a7f2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 18 20:35:40 2018 +0430
+
+    Support pipe and friends on hb_blob_create_from_file (#1061)
+
+    With this hb-view/hb-shape support pipes and possibly socket and
+    named pipe
+    also, anything fails just on mmap.
+
+    We can later do the same for Windows also.
+
+    This however reveals two issues, the fact most of our bots don't
+    have HAVE_MMAP and using
+    this instead the other fread/fopen reader can make failure on CI. I
+    should look at them separately
+    this change however is very low risk I believe.
+
+ src/hb-blob.cc | 44 +++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 43 insertions(+), 1 deletion(-)
+
+commit d0c2889dfc43da92c76d6eab5482b1298744dc9c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 18 19:59:33 2018 +0430
+
+    Revert file blob sanitization and index checking (#1062)
+
+    As
+    https://github.com/harfbuzz/harfbuzz/pull/1059#issuecomment-397912812
+    we
+    like to still work with blobs that harfbuzz itself can't handle
+    directly that are failing sanitization
+    currently apparently.
+
+ util/options.cc | 12 ++----------
+ util/options.hh |  2 +-
+ 2 files changed, 3 insertions(+), 11 deletions(-)
+
+commit c53697d3f2a3fae8b68ec4c5146c7000a07e0963
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 17 17:04:55 2018 +0430
+
+    Verbose fail when something is wrong with hb-shape/hb-view input
+    font file (#1059)
+
+    This checks if the blob isn't empty and uses `hb_face_count`
+    to see if the font file passes the simple font file sanitization
+    so can detect if the input is actually a font and checks also
+    whether input font-index is out of range.
+
+ util/options.cc | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+commit aa0c5df4199ef4e96df2b856c8f629e49fdd5120
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 17 16:49:34 2018 +0430
+
+    Fix reading fonts from stdin (#1060)
+
+    We were passing the font path directly to freetype so rendering
+    was broken when we are getting the font from stdin.
+
+    This fixes it by using FT_New_Memory_Face instead.
+
+    This fixes:
+    * build/util/hb-view /dev/stdin text < font.ttf
+    * build/util/hb-view - text < font.ttf
+    * cat font.ttf | build/util/hb-view - text
+
+    but doesn't work on
+    * cat font.ttf | build/util/hb-view /dev/stdin text
+
+    which I will try to fix separately.
+
+ util/helper-cairo.cc | 14 ++++++++++----
+ util/options.cc      |  5 ++---
+ util/options.hh      |  4 +++-
+ 3 files changed, 15 insertions(+), 8 deletions(-)
+
+commit 3654d9be6b017e66307fe0ffe635266938b14702
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 12 19:38:04 2018 -0400
+
+    1.8.1
+
+ NEWS             | 8 ++++++++
+ configure.ac     | 2 +-
+ src/hb-version.h | 4 ++--
+ 3 files changed, 11 insertions(+), 3 deletions(-)
+
+commit f3e58ab8a957cdf36bddef793c473664744885a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 12 19:32:04 2018 -0400
+
+    [docs] Enlist misc new symbols
+
+ RELEASING.md               |  3 ++-
+ docs/harfbuzz-sections.txt | 24 +++++++++++++++++++++++-
+ 2 files changed, 25 insertions(+), 2 deletions(-)
+
+commit f6893ef82c51a35dd075973b2041b1b19f81faff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 12 19:20:20 2018 -0400
+
+    Move hb-version.h generation to Makefile
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/864
+
+    Unfortunately 1.7.7 and 1.8.0 went out with the wrong hb-version.h
+    contents.
+
+ configure.ac     |  1 -
+ src/Makefile.am  | 21 ++++++++++++++++-----
+ src/hb-version.h |  6 +++---
+ 3 files changed, 19 insertions(+), 9 deletions(-)
+
+commit cc0b04f48f261c1deb8f4142e7ae0222fbec67fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 12 18:24:54 2018 -0400
+
+    [subset] Remove HB_SUBSET_BUILTIN
+
+    Just include hb-static.cc in libharfbuzz-subset.so source list as
+    well.  Those building it built-in will include hb-static.cc once
+    already.  No need for any gymnastics.
+
+ src/Makefile.sources | 1 +
+ src/hb-subset.cc     | 5 -----
+ 2 files changed, 1 insertion(+), 5 deletions(-)
+
+commit ba0ea56efab9caa942d59bf51c78e490969cab87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 11 23:24:41 2018 -0400
+
+    [substitute-closure] Rename function for clarity
+
+ src/hb-ot-layout-gsub-table.hh       | 4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 7b5ce416383101cb9d72a775a32d0088984e6817
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 11 23:23:40 2018 -0400
+
+    Whitespace
+
+ src/hb-ot-layout-gsub-table.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit c4d0d11c55f018026fc9c1db75fe7a4f8a38f81f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 11 22:11:45 2018 -0400
+
+    [vector] Always 0-fill new items
+
+ src/hb-private.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit a7e1b4a3b2d7b853ca244156571dd83321739bb1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 11 22:05:08 2018 -0400
+
+    Fix compiler warning re reordering of initializations
+
+ src/hb-ot-layout-gsubgpos-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f56cd9df10824fbbef52172470d07ff673d460cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 11 22:02:38 2018 -0400
+
+    Style
+
+ src/hb-ot-layout.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit a95cde15af4aa34e76c4394dfdf17e7d25164d5b
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Mon Jun 11 18:09:35 2018 -0700
+
+    [hb-set] Additional testcase for hb-set-intersect.
+
+ test/api/test-set.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 82484b05ca7a51dec6f3f9e9b0d7967823d7657f
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Mon Jun 11 20:55:14 2018 -0700
+
+    [hb-set] Don't shrink vectors until after processing their contents.
+
+    Fixes #1054.
+
+ src/hb-set-private.hh | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+commit eb585033cae33ca069bbcdaa21e4074678b6a6e9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 11 03:47:43 2018 +0430
+
+    Fetch the updated dwrite_1.h header from a better place
+
+    Following to
+    https://ci.appveyor.com/project/harfbuzz/harfbuzz/build/1.0.1693/job/mfkjdhcdykjuqdfc
+
+ appveyor.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b8e406f0c7c381d46e2d2bbe35a6107d560f2122
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 10 17:22:38 2018 -0400
+
+    More fixes for SunStudio 12.6 build
+
+    Followup to https://github.com/harfbuzz/harfbuzz/pull/1053
+
+ src/hb-ft.cc     | 8 ++++----
+ src/hb-subset.cc | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 498e4373dc2eb98fa9b18a0824c7912ed84a4c80
+Author: prrace <philip.race@oracle.com>
+Date:   Sat Jun 9 16:04:28 2018 -0700
+
+    Fix SunStudio 12.6 build (#1053)
+
+ src/hb-face.cc    | 2 +-
+ src/hb-private.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 46f7e7760f4c9b1b2886a27eff3c0fabdab45dbe
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jun 7 15:55:45 2018 -0700
+
+    [subset] Use REPLACEME instead of version.
+
+ src/hb-subset-input.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fc246ec985890f8256f6e03cdf74c86b9b51ff2a
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jun 7 15:54:19 2018 -0700
+
+    [subset] Move variable declaration out of loop.
+
+ test/api/test-subset-glyf.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 197cb18b22ce11f32f5f2c68c13f7068fb5cc338
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jun 7 15:32:52 2018 -0700
+
+    [subset] Add test cases for gsub closure in subsetting.
+
+ test/api/fonts/Roboto-Regular.gsub.fi.ttf   | Bin 0 -> 2652 bytes
+ test/api/fonts/Roboto-Regular.gsub.fil.ttf  | Bin 0 -> 3228 bytes
+ test/api/fonts/Roboto-Regular.nogsub.fi.ttf | Bin 0 -> 1856 bytes
+ test/api/test-subset-glyf.c                 |  52
+ ++++++++++++++++++++++++++++
+ 4 files changed, 52 insertions(+)
+
+commit 37eab27be3b88079614f66e484c700bb2d40af10
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jun 7 14:39:03 2018 -0700
+
+    [subset] Add fuzzing of gsub closure to hb-subset-fuzzer.
+
+ test/fuzzing/hb-subset-fuzzer.cc | 27 ++++++++++++++++++++-------
+ 1 file changed, 20 insertions(+), 7 deletions(-)
+
+commit feb23892a36a7c855306db6d21521d5e8362bdf7
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jun 7 14:32:34 2018 -0700
+
+    [subset] Use gsub closure if ot layout is not being dropped.
+
+ src/hb-ot-layout.cc   | 10 ++++++++--
+ src/hb-subset-plan.cc | 20 ++++++++++++++++++--
+ 2 files changed, 26 insertions(+), 4 deletions(-)
+
+commit a5673da9be70f2ba0ff79aab4bd9a4480cb0223e
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jun 7 14:23:03 2018 -0700
+
+    [subset] Add drop_ot_layout setting to subset input.
+
+ src/hb-subset-input.cc   | 17 +++++++++++++++++
+ src/hb-subset-plan.cc    |  1 +
+ src/hb-subset-plan.hh    |  1 +
+ src/hb-subset-private.hh |  1 +
+ src/hb-subset.cc         |  3 ++-
+ src/hb-subset.h          |  3 +++
+ 6 files changed, 25 insertions(+), 1 deletion(-)
+
+commit 57badadb769d0bcdbee00afce3af4972bc5c6bf1
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 6 16:02:51 2018 -0700
+
+    [subset] add a new closure call to hb-ot-layout that can compute
+    the closure over multiple lookups.
+
+ src/hb-ot-layout.cc | 26 ++++++++++++++++++++++++++
+ src/hb-ot-layout.h  |  6 ++++++
+ src/hb-ot-shape.cc  | 10 +---------
+ 3 files changed, 33 insertions(+), 9 deletions(-)
+
+commit 11f1f4131b722f0e0338bee222a78110806f5a3d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 6 16:46:50 2018 -0700
+
+    [set] Add is_subset
+
+    New API:
+    +hb_set_is_subset()
+
+ src/hb-set-private.hh       | 13 +++++++++++++
+ src/hb-set.cc               | 22 ++++++++++++++++++++--
+ src/hb-set.h                |  4 ++++
+ test/api/test-set.c         |  4 ++++
+ test/api/test-subset-glyf.c | 11 +++++------
+ 5 files changed, 46 insertions(+), 8 deletions(-)
+
+commit 45186b9b8cbffa7b5c8509624fb431a0f79f5130
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jun 5 17:14:42 2018 -0700
+
+    [subset] Add memoization of GSUB lookup closures.
+
+ src/hb-ot-layout-gsub-table.hh       | 15 +++++++++++++--
+ src/hb-ot-layout-gsubgpos-private.hh | 20 ++++++++++++++++++++
+ src/hb-ot-layout.cc                  |  6 ++++--
+ 3 files changed, 37 insertions(+), 4 deletions(-)
+
+commit 78d92e0f27e8b688efac014526ef5c4f1f53a58f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 6 15:24:43 2018 -0700
+
+    Minorish
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 676b19f0d1d21629b654e69f220bf53965735940
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 6 15:23:35 2018 -0700
+
+    Compiler gymnastics
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/630
+
+ src/hb-private.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 0a5952e8ddb3ec955496d582ef5a559a27684a0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 6 14:55:30 2018 -0700
+
+    Move prime_for back into map
+
+    This was causing problem on systems without visibility when map
+    was used
+    from both libharfbuzz and libharfbuzz-subset. Sigh.
+
+    https://ci.appveyor.com/project/harfbuzz/harfbuzz/build/1.0.1669/job/dey47nmff0770vp3
+
+ src/hb-map-private.hh | 53
+ ++++++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-private.hh     |  3 ---
+ src/hb-static.cc      | 51
+ -------------------------------------------------
+ 3 files changed, 52 insertions(+), 55 deletions(-)
+
+commit a2a1484ef93d5b5c3748b15219eca669d866b0a9
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Jun 6 12:57:28 2018 -0400
+
+    Convert Consonant_Initial_Postfixed to CONS_FINAL
+
+    Consonant_Initial_Postfixed was split off of
+    Consonant_Succeeding_Repha,
+    so it should correspond to the same USE class, CONS_FINAL.
+
+ src/gen-use-table.py                 | 5 +++--
+ src/hb-ot-shape-complex-use-table.cc | 2 +-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 37986aa9b7ac44b1c4c50ebba9902d06cc8a45e0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 18:04:40 2018 -0700
+
+    1.8.0
+
+ NEWS         | 5 +++++
+ configure.ac | 2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 9d3cd13c30d8df41a2f7ff6c4208a1b2d75ddd64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 17:59:31 2018 -0700
+
+    [ucdn] Update to Unicode 11
+
+    https://github.com/grigorig/ucdn/issues/19
+
+ src/hb-ucdn.cc        |    7 +
+ src/hb-ucdn/ucdn_db.h | 2754
+ ++++++++++++++++++++++++++-----------------------
+ 2 files changed, 1479 insertions(+), 1282 deletions(-)
+
+commit 060e6b4a13a4224de885214d374b079610224123
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 17:31:46 2018 -0700
+
+    Update to Unicode 11.0.0
+
+    UCDN is not updated yet.
+
+ src/gen-use-table.py                    | 13 +++--
+ src/hb-common.cc                        |  5 ++
+ src/hb-common.h                         | 11 ++++
+ src/hb-ot-shape-complex-arabic-table.hh | 43 ++++++++++++---
+ src/hb-ot-shape-complex-indic-table.cc  | 77 ++++++++++++++-------------
+ src/hb-ot-shape-complex-private.hh      |  9 ++++
+ src/hb-ot-shape-complex-use-machine.rl  |  2 +-
+ src/hb-ot-shape-complex-use-table.cc    | 94
+ +++++++++++++++++++++------------
+ 8 files changed, 170 insertions(+), 84 deletions(-)
+
+commit 105a3b5e2d2ff228cdc1fbe8618f6c8fdfdabe9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 15:31:04 2018 -0700
+
+    Minor
+
+ src/Makefile.am | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 60c516789bab499c5a423f80071638955b7b13fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 15:20:23 2018 -0700
+
+    [RELEASING] Update
+
+ RELEASING.md | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit df01f3e560d21900e234c4a6616bcf9c98f5f567
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 15:17:39 2018 -0700
+
+    1.7.7
+
+ NEWS           | 37 +++++++++++++++++++++++++++++++++++++
+ RELEASING.md   |  5 +++--
+ configure.ac   |  2 +-
+ src/hb-blob.cc |  2 +-
+ src/hb-face.cc |  2 +-
+ src/hb-map.cc  | 28 ++++++++++++++--------------
+ src/hb-map.h   |  2 +-
+ 7 files changed, 58 insertions(+), 20 deletions(-)
+
+commit ba3b6d6c6512b58a3d0e5277fbbe4e69b085467d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 4 16:47:45 2018 -0700
+
+    [khmer] Fix Coeng vs Halant confusion
+
+    Test suite results are unchanged (34).
+
+ src/hb-ot-shape-complex-khmer.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 8220ef8a54bcc94f122d50804c0a5e829de81be1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 5 22:50:53 2018 +0430
+
+    Fix hb_face_count build issue
+
+    I should've rebased #1002 before the merge, my bad
+
+ src/hb-face.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 32da0c6bc4770568346f6c05fd6b374be2bbd2b2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 5 18:56:26 2018 +0430
+
+    Add hb_face_count, a new API (#1002)
+
+    Simply, it returns the number of faces on a font blob.
+
+    To be used on hb-sanitizer tool but other clients also
+    can benefit from it.
+
+ TODO                       |  2 -
+ docs/harfbuzz-sections.txt |  1 +
+ src/hb-face.cc             | 95
+ ++++++++++++++++++++++++++++------------------
+ src/hb-face.h              |  4 ++
+ 4 files changed, 64 insertions(+), 38 deletions(-)
+
+commit 4a115fe7fe71e381decb7c894208540663419f75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 4 15:40:43 2018 -0700
+
+    [sinhala] Move reph to after post-consonants
+
+    Apparently this changed between Win 7 and Win 10.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/967
+
+    To be continued in https://github.com/harfbuzz/harfbuzz/issues/1044
+
+ src/hb-ot-shape-complex-indic.cc                         |   2 +-
+ test/shaping/data/in-house/Makefile.sources              |   1 +
+ .../fonts/5af5361ed4d1e8305780b100e1730cb09132f8d1.ttf   | Bin 0 ->
+ 3152 bytes
+ test/shaping/data/in-house/tests/sinhala.tests           |   1 +
+ 4 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 3e494caae3dc096339a46d5a3fdeb5a718de6911
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 4 15:38:05 2018 -0700
+
+    [test] Fix record-test to use gids not glyph-names
+
+    as those might not match what FontTools think of the glyphs if font
+    does NOT have glyph names.
+
+ test/shaping/record-test.sh | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 58400a2ad8b18aeb1da40d6c327135cd62312316
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 2 20:30:09 2018 -0700
+
+    Remove DISALLOW_* from vector, set, and map
+
+    Some of the build bots, still fail on this.  I suppose mine pass
+    because
+    I enable C++11...
+
+    Anyway, remove these again.
+
+ src/hb-map-private.hh | 3 ---
+ src/hb-private.hh     | 6 ------
+ src/hb-set-private.hh | 3 ---
+ src/hb-subset-plan.hh | 3 ++-
+ 4 files changed, 2 insertions(+), 13 deletions(-)
+
+commit f9abbf83b6404bc9eb0c0983f562c9dbba1ef57c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 2 15:30:59 2018 -0700
+
+    Fix fallout from 975bdd5ef562e37655067b703b2b9ca7481f4985
+
+    Ouch!
+
+ src/hb-ot-map-private.hh   | 40 ++++++++++++++++++++++------------------
+ src/hb-ot-map.cc           | 11 +++++++++++
+ src/hb-ot-post-table.hh    |  3 ++-
+ src/hb-ot-shape-private.hh | 10 ++++++++--
+ src/hb-ot-shape.cc         |  2 ++
+ src/hb-subset.cc           |  2 ++
+ 6 files changed, 47 insertions(+), 21 deletions(-)
+
+commit f7515769fd024faca888a47c58f87fb868b0e760
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 1 17:48:37 2018 -0700
+
+    [vector] Use Crap pool in push() as well
+
+ src/hb-coretext.cc      | 20 +++-----------------
+ src/hb-ot-cmap-table.hh |  3 ++-
+ src/hb-ot-layout.cc     |  3 +--
+ src/hb-ot-map.cc        | 17 ++++-------------
+ src/hb-ot-post-table.hh |  6 +-----
+ src/hb-private.hh       | 11 ++++-------
+ src/hb-subset-plan.cc   |  2 --
+ src/hb-subset.cc        |  2 --
+ src/hb-uniscribe.cc     | 28 ++++++++--------------------
+ 9 files changed, 23 insertions(+), 69 deletions(-)
+
+commit 975bdd5ef562e37655067b703b2b9ca7481f4985
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 1 17:37:13 2018 -0700
+
+    [vector] Keep success status
+
+ src/hb-private.hh | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit 1ab3c3ed1bbc404086aefffaef4b8261bb77caa7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 1 17:34:24 2018 -0700
+
+    [vector] Whitespace
+
+ src/hb-private.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit fb07d1a3ce896f8ebf8b5d5fef51dee91b6ead11
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 1 17:32:07 2018 -0700
+
+    Another attempt at making every compiler happy...
+
+    Sigh.
+
+ src/hb-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 4f76f956bb3a95b307322cdad4f8d3b97851678e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 1 17:28:47 2018 -0700
+
+    [map] Move prime_for to hb-static
+
+ src/hb-map-private.hh | 53
+ +--------------------------------------------------
+ src/hb-private.hh     |  2 ++
+ src/hb-static.cc      | 51
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 54 insertions(+), 52 deletions(-)
+
+commit 33d6f46bbbb4fdee110f1cb024a37ed2e46e5e22
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 1 17:25:35 2018 -0700
+
+    [set] Shrink page-map size again
+
+ src/hb-set-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4ca211bce192b01644c82f721251604df935b603
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 1 17:18:57 2018 -0700
+
+    Fix hb_vector_size_t
+
+ src/hb-private.hh     | 4 ++--
+ src/hb-set-private.hh | 3 ++-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit a070dfd333f411bf720120eb332f7da93077054f
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu May 31 16:47:39 2018 -0700
+
+    [subset] Have the subset fuzzer pull the text string to subset to
+    from the end of the fuzzer provided data.
+
+ test/fuzzing/hb-subset-fuzzer.cc | 54
+ +++++++++++++++++++++++++---------------
+ 1 file changed, 34 insertions(+), 20 deletions(-)
+
+commit bb6f4adac70a161505953414aa85ba78cd993c65
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 1 16:30:38 2018 -0700
+
+    Add Codacy badge
+
+ README | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit a7dd90f519fb7ab046e92ea3b7101c21d5040bbc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 1 16:07:55 2018 -0700
+
+    Revert "Remove HB_DISALLOW_COPY_AND_ASSIGN"
+
+    This reverts commit ff92de766bf775bfdd3a01bda94de699180ff86a.
+
+    Revert that and remove ASSERT_POD. Let's see which bots are
+    unhappy with this configuration...
+
+ src/hb-map-private.hh      | 3 +--
+ src/hb-ot-shape-private.hh | 2 +-
+ src/hb-private.hh          | 6 +++++-
+ src/hb-set-private.hh      | 3 +--
+ 4 files changed, 8 insertions(+), 6 deletions(-)
+
+commit 7b50bf52f274f75f0b41008e0eab150124ae928a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 31 20:20:17 2018 -0700
+
+    Use NullPool for _hb_set_nil and _hb_map_nil
+
+ src/hb-map.cc     | 12 +-----------
+ src/hb-private.hh |  2 +-
+ src/hb-set.cc     |  8 +-------
+ 3 files changed, 3 insertions(+), 19 deletions(-)
+
+commit f040ca40ab3ebd4fdb85747477e0e656ab8b073e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 31 20:15:21 2018 -0700
+
+    [set] Minor
+
+ src/hb-set.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 7185b273b3d92ee0ba0a589eb94387f25ea40b82
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 31 20:03:00 2018 -0700
+
+    Rename in_error to !successful
+
+    Towards possibly using Null pool for some nil objects.
+
+ src/hb-buffer-deserialize-json.hh    | 758
+ +++++++++++++++++------------------
+ src/hb-buffer-deserialize-json.rl    |   2 +-
+ src/hb-buffer-deserialize-text.hh    | 510 +++++++++++------------
+ src/hb-buffer-deserialize-text.rl    |   2 +-
+ src/hb-buffer-private.hh             |   2 +-
+ src/hb-buffer.cc                     |  24 +-
+ src/hb-map-private.hh                |  10 +-
+ src/hb-map.cc                        |   4 +-
+ src/hb-ot-layout-gsubgpos-private.hh |   4 +-
+ src/hb-ot-layout.cc                  |   2 +-
+ src/hb-ot-shape-complex-hangul.cc    |   8 +-
+ src/hb-ot-shape-complex-indic.cc     |   4 +-
+ src/hb-ot-shape-complex-khmer.cc     |   4 +-
+ src/hb-ot-shape-complex-myanmar.cc   |   2 +-
+ src/hb-ot-shape-complex-thai.cc      |   4 +-
+ src/hb-ot-shape-complex-use.cc       |   4 +-
+ src/hb-ot-shape-normalize.cc         |  12 +-
+ src/hb-ot-shape.cc                   |   2 +-
+ src/hb-set-private.hh                |  28 +-
+ src/hb-set.cc                        |   4 +-
+ 20 files changed, 696 insertions(+), 694 deletions(-)
+
+commit 353f4d2efc6c0ce32f5bee08bbdf5a268d720a6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 31 19:52:16 2018 -0700
+
+    Fix a whitespace inconsistency
+
+    Null() and Crap() are only places that there's no space before '('...
+
+ src/dump-fon.cc   | 12 ++++++------
+ src/hb-private.hh |  2 +-
+ src/main.cc       |  2 +-
+ 3 files changed, 8 insertions(+), 8 deletions(-)
+
+commit e36cd1dfd36ed336f63883098dc870c56a5fc10d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 31 19:31:39 2018 -0700
+
+    Remove trivial HB_ATOMIC_INT_INIT()
+
+ src/hb-atomic-private.hh | 9 +--------
+ src/hb-object-private.hh | 2 +-
+ 2 files changed, 2 insertions(+), 9 deletions(-)
+
+commit 550a70f8011c4c1cfd27d739469e79cb98bcdd6e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 31 19:28:04 2018 -0700
+
+    Use 0 as inert object reference value instead of -1
+
+    Towards using Null object for nil objects.
+
+ src/hb-object-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dcd1b07eeaf2c28f0d20b9812749810d069041e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 31 17:58:40 2018 -0700
+
+    Add const OffsetTo<> dereference
+
+    Unused, but now that we have CrapPool, implement it.
+
+ src/hb-open-type-private.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 2baa357ac7fe2ae91029dff26a01b8ba1cc0b365
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 31 12:27:31 2018 +0430
+
+    Fix symbol export issue of prime_mod on Alpine bot
+
+    Apparently our gcc-6.4.0 on Alpine Linux distribution doesn't like
+    defining static const
+    inside a method, lets put that on outside the classes.
+
+ src/hb-map-private.hh | 89
+ ++++++++++++++++++++++++++-------------------------
+ 1 file changed, 45 insertions(+), 44 deletions(-)
+
+commit 54800f8322e8ab106d801fc332b7e813c58138ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 30 16:26:50 2018 -0700
+
+    [map] Mark prime_for HB_INTERNAL
+
+    Trying to see if it fixes gcc-4.2 bots.
+
+ src/hb-map-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d600e844aa4736b52fe71c1b2a9fa785be5cfecc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 30 16:25:46 2018 -0700
+
+    Add CrapOrNull
+
+ src/hb-private.hh | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+commit 251cc977e93a75cfdc34671760ef4241daebf60f
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 30 12:23:51 2018 -0700
+
+    [subset] Switch to using hb_map_t inside of hb_subset_plan_t.
+
+ src/hb-ot-cmap-table.hh |  20 +++---
+ src/hb-ot-glyf-table.hh |  12 ++--
+ src/hb-ot-hdmx-table.hh |  10 +--
+ src/hb-ot-hmtx-table.hh |   6 +-
+ src/hb-ot-maxp-table.hh |   4 +-
+ src/hb-ot-os2-table.hh  |  35 +++--------
+ src/hb-ot-post-table.hh |   2 +-
+ src/hb-subset-glyf.cc   |   9 ++-
+ src/hb-subset-plan.cc   | 159
+ ++++++++++++++++--------------------------------
+ src/hb-subset-plan.hh   |  68 +++++++++++++--------
+ src/hb-subset.cc        |   2 +-
+ 11 files changed, 139 insertions(+), 188 deletions(-)
+
+commit b3d45de6cff4501e6171ec9d9069af7de29584d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 30 14:02:49 2018 -0700
+
+    [map] Fix size calculation
+
+    Don't know why I thought I should subtract one there...
+
+ src/hb-map-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ff92de766bf775bfdd3a01bda94de699180ff86a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 18:48:45 2018 -0700
+
+    Remove HB_DISALLOW_COPY_AND_ASSIGN
+
+    llvm-gcc-4.2 bot had this problem:
+    hb-private.hh:812: error: initializer specified for non-virtual method
+    'void hb_vector_t<Type, StaticSize>::operator=(const hb_vector_t<Type,
+    StaticSize>&) [with Type = hb_user_data_array_t::hb_user_data_item_t,
+    unsigned int StaticSize = 1u]'
+
+    Removing the delete didn't work with a constructor. So, remove
+    constructor.
+    Just disallow assignment.  Still better than nothing.
+
+ src/hb-map-private.hh      | 2 +-
+ src/hb-ot-shape-private.hh | 2 +-
+ src/hb-private.hh          | 6 +-----
+ src/hb-set-private.hh      | 2 +-
+ 4 files changed, 4 insertions(+), 8 deletions(-)
+
+commit a2444346220757e7743c972cbd24f925e72b419d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 18:32:57 2018 -0700
+
+    [map] Fix resize
+
+ src/hb-map-private.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit efbab6ba3f7434fca41be1b38e4a5281695f231c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 18:21:55 2018 -0700
+
+    Disable use of thread_local
+
+    Clang build was failing with:
+
+    /usr/bin/ld: .libs/libharfbuzz_la-hb-blob.o: relocation R_X86_64_PC32
+    against undefined hidden symbol `_ZTH12_hb_CrapPool' can not be used
+    when making a shared object
+
+    Instead of fighting it, just disable use of it.
+
+ src/hb-private.hh | 4 ++--
+ src/hb-static.cc  | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 8c2c5d450817d4cb6f782d286da6ac6d9e5a5e95
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 18:15:52 2018 -0700
+
+    [map] Not going to implement is_equal which is complicated
+
+ src/hb-map.h | 7 -------
+ 1 file changed, 7 deletions(-)
+
+commit ccd01c65559122499b38a44e4449cd5a828d0b05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 18:13:13 2018 -0700
+
+    [map] Move prime_mod to header to avoid linkage issues in subset.so
+
+ src/hb-map-private.hh | 53
+ +++++++++++++++++++++++++++++++++++++++++++++++++--
+ src/hb-map.cc         | 52
+ --------------------------------------------------
+ 2 files changed, 51 insertions(+), 54 deletions(-)
+
+commit 6baebc5d559e15c7903a81f21be08b45537e7903
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 17:58:46 2018 -0700
+
+    [map] Fix copyright year
+
+ src/hb-map-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b0158129d2b161665f8872deeb540ac73349c2de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 17:52:37 2018 -0700
+
+    [map] Minor
+
+ src/hb-map-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 4099c66f70e1acf89013215ab3add42b11e31fea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 17:52:07 2018 -0700
+
+    [map] Don't return INVALID from get() just because in_error
+
+ src/hb-map-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 25783907737b561f7b8648b8e92dba601a439828
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 17:34:35 2018 -0700
+
+    [map] Fix bool use in C API
+
+ src/hb-map.cc | 2 +-
+ src/hb-map.h  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit a9fa39dca56d3a96dddcdbeb1c55a3d55a6537da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 17:31:01 2018 -0700
+
+    [map] More minor
+
+ src/hb-map-private.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit f76c4a7708773eca7a2b8c7ff47f8b5ade5ca0d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 17:27:25 2018 -0700
+
+    [map] Make initial resize actually work
+
+ src/hb-map-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 661e9ae4a55c198eb9fdb2c104979dd55a0fa1f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 17:09:17 2018 -0700
+
+    [map] Add clear(), is_empty(), and get_population()
+
+ src/hb-map-private.hh | 22 ++++++++++++++++++----
+ src/hb-map.cc         | 43 +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-map.h          | 17 +++++++++--------
+ 3 files changed, 70 insertions(+), 12 deletions(-)
+
+commit b6959c33e23b464ddbe5fe98fafc80bbb669189c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 17:02:22 2018 -0700
+
+    [map] Minor
+
+ src/hb-map-private.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 686476a8ae0039f277eb55ab7bd69386d43a8dc7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 17:00:02 2018 -0700
+
+    [map] Track population and occupancy separately
+
+ src/hb-map-private.hh | 30 +++++++++++++++++++++---------
+ src/hb-map.cc         |  1 +
+ 2 files changed, 22 insertions(+), 9 deletions(-)
+
+commit 8a978790cb4dc66816c2cd7b617829f3e9d6e88e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 16:45:20 2018 -0700
+
+    [map] Minor
+
+ src/hb-map.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6f12ce47c0ed8c2c4bb251cd6e685459af104db8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 16:45:06 2018 -0700
+
+    Revert "[map] Return bool from set()"
+
+    This reverts commit face7cf55d4895ffca314c8448c0a749a26cc182.
+
+ src/hb-map-private.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit fc51c45079feb7d77d25204c4c17a0733f1eca56
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 16:44:55 2018 -0700
+
+    Revert "[map] Make hb_map_set() return bool"
+
+    This reverts commit 7bf1980146cfc081b06264ac367b23ae9397adf1.
+
+ src/hb-map.cc | 4 ++--
+ src/hb-map.h  | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 7bf1980146cfc081b06264ac367b23ae9397adf1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 16:42:44 2018 -0700
+
+    [map] Make hb_map_set() return bool
+
+ src/hb-map.cc | 4 ++--
+ src/hb-map.h  | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit face7cf55d4895ffca314c8448c0a749a26cc182
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 16:39:03 2018 -0700
+
+    [map] Return bool from set()
+
+ src/hb-map-private.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit e94be200bd7976a26ea2d6df5050d9dab4de0f08
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 16:37:44 2018 -0700
+
+    [map] Implement operator[] for get()ting
+
+ src/hb-map-private.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 743fdd9c618c949d7f45324386bd0bb37435db46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 29 16:28:48 2018 -0700
+
+    [map] First try at implementing an integer-to-integer hashmap
+
+    Fully untested.
+
+ src/Makefile.sources  |   3 +
+ src/hb-map-private.hh | 180 ++++++++++++++++++++++++++++++++
+ src/hb-map.cc         | 279
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-map.h          | 110 ++++++++++++++++++++
+ src/hb.h              |   1 +
+ 5 files changed, 573 insertions(+)
+
+commit 65c82179c9b3aafd90987485a49c09dbbb473c90
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 26 23:50:10 2018 +0430
+
+    [blob] Use MAP_NORESERVE if available (#1039)
+
+    MAP_NORESERVE is not available on macOS for example so set the flag
+    to zero if not defined on the headers.
+
+ src/hb-blob.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 1ce40d900a9c451d8d5814a9b30759d1e66f99c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 25 16:34:08 2018 -0700
+
+    [set] Remove stale comment
+
+ src/hb-set.h | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 6c2227640bc14754c9472fead5cd04ff25f91b52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 25 16:21:27 2018 -0700
+
+    Add HB_DISALLOW_COPY_AND_ASSIGN
+
+ src/hb-ot-map-private.hh   |  1 -
+ src/hb-ot-shape-private.hh |  4 +---
+ src/hb-ot-shape.cc         |  2 --
+ src/hb-private.hh          | 10 ++++++++++
+ src/hb-set-private.hh      |  3 +++
+ 5 files changed, 14 insertions(+), 6 deletions(-)
+
+commit fd3d0042319c33c923a60d435779bf7ed5a9a6f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 24 15:58:26 2018 -0700
+
+    Move pool definitions to hb-static.cc
+
+ src/Makefile.sources |  1 +
+ src/dump-emoji.cc    |  8 +-------
+ src/dump-fon.cc      |  6 +-----
+ src/hb-ot-layout.cc  |  6 ------
+ src/hb-static.cc     | 32 ++++++++++++++++++++++++++++++++
+ src/hb-subset.cc     |  5 ++---
+ src/main.cc          |  6 +-----
+ 7 files changed, 38 insertions(+), 26 deletions(-)
+
+commit 7f7b1370d37b9187f688dea5e6fee5ea7c2b7290
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 24 14:09:04 2018 -0700
+
+    Fix Uniscribe build
+
+    If a pointer type was passed to Null(), reinterpret_cast<> was
+    complaining about qualifiers being removed. Turns out I need the
+    const on
+    the other side of "Type" to fix that.  Also remove unused const from
+    NullPool type.
+
+ src/dump-emoji.cc   | 2 +-
+ src/dump-fon.cc     | 2 +-
+ src/hb-ot-layout.cc | 2 +-
+ src/hb-private.hh   | 6 +++---
+ src/hb-subset.cc    | 2 +-
+ src/main.cc         | 2 +-
+ 6 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 31c4236d9643063e518289b28c3e17cedd8401e0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 24 13:38:46 2018 -0700
+
+    Underflow protection in hb_vector_t
+
+ src/hb-private.hh | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+commit f83e992c8b27111ab802fd7e5678592a0c717518
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 24 11:46:57 2018 -0700
+
+    Mark CrapPool thread_local
+
+    Not sure if I like to keep it. For now, aim for correctness.
+
+ src/dump-emoji.cc   |  2 +-
+ src/dump-fon.cc     |  2 +-
+ src/hb-ot-layout.cc |  2 +-
+ src/hb-private.hh   | 14 +++++++++++++-
+ src/hb-subset.cc    |  2 +-
+ src/main.cc         |  2 +-
+ 6 files changed, 18 insertions(+), 6 deletions(-)
+
+commit 5d80129891107c7f629c6950b5d257f2a867eee0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 24 11:33:15 2018 -0700
+
+    Add CrapPool
+
+    Common Regoin for Access Protection.  Like the NullPool, but writable.
+
+ src/dump-emoji.cc           |  1 +
+ src/dump-fon.cc             |  1 +
+ src/hb-open-type-private.hh | 11 +++++++++++
+ src/hb-ot-layout.cc         |  1 +
+ src/hb-private.hh           | 39 +++++++++++++++++++++++++++++++++++----
+ src/hb-subset.cc            |  1 +
+ src/main.cc                 |  1 +
+ 7 files changed, 51 insertions(+), 4 deletions(-)
+
+commit 673b764de050957b2d3b9972d9e55b3a2e5615f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 23 20:12:23 2018 -0700
+
+    Move code around
+
+ src/hb-private.hh | 91
+ ++++++++++++++++++++++++++++++-------------------------
+ 1 file changed, 49 insertions(+), 42 deletions(-)
+
+commit 65aeabd62275b37c6bb6715f3341e45625f4ba6e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 23 16:15:28 2018 -0700
+
+    Add hb_vector_t::push(const Type &v)
+
+    Makes for cleaner code.
+
+ src/hb-coretext.cc      |  3 +--
+ src/hb-ot-post-table.hh |  3 +--
+ src/hb-private.hh       | 18 +++++++++++-------
+ src/hb-subset-plan.cc   | 12 +++++-------
+ src/hb-uniscribe.cc     |  8 ++------
+ 5 files changed, 20 insertions(+), 24 deletions(-)
+
+commit 38ae0add7001c4db506d3a2c18b9960a2cae7b5d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed May 23 13:37:57 2018 +0430
+
+    [ci] Revive the SunCC bot
+
+    * Adds libnsl to the bot as it is now needed apparently
+    * Disables hb-icu, apparently the newer ICU itself is not compatible
+    with SunCC
+
+ .circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6c818c5516913f2c8192d58bd2724b1d3bb60d24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 22 22:00:05 2018 -0700
+
+    Actually enable vectorized operations
+
+    Fixup for previous commit. Was accidentally turned off.
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f56a250b04f50f12c78d81d1a068187be3d95a8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 22 21:36:07 2018 -0700
+
+    Another try at smart vectorization
+
+    Make clang happy. Also, don't use anonymous union.
+
+ src/hb-private.hh | 36 +++++++++++++++++++++++++-----------
+ 1 file changed, 25 insertions(+), 11 deletions(-)
+
+commit b995b501ef5cf113534c5aead6c85baea6cc423c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 22 21:06:22 2018 -0700
+
+    Try enabling vectorization smartly
+
+    We'll see if this sticks to the bots.
+
+ src/hb-private.hh     | 25 +++++++++++++++++--------
+ src/hb-set-private.hh |  7 -------
+ 2 files changed, 17 insertions(+), 15 deletions(-)
+
+commit dd22c29f951ceec98516d7cb378bf2aa7e21d89a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 22 20:57:19 2018 -0700
+
+    [set] Always check population before checking for equality
+
+ src/hb-set-private.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 2eb9bbd986f6930f1b2594b8971ac677e9647c93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 22 18:28:13 2018 -0700
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED         |   2 ++
+ test/shaping/data/text-rendering-tests/Makefile.sources |   2 ++
+ .../text-rendering-tests/fonts/TestMORXTwentyeight.ttf  | Bin 0 ->
+ 2660 bytes
+ .../text-rendering-tests/fonts/TestMORXTwentyseven.ttf  | Bin 0 ->
+ 2432 bytes
+ .../data/text-rendering-tests/fonts/TestShapeKndaV3.ttf | Bin 0 ->
+ 89400 bytes
+ .../data/text-rendering-tests/tests/MORX-27.tests       |   3 +++
+ .../data/text-rendering-tests/tests/MORX-28.tests       |   5 +++++
+ 7 files changed, 12 insertions(+)
+
+commit 8eb53b853dcc4b0cc8e240cff6bfc5acb92182b0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri May 11 22:44:44 2018 +0430
+
+    Minor, make CreateFile compatible with the disabled writable flag
+
+    "writable" is not in use and probably we can go in the reverse
+    direction
+    and remove the flags that are useful for enabled writable, this
+    is just
+    for the sake of completeness however.
+
+ src/hb-blob.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 33eb1bd23b100a8e65a0e66621760368b5aecdaf
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri May 11 14:36:41 2018 +0430
+
+    Remove unnecessary headers and definitions of hb-blob (#1028)
+
+    It removes io.h and other polyfills which we no longer need as 7e76d74
+
+ src/hb-blob.cc | 22 ++++------------------
+ 1 file changed, 4 insertions(+), 18 deletions(-)
+
+commit 7e76d746e2555d5bba7f65d3958aa97a7f179d7b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri May 11 13:40:33 2018 +0430
+
+    Make hb_blob_create_from_file more portable (#1027)
+
+    This makes it compatible with ARMCC which I had access in
+    a collaboration with @imgtec, thanks!
+
+    Basically hb_blob_create_from_file features three code paths,
+    mmap, Win32 and fallback.
+
+    We had fallback implementation even before this but it was relied
+    to "open" which is not available on some environments. This change
+    improved the situtation by using only fopen and friends for
+    fallback path.
+
+    Interestingly we could use "open" on Windows but in fact it was
+    emulated by MSVCRT so I've completely split that from Unix path
+    now that we have a distinct path for fallback path also.
+
+ src/hb-blob.cc | 64
+ +++++++++++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 43 insertions(+), 21 deletions(-)
+
+commit e99d75ea9c4fe1f64d7f8408093741a682ed5243
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 15:28:30 2018 -0700
+
+    Fix warning
+
+ src/hb-ot-cmap-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 191c4edc5423017d9123d291462fbfa87a805218
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 15:27:17 2018 -0700
+
+    Reinstante DEFINE_NULL_DATA
+
+    Seems like I messed up; buffer overrun got reported.
+
+ src/hb-open-type-private.hh        |  2 ++
+ src/hb-ot-layout-common-private.hh | 13 +++----------
+ src/hb-private.hh                  | 13 +++++++++++++
+ 3 files changed, 18 insertions(+), 10 deletions(-)
+
+commit 93bdf9b2dfe18af0f1aa93b890f0be260f31d90e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed May 9 23:24:17 2018 +0430
+
+    Use arrayZ on hb-coretext and hb-uniscribe and fix macOS/Win bots
+    (#1024)
+
+    Following to 63f57f4
+
+ src/hb-coretext.cc  |  2 +-
+ src/hb-uniscribe.cc | 12 ++++++------
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 63f57f4dab3d3179838d5d1cd03d116837a7e5c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 16:56:11 2018 -0700
+
+    Mark more unsized array's as arrayZ
+
+ src/hb-aat-layout-common-private.hh  | 14 ++++----
+ src/hb-aat-layout-kerx-table.hh      |  2 +-
+ src/hb-aat-layout-morx-table.hh      |  6 ++--
+ src/hb-open-file-private.hh          |  6 ++--
+ src/hb-open-type-private.hh          | 40 +++++++++++-----------
+ src/hb-ot-cmap-table.hh              |  2 +-
+ src/hb-ot-color-cbdt-table.hh        | 10 +++---
+ src/hb-ot-layout-common-private.hh   | 12 +++----
+ src/hb-ot-layout-gsub-table.hh       | 16 ++++-----
+ src/hb-ot-layout-gsubgpos-private.hh | 64
+ ++++++++++++++++++------------------
+ src/hb-ot-post-table.hh              |  4 +--
+ src/hb-ot-var-avar-table.hh          | 26 +++++++--------
+ src/hb-private.hh                    | 54 +++++++++++++++---------------
+ src/hb-set-private.hh                |  4 +--
+ src/hb-subset.cc                     |  2 +-
+ 15 files changed, 131 insertions(+), 131 deletions(-)
+
+commit 091c17df5ac5f7ddc9b776481da845f4eda67570
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 16:42:45 2018 -0700
+
+    Use UnsizedArrayOf<> in one place where [VAR] was used
+
+    Trying to see how many can converted meaningfully.
+
+ src/hb-ot-layout-common-private.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 0644d92ef32b09e32d473c758d2a968f2d125628
+Merge: 2a2e28e7 3be050f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 15:21:09 2018 -0700
+
+    Merge pull request #1018 from googlefonts/cmap4
+
+    [subset] Add cmap format 4 subsetting.
+
+commit 2a2e28e701319b4053a5c95f06c68f859e4ce99b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 03:00:21 2018 -0700
+
+    Don't keep instance in hb_table_lazy_loader_t
+
+ src/hb-open-type-private.hh | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+commit 57bac8f6995fabbb98eb9824d822f370f9449488
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 02:55:20 2018 -0700
+
+    Rename
+
+ src/hb-open-type-private.hh | 6 +++---
+ src/hb-ot-layout-private.hh | 8 ++++----
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 2a46a020fd2fa2fe99886ab06188db5f0fa37ad1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 02:53:03 2018 -0700
+
+    Minor
+
+ src/hb-open-type-private.hh | 4 ++--
+ src/hb-ot-kern-table.hh     | 2 +-
+ src/hb-ot-layout.cc         | 6 +++---
+ src/hb-ot-post-table.hh     | 2 +-
+ 4 files changed, 7 insertions(+), 7 deletions(-)
+
+commit eba1c16a604d1be774f22541bf3e417f27a27c68
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 02:47:42 2018 -0700
+
+    Always lock blob in sanitize. Remove blob->lock_as() in favor of
+    blob->lock()
+
+ src/dump-emoji.cc             | 4 ++--
+ src/dump-fon.cc               | 2 +-
+ src/hb-aat-layout.cc          | 4 ++--
+ src/hb-blob-private.hh        | 6 ------
+ src/hb-face.cc                | 8 ++++----
+ src/hb-open-type-private.hh   | 8 ++++++--
+ src/hb-ot-cmap-table.hh       | 2 +-
+ src/hb-ot-color-cbdt-table.hh | 4 ++--
+ src/hb-ot-color-sbix-table.hh | 2 +-
+ src/hb-ot-color-svg-table.hh  | 2 +-
+ src/hb-ot-glyf-table.hh       | 6 +++---
+ src/hb-ot-hmtx-table.hh       | 8 ++++----
+ src/hb-ot-kern-table.hh       | 2 +-
+ src/hb-ot-layout.cc           | 6 +++---
+ src/hb-ot-post-table.hh       | 2 +-
+ src/hb-subset.cc              | 2 +-
+ src/main.cc                   | 2 +-
+ 17 files changed, 34 insertions(+), 36 deletions(-)
+
+commit b4fa50501414b7471e840f2ee6b9dfe87080b078
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 02:45:08 2018 -0700
+
+    Move Sanitizer::lock_instance<>() to blob->lock_as<>().
+
+ src/dump-emoji.cc             |  4 ++--
+ src/dump-fon.cc               |  3 +--
+ src/hb-aat-layout.cc          |  4 ++--
+ src/hb-blob-private.hh        | 17 +++++++++++++++++
+ src/hb-face.cc                |  9 +++++----
+ src/hb-open-type-private.hh   |  9 ++-------
+ src/hb-ot-cmap-table.hh       |  2 +-
+ src/hb-ot-color-cbdt-table.hh |  4 ++--
+ src/hb-ot-color-sbix-table.hh |  2 +-
+ src/hb-ot-color-svg-table.hh  |  2 +-
+ src/hb-ot-glyf-table.hh       |  6 +++---
+ src/hb-ot-hmtx-table.hh       |  8 ++++----
+ src/hb-ot-kern-table.hh       |  2 +-
+ src/hb-ot-layout.cc           |  6 +++---
+ src/hb-ot-post-table.hh       |  2 +-
+ src/hb-subset.cc              |  2 +-
+ src/main.cc                   |  2 +-
+ 17 files changed, 48 insertions(+), 36 deletions(-)
+
+commit abc12f7b8157c3981216d82ead60627db31a6c14
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 02:23:36 2018 -0700
+
+    Move null pool to hb-private
+
+ src/dump-emoji.cc                  |  6 ++---
+ src/dump-fon.cc                    | 14 +++++------
+ src/hb-aat-layout.cc               |  8 +++----
+ src/hb-open-type-private.hh        | 48
+ +++-----------------------------------
+ src/hb-ot-cmap-table.hh            |  4 ++--
+ src/hb-ot-color.cc                 |  4 ++--
+ src/hb-ot-layout-common-private.hh | 13 ++++++++---
+ src/hb-ot-layout.cc                | 22 ++++++++---------
+ src/hb-ot-math.cc                  |  4 ++--
+ src/hb-ot-var.cc                   |  6 ++---
+ src/hb-private.hh                  | 29 +++++++++++++++++++++++
+ src/hb-subset.cc                   |  4 ++--
+ src/main.cc                        |  2 +-
+ 13 files changed, 79 insertions(+), 85 deletions(-)
+
+commit 08e280fd84384f73d395918646ee044a5bbfee45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 01:57:27 2018 -0700
+
+    Rename hb_string_t to hb_bytes_t
+
+ src/hb-ot-post-table.hh | 16 ++++++++--------
+ src/hb-private.hh       | 12 ++++++------
+ src/hb-string-array.hh  |  6 +++---
+ 3 files changed, 17 insertions(+), 17 deletions(-)
+
+commit bd021a67203aa5b07c31c02d63e6154da0c05d31
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 01:50:30 2018 -0700
+
+    Minor
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 16e4ccf7b417f021948643012cbe7641ba02c039
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 01:47:05 2018 -0700
+
+    Allocate user-data-array on the heap
+
+    This saves each object allocation 72 bytes.  Now object overhead
+    is just
+    16 bytes (on x86) instead of 88 bytes. Neat.
+
+ src/hb-object-private.hh | 36 ++++++++++++++++++++++++++++--------
+ 1 file changed, 28 insertions(+), 8 deletions(-)
+
+commit 61920b21ca0c632ba58aef95c7f65f409cc0fbd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 01:28:19 2018 -0700
+
+    Oops
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1023
+
+ src/hb-blob-private.hh | 77
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 77 insertions(+)
+
+commit f673cfbd64d0c9d97123500a7b851b9cfc09deb3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 7 13:58:32 2018 -0700
+
+    Support scripts that are written both LTR and RTL
+
+    Right now only Old Italic is marked as such.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1000
+
+ src/hb-buffer.cc                                         |   4 ++++
+ src/hb-common.cc                                         |   6 ++++++
+ src/hb-ot-shape.cc                                       |   7 +++++--
+ test/api/test-common.c                                   |   1 +
+ test/shaping/data/in-house/Makefile.sources              |   1 +
+ .../fonts/73e84dac2fc6a2d1bc9250d1414353661088937d.ttf   | Bin 0 ->
+ 1136 bytes
+ test/shaping/data/in-house/tests/none-directional.tests  |   3 +++
+ 7 files changed, 20 insertions(+), 2 deletions(-)
+
+commit 90869e6962caf0e55a480b5d7e777cc521596e8b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 7 14:04:01 2018 -0700
+
+    [ot] Apply langsys's required feature even if no other feature exists
+
+ src/hb-ot-map.cc | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 90baf721978236f2e06dff89ad1cb0cace0753ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 3 22:14:54 2018 -0400
+
+    Move some blob functions to methods
+
+ src/hb-blob.cc | 80
+ +++++++++++++++++++++++++---------------------------------
+ 1 file changed, 34 insertions(+), 46 deletions(-)
+
+commit 5c64d61475f15d7f8de8993a52639735b2bcf750
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 3 21:10:57 2018 -0400
+
+    Add hb-blob-private.hh
+
+    Towards making blob more memory-allocation-friendly
+
+ src/Makefile.sources |  1 +
+ src/hb-blob.cc       | 21 +++++----------------
+ 2 files changed, 6 insertions(+), 16 deletions(-)
+
+commit 203dc44ebc141af0ba8c54edec2dc0405664997a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 3 21:03:27 2018 -0400
+
+    [ot-layout] Remove unused members
+
+    We should hang those off somewhere else. For now, the unused ones
+    can go.
+
+ src/hb-aat-layout-common-private.hh |  2 +-
+ src/hb-aat-layout.cc                |  6 ++++++
+ src/hb-ot-layout-private.hh         |  6 ------
+ src/hb-ot-layout.cc                 | 29 ++++++++---------------------
+ 4 files changed, 15 insertions(+), 28 deletions(-)
+
+commit ac92ed7d6875374451246a2391859fb763329adb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue May 8 01:05:15 2018 +0430
+
+    Set inline hidden flag only on shared library building
+
+    To avoid need of CMP0063 which is not available on older CMake
+    versions
+
+ CMakeLists.txt | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 3be050f07572d8556726b188668d727e3e7ba643
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri May 4 11:23:32 2018 -0700
+
+    [subset] entrySelectorZ -> entrySelector.
+
+ src/hb-ot-cmap-table.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 7c22f98da789f831e1afb9078085b2e33d864d25
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu May 3 13:14:28 2018 -0700
+
+    [subset] add missing template parameter.
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 95eb0f3bafb7ab0e2451e3e2f8afc5008e18e88e
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu May 3 13:00:19 2018 -0700
+
+    [subset] Switch to a non-log using implementation of caculating
+    searchRangeZ, entrySelectorZ, and rangeShiftZ in cmap4.
+
+ src/hb-ot-cmap-table.hh | 12 +++++-------
+ 1 file changed, 5 insertions(+), 7 deletions(-)
+
+commit b0d7971be0fa3c9393b04038b8d0a76398b0d8d7
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu May 3 11:22:51 2018 -0700
+
+    [subset] Updated expected files for japanese subset integration
+    tests to include cmap4.
+
+ ...gular.default.3042,3044,3046,3048,304A,304B.ttf | Bin 3032 ->
+ 3112 bytes
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 3268 ->
+ 3356 bytes
+ .../Mplus1p-Regular.default.61,63,65,6B.ttf        | Bin 2584 ->
+ 2656 bytes
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3564 ->
+ 3652 bytes
+ .../japanese/Mplus1p-Regular.default.660E.ttf      | Bin 2348 ->
+ 2396 bytes
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 2304 ->
+ 2384 bytes
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2540 ->
+ 2628 bytes
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf     | Bin 1856 ->
+ 1928 bytes
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 2836 ->
+ 2924 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttf   | Bin 1620 ->
+ 1668 bytes
+ test/subset/data/fonts/Mplus1p-Regular.ttf         | Bin 1758820 ->
+ 1757292 bytes
+ 11 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 79479273170275447042aa50912acee74bbacdf6
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu May 3 11:18:02 2018 -0700
+
+    [subset] Update expected files for subset integration tests to
+    include cmap4.
+
+ .../basics/Roboto-Regular.abc.default.61,62,63.ttf    | Bin 2120 ->
+ 2168 bytes
+ .../basics/Roboto-Regular.abc.default.61,63.ttf       | Bin 1932 ->
+ 1988 bytes
+ .../expected/basics/Roboto-Regular.abc.default.61.ttf | Bin 1744 ->
+ 1792 bytes
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1692 ->
+ 1740 bytes
+ .../expected/basics/Roboto-Regular.abc.default.63.ttf | Bin 1668 ->
+ 1716 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61,62,63.ttf | Bin 876 ->
+ 924 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61,63.ttf    | Bin 792 ->
+ 848 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61.ttf       | Bin 684 ->
+ 732 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.62.ttf       | Bin 652 ->
+ 700 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.63.ttf       | Bin 656 ->
+ 704 bytes
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf     | Bin 3700 ->
+ 3772 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf     | Bin 3320 ->
+ 3368 bytes
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf         | Bin 3668 ->
+ 3732 bytes
+ .../Roboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf  | Bin 2152 ->
+ 2224 bytes
+ .../full-font/Roboto-Regular.drop-hints.61,62,63.ttf  | Bin 1968 ->
+ 2016 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf      | Bin 2188 ->
+ 2252 bytes
+ 16 files changed, 0 insertions(+), 0 deletions(-)
+
+commit a8e7f9b958dcb4e00226f78d0ff83f031bc1323d
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu May 3 10:59:00 2018 -0700
+
+    [subset] Get cmap tests passing again.
+
+ test/api/fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf | Bin 2972 -> 2816 bytes
+ test/api/test-subset-cmap.c                      |   2 +-
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit c817992f495cba21bf468014f22afe349fbc799f
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu May 3 10:53:20 2018 -0700
+
+    [subset] Write out a format 4, plat 0 encoding record to match
+    fontTools.
+
+ src/hb-ot-cmap-table.hh     | 24 +++++++++++++++---------
+ test/api/test-subset-cmap.c |  2 +-
+ 2 files changed, 16 insertions(+), 10 deletions(-)
+
+commit 9ef55a4c1354028f4d5e81300cdaf8ce5e03b8e9
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 2 18:50:56 2018 -0700
+
+    [subset] A few bug fixes for cmap format 4 subsetting.
+
+ src/hb-ot-cmap-table.hh | 57
+ ++++++++++++++++++++++++++++---------------------
+ 1 file changed, 33 insertions(+), 24 deletions(-)
+
+commit 81ea75f5c860ef682184bd2c9d0ff8b48251e3ce
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 2 17:46:30 2018 -0700
+
+    [subset] Complete implementation of cmap4 subsetting.
+
+ src/hb-ot-cmap-table.hh | 31 ++++++++++++++++++++++++++++---
+ 1 file changed, 28 insertions(+), 3 deletions(-)
+
+commit 4195a52b041af749046b716dcac7d6560ae37611
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 2 17:11:18 2018 -0700
+
+    [subset] WIP implementation of serialize for cmap format 4.
+
+ src/hb-ot-cmap-table.hh | 39 ++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 38 insertions(+), 1 deletion(-)
+
+commit cfa592d31ce2fd1ec2765a69ab31bf80161479dd
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 2 16:37:38 2018 -0700
+
+    [subset] Add an implement for cmap format 4 create_sub_table_plan.
+
+ src/hb-ot-cmap-table.hh | 43 ++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 42 insertions(+), 1 deletion(-)
+
+commit 295d67ea7d0ddac5666bd6aa4b647dd9cbf8e8f7
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 2 16:12:04 2018 -0700
+
+    [subset] WIP cmap format 4 subsetting.
+
+ src/hb-ot-cmap-table.hh | 104
+ ++++++++++++++++++++++++++++++++++++++++--------
+ 1 file changed, 88 insertions(+), 16 deletions(-)
+
+commit 0053d13283458996372f04bd501001d450523605
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 2 15:42:43 2018 -0700
+
+    [subset] Refactor cmap subsetting to make it possible to add support
+    for more sub tables.
+
+ src/hb-ot-cmap-table.hh | 161
+ ++++++++++++++++++++++++++++++------------------
+ 1 file changed, 102 insertions(+), 59 deletions(-)
+
+commit 03b27548123756dfd9988a8fc74bc78733fb2c44
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 2 15:42:08 2018 -0700
+
+    [subset] Add const to the hb_subset_plan_t input to a couple functions
+    in hb-subset-plan.
+
+ src/hb-subset-plan.cc |  4 ++--
+ src/hb-subset-plan.hh | 18 +++++++++---------
+ 2 files changed, 11 insertions(+), 11 deletions(-)
+
+commit 5b93f6916958e6096044372c1195501ea9f37436
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 2 14:59:14 2018 -0400
+
+    Rename some X-terminated members to Z-terminated
+
+    X-terminated means don't access this, it's not located correctly.
+    Z-terminated means this is a C array with no bound checking.
+
+ src/hb-aat-layout-morx-table.hh |  4 ++--
+ src/hb-open-type-private.hh     | 16 ++++++++--------
+ src/hb-ot-cmap-table.hh         | 28 ++++++++++++++--------------
+ src/hb-ot-glyf-table.hh         | 14 +++++++-------
+ src/hb-ot-var-avar-table.hh     |  6 +++---
+ 5 files changed, 34 insertions(+), 34 deletions(-)
+
+commit f1f6bc0a6f28a6611a247f37b8a83e6f782d7227
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 2 12:56:21 2018 -0400
+
+    [set] Fix init/fini of set on the stack to call object init/fini
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1017
+
+ src/hb-set-private.hh | 14 ++++++++++++--
+ src/hb-set.cc         |  4 ++--
+ 2 files changed, 14 insertions(+), 4 deletions(-)
+
+commit 37b95612d4ae8a9d75a1a5a5165bc073c709cf30
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 1 19:09:00 2018 -0400
+
+    Remove hb_auto_array_t
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1017
+
+ src/hb-coretext.cc      |  8 ++++----
+ src/hb-ot-cmap-table.hh |  2 +-
+ src/hb-ot-layout.cc     |  2 +-
+ src/hb-subset-plan.cc   |  2 +-
+ src/hb-uniscribe.cc     | 12 ++++++------
+ 5 files changed, 13 insertions(+), 13 deletions(-)
+
+commit 5c3112aec8b77d0fe39164f0f700e2a1aa810022
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 1 19:07:04 2018 -0400
+
+    s/hb_prealloced_array_t/hb_vector_t/g
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1017
+
+ src/hb-ot-cmap-table.hh  |  6 +++---
+ src/hb-ot-hmtx-table.hh  |  2 +-
+ src/hb-ot-map-private.hh | 10 +++++-----
+ src/hb-ot-os2-table.hh   |  4 ++--
+ src/hb-ot-post-table.hh  |  2 +-
+ src/hb-private.hh        |  6 +++---
+ src/hb-set-private.hh    |  4 ++--
+ src/hb-subset-glyf.cc    | 12 ++++++------
+ src/hb-subset-plan.cc    |  8 ++++----
+ src/hb-subset-plan.hh    |  6 +++---
+ src/hb-subset.cc         |  2 +-
+ 11 files changed, 31 insertions(+), 31 deletions(-)
+
+commit 4a01eb1234a72e6a91ed66d3ed60b5db378fe340
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 1 19:05:58 2018 -0400
+
+    Add hb_auto_t
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1017
+
+ src/hb-private.hh | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit a60ba7964ea196a3a02c48e813f2d9505d0cded2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 1 19:01:25 2018 -0400
+
+    s/finish/fini
+
+    For consistency.
+
+ src/hb-common.cc            |  8 ++++----
+ src/hb-mutex-private.hh     |  2 +-
+ src/hb-object-private.hh    | 10 +++++-----
+ src/hb-ot-layout-private.hh |  4 ++--
+ src/hb-ot-map-private.hh    | 14 +++++++-------
+ src/hb-ot-post-table.hh     |  2 +-
+ src/hb-ot-shape-private.hh  |  4 ++--
+ src/hb-ot-shape.cc          |  2 +-
+ src/hb-private.hh           | 16 ++++++++--------
+ src/hb-set-private.hh       |  6 +++---
+ src/hb-set.cc               |  2 +-
+ src/hb-subset-glyf.cc       |  6 +++---
+ src/hb-subset-plan.cc       |  6 +++---
+ src/hb-subset.cc            |  2 +-
+ 14 files changed, 42 insertions(+), 42 deletions(-)
+
+commit 17618ee2ecd02cb100ca911bd1907d108e9df475
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 1 18:39:25 2018 -0400
+
+    Add hb_object_fini()
+
+ src/hb-object-private.hh | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit bd5f918e2f86241d3e2cb706bf558de21c198860
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 1 18:27:41 2018 -0400
+
+    [set] Cache population
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1017
+
+ src/hb-set-private.hh | 24 +++++++++++++++++++++++-
+ src/hb-set.cc         |  1 +
+ 2 files changed, 24 insertions(+), 1 deletion(-)
+
+commit 93b03119da8674a3eddb7879857e9f17fa16fd2a
+Author: violet-sippial <38817272+violet-sippial@users.noreply.github.com>
+Date:   Sat Apr 28 20:29:13 2018 +0200
+
+    [subset] Do not compare ttx progress output in the tests
+
+    Suppress progress messages of ttx. This avoids comparing this output
+    to the reference file which lets the test fail.
+
+ test/subset/run-tests.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit a57f5a1a185c333ae21a4ac1577387312895e107
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Apr 28 13:58:55 2018 +0430
+
+    [dwrite] Minor, enable the original code assertions
+
+ src/hb-directwrite.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9925030f19851957381b78c197e6f50c77fde756
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Apr 13 12:43:29 2018 +0430
+
+    Don't decompose Bengali Rra and Rha
+
+    Fixes #779 and follow up to b01d9b3d90e892341ee4463f2eda4600850b97d8
+
+ src/hb-ot-shape-complex-indic.cc                        |   3 +++
+ test/shaping/data/in-house/Makefile.sources             |   1 +
+ .../fonts/932ad5132c2761297c74e9976fe25b08e5ffa10b.ttf  | Bin 0 ->
+ 22980 bytes
+ test/shaping/data/in-house/tests/indic-decompose.tests  |   1 +
+ 4 files changed, 5 insertions(+)
+
+commit 5ad87a93fefcb94ee5f28de8d75903b2550c8d94
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Apr 25 16:44:04 2018 +0430
+
+    Minor, improve file reading failing condition comment
+
+    https://bugzilla.gnome.org/show_bug.cgi?id=659212 for more context
+
+ src/hb-blob.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 2eaba80cbd3afb32363da93ebf6e60b11509d3f8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 24 09:04:15 2018 +0430
+
+    Minor, re-add unused mark to some of ragel defined state machines
+    (#1005)
+
+ src/hb-ot-shape-complex-indic-machine.hh   | 2 +-
+ src/hb-ot-shape-complex-indic-machine.rl   | 2 +-
+ src/hb-ot-shape-complex-khmer-machine.hh   | 2 +-
+ src/hb-ot-shape-complex-khmer-machine.rl   | 2 +-
+ src/hb-ot-shape-complex-myanmar-machine.hh | 2 +-
+ src/hb-ot-shape-complex-myanmar-machine.rl | 2 +-
+ src/hb-ot-shape-complex-use-machine.hh     | 2 +-
+ src/hb-ot-shape-complex-use-machine.rl     | 2 +-
+ 8 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 48f0204cfea616a788d75c5065ad4999c7685513
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 24 08:11:13 2018 +0430
+
+    Minor, re-add unused mark for two TRACE_ macros
+
+    To revive Travis CI bot
+
+ src/hb-debug.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 816b8169a90e0454b82a83719fc9ec1c83934d6f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Apr 23 19:36:53 2018 +0430
+
+    Resolve some of clang's double-promotion warnings
+
+ src/hb-aat-layout-trak-table.hh    | 6 +++---
+ src/hb-open-type-private.hh        | 8 ++++----
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 3 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 24b8b9b227f53b4f67a713c994cec04a5f774634
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Apr 23 19:03:57 2018 +0430
+
+    Resolve clang's used-but-marked-unused warnings
+
+ src/hb-debug.hh                            | 4 ++--
+ src/hb-font.cc                             | 4 ++--
+ src/hb-ft.cc                               | 8 ++++----
+ src/hb-open-type-private.hh                | 2 +-
+ src/hb-ot-font.cc                          | 6 +++---
+ src/hb-ot-shape-complex-indic-machine.hh   | 2 +-
+ src/hb-ot-shape-complex-indic-machine.rl   | 2 +-
+ src/hb-ot-shape-complex-khmer-machine.hh   | 2 +-
+ src/hb-ot-shape-complex-khmer-machine.rl   | 2 +-
+ src/hb-ot-shape-complex-myanmar-machine.hh | 2 +-
+ src/hb-ot-shape-complex-myanmar-machine.rl | 2 +-
+ src/hb-ot-shape-complex-use-machine.hh     | 2 +-
+ src/hb-ot-shape-complex-use-machine.rl     | 2 +-
+ src/hb-set.cc                              | 2 +-
+ src/hb-unicode.cc                          | 2 +-
+ 15 files changed, 22 insertions(+), 22 deletions(-)
+
+commit eaf649450a29115ca0b2aac2921cc40c17aa55ac
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Apr 23 18:39:40 2018 +0430
+
+    Resolve clang's conditional-uninitialize warnings
+
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-ot-shape-normalize.cc   | 4 ++--
+ util/view-cairo.cc             | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 8b0d642e6610dd44f98a986580451eb562276897
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Apr 23 18:37:35 2018 +0430
+
+    Resolve some of clang's zero-as-null-pointer-constant warnings
+
+ src/hb-coretext.cc              | 4 ++--
+ src/hb-dsalgs.hh                | 2 +-
+ src/hb-ot-os2-unicode-ranges.hh | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 8100380d9e6fdd52eb7054f3300046028dcde8f9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Apr 22 10:58:37 2018 +0430
+
+    Minor, fix calloc call order
+
+ src/hb-blob.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2a4cdfad20fa8f0d2894383c2f10a6983f88b34b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Apr 20 21:12:58 2018 +0430
+
+    [aat/kerx] Minor (#1003)
+
+ src/hb-aat-layout-kerx-table.hh | 46
+ +++++++++++++++++++++--------------------
+ 1 file changed, 24 insertions(+), 22 deletions(-)
+
+commit ce17340b23d96f543cd88e400e631bdb5656331c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Apr 20 10:29:06 2018 +0430
+
+    Add hb_blob_create_from_file, a new API (#926)
+
+ TODO                         |   2 -
+ docs/harfbuzz-sections.txt   |   1 +
+ src/dump-emoji.cc            |  33 +----------
+ src/dump-fon.cc              |  11 +---
+ src/hb-blob.cc               | 131
+ ++++++++++++++++++++++++++++++++++++++++---
+ src/hb-blob.h                |   2 +
+ src/main.cc                  |  26 +--------
+ src/test-buffer-serialize.cc |  42 +-------------
+ src/test-size-params.cc      |  42 +-------------
+ src/test-would-substitute.cc |  42 +-------------
+ src/test.cc                  |  42 +-------------
+ test/api/hb-subset-test.h    |  54 +-----------------
+ test/api/hb-test.h           |  33 -----------
+ util/options.cc              |  88 +++++++----------------------
+ util/options.hh              |   6 --
+ util/view-cairo.hh           |   3 +-
+ 16 files changed, 159 insertions(+), 399 deletions(-)
+
+commit 4fa1c6705a1bc5299adb5a848ceaf6ac8f33c0ba
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Apr 19 15:30:35 2018 -0700
+
+    [subset] Check instruction offsets in glyph to ensure they are
+    in bounds.
+
+ src/hb-ot-glyf-table.hh                            |  18 ++++++++++--
+ .../oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a   | Bin 0 -> 63302 bytes
+ test/api/test-subset-glyf.c                        |  31
+ +++++++++++++++++++++
+ 3 files changed, 47 insertions(+), 2 deletions(-)
+
+commit 3c97614598ecd0bbccb2c90a8e0e99f010952b76
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Apr 19 13:39:57 2018 -0700
+
+    [subset] In subset fuzzer run through drop hints and keep hints
+    pathways.
+
+ test/fuzzing/hb-subset-fuzzer.cc | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit 6fdeeb2ae3059ac1bc5ff99fd1655b4e94576151
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Apr 19 23:41:37 2018 +0300
+
+    [util] Check all specified shapers are known (#993)
+
+    A bit brute force and requires all shapers to be known, not just one.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/956
+
+ util/options.cc | 22 ++++++++++++++++++++--
+ 1 file changed, 20 insertions(+), 2 deletions(-)
+
+commit 535fb23c0211c733d59f72c3431643d89dc16d16
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Apr 18 17:37:39 2018 -0700
+
+    [subset] Add integration tests for cmap breakge.
+
+ .../full-font/Roboto-Regular.default.D7,D8,D9,DA,DE.ttf  | Bin 0 ->
+ 3668 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf         | Bin 0 ->
+ 2188 bytes
+ test/subset/data/tests/full-font.tests                   |   1 +
+ 3 files changed, 1 insertion(+)
+
+commit e29c8e33f3debf721e18306b896df7a3233386ac
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Apr 18 17:32:43 2018 -0700
+
+    [subset] Add a test for previous cmap breakage.
+
+ test/api/fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf | Bin 0 -> 2972 bytes
+ test/api/test-subset-cmap.c                      |  23
+ +++++++++++++++++++++++
+ 2 files changed, 23 insertions(+)
+
+commit 5e318e09ba590eef7b7ec047d7857f7f1eb7d787
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Apr 18 17:13:37 2018 -0700
+
+    [subset] Fix broken cmap creation.
+    It was ignoring the restriction that gids must be consecutive to be
+    placed into a single group.
+
+ src/hb-ot-cmap-table.hh | 23 ++++++++++++++++-------
+ 1 file changed, 16 insertions(+), 7 deletions(-)
+
+commit a47070cd40cee51fe792cb838ff9f21e0ea482c6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Apr 18 12:09:37 2018 +0430
+
+    Minor, annotate the added tables with likely/unlikely (#997)
+
+ src/hb-aat-fmtx-table.hh        |  2 +-
+ src/hb-aat-gcid-table.hh        |  2 +-
+ src/hb-aat-layout-ankr-table.hh |  7 ++++---
+ src/hb-aat-layout-bsln-table.hh |  9 +++++----
+ src/hb-aat-layout-feat-table.hh | 10 +++++-----
+ src/hb-aat-layout-kerx-table.hh | 12 ++++++------
+ src/hb-aat-layout-trak-table.hh | 21 +++++++++++++--------
+ src/hb-aat-ltag-table.hh        |  2 +-
+ src/hb-ot-color-colr-table.hh   | 10 +++++-----
+ src/hb-ot-color-cpal-table.hh   | 18 ++++++++++--------
+ src/hb-ot-color-sbix-table.hh   |  2 +-
+ src/hb-ot-color-svg-table.hh    |  6 +++---
+ 12 files changed, 55 insertions(+), 46 deletions(-)
+
+commit 1a309dcd72f9f54672a7341788a9b2241c922793
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Apr 17 18:11:32 2018 -0700
+
+    [subset] Remove printf's from fuzzing targets.
+
+ test/fuzzing/hb-subset-fuzzer.cc                | 1 -
+ test/fuzzing/hb-subset-get-codepoints-fuzzer.cc | 1 -
+ 2 files changed, 2 deletions(-)
+
+commit c55aa147c33eb733ab552d404a88749cb6ff6d73
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Apr 18 00:01:20 2018 +0430
+
+    Do sanitization before the use on 'main' mini-program (#994)
+
+ src/main.cc | 22 ++++++++++++++++++----
+ 1 file changed, 18 insertions(+), 4 deletions(-)
+
+commit c02b40e58f35ecd10c4945d2fa2b7074137c2c04
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Apr 17 08:21:22 2018 -0600
+
+    [subset] add a fuzzer target for subset_get_all_codepoints
+    method. (#987)
+
+ test/fuzzing/CMakeLists.txt                     |  7 ++++++-
+ test/fuzzing/Makefile.am                        | 16 ++++++++++++++++
+ test/fuzzing/hb-subset-get-codepoints-fuzzer.cc | 24
+ ++++++++++++++++++++++++
+ test/fuzzing/run-subset-fuzzer-tests.py         | 19 ++++++++++++++++++-
+ 4 files changed, 64 insertions(+), 2 deletions(-)
+
+commit 924803166e074c569ecfa7e598686f334777770f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 17 15:32:02 2018 +0200
+
+    [colr] Check layer record access
+
+ src/hb-ot-color-colr-table.hh | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 5dadbb0fa096574b6bccd75cced203baf615fedf
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Apr 17 07:00:23 2018 -0600
+
+    [subset] Add implementation of cmap format 12 codepoint
+    listing. (#988)
+
+ src/hb-ot-cmap-table.hh                        |  21 +++++++++++-
+ test/api/fonts/Roboto-Regular.abc.format12.ttf | Bin 0 -> 2412 bytes
+ test/api/test-subset-codepoints.c              |  44
+ +++++++++++++++++++++++++
+ 3 files changed, 64 insertions(+), 1 deletion(-)
+
+commit 6771e79bcc2166b5c03ca615d271c8508d692416
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 17 09:36:52 2018 +0430
+
+    Add pre-opentype font pages detection code (#986)
+
+    As Khaled's finding on #981 this is the way Uniscribe detects those
+    fonts. This is its detection part.
+
+ src/hb-ot-os2-table.hh | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+commit 277e328986d5887fa93c72dc8b12d842d41db87f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 17 09:13:35 2018 +0430
+
+    Make some of implicit header uses explicit (#989)
+
+    Splitted from #950 and #986 IIRC Chromium had a policy about this
+    encouraging it,
+    not sure about automated way to detect and add them but for now lets
+    have the needed
+    ones of them.
+
+ src/hb-aat-layout-morx-table.hh | 1 +
+ src/hb-aat-layout-trak-table.hh | 1 +
+ src/hb-ot-hdmx-table.hh         | 1 +
+ src/hb-ot-hmtx-table.hh         | 1 +
+ src/hb-ot-os2-table.hh          | 1 +
+ src/hb-ot-post-table.hh         | 1 +
+ 6 files changed, 6 insertions(+)
+
+commit f5811bad04be9dac8a4fca8e16904d6270e47777
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 17 09:13:03 2018 +0430
+
+    Add round to F2DOT14 inner store setter (#990)
+
+    It uses floor implicitly without it but explicit use of round will
+    be more correct.
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 39754fb65981fa8d11615e1dced852285ad09e4e
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Apr 16 15:09:27 2018 -0700
+
+    [subset] Don't assume the last segment in cmap 4 can be skipped,
+    actually check it.
+
+ src/hb-ot-cmap-table.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 21a181af2bf1582991c55de5f9281494733c5d12
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Apr 10 15:40:24 2018 -0700
+
+    [subset] sketch out support for a call that lists all codepoints
+    present in a font. Implement support for it in format 4 cmap sub
+    table.
+
+ src/hb-ot-cmap-table.hh                       |  37 ++++++++++++++--
+ src/hb-subset.cc                              |  14 ++++++
+ src/hb-subset.h                               |   5 ++-
+ test/api/Makefile.am                          |   2 +
+ test/api/fonts/Roboto-Regular.abc.format4.ttf | Bin 0 -> 2424 bytes
+ test/api/test-subset-codepoints.c             |  59
+ ++++++++++++++++++++++++++
+ 6 files changed, 113 insertions(+), 4 deletions(-)
+
+commit aef96e246cb695c4c83b8b6daed06a0d14fe1d32
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Apr 16 18:30:25 2018 +0430
+
+    Further improvements on dump-fon (#985)
+
+ src/dump-fon.cc | 153
+ +++++++++++++++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 123 insertions(+), 30 deletions(-)
+
+commit 67dfb1937b703b3f1dc45251f4f884abf35c8576
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Apr 16 14:25:45 2018 +0430
+
+    Add dump-fon, a prototype on how to work with .fon/.fnt files (#981)
+
+ src/Makefile.am |   4 +
+ src/dump-fon.cc | 475
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 479 insertions(+)
+
+commit ce99dd04de830c8426af14c11dbee45f8bcc9e60
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Apr 15 22:08:50 2018 +0430
+
+    Implement to_float and set_float of F2DOT14 (#984)
+
+ src/hb-open-type-private.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 435b1878e710b67e21872572ad9fd5ed1369e97f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Apr 15 21:18:48 2018 +0430
+
+    Rename UINT24 to HBUINT24 for consistency (#983)
+
+ src/hb-open-type-private.hh        | 2 +-
+ src/hb-ot-cmap-table.hh            | 6 +++---
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 3737c652a5e0b6d73b6090dc6c3863008c9dc8fd
+Merge: 632713ba 8f4c1230
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Apr 13 23:19:19 2018 +0430
+
+    Merge pull request #979 from ebraminio/msvc05
+
+    Reinstate support for Visual Studio 2005
+
+commit 8f4c12308a8d9e61922fb352e913acae46b28a88
+Author: Tor Andersson <tor.andersson@artifex.com>
+Date:   Fri Apr 13 23:01:54 2018 +0430
+
+    Reinstate support for Visual Studio 2005
+
+ src/hb-common.h    | 10 ++++++++++
+ src/hb-private.hh  |  6 +++---
+ src/hb-ucdn/ucdn.h | 10 ++++++++++
+ 3 files changed, 23 insertions(+), 3 deletions(-)
+
+commit 632713babbc349920f71f73cc304c9a18078fd6b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Apr 12 14:17:03 2018 +0430
+
+    Always enable atexit on Android (#971)
+
+    Obviously one can use a newer NDK for building an updated HarfBuzz
+    instead that now pretty old version however I am concerned if that
+    version checking is working with clang that is used with the newer
+    NDK versions.
+
+ src/hb-private.hh | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit f24b0b9728f87d7599867a4ba6ec7d30da43b869
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Apr 12 13:40:45 2018 +0430
+
+    Update the links and revive the dead ones
+
+ src/hb-common.cc                           |  4 ++--
+ src/hb-common.h                            |  6 +++---
+ src/hb-coretext.cc                         |  6 +++---
+ src/hb-ft.cc                               |  2 +-
+ src/hb-ot-cmap-table.hh                    | 12 ++++++------
+ src/hb-ot-layout-common-private.hh         |  8 ++++----
+ src/hb-ot-layout-private.hh                |  2 +-
+ src/hb-ot-layout.h                         |  2 +-
+ src/hb-ot-shape-complex-arabic.cc          |  4 ++--
+ src/hb-ot-shape-complex-indic-private.hh   |  2 +-
+ src/hb-ot-shape-complex-indic.cc           |  4 ++--
+ src/hb-ot-shape-complex-khmer.cc           |  2 +-
+ src/hb-ot-shape-complex-myanmar-private.hh |  2 +-
+ src/hb-ot-shape-complex-myanmar.cc         |  2 +-
+ src/hb-ot-shape-complex-thai.cc            |  2 +-
+ src/hb-ot-shape-complex-use-private.hh     |  2 +-
+ src/hb-ot-shape-complex-use.cc             |  2 +-
+ src/hb-ot-shape-fallback.cc                |  2 +-
+ src/hb-ot-tag.cc                           |  9 ++++-----
+ src/hb-private.hh                          |  4 ++--
+ src/hb-string-array.hh                     |  2 +-
+ src/hb-unicode-private.hh                  | 18 +++++++++---------
+ test/api/test-buffer.c                     |  2 +-
+ test/api/test-ot-tag.c                     |  6 +++---
+ test/api/test-shape.c                      |  2 +-
+ 25 files changed, 54 insertions(+), 55 deletions(-)
+
+commit a02c3ee70f4ca9de1fd55f1d8d535f6bd0d32606
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Apr 12 13:38:19 2018 +0430
+
+    Add or update tables specifications links
+
+ src/hb-aat-fmtx-table.hh        |  9 ++++-----
+ src/hb-aat-gcid-table.hh        |  8 ++++----
+ src/hb-aat-layout-ankr-table.hh |  8 ++++----
+ src/hb-aat-layout-bsln-table.hh | 10 +++++-----
+ src/hb-aat-layout-feat-table.hh | 10 +++++-----
+ src/hb-aat-layout-kerx-table.hh |  4 ++++
+ src/hb-aat-layout-morx-table.hh |  4 ++++
+ src/hb-aat-layout-trak-table.hh |  4 ++++
+ src/hb-aat-ltag-table.hh        | 10 +++++-----
+ src/hb-ot-color-cbdt-table.hh   | 24 ++++++++++++------------
+ src/hb-ot-color-colr-table.hh   |  6 +++---
+ src/hb-ot-color-cpal-table.hh   |  6 +++---
+ src/hb-ot-color-sbix-table.hh   | 11 ++++++-----
+ src/hb-ot-color-svg-table.hh    |  3 ++-
+ src/hb-ot-glyf-table.hh         |  4 ++--
+ src/hb-ot-hdmx-table.hh         | 11 ++++++-----
+ src/hb-ot-head-table.hh         | 10 +++++-----
+ src/hb-ot-hhea-table.hh         | 15 ++++++++-------
+ src/hb-ot-hmtx-table.hh         | 14 +++++++-------
+ src/hb-ot-kern-table.hh         | 10 ++++++----
+ src/hb-ot-layout-base-table.hh  |  3 ++-
+ src/hb-ot-layout-gdef-table.hh  |  3 ++-
+ src/hb-ot-layout-gpos-table.hh  |  3 ++-
+ src/hb-ot-layout-gsub-table.hh  |  3 ++-
+ src/hb-ot-layout-jstf-table.hh  |  3 ++-
+ src/hb-ot-math-table.hh         |  3 ++-
+ src/hb-ot-maxp-table.hh         |  3 ++-
+ src/hb-ot-name-table.hh         |  4 ++--
+ src/hb-ot-os2-table.hh          |  3 +--
+ src/hb-ot-post-table.hh         |  8 ++++----
+ src/hb-ot-var-avar-table.hh     | 14 ++++++++------
+ src/hb-ot-var-fvar-table.hh     | 15 ++++++++-------
+ src/hb-ot-var-hvar-table.hh     |  7 ++++---
+ src/hb-ot-var-mvar-table.hh     |  4 ++--
+ 34 files changed, 142 insertions(+), 115 deletions(-)
+
+commit b799fc80777c1424e469a835f782b4e0f41c0043
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Apr 11 18:36:09 2018 +0430
+
+    minor, use LOffsetTo and LArrayOf whenever possible (#966)
+
+ src/hb-aat-layout-morx-table.hh | 10 ++++++----
+ src/hb-aat-ltag-table.hh        |  2 +-
+ src/hb-open-file-private.hh     |  2 +-
+ src/hb-ot-cmap-table.hh         |  4 ++--
+ 4 files changed, 10 insertions(+), 8 deletions(-)
+
+commit cb3fa70cd4c33e9f1c736f778cb3b606d15c0936
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Apr 11 18:00:13 2018 +0430
+
+    [dwrite] Cosmetic change (#963)
+
+ src/hb-directwrite.cc | 39 +++++++++++++++++++--------------------
+ src/hb-directwrite.h  |  5 +++--
+ 2 files changed, 22 insertions(+), 22 deletions(-)
+
+commit 09d5e5468858f4403ce91aca46749397b23825d9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Apr 11 17:41:48 2018 +0430
+
+    [graphite] Use tabs instead 8 spaces (#965)
+
+ src/hb-graphite2.cc | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 211da5efdcaff203eafda2a5081cd81e3d6cc35b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Apr 11 17:41:24 2018 +0430
+
+    [aat] Cosmetic changes (#964)
+
+ src/hb-aat-gcid-table.hh            |  4 ++--
+ src/hb-aat-layout-ankr-table.hh     | 11 ++++++-----
+ src/hb-aat-layout-common-private.hh |  6 +++---
+ src/hb-aat-layout-kerx-table.hh     | 29 +++++++++++++++--------------
+ src/hb-aat-layout-morx-table.hh     |  6 +++---
+ src/hb-aat-layout-trak-table.hh     | 10 +++++-----
+ src/hb-aat-ltag-table.hh            |  8 ++++----
+ 7 files changed, 38 insertions(+), 36 deletions(-)
+
+commit f8bb582bcc2af6cae531d8255da002f0c514f1a9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Apr 11 17:13:20 2018 +0430
+
+    [ot-color] Cosmetic changes (#962)
+
+ src/hb-open-type-private.hh   |  1 -
+ src/hb-ot-color-cbdt-table.hh | 10 +++++-----
+ src/hb-ot-color-cpal-table.hh |  4 ++--
+ src/hb-ot-color-sbix-table.hh | 41
+ ++++++++++++++++++++---------------------
+ src/hb-ot-color-svg-table.hh  | 37 +++++++++++++++++++------------------
+ 5 files changed, 46 insertions(+), 47 deletions(-)
+
+commit 1e1e9086c09185a7bd6f65d1e391418642229616
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 10 03:26:01 2018 +0430
+
+    minor
+
+ src/dump-emoji.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit a62554af89b8324c73c623e64f87ec822c757515
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 10 00:53:50 2018 +0430
+
+    [colr/cpal] Improvements and add a sample renderer (#927)
+
+ src/Makefile.am               |  13 ++-
+ src/dump-emoji.cc             | 181
+ +++++++++++++++++++++++++++++++++++++++---
+ src/hb-ot-color-colr-table.hh |  43 +++++++++-
+ src/hb-ot-color-cpal-table.hh |  70 +++++++++-------
+ 4 files changed, 259 insertions(+), 48 deletions(-)
+
+commit f25731a3606ff0972505eeb934477480019ffcd3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 10 00:51:57 2018 +0430
+
+    [ci] Don't fail on brew warnings
+
+    Not the best fix but it works and we don't care about brew warnings,
+    so
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 58e569e5f7143a12cadcd6c42434558f9981e00e
+Author: Ryan Schmidt <ryandesign@macports.org>
+Date:   Thu Apr 5 17:03:36 2018 -0500
+
+    Fix build with CoreText on OS X 10.7 and earlier (#952)
+
+ src/hb-coretext.cc | 30 ++++++++++++++++++++++++++++--
+ 1 file changed, 28 insertions(+), 2 deletions(-)
+
+commit d3984b45b5d110f34febbb9e1d8a9c2203080a1b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Apr 1 12:16:42 2018 +0430
+
+    [aat] Further improvements on feat (#948)
+
+ src/Makefile.sources                               |  2 +-
+ ...t-feat-table.hh => hb-aat-layout-feat-table.hh} | 48
+ +++++++++++-----------
+ src/hb-aat-layout.cc                               |  2 +-
+ 3 files changed, 25 insertions(+), 27 deletions(-)
+
+commit 93dad9ade7078d28086b2e5c3b5e8dafa67617d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 31 17:06:17 2018 +0200
+
+    [hangul] Fix comment
+
+ src/hb-ot-shape-complex-hangul.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 44bf4320922d340d1357c4d42d093fa466c3610f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 31 16:51:36 2018 +0430
+
+    [aat] Implement feat table parsing (#947)
+
+ src/Makefile.sources     |   3 +-
+ src/hb-aat-feat-table.hh | 122
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.cc     |   1 +
+ 3 files changed, 125 insertions(+), 1 deletion(-)
+
+commit 08b8eb678a6cb74c118a32e75b880599e3ac4a7c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 31 12:15:50 2018 +0200
+
+    Another try at fixing linker issue
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/880
+
+ configure.ac    | 11 +++++++++--
+ src/Makefile.am |  6 ------
+ 2 files changed, 9 insertions(+), 8 deletions(-)
+
+commit eff36cd8f06ee992218ed3f198f6a4ea19d7089c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 30 22:25:35 2018 +0430
+
+    Minor build related changes
+
+ .editorconfig  | 3 +++
+ CMakeLists.txt | 6 +++---
+ configure.ac   | 2 +-
+ 3 files changed, 7 insertions(+), 4 deletions(-)
+
+commit 9d68f73d5cf3f3df6bc5516ada987d9019d3fe3d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 30 21:57:10 2018 +0430
+
+    [aat] Implement gcid table parsing (#944)
+
+ src/Makefile.sources     |  1 +
+ src/hb-aat-gcid-table.hh | 73
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.cc     |  1 +
+ 3 files changed, 75 insertions(+)
+
+commit 0e230a83ae8a2c5fbe40dc0e74e5e7ead106e45e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 30 19:36:00 2018 +0430
+
+    [aat] Implement bsln table parsing (#943)
+
+ src/Makefile.sources            |   1 +
+ src/hb-aat-layout-bsln-table.hh | 156
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.cc            |   3 +-
+ 3 files changed, 159 insertions(+), 1 deletion(-)
+
+commit 70d36543aa929320ff82a9ce589786e58adb1836
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 30 05:00:28 2018 +0430
+
+    Make atexit callbacks threadsafe (#930)
+
+ src/hb-common.cc    | 60
+ +++++++++++++++++++++++++++++------------------------
+ src/hb-ft.cc        | 44 ++++++++++++++++++++++++---------------
+ src/hb-glib.cc      |  7 ++++++-
+ src/hb-icu.cc       |  7 ++++++-
+ src/hb-ot-font.cc   |  7 ++++++-
+ src/hb-shape.cc     |  7 ++++++-
+ src/hb-shaper.cc    |  9 ++++++--
+ src/hb-ucdn.cc      |  7 ++++++-
+ src/hb-uniscribe.cc |  8 +++++++
+ 9 files changed, 105 insertions(+), 51 deletions(-)
+
+commit d3a432a7b272917edb83f8fe8468120beb37206b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 30 04:58:47 2018 +0430
+
+    [graphite] Make get_table threadsafe (#931)
+
+ src/hb-graphite2.cc | 10 ++++++----
+ src/hb-graphite2.h  |  4 ++--
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+commit 80395f14e8873f30d2c9a49e42fc9febf5c87e45
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 29 22:00:41 2018 +0430
+
+    Make gen-* scripts LC_ALL=C compatible (#942)
+
+ src/gen-arabic-table.py | 5 ++---
+ src/gen-indic-table.py  | 4 ++--
+ src/gen-use-table.py    | 4 ++--
+ 3 files changed, 6 insertions(+), 7 deletions(-)
+
+commit 26e0cbd834e7a8bab331b395257e9c21dde4c2b1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 29 21:22:47 2018 +0430
+
+    Actual py3 compatibility making on gen-* scripts (#941)
+
+ src/gen-arabic-table.py       |  6 ++----
+ src/gen-indic-table.py        | 13 +++++--------
+ src/gen-use-table.py          | 12 +++++++++---
+ test/shaping/hb_test_tools.py |  4 ++--
+ 4 files changed, 18 insertions(+), 17 deletions(-)
+
+commit cab2c2c08c67e7d1606c03700df3e4e9c0dc59fd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 29 12:48:47 2018 +0430
+
+    Make more gen-* scripts py3 compatible (#940)
+
+ src/Makefile.am                                    |   2 +-
+ src/gen-arabic-table.py                            | 163
+ +++++++++++----------
+ src/gen-def.py                                     |   2 +-
+ src/gen-indic-table.py                             | 120 +++++++--------
+ src/gen-unicode-ranges.py                          |   8 +-
+ src/gen-use-table.py                               |   3 +-
+ src/hb-ot-shape-complex-indic-table.cc             |   2 -
+ src/sample.py                                      |   5 +-
+ test/fuzzing/run-shape-fuzzer-tests.py             |   3 +-
+ test/fuzzing/run-subset-fuzzer-tests.py            |   3 +-
+ .../data/text-rendering-tests/extract-tests.py     |   3 +-
+ test/shaping/hb_test_tools.py                      |   3 +-
+ test/shaping/run-tests.py                          |   3 +-
+ test/subset/run-tests.py                           |   2 +-
+ 14 files changed, 166 insertions(+), 156 deletions(-)
+
+commit 5f7f0bfa1ecef6406cb9670b4eb057ea12c28730
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 29 04:22:53 2018 +0430
+
+    Add README.wine.md and touch some other docs (#939)
+
+ Makefile.am                       |  3 ++-
+ README.python => README.python.md | 12 +++++++++---
+ README.wine.md                    | 40
+ +++++++++++++++++++++++++++++++++++++++
+ RELEASING.md                      | 25 +++++++++++++-----------
+ 4 files changed, 65 insertions(+), 15 deletions(-)
+
+commit 5aa2c6e194bc75637d3f4862a096c0e7100072e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 28 15:33:51 2018 -0700
+
+    [atexit] Make hb_languate_item_t *langs freeing threadsafe
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/923
+
+ src/hb-common.cc | 15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+commit 8c9451107d46c87ed0e50e718977f0c286972f3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 28 14:06:58 2018 -0700
+
+    Fix one UBSan warning
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/935
+
+ src/hb-font-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 48baf7e389faf8a57649ddc572da2ec8ec8829bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 28 13:38:51 2018 -0700
+
+    [uniscribe] Fixup for previous commit
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/934
+
+ src/hb-uniscribe.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit b17e1a40885245df690a14c7528939b3881e1fe4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 28 10:44:52 2018 -0700
+
+    [uniscribe] Fix assertion fail in checksum calc
+
+    Program:
+    Z:\Users\ebrahim\Desktop\harfbuzz\winbuild\util\.libs\hb-shape.exe
+    File: ../../src/hb-open-type-private.hh, Line 769
+
+    Expression: 0 == (Length & 3)
+
+    abnormal program termination
+
+ src/hb-uniscribe.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a48dd6ef235d569d4b6f6f213ba93a54e142458d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 28 19:08:19 2018 +0430
+
+    Make gen-use-table.py py3 compatible (#932)
+
+ src/gen-use-table.py | 105
+ ++++++++++++++++++++++++++-------------------------
+ 1 file changed, 53 insertions(+), 52 deletions(-)
+
+commit 1c3372786c503f3f9108971dfa8956e4cb95f65d
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 27 10:42:19 2018 -0700
+
+    [subset] fix infinite loop bug in looping through tables for
+    subsetting.
+
+ src/hb-subset.cc                                   |   2 +-
+ ...ase-minimized-hb-subset-fuzzer-5521982557782016 | Bin 0 -> 1228 bytes
+ test/api/test-subset.c                             |  23
+ +++++++++++++++++++++
+ 3 files changed, 24 insertions(+), 1 deletion(-)
+
+commit 8fd55422c3fa2279991d93875d912fca4ee89cf5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 27 16:57:09 2018 +0430
+
+    Implement an internal emojis dumper tool (#909)
+
+    Later to be expanded to a more general tool but for now it only
+    supports CBDT, SVG and CBDT.
+
+ CMakeLists.txt                |   2 +-
+ src/Makefile.am               |   4 ++
+ src/dump-emoji.cc             | 141
+ ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-color-cbdt-table.hh |  71 +++++++++++++++++++++
+ src/hb-ot-color-sbix-table.hh |  79 ++++++++++++++---------
+ src/hb-ot-color-svg-table.hh  |  56 ++++++++++++-----
+ 6 files changed, 307 insertions(+), 46 deletions(-)
+
+commit 430f82817d048ac917f1956e07d9089b9fd7e695
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 27 13:59:56 2018 +0430
+
+    [ci] Fix coverage build fail (#925)
+
+ src/Makefile.am | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 07851aae9d28fed751663c543799f2b59369f892
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 26 20:56:56 2018 -0600
+
+    [subset] Couple of fixes for fuzzer discovered issues. (#924)
+
+    * [subset] sanitize individual DeviceRecord's as part of hdmx
+    sanitization.
+
+    * [subset] Fix out of bounds read with non-two byte align glyphs.
+
+    * [subset] Just use size_device_record >= DeviceRecord::min_size.
+
+    * [subset] Add TODO.
+
+    * [subset] Re-order checks in hdmx sanitize.
+
+ src/hb-ot-hdmx-table.hh                            |   1 +
+ src/hb-subset-glyf.cc                              |   6 +++---
+ src/hb-subset.cc                                   |   6 +++++-
+ ...ase-minimized-hb-subset-fuzzer-5609911946838016 | Bin 0 -> 313 bytes
+ ...ase-minimized-hb-subset-fuzzer-6651660668502016 | Bin 0 -> 15229 bytes
+ test/api/test-subset-hdmx.c                        |  23
+ +++++++++++++++++++++
+ 6 files changed, 32 insertions(+), 4 deletions(-)
+
+commit 6f46883f5b74b206a3b77246891ab2ac57a27c4e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 26 19:55:22 2018 -0700
+
+    [hdmx] Minor
+
+ src/hb-ot-hdmx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c589681926e50834bdc614479efced7382dfbf61
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 26 19:55:16 2018 -0700
+
+    Minor
+
+ src/check-symbols.sh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 19ec366fb12afe5fce23239bbeb61e67d732a169
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 26 15:09:54 2018 -0700
+
+    Fix previous commit
+
+    Automake has this stupid behavior where if your Makefile.am has
+    syntactic error, it can get to a state that make succeeds but just
+    ignores broken Makefile.am.  Ouch.
+
+ src/Makefile.am | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 44b6c77c64d367eb3c9227cf1c0fbaff4ab294b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 26 14:26:45 2018 -0700
+
+    Try fixing linking again
+
+    Before 1.7.5, we were setting -fno-exceptions etc on CXXFLAGS. In
+    1.7.6
+    we set it as CPPFLAGS. Try fixing. Also, I'm fairly sure it's safe to
+    set these unconditionally.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/880 (or so I hope)
+
+ src/Makefile.am      | 19 +++++++------------
+ test/api/Makefile.am |  2 +-
+ 2 files changed, 8 insertions(+), 13 deletions(-)
+
+commit e4d1cbfb4fbc17d7dbe08133d1e5e181e1c9bbc5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 26 14:09:29 2018 -0700
+
+    Add HB_SUBSET_BUILTIN
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/865
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c14b24fcd0052fc6100c32deea6ee1dcb0c98f85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 26 10:44:54 2018 -0700
+
+    Add HB_NO_ATEXIT
+
+ src/hb-private.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit aa53cb50ba3eea5c23458207faf879bd162d6599
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Mar 26 13:28:26 2018 +0430
+
+    [aat] Unprefix not essentially layout tables (#921)
+
+ src/Makefile.sources                                      | 4 ++--
+ src/{hb-aat-layout-fmtx-table.hh => hb-aat-fmtx-table.hh} | 7 ++++---
+ src/hb-aat-layout.cc                                      | 4 ++--
+ src/{hb-aat-layout-ltag-table.hh => hb-aat-ltag-table.hh} | 7 ++++---
+ 4 files changed, 12 insertions(+), 10 deletions(-)
+
+commit 8269791900cc765234915b29c974b34ed1f35519
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Sun Mar 25 20:50:41 2018 -0400
+
+    Allow trailing non-numeric chars in --unicodes
+
+ util/options.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit a289aaff477dfbda25b90ba5ffb1296518d68d21
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 26 01:14:07 2018 -0700
+
+    [aat/ltag] Whitespace
+
+ src/hb-aat-layout-ltag-table.hh | 14 ++++++--------
+ 1 file changed, 6 insertions(+), 8 deletions(-)
+
+commit 158f2810b2868c7398dc80cbb089b88a566ce99e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Mar 26 12:04:30 2018 +0430
+
+    [aat/ltag] Implement the table parsing (#911)
+
+ src/Makefile.sources            |  2 ++
+ src/hb-aat-layout-fmtx-table.hh |  6 ++--
+ src/hb-aat-layout-kerx-table.hh |  4 +--
+ src/hb-aat-layout-ltag-table.hh | 80
+ +++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout-morx-table.hh |  4 +--
+ src/hb-aat-layout-trak-table.hh |  4 +--
+ src/hb-aat-layout.cc            |  3 +-
+ 7 files changed, 93 insertions(+), 10 deletions(-)
+
+commit 9eee38a55cdcbfd34b530dcc8defff84057a9eb2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Mar 25 23:56:02 2018 +0430
+
+    [aat/fmtx] Implement the table parsing (#910)
+
+ src/hb-aat-layout-fmtx-table.hh | 67
+ +++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout-trak-table.hh |  4 +--
+ src/hb-aat-layout.cc            |  1 +
+ 3 files changed, 70 insertions(+), 2 deletions(-)
+
+commit 1d3f4f835175c658c63e96be12052b80d27cf6fa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Mar 25 18:45:50 2018 +0430
+
+    [ci] Add a build only apple-gcc-4.2 i686 bot
+
+ .circleci/config.yml | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit fe18c471a4aee1f6eba62383b64f0a8969cbc6ea
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Mar 25 18:19:23 2018 +0430
+
+    [dwrite] minor
+
+ src/dev-run.sh        |   5 ++-
+ src/hb-directwrite.cc | 118
+ ++++++++++++++++++++------------------------------
+ 2 files changed, 50 insertions(+), 73 deletions(-)
+
+commit ebccd019749e24e6c045518ee1ffbfc947744204
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 24 17:51:55 2018 -0700
+
+    More ULL fixes
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/901
+
+ src/hb-private.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 7ec3ba21f0dc43f9f8ea1fc4344d3ea4524841b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 24 14:12:12 2018 -0700
+
+    Define uint64_t constants with ULL suffix
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/901
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 19256bef9d264f96187261929992b96e61fa43fd
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Mon Mar 12 13:33:03 2018 +0800
+
+    hb-private.hh: Add fallback implementation for round()
+
+    For pre-C99 compilers that do not support round(), we need to have a
+    simplistic implementation for it, when it is not detected during build
+    configuration, either via CMake or autotools, by using floor() and
+    ceil(), which are provided in the pre-C99 compilers.
+
+    Please see discussion at commit 86a0ac2 for more details for re-adding
+    this patch.
+
+ src/hb-private.hh | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit 95f0458f44e9a7ec250f1bc7d9f060745dbabcf3
+Author: Nikolaus Waxweiler <madigens@gmail.com>
+Date:   Fri Mar 23 19:38:11 2018 +0000
+
+    Policy 0063 must be enabled to have hidden inline visibility... (#900)
+
+    ...on static builds.
+
+ CMakeLists.txt | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 2a236063392c4f7c4d718be36d2dec2b8804b560
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 23 18:37:01 2018 +0430
+
+    Fix llvm-gcc-4.2 compile issue and add a macOS bot to test it (#899)
+
+ .circleci/config.yml        | 16 ++++++++++++++++
+ src/hb-open-file-private.hh | 12 +++++++-----
+ src/hb-ot-glyf-table.hh     | 40 ++++++++++++++++++++++------------------
+ src/hb-ot-kern-table.hh     |  2 +-
+ 4 files changed, 46 insertions(+), 24 deletions(-)
+
+commit 7919033ce8f6fd32b2dd980ad0aa59c7149a4827
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 22 16:04:38 2018 +0430
+
+    [dwrite] Replace rest of 'malloc/free's with 'new/delete' (#897)
+
+ src/hb-directwrite.cc | 251
+ +++++++++++++++++++++++++-------------------------
+ 1 file changed, 127 insertions(+), 124 deletions(-)
+
+commit 3f55e0e74680c246819233a7250df612821698d7
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 20 17:36:52 2018 -0700
+
+    [subset] Check for the Null table and not nullptr to detect failure
+    to find a table in glyf accelerator.
+
+ src/hb-ot-glyf-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 45def99eae81e470be3c38d2962aafaaa85500b9
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 20 17:28:47 2018 -0700
+
+    [subset] Fix to debug message.
+
+ src/hb-subset-glyf.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 139661404006b8be039436a81cb6b1a73ec44042
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 20 16:55:42 2018 -0700
+
+    [subset] don't use pointers returned from push after array has
+    resized in hb-subset-glyf.cc
+
+ src/hb-subset-glyf.cc                                   |   9 +++++++--
+ .../crash-b577db318b30f2851828a4c9ef97cb30678b1b54      | Bin 0 ->
+ 22473 bytes
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 3531efdb4c641ef543ea0686fef9289307d52096
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 20 16:31:21 2018 -0700
+
+    [subset] Fixed out of bounds read when subsetting hdmx.
+
+ src/hb-ot-hdmx-table.hh                            |  30
+ ++++++++++++++++-----
+ .../crash-ccc61c92d589f895174cdef6ff2e3b20e9999a1a | Bin 0 -> 63302 bytes
+ test/api/test-subset-hdmx.c                        |  23 ++++++++++++++++
+ 3 files changed, 47 insertions(+), 6 deletions(-)
+
+commit e597436b994c0a553e85e4c2dbd74aa037e69b60
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 20 13:00:49 2018 -0700
+
+    [subset] Disable glyf accelerator_t methods if it didn't successfully
+    init.
+
+ src/hb-ot-glyf-table.hh                            |   7 ++++++-
+ .../crash-4b60576767ee4d9fe1cc10959d89baf73d4e8249 | Bin 0 -> 3140 bytes
+ test/api/test-subset.c                             |  23
+ +++++++++++++++++++++
+ 3 files changed, 29 insertions(+), 1 deletion(-)
+
+commit 7251181b56af564e2a9444f002f8ac03f98c7ee3
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 20 11:21:06 2018 -0700
+
+    [subset] Fix infinite loop in there are more then 32 tables.
+
+ src/hb-subset.cc                                   |   1 +
+ test/api/Makefile.am                               |   1 +
+ .../oom-6ef8c96d3710262511bcc730dce9c00e722cb653   | Bin 0 -> 24233 bytes
+ test/api/test-subset.c                             |  62
+ +++++++++++++++++++++
+ 4 files changed, 64 insertions(+)
+
+commit 1a94804d35d533d39849d21a177039c4cbfade98
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 19 18:39:22 2018 -0700
+
+    [subset] Add a fix for segfault in hmtx/vmtx subsetting code.
+
+ src/hb-ot-hmtx-table.hh     | 13 +++++++++++--
+ test/api/test-subset-hmtx.c |  3 ++-
+ 2 files changed, 13 insertions(+), 3 deletions(-)
+
+commit 31281d6a17a03a124456a4cab54e31b248b41267
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 19 17:47:57 2018 -0700
+
+    [subset] Add a test demonstrating a seg fault while subsetting hmtx.
+
+ .../crash-e4e0bb1458a91b692eba492c907ae1f94e635480 | Bin 0 -> 63302 bytes
+ test/api/test-subset-hmtx.c                        |  22
+ +++++++++++++++++++++
+ 2 files changed, 22 insertions(+)
+
+commit b5c7d6cffc2098dafa06822b28a5fd4f6218b60c
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Mar 16 10:20:21 2018 -0700
+
+    [subset] Restore subset to hb-subset-fuzzer.
+
+ test/fuzzing/Makefile.am         | 2 +-
+ test/fuzzing/hb-subset-fuzzer.cc | 2 --
+ 2 files changed, 1 insertion(+), 3 deletions(-)
+
+commit 957e7756634a4fdf1654041e20e883cf964ecac9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Mar 19 12:19:42 2018 +0330
+
+    [dwrite] Use new again and enable the build on msys2 bots (#890)
+
+ appveyor.yml          |  7 ++++---
+ src/hb-directwrite.cc | 19 ++++++++-----------
+ 2 files changed, 12 insertions(+), 14 deletions(-)
+
+commit 8d1b4082ae01b8fd87b2e83c89f670c1c7cfa0b1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 17 01:05:03 2018 +0330
+
+    Appropriate fix for msys2 bot fail on gen-def.py (#894)
+
+ src/Makefile.am | 2 +-
+ src/gen-def.py  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 7b4333b090a3adf04519ec853456cafff07dedf0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 16 22:45:09 2018 +0330
+
+    Do feature test before adding -Bsymbolic-functions, autotools part
+    (#892)
+
+ configure.ac             |  2 +-
+ m4/ax_check_link_flag.m4 | 74
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 75 insertions(+), 1 deletion(-)
+
+commit d68f00e4d8b061f56d3bd46d5ed1bc51406a4f1a
+Author: Joel Winarske <joel.winarske@gmail.com>
+Date:   Fri Mar 16 12:14:27 2018 -0700
+
+    Do feature test before adding -Bsymbolic-functions, cmake part (#889)
+
+ CMakeLists.txt | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 42d3271cc39050c9df5f8c7345322ae90592158e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 16 22:39:58 2018 +0330
+
+    [cmake] Don't hide symbols by default (#891)
+
+    But keep use of cmake idiomatic way of making inlines hidden
+
+ CMakeLists.txt | 17 ++---------------
+ 1 file changed, 2 insertions(+), 15 deletions(-)
+
+commit 584693e0cb3585a910b18d7916d7e554ecdf619a
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 15 18:27:01 2018 -0700
+
+    [subset] Test not linking libharfbuzz-subset-fuzzing into
+    hb-subset-fuzzer.
+
+ test/fuzzing/Makefile.am                | 2 +-
+ test/fuzzing/hb-subset-fuzzer.cc        | 2 ++
+ test/fuzzing/run-subset-fuzzer-tests.py | 2 +-
+ 3 files changed, 4 insertions(+), 2 deletions(-)
+
+commit 3f9361fe7a68896d2a5a44709ec08fe510144215
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 15 18:06:15 2018 -0700
+
+    [subset] Test hb-shape-fuzzer in run-subset-fuzzer-tests.
+
+ test/fuzzing/run-subset-fuzzer-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ce368e0d05147e70d8ad90383d748644b07f1d6f
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 15 18:04:54 2018 -0700
+
+    [subset] make libharfbuzz-subset-fuzzing.la depend on lib target.
+
+ test/fuzzing/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 85a57029cdad634f56aa3ccc768e72bcb03888e3
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 15 16:31:38 2018 -0700
+
+    [subset] %d -> %zu
+
+ test/fuzzing/hb-subset-fuzzer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 318eea585329807477aab4eec173b561a08a46ca
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 15 16:14:01 2018 -0700
+
+    [subset] Add some more logging to hb-subset-fuzzer.
+
+ test/fuzzing/hb-subset-fuzzer.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 64bab8b3d009ed4327c2db9fa3425682de225810
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 15 16:12:00 2018 -0700
+
+    [subset] Fix run-shape-fuzzer-tests.py. It was generating incorrect
+    paths for input fonts.
+
+ test/fuzzing/run-shape-fuzzer-tests.py | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 6f9a584371ba4a9a63be3fa89f46474047a43ceb
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 15 15:41:08 2018 -0700
+
+    [subset] Add more verbose output for subset fuzzer test.
+
+ test/fuzzing/run-shape-fuzzer-tests.py  | 2 +-
+ test/fuzzing/run-subset-fuzzer-tests.py | 8 ++++++--
+ 2 files changed, 7 insertions(+), 3 deletions(-)
+
+commit 0ce0f8781213f8f01b9ebc8cfa31434784899952
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 15 13:04:31 2018 -0700
+
+    [subset] Rename hb-fuzzer -> hb-shape-fuzzer.
+
+ test/fuzzing/CMakeLists.txt                              | 16
+ ++++++++--------
+ test/fuzzing/Makefile.am                                 | 16
+ ++++++++--------
+ test/fuzzing/{hb-fuzzer.cc => hb-shape-fuzzer.cc}        |  0
+ .../{run-fuzzer-tests.py => run-shape-fuzzer-tests.py}   | 12
+ ++++++------
+ 4 files changed, 22 insertions(+), 22 deletions(-)
+
+commit 1e9bd6d5ff0af0189b6398c5e13cff11ee70762b
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Mar 14 19:58:15 2018 -0700
+
+    [subset] Add rub-subset-fuzzer-tests.py to dist files.
+
+ test/fuzzing/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 474afaafd908a9c8174e05d693ac214ef2cc2597
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Mar 14 19:15:33 2018 -0700
+
+    [subset] Add a test runner for hb-subset-fuzzer and cmake build
+    config.
+
+ test/fuzzing/CMakeLists.txt             |  9 +++++++++
+ test/fuzzing/Makefile.am                |  3 ++-
+ test/fuzzing/run-subset-fuzzer-tests.py | 31
+ +++++++++++++++++++++++++++++++
+ 3 files changed, 42 insertions(+), 1 deletion(-)
+
+commit aa9612d35f59f7f269fba4797c8da491844c56ec
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 12 18:04:34 2018 -0700
+
+    [subset] Fix fuzzing build for hb-subset-fuzzer.
+
+ src/Makefile.am          | 19 +++----------------
+ test/fuzzing/Makefile.am |  1 +
+ 2 files changed, 4 insertions(+), 16 deletions(-)
+
+commit b674fc1f9fa36857214ddaba3d32877f03ffec8c
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 12 16:33:47 2018 -0700
+
+    [subset] Add missing destroy of subsetting result in subset fuzzer.
+
+ test/fuzzing/hb-subset-fuzzer.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1beb08862e9bd668599f0385d7ba59272fc24912
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 12 16:08:16 2018 -0700
+
+    [subset] First pass at setting up a fuzzing program for hb-subset.
+
+ src/Makefile.am                  | 24 +++++++++++++++++++++++-
+ test/fuzzing/Makefile.am         | 15 +++++++++++++++
+ test/fuzzing/hb-subset-fuzzer.cc | 37
+ +++++++++++++++++++++++++++++++++++++
+ 3 files changed, 75 insertions(+), 1 deletion(-)
+
+commit 127096e4748d6381339342fc2750dd540e815fa5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 15 13:23:27 2018 -0700
+
+    [util] Remove line buffering
+
+    Something weird seems to be going on. Just kill it.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/888
+
+ configure.ac    |  2 +-
+ util/options.cc | 12 ------------
+ 2 files changed, 1 insertion(+), 13 deletions(-)
+
+commit e6e2ee2b923f8ab7c0694d4557375ba316e15dff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 15 09:05:22 2018 -0700
+
+    Remove extra stdbool includes
+
+    They are handled in our common header.
+
+ test/api/test-subset-post.c | 2 --
+ test/api/test-subset-vmtx.c | 2 --
+ 2 files changed, 4 deletions(-)
+
+commit a0dccb6188d7a9174643c7239041cb1a5300b957
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 14 16:31:53 2018 +0100
+
+    Add NameID
+
+ src/hb-aat-layout-trak-table.hh    |  8 ++++----
+ src/hb-open-type-private.hh        |  3 +++
+ src/hb-ot-layout-common-private.hh | 10 +++++-----
+ src/hb-ot-var-fvar-table.hh        |  6 +++---
+ 4 files changed, 15 insertions(+), 12 deletions(-)
+
+commit 56946d21c0696ed6a098434537979396171c9bfb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 14 16:26:33 2018 +0100
+
+    [color/COLR] Simplify
+
+ src/hb-ot-color-colr-table.hh | 48
+ +++----------------------------------------
+ 1 file changed, 3 insertions(+), 45 deletions(-)
+
+commit 6418ae4e8a3f4681cb4e7d54c589562930bc0678
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 14 16:18:42 2018 +0100
+
+    [color/COLR] Clean up
+
+ src/hb-aat-layout-common-private.hh | 84
+ -------------------------------------
+ src/hb-open-type-private.hh         | 84
+ +++++++++++++++++++++++++++++++++++++
+ src/hb-ot-color-colr-table.hh       | 30 ++++++-------
+ 3 files changed, 99 insertions(+), 99 deletions(-)
+
+commit 150c53ee969876c2831b6165cb71655e7ce2dbdb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 14 16:08:12 2018 +0100
+
+    [color/COLR] Fix bad sanitize
+
+    Bad bad bad bad code. Don't do that. If compiler's not happy,
+    understand why.
+
+ src/hb-ot-color-colr-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 399c800b93879186da2b7c892c7aa21468f062f2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 14 16:03:01 2018 +0100
+
+    [color/COLR] Clean up
+
+ src/hb-ot-color-colr-table.hh | 32 +++++++++++++++++---------------
+ 1 file changed, 17 insertions(+), 15 deletions(-)
+
+commit 9e337341d54c4ee12eec58e025a6831bb976d61f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 14 15:52:53 2018 +0100
+
+    [color/cbdt] Clean up
+
+ src/hb-ot-color-cbdt-table.hh | 112
+ ++++++++++++++++++++----------------------
+ 1 file changed, 54 insertions(+), 58 deletions(-)
+
+commit 86a0ac284fc4c2ce96354bfdf32878b6db5c77bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 14 15:51:33 2018 +0100
+
+    Revert "hb-private.hh: Add fallback implementation for round()"
+
+    This reverts commit b9dcbb1f8312d8606b230f75594d40b7d4087004.
+
+    This is gross. Should be only done if a specific macro is defined. Not
+    the other way
+    around. This fails my build as autotools companions where not
+    added anyway.
+
+ src/hb-private.hh | 13 -------------
+ 1 file changed, 13 deletions(-)
+
+commit 791d80a1d42ce0bd7c5f0a3d3d10c562a6161a82
+Merge: d4907e83 22de9bf5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 15 11:40:52 2018 +0330
+
+    Merge pull request #886 from madig/only-export-visible-symbols
+
+    CMake: hide symbols by default on non-MSVC, define export attribute
+
+commit 22de9bf56d80dbf6a13a06beafd21711bdab78af
+Author: Nikolaus Waxweiler <nikolaus.waxweiler@daltonmaag.com>
+Date:   Wed Mar 14 10:29:24 2018 +0000
+
+    Enable implicit symbol hiding for all libraries, static and shared
+
+    This covers all built libraries now and both static and shared builds.
+
+ CMakeLists.txt | 35 +++++++++++++++++++++++------------
+ 1 file changed, 23 insertions(+), 12 deletions(-)
+
+commit d4907e83ef8e0d03acb701957cc1ee9acacb0a19
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 14 11:04:28 2018 +0330
+
+    [dwrite] GCC/mingw/msys2 compatibility (#884)
+
+ src/hb-directwrite.cc | 37 +++++++++++++++++++++----------------
+ 1 file changed, 21 insertions(+), 16 deletions(-)
+
+commit 93f8f89dedd2f8cf5eb40165a20d009de24c5eda
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 14 09:56:31 2018 +0330
+
+    [ci] Trying to fix gen-def issue on appveyor (#885)
+
+ src/gen-def.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ce975dce7ae8950b6e7b9a2d0c00ead9d45f73ff
+Author: Nikolaus Waxweiler <madigens@gmail.com>
+Date:   Wed Mar 14 00:50:32 2018 +0000
+
+    CMake: hide symbols by default on non-MSVC, define export attribute
+
+    This change makes sure that non-MSVC builds using CMake properly hide
+    non-exported functions.
+
+ CMakeLists.txt | 20 ++++++++++++--------
+ 1 file changed, 12 insertions(+), 8 deletions(-)
+
+commit a12dd6f75d85cf29ed78182ac97a12ebbcf77375
+Merge: 28f25f32 7c43adab
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 14 02:54:07 2018 +0330
+
+    Merge pull request #877 from fanc999/master.msvc
+
+    Fix CMake builds on Windows, MSVC in particular
+
+commit 7c43adab6deb9302a24cc857c4aaa9b6b62215d2
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Mon Mar 12 16:43:53 2018 +0800
+
+    CMake: Fix utility program installation
+
+    Put in the utility program that was missed in installation by
+    replacing
+    the one that was duplicated.
+
+ CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e9b8002a6024d7a9b6de204897345ae77bb50881
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Mon Mar 12 16:23:57 2018 +0800
+
+    CMake: Fix introspection on Windows
+
+    The list of source files to pass to g-ir-scanner is becoming too
+    long for Windows, as Windows imposes a 8192-character limit for
+    command
+    lines, so we need to first transform that list into a listings
+    file, and
+    then use the --filelist option for g-ir-scanner to build the
+    introspection files.
+
+ CMakeLists.txt | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 831d4a2dab1f229811c3a90b791f2a19c88fc1b5
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Mon Mar 12 13:48:55 2018 +0800
+
+    test/api: Fix building subset tests
+
+    Include stdbool.h in hb-setset-test.h instead of in the individual
+    sources, if it is found; otherwise use a simplistic fallback for it if
+    it is not found.
+
+    Also declare variables at the top of the block, to build on pre-C99
+    compiliers.
+
+ test/api/hb-subset-test.h   | 17 +++++++++++++++--
+ test/api/test-subset-cmap.c |  8 ++++----
+ test/api/test-subset-glyf.c | 23 ++++++++++++++---------
+ test/api/test-subset-hdmx.c |  8 ++++----
+ test/api/test-subset-hmtx.c | 17 ++++++++++-------
+ test/api/test-subset-os2.c  |  4 ++--
+ 6 files changed, 49 insertions(+), 28 deletions(-)
+
+commit eda6a5ea807ba8a4e7fa20ad0273b394ed72d106
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Mon Mar 12 13:38:01 2018 +0800
+
+    CMake: Fix running tests on Windows
+
+    For the API tests, output the test programs at $(TOP_BUILDDIR) so that
+    the freshly-built DLLs will be available for the test programs.  For
+    those that are run through the Python wrapper scripts, use
+    ${PYTHON_EXECUTABLE} instead of plain 'python' in case the Python
+    interpreter is not in the PATH.
+
+ test/api/CMakeLists.txt     | 7 ++++++-
+ test/fuzzing/CMakeLists.txt | 2 +-
+ test/shaping/CMakeLists.txt | 4 ++--
+ test/subset/CMakeLists.txt  | 2 +-
+ 4 files changed, 10 insertions(+), 5 deletions(-)
+
+commit b9dcbb1f8312d8606b230f75594d40b7d4087004
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Mon Mar 12 13:33:03 2018 +0800
+
+    hb-private.hh: Add fallback implementation for round()
+
+    Add a simplistic round() implementation for our purposes, used
+    when the
+    compiler does not support round() directly.
+
+ src/hb-private.hh | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit 89dbabff65a39dfb0d9ad036516d5b96c37739de
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Mon Mar 12 13:27:38 2018 +0800
+
+    configure.ac/CMake: Check for round() and stdbool.h
+
+    Not all the compilers that HarfBuzz is buildable on supports round()
+    and
+    has the header stdbool.h, so we check for them and define HAVE_ROUND
+    and
+    HAVE_STDBOOL_H repsectively in our CFLAGS so that we include them only
+    when they are found, or use fallback implementations when necessary.
+
+    Also include FindPythonInterp earlier as we need PYTHON_EXECUTABLE
+    to be
+    set for running the tests.
+
+ CMakeLists.txt | 12 ++++++++++--
+ configure.ac   |  9 ++++++++-
+ 2 files changed, 18 insertions(+), 3 deletions(-)
+
+commit 28f25f32fc63c3e1ae0d04b6eb5ea6b729fb2228
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Mar 12 14:00:11 2018 +0330
+
+    [ot-color/SVG] Minor (#878)
+
+ src/hb-ot-color-svg-table.hh | 24 ++++++++++++++++--------
+ 1 file changed, 16 insertions(+), 8 deletions(-)
+
+commit fb0f3e3767b488651f13978c1fd8651aefdd6b83
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Mar 11 20:38:40 2018 +0100
+
+    [sbix] Clean up
+
+ src/hb-ot-color-sbix-table.hh | 70
+ +++++++++++++++++++++++--------------------
+ 1 file changed, 37 insertions(+), 33 deletions(-)
+
+commit 218fa7166e9626f2036d08882854a86d753e4192
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 10 11:13:52 2018 +0330
+
+    [ot-color] SVG table implementation (#874)
+
+ src/Makefile.sources         |   3 +-
+ src/hb-ot-color-svg-table.hh | 111
+ +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout.cc          |   1 +
+ 3 files changed, 114 insertions(+), 1 deletion(-)
+
+commit 4c63c82383cba11f2c44c00cbc953863346e627c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 10 11:07:56 2018 +0330
+
+    [ot-color] sbix table implementation (#870)
+
+ src/Makefile.sources          |   1 +
+ src/hb-ot-color-sbix-table.hh | 128
+ ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout.cc           |   1 +
+ 3 files changed, 130 insertions(+)
+
+commit 62b3d8fb7034c53e0804689d58e2eb7330e04430
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 10 00:44:36 2018 +0330
+
+    [dev-run] minor
+
+ src/dev-run.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 743ef317619a57ebf5a75935db0eecccade5d5b7
+Merge: 9206762b 39b2f69f
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Mar 9 12:06:52 2018 -0700
+
+    Merge pull request #872 from googlefonts/drop-tables
+
+    [subset] Drop the same tables by default as fontTools does.
+
+commit 9206762bbd4033e97d6d35ef1cce1b7940fbc935
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 9 15:43:03 2018 +0330
+
+    Make subset test runner compatible with py3
+
+    Fixes #873
+
+ test/subset/run-tests.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit dbadb871d1ca62eff10768564fc0a17b9aaa4d63
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 9 15:25:59 2018 +0330
+
+    [ci] Enable subset tests on ArchLinux to test
+
+    This makes ArchLinux bots fail, a starting point to #873
+
+ .circleci/config.yml | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 39b2f69fab3b8aec1296dcda111d358559d39f0b
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 8 16:30:36 2018 -0800
+
+    [subset] Drop the same tables by default as fontTools does.
+
+ src/hb-subset.cc | 49 ++++++++++++++++++++++++++++++++++---------------
+ 1 file changed, 34 insertions(+), 15 deletions(-)
+
+commit dbe552770fa7cec91bba750e0e81aaeae96b3caf
+Merge: 2ebf4c69 8548fa15
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 8 15:50:25 2018 -0700
+
+    Merge pull request #871 from googlefonts/mplus
+
+    [subset] Add a Japanese font to the subset integration tests.
+
+commit 8548fa152241d6c5b020146f97aac15934ba0065
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Mar 7 12:37:03 2018 -0800
+
+    [subset] Drop cmap 12, platform 0 tables from Mplus1p expected files.
+
+ ...-Regular.default.3042,3044,3046,3048,304A,304B.ttf | Bin 3040 ->
+ 3032 bytes
+ ...-Regular.default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 3276 ->
+ 3268 bytes
+ .../japanese/Mplus1p-Regular.default.61,63,65,6B.ttf  | Bin 2592 ->
+ 2584 bytes
+ ...-Regular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3572 ->
+ 3564 bytes
+ .../japanese/Mplus1p-Regular.default.660E.ttf         | Bin 2356 ->
+ 2348 bytes
+ ...gular.drop-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 2312 ->
+ 2304 bytes
+ ...gular.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2548 ->
+ 2540 bytes
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf        | Bin 1864 ->
+ 1856 bytes
+ ...gular.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 2844 ->
+ 2836 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttf      | Bin 1628 ->
+ 1620 bytes
+ 10 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 9b00b9a10d5fdfd2d9deb1b0e847695797b7e09b
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 6 17:47:40 2018 -0800
+
+    [subset] Fix deadlock waiting for process output in subset test
+    runner.
+
+ test/subset/run-tests.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bfec28a7db0631f42dd420a8c04638624e4602af
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 6 15:43:08 2018 -0800
+
+    [subset] add some extra logging to subset run-tests.py.
+
+ test/subset/run-tests.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit c7d814eaa8e9af6c447124ceeaa896eb5e17abd7
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 1 18:20:00 2018 -0800
+
+    [subset] Add japanese font file to subset integration tests.
+
+ test/subset/data/Makefile.am                          |   1 +
+ test/subset/data/Makefile.sources                     |   1 +
+ ...-Regular.default.3042,3044,3046,3048,304A,304B.ttf | Bin 0 ->
+ 3040 bytes
+ ...-Regular.default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 0 ->
+ 3276 bytes
+ .../japanese/Mplus1p-Regular.default.61,63,65,6B.ttf  | Bin 0 ->
+ 2592 bytes
+ ...-Regular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 0 ->
+ 3572 bytes
+ .../japanese/Mplus1p-Regular.default.660E.ttf         | Bin 0 ->
+ 2356 bytes
+ ...gular.drop-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 0 ->
+ 2312 bytes
+ ...gular.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 0 ->
+ 2548 bytes
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf        | Bin 0 ->
+ 1864 bytes
+ ...gular.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 0 ->
+ 2844 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttf      | Bin 0 ->
+ 1628 bytes
+ test/subset/data/fonts/Mplus1p-Regular.ttf            | Bin 0 ->
+ 1758820 bytes
+ test/subset/data/tests/japanese.tests                 |  16
+ ++++++++++++++++
+ 14 files changed, 18 insertions(+)
+
+commit 2ebf4c69b18452caa0c871aebec9785e80348166
+Merge: 1ab51480 869ccac5
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 8 14:41:59 2018 -0700
+
+    Merge pull request #868 from googlefonts/post
+
+    [subset] Drop glyph names from post when subsetting.
+
+commit 869ccac5ab69060f2db2893014b5538539fd4f45
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 8 11:06:49 2018 -0800
+
+    [subset] use create_sub_blob instead of manually copying the post
+    table.
+
+ src/hb-ot-post-table.hh | 20 +++++++-------------
+ 1 file changed, 7 insertions(+), 13 deletions(-)
+
+commit ec47cd95ba6c550314a1cbcc46fafd7946e52ece
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Mar 7 10:33:02 2018 -0800
+
+    [subset] Unit test to check that post subsetting drops glyph names.
+
+ test/api/Makefile.am                               |   2 +
+ ...lus1p-Regular.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3572 ->
+ 3724 bytes
+ test/api/test-subset-post.c                        |  61
+ +++++++++++++++++++++
+ 3 files changed, 63 insertions(+)
+
+commit dd107699938740e261948e4b525fa0ad501beb03
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 6 18:33:39 2018 -0800
+
+    [subset] drop all glyph names from the post table.
+
+ src/hb-ot-post-table.hh | 28 ++++++++++++++++++++++++++++
+ src/hb-subset.cc        |  4 ++++
+ 2 files changed, 32 insertions(+)
+
+commit 1ab514805ced190efdabc2103e4800d40b248300
+Merge: 70ad69f2 362f2824
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Mar 7 12:36:00 2018 -0700
+
+    Merge pull request #867 from googlefonts/vmtx
+
+    [subset] Add vmtx subsetting.
+
+commit 362f28240683fde395ff52f4fc1216fbc7131452
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Mar 7 11:08:55 2018 -0800
+
+    [subset] fix author.
+
+ test/api/test-subset-vmtx.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 89465cb1c7b8ab61c0ef4887f51572ba91039f3e
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Mar 7 10:29:15 2018 -0800
+
+    [subset] s/hmetrics/vmetrics.
+
+ test/api/test-subset-vmtx.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 91867cda6ae5ae063482b28b0a52ebc30718cb40
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Mar 7 10:17:06 2018 -0800
+
+    [subset] cleanup.
+
+ src/hb-subset.cc            | 2 +-
+ test/api/test-subset-vmtx.c | 3 +--
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit d9263f0230693d108249be0904bc5a3280560cb3
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 6 15:40:35 2018 -0800
+
+    [subset] add unit tests for vmtx subsetting.
+
+ test/api/Makefile.am                               |   2 +
+ ...lus1p-Regular.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 0 -> 3572 bytes
+ test/api/fonts/Mplus1p-Regular.660E.ttf            | Bin 0 -> 2356 bytes
+ test/api/test-subset-vmtx.c                        | 100
+ +++++++++++++++++++++
+ 4 files changed, 102 insertions(+)
+
+commit 0e8f9430c83c076993a0c7a320713bb484051343
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 6 13:08:20 2018 -0800
+
+    [subset] Skip subsetting vhea.
+
+ src/hb-subset.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 64cf53d6197a0e6c56aef744ceff2f8a0ff85654
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Mar 2 17:33:49 2018 -0800
+
+    [subset] Subset vmtx if present.
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ src/hb-subset.cc        | 3 +++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 70ad69f2449d754fcc5270ff3ca3848a77f4c7af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 16:11:44 2018 +0100
+
+    [test] Fix build with older glib
+
+ test/api/hb-subset-test.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ff2f81432bb0484a019a678058595e10217df51d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 16:05:14 2018 +0100
+
+    1.7.6
+
+ NEWS             | 15 +++++++++++++++
+ configure.ac     |  2 +-
+ src/hb-version.h |  4 ++--
+ 3 files changed, 18 insertions(+), 3 deletions(-)
+
+commit ac2ece3e153167224c85cc384e2826ea9711a8b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 15:52:42 2018 +0100
+
+    [ot] Comment out AAT include
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 23a9ac993862b4a9032d38e80491a769b7ee86da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 15:51:42 2018 +0100
+
+    Remove hb-ot-color.h
+
+    So I can make a release.
+
+ src/Makefile.sources          |  1 -
+ src/hb-ot-color-cpal-table.hh | 48 +++++++++++++++++++++++++
+ src/hb-ot-color.h             | 81
+ -------------------------------------------
+ src/hb-ot.h                   |  1 -
+ 4 files changed, 48 insertions(+), 83 deletions(-)
+
+commit 790a11700773dd664e4d5edac63c404c5ebce080
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 15:31:15 2018 +0100
+
+    [ot] Remove hb-ot-base.h
+
+    BASE table API will go into hb-ot-layout.h.
+
+ src/Makefile.sources           |  1 -
+ src/hb-ot-base.h               | 56
+ ------------------------------------------
+ src/hb-ot-layout-base-table.hh |  1 -
+ src/hb-ot-layout.h             | 16 ++++++++++++
+ src/hb-ot.h                    |  1 -
+ 5 files changed, 16 insertions(+), 59 deletions(-)
+
+commit f014a124f582215fa96afc28b534a1ca0bf17167
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 10:49:26 2018 +0100
+
+    [set] Fix algebra
+
+    Was totally b0rked. Ouch!
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/863
+
+ src/hb-set-private.hh | 20 +++++++++++++++++---
+ 1 file changed, 17 insertions(+), 3 deletions(-)
+
+commit 7587683cdce8ee9b7f07bae82aa1bb163e79ab92
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 09:55:22 2018 +0100
+
+    [set] Minor
+
+    In preparation to fix https://github.com/harfbuzz/harfbuzz/issues/863
+
+    Binary operations are sets are completely broken. Ouch.
+
+ src/hb-set-private.hh | 21 ++++++++++++++-------
+ 1 file changed, 14 insertions(+), 7 deletions(-)
+
+commit e4cbb87bd3512c3a6e97ea3923ecd1b26b0a1251
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 09:37:22 2018 +0100
+
+    Minor
+
+ src/hb-ot-color-colr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c6150333c29b458ed34858f24e94acc0f771aa0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 09:27:16 2018 +0100
+
+    Sign
+
+ src/test-unicode-ranges.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9a6f9b4d4284f0378a71a181fe216d97c913669e
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 6 13:46:51 2018 -0800
+
+    [set] add a test demonstrating a bug in hb_set_union.
+
+ test/api/test-set.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 9b4a5d7ef1ec068042e3c793845a4dbc3308d4b7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 7 00:23:40 2018 +0330
+
+    [ci] Enable -Werror=unused (#862)
+
+ .travis.yml             | 4 ++--
+ src/hb-ot-glyf-table.hh | 1 -
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 54cbe6702c1e4c934c60512367abaf801294c1bb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 6 16:41:08 2018 +0330
+
+    [ot-color] Further improvements on COLR/CPAL implementation (#859)
+
+    * Implemented a bsearch on get_base_glyph_record
+    * Made get_color_record_argb actually work
+
+ src/hb-ot-color-colr-table.hh | 35 ++++++++++++++-----------
+ src/hb-ot-color-cpal-table.hh | 59
+ +++++++++++++++----------------------------
+ src/hb-ot-color.h             | 12 ++-------
+ 3 files changed, 42 insertions(+), 64 deletions(-)
+
+commit 18d14b8e0d5d28106800ebf835ff3155a4f4de7c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Mar 5 14:25:11 2018 +0330
+
+    [dev-run] an option to open using a GUI app
+
+ src/dev-run.sh | 22 ++++++++++++++++++----
+ 1 file changed, 18 insertions(+), 4 deletions(-)
+
+commit 1db83954948dfae3f75f61c535c5de1b3a843a69
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Mar 5 13:02:50 2018 +0330
+
+    [ci] minor, bring back the removed assertion
+
+ .ci/run-coveralls.sh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5895fe3d4d0441dacf8989740cf4150193397796
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Mar 5 12:58:34 2018 +0330
+
+    [ci] minor
+
+ .ci/trigger-coverity.sh | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit a3e29fd38f01b26b6306f9f7142a54cc7d6c6080
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Mar 4 02:56:27 2018 +0330
+
+    [aat/kerx] Add a TODO
+
+ src/hb-aat-layout-kerx-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0ef6ab25ab4456e387711ae246900486ad738d26
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Mar 4 02:47:26 2018 +0330
+
+    [ot-color] Move cbdt to the namespace (#860)
+
+ src/Makefile.sources                                   | 2 +-
+ src/{hb-ot-cbdt-table.hh => hb-ot-color-cbdt-table.hh} | 6 +++---
+ src/hb-ot-font.cc                                      | 3 ++-
+ 3 files changed, 6 insertions(+), 5 deletions(-)
+
+commit 6659cb56fae0c900ae88e95bedcb3b76234c8838
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Mar 4 02:31:53 2018 +0330
+
+    [ci] Remove --coverage as use of --enable-code-coverage
+
+ .travis.yml | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 00dd321ace75ff0d1824cf75cd41490c5dd6ad76
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 23:26:11 2018 +0330
+
+    [ci] Don't run coveralls on freetype folder
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f50aedd371f1a6894d1bf7732f017b51cbdd59bd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 23:17:36 2018 +0330
+
+    [ci] Remove failing check on run-coveralls
+
+ .ci/run-coveralls.sh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit a0031c120e3ac5c059b81a004b9386fab3d662fc
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 23:09:25 2018 +0330
+
+    Add lcov tool for coverage tests
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit ecef95b21264347f9505e3ed4fb25ec7e4ccca5d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 23:03:13 2018 +0330
+
+    [ci] Enable code coverage on Travis Linux builds
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f7399796a1ed36cfc4f1ef7631584569baa80981
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 22:55:09 2018 +0330
+
+    Enable coverage test on autotools (#857)
+
+ configure.ac           |   1 +
+ m4/ax_code_coverage.m4 | 264
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/Makefile.am        |   6 +-
+ 3 files changed, 269 insertions(+), 2 deletions(-)
+
+commit c446c23f0f09e541891b49184febdfc75cb3505f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 22:43:23 2018 +0330
+
+    [ot-color] Move the related tables to hb-ot-color-* (#858)
+
+ src/Makefile.sources                                   | 4 ++--
+ src/{hb-ot-colr-table.hh => hb-ot-color-colr-table.hh} | 6 +++---
+ src/{hb-ot-cpal-table.hh => hb-ot-color-cpal-table.hh} | 6 +++---
+ src/hb-ot-color.cc                                     | 4 ++--
+ src/hb-ot-layout.cc                                    | 4 ++--
+ 5 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 48ed15a2bcdc1999e2d39fdcb2644ba4c3beccfe
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 22:00:29 2018 +0330
+
+    [COLR/CPAL] Provide enough helper for rasterization (#855)
+
+ src/hb-ot-colr-table.hh | 47
+ ++++++++++++++++++++++++++++++++++++++++++++---
+ src/hb-ot-cpal-table.hh | 18 +++++++++++++++---
+ 2 files changed, 59 insertions(+), 6 deletions(-)
+
+commit 432758a7ac3c1a857e67069f157efbf4ebf5521b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 01:05:59 2018 +0330
+
+    [COLR] Revert previous sanitization on the table
+
+    That sanitization wasn't right, firstLayerIndex is an index from
+    beginning of the Layer Records
+    not the table itself.
+
+ src/hb-ot-colr-table.hh | 23 ++++++-----------------
+ 1 file changed, 6 insertions(+), 17 deletions(-)
+
+commit 71b4598ea37b316571bae22ced2f1b38185c9f44
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 2 11:04:09 2018 +0330
+
+    [aat/kerx] Improve format 6 subtable
+
+ src/hb-aat-layout-kerx-table.hh | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit b73a5a1c240478616827529c94f0133018f9f790
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 2 00:07:26 2018 +0330
+
+    [aat/kerx] Make parsing of the table actually work (#850)
+
+ src/hb-aat-layout-kerx-table.hh | 298
+ +++++++++++++++++-----------------------
+ 1 file changed, 124 insertions(+), 174 deletions(-)
+
+commit a570edcde2f89e59b5ccd4867a8c0eed084bf35d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 2 00:06:03 2018 +0330
+
+    [COLR] Sanitize BaseGlyphRecord (#854)
+
+ src/hb-ot-colr-table.hh | 27 ++++++++++++++++++---------
+ 1 file changed, 18 insertions(+), 9 deletions(-)
+
+commit 7e958646a4a825bfe3aac56ddb96100d68c5592c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 1 10:27:18 2018 +0330
+
+    [CPAL] Fix version checking logic on sanitizer (#851)
+
+ src/hb-ot-cpal-table.hh | 14 ++++++--------
+ 1 file changed, 6 insertions(+), 8 deletions(-)
+
+commit bcf578fefe6d7af0a962329ceb9989ce61ec467d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 28 16:31:46 2018 -0800
+
+    [test] Add test suite for Brahmi Number Joiners
+
+    https://github.com/harfbuzz/harfbuzz/pull/660
+
+ .../fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf   | Bin 0 ->
+ 2768 bytes
+ test/shaping/data/in-house/tests/use-syllable.tests      |   1 +
+ test/shaping/record-test.sh                              |   2 +-
+ 3 files changed, 2 insertions(+), 1 deletion(-)
+
+commit b4ba71ea7ccce70e24138373774741c7f03dd24e
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 28 15:44:00 2018 -0800
+
+    [subset] In subset integration test pass output through ots-sanitize
+    if present.
+
+ test/subset/run-tests.py | 25 +++++++++++++++++++++++--
+ 1 file changed, 23 insertions(+), 2 deletions(-)
+
+commit 588a4e0f9b2d71362503a274de7200f3eb4367f7
+Merge: 55a4dfa3 b3f1a045
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed Feb 28 13:52:29 2018 -0800
+
+    Merge pull request #845 from googlefonts/drophints
+
+    [subset] drop hints from composites
+
+commit b3f1a045a8b86747afce6bc154f2a166ea678efb
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 28 11:41:24 2018 -0800
+
+    [subset] kick the build
+
+ src/hb-subset-glyf.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 20d57399235b410d2bdc98103c8bb3dfd1c34176
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 28 11:15:08 2018 -0800
+
+    [subset] extract a method to flip off composite instruction flag
+
+ src/hb-subset-glyf.cc | 24 +++++++++++++++---------
+ 1 file changed, 15 insertions(+), 9 deletions(-)
+
+commit 55a4dfa374bae1db846c3b848b7e59fb0014b627
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 28 15:43:23 2018 +0330
+
+    Use old project location of coverity
+
+    https://github.com/harfbuzz/harfbuzz/commit/8089711a61687d565f207c56d3d2b658f514d7ab#commitcomment-27835452
+
+ .travis.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3821978bcd92cbdb607111452796e051c456f391
+Merge: 77227462 f671f7f0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 28 13:30:17 2018 +0330
+
+    Merge pull request #847 from ebraminio/colr
+
+    [colr] Implement
+
+commit f671f7f0a8caa7b5763e00146e1ec4b9a7258227
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 28 13:19:40 2018 +0330
+
+    [colr] Implement
+
+ src/Makefile.sources        |  1 +
+ src/hb-ot-color.cc          |  9 +++++
+ src/hb-ot-color.h           |  9 -----
+ src/hb-ot-colr-table.hh     | 98
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-cpal-table.hh     |  6 +--
+ src/hb-ot-layout-private.hh |  6 ++-
+ src/hb-ot-layout.cc         | 11 +++--
+ 7 files changed, 122 insertions(+), 18 deletions(-)
+
+commit 772274625e9f17d726f2a1da8192ec3ec24793a3
+Merge: 0eec3315 5b9c2340
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 28 12:05:49 2018 +0330
+
+    Merge pull request #841 from ebraminio/color
+
+    Support CPAL table
+
+commit 0eec33154a418fba97a08be7169b59e748b7e785
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 28 11:53:39 2018 +0330
+
+    [cmake] cleanup (#846)
+
+ CMakeLists.txt          | 70
+ ++++++++++++++++++++-----------------------------
+ test/api/CMakeLists.txt |  2 +-
+ 2 files changed, 30 insertions(+), 42 deletions(-)
+
+commit 5b9c234043d0483e53e9da5fe4afd7743190b538
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 27 22:56:17 2018 +0330
+
+    [CPAL] Refactor and address the reviews
+
+ NEWS                                               |   3 +-
+ src/Makefile.am                                    |   1 -
+ src/hb-ot-color.cc                                 |  70 +++----------
+ src/hb-ot-color.h                                  |  31 +++---
+ src/hb-ot-cpal-table.hh                            | 116
+ +++++++++++++++------
+ src/hb-ot-layout-private.hh                        |   3 +-
+ src/hb-ot-layout.cc                                |   5 +-
+ test/api/hb-test.h                                 |   2 +
+ test/api/test-ot-color.c                           |  39 +++----
+ .../319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf   | Bin
+ .../e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf   | Bin
+ 11 files changed, 141 insertions(+), 129 deletions(-)
+
+commit 6836a821428b714b9f2e95d5c4ebbd73867d9a53
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Feb 27 20:51:12 2018 -0800
+
+    [subset] remove WE_HAVE_INSTRUCTIONS from composites when dropping
+    hints
+
+ src/hb-subset-glyf.cc | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit ffcb5cbf71b312cdd4606a3285e10e201ff5bccd
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Feb 27 20:17:04 2018 -0800
+
+    [subset] update the test file for composite, fix an offset calculation
+
+ src/hb-ot-glyf-table.hh                                  |   2 +-
+ test/api/fonts/Roboto-Regular.components.1fc.nohints.ttf | Bin 0 ->
+ 932 bytes
+ test/api/test-subset-glyf.c                              |   5 ++---
+ 3 files changed, 3 insertions(+), 4 deletions(-)
+
+commit c8b230e4377bc8e80d37835a229511ce0e30cc47
+Merge: b3790a65 904dd7be
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Feb 27 17:25:32 2018 -0800
+
+    Merge branch 'expand-tests' of github.com:googlefonts/harfbuzz
+    into drophints
+
+commit 904dd7beea756fd7429fad36f5c37321aedb4e81
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 14:33:36 2018 -0800
+
+    [subset] Add drop hinting profile to full-font.tests
+
+ .../Roboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf     | Bin 0 ->
+ 2152 bytes
+ .../full-font/Roboto-Regular.drop-hints.61,62,63.ttf     | Bin 0 ->
+ 1968 bytes
+ test/subset/data/tests/full-font.tests                   |   1 +
+ 3 files changed, 1 insertion(+)
+
+commit 70a1049b3f8dc241fcb9b524bd010f0c1606f6ad
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 14:28:50 2018 -0800
+
+    [subset] Add a drop hints profile to basics.tests
+
+ .../basics/Roboto-Regular.abc.drop-hints.61,62,63.ttf     | Bin 0 ->
+ 876 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61,63.ttf        | Bin 0 ->
+ 792 bytes
+ .../expected/basics/Roboto-Regular.abc.drop-hints.61.ttf  | Bin 0 ->
+ 684 bytes
+ .../expected/basics/Roboto-Regular.abc.drop-hints.62.ttf  | Bin 0 ->
+ 652 bytes
+ .../expected/basics/Roboto-Regular.abc.drop-hints.63.ttf  | Bin 0 ->
+ 656 bytes
+ test/subset/data/profiles/drop-hints.txt                  |   1 +
+ test/subset/data/tests/basics.tests                       |   1 +
+ 7 files changed, 2 insertions(+)
+
+commit 5241d7f4b999d5457de564bd950b60d70f9d0e19
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 13:15:40 2018 -0800
+
+    [subset] apply subset profiles (flags) to the subset integration
+    tests.
+
+ test/subset/generate-expected-outputs.py | 27 ++++++++++++++-------------
+ test/subset/run-tests.py                 |  3 ++-
+ test/subset/subset_test_suite.py         | 11 ++++++++---
+ 3 files changed, 24 insertions(+), 17 deletions(-)
+
+commit a4aca190a93f94c25c906ec0269183d8b2d0b5e8
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 11:36:16 2018 -0800
+
+    [subset] add expected/full-font to dist files.
+
+ test/subset/data/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d31ace32740b1777ebb023ffdb10cd0cfec3997e
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 18:51:56 2018 -0800
+
+    [subset] Add subset integration tests using the full roboto font.
+
+ test/subset/data/Makefile.sources                      |   1 +
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf      | Bin 0 ->
+ 3700 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf      | Bin 0 ->
+ 3320 bytes
+ test/subset/data/fonts/Roboto-Regular.ttf              | Bin 0 ->
+ 171676 bytes
+ test/subset/data/tests/full-font.tests                 |  10 ++++++++++
+ test/subset/generate-expected-outputs.py               |  12 ++++++++----
+ 6 files changed, 19 insertions(+), 4 deletions(-)
+
+commit 33f4381314c5248b8b112e344af7548806f93a82
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 18:39:09 2018 -0800
+
+    [subset] Add some more variations of the basic test.
+
+ .../basics/Roboto-Regular.abc.default.61,62,63.ttf       | Bin 0 ->
+ 2120 bytes
+ .../expected/basics/Roboto-Regular.abc.default.61,63.ttf | Bin 0 ->
+ 1932 bytes
+ .../expected/basics/Roboto-Regular.abc.default.61.ttf    | Bin 0 ->
+ 1744 bytes
+ .../expected/basics/Roboto-Regular.abc.default.63.ttf    | Bin 0 ->
+ 1668 bytes
+ test/subset/data/tests/basics.tests                      |   4 ++++
+ 5 files changed, 4 insertions(+)
+
+commit b3790a65a18e8402b2b09dfc24aaea40a51de569
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Feb 27 17:23:30 2018 -0800
+
+    [subset] add a (failing for now) test for composite glyf hint dropping
+
+ src/hb-ot-glyf-table.hh     |  8 ++++----
+ test/api/test-subset-glyf.c | 27 +++++++++++++++++++++++++--
+ 2 files changed, 29 insertions(+), 6 deletions(-)
+
+commit 4c6023f861a4b87782c17ac626ffee7e93f15fc8
+Merge: d7633d0a 921b65cb
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 17:06:27 2018 -0700
+
+    Merge pull request #842 from googlefonts/maxp
+
+    [subset] when dropping hints, clear hint related fields in maxp.
+
+commit 921b65cbc29f0c2c9c13e9fb272dafe4c8a14591
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 14:37:18 2018 -0800
+
+    [subset] minor fixes in hb-ot-maxp-table.hh
+
+ src/hb-ot-maxp-table.hh | 15 +++++++--------
+ 1 file changed, 7 insertions(+), 8 deletions(-)
+
+commit b26db48bfff804e139331817a86ecc811547afcd
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 14:14:05 2018 -0800
+
+    [subset] whitespace for hb-ot-maxp-table.hh
+
+ src/hb-ot-maxp-table.hh | 30 +++++++++++++++---------------
+ 1 file changed, 15 insertions(+), 15 deletions(-)
+
+commit a76344da796670f33b2fa48a9b1676545dac93c2
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 14:11:36 2018 -0800
+
+    [subset] Add maxpV1Tail instead of defining a struct inside maxp
+    for v1 data.
+
+ src/hb-ot-maxp-table.hh | 81
+ ++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 49 insertions(+), 32 deletions(-)
+
+commit f14d1b64c2d148ffdec95c17adbee3f185d5d436
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 13:49:00 2018 -0800
+
+    [subset] when dropping hints, clear hint related fields in maxp.
+
+ src/hb-ot-maxp-table.hh     | 43
+ ++++++++++++++++++++++++++++++++++++++++---
+ test/api/test-subset-glyf.c | 30 +++++++++++++++++++++++-------
+ 2 files changed, 63 insertions(+), 10 deletions(-)
+
+commit d7633d0a4091c025638ba3fc8fb0d8e9a0e9ff8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 27 12:50:57 2018 -0800
+
+    [BASE] More
+
+ src/hb-ot-layout-base-table.hh | 153
+ ++++-------------------------------------
+ 1 file changed, 12 insertions(+), 141 deletions(-)
+
+commit 7a70c20fec6ece9e729dc2634e2896a8d8eb9962
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 27 12:45:26 2018 -0800
+
+    [BASE] Clean up first 29%
+
+ src/hb-ot-layout-base-table.hh | 262
+ +++++++++++++++++++----------------------
+ src/hb-ot-layout-gsub-table.hh |   2 +-
+ 2 files changed, 125 insertions(+), 139 deletions(-)
+
+commit 101850f9e6b9e0932fe1dd4169f88d6764c669c1
+Merge: 5967eaba f110c0c8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 27 20:15:54 2018 +0330
+
+    Merge with master
+
+commit f110c0c8866c853c0d5a930564a2b69231a33322
+Merge: 4a1d51ef 0ad8c663
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 27 11:41:12 2018 +0330
+
+    Merge pull request #838 from harfbuzz/BASE
+
+    BASE table
+
+commit 0ad8c663e0b4602e2a413e77a8158bf8a46755d5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 26 12:45:08 2018 +0330
+
+    Remove public API of the branch
+
+ src/hb-ot-base.h               |  4 ++--
+ src/hb-ot-layout-base-table.hh | 20 +++++++++---------
+ src/hb-ot-layout.cc            | 48
+ ++++++++++++++++++++----------------------
+ 3 files changed, 35 insertions(+), 37 deletions(-)
+
+commit 4a1d51ef15a423706406f784a146078073147885
+Merge: d0caf7e5 903771b6
+Author: rsheeter <rsheeter@google.com>
+Date:   Mon Feb 26 20:23:41 2018 -0800
+
+    Merge pull request #818 from googlefonts/drophints
+
+    [subset] Drop hints
+
+commit 903771b6c7689b9eee9a11bac128c42f39833b2e
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 26 19:50:06 2018 -0800
+
+    [subset] clearer name for trim() and better comment about composite
+    handling, per review feedback
+
+ src/hb-ot-glyf-table.hh |  8 +++++---
+ src/hb-subset-glyf.cc   | 17 ++++++++---------
+ 2 files changed, 13 insertions(+), 12 deletions(-)
+
+commit d0caf7e5e3294c25230ed0e5580c647fa0f1a2c8
+Merge: 6c844ae8 44dc36dd
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 19:24:18 2018 -0700
+
+    Merge pull request #840 from googlefonts/os2
+
+    [subset] During os2 subsetting update ulUnicodeRange[]c
+
+commit 44dc36dd82fc948a15e2ad0d605eb4a466b3553d
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 17:56:23 2018 -0800
+
+    [subset] update to comment in hb-ot-os2-unicode-ranges.hh
+
+ src/hb-ot-os2-unicode-ranges.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ad3f2f77dafdee524e836e732077ee9670602369
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 17:51:27 2018 -0800
+
+    [subset] small cleanups in hb-ot-os2-table.
+
+ src/hb-ot-os2-table.hh          | 5 +++--
+ src/hb-ot-os2-unicode-ranges.hh | 2 +-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit f1c8fc3487d5c5efb8ee1804acb07e6e282d3bc5
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 17:48:51 2018 -0800
+
+    [subset] small updates to gen-unicode-ranges.py
+
+ src/gen-unicode-ranges.py       | 6 ++++--
+ src/hb-ot-os2-unicode-ranges.hh | 3 ++-
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+commit 0c0fe2ff8209228f2ddfce464b7b6f1b1ee1654a
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 17:47:10 2018 -0800
+
+    [subset] Move util/generated-unicode-ranges.py to
+    src/gen-unicode-ranges.py
+
+ util/generate-unicode-ranges.py => src/gen-unicode-ranges.py | 0
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit f630ae5161bfc8420f9ae0127fd8c7f447874fdd
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 17:46:17 2018 -0800
+
+    [subset] unsigned int -> hb_codepoint_t.
+
+ src/hb-ot-os2-unicode-ranges.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6368ce4c927b1457cf19945d5957e91d4621dc8b
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 17:44:39 2018 -0800
+
+    [subset] const in _compare_range.
+
+ src/hb-ot-os2-unicode-ranges.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 0be9fea0a96701b159a9db190e55b1c3efc38a28
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 16:15:09 2018 -0800
+
+    [subset] Add comment to os2UnicodeRangesSorted.
+
+ src/hb-ot-os2-unicode-ranges.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit e20ab71d12b032371b830b76462e5e979d963b58
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 16:13:10 2018 -0800
+
+    [subset] Fix incorrect index.
+
+ src/hb-ot-os2-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 074b5a29a166d1812abc7229a71af4a3bb311536
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 16:11:24 2018 -0800
+
+    [subset] Add special case handling of bit 57 in os2 ulUnicodeRange.
+
+ src/hb-ot-os2-table.hh     | 7 +++++++
+ src/test-unicode-ranges.cc | 3 ---
+ 2 files changed, 7 insertions(+), 3 deletions(-)
+
+commit ddc4f2b9fc5566e70558a57133289f84d467cc98
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 15:59:32 2018 -0800
+
+    [subset] Add python util that was used to generated
+    hb-ot-os2-unicode-ranges.hh
+
+ util/generate-unicode-ranges.py | 50
+ +++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 50 insertions(+)
+
+commit f757757eda5f00a89a156e3427bdf8c4313611ef
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 15:56:36 2018 -0800
+
+    [subset] Add cmake build def for test-unicode-ranges.
+
+ CMakeLists.txt  | 2 +-
+ src/Makefile.am | 1 -
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit f82f2a3e50805503d93aa1aa1ccb27da4967a14a
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 15:52:01 2018 -0800
+
+    [subset] Rename hb-os2-unicode-ranges.cc to test-unicode-ranges.cc.
+
+ src/Makefile.am                                             | 2 +-
+ src/{hb-ot-os2-unicode-ranges.cc => test-unicode-ranges.cc} | 0
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 4014555ca083dea3e4f42120aeaf52a2186b8a09
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 15:50:13 2018 -0800
+
+    [subset] set ulUnicodeRange[] in os2.
+
+ src/Makefile.sources            |   1 -
+ src/hb-ot-os2-table.hh          |  23 ++++-
+ src/hb-ot-os2-unicode-ranges.cc | 221
+ ++--------------------------------------
+ src/hb-ot-os2-unicode-ranges.hh | 210
+ +++++++++++++++++++++++++++++++++++++-
+ 4 files changed, 236 insertions(+), 219 deletions(-)
+
+commit a570142d0c6d819feeeeb9e209fc90a33c1c2b48
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 15:20:23 2018 -0800
+
+    [subset] Move hb-ot-os2-unicode-ranges into a cc file with a helper
+    methods and tests.
+
+ src/Makefile.am                 |   9 +-
+ src/Makefile.sources            |   2 +
+ src/hb-ot-os2-unicode-ranges.cc | 279
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-os2-unicode-ranges.hh | 189 +--------------------------
+ 4 files changed, 292 insertions(+), 187 deletions(-)
+
+commit 8e81799b32f3dfaca000fa5d42943ceed9af8d17
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 18:35:41 2018 -0800
+
+    [subset] Add hb-ot-os2-unicode-ranges.hh, a map of os2 unicode ranges.
+
+ src/hb-ot-os2-unicode-ranges.hh | 220
+ ++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 220 insertions(+)
+
+commit 6c844ae8e89f52f5f40eace66bb987544fc316e3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 26 23:04:27 2018 +0330
+
+    [dev-run] show images using iTerm2 images feature
+
+ src/dev-run.sh | 32 ++++++++++++++++++++++++++++----
+ 1 file changed, 28 insertions(+), 4 deletions(-)
+
+commit 28c4245e9f76c6c53a4589e7745a60ed0e97414a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 26 01:10:42 2018 -0800
+
+    [aat/ankr] Define Anchor struct
+
+ src/hb-aat-layout-ankr-table.hh | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+commit e347fb908b188f71df13215c8939b0f3a12c716f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 26 01:08:00 2018 -0800
+
+    Minor
+
+ src/hb-ot-layout-gdef-table.hh |  4 ++--
+ src/hb-ot-layout-gpos-table.hh | 12 ++++++------
+ 2 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 05fbd14e715ed5d0f0f86388b1538ad8e8c7c506
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 26 01:04:16 2018 -0800
+
+    [aat/ankr] Minor
+
+    DEFINE_SIZE_MIN is to be used only in rare cases. For fixed-size
+    structs
+    we want DEFINE_SIZE_STATIC.
+
+ src/hb-aat-layout-ankr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f90cd9b1f5ade8ad5e3b7caf0272936ad7a0f419
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 26 01:03:23 2018 -0800
+
+    [aat/ankr] Hook up Lookup table
+
+ src/hb-aat-layout-ankr-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c36598450e9698168851c0ae7d0b4c9e562c4924
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 26 00:57:07 2018 -0800
+
+    [aat/ankr] Simplify
+
+ src/hb-aat-layout-ankr-table.hh | 36 ++++++++----------------------------
+ 1 file changed, 8 insertions(+), 28 deletions(-)
+
+commit fa3a69e2334ec4122d672670614a8e5a95611d75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 26 00:32:11 2018 -0800
+
+    [aat/trak] Simplify sanitize()
+
+ src/hb-aat-layout-trak-table.hh | 67
+ ++++++++++-------------------------------
+ 1 file changed, 16 insertions(+), 51 deletions(-)
+
+commit f0bc6c0992c4302ae1a20f155ad256bfa331087c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 26 00:18:17 2018 -0800
+
+    [aat/trak] Clean up
+
+    We always just used "unsigned int" for counter values. There's
+    no use for uint16_t outside of a struct.
+
+    Also, no need for explict casting where implicit does.
+
+ src/hb-aat-layout-trak-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit bb82f01383db7cf05040fbd5881e17e263ef6369
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 25 12:30:33 2018 +0330
+
+    [aat] trak sanitization
+
+ src/dev-run.sh                  |  4 +-
+ src/hb-aat-layout-trak-table.hh | 95
+ ++++++++++++++++++++++++++++++++---------
+ src/hb-aat-layout.cc            |  2 +-
+ util/options.hh                 |  2 +-
+ 4 files changed, 78 insertions(+), 25 deletions(-)
+
+commit becb1d9eea15c07f9ea4e229be56f9aca0f768af
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 26 11:29:48 2018 +0330
+
+    [aat] minor
+
+    Ops, this was done for testing
+
+ src/hb-aat-layout-ankr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit df1c7d5b60520d2b3c756b700d5ac41668fc0983
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 25 19:06:25 2018 -0800
+
+    Minor
+
+ src/hb-open-type-private.hh | 5 +++--
+ src/hb-subset.cc            | 2 +-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 6dd46fa598cacdd046ba4548bc6ddf7f37c46dee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 25 18:54:52 2018 -0800
+
+    [aat/trak] Minor
+
+    Maybe we should make DEFINE_* make structs uncopyable.
+
+ src/hb-aat-layout-trak-table.hh | 56
+ +++++++++++++++++++++++------------------
+ 1 file changed, 32 insertions(+), 24 deletions(-)
+
+commit ae14dd0fb0a176f6f0143690907b51626999d248
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 26 00:31:09 2018 +0330
+
+    [aat] Implement ankr
+
+ src/Makefile.sources            |  3 +-
+ src/hb-aat-layout-ankr-table.hh | 86
+ +++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout-kerx-table.hh |  2 +-
+ src/hb-aat-layout.cc            | 37 +++++++++++++-----
+ src/hb-ot-layout-private.hh     |  6 ++-
+ src/hb-ot-layout.cc             |  6 ++-
+ 6 files changed, 124 insertions(+), 16 deletions(-)
+
+commit 551fa2d200a06d00d054f2c8e7aad1cb4d25249b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 25 16:32:17 2018 -0800
+
+    [BASE] Minor
+
+ src/Makefile.sources           |   1 -
+ src/hb-ot-base.cc              |  58 -----------------------
+ src/hb-ot-layout-base-table.hh | 103
+ ++++++++++++++++++++++++++++-------------
+ src/hb-ot-layout.cc            |  34 ++++++++++++++
+ src/hb-ot-layout.h             |   1 +
+ 5 files changed, 105 insertions(+), 92 deletions(-)
+
+commit 05699fd996ed9c0e5dde8918388ac188e58df1a7
+Merge: 83af6c23 3ebcd5a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 24 12:01:54 2018 -0800
+
+    Merge remote-tracking branch 'eroux/add-base'
+
+commit a8d3c2c030d2c21c70e0b8bd43f7d05ff4818b75
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 24 16:42:12 2018 +0330
+
+    [ci] Add clang O3/O0 testers (#834)
+
+ .circleci/config.yml | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+commit c73255f3eb2f060ec72d18790b374f6b6e4032aa
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Feb 24 00:44:07 2018 +0200
+
+    Workaround for old automake on Travis Linux images
+
+    https://github.com/harfbuzz/harfbuzz/pull/821#issuecomment-368116538
+
+ .ci/fail.sh | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit cd28eb9f5dc237325c64380d9d87e673b8e94985
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 24 14:17:54 2018 +0330
+
+    Add -Werror=unused-function check to Travis (#832)
+
+ .travis.yml          |  4 ++--
+ src/hb-aat-layout.cc | 24 ++++++++++++------------
+ test/api/test-set.c  | 19 ++++++++++---------
+ 3 files changed, 24 insertions(+), 23 deletions(-)
+
+commit 1ab16f4556ef3e54a40b63cf4570c0ae986894e7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 24 12:49:42 2018 +0330
+
+    [aat] Implement trak logic (#816)
+
+ src/hb-aat-layout-kerx-table.hh |  7 ++++
+ src/hb-aat-layout-private.hh    |  3 ++
+ src/hb-aat-layout-trak-table.hh | 78
+ +++++++++++++++++++++++++++++++++++++++--
+ src/hb-aat-layout.cc            | 46 ++++++++++++++++++++++++
+ src/hb-open-type-private.hh     |  4 +--
+ src/hb-ot-layout-private.hh     | 22 ++++++++++++
+ src/hb-ot-layout.cc             |  4 +++
+ src/hb-ot-shape.cc              |  2 ++
+ 8 files changed, 161 insertions(+), 5 deletions(-)
+
+commit b91e8da36e164168cd532fd6e6950c5d743a14dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 23 22:51:17 2018 -0800
+
+    Include hb-version.h in git (#825)
+
+ CMakeLists.txt       | 36 ++++++++++++++--------------
+ src/Makefile.am      |  8 +++----
+ src/Makefile.sources |  3 ---
+ src/hb-version.h     | 66
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 87 insertions(+), 26 deletions(-)
+
+commit 5267520e078ed413df78f3a6781fd5370b6da63a
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 23 18:36:22 2018 -0800
+
+    [subset] update hdmx test to create input explicitly
+
+ test/api/test-subset-hdmx.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2e3ee489f8374227fa94a8d8684e839e643888ea
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 23 18:18:54 2018 -0800
+
+    [subset] format tweak, doc string
+
+ src/hb-subset-input.cc | 12 +++++++++---
+ src/hb-subset.h        |  2 +-
+ 2 files changed, 10 insertions(+), 4 deletions(-)
+
+commit d78393b5547135b8db0356b0ec14d5ed0d334768
+Merge: 1454d82a 83af6c23
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 23 17:53:26 2018 -0800
+
+    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into
+    drophints
+
+commit 1454d82a9d3d9a47901b3d92ff7f2c05c596c0d5
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 23 17:49:23 2018 -0800
+
+    [subset] keep glyph trim separate of more general get_offset
+
+ src/hb-ot-glyf-table.hh | 12 ++++--------
+ src/hb-subset-glyf.cc   |  6 ++++--
+ 2 files changed, 8 insertions(+), 10 deletions(-)
+
+commit 0ac8c0c1e6a6c076ce33b16baa173ff8763ac04e
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 23 17:43:00 2018 -0800
+
+    [subset] zero glyf and loca memory before writing so pads are
+    clean. Test just the part of maxp we care about
+
+ src/hb-ot-glyf-table.hh     |  6 +++---
+ src/hb-subset-glyf.cc       |  4 ++--
+ test/api/test-subset-glyf.c | 19 ++++++++++++++++---
+ 3 files changed, 21 insertions(+), 8 deletions(-)
+
+commit 83af6c237f2bfd66af76a8647a62b3d1ab996744
+Merge: 7e5e1feb dc5c7927
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 18:33:25 2018 -0700
+
+    Merge pull request #829 from googlefonts/test-checksum
+
+    [subset] Caclculate head table checksum adjustment
+
+commit dc5c7927e75ea09461e46fe6e56897091b4b4f00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 23 16:42:06 2018 -0800
+
+    [subset] Caclculate head table checksum adjustment
+
+    Test still fails, because we do not serialize tables in the same
+    order that fonttools subsetter does.
+
+ src/hb-open-file-private.hh | 51
+ ++++++++++++++++++++++++++++++++++-----------
+ src/hb-ot-head-table.hh     |  2 ++
+ src/hb-subset.cc            |  2 ++
+ 3 files changed, 43 insertions(+), 12 deletions(-)
+
+commit 7e5e1feb666d6a861b5cd64bf29a16e3854fb812
+Merge: ec2538c8 99967e21
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 17:59:08 2018 -0700
+
+    Merge pull request #828 from googlefonts/mem-fixes
+
+    [subset] Fix several memory leaks in subsetting.
+
+commit ec2538c8803be254b6e09ca0ea724b07c35126da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 23 15:51:26 2018 -0800
+
+    [subset] Fix checksum calc out-of-bounds access
+
+ src/hb-open-file-private.hh | 18 ++++++++++--------
+ src/hb-open-type-private.hh |  3 ++-
+ 2 files changed, 12 insertions(+), 9 deletions(-)
+
+commit 99967e21c6e3f6882d6eadf5c22f4120684b1fc5
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 15:45:45 2018 -0800
+
+    [subset] Fix memory leak in hb-subset-glyf.
+
+ src/hb-subset-glyf.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit e61f360dc828bfd46477b7ddff56874da9f03538
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 15:44:21 2018 -0800
+
+    [subset] Fix memory leak in hb-subset-plan.
+
+ src/hb-subset-plan.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 66b0a390793ab06692dd49e67baef52a6a7d82aa
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 15:41:52 2018 -0800
+
+    [subset] Fix memory leak in hb-subset.
+
+ src/hb-subset.cc | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+commit 0fb8a5ce192025ffd83ae714db932e4b86594ae1
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 15:37:43 2018 -0800
+
+    [subset] Fix memory leak in cmap subsetting.
+
+ src/hb-ot-cmap-table.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 4665aaa19304bdf0362bdfcebcae65feb19a8964
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 15:36:14 2018 -0800
+
+    [subset] Fix memory leak in hmtx subsetting.
+
+ src/hb-ot-hmtx-table.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 5a36b55fba03cd07c9b101f0222b8d189bcd3bbf
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 15:30:14 2018 -0800
+
+    [subset] Fix memory leak in subset face destroy.
+
+ src/hb-subset.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit d38f37b2e37942a3fd13cd753c8b8587a06c0f3a
+Author: Ben Boeckel <mathstuf@users.noreply.github.com>
+Date:   Fri Feb 23 16:55:53 2018 -0500
+
+    autoconf: provide a harfbuzz-config for use from CMake (#822)
+
+ configure.ac                 |  2 ++
+ src/Makefile.am              |  4 ++-
+ src/harfbuzz-config.cmake.in | 82
+ ++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 87 insertions(+), 1 deletion(-)
+
+commit e0939d811f1fdeda9c5763e7e53887b3d3cb21eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 23 13:19:34 2018 -0800
+
+    Clean up check-defs and check-symbols (#821)
+
+    Also, call c++filt on their results.
+
+    Also build and fix and check harfbuzz-gobject.def
+
+    Also changes harfbuzz-gobject to distribute generated enum sources.
+
+ CMakeLists.txt              |  3 +--
+ src/Makefile.am             | 33 ++++++++++++++++------------
+ src/Makefile.sources        |  9 +++++---
+ src/check-defs.sh           | 52
+ ---------------------------------------------
+ src/check-symbols.sh        | 30 ++++++++++++++++++++------
+ src/hb-gobject-enums.h.tmpl |  3 ++-
+ src/hb-gobject-structs.h    | 45 ++++++++++++++++++++++++++-------------
+ 7 files changed, 81 insertions(+), 94 deletions(-)
+
+commit 9bd6d25254d9bfc612004982dba286a3751d1d29
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 23 13:05:58 2018 -0800
+
+    [subset] clone trim logic from fonttools glyf handling
+
+ src/hb-ot-glyf-table.hh                      |  92
+ ++++++++++++++++++++++++++-
+ src/hb-subset-glyf.cc                        |  26 ++++----
+ src/hb-subset-plan.cc                        |   3 +
+ src/hb-subset.cc                             |  13 ++--
+ test/api/fonts/Roboto-Regular.ac.nohints.ttf | Bin 1128 -> 848 bytes
+ test/api/hb-subset-test.h                    |   1 +
+ test/api/test-subset-glyf.c                  |   6 +-
+ 7 files changed, 117 insertions(+), 24 deletions(-)
+
+commit b1ec82105189053d648a798cf5b3ab2887046298
+Merge: e15e41ef c2e4713b
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 12:32:18 2018 -0700
+
+    Merge pull request #823 from googlefonts/hdmx
+
+    [subset] Add hdmx subsetting.
+
+commit e15e41ef12e146333e355defef8db210378b5be0
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 18:41:50 2018 -0800
+
+    [subset] Remove commented code from run-tests.py.
+
+ test/subset/run-tests.py | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 2b844803433bd1557a7fd0c93a91c66ef5319b21
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 18:38:44 2018 -0800
+
+    [subset] Update expected files for subsetting integration test to
+    not include cmap 4.
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1740 ->
+ 1692 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit a88504c601ac95601730bd602861c13e5ac4fdd8
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 14:28:18 2018 -0800
+
+    [subset] Fix checksum clearning in subset test diff. Add an updated
+    expected file (has cmap4 restored).
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1692 ->
+ 1740 bytes
+ test/subset/run-tests.py                              |   7 +++++--
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 537698b60131bd3d7999919a04596c41dda6b2e4
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 14:07:52 2018 -0800
+
+    [subset] Don't compare actual to itself in Fix
+    test/subset/run-tests. Print a diff on failure.
+
+ test/subset/run-tests.py | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit c2e4713b5b561675b0f7b358ccf83d64ef0b6c41
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 23 10:45:03 2018 -0800
+
+    [hdmx] Fix sanitize()
+
+ src/hb-ot-hdmx-table.hh | 23 +++++++----------------
+ 1 file changed, 7 insertions(+), 16 deletions(-)
+
+commit 84d4bb91ceca22484abb597c19eb18311e2514f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 23 10:38:35 2018 -0800
+
+    [hdmx] Minor
+
+ src/hb-ot-hdmx-table.hh | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+commit cf7a6e520e9601da9d27bc8f6bbe5d2eff23998d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 23 10:34:26 2018 -0800
+
+    [hdmx] Move DeviceRecord to toplevel again
+
+    More readable.
+
+ src/hb-ot-hdmx-table.hh | 112
+ ++++++++++++++++++++++++------------------------
+ 1 file changed, 57 insertions(+), 55 deletions(-)
+
+commit 96d7805a9235443972c6b6c5cd9502283c8836e9
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 16:48:28 2018 -0800
+
+    [subset] More complete sanitization implementation for hdmx.
+
+ src/hb-ot-hdmx-table.hh | 18 ++++++++++++++----
+ 1 file changed, 14 insertions(+), 4 deletions(-)
+
+commit c02532a3d2325c8fb9332f63f687cbaec77b2239
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 16:40:50 2018 -0800
+
+    [subset] Formatting and comments in hdmx.
+
+ src/hb-ot-hdmx-table.hh | 31 +++++++++++++++++++------------
+ 1 file changed, 19 insertions(+), 12 deletions(-)
+
+commit 6b372f439b257808b048d02ebf5a867dabcd1231
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 12:00:00 2018 -0800
+
+    [subset] In hb-ot-hdmx-table, s/glyf/hdmx.
+
+ src/hb-ot-hdmx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ec302ad5bda6bea870f6d33f9698a1782472a213
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 11:57:35 2018 -0800
+
+    [subset] Fail subset if a table fails to sanitize.
+
+ src/hb-subset.cc | 19 +++++++++++--------
+ 1 file changed, 11 insertions(+), 8 deletions(-)
+
+commit 15fc45bfedef433025145289fe916739907b573b
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 17:59:57 2018 -0800
+
+    [subset] Add a unit test for hdmx subsetting.
+
+ test/api/Makefile.am        |  2 ++
+ test/api/test-subset-hdmx.c | 81
+ +++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 83 insertions(+)
+
+commit aa4aa2353c52f86fd56446de6b7ff86a9e990b9c
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 17:43:32 2018 -0800
+
+    [subset] Enable hdmx subsetting.
+
+ src/hb-subset.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit bd18b6adf8697c1ce3f4e3831b9f2a99d930e97d
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 17:42:58 2018 -0800
+
+    [subset] Move DeviceRecord inside of hdmx.
+
+ src/hb-ot-hdmx-table.hh | 98
+ +++++++++++++++++++++++++------------------------
+ 1 file changed, 50 insertions(+), 48 deletions(-)
+
+commit 6704cded65985b2de262bdd3bb0887929e5a3b0b
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 16:00:10 2018 -0800
+
+    [subset] Add hdmx subsetting implementation.
+
+ src/hb-ot-hdmx-table.hh | 29 ++++++++++++++++++++++++++---
+ 1 file changed, 26 insertions(+), 3 deletions(-)
+
+commit 84b68e58862647b4ede414b2e608c47d390fd60a
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 15:43:47 2018 -0800
+
+    [subset] In hdmx serialize set the correct value of sizeDeviceRecord.
+
+ src/hb-ot-hdmx-table.hh | 29 ++++++++++++++++-------------
+ 1 file changed, 16 insertions(+), 13 deletions(-)
+
+commit dddf44279f610e77e8b9a0819fd91f48802158b6
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 15:36:09 2018 -0800
+
+    [subset] When serializing a DeviceRecord in hdmx pad to make 32
+    bit aligned.
+
+ src/hb-ot-hdmx-table.hh | 19 +++++++++++++------
+ 1 file changed, 13 insertions(+), 6 deletions(-)
+
+commit ab7a8f3b7419b604816e12cb93e77c0ba45a57af
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 15:15:22 2018 -0800
+
+    [subset] Begin implementing serialize for hdmx.
+
+ src/hb-ot-hdmx-table.hh | 79
+ +++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 77 insertions(+), 2 deletions(-)
+
+commit fe42862ab30d17483a1d0c2e2b1d859d01bbaff1
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 14:18:49 2018 -0800
+
+    [subset] Sketch out a basic hb-ot-hdmx.hh.
+
+ src/Makefile.sources    |  1 +
+ src/hb-ot-hdmx-table.hh | 77
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc        |  1 +
+ 3 files changed, 79 insertions(+)
+
+commit 4f6f7c3b22ec788f609bdffc7e0893816657b3a0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Feb 23 02:54:12 2018 +0330
+
+    [util] Implement ppem/ptem on hb-{shape,view} (#811)
+
+ util/options.cc | 33 ++++++++++++++++++++++++++++-----
+ util/options.hh |  6 ++++++
+ 2 files changed, 34 insertions(+), 5 deletions(-)
+
+commit a6bd6bcee08c9522f9269b5c63f784688abddcff
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Feb 22 16:52:56 2018 +0330
+
+    [dev-run] minor
+
+ src/dev-run.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fa13a04cf3345311a2434f0d7f6346f967491c45
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Feb 22 16:48:03 2018 +0330
+
+    [dev-run] Add gdb/lldb shortcuts
+
+ src/dev-run.sh | 40 +++++++++++++++++++++++++++++++---------
+ 1 file changed, 31 insertions(+), 9 deletions(-)
+
+commit 4f07437dfebd3dc5923f40154c6f1b7e1dce1bd4
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 21 22:23:05 2018 -0800
+
+    [subset] sketch out dropping in-glyf instructions. Sometimes yields
+    differnet size glyphs than fonttools, possibly due to padding not
+    being corrected
+
+ src/hb-ot-glyf-table.hh                      |  45 ++++++++++++++++
+ src/hb-subset-glyf.cc                        |  78
+ +++++++++++++++++++++------
+ src/hb-subset-input.cc                       |   6 +++
+ src/hb-subset.h                              |   2 +
+ test/api/fonts/Roboto-Regular.ac.nohints.ttf | Bin 0 -> 1128 bytes
+ test/api/hb-subset-test.h                    |  15 +++---
+ test/api/test-subset-cmap.c                  |   4 +-
+ test/api/test-subset-glyf.c                  |  32 +++++++++--
+ test/api/test-subset-hmtx.c                  |  10 ++--
+ test/api/test-subset-os2.c                   |   2 +-
+ 10 files changed, 160 insertions(+), 34 deletions(-)
+
+commit 2d0265242bb9a080886d6e0aa653c62e5770a15a
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 21 09:42:46 2018 -0800
+
+    [subset] keep the result of _subset
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4fb97be78d9287e489c9f67d1bfe7682235bdf38
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 21 14:38:02 2018 -0800
+
+    Add two more ragel-generated headers
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/817
+
+ src/hb-buffer-deserialize-json.hh | 643
+ ++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer-deserialize-text.hh | 571 +++++++++++++++++++++++++++++++++
+ 2 files changed, 1214 insertions(+)
+
+commit 74e0c13a4a55848e797242c02c8f067e587ea603
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 21 11:19:18 2018 -0800
+
+    [subset] drop hint tables if so flagged. Still need to dump glyf
+    instructions.
+
+ src/hb-subset-plan.cc    |  1 +
+ src/hb-subset-plan.hh    |  2 ++
+ src/hb-subset-private.hh |  2 +-
+ src/hb-subset.cc         | 11 +++++++++--
+ util/hb-subset.cc        |  2 +-
+ util/options.cc          |  2 +-
+ util/options.hh          |  4 ++--
+ 7 files changed, 17 insertions(+), 7 deletions(-)
+
+commit edee28801e4dbb5b734b4038d93fe1594e267ab1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 21 22:13:58 2018 +0330
+
+    Add .editorconfig (#810)
+
+    More information: http://editorconfig.org/
+
+ .editorconfig | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+commit 0bd100e144885ed8144cf23e7e106014858a1724
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 21 10:34:00 2018 -0800
+
+    [subset] add --hinting flag
+
+ src/hb-subset-private.hh |  1 +
+ util/hb-subset.cc        |  6 +++++-
+ util/options.cc          | 15 +++++++++++++++
+ util/options.hh          | 14 ++++++++++++++
+ 4 files changed, 35 insertions(+), 1 deletion(-)
+
+commit 7ecca8c0a83a6c71154fcc80887a4f895c0c5a23
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 21 09:42:46 2018 -0800
+
+    [subset] keep the result of _subset
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit eada749e4642ea90300c9c68c226fa76a3e35a75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 21 00:35:23 2018 -0800
+
+    Use HB_SET_VALUE_INVALID consistently
+
+ src/hb-ot-layout-common-private.hh | 6 +++---
+ src/hb-ot-shape.cc                 | 2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 2cc845f311b6dc4f0feda8b8fc5609fbd51b5923
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 20 18:13:41 2018 -0800
+
+    [subset] fix calculation of range shiftz. Should be 16 * len -
+    searchRange not 16 * (len - searchRange).
+
+ src/hb-open-type-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 8e614ade5aef102baed56f91c2fcb1f3d1788ea9
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 20 17:36:54 2018 -0800
+
+    [subset] Reverse table order for font serialization to match what
+    OTS expects.
+
+ src/hb-open-file-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a998eeee4ad7bba4a1574c9735618891b6bd0948
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 20 16:48:52 2018 -0800
+
+    [subset] sanity check glyph data writes during glyph subsetting to
+    ensure they are inbounds.
+
+ src/hb-subset-glyf.cc | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 0ab73e594275cf064e09b9df2e1df337a589745d
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 20 15:33:03 2018 -0800
+
+    [subset] Sanity check that loca writes are inbounds.
+
+ src/hb-subset-glyf.cc | 55
+ ++++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 41 insertions(+), 14 deletions(-)
+
+commit 73e20ec6e9ad86bea023fc8b6fc10287889ed048
+Merge: 6ae4013f 69e443b2
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 20 17:34:59 2018 -0700
+
+    Merge pull request #812 from googlefonts/cleanup
+
+    Clean up of glyf subsetting.
+
+commit 6ae4013f2e53d6496507a58b715298fee4eadcee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 20 15:02:25 2018 -0800
+
+    [aat] Cosmetic touch-ups to trak table
+
+ src/hb-aat-layout-trak-table.hh | 31 +++++++++++++++++--------------
+ 1 file changed, 17 insertions(+), 14 deletions(-)
+
+commit abc82b493e301e5588d689baa1434b3ce6577fcd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 20 14:34:16 2018 -0800
+
+    Add Ragel-generated files to git
+
+    I know it's bad form; I know I've said no to this multiple times...
+    But this is part of an experiment to see if we can make rolling
+    HarfBuzz
+    into Chrome much faster. That will give us a lot more testing exposure
+    that currently Chrome does.
+
+    Doing this while those files are still considered ignored by our
+    gitignore rules; will see how that flies.
+
+ autogen.sh                                 |   10 +-
+ src/Makefile.am                            |    3 +-
+ src/hb-ot-shape-complex-indic-machine.hh   | 1319
+ ++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-khmer-machine.hh   |  294 +++++++
+ src/hb-ot-shape-complex-myanmar-machine.hh |  413 +++++++++
+ src/hb-ot-shape-complex-use-machine.hh     |  502 +++++++++++
+ 6 files changed, 2535 insertions(+), 6 deletions(-)
+
+commit 69e443b254fceb29f26f6a0c0129fe3c93c19cfb
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 20 14:29:21 2018 -0800
+
+    [subset] Switch to hb_blob_copy_writable_or_fail in glyf subsetting.
+
+ src/hb-ot-glyf-table.hh | 29 +++++++++++------------------
+ src/hb-ot-maxp-table.hh |  3 +--
+ 2 files changed, 12 insertions(+), 20 deletions(-)
+
+commit e3e0ac98238b78530a625a6b7e7647dbabbe1c4d
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 20 14:07:40 2018 -0800
+
+    [subset] Move glyf subsetting code into hb-ot-glyf-table.hh
+
+ src/hb-ot-glyf-table.hh | 49
+ +++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-subset.cc        | 50
+ +------------------------------------------------
+ 2 files changed, 49 insertions(+), 50 deletions(-)
+
+commit d1f16fce963092404bf0b59e449a3215ca031b54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 20 10:32:09 2018 -0800
+
+    Don't use %zu
+
+    Some of our bots / compilers don't like it. Wasn't caught by bots
+    because this
+    is only in debug code.
+
+    https://github.com/harfbuzz/harfbuzz/pull/809/commits/825ad378e0f0e6e6bb690894a0d5d25f198be21b
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c7e834a2fc5f8fb81f5316447e4075902d58d8a3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 20 17:59:04 2018 +0330
+
+    [dev-run] minor
+
+ src/dev-run.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 975c35214f8c8f0d90a8b114e1a8c06d5ecdecfd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 20 17:49:29 2018 +0330
+
+    [dev-run] Support autotools builds
+
+ src/dev-run.sh | 46 +++++++++++++++++++++++++++++++---------------
+ 1 file changed, 31 insertions(+), 15 deletions(-)
+
+commit 25136d9b7265d8920a78f3f832f1c69da4ef1f5b
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Tue Feb 20 10:26:07 2018 +0200
+
+    Use %zu format specifier for size_t to fix cross platform build
+
+    Fixes Chromium Android builds, compare
+    https://ci.chromium.org/buildbot/tryserver.chromium.android/linux_android_rel_ng/491787
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 53cf61b0299775f94c625de1bb0a7979b3b0c379
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 20 10:53:10 2018 +0330
+
+    Change Alpine and ArchLinux bot to test O3 and O0 on gcc, #801
+
+ .circleci/config.yml | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit a64eacd8a6cb9811bcaadf20b8b8ae56306cbd75
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 19 23:27:08 2018 +0330
+
+    [aat] First dig on 'trak'
+
+ src/Makefile.sources            |   3 +-
+ src/hb-aat-layout-trak-table.hh | 100
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.cc            |   3 +-
+ src/hb-ot-layout-private.hh     |   6 ++-
+ 4 files changed, 108 insertions(+), 4 deletions(-)
+
+commit 0bff6991de308044b077ce74bd45d57d8c4afe5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 19 11:51:25 2018 -0800
+
+    Ugh. Really fix build.
+
+ src/hb-subset-private.hh  | 2 +-
+ src/hb-subset.cc          | 3 +--
+ test/api/hb-subset-test.h | 1 +
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 4fcbd22b18040cbfd7410e6a090c5f9624eb9a0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 19 11:49:25 2018 -0800
+
+    Fix build after previous commit
+
+ src/hb-subset-plan.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 0bbf90ded00dd00ee3f79c1bd16c775d7c893278
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 19 11:38:53 2018 -0800
+
+    [subset] Don't include hb-subset.h from hb.h
+
+ src/hb.h | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit fde04777d1d429fd0981002194f5c19599fda350
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 19 20:00:07 2018 +0330
+
+    Check availability of entr instead now that this works with it
+
+ src/dev-run.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b095ce59ebc5723a1b9c049eebb8f204455c9a72
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 19 11:58:20 2018 +0330
+
+    Simplify hb-fuzzer output printing and fix ArchLinux bot
+
+ test/fuzzing/run-fuzzer-tests.py | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit be51f763a752bed1c395bff19afe3291a6063d00
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 19 11:06:13 2018 +0330
+
+    Test debug builds on ArchLinux bot
+
+    Fixes #805
+
+ .circleci/config.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e2d2d819848ed0ff1c60b9bde1f9c8f9495ec5b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 17:28:53 2018 -0800
+
+    Limit how much work sanitize() can do
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=6022
+
+ src/Makefile.am                                       |   2 ++
+ src/hb-open-type-private.hh                           |  16
+ ++++++++++++++--
+ .../233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf      | Bin 0 ->
+ 1048576 bytes
+ test/shaping/data/in-house/tests/fuzzed.tests         |   1 +
+ 4 files changed, 17 insertions(+), 2 deletions(-)
+
+commit 7033fe5877c6f9500575f20f17135f74dc9c0547
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 17:12:04 2018 -0800
+
+    [aat] Minor
+
+ src/hb-aat-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6fa690c75a572a1076124b428b76929b2674e532
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 16:27:59 2018 -0800
+
+    Fix debug build
+
+    Context needs to be called 'c'. The TRACE_* rely on that.
+
+ src/hb-ot-cmap-table.hh | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 05d1e77db8f3e5280e93b6885ff4f7df113b612b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 16:26:04 2018 -0800
+
+    [aat] Silence warning
+
+ src/hb-aat-layout-kerx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a21fceb05311f61ef179b2f3aa6497562555f241
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 16:10:15 2018 -0800
+
+    [ci] Make AppVeyor less noisy
+
+ appveyor.yml | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 1c50a88623a881a9e2b2b0f1f6a783962626f03a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 15:57:09 2018 -0800
+
+    Readjust mark attachment heuristic a bit more
+
+    Previously adjusted logic could fail if nothing around was ligated,
+    and something moved.  This should take care of that.
+
+    CC https://github.com/harfbuzz/harfbuzz/issues/740
+
+ src/hb-ot-layout-gpos-table.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 246e280d88b6b26757297a349f01e52c15eaec53
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 15:42:25 2018 -0800
+
+    [test] Add test for https://github.com/harfbuzz/harfbuzz/issues/740
+
+ .../fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf   | Bin 0 ->
+ 5680 bytes
+ test/shaping/data/in-house/tests/use.tests               |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit 79756c9039a628b0df441228ca1ea20b8a91e3e8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 19 03:17:44 2018 +0330
+
+    [aat] First dig on 'kerx' (#704)
+
+ src/Makefile.sources            |   1 +
+ src/hb-aat-layout-kerx-table.hh | 377
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.cc            |   1 +
+ src/hb-ot-layout-private.hh     |   2 +
+ 4 files changed, 381 insertions(+)
+
+commit 279c70a5b36446f444e5d2f4ac1db7614c8a3db8
+Merge: e9164478 89b82814
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 14:04:33 2018 -0800
+
+    Merge pull request #796 from ebraminio/dev-run
+
+    Add a continuous builder using fswatch
+
+commit e91644786bf7c278e75962b851d5d47011ff175c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 12:41:24 2018 -0800
+
+    Remove unused check
+
+ configure.ac | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 89b82814b605d2bfcc481a47607e642a928dff15
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Feb 16 12:53:33 2018 +0330
+
+    Add a continuous builder using fswatch
+
+ CMakeLists.txt          | 24 +++++++++++++-----------
+ src/dev-run.sh          | 22 ++++++++++++++++++++++
+ test/api/CMakeLists.txt |  2 +-
+ 3 files changed, 36 insertions(+), 12 deletions(-)
+
+commit 0bd2d76bdd83569366762416bf7c8fd8e90021aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 11:55:26 2018 -0800
+
+    [test] Fix a couple of coverity_scan issues
+
+ test/api/hb-subset-test.h | 17 +++++++++++------
+ 1 file changed, 11 insertions(+), 6 deletions(-)
+
+commit 8089711a61687d565f207c56d3d2b658f514d7ab
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 18 23:25:15 2018 +0330
+
+    Another attempt on fixing coverity
+
+    I hope I am in a correct direction at least
+
+ .travis.yml | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 79d0d791b9ee920e1f687a93de5adf5d113cc829
+Merge: 21646cc4 97a71102
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 11:35:51 2018 -0800
+
+    Merge pull request #800 from harfbuzz/bitops
+
+    Optimize set through optimized bit operations
+
+commit 97a71102153d28982297a190739c7d82e76b109e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 10:50:24 2018 -0800
+
+    Fix BitScanForward() usage
+
+    Should fix Win64 bot.
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit fe8f40a4180e7b02831a264c0b3c66763156abb6
+Merge: cd11107b 21646cc4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 10:45:33 2018 -0800
+
+    Merge branch 'master' into bitops
+
+commit 21646cc4a6160088933774e179df9be4865a9f4b
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Feb 16 12:08:55 2018 -0500
+
+    Do not mark the first glyph as unsafe to break
+
+    Fixes #791.
+
+ src/hb-buffer-private.hh | 3 +--
+ src/hb-coretext.cc       | 4 ----
+ src/hb-directwrite.cc    | 2 --
+ src/hb-graphite2.cc      | 1 -
+ src/hb-uniscribe.cc      | 2 --
+ 5 files changed, 1 insertion(+), 11 deletions(-)
+
+commit 04dedec96b76600eecdb739b72814a4a56b270ae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 18:32:57 2018 -0800
+
+    [test] Remove unused var
+
+ test/api/test-subset-hmtx.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 181b7471074cc814e0f498fc05fd6850c3f5e403
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 17:08:44 2018 -0800
+
+    Update outdated TODO file
+
+ TODO | 29 +----------------------------
+ 1 file changed, 1 insertion(+), 28 deletions(-)
+
+commit 6d56db8983e03fbebbeb61282bef8cb1f9abb8e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 17:02:57 2018 -0800
+
+    [test/api] Distribute all fonts
+
+ test/api/Makefile.am | 21 ++-------------------
+ 1 file changed, 2 insertions(+), 19 deletions(-)
+
+commit e5ab34fd3a104f7ff2f0b36c66770c88b2ea1051
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 16:58:17 2018 -0800
+
+    Misc fixes
+
+    Should bring bag djgpp bot.
+
+ src/hb-ot-os2-table.hh | 54
+ +++++++++++++++++++++++++-------------------------
+ src/hb-subset-plan.cc  | 16 +++++++--------
+ 2 files changed, 34 insertions(+), 36 deletions(-)
+
+commit df9e22656de746bde65dee775a66f1a80f1c2e32
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 16 17:02:51 2018 -0700
+
+    [subset] add a glyf subsetting test for a font with composite glyphs.
+
+ .../api/fonts/Roboto-Regular.components.subset.ttf | Bin 0 -> 2052 bytes
+ test/api/fonts/Roboto-Regular.components.ttf       | Bin 0 -> 2572 bytes
+ test/api/test-subset-glyf.c                        |  21
+ +++++++++++++++++++++
+ 3 files changed, 21 insertions(+)
+
+commit c36d015b0e9c363431cd9d228b776ad419fde474
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 16 17:02:15 2018 -0700
+
+    [subset] missing return.
+
+ test/api/hb-subset-test.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2130392dcc30784ee34c487ab16316006c91f16d
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 16 17:01:00 2018 -0700
+
+    [subset] Add support for updating reference gids in components to
+    their new values.
+
+ src/hb-subset-glyf.cc | 38 +++++++++++++++++++++++++++++++++-----
+ 1 file changed, 33 insertions(+), 5 deletions(-)
+
+commit 49544eb860e523838892d6ce88eeca72ffd19da4
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 16 16:56:15 2018 -0700
+
+    [subset] Refactor composite glyf iteration code into an Iterator
+    outside of the accelerator.
+
+ src/hb-ot-glyf-table.hh | 110
+ +++++++++++++++++++++++++-----------------------
+ src/hb-subset-plan.cc   |   6 +--
+ 2 files changed, 60 insertions(+), 56 deletions(-)
+
+commit dc6d67df1395faf38d7587b1dd3c6661ee7cd6f0
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 16 15:20:14 2018 -0700
+
+    [subset] Use gids_to_retain_sorted to produce old gid -> new gid
+    mapping since it now has the more complete set.
+
+ src/hb-subset-plan.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit dcac9fe96429d4e272a3fbd60a6162f988f58f71
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 16 11:27:03 2018 -0700
+
+    [subset] Use complex glyph closure to populate gids_to_retain_sorted.
+
+ src/hb-subset-plan.cc | 43 ++++++++++++++++++++++++-------------------
+ src/hb-subset-plan.hh |  6 ++++++
+ 2 files changed, 30 insertions(+), 19 deletions(-)
+
+commit 58a54c9d4f72e228c012451c4469da730742d3d8
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 16 11:20:38 2018 -0700
+
+    [subset] add constant to get_composite and in_table methods in
+    hb-ot-glyf-table
+
+ src/hb-ot-glyf-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 73e1434814eb37005b4159babf972a2743b25700
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 15 14:41:56 2018 -0800
+
+    [subset] Add a DFS search to produce a closure of composite glyphs.
+
+ src/hb-subset-plan.cc | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit d3684141437fad6ebf5f9945f92125c9a42ea853
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 15 14:03:34 2018 -0800
+
+    [subset] add helper methods to glyf accelerator for reading composite
+    glyph information.
+
+ src/hb-ot-glyf-table.hh | 115
+ ++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 112 insertions(+), 3 deletions(-)
+
+commit cd11107bb44ac719709e10264e9e6ba6a1cfae0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 18:28:58 2018 -0800
+
+    Another bitops fallback fix
+
+    I'm confident that all bugs are hashed out now.
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4e517ecb6b7c27d4053a6476bb9262858e2567ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 18:20:12 2018 -0800
+
+    Another bitops fallback impl fix
+
+ src/hb-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit f18b9fbf6583dff72675be7859fc147ec24a0dd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 18:14:41 2018 -0800
+
+    [set] Implement iteration using bitop intrinsics
+
+ src/hb-set-private.hh | 55
+ ++++++++++++++++++---------------------------------
+ 1 file changed, 19 insertions(+), 36 deletions(-)
+
+commit 6a91a2eb04951f6e33706c2b8e9cd987b429fce9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 17:49:41 2018 -0800
+
+    Fix wide bitops implemenetation
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d25c3e69e9b0cb9d947e98845b9e3a14ce58e350
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 17:45:09 2018 -0800
+
+    [set] Readjust parameters
+
+ src/hb-set-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 6d5c0bf8b18ed53e8d40dcbae83ec66ed2116843
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 17:33:26 2018 -0800
+
+    Fix bitops fallback impl
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 82eb1dac163cb4aef8a2e4ebad542378f4e28dca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 16:52:09 2018 -0800
+
+    Flesh out other bit ops some more for 128bit as well
+
+ src/hb-private.hh | 165
+ +++++++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 126 insertions(+), 39 deletions(-)
+
+commit 864a2dddae9eb1303c59d0d3717fce307a72a524
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 14:21:40 2018 -0800
+
+    Clean up bit functions
+
+    Compile all code-paths possible, to better catch errors.
+    Also enable MSVC ones on mingw which seems to support them.
+
+ src/hb-private.hh | 43 +++++++++++++++++++++++++++----------------
+ 1 file changed, 27 insertions(+), 16 deletions(-)
+
+commit 978ace6fbbc828adc20f21591d138f41d8508ebc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 16:06:17 2018 -0800
+
+    Improve _hb_popcount()
+
+    Support 128bit type.
+
+ configure.ac                   |  3 ++-
+ src/hb-ot-layout-gpos-table.hh |  2 +-
+ src/hb-ot-map.cc               |  2 +-
+ src/hb-private.hh              | 61
+ +++++++++++++++++++++++++++---------------
+ 4 files changed, 44 insertions(+), 24 deletions(-)
+
+commit 7b5ce7404716a17f91ff86d374c7b76ee7ce3247
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 15:37:22 2018 -0800
+
+    Fix warnings
+
+ src/hb-ot-os2-table.hh    | 2 +-
+ test/api/hb-subset-test.h | 3 ++-
+ test/api/hb-test.h        | 9 +++++++--
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 94d32d1b83892ed4f124463cf4322bf74b3e850d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 15:36:20 2018 -0800
+
+    Enable C99 if available
+
+    Hopefully we can now mix-and-match code and declaration in the C
+    test files.
+
+ configure.ac | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 926db874552519734fab6c04258887ea634f5324
+Merge: 882a3bf4 c7a633f9
+Author: rsheeter <rsheeter@google.com>
+Date:   Fri Feb 16 15:27:29 2018 -0800
+
+    Merge pull request #792 from googlefonts/master
+
+    Support more tables in subsetter
+
+commit 882a3bf4abcdac60414db41d54dbbb7d2368c908
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 14:17:20 2018 -0800
+
+    That didn't work...
+
+ RELEASING.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b1f186df78ed14cbc8be919e7f552df2bd7561e0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 14:13:38 2018 -0800
+
+    Add mingw32.sh and mingw64.sh
+
+ RELEASING.md | 28 +---------------------------
+ mingw32.sh   | 22 ++++++++++++++++++++++
+ mingw64.sh   | 22 ++++++++++++++++++++++
+ 3 files changed, 45 insertions(+), 27 deletions(-)
+
+commit d37310ac5d5f8a3fd1ce1e535647e7c6bb0d7926
+Author: Arkady Shapkin <arkady.shapkin@gmail.com>
+Date:   Fri Feb 16 21:45:08 2018 +0300
+
+    Remove checking macros __OPTIMIZE__ for MSVC
+
+    Visual C++ compiler doesn't define macros __OPTIMIZE__  when
+    optimizations enabled
+
+ src/hb-private.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 4eff0fc5b87084765ac2e36ba9f09d7d257f32fb
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Feb 16 20:22:52 2018 +0200
+
+    Make this work for old versions of automake
+
+ .ci/fail.sh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit f8077c97909778c117d37773c9da570d831dacd2
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Feb 15 11:47:08 2018 +0200
+
+    Print only the failed log
+
+ .ci/fail.sh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 8e3b4c0e11642470069b866a73768a866ac3fdb3
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Feb 15 11:25:24 2018 +0200
+
+    Simplify calls to collect-logs.sh
+
+ .ci/{collect-logs.sh => fail.sh} |  3 +++
+ .circleci/config.yml             | 13 +++++++++----
+ .travis.yml                      |  6 +++---
+ appveyor.yml                     |  2 +-
+ 4 files changed, 16 insertions(+), 8 deletions(-)
+
+commit c7a633f95710fcf2fe9151b41feba7db4b1bab0e
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 16 11:11:20 2018 -0800
+
+    [subset] try to get more info from bot where g_assert_cmpmem fails
+
+ test/api/hb-subset-test.h | 12 +++++-------
+ test/api/hb-test.h        | 11 ++++++++---
+ 2 files changed, 13 insertions(+), 10 deletions(-)
+
+commit 0bb2d7ac12b7cf482580b6d2e8534eef8a233f96
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 16 06:26:02 2018 -0800
+
+    [subset] fix int type for blob length in hb-subset-test.h
+
+ test/api/hb-subset-test.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit be0a01a67613f45db7f7e9be84cb883f0344c817
+Merge: 7acaa3b7 139c9928
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 16 06:01:41 2018 -0800
+
+    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz
+
+commit 139c9928f6152088fa6eee0279e33cb821aeb541
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Feb 16 13:27:26 2018 +0330
+
+    Fix hb-private.hh compile issue
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6c10328eb88b0641586f31a782b63f45eada5609
+Author: Arkady Shapkin <arkady.shapkin@gmail.com>
+Date:   Thu Feb 15 23:17:46 2018 +0300
+
+    Use _BitScanForward and _BitScanReverse on MSVC
+
+ src/hb-private.hh | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 7acaa3b781da835cdb11dbe523c819feb4eef996
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 15 14:28:29 2018 -0800
+
+    [subset] apparently C99 is too much to ask in 2018
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b1740106a9c825874faf3f1315770d1e3c790cf9
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 15 13:55:21 2018 -0800
+
+    [subset] fix format specifier for size_t
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e00c37aaae3922b425c0528bfdd36d59cf9c5796
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 15 12:53:52 2018 -0800
+
+    [subset] fix no matching function MIN in djgpp
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6122ad2442666d89ef39bdf5a2bb9d3f6d8e2b03
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 15 11:40:28 2018 -0800
+
+    [subset] add files to EXTRA_DIST
+
+ test/api/Makefile.am | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 0758cbc4c2f52c629d05515b8d2816e8d6a2a2c1
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 15 11:29:01 2018 -0800
+
+    [subset] correct bug introduced to get_advance
+
+ src/hb-ot-hmtx-table.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 3fd11f4397aec9cda3a7d29246ab3ae56115ad36
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 15 11:15:12 2018 -0800
+
+    [subset] remove unused decl
+
+ src/hb-subset-private.hh | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 23d21a74b55eaf6d6d367097099e6b3bb78bae37
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Feb 15 02:52:15 2018 +0200
+
+    Move collect_logs to .ci dir
+
+    Next to other CI scripts.
+
+ .collect_logs => .ci/collect-logs.sh | 0
+ .circleci/config.yml                 | 8 ++++----
+ .travis.yml                          | 6 +++---
+ appveyor.yml                         | 2 +-
+ 4 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 0e088a63d10dd09e025515bfa8ae68aa2922eaf6
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 21:11:45 2018 -0800
+
+    [subset] hmtx space bracket. authors++
+
+ src/hb-ot-hmtx-table.hh | 40 ++++++++++++++++++++--------------------
+ 1 file changed, 20 insertions(+), 20 deletions(-)
+
+commit 1725c35da0ea2f829b6d6b6c1963607fd6dfb577
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 19:36:33 2018 -0800
+
+    [subset] cmap space bracket
+
+ src/hb-ot-cmap-table.hh | 72
+ ++++++++++++++++++++++++-------------------------
+ 1 file changed, 36 insertions(+), 36 deletions(-)
+
+commit e158739bfb9e5d60989e179fcc8744f3125e2067
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 19:22:37 2018 -0800
+
+    [subset] space bracket
+
+ src/hb-ot-hmtx-table.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 2d6b1e2af74abea645a943d264e148d56d018101
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 19:14:01 2018 -0800
+
+    [subset] maxp copy writeable fn
+
+ src/hb-ot-maxp-table.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 1efecd965fe81d65e2763be4f43df2d8c4d8be44
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 18:42:29 2018 -0800
+
+    [subset] hmtx use copy writeable fn instead of direct memory
+
+ src/hb-ot-hmtx-table.hh | 23 ++++-------------------
+ 1 file changed, 4 insertions(+), 19 deletions(-)
+
+commit 27012526f9b3848676bc2a4fb8e68c630af18620
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 19:01:00 2018 -0800
+
+    [subset] whitespace
+
+ test/api/test-subset-hmtx.c | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit b1bd0b5f506dad9d04fd3a6abcb92122f231e0f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 18:50:19 2018 -0800
+
+    [subset] Minor
+
+ src/hb-ot-cmap-table.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 83f57e24bfc2000373192ec44b067fdd7dee8a65
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 18:43:53 2018 -0800
+
+    [test] Reinstate
+    test/shaping/data/in-house/tests/myanmar-syllable.tests
+
+ test/shaping/data/in-house/tests/myanmar-syllable.tests | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5ae6526ef4aa9b3c943cad984dc2fff09cdf597b
+Merge: 2903b2f3 04c1ec2b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 18:42:32 2018 -0800
+
+    [subset] Merge remote-tracking branch 'googlefonts/master'
+
+commit 04c1ec2b7396c05f6e8afc9d87679422782aa1e8
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 17:00:18 2018 -0800
+
+    [subset] Don't fail on different checksum adjustment in subsetting
+    tests.
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1740 ->
+ 1692 bytes
+ test/subset/run-tests.py                              |   8 ++++++++
+ 2 files changed, 8 insertions(+)
+
+commit 0775bc0f7a59241456142b48abced75fd3db5a42
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 16:37:35 2018 -0800
+
+    [subset] Fix hhea subsetting and clean up some memory leaks.
+
+ src/hb-ot-hmtx-table.hh | 25 ++++++++++++++-----------
+ 1 file changed, 14 insertions(+), 11 deletions(-)
+
+commit b56c9384bcc177236debd26fdbbf14319e4c62b9
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 16:05:39 2018 -0800
+
+    [subset] Add missing face reference in hb-subset-plan plus ensure
+    all struct members are cleaned up on destroy.
+
+ src/hb-subset-plan.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit e0ffebead6230b8e1ee8dd97425505706321793e
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 16:01:08 2018 -0800
+
+    [subset] In hb-subset-test use hb_set_union instead of manually
+    copying set.
+
+ test/api/hb-subset-test.h | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit e330ef3711c543372f9f8550a967c512bbf87d83
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 15:57:11 2018 -0800
+
+    [subset] Restore hb_face_data_destroy to be internal.
+
+ src/hb-subset.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 3ab7d2649bf5c92d3837b3132d65d4659d0fa003
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 15:48:57 2018 -0800
+
+    [subset] Fix memory leak in hb-ot-{maxp,os2}. Plus some formatting.
+
+ src/hb-ot-maxp-table.hh |  6 ++++--
+ src/hb-ot-os2-table.hh  | 24 +++++++++++++-----------
+ 2 files changed, 17 insertions(+), 13 deletions(-)
+
+commit 2903b2f357eb495c9badac1b2f74e65e1d1075bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 15:46:27 2018 -0800
+
+    Another linker tweaking
+
+    Trying to fix this warning:
+    cc1: warning: command line option ‘-fno-threadsafe-statics’ is
+    valid for C++/ObjC++ but not for C
+
+    Let's see what the clang bots think of it.
+
+ src/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e1f1f96577a80846749782b6e199a661f4189ec0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 15:44:48 2018 -0800
+
+    [set] Tune size again
+
+    Switch from a 128+64 hierarchy, to 32+32. New page size is 1024.
+    This should make set iteration faster, without affecting other op
+    performances much.
+
+ src/hb-set-private.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 66e282df32410831f1c4e157e9dcf8c76f2bc3d8
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 15:31:13 2018 -0800
+
+    [subset] remove TODO that was already done
+
+ src/hb-subset-plan.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 4696624ad9987b0eebcf5c84dafdb204b886f28e
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 15:30:49 2018 -0800
+
+    [subset] maxp wrong int type, note to use copy_writable_or_fail
+
+ src/hb-ot-maxp-table.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 3ed70e5e64910e1c22225f542a525807b000cb2a
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 15:24:49 2018 -0800
+
+    [subset] return bool not hb_bool_t from table::subset
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ src/hb-ot-maxp-table.hh | 2 +-
+ src/hb-ot-os2-table.hh  | 2 +-
+ src/hb-subset.cc        | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 88d56e241bd6bb768656d77cf8f99ccc97fb2446
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 15:20:43 2018 -0800
+
+    [subset] Use a supplier instead of memcpy and fix a few unnecessary
+    {}s for cmap
+
+ src/hb-ot-cmap-table.hh | 24 ++++++------------------
+ 1 file changed, 6 insertions(+), 18 deletions(-)
+
+commit 42a80f00d51317207c49611b76d6bba06230371b
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 15:04:35 2018 -0800
+
+    [subset] add free
+
+ src/hb-ot-hmtx-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d463e9f6b57bebb3aa4875fe11c927c26c3e3974
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 15:04:15 2018 -0800
+
+    [subset] Give Behdad credit again
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fa87770372a3156658412ff0d70e32083c6b0484
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 14:16:25 2018 -0800
+
+    [subset] First pass at hmtx
+
+ src/hb-ot-cmap-table.hh                           |  19 +--
+ src/hb-ot-hhea-table.hh                           |   6 +-
+ src/hb-ot-hmtx-table.hh                           | 163
+ ++++++++++++++++++---
+ src/hb-ot-maxp-table.hh                           |   8 +-
+ src/hb-ot-os2-table.hh                            |   8 +-
+ src/hb-subset-glyf.cc                             |   5 +-
+ src/hb-subset-glyf.hh                             |   1 -
+ src/hb-subset-plan.cc                             |  12 ++
+ src/hb-subset-plan.hh                             |  10 ++
+ src/hb-subset-private.hh                          |  11 ++
+ src/hb-subset.cc                                  |  85 ++++++-----
+ test/api/Makefile.am                              |   7 +
+ test/api/fonts/Inconsolata-Regular.ab.ttf         | Bin 0 -> 5048 bytes
+ test/api/fonts/Inconsolata-Regular.abc.ttf        | Bin 0 -> 5224 bytes
+ test/api/fonts/Inconsolata-Regular.abc.widerc.ttf | Bin 0 -> 5228 bytes
+ test/api/fonts/Inconsolata-Regular.ac.ttf         | Bin 0 -> 4940 bytes
+ test/api/fonts/Inconsolata-Regular.ac.widerc.ttf  | Bin 0 -> 4944 bytes
+ test/api/fonts/README                             |   2 +
+ test/api/test-subset-hmtx.c                       | 164
+ ++++++++++++++++++++++
+ 19 files changed, 422 insertions(+), 79 deletions(-)
+
+commit 20022575c658b29796db80c387641309d0c49586
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Feb 15 01:15:39 2018 +0330
+
+    Redirect email notifications to another mailing list dedicated for
+    this (#790)
+
+ .travis.yml  | 4 ++--
+ appveyor.yml | 5 +++++
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 581996ea7976847b6356c9cc81b564f0c278f0f3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Feb 15 00:43:46 2018 +0330
+
+    Add .collect_logs and use it on CI bots, fixes #786 (#789)
+
+ .circleci/config.yml | 8 ++++----
+ .collect_logs        | 6 ++++++
+ .travis.yml          | 6 +++---
+ appveyor.yml         | 2 +-
+ 4 files changed, 14 insertions(+), 8 deletions(-)
+
+commit e5edcc81bf14311c56bd2f50808552076c3c4d77
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 11:17:53 2018 -0800
+
+    [subset] Fix codepoint iteration in hb-subset-test.
+
+ test/api/hb-subset-test.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ccae99fdadcf86aeda15dc230a3ddcd6ff176533
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 11:12:09 2018 -0800
+
+    Another try
+
+ src/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8b1dbbef1aec3b6880186070e7386a5553d67b15
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 11:04:12 2018 -0800
+
+    Fix compile error in hb-subset-test.
+
+ test/api/hb-subset-test.h | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit f53627e19100df6eb7f32d58e7c4ce47a783f1a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 10:59:22 2018 -0800
+
+    [test] Fix warning
+
+ test/api/test-subset.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8c3612af650e4c8e01a9fdc127342b07b5c77962
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 10:57:34 2018 -0800
+
+    Tweak Makefile some more
+
+ src/Makefile.am | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit d594f947b68ad36d32ce107847f5f02ec3528076
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 10:55:25 2018 -0800
+
+    [subset] Allow linking to libstdc++
+
+    We want to use it.
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a0fe3011bafbe36e7d5810acc7df21bea08c802a
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 10:52:41 2018 -0800
+
+    copy all cmap groups at once
+
+ src/hb-ot-cmap-table.hh | 14 ++++----------
+ 1 file changed, 4 insertions(+), 10 deletions(-)
+
+commit d008b62887afe631f50009f40e605c8456ddd011
+Merge: b0eefacf 109314cb
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 10:38:52 2018 -0800
+
+    Merge remote-tracking branch 'upstream/master' into fixed
+
+commit b0eefacf4cb885f510f9551bf2e9216808ca61e8
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 18:15:58 2018 -0800
+
+    [subset] Drop GSUB, GDEF, GPOS, and DSIG from subsetter expected
+    test outputs.
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 2460 ->
+ 1740 bytes
+ test/subset/generate-expected-outputs.py              |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit 89f17e3965ba776565f2de2bf56a4b135f336e53
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 18:14:50 2018 -0800
+
+    [subset] capitalize dsig.
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit df6d780355d7da805a9b9033452f8814c5360bba
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 17:56:17 2018 -0800
+
+    [subset] Extract maxp subsetting into hb-ot-maxp-table.
+
+ src/hb-ot-maxp-table.hh     | 19 ++++++++++++++++++-
+ src/hb-subset.cc            | 28 ++--------------------------
+ test/api/test-subset-glyf.c |  5 +++--
+ 3 files changed, 23 insertions(+), 29 deletions(-)
+
+commit 865b6971ad5c2ec4bc33c36a78a36b90da5f5543
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 17:42:20 2018 -0800
+
+    [subset] Add a test for OS/2 fixes during subsetting.
+
+ test/api/Makefile.am                |   2 ++
+ test/api/fonts/Roboto-Regular.b.ttf | Bin 0 -> 1996 bytes
+ test/api/test-subset-os2.c          |  59
+ ++++++++++++++++++++++++++++++++++++
+ 3 files changed, 61 insertions(+)
+
+commit 343dfe89655683966836e44afb4fd32c47377844
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 17:33:48 2018 -0800
+
+    [subset] white and add inline in hb-ot-cmap-table.
+
+ src/hb-ot-cmap-table.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 24904383df03c472c865bd97bfe844f5e86a7172
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 17:31:01 2018 -0800
+
+    [subset] Correct usFirstCharIndex and usLastCharIndex in OS2 table
+    when subsetting.
+
+ src/hb-ot-os2-table.hh | 45 +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc       | 16 ++++++++++------
+ 2 files changed, 55 insertions(+), 6 deletions(-)
+
+commit 109314cb55e6d95d5c3a87b9ed1ba4e74a880078
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 14 21:05:11 2018 +0330
+
+    Another attempt on fixing the tests on Travis (#788)
+
+ src/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 694eaf636713b8d0bbe13f38c2553b1a2f3d2d3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 01:00:10 2018 -0800
+
+    [set] Add backwards iterator
+
+    New API:
+    - hb_set_previous()
+    - hb_set_previous_range()
+
+ docs/harfbuzz-sections.txt |  2 ++
+ src/hb-set-private.hh      | 79
+ +++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-set.cc              | 49 +++++++++++++++++++++++++++-
+ src/hb-set.h               | 19 ++++++++---
+ test/api/test-set.c        | 53 +++++++++++++++++++++++++++++--
+ 5 files changed, 194 insertions(+), 8 deletions(-)
+
+commit fe3bc524bd4f93bd67c13ed402720a13dd3484d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 23:51:45 2018 -0800
+
+    [set] Allow starting iteration from a non-member of the set
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a989f3edec5864d5de8b217aa595c962d8fc4b0a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 22:12:36 2018 -0800
+
+    Add hb_blob_copy_writable_or_fail()
+
+    New API:
+    - hb_blob_copy_writable_or_fail()
+
+ docs/harfbuzz-sections.txt |  1 +
+ src/hb-blob.cc             | 25 +++++++++++++++++++++++++
+ src/hb-blob.h              |  3 +++
+ 3 files changed, 29 insertions(+)
+
+commit 9046e924421869bf167b52cd394e868796091f62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 22:07:12 2018 -0800
+
+    [subset] Rename constructor to hb_subset_input_create_or_fail()
+
+    To signify that unlike rest of library, returns nullptr on failure.
+
+ src/hb-subset-input.cc      | 6 ++----
+ src/hb-subset.h             | 2 +-
+ test/api/test-subset-glyf.c | 3 ++-
+ test/api/test-subset.c      | 7 +++++--
+ util/hb-subset.cc           | 2 +-
+ 5 files changed, 11 insertions(+), 9 deletions(-)
+
+commit 507804479a81672ec0c089313adad9fa308d78fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 21:46:28 2018 -0800
+
+    [use] Add dump-use-data
+
+ src/Makefile.am                        |  4 ++++
+ src/dump-use-data.cc                   | 38
+ ++++++++++++++++++++++++++++++++++
+ src/gen-use-table.py                   |  2 +-
+ src/hb-ot-shape-complex-use-private.hh |  2 +-
+ src/hb-ot-shape-complex-use-table.cc   |  2 +-
+ src/hb-ot-shape-complex-use.cc         |  4 ++--
+ 6 files changed, 47 insertions(+), 5 deletions(-)
+
+commit 15ba4fbe01433c8627f9e6a60106ca77d3e1ad4c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 21:41:51 2018 -0800
+
+    [khmer] Add dump-khmer-data
+
+ src/Makefile.am                          |   4 +
+ src/Makefile.sources                     |   1 +
+ src/dump-khmer-data.cc                   |  43 +++++++++++
+ src/hb-ot-shape-complex-khmer-private.hh | 124
+ +++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-khmer.cc         |  98 +-----------------------
+ 5 files changed, 173 insertions(+), 97 deletions(-)
+
+commit effddd03bd6fb0aac14b46a16b281f3749e44780
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 21:38:15 2018 -0800
+
+    [myanmar] Add dump-myanmar-data
+
+ src/Makefile.am                            |   4 +
+ src/Makefile.sources                       |   1 +
+ src/dump-myanmar-data.cc                   |  43 ++++++++
+ src/hb-ot-shape-complex-indic-private.hh   |   8 +-
+ src/hb-ot-shape-complex-myanmar-private.hh | 171
+ +++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-myanmar.cc         | 138 +----------------------
+ 6 files changed, 225 insertions(+), 140 deletions(-)
+
+commit c0e45b60a001a45c8ed1f12af8f2f222161eca6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 21:23:38 2018 -0800
+
+    [indic] Rename print-indic-table to dump-indic-data
+
+    Makes more sense given what this prints, err, dumps.
+
+ src/Makefile.am                                  | 8 ++++----
+ src/{print-indic-table.cc => dump-indic-data.cc} | 0
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 9b878bd2165236b067d59410673cf5cc54968fa7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 21:22:47 2018 -0800
+
+    [indic] Explicitly number indic_position_t
+
+    So it's easier to cross-reference from output of print-indic-table.
+
+ src/hb-ot-shape-complex-indic-private.hh | 32
+ ++++++++++++++++----------------
+ 1 file changed, 16 insertions(+), 16 deletions(-)
+
+commit 8634846a0a1049c42ea84ca34402957c981b4c73
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 21:18:00 2018 -0800
+
+    More tweaking linker and linker flags
+
+ src/Makefile.am | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit d830d3d2448b2248dff642c701b442e1260e2d85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 19:01:03 2018 -0800
+
+    [indic] Share some copy/pasta code
+
+ src/hb-ot-shape-complex-indic-private.hh | 29
+ +++++++++++++++++++++++++++--
+ src/hb-ot-shape-complex-indic.cc         | 27 ---------------------------
+ src/hb-ot-shape-complex-khmer.cc         | 30
+ ++++++++----------------------
+ src/hb-ot-shape-complex-myanmar.cc       | 19 ++-----------------
+ 4 files changed, 37 insertions(+), 68 deletions(-)
+
+commit 397ed53e55b9450742867a43d164b498ec735f50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 18:54:26 2018 -0800
+
+    [indic] Add print-indic-table
+
+ src/Makefile.am                          |  14 ++-
+ src/hb-ot-shape-complex-indic-private.hh | 185
+ ++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-indic.cc         | 187
+ -------------------------------
+ src/print-indic-table.cc                 |  43 +++++++
+ 4 files changed, 239 insertions(+), 190 deletions(-)
+
+commit fd0bde6325a7dfe3ba54b683646ca0693c414446
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 16:35:30 2018 -0800
+
+    [subset] Fix loca offsets
+
+    Was writing source font's offsets. Ouch.
+
+ src/hb-subset-glyf.cc | 30 +++++++++++-------------------
+ 1 file changed, 11 insertions(+), 19 deletions(-)
+
+commit aeed082e282b97e40c2e8590bdd8818affc7de6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 14:02:59 2018 -0800
+
+    Another tweak at libstdc++ things
+
+    To fix this warning:
+
+    cc1: warning: command line option ‘-fno-threadsafe-statics’ is
+    valid for C++/ObjC++ but not for C
+
+ src/Makefile.am | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit c7d7c9898e22905888dc4304f6d8e79b55654174
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 14:00:14 2018 -0800
+
+    [aat] Minor
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2dbfeecf96c6993d42594f43133d945d67ddbdbc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 13:59:39 2018 -0800
+
+    Minor
+
+ src/hb-aat-layout-morx-table.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit d5b33f2fe1603e894e21f45afb4c00c8d670fb5c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 13:50:50 2018 -0800
+
+    [subset] hb_subset_input_t changes
+
+ src/Makefile.sources        |   1 +
+ src/hb-face.h               |   1 -
+ src/hb-set.cc               |  14 +++---
+ src/hb-subset-input.cc      | 109
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset-plan.cc       |   2 +-
+ src/hb-subset-private.hh    |  11 ++++-
+ src/hb-subset.cc            |  40 ++--------------
+ src/hb-subset.h             |  12 ++++-
+ test/api/test-subset-glyf.c |   4 +-
+ test/api/test-subset.c      |   2 +-
+ util/hb-subset.cc           |  20 ++++----
+ 11 files changed, 153 insertions(+), 63 deletions(-)
+
+commit 28e63a1287fd38a98eed6725c2f4d0820066b0d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 13:39:50 2018 -0800
+
+    Disable threadsafe static's for all libraries
+
+    Even in libharfbuzz-subset, we still will handle our own threadsafety
+    for statics.
+
+ src/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7caddb51b1e69a2803f86756e2ce2acff685c7d0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 13 15:12:43 2018 +0330
+
+    Specify the project name for coverity, trying to fix #785
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b969a82e30f0ff7bf6b2ea2600ef170764774a8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 12 20:51:26 2018 -0800
+
+    Pass no-libstdc++ flags only to libraries suppressing it
+
+ src/Makefile.am | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 97a2f0320056b591d7a747022869fe9cd8ecc6e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 12 18:51:10 2018 -0800
+
+    [subset] Allocate bulk memory with malloc(), not calloc()
+
+    We use calloc() to allocate simple structs and set them to zero.
+    For bulk memory, use malloc() that doesn't zero.
+
+ src/hb-subset-glyf.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 96f1f52ea3a42b27f59aecffe65c918295e53b3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 12 18:48:51 2018 -0800
+
+    Use hb_face_get_upem() instead of face->get_upem()
+
+    Such that hmtx accelerator can be used from libharfbuzz-subset.
+
+ src/hb-ot-cbdt-table.hh | 2 +-
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 3d66f441cc4d4feb2fd4b03be9f764c91f4de8b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 12 18:43:42 2018 -0800
+
+    [subset] Remove unreachable code
+
+    sanitizer.sanitize never return nullptr.
+
+ src/hb-subset.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 42040a273facc696d9a54fc4d89857665e87e3d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 12 18:41:36 2018 -0800
+
+    Allow libharfbuzz-subset to link to libstdc++
+
+    We want to use it instead of reinventing hashmap...
+
+    Also, don't change linker for ICU since libicu also uses libstdc++.
+
+ src/Makefile.am        | 2 --
+ src/check-libstdc++.sh | 3 ++-
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 4af3c5e25822cc5a401837da547c75a17b7f7b48
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 23:21:24 2018 +0330
+
+    Move linker specifying to a better place
+
+ src/Makefile.am | 15 +++++++--------
+ 1 file changed, 7 insertions(+), 8 deletions(-)
+
+commit 8cf8b78faaf3e7ee261bdc44a1ad5a1973eab1a2
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 16:30:21 2018 -0800
+
+    [subset] whitespace
+
+ test/api/test-subset-cmap.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit d1a4d5616f792c6ad84bcc5011040167ddd7cc3f
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 16:25:32 2018 -0800
+
+    output format 12 as enc 10 to match how Roboto did it
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 89ee20f1a39ac78268b57a9aebe8e7428f9944bf
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 16:01:15 2018 -0800
+
+    basic wiring for a (failing) cmap test
+
+ test/api/Makefile.am                               |   2 +
+ test/api/fonts/README                              |   1 +
+ .../Roboto-Regular.abc.cmap-format12-only.ttf      | Bin 0 -> 2412 bytes
+ .../fonts/Roboto-Regular.ac.cmap-format12-only.ttf | Bin 0 -> 2212 bytes
+ test/api/hb-subset-test.h                          |   3 +-
+ test/api/test-subset-cmap.c                        |  82
+ +++++++++++++++++++++
+ test/api/test-subset-glyf.c                        |   5 +-
+ .../data/in-house/tests/myanmar-syllable.tests     |   1 -
+ 8 files changed, 87 insertions(+), 7 deletions(-)
+
+commit afb1da3a1891b7c0fdd047bcb7b3bde86e830444
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 14:37:47 2018 -0800
+
+    auto-completed the wrong gids_to_retain
+
+ src/hb-subset-plan.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1330edc4fe3ffbf18313d6432045606865c610c4
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 14:29:23 2018 -0800
+
+    Use functions to get new gids. Avoid 0; fonttools drops it from cmap.
+
+ src/hb-ot-cmap-table.hh | 24 ++++++++++++++++++------
+ src/hb-subset-plan.cc   | 25 ++++++++++++++++++++-----
+ src/hb-subset-plan.hh   |  5 +++++
+ src/hb-subset.cc        |  2 +-
+ 4 files changed, 44 insertions(+), 12 deletions(-)
+
+commit 1639bdd33122dc8e5522b95c37660273d1fc609e
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 13:40:42 2018 -0800
+
+    [subset] Remove test-subset, testing is planned to be done at the
+    table level here with test/subset covering the complete subsetting
+    operation.
+
+ test/api/Makefile.am   |  1 -
+ test/api/test-subset.c | 73
+ --------------------------------------------------
+ 2 files changed, 74 deletions(-)
+
+commit 4cdd1b16c99f2681eb11d626c4408eebcc1672be
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 13:36:28 2018 -0800
+
+    [subset] added todo in test-subset-glyf.
+
+ test/api/test-subset-glyf.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 1714feef4f7ec9e758e65edcbe5d5591562f46ee
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 13:35:17 2018 -0800
+
+    [subset] re-enable test-subset-glyf. Refactor to use common functions
+    in hb-subset-test.h
+
+ test/api/test-subset-glyf.c | 109
+ +++++++++++---------------------------------
+ 1 file changed, 27 insertions(+), 82 deletions(-)
+
+commit d8d8bd8405ec0db781c4c2bbb7ebd6ff520b3c2d
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 13:33:55 2018 -0800
+
+    [subset] Add some helper functions for writing tests around
+    subsetting.
+
+ test/api/Makefile.am      |   2 +-
+ test/api/hb-subset-test.h | 123
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 124 insertions(+), 1 deletion(-)
+
+commit e8318188c0e53a267a01c45b0fc8d29ad775738a
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 11:38:28 2018 -0800
+
+    [subset] Fix loca generation, was previously writing the original
+    glyph starting offset.
+
+ src/hb-subset-glyf.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 0b94d590d971de0b44b0db941c7a3e095f15fbc9
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Feb 12 16:45:36 2018 +0200
+
+    Rename --with-stdcpp → --with-libstdc++
+
+    Also improve wording a bit and fix make check in --with-libstdc++=yes.
+
+ configure.ac    | 11 ++++++-----
+ src/Makefile.am | 11 ++++++++---
+ 2 files changed, 14 insertions(+), 8 deletions(-)
+
+commit a5713bc2cb4a3fd71d3bc94b9f155339b09eb71a
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 11:30:45 2018 -0800
+
+    we love all our groups
+
+ src/hb-ot-cmap-table.hh | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+commit 692f86e569847adb332186cbb08f344ebe41fa6c
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 11:29:23 2018 -0800
+
+    drop GDEF, GPOS, GSUB, and dsig
+
+ src/hb-subset.cc | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+commit 83e1ef92156d8688b96d14957efcdf7601768799
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 11:22:32 2018 -0800
+
+    [subset] Set the new number of glyphs in maxp.
+
+ src/hb-ot-maxp-table.hh |  5 +++++
+ src/hb-subset.cc        | 37 ++++++++++++++++++++++++++++++++-----
+ 2 files changed, 37 insertions(+), 5 deletions(-)
+
+commit 427f9e4b90bfadb8af13cbd27b7c3ee0153ca8b1
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 11:18:28 2018 -0800
+
+    Don't force loca version to long.
+
+ src/hb-subset-glyf.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 5df080bf155a12f98929b99438da492063ab9218
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 10:15:59 2018 -0800
+
+    Destroy the subset plan at the end of subsetting.
+
+ src/hb-subset.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0301e5be286f5080ec34e9f30c75e73f28d0218b
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 10:12:11 2018 -0800
+
+    Build a working cmap format 12
+
+ src/hb-ot-cmap-table.hh | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+commit ebd31d376d63c9698c0eae34ed295558f7230918
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 10:10:08 2018 -0800
+
+    subset for real
+
+ src/hb-subset.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 62c7d677e8699143e55e7bfa0cc3c1db75f32506
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 10:09:35 2018 -0800
+
+    C-style comments
+
+ src/hb-open-file-private.hh | 15 ++++++++-------
+ 1 file changed, 8 insertions(+), 7 deletions(-)
+
+commit 91f0d51f0525097fef6173046379a89414cb515f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 17:20:12 2018 +0330
+
+    Fix symbol exporting issue on msys2 and ✅ bringing all the bots
+    (#781)
+
+ src/Makefile.am | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit 133e17fe2335abb77f61dbf1cff1955c21334137
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 15:24:22 2018 +0330
+
+    Minor
+
+ src/check-defs.sh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 16f5b53eec4c3238cf92438a17e6dc532e8a61f5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 15:18:13 2018 +0330
+
+    Minor, don't skip the whole test when one .def file not found
+
+ src/check-defs.sh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit a9b650d38407f6f2a26d8386e801600b1004d5d6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 15:10:13 2018 +0330
+
+    Apply check-defs.sh to -icu and -subset, toward mingw fix (#780)
+
+ CMakeLists.txt    | 11 ++++++++---
+ src/Makefile.am   | 21 ++++++++++++++++-----
+ src/check-defs.sh | 12 +++++-------
+ src/gen-def.py    |  9 ++++++---
+ 4 files changed, 35 insertions(+), 18 deletions(-)
+
+commit 2efc8965506d8fd31934be1dba3322f922f3409d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 12:00:07 2018 +0330
+
+    Add --with-stdcpp for ossfuzzer and mupdf use (#770)
+
+ configure.ac    | 12 ++++++------
+ src/Makefile.am | 14 +++++++++++++-
+ 2 files changed, 19 insertions(+), 7 deletions(-)
+
+commit 82e04758c895ce2cd6bddde5f72e592c718fcb69
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 11:56:32 2018 +0330
+
+    minor
+
+ .travis.yml | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 7daa2822f6320801dfed09782ae46687e7c8cbb3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 11:27:00 2018 +0330
+
+    Add Travis based Coverity trigger (#778)
+
+ .ci/trigger-coverity.sh | 13 +++++++++++++
+ .travis.yml             | 14 ++++++++++++++
+ 2 files changed, 27 insertions(+)
+
+commit 7747bdb11b0635738a14c099bfaf58461cadd79a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 19:12:52 2018 -0800
+
+    Remove linker selection from hb-ucdn
+
+    Since this is a convenience library, it's not actually linked. Or
+    so I think.
+    Hoping this might fix this Appveyor failure:
+
+    https://ci.appveyor.com/project/harfbuzz/harfbuzz/build/job/9884jyb5vryja9pw
+
+    Making all in hb-ucdn
+    make[4]: Entering directory '/c/projects/harfbuzz/src/hb-ucdn'
+      CC       libhb_ucdn_la-ucdn.lo
+      GEN      libhb-ucdn.la
+    /bin/sh: libhb_ucdn_la-ucdn.lo: command not found
+    make[4]: *** [Makefile:404: libhb-ucdn.la] Error 127
+    make[4]: Leaving directory '/c/projects/harfbuzz/src/hb-ucdn'
+    make[3]: *** [Makefile:2548: all-recursive] Error 1
+    make[3]: Leaving directory '/c/projects/harfbuzz/src'
+    make[2]: *** [Makefile:1382: all] Error 2
+    make[2]: Leaving directory '/c/projects/harfbuzz/src'
+    make[1]: *** [Makefile:486: all-recursive] Error 1
+    make[1]: Leaving directory '/c/projects/harfbuzz'
+    make: *** [Makefile:418: all] Error 2
+
+ src/hb-ucdn/Makefile.am | 11 -----------
+ 1 file changed, 11 deletions(-)
+
+commit 90d1c740c370b97dfff52420db013ed50075b984
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 19:08:59 2018 -0800
+
+    Add MSVC to no-visibility list
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0db6c6f214a83ffeeefb7c3b77476567e534facb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 18:28:10 2018 -0800
+
+    Add Sun compiler to no-visibility as well
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/776
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d33ba163611c42acd0125472191ea40745f905eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 18:26:41 2018 -0800
+
+    Fix more warnings
+
+ test/api/test-buffer.c | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit dde6448379c9eeb0fc7cc476688002be661229b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 18:24:22 2018 -0800
+
+    Another try at fixing multiple-defintion of NullPool
+
+    This one might do it...
+
+ src/hb-open-type-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit b5f25844fbdd3167051c8d3586b404ae7f077b3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 19:49:18 2018 -0600
+
+    [docs] Minor update
+
+ docs/harfbuzz-sections.txt | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 41906cd5efc2fe17f5fff3fa5fe8488e0cdc6399
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 19:46:06 2018 -0600
+
+    [subset] Another fixup
+
+    I broke this in c31fcf4c58d96eb7d9781a986991b1a79ac7be44
+
+ src/hb-ot-cmap-table.hh  | 2 +-
+ test/subset/run-tests.py | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit cd32177a322b5fd70c92f67f21b64686bf5d5533
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 19:34:05 2018 -0600
+
+    Try at fixing multiple-definition of NullPool
+
+    If we don't have visibility, make NullPool static.
+
+ src/hb-open-type-private.hh | 8 +++++++-
+ src/hb-ot-layout.cc         | 2 ++
+ src/hb-private.hh           | 4 +---
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 3d421ce30713582484471baba76470c84dabc118
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 19:01:44 2018 -0600
+
+    [subset] Use auto_array_t where it does make sense
+
+    Better fix for https://github.com/harfbuzz/harfbuzz/pull/775
+
+ src/hb-subset-plan.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 9aa2eb61e6cb3e4308140bed8a8531877ffd6adf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 19:00:42 2018 -0600
+
+    Minor
+
+ src/hb-ot-cmap-table.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit ae6d0259b4f075885070f833d0f2a96333bf4af3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 11 15:40:55 2018 +0330
+
+    Install fonttools on two bots and enable cmake hb-subset test (#777)
+
+ .circleci/config.yml       | 6 ++++--
+ test/subset/CMakeLists.txt | 8 ++++----
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+commit c8d4c2e32f1cea610a9c91dc6b0c32e9ffe84f20
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 11 13:15:44 2018 +0330
+
+    Initialize bad_indices on hb-subset (#775)
+
+ src/hb-subset-plan.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5845e5ca3bac21c0b03e71eab282b02fb7e868a4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 11 12:03:33 2018 +0330
+
+    fix gobject compile issue (#773)
+
+ src/hb-gobject-structs.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9b5af3ec7f80a7793d5d3891e762d83026de0a5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 21:50:26 2018 -0600
+
+    [gpos] Adjust mark attachment heuristic
+
+    Hopefully it...
+    fixes https://github.com/harfbuzz/harfbuzz/issues/740
+
+ src/hb-ot-layout-gpos-table.hh | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 70b06cc6e71e15f0d7550f67b113eed5e6f30a5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 16:13:06 2018 -0600
+
+    More fixes
+
+ util/hb-subset.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 6c1848b1e3b8969afc441f094b0d7b64b4b14933
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 15:52:35 2018 -0600
+
+    Misc warning fixes
+
+ test/api/test-blob.c   |  2 +-
+ test/api/test-buffer.c | 14 +++++++-------
+ test/api/test-ot-tag.c |  2 +-
+ 3 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 7039803b51f23cb15dd7e12b105c379bd2e38d71
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 15:47:50 2018 -0600
+
+    Fix djgpp bot
+
+ src/hb-subset-glyf.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit cdab20df1e55da196ffc6bc00d580e5ef74c1975
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 15:45:17 2018 -0600
+
+    Minor
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 203b647530b1550388bb3ce2f67e3b17e019d3e4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 11 01:00:03 2018 +0330
+
+    Favor use of static instead HB_INTERNAL
+
+ src/hb-subset-glyf.cc | 8 ++++----
+ src/hb-subset-plan.cc | 4 ++--
+ src/hb-subset.cc      | 2 +-
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 4c5bdb4b39a723b624346d9b9ff9ace964fff0fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 15:40:54 2018 -0600
+
+    [test] Disable test-subset-glyf for now
+
+ test/api/test-subset-glyf.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 43314ff4c05076decbd1eb07ed78f732b6ebcba9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 15:40:03 2018 -0600
+
+    More fixes
+
+    test-subset-glyf still failing. No idea why :(
+
+ src/hb-subset.cc            |  3 +--
+ test/api/test-subset-glyf.c | 26 ++++++++++++++++----------
+ 2 files changed, 17 insertions(+), 12 deletions(-)
+
+commit a981d798eab41b6a7c6484776f04fe178bd536ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 15:17:28 2018 -0600
+
+    Fix more build issues
+
+    Hopefully most bots come back with this...
+
+ src/check-libstdc++.sh   |  5 +++--
+ src/check-symbols.sh     |  2 +-
+ src/hb-buffer.h          |  1 -
+ src/hb-gobject-structs.h |  6 ++++++
+ src/hb-subset-plan.cc    | 10 +++++++---
+ src/hb-subset.cc         |  6 +++---
+ 6 files changed, 20 insertions(+), 10 deletions(-)
+
+commit 6c4ca6135a2ce846431b0ede6a288d3b2f97167e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 11 00:42:06 2018 +0330
+
+    Hide more symbols of hb-subset (#771)
+
+ src/hb-subset-plan.cc | 2 +-
+ src/hb-subset.cc      | 6 +++---
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit c31fcf4c58d96eb7d9781a986991b1a79ac7be44
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 14:20:10 2018 -0600
+
+    [subset] Replace auto_array with prealloced_array
+
+    auto_array has constructor/destructor. Cannot be used in POD object,
+    as the clang
+    bots all noticed...
+
+ src/hb-ot-cmap-table.hh |  8 ++++----
+ src/hb-subset-glyf.cc   |  6 +++---
+ src/hb-subset-plan.cc   | 23 +++++++++++------------
+ src/hb-subset-plan.hh   |  9 +++------
+ 4 files changed, 21 insertions(+), 25 deletions(-)
+
+commit 931d67900ee6d96b5962a475c1b71a58b821bcba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 14:11:16 2018 -0600
+
+    Fix some other bots
+
+ src/hb-subset-glyf.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 4011d885b7fca87c717fdaa4bd0318a42308865a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 14:09:06 2018 -0600
+
+    [util] Remove use of ssize_t which was failing on MSVC
+
+ util/hb-subset.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bfa871634ce9ef9f4ed18348d898686952d6cbe3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 13:37:28 2018 -0600
+
+    Minor
+
+ src/hb-subset-glyf.hh | 2 +-
+ src/hb-subset-plan.hh | 2 +-
+ src/hb-subset.cc      | 3 +--
+ src/hb-subset.h       | 2 +-
+ 4 files changed, 4 insertions(+), 5 deletions(-)
+
+commit 844f48ea9a72d28e2c088497f6c403c54e1751a8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 10 23:13:12 2018 +0330
+
+    Fix symbol exporting and libstdc++ linkage of hb-subset (#769)
+
+ CMakeLists.txt          |  6 ++----
+ src/Makefile.am         |  3 +++
+ src/check-defs.sh       |  2 +-
+ src/check-libstdc++.sh  | 20 +++++++++++---------
+ src/check-symbols.sh    | 28 +++++++++++++++-------------
+ src/hb-subset-glyf.cc   |  8 ++++----
+ src/hb-subset-glyf.hh   |  2 +-
+ src/hb-subset-plan.cc   |  4 ++--
+ src/hb-subset-plan.hh   |  8 ++++----
+ src/hb-subset.cc        |  2 +-
+ src/hb-ucdn/Makefile.am | 11 +++++++++++
+ 11 files changed, 55 insertions(+), 39 deletions(-)
+
+commit 91519c6a5b130ced569cedc3710ab395b663240d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 13:35:17 2018 -0600
+
+    [aat] Add buffer messages
+
+ src/hb-aat-layout-morx-table.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit af274507c4f4c5a582543affa71d81a87d6d9151
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 13:25:49 2018 -0600
+
+    Minor
+
+ src/hb-private.hh | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+commit 570d523761b23a3c668d9071712d5f10944d21fc
+Merge: 71130a20 d18decd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 13:24:22 2018 -0600
+
+    [subset] Merge remote-tracking branch 'googlefonts/master'
+
+commit 71130a20fae7c256b0ab1aa397cc1ac2d11dd487
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 13:15:57 2018 -0600
+
+    Replace Supplier.advance with Supplier::operator+=
+
+ src/hb-open-file-private.hh        |  4 ++--
+ src/hb-open-type-private.hh        |  7 ++++---
+ src/hb-ot-layout-common-private.hh |  4 ++--
+ src/hb-ot-layout-gsub-table.hh     | 10 +++++-----
+ 4 files changed, 13 insertions(+), 12 deletions(-)
+
+commit d0f3e7f59719bdb6a2105ee85a8f3ee799741dab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 12:45:28 2018 -0600
+
+    [util] Use setlinebuf() if present
+
+    To work around mysterious bug on OS X.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/727
+
+ configure.ac    |  6 ++----
+ util/options.cc | 12 ++++++++++--
+ 2 files changed, 12 insertions(+), 6 deletions(-)
+
+commit ad575a5f47a51ee553710873ac2672479b76ba5e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 10 19:50:11 2018 +0330
+
+    Fix cast warnings on clang (#768)
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d18decd2013f24f315dbd3b15cdd80c5a734e7e9
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 9 18:41:21 2018 -0800
+
+    In glyf subsetting add suport for writing out a short loca table
+    when possible.
+
+ src/hb-subset-glyf.cc | 42 +++++++++++++++++++++++++++++++++---------
+ 1 file changed, 33 insertions(+), 9 deletions(-)
+
+commit 9275bd03ea427eb607dde6a8e65f78a350b88323
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 9 17:33:34 2018 -0800
+
+    First pass at building a cmap
+
+ src/hb-ot-cmap-table.hh | 103
+ ++++++++++++++++++++++++++++++++++++++++++++----
+ src/hb-subset.cc        |  37 +++++++++--------
+ 2 files changed, 115 insertions(+), 25 deletions(-)
+
+commit d2170d14780ad6f8e0d17a1e011445c3bcc20871
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 9 17:24:16 2018 -0800
+
+    Check for failures from add table.
+
+ src/hb-subset.cc | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 4816064c0e5464d032a55001a959a9abcef7f70e
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 9 17:14:37 2018 -0800
+
+    add missing return
+
+ src/hb-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 0089443756cdcef0182e55cf8480b96a64d31cc7
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 9 16:22:09 2018 -0800
+
+    Keep a second set of glyph ids in subset plan which is sorted by
+    glyph id and always has gid 0
+
+ src/hb-subset-glyf.cc |  2 +-
+ src/hb-subset-plan.cc | 34 +++++++++++++++++++++++++---------
+ src/hb-subset-plan.hh |  1 +
+ 3 files changed, 27 insertions(+), 10 deletions(-)
+
+commit 3bc81558d836e27e77bda0d6da9c71f530719579
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 9 16:06:33 2018 -0800
+
+    Formatting for hb-subset-plan.
+
+ src/hb-subset-plan.cc | 51
+ +++++++++++++++++++++++++++------------------------
+ 1 file changed, 27 insertions(+), 24 deletions(-)
+
+commit 8cef3a61995317d3a5724221108647d7e66fe24a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 9 16:04:23 2018 -0600
+
+    Try fixing build with Sun Studio
+
+    Trying to fix:
+    https://circleci.com/gh/harfbuzz/harfbuzz/6635
+
+    Also part of:
+    https://github.com/harfbuzz/harfbuzz/issues/630
+
+ src/hb-private.hh | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 86aa4b3ba7cd075f01614874dae88a771b8c54fd
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 9 13:54:43 2018 -0800
+
+    Return empty face on hb_subset failure instead of null. Plus some
+    minor cleanups for _add_head_and_set_loca_version
+
+ src/hb-subset.cc | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+commit d45f240e4e330cedad737fdb792b311c37a19e32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 9 15:51:45 2018 -0600
+
+    Typo
+
+ src/hb-buffer.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3b7aa651b4714b996816023a4929c0289065493f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 9 15:43:20 2018 -0600
+
+    [docs] Improve UNSAFE_TO_BREAK docs
+
+ src/hb-buffer.h | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+commit 671f0a7733a496eb46b08dc88c3c46b804cdd895
+Author: bungeman <bungeman@chromium.org>
+Date:   Thu Feb 1 13:31:25 2018 -0500
+
+    Documentation for HB_GLYPH_FLAG_UNSAFE_TO_BREAK.
+
+    HB_GLYPH_FLAG_UNSAFE_TO_BREAK means that the glyph with this flag is
+    somehow affected by the previous logical glyph (the previous index
+    in the buffer if ltr and the next index if the buffer is rtl). If
+    these two glyphs are separated by a break (line or otherwise) then the
+    underlying text should be re-shaped on both sides up to corresponding
+    position in the text of some glyph not marked with this flag.
+
+ src/hb-buffer.h | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 1582eabee6017839518b821ef93a329a0a86a453
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 9 12:52:08 2018 -0800
+
+    Update head table with loca format selected by glyf+loca subsetting.
+
+ src/hb-subset-glyf.cc |  7 +++----
+ src/hb-subset-glyf.hh |  1 +
+ src/hb-subset.cc      | 37 +++++++++++++++++++++++++++++++++++--
+ 3 files changed, 39 insertions(+), 6 deletions(-)
+
+commit 335bbaa66f66e86d417cc123a2bf397e8b834f64
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 9 10:55:15 2018 -0800
+
+    Remove uneeded code in hb-subset.
+
+ src/hb-subset.cc | 19 -------------------
+ 1 file changed, 19 deletions(-)
+
+commit 3346ba9cd5198d27c7416b8c71fecb6c8d3cb335
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 9 11:05:17 2018 -0600
+
+    [test/text-rendering-tests] Update from upstream
+
+ .../text-rendering-tests/fonts/TestMORXTwentysix.ttf  | Bin 3260 ->
+ 3252 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 1cd98d05e07498653ba60a68b6342d1a90429eba
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 8 19:39:57 2018 -0800
+
+    Create the groups for a cmap format12. Does not yet build the
+    actual table.
+
+ src/hb-ot-cmap-table.hh | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+commit 59c658c8d53481990fe0efa66422353d0687474b
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 8 19:22:47 2018 -0800
+
+    capture codepoints sorted so we can use them for cmap later. one
+    day we will have a map
+
+ src/hb-ot-cmap-table.hh | 14 ---------
+ src/hb-private.hh       | 61 +++++++++++++++++++++++++---------------
+ src/hb-subset-glyf.cc   | 16 +++++------
+ src/hb-subset-plan.cc   | 75
+ ++++++++++++++++++++++++++++++++++---------------
+ src/hb-subset-plan.hh   |  8 ++++--
+ src/hb-subset.cc        | 29 ++++++++++++-------
+ 6 files changed, 123 insertions(+), 80 deletions(-)
+
+commit 8431c38cdc05ddcddb1aa5fbb72a95446b500fd2
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 8 19:20:58 2018 -0800
+
+    remove output noise
+
+ util/hb-subset.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 5cca0c07afbe9ab4b28d333f6f853063ecd75aff
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 8 19:05:46 2018 -0800
+
+    fix comment
+
+ src/hb-open-file-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a19138e668e77a0c05da2ab065c5366c8359b377
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 8 19:03:41 2018 -0800
+
+    comment the serialization of table
+
+ src/hb-open-file-private.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 5a34114f9685680d4a8cdf85a8ac90172c5620d7
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 18:32:24 2018 -0800
+
+    Add an extra entry to the end of the loca table to identify the end
+    of the last glyph's data.
+
+ src/hb-subset-glyf.cc | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit aac7d962120aa137385324b33a173df4f19fd80b
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 18:18:16 2018 -0800
+
+    Apply per table subsetting while building the new face in hb_subset.
+
+ src/hb-subset-glyf.cc |   1 +
+ src/hb-subset.cc      | 105
+ ++++++++++++++++++++++++++++++--------------------
+ 2 files changed, 65 insertions(+), 41 deletions(-)
+
+commit 3e81832432a1cae0dc28242bb6ff279753effd27
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 15:55:12 2018 -0800
+
+    Disable subset tests on cmake for now.
+
+ test/subset/CMakeLists.txt | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 2f941053111d60433ab39cc70edd69c962896961
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 15:55:12 2018 -0800
+
+    Disable subset tests on cmake for now.
+
+ test/subset/CMakeLists.txt | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit e081c9e8fc84843740c8a55b49403acc3fe4f0b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 17:44:24 2018 -0600
+
+    Oops!
+
+ test/subset/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1c49afe179e7e1884ceeae1d93e50fa51f18f894
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 17:38:58 2018 -0600
+
+    Whitespace
+
+ test/subset/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9682ef135f16cb3368b9c5970fdcec71301b687e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 17:35:57 2018 -0600
+
+    Minor fixups
+
+ CMakeLists.txt              | 2 +-
+ src/hb-ot-cmap-table.hh     | 6 +++---
+ src/hb-subset.cc            | 6 +++---
+ test/api/hb-test.h          | 5 +++++
+ test/api/test-subset-glyf.c | 4 ----
+ test/api/test-subset.c      | 4 ----
+ 6 files changed, 12 insertions(+), 15 deletions(-)
+
+commit 35eeb893efcdfa2bf6a136cd2911d564334e573c
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 15:17:34 2018 -0800
+
+    Don't include subset headers in libharfbuzz.
+
+ CMakeLists.txt | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 42234424a0fc43d298be082b4c7b1e288e94bbb6
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 15:11:15 2018 -0800
+
+    Fix include gaurds and include order in hb-subset-glyf and
+    hb-subset-plan
+
+ src/hb-subset-glyf.hh | 6 ++++--
+ src/hb-subset-plan.cc | 2 +-
+ src/hb-subset-plan.hh | 5 +++--
+ 3 files changed, 8 insertions(+), 5 deletions(-)
+
+commit 0f3c756cbfe8a263ee388481acac7a24d9684c44
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 14:59:32 2018 -0800
+
+    Add CMake config for building a separate harfbuzz-subset.
+
+ CMakeLists.txt          | 17 ++++++++++++++---
+ test/api/CMakeLists.txt |  2 +-
+ 2 files changed, 15 insertions(+), 4 deletions(-)
+
+commit d4d120ad79ff65c6987ca127da5d9ee30740b0b1
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 14:26:18 2018 -0800
+
+    Skip subset to fonttools comparison test if TTX is not present.
+
+ test/subset/run-tests.py | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 29d915284e46fb9be01221a88c9e969080daa1b2
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 11:31:27 2018 -0800
+
+    Whitespace
+
+ test/subset/run-tests.py | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit f9420d9effcfb3464d4b99e54decb3d90e4a410d
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 11:30:36 2018 -0800
+
+    In the hb-subset to fontTools comparison, use ttx to compare the
+    fonts. This allows for some binary differences such as re-ordered
+    tables.
+
+ test/subset/run-tests.py | 21 ++++++++++++++-------
+ 1 file changed, 14 insertions(+), 7 deletions(-)
+
+commit 8e9fd6f1ab491519cf7205467bc5d20056fce99d
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 19:01:21 2018 -0800
+
+    Implement basic loca (long version only) subsetting.
+
+ src/hb-subset-glyf.cc | 66
+ +++++++++++++++++++++++++++++++++++----------------
+ 1 file changed, 46 insertions(+), 20 deletions(-)
+
+commit f9c665fed1347f7af6d36ba129f9d174f4ac54dc
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 16:53:18 2018 -0800
+
+    Update interface to hb-subset-glyf to subset glyf and loca.
+
+ src/hb-subset-glyf.cc | 10 +++++++---
+ src/hb-subset-glyf.hh |  7 ++++---
+ src/hb-subset.cc      |  7 +++++--
+ 3 files changed, 16 insertions(+), 8 deletions(-)
+
+commit f2ceb5ee4d745e0e6e754f0b0ea16b29dbedbf1b
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 16:47:31 2018 -0800
+
+    Comment out failing assert in test-subset-glyf for now. Should be
+    re-enabled once hb_subset is writing out a new face.
+
+ test/api/test-subset-glyf.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 89dbebd4ad948ddad8e10323315a809c11d7cafa
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 16:32:56 2018 -0800
+
+    Add a basic test for glyf subsetting.
+
+ test/api/Makefile.am                  |   4 +
+ test/api/fonts/Roboto-Regular.abc.ttf | Bin 0 -> 2460 bytes
+ test/api/fonts/Roboto-Regular.ac.ttf  | Bin 0 -> 2268 bytes
+ test/api/test-subset-glyf.c           | 134
+ ++++++++++++++++++++++++++++++++++
+ 4 files changed, 138 insertions(+)
+
+commit 217ed5e3c885532fa8b332cc0d0f9cb4eef32e2b
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 16:30:07 2018 -0800
+
+    Cleanups in hb-subset-glyf and hb-subset-plan.
+
+ src/hb-subset-glyf.cc | 30 +++++++++++++++---------------
+ src/hb-subset-plan.hh |  2 +-
+ 2 files changed, 16 insertions(+), 16 deletions(-)
+
+commit 13193a9b97302480cc11787787fa6826a97be4bb
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 7 16:09:52 2018 -0800
+
+    move to the hb_face_t dest pattern
+
+ src/hb-ot-cmap-table.hh |  7 ++++++-
+ src/hb-subset.cc        | 28 +++++++++++++---------------
+ 2 files changed, 19 insertions(+), 16 deletions(-)
+
+commit 0859a006695097c2a66a07284f3cc5b8de8edb05
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 7 15:59:36 2018 -0800
+
+    sketch a subset<T> and call it for cmap. Add subset to cmap, albeit
+    not working even for the msot basic case just yet
+
+ src/hb-ot-cmap-table.hh | 18 ++++++++++++++++--
+ src/hb-subset.cc        | 30 ++++++++++++++++++++++++++++++
+ 2 files changed, 46 insertions(+), 2 deletions(-)
+
+commit c1ab95dd907b1c4a2e2de17447683fe803fe4087
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 17:22:07 2018 -0600
+
+    Fix overflow in space fallback shaping
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=657466
+
+ src/hb-ot-shape-fallback.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b220b5a44425db387b2149c4904a43ab369a2d6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 17:14:52 2018 -0600
+
+    Avoid undefined-behavior in fallback mark positioning
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=5584
+
+ src/hb-ot-shape-fallback.cc | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 3b68a03a1c5a23adbc73f4508009dd5b72bc9d81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 17:00:37 2018 -0600
+
+    [fuzzer] Minor
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 194140d3f352b53b95757cccb7fff50425747cd6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 16:27:57 2018 -0600
+
+    [util] Minor
+
+ util/hb-subset.cc |  2 +-
+ util/options.hh   | 10 ++++++++--
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+commit 5021ba2a2186a77d7d70be5602b960d14634d8b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 15:11:28 2018 -0600
+
+    [aat] Minor
+
+ src/hb-aat-layout-common-private.hh | 10 +++++-----
+ src/hb-aat-layout-morx-table.hh     |  7 +++----
+ 2 files changed, 8 insertions(+), 9 deletions(-)
+
+commit 1242ad8424f5e8357fe6fd2143430aa8cfaf0954
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 14:10:01 2018 -0600
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   2 ++
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   2 ++
+ .../text-rendering-tests/fonts/TestMORXTwentyfive.ttf    | Bin 0 ->
+ 3260 bytes
+ .../text-rendering-tests/fonts/TestMORXTwentysix.ttf     | Bin 0 ->
+ 3260 bytes
+ .../data/text-rendering-tests/tests/MORX-25.tests        |   9 +++++++++
+ .../data/text-rendering-tests/tests/MORX-26.tests        |   2 ++
+ 6 files changed, 15 insertions(+)
+
+commit 77ad8b5c8b3a9148cf2944abdd494618e642ee2c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 21:54:33 2018 -0600
+
+    TODO
+
+ src/hb-open-file-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 941bbd9f257367f838e55d079751c6059974fe2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 21:49:01 2018 -0600
+
+    [subset] Fix thinko
+
+ src/hb-open-file-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 931f8b7eb5e740ce81e5be6bfec60dbe3ac7ebc4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 21:42:03 2018 -0600
+
+    Fix another thinko
+
+ src/hb-open-file-private.hh | 2 +-
+ src/hb-private.hh           | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 39b86695cf56736170c772424c9a8b75bca0254c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 21:37:03 2018 -0600
+
+    [subset] Fix thinko
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit eeffabc87572193a9e95f22647e80ae44e5a0089
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 21:34:05 2018 -0600
+
+    Build
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c479a59988b0cf3e557e22e97e1977962c803fa7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 21:13:10 2018 -0600
+
+    [subset] Assemble font
+
+ src/hb-open-file-private.hh | 50
+ +++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-open-type-private.hh | 33 +++++++++++++++++++++++------
+ src/hb-ot-map-private.hh    | 10 ++++-----
+ src/hb-private.hh           | 20 +++++++++++-------
+ src/hb-set-private.hh       |  8 +++----
+ src/hb-subset.cc            | 51
+ +++++++++++++++++++++++++++++++++++++++------
+ test/api/test-subset.c      |  9 ++++++--
+ 7 files changed, 150 insertions(+), 31 deletions(-)
+
+commit 34ac3548b7c9dbc57f277cf9a7a337cd1a8a04bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 18:07:45 2018 -0600
+
+    [set] Respect stride
+
+    Ouch!
+
+ src/hb-set-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 577becaf7b5ccd9de8ba533447f944427b9e4452
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 17:38:40 2018 -0600
+
+    [subset] Fixup
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c9acab3cfbe4a21e86ad309ebb452f103b1c1b04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 17:12:55 2018 -0600
+
+    Whitespace
+
+ src/hb-open-file-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 7fd0b61dee18380c302009f8be9cd68dadab7308
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 16:44:52 2018 -0600
+
+    [subset] Create new face and copy all tables to it
+
+    test-subset fails now because subset-face does not know how to
+    compile itself.
+
+ src/hb-subset.cc | 37 ++++++++++++++++++++++++++-----------
+ 1 file changed, 26 insertions(+), 11 deletions(-)
+
+commit 4e1abe2ce0b5163cbbbb8f8be0e9f7deba5ab2cb
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 13:28:11 2018 -0800
+
+    Refactor subset glyf to remove multiple calls to glyf.fini()
+
+ src/hb-subset-glyf.cc | 52
+ +++++++++++++++++++++++++++++----------------------
+ 1 file changed, 30 insertions(+), 22 deletions(-)
+
+commit 0a5d1440f829f07454592adde9dd3aa93ad74442
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 13:09:54 2018 -0800
+
+    Add implementation of glyf subsetting.
+
+ src/hb-subset-glyf.cc | 81
+ +++++++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 76 insertions(+), 5 deletions(-)
+
+commit 05d65baa1bb64664ba838993fd35f3899d52eb8d
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 10:55:30 2018 -0800
+
+    Extract glyf offset calculation into it's own method.
+
+ src/hb-ot-glyf-table.hh | 26 ++++++++++++++++++--------
+ 1 file changed, 18 insertions(+), 8 deletions(-)
+
+commit 6d7c6e19dc769cf9997b7c1f8a4598eb44ca0b3c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 14:09:56 2018 -0600
+
+    Fix two undefined-behavior issues
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/761
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/762
+
+ src/hb-ot-hmtx-table.hh              |  4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 10 +++++-----
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit b87cbe2bec1d589621ba143af59443f63230ffeb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 14:11:26 2018 -0500
+
+    Try fixing build for platforms that have no visibility attributes
+
+ src/hb-private.hh | 1 +
+ src/hb-subset.cc  | 2 ++
+ src/main.cc       | 2 ++
+ 3 files changed, 5 insertions(+)
+
+commit f70100417c71cff071c119607a7b75dcead05a05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 13:58:23 2018 -0500
+
+    [test] Minor
+
+ test/api/test-ot-tag.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6804b61d2e49fcf9eac9fa0b86497ba91b220bee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 13:47:35 2018 -0500
+
+    [subset] Add hb_subset_face
+
+    It's a hb_face_t that has add_table() and in the future knows how to
+    compile itself into a font blob.
+
+ src/hb-private.hh |  9 ++++++
+ src/hb-subset.cc  | 88
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 97 insertions(+)
+
+commit af02812fc51812a7e2265a1100bbca1a5bf8af45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 13:07:46 2018 -0500
+
+    [subset] Change hb_subset API to remove hb_subset_face_t
+
+ src/hb-subset-plan.cc    | 12 ++++++++---
+ src/hb-subset-plan.hh    |  2 +-
+ src/hb-subset-private.hh | 10 ----------
+ src/hb-subset.cc         | 52
+ ++++++++----------------------------------------
+ src/hb-subset.h          | 25 ++++++-----------------
+ test/api/test-subset.c   |  9 +++++----
+ util/hb-subset.cc        | 12 ++++++-----
+ 7 files changed, 36 insertions(+), 86 deletions(-)
+
+commit 2da0d87e769b2ced71e4281e336bdbca65de2b3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 12:44:35 2018 -0500
+
+    Remove NullPool visibility hack
+
+    We keep a separate private NullPool in libharfbuzz-subset.so
+    This can fire back later since now there are two separate null
+    objects,
+    and comparisons to the null pool can be confused.  Something to deal
+    with when it comes up. Ouch!
+
+ src/hb-open-type-private.hh | 4 +---
+ src/hb-subset.cc            | 4 ++++
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit b95aa204ee284c47e63dc1e34b3c5b4bdf9e7ab7
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 7 09:37:06 2018 -0800
+
+    glyph ids to retain should most likely keep the glyph id not the
+    codepoint
+
+ src/hb-subset-plan.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 91428713bd6975b3bbfbdce54701f6aef5457121
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 7 09:35:59 2018 -0800
+
+    Remove \ns leftover from fprintf
+
+ src/hb-subset-plan.cc | 4 ++--
+ src/hb-subset.cc      | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit eb485bb9e90017abaf7dcdd7e39a82125d6807c3
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 7 09:32:36 2018 -0800
+
+    Horrid hack to assign new gids. Use DEBUG_MSG over fprintf
+
+ src/hb-subset-plan.cc | 27 +++++++++++++++++++++++----
+ src/hb-subset-plan.hh |  5 +++++
+ src/hb-subset.cc      |  9 +++++++++
+ 3 files changed, 37 insertions(+), 4 deletions(-)
+
+commit 8b80cbb1dd13e2870a956825f5dafc4419b44200
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 7 09:31:31 2018 -0800
+
+    Add a subset debug category
+
+ src/hb-debug.hh | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit ee433d36fa544c3138718cc3f796b29e6df8a195
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 12:30:18 2018 -0500
+
+    [aat] Set debug lookup_index
+
+ src/hb-aat-layout-common-private.hh | 2 ++
+ src/hb-aat-layout-morx-table.hh     | 3 +++
+ 2 files changed, 5 insertions(+)
+
+commit 38df1ec8e0b457be9140c67e2c5c19153714d90e
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 7 07:58:58 2018 -0800
+
+    TEMPORARY: remove HB_INTERNAL from null pool so subset builds again
+
+ src/hb-open-type-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 53aa0e95420c5c3bfe8af21cf7956535d35b06e6
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 6 17:05:22 2018 -0800
+
+    Add an instance of glyf::accelerator_t to hb-subset-glyf.
+
+ src/hb-subset-glyf.cc | 13 ++++++++++---
+ src/hb-subset-glyf.hh |  2 +-
+ src/hb-subset.cc      |  4 +---
+ 3 files changed, 12 insertions(+), 7 deletions(-)
+
+commit ef62dfed3fc7cfad7f7ce9292cb3bd1616f09384
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Feb 6 17:12:17 2018 -0800
+
+    add back assert_pod
+
+ src/hb-subset-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d0ce3c66e2af2785203f7bbb1d4abca5c226045d
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Feb 6 16:58:35 2018 -0800
+
+    Resolve codepoints:glyph ids. Does not compile; undefined reference
+    to OT::_hb_NullPool
+
+ src/hb-subset-plan.cc    | 25 +++++++++++++++++++------
+ src/hb-subset-plan.hh    |  2 +-
+ src/hb-subset-private.hh | 17 +++++++++++++++--
+ src/hb-subset.cc         | 13 ++++---------
+ 4 files changed, 39 insertions(+), 18 deletions(-)
+
+commit 6a45e5df24ccc59c5a39bf42323c9b550f49e16d
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 6 16:04:09 2018 -0800
+
+    Add skeleton of hb-subset-glyf, call if from hb_subset(...)
+
+ src/Makefile.sources  |  2 ++
+ src/hb-subset-glyf.cc | 45 +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset-glyf.hh | 37 +++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc      | 18 ++++++++++++++++--
+ 4 files changed, 100 insertions(+), 2 deletions(-)
+
+commit 31ec3c2ec41161c6ae75bc91d1c237bf2d245e37
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 6 15:37:34 2018 -0800
+
+    Create a subset plan in hb_subset.
+
+ src/hb-subset.cc | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 6c52d94fd11915b76e858bc45633ee60b8c1d8f4
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Feb 6 15:31:14 2018 -0800
+
+    capture the set of codepoints passed by --unicodes
+
+ util/hb-subset.cc | 17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
+
+commit 25e9173fe8446735f7e36ec963c7d3554c85631b
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 17:26:25 2018 -0800
+
+    Make hb-subset-plan private.
+
+ src/Makefile.sources                        |  2 +-
+ src/hb-subset-plan.cc                       | 27
+ ++++++++++++++++-----------
+ src/{hb-subset-plan.h => hb-subset-plan.hh} | 22 +++++++++++++---------
+ 3 files changed, 30 insertions(+), 21 deletions(-)
+
+commit af46a4da5a47dd6e0dd98e1740f18e93c337e689
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 17:14:46 2018 -0800
+
+    Move definition of hb_subset_input into hb-subset-private.hh.
+
+ src/Makefile.sources     |  1 +
+ src/hb-subset-plan.cc    |  2 +-
+ src/hb-subset-private.hh | 40 ++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc         | 12 ++----------
+ 4 files changed, 44 insertions(+), 11 deletions(-)
+
+commit 7481f0ce21489d2b19b2e33d05358736ddee20bf
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 16:05:12 2018 -0800
+
+    Add codepoints to subset input.
+
+ src/hb-subset.cc       | 24 ++++++++++++++++--------
+ src/hb-subset.h        |  2 +-
+ test/api/test-subset.c |  2 +-
+ util/hb-subset.cc      |  2 +-
+ 4 files changed, 19 insertions(+), 11 deletions(-)
+
+commit 1cfe650f020cf440bf157daa9907bffd6e35bd7a
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 15:22:30 2018 -0800
+
+    Add a basic sketch of hb-subset-plan.
+
+ src/Makefile.sources  |  2 ++
+ src/hb-subset-plan.cc | 72
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset-plan.h  | 49 +++++++++++++++++++++++++++++++++++
+ 3 files changed, 123 insertions(+)
+
+commit 126ffdbe95020c04dc61413690febd8a56bf264f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 12:26:41 2018 -0500
+
+    [aat] Fix debug compile
+
+ src/hb-aat-layout-common-private.hh | 6 +++++-
+ src/hb-aat-layout-morx-table.hh     | 2 +-
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 8cb8bfd5b5eff75247cd447f3766294fdff2d644
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 6 20:40:42 2018 +0330
+
+    [test] Fix test-subset on old distros (#758)
+
+    https://developer.gnome.org/glib/stable/glib-Testing.html#g-assert-cmpmem
+
+ test/api/test-subset.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 2971e9da49d6ac07f8a9a4e9b00e167b800a5c7f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 6 11:48:04 2018 -0500
+
+    [aat] Adjust unsafe-to-break logic some more
+
+    I believe I'm happy with it now.
+
+ src/hb-aat-layout-common-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit f49256d80f19bc265e6a197719345313ba26f9d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 6 11:39:36 2018 -0500
+
+    [aat] Simplify unsafe-to-break logic
+
+ src/hb-aat-layout-common-private.hh | 11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+commit cc1e0840baed881f2bfd8468a9645bfe94f47303
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 6 10:20:48 2018 -0500
+
+    [buffer] Tweak diff re glyph_flags again
+
+    We expect the buffer to have no flags that the reference doesn't...
+    Meh. Makes MORX tests pass now. Need to better define the behavior.
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d49ae5154e0b069ffa2605ea3f66abb583319ec8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 6 13:48:10 2018 +0330
+
+    Fix hb-buffer logic error
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 70e13ade81a2a09e17d75bdc7e3fe45d8ec9e2c6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 6 13:20:38 2018 +0330
+
+    [subset] Fix Windows issue on endlines (#756)
+
+ util/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f41b92134a276716b7e2d7ef54996b30f36a10a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 5 19:51:09 2018 -0500
+
+    Fix fallthrough compiler warning with gcc >= 7
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/755
+
+ src/hb-private.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit b7b7f0ac59ec85b224e13d9e6c3c4063e731ad32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 5 19:40:31 2018 -0500
+
+    [test] Minor
+
+ test/api/Makefile.am | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 0ff007daaa471d05cc0473beec4ba4d434b084b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 20:22:07 2018 -0500
+
+    [subset] Minor
+
+ src/hb-subset.h | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit fc1e82a5aef410138381bc8f5476dcff5679b464
+Merge: ae39fc81 2ea22893
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 15:35:13 2018 -0800
+
+    Merge pull request #754 from googlefonts/master
+
+    Fix build for subsetting code.
+
+commit 2ea228935d41b55fed45b7423b69bc15b42e3abc
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 15:10:01 2018 -0800
+
+    ssize_t -> size_t
+
+ util/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c25898eb54217e2a1c681233a6b9adcd7940652e
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 14:35:32 2018 -0800
+
+    Switch to fopen() instead of open() in subset test. open wasn't
+    compiling on windows.
+
+ util/hb-subset.cc | 13 ++++++-------
+ 1 file changed, 6 insertions(+), 7 deletions(-)
+
+commit fc04f11ce1999da042a39c5b271351223033292f
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 11:12:33 2018 -0800
+
+    Rename HB_SUBSET_sources -> HB_SUBSET_CLI_sources to match what
+    cmake is looking for.
+
+ util/Makefile.am      | 3 +--
+ util/Makefile.sources | 2 +-
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit e428f7b1c21e0a7d6b9af507d98031b8eebcbeb5
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 10:24:16 2018 -0800
+
+    Wrap unistd.h include in ifdef.
+
+ util/hb-subset.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5f6eb1256fb6c251303d3728fc27875fe7a9ffb8
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 10:23:38 2018 -0800
+
+    Add libharfbuzz-subset.la to linking when building api tests.
+
+ test/api/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ae39fc8171b2c26d4ae64954a8055732c9241bcc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 20:18:52 2018 -0500
+
+    [subset] Build hb-subset into separate libharfbuzz-subset.so
+
+ src/Makefile.am           | 19 +++++++++++++------
+ src/harfbuzz-subset.pc.in | 12 ++++++++++++
+ util/Makefile.am          |  2 ++
+ 3 files changed, 27 insertions(+), 6 deletions(-)
+
+commit eac20e459564134e0087497ed76b1c84195ad7e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 20:08:50 2018 -0500
+
+    [subset] Minor
+
+ util/Makefile.am      |  2 +-
+ util/Makefile.sources |  2 +-
+ util/hb-subset.cc     | 10 +++++-----
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 257022b1789f928975b04b5d214bbe9192e11997
+Merge: 3615f344 edcd3b80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 20:01:35 2018 -0500
+
+    Merge pull request #745 from googlefonts/master
+
+    Interface for hb_subset, skeleton for the hb-subset cli, and basic
+    testing rigging.
+
+commit 3615f344ec00059972d8ce75522022b5294764a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 17:19:58 2018 -0500
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   1 +
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   3 ++-
+ .../text-rendering-tests/fonts/TestMORXTwentythree.ttf   | Bin 0 ->
+ 1836 bytes
+ .../data/text-rendering-tests/tests/MORX-23.tests        |   1 +
+ 4 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 54e6efadd6a30587736858d3fb497ed4e5e5f252
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 14:58:02 2018 -0500
+
+    [aat] Fix unsafe-to-break
+
+    At any position, if state is not zero, mark unsafe-to-break before,
+    unless we can reason it safe.
+
+    At any position, if there's an action entry for end-of-text, mark
+    unsafe to break.
+
+    Also changes buffer diff impl to allow for flag differences as long
+    as the buffer glyph flags are superset of reference glyph flags.
+
+    With this, all MORX tests pass.
+
+ src/hb-aat-layout-common-private.hh | 31 +++++++++++++++++++++++++------
+ src/hb-aat-layout-morx-table.hh     | 35
+ +++++++++++++++++++++++------------
+ src/hb-buffer.cc                    |  2 +-
+ 3 files changed, 49 insertions(+), 19 deletions(-)
+
+commit edcd3b80e9617ec8c4c4a55536938fb510b6aeba
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Sun Feb 4 12:31:24 2018 -0800
+
+    Actually call hb_subset
+
+ util/hb-subset.cc | 51
+ ++++++++++++++++++++++++++++++++++-----------------
+ 1 file changed, 34 insertions(+), 17 deletions(-)
+
+commit 7b01761adef6f64f1139b30c985aa5f52314073a
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 2 17:54:11 2018 -0800
+
+    Add CMakeLists.txt to dist files for subset test.
+
+ test/subset/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f83a43b56134188c2e1f3496d40ec0cd9109f250
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 2 17:50:45 2018 -0800
+
+    Add CMake configuration for all of the new subsetting code.
+
+ CMakeLists.txt             | 14 ++++++++++++++
+ src/Makefile.sources       |  9 +++++++--
+ test/CMakeLists.txt        |  1 +
+ test/subset/CMakeLists.txt |  9 +++++++++
+ util/Makefile.am           |  2 +-
+ util/Makefile.sources      |  2 +-
+ 6 files changed, 33 insertions(+), 4 deletions(-)
+
+commit 5bc0cda179bca452145d4523eeba415986edb6e3
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 2 17:49:14 2018 -0800
+
+    Add missing unistd header to hb-subset.
+
+ util/hb-subset.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 06fe297f2a9fc6ee98179ddd26ef089b7fdb9e74
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 1 18:36:15 2018 -0800
+
+    Properly include subset test data files.
+
+ test/subset/data/Makefile.am | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 058b1260ad1105d0d8d6bf21f8f65a336e735bd2
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 1 18:22:14 2018 -0800
+
+    Re-write hb-subset utility to use main-font-text driver.
+
+ test/subset/run-tests.py |  15 +++---
+ util/Makefile.sources    |   3 ++
+ util/hb-subset.cc        | 131
+ +++++++++++++++++++++++++----------------------
+ 3 files changed, 82 insertions(+), 67 deletions(-)
+
+commit ede84ffa426edb950c4ec4f89833c85475a1c64f
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 1 17:17:36 2018 -0800
+
+    Whitespace
+
+ util/hb-subset.cc | 36 ++++++++++++++++++------------------
+ 1 file changed, 18 insertions(+), 18 deletions(-)
+
+commit 2763a2c5982c0db072697abe8ba01342d5977237
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 1 17:14:51 2018 -0800
+
+    Include subset test files in distribution.
+
+ test/subset/Makefile.am      | 7 ++++++-
+ test/subset/data/Makefile.am | 7 +++++++
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit 34fa7b3ad23b544b0914bc6002d60525224c68e1
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 1 16:50:18 2018 -0800
+
+    Whitespace
+
+ src/hb-subset.h | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 8c3a6727377895f18e1b5c7076404d8aede17176
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jan 31 15:43:24 2018 -0800
+
+    Get test-subset to pass.
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 74d39ed2639857d5f1a90d9c0d864227a6482b40
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jan 31 15:20:52 2018 -0800
+
+    Attach add a hb_face_t to hb_subset_face_t.
+
+ src/hb-subset.cc | 17 +++++++++++++----
+ 1 file changed, 13 insertions(+), 4 deletions(-)
+
+commit 76b84c36b9560e132918adb4c0c5a0d9bdfb0978
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jan 31 14:53:28 2018 -0800
+
+    Whitespace
+
+ test/api/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a2965f2ea5428c19be54f998ef9152c5ff6975ea
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jan 31 14:53:09 2018 -0800
+
+    Add a basic implementation of hb-subset to enable compilation of
+    test-subset.
+
+ src/hb-subset.cc       | 146
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.h        |   5 +-
+ test/api/Makefile.am   |   1 +
+ test/api/test-subset.c |  12 ++--
+ 4 files changed, 156 insertions(+), 8 deletions(-)
+
+commit 38af23b8df1a84f24d379d27d1a1e20f9ce07f34
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jan 31 11:32:23 2018 -0800
+
+    Make the expected output for subsetting basics test be equal to the
+    input file for now.
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1996 ->
+ 2460 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit b59c08eb045db2b6c952de81510b8159a4f72fb1
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jan 31 11:14:53 2018 -0800
+
+    Add the beginning of a unit test for hb-subset
+
+ test/api/test-subset.c | 67
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 67 insertions(+)
+
+commit e9d154ac8ddd2712a34c53c95a17e469f95e5b30
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Jan 30 19:27:11 2018 -0800
+
+    tweak test failure output. write to a temp file not stdout. test
+    still fails because expected is not just an identical copy of input
+
+ test/subset/run-tests.py | 41 +++++++++++++++++++++++++++----------
+ util/hb-subset.cc        | 53
+ +++++++++++++++++++++++++++++++++---------------
+ 2 files changed, 67 insertions(+), 27 deletions(-)
+
+commit cf403e1a53381f293aceac5cdbe031bbb2a7af77
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jan 30 18:40:23 2018 -0800
+
+    Add hb-subset.h to hb.h
+
+ src/hb.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c02573516c05ac97acb243ef5dec26af86086ded
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jan 30 18:39:41 2018 -0800
+
+    Fix typo in hb-subset.h
+
+ src/hb-subset.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 76351518ca9bc88aa6fbc975e1e35bd86432d652
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jan 30 14:03:16 2018 -0800
+
+    Remove basic subset test from XFAIL
+
+ test/subset/data/Makefile.sources | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit b029b7c19a733a2a39860238ad300e6c4a3f7802
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Jan 29 13:31:49 2018 -0800
+
+    Whitespace
+
+ test/subset/data/Makefile.sources | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0853260e997aded264f42bb369d4fcb39cccb7d6
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Jan 29 13:30:02 2018 -0800
+
+    Configure automake to run the new subset tests.
+
+ configure.ac                                        |  2 ++
+ test/Makefile.am                                    |  2 +-
+ test/subset/Makefile.am                             | 16 ++++++++++++++++
+ test/subset/data/Makefile.am                        | 16 ++++++++++++++++
+ test/subset/data/Makefile.sources                   | 10 ++++++++++
+ test/subset/data/tests/{basics.txt => basics.tests} |  0
+ 6 files changed, 45 insertions(+), 1 deletion(-)
+
+commit 5c63c37b2b5aba8bf2f8ff35b7da0d116ebfe8b5
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jan 26 16:57:42 2018 -0800
+
+    WIP test runner for subset tests.
+
+ test/subset/run-tests.py | 64
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 64 insertions(+)
+
+commit cc46cd88a1b84b02694fa6d88c4286e93336f096
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jan 26 14:25:39 2018 -0800
+
+    In generate-expected-outputs read the test definition with utf8
+    encoding.
+
+ test/subset/generate-expected-outputs.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 4cdae914e2e2fff1ff91e2f42648a8acb82a5494
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jan 26 13:57:48 2018 -0800
+
+    Add basic directory structure for subsetter integration tests. Plus
+    a utility for generating expected output files.
+
+ .../basics/Roboto-Regular.abc.default.62.ttf       | Bin 0 -> 1996 bytes
+ test/subset/data/fonts/Roboto-Regular.abc.ttf      | Bin 0 -> 2460 bytes
+ test/subset/data/profiles/default.txt              |   0
+ test/subset/data/tests/basics.txt                  |   8 ++
+ test/subset/generate-expected-outputs.py           |  40 ++++++++++
+ test/subset/subset_test_suite.py                   |  82
+ +++++++++++++++++++++
+ 6 files changed, 130 insertions(+)
+
+commit 9ccb8366f603a9e4a7a3c3f96420a19d4f6fb390
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Jan 17 22:09:07 2018 -0800
+
+    Start to sketch APIs for subsetting
+
+ src/Makefile.am       |  2 ++
+ src/Makefile.sources  |  4 +++
+ src/hb-subset.cc      |  0
+ src/hb-subset.h       | 88
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ util/Makefile.am      |  3 ++
+ util/Makefile.sources |  4 +++
+ util/hb-subset.cc     | 61 +++++++++++++++++++++++++++++++++++
+ 7 files changed, 162 insertions(+)
+
+commit 89b1906d990658c763f35113c8978a5e21bffc22
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 14:45:02 2018 -0500
+
+    [aat] More adjustment to ContextualSubtable
+
+    See comment.
+
+    With this, MORX-20 passes if I turn --verify off.  Our unsafe-to-break
+    logic is currently broken in presence of end-of-text actions.  That's,
+    ugh, extra work to fix.  Let me try...
+
+ src/hb-aat-layout-morx-table.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 8be596f0b76543e19644c0b77c1bcf4d9e783c2b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 14:40:17 2018 -0500
+
+    [aat] In ContextualSubstitute, apply end-of-text action to last glyph
+
+ src/hb-aat-layout-morx-table.hh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit c0b1c7eb2eed67147adec3d2c9e02d01f279c8f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 14:19:41 2018 -0500
+
+    [aat] Remove unneeded check
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fcb8be1a385cb4432dc6064fba77939716d27a02
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 12:38:18 2018 -0500
+
+    [configure] Fix wording
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/741
+
+ configure.ac | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit aed32589af6d5fce3e68fe41865e258ea7eb2413
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 2 16:08:50 2018 -0500
+
+    [aat] In ContextualSubtable, mark mark after substituting mark
+
+    Fixes MORX-21.
+
+ src/hb-aat-layout-morx-table.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit fe5f9b1ae318939eaa23d0175a5eb7e1739177ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 2 15:53:25 2018 -0500
+
+    [aat] Fix ContextualSubtable sanitization
+
+    Fixes MORX-18, MORX-19, and MORX-22.
+
+ src/hb-aat-layout-morx-table.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit cf943f682bcdd73e3ad1f6108c1a1870b991d5e4
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sun Feb 4 12:05:12 2018 +0200
+
+    Correctly show documentation build status
+
+    Correctly show if building documentation is enabled or not in
+    configure
+    summary.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/741
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e8859fca3eafb5aab6d029563b31219ccca0d673
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Sun Feb 4 01:26:57 2018 +0700
+
+    Enable use of atexit() on macOS and related platforms.
+
+    The atexit() man page indicates that this is expected to behave
+    in the expected way on unloading of shared libraries.
+
+ src/hb-private.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit a89573770b4c0f9c444ad6499bec5dc022087a97
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Sun Feb 4 01:31:53 2018 +0700
+
+    Use nullptr, not NULL.
+
+ src/hb-aat-layout-common-private.hh | 2 +-
+ src/hb-buffer-deserialize-json.rl   | 4 ++--
+ src/hb-buffer-deserialize-text.rl   | 4 ++--
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 07885e65adf1d3cb324de99501f9867f1a2553f8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 3 12:53:48 2018 +0330
+
+    [cmake] unistd typo fix (#747)
+
+ CMakeLists.txt | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit ccb0367dae4cbb9c8215dbf20ac7f9acfba2fa14
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Feb 2 12:04:04 2018 -0500
+
+    Let VS1 follow U+1031 MYANMAR VOWEL SIGN E
+
+ src/hb-ot-shape-complex-myanmar-machine.rl               |   2 +-
+ src/hb-ot-shape-complex-myanmar.cc                       |   5 +++++
+ test/shaping/README.md                                   |  10 +++++-----
+ test/shaping/data/in-house/Makefile.sources              |   1 +
+ .../fonts/af3086380b743099c54a3b11b96766039ea62fcd.ttf   | Bin 0 ->
+ 1536 bytes
+ test/shaping/data/in-house/tests/myanmar-syllable.tests  |   1 +
+ 6 files changed, 13 insertions(+), 6 deletions(-)
+
+commit c6dbf6e77cae30772ffa110c651cb4287ab3b0dc
+Author: punchcutter <zarijoscha@gmail.com>
+Date:   Wed Jan 31 14:09:04 2018 -0800
+
+    Allow optional ZWJ in virama terminated cluster
+
+ src/hb-ot-shape-complex-use-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dae20fb5a79caad9a4af14137a961b60fe256235
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Wed Jan 31 20:16:08 2018 +0700
+
+    Use nullptr instead of 0.
+
+ src/hb-coretext.cc           | 4 ++--
+ src/test-buffer-serialize.cc | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 90218fa93cf8b5d4b192be12d31aed92d271d09e
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Wed Jan 31 20:44:45 2018 +0700
+
+    Fix typos.
+
+ src/hb-blob.cc                     | 2 +-
+ src/hb-buffer-private.hh           | 2 +-
+ src/hb-common.cc                   | 2 +-
+ src/hb-coretext.cc                 | 2 +-
+ src/hb-directwrite.cc              | 2 +-
+ src/hb-ft.cc                       | 2 +-
+ src/hb-graphite2.cc                | 2 +-
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 8 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 148ca61075d821a09e42e2c75fbc9be47cfc6003
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Wed Jan 31 22:24:51 2018 +0700
+
+    [ot-layout] Fix nullptr dereference.
+
+    If the `calloc` for `gsub_accels` or `gpos_accels` fails, then the
+    unlikely branch afterwards can be taken, which frees up the
+    `hb_ot_layout_t`, but since those fields can now be `nullptr`, then
+    we don't want to dereference them.
+
+ src/hb-ot-layout.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 0c66043a924fd114017a862d2cacd70f64b92370
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Wed Jan 31 20:24:27 2018 +0700
+
+    [coretext] Fix memory leaks.
+
+    In `reference_table`, if the data is empty and we return early,
+    we still need to release the data object.
+
+    In `hb_coretext_shape`, there two edge cases where an early
+    return should release the attributed string.
+
+ src/hb-coretext.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit f0b700db394ccdff30ff83961a3e2ea9ff4ea472
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 30 11:16:51 2018 -0800
+
+    1.7.5
+
+ NEWS         | 9 +++++++++
+ configure.ac | 2 +-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 585b5760987e1ddd31e11fc55a2ce55ddb5b1663
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 30 11:51:56 2018 -0800
+
+    Fix distcheck
+
+ test/shaping/data/in-house/Makefile.am             | 2 +-
+ test/shaping/data/text-rendering-tests/Makefile.am | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit e89df6e1aee9cb6fe1268643ce19816808baf0c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 30 10:58:44 2018 -0800
+
+    [aat] Limit number of DontAdvance transitions
+
+    Remove the faulty loop-detection logic. Use max-ops for breaking
+    out of infinite loops or heavy work.
+
+    https://twitter.com/behdadesfahbod/status/958065026262183936
+
+ src/hb-aat-layout-common-private.hh | 33
+ ++-------------------------------
+ 1 file changed, 2 insertions(+), 31 deletions(-)
+
+commit e00743b47d25a2487b7f232a514a042e2962a089
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 29 10:07:05 2018 -0800
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   7 +++++++
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   7 +++++++
+ .../data/text-rendering-tests/fonts/TestMORXEighteen.ttf | Bin 0 ->
+ 3256 bytes
+ .../text-rendering-tests/fonts/TestMORXSeventeen.ttf     | Bin 0 ->
+ 1788 bytes
+ .../data/text-rendering-tests/fonts/TestMORXSixteen.ttf  | Bin 0 ->
+ 1812 bytes
+ .../data/text-rendering-tests/fonts/TestMORXTwenty.ttf   | Bin 0 ->
+ 3232 bytes
+ .../text-rendering-tests/fonts/TestMORXTwentyone.ttf     | Bin 0 ->
+ 3244 bytes
+ .../text-rendering-tests/fonts/TestMORXTwentytwo.ttf     | Bin 0 ->
+ 3256 bytes
+ .../data/text-rendering-tests/tests/MORX-14.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-16.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-17.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-18.tests        |   4 ++++
+ .../data/text-rendering-tests/tests/MORX-19.tests        |   2 ++
+ .../data/text-rendering-tests/tests/MORX-20.tests        |   7 +++++++
+ .../data/text-rendering-tests/tests/MORX-21.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-22.tests        |   1 +
+ 16 files changed, 32 insertions(+)
+
+commit 29d901286e632fa4de5ea198cc455cae56bc09a8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 30 10:01:46 2018 +0330
+
+    [cmake] Build src/ executables (#733)
+
+ CMakeLists.txt | 40 ++++++++++++++++++++++++++--------------
+ 1 file changed, 26 insertions(+), 14 deletions(-)
+
+commit 55cae0d72eecb5116008815b598481dd1404fc6a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 29 18:05:24 2018 +0330
+
+    [test] Use 'otool -L' where ldd doesn't exist (macOS) (#732)
+
+ src/check-libstdc++.sh | 13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
+
+commit 2ec7dd1f6cb78ee6a0621aa98f18500d3318c90c
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Sun Jan 28 17:48:28 2018 -0500
+
+    Fix Travis build on macOS (#731)
+
+ .travis.yml       | 2 +-
+ src/check-defs.sh | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 12757b692905062fe0fc266a6230238b3492abfd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 26 18:14:05 2018 -0800
+
+    Misc warning fixes
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/712
+
+ src/hb-ot-layout-gsubgpos-private.hh | 9 ++++-----
+ src/hb-ot-map-private.hh             | 1 -
+ src/hb-ot-map.cc                     | 5 ++---
+ 3 files changed, 6 insertions(+), 9 deletions(-)
+
+commit 85be365ed9238caf0283346ab4e5c5127096fc8a
+Author: bungeman <bungeman@chromium.org>
+Date:   Fri Jan 26 13:38:06 2018 -0500
+
+    Use KernSubTableFormat2::rightClassTable
+
+    Issue originally reported at http://cppfiles.com/chromium.txt .
+
+    This fixes what appears to be a copy - paste issue which causes both
+    KernSubTableFormat2::rightClassTable and the 'right' argument to
+    KernSubTableFormat2::get_kerning to go unused.
+
+ src/hb-ot-kern-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c41b7fc10588323b5d8c0007befa701994115f7b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 25 09:53:32 2018 +0330
+
+    [cmake] Use -fvisibility-inlines-hidden instead (#726)
+
+ CMakeLists.txt | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+commit 3d615766060e34a6e716c8737f651b6d6871ae85
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 22 21:23:19 2018 +0330
+
+    [cmake] fix symbol exporting issue on newer gcc (#724)
+
+ CMakeLists.txt | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 8b60e7c2c301a24906d591c80c42fd5e506072d2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 22 18:37:26 2018 +0330
+
+    [ci] minor, less hacks (#722)
+
+ .circleci/config.yml | 20 ++++++--------------
+ .travis.yml          |  8 ++++----
+ CMakeLists.txt       | 11 +++++++----
+ 3 files changed, 17 insertions(+), 22 deletions(-)
+
+commit aaf934de3b9e3447897b4da566655d6d0494e87b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 22 13:16:54 2018 +0330
+
+    [ci] minor (#721)
+
+ .circleci/config.yml | 4 ++--
+ .travis.yml          | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit bd752db733e3d8c2c8773d831aebdd8a5cbb5e04
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 22 13:08:35 2018 +0330
+
+    [ci] unbreak bots with outdated freetype version (#718)
+
+ .circleci/config.yml | 10 +++++++++-
+ .travis.yml          | 10 +++++++++-
+ 2 files changed, 18 insertions(+), 2 deletions(-)
+
+commit 19a93fcf1946ad29f07306a0b6c65377bdaa49f0
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Sun Jan 21 20:40:34 2018 +0700
+
+    Fix typos.
+
+ src/hb-blob.h   | 2 +-
+ src/hb-buffer.h | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 51ce3828e67a8ca7e4ea4b69e88c395e243bf01f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 19 18:36:39 2018 -0800
+
+    [aat] Fix Ligature matching
+
+    I hope... Makes "ffi" work with Zapfino. I'm not sure if doing it
+    correctly though...
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit bef509855c7a2c4400a947d2527d1dc048da1284
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 19 18:24:00 2018 -0800
+
+    [aat] Add TODO
+
+ src/hb-aat-layout-morx-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit e6f283ed7db6f8e2f8016dcbf07e589c40976aa6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 19 18:08:56 2018 -0800
+
+    [aat] Implement LigatureSubtable
+
+    We form the Zapfino ligature now. Yay! No further testing done.
+
+ src/hb-aat-layout-common-private.hh |  25 ++++++---
+ src/hb-aat-layout-morx-table.hh     | 108
+ +++++++++++++++++++++++++++++++++---
+ 2 files changed, 115 insertions(+), 18 deletions(-)
+
+commit f07ce661a2056965c573c99bdb721c065563ea7b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 19 16:52:01 2018 -0800
+
+    [aat] Embed a sanitizer context in hb_aat_apply_context_t
+
+    For run-time checking.
+
+ src/hb-aat-layout-common-private.hh | 22 ++++++++++++++++------
+ src/hb-aat-layout.cc                | 16 ++++++++--------
+ 2 files changed, 24 insertions(+), 14 deletions(-)
+
+commit 046690a4df0fdc93e3490210ef105f26057b1462
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 17 16:59:55 2018 -0800
+
+    [aat] Add hb_aat_apply_context_t
+
+ src/hb-aat-layout-common-private.hh | 23 +++++++++++++++++++++++
+ src/hb-aat-layout-morx-table.hh     | 27 +++++++++++++--------------
+ src/hb-aat-layout-private.hh        |  2 +-
+ src/hb-aat-layout.cc                |  8 +++++---
+ src/hb-ot-shape.cc                  |  3 +--
+ 5 files changed, 43 insertions(+), 20 deletions(-)
+
+commit fd034490942c06e31cfb42f32023c78734f8aeeb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 17 16:46:51 2018 -0800
+
+    Rename hb_apply_context_t to hb_ot_apply_context_t
+
+ src/hb-aat-layout-morx-table.hh            | 16 ++++-----
+ src/hb-aat-layout-private.hh               |  2 +-
+ src/hb-aat-layout.cc                       |  2 +-
+ src/hb-ot-layout-gpos-table.hh             | 48 ++++++++++++-------------
+ src/hb-ot-layout-gsub-table.hh             | 24 ++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh       | 58
+ +++++++++++++++---------------
+ src/hb-ot-layout-private.hh                |  4 +--
+ src/hb-ot-layout.cc                        | 16 ++++-----
+ src/hb-ot-shape-complex-arabic-fallback.hh |  2 +-
+ src/hb-ot-shape-fallback.cc                |  4 +--
+ src/hb-ot-shape.cc                         |  2 +-
+ 11 files changed, 89 insertions(+), 89 deletions(-)
+
+commit 94b49beee972fec98cbb80658df3d8491b45485d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 17 12:46:08 2018 -0800
+
+    Whitespace
+
+ src/hb-ot-head-table.hh | 20 +++++++++-----------
+ src/hb-ot-post-table.hh | 10 +++++-----
+ 2 files changed, 14 insertions(+), 16 deletions(-)
+
+commit e849b8a85bb66219db4d797d86ddd60ed7c26a2e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 19 16:12:24 2018 +0330
+
+    [cmake] Always put test/api/CMakeLists.txt on distributions
+
+ test/api/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit c8f2a4f5b99d3be3079286817386b4185d35a545
+Author: Cosimo Lupo <cosimo@anthrotype.com>
+Date:   Thu Jan 18 22:49:40 2018 +0100
+
+    hb-common.cc: Hatran script is right-to-left (#714)
+
+    "Hatran is written from right to left horizontally"
+
+    http://www.unicode.org/L2/L2012/12312-n4324-hatran.pdf
+
+    This ancient script was added with Unicode 8.0.
+
+    Also this spreadsheet (referenced in an inline comment in the
+    source code) has it as RTL: http://goo.gl/x9ilM
+
+ src/hb-common.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 00806149b9b591e4ec15996d3d56bdbd60687821
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 19 01:12:31 2018 +0330
+
+    Improve avoiding C++ linkage, definition creation and cmake tests
+    (#710)
+
+ .circleci/config.yml |  4 ++--
+ CMakeLists.txt       | 46 ++++++++++++++++++++++++++--------------------
+ configure.ac         |  3 +++
+ src/Makefile.am      | 11 ++---------
+ src/check-defs.sh    | 37 +++++++++++++++++++++++--------------
+ src/gen-def.py       | 16 ++++++++++++++++
+ 6 files changed, 72 insertions(+), 45 deletions(-)
+
+commit 9b693212a834a96252f4ebe0b006b85e9f35fc91
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Jan 18 16:34:13 2018 -0500
+
+    Update record-test.sh to the new directory layout (#716)
+
+ test/shaping/README.md      | 11 ++++++-----
+ test/shaping/record-test.sh | 17 +++++++++++++----
+ 2 files changed, 19 insertions(+), 9 deletions(-)
+
+commit 461a605fdec3361a038d3715adf615353c4f91fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 17 10:02:48 2018 -0800
+
+    [aat] Allocate set dynamically
+
+ src/hb-aat-layout-common-private.hh | 21 ++++++++++++---------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
+
+commit 4c4a9fc8617fed9bc1a7805c9aed294b4f6b66ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 17 09:47:50 2018 -0800
+
+    Typo
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/711
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 90f01bad637c8b1214f46d4df6d9552a6a728e29
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 16 22:00:21 2018 +0330
+
+    [cmake] don't link to libstdc++ (#707)
+
+ CMakeLists.txt | 38 +++++++++++++++++++++++++-------------
+ 1 file changed, 25 insertions(+), 13 deletions(-)
+
+commit 5e14e5f65d3dd1ed471ed73fab7e3207ae04e8fb
+Author: rdb <rdb@users.noreply.github.com>
+Date:   Tue Jan 16 17:04:33 2018 +0100
+
+    [cmake] Fix for CMake 3.0 and below (#706)
+
+ CMakeLists.txt | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit c97a7eca7f7b6fc1c50a4ac7fccf3fa2d777430e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 16 14:18:09 2018 +0330
+
+    [cmake] Fix symbols visibility and enable check-symbols.sh test (#705)
+
+ .circleci/config.yml |  2 +-
+ CMakeLists.txt       | 22 ++++++++++++++--------
+ 2 files changed, 15 insertions(+), 9 deletions(-)
+
+commit 60f84ef014f9280da24d5eb9ce833a7f37210242
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 15 20:46:58 2018 -0500
+
+    Disable MORX-13/14
+
+    Really, need better way to catch these :(.
+
+ test/shaping/data/text-rendering-tests/DISABLED         | 2 ++
+ test/shaping/data/text-rendering-tests/Makefile.sources | 4 ++--
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+commit 949f6af2897b8982c81a059ea98e1c29bbce4772
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 15 20:44:10 2018 -0500
+
+    Disallow sanitize recursing into Extension subtables multiple times
+
+    Fixes https://oss-fuzz.com/v2/testcase-detail/5216838347653120
+    which is a stack overflow, not by way of infinite recursion, just
+    being deep.  That's disallowed anyway, so catch it as it happens,
+    not afterwards.
+
+ src/hb-ot-layout-gsub-table.hh       | 5 ++---
+ src/hb-ot-layout-gsubgpos-private.hh | 4 +++-
+ 2 files changed, 5 insertions(+), 4 deletions(-)
+
+commit bcb6f1ae0a08e5c7af88a7affaad42a67c5adac5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 15 20:34:05 2018 -0500
+
+    Whitespace
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 12fffce10eb6ffebdedd655d0b1f10a99adf1808
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 15 15:41:51 2018 -0500
+
+    [aat] Sanitize classTable in StateTable
+
+ src/hb-aat-layout-common-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit e6263c7142ca22efd9a3c93353a513f475c1c48d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 15 15:37:55 2018 -0500
+
+    [aat] Wire up table length to apply()
+
+ src/hb-aat-layout-morx-table.hh | 17 +++++++++--------
+ src/hb-aat-layout.cc            | 20 +++++++++++++++-----
+ src/hb-open-type-private.hh     |  6 +++---
+ 3 files changed, 27 insertions(+), 16 deletions(-)
+
+commit 679ae744d07db7746a983ece54c22635a9dc3cff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 14 15:03:31 2018 -0500
+
+    [aat] Towards implementing LigatureSubtable
+
+ src/hb-aat-layout-morx-table.hh | 61
+ +++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 58 insertions(+), 3 deletions(-)
+
+commit c9e12a2b9b34d73d37def2261a5c1a7ef20b8349
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 13 17:05:12 2018 +0000
+
+    Fix set initializer
+
+ src/hb-set-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 54a1e250a839f030b43dbeba66cadc50ab5f90f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 13 14:44:39 2018 +0000
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   2 ++
+ .../data/text-rendering-tests/fonts/TestMORXFourteen.ttf | Bin 0 ->
+ 1816 bytes
+ .../data/text-rendering-tests/fonts/TestMORXThirteen.ttf | Bin 0 ->
+ 1820 bytes
+ .../data/text-rendering-tests/tests/MORX-13.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-14.tests        |   1 +
+ 5 files changed, 4 insertions(+)
+
+commit 9009b341c46caaa81deae8ea55e6f7dd98565f59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 12:04:53 2018 +0100
+
+    [aat] Fix some struct sizes
+
+    I hate it that with my compiler at least, it doesn't catch totally
+    uncompilable
+    statements in templates if they are not used...
+
+ src/hb-aat-layout-common-private.hh | 2 +-
+ src/hb-aat-layout-morx-table.hh     | 8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 57051b4f672d7d9dd10c45cc95b1e50e32cd42a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 11:42:25 2018 +0100
+
+    [aat] Flush rest of buffer if state machine failed
+
+ src/hb-aat-layout-common-private.hh | 12 +++++++++---
+ src/hb-aat-layout-morx-table.hh     |  2 ++
+ 2 files changed, 11 insertions(+), 3 deletions(-)
+
+commit 369dfab0f8b7f22338bbd7a58a27e2e02e1efc29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 11:37:01 2018 +0100
+
+    Minor
+
+ docs/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 25364c4f0020a66bd6f4bce1656ea47f1093396d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 11:31:20 2018 +0100
+
+    [aat] Fix symbol visibility
+
+    Not sure why only one of the bots sees this as visible...
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ee16b9d8d35af1e74369edf7b733886c4b743a68
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 11:28:09 2018 +0100
+
+    Revert accidental morx enablement
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 44f0ee346f53c51ec4abccc81cc24abf6f018e85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 11:27:51 2018 +0100
+
+    Fix docs
+
+ docs/harfbuzz-sections.txt | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit cdfa801ff4fe301d7bd41c9eee57cae75001ce4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 11:12:20 2018 +0100
+
+    [aat] Tweak previous commit
+
+ src/hb-aat-layout-common-private.hh | 2 ++
+ src/hb-ot-shape.cc                  | 4 ++--
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+commit f7600228a4b37e6f6b65394aceeeb14bf4133c23
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 11:09:21 2018 +0100
+
+    [aat] Detect infinite-loops in state machine
+
+ src/hb-aat-layout-common-private.hh | 36
+ +++++++++++++++++++++++++++++-------
+ 1 file changed, 29 insertions(+), 7 deletions(-)
+
+commit d514f1480cffb81850ef212155c66ee9e0383350
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 10:55:44 2018 +0100
+
+    [circleci] cat test logs on failure on autotools-based builds
+
+ .circleci/config.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1facef337862a0ceee9a8ac1d4dc94ff94fcb3b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 10:53:52 2018 +0100
+
+    [travis] On test failure, cat all .log files
+
+ .travis.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit cdd86bf3a28961e85a8918d77937587df313d47b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 10:51:51 2018 +0100
+
+    [travis] Update cat'ing test-suite.log files
+
+ .travis.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 22d8c765e7b556601173a3e70f5bc9f310263a98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 09:46:38 2018 +0100
+
+    Disable C++11
+
+    To better catch errors locally.
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dd38db523a1001178bf4cae3721c098466534736
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 09:45:42 2018 +0100
+
+    [aat] Fix more builds
+
+    Maybe I should disable C++11 detection such that my compiler also
+    catches
+    these.  Doesn't look like we can switch to it for a while anyway...
+
+ src/hb-aat-layout-common-private.hh |  2 +-
+ src/hb-aat-layout-morx-table.hh     | 18 +++++++++---------
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 72cb2b1f57ba79938c74e0406fc7457fce287f69
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 09:38:55 2018 +0100
+
+    [aat] Fix builds
+
+ src/hb-aat-layout-morx-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e3a15d0c6d088963e61f7fbebe25e1096d8e2903
+Author: Ting-Wei Lan <lantw@src.gnome.org>
+Date:   Fri Jan 12 15:33:16 2018 +0800
+
+    Update _POSIX_C_SOURCE to the latest version
+
+    Defining _POSIX_C_SOURCE to an old version on FreeBSD can cause C99 to
+    be disabled in libc.
+
+ src/hb-blob.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c70d58f97da7dcbdd7ea72a44f39130a75a279f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 00:08:22 2018 +0100
+
+    [aat] Port RearrangementSubtable to StateTableDriver
+
+ src/hb-aat-layout-morx-table.hh | 91
+ ++++++++++++++++++++---------------------
+ 1 file changed, 44 insertions(+), 47 deletions(-)
+
+commit 117cfe7bb7cef682eb151b94f1eb12363ba3af67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 00:01:36 2018 +0100
+
+    [aat] Add StateTableDriver and convert ContextualSubtable to it
+
+ src/hb-aat-layout-common-private.hh | 51 ++++++++++++++++++++
+ src/hb-aat-layout-morx-table.hh     | 93
+ ++++++++++++++++++-------------------
+ 2 files changed, 95 insertions(+), 49 deletions(-)
+
+commit 0d39ac224c680b1f0134b58e78391497fbe47370
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 22:47:08 2018 +0100
+
+    [test/text-rendering-tests] Update README
+
+ test/shaping/data/text-rendering-tests/README | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 17a66f133c7e523403b6c90b011fcf0acb6356c6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 22:46:19 2018 +0100
+
+    [test] Disable MORX-12
+
+    Ouch. I need a better workflow for this.
+
+ test/shaping/data/text-rendering-tests/Makefile.sources | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 1f1c85a54aad8a25a67041cbb9c4277d28c1c761
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 22:43:57 2018 +0100
+
+    [aat] Remove 'mort' support
+
+    It's dead, Jim!
+
+ src/hb-aat-layout-common-private.hh |  55 +++++-----------
+ src/hb-aat-layout-morx-table.hh     | 122
+ ++++++++++--------------------------
+ 2 files changed, 46 insertions(+), 131 deletions(-)
+
+commit 7e2fed6d73f89986e5777028cdcd24e3baf2f86c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 19:25:21 2018 +0100
+
+    [aat] Allow DontAdvance
+
+    Apparently CoreText does allow these.  To be done: detect infinite
+    loops.
+
+    Fixes MORX-12 test.
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1387fe8f9c474e88f86828733d4c01bd56f44432
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 19:22:37 2018 +0100
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   1 +
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   2 ++
+ .../data/text-rendering-tests/fonts/TestMORXTwelve.ttf   | Bin 0 ->
+ 2200 bytes
+ .../data/text-rendering-tests/tests/MORX-12.tests        |   3 +++
+ 4 files changed, 6 insertions(+)
+
+commit 17f01aff910b3871d0a6c45fd4305304b7f68ab5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 18:54:49 2018 +0100
+
+    [aat] Sanitize ContextualSubtable
+
+ src/hb-aat-layout-common-private.hh | 23 +++++++++++++++++++----
+ src/hb-aat-layout-morx-table.hh     | 34
+ ++++++++++++++++++++++++----------
+ 2 files changed, 43 insertions(+), 14 deletions(-)
+
+commit 9b82aa19d812e70b7fade4b7669a9ce27855951e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 18:19:42 2018 +0100
+
+    More warning fixes
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 680cbc2eb325edc6b8562f39485b146aa56b3872
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 18:15:53 2018 +0100
+
+    [aat] Sanitize StateTable
+
+ src/hb-aat-layout-common-private.hh | 43
+ ++++++++++++++++++++++++++++++++++---
+ 1 file changed, 40 insertions(+), 3 deletions(-)
+
+commit 0e3b3379a04a67a22e44e17d6bf849359f4fca68
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 18:01:10 2018 +0100
+
+    [aat] Actually fix d887f931485b715775e922516a4b0de5bb92c34f
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1eb98c9916c6cb447f999170840b7f37de4b282d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 17:59:03 2018 +0100
+
+    [test/text-rendering-tests] Actually disable MORX-11
+
+ test/shaping/data/text-rendering-tests/Makefile.sources | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3f291ffd5a9480ac0f528eaedd43c7e9af738ee2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 17:57:46 2018 +0100
+
+    [buffer] Fix compiler warnings
+
+    line 323: Warning: info hides hb_buffer_t::info
+    ...
+
+ src/hb-buffer-private.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit d887f931485b715775e922516a4b0de5bb92c34f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 17:41:34 2018 +0100
+
+    [aat] Make bots happy
+
+    Don't know why this is not caught by my compiler.  Looks like clang
+    catches it
+    while gcc doesn't.
+
+    In file included from ../src/hb-aat-layout-morx-table.hh:31:
+    ../src/hb-aat-layout-common-private.hh:523:30: error: no member named
+    'static_size' in 'AAT::ContextualSubtable<AAT::MorxTypes>::EntryData'
+      DEFINE_SIZE_STATIC (4 + T::static_size);
+                                ~~~^
+
+ src/hb-aat-layout-morx-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit f6be730994434e706cc27d68b796492d876e82b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 15:23:24 2018 +0100
+
+    [aat] In NoncontextualSubtable, handle MarkLast with end-of-line
+    transition
+
+    Fixes MORX-11 test.
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1d20d109a07bf9c775ab91dfbbb55f7bd80fd9d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 15:18:22 2018 +0100
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   3 ++-
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   3 ++-
+ .../data/text-rendering-tests/fonts/TestMORXEleven.ttf   | Bin 0 ->
+ 1624 bytes
+ .../data/text-rendering-tests/tests/MORX-11.tests        |   1 +
+ 4 files changed, 5 insertions(+), 2 deletions(-)
+
+commit f9be673814aeb2c8abab52a672598576c6ed20c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 15:15:07 2018 +0100
+
+    [aat] Implement ContextualSubtable
+
+    Tested with Zapfino and text "2nd". Sascha will create tests later.
+
+ src/hb-aat-layout-morx-table.hh | 70
+ ++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 66 insertions(+), 4 deletions(-)
+
+commit 335a9c1fe489db53549801b4996dd0f6f5eded62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 14:50:47 2018 +0100
+
+    [aat] Towards implementing ContextualSubtable
+
+ src/hb-aat-layout-common-private.hh | 58 ++++++++++++++++++++++--
+ src/hb-aat-layout-morx-table.hh     | 88
+ ++++++++++++++++++++++++++-----------
+ 2 files changed, 117 insertions(+), 29 deletions(-)
+
+commit 62348f647f7b1604e008dbed46a54eff245fc106
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 12:00:28 2018 +0100
+
+    [aat] Implement end-of-text in state machine
+
+    Passes MORX-10 test now.
+
+ src/hb-aat-layout-morx-table.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit fc405b7ca77088135cb7de11cb32c254b85272fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 11:55:29 2018 +0100
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   1 +
+ test/shaping/data/text-rendering-tests/Makefile.sources  |  11
+ ++++++-----
+ .../data/text-rendering-tests/fonts/TestMORXTen.ttf      | Bin 0 ->
+ 1620 bytes
+ .../data/text-rendering-tests/tests/MORX-10.tests        |   1 +
+ 4 files changed, 8 insertions(+), 5 deletions(-)
+
+commit 9adbd938fafe1de4e279489fc37ae33c900e22f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 11:55:10 2018 +0100
+
+    Minor
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4177f646aa60180f094e064a53e54c5402fe53c6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 11 15:43:23 2018 +0330
+
+    [cmake] Update and unbreak (#700)
+
+ test/shaping/CMakeLists.txt | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 94644d7ea4cf217e4d6c6ff57d65e1e20866ea6d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 11:49:07 2018 +0100
+
+    [aat] Generate finegrained unsafe-to-break in state-machine!
+
+    Neato.
+
+ src/hb-aat-layout-morx-table.hh | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 994eb7744c530bbaa5d6d8b8e07ca936e81aade8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 11:37:12 2018 +0100
+
+    [buffer] Fix crash
+
+ src/hb-buffer-serialize.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d6076747ac6706b4d8361714d46aced9683c44a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 10:51:46 2018 +0100
+
+    [test/text-rendering-tests] Add DISABLED list
+
+ test/shaping/data/text-rendering-tests/DISABLED | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+commit de02b5093c42a527ae67084b30943369ed59efe6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 10:48:42 2018 +0100
+
+    [test/in-house] Add Makefile.sources
+
+ test/shaping/data/in-house/Makefile.am      | 46
+ ++---------------------------
+ test/shaping/data/in-house/Makefile.sources | 46
+ +++++++++++++++++++++++++++++
+ 2 files changed, 48 insertions(+), 44 deletions(-)
+
+commit 7c32e01d04deaab511d41f5dec0dfd9fc0469f39
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 10:47:31 2018 +0100
+
+    Minor
+
+ src/Makefile.am                                  | 1 +
+ src/Makefile.sources                             | 2 --
+ test/shaping/data/text-rendering-tests/update.sh | 2 --
+ util/Makefile.am                                 | 1 +
+ util/Makefile.sources                            | 2 --
+ 5 files changed, 2 insertions(+), 6 deletions(-)
+
+commit a5adc5aa84c03184fd1c8a486be80ff0af1f448c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 10:30:22 2018 +0100
+
+    [test/text-rendering-tests] Update from upstream
+
+    Also adds an update.sh script that does this automatically.
+
+ test/shaping/data/text-rendering-tests/Makefile.am |  52
+ +++------------------
+ .../data/text-rendering-tests/Makefile.sources     |  51
+ ++++++++++++++++++++
+ .../text-rendering-tests/fonts/TestMORXEight.ttf   | Bin 0 -> 2184 bytes
+ .../text-rendering-tests/fonts/TestMORXNine.ttf    | Bin 0 -> 1624 bytes
+ .../data/text-rendering-tests/tests/MORX-5.tests   |  25 ++++++++++
+ .../data/text-rendering-tests/tests/MORX-6.tests   |   1 +
+ .../data/text-rendering-tests/tests/MORX-7.tests   |   1 +
+ .../data/text-rendering-tests/tests/MORX-8.tests   |   3 ++
+ .../data/text-rendering-tests/tests/MORX-9.tests   |   1 +
+ test/shaping/data/text-rendering-tests/update.sh   |  48
+ +++++++++++++++++++
+ 10 files changed, 136 insertions(+), 46 deletions(-)
+
+commit c861daacc4255d41d2358868b917277422949dc9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 10:11:01 2018 +0100
+
+    [test/text-rendering-tests] Add README and COPYING
+
+ test/shaping/data/text-rendering-tests/COPYING     | 13 +++++++++++++
+ test/shaping/data/text-rendering-tests/Makefile.am |  2 ++
+ test/shaping/data/text-rendering-tests/README      |  4 ++++
+ 3 files changed, 19 insertions(+)
+
+commit 14b4d84eef18bd54287c10ce44eaef4f642f6238
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 10:08:25 2018 +0100
+
+    [aat] Fix RearrangementSubtable action
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ea3e86c6401d41cf54d82692eccbf44c87be2fd5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 09:58:42 2018 +0100
+
+    Minor
+
+ test/shaping/data/Makefile.am                      | 4 ++++
+ test/shaping/data/in-house/Makefile.am             | 4 ++++
+ test/shaping/data/text-rendering-tests/Makefile.am | 4 ++++
+ 3 files changed, 12 insertions(+)
+
+commit 800e4ae80232f022404be155afd497b0421a6a64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 09:57:55 2018 +0100
+
+    [aat] Mark state-machine-based lookup as completely unsafe-to-break
+
+    To be improved later.
+
+ src/hb-aat-layout-morx-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ca42d961293a9e4dfd0817c1a02d454008583282
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 09:15:34 2018 +0100
+
+    [aat] Implement RearrangementSubtable
+
+ src/hb-aat-layout-common-private.hh |  89 ++++++++++++++++-
+ src/hb-aat-layout-morx-table.hh     | 192
+ +++++++++++++++++++++++++++++++-----
+ src/hb-open-type-private.hh         |   2 -
+ src/hb-private.hh                   |   7 +-
+ 4 files changed, 254 insertions(+), 36 deletions(-)
+
+commit 5dbbd0fdb9a343554112a846b392803f11c13197
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 11 12:33:22 2018 +0330
+
+    Move the #define of _GNU_SOURCE to the top of hb-private.hh (#697)
+
+    This fixes the build on Cygwin.
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 90e3c9e69e93e05d9fb534fd43b5c99cf58a7cb4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 11 12:31:05 2018 +0330
+
+    [cmake] Fix hb-blob test (#699)
+
+ CMakeLists.txt | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 1461965c2220cd957c26b3fe5835200e426bc715
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 11 08:48:22 2018 +0330
+
+    [test] Better tests output by converting stderr to stdout (#696)
+
+    https://gitlab.kitware.com/cmake/cmake/issues/17630
+
+ test/shaping/run-tests.py | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit ebb9b7d6335536804b50002fb83dd30da42a8ad5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 11 08:15:06 2018 +0330
+
+    [test] Print shaping output on CI fails (#695)
+
+ .circleci/config.yml      | 4 ++--
+ test/shaping/run-tests.py | 8 ++++----
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit e24bea8e91ba9f447f1f7f252bdefacef1f83593
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jan 10 23:51:56 2018 +0330
+
+    [cmake] Another try on making sure feature testing is working (#691)
+
+ .circleci/config.yml | 131
+ ++++++++++++++++++++++++++++-----------------------
+ CMakeLists.txt       |  17 ++++---
+ 2 files changed, 79 insertions(+), 69 deletions(-)
+
+commit 746a37d5bdd2e965aa316e95ba5a7bad809d76a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 16:47:47 2018 +0100
+
+    [util] Replace setlinebuf
+
+ util/options.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ff2083c53eecc67c011b96b0b9a58331043e53cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 13:54:36 2018 +0100
+
+    [util] Set stdio files to line buffering
+
+    So we can stream lines to hb-shape and read output.
+
+ util/options.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 80fd5743200cbe221ae3adf057fe0e5ef54a894c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 11:09:53 2018 +0100
+
+    [aat] Add Class subtable thingy
+
+    From old 'mort' table.
+
+ src/hb-aat-layout-common-private.hh | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit 71e0ed9cbad8438239dcedf1bcfa8e19b9dfdc89
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jan 10 15:45:12 2018 +0330
+
+    [cmake] Add header existence tests (#685)
+
+ .circleci/config.yml        |  4 ++--
+ CMakeLists.txt              | 53
+ ++++++++++++++++++++++++++++++---------------
+ test/shaping/CMakeLists.txt |  1 -
+ 3 files changed, 37 insertions(+), 21 deletions(-)
+
+commit a073621b5dc2865a014821307128a8fdd1d7d992
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jan 10 12:13:28 2018 +0330
+
+    [cmake] Fix tests against latest changes (#690)
+
+ test/shaping/CMakeLists.txt | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+commit 0b22da954142ad7a1e949a56448cee4e836fff75
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Jan 10 07:12:07 2018 +0200
+
+    Improve HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES docs
+
+    Add the note about absolute glyph positions from the commit message.
+
+ src/hb-buffer.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 6db0b17c4ce56bd7477941e7a2fc85997c04588e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 05:40:43 2018 +0100
+
+    [test] Move test handling to sundirectories
+
+ configure.ac                                       |  3 +
+ test/shaping/Makefile.am                           | 98
+ +---------------------
+ test/shaping/data/Makefile.am                      |  9 ++
+ test/shaping/data/in-house/Makefile.am             | 58 +++++++++++++
+ test/shaping/data/text-rendering-tests/Makefile.am | 60 +++++++++++++
+ 5 files changed, 131 insertions(+), 97 deletions(-)
+
+commit 4c982b4867707fcd2259b344b06e5bba8dd0c1e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 05:26:55 2018 +0100
+
+    [test] Whitelist one more passing test
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 188ee6e5eeef3c63c332cfa30795d37da1bc1682
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 05:13:47 2018 +0100
+
+    Calculate anchor positions in float, then round
+
+    Hoping to reduce rounding error, to make tests happier...
+    No luck.
+
+ src/hb-font-private.hh         |  6 ++++++
+ src/hb-ot-layout-gpos-table.hh | 44
+ +++++++++++++++++++++---------------------
+ 2 files changed, 28 insertions(+), 22 deletions(-)
+
+commit 0b28e1199d62765db4e855756b96022e423dcc17
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 05:02:42 2018 +0100
+
+    [test] Whitelist one more passing test
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7cdd6ab068500aa18de9a856bfbe730d0aac9a27
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 04:33:08 2018 +0100
+
+    Round, instead of floor, when applying variations
+
+    Hoping this would fix remaining text-rendering-tests failures,
+    but so far no luck.
+
+ src/hb-font-private.hh         | 2 +-
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-private.hh              | 1 +
+ 3 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 6dc6f0c9f844a006b4518ce789e319fcef6e9680
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 04:12:35 2018 +0100
+
+    [test] Whitelist one passing test
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ec939761e4d1b2f825db715290d70e18b1c9dd12
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:56:43 2018 +0100
+
+    Minor
+
+ test/shaping/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c4eac531dfad55f691557a684b3a6bde83c4bcea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:51:09 2018 +0100
+
+    Minor
+
+ test/shaping/Makefile.am | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 285a0bd799426c544d896f8fbcc27f4613a28e9a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:49:32 2018 +0100
+
+    [test] Another try
+
+    Making cmake happy this time.
+
+ test/shaping/Makefile.am | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 95b32b00557d6afcfc469f8dcc51d8bfa8243a00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:48:09 2018 +0100
+
+    [test] Fix text disabling
+
+    Ouch, make!
+
+ test/shaping/Makefile.am | 27 ++++++++++++++-------------
+ 1 file changed, 14 insertions(+), 13 deletions(-)
+
+commit a938d105b8d6e2d654079ea7d89e2e3ef5e0aed4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:41:55 2018 +0100
+
+    [test/text-rendering-tests] Disable failing tests
+
+ test/shaping/Makefile.am | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit ed95d5e374a10770eb305dfa43a9f5b39933aac7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:38:52 2018 +0100
+
+    [test/text-rendering-tests] Disable failing tests
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3b1e97f364e5ffdc08b52f889e3fea80a7e83e99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:35:20 2018 +0100
+
+    Add HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES
+
+    New API:
+    HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES
+    hb-shape / hb-view --remove-default-ignorables
+
+    One more text-rendering-tests test passing.  Eleven failing.
+
+ src/hb-buffer.h                                    | 17 ++++--
+ src/hb-ot-shape.cc                                 |  6 +-
+ .../data/text-rendering-tests/extract-tests.py     |  2 +-
+ .../data/text-rendering-tests/tests/AVAR-1.tests   | 34 +++++------
+ .../data/text-rendering-tests/tests/CFF-1.tests    | 26 ++++-----
+ .../data/text-rendering-tests/tests/CFF-2.tests    | 26 ++++-----
+ .../data/text-rendering-tests/tests/CFF2-1.tests   | 18 +++---
+ .../data/text-rendering-tests/tests/CMAP-1.tests   |  8 +--
+ .../data/text-rendering-tests/tests/CMAP-2.tests   |  4 +-
+ .../data/text-rendering-tests/tests/CMAP-3.tests   | 40 ++++++-------
+ .../data/text-rendering-tests/tests/CVAR-1.tests   |  6 +-
+ .../data/text-rendering-tests/tests/CVAR-2.tests   |  6 +-
+ .../data/text-rendering-tests/tests/GLYF-1.tests   |  2 +-
+ .../data/text-rendering-tests/tests/GPOS-1.tests   | 38 ++++++------
+ .../data/text-rendering-tests/tests/GPOS-2.tests   |  6 +-
+ .../data/text-rendering-tests/tests/GPOS-3.tests   |  8 +--
+ .../data/text-rendering-tests/tests/GPOS-4.tests   |  8 +--
+ .../data/text-rendering-tests/tests/GPOS-5.tests   | 10 ++--
+ .../data/text-rendering-tests/tests/GSUB-1.tests   |  2 +-
+ .../data/text-rendering-tests/tests/GSUB-2.tests   | 22 +++----
+ .../data/text-rendering-tests/tests/GVAR-1.tests   | 18 +++---
+ .../data/text-rendering-tests/tests/GVAR-2.tests   | 18 +++---
+ .../data/text-rendering-tests/tests/GVAR-3.tests   | 18 +++---
+ .../data/text-rendering-tests/tests/GVAR-4.tests   | 22 +++----
+ .../data/text-rendering-tests/tests/GVAR-5.tests   | 22 +++----
+ .../data/text-rendering-tests/tests/GVAR-6.tests   | 22 +++----
+ .../data/text-rendering-tests/tests/GVAR-7.tests   | 14 ++---
+ .../data/text-rendering-tests/tests/GVAR-8.tests   | 12 ++--
+ .../data/text-rendering-tests/tests/GVAR-9.tests   | 20 +++----
+ .../data/text-rendering-tests/tests/HVAR-1.tests   | 12 ++--
+ .../data/text-rendering-tests/tests/HVAR-2.tests   | 12 ++--
+ .../data/text-rendering-tests/tests/KERN-1.tests   |  2 +-
+ .../data/text-rendering-tests/tests/KERN-2.tests   |  2 +-
+ .../data/text-rendering-tests/tests/MORX-1.tests   |  2 +-
+ .../data/text-rendering-tests/tests/MORX-2.tests   | 32 +++++-----
+ .../data/text-rendering-tests/tests/MORX-3.tests   | 32 +++++-----
+ .../data/text-rendering-tests/tests/MORX-4.tests   | 30 +++++-----
+ .../data/text-rendering-tests/tests/SHARAN-1.tests | 12 ++--
+ .../data/text-rendering-tests/tests/SHBALI-1.tests | 44 +++++++-------
+ .../data/text-rendering-tests/tests/SHBALI-2.tests | 24 ++++----
+ .../data/text-rendering-tests/tests/SHBALI-3.tests | 18 +++---
+ .../data/text-rendering-tests/tests/SHKNDA-1.tests | 68
+ +++++++++++-----------
+ .../data/text-rendering-tests/tests/SHKNDA-2.tests | 32 +++++-----
+ .../data/text-rendering-tests/tests/SHKNDA-3.tests | 62
+ ++++++++++----------
+ util/options.cc                                    |  1 +
+ util/options.hh                                    | 14 +++--
+ 46 files changed, 435 insertions(+), 419 deletions(-)
+
+commit 46e4ed552fb1205eb6cbc16450bb231998fc7347
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:22:08 2018 +0100
+
+    [test/text-rendering-tests] Hook up font variations
+
+    Six more passing. Twelve failing now.
+
+ .../data/text-rendering-tests/extract-tests.py     |  6 +++-
+ .../data/text-rendering-tests/tests/AVAR-1.tests   | 34
+ +++++++++++-----------
+ .../data/text-rendering-tests/tests/CFF2-1.tests   | 18 ++++++------
+ .../data/text-rendering-tests/tests/CVAR-1.tests   |  6 ++--
+ .../data/text-rendering-tests/tests/CVAR-2.tests   |  6 ++--
+ .../data/text-rendering-tests/tests/GPOS-5.tests   | 10 +++----
+ .../data/text-rendering-tests/tests/GVAR-1.tests   | 18 ++++++------
+ .../data/text-rendering-tests/tests/GVAR-2.tests   | 18 ++++++------
+ .../data/text-rendering-tests/tests/GVAR-3.tests   | 18 ++++++------
+ .../data/text-rendering-tests/tests/GVAR-4.tests   | 22 +++++++-------
+ .../data/text-rendering-tests/tests/GVAR-5.tests   | 22 +++++++-------
+ .../data/text-rendering-tests/tests/GVAR-6.tests   | 22 +++++++-------
+ .../data/text-rendering-tests/tests/GVAR-7.tests   | 14 ++++-----
+ .../data/text-rendering-tests/tests/GVAR-8.tests   | 12 ++++----
+ .../data/text-rendering-tests/tests/GVAR-9.tests   | 20 ++++++-------
+ .../data/text-rendering-tests/tests/HVAR-1.tests   | 12 ++++----
+ .../data/text-rendering-tests/tests/HVAR-2.tests   | 12 ++++----
+ 17 files changed, 137 insertions(+), 133 deletions(-)
+
+commit 2b3f62fc4de8f10c2168f212b1368478312e6dec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:16:56 2018 +0100
+
+    [test] Add tests from text-rendering-tests repo
+
+    https://github.com/unicode-org/text-rendering-tests
+
+ test/shaping/Makefile.am                           |  44 ++++++++++++++-
+ .../fonts/AdobeVFPrototype-Subset.otf              | Bin 0 -> 7096 bytes
+ .../text-rendering-tests/fonts/FDArrayTest257.otf  | Bin 0 -> 145212
+ bytes
+ .../fonts/FDArrayTest65535.otf                     | Bin 0 -> 492740
+ bytes
+ .../fonts/NotoSansBalinese-Regular.ttf             | Bin 0 -> 32304 bytes
+ .../fonts/NotoSansKannada-Regular.ttf              | Bin 0 -> 83868 bytes
+ .../fonts/NotoSerifKannada-Regular.ttf             | Bin 0 -> 96936 bytes
+ .../text-rendering-tests/fonts/Selawik-README.md   |  60
+ +++++++++++++++++++++
+ .../fonts/Selawik-variable.ttf                     | Bin 0 -> 481504
+ bytes
+ .../data/text-rendering-tests/fonts/TestAVAR.ttf   | Bin 0 -> 1608 bytes
+ .../data/text-rendering-tests/fonts/TestCMAP14.otf | Bin 0 -> 1628 bytes
+ .../fonts/TestCMAPMacTurkish.ttf                   | Bin 0 -> 19644 bytes
+ .../text-rendering-tests/fonts/TestCVARGVAROne.ttf | Bin 0 -> 12336 bytes
+ .../text-rendering-tests/fonts/TestCVARGVARTwo.ttf | Bin 0 -> 12256 bytes
+ .../text-rendering-tests/fonts/TestGLYFOne.ttf     | Bin 0 -> 1516 bytes
+ .../text-rendering-tests/fonts/TestGPOSFour.ttf    | Bin 0 -> 315020
+ bytes
+ .../text-rendering-tests/fonts/TestGPOSOne.ttf     | Bin 0 -> 10384 bytes
+ .../text-rendering-tests/fonts/TestGPOSThree.ttf   | Bin 0 -> 3500 bytes
+ .../text-rendering-tests/fonts/TestGPOSTwo.otf     | Bin 0 -> 1680 bytes
+ .../text-rendering-tests/fonts/TestGSUBOne.otf     | Bin 0 -> 1788 bytes
+ .../text-rendering-tests/fonts/TestGVAREight.ttf   | Bin 0 -> 4692 bytes
+ .../text-rendering-tests/fonts/TestGVARFour.ttf    | Bin 0 -> 3204 bytes
+ .../text-rendering-tests/fonts/TestGVARNine.ttf    | Bin 0 -> 2168 bytes
+ .../text-rendering-tests/fonts/TestGVAROne.ttf     | Bin 0 -> 14312 bytes
+ .../text-rendering-tests/fonts/TestGVARThree.ttf   | Bin 0 -> 14336 bytes
+ .../text-rendering-tests/fonts/TestGVARTwo.ttf     | Bin 0 -> 15668 bytes
+ .../text-rendering-tests/fonts/TestHVAROne.otf     | Bin 0 -> 3984 bytes
+ .../text-rendering-tests/fonts/TestHVARTwo.ttf     | Bin 0 -> 4004 bytes
+ .../text-rendering-tests/fonts/TestKERNOne.otf     | Bin 0 -> 1380 bytes
+ .../text-rendering-tests/fonts/TestMORXFour.ttf    | Bin 0 -> 4764 bytes
+ .../text-rendering-tests/fonts/TestMORXOne.ttf     | Bin 0 -> 2404 bytes
+ .../text-rendering-tests/fonts/TestMORXThree.ttf   | Bin 0 -> 4104 bytes
+ .../text-rendering-tests/fonts/TestMORXTwo.ttf     | Bin 0 -> 4960 bytes
+ .../text-rendering-tests/fonts/TestShapeAran.ttf   | Bin 0 -> 116044
+ bytes
+ .../text-rendering-tests/fonts/TestShapeEthi.ttf   | Bin 0 -> 5292 bytes
+ .../data/text-rendering-tests/fonts/Zycon.ttf      | Bin 0 -> 21036 bytes
+ .../data/text-rendering-tests/tests/AVAR-1.tests   |  17 ++++++
+ .../data/text-rendering-tests/tests/CFF-1.tests    |  13 +++++
+ .../data/text-rendering-tests/tests/CFF-2.tests    |  13 +++++
+ .../data/text-rendering-tests/tests/CFF2-1.tests   |   9 ++++
+ .../data/text-rendering-tests/tests/CMAP-1.tests   |   4 ++
+ .../data/text-rendering-tests/tests/CMAP-2.tests   |   2 +
+ .../data/text-rendering-tests/tests/CMAP-3.tests   |  20 +++++++
+ .../data/text-rendering-tests/tests/CVAR-1.tests   |   3 ++
+ .../data/text-rendering-tests/tests/CVAR-2.tests   |   3 ++
+ .../data/text-rendering-tests/tests/GLYF-1.tests   |   1 +
+ .../data/text-rendering-tests/tests/GPOS-1.tests   |  19 +++++++
+ .../data/text-rendering-tests/tests/GPOS-2.tests   |   3 ++
+ .../data/text-rendering-tests/tests/GPOS-3.tests   |   4 ++
+ .../data/text-rendering-tests/tests/GPOS-4.tests   |   4 ++
+ .../data/text-rendering-tests/tests/GPOS-5.tests   |   5 ++
+ .../data/text-rendering-tests/tests/GSUB-1.tests   |   1 +
+ .../data/text-rendering-tests/tests/GSUB-2.tests   |  11 ++++
+ .../data/text-rendering-tests/tests/GVAR-1.tests   |   9 ++++
+ .../data/text-rendering-tests/tests/GVAR-2.tests   |   9 ++++
+ .../data/text-rendering-tests/tests/GVAR-3.tests   |   9 ++++
+ .../data/text-rendering-tests/tests/GVAR-4.tests   |  11 ++++
+ .../data/text-rendering-tests/tests/GVAR-5.tests   |  11 ++++
+ .../data/text-rendering-tests/tests/GVAR-6.tests   |  11 ++++
+ .../data/text-rendering-tests/tests/GVAR-7.tests   |   7 +++
+ .../data/text-rendering-tests/tests/GVAR-8.tests   |   6 +++
+ .../data/text-rendering-tests/tests/GVAR-9.tests   |  10 ++++
+ .../data/text-rendering-tests/tests/HVAR-1.tests   |   6 +++
+ .../data/text-rendering-tests/tests/HVAR-2.tests   |   6 +++
+ .../data/text-rendering-tests/tests/KERN-1.tests   |   1 +
+ .../data/text-rendering-tests/tests/KERN-2.tests   |   1 +
+ .../data/text-rendering-tests/tests/MORX-1.tests   |   1 +
+ .../data/text-rendering-tests/tests/MORX-2.tests   |  16 ++++++
+ .../data/text-rendering-tests/tests/MORX-3.tests   |  16 ++++++
+ .../data/text-rendering-tests/tests/MORX-4.tests   |  15 ++++++
+ .../data/text-rendering-tests/tests/SHARAN-1.tests |   6 +++
+ .../data/text-rendering-tests/tests/SHBALI-1.tests |  22 ++++++++
+ .../data/text-rendering-tests/tests/SHBALI-2.tests |  12 +++++
+ .../data/text-rendering-tests/tests/SHBALI-3.tests |   9 ++++
+ .../data/text-rendering-tests/tests/SHKNDA-1.tests |  34 ++++++++++++
+ .../data/text-rendering-tests/tests/SHKNDA-2.tests |  16 ++++++
+ .../data/text-rendering-tests/tests/SHKNDA-3.tests |  31 +++++++++++
+ 77 files changed, 510 insertions(+), 1 deletion(-)
+
+commit 6b19178ee35fec3b2115d6a06a86db36dc838b38
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:07:30 2018 +0100
+
+    Prefix int types with HB
+
+    Such a headache that Windows defines UINT8, ...; Just prefix it.
+
+ src/hb-aat-layout-common-private.hh  |  29 +++---
+ src/hb-aat-layout-morx-table.hh      |  65 +++++++------
+ src/hb-open-file-private.hh          |   6 +-
+ src/hb-open-type-private.hh          |  70 +++++++-------
+ src/hb-ot-cbdt-table.hh              |  78 ++++++++--------
+ src/hb-ot-cmap-table.hh              |  90 +++++++++---------
+ src/hb-ot-glyf-table.hh              |  10 +-
+ src/hb-ot-head-table.hh              |  28 +++---
+ src/hb-ot-hhea-table.hh              |  18 ++--
+ src/hb-ot-kern-table.hh              |  36 ++++----
+ src/hb-ot-layout-common-private.hh   | 120 ++++++++++++------------
+ src/hb-ot-layout-gdef-table.hh       |  22 ++---
+ src/hb-ot-layout-gpos-table.hh       |  94 +++++++++----------
+ src/hb-ot-layout-gsub-table.hh       |  30 +++---
+ src/hb-ot-layout-gsubgpos-private.hh | 172
+ +++++++++++++++++------------------
+ src/hb-ot-math-table.hh              |  26 +++---
+ src/hb-ot-maxp-table.hh              |   2 +-
+ src/hb-ot-name-table.hh              |  16 ++--
+ src/hb-ot-os2-table.hh               |  70 +++++++-------
+ src/hb-ot-post-table.hh              |  16 ++--
+ src/hb-ot-var-avar-table.hh          |   4 +-
+ src/hb-ot-var-fvar-table.hh          |  20 ++--
+ src/hb-ot-var-hvar-table.hh          |   8 +-
+ src/hb-ot-var-mvar-table.hh          |  10 +-
+ 24 files changed, 517 insertions(+), 523 deletions(-)
+
+commit 81e321c802afcc43186737e6900f8d7e2f9d4fd3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 02:56:29 2018 +0100
+
+    [aat] Try fixing VC bots
+
+    c:\projects\harfbuzz\src\hb-aat-layout-common-private.hh(51):
+    error C2872: 'UINT16': ambiguous symbol
+    [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
+    C:\Program Files (x86)\Windows
+    Kits\10\Include\10.0.14393.0\shared\basetsd.h(80): note: could be
+    'unsigned short UINT16'
+    c:\projects\harfbuzz\src\hb-open-type-private.hh(648): note: or
+    'OT::UINT16'
+
+ src/hb-aat-layout-common-private.hh | 3 +++
+ src/hb-aat-layout-morx-table.hh     | 3 +++
+ 2 files changed, 6 insertions(+)
+
+commit 0ed69c946247feb5bbb5be06d5314c5e0c0fec67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 02:49:36 2018 +0100
+
+    Disable processing of morx table in ot shaper
+
+    So I can merge this to master...
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3f29ea91441b2e8c86cf379b4803f638a2e8dcfc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 02:48:04 2018 +0100
+
+    [util] Add hb-shape --ned
+
+    For not displaying extra data: no clusters, no advance. Just data
+    pertaining
+    to where glyphs end up on the screen.
+
+ test/shaping/data/text-rendering-tests/extract-tests.py |  2 +-
+ util/options.cc                                         | 13
+ +++++++++++++
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit 7020130665316365c288d0960fc288faa8f5bdf7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 02:37:39 2018 +0100
+
+    [test] Minor
+
+ test/shaping/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5f94b4cc39f2f61b38c954ddac1aae6a052845bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 02:35:59 2018 +0100
+
+    [kern] Mark unsafe-to-break
+
+ src/hb-ot-shape-fallback.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 71fd6325b6cba2586709022dd33530c61141bf8f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 02:20:14 2018 +0100
+
+    Add option to buffer serialization to not output glyph advances
+
+    When advances are not printed, glyph offsets reflect absolute glyph
+    positions.
+
+    New API:
+    HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES
+    hb-shape --no-advances
+
+ src/hb-buffer-serialize.cc | 38 ++++++++++++++++++++++++++++----------
+ src/hb-buffer.h            |  5 ++++-
+ util/hb-shape.cc           |  2 ++
+ util/options.cc            |  2 ++
+ util/options.hh            |  2 ++
+ 5 files changed, 38 insertions(+), 11 deletions(-)
+
+commit 316a28f8f8a9c459936ce9f2786d4d64a8f4e2c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 01:54:12 2018 +0100
+
+    [test] Add script for extracting tests from text-rendering-tests
+
+    Work in progress...
+
+    https://github.com/unicode-org/text-rendering-tests
+
+ .../data/text-rendering-tests/extract-tests.py     | 45
+ ++++++++++++++++++++++
+ 1 file changed, 45 insertions(+)
+
+commit 6b4d63f295f419f55983a8fc72f582802f55b09f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 01:13:36 2018 +0100
+
+    [test] Minor
+
+ test/shaping/run-tests.py | 9 ---------
+ 1 file changed, 9 deletions(-)
+
+commit 504f913654d5904604e6abdbf7d0653f40db51fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 23:15:54 2018 +0100
+
+    [test] Simplify test runner
+
+    Always pass hb-shape as first argument to run-tests.py.
+
+    Also require automake 1.13.
+
+ configure.ac              |  3 +--
+ test/shaping/Makefile.am  | 18 ++----------------
+ test/shaping/run-tests.py | 22 +++++-----------------
+ 3 files changed, 8 insertions(+), 35 deletions(-)
+
+commit 141db8b7a3abf2adbf0caa0659d9239396f6a2db
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 23:11:00 2018 +0100
+
+    [test] Minor
+
+ test/shaping/Makefile.am  | 4 ----
+ test/shaping/run-tests.py | 4 ++--
+ 2 files changed, 2 insertions(+), 6 deletions(-)
+
+commit 44c65eee28e2de5c54028cb0ef144f56da16ef58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 21:58:57 2018 +0100
+
+    [test] Reorganize test suite
+
+    In anticipation of importing more test suites.
+
+ test/fuzzing/run-fuzzer-tests.py                   |   2 +-
+ test/shaping/Makefile.am                           |  86
+ +++++++++---------
+ test/shaping/{fonts => data/in-house}/COPYING      |   7 +-
+ .../0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf   | Bin
+ .../051d92f8bc6ff724511b296c27623f824de256e9.ttf   | Bin
+ .../074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf   | Bin
+ .../07f054357ff8638bac3711b422a1e31180bba863.ttf   | Bin
+ .../15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf   | Bin
+ .../1735326da89f0818cd8c51a0600e9789812c0f94.ttf   | Bin
+ .../191826b9643e3f124d865d617ae609db6a2ce203.ttf   | Bin
+ .../1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf   | Bin
+ .../1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf   | Bin
+ .../1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf   | Bin
+ .../1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf   | Bin
+ .../1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf   | Bin
+ .../205edd09bd3d141cc9580f650109556cc28b22cb.ttf   | Bin
+ .../217a934cfe15c548b572c203dceb2befdf026462.ttf   | Bin
+ .../21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf   | Bin
+ .../226bc2deab3846f1a682085f70c67d0421014144.ttf   | Bin
+ .../243798dd281c1c77c065958e1ff467420faa9bde.ttf   | Bin
+ .../24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf   | Bin
+ .../270b89df543a7e48e206a2d830c0e10e5265c630.ttf   | Bin
+ .../298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf   | Bin
+ .../2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf   | Bin
+ .../341421e629668b1a1242245d39238ca48432d35d.ttf   | Bin
+ .../3493e92eaded2661cadde752a39f9d58b11f0326.ttf   | Bin
+ .../3511ff5c1647150595846ac414c595cccac34f18.ttf   | Bin
+ .../37033cc5cf37bb223d7355153016b6ccece93b28.ttf   | Bin
+ .../373e67bf41ca264e260a9716162b71a23549e885.ttf   | Bin
+ .../375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf   | Bin
+ .../3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf   | Bin
+ .../3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf   | Bin
+ .../43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf   | Bin
+ .../43ef465752be9af900745f72fe29cb853a1401a5.ttf   | Bin
+ .../45855bc8d46332b39c4ab9e2ee1a26b1f896da6b.ttf   | Bin
+ .../49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf   | Bin
+ .../4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf   | Bin
+ .../4fac3929fc3332834e93673780ec0fe94342d193.ttf   | Bin
+ .../5028afb650b1bb718ed2131e872fbcce57828fff.ttf   | Bin
+ .../53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf   | Bin
+ .../54674a3111d209fb6be0ed31745314b7a8d2c244.ttf   | Bin
+ .../558661aa659912f4d30ecd27bd09835171a8e2b0.ttf   | Bin
+ .../55c88ebbe938680b08f92c3de20713183e0c7481.ttf   | Bin
+ .../56cfd0e18d07f41c38e9598545a6d369127fc6f9.ttf   | Bin
+ .../57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf   | Bin
+ .../59a585a63b3df608fbeef00956c8c108deec7de6.ttf   | Bin
+ .../5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf   | Bin
+ .../5dfad7735c6a67085f1b90d4d497e32907db4c78.ttf   | Bin
+ .../641bd9db850193064d17575053ae2bf8ec149ddc.ttf   | Bin
+ .../663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf   | Bin
+ .../6991b13ce889466be6de3f66e891de2bc0f117ee.ttf   | Bin
+ .../6ff0fbead4462d9f229167b4e6839eceb8465058.ttf   | Bin
+ .../706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf   | Bin
+ .../757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf   | Bin
+ .../7a37dc4d5bf018456aea291cee06daf004c0221c.ttf   | Bin
+ .../7e14e7883ed152baa158b80e207b66114c823a8b.ttf   | Bin
+ .../8099955657a54e9ee38a6ba1d6f950ce58e3cc25.ttf   | Bin
+ .../813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf   | Bin
+ .../81c368a33816fb20e9f647e8f24e2180f4720263.ttf   | Bin
+ .../8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf   | Bin
+ .../8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf   | Bin
+ .../82f4f3b57bb55344e72e70231380202a52af5805.ttf   | Bin
+ .../8454d22037f892e76614e1645d066689a0200e61.ttf   | Bin
+ .../85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf   | Bin
+ .../856ff9562451293cbeff6f396d4e3877c4f0a436.ttf   | Bin
+ .../85fe0be440c64ac77699e21c2f1bd933a919167e.ttf   | Bin
+ .../87f85d17d26f1fe9ad28d7365101958edaefb967.ttf   | Bin
+ .../8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf   | Bin
+ .../94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf   | Bin
+ .../96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf   | Bin
+ .../98b7887cff91f722b92a8ff800120954606354f9.ttf   | Bin
+ .../9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf   | Bin
+ .../a014549f766436cf55b2ceb40e462038938ee899.ttf   | Bin
+ .../a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf   | Bin
+ .../a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf   | Bin
+ .../a34a9191d9376bda419836effeef7e75c1386016.ttf   | Bin
+ .../a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf   | Bin
+ .../a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf   | Bin
+ .../a919b33197965846f21074b24e30250d67277bce.ttf   | Bin
+ .../a98e908e2ed21b22228ea59ebcc0f05034c86f2e.ttf   | Bin
+ .../b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf   | Bin
+ .../b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf   | Bin
+ .../b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf   | Bin
+ .../bb0c53752e85c3d28973ebc913287b8987d3dfe8.ttf   | Bin
+ .../bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf   | Bin
+ .../bb9473d2403488714043bcfb946c9f78b86ad627.ttf   | Bin
+ .../bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf   | Bin
+ .../bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf   | Bin
+ .../bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf   | Bin
+ .../c4e48b0886ef460f532fb49f00047ec92c432ec0.ttf   | Bin
+ .../cc5f3d2d717fb6bd4dfae1c16d48a2cb8e12233b.ttf   | Bin
+ .../d23d76ea0909c14972796937ba072b5a40c1e257.ttf   | Bin
+ .../d629e7fedc0b350222d7987345fe61613fa3929a.ttf   | Bin
+ .../d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf   | Bin
+ .../dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf   | Bin
+ .../df768b9c257e0c9c35786c47cae15c46571d56be.ttf   | Bin
+ .../e207635780b42f898d58654b65098763e340f5c7.ttf   | Bin
+ .../e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf   | Bin
+ .../e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf   | Bin
+ .../ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf   | Bin
+ .../ef2511f215aa3ca847cbfffbf861793b42170875.ttf   | Bin
+ .../ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf   | Bin
+ .../f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf   | Bin
+ .../f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf   | Bin
+ .../f499fbc23865022234775c43503bba2e63978fe1.ttf   | Bin
+ .../f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf   | Bin
+ .../f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf   | Bin
+ .../fab39d60d758cb586db5a504f218442cd1395725.ttf   | Bin
+ .../fbb6c84c9e1fe0c39e152fbe845e51fd81f6748e.ttf   | Bin
+ .../fcdcffbdf1c4c97c05308d7600e4c283eb47dbca.ttf   | Bin
+ .../ffa0f5d2d9025486d8469d8b1fdd983e7632499b.ttf   | Bin
+ .../in-house/tests/arabic-fallback-shaping.tests   |   1 +
+ .../data/in-house/tests/arabic-feature-order.tests |   4 +
+ .../data/in-house/tests/arabic-like-joining.tests  |   1 +
+ .../data/in-house/tests/arabic-mark-order.tests    |   6 ++
+ test/shaping/data/in-house/tests/arabic-stch.tests |   1 +
+ .../data/in-house/tests/automatic-fractions.tests  |   3 +
+ test/shaping/data/in-house/tests/cluster.tests     |   2 +
+ test/shaping/data/in-house/tests/color-fonts.tests |   1 +
+ .../data/in-house/tests/context-matching.tests     |   3 +
+ .../data/in-house/tests/cursive-positioning.tests  |   4 +
+ .../data/in-house/tests/default-ignorables.tests   |   2 +
+ .../data/in-house/tests/emoji-flag-tags.tests      |   2 +
+ .../data/in-house/tests/fallback-positioning.tests |   2 +
+ test/shaping/data/in-house/tests/fuzzed.tests      |  22 +++++
+ test/shaping/data/in-house/tests/hangul-jamo.tests |   2 +
+ test/shaping/data/in-house/tests/hyphens.tests     |   2 +
+ .../tests/indic-consonant-with-stacker.tests       |   4 +
+ test/shaping/data/in-house/tests/indic-init.tests  |   1 +
+ .../in-house/tests/indic-joiner-candrabindu.tests  |   2 +
+ .../data/in-house/tests/indic-joiners.tests        |   2 +
+ .../data/in-house/tests/indic-old-spec.tests       |   2 +
+ .../data/in-house/tests/indic-pref-blocking.tests  |   2 +
+ .../in-house/tests/indic-script-extensions.tests   |   2 +
+ .../data/in-house/tests/indic-special-cases.tests  |   3 +
+ .../data/in-house/tests/indic-syllable.tests       |   8 ++
+ .../data/in-house/tests/language-tags.tests        |  12 +++
+ test/shaping/data/in-house/tests/ligature-id.tests |  36 ++++++++
+ .../data/in-house/tests/mark-attachment.tests      |   1 +
+ .../data/in-house/tests/mark-filtering-sets.tests  |   5 ++
+ .../tests/mongolian-variation-selector.tests       |   4 +
+ test/shaping/data/in-house/tests/simple.tests      |   2 +
+ test/shaping/data/in-house/tests/spaces.tests      |  17 ++++
+ .../in-house/tests/tibetan-contractions-1.tests    |  60 +++++++++++++
+ .../in-house/tests/tibetan-contractions-2.tests    |  53 +++++++++++
+ .../data/in-house/tests/tibetan-vowels.tests       |  11 +++
+ test/shaping/data/in-house/tests/use-marchen.tests |  35 ++++++++
+ .../shaping/data/in-house/tests/use-syllable.tests |   7 ++
+ test/shaping/data/in-house/tests/use.tests         |   4 +
+ .../data/in-house/tests/variations-rvrn.tests      | 100
+ +++++++++++++++++++++
+ test/shaping/data/in-house/tests/vertical.tests    |   3 +
+ .../data/in-house/tests/zero-width-marks.tests     |  11 +++
+ test/shaping/run-tests.py                          |  48 ++++------
+ .../tests/misc/arabic-fallback-shaping.tests       |   1 -
+ test/shaping/tests/misc/arabic-feature-order.tests |   4 -
+ test/shaping/tests/misc/arabic-like-joining.tests  |   1 -
+ test/shaping/tests/misc/arabic-mark-order.tests    |   6 --
+ test/shaping/tests/misc/arabic-stch.tests          |   1 -
+ test/shaping/tests/misc/automatic-fractions.tests  |   3 -
+ test/shaping/tests/misc/cluster.tests              |   2 -
+ test/shaping/tests/misc/color-fonts.tests          |   1 -
+ test/shaping/tests/misc/context-matching.tests     |   3 -
+ test/shaping/tests/misc/cursive-positioning.tests  |   4 -
+ test/shaping/tests/misc/default-ignorables.tests   |   2 -
+ test/shaping/tests/misc/emoji-flag-tags.tests      |   2 -
+ test/shaping/tests/misc/fallback-positioning.tests |   2 -
+ test/shaping/tests/misc/fuzzed.tests               |  22 -----
+ test/shaping/tests/misc/hangul-jamo.tests          |   2 -
+ test/shaping/tests/misc/hyphens.tests              |   2 -
+ .../tests/misc/indic-consonant-with-stacker.tests  |   4 -
+ test/shaping/tests/misc/indic-init.tests           |   1 -
+ .../tests/misc/indic-joiner-candrabindu.tests      |   2 -
+ test/shaping/tests/misc/indic-joiners.tests        |   2 -
+ test/shaping/tests/misc/indic-old-spec.tests       |   2 -
+ test/shaping/tests/misc/indic-pref-blocking.tests  |   2 -
+ .../tests/misc/indic-script-extensions.tests       |   2 -
+ test/shaping/tests/misc/indic-special-cases.tests  |   3 -
+ test/shaping/tests/misc/indic-syllable.tests       |   8 --
+ test/shaping/tests/misc/language-tags.tests        |  12 ---
+ test/shaping/tests/misc/ligature-id.tests          |  36 --------
+ test/shaping/tests/misc/mark-attachment.tests      |   1 -
+ test/shaping/tests/misc/mark-filtering-sets.tests  |   5 --
+ .../tests/misc/mongolian-variation-selector.tests  |   4 -
+ test/shaping/tests/misc/simple.tests               |   2 -
+ test/shaping/tests/misc/spaces.tests               |  17 ----
+ .../tests/misc/tibetan-contractions-1.tests        |  60 -------------
+ .../tests/misc/tibetan-contractions-2.tests        |  53 -----------
+ test/shaping/tests/misc/tibetan-vowels.tests       |  11 ---
+ test/shaping/tests/misc/use-marchen.tests          |  35 --------
+ test/shaping/tests/misc/use-syllable.tests         |   7 --
+ test/shaping/tests/misc/use.tests                  |   4 -
+ test/shaping/tests/misc/variations-rvrn.tests      | 100
+ ---------------------
+ test/shaping/tests/misc/vertical.tests             |   3 -
+ test/shaping/tests/misc/zero-width-marks.tests     |  11 ---
+ .../script-arabic/language-persian/mehran.txt      |  14 +--
+ .../language-urdu/crulp/ligatures/2grams.txt       |   0
+ .../language-urdu/crulp/ligatures/3grams.txt       |   0
+ .../language-urdu/crulp/ligatures/4grams.txt       |   0
+ .../language-urdu/crulp/ligatures/5grams.txt       |   0
+ .../language-urdu/crulp/ligatures/6grams.txt       |   0
+ .../language-urdu/crulp/ligatures/7grams.txt       |   0
+ .../language-urdu/crulp/ligatures/8grams.txt       |   0
+ .../language-urdu/crulp/ligatures/LICENSE          |   0
+ .../language-urdu/crulp/ligatures/README           |   0
+ .../language-urdu/crulp/ligatures/SOURCES          |   0
+ .../script-arabic/misc/diacritics/lam-alef.txt     |   0
+ .../misc/diacritics/language-arabic.txt            |   0
+ .../misc/diacritics/language-persian.txt           |   0
+ .../misc/diacritics/language-urdu.txt              |   0
+ .../misc/diacritics/ligature-components.txt        |   0
+ .../misc/diacritics/ligature-diacritics.txt        |   0
+ .../misc/diacritics/mark-skipping.txt              |   0
+ .../shaper-arabic/script-mongolian/misc/misc.txt   |   0
+ .../script-mongolian/misc/non-joining.txt          |   0
+ .../shaper-arabic/script-mongolian/misc/poem.txt   |   0
+ .../script-mongolian/misc/variation-selectors.txt  |   0
+ .../shaper-arabic/script-nko/misc/misc.txt         |   0
+ .../shaper-arabic/script-phags-pa/misc/misc.txt    |   0
+ .../script-syriac/misc/abbreviation-mark.txt       |  11 +++
+ .../shaper-arabic/script-syriac/misc/alaph.txt     |   0
+ .../shaper-default/script-ethiopic/misc/misc.txt   |   0
+ .../shaper-default/script-han/misc/cjk-compat.txt  |   0
+ .../script-hiragana/misc/kazuraki-liga-lines.txt   |   0
+ .../script-hiragana/misc/kazuraki-liga.txt         |   0
+ .../shaper-default/script-linear-b/misc/misc.txt   |   0
+ .../shaper-default/script-tifinagh/misc/misc.txt   |   1 -
+ .../shaper-hangul/script-hangul/misc/misc.txt      |   0
+ .../script-hebrew/misc/diacritics.txt              |   0
+ .../indic/script-assamese/utrrs/LICENSE            |   0
+ .../indic/script-assamese/utrrs/README             |   0
+ .../indic/script-assamese/utrrs/SOURCES            |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-bengali/misc/misc.txt             |   0
+ .../indic/script-bengali/misc/reph.txt             |   0
+ .../indic/script-bengali/utrrs/LICENSE             |   0
+ .../shaper-indic/indic/script-bengali/utrrs/README |   0
+ .../indic/script-bengali/utrrs/SOURCES             |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-devanagari/misc/dottedcircle.txt  |   0
+ .../indic/script-devanagari/misc/eyelash.txt       |   0
+ .../indic/script-devanagari/misc/joiners.txt       |   0
+ .../indic/script-devanagari/misc/misc.txt          |   0
+ .../script-devanagari/misc/spec-deviations.txt     |   0
+ .../script-devanagari/misc/tricky-reordering.txt   |   0
+ .../indic/script-devanagari/utrrs/LICENSE          |   0
+ .../indic/script-devanagari/utrrs/README           |   0
+ .../indic/script-devanagari/utrrs/SOURCES          |   0
+ ...icFontFeatureCodepoint-AdditionalConsonants.txt |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ ...tFeatureCodepoint-DevnagariSpecificAddition.txt |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...ndicFontFeatureCodepoint-GenericPunctuation.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-gujarati/utrrs/LICENSE            |   0
+ .../indic/script-gujarati/utrrs/README             |   0
+ .../indic/script-gujarati/utrrs/SOURCES            |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-gurmukhi/misc/misc.txt            |   0
+ .../indic/script-gurmukhi/utrrs/LICENSE            |   0
+ .../indic/script-gurmukhi/utrrs/README             |   0
+ .../indic/script-gurmukhi/utrrs/SOURCES            |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ .../IndicFontFeatureCodepoint-GurmukhiSpecific.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-kannada/misc/misc.txt             |   0
+ .../indic/script-kannada/misc/right-matras.txt     |   0
+ .../indic/script-kannada/utrrs/LICENSE             |   0
+ .../shaper-indic/indic/script-kannada/utrrs/README |   0
+ .../indic/script-kannada/utrrs/SOURCES             |   0
+ ...icFontFeatureCodepoint-AdditionalConsonants.txt |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-malayalam/misc/cibu.txt           |   0
+ .../indic/script-malayalam/misc/dot-reph.txt       |   0
+ .../indic/script-malayalam/misc/misc.txt           |   0
+ .../indic/script-malayalam/utrrs/LICENSE           |   0
+ .../indic/script-malayalam/utrrs/README            |   0
+ .../indic/script-malayalam/utrrs/SOURCES           |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../shaper-indic/indic/script-oriya/misc/bindu.txt |   0
+ .../shaper-indic/indic/script-oriya/misc/misc.txt  |   0
+ .../shaper-indic/indic/script-oriya/utrrs/LICENSE  |   0
+ .../shaper-indic/indic/script-oriya/utrrs/README   |   0
+ .../shaper-indic/indic/script-oriya/utrrs/SOURCES  |   0
+ ...icFontFeatureCodepoint-AdditionalConsonants.txt |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-OriyaSpecific.txt    |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-sinhala/misc/extensive.txt        |   0
+ .../indic/script-sinhala/misc/misc.txt             |   0
+ .../indic/script-sinhala/misc/reph.txt             |   0
+ .../indic/script-sinhala/misc/split-matras.txt     |   0
+ .../indic/script-sinhala/utrrs/LICENSE             |   0
+ .../shaper-indic/indic/script-sinhala/utrrs/README |   0
+ .../indic/script-sinhala/utrrs/SOURCES             |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Punctuation.txt      |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS.txt            |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt   |   0
+ .../gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt    |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt     |   0
+ .../gsub/IndicFontFeatureGSUB-Special-Cases.txt    |   0
+ .../gsub/IndicFontFeatureGSUB-TouchingLetters.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt    |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../shaper-indic/indic/script-tamil/misc/misc.txt  |   0
+ .../shaper-indic/indic/script-tamil/utrrs/LICENSE  |   0
+ .../shaper-indic/indic/script-tamil/utrrs/README   |   0
+ .../shaper-indic/indic/script-tamil/utrrs/SOURCES  |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-CurrencySymbols.txt  |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Numerics.txt         |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-Symbols.txt          |   0
+ .../IndicFontFeatureCodepoint-TamilSymbol.txt      |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../shaper-indic/indic/script-telugu/misc/misc.txt |   0
+ .../shaper-indic/indic/script-telugu/utrrs/LICENSE |   0
+ .../shaper-indic/indic/script-telugu/utrrs/README  |   0
+ .../shaper-indic/indic/script-telugu/utrrs/SOURCES |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../south-east-asian/script-javanese/misc.txt      |   0
+ .../south-east-asian/script-khmer/misc/misc.txt    |   0
+ .../script-khmer/misc/other-marks-invalid.txt      |   0
+ .../script-khmer/misc/other-marks.txt              |   0
+ .../shaper-myanmar/script-myanmar/misc/misc.txt    |   0
+ .../shaper-myanmar/script-myanmar/misc/otspec.txt  |   1 -
+ .../shaper-myanmar/script-myanmar/misc/utn11.txt   |   0
+ .../shaper-thai/script-lao/misc/sara-am.txt        |   0
+ .../shaper-thai/script-thai/misc/misc.txt          |   0
+ .../shaper-thai/script-thai/misc/phinthu.txt       |   0
+ .../shaper-thai/script-thai/misc/pua-shaping.txt   |   0
+ .../shaper-thai/script-thai/misc/sara-am.txt       |   0
+ .../script-tibetan/misc/contractions.txt           |   0
+ .../shaper-tibetan/script-tibetan/misc/misc.txt    |   0
+ .../shaper-use/script-batak/misc.txt               |   0
+ .../shaper-use/script-buginese/misc.txt            |  92
+ +++++++++----------
+ .../shaper-use/script-cham/misc.txt                |   0
+ .../shaper-use/script-kaithi/misc.txt              |   0
+ .../shaper-use/script-kharoshti/misc.txt           |   0
+ .../shaper-use/script-tai-tham/misc.txt            |   0
+ .../shaper-use/script-tai-tham/torture.txt         |   0
+ .../script-syriac/misc/abbreviation-mark.txt       |  11 ---
+ 420 files changed, 573 insertions(+), 590 deletions(-)
+
+commit 9a3ad307ea91794712531dfc688700c11a1ff263
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 21:35:21 2018 +0100
+
+    [test] Remove unused hb-diff-ngrams
+
+ test/shaping/Makefile.am      |  1 -
+ test/shaping/hb-diff-ngrams   |  5 -----
+ test/shaping/hb_test_tools.py | 26 --------------------------
+ 3 files changed, 32 deletions(-)
+
+commit b6b460024d29362914c72cc5f8fbaec215db5b16
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 21:33:38 2018 +0100
+
+    [test] Remove unused manifest stuff
+
+ test/shaping/Makefile.am        | 7 -------
+ test/shaping/hb-manifest-read   | 5 -----
+ test/shaping/hb-manifest-update | 5 -----
+ 3 files changed, 17 deletions(-)
+
+commit ebbee7c2475db789b622250addbf549695da2890
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 18:23:19 2018 +0100
+
+    [test] Move test files around
+
+ test/fuzzing/run-fuzzer-tests.py                   |  2 +-
+ test/shaping/Makefile.am                           | 82
+ +++++++++++-----------
+ .../tests/{ => misc}/arabic-fallback-shaping.tests |  0
+ .../tests/{ => misc}/arabic-feature-order.tests    |  0
+ .../tests/{ => misc}/arabic-like-joining.tests     |  0
+ .../tests/{ => misc}/arabic-mark-order.tests       |  0
+ test/shaping/tests/{ => misc}/arabic-stch.tests    |  0
+ .../tests/{ => misc}/automatic-fractions.tests     |  0
+ test/shaping/tests/{ => misc}/cluster.tests        |  0
+ test/shaping/tests/{ => misc}/color-fonts.tests    |  0
+ .../tests/{ => misc}/context-matching.tests        |  0
+ .../tests/{ => misc}/cursive-positioning.tests     |  0
+ .../tests/{ => misc}/default-ignorables.tests      |  0
+ .../shaping/tests/{ => misc}/emoji-flag-tags.tests |  0
+ .../tests/{ => misc}/fallback-positioning.tests    |  0
+ test/shaping/tests/{ => misc}/fuzzed.tests         |  0
+ test/shaping/tests/{ => misc}/hangul-jamo.tests    |  0
+ test/shaping/tests/{ => misc}/hyphens.tests        |  0
+ .../{ => misc}/indic-consonant-with-stacker.tests  |  0
+ test/shaping/tests/{ => misc}/indic-init.tests     |  0
+ .../{ => misc}/indic-joiner-candrabindu.tests      |  0
+ test/shaping/tests/{ => misc}/indic-joiners.tests  |  0
+ test/shaping/tests/{ => misc}/indic-old-spec.tests |  0
+ .../tests/{ => misc}/indic-pref-blocking.tests     |  0
+ .../tests/{ => misc}/indic-script-extensions.tests |  0
+ .../tests/{ => misc}/indic-special-cases.tests     |  0
+ test/shaping/tests/{ => misc}/indic-syllable.tests |  0
+ test/shaping/tests/{ => misc}/language-tags.tests  |  0
+ test/shaping/tests/{ => misc}/ligature-id.tests    |  0
+ .../shaping/tests/{ => misc}/mark-attachment.tests |  0
+ .../tests/{ => misc}/mark-filtering-sets.tests     |  0
+ .../{ => misc}/mongolian-variation-selector.tests  |  0
+ test/shaping/tests/{ => misc}/simple.tests         |  0
+ test/shaping/tests/{ => misc}/spaces.tests         |  0
+ .../tests/{ => misc}/tibetan-contractions-1.tests  |  0
+ .../tests/{ => misc}/tibetan-contractions-2.tests  |  0
+ test/shaping/tests/{ => misc}/tibetan-vowels.tests |  0
+ test/shaping/tests/{ => misc}/use-marchen.tests    |  0
+ test/shaping/tests/{ => misc}/use-syllable.tests   |  0
+ test/shaping/tests/{ => misc}/use.tests            |  0
+ .../shaping/tests/{ => misc}/variations-rvrn.tests |  0
+ test/shaping/tests/{ => misc}/vertical.tests       |  0
+ .../tests/{ => misc}/zero-width-marks.tests        |  0
+ 43 files changed, 42 insertions(+), 42 deletions(-)
+
+commit 748b989a1fa931b011d6a4e3db39dfdc632946b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 17:55:17 2018 +0100
+
+    [aat/morx] Implement NoncontextualSubtables
+
+    Also makes hb-ot-shape call morx for now instead of GSUB... Just
+    for testing.
+
+ src/hb-aat-layout-common-private.hh | 34 +++++++--------
+ src/hb-aat-layout-morx-table.hh     | 82
+ ++++++++++++++++++++++++++++++++++---
+ src/hb-aat-layout-private.hh        |  3 ++
+ src/hb-aat-layout.cc                | 13 +++++-
+ src/hb-ot-shape.cc                  |  6 +++
+ 5 files changed, 111 insertions(+), 27 deletions(-)
+
+commit 4cf3ab1d8192862f8d3c52fdcaec567735916116
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 16:32:58 2018 +0100
+
+    Minor
+
+ src/hb-ot-shape.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 470fe5b603b409bef136fdd4e9b33d2704dc77b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 15:48:51 2018 +0100
+
+    [aat] Implement Lookup table
+
+    Untested, but compiles.
+
+ src/hb-aat-layout-common-private.hh | 308
+ +++++++++++++++++++++++++++++++++++-
+ src/hb-aat-layout-morx-table.hh     |   9 +-
+ src/hb-aat-layout.cc                |  14 ++
+ src/hb-face.cc                      |   6 +-
+ src/hb-open-type-private.hh         |  16 +-
+ src/hb-ot-cbdt-table.hh             |   4 +-
+ src/hb-ot-cmap-table.hh             |   2 +-
+ src/hb-ot-glyf-table.hh             |   6 +-
+ src/hb-ot-hmtx-table.hh             |   8 +-
+ src/hb-ot-kern-table.hh             |   2 +-
+ src/hb-ot-layout.cc                 |   6 +-
+ src/hb-ot-post-table.hh             |   2 +-
+ src/hb-uniscribe.cc                 |   2 +-
+ 13 files changed, 355 insertions(+), 30 deletions(-)
+
+commit 4646a80a873fa164b9cf09128bc6b6fe2fc5cce2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 12:06:38 2018 +0100
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 7c7cb42d8125d7e598bfa70f93053cafe38b325a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 8 14:32:55 2018 +0000
+
+    [aat] Update previous commits for rebase on master
+
+ src/hb-aat-layout-common-private.hh | 14 +++++++-------
+ src/hb-aat-layout-morx-table.hh     | 28 ++++++++++++++--------------
+ src/hb-open-type-private.hh         |  5 -----
+ 3 files changed, 21 insertions(+), 26 deletions(-)
+
+commit a0175e75bc40b5496d7fd37afd434cb2000e5b9b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 17 16:55:54 2017 -0700
+
+    [aat] Start implementing common table formats
+
+ src/Makefile.sources                |   2 +
+ src/hb-aat-layout-common-private.hh | 134
+ ++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout-morx-table.hh     |   1 +
+ src/hb-aat-layout-private.hh        |  37 ++++++++++
+ src/hb-aat-layout.cc                |   1 +
+ 5 files changed, 175 insertions(+)
+
+commit c71b55a223d14f8bb7fa355efc586e824b7d4d8f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 14 17:24:36 2017 -0700
+
+    [aat] Start implementing Apple AAT morx table
+
+ src/Makefile.sources            |   2 +
+ src/hb-aat-layout-morx-table.hh | 275
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.cc            |  42 ++++++
+ src/hb-open-type-private.hh     |   5 +
+ src/hb-ot-layout-private.hh     |   5 +
+ src/hb-ot-layout.cc             |   2 +
+ 6 files changed, 331 insertions(+)
+
+commit 3c7aeb5c6437b26ad638ab993b724e28376d3ff8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 9 01:39:42 2018 +0330
+
+    [cmake] Add autotools like feature testing (#683)
+
+ CMakeLists.txt | 22 ++++++++++++++++------
+ 1 file changed, 16 insertions(+), 6 deletions(-)
+
+commit 0473d95e276ae5df722bc7d371733d8202bdbc3c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 8 10:07:46 2018 +0000
+
+    [ft] Use FT_Done_MM_Var() if available
+
+ configure.ac | 1 +
+ src/hb-ft.cc | 4 ++++
+ 2 files changed, 5 insertions(+)
+
+commit 66d7beff96d622599e1ee8895f2aa84fe2299f1a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 18:09:29 2018 +0000
+
+    [khmer] Relax!
+
+    Apparently we don't use OT_A either.
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit db0207baff358b20fbe9c3498275ba33f69caf87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 18:06:00 2018 +0000
+
+    [khmer] Drop another joiner
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 90affe831f08fabcb2dd5ac837c7b0cfbd14e554
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 18:04:56 2018 +0000
+
+    [khmer] Shuffle
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 65795e3ca246bf65b3cb53e3fe65eca312774e3e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 18:03:00 2018 +0000
+
+    [khmer] Simplify grammar some more
+
+    Numbers down (from 38):
+
+    KHMER: 299090 out of 299124 tests passed. 34 failed (0.0113665%)
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e13ee937310a7aadd83fd266dae382da40dce4f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 18:01:01 2018 +0000
+
+    [khmer] Clean
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a71c7eb2ca9f8ba90117e1a0c4ce890f0a1640f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:59:43 2018 +0000
+
+    [khmer] Limit number of joiners
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 574e42e1cf6679c8df065d6bb3e8d21bc82395c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:57:39 2018 +0000
+
+    [khmer] Relax number of consonants / matras allowed
+
+    New numbers (down from 39):
+
+    KHMER: 299086 out of 299124 tests passed. 38 failed (0.0127038%)
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 80c870bcda2f421e80f5579e71fe17fe8db991b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:52:24 2018 +0000
+
+    [khmer] Allow Independent Vowels where stacked consonants are allowed
+
+    New numbers (down from 44):
+
+    KHMER: 299085 out of 299124 tests passed. 39 failed (0.0130381%)
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 4 ++--
+ src/hb-ot-shape-complex-khmer.cc         | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 9bd486c480b8fd3125ef6b6cc0442a566f669cb8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:47:35 2018 +0000
+
+    [khmer] Drop some more joiners
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5278265853c36400ffc284fd517cc7b7c42ed0e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:46:49 2018 +0000
+
+    [khmer] Drop some more
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit efefd87f3354d0ae6f599ea30672cb0b74dfcd80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:45:48 2018 +0000
+
+    [khmer] Drop some more grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 82e6bf8e0c27d2fd16a908eed0c73e95b1a2c0f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:44:18 2018 +0000
+
+    [khmer] Drop some more from grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 957e8ea8a9f981775ecde7dd1e2bf4023cf79dba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:43:31 2018 +0000
+
+    [khmer] Drop final_halant_group
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit bbfdbbdc5eca96e8c527147e5a78cd185b9f243d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:34:26 2018 +0000
+
+    Minor
+
+ src/hb-ot-shape-complex-indic-machine.rl | 1 -
+ src/hb-ot-shape-complex-khmer-machine.rl | 1 -
+ 2 files changed, 2 deletions(-)
+
+commit f6df2515210e9d828fc40173696b185efa5083e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:27:48 2018 +0000
+
+    [indic] Remove unused OT_VD category
+
+ src/hb-ot-shape-complex-indic-machine.rl | 3 +--
+ src/hb-ot-shape-complex-indic-private.hh | 2 +-
+ src/hb-ot-shape-complex-indic.cc         | 2 +-
+ 3 files changed, 3 insertions(+), 4 deletions(-)
+
+commit e6618f3bdf79a51f6fb270b468b653dc9cea5b57
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:21:55 2018 +0000
+
+    [khmer] Shave off some more from the grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl |  9 ++-------
+ src/hb-ot-shape-complex-khmer.cc         | 34
+ ++------------------------------
+ 2 files changed, 4 insertions(+), 39 deletions(-)
+
+commit 014494d5c0469fe6b3112db3fdb3f2f262673ba1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:17:02 2018 +0000
+
+    [khmer] Remove unused symbol clusters
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit bbac984b9390a66c6ae5ee931b278b607f2f2a50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:15:31 2018 +0000
+
+    Minor
+
+ src/hb-ot-shape-complex-indic-machine.rl | 1 -
+ src/hb-ot-shape-complex-khmer-machine.rl | 1 -
+ 2 files changed, 2 deletions(-)
+
+commit 185b68946ad67443e8725e77d724128802de5572
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:14:27 2018 +0000
+
+    [khmer] Remove medials from grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+commit c265dffdf6c4930e271292226d38a8e515b6b0f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:06:29 2018 +0000
+
+    [khmer] Better fix for dangling final Coeng
+
+    This is how 1471cfee3bb2734dc44c58471362851ad27e8bd8 should have
+    been done.
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e3fdf1fc2f399e6b79ea022501526a422d372e64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:05:53 2018 +0000
+
+    [khmer] Remove reph/repha support from grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 12 ++++--------
+ 1 file changed, 4 insertions(+), 8 deletions(-)
+
+commit 0d3a274de1ff8e6a21c7c9857730e2eda402e310
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:01:37 2018 +0000
+
+    [khmer] Remove forced_rakar from grammar
+
+    Used by Sinhala only.
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 3 +--
+ src/hb-ot-shape-complex-khmer.cc         | 2 +-
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 1471cfee3bb2734dc44c58471362851ad27e8bd8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:34:20 2018 +0000
+
+    [khmer] Allow a dangling final Coeng after matras
+
+    Uniscribe seems to allow that.  New numbers:
+
+    KHMER: 299080 out of 299124 tests passed. 44 failed (0.0147096%)
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9eaf077ded0306d492de96b223133431f1a6d42b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:28:00 2018 +0000
+
+    [khmer] Remove some more unused code
+
+ src/hb-ot-shape-complex-khmer.cc | 49
+ ++--------------------------------------
+ 1 file changed, 2 insertions(+), 47 deletions(-)
+
+commit bfad6ab897a38aedc82de694ee1a17132f90b25e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:13:09 2018 +0000
+
+    [khmer] Remove features not used by Khmer
+
+ src/hb-ot-shape-complex-khmer.cc | 60
+ ++++------------------------------------
+ 1 file changed, 5 insertions(+), 55 deletions(-)
+
+commit 92a99ce084b19dff32d434de446144f0c4796803
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:08:44 2018 +0000
+
+    [khmer] Remove rphf feature
+
+ src/hb-ot-shape-complex-khmer.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 238b90e77c12674edfd2e03160b8ba2a0298b79d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:06:53 2018 +0000
+
+    [khmer] Remove non-Khmer matra positioning code
+
+ src/hb-ot-shape-complex-khmer.cc | 76
+ +++++++---------------------------------
+ 1 file changed, 12 insertions(+), 64 deletions(-)
+
+commit f8553c898a414298403c335f8d2ed6c588a1189f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:04:02 2018 +0000
+
+    [khmer] Remove indic_config_t
+
+ src/hb-ot-shape-complex-khmer.cc | 28 ----------------------------
+ 1 file changed, 28 deletions(-)
+
+commit a119a8bce57abc440ae4c8b9a1342d428a7c9b6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:02:27 2018 +0000
+
+    [khmer] Remove indic_config->reph_mode
+
+ src/hb-ot-shape-complex-khmer.cc | 9 +--------
+ 1 file changed, 1 insertion(+), 8 deletions(-)
+
+commit c135324af107d3e33420cd0dca4d5bb12fd3f4a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:01:17 2018 +0000
+
+    [khmer] Remove indic_config->reph_pos
+
+ src/hb-ot-shape-complex-khmer.cc | 333
+ ++-------------------------------------
+ 1 file changed, 10 insertions(+), 323 deletions(-)
+
+commit ffcd6c7efd21bf89b41ddbf148b05672a42ecadd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:50:05 2018 +0000
+
+    [khmer] Remove indic_config->base_pos
+
+ src/hb-ot-shape-complex-khmer.cc | 229
+ ++-------------------------------------
+ 1 file changed, 7 insertions(+), 222 deletions(-)
+
+commit 0c91638d48d6fb86d1e30fb94c15785707395b42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:45:30 2018 +0000
+
+    [khmer] Remove other scripts
+
+ src/hb-ot-shape-complex-khmer.cc | 131
+ ++++++++++-----------------------------
+ 1 file changed, 34 insertions(+), 97 deletions(-)
+
+commit 4c0199c573f79be5f40e7d4f8433ef6a1c9c24b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:43:48 2018 +0000
+
+    [khmer] Remove indic_config->script
+
+ src/hb-ot-shape-complex-khmer.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 9b135d9524e51cc1e1f35479e015c746ccd8ca5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:43:11 2018 +0000
+
+    [khmer] Remove indic_config->virama
+
+ src/hb-ot-shape-complex-khmer.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 7eb3ac29d388432c311981b20b1aa75f47249bfc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:41:31 2018 +0000
+
+    [khmer] Remove indic_config->has_old_spec
+
+ src/hb-ot-shape-complex-khmer.cc | 157
+ ++++++---------------------------------
+ 1 file changed, 21 insertions(+), 136 deletions(-)
+
+commit 961ebf85f1e7d417e056c3927ee73857f6f4cde6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:36:53 2018 +0000
+
+    [khmer] Remove Halant from Khmer shaper
+
+ src/hb-ot-shape-complex-indic-private.hh |  1 -
+ src/hb-ot-shape-complex-khmer-machine.rl |  7 +++----
+ src/hb-ot-shape-complex-khmer.cc         | 32
+ ++++++++++++++++----------------
+ 3 files changed, 19 insertions(+), 21 deletions(-)
+
+commit 9761f9d78214323b9ad58dd0b8ba41851c9e2d54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:33:11 2018 +0000
+
+    [indic] Remove more Khmer-specific stuff from Indic shaper
+
+    No numbers changed.
+
+ src/hb-ot-shape-complex-indic-machine.rl |  8 ++---
+ src/hb-ot-shape-complex-indic.cc         | 57
+ ++++++++++++--------------------
+ 2 files changed, 25 insertions(+), 40 deletions(-)
+
+commit 075895364435ee88936696bcb5457283c4bb1a29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:08:28 2018 +0000
+
+    [indic] Remove main Khmer stuff
+
+ src/hb-ot-shape-complex-indic.cc | 73
+ ++--------------------------------------
+ 1 file changed, 2 insertions(+), 71 deletions(-)
+
+commit dcf4d95fea45e19fbb3b39f0211b2aa96a907473
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 14:54:31 2018 +0000
+
+    [khmer] Split off Khmer shaper from Indic
+
+    Towards fixing https://github.com/harfbuzz/harfbuzz/issues/667
+    The Khmer spec is different enough from other Indic ones to require
+    its own grammar.
+
+    No change in functionality.  Test numbers are:
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366355 out of 366457 tests passed. 102 failed (0.0278341%)
+    GURMUKHI: 60729 out of 60747 tests passed. 18 failed (0.0296311%)
+    KANNADA: 951300 out of 951913 tests passed. 613 failed (0.0643966%)
+    KHMER: 299071 out of 299124 tests passed. 53 failed (0.0177184%)
+    MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed
+    (0.0188871%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%)
+    TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+ src/Makefile.sources                     |    3 +
+ src/hb-ot-shape-complex-khmer-machine.rl |  130 +++
+ src/hb-ot-shape-complex-khmer.cc         | 1867
+ ++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-private.hh       |    5 +-
+ 4 files changed, 2003 insertions(+), 2 deletions(-)
+
+commit 1e05ea79d057fbae5f680589d4ee7d3c6a971689
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 14:01:37 2018 +0000
+
+    [ot] Short-circuit base instance advance variation
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 54b2b93722c9f067199cd7145dfd065d5b6b2f0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 13:20:21 2018 +0000
+
+    [ot] Fix VariationStore evaluation algorithm
+
+    Ouch!  Missing coords should still be evaluated as coord=0, which
+    most of the time results in a factor of 0.  We were skipping these,
+    which was equivalent to a factor of 1.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/652
+
+ src/hb-ot-layout-common-private.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit a3afdd1e080bb181ddec126b6233d52438882a13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 13:17:02 2018 +0000
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cb43bdbc2f3a16061c33596b15b29eb7f9713871
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 13:06:25 2018 +0000
+
+    [ft] If there's no variations set, don't set them on hb-font
+
+ src/hb-ft.cc | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit ed2f458b143327d07e67fdb976ead9d7ff2863f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 12:55:39 2018 +0000
+
+    Add test font for previous commit
+
+ .../sha1sum/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf | Bin 0 ->
+ 4816 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 127bcc6ece4da64e807f652dd84a17c6a8c5e300
+Merge: 72bec1cd 8c0d1916
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 12:50:22 2018 +0000
+
+    Merge remote-tracking branch 'fdo/master'
+
+commit 8c0d1916a41f0fb32340ce5257de780acf598353
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 12:46:12 2018 +0000
+
+    Improve CGJ skipping logic
+
+    Previously we made CGJ unskippable.  Now, if CGJ did NOT prevent
+    any reordering, allow skipping over it.  To make this work we
+    had to make changes to the Arabic mark reordering algorithm
+    implementation to renumber moved MCM marks.  See comments.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/554
+
+ src/hb-buffer-private.hh                   |  1 +
+ src/hb-ot-layout-private.hh                | 11 ++++++++-
+ src/hb-ot-shape-complex-arabic.cc          | 37
+ ++++++++++++++++++++++--------
+ src/hb-ot-shape-normalize.cc               | 30 +++++++++++++-----------
+ test/shaping/tests/arabic-mark-order.tests |  4 ++++
+ 5 files changed, 58 insertions(+), 25 deletions(-)
+
+commit 72bec1cd09f919f3826345db4832752ec96ff5c5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 5 12:42:20 2018 +0330
+
+    Improve tests (#679)
+
+ .circleci/config.yml        |  2 +-
+ CMakeLists.txt              | 52
+ +++++++++++++++++++++++++++++++++++----------
+ autogen.sh                  |  6 ++++--
+ src/Makefile.am             |  3 +--
+ src/check-defs.sh           |  2 +-
+ src/check-header-guards.sh  |  2 +-
+ src/check-libstdc++.sh      |  2 +-
+ src/check-static-inits.sh   |  2 +-
+ src/check-symbols.sh        |  2 +-
+ test/fuzzing/CMakeLists.txt | 11 +++++++++-
+ 10 files changed, 62 insertions(+), 22 deletions(-)
+
+commit 293e443529d0621b9f94ea15d1425104394f6b9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 4 16:06:25 2018 +0000
+
+    Minor
+
+ src/check-c-linkage-decls.sh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 8a0952db7e521320cd4d8b67b287f7d33c21b6e0
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Thu Jan 4 18:40:10 2018 +0700
+
+    atomics: Favor compiler primitives over macOS APIs. (#676)
+
+    In macOS 10.12, the `OSMemoryBarrier` and related APIs were deprecated
+    in favor of using `std::atomic`. On the way to supporting
+    `std::atomic`,
+    we can favor using the "Intel primitives" which are also available on
+    macOS.
+
+ src/hb-atomic-private.hh | 46
+ +++++++++++++++++++++++-----------------------
+ 1 file changed, 23 insertions(+), 23 deletions(-)
+
+commit 4f80078eb035054db0f6e33cf4f7345c6c85cb12
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Thu Jan 4 18:37:35 2018 +0700
+
+    [cmake] Colorize output when using cmake + ninja. (#674)
+
+    Due to how ninja runs clang and gcc, it doesn't colorize the output
+    like make does. This forces color output in this situation.
+
+ CMakeLists.txt | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 5ed26fc5bdfdab0ff41a8861b54395c0bbbad248
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 4 10:11:34 2018 +0330
+
+    [cmake] Run src/ tests (#675)
+
+ .circleci/config.yml      |  9 ++++-----
+ CMakeLists.txt            | 35 ++++++++++++++++++++++++++++++++---
+ src/Makefile.am           |  1 +
+ src/check-defs.sh         |  3 ++-
+ src/check-libstdc++.sh    |  3 ++-
+ src/check-static-inits.sh |  3 ++-
+ src/check-symbols.sh      |  3 ++-
+ 7 files changed, 45 insertions(+), 12 deletions(-)
+
+commit f8daeef4c4451084a781db3a8a04807c0f0051ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 3 14:27:34 2018 +0000
+
+    [use] Simplify more
+
+ src/gen-use-table.py                 | 11 +------
+ src/hb-ot-shape-complex-use-table.cc | 62
+ +++++++++++++++++++++---------------
+ 2 files changed, 38 insertions(+), 35 deletions(-)
+
+commit 877d15e73c24159b26bb7cc6d2f62045d445d0fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 3 14:24:44 2018 +0000
+
+    [use] Simplify
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/661
+
+ src/gen-use-table.py                 | 2 +-
+ src/hb-ot-shape-complex-use-table.cc | 3 +--
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 308f419215716460479fbde482d66d1687176102
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 3 14:22:07 2018 +0000
+
+    [use] Fix Brahmi Number Joiner 1107F
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/660
+
+ src/gen-indic-table.py                 | 6 +++---
+ src/gen-use-table.py                   | 6 +++---
+ src/hb-ot-shape-complex-indic-table.cc | 4 ++--
+ src/hb-ot-shape-complex-use-table.cc   | 6 +++---
+ 4 files changed, 11 insertions(+), 11 deletions(-)
+
+commit 7b837e20d2b4b6cd7be0b181ac5cdfeb467bd146
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 3 12:46:29 2018 +0000
+
+    [util] Add TODO item
+
+ util/options.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 70807ad274be39d58a5b43e12d4585325cb314c4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 2 23:52:12 2018 +0330
+
+    Fix make check issue on out-of-tree builds and test it (#672)
+
+ .circleci/config.yml             |  8 ++++----
+ test/fuzzing/Makefile.am         | 18 +-----------------
+ test/fuzzing/run-fuzzer-tests.py |  8 +++++---
+ test/shaping/run-tests.py        |  5 +++++
+ 4 files changed, 15 insertions(+), 24 deletions(-)
+
+commit 85ec6d34439194a88c7dfdd8303369311e08e031
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Wed Jan 3 01:23:23 2018 +0700
+
+    Fix typos.
+
+ docs/usermanual-clusters.xml         | 4 ++--
+ docs/usermanual-install-harfbuzz.xml | 2 +-
+ src/hb-font.h                        | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 4f6754ac0190f04b5f27306b087827b8f2e13046
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Wed Jan 3 00:15:18 2018 +0700
+
+    Improve Markdown usage in BUILD.md.
+
+ BUILD.md | 36 +++++++++++++++++++++++-------------
+ 1 file changed, 23 insertions(+), 13 deletions(-)
+
+commit 3db1d34264d9405c7356668aa3c8ed3ab103da3c
+Author: Romain Ouabdelkader <rouabdelkader@gopro.com>
+Date:   Thu Dec 21 14:39:34 2017 +0100
+
+    link with CoreFoundation when using CoreText
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4e3cf91af29ff654eca91e43c0af1c1a7171b9fa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 1 11:17:51 2018 +0330
+
+    [cmake] Run rest of the tests on Windows (#668)
+
+ appveyor.yml                     |  6 +++---
+ test/CMakeLists.txt              |  5 +----
+ test/fuzzing/CMakeLists.txt      | 12 ++++++------
+ test/fuzzing/Makefile.am         |  5 +----
+ test/fuzzing/run-fuzzer-tests.py | 12 +++++++++---
+ test/shaping/CMakeLists.txt      |  9 ++++-----
+ test/shaping/run-tests.py        | 10 +++++++++-
+ 7 files changed, 33 insertions(+), 26 deletions(-)
+
+commit 2dbdeb14214487acd0ff011386c49263ce800813
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Dec 29 23:13:29 2017 +0330
+
+    [cmake] Run fuzzing and shaping tests (#666)
+
+ .circleci/config.yml             |  2 +-
+ CMakeLists.txt                   | 59
+ ++++++++++++++++++++++++----------------
+ appveyor.yml                     |  4 +--
+ test/CMakeLists.txt              |  5 ++++
+ test/api/CMakeLists.txt          | 48 +++++++++++++-------------------
+ test/fuzzing/CMakeLists.txt      |  9 ++++++
+ test/fuzzing/Makefile.am         | 18 ++++++++++++
+ test/fuzzing/run-fuzzer-tests.py | 28 +++++++++++++++++++
+ test/shaping/CMakeLists.txt      | 11 ++++++++
+ test/shaping/Makefile.am         |  3 +-
+ test/shaping/run-tests.py        |  3 +-
+ 11 files changed, 132 insertions(+), 58 deletions(-)
+
+commit 24b30faa2a285c6e4e46a18c346def2183fc2793
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Dec 25 22:01:28 2017 +0330
+
+    [cmake] Use GNUInstallDirs values (#665)
+
+ CMakeLists.txt | 170
+ ++++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 85 insertions(+), 85 deletions(-)
+
+commit 7d397c5d5ca684fae824a61dabf5bc422d0a516b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 24 17:53:32 2017 -0500
+
+    Add Coverity badge
+
+ README | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 50163976d2a5fb34e0b4c011408d581b33aaa255
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Dec 25 01:55:48 2017 +0330
+
+    [cmake] Enable cmake tests on distribution and test it (#664)
+
+ .circleci/config.yml | 3 ++-
+ test/Makefile.am     | 6 ++++++
+ test/api/Makefile.am | 1 +
+ 3 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 7bfdf1a94192dd83ab55202d259703f36ed060e5
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Nov 22 16:32:52 2017 -0500
+
+    Forbid Batak killers after vowel signs
+
+ src/gen-use-table.py                                     |   3 +++
+ src/hb-ot-shape-complex-use-table.cc                     |   2 +-
+ .../sha1sum/59a585a63b3df608fbeef00956c8c108deec7de6.ttf | Bin 0 ->
+ 1164 bytes
+ test/shaping/tests/use-syllable.tests                    |   1 +
+ 4 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 9890782736b9ce708c1fedd1cbb3db45cfef4c69
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Dec 25 01:32:46 2017 +0330
+
+    [ci] Add -Wno-attributes to djgpp, add alpine, format (#663)
+
+ .circleci/config.yml | 40 ++++++++++++++++++++++++++++++----------
+ 1 file changed, 30 insertions(+), 10 deletions(-)
+
+commit 72ecaae0ad4c9f1685f7d524990e92a26fcd5611
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 24 16:05:07 2017 -0500
+
+    [use] Allow ZWJ before/after Halant
+
+    https://github.com/harfbuzz/harfbuzz/issues/542#issuecomment-353169729
+
+ src/hb-ot-shape-complex-use-machine.rl | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit bc92245b681098f0bfa712217851a5ba3dabeaf3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 20 13:19:33 2017 -0500
+
+    Minor
+
+ src/main.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 81dfc29d2dbc755301e702ea5427829d02abc693
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Dec 21 20:15:37 2017 +0330
+
+    [ci] Add a DOS/djgpp compiler (#659)
+
+ .circleci/config.yml | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 007a2a4317227b8fb4c764c590203c85fc3da5fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 20 12:09:00 2017 -0500
+
+    1.7.4
+
+ NEWS         | 7 +++++++
+ configure.ac | 2 +-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit a9432bde7e61894056a42ea24d56fd7fd908a1ce
+Author: Volker H. Simonis <volker.simonis@gmail.com>
+Date:   Tue Dec 19 11:33:25 2017 +0100
+
+    HarfBuzz 1.7.1 and later don't compile on AIX with xlC (#655)
+
+ src/hb-ot-shape-complex-arabic-fallback.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2fe5f885b6f66f2665292b93e07baaae0aa46da8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 19 14:48:26 2017 -0500
+
+    [set] Handle nil set in add_range() / add_sorted_array()
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/657
+
+ src/hb-set-private.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit b5bbb791d32467b91caf6f1bf7ccee7cb2ca8c52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 18 09:18:51 2017 -0500
+
+    1.7.3
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 1245395a60ab6b04fc4653c448a97bb6ffee672c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 17 12:32:33 2017 -0500
+
+    [coretext] In hb_coretext_font_create() set ptem
+
+    Otherwise setting the CTFont was ineffective as it would have been
+    recreated anyway unless font size was set to 18 CSS points.
+
+ src/hb-coretext.cc | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+commit 493a005d9527b6075f3c1ca4b41c22d7805f975c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 16 11:49:39 2017 -0500
+
+    [set] In add_sorted_array(), bail if data is not sorted
+
+ src/hb-set-private.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit a7bd6d7a4c53ff61d7d8286a594aaa0a0e15b1a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 16 11:11:18 2017 -0500
+
+    [collect_glyphs] Bail if input data looks like garbage
+
+    Specificaly, when a range or sorted array has unexpected order,
+    we take that as
+    font data being garbage and bail out.  This fixes significant slowdown
+    on a bad
+    version of Chandas font which has a 600KB GPOS with garbage inside.
+
+    Later on, I like to add a maximum-work counter for collect_glyphs
+    to protect
+    against malicious fonts as well.
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=794896
+
+ src/hb-ot-layout-common-private.hh | 14 +++++++-------
+ src/hb-set-private.hh              |  4 ++--
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 1ce7d6e215ef9d5386010bcdbbca79ef01811596
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 16 11:36:16 2017 -0500
+
+    [set] Optimize add_array() / add_sorted_array()
+
+    Does page lookup as needed.
+
+ src/hb-set-private.hh | 54
+ ++++++++++++++++++++++++++++++++++++---------------
+ 1 file changed, 38 insertions(+), 16 deletions(-)
+
+commit 71e6adf1e2d65eb905a0ba247672fe36169955ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 16 11:07:37 2017 -0500
+
+    [collect_glyphs] handle ClassDef better
+
+ src/hb-ot-layout-common-private.hh   | 63
+ ++++++++++++++++++++++++++++++------
+ src/hb-ot-layout-gdef-table.hh       |  2 +-
+ src/hb-ot-layout-gpos-table.hh       |  5 +--
+ src/hb-ot-layout-gsubgpos-private.hh |  2 +-
+ 4 files changed, 56 insertions(+), 16 deletions(-)
+
+commit 87cc5a65cb4b98a3a857b5846085ef0814b392a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 16 06:18:07 2017 -0800
+
+    [collect_glyphs] In PairPosFornat2 do not collect classDef1
+
+    The coverage already covered that.
+
+ src/hb-ot-layout-gpos-table.hh | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
+
+commit 81f27df4d9db1bfc1dd04593cbd121397b86e9a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 16 06:12:06 2017 -0800
+
+    More work towards improving collect_glyphs() against bad input
+
+    The three "XXXXX"'s should be switched to false.  Doing that
+    separately for ease
+    of bisecting...
+
+ src/hb-ot-layout-common-private.hh |  7 +++----
+ src/hb-ot-layout-gpos-table.hh     | 25 ++++++++++---------------
+ src/hb-ot-layout-gsub-table.hh     | 35
+ +++++++++++++----------------------
+ src/hb-set-digest-private.hh       |  6 ++++--
+ src/hb-set-private.hh              | 36
+ ++++++++++++++++++------------------
+ 5 files changed, 48 insertions(+), 61 deletions(-)
+
+commit 5d02572034e3dafbe87000fd0aa34b858bd95075
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 14 19:33:55 2017 -0800
+
+    [set] Add add_sorted_array()
+
+    Not optimized to use sortedness yet.  Also start putting in place
+    infra
+    to faster reject bad data.
+
+    A version of Chandas.ttf found on some Chrome bots has 660kb of GPOS,
+    mostly junk.  That is causing 48 million of set->add() calls in
+    collect_glyphs(), which is insane.
+
+    In the upcoming commits, I'll be speeding that up by optimizing
+    add_sorted_array(), while also reducing work by rejecting out-of-sort
+    arrays quickly and propagate the rejection.
+
+    Part of https://bugs.chromium.org/p/chromium/issues/detail?id=794896
+
+ src/hb-ot-layout-common-private.hh   | 51
+ +++++++++++++++++++++++-------------
+ src/hb-ot-layout-gdef-table.hh       |  2 +-
+ src/hb-ot-layout-gpos-table.hh       | 10 +++----
+ src/hb-ot-layout-gsubgpos-private.hh |  2 +-
+ src/hb-set-digest-private.hh         | 31 ++++++++++++++++++----
+ src/hb-set-private.hh                | 21 +++++++++++++--
+ 6 files changed, 84 insertions(+), 33 deletions(-)
+
+commit 9d6511a7343ba150e8072e5fe91732db54a92309
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 14 19:04:55 2017 -0800
+
+    [set] Reduce number of preallocated pages from 8 to 1
+
+    Now that pagesize is 8192, this feels better.
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ae2e2b068e1ab68d1f814165cb86fa38deef1f5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 14 18:15:14 2017 -0800
+
+    Fix partial tracing debug builds
+
+ src/hb-debug.hh | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+commit 9daa88cd790b80a8bc7eaae2e7eec6f2f9fc60cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 14 13:37:48 2017 -0800
+
+    Minor
+
+ src/hb-set-private.hh | 11 +++++++++++
+ src/hb-set.cc         |  6 ++----
+ 2 files changed, 13 insertions(+), 4 deletions(-)
+
+commit f424a342233ae32bbfabbdeadf59c82420b0880b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 14 13:30:38 2017 -0800
+
+    [set] Change pagesize from 512 bits to 8192 bits
+
+    Fixes perf regression on some heavy fonts in Chrome's FT+HB
+    interaction.
+
+    See:
+    https://bugs.chromium.org/p/chromium/issues/detail?id=782220
+
+    More work to be done:
+    https://bugs.chromium.org/p/chromium/issues/detail?id=794896
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0fe62c1f333200523e10663f47a58b82e3f22154
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 13 13:12:20 2017 -0800
+
+    [set] Add add_array()
+
+    To be used to optimize adding a whole bunch of (sorted) items at
+    the same time,
+    as in CoverageFormat1.
+
+ src/hb-ot-layout-common-private.hh |  4 +---
+ src/hb-set-digest-private.hh       | 12 ++++++++++++
+ src/hb-set-private.hh              |  6 ++++++
+ 3 files changed, 19 insertions(+), 3 deletions(-)
+
+commit 20e69c950d431391f92335f8845e5d4291aca8f3
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Dec 7 12:24:12 2017 +0330
+
+    [test] print commented line, like the original script (#649)
+
+ test/shaping/run-tests.py | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 71ad2777c52aeb0842038881899499a49cb895f2
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Dec 7 11:35:36 2017 +0330
+
+    [ci] Add an after distribution test runner (#648)
+
+ .circleci/config.yml | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 5f061d27d5289c7608a6579dca668b1f5be7f4e8
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Dec 7 11:22:55 2017 +0330
+
+    Rewrite run-tests in python (#647)
+
+ test/shaping/Makefile.am  |   4 +-
+ test/shaping/run-tests.py | 115
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ test/shaping/run-tests.sh |  65 --------------------------
+ 3 files changed, 117 insertions(+), 67 deletions(-)
+
+commit 3ce6c7bd96296a44950110e84ade76c7c1df06e4
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Dec 6 21:08:20 2017 +0200
+
+    [ci] Sort out Travis configuration
+
+    Use a matrix to avoid a gazillion if's.
+
+ .ci/deploy-docs.sh   |  2 ++
+ .ci/run-coveralls.sh | 14 +++++++++++
+ .travis.yml          | 69
+ ++++++++++++++++++++++++++++++++--------------------
+ 3 files changed, 58 insertions(+), 27 deletions(-)
+
+commit 5a6d2b986a02fc47fa9dcbb330e6949af8e375ff
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Dec 6 18:27:27 2017 +0330
+
+    [ci] minor improvements (#644)
+
+ .circleci/config.yml | 3 +++
+ appveyor.yml         | 2 +-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 840a32e3f3ed0a85bfa84e69efaeb504d92d1aa7
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Dec 6 00:49:25 2017 +0200
+
+    Run cmake tests on CI builds
+
+ .circleci/config.yml | 6 ++++--
+ appveyor.yml         | 2 +-
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit c8609551485cfca6f9629c565b9dd5f02aa14f3e
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Dec 6 00:43:28 2017 +0200
+
+    Add API tests to cmake build
+
+ CMakeLists.txt          |  5 +++++
+ test/CMakeLists.txt     |  1 +
+ test/api/CMakeLists.txt | 39 +++++++++++++++++++++++++++++++++++++++
+ test/api/hb-test.h      |  2 ++
+ test/api/test-c.c       |  2 ++
+ 5 files changed, 49 insertions(+)
+
+commit f19126dd35b03f6e05a67cbc406b3ce4a3e35022
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Dec 5 22:52:54 2017 +0200
+
+    We are already inside “if HAVE_GLIB” check
+
+ test/api/Makefile.am | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 7af48a3f37abac0aa1a1ad79c98399a9a71bd903
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Dec 6 14:22:19 2017 +0330
+
+    [ci] Don't cache msys2 folder
+
+ appveyor.yml | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit b6f505c7164e302d2990cf056b73e918a641e976
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Dec 6 13:51:04 2017 +0330
+
+    [ci] Enable glib and freetype on appveyor cmake (#643)
+
+ appveyor.yml | 29 +++++++++++++++++++++--------
+ 1 file changed, 21 insertions(+), 8 deletions(-)
+
+commit 03b7a221f701a9b003890878e730ad175c3fdd86
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 5 13:12:11 2017 -0800
+
+    [debug] Use %p to print pointers
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/640
+
+ src/hb-debug.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 353cc6fbf09d16aad18b48a3a46ec7dd348aedc6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Dec 6 00:04:30 2017 +0330
+
+    [ci] Fix appveyor badge
+
+ README | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0dc03ef75724376927a7d63b991508c2901fcdf9
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Tue Dec 5 17:43:09 2017 +0000
+
+    Indic: always hyphenate pre-base-reordering, for clarity.
+
+ src/hb-ot-shape-complex-indic.cc | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit be59f3cbf4e3269ea05d5a707cdae04a32e097ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 5 09:01:28 2017 -0800
+
+    Silence unused-variables warning on MSVC
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/635
+
+ src/hb-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 80c1b01f054c5d65ca96a568aaf1c28ffe97215b
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Dec 5 08:28:42 2017 -0500
+
+    Allow digits in language system tags
+
+ src/hb-ot-tag.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 85bb89a88bdfae02fb7c27c7b994f4f22723442a
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Dec 4 15:15:27 2017 -0500
+
+    Fix string matching in parse_bool
+
+ src/hb-common.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0fd89dc61c6a26253aa9bb85e8dfd9faded11440
+Author: Olivier Blin <olivier.blin@softathome.com>
+Date:   Mon Dec 4 18:58:41 2017 +0100
+
+    [hb-ft] Fix build when Multiple Master font support is disabled
+    in freetype
+
+    FT_Set_Var_Blend_Coordinates() is not available when "Multiple Master
+    font interface" is disabled in freetype's modules.cfg
+
+ configure.ac         | 1 +
+ src/hb-ft.cc         | 2 ++
+ util/helper-cairo.cc | 2 ++
+ 3 files changed, 5 insertions(+)
+
+commit 843f7f70355f62511a5d8be3b905c853bf362629
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 4 08:52:39 2017 -0800
+
+    1.7.2
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit eeb26d21d493183f54704487754d53a127b017ae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 2 15:22:04 2017 -0800
+
+    [set] Actually commit fixes mentioned in previous commit!
+
+ src/hb-set-private.hh | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 20b4672754baf9751642bb37344a6ff4e224dc37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 2 15:14:26 2017 -0800
+
+    [set] Fix recent changes
+
+    Ouch!
+
+    Add tests.
+
+ test/api/test-set.c | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit 0744149cdabd85d632822ff810d3994787bca4b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 2 15:06:15 2017 -0800
+
+    [set] Protect against bad input in hb_set_add_range()
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d5e29303db47a1868fa9b044ca61e146f882179c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 28 23:11:34 2017 -0800
+
+    [coretext] Add hb_coretext_font_create()
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/628
+
+    New API:
+    hb_coretext_font_create()
+
+ src/hb-coretext.cc | 55
+ ++++++++++++++++++++++++++++++++++--------------------
+ src/hb-coretext.h  |  3 +++
+ 2 files changed, 38 insertions(+), 20 deletions(-)
+
+commit 9d0194b3a8e0c562249337fa0cf4d72e89334263
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 1 13:56:06 2017 -0800
+
+    [set] Optimize add_range() some more
+
+    It's as good as it gets, and seems to be on par with previous set
+    implementation
+    in my benchmark.
+
+    Would be great if someone can double-check my bitops.
+
+ src/hb-set-private.hh | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+commit 438c325a256f040c6be840924ed42dcbcd8a049a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 1 13:34:14 2017 -0800
+
+    [set] Optimize add_range()
+
+    With new set implementation, this became really costy.  Optimize it.
+    There's more to be done, but this shaves off most of the fat.
+
+    Part of fixing
+    https://bugs.chromium.org/p/chromium/issues/detail?id=782220
+
+ src/hb-set-private.hh | 56
+ +++++++++++++++++++++++++++++++++++++--------------
+ 1 file changed, 41 insertions(+), 15 deletions(-)
+
+commit be9e307a889e04d198042ad39949d3971232ab26
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 1 12:36:26 2017 -0800
+
+    [ot] Ensure layout in hb_ot_layout_table_get_lookup_count()
+
+ src/hb-ot-layout.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d9066afd6bc260d2f2ad5cd5b3e8b196e944d3d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 29 16:18:18 2017 -0800
+
+    Add another test for previous commit
+
+    From https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4273
+
+ .../sha1sum/bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf  | Bin 0 ->
+ 204 bytes
+ test/shaping/tests/fuzzed.tests                           |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit 16fba5b2158a0e093e6df32637eba5058942e299
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 29 16:08:11 2017 -0800
+
+    [ot] Fix Extension type recurse to disallow recursing to another
+    Extension
+
+    Particularly hazardous if the second layer mixes forward and backward
+    lookups.
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4336
+
+ src/hb-ot-layout-gsub-table.hh                           |   6 ++++--
+ .../sha1sum/9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf | Bin 0 ->
+ 4545 bytes
+ .../sha1sum/ef2511f215aa3ca847cbfffbf861793b42170875.ttf | Bin 0 ->
+ 1152 bytes
+ test/shaping/tests/fuzzed.tests                          |   2 ++
+ 4 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 7ab49de987b856312d7ad1d02639f7306aa0ad2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 29 14:20:09 2017 -0800
+
+    Try fixing Mac build with 10.12
+
+    Related
+    https://github.com/harfbuzz/harfbuzz/issues/345
+    https://github.com/harfbuzz/harfbuzz/pull/629
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d672bcf9d72bb473f5f53089c8af595c4047bc99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 28 22:20:57 2017 -0800
+
+    Minor
+
+ docs/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 23ade70783a17ed6822d13e7a910544de2ef181f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 21 16:36:07 2017 -0800
+
+    [doc] Optimize HarfBuzz.png; add HarfBuzz.svg
+
+    SVG is unused. Just keeping it here.
+
+ docs/HarfBuzz.png | Bin 14203 -> 8814 bytes
+ docs/HarfBuzz.svg | 277
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 277 insertions(+)
+
+commit 77efdecadddbd68bbbc0ff85ac84e24976ad4d4f
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Nov 22 00:14:29 2017 +0200
+
+    Improve the docs commit message a bit
+
+ .ci/deploy-docs.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a13c0748c59a92812469ada762d57bce3b02fe34
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Nov 21 09:52:18 2017 +0330
+
+    Move gh-pages docs to harfbuzz.github.io
+
+ .ci/deploy-docs.sh |  10 +++++-----
+ README             |   2 ++
+ docs/HarfBuzz.png  | Bin 12710 -> 14203 bytes
+ docs/circle.yml    |   3 ---
+ 4 files changed, 7 insertions(+), 8 deletions(-)
+
+commit 9f259769a61f17b47701bbad79e1865571338417
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Nov 21 14:16:10 2017 -0500
+
+    Categorize U+A8B4 as Consonant_Medial
+
+ src/gen-use-table.py                                     |   3 +++
+ src/hb-ot-shape-complex-use-table.cc                     |   2 +-
+ .../sha1sum/373e67bf41ca264e260a9716162b71a23549e885.ttf | Bin 0 ->
+ 1164 bytes
+ test/shaping/tests/use-syllable.tests                    |   1 +
+ 4 files changed, 5 insertions(+), 1 deletion(-)
+
+commit cd8c62fd41ca824c5db3c55fd1faa20318ca0bf9
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Tue Nov 21 01:07:26 2017 -0500
+
+    [ci] Add Oracle Developer Studio (former Sun Studio) based compiler
+    (#621)
+
+ .circleci/config.yml | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+commit 8d55340593ce32e55cfbd86a17c0be8750e8fb72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 20 19:43:22 2017 -0800
+
+    Fix fallback positioning of double diacritic marks
+
+    Fixes https://bugzilla.gnome.org/show_bug.cgi?id=787284
+
+ src/hb-ot-shape-fallback.cc                               |   4 ++--
+ .../sha1sum/856ff9562451293cbeff6f396d4e3877c4f0a436.ttf  | Bin 0 ->
+ 892 bytes
+ test/shaping/tests/fallback-positioning.tests             |   1 +
+ 3 files changed, 3 insertions(+), 2 deletions(-)
+
+commit bb7cc4eada06839a3892cea5919f0c310cbaf7c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 20 19:39:47 2017 -0800
+
+    Minor
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a0ad0d5bb8260cb297ff114adca7c8d05b6128bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 20 15:07:48 2017 -0800
+
+    [docs] s/Harfbuzz/HarfBuzz/g
+
+ docs/harfbuzz-docs.xml                             |  2 +-
+ ...anual-buffers-language-script-and-direction.xml | 10 +++----
+ docs/usermanual-fonts-and-faces.xml                |  2 +-
+ docs/usermanual-hello-harfbuzz.xml                 | 34
+ +++++++++++-----------
+ docs/usermanual-install-harfbuzz.xml               |  2 +-
+ docs/usermanual-what-is-harfbuzz.xml               | 20 ++++++-------
+ 6 files changed, 35 insertions(+), 35 deletions(-)
+
+commit 87d74605f5f9db685bef7329f498437b4d868e6f
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Nov 20 13:19:34 2017 -0500
+
+    Categorize U+0C80 as Consonant_Placeholder
+
+ src/hb-ot-shape-complex-indic.cc                         |   1 +
+ .../sha1sum/81c368a33816fb20e9f647e8f24e2180f4720263.ttf | Bin 0 ->
+ 1152 bytes
+ test/shaping/tests/indic-syllable.tests                  |   1 +
+ 3 files changed, 2 insertions(+)
+
+commit 7c6937e7c7b62602fef10ac4b2e164d0c67c932b
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Mon Nov 20 14:49:22 2017 -0500
+
+    Move all references of old url to the new address (#622)
+
+ .travis.yml                              |   2 +-
+ BUILD.md                                 |   2 +-
+ CMakeLists.txt                           |   2 +-
+ NEWS                                     |  20 ++++++++++----------
+ README                                   |   8 ++++----
+ RELEASING.md                             |   2 +-
+ configure.ac                             |   2 +-
+ docs/HarfBuzz.png                        | Bin 3419 -> 12710 bytes
+ docs/harfbuzz-docs.xml                   |   2 +-
+ docs/usermanual-install-harfbuzz.xml     |   2 +-
+ harfbuzz.doap                            |   2 +-
+ src/gen-use-table.py                     |   4 ++--
+ src/hb-coretext.cc                       |   2 +-
+ src/hb-debug.hh                          |   2 +-
+ src/hb-ot-layout-gsub-table.hh           |  22 +++++++++++-----------
+ src/hb-ot-layout-gsubgpos-private.hh     |   2 +-
+ src/hb-ot-layout-private.hh              |   8 ++++----
+ src/hb-ot-shape-complex-arabic.cc        |   4 ++--
+ src/hb-ot-shape-complex-hebrew.cc        |   2 +-
+ src/hb-ot-shape-complex-indic-private.hh |   2 +-
+ src/hb-ot-shape-complex-indic.cc         |   8 ++++----
+ src/hb-ot-shape-complex-use-machine.rl   |   2 +-
+ src/hb-ot-shape.cc                       |   2 +-
+ src/hb-private.hh                        |   2 +-
+ src/hb-unicode-private.hh                |   2 +-
+ src/sample.py                            |   2 +-
+ test/api/test-set.c                      |   2 +-
+ test/fuzzing/README                      |   2 +-
+ 28 files changed, 57 insertions(+), 57 deletions(-)
+
+commit baf7779d2d6e4810168a8f036bbf8f9e6493dd1a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 21:53:48 2017 -0800
+
+    Limit how much recursion GSUB/GPOS does
+
+    This only counts recursions right now.  Good start.
+
+    Hopefully...
+    Fixes https://github.com/behdad/harfbuzz/issues/429
+
+ src/Makefile.am                      |  5 ++++-
+ src/hb-buffer-private.hh             | 15 +++++++++++++--
+ src/hb-buffer.cc                     |  2 ++
+ src/hb-ot-layout-gsubgpos-private.hh |  5 ++++-
+ src/hb-ot-shape.cc                   | 10 ++++++++--
+ test/shaping/tests/fuzzed.tests      |  2 +-
+ 6 files changed, 32 insertions(+), 7 deletions(-)
+
+commit 173dab6300d9b492f2d1c68f9e8f7817211a3462
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 21:27:24 2017 -0800
+
+    Minor move
+
+ src/hb-buffer-private.hh | 26 ++++++++++++++------------
+ 1 file changed, 14 insertions(+), 12 deletions(-)
+
+commit c6173a392cfaa3d339c768836e8cddf3ae4adc53
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 21:09:03 2017 -0800
+
+    Add Offset16 and Offset32
+
+ src/hb-open-type-private.hh        | 5 ++++-
+ src/hb-ot-layout-common-private.hh | 4 ++--
+ src/hb-ot-name-table.hh            | 2 +-
+ src/hb-ot-var-fvar-table.hh        | 2 +-
+ 4 files changed, 8 insertions(+), 5 deletions(-)
+
+commit 6f335ed1e52c6161fa0b0295776856fc07f7f46f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 21:06:07 2017 -0800
+
+    Replace USHORT/SHORT/ULONG/etc with UINT16/INT16/UINT32/etc
+
+ src/hb-open-file-private.hh               |   6 +-
+ src/hb-open-type-private.hh               |  67 ++++++------
+ src/hb-ot-cbdt-table.hh                   |  78 +++++++-------
+ src/hb-ot-cmap-table.hh                   |  90 ++++++++--------
+ src/hb-ot-glyf-table.hh                   |  10 +-
+ src/hb-ot-head-table.hh                   |  28 ++---
+ src/hb-ot-hhea-table.hh                   |  18 ++--
+ src/hb-ot-kern-table.hh                   |  36 +++----
+ src/hb-ot-layout-common-private.hh        | 118 ++++++++++----------
+ src/hb-ot-layout-gdef-table.hh            |  22 ++--
+ src/hb-ot-layout-gpos-table.hh            |  94 ++++++++--------
+ src/hb-ot-layout-gsub-table.hh            |  30 +++---
+ src/hb-ot-layout-gsubgpos-private.hh      | 172
+ +++++++++++++++---------------
+ src/hb-ot-math-table.hh                   |  26 ++---
+ src/hb-ot-maxp-table.hh                   |   2 +-
+ src/hb-ot-name-table.hh                   |  16 +--
+ src/hb-ot-os2-table.hh                    |  70 ++++++------
+ src/hb-ot-post-table.hh                   |  16 +--
+ src/hb-ot-shape-complex-arabic-win1256.hh |  32 +++---
+ src/hb-ot-var-avar-table.hh               |   4 +-
+ src/hb-ot-var-fvar-table.hh               |  20 ++--
+ src/hb-ot-var-hvar-table.hh               |   8 +-
+ src/hb-ot-var-mvar-table.hh               |  10 +-
+ 23 files changed, 486 insertions(+), 487 deletions(-)
+
+commit a130ee6df50a50f541d0e8018deea9cee8c6738a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 20:30:03 2017 -0800
+
+    Remove a couple of unused consts
+
+ src/hb-ot-hhea-table.hh              | 5 -----
+ src/hb-ot-layout-gsubgpos-private.hh | 3 ---
+ src/main.cc                          | 4 ++--
+ 3 files changed, 2 insertions(+), 10 deletions(-)
+
+commit e20e47eaa1b7dd33ac63ab0eaa8f5ea1bf7775c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 20:25:29 2017 -0800
+
+    [glyf] Try fixing undefined-behavior
+
+    Might fix https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1463
+
+ src/hb-ot-glyf-table.hh | 17 ++++++++---------
+ 1 file changed, 8 insertions(+), 9 deletions(-)
+
+commit 7b40876a58d331200e1d7cda1dec72578139ff9c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 20:22:05 2017 -0800
+
+    [ot] Remove unneeded TODO item
+
+    Looks like hb-ot-font is complete after all!
+
+    CFF font names and CFF glyph metrics don't work though...
+
+ src/hb-ot-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit eab4feb5e221b8219c071ea882de79405aca4e84
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 20:16:45 2017 -0800
+
+    [hmtx] Use curiously recurring template pattern
+
+    https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
+
+ src/hb-ot-font.cc       | 11 ++++-------
+ src/hb-ot-hmtx-table.hh | 29 +++++++++++++++--------------
+ 2 files changed, 19 insertions(+), 21 deletions(-)
+
+commit 977ddff1f1e0f0f71a46c60ba713d160b96f5a3c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 20:06:19 2017 -0800
+
+    [ot] Move hb_ot_face_cmap_accelerator_t
+
+ src/hb-ot-cmap-table.hh | 149
+ +++++++++++++++++++++++++++++++++++++++++++++---
+ src/hb-ot-font.cc       | 130 +-----------------------------------------
+ 2 files changed, 142 insertions(+), 137 deletions(-)
+
+commit a7f15959b5e6e14e5241a3155c413ff70e7d1eb3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 20:02:24 2017 -0800
+
+    Shuffle
+
+ src/hb-ot-hmtx-table.hh | 76
+ ++++++++++++++++++++++++-------------------------
+ 1 file changed, 38 insertions(+), 38 deletions(-)
+
+commit a85d7ead04aff81d2f9df9110316892dbbefe1c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 20:00:34 2017 -0800
+
+    [ot] Move hb_ot_face_metrics_accelerator_t
+
+ src/hb-ot-font.cc       | 108
+ +-----------------------------------------------
+ src/hb-ot-hmtx-table.hh | 108
+ +++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 109 insertions(+), 107 deletions(-)
+
+commit f00a94e1ec73c08d4bde1f50bff57d2dc9583ca8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 19:54:48 2017 -0800
+
+    Adjust privacy for recent changes
+
+ src/hb-ot-cbdt-table.hh | 6 ++++--
+ src/hb-ot-glyf-table.hh | 6 ++++--
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+commit 7e2839c438beea216c7c8a3881e88961940e67be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 19:52:09 2017 -0800
+
+    [ot] Move hb_ot_face_glyf_accelerator_t
+
+ src/hb-ot-font.cc       |  75 +----------------------------------
+ src/hb-ot-glyf-table.hh | 103
+ +++++++++++++++++++++++++++++++++++++++++-------
+ 2 files changed, 90 insertions(+), 88 deletions(-)
+
+commit c4e18e54dc5ffecac7b327bde9f52dd0927d6a08
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 19:47:31 2017 -0800
+
+    [ot] Move hb_ot_face_cbdt_accelerator_t
+
+ src/hb-ot-cbdt-table.hh | 85
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-font.cc       | 87
+ +------------------------------------------------
+ src/hb-ot-post-table.hh |  1 +
+ 3 files changed, 87 insertions(+), 86 deletions(-)
+
+commit 9b04b0384fe746bdb1885c57e1ce73c4c6cae9e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 19:31:50 2017 -0800
+
+    [ot] Fold hb_ot_face_post_accelerator_t
+
+ src/hb-ot-font.cc       | 35 +----------------------------------
+ src/hb-ot-post-table.hh |  9 +++++++--
+ 2 files changed, 8 insertions(+), 36 deletions(-)
+
+commit 702d86ba6b4a2e41cbee46fea18b3f8eb8986dc9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 19:25:38 2017 -0800
+
+    [ot] Fold hb_ot_face_kern_accelerator_t
+
+ src/hb-ot-font.cc       | 23 +----------------------
+ src/hb-ot-kern-table.hh | 13 +++++++++----
+ 2 files changed, 10 insertions(+), 26 deletions(-)
+
+commit 909de95a112ffe4d05ddcfed97a235763e8af068
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 16:22:52 2017 -0800
+
+    Minor build fix
+
+ src/Makefile.am | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit b9c96b5d7cce80ef75cbdf0f0c47d1db62797c55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 15:56:21 2017 -0800
+
+    Add test for previous commit
+
+    At some point we should run tests under valgrind...
+
+ .../sha1sum/dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf | Bin 0 ->
+ 2786 bytes
+ test/shaping/tests/fuzzed.tests                          |   3 ++-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit e5930722d485207ca158612a2b08816337fed7e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 15:47:55 2017 -0800
+
+    Fix invalid buffer access in OOM times
+
+    Hopefully fully fixes
+    https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1856
+
+ src/hb-ot-layout-gsubgpos-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit fcd6c338ff4968a0d7fc297da1c6d8058823aaa1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 14:40:21 2017 -0800
+
+    Fix more compiler warnings
+
+ src/hb-debug.hh | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit 7fdf16b2ceb709b78654f99e6513fa878cd4d575
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 14:40:11 2017 -0800
+
+    Fix compiler warning
+
+ src/hb-string-array.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 87f0ad183c489ef3208cf454d43c448638316092
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Nov 2 10:59:25 2017 -0400
+
+    Allow U+20F0 in USE clusters
+
+ src/gen-use-table.py                               |   4 +++
+ src/hb-ot-shape-complex-use-table.cc               |  34
+ +++++++++++++--------
+ .../074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf   | Bin 0 -> 2296 bytes
+ test/shaping/tests/use-syllable.tests              |   1 +
+ 4 files changed, 26 insertions(+), 13 deletions(-)
+
+commit f93c6f8bfa228e95311d8d6d02dcc64b603c6e36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 11:09:19 2017 -0800
+
+    1.7.1
+
+ NEWS         | 8 ++++++++
+ configure.ac | 2 +-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 93f7c1652a05e806c2e3ac7edf498d2f4a508a3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 10:59:54 2017 -0800
+
+    Revert "[glib/ucdn/icu/ft/ot] Make returned funcs inert"
+
+    This reverts commit 5daf3bd4494cce6b4fb074533be9e99c4d9e0edd.
+
+    If other atexit callbacks try to destruct the objects we destruct
+    in atexit callbacks, bad things will happen.
+
+    I'll come up with some other way to catch premature destruction
+    of HB-owned objects.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/618
+
+ src/hb-ft.cc             |  3 ---
+ src/hb-glib.cc           |  3 ---
+ src/hb-icu.cc            |  3 ---
+ src/hb-object-private.hh | 37 ++++++-------------------------------
+ src/hb-ot-font.cc        |  3 ---
+ src/hb-ucdn.cc           |  3 ---
+ 6 files changed, 6 insertions(+), 46 deletions(-)
+
+commit c48475f33ab88be6664d41b039f7be7c3e56a5a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 13 20:26:29 2017 -0800
+
+    Whitespace
+
+ src/hb-open-type-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 83d68027360ff655d3b59371fb606fc9e40df4ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 13 20:25:02 2017 -0800
+
+    Clean up GlyphID
+
+    After 4a27c17ea0234dfe33e62f5830d9f92c26d48d30 we do not need
+    the special GlyphID.cmp(hb_codepoint_t), so just make GlyphID
+    a typedef.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/612
+
+ src/hb-open-type-private.hh | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit 7f39f576148643b4790fd70361e328b4b4da3149
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 13 15:04:13 2017 -0800
+
+    Implement strtod_l() on MSVC
+
+    Patch from Jean Ghali on mailing list.
+
+ src/hb-common.cc | 21 +++++++++++++++------
+ 1 file changed, 15 insertions(+), 6 deletions(-)
+
+commit e5d709889200571b62a611e0f44a410591983f8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 13 09:42:37 2017 -0800
+
+    1.7.0
+
+ NEWS         | 12 ++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit e4da38020021a92afa4062ed676f286945070dc4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 10 17:14:27 2017 -0800
+
+    [coretext/uniscribe/directwrite/graphite/fallback] Update for
+    unsafe-to-break
+
+    Fixes https://github.com/behdad/harfbuzz/issues/615
+
+    We'll see which bots I broke.
+
+ src/hb-buffer-private.hh | 17 +++++++++++++++--
+ src/hb-coretext.cc       |  2 ++
+ src/hb-directwrite.cc    |  3 +--
+ src/hb-fallback-shape.cc |  2 ++
+ src/hb-graphite2.cc      |  2 ++
+ src/hb-uniscribe.cc      |  2 ++
+ 6 files changed, 24 insertions(+), 4 deletions(-)
+
+commit 4de03a1585cf735e3ac09847af761ff85fca5a02
+Author: Martin Hosken <martin_hosken@sil.org>
+Date:   Fri Nov 10 13:47:38 2017 +0700
+
+    Fix graphite intergration reordered clusters problem
+
+ src/hb-graphite2.cc | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 8eed9cb11e28728a58e265fde5c13f519ccbdb4e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 9 18:09:40 2017 -0800
+
+    [kern] Fix invalid memory access if offset is zero
+
+    If offset is zero, we return Null() object.  Wasn't prepared for that.
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4088
+
+ src/hb-ot-kern-table.hh                                   |   9 +++++----
+ .../sha1sum/243798dd281c1c77c065958e1ff467420faa9bde.ttf  | Bin 0 ->
+ 225 bytes
+ test/shaping/tests/fuzzed.tests                           |   1 +
+ 3 files changed, 6 insertions(+), 4 deletions(-)
+
+commit b68fba4dc81ce2e7552c5d50a93013281889a65b
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Nov 3 14:27:33 2017 +0200
+
+    [test] Use glyph ids instead of forcing ft funcs
+
+    We were using ft funcs because these are CFF fonts, but we can avoid
+    glyph names instead and keep testing both ot and ft.
+
+ test/shaping/tests/indic-consonant-with-stacker.tests | 8 ++++----
+ test/shaping/tests/indic-script-extensions.tests      | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 2fcfbcf8052bba0db7590a5f057730075fdbd5e1
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Nov 2 09:45:06 2017 +0200
+
+    [test] Fix another instance of component rounding
+
+    See https://github.com/behdad/harfbuzz/pull/590#issuecomment-341194673
+
+ .../sha1sum/7ef276fc886ea502a03b9b0e5c8b547d5dc2b61c.ttf  | Bin 784 ->
+ 0 bytes
+ .../sha1sum/8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf  | Bin 0 ->
+ 784 bytes
+ test/shaping/tests/fallback-positioning.tests             |   3 +--
+ 3 files changed, 1 insertion(+), 2 deletions(-)
+
+commit c4f4c0a2faab0635dd2ab3078243994ad3066287
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 8 17:04:31 2017 -0800
+
+    Fix indexing in unsafe-to-break marking for 'stch' feature
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4099
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 822035ce73931ccd5d2455584aad603037892498
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 8 17:03:55 2017 -0800
+
+    [tests/arabic-stch.tests] Don't show flags
+
+    We don't need to test the actual flag values.  For unsafe-to-break,
+    the --verify in run-tests.sh checks what we are interested in.
+
+ test/shaping/tests/arabic-stch.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 53f0c27ddca92af1af27b6ffa9dcd0949afed664
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 8 17:02:54 2017 -0800
+
+    Minor
+
+ test/shaping/run-tests.sh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 5a9cba9744876dfc56bdc9aed805f571bd0d4b0a
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Nov 8 13:15:27 2017 -0500
+
+    Mark non-initial left matras as unsafe to break
+
+ src/hb-ot-shape-complex-indic.cc                         |  14
+ +++++++++-----
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf | Bin 0 ->
+ 1380 bytes
+ test/shaping/tests/indic-init.tests                      |   1 +
+ 4 files changed, 11 insertions(+), 5 deletions(-)
+
+commit a6150306838b168475a9aa661ad569b0405c9f91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 6 15:40:07 2017 -0500
+
+    [kern] Implement format-2 kern subtable
+
+ src/hb-ot-kern-table.hh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 82a38d1f7a65537a4ef540af08c489512d6297ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 6 15:28:24 2017 -0500
+
+    [kern] Allow subtables longer than 64kb
+
+    Apparently calibri.ttf does this:
+    https://github.com/fonttools/fonttools/pull/1094#discussion_r148933791
+
+ src/hb-ot-font.cc       | 23 ++++++++++++++++++++++-
+ src/hb-ot-kern-table.hh | 41 +++++++++++++++++++++++++++++------------
+ 2 files changed, 51 insertions(+), 13 deletions(-)
+
+commit 625ae08fcee747fbdc33a3a6865fb3aa425662ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 4 12:01:11 2017 -0400
+
+    [kern] Towards implementing format-2
+
+ src/hb-open-type-private.hh |  4 +--
+ src/hb-ot-kern-table.hh     | 69
+ +++++++++++++++++++++++++++------------------
+ 2 files changed, 42 insertions(+), 31 deletions(-)
+
+commit 74e82adaea08ced18493e3341823dbd5b6cd493e
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Nov 6 14:41:55 2017 -0500
+
+    Mark glyphs involved in 'stch' as unsafe to break
+
+ src/hb-ot-shape-complex-arabic.cc                        |   1 +
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf | Bin 0 ->
+ 1420 bytes
+ test/shaping/tests/arabic-stch.tests                     |   1 +
+ 4 files changed, 3 insertions(+)
+
+commit 601126ad401d05b9c7fe4a34e870f1d1a1b057c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 3 20:34:11 2017 -0400
+
+    [configure] Fix gobject default value in help output
+
+    Fixes https://github.com/behdad/harfbuzz/issues/607
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5aad81943329df199501e9473e2cc39f9d4421a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 3 17:16:26 2017 -0400
+
+    Simplify tracing code when tracing is disabled
+
+    Fixes https://github.com/behdad/harfbuzz/pull/605
+
+ src/hb-debug.hh                      | 58
+ +++++++++++++++++++++++++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh | 10 +++----
+ 2 files changed, 52 insertions(+), 16 deletions(-)
+
+commit 40ec3bbb55b8af1668bb3d5f6232a85b15cff136
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 3 16:57:30 2017 -0400
+
+    Consolidate debug stuff into hb-debug.hh
+
+    Part of fixing https://github.com/behdad/harfbuzz/pull/605
+
+ src/Makefile.sources                 |   1 +
+ src/hb-blob.cc                       |   7 +-
+ src/hb-coretext.cc                   |   8 +-
+ src/hb-debug.hh                      | 383
+ +++++++++++++++++++++++++++++++++++
+ src/hb-directwrite.cc                |   6 +-
+ src/hb-ft.cc                         |   7 +-
+ src/hb-object-private.hh             |   8 +-
+ src/hb-open-type-private.hh          |  21 +-
+ src/hb-ot-layout-common-private.hh   |   8 +-
+ src/hb-ot-layout-gsubgpos-private.hh |  46 +----
+ src/hb-ot-shape-complex-arabic.cc    |   7 +-
+ src/hb-private.hh                    | 260 +-----------------------
+ src/hb-shape-plan.cc                 |   7 +-
+ src/hb-uniscribe.cc                  |   7 +-
+ 14 files changed, 404 insertions(+), 372 deletions(-)
+
+commit 384862d7ee2e27e6678844feafab69f03f77ac9a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 3 16:31:47 2017 -0400
+
+    Remove NO_COPY()
+
+ src/hb-ot-shape-private.hh | 4 +++-
+ src/hb-private.hh          | 8 --------
+ 2 files changed, 3 insertions(+), 9 deletions(-)
+
+commit 97145df2496f90e1ea4a41784f3224c60e973fd4
+Author: Unknown <kunda@scribus.net>
+Date:   Fri Nov 3 09:05:00 2017 -0400
+
+    Trivial typos
+
+    Found using `codespell -i 3 -w -I '../harf-whitelist.txt'`
+    whereas the whitelist contents were:
+    ```
+    beng
+    iff
+    pres
+    ot
+    te
+    teh
+    ```
+
+ NEWS                             | 2 +-
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ src/hb-ot-shape-fallback.cc      | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 4a591a0e515f5c15c807fe648c073d249820e5ec
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Nov 2 09:33:12 2017 -0700
+
+    [ci] Add ArchLinux (#604)
+
+ .circleci/config.yml | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
+
+commit d18ee5afe8b1992d234402cd71f809cd904113a5
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Nov 2 07:56:25 2017 -0700
+
+    Copy dummy docs/circle.yml to gh-pages branch (#603)
+
+ .ci/deploy-docs.sh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1955cbecc98ee88ba8a62df1d8c77a09ed5d2c75
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Nov 2 04:55:46 2017 -0700
+
+    Add a dummy CircleCI config to gh-pages branch (#602)
+
+ docs/circle.yml | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 4b3278ef8dc71ad4f744d763068d9a2e02d3d75d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 19:41:29 2017 -0600
+
+    [ot] Hook up horizontal kerning to kern table
+
+    Seems to work.  Yay!
+
+    Still to do: run kerning if GPOS doesn't have 'kern' feature.
+
+ src/hb-ot-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 77acc1106e6d984ee74ec606e145f455e6e55509
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 19:33:09 2017 -0600
+
+    [kern] More...
+
+    Almost there.
+
+ src/hb-ot-font.cc       | 14 +++++++++
+ src/hb-ot-kern-table.hh | 75
+ ++++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 88 insertions(+), 1 deletion(-)
+
+commit 49c0f35580946c74bc64dae2d2c65c7834e46ab2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 18:16:07 2017 -0600
+
+    [kern] See if this helps with making VS bot happy
+
+ src/hb-ot-kern-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 2c439210c9734cd21b08beba07d21147a6eb6d8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 18:13:35 2017 -0600
+
+    [uniscribe] Fix a couple of VS warnings
+
+ src/hb-uniscribe.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4c43a23bf479b42d42192bab56df6075c8ae0090
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 18:12:26 2017 -0600
+
+    [kern] Implement Format0
+
+ src/hb-ot-kern-table.hh | 51
+ +++++++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 45 insertions(+), 6 deletions(-)
+
+commit ac3d937c6cb0e2c7e019aa391b02da25aa6970de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 17:54:56 2017 -0600
+
+    [kern] Implement some more
+
+ src/hb-ot-kern-table.hh | 98
+ ++++++++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 77 insertions(+), 21 deletions(-)
+
+commit 2a16f647ae4c5115a356ba82245c77e0d01fcebf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 17:31:29 2017 -0600
+
+    [kern] Start implementing kern table
+
+    Pushing this out early to catch bot errors since I'm using template
+    tricks
+    we were not using in HarfBuzz before.
+
+ src/Makefile.sources    |   1 +
+ src/hb-ot-font.cc       |   1 +
+ src/hb-ot-kern-table.hh | 184
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 186 insertions(+)
+
+commit 292ef2675edb2cb579210183e77ac30335318a21
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Nov 1 16:24:46 2017 -0700
+
+    [ci] minor cleanup (#600)
+
+ .circleci/config.yml | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 260246a279699d313a45583c6a61e4bab717f739
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Nov 1 14:10:55 2017 -0700
+
+    [ci] Add Fedora builder (#598)
+
+ .circleci/config.yml | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 0e63cbed9cceb1d0238974ddfa9bc68d25d9c616
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Nov 1 20:49:42 2017 +0200
+
+    [test] Fix difference between ft and ot font funcs
+
+    See
+    https://github.com/behdad/harfbuzz/pull/590#issuecomment-341194673.
+
+    I simply removed the composite glyph and use the referenced simple
+    glyph directly.
+
+ .../sha1sum/4fac3929fc3332834e93673780ec0fe94342d193.ttf  | Bin 0 ->
+ 804 bytes
+ .../sha1sum/6466d38c62e73a39202435a4f73bf5d6acbb73c0.ttf  | Bin 824 ->
+ 0 bytes
+ test/shaping/tests/cluster.tests                          |   2 +-
+ 3 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 0b8f8dd869212ed2889cbdb79c4c4b639b8eff7a
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Nov 1 20:33:43 2017 +0200
+
+    Revert "[test] We don’t care about glyph positions here"
+
+    This reverts commit 70137e2b4b46918d9608f824a4b4b5cef2819158.
+
+ test/shaping/tests/cluster.tests | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f1245013bf7e9d490b43d9b8bebd467b2c1d14cc
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Nov 1 12:06:59 2017 +0200
+
+    [test] Run shaping tests with both ot and ft funcs
+
+ test/shaping/run-tests.sh | 21 ++++++++++++++++-----
+ 1 file changed, 16 insertions(+), 5 deletions(-)
+
+commit 70137e2b4b46918d9608f824a4b4b5cef2819158
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Nov 1 12:03:39 2017 +0200
+
+    [test] We don’t care about glyph positions here
+
+    Freetype and OT font functions give different positions for some
+    glyphs
+    in this font (OT seems to be correct), but that is not what we are
+    interested in in this test.
+
+    See
+    https://github.com/behdad/harfbuzz/pull/590#issuecomment-341045223.
+
+ test/shaping/tests/cluster.tests | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9234b364b178d44a11148d5c613169731667a2ae
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Nov 1 10:34:36 2017 +0200
+
+    [test] Use ft functions for this test
+
+    https://github.com/behdad/harfbuzz/pull/590#issuecomment-340967271
+
+ test/shaping/tests/vertical.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit afbfb9279cbebcd0a85ab2fcc822a3fdbb035272
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Oct 30 22:02:50 2017 +0200
+
+    [test] Always use ft font funcs for these tests
+
+    These are CFF fonts and ot functions don’t support CFF glyph
+    names yet.
+    The next commit will run all tests with ot functions.
+
+ test/shaping/tests/indic-consonant-with-stacker.tests | 8 ++++----
+ test/shaping/tests/indic-script-extensions.tests      | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 33e62636f739680ffbc1875391f05e80039a3259
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Nov 1 03:05:46 2017 -0700
+
+    [ci] Add FreeBSD9 (gcc4) (#595)
+
+ .circleci/config.yml | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit 102f5ead493ad2eac6c11c3fc8f2e793d3d57058
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Nov 1 02:10:18 2017 -0700
+
+    Enable PSVita (arm-none-eabi) compile again and add it to CI (#594)
+
+ .circleci/config.yml        | 17 ++++++++++++++---
+ src/hb-buffer-private.hh    |  2 +-
+ src/hb-buffer.cc            |  4 ++--
+ src/hb-open-file-private.hh |  2 +-
+ 4 files changed, 18 insertions(+), 7 deletions(-)
+
+commit 65d4e5bcda543c17e09867418365ba44b441d5d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 01:15:27 2017 -0600
+
+    [CircleCI] Ignore gh-pages branch
+
+    https://github.com/behdad/harfbuzz/pull/592
+
+ .circleci/config.yml | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 92bb5086424d7454d666732e39117a7d32490646
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 22:58:03 2017 -0600
+
+    [indic] Use mutable for virama_glyph
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6c04dcb28dcafc7d97799c80c0bc714c76d51d1c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 20:11:00 2017 -0600
+
+    Use bsearch() for large SFNT table directories
+
+ src/hb-open-file-private.hh | 21 +++++++++------------
+ 1 file changed, 9 insertions(+), 12 deletions(-)
+
+commit b0e33da02d062200dd41e4503ecc21fb4bd636e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 20:05:37 2017 -0600
+
+    Add BinSearchArrayOf<>
+
+ src/hb-open-file-private.hh | 25 +++++++++++--------------
+ src/hb-open-type-private.hh | 33 ++++++++++++++++++++++++++++++++-
+ src/hb-ot-font.cc           |  2 +-
+ 3 files changed, 44 insertions(+), 16 deletions(-)
+
+commit aca378f51ecf682ea1454071f671bbc7eef808bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 18:11:10 2017 -0600
+
+    Sanitize (Headless)ArrayOf()::len to ensure it doesn't use offsets
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5f047113142349ecf0dd6d00384f7ef7b3d1a85e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 18:10:40 2017 -0600
+
+    Fix HeadlessArrayOf::sanitize_shallow()
+
+ src/hb-open-type-private.hh | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit 7ce9f397d1e5fe68c49375ad904d4fce2c7ccc0a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 15:34:01 2017 -0600
+
+    Rename hb-sort-r.hh -> hb-dsalgs.hh
+
+ src/Makefile.sources               |  2 +-
+ src/{hb-sort-r.hh => hb-dsalgs.hh} | 14 +++++++-------
+ src/hb-ot-post-table.hh            |  2 +-
+ 3 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 8eaff980fc6d15856fa853479454b58668809c7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 15:30:06 2017 -0600
+
+    Remove HB_TAG_CHAR4
+
+ src/hb-common.cc  | 2 +-
+ src/hb-ot-tag.cc  | 2 +-
+ src/hb-private.hh | 5 -----
+ 3 files changed, 2 insertions(+), 7 deletions(-)
+
+commit d016c5bdb94704e726b104c318262b47c6a4b7c8
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Oct 27 12:14:00 2017 -0400
+
+    Categorize Grantha candrabindu for use in Tamil
+
+ src/hb-ot-shape-complex-indic.cc                         |   2 +-
+ .../sha1sum/b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf | Bin 0 ->
+ 1120 bytes
+ test/shaping/tests/indic-script-extensions.tests         |   1 +
+ 3 files changed, 2 insertions(+), 1 deletion(-)
+
+commit b902605133ef4a411afdaa8abda194e81facf525
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 14:25:46 2017 -0600
+
+    [CircleCI] Fix build
+
+    Fixes https://github.com/behdad/harfbuzz/issues/589
+
+ .circleci/config.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 0f78d78aae604cb8e61bd21785adb915da74626e
+Merge: b7982c9e 0feff4ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 14:13:31 2017 -0600
+
+    Merge commit '0feff4ba7b16501341c575e06b4c98a6e1bd2809'
+
+commit 0feff4ba7b16501341c575e06b4c98a6e1bd2809
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 14:02:32 2017 -0600
+
+    Simplify hb-sort-r.hh
+
+    See https://github.com/behdad/harfbuzz/pull/592
+
+ src/hb-sort-r.hh | 147
+ ++++++-------------------------------------------------
+ 1 file changed, 14 insertions(+), 133 deletions(-)
+
+commit b7982c9e65e0b58616cc8264dd52cac37753ef79
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Tue Oct 31 12:42:08 2017 -0700
+
+    [ci] Add CircleCI for cross-compiling (#592)
+
+ .circleci/config.yml | 61
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ README               |  1 +
+ 2 files changed, 62 insertions(+)
+
+commit c290ba5b7d4e9e4a5f02340a22e6c9c46564906b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 13:18:21 2017 -0600
+
+    Define _GNU_SOURCE
+
+    Might help with https://github.com/behdad/harfbuzz/pull/592
+    Ie. bringing in qsort_r() prototype always.
+
+ src/hb-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 98acdde3c6bd0745c3cbfb510e82fbd87ebd1a33
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 11:17:43 2017 -0600
+
+    [coretext/uniscribe] Fix build
+
+    https://travis-ci.org/behdad/harfbuzz/jobs/295039536#L3468
+    https://ci.appveyor.com/project/behdad/harfbuzz/build/1.0.697/job/dr1ujlntxafeqbej#L142
+
+ src/hb-coretext.cc  | 8 ++++++--
+ src/hb-uniscribe.cc | 8 ++++++--
+ 2 files changed, 12 insertions(+), 4 deletions(-)
+
+commit ec86cc5e552e9e8d64101feb1f540a9dc94a9025
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 30 14:11:59 2017 -0600
+
+    Fix Windows build
+
+    (And prevent it from happening in the future.)
+
+ src/hb-ot-layout.cc     | 1 +
+ src/hb-ot-name-table.hh | 4 +++-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit e35a763c07b60da6e5fbdb6edd9d25f575cd3d8b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 30 13:15:05 2017 -0600
+
+    [post] Implement glyph_from_name()
+
+    This concludes https://github.com/behdad/harfbuzz/pull/568
+
+ src/hb-ot-post-table.hh | 119
+ ++++++++++++++++++++++++++++++++++++------------
+ src/hb-private.hh       |  10 ++--
+ src/hb-sort-r.hh        |   2 +-
+ 3 files changed, 96 insertions(+), 35 deletions(-)
+
+commit 6c738f353ec4ab5974414fbb8ff1fb9383c4bde6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 30 12:21:44 2017 -0600
+
+    Make string-array return hb_string_t
+
+ src/hb-ot-post-table.hh | 17 ++---------------
+ src/hb-string-array.hh  | 11 +++++++++--
+ 2 files changed, 11 insertions(+), 17 deletions(-)
+
+commit e1a37f3db4f2364e98ff057209a94aa9b23e5c9d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 30 11:42:28 2017 -0600
+
+    Add hb_string_t
+
+ src/hb-ot-post-table.hh | 25 ++++++++-----------------
+ src/hb-private.hh       | 27 +++++++++++++++++++++++++++
+ 2 files changed, 35 insertions(+), 17 deletions(-)
+
+commit 21ac5678583259e673d961a26fadaad2bf33f1f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 30 09:48:09 2017 -0600
+
+    Fix tests
+
+ src/check-includes.sh |  2 +-
+ src/hb-sort-r.hh      | 32 ++++++++++++++++++++++++++++++--
+ 2 files changed, 31 insertions(+), 3 deletions(-)
+
+commit 0f8b5aa1bc2c831044a35fc8e52df58652cec86b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 30 09:46:36 2017 -0600
+
+    [post] Minor; towards implementing get_glyph_from_name()
+
+ src/hb-ot-post-table.hh | 56
+ +++++++++++++++++++++++++++----------------------
+ 1 file changed, 31 insertions(+), 25 deletions(-)
+
+commit 977679f229a10868dc668294082bd82125e4fe48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 29 17:33:32 2017 -0600
+
+    Add hb_bsearch_r()
+
+ src/hb-ot-post-table.hh |  1 +
+ src/hb-sort-r.hh        | 25 +++++++++++++++++++++++++
+ 2 files changed, 26 insertions(+)
+
+commit 0712e915b4814e350aa1d833c1dee5010cdbd8f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 29 17:01:47 2017 -0600
+
+    Remove hb_compare_func_t
+
+ src/hb-ot-map-private.hh    | 18 +++++++++++++-----
+ src/hb-ot-name-table.hh     |  2 +-
+ src/hb-ot-tag.cc            |  8 +++++---
+ src/hb-ot-var-mvar-table.hh | 10 +++++++---
+ src/hb-private.hh           |  9 ++-------
+ 5 files changed, 28 insertions(+), 19 deletions(-)
+
+commit 538da7496d70c86b41070ecf52592e52920d8808
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 29 16:38:58 2017 -0600
+
+    Add hb-sort-r, a portable qsort_r() replacement
+
+ src/Makefile.sources |   1 +
+ src/hb-sort-r.hh     | 227
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 228 insertions(+)
+
+commit 923a8f520addba095384b975ba8934e5a18fb696
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 29 15:00:54 2017 -0600
+
+    Fix up 5de83fab947e23cc729d69f8d44a28311298af9d
+
+ src/hb-ot-post-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b98c7c3f1fc8581ce9a0f40ae25aee5e1b2b3106
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 29 14:52:52 2017 -0600
+
+    [post] Minor
+
+ src/hb-ot-post-table.hh | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit 5de83fab947e23cc729d69f8d44a28311298af9d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 28 19:54:04 2017 -0600
+
+    [ot] Speed up get_glyph_name()
+
+    get_glyph_from_name() coming soon.
+
+ src/hb-ot-font.cc            |  13 ++--
+ src/hb-ot-post-table.hh      | 160
+ +++++++++++++++++++------------------------
+ src/test-buffer-serialize.cc |   4 +-
+ 3 files changed, 81 insertions(+), 96 deletions(-)
+
+commit feadee079e09e43e5f712a66816605e19155594e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 28 16:58:56 2017 -0600
+
+    [post] Refactor a bit, use our data types
+
+ src/hb-ot-post-table.hh | 25 ++++++++++---------------
+ 1 file changed, 10 insertions(+), 15 deletions(-)
+
+commit 5014c60afaab51a7a4813cf427a3d6053458279b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 28 12:00:49 2017 -0600
+
+    More nullptr fix
+
+    Fixes https://github.com/behdad/harfbuzz/issues/585
+
+ src/test.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 5daf3bd4494cce6b4fb074533be9e99c4d9e0edd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 16:34:01 2017 -0600
+
+    [glib/ucdn/icu/ft/ot] Make returned funcs inert
+
+    Such that client cannot accidentally destroy them, even though that
+    will be a bug in their code...
+
+ src/hb-ft.cc             |  3 +++
+ src/hb-glib.cc           |  3 +++
+ src/hb-icu.cc            |  3 +++
+ src/hb-object-private.hh | 37 +++++++++++++++++++++++++++++++------
+ src/hb-ot-font.cc        |  3 +++
+ src/hb-ucdn.cc           |  3 +++
+ 6 files changed, 46 insertions(+), 6 deletions(-)
+
+commit bfa7f37a73508ca185cf2f3e06755db8c8258ddf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 16:03:51 2017 -0600
+
+    Fix previous commit
+
+    Oops.
+
+ src/hb-glib.cc | 2 +-
+ src/hb-icu.cc  | 2 +-
+ src/hb-ucdn.cc | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 8864864b624590d95ae5dca61956695cbff1269a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 15:26:45 2017 -0600
+
+    [glib/icu/ucdn] Make the funcs object allocated on demand
+
+ src/hb-glib.cc | 36 +++++++++++++++++++++++++++++-------
+ src/hb-icu.cc  | 51 +++++++++++++++++++++++++++++++++++++--------------
+ src/hb-ucdn.cc | 37 +++++++++++++++++++++++++++++--------
+ 3 files changed, 95 insertions(+), 29 deletions(-)
+
+commit af3f72f9eb7d7b80ea827976a3303390b5deae8d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 15:13:50 2017 -0600
+
+    Correctly mark NullPool const
+
+    Saves some more code size as well!
+
+ src/hb-open-type-private.hh | 2 +-
+ src/hb-ot-layout.cc         | 2 +-
+ src/main.cc                 | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 51f4d4d5cd5a0dd1a581bee5b55b3cc0a74cbea3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 15:09:22 2017 -0600
+
+    Reduce prealloced number of user-data items from 2 to 1
+
+    Even 1 is too many but putting 0 breaks compile.  Saves 3k in .so
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3205de7906abab9d12e614e86e2c182a41420698
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 15:01:40 2017 -0600
+
+    Make the NullPool HB_INTERNAL shared
+
+    Saves 2k of .bss section.
+
+ src/hb-open-type-private.hh | 10 ++++++----
+ src/hb-ot-layout.cc         |  3 +++
+ src/main.cc                 |  1 +
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 7036f1d22c4001b79d3205c16aac3fefbfcaae24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 14:42:59 2017 -0600
+
+    [ot] Remove shaper name
+
+    In ten years we never used them...
+
+ src/hb-ot-shape-complex-arabic.cc  | 1 -
+ src/hb-ot-shape-complex-default.cc | 1 -
+ src/hb-ot-shape-complex-hangul.cc  | 1 -
+ src/hb-ot-shape-complex-hebrew.cc  | 1 -
+ src/hb-ot-shape-complex-indic.cc   | 1 -
+ src/hb-ot-shape-complex-myanmar.cc | 2 --
+ src/hb-ot-shape-complex-private.hh | 2 --
+ src/hb-ot-shape-complex-thai.cc    | 1 -
+ src/hb-ot-shape-complex-tibetan.cc | 1 -
+ src/hb-ot-shape-complex-use.cc     | 1 -
+ 10 files changed, 12 deletions(-)
+
+commit 4a27c17ea0234dfe33e62f5830d9f92c26d48d30
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 14:29:12 2017 -0600
+
+    Fix IntType.cmp() to avoid narrowing down integer types
+
+    Fixes https://github.com/behdad/harfbuzz/issues/571
+
+ src/hb-open-type-private.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 919b4b76a7b1f9dd7c71310a729982242f9060a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 10:29:25 2017 -0600
+
+    Make c++11 optional
+
+    Fixes https://github.com/behdad/harfbuzz/issues/585
+
+ configure.ac                |   4 +-
+ m4/ax_cxx_compile_stdcxx.m4 | 982
+ ++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 983 insertions(+), 3 deletions(-)
+
+commit 6c4689704071a76c49be819b8034feaf93e26a42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 10:24:58 2017 -0600
+
+    [m4] Update ax_pthread.m4
+
+ m4/ax_pthread.m4 | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 2e025507634e54a64fa5d0cbfefc4b65177c06c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 10:23:01 2017 -0600
+
+    [git.mk] Update
+
+ git.mk | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 55 insertions(+), 2 deletions(-)
+
+commit 62e312ead808cec055049592b0d40aa3a8882bc9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 09:29:20 2017 -0600
+
+    Use NULL instead of polyfill, if nullptr is not available
+
+    Part of fixing https://github.com/behdad/harfbuzz/issues/585
+
+ src/hb-private.hh | 22 +++-------------------
+ 1 file changed, 3 insertions(+), 19 deletions(-)
+
+commit 17f40b7cad240eadeccdf23eb11da7ed52252ca2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 09:22:30 2017 -0600
+
+    Include hb-private.hh more consistently
+
+    Part of fixing https://github.com/behdad/harfbuzz/issues/585
+
+ src/test-buffer-serialize.cc |  4 +---
+ src/test-size-params.cc      |  4 +---
+ src/test-would-substitute.cc |  4 +---
+ util/ansi-print.hh           |  1 +
+ util/helper-cairo-ansi.hh    |  5 +++--
+ util/helper-cairo.hh         |  7 ++++---
+ util/main-font-text.hh       |  5 +++--
+ util/options.hh              | 11 +----------
+ util/shape-consumer.hh       |  5 +++--
+ util/view-cairo.hh           |  7 ++++---
+ 10 files changed, 22 insertions(+), 31 deletions(-)
+
+commit 42d518513c683fd5e932898ceec891c3003d75e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 00:25:11 2017 -0600
+
+    Towards compiling with pre-C++11 compilers and nullptr fallback
+
+    https://github.com/behdad/harfbuzz/issues/585
+
+ src/hb-atomic-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0e9256984e76f055f1868ecc497724977caba11d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 26 20:34:04 2017 -0600
+
+    [post] Make format1 names array avoid relocations
+
+ src/Makefile.sources       |   1 +
+ src/hb-ot-post-macroman.hh | 294
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-post-table.hh    |  55 ++-------
+ 3 files changed, 305 insertions(+), 45 deletions(-)
+
+commit 2a749680441bbe6b4aa8134bb6ce9f21a8b1bc3c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 26 19:48:33 2017 -0600
+
+    Add hb-string-array.hh
+
+    Used to build static string arrays that use no relocation.
+
+ src/Makefile.sources   |  1 +
+ src/hb-private.hh      |  6 ++--
+ src/hb-string-array.hh | 74
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 79 insertions(+), 2 deletions(-)
+
+commit 6f08b12bc38166dee2f9740d396d617b32e887a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 26 18:23:03 2017 -0600
+
+    Minor
+
+ src/hb-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 223686d64f5e149ba8aa334a2a54bd5b22017d9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 26 12:52:02 2017 -0600
+
+    1.6.3
+
+ NEWS         | 9 +++++++++
+ configure.ac | 2 +-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 729c9e13355eefafdc0fdef9aa68bd792ca4dba4
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Oct 26 10:29:28 2017 -0400
+
+    Include all relevant glyphs in the subsetted font
+
+ test/shaping/record-test.sh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit cb6c6b0c425e560f32b297c15dc6775e297d5b1d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 26 11:43:33 2017 -0600
+
+    Fix warning
+
+    https://github.com/behdad/harfbuzz/commit/49a41dc75931cc2d2f7e74b7801f8cc327039e8e#commitcomment-25203194
+
+ test/api/test-set.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit dfd234a97d2e2f9908eaf0598de765f76ba86c82
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Thu Oct 26 16:59:50 2017 +0100
+
+    [set] Fix page_map[] indexing in backward loop.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/579.
+
+ src/hb-set-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7339926525416620aa7922371775ed65eed4eae4
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Thu Oct 26 12:55:36 2017 +0100
+
+    [test] Extend hb_set test for issue 579 (currently failing)
+
+ test/api/test-set.c | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+commit 3d6f7df42a87ef366197581cb4696c5f30c3bcbb
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Thu Oct 26 17:54:55 2017 +0100
+
+    [test] Additional coverage in test_set_iter.
+
+    This adds a couple extra entries to the set used, such that iteration
+    would fail in 1.6.2 due to the bug in hb_set_t::page_t::next().
+
+ test/api/test-set.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit d511cfb5577a58e31d8dd4214750b0ad4efa625a
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Thu Oct 26 15:08:29 2017 +0100
+
+    [set] Bugfix for hb_set_next
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 92bac64bd2d5fffe70229790be27d335aa6c6de3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 25 18:22:47 2017 -0600
+
+    [post] Oops!
+
+    https://ci.appveyor.com/project/behdad/harfbuzz/build/1.0.668/job/ikfj8peowgrp059t
+
+ src/hb-ot-post-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 543bd58d7a4fbe285ec9304ff3223a728dbdbb76
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 25 17:40:50 2017 -0600
+
+    [post] Touch up and fixes
+
+    The get_glyph_from_name() is incorrect; needs fixing.
+
+ src/hb-ot-font.cc       |   9 ++--
+ src/hb-ot-post-table.hh | 139
+ +++++++++++++++++++++++++++---------------------
+ 2 files changed, 81 insertions(+), 67 deletions(-)
+
+commit d9e166f74c3ba3128c9ef3ccd8d7799e67f14eab
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Oct 18 20:49:16 2017 +0200
+
+    [ot-font] Implement hb_ot_get_glyph_from_name
+
+ src/hb-ot-font.cc       | 22 ++++++++++++++++++-
+ src/hb-ot-post-table.hh | 58
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 79 insertions(+), 1 deletion(-)
+
+commit 9d4d2fb9af446d5d41058fbb1da8117b3af048d3
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Oct 16 10:05:42 2017 +0200
+
+    [ot-font] Implement hb_ot_get_glyph_name
+
+    Turns out we already have support for “post” table, it just
+    needed to be
+    activated and put in use.
+
+ src/hb-ot-font.cc                             | 46 ++++++++++++-
+ src/hb-ot-post-table.hh                       | 96
+ +++++++++++++++++++++++++++
+ test/shaping/tests/fallback-positioning.tests |  2 +-
+ test/shaping/tests/indic-syllable.tests       |  2 +-
+ test/shaping/tests/use.tests                  |  2 +-
+ 5 files changed, 143 insertions(+), 5 deletions(-)
+
+commit bf133497e53e8b1dcd22df62080d33e7f3d85b68
+Merge: fd786c76 49a41dc7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 25 17:23:20 2017 -0600
+
+    Merge commit '49a41dc75931cc2d2f7e74b7801f8cc327039e8e'
+
+commit 49a41dc75931cc2d2f7e74b7801f8cc327039e8e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 25 16:17:45 2017 -0600
+
+    [test] Add more hb-set tests
+
+    https://github.com/behdad/harfbuzz/issues/579
+
+ test/api/test-set.c | 40 ++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 40 insertions(+)
+
+commit fd786c768f838ab61090004dd46b8cefeb270dfd
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Oct 25 14:31:22 2017 -0400
+
+    Use `mktemp -d` instead of `mktemp --directory`
+
+ test/shaping/record-test.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c4944920c0c11d6424d600ebc9130c9055382f80
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Oct 25 16:06:40 2017 -0400
+
+    Fix and run indic-script-extensions.tests
+
+ test/shaping/Makefile.am                         | 1 +
+ test/shaping/tests/indic-script-extensions.tests | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit d8df714251c61e13d7d12eb3f7393dd3a75a3719
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Oct 25 16:06:01 2017 -0400
+
+    Fix code point iteration in narrow Python
+
+ test/shaping/hb_test_tools.py | 27 ++++++++++++++++++++++++++-
+ 1 file changed, 26 insertions(+), 1 deletion(-)
+
+commit 33ca3b67bfb5d9ae4e490c796c93793a7e03ef2c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 25 12:09:11 2017 -0400
+
+    Check for headers in builddir first, in check-*.sh
+
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=103346
+
+ src/check-c-linkage-decls.sh | 4 ++--
+ src/check-externs.sh         | 2 +-
+ src/check-header-guards.sh   | 2 +-
+ src/check-includes.sh        | 4 ++--
+ 4 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 9ac2e5c6c01db3ebe419e3aa07f4d1a3777d2bb6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 24 10:06:25 2017 -0400
+
+    check-externs.sh: Make output more verbose
+
+    Trying to figure out why this is failing on some Debian bots:
+    https://bugs.freedesktop.org/show_bug.cgi?id=103346
+
+    Maybe I should check for GNU grep specifically now that I'm using
+    -n as well.
+
+ src/check-externs.sh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 3b7388aab6889b5d1fc602b5780a7b29da84e100
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 14:35:16 2017 -0400
+
+    1.6.2
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 30a591e3cef67818ef1ffec92c6a022b5a5f5e77
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 14:28:35 2017 -0400
+
+    [set] Rewrite another way :P
+
+ src/hb-set-private.hh | 25 +++++++++++++------------
+ 1 file changed, 13 insertions(+), 12 deletions(-)
+
+commit 8170801d78a5bf9480d8c06ade849b30bc4e2956
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 14:26:48 2017 -0400
+
+    [set] Fix crash
+
+    Ouch!  That's what happens when one plays with increment/decrement
+    operators!
+
+    Fixes https://github.com/behdad/harfbuzz/issues/578
+
+ src/hb-set-private.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 61d1c60a1c555c58205964df4e449ee57125a739
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 13:10:21 2017 -0400
+
+    [RELEASING] Format
+
+ RELEASING.md | 67
+ +++++++++++++++++++++++++++++++++++++++++++-----------------
+ 1 file changed, 48 insertions(+), 19 deletions(-)
+
+commit 6a2e1649debd992211bf96ef80d075d2d04a49ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 13:01:34 2017 -0400
+
+    [doap] Switch to github issues
+
+    https://github.com/behdad/harfbuzz/pull/575#issuecomment-338514596
+
+ harfbuzz.doap | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8a898c1929cf7ffc9b0011461b34281ecc98705c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 13:00:36 2017 -0400
+
+    [RELEASING] Minor
+
+    https://github.com/behdad/harfbuzz/pull/575
+
+ RELEASING.md | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2ee710e02fad1a8a4b94589bb6f0b90e2aeb7121
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 08:37:48 2017 -0400
+
+    Minor
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dd33e4e96b9345a6b1a9051a6aa4b7d114c74f1e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 08:36:40 2017 -0400
+
+    [set] Don't use major()
+
+    Fixes https://github.com/behdad/harfbuzz/issues/577
+
+ src/hb-set-private.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit d0f0ff85b9fe959ef4b90f8daf58be73fca49dd0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 08:34:30 2017 -0400
+
+    [set] Don't use PAGE_SIZE
+
+    Fixes https://github.com/behdad/harfbuzz/issues/576
+
+ src/hb-set-private.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 57cf978fa314bd87405a2b133e58fcb116e574a6
+Merge: ce979454 6cc49762
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 18:24:59 2017 -0400
+
+    Merge commit '6cc49762c4fdfd0e2770a84d1b1f055acf42376f'
+
+commit ce979454400c3870717ba40b1065a2f3727cfb93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 18:23:38 2017 -0400
+
+    [icu] Fix error check
+
+ src/hb-icu.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6cc49762c4fdfd0e2770a84d1b1f055acf42376f
+Merge: 8b9d9b71 19923279
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Mon Oct 23 01:48:22 2017 +0330
+
+    Merge pull request #575 from behdad/releasing-edit
+
+    Clarify the last step of release
+
+commit 19923279abd4c7615e8b02e05a02ba18f5c0b298
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Mon Oct 23 01:47:51 2017 +0330
+
+    Clarify the last step of release
+
+ RELEASING.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8b9d9b71b04c9d5698ec146658b31381060c700d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 17:48:06 2017 -0400
+
+    Fix set initialization issues
+
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++++++------
+ src/hb-ot-shape.cc                   | 17 +++++++++--------
+ src/hb-set-private.hh                |  9 ---------
+ src/hb-set.cc                        |  6 ++++--
+ 4 files changed, 19 insertions(+), 25 deletions(-)
+
+commit 0ca915efc3734111a57ff71f05d9cbf0e8af3de9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 17:38:33 2017 -0400
+
+    1.6.1
+
+ NEWS         | 13 +++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit d59d5dc7d339deb45cc84cffd084b52752765a08
+Merge: ced86da7 3ee15a60
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 17:08:29 2017 -0400
+
+    Merge commit '3ee15a60358f4d894bbf2431d7a7df38b7acc4ce'
+
+commit ced86da7ddbbd0d64f8ba1290b8e67600b1db2d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 17:03:36 2017 -0400
+
+    Another try at fixing mingw32 build bot fail
+
+ src/hb-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bc1183aa6ba45a527084d391d6e7f801d6196060
+Merge: d45a2138 bfe0faf1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 17:06:00 2017 -0400
+
+    Merge commit 'bfe0faf1a2d39302129a7202994456afd96694ca'
+
+commit 3ee15a60358f4d894bbf2431d7a7df38b7acc4ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 17:03:36 2017 -0400
+
+    Another try at fixing mingw32 build bot fail
+
+ src/hb-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bfe0faf1a2d39302129a7202994456afd96694ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 15:54:50 2017 -0400
+
+    [docs] Deprecate hb_set_invert()
+
+ docs/harfbuzz-sections.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d45a2138d9d54eab158046d6503f1bb104efce25
+Merge: d8adaa97 41b18251
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Sat Oct 21 10:19:55 2017 +0330
+
+    Merge pull request #572 from fanc999/master.msvc
+
+    builds: Support HarfBuzz-GObject and introspection in CMake builds
+
+commit d8adaa97fbf33071b8a4b5c05c3f2f15f2fd22ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 20 13:57:43 2017 -0400
+
+    Another try at fixing build bots
+
+    hb-ot-shape.cc:287:18: error: comparison of constant 32 with
+    expression of type 'hb_unicode_general_category_t' is always true
+    [-Werror,-Wtautological-constant-out-of-range-compare]
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6058f98825e8f134893a1bbfb402e45d85b56ff0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 19 11:39:52 2017 -0700
+
+    Remove FLAG_SAFE()
+
+    No flag is safe, over time... See previous commit.
+
+ src/hb-ot-shape-complex-arabic.cc |  4 ++--
+ src/hb-ot-shape-complex-indic.cc  | 12 ++++++------
+ src/hb-ot-shape-complex-use.cc    |  2 +-
+ src/hb-private.hh                 |  5 ++---
+ src/hb-unicode-private.hh         |  4 ++--
+ 5 files changed, 13 insertions(+), 14 deletions(-)
+
+commit 7c561dacc3c5fb9306db8bda27b7289331bd523f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 19 11:35:51 2017 -0700
+
+    [myanmar] Fix unsafe usage of FLAG_SAFE()
+
+    The commit f559c633073f63b9d87cb2440048b4413cfa1c05 caused
+    "undefined-shift" errors in Myanmar shaper as we changed the
+    numeric value of type D from 19 to 32 there, making the
+    "FLAG_SAFE (info.myanmar_category())" wrong.
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3546
+
+ src/hb-ot-shape-complex-myanmar.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 41b1825196235d4337c76f97e09f0b7c6d6c56ae
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Thu Oct 19 18:36:32 2017 +0800
+
+    CMake builds: Support introspection builds
+
+    This adds support for introspection builds on Windows that is
+    enabled by
+    the HB_HAVE_INTROSPECTION option, which will also enable
+    HB_HAVE_GOBJECT
+    (and so HB_HAVE_GLIB) as they are required for introspection.
+
+    In order for this to work one must ensure that the Python installation
+    listed in PYTHON_EXECUTABLE is the same Python release series that was
+    used to build _giscanner.pyd (the Python module that is used by
+    g-ir-scanner), with the same architecture.  PKG_CONFIG_PATH and PATH
+    must be set correctly if $(PREFIX)\bin and/or $(PREFIX)\lib\pkgconfig
+    are not in the standard PATH and PKG_CONFIG_PATH, which is actually
+    in-line with the *NIX builds.
+
+ CMakeLists.txt | 161
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 154 insertions(+), 7 deletions(-)
+
+commit 53db221259b5eea4d2244321b2fe96beb39aef7d
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Wed Oct 18 15:43:57 2017 +0800
+
+    CMake: Support building HarfBuzz-GObject
+
+    This adds support to the CMake build files to support building
+    HarfBuzz-GObject, which is actually a little bit complicated,
+    as we need to:
+
+    -Run glib-mkenums, which is a Python (for newer GLib/GObject) or PERL
+     (for older, pre 2.53.4, GLib/GObject) script.  This matters more for
+     Visual Studio builds as shebang lines are not supported, so we
+     need to
+     test-run it with PERL or Python to determine which is the correct
+     interpretor to use.
+
+    -Next, we need to replace strings in the sources that we obtain from
+     running glib-mkenums.  So, the solution here is to use a small
+     utility
+     CMake script for our purposes here, to maintain maximum
+     compatibility.
+
+    -Ensure that things do work in the Visual Studio IDE builds.
+
+ CMakeLists.txt             | 128
+ +++++++++++++++++++++++++++++++++++++++++++++
+ Makefile.am                |   1 +
+ replace-enum-strings.cmake |  21 ++++++++
+ 3 files changed, 150 insertions(+)
+
+commit 162575f2c69f519aae1b18ff1c501e7e4c2cdd4b
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Wed Oct 18 22:27:28 2017 +0800
+
+    CMake builds: Fix builds
+
+    Include the fallback sources in the build, and update
+    src/Makefile.sources so that it can be read by the CMake build files.
+
+    Fix a typo in the DirectWrite configure option so that we can properly
+    enable DirectWrite builds.
+
+    Also, when building the utility program, install them as well.
+
+ CMakeLists.txt       | 21 ++++++++++++++++++++-
+ src/Makefile.sources |  4 +++-
+ 2 files changed, 23 insertions(+), 2 deletions(-)
+
+commit d6f612fac800c31989c298b5101845baed2297b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 17 16:32:12 2017 -0700
+
+    [bsearch] Micro-optimization
+
+ src/hb-open-type-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 41b1984be946cc2f53313dd48eac392cc8a3ad2b
+Author: Fredrik Roubert <fredrik@roubert.name>
+Date:   Tue Oct 17 15:06:31 2017 -0700
+
+    Switch from ICU deprecated unorm_normalize to unorm2_normalize. (#569)
+
+    The new unorm2_normalize has been public API since ICU 4.4, while
+    the old unorm_normalize has been deprecated since ICU 56.
+
+    Now, beginning with ICU 60, unorm_normalize will also be annotated
+    U_DEPRECATED and trigger the compiler -Wdeprecated-declarations
+    warning.
+
+ src/hb-icu.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit b98adefbb9ee45fc1e800a52f701bf4224e9bb81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 17 12:00:34 2017 -0700
+
+    Update docs symbols
+
+ docs/harfbuzz-sections.txt | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ba8b56960733b25bbb88fbdb60e7e244127d6e0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 17 11:16:36 2017 -0700
+
+    Try fixing build on VC
+
+    c:\projects\harfbuzz\src\hb-set-private.hh(151): error C2327:
+    'hb_set_t::page_t::v': is not a type name, static, or enumerator
+    [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 80cc0a7e3e05fb7fcfbdc0188cb60b115ad47d04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 17 11:14:48 2017 -0700
+
+    [coretext] Fix build
+
+    error: static_assert expression is not an integral constant expression
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a11249ee93439856ea2410524b993ac1f1379961
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 16 01:33:32 2017 -0400
+
+    [set] Fix merge logic
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ab8f327eb47184409d9e9208ca46b631d1afd0d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 18:21:35 2017 -0400
+
+    Ouch.
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bb9917913f735855aea54f41f10e0c7be3632e88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 18:20:25 2017 -0400
+
+    [set] Disable vectorization
+
+    Fixes clang "non-const reference cannot bind to vector element" error.
+
+ src/hb-set-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 221ce6c18f2a1e878b68eb0a97f235efa4c044d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 17:58:58 2017 -0400
+
+    Fix bots
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0cf7d957b7ffb17c4cec75b631c9829327ab5d52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 17:01:31 2017 -0400
+
+    [set] Remove TODO items not worth pursuing
+
+ src/hb-set-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 10d43658e7655b36cb86e674dde8af4036b7cc52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:56:05 2017 -0400
+
+    [set] Speed up intersects()
+
+ src/hb-set-private.hh | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
+
+commit 56ef4e0c52d5b474518bf0c1e4adba80f2ae6946
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:38:29 2017 -0400
+
+    Simplify hb_prealloced_array_t initialization
+
+ src/hb-private.hh | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit 7737e87ac4582d57945f3ffbbae1012f62c6b482
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:21:03 2017 -0400
+
+    Properly detect vector_size attribute and use fallback otherwise
+
+ src/hb-private.hh     | 67
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-set-private.hh | 62
+ ++---------------------------------------------
+ 2 files changed, 69 insertions(+), 60 deletions(-)
+
+commit f8a0ec50e23264fdfe9e3a5a2e0453a87f415b3d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:10:35 2017 -0400
+
+    [set] Add fallback implementation of int-vector type
+
+ src/hb-set-private.hh | 64
+ ++++++++++++++++++++++++++++++++++++---------------
+ 1 file changed, 45 insertions(+), 19 deletions(-)
+
+commit deed4a48d15d4a475f8695aa3269547adf63867a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:53:09 2017 +0200
+
+    Faster hb_set_t
+
+    Fixes https://github.com/behdad/harfbuzz/pull/23
+
+ src/hb-private.hh     |  56 ++++---
+ src/hb-set-private.hh | 431
+ +++++++++++++++++++++++++++++++++++++++++---------
+ test/api/test-set.c   |   6 -
+ 3 files changed, 391 insertions(+), 102 deletions(-)
+
+commit 1d3971200be5b1c949d3eca185654e48584a0868
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:15:24 2017 +0200
+
+    Deprecate hb_set_invert()
+
+ src/hb-deprecated.h | 4 ++++
+ src/hb-set.cc       | 3 ++-
+ src/hb-set.h        | 3 ---
+ 3 files changed, 6 insertions(+), 4 deletions(-)
+
+commit 5e74044b6bd78c495561eb7d2981415d2c3336f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:15:06 2017 +0200
+
+    Add bfind() to prealloaced_array_t
+
+ src/hb-private.hh | 31 ++++++++++++++++---------------
+ 1 file changed, 16 insertions(+), 15 deletions(-)
+
+commit db5f7ef18916abb0907bc8b569a65c9c6bbd4015
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:00:22 2017 +0200
+
+    Inline another bsearch()
+
+ src/hb-ot-map-private.hh |  4 ++--
+ src/hb-private.hh        | 32 ++++++++++++++++++++++++++++----
+ 2 files changed, 30 insertions(+), 6 deletions(-)
+
+commit 6fb4ac73f94636d19fcac143472b84f9d91985c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:00:09 2017 +0200
+
+    Add popcount for 64bit ints
+
+ src/hb-private.hh | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 473b17af4d421f4ce7ac18c769731bb2aa4088f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 14:10:34 2017 +0200
+
+    Remove unused hb_cache_t
+
+ src/Makefile.sources    |  1 -
+ src/hb-cache-private.hh | 74
+ -------------------------------------------------
+ src/hb-ft.cc            |  2 --
+ 3 files changed, 77 deletions(-)
+
+commit a433e60a43c4594c41a82c3741d3f870f6eec247
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 14:09:46 2017 +0200
+
+    Remove unused hb_frozen_set_t
+
+ src/hb-set-private.hh | 55
+ ---------------------------------------------------
+ 1 file changed, 55 deletions(-)
+
+commit 826a1daf2f2075459ff25a20ed8abec030d95c52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 14:09:05 2017 +0200
+
+    Move set-digests into their own header file
+
+ src/Makefile.sources         |   1 +
+ src/hb-ot-layout-private.hh  |   2 +-
+ src/hb-set-digest-private.hh | 144
+ +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-set-private.hh        | 113 ---------------------------------
+ 4 files changed, 146 insertions(+), 114 deletions(-)
+
+commit 3c13e153fe89d559d33027c0a5b30a19a6de1bad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 14:02:58 2017 +0200
+
+    Try fixing AppVeyor bots
+
+ src/hb-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7e3015a315afe2312134ac33b9cb2d73689a044f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 12:13:19 2017 +0200
+
+    Fix warnings
+
+ src/hb-font.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2075008f3e0b1cfbd7006f1d8c1fa22ac014f4bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 12:12:10 2017 +0200
+
+    Use C++11
+
+ configure.ac | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit dbdbfe3d7b36613d893832dcb1884c756c20bfda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 12:11:08 2017 +0200
+
+    Use nullptr instead of NULL
+
+ src/hb-blob.cc                             |  12 ++--
+ src/hb-buffer-serialize.cc                 |  16 ++---
+ src/hb-buffer.cc                           |  10 +--
+ src/hb-common.cc                           |  18 ++---
+ src/hb-coretext.cc                         |  66 ++++++++---------
+ src/hb-directwrite.cc                      |  28 ++++----
+ src/hb-face.cc                             |  10 +--
+ src/hb-font.cc                             |  32 ++++-----
+ src/hb-ft.cc                               |  56 +++++++--------
+ src/hb-glib.cc                             |   2 +-
+ src/hb-gobject-structs.cc                  |   2 +-
+ src/hb-graphite2.cc                        |  26 +++----
+ src/hb-icu.cc                              |   4 +-
+ src/hb-mutex-private.hh                    |   2 +-
+ src/hb-object-private.hh                   |   2 +-
+ src/hb-open-type-private.hh                |  32 ++++-----
+ src/hb-ot-cbdt-table.hh                    |   4 +-
+ src/hb-ot-cmap-table.hh                    |   2 +-
+ src/hb-ot-font.cc                          |  42 +++++------
+ src/hb-ot-layout-common-private.hh         |  14 ++--
+ src/hb-ot-layout-gsub-table.hh             |   2 +-
+ src/hb-ot-layout-gsubgpos-private.hh       |  54 +++++++-------
+ src/hb-ot-layout-jstf-table.hh             |   4 +-
+ src/hb-ot-layout.cc                        |  30 ++++----
+ src/hb-ot-map-private.hh                   |   6 +-
+ src/hb-ot-map.cc                           |   4 +-
+ src/hb-ot-math-table.hh                    |   8 +--
+ src/hb-ot-shape-complex-arabic-fallback.hh |   8 +--
+ src/hb-ot-shape-complex-arabic.cc          |  32 ++++-----
+ src/hb-ot-shape-complex-default.cc         |  22 +++---
+ src/hb-ot-shape-complex-hangul.cc          |  12 ++--
+ src/hb-ot-shape-complex-hebrew.cc          |  18 ++---
+ src/hb-ot-shape-complex-indic.cc           |  12 ++--
+ src/hb-ot-shape-complex-myanmar.cc         |  40 +++++------
+ src/hb-ot-shape-complex-private.hh         |  26 +++----
+ src/hb-ot-shape-complex-thai.cc            |  22 +++---
+ src/hb-ot-shape-complex-tibetan.cc         |  20 +++---
+ src/hb-ot-shape-complex-use.cc             |  16 ++---
+ src/hb-ot-shape-private.hh                 |   2 +-
+ src/hb-ot-shape.cc                         |   8 +--
+ src/hb-ot-tag.cc                           |   2 +-
+ src/hb-ot-var.cc                           |   2 +-
+ src/hb-private.hh                          |  37 +++++-----
+ src/hb-set-private.hh                      |   2 +-
+ src/hb-shape-plan.cc                       |  24 +++----
+ src/hb-shape.cc                            |   8 +--
+ src/hb-shaper-private.hh                   |   6 +-
+ src/hb-shaper.cc                           |   6 +-
+ src/hb-ucdn.cc                             |   2 +-
+ src/hb-unicode.cc                          |   4 +-
+ src/hb-uniscribe.cc                        |  50 ++++++-------
+ src/main.cc                                |   4 +-
+ src/test-buffer-serialize.cc               |   8 +--
+ src/test-size-params.cc                    |   6 +-
+ src/test-would-substitute.cc               |   8 +--
+ src/test.cc                                |  12 ++--
+ util/ansi-print.cc                         |   2 +-
+ util/hb-fc.cc                              |   6 +-
+ util/hb-ot-shape-closure.cc                |  10 +--
+ util/hb-shape.cc                           |  14 ++--
+ util/helper-cairo.cc                       |  12 ++--
+ util/main-font-text.hh                     |   4 +-
+ util/options.cc                            | 110
+ ++++++++++++++---------------
+ util/options.hh                            |  56 +++++++--------
+ util/shape-consumer.hh                     |  10 +--
+ 65 files changed, 563 insertions(+), 568 deletions(-)
+
+commit fbb937b6807597c9ae002280c6a6278a97b701f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 12:04:16 2017 +0200
+
+    Don't use NULL in public headers
+
+ src/hb-buffer.h | 4 ++--
+ src/hb-common.h | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit c3448e8d21963eb7fc357a37a7a426a4bf130ef3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 12:02:00 2017 +0200
+
+    Use static_assert instead of custom ASSERT_STATIC
+
+ src/hb-buffer-private.hh                   |  4 ++--
+ src/hb-buffer.cc                           |  2 +-
+ src/hb-cache-private.hh                    |  4 ++--
+ src/hb-coretext.cc                         |  2 +-
+ src/hb-open-type-private.hh                |  6 +++---
+ src/hb-ot-layout-common-private.hh         |  2 +-
+ src/hb-ot-layout-gdef-table.hh             |  6 +++---
+ src/hb-ot-layout.cc                        | 14 ++++++------
+ src/hb-ot-map.cc                           |  2 +-
+ src/hb-ot-math-table.hh                    |  4 ++--
+ src/hb-ot-shape-complex-arabic-fallback.hh |  6 +++---
+ src/hb-ot-shape-complex-indic.cc           |  2 +-
+ src/hb-ot-shape-complex-use.cc             |  2 +-
+ src/hb-private.hh                          | 34
+ +++++++++++++-----------------
+ src/hb-set-private.hh                      |  8 +++----
+ src/hb-uniscribe.cc                        |  2 +-
+ util/options.cc                            |  3 ++-
+ 17 files changed, 50 insertions(+), 53 deletions(-)
+
+commit 76dcbf8b23475b25f8f1918f982bfd8f0dd3456e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 11:24:35 2017 +0200
+
+    Add polyfill for static_assert and nullptr
+
+    Also fix hb_assert_constant_t.
+
+ src/hb-private.hh | 38 ++++++++++++++++++++++++++++++++++----
+ 1 file changed, 34 insertions(+), 4 deletions(-)
+
+commit dad431e75bf998dcb09cff795c0f1083b3bd5449
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 10:55:32 2017 +0200
+
+    [util] Include hb-private.hh
+
+    Simplifies compatibility issues by centralizing all boilerplate code
+    in hb-private.hh.
+
+ util/options.hh | 31 +++++--------------------------
+ 1 file changed, 5 insertions(+), 26 deletions(-)
+
+commit 81e2b9b8a959cb7d7503f58fca70761238697fc1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 10:48:19 2017 +0200
+
+    Never skip over CGJ
+
+    We might want to tweak this some more.  For now, never skipping over
+    it is better behavior than always skipping.
+
+    Part of https://github.com/behdad/harfbuzz/issues/554
+
+ src/hb-ot-layout-private.hh                          |  19
+ +++++++++++--------
+ .../bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf     | Bin 0 ->
+ 2468 bytes
+ test/shaping/tests/default-ignorables.tests          |   1 +
+ 3 files changed, 12 insertions(+), 8 deletions(-)
+
+commit 25846cc39fb8a9516b8de4333f909851d471156f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 13 16:30:33 2017 +0200
+
+    1.6.0
+
+ NEWS                   | 35 +++++++++++++++++++++++++++++++++++
+ configure.ac           |  2 +-
+ docs/harfbuzz-docs.xml |  4 ++++
+ 3 files changed, 40 insertions(+), 1 deletion(-)
+
+commit 74f1b88e3720103562552780af7058131c5492d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 13 11:01:55 2017 +0200
+
+    [ucdn] Fix compiler warnings
+
+ src/hb-ucdn.cc | 21 +++++++++++++--------
+ 1 file changed, 13 insertions(+), 8 deletions(-)
+
+commit c2cf68dbdffcbf45297dd161b4b6b2de667b5ae4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 13 10:30:19 2017 +0200
+
+    [coretext] Fix build
+
+ src/hb-coretext.cc | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit 95883fc5d486ecd194253bb223802f930de73e28
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 13 10:21:07 2017 +0200
+
+    [coretext] Pass correct font size to CoreText
+
+    CoreText "point"s are not typographic points, but CSS pixels.  Ie.
+    they are 96 per inch, not 72 per inch.
+
+ src/hb-coretext.cc | 18 +++++++++++-------
+ 1 file changed, 11 insertions(+), 7 deletions(-)
+
+commit 4f9a83ec2109b754a75c962e88117d063e6fed43
+Merge: fa48ccbe 40b05d7b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 12 14:08:58 2017 +0200
+
+    Merge remote-tracking branch 'origin/master'
+
+commit fa48ccbe127a2e61ab316f3638e4056940964dae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 12 14:07:37 2017 +0200
+
+    [indic] Special-case Kannada Ra,H,ZWJ sequence
+
+    Fixes https://github.com/behdad/harfbuzz/issues/435
+
+ src/hb-ot-shape-complex-indic.cc                         |  15
+ +++++++++++++++
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf | Bin 0 ->
+ 2984 bytes
+ test/shaping/tests/indic-special-cases.tests             |   3 +++
+ 4 files changed, 19 insertions(+)
+
+commit 40b05d7b770b8045f176f66231c412b32482d874
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Thu Oct 12 12:48:48 2017 +0100
+
+    Replacing 'cluster' with 'syllable' when comments describe certain
+    Indic shaping behavior (#563)
+
+    * Clarified wording of syllable/cluster behavior in Uniscribe in
+    final_reordering; changed one other probable typo.
+
+    * Additional syllable/cluster swap in comments for final reordering
+    and for initial-reordering matra decomposition.
+
+ src/hb-ot-shape-complex-indic.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 6bac4ac2bebb612debecc8ec10b845e977c0afe1
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Oct 12 15:15:49 2017 +0330
+
+    Minor BUILD.md fix (#565)
+
+ BUILD.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8923033eb2dab75e9361e9ea1333deb1213393ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 12 12:01:48 2017 +0200
+
+    [coretext] Use fabs() to silence compiler warning
+
+ src/hb-coretext.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit dd4b321b4a429c6e6a28441ea9ae52f8f9dd1dad
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Thu Oct 12 11:49:37 2017 +0200
+
+    [coretext] Activate tracking for system fonts
+
+    Another attempt at fully fixing
+    https://github.com/behdad/harfbuzz/issues/360
+
+ src/hb-coretext.cc | 28 +++++++++++++++++++++++++++-
+ 1 file changed, 27 insertions(+), 1 deletion(-)
+
+commit 6760021d6f4beef852c6560607b32090bcfa5acb
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Oct 12 12:05:08 2017 +0300
+
+    CMakelists.txt fix for Freetype builds (#564)
+
+    Instead of searching for freetype using pkg-config, use the
+    FindFreetype
+    feature of CMake. This allows for better integration with other
+    projects
+    that make use of CMake.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/518
+
+ CMakeLists.txt | 24 +++++++-----------------
+ 1 file changed, 7 insertions(+), 17 deletions(-)
+
+commit 6a2cbc6ef51680309eb3970ed9c66ff766dc8040
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 12 10:46:09 2017 +0200
+
+    [coretext] Use fabsf() instead of abs()
+
+    Fixes bots.
+
+    Link libharfbuzz.so with -lm.  Surprising that we survived without
+    it so far!
+
+ src/Makefile.am    | 2 +-
+ src/harfbuzz.pc.in | 2 +-
+ src/hb-coretext.cc | 5 +++--
+ 3 files changed, 5 insertions(+), 4 deletions(-)
+
+commit dfeccd073a5e78f6a2c630355c04121b70d2b4aa
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Oct 12 12:11:47 2017 +0330
+
+    Remove nmake port of harfbuzz (#562)
+
+ BUILD.md                        |  12 ++-
+ Makefile.am                     |   2 +-
+ appveyor.yml                    |  30 ------
+ configure.ac                    |   2 -
+ win32/Makefile.am               |  18 ----
+ win32/Makefile.vc               |  67 ------------
+ win32/README.txt                |  97 -----------------
+ win32/build-rules-msvc.mak      | 130 -----------------------
+ win32/config-msvc.mak           | 230
+ ----------------------------------------
+ win32/config.h.win32.in         | 158 ---------------------------
+ win32/create-lists-msvc.mak     | 147 -------------------------
+ win32/create-lists.bat          |  42 --------
+ win32/detectenv-msvc.mak        | 146 -------------------------
+ win32/generate-msvc.mak         |  39 -------
+ win32/hb-introspection-msvc.mak |  42 --------
+ win32/info-msvc.mak             | 162 ----------------------------
+ win32/install.mak               |  25 -----
+ win32/introspection-msvc.mak    |  73 -------------
+ win32/pc_base.py                | 124 ----------------------
+ win32/replace.py                | 115 --------------------
+ win32/sed-enums-srcs.py         |  36 -------
+ win32/setup.py                  |  62 -----------
+ 22 files changed, 9 insertions(+), 1750 deletions(-)
+
+commit 4e4781319b36bba154f3e5d4eb678945d8f6b4fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 12 10:33:16 2017 +0200
+
+    [ft] Add hb_ft_font_changed()
+
+    When the font size or variations settings on underlying FT_Face
+    change,
+    one can call hb_ft_font_changed() and continue using hb_font
+    created using
+    hb_ft_font_create().
+
+    Fixes https://github.com/behdad/harfbuzz/issues/559
+
+    New API:
+    hb_ft_font_changed()
+
+ docs/harfbuzz-sections.txt |  1 +
+ src/hb-ft.cc               | 15 +++++++++++++--
+ src/hb-ft.h                |  8 +++++++-
+ 3 files changed, 21 insertions(+), 3 deletions(-)
+
+commit 94b3cafc3a042aea69ee7040227557fe98a21d87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 17:22:44 2017 +0200
+
+    Add hb_face_get_table_tags()
+
+    New API:
+    hb_face_get_table_tags()
+
+    Fixes https://github.com/behdad/harfbuzz/issues/560
+
+ src/hb-face.cc              | 29 +++++++++++++++++++++++++++++
+ src/hb-face.h               |  5 +++++
+ src/hb-open-file-private.hh | 18 ++++++++++++++++++
+ 3 files changed, 52 insertions(+)
+
+commit e1b6d923021f68713784e2fd68f631c053ef3497
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 15:51:31 2017 +0200
+
+    Remove cast of functions to (hb_destroy_func_t)
+
+    Fixes https://github.com/behdad/harfbuzz/issues/474
+
+ src/hb-blob.cc     |  8 +++++++-
+ src/hb-coretext.cc | 10 ++++++++--
+ src/hb-face.cc     |  6 ++++--
+ src/hb-ft.cc       | 20 +++++++++++---------
+ src/hb-glib.cc     |  9 ++++++++-
+ src/hb-ot-font.cc  |  6 ++++--
+ 6 files changed, 42 insertions(+), 17 deletions(-)
+
+commit 717fcb51dd051ca27d8537e5cf3a32d0447f78b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 15:38:21 2017 +0200
+
+    [coretext] Minor
+
+ src/hb-coretext.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 374bb48d902025e8b8d8acbe525ff43540daee36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 15:37:50 2017 +0200
+
+    Change ptem API to make 0 mean unset
+
+ src/hb-font.cc | 5 ++---
+ src/hb-font.h  | 2 +-
+ 2 files changed, 3 insertions(+), 4 deletions(-)
+
+commit 06c14225b20aa43ae88d362be2de577f6cf3f7b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 15:29:53 2017 +0200
+
+    [coretext] Minor
+
+ src/hb-coretext.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit a4b46212c5e76494cfde5af6f299e08902aff0d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 15:29:22 2017 +0200
+
+    [coretext] Adjust font size check for 0
+
+ src/hb-coretext.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 269cf1ca82c34c6f6ea126e7333743e5c381453b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 15:24:22 2017 +0200
+
+    Correctly initialize ptem
+
+ src/hb-font.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 84686bf4c75c001e7cfb2eabdf391b2e76cae335
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 15:02:48 2017 +0200
+
+    [coretext-aat] Also pass through CoreText if font has kerx table
+
+    SFNSText has kerx table which apparently is applied.
+
+ src/hb-coretext.cc | 20 +++++++++-----------
+ src/hb-coretext.h  |  1 +
+ 2 files changed, 10 insertions(+), 11 deletions(-)
+
+commit 296d0134c9d04c82cc0bffd545b0fd9a308a2530
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 14:09:30 2017 +0200
+
+    [coretext] Change default point size to 12
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7b23c286a71883ac3e5777a2dee262af48c76854
+Merge: 8d450dd1 a5ebe1d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 13:35:32 2017 +0200
+
+    Merge branch 'coretext-optical-sizing'
+
+    Should fix https://github.com/behdad/harfbuzz/issues/360
+
+commit a5ebe1d4aec41bc5e289a7969e5e5f7bb57733b6
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Wed Oct 11 13:32:38 2017 +0200
+
+    [coretext] Recreate CTFont if pt size changed
+
+    Attempt at fixing #360
+
+ src/hb-coretext.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit db7a73ce0781d1fec0235e419ac448565dcfc8ca
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Wed Oct 11 13:24:39 2017 +0200
+
+    [coretext] Fix build
+
+ src/hb-coretext.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit f33413075655e6383cd16bc31f0bf804dcec1c64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 13:17:46 2017 +0200
+
+    [coretext] Another try
+
+ src/hb-coretext.cc | 32 +++++++++++++-------------------
+ 1 file changed, 13 insertions(+), 19 deletions(-)
+
+commit a8e466c3c12a3499028cb576721e5f85ff4cbf2d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 13:05:59 2017 +0200
+
+    [coretext] Move CT_Font to font data
+
+    Towards implementing optical sizing.  Untested; won't compile.
+
+    https://github.com/behdad/harfbuzz/issues/360
+
+ src/hb-coretext.cc | 85
+ ++++++++++++++++++++++++------------------------------
+ 1 file changed, 37 insertions(+), 48 deletions(-)
+
+commit f9b4c6570a4725eec5393f86e6468a189ac8c6be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 12:51:25 2017 +0200
+
+    [coretext] Move font size to a macro
+
+ src/hb-coretext.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 8d450dd188dea2d63a03f74d903a76741de8a217
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 12:43:46 2017 +0200
+
+    Infrastructure for creating CTFont with correct font size
+
+    https://github.com/behdad/harfbuzz/issues/360
+
+ src/hb-shaper-private.hh | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 16d02a58cf187dbcecc1c796acdc5d3a70ca288e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 12:28:06 2017 +0200
+
+    [coretext] Change default font size from 36 to 18
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c0c2dbc871667c32ac8eedb11de64078ef24a429
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 12:23:35 2017 +0200
+
+    Remove dirty tracking
+
+    Turns out I don't need this to resolve CoreText optical sizing
+    issue after all.
+
+    https://github.com/behdad/harfbuzz/issues/360
+
+ src/hb-face-private.hh |  9 ---------
+ src/hb-face.cc         | 17 -----------------
+ src/hb-font-private.hh | 13 -------------
+ src/hb-font.cc         | 39 ---------------------------------------
+ 4 files changed, 78 deletions(-)
+
+commit b57f18da700837a57df9606290160ea6e96accc8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 11:47:47 2017 +0200
+
+    Add hb_font_[sg]et_ptem() to set/get point size on font
+
+    New API:
+    hb_font_set_ptem()
+    hb_font_get_ptem()
+
+    Needed for hb-coretext optical sizing:
+    https://github.com/behdad/harfbuzz/issues/360
+
+ docs/harfbuzz-sections.txt |  2 ++
+ src/hb-font-private.hh     |  5 ++++-
+ src/hb-font.cc             | 41 +++++++++++++++++++++++++++++++++++++++++
+ src/hb-font.h              | 10 ++++++++++
+ 4 files changed, 57 insertions(+), 1 deletion(-)
+
+commit 3f9370d9e5051b1abf2fc94be2e10a39c8069f75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 11:34:53 2017 +0200
+
+    Fix TODO item
+
+ src/hb-font.cc | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+commit 5f50f8837f918ca1d176355d1538e0e6c9703f41
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 7 13:17:33 2017 +0200
+
+    [arabic] Fix cluster merging
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c2545b921523538e8237ff6a2591f6cb75ee79f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 7 12:56:53 2017 +0200
+
+    Add check for HB_EXTERNs
+
+    https://github.com/behdad/harfbuzz/pull/555
+
+ src/Makefile.am      |  1 +
+ src/check-externs.sh | 21 +++++++++++++++++++++
+ 2 files changed, 22 insertions(+)
+
+commit 48a9406839f086735a05a2f1a07987b8a6bd6d33
+Author: fanc999 <fanc999@yahoo.com.tw>
+Date:   Sat Oct 7 18:57:14 2017 +0800
+
+    Fix build of HarfBuzz tools and HarfBuzz-GObject on Visual Studio
+    (#555)
+
+    * hb-buffer.h: Mark hb_buffer_diff() for export
+
+    This will fix the tools builds on Visual Studio, as the symbol is used
+    by the tools.
+
+    * build: Adapt NMake Makefiles for GLib 2.53.4 or later
+
+    glib-mkenums was ported from a PERL script to a Python script, so we
+    need to update how we generate the enum sources for HarfBuzz-GObject
+    in
+    the NMake builds.  Let this be known in the build documentation
+    for MSVC
+    builds.
+
+    One of the problems with the underlying cmd.exe that the NMake
+    Makefiles
+    run on is that shebang lines are not recognized, so we need to to test
+    run the script with Python and see whether it succeeded by outputing a
+    source file that is larger than 0 in file size (since running the PERL
+    version of the script will clearly fail and cause an empty file to be
+    created).
+
+    If it succeeds, we then run a small Python utility script that
+    makes the
+    necessary string replacements, and we are done.  If that fails,
+    then we
+    run the glib-mkenums script with PERL, and do the replacements
+    with the
+    PERL one-liners as we did before.
+
+    We need to make replace.py use latin-1 encoding when using Python
+    3.x to
+    cope with the copyright sign that is in the generated enum sources.
+
+ src/hb-buffer.h         |  2 +-
+ win32/Makefile.am       |  4 +++-
+ win32/README.txt        |  5 +++--
+ win32/generate-msvc.mak | 17 ++++++++++++-----
+ win32/info-msvc.mak     |  5 ++++-
+ win32/replace.py        |  2 +-
+ win32/sed-enums-srcs.py | 36 ++++++++++++++++++++++++++++++++++++
+ 7 files changed, 60 insertions(+), 11 deletions(-)
+
+commit c9e2cf6f55c7682b8e7020654945ddd074ebfd24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 16:59:22 2017 +0200
+
+    [ot] Remove 'mal' and 'gle' lang tags
+
+    Fixes https://github.com/behdad/harfbuzz/issues/477
+
+ src/hb-ot-tag.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 621c49cb8657a79ee6897c4d313d0e825b2b228f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 15:06:48 2017 +0200
+
+    Improve performance of ligature component matching
+
+    This O(N^2) was introduced in
+    8b2c94c43fd335b944d5e5487265706b8e0f9041.
+    Make it O(N).
+
+ src/hb-ot-layout-gsubgpos-private.hh | 37
+ +++++++++++++++++++++++-------------
+ 1 file changed, 24 insertions(+), 13 deletions(-)
+
+commit ab8d70ec7023e51ba6fd7267d2b41c5f95ef0787
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 14:47:10 2017 +0200
+
+    [arabic] Implement Unicode Arabic Mark Ordering Algorithm UTR#53
+
+    Fixes https://github.com/behdad/harfbuzz/issues/509
+
+ src/hb-ot-shape-complex-arabic.cc                  |  75
+ +++++++++++++++++++++
+ src/hb-ot-shape-complex-default.cc                 |   1 +
+ src/hb-ot-shape-complex-hangul.cc                  |   1 +
+ src/hb-ot-shape-complex-hebrew.cc                  |   1 +
+ src/hb-ot-shape-complex-indic.cc                   |   1 +
+ src/hb-ot-shape-complex-myanmar.cc                 |   2 +
+ src/hb-ot-shape-complex-private.hh                 |  12 ++++
+ src/hb-ot-shape-complex-thai.cc                    |   1 +
+ src/hb-ot-shape-complex-tibetan.cc                 |   1 +
+ src/hb-ot-shape-complex-use.cc                     |   1 +
+ src/hb-ot-shape-normalize.cc                       |   8 ++-
+ test/shaping/Makefile.am                           |   1 +
+ .../24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf   | Bin 0 -> 7160 bytes
+ .../94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf   | Bin 0 -> 6816 bytes
+ test/shaping/record-test.sh                        |   2 +-
+ test/shaping/tests/arabic-mark-order.tests         |   2 +
+ 16 files changed, 106 insertions(+), 3 deletions(-)
+
+commit b6fe0ab636ffac0a246e160b3508cc4841cb1823
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 13:37:08 2017 +0200
+
+    Add info_cc() convenience macro
+
+ src/hb-ot-layout-private.hh  | 2 ++
+ src/hb-ot-shape-normalize.cc | 6 +++---
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit 7f9e7f8689e1d260596f5256947dfbd474afb1ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 13:20:33 2017 +0200
+
+    Adjust normalizer for out-of-order marks
+
+    We are going to implement Unicode Arabic Mark Ordering Algorithm:
+
+      http://www.unicode.org/reports/tr53/tr53-1.pdf
+
+    which will reorder marks out of their sorted ccc order.  Adjust
+    normalizer to stop combining as soon as dangerous ordering is
+    detected.
+
+ src/hb-ot-shape-normalize.cc | 62
+ ++++++++++++++++++++++++++------------------
+ 1 file changed, 37 insertions(+), 25 deletions(-)
+
+commit a252ad61f077c3b7bbfd8335e1b105a57beb58ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 13:07:08 2017 +0200
+
+    Minor
+
+ src/hb-unicode-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4c05a405acc25c4ef0d70a97c0ae59013abca2df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 13:06:51 2017 +0200
+
+    Revert "Treat HAMZA ABOVE similar to SHADD for sorting purposes"
+
+    This reverts commit 5a330575768f5a213072230b9ec8faabac9c5737.
+
+    Proper fix coming soon.
+
+ src/hb-unicode-private.hh | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit d695cacbf4dd5f77b5e7134cf60553775c515ef1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 11:33:47 2017 +0200
+
+    Shorthand format controls should not be ignored
+
+    Fixes https://github.com/behdad/harfbuzz/issues/503
+
+ src/hb-unicode-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 50e95229d79bd258ad1d3f6392bfffa128f6df2a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 11:28:04 2017 +0200
+
+    Add Chinantec language tags
+
+    Fixes https://github.com/behdad/harfbuzz/issues/516
+
+ src/hb-ot-tag.cc | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit 9786fcd8fdc0adbe8b6269ddd174ee2818d6fa9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 17:22:43 2017 +0200
+
+    Fix GPOS v_origin ordering
+
+    This should affect mark attachment in vertical text.  I have no font
+    to test,
+    but this sounds the right order.
+
+    Noticed while debugging https://github.com/behdad/harfbuzz/issues/532
+
+ src/hb-ot-shape.cc | 44 ++++++++++++++++++++------------------------
+ 1 file changed, 20 insertions(+), 24 deletions(-)
+
+commit 63db692fa9efcd760f2e90f93f4e1428d79a3433
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 16:00:18 2017 +0200
+
+    [indic] Fix shaping of U+0AFB GUJARATI SIGN SHADDA
+
+    Fixes https://github.com/behdad/harfbuzz/issues/552
+
+ src/hb-ot-shape-complex-indic-private.hh | 2 +-
+ src/hb-ot-shape-complex-indic.cc         | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit f559c633073f63b9d87cb2440048b4413cfa1c05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 15:20:07 2017 +0200
+
+    [indic] Implement Consonent_With_Stacker
+
+    Fixes https://github.com/behdad/harfbuzz/issues/528
+
+ src/hb-ot-shape-complex-indic-machine.rl   | 5 +++--
+ src/hb-ot-shape-complex-indic-private.hh   | 7 ++++---
+ src/hb-ot-shape-complex-myanmar-machine.rl | 5 +++--
+ src/hb-ot-shape-complex-myanmar.cc         | 6 +++---
+ 4 files changed, 13 insertions(+), 10 deletions(-)
+
+commit e07669fc43c0e23d337ad984aa128c3a08c9c1bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 14:57:14 2017 +0200
+
+    [use] Implement Consonant_With_Stacker
+
+    Related to https://github.com/behdad/harfbuzz/issues/528
+
+ src/gen-use-table.py                   | 7 ++++---
+ src/hb-ot-shape-complex-use-machine.rl | 5 +++--
+ src/hb-ot-shape-complex-use-private.hh | 3 ++-
+ src/hb-ot-shape-complex-use-table.cc   | 6 ++++--
+ 4 files changed, 13 insertions(+), 8 deletions(-)
+
+commit 3ca9c92aa68956889642690e176c9161ff52edfe
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Oct 3 08:07:02 2017 -0400
+
+    Test Consonant_With_Stacker in Kannada (#530)
+
+ test/shaping/Makefile.am                           |   1 +
+ test/shaping/fonts/COPYING                         | 100
+ +++++++++++++++++++++
+ .../341421e629668b1a1242245d39238ca48432d35d.ttf   | Bin 0 -> 1084 bytes
+ .../55c88ebbe938680b08f92c3de20713183e0c7481.ttf   | Bin 0 -> 3300 bytes
+ .../663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf   | Bin 0 -> 1204 bytes
+ .../a014549f766436cf55b2ceb40e462038938ee899.ttf   | Bin 0 -> 2720 bytes
+ .../tests/indic-consonant-with-stacker.tests       |   4 +
+ 7 files changed, 105 insertions(+)
+
+commit 5d98de1f382254a8a21fd9a04b642268a21be16f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 13:46:25 2017 +0200
+
+    Tweak mark-base attachment
+
+    Apparently a base glyph can also become an attached component of a
+    ligature if the ligature-forming lookup used IgnoreBase.  This was
+    being confused with a non-first component of a MultipleSubst and
+    hence not matched for mark-attachment.  Tweak test to fix.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/543
+
+ src/hb-ot-layout-gpos-table.hh                           |   4 +++-
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/98b7887cff91f722b92a8ff800120954606354f9.ttf | Bin 0 ->
+ 1168 bytes
+ test/shaping/tests/mark-attachment.tests                 |   1 +
+ 4 files changed, 5 insertions(+), 1 deletion(-)
+
+commit ea772932d2430ebc7ea712a8c46ec2500966225d
+Merge: 771970ef c44657a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 13:25:44 2017 +0200
+
+    Merge commit 'c44657a05d565ec5f2c32ac15d4ecfbee00ac5f7'
+
+commit 771970efa15fc0b77841b7f0a3e266cdcf51246e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 13:23:31 2017 +0200
+
+    Minor
+
+ .travis.yml  | 2 +-
+ appveyor.yml | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 09cbeb2246217dce61ccc0638edb6211facca4b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 13:22:07 2017 +0200
+
+    Make bots happy
+
+    Fixes https://github.com/behdad/harfbuzz/issues/551
+
+ test/shaping/tests/indic-syllable.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c44657a05d565ec5f2c32ac15d4ecfbee00ac5f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 13:14:17 2017 +0200
+
+    Tweak input matching some more
+
+    Followup to 8b2c94c43fd335b944d5e5487265706b8e0f9041
+
+    Allow matching sequences of marks attached to different ligatures,
+    as supposedly the base of the subsequent marks were already jumped
+    over.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit bbe94777c94637da1bcf944124b5079662618a1e
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Oct 2 22:36:14 2017 +0200
+
+    Print test-suite.log when CI builds fail
+
+ .travis.yml  | 2 +-
+ appveyor.yml | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 1633513996f902e95642fcaf9205dded55f509ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 20:28:56 2017 +0200
+
+    Add test for U+0A51
+
+    New Indic numbers are:
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366355 out of 366457 tests passed. 102 failed (0.0278341%)
+    GURMUKHI: 60729 out of 60747 tests passed. 18 failed (0.0296311%)
+    KANNADA: 951201 out of 951913 tests passed. 712 failed (0.0747968%)
+    KHMER: 299071 out of 299124 tests passed. 53 failed (0.0177184%)
+    MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed
+    (0.0188871%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%)
+    TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+    Before 71c0a1429db7c7e7e32507be248c9457e1cbfc7d GURMUKHI used to be
+    at 15,
+    because Uniscribe seems to allow this character standalone, but
+    that looks
+    wrong.
+
+ .../sha1sum/1735326da89f0818cd8c51a0600e9789812c0f94.ttf | Bin 0 ->
+ 1008 bytes
+ test/shaping/tests/indic-syllable.tests                  |   2 ++
+ 2 files changed, 2 insertions(+)
+
+commit 8b2c94c43fd335b944d5e5487265706b8e0f9041
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 20:02:45 2017 +0200
+
+    Tweak ligature component matching for ligature formation
+
+    If two marks want to ligate and they belong to different components
+    of the
+    same ligature glyph, and said ligature glyph is to be ignored
+    according to
+    mark-filtering rules, then allow.
+
+    Example Burmese senquence:
+
+      U+1004,U+103A,U+1039,U+101B,U+103D,U+102D
+
+    Test font provided by Norbert Lindenberg.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/545
+
+ src/hb-ot-layout-gsubgpos-private.hh               |  59
+ +++++++++++++++++----
+ .../a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf   | Bin 0 -> 1384 bytes
+ test/shaping/tests/ligature-id.tests               |   1 +
+ 3 files changed, 51 insertions(+), 9 deletions(-)
+
+commit 71c0a1429db7c7e7e32507be248c9457e1cbfc7d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 18:56:10 2017 +0200
+
+    [indic] Fix shaping of U+0A51
+
+    Mark it as matra below to allow the sequence U+0A15, U+0A51, U+0A47.
+    Oh well...
+
+    Fixes https://github.com/behdad/harfbuzz/issues/524
+
+ src/hb-ot-shape-complex-indic.cc                         |   6 ++++++
+ .../sha1sum/85fe0be440c64ac77699e21c2f1bd933a919167e.ttf | Bin 0 ->
+ 1224 bytes
+ test/shaping/tests/indic-syllable.tests                  |   1 +
+ 3 files changed, 7 insertions(+)
+
+commit 6eb8950e6265b23d88ba35daab1cff4fc3fe8753
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 18:30:05 2017 +0200
+
+    [ucdn] Oops!
+
+ src/hb-ucdn/{unicodedata_db.h => ucdn_db.h} | 4324
+ ++++++++++++++-------------
+ 1 file changed, 2175 insertions(+), 2149 deletions(-)
+
+commit cbec0cd65e1787b20ea55dd5583a7444938bd381
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 18:26:52 2017 +0200
+
+    Remove some really old cruft
+
+ src/hb-common.h    | 14 --------------
+ src/hb-ucdn/ucdn.h | 14 --------------
+ 2 files changed, 28 deletions(-)
+
+commit b3dff7720c1fac8ca9bdd7087ac368a0af4349e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 18:22:51 2017 +0200
+
+    [ucdn] Update README
+
+ src/hb-ucdn/README | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 57c55ef8341c760145170dedd002c5afb380e6c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 18:21:27 2017 +0200
+
+    [ot] Improve shaper selection heuristic
+
+ src/hb-ot-shape-complex-private.hh | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 5680ef884cf31ab9b42c587ffa260e390c88b8eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 18:20:51 2017 +0200
+
+    [use] Hack to fix shaping of U+1A7F
+
+    Fixes https://github.com/behdad/harfbuzz/issues/525
+
+ src/gen-use-table.py                 | 3 +++
+ src/hb-ot-shape-complex-use-table.cc | 2 +-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 0faa16a25349906ee0ab98b73d9a3d96327a0955
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 17:15:46 2017 +0200
+
+    [ucdn] Update to Unicode 10
+
+    Update to commit c000ebf79c095a7d58cf90090bde5715592c4834
+    plus this bug-fix: https://github.com/grigorig/ucdn/issues/18
+
+ src/hb-ucdn.cc               |  4 +++
+ src/hb-ucdn/Makefile.sources |  2 +-
+ src/hb-ucdn/ucdn.c           | 69
+ ++++++++++++++++++++++----------------------
+ src/hb-ucdn/ucdn.h           |  7 +++++
+ 4 files changed, 47 insertions(+), 35 deletions(-)
+
+commit ea535a1dfa63f82280607273cd282a6134c334da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 17:02:39 2017 +0200
+
+    [use] Update to Unicode 10
+
+ src/gen-use-table.py                 |  5 +--
+ src/hb-ot-shape-complex-use-table.cc | 69
+ ++++++++++++++++++++++++++----------
+ 2 files changed, 54 insertions(+), 20 deletions(-)
+
+commit 29c244aff6e3c359796bb033496c14ad5537dbe0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 16:36:21 2017 +0200
+
+    Minor
+
+ src/gen-use-table.py | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 1535f8c67216e8559fa48691fe6d9c2726c08973
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 16:12:18 2017 +0200
+
+    Add Unicode 10 scripts
+
+ src/hb-common.h                    | 8 ++++++++
+ src/hb-ot-shape-complex-private.hh | 5 +++++
+ 2 files changed, 13 insertions(+)
+
+commit bdbe974f525d33b8c735fb5d7fd76c236c4dd0ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 10:00:31 2017 -0400
+
+    [indic] Update table to Unicode 10
+
+ src/hb-ot-shape-complex-indic-table.cc | 70
+ +++++++++++++++++-----------------
+ 1 file changed, 36 insertions(+), 34 deletions(-)
+
+commit cc79b666bc4a81a0342ed1e706dd7db109739dc5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 09:19:15 2017 -0400
+
+    [indic] Add test for 1a0a356a0f2b2932581e4fd0437c01c058f4f6d1
+
+    https://github.com/behdad/harfbuzz/issues/538
+
+ .../sha1sum/87f85d17d26f1fe9ad28d7365101958edaefb967.ttf | Bin 0 ->
+ 1000 bytes
+ test/shaping/tests/indic-syllable.tests                  |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit 819cc360499a5f136325b5a1a18098ebc2aee081
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 09:03:16 2017 -0400
+
+    [indic] Move manual code out of generated table
+
+ src/hb-ot-shape-complex-indic-table.cc | 7 -------
+ src/hb-ot-shape-complex-indic.cc       | 5 +++++
+ 2 files changed, 5 insertions(+), 7 deletions(-)
+
+commit da4866f7177a4e2836cc70b844e2e64ab671761f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 08:57:06 2017 -0400
+
+    [arabic] Update table to Unicode 10 data
+
+ src/hb-ot-shape-complex-arabic-table.hh | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit 1a0a356a0f2b2932581e4fd0437c01c058f4f6d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 08:49:23 2017 -0400
+
+    [indic] Categorize U+0980 BENGALI ANJI as placeholder
+
+    Fixes https://github.com/behdad/harfbuzz/issues/538
+
+ src/hb-ot-shape-complex-indic.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 19e77e01bc13f44138e1d50533327d314dd0a018
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Mon Oct 2 13:08:49 2017 +0100
+
+    [shape-plan] Don't look for a cached plan if variation coords are
+    specified. Fixes #549. (#550)
+
+    This is a temporary hack just to avoid incorrect shaping results,
+    pending proper support
+    for caching shape-plans with variation coordinates.
+
+ src/hb-shape-plan.cc | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit db446cce4ef4cd1a4f1652e3aa3e5e5ed1881d39
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 1 12:06:00 2017 -0400
+
+    Add RELEASING.md to dist
+
+ Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 933a81d74fee0d5856fc7b15b58a16e0e0168e48
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Sun Oct 1 19:35:24 2017 +0330
+
+    Add release checklist (#529)
+
+ RELEASING.md | 96
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 96 insertions(+)
+
+commit 66128d3cfb12705530141b5a4bd2706f0cbb9fc5
+Author: mhosken <mhosken@users.noreply.github.com>
+Date:   Wed Sep 27 01:29:45 2017 +0700
+
+    Fix missing xscale in rtl graphite unpacking (#541)
+
+    * Fix missing xscale in rtl graphite unpacking
+
+    * Oops didn't need to mess with yscale
+
+ src/hb-graphite2.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3ca69c8c32b8408dd9f8e6e866cd07e58c0d79b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 14 20:50:35 2017 -0400
+
+    Use strtod_l() to correctly parse decimal numbers in French &
+    other locales
+
+    Test with, eg.:
+    $ LC_ALL=fr_FR.utf-8 ./hb-view NotoSansArabic-VF.ttf بهداد
+    --variations wght=1.2
+
+ configure.ac     |  4 ++--
+ src/hb-common.cc | 53
+ +++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 2 files changed, 53 insertions(+), 4 deletions(-)
+
+commit 9355218f582a6c2425cadcb868204f81b17d5767
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 9 11:21:07 2017 -0700
+
+    [util] Add a few shorthand forms for commandline options
+
+    -o, -O, -u, -v, -V
+
+ util/options.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit a984e0c4d921a6dff82cc1b5c686cc957215bc7e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 5 11:18:35 2017 -0700
+
+    1.5.1
+
+ NEWS         | 13 +++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit d03f11f246efec13e48fd68a9ce136db771b22bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 4 20:14:13 2017 -0700
+
+    Fix buffer_diff for empty buffers
+
+    If buffers are empty, content type should be ignored.
+
+    This fixes last of the failing tests: fuzzed.tests.  Green again!
+
+ src/hb-buffer.cc | 2 +-
+ src/hb-buffer.h  | 4 ++--
+ util/options.hh  | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 7cc348041d0b026ca6d2c240134e8f9100600e99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 4 20:04:59 2017 -0700
+
+    [unsafe-to-break] Fix unsafe-to-break for cluster-level=1
+
+    Fixes tests/shaping/tests/cluster.tests
+
+ src/hb-ot-shape.cc | 17 +++++++++++------
+ 1 file changed, 11 insertions(+), 6 deletions(-)
+
+commit 61a9d7e6d0e6df7b48f58fa1679f0f93407993b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 4 19:48:52 2017 -0700
+
+    Minor
+
+ test/shaping/run-tests.sh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 03a5a6f873e5a50011f1c2418f5ceab86d9c2931
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 1 19:09:54 2017 -0700
+
+    [util] Add --unicodes to hb-view / hb-shape
+
+    Fixes https://github.com/behdad/harfbuzz/issues/154
+
+ test/shaping/hb_test_tools.py |  2 +-
+ util/options.cc               | 65
+ ++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 65 insertions(+), 2 deletions(-)
+
+commit 0e5b475d98dd67e927534508fe2cd8dc9765e24e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 1 18:28:47 2017 -0700
+
+    Minor
+
+ test/shaping/run-tests.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3e1fc6d18ba0019bbeede78b95070a6e7156c314
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 1 10:46:48 2017 -0700
+
+    Minor
+
+ test/shaping/run-tests.sh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 04f009f84891b513087830c7aa1b755addd016d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 1 10:38:25 2017 -0700
+
+    Add test accidentally removed in previous commit
+
+ test/shaping/tests/indic-syllable.tests | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 06cb162cd79cc922b572e5f532ca867223b6dc4c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 1 10:34:21 2017 -0700
+
+    [indic] Treat Consonant_With_Stacker as consonant
+
+    Fixes https://github.com/behdad/harfbuzz/issues/528
+    "Kannada JIHVAMULIYA and UPADHMANIYA insert dotted circles"
+
+ src/hb-ot-shape-complex-indic-private.hh                  |   2 +-
+ .../sha1sum/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf  | Bin 0 ->
+ 988 bytes
+ test/shaping/tests/indic-syllable.tests                   |   3 ++-
+ 3 files changed, 3 insertions(+), 2 deletions(-)
+
+commit c449d2d8c9e27502380faa0b568a374c838ac9a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 30 17:28:22 2017 -0700
+
+    [unsafe-to-break] Mark during fraction-slash formation
+
+    Fixes tests/automatic-fractions.tests
+
+ src/hb-ot-shape.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit b262ebcc9c9539076d17751e9bae06a8fd5001ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 30 17:25:10 2017 -0700
+
+    [util] Fix cluster sweeping during --verify
+
+    If *I* get this wrong in 2017, I have no idea how others get their
+    head around
+    cluster math...
+
+    Fixes tests/arabic-fallback-shaping.tests
+
+ util/options.hh | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit 69d701b02e5ebc3597b0d0576dbab8e1ece51944
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 30 17:07:29 2017 -0700
+
+    [util] When --verify fails, return reconstructed shape results
+
+ util/options.hh    | 8 +++-----
+ util/view-cairo.hh | 2 +-
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+commit 099472e08bf81d6dd8ca1647999592df6b7fdfb9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 30 16:45:06 2017 -0700
+
+    hb_buffer_diff() tweak
+
+    I like to have a mode where CONTAINS_NOTDEF and CONTAINS_DOTTEDCIRCLE
+    are not
+    returned.  Abused a value of -1 for that.  hb-shape now uses it.
+    Fixes two
+    of the six tests failing with --verify in test/shaping/run-tests.sh.
+
+ src/hb-buffer.cc          | 16 ++++++++--------
+ test/shaping/run-tests.sh |  4 ++--
+ util/options.hh           |  2 +-
+ 3 files changed, 11 insertions(+), 11 deletions(-)
+
+commit e8b364b86023731e0416ab4eb433467c4b7a0ec2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 23 15:00:45 2017 -0700
+
+    1.5.0
+
+ NEWS         | 44 ++++++++++++++++++++++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 45 insertions(+), 1 deletion(-)
+
+commit 224d20e4e1c62416ff842a81188dfeff069f895b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 23 14:41:48 2017 -0700
+
+    [docs] Minor
+
+ docs/harfbuzz-docs.xml     | 12 ++++++++++++
+ docs/harfbuzz-sections.txt | 10 ++++++++++
+ src/hb-buffer.cc           |  8 +++++++-
+ 3 files changed, 29 insertions(+), 1 deletion(-)
+
+commit 4387b059a0603b17024de48d57bee6a3b5e9e56c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 23 14:35:58 2017 -0700
+
+    [test] Add --verify to hb-shape
+
+    Disabled for now.  Will enable and fix failures after next release.
+
+ test/shaping/run-tests.sh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit b2dd0c1c32ba30714355baca1857d64c1608b4c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 23 13:12:54 2017 -0700
+
+    Add hb_glyph_info_get_glyph_flags()
+
+    New API.
+
+ src/hb-buffer.cc | 17 +++++++++++++++++
+ src/hb-buffer.h  |  9 ++++++++-
+ 2 files changed, 25 insertions(+), 1 deletion(-)
+
+commit 3e8f4f145255a905029c6b5cb8f40e6dcca096f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 22 17:56:25 2017 -0700
+
+    Rename HB_BUFFER_DIFF_FLAG_MASK_MISMATCH to
+    HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH
+
+ src/hb-buffer.cc | 2 +-
+ src/hb-buffer.h  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit a9e52a1af4c039bc53090a9c1e4c1136fc542605
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 15 17:30:18 2017 -0700
+
+    [util] Prefix trace lines with "trace:", and error lines with "error:"
+
+ util/hb-shape.cc | 12 ++++++------
+ util/options.cc  |  4 ++--
+ util/options.hh  |  1 +
+ 3 files changed, 9 insertions(+), 8 deletions(-)
+
+commit 7ea10c35a34c894e87ee6576d6d4ba3e78535a27
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 15 17:12:28 2017 -0700
+
+    [util] Respect eot/bot in safe-to-break test; hook up hb_buffer_diff()
+
+ util/options.hh | 38 ++++++++++++++++++++++++++------------
+ 1 file changed, 26 insertions(+), 12 deletions(-)
+
+commit 8820ba29dfd2e1302377da62a0527939a0d7d9fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 15 17:12:21 2017 -0700
+
+    Fix warning about "may be used uninitialized"
+
+ src/hb-ot-layout-common-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 91770e1c567d87fc513e8d39576e51c3853b1f23
+Author: Emil A Eklund (eae) <eae@eae.net>
+Date:   Tue Aug 15 16:25:18 2017 -0700
+
+    Fix signed/unsigned warning (#522)
+
+    Change hb_buffer_diff to explicitly cast result of abs to unsigned
+    when
+    comparing with position_fuzz to avoid unsafe signed/unsigned
+    comparions
+    warnings on windows.
+
+ src/hb-buffer.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 587f15ece316df7c86f386518aba48a6a44c061d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 14 15:23:10 2017 -0700
+
+    Minor
+
+ src/hb-face-private.hh |  8 ++++----
+ src/hb-face.cc         |  8 ++++----
+ src/hb-font-private.hh | 14 +++++++-------
+ src/hb-font.cc         | 14 +++++++-------
+ 4 files changed, 22 insertions(+), 22 deletions(-)
+
+commit a88e2a73f34067381a81577c3f60bc5c2a6f2eea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 14 14:49:21 2017 -0700
+
+    [util] Fix leaks
+
+ util/options.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 338e61ad1b40110a70c4fb497b117bcb07548467
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 14 12:36:38 2017 -0700
+
+    Fix typo
+
+ src/hb-buffer.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 331d66c7fe27a7649454486000827f0c36d6eb36
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Sat Jul 19 23:09:09 2014 +0100
+
+    Add function to compare two buffers
+
+    Based on patch from Jonathan Kew.
+
+    Needs more cleaning up and documentation.
+
+    New API:
+    hb_buffer_diff_flags_t
+    hb_buffer_diff()
+
+ src/hb-buffer-private.hh   |  1 +
+ src/hb-buffer-serialize.cc |  4 +--
+ src/hb-buffer.cc           | 82
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.h            | 39 ++++++++++++++++++++++
+ 4 files changed, 124 insertions(+), 2 deletions(-)
+
+commit 219af509ef8269e51f1396b18521c75b000d8dda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 13 15:10:26 2017 -0700
+
+    [graphite2] Fix warning
+
+ src/hb-graphite2.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 239119a631fee7701be4d444adeda808b915863a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 13 15:08:34 2017 -0700
+
+    [unsafe-to-break] Mark all positions as unsafe in alternative shapers
+
+ src/hb-coretext.cc    | 6 ++++++
+ src/hb-directwrite.cc | 2 ++
+ src/hb-graphite2.cc   | 1 +
+ src/hb-uniscribe.cc   | 2 ++
+ 4 files changed, 11 insertions(+)
+
+commit 05fabbd03eae7b84ebbce7abbdc55c1d67ceacf9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 11 19:51:06 2017 -0700
+
+    [unsafe-to-break] Towards verifying unsafe-to-break in --verify
+
+    We break and shape fragments and reconstruct shape result from them.
+    Remains to compare to original buffer.  Going to add some buffer
+    comparison API and use here, instead of open-coding.
+
+ src/hb-buffer.cc |   5 ++-
+ util/options.hh  | 131
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 133 insertions(+), 3 deletions(-)
+
+commit 6ce25f57c663f86326262a5ff7a42288f358ed51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 11 19:31:05 2017 -0700
+
+    Fix hb_buffer_append()
+
+    Ouch!
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1c17c2bde5bdf74a652b78d71b64e3aaa75ec43d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 11 19:06:07 2017 -0700
+
+    [unsafe-to-break] Copy flag to all glyphs in a cluster
+
+    Makes consumption easier.
+
+ src/hb-buffer-private.hh    | 46
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.cc            | 28 ++++++---------------------
+ src/hb-ot-layout-private.hh |  3 +--
+ src/hb-ot-shape.cc          | 27 ++++++++++++++++++++++++++
+ 4 files changed, 80 insertions(+), 24 deletions(-)
+
+commit ec104e5912417c0fdc8c7cb004c684aea26eb1dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 11 18:24:27 2017 -0700
+
+    [unsafe-to-break] Mark unsafe is cluster merging is disabled
+
+    We were relying on cluster merges not requiring unsafe flagging
+    because
+    they get merged.  If cluster level requests no merging, then we flag
+    unsafe when merge would have happened.
+
+ src/hb-buffer.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 39a97494304a7e6b8999e59a92ce4d24ba9b881a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 11 15:52:06 2017 -0700
+
+    New API: hb_buffer_append()
+
+ src/hb-buffer.cc | 52
+ +++++++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-buffer.h  |  6 ++++++
+ 2 files changed, 57 insertions(+), 1 deletion(-)
+
+commit d2052278f24b3279503d5fa215a7834c2d21f91c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 11 15:12:25 2017 -0700
+
+    [util] Add --verify to hb-shape / hb-view that verifies shape results
+
+    Right now it checks for monotone cluster values.  Other checks to
+    be added.
+
+ util/hb-shape.cc       |  7 ++-----
+ util/options.cc        |  2 ++
+ util/options.hh        | 42 +++++++++++++++++++++++++++++++++++++++---
+ util/shape-consumer.hh | 12 ++++++++----
+ util/view-cairo.hh     |  7 ++-----
+ 5 files changed, 53 insertions(+), 17 deletions(-)
+
+commit 14a639ea592cba971e5548f0942dd395c602c7a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 11 11:30:39 2017 -0700
+
+    [unsafe-to-break] Fix Use-of-uninitialized-value in
+    unsafe_to_break_set_mask
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3011
+
+ src/hb-ot-shape-complex-hangul.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e43aad55524cc1d4008ce337c2863a8546706d2e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:54:15 2017 -0700
+
+    [unsafe-to-break] Flag in Thai PUA shaping
+
+ src/hb-ot-shape-complex-thai.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit eae009602b5503c53a7f8ab053912563a97bbfa4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:50:48 2017 -0700
+
+    [unsafe-to-break] Flag in Hangul shaper
+
+ src/hb-ot-shape-complex-hangul.cc | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit b65aa1cd4778e0103a2a1ed0e1b1012a09cf1f48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:32:02 2017 -0700
+
+    [unsafe-to-break] Flag during mark attachment
+
+ src/hb-ot-layout-gpos-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c4712f8e372ee42749cda56cc7c28dc110a07ea9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:27:21 2017 -0700
+
+    Fix test
+
+ test/api/test-buffer.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 882ebdadd6b3420ef2d3f296cd7416c76ee9901f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:23:17 2017 -0700
+
+    [unsafe-to-break] Flag during cursive positioning
+
+ src/hb-ot-layout-gpos-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2d158ca37673f2b262f2381854559d6872d8fb45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:19:15 2017 -0700
+
+    [unsafe-to-break] Flag during kerning
+
+ src/hb-ot-layout-gpos-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit a7c4972ccefaaf48dfd6f0f4588df0c785aa33d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:16:15 2017 -0700
+
+    [unsafe-to-break] Flag during fallback positioning
+
+ src/hb-ot-shape-fallback.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit e2a2b5b229c92f1de3b9c3ea111cd1ffa75b18fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:10:12 2017 -0700
+
+    [unsafe-to-break] Be careful with flag propagation when merging
+    clusters
+
+ src/hb-buffer-private.hh | 13 +++++++++++++
+ src/hb-buffer.cc         | 17 ++++++++++-------
+ src/hb-ot-shape.cc       |  3 ++-
+ 3 files changed, 25 insertions(+), 8 deletions(-)
+
+commit f2868c200896a96a34fc1bba4d43eddc03789da2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 19:58:05 2017 -0700
+
+    Set mask to 0, instead of 1, by default
+
+    This shouldn't matter.
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9e005c5d86cd4c19383093f76a237cc8f5f12fb7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 18:45:33 2017 -0700
+
+    [unsafe-to-break] Mark Indic-like clusters as unsafe-to-break
+
+ src/hb-ot-shape-complex-indic.cc   | 2 ++
+ src/hb-ot-shape-complex-myanmar.cc | 2 ++
+ src/hb-ot-shape-complex-use.cc     | 2 ++
+ 3 files changed, 6 insertions(+)
+
+commit 5287ccc935c86b6f5e6867592b64bc2461384f45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 14:25:53 2017 -0700
+
+    [unsafe-to-break] Allocate public bits from 0
+
+ src/hb-buffer.h  |  5 +++--
+ src/hb-ot-map.cc | 15 +++++++++------
+ 2 files changed, 12 insertions(+), 8 deletions(-)
+
+commit 91ce0c45d6782057a2736f7b76a3c49cadbea070
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 16:13:03 2016 +0100
+
+    [safe-to-break] Fix logic when there is no out-buffer
+
+ src/hb-buffer.cc | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit a043c99f778ffdde15d212fe23468cb9f51036bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 4 19:51:22 2016 +0200
+
+    [unsafe-to-break] Simplify logic
+
+    Always use the algorithm for non-monotone case.  It's more robust.
+
+ src/hb-buffer.cc | 57
+ +++++++++++++-------------------------------------------
+ 1 file changed, 13 insertions(+), 44 deletions(-)
+
+commit 40bd7e9a1cf422b17f15d0f66547bde9098e6ef3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 14:47:45 2016 +0200
+
+    [unsafe-to-break] Add UNSAFE_TO_BREAK flag
+
+    Not all shapers code is updated to set this properly.
+    GSUB and Arabic shaper are updated.
+    GPOS and other shapers are NOT.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/224
+
+ src/hb-buffer-private.hh             | 26 ++++++++------
+ src/hb-buffer-serialize.cc           | 24 +++++++++----
+ src/hb-buffer.cc                     | 67
+ ++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.h                      | 10 ++++--
+ src/hb-ot-layout-gsub-table.hh       |  7 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 27 ++++++++++-----
+ src/hb-ot-map.cc                     |  2 ++
+ src/hb-ot-shape-complex-arabic.cc    |  3 ++
+ util/hb-shape.cc                     |  2 ++
+ util/options.cc                      |  1 +
+ util/options.hh                      |  2 ++
+ 11 files changed, 142 insertions(+), 29 deletions(-)
+
+commit 3e44748ebe1524aef6feb01c42d342e8a2d77d34
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 9 22:09:01 2017 -0700
+
+    [util] Fix two other Coverity warnings
+
+ util/options.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 356f93b64b6005f44bcfc329f6f9e150ec32fc26
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 9 22:06:53 2017 -0700
+
+    [util] Fix warning
+
+ util/shape-consumer.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit ac8c4e56d8b8c2e7a8f4802f83deb935bd6bbbd3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 9 22:05:08 2017 -0700
+
+    [ft] Fix theoretical leak
+
+ src/hb-ft.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5a330575768f5a213072230b9ec8faabac9c5737
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 9 17:23:28 2017 -0700
+
+    Treat HAMZA ABOVE similar to SHADD for sorting purposes
+
+    Part of https://github.com/behdad/harfbuzz/issues/509
+
+ src/hb-unicode-private.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 68af14d5cc666ebf0596766cbed87cc9404fd50f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 9 17:09:21 2017 -0700
+
+    Protect against div-by-zero in CBDT extent code
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1452#c5
+
+    CC https://github.com/behdad/harfbuzz/issues/139
+
+ src/hb-ft.cc         | 4 ++--
+ src/hb-ot-font.cc    | 6 +++---
+ src/hb-shape-plan.cc | 4 ++--
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 3b54d0337e6119a4397573f5589b771a68b2ecd9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 8 18:37:03 2017 -0700
+
+    Add tests for 'avar' fix 5dc30451b80f6bb0079424a130875c10486e4d34
+
+ test/shaping/Makefile.am                           |   1 +
+ .../d23d76ea0909c14972796937ba072b5a40c1e257.ttf   | Bin 0 -> 1812 bytes
+ test/shaping/record-test.sh                        |   1 +
+ test/shaping/tests/variations-rvrn.tests           | 100
+ +++++++++++++++++++++
+ 4 files changed, 102 insertions(+)
+
+commit 7917792f01603f91b703d12e12d8baced655a615
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 8 13:17:03 2017 -0700
+
+    1.4.8
+
+ NEWS         | 9 +++++++++
+ configure.ac | 2 +-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 5dc30451b80f6bb0079424a130875c10486e4d34
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 7 21:37:07 2017 -0700
+
+    Two fixes to avar mapping
+
+    1. Handle segment with two entries correctly,
+
+    2. Fix rounding math.  Ouch!
+
+    Fixes https://github.com/behdad/harfbuzz/issues/521
+
+ src/hb-ot-var-avar-table.hh | 13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
+
+commit dc2c418e397bf251faf03d824fc780ac19bb1dee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 3 12:34:15 2017 +0100
+
+    [check-defs/symbols.sh] Drop empty-symbol lines
+
+    Fixes https://github.com/behdad/harfbuzz/issues/510
+
+ src/check-defs.sh    | 2 +-
+ src/check-symbols.sh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 6f38845d9c6852812eb1963a1fd7e5ec771e5ce3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 19 17:20:55 2017 -0700
+
+    [hb-shape] Rename --show-messages to --trace
+
+    https://github.com/behdad/harfbuzz/issues/506
+
+ util/hb-shape.cc | 2 +-
+ util/options.cc  | 2 +-
+ util/options.hh  | 4 ++--
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit e60350551addbd945491f662e98464c9e3e9fec5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 18 19:14:19 2017 -0700
+
+    [hb-shape] Improve shaping-debug output
+
+    Before, that was printed using --debug (and in both hb-shape and
+    hb-view).
+    Changed it, now hb-shape has a new command-line argument called
+    --show-messages.
+    When invoked, it also respects other output formatting options.
+    The messages
+    are better formatted and printed to te same place that hb-shape
+    output is
+    directed to.  Previously they were written to stderr.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/506
+
+ util/hb-ot-shape-closure.cc | 10 +++++++---
+ util/hb-shape.cc            | 33 +++++++++++++++++++++++++++++++--
+ util/main-font-text.hh      | 27 ++++-----------------------
+ util/options.cc             | 10 +++++++---
+ util/options.hh             |  2 ++
+ util/shape-consumer.hh      | 18 ++++++++++++------
+ util/view-cairo.hh          |  4 ++--
+ 7 files changed, 65 insertions(+), 39 deletions(-)
+
+commit 65f64d14005e4d0808e818b3c97bd3d600628011
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 19 02:42:53 2017 +0430
+
+    Unbreak arm-none-eabi build again (#514)
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fc15e60eadfc89aca5b8815262b8ee888f285169
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 18 11:24:42 2017 -0700
+
+    1.4.7
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit c1432bce3cfc1156d19b21892d4083afa8838d94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 14 17:34:47 2017 +0100
+
+    [arabic] Adjust feature order again
+
+    Fixes https://github.com/behdad/harfbuzz/issues/505
+
+ src/hb-ot-shape-complex-arabic.cc                        |   7 ++++++-
+ .../sha1sum/bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf | Bin 0 ->
+ 7312 bytes
+ test/shaping/tests/arabic-feature-order.tests            |   1 +
+ 3 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 9813be3d1212eef5a525d64978e0bb2032cd44d9
+Author: Cosimo Lupo <cosimo@anthrotype.com>
+Date:   Fri Jul 14 17:11:46 2017 +0100
+
+    [coretext] Allow to disable kern (#508)
+
+    * Minor
+
+    * [coretext] Fix leak
+
+    * [coretext] Do not reset num_features
+
+    * [coretext] allow to disable kern; re-enabling doesn't seem to
+    be working
+
+ src/hb-coretext.cc | 41 ++++++++++++++++++++++++++++++++---------
+ 1 file changed, 32 insertions(+), 9 deletions(-)
+
+commit 9dd29c681e8e856c139f20f405d7c0e04928aa70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 14 17:01:27 2017 +0100
+
+    [use] Allow up to two medial-below letters
+
+    Fixes https://github.com/behdad/harfbuzz/issues/376
+
+ src/hb-ot-shape-complex-use-machine.rl                   |   3 ++-
+ .../sha1sum/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf | Bin 0 ->
+ 2192 bytes
+ test/shaping/tests/use-syllable.tests                    |   3 +++
+ 3 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 216b003c914d2209a6846b1ce61fe7a3421c789c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 14 16:38:51 2017 +0100
+
+    [use] Fix shaping of U+AA29 CHAM VOWEL SIGN AA
+
+    Part of https://github.com/behdad/harfbuzz/issues/376
+    Also see https://github.com/roozbehp/unicode-data/issues/6
+
+    Test added, using NotoSansCham built from Noto Phase III sources.
+
+ src/gen-arabic-table.py                                  |   2 +-
+ src/gen-indic-table.py                                   |   2 +-
+ src/gen-use-table.py                                     |   8 +++++---
+ src/hb-ot-shape-complex-use-table.cc                     |   4 ++--
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf | Bin 0 ->
+ 1368 bytes
+ test/shaping/tests/use-syllable.tests                    |   1 +
+ 7 files changed, 11 insertions(+), 7 deletions(-)
+
+commit f1cd7ca89306ff252816e9747177d8dab00524f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 14 15:59:40 2017 +0100
+
+    [indic] Add github URL
+
+ src/hb-ot-shape-complex-indic.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 3cc84f45b995b243fca82ce18481f11d69846eb5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 14 15:50:22 2017 +0100
+
+    [indic] Fix https://github.com/behdad/harfbuzz/issues/478
+
+ src/hb-ot-shape-complex-indic-private.hh                 |   2 +-
+ src/hb-ot-shape-complex-indic.cc                         |   8 ++++++++
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/54674a3111d209fb6be0ed31745314b7a8d2c244.ttf | Bin 0 ->
+ 1352 bytes
+ test/shaping/tests/indic-syllable.tests                  |   1 +
+ 5 files changed, 11 insertions(+), 1 deletion(-)
+
+commit e359a4b8f57bbc778843f233c4f5d6fb07ff11d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 14 14:14:35 2017 +0100
+
+    [indic] Disable automatic ZWNJ handling for Indic features
+
+    Fixes https://github.com/behdad/harfbuzz/issues/294
+
+    Also fixes a bunch of other Indic issues.  Test results after:
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366355 out of 366457 tests passed. 102 failed (0.0278341%)
+    GURMUKHI: 60732 out of 60747 tests passed. 15 failed (0.0246926%)
+    KANNADA: 951201 out of 951913 tests passed. 712 failed (0.0747968%)
+    KHMER: 299071 out of 299124 tests passed. 53 failed (0.0177184%)
+    MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed
+    (0.0188871%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%)
+    TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+    Before:
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366349 out of 366457 tests passed. 108 failed (0.0294714%)
+    GURMUKHI: 60732 out of 60747 tests passed. 15 failed (0.0246926%)
+    KANNADA: 951190 out of 951913 tests passed. 723 failed (0.0759523%)
+    KHMER: 299070 out of 299124 tests passed. 54 failed (0.0180527%)
+    MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed
+    (0.0188871%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%)
+    TAMIL: 1091753 out of 1091754 tests passed. 1 failed (9.15957e-05%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+ src/hb-ot-shape-complex-indic.cc                         |   4 ++--
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf | Bin 0 ->
+ 3972 bytes
+ test/shaping/tests/indic-joiners.tests                   |   2 ++
+ 4 files changed, 5 insertions(+), 2 deletions(-)
+
+commit cdf1fd0627c5517c948ca05d2e9427c3e441adf9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 14 12:43:34 2017 +0100
+
+    [indic] Add infrastructure to disable ZWNJ-skipping in
+    context-matching
+
+    Not used yet.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 45
+ ++++++++++++++++++++----------------
+ src/hb-ot-layout.cc                  |  1 +
+ src/hb-ot-map-private.hh             | 10 +++++---
+ src/hb-ot-map.cc                     |  8 +++++--
+ 4 files changed, 39 insertions(+), 25 deletions(-)
+
+commit 3a73e0d5e17b87ac7e307d855c2cb43d040bd195
+Author: Dominik Schlösser <dominik.schloesser@gmail.com>
+Date:   Fri Jul 14 13:14:55 2017 +0200
+
+    Shaping tests for Tibetan vowels (#446)
+
+    * Shaping tests for Tibetan vowels
+
+    * Test-cases for the Dzongkha contractions with multiple vowel-signs
+    added.
+
+    * going to be removed
+
+    * Extended contraction-test-cases to all test cases in
+    contractions.txt that actually use multiple-vowels (113 cases)
+
+ test/shaping/Makefile.am                           |   3 ++
+ .../2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf   | Bin 0 -> 125256
+ bytes
+ .../82f4f3b57bb55344e72e70231380202a52af5805.ttf   | Bin 0 -> 11116 bytes
+ .../a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf   | Bin 0 -> 106096
+ bytes
+ test/shaping/tests/tibetan-contractions-1.tests    |  60
+ +++++++++++++++++++++
+ test/shaping/tests/tibetan-contractions-2.tests    |  53
+ ++++++++++++++++++
+ test/shaping/tests/tibetan-vowels.tests            |  11 ++++
+ 7 files changed, 127 insertions(+)
+
+commit 4e21ec546932c2a982aa52fce718c1a0d90a71d6
+Author: Dominik Schlösser <dominik.schloesser@gmail.com>
+Date:   Fri Jul 14 13:14:23 2017 +0200
+
+    Fix for reordering of Tibetan vowel u (#443)
+
+    * Undone change for Tibetan vowel u
+
+    * removed comment on reordering that became invalid with roll-back
+
+    * Support for Dzongkha contractions with multiple vowel-signs
+
+    * Removed non-functional and unnecessary defines for
+    HB_MODIFIED_COMBINING_CLASS_CCC138,140
+
+ src/hb-unicode-private.hh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit ad52e044bcf733bcc6c0373bafcd78a8c0beb400
+Author: fanc999 <fanc999@yahoo.com.tw>
+Date:   Wed Jun 21 22:19:57 2017 +0800
+
+    Win32/NMake builds: Support builds from GIT (#498)
+
+    Add Python scripts to generate the full win32/config.h.win32 and
+    src/hb-version.h which can be used to build directly from a GIT
+    checkout.  Since the scripts are currently intended for building
+    from a
+    GIT checkout, these are not distributed in the release tarballs.
+
+    Also, support the re-build of Ragel-generated .hh headers using
+    the NMake
+    build system, and allow one to specify the path of the Ragel
+    executable
+    if a suitable one cannot be found in the PATH.
+
+    Update the Win32/NMake build documentation to let people know
+    about how
+    these mechanisms can be utilized.
+
+ win32/README.txt            |  20 ++++++-
+ win32/build-rules-msvc.mak  |   5 +-
+ win32/config-msvc.mak       |   7 +++
+ win32/create-lists-msvc.mak |   9 ++++
+ win32/generate-msvc.mak     |   6 +++
+ win32/info-msvc.mak         |   8 ++-
+ win32/pc_base.py            | 124
+ ++++++++++++++++++++++++++++++++++++++++++++
+ win32/replace.py            | 115
+ ++++++++++++++++++++++++++++++++++++++++
+ win32/setup.py              |  62 ++++++++++++++++++++++
+ 9 files changed, 353 insertions(+), 3 deletions(-)
+
+commit 3b0e47ca006b8fe6a24ace72dd931e3649bb8e6f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 19 14:47:09 2017 +0430
+
+    Fix arm-none-eabi build (fixes #451) (#496)
+
+ CMakeLists.txt                          |  4 ++--
+ src/hb-buffer.cc                        |  4 ++--
+ src/hb-common.cc                        | 28 ++++++++++++++++++++--
+ src/hb-ot-font.cc                       |  2 +-
+ src/hb-ot-layout.cc                     |  2 +-
+ src/hb-ot-shape-complex-arabic-table.hh | 14 +++++------
+ src/hb-ot-shape-complex-arabic.cc       |  2 +-
+ src/hb-ot-shape-complex-hangul.cc       | 16 ++++++-------
+ src/hb-ot-shape-complex-indic-table.cc  | 22 ++++++++---------
+ src/hb-ot-shape-complex-indic.cc        | 12 +++++-----
+ src/hb-ot-shape-complex-myanmar.cc      |  2 +-
+ src/hb-ot-shape-complex-thai.cc         | 12 +++++-----
+ src/hb-ot-shape-complex-use-table.cc    | 42
+ ++++++++++++++++-----------------
+ src/hb-unicode-private.hh               | 16 ++++++-------
+ src/hb-utf-private.hh                   | 18 +++++++-------
+ 15 files changed, 110 insertions(+), 86 deletions(-)
+
+commit 76c4873e8cad2871d2d547318d371b9a89d8c806
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 2 21:53:10 2017 +0430
+
+    Support branch prediction helpers on clang compiles (#491)
+
+ src/hb-private.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 7dba30639a6f62803dfc21706bc7c654799f373e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 1 11:44:42 2017 -0400
+
+    Handle allocation failure in hb-language code
+
+ src/hb-common.cc | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+commit 92e2c4baafa0401cb8d7dd2bbd70acfaeaf2aabf
+Author: Sebastian Rasmussen <sebras@gmail.com>
+Date:   Mon May 29 12:53:30 2017 -0500
+
+    Avoid using strdup inside library. (#488)
+
+    If an application provides a malloc replacement through
+    hb_malloc_impl() it is important that it is used to allocate
+    everything, but the use of strdup() circumvents this and
+    causes system malloc() to be called instead. This pairs
+    badly with the custom hb_free_impl() being called later.
+
+ src/hb-common.cc  | 8 +++++++-
+ src/hb-private.hh | 4 ----
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+commit 06cfe3f7369684fc05fa16da7f6778350f8bcba5
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed May 17 21:32:47 2017 +0300
+
+    Do not skip TAG characters in glyph substitution (#487)
+
+    Hide them like Mongolian Free Variation Selectors instead.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/463
+
+ src/hb-ot-layout-gsubgpos-private.hh                     |   2 +-
+ src/hb-ot-layout-private.hh                              |  13
+ +++++++++----
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf | Bin 0 ->
+ 5044 bytes
+ test/shaping/tests/emoji-flag-tags.tests                 |   2 ++
+ 5 files changed, 13 insertions(+), 5 deletions(-)
+
+commit 1817221620dce713aae67352568ebcc231ab9512
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 16 14:26:28 2017 -0700
+
+    Minor
+
+ src/hb-atomic-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 152736981d5bb9e098c1a8b86fcf8fe577a4a9ec
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 13 21:32:56 2017 +0430
+
+    [cmake] Add framework build support (#484)
+
+ CMakeLists.txt | 46 +++++++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 39 insertions(+), 7 deletions(-)
+
+commit bf50ddaf2b416bd80ae8849593bc745b578193d9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 4 20:31:42 2017 +0430
+
+    [cmake] minor (#482)
+
+ CMakeLists.txt | 30 +++++++++++++++++++-----------
+ 1 file changed, 19 insertions(+), 11 deletions(-)
+
+commit 141b33de9a141248e2f034d55f48460159536cb9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Apr 23 16:19:13 2017 -0700
+
+    1.4.6
+
+ NEWS         | 9 +++++++++
+ configure.ac | 2 +-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 74b99ef2249107e7cd01bd1ee522a5d9ce61e05f
+Author: mhosken <mhosken@users.noreply.github.com>
+Date:   Thu Apr 20 19:13:22 2017 +0100
+
+    Fix graphite2 rtl conversion (#475)
+
+ src/hb-graphite2.cc | 32 ++++++++++++++------------------
+ 1 file changed, 14 insertions(+), 18 deletions(-)
+
+commit 696641314e7eb60a5a2e08c1c4fd1e5e41022148
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Apr 19 22:59:46 2017 +0430
+
+    [cmake] Final touches (#473)
+
+ CMakeLists.txt | 113
+ +++++++++++++++++++++++++++------------------------------
+ 1 file changed, 54 insertions(+), 59 deletions(-)
+
+commit aacca37590656e235218557ea509eb5624dfbff9
+Author: Chris Peterson <cpeterson@mozilla.com>
+Date:   Mon Apr 17 23:25:24 2017 -0700
+
+    Fix clang -Wcomma warnings (#471) (#472)
+
+    clang's new -Wcomma compiler option warns about possible misuse of the
+    comma operator such as between two statements.
+
+    hb-common.cc:190:9 [-Wcomma] possible misuse of comma operator here
+    hb-ot-layout-gsubgpos-private.hh:345:30 [-Wcomma] possible misuse of
+    comma operator here
+    hb-shape-plan.cc:438:26 [-Wcomma] possible misuse of comma operator
+    here
+
+ src/hb-common.cc                     | 6 ++++--
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ src/hb-shape-plan.cc                 | 7 ++++---
+ 3 files changed, 9 insertions(+), 6 deletions(-)
+
+commit 4d7c52066b5b205b20ba2679cb57a4e593942102
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Mon Apr 17 15:53:46 2017 +0430
+
+    [cmake] Remove HB_DISABLE_DEPRECATED as it seems needed for pango
+    build (#470)
+
+ CMakeLists.txt | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 5ecf96e3a22e896184710a9f146a8bf149af6ca4
+Author: William Hua <william@attente.ca>
+Date:   Mon Apr 17 01:33:42 2017 -0400
+
+    Use absolute paths of ragel generated headers (#467)
+
+    https://github.com/behdad/harfbuzz/issues/455
+
+ src/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c42869eb713f53504e1b77a679cff2f88ebd0c20
+Author: Dominik Schlösser <dominik.schloesser@gmail.com>
+Date:   Sat Apr 15 21:17:05 2017 +0200
+
+    Small doc fix: `make check` runs the tests (#469)
+
+ test/shaping/README.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 75931427aa4344cd75321c618b8373ffcf1ffc33
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Fri Apr 14 05:08:11 2017 +0430
+
+    [cmake] Fix try compile link issues (#466)
+
+ CMakeLists.txt | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit cb021e14ab345def326fb58ce486515af179b2cf
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Fri Apr 14 04:31:17 2017 +0430
+
+    [cmake] typo (#465)
+
+ CMakeLists.txt | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a41d5ea4453995dfd7c523427c6017623164c6ff
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Fri Apr 14 04:25:50 2017 +0430
+
+    [cmake] Add atomic ops availability detection (#464)
+
+ CMakeLists.txt | 30 ++++++++++++++++++++++++++++++
+ 1 file changed, 30 insertions(+)
+
+commit 8568588202dd718b089e43cd6d46f689c706f665
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Apr 13 02:17:16 2017 +0430
+
+    [cmake] Remove NO_MT flag (#462)
+
+ CMakeLists.txt | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit c04c1fe86ee4b9b58ad88dad5593239ade4c75b8
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Tue Apr 11 22:29:13 2017 +0100
+
+    Blacklist GDEF table in additional Tahoma versions. (#459)
+
+    There are more broken versions of Tahoma out there on various
+    Windows releases,
+    so we need to add them to our blacklist to avoid broken rendering.
+    See https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 for details.
+
+ src/hb-ot-layout.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit adfd4ae1cf6c4abe66aecf1eb0a05c7183a0f4e2
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Tue Apr 11 23:18:18 2017 +0430
+
+    [cmake] Improve third party libraries support (#461)
+
+ CMakeLists.txt               | 57
+ ++++++++++++++++++++++++++++++++++++--------
+ src/hb-ucdn/Makefile.sources |  5 +++-
+ 2 files changed, 51 insertions(+), 11 deletions(-)
+
+commit 3a8bc572115a28741d5a80f3f1e28e6756b9abfa
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Tue Apr 11 21:32:14 2017 +0430
+
+    [cmake] Add utils build support (#460)
+
+ CMakeLists.txt | 150
+ +++++++++++++++++++++++++++++++++++++++++----------------
+ 1 file changed, 108 insertions(+), 42 deletions(-)
+
+commit bc1244e2395f844b2b41315cb1eef29570e46b29
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Thu Apr 6 18:44:28 2017 +0800
+
+    NMake Makefiles: Fix ICU builds
+
+    Fix the check conditions in config-msvc.mak and info-msvc.mak so that
+    the ICU items does indeed get built into the HarfBuzz main DLL,
+    and that
+    the correct configuration info is displayed.
+
+    Also update the checks in detectenv-msvc.mak so that we can detect
+    that
+    we are using Visual Studio 2017 (although the 2015-built binaries use
+    the same CRT DLL as the 2017 ones).
+
+ win32/config-msvc.mak    | 22 ++++++++++++----------
+ win32/detectenv-msvc.mak |  4 +++-
+ win32/info-msvc.mak      | 12 ++++++++----
+ 3 files changed, 23 insertions(+), 15 deletions(-)
+
+commit a4471d0c2cc4baa81e2cea695f9bd15e03d0f15e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 5 15:42:11 2017 +0200
+
+    Move list of ragel sources to Makefile.sources as well
+
+ src/Makefile.am      | 14 ++++----------
+ src/Makefile.sources |  9 +++++++++
+ 2 files changed, 13 insertions(+), 10 deletions(-)
+
+commit d2acaf6d729727f47c5aacf7ee40097580b6f18d
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Apr 5 02:21:23 2017 -0700
+
+    Split ragel generated files lists and remove hardcoded rl files lists
+    (#453)
+
+ CMakeLists.txt        | 126
+ +++++++++++++++++++++-----------------------------
+ src/Makefile.am       |   2 +
+ src/Makefile.sources  |  16 +++++--
+ win32/config-msvc.mak |   8 ++--
+ 4 files changed, 71 insertions(+), 81 deletions(-)
+
+commit 7d64c0ef37dd930e9807bd80d398491aa9c4428c
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Tue Apr 4 15:03:51 2017 +0430
+
+    Add CMake build support (#444)
+
+ CMakeLists.txt | 254
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Makefile.am    |   1 +
+ appveyor.yml   |  61 +++++++++-----
+ 3 files changed, 295 insertions(+), 21 deletions(-)
+
+commit 740fdbcd0e6d25c1d6f12537ca2aa559650b9d52
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Mon Apr 3 12:22:39 2017 +0100
+
+    avoid UBSan warning in get_stage_lookups (#450)
+
+    See https://bugzilla.mozilla.org/show_bug.cgi?id=1336600
+
+ src/hb-ot-map-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8d256841ca7462fd596329abf6f71bafb56fd621
+Author: Dominik Schloesser <dsc@dosc.net>
+Date:   Sun Mar 26 09:22:34 2017 +0200
+
+    Current fonttools (3.9.1) generate subset-file called font.subset.ttf
+    instead of older font.ttf.subset
+
+ test/shaping/record-test.sh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit c2a9de15f5d9477c6f1c143ed8265f71fdb04584
+Author: Dominik Schloesser <dsc@dosc.net>
+Date:   Sun Mar 26 09:21:13 2017 +0200
+
+    Updated samples: record-it.sh is now record-test.sh
+
+ test/shaping/README.md | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f2e6c7ce51283809033d08692a2dee7cf04aefc5
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sun Mar 26 10:48:53 2017 +0200
+
+    [tools] Make hb-unicode-code work with Python 3
+
+    Related to https://github.com/behdad/harfbuzz/pull/445
+
+ test/shaping/hb_test_tools.py | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+commit edcf6344bc62af9ea726a633468c9243e127fa13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 24 10:24:52 2017 -0700
+
+    Blacklist more versions of Padauk
+
+    Patch from Phil Race.
+
+ src/hb-ot-layout.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit e693ba77980d5ded65bf773d48b6b58274933fb7
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Mar 23 00:35:36 2017 +0200
+
+    [ci] Fix msys2 build on AppVeyor
+
+    For whatever reason the env variables need to be the Windows way
+    or they
+    end up being empty.
+
+ appveyor.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 91570a1eeb1eca425372e203656369f39ede5c61
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Mar 22 23:07:15 2017 +0200
+
+    Just always use strtod here
+
+ src/hb-common.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 539571c1a9cb5d443d029247874af37fed75432f
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Fri Feb 24 17:58:25 2017 +0800
+
+    src/hb-common.cc: Fix build on older Visual Studio
+
+    Visual Studio only supported strtof() from Visual Studio 2013
+    onwards, so
+    use strtod() instead to do the operation, which should do the
+    same thing,
+    sans going to a double, not a float.
+
+ src/hb-common.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit b90fb83ea6067802e62af9e1ea0c61c7ac79e9a9
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Fri Feb 24 17:47:44 2017 +0800
+
+    Visual Studio builds: Fix Introspection when UCDN enabled
+
+    The sources in src/hb-ucdn and not included correctly into the NMake
+    Makefiles, as we need their explicit relative location as we pass
+    all the
+    sources we used into the introspection scanner.  This was not an issue
+    before as we excluded the UCDN sources in the build when we enabled
+    introspection (meaning GLib is enabled), but since we default on using
+    UCDN on all builds unless explicitly disabled, we need to deal
+    with this.
+
+    This did not affect builds using UCDN without introspection due to
+    the use
+    of NMake batch rules.
+
+    Fix this by creating a NMake Makefile module on-the-fly with the
+    correct
+    subdir info, and using that list in there instead.
+
+ win32/Makefile.vc     | 15 +++++++++++++++
+ win32/config-msvc.mak |  2 +-
+ 2 files changed, 16 insertions(+), 1 deletion(-)
+
+commit f0aa167e447e8aa818a63a4a325be57844bf0353
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Thu Feb 23 13:02:49 2017 +0800
+
+    Update Visual Studio builds for UCDN usage
+
+    We now use UCDN by default, so make it so in the build files; however
+    don't hardcode HAVE_UCDN as one may still opt not to use it (but pass
+    it in as a CFLAG unless one explicitly disables UCDN by using
+    NO_UCDN=1
+    on the NMake command line).
+
+    Note that we are not blocking builds where UCDN is disabled along with
+    GLib and ICU, as that will trigger a build error anyways which
+    will tell
+    the user what needs to be done to remedy this.
+
+ win32/README.txt        |  6 +++---
+ win32/config-msvc.mak   | 28 +++++++++++++++-------------
+ win32/config.h.win32.in |  2 +-
+ win32/info-msvc.mak     | 43 +++++++++++++++++++++++++------------------
+ 4 files changed, 44 insertions(+), 35 deletions(-)
+
+commit 60e2586f7652aaa0ee908eb8f54b1498e2ad299e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 10 23:02:28 2017 -0800
+
+    1.4.5
+
+ NEWS         | 8 ++++++++
+ configure.ac | 2 +-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 47e7a1800fba9b8bf042a1f4976a15ab012ebfc7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 10 13:23:02 2017 -0800
+
+    Revert "Fix Context lookup application when moving back after a
+    glyph delete"
+
+    This reverts commit b9b005f3a44ccf78a45b212b126287b69b9f4b40.
+
+    This introduced invalid access cases. Revert until I fix correctly.
+
+ src/hb-ot-layout-gsubgpos-private.hh                     |   7 ++++---
+ .../sha1sum/5bbf3712e6f79775c66a4407837a90e591efbef2.ttf | Bin 6400 ->
+ 0 bytes
+ test/shaping/tests/context-matching.tests                |   1 -
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 3c080a7a0aefec1e9620e3fb399ad280ea4ee5a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 7 18:13:28 2017 -0800
+
+    Fix buffer serialize of empty buffer
+
+    Ouch!
+
+ src/hb-buffer-serialize.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 8e42c3cb2bb81351d0a28f213cb4f6d35f4b5e46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Mar 5 13:54:56 2017 -0800
+
+    1.4.4
+
+ NEWS         | 8 ++++++++
+ configure.ac | 2 +-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 9ac9af725c781f4597e8db46cf330d595c072739
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Mar 5 13:51:01 2017 -0800
+
+    Add TODO item
+
+ src/hb-ot-layout-gsubgpos-private.hh | 24 +++++++++++++++++++++++-
+ 1 file changed, 23 insertions(+), 1 deletion(-)
+
+commit 3ebcd5a381e2de27a0cfb5af3359331f0b7e7108
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sun Mar 5 16:26:01 2017 +0100
+
+    first working version!
+
+ src/hb-ot-layout.cc | 2 ++
+ src/hb-ot.h         | 1 +
+ 2 files changed, 3 insertions(+)
+
+commit e65aaaa00a3b5ac811b5c73b5186cd7d65731f7b
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sun Mar 5 14:53:39 2017 +0100
+
+    BASE: start api
+
+ src/Makefile.sources           |  2 ++
+ src/hb-ot-base.cc              | 58
+ ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-base.h               | 56
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-base-table.hh | 15 ++---------
+ 4 files changed, 118 insertions(+), 13 deletions(-)
+
+commit 5aec2fb8d0a4db52ae414d980b66018ca5ce1e9c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 2 11:46:33 2017 -0800
+
+    Remove TODO item that is not going to happen
+
+ src/hb-ot-shape.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit b9b005f3a44ccf78a45b212b126287b69b9f4b40
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 1 14:27:23 2017 -0800
+
+    Fix Context lookup application when moving back after a glyph delete
+
+    This was broken forever, since days that we did not allow moving
+    tape backwards. Works now. Reported by Doug Felt.
+
+ src/hb-ot-layout-gsubgpos-private.hh                     |   7 +++----
+ .../sha1sum/5bbf3712e6f79775c66a4407837a90e591efbef2.ttf | Bin 0 ->
+ 6400 bytes
+ test/shaping/tests/context-matching.tests                |   1 +
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit f72726c52b104a71ebf5b39fa1e3eb9febd446fc
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sun Feb 26 15:08:43 2017 +0100
+
+    BASE: add function in main BASE object
+
+ src/hb-ot-layout-base-table.hh | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit 3963315f1b2eae2504bc683760245c827cd1ef16
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sun Feb 26 15:07:53 2017 +0100
+
+    BASE: first complete version
+
+ src/hb-ot-layout-base-table.hh | 444
+ +++++++++++++++++++++++++++++------------
+ 1 file changed, 317 insertions(+), 127 deletions(-)
+
+commit a11501444cfc4854bfe2b1d3ce0fc5a957e959d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 25 13:37:54 2017 -0800
+
+    Add few tests found by libFuzzer and oss-fuzz
+
+ .../sha1sum/a34a9191d9376bda419836effeef7e75c1386016.ttf | Bin 0 ->
+ 1010 bytes
+ .../sha1sum/a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf | Bin 0 ->
+ 820 bytes
+ .../sha1sum/b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf | Bin 0 ->
+ 3301 bytes
+ .../sha1sum/e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf | Bin 0 ->
+ 515 bytes
+ test/shaping/tests/fuzzed.tests                          |   4 ++++
+ 5 files changed, 4 insertions(+)
+
+commit 85630996b8afa699f7b5d19346cdf5c72fcd6e2d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 25 13:30:38 2017 -0800
+
+    Fix buffer-overrun with Bengali reph positioning code
+
+    This has no security implications whatsoever since we always keep
+    and extra element at the end of buffer, just in case.
+
+    Discovered by oss-fuzz
+    CC https://github.com/behdad/harfbuzz/issues/139
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=660
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d34e35b47457e757781b1769a1fbaf107ec6e32f
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sat Feb 25 20:41:05 2017 +0100
+
+    BASE: WIP: more access functions
+
+ src/hb-ot-layout-base-table.hh | 212
+ +++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 191 insertions(+), 21 deletions(-)
+
+commit 6685d281d6f50bf046bbfef4a5263e15d15f2f02
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 25 11:35:05 2017 -0800
+
+    1.4.3
+
+ NEWS         | 12 ++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit bd15567ed6a3667e6f8332b7374aece6a6f2361b
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sat Feb 25 17:08:01 2017 +0100
+
+    BASE: align member's names
+
+ src/hb-ot-layout-base-table.hh | 70
+ +++++++++++++++++++++---------------------
+ 1 file changed, 35 insertions(+), 35 deletions(-)
+
+commit 499b4bef2a5b6d49374ab4977509d1fbf7bd6038
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sat Feb 25 16:48:22 2017 +0100
+
+    BASE: more consistent naming (with spec and Harfbuzz code base)
+
+ src/hb-ot-layout-base-table.hh | 44
+ +++++++++++++++++++++---------------------
+ 1 file changed, 22 insertions(+), 22 deletions(-)
+
+commit a0bdd546c584eb7c7ea3ca7e19a178723e6fe77f
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sat Feb 25 16:34:58 2017 +0100
+
+    factorize horiz+vertAxis
+
+ src/hb-ot-layout-base-table.hh | 31 +++++--------------------------
+ 1 file changed, 5 insertions(+), 26 deletions(-)
+
+commit 1d30c6d935535743c73b2d18abcc6ae86a1cfc5b
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sat Feb 25 16:19:35 2017 +0100
+
+    BASE: sanitize
+
+ src/hb-ot-layout-base-table.hh | 151
+ ++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 148 insertions(+), 3 deletions(-)
+
+commit a657f23ca31237d652b5c101ed24194b6aeadaf8
+Author: Dominik Röttsches <d-r@roettsches.de>
+Date:   Mon Feb 20 21:52:07 2017 +0200
+
+    Blacklist another instance of Padauk (#419)
+
+    In https://crbug.com/681813 another instance of Padauk was identified
+    triggering collapsed glyphs. Blacklist this version by patching
+    hb-ot-layout.cc to print out gdef, gsub, and gpos table length, then
+    adding those to the list of blacklisted versions.
+
+ src/hb-ot-layout.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit f131f00b1779b44633223915e17cbce358ad063a
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sun Feb 19 10:12:22 2017 +0100
+
+    compile, move into hb-ot-layout.cc
+
+ src/hb-ot-font.cc              |  1 -
+ src/hb-ot-layout-base-table.hh | 57
+ +++++++++++++++++++++++++++++++-----------
+ src/hb-ot-layout.cc            |  1 +
+ 3 files changed, 43 insertions(+), 16 deletions(-)
+
+commit d0b97353e930d9b258f42f1cc1ac1a75306b76a8
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sun Feb 19 08:48:22 2017 +0100
+
+    hb-ot-base-table.hh -> hb-ot-layout-base-table.hh
+
+    per
+    https://github.com/behdad/harfbuzz/issues/418#issuecomment-280873811
+
+ src/Makefile.sources                                    | 2 +-
+ src/hb-ot-font.cc                                       | 2 +-
+ src/{hb-ot-base-table.hh => hb-ot-layout-base-table.hh} | 0
+ 3 files changed, 2 insertions(+), 2 deletions(-)
+
+commit f748e11645a3361f94d6fb10ce59febbaa5ba8ca
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sat Feb 18 19:54:33 2017 +0100
+
+    bootstraping structure
+
+ src/Makefile.sources        |   1 +
+ src/hb-ot-base-table.hh     | 238
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-font.cc           |   1 +
+ src/hb-ot-layout-private.hh |   2 +
+ 4 files changed, 242 insertions(+)
+
+commit 70202983f57fe85b2d3b56a9c205effeee66222d
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Sat Feb 18 10:37:36 2017 +0330
+
+    [ci] Disable vcpkg freetype installation and fix Appveyor CI (#422)
+
+ appveyor.yml | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 44f7d6ecde9bf7427a05cbe73ed5d668b8a72b2a
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Fri Feb 17 03:03:24 2017 +0000
+
+    Guard against underflow when adjusting length (#421)
+
+    * Guard against underflow when adjusting length
+
+    With the fuzz-testcase in mozilla bug 1295299, we end up with a
+    recursed lookup that removes 3 items, when `match_positions[idx]`
+    is 0, which results in (unsigned) `end` wrapping to a huge value.
+
+    Making `end` a signed int is probably the simplest route to a fix.
+
+    Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1295299.
+
+    * Add testcase for #421.
+
+ src/hb-ot-layout-gsubgpos-private.hh                     |   6 +++---
+ .../sha1sum/558661aa659912f4d30ecd27bd09835171a8e2b0.ttf | Bin 0 ->
+ 1358 bytes
+ test/shaping/tests/fuzzed.tests                          |   1 +
+ 3 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 45766b673f427bb791c9d5886cadedfac0447066
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Thu Feb 16 17:40:21 2017 +0000
+
+    [indic] Add support for Grantha marks that may be used in Tamil to
+    th… (#401)
+
+    * [indic] Add support for Grantha marks that may be used in Tamil
+    to the Indic table.
+
+    See https://bugzilla.mozilla.org/show_bug.cgi?id=1331339.
+
+    Testcase: U+0BA4,U+0BC6,U+1133c,U+0BAA,U+1133c,U+0BC6,U+1133c
+
+    * [indic] Add test for Grantha nukta that is allowed in Tamil by
+    ScriptExtensions.txt
+
+ src/hb-ot-shape-complex-indic-table.cc                   |   7 +++++++
+ .../sha1sum/3493e92eaded2661cadde752a39f9d58b11f0326.ttf | Bin 0 ->
+ 1400 bytes
+ test/shaping/tests/indic-script-extensions.tests         |   1 +
+ 3 files changed, 8 insertions(+)
+
+commit d4bb52b9fd8a5bc4af13752ea3e464eccfe3223b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 9 14:13:25 2017 -0800
+
+    Unbreak hb-coretext build
+
+ src/hb-coretext.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit c8dfed8e1ee4ab64b6936f5c8561db0666e37647
+Merge: 7c47474f b435c7c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 8 14:36:18 2017 -0800
+
+    Merge pull request #357 from khaledhosny/graphite-scale
+
+    [graphite] Fix shaping with varying font sizes
+
+commit 7c47474f209bdf84cf87844c277ed711cad78196
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 8 14:33:28 2017 -0800
+
+    Set LC_ALL instead of LANG when creating harfbuzz.def
+
+    Hopefully fixes Travis faliure?
+    https://github.com/behdad/harfbuzz/pull/413#issuecomment-278481882
+    https://travis-ci.org/khaledhosny/harfbuzz/jobs/199785332#L1065
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ffde3c9f9effcd2b47f5fd76df45551e68c0b1ec
+Author: Philip Withnall <philip@tecnocode.co.uk>
+Date:   Wed Feb 8 21:56:57 2017 +0000
+
+    hb-font: Fix a potentially undefined use of memcmp() (#413)
+
+    While it’s fine to call memcmp(x, 0, 0) in practice, the C99
+    standard
+    explicitly says that this is not allowed: even if the length is zero,
+    the pointer arguments must be valid.
+
+    http://stackoverflow.com/a/16363034
+
+    Coverity ID: 141178
+
+    Signed-off-by: Philip Withnall <withnall@endlessm.com>
+
+ src/hb-font.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 09594df1aecbb7d37093055147c25cc7d7b7fef6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 7 18:25:12 2017 -0800
+
+    Update ax_pthread.m4 to latest upstream version
+
+    Might help with https://github.com/behdad/harfbuzz/issues/399
+
+ m4/ax_pthread.m4 | 394
+ ++++++++++++++++++++++++++++++++++++++++---------------
+ 1 file changed, 285 insertions(+), 109 deletions(-)
+
+commit a6ced90efccf869defc0b310effca220f01cf318
+Author: Philip Withnall <philip@tecnocode.co.uk>
+Date:   Wed Feb 8 02:18:33 2017 +0000
+
+    test: Fix some memory leaks in test-font.c (#409)
+
+    Coverity IDs: 141039, 141040, 141041
+
+ test/api/test-font.c | 35 ++++++++++++++++++++++++++++++-----
+ 1 file changed, 30 insertions(+), 5 deletions(-)
+
+commit 925ceacfed45c44dd2a025c32bebb1358b560741
+Author: Philip Withnall <philip@tecnocode.co.uk>
+Date:   Wed Feb 8 02:17:48 2017 +0000
+
+    util: Add missing field initialisers in constructor (#410)
+
+    Coverity ID: 141042
+
+ util/hb-shape.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 73c6dcbb45269186f204b2212288b6384ce42c9d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 7 16:53:21 2017 -0800
+
+    Silence Coverity warning
+
+    Fixes https://github.com/behdad/harfbuzz/issues/408
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 466b3e58bdc64229dab08c6e0e0079c789540370
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 3 16:43:25 2017 -0800
+
+    Shuffle things around a bit
+
+ src/hb-coretext.cc          |  4 ++--
+ src/hb-directwrite.cc       |  4 ++--
+ src/hb-fallback-shape.cc    |  4 ++++
+ src/hb-graphite2.cc         |  4 ++--
+ src/hb-ot-layout-private.hh |  1 -
+ src/hb-ot-layout.cc         |  2 --
+ src/hb-ot-math.cc           |  3 +--
+ src/hb-ot-shape.cc          |  4 ++++
+ src/hb-ot-var.cc            |  2 --
+ src/hb-shape-plan.cc        |  7 -------
+ src/hb-shaper-private.hh    | 11 +++++++----
+ src/hb-uniscribe.cc         |  4 ++--
+ 12 files changed, 24 insertions(+), 26 deletions(-)
+
+commit fc8189b63931f03c5d2e70dde198e9c856bd78f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 3 16:17:08 2017 -0800
+
+    Minor
+
+ src/hb-shaper-private.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit d3d3691806aaa6aed93a88c845d472e727e7f850
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 3 15:42:03 2017 -0800
+
+    Add dirty-state tracking to hb_face_t
+
+ src/hb-face-private.hh |  9 +++++++++
+ src/hb-face.cc         | 19 ++++++++++++++++++-
+ src/hb-font.cc         |  2 +-
+ 3 files changed, 28 insertions(+), 2 deletions(-)
+
+commit 2171f48b4b1e66a3c16a83cc00b0006d32ae9738
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 3 10:58:09 2017 -0800
+
+    Add dirty-state tracking to hb_font_t
+
+ src/hb-font-private.hh | 12 ++++++++++++
+ src/hb-font.cc         | 30 ++++++++++++++++++++++++++++++
+ 2 files changed, 42 insertions(+)
+
+commit 95808bad2c17a9ef41c58c04faf1b4706fb7d72e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 3 10:39:40 2017 -0800
+
+    Add new API hb_font_set_face()
+
+    For completeness.
+
+ src/hb-font.cc | 29 +++++++++++++++++++++++++++++
+ src/hb-font.h  |  4 ++++
+ 2 files changed, 33 insertions(+)
+
+commit 4ec19319ab195d852708661e12da2a6485fce544
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Thu Feb 2 18:48:23 2017 +0000
+
+    Add Win10 Anniversary Update version of Tahoma to GDEF
+    blacklist. (#412)
+
+ src/hb-ot-layout.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 1dd630a7f2c2cec780fee507367341bc9050cdb3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 1 11:57:21 2017 -0800
+
+    Minor
+
+    Fixes https://github.com/behdad/harfbuzz/issues/411
+
+ src/hb-fallback-shape.cc     | 2 +-
+ src/hb-ot-shape-normalize.cc | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit e888f642db16f52836cbfec29de43ff20236dc85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 26 14:50:14 2017 -0800
+
+    Route Adlam through Arabic shaper
+
+    Fixes joined Adlam rendering.
+
+    Fixes https://github.com/googlei18n/noto-fonts/issues/828
+
+ src/hb-ot-shape-complex-private.hh                      |   3 +++
+ test/shaping/Makefile.am                                |   1 +
+ .../5dfad7735c6a67085f1b90d4d497e32907db4c78.ttf        | Bin 0 ->
+ 21160 bytes
+ test/shaping/tests/arabic-like-joining.tests            |   1 +
+ 4 files changed, 5 insertions(+)
+
+commit 72c754873c6b15cecb32d9e491c98495f804347a
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Thu Jan 26 22:35:41 2017 +0000
+
+    Add Win7 version of himalaya.ttf to the GDEF table blacklist. (#407)
+
+ src/hb-ot-layout.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 22af28a3f14c6d748ed589f8980b168152116c8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 23 23:42:53 2017 -0800
+
+    [var] Implement MVAR table
+
+    Unhooked. Untested.
+
+ src/Makefile.sources        |   1 +
+ src/hb-font.cc              |   2 +-
+ src/hb-ot-var-mvar-table.hh | 110
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-var.cc            |   1 +
+ 4 files changed, 113 insertions(+), 1 deletion(-)
+
+commit 67a191164dec2cfcab97363175c58e459f6ff8f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 23 23:21:30 2017 -0800
+
+    [var] Whitespace
+
+ src/hb-ot-var-hvar-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 6af6c1114a3495584ac4197c62592741c407b5a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 23 18:35:00 2017 -0800
+
+    1.4.2
+
+ NEWS         | 31 +++++++++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 32 insertions(+), 1 deletion(-)
+
+commit 79e8e27ffd3da29ca27d3aebd2ef425bf1cb7f9d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 23 17:55:31 2017 -0800
+
+    [var] Hook up advance variations to hb-ot-font
+
+    Yay, works!
+
+ src/hb-ot-font.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 607434037199ccca422287e4d097487f17f3cfb5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 23 17:55:16 2017 -0800
+
+    [var] Fix bug in HVAR/VVAR impl
+
+ src/hb-ot-var-hvar-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit bd3b11d92663343350813ca29606b369f691af03
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 23 17:34:44 2017 -0800
+
+    [var] Prepare for hooking up advance variations to hb-ot-font
+
+ src/hb-ot-font.cc           | 28 +++++++++++++++++-----------
+ src/hb-ot-var-hvar-table.hh |  8 ++++----
+ 2 files changed, 21 insertions(+), 15 deletions(-)
+
+commit a4fca9f0051dbc177390a4e555b2d0fe642f724e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 23 11:56:08 2017 -0800
+
+    [var] Implement DeltaSetIndexMap and advance delta fetching
+
+    Not hooked up to hb-ot-font yet.
+
+ src/hb-ot-layout-common-private.hh |  8 ++++++
+ src/hb-ot-var-hvar-table.hh        | 56
+ ++++++++++++++++++++++++++++++++++++--
+ 2 files changed, 61 insertions(+), 3 deletions(-)
+
+commit 7b399f73efa76cd97131fd123a9a1566f8639cfd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 23 11:41:43 2017 -0800
+
+    [var] Start adding HVAR/VVAR
+
+ src/Makefile.sources        |   1 +
+ src/hb-ot-font.cc           |   1 +
+ src/hb-ot-var-avar-table.hh |   1 -
+ src/hb-ot-var-fvar-table.hh |   1 -
+ src/hb-ot-var-hvar-table.hh | 115
+ ++++++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 117 insertions(+), 2 deletions(-)
+
+commit b732c53eb5bd0c2cc86f35a9d9623c92579a0b8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 20:31:53 2017 -0800
+
+    Add LArrayOf<>
+
+ src/hb-open-type-private.hh        | 1 +
+ src/hb-ot-cbdt-table.hh            | 4 ++--
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 3 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 5e156fa5ed33cd1a8ff388833563f15930bb12f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 20:28:56 2017 -0800
+
+    Add LOffsetTo<>
+
+ src/hb-open-file-private.hh          |  2 +-
+ src/hb-open-type-private.hh          |  1 +
+ src/hb-ot-cbdt-table.hh              |  4 ++--
+ src/hb-ot-cmap-table.hh              |  6 +++---
+ src/hb-ot-layout-common-private.hh   | 10 +++++-----
+ src/hb-ot-layout-gdef-table.hh       |  4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh |  2 +-
+ 7 files changed, 15 insertions(+), 14 deletions(-)
+
+commit d6bdbbca307d1a4aed60a78133eea40a1a9d5bf3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 20:16:51 2017 -0800
+
+    [var] Remove HB_OT_TAG_fvar/avar
+
+    We're not going to define public macros for tags for tables.
+    There's little use to those and they are implementation detail.
+
+ docs/harfbuzz-sections.txt  | 2 --
+ src/hb-ot-var-avar-table.hh | 2 ++
+ src/hb-ot-var-fvar-table.hh | 2 ++
+ src/hb-ot-var.h             | 3 ---
+ 4 files changed, 4 insertions(+), 5 deletions(-)
+
+commit a11d9a0466e480efebd69a34827675387cd2ca34
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 20:09:47 2017 -0800
+
+    Minor
+
+ src/hb-ot-font.cc       | 6 +++---
+ src/hb-ot-hmtx-table.hh | 8 +++-----
+ 2 files changed, 6 insertions(+), 8 deletions(-)
+
+commit 7a860f656e4aec45c45e0f5fb28c49a91dc5eef2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 19:52:09 2017 -0800
+
+    [var] Add macros for standard axes
+
+ docs/harfbuzz-sections.txt | 7 +++++++
+ src/hb-ot-var.h            | 6 ++++++
+ 2 files changed, 13 insertions(+)
+
+commit a484e237b11650d00092329855d33dd2f67980e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 19:41:33 2017 -0800
+
+    [var] Implement 'avar' table mapping
+
+    Untested!
+
+ src/hb-ot-math.cc           |  2 --
+ src/hb-ot-var-avar-table.hh | 46
+ ++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-ot-var.cc            | 23 +++++++++++++++--------
+ 3 files changed, 60 insertions(+), 11 deletions(-)
+
+commit a42909057207cbed1ef95716170434c05beb0002
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 19:01:07 2017 -0800
+
+    [var] Flesh out --variations documentation
+
+ util/options.cc | 53
+ ++++++++++++++---------------------------------------
+ 1 file changed, 14 insertions(+), 39 deletions(-)
+
+commit 5ec96d30cad1592b5e468bd8ad1832dbaf0ad32b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 18:52:00 2017 -0800
+
+    [var] Adjust API in prep for 'avar' implementation
+
+    The 'avar' table does not allow random access to axis maps,
+    so change API to avoid quadratic-time implementation.
+
+    Removed -hb_ot_var_normalize_axis_value(), added
+    +hb_ot_var_normalize_variations() and
+    +hb_ot_var_normalize_coords() instead.
+
+ docs/harfbuzz-sections.txt |  3 ++-
+ src/Makefile.sources       |  1 +
+ src/hb-font.cc             | 20 +++++---------------
+ src/hb-ot-var.cc           | 45
+ +++++++++++++++++++++++++++++++++++++++------
+ src/hb-ot-var.h            | 16 ++++++++++++----
+ 5 files changed, 59 insertions(+), 26 deletions(-)
+
+commit 8a577aaa0dd760409bcad1ae3d4f5fb561a62a4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 18:22:40 2017 -0800
+
+    [var] Stub implementation of avar table
+
+ src/hb-ot-var-avar-table.hh | 99
+ +++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 99 insertions(+)
+
+commit 7647a05a0b37c53465560952b412db4e590f2716
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 17:47:49 2017 -0800
+
+    Minor
+
+ src/hb-font.cc       |  5 ++++-
+ src/hb-font.h        |  2 +-
+ src/hb-ft.cc         |  2 +-
+ util/helper-cairo.cc | 14 +++++++++-----
+ 4 files changed, 15 insertions(+), 8 deletions(-)
+
+commit d2f249e745a9179943ee39c719b73e1057acbc13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 17:42:33 2017 -0800
+
+    Stub out doc comments for new symbols
+
+ docs/harfbuzz-docs.xml     |  2 +-
+ docs/harfbuzz-sections.txt | 35 +++++++++++++++++++++++++++++++++--
+ src/hb-common.cc           | 10 ++++++++++
+ src/hb-common.h            |  5 +++++
+ src/hb-directwrite.cc      |  2 +-
+ src/hb-directwrite.h       |  2 +-
+ src/hb-font.cc             | 20 ++++++++++++++++++++
+ src/hb-ot-var.cc           | 24 ++++++++++++++++++++++--
+ src/hb-ot-var.h            | 12 +++++-------
+ src/hb-set.cc              |  2 +-
+ 10 files changed, 99 insertions(+), 15 deletions(-)
+
+commit 5dfd341f51543279039ddafe883c0a1de205fb8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 16:55:40 2017 -0800
+
+    Minor
+
+ src/hb-directwrite.cc | 4 ++--
+ src/hb-shape.cc       | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 825e40407da74576f8e83ce0bacad5b0459b83c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 16:41:45 2017 -0800
+
+    [hb-ft] Remove use of variable-length array
+
+    Hopefully also fixes build failure on msvc.
+
+ src/hb-ft.cc | 33 +++++++++++++++++++++------------
+ 1 file changed, 21 insertions(+), 12 deletions(-)
+
+commit 47ee34e84745756a9aaeb964772377b6c1417ed1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 18:10:08 2017 -0800
+
+    [var] Hook up variations to FreeType face
+
+    hb-view correctly renders variations with ft font-funcs now.
+    hb-ot-font needs HVAR implementation.
+
+ src/hb-ft.cc         | 10 ++++++++++
+ util/helper-cairo.cc | 16 +++++++++++++++-
+ 2 files changed, 25 insertions(+), 1 deletion(-)
+
+commit 111f3e55178f7cd5a8ae4e8ae111cb48aea4acb5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 17:51:41 2017 -0800
+
+    [util] Add --variations
+
+    Is hooked up to the font, but not to FreeType, so raster doesn't
+    show yet.
+
+    Documentation needs to be done.
+
+ util/options.cc | 91
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ util/options.hh |  8 ++++-
+ 2 files changed, 98 insertions(+), 1 deletion(-)
+
+commit bb1e19268f02d4aad2240c52852e72afcf0f79ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 17:41:37 2017 -0800
+
+    [var] Rename var_coord to variation
+
+    Looks much better.
+
+ src/hb-common.cc | 36 ++++++++++++++++++------------------
+ src/hb-common.h  | 10 +++++-----
+ src/hb-font.cc   | 20 ++++++++++----------
+ src/hb-font.h    |  6 +++---
+ 4 files changed, 36 insertions(+), 36 deletions(-)
+
+commit 64fe92bf2d43a0ea31743d774e073f202021dbd1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 15:36:35 2017 -0800
+
+    [var] Remove use of variable-length arrays
+
+ src/hb-font.cc | 30 +++++++++++++++++++++---------
+ 1 file changed, 21 insertions(+), 9 deletions(-)
+
+commit 2491134b386507f611a47e43e3f7c2766d0d288b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 15:21:50 2017 -0800
+
+    [var] Add hb_font_set_var_coords()
+
+ src/hb-font.cc | 38 ++++++++++++++++++++++++++++++++++++--
+ src/hb-font.h  |  8 ++++++--
+ 2 files changed, 42 insertions(+), 4 deletions(-)
+
+commit 113393efec5e0c4c10c141a6d4b801d50fcd8ab8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 15:12:03 2017 -0800
+
+    Remove a few unused includes
+
+ src/hb-face.cc      | 6 +-----
+ src/hb-font.cc      | 7 -------
+ src/hb-ot-layout.cc | 5 +----
+ src/hb-ot-tag.cc    | 3 ---
+ 4 files changed, 2 insertions(+), 19 deletions(-)
+
+commit 2d40923ca914c90304d07d6e7b9b1040c79c76fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 15:06:15 2017 -0800
+
+    Minor
+
+ src/hb-ot-math.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8b2a58047095604dcdc576ecbe3e8c2ebb8f48f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 15:05:00 2017 -0800
+
+    [var] Add hb_font_set_var_coords_design()
+
+ src/hb-font.cc | 21 +++++++++++++++++++--
+ src/hb-font.h  |  7 ++++++-
+ 2 files changed, 25 insertions(+), 3 deletions(-)
+
+commit 0dcc7b49a830e2680d3e6d86d953efab85cef6ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 14:50:22 2017 -0800
+
+    [var] Minor lifecycle adjustment
+
+ src/hb-font.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit bf0d3a665baac9e33c0f774b22197c321b864c80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 14:48:46 2017 -0800
+
+    [var] Add hb_font_get_var_coords_normalized()
+
+ src/hb-font.cc | 10 ++++++++++
+ src/hb-font.h  |  4 ++++
+ 2 files changed, 14 insertions(+)
+
+commit b3c0714b4bbb726b2b3e5e0416ac84cb5c6eb34e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 20:30:03 2017 -0800
+
+    [var] Add hb_var_coord_t and parsing routines
+
+ src/hb-common.cc | 94
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++---
+ src/hb-common.h  | 15 ++++++++-
+ 2 files changed, 103 insertions(+), 6 deletions(-)
+
+commit 72364103bc9d910d19f23a3764d045af79d076d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 20:16:53 2017 -0800
+
+    Move code around
+
+ src/hb-common.cc | 250
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-common.h  |  18 ++++
+ src/hb-shape.cc  | 248
+ ------------------------------------------------------
+ src/hb-shape.h   |  16 ----
+ 4 files changed, 268 insertions(+), 264 deletions(-)
+
+commit 785982bf830723552270db5649abcb9f9f0b46b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 19:57:27 2017 -0800
+
+    [var] Flesh out some more
+
+ src/Makefile.am             |  2 ++
+ src/hb-ot-var-fvar-table.hh | 69
+ ++++++++++++++++++++++++++++++++-------------
+ src/hb-ot-var.cc            | 39 ++++++++++++++++++++++++-
+ src/hb-ot-var.h             | 21 +++++++++-----
+ 4 files changed, 104 insertions(+), 27 deletions(-)
+
+commit 422c0c36c80145a2d993f80d5c7d3265e3d8357a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 19:14:54 2017 -0800
+
+    [var] Flesh out a bit
+
+ src/hb-ot-var-fvar-table.hh | 72
+ ++++++++++++++++++++++++++++++++++++---------
+ src/hb-ot-var.h             | 10 ++++++-
+ 2 files changed, 67 insertions(+), 15 deletions(-)
+
+commit b8376b10904e1772b8d34d852d1100ca7e2185e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 18:19:28 2017 -0800
+
+    Minor
+
+ src/hb-ft.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f2e73d37e77ccea8b948d1ecf5f11e7a699386dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 17:42:18 2017 -0800
+
+    [var] Remove over-optimization
+
+ src/hb-font.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 469926cc45760cb681d44e5757b18b9bdd736189
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 17:40:46 2017 -0800
+
+    [var] Change double to float in API
+
+ src/hb-ot-var.h | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 55d42fd667b9c34a1109bb850bf2ea7322c01040
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 19:35:48 2017 -0800
+
+    Start adding hb-ot-var.h and implementation
+
+    Supports enumerating variation axes, normalizing values, etc.
+
+ src/Makefile.sources        |   3 +
+ src/hb-ot-layout-private.hh |   6 ++
+ src/hb-ot-layout.cc         |   4 ++
+ src/hb-ot-var-fvar-table.hh | 133
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-var.cc            |  63 +++++++++++++++++++++
+ src/hb-ot-var.h             |  81 +++++++++++++++++++++++++++
+ src/hb-ot.h                 |   1 +
+ 7 files changed, 291 insertions(+)
+
+commit 272b5115325b785e92ff5500d4bfc3a67490b6f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 19:33:07 2017 -0800
+
+    Minor
+
+ src/hb-ot-math.cc | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit a8a5e81a52f56f5f8bf975dc4d9f79bede5d895b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 16:55:04 2017 -0800
+
+    [test-ot-math] Add test with nil face/font
+
+ test/api/test-ot-math.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 331d07bd40a3d9ff30db5cdf85fdc4f10f0fcb99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 16:51:36 2017 -0800
+
+    Minor
+
+ test/api/test-ot-math.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit b5ecf1bfa459a755e36bc4c7f545c7f803b7d016
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 16:50:29 2017 -0800
+
+    Fix warnings
+
+ test/api/test-ot-math.c | 18 ++++++++++--------
+ 1 file changed, 10 insertions(+), 8 deletions(-)
+
+commit 2f2ceee1853649d1b2ad4315a38cd9c07659932a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 16:48:01 2017 -0800
+
+    Minor
+
+ test/api/test-ot-math.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 2452543fdd383e62b8c4bc44b11bfd6796fc9963
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Jan 18 22:48:13 2017 +0200
+
+    [ot] Fix automatic fraction for RTL scripts (#405)
+
+    The numbers for right-to-left scripts are processed also from right to
+    left, so the order of applying “numr” and “dnom” features
+    should be
+    reversed in such case.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/395
+
+ src/hb-ot-shape.cc                                      |  16
+ ++++++++++++++--
+ test/shaping/Makefile.am                                |   1 +
+ .../15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf        | Bin 0 ->
+ 4936 bytes
+ test/shaping/tests/automatic-fractions.tests            |   3 +++
+ 4 files changed, 18 insertions(+), 2 deletions(-)
+
+commit 1337428e4f8a2a4c78312c581bf4e96cd49d783f
+Author: Sascha Brawer <sascha@brawer.ch>
+Date:   Wed Jan 18 13:51:02 2017 +0100
+
+    Update language tags to OpenType 1.8.1 (#403)
+
+    Resolves https://github.com/behdad/harfbuzz/issues/324
+
+ src/hb-ot-tag.cc       | 77
+ ++++++++++++++++++++++++++++++++++++++++++++------
+ test/api/test-ot-tag.c | 58 +++++++++++++++++++++++++++++++++++++
+ 2 files changed, 126 insertions(+), 9 deletions(-)
+
+commit 784d1180de19fbf4948f08ee2124277cc06066dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 11 11:58:13 2017 -0800
+
+    Fix build with clang
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1f810daf1640f279c2f7aad8c312664cf2293987
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 9 23:50:56 2017 -0800
+
+    Port math table to hb_lazy_table_loader_t
+
+ src/hb-open-type-private.hh | 22 +++++++++++++++++-----
+ src/hb-ot-layout-private.hh |  4 ++--
+ src/hb-ot-layout.cc         |  7 +++----
+ src/hb-ot-math.cc           | 17 +----------------
+ 4 files changed, 23 insertions(+), 27 deletions(-)
+
+commit ebbcc1112229cde9ed469efdfeac7ef79dfcd834
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 9 22:45:25 2017 -0800
+
+    Add hb_lazy_table_loader_t
+
+ src/hb-open-type-private.hh | 40 ++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 40 insertions(+)
+
+commit 1af9d924a474f210fda10b5e8ab6b388241aa0b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 9 22:22:37 2017 -0800
+
+    Move lazy-loader to more generic place
+
+ src/hb-open-type-private.hh | 47
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-font.cc           | 48
+ ++-------------------------------------------
+ 2 files changed, 49 insertions(+), 46 deletions(-)
+
+commit ac274331c285e1b42632870e150e1d66a9e21933
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 9 22:20:38 2017 -0800
+
+    In lazy-loading, remember allocation failure
+
+ src/hb-ot-font.cc | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 29fb0cb727555ea60460d794a3c6f30179546af9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 9 21:18:55 2017 -0800
+
+    Minor
+
+ src/hb-face-private.hh | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 93ef684b9bc411b7642df3adeb2248ad6010ee66
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 9 21:11:00 2017 -0800
+
+    Rename hb-ot-layout-math-table.hh to hb-ot-math-table.hh
+
+ src/Makefile.sources                                    | 2 +-
+ src/{hb-ot-layout-math-table.hh => hb-ot-math-table.hh} | 6 +++---
+ src/hb-ot-math.cc                                       | 2 +-
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 3b5263b0e9e23e56e14ce6a8498c21c5ce95cc35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 9 15:49:08 2017 -0800
+
+    Typo
+
+ src/hb-ot-layout-math-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ebf927d3d4394159e480fec2042a0456df8dd0f4
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Mon Jan 9 13:12:09 2017 +0330
+
+    Make UCDN default enabled (fixes #389) (#391)
+
+ win32/config-msvc.mak | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 00adf9c8a4573a2b3ef61991197821af03bca310
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 9 00:00:49 2017 -0800
+
+    Minor
+
+    Should be enough to get -hangul.cc out of SOURCES in Firefox build:
+    https://dxr.mozilla.org/mozilla-central/source/gfx/harfbuzz/src/moz.build
+
+    No one else should care!
+
+ src/hb-ot-shape-complex-hangul.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7cf9952e7fc015d0b08d3de6c95357662d57ad8d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 8 23:55:54 2017 -0800
+
+    [USE] Remove non-canonical decompositions
+
+    We have had added this in Indic shaper to assist shaping these
+    scripts.
+    In Universal Shaping Engine however, it is up to font designer to
+    decompose them.  Hence moving them from Indic shaper to USE was
+    wrong.
+
+    Fixup for f6ba63b2e8eb577385f70758efdd3b8408c8a9cb
+
+    Part of fixing https://github.com/behdad/harfbuzz/issues/387
+
+ src/hb-ot-shape-complex-use.cc | 22 ----------------------
+ 1 file changed, 22 deletions(-)
+
+commit b435c7c46a46350771e837e87fee448fd9dc06d3
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Nov 11 02:16:39 2016 +0200
+
+    [graphite] Stop creating unused gr_face
+
+    It is unused after previous commit, hb_graphite2_font_get_gr_font()
+    makes no sense now so deprecating it.
+
+ src/hb-graphite2.cc | 22 +++++-----------------
+ src/hb-graphite2.h  |  4 ++++
+ 2 files changed, 9 insertions(+), 17 deletions(-)
+
+commit 1b00a3b0488a5d1c6ede141ae0545e2eb9af0ed8
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sun Oct 30 20:16:41 2016 +0200
+
+    [graphite] Fix shaping with varying font sizes
+
+    Shape using design units and scale the output.
+
+    See https://bugs.documentfoundation.org/show_bug.cgi?id=103403#c7
+
+ src/hb-graphite2.cc | 27 +++++++++++++++------------
+ 1 file changed, 15 insertions(+), 12 deletions(-)
+
+commit af596a5655ee2ed09da17a7de79f619e1547dcd9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 5 20:24:41 2017 -0800
+
+    1.4.1
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 31f7b1bb94c2cef7ce58df52ddd1b09b42e8f596
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 5 20:20:06 2017 -0800
+
+    Add tests for USE using Marchen font and text
+
+    From http://www.babelstone.co.uk/Fonts/Marchen.html
+
+ test/shaping/Makefile.am                           |   1 +
+ .../85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf   | Bin 0 -> 66936 bytes
+ test/shaping/tests/use-marchen.tests               |  35
+ +++++++++++++++++++++
+ 3 files changed, 36 insertions(+)
+
+commit 53543f8b3e19456279c86f711feba42ce976668c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 5 20:12:32 2017 -0800
+
+    Ship UCDN and use it by default
+
+    So we are not relying on version of Unicode data in glib...
+
+    Fixes https://github.com/behdad/harfbuzz/issues/386
+    Fixes https://github.com/behdad/harfbuzz/issues/388
+
+ configure.ac      | 12 ++++++++----
+ src/hb-unicode.cc |  6 +++---
+ 2 files changed, 11 insertions(+), 7 deletions(-)
+
+commit f3397069479cae34e6bdc658e2875fb178b03e43
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 5 01:27:49 2017 -0800
+
+    1.4.0
+
+ NEWS         | 34 ++++++++++++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 35 insertions(+), 1 deletion(-)
+
+commit ae00af4a47587308969dfaf7baa93164d7842710
+Author: Frédéric Wang <fred.wang@free.fr>
+Date:   Tue Jan 3 05:55:09 2017 +0100
+
+    Move math-specific code from hb-ot-layout to hb-ot-math #235 (#384)
+
+ src/Makefile.sources |   1 +
+ src/hb-ot-layout.cc  | 244 ---------------------------------------------
+ src/hb-ot-math.cc    | 272
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 273 insertions(+), 244 deletions(-)
+
+commit e053ccc5bb7268fe5900dd364d906638c58b2908
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 28 15:51:57 2016 -0500
+
+    Remove Android.mk
+
+    Android uses its own file these days and third-party developers should
+    be using the autotools-based system against Android NDK.
+
+ Android.mk  | 107
+ ------------------------------------------------------------
+ Makefile.am |   1 -
+ 2 files changed, 108 deletions(-)
+
+commit 6cff75394192a1ab0dda82981752ade532838333
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 28 13:46:21 2016 -0500
+
+    Remove Tibetan decomposition rules from Indic shaper
+
+    The decomposition is very obscure and unlikely to help
+    any fonts.  Just remove it since Uniscribe probably doesn't
+    do this either.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/382
+
+ src/hb-ot-shape-complex-indic.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit f6ba63b2e8eb577385f70758efdd3b8408c8a9cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 28 13:45:32 2016 -0500
+
+    Port decompositions from Indic to USE shaper
+
+    Part of https://github.com/behdad/harfbuzz/issues/382
+
+ src/hb-ot-shape-complex-indic.cc | 16 ----------------
+ src/hb-ot-shape-complex-use.cc   | 22 ++++++++++++++++++++++
+ 2 files changed, 22 insertions(+), 16 deletions(-)
+
+commit e678b537f77954615721abd65fef28854f95dc5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 26 14:11:59 2016 -0500
+
+    [indic] Remove Chakma decomposition rule from Indic shaper
+
+    This is now added to USE:
+    https://github.com/behdad/harfbuzz/pull/383
+
+    See:
+    https://github.com/behdad/harfbuzz/issues/381
+    https://github.com/behdad/harfbuzz/issues/382
+
+ src/hb-ot-shape-complex-indic.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 49ba698124399373cea000d08e0e9fe5fc2396e8
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Wed Dec 28 18:00:51 2016 +0000
+
+    [use] Special-case Chakma split-vowel decomp in the USE shaper. (#383)
+
+ src/hb-ot-shape-complex-use.cc | 21 ++++++++++++++++++++-
+ 1 file changed, 20 insertions(+), 1 deletion(-)
+
+commit c4ca49d55b49c65e04f0b2acecacd6a5c70978f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 26 14:52:08 2016 -0500
+
+    Revert "[indic] Remove redundant Chakma decomposition rule"
+
+    This reverts commit 805f76fc002d703acfcc4c5727f0b4d1baecefaa.
+
+    Need to investigate why having this rule (with the reversed order)
+    fixes decomposition as reported by punchcutter:
+    https://github.com/behdad/harfbuzz/issues/381#issuecomment-269237796
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 805f76fc002d703acfcc4c5727f0b4d1baecefaa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 26 14:11:59 2016 -0500
+
+    [indic] Remove redundant Chakma decomposition rule
+
+    This was not used BTW since Chakma doesn't go through Indic shaper
+    anymore.
+
+    See:
+    https://github.com/behdad/harfbuzz/issues/381
+    https://github.com/behdad/harfbuzz/issues/382
+
+ src/hb-ot-shape-complex-indic.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 3cc48a46b56be06e6734aaabf37a4b521606380c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 26 13:10:31 2016 -0500
+
+    [indix] Comment
+
+ src/hb-ot-shape-complex-indic.cc | 25 ++++++++++++++++++++++---
+ 1 file changed, 22 insertions(+), 3 deletions(-)
+
+commit 7d1c5d8281b05a5c178ea3ae048b0062145968aa
+Author: nvelinov <nikola.velinov@rwth-aachen.de>
+Date:   Sat Dec 24 02:46:37 2016 +0100
+
+    Compilation Error for ASSERT_STATIC on Some Compilers (#380)
+
+    * this pointer in type definitions is not interpreted as a constant.
+    This rule is not enforced strictly by all compilers, but the Green
+    Hills Software compiler will regard this as an error.
+
+    * Merging branches for the DEFINE_SIZE_UNION macro
+    Adding check for the existence of static_size field in the tested
+    member.
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e2b878055bb1c0b84e1f7cfbf3d3f80bfc6811ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 22 14:40:19 2016 -0600
+
+    Disable OTL processing for Hebrew if GPOS doesn't have Hebrew subtable
+
+    New approach to fix this:
+    https://github.com/behdad/harfbuzz/commit/69f9fbc4200442a35484d3c790ae8f4979be5d60
+
+    Previous approach was reverted as it was too broad.  See context:
+    https://github.com/behdad/harfbuzz/issues/347#issuecomment-267838368
+
+    With U+05E9,U+05B8,U+05C1,U+05DC and Arial Unicode, we now (correctly)
+    disable
+    GDEF and GPOS, so we get results very close to Uniscribe, but
+    slightly different
+    since our fallback position logic is not exactly the same:
+
+    Before:         [gid1166=3+991|gid1142=0+737|gid5798=0+1434]
+    After:          [gid1166=3+991|gid1142=0@402,-26+0|gid5798=0+1434]
+    Uniscribe:      [gid1166=3+991|gid1142=0@348,0+0|gid5798=0+1434]
+
+ src/hb-ot-shape-complex-arabic.cc  |  1 +
+ src/hb-ot-shape-complex-default.cc |  1 +
+ src/hb-ot-shape-complex-hangul.cc  |  1 +
+ src/hb-ot-shape-complex-hebrew.cc  | 13 +++++++++++++
+ src/hb-ot-shape-complex-indic.cc   |  1 +
+ src/hb-ot-shape-complex-myanmar.cc |  2 ++
+ src/hb-ot-shape-complex-private.hh |  8 ++++++++
+ src/hb-ot-shape-complex-thai.cc    |  1 +
+ src/hb-ot-shape-complex-tibetan.cc |  1 +
+ src/hb-ot-shape-complex-use.cc     |  1 +
+ src/hb-ot-shape.cc                 | 29 ++++++++++++++++-------------
+ 11 files changed, 46 insertions(+), 13 deletions(-)
+
+commit 1a0f4aa6dfee69236b422f7c8825eff940f45c19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 22 13:33:54 2016 -0600
+
+    Revert "Synthesize GDEF glyph class for any glyph that does not have
+    one in GDEF"
+
+    This reverts commit 69f9fbc4200442a35484d3c790ae8f4979be5d60.
+
+    See
+    https://github.com/behdad/harfbuzz/issues/347#issuecomment-268873401
+    Fixes https://github.com/behdad/harfbuzz/issues/347
+
+ src/hb-ot-layout-gsub-table.hh | 22 ++--------------------
+ src/hb-ot-shape.cc             | 29 +++++++++++++++++++++++++++++
+ 2 files changed, 31 insertions(+), 20 deletions(-)
+
+commit 4b4a1b9f235598b04ce9ae1f9670fc978ab7620d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 21 23:10:43 2016 -0600
+
+    Fix assert fail with contextual matching
+
+    As discovered by libFuzzer / Chromium fuzzing.
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=659496
+    CC https://github.com/behdad/harfbuzz/issues/139
+
+ src/hb-ot-layout-gsubgpos-private.hh                     |   6 +++++-
+ .../sha1sum/217a934cfe15c548b572c203dceb2befdf026462.ttf | Bin 0 ->
+ 1384 bytes
+ test/shaping/tests/fuzzed.tests                          |   1 +
+ 3 files changed, 6 insertions(+), 1 deletion(-)
+
+commit df98ce5fc8cf1dafd58c329975f07aafbeee3263
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 21 19:27:30 2016 -0600
+
+    Improve debug output with really deep nesting
+
+ src/hb-private.hh | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+commit eab418c5e6fa34b90133862cc8ce11e617ce08bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 21 15:51:28 2016 -0600
+
+    Avoid infinite loop in CoverageFormat2 iteration with bad fonts
+
+    Fixes https://github.com/behdad/harfbuzz/issues/363
+
+ src/hb-ot-layout-common-private.hh | 29 ++++++++++++++++++-----------
+ 1 file changed, 18 insertions(+), 11 deletions(-)
+
+commit a0688e8e7b58c156f5809c272b5884bfe75f68ae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 20 20:52:50 2016 -0600
+
+    Ouch, finish previous change
+
+ test/fuzzing/Makefile.am  |  3 ++-
+ test/fuzzing/hb-fuzzer.cc | 30 ++++--------------------------
+ 2 files changed, 6 insertions(+), 27 deletions(-)
+
+commit de14c19d14be90367a1231de56dd347e3f54931c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 20 20:50:38 2016 -0600
+
+    [fuzzer] Separate main() into a new file
+
+ test/fuzzing/hb-fuzzer.hh |  4 ++++
+ test/fuzzing/main.cc      | 21 +++++++++++++++++++++
+ 2 files changed, 25 insertions(+)
+
+commit 7ed71eb347c894c5b4b012bcca0816922c3052c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 20 15:01:16 2016 -0600
+
+    Protect collect_glyphs() and closure() against malicious DDOS fonts
+
+    Fixes https://github.com/behdad/harfbuzz/issues/363
+
+ src/hb-ot-layout-gsub-table.hh | 58
+ ++++++++++++++++++++++++++++++++++--------
+ 1 file changed, 48 insertions(+), 10 deletions(-)
+
+commit 1c98ff87c76536553e53c131e75aba33033ee3a0
+Author: Mike Hommey <mh@glandium.org>
+Date:   Fri Sep 30 18:15:37 2016 +0900
+
+    Support building with older glib versions
+
+    It is desirable to be able to build against older versions of glib.
+
+    fd7a245 changed the configure check to require glib > 2.38 for
+    G_TEST_DIST. Before that, version 2.16 was required, but in fact,
+    since aafe395, G_PASTE is being used, which was introduced in 2.19.1.
+    And since 0ef179e2, hb-glib uses GBytes, which were introduced in
+    2.31.10.
+
+    2.19.1 is rather old, but 2.38 is rather new. For Firefox, building
+    against 2.22 is still supported, although we could probably get away
+    with bumping that to 2.28. Either way, GBytes is not available.
+
+    Arguably, if you build against a glib that doesn't support GBytes,
+    you're not going to use the hb_glib_blob_create function, so we hide
+    the function when building against such a glib.
+
+    As for G_TEST_DIST, when building against versions of glib that don't
+    support it, we can fallback to the previous behavior, which, AIUI, was
+    just making the test not work when building in a separate directory.
+
+ configure.ac            | 2 +-
+ src/hb-glib.cc          | 2 ++
+ src/hb-glib.h           | 3 ++-
+ test/api/test-ot-math.c | 4 ++++
+ 4 files changed, 9 insertions(+), 2 deletions(-)
+
+commit ad273881c597a95929ce3b84f63865f9d7dcdb7e
+Author: Volker H. Simonis <volker.simonis@gmail.com>
+Date:   Wed Dec 14 18:56:17 2016 +0100
+
+    Minor fixes to pacify Coverity code scan
+
+    Fixes https://github.com/behdad/harfbuzz/pull/377
+
+ src/hb-ot-font.cc              |  6 +++++-
+ src/hb-ot-layout-gpos-table.hh | 14 +++++++-------
+ 2 files changed, 12 insertions(+), 8 deletions(-)
+
+commit 1e1825bf47aa29968f75a78305d4541ce2c9d40c
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Sat Dec 17 10:30:40 2016 +0330
+
+    [dwrite] Provide an experimental API for justification (#279)
+
+ src/hb-directwrite.cc | 48
+ ++++++++++++++++++++++++++++++++++++++++--------
+ src/hb-directwrite.h  |  4 ++++
+ 2 files changed, 44 insertions(+), 8 deletions(-)
+
+commit 4cd0cd67914db1da10906e40335faea7dbec1d0a
+Author: elmarb <elmar.braun@web.de>
+Date:   Wed Dec 7 11:50:27 2016 +0100
+
+    NMake ICU option builds with builtin ICU (#375)
+
+ win32/build-rules-msvc.mak  | 13 -------------
+ win32/config-msvc.mak       | 37 ++++++++++++++++++++-----------------
+ win32/create-lists-msvc.mak | 13 -------------
+ win32/detectenv-msvc.mak    |  4 +++-
+ win32/generate-msvc.mak     |  2 +-
+ win32/info-msvc.mak         | 12 +++++-------
+ win32/install.mak           |  4 ----
+ 7 files changed, 29 insertions(+), 56 deletions(-)
+
+commit 75fa884f925c203a839b5874f30bf9ebf025b6e4
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Dec 5 23:20:47 2016 +0200
+
+    [win32] Fix wrong description of the ICU option (#372)
+
+ win32/README.txt | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 219cb29c5d230ecc6ee154b447fabd7b59fbe089
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 28 17:16:06 2016 +0200
+
+    Fix build after rebasing opentype-gx branch on top of MATH table
+
+ src/hb-ot-layout-common-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0aedfd59be54972e61a952753ffc0d12631771fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 28 17:05:43 2016 +0200
+
+    [GX] Apply 'rvrn' feature before any other feature
+
+ src/hb-ot-shape.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 42c81425316190f6424ecb9b19d5a886aa1e4136
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 13 23:49:46 2016 +0200
+
+    [GX] Fix build with older FreeType
+
+ configure.ac |  4 ++++
+ src/hb-ft.cc | 12 ++++++++----
+ 2 files changed, 12 insertions(+), 4 deletions(-)
+
+commit 72873cf522a6e3bec1b6508d8d20d3d2ce233cd6
+Author: Sascha Brawer <sascha@brawer.ch>
+Date:   Tue Sep 13 18:40:07 2016 +0200
+
+    Call hb_font_set_var_coords_normalized() from FT_Face coords
+
+ src/hb-ft.cc | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit 4ebbeb7c50e5c1e934d230ceacf792602c6eb9b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 10 04:52:34 2016 -0700
+
+    [GX] Make FeatureVariations actually work
+
+    Yay!!!!
+
+ src/hb-ot-layout-common-private.hh   | 19 +++++++------------
+ src/hb-ot-layout-gsubgpos-private.hh |  3 ++-
+ 2 files changed, 9 insertions(+), 13 deletions(-)
+
+commit 72ada4f0c6998fc2a282efc2a573733e37db8be5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 10 03:57:24 2016 -0700
+
+    [GX] Hook up feature variations
+
+    Shape-plan caching is not implemented.
+
+ src/hb-coretext.cc           |   8 +++-
+ src/hb-directwrite.cc        |   6 ++-
+ src/hb-fallback-shape.cc     |   4 +-
+ src/hb-font.cc               |   6 +--
+ src/hb-graphite2.cc          |   4 +-
+ src/hb-ot-map-private.hh     |  17 +++++---
+ src/hb-ot-map.cc             |  25 ++++++++---
+ src/hb-ot-shape-private.hh   |   6 ++-
+ src/hb-ot-shape.cc           |   9 ++--
+ src/hb-shape-plan-private.hh |   9 +++-
+ src/hb-shape-plan.cc         | 102
+ +++++++++++++++++++++++++++++++++++++++----
+ src/hb-shape-plan.h          |  19 ++++++++
+ src/hb-shape.cc              |   5 ++-
+ src/hb-uniscribe.cc          |   4 +-
+ 14 files changed, 183 insertions(+), 41 deletions(-)
+
+commit ec87ba9ba32a374d49dd3e40137f75f4f4232aee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 10 03:53:11 2016 -0700
+
+    [GX] Add hb_ot_layout_feature_with_variations_get_lookups()
+
+ src/hb-ot-layout-common-private.hh   | 30 +++++++++++++++++++++++++++++-
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++++++++++++
+ src/hb-ot-layout.cc                  | 28 ++++++++++++++++++++++++----
+ src/hb-ot-layout.h                   |  9 +++++++++
+ 4 files changed, 74 insertions(+), 5 deletions(-)
+
+commit 30c42b644eb33551aa0986287182a46f2d8c32ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 10 03:32:39 2016 -0700
+
+    [GX] Add hb_ot_layout_table_find_feature_variations()
+
+ src/hb-ot-layout-common-private.hh   | 18 +++++++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh |  6 +++---
+ src/hb-ot-layout.cc                  | 15 +++++++++++++++
+ src/hb-ot-layout.h                   | 10 ++++++++++
+ 4 files changed, 39 insertions(+), 10 deletions(-)
+
+commit 7ceadbe981aa50481163bb365f0fe3f994266165
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 10 02:44:20 2016 -0700
+
+    Shuffle code around
+
+ src/hb-ot-map.cc | 81
+ ++++++++++++++++++++++++++++----------------------------
+ 1 file changed, 41 insertions(+), 40 deletions(-)
+
+commit bde5e3959c0ffdb92db87668035b01aaee9b2352
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 10 02:43:20 2016 -0700
+
+    Move add_lookups from map to map-builder
+
+    In prep for more changes.
+
+ src/hb-ot-map-private.hh | 15 ++++++++-------
+ src/hb-ot-map.cc         | 29 +++++++++++++++--------------
+ 2 files changed, 23 insertions(+), 21 deletions(-)
+
+commit 26648cebcd14bd26142ccfe5ac8c0be08a213671
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 10 02:11:05 2016 -0700
+
+    [GX] Remove (partial) support for anisotropic variations
+
+    It doesn't always work, not part of FreeType, and we were not going
+    to expose it in the API anyway.  Can always be added later.
+
+ src/hb-font-private.hh             |  3 +--
+ src/hb-font.cc                     | 17 ++++++-----------
+ src/hb-ot-layout-common-private.hh |  9 ++++-----
+ 3 files changed, 11 insertions(+), 18 deletions(-)
+
+commit c22176d4bac720b4c9121b3d6629595831f19fb0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 10 01:58:27 2016 -0700
+
+    [GX] Handle setting var coords to NULL
+
+ src/hb-font.cc | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 59055b5494f802013ca3613a15e565ae1ca0c589
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 10 01:24:28 2016 -0700
+
+    [GX] Implement Feature Variations
+
+    Not hooked up to shaper yet.
+
+ src/hb-ot-layout-common-private.hh   | 168
+ ++++++++++++++++++++++++++++++++++-
+ src/hb-ot-layout-gdef-table.hh       |   1 -
+ src/hb-ot-layout-gpos-table.hh       |   2 -
+ src/hb-ot-layout-gsub-table.hh       |   2 -
+ src/hb-ot-layout-gsubgpos-private.hh |  15 +++-
+ 5 files changed, 180 insertions(+), 8 deletions(-)
+
+commit 85ec4944346a1ac111217698e1424669a9732280
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 10 00:25:16 2016 -0700
+
+    [GX] Fix another x/y thinko
+
+    Thanks Werner!
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cf3de4d8f79fc6e8413957cdef034e975343ce30
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 10 00:22:24 2016 -0700
+
+    [GX] Rename VarStore to VariationStore
+
+ src/hb-ot-layout-common-private.hh   | 12 ++++++------
+ src/hb-ot-layout-gdef-table.hh       | 14 +++++++-------
+ src/hb-ot-layout-gpos-table.hh       |  2 +-
+ src/hb-ot-layout-gsubgpos-private.hh |  2 +-
+ 4 files changed, 15 insertions(+), 15 deletions(-)
+
+commit 1f6ed356e0a849b61ce98b6a2f38d04d98c2191e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 10 00:01:10 2016 -0700
+
+    [GX] Fix build with some compilers
+
+    Eg.
+    https://ci.appveyor.com/project/behdad/harfbuzz/build/1.0.48/job/o9mnd33kcdeeg30r
+
+    hb-open-type-private.hh:103:29: error: static data member
+    'OT::Device::<anonymous union>::<anonymous struct>::static_size'
+    in unnamed class [-fpermissive]
+
+ src/hb-ot-layout-common-private.hh | 19 ++++++++++++-------
+ 1 file changed, 12 insertions(+), 7 deletions(-)
+
+commit 250bcd6fb691d6f15fa9ca71b475ce419d0b5e37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 9 23:12:14 2016 -0700
+
+    [GX] Skip tail zero entries when setting variation coordinates
+
+ src/hb-font.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 1124d2ece55e323ed934357b30e68df75829cfaa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 9 22:48:27 2016 -0700
+
+    [GX] Fix thinko
+
+ src/hb-ot-layout-common-private.hh | 1 -
+ src/hb-ot-layout-gpos-table.hh     | 2 +-
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit ad69e8f07c6e3e47fe7e7103c2ff7c053d272b1a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 9 22:23:34 2016 -0700
+
+    [GX] Add new API hb_font_set_var_coords_normalized()
+
+    Will probably change.
+
+ src/hb-font.cc | 23 +++++++++++++++++++++++
+ src/hb-font.h  |  5 +++++
+ 2 files changed, 28 insertions(+)
+
+commit 151d93de8a595924a8dcb00fcba648b4b3df0bf5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 9 17:03:11 2016 -0700
+
+    [GX] Hook up GPOS to Variation Store stored in GDEF
+
+    Untested.
+
+ src/hb-ot-layout-common-private.hh   | 22 ++++++++++----------
+ src/hb-ot-layout-gdef-table.hh       | 27 +++++++++++++++---------
+ src/hb-ot-layout-gpos-table.hh       | 40
+ ++++++++++++++++--------------------
+ src/hb-ot-layout-gsubgpos-private.hh |  2 ++
+ 4 files changed, 48 insertions(+), 43 deletions(-)
+
+commit dcfd309533ac83e44369dea7204d668623b08207
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 9 16:51:07 2016 -0700
+
+    [GX] Change GDEF API to return varStore
+
+ src/hb-ot-layout-gdef-table.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 49cb87850c2692be45b201168c8ce10b263168cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 9 16:27:03 2016 -0700
+
+    [GX] Pass apply-context down to get_anchor()
+
+    Needed to access GDEF for varStore.
+
+ src/hb-ot-layout-gpos-table.hh | 57
+ ++++++++++++++++++++++--------------------
+ 1 file changed, 30 insertions(+), 27 deletions(-)
+
+commit f0c3fd8c9ab402be923fe0845fb51d99841829b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 9 16:22:45 2016 -0700
+
+    [GX] Add varStore member to GDEF
+
+    Still not hooked up from GPOS.
+
+ src/hb-ot-layout-gdef-table.hh | 17 ++++++++++++++---
+ 1 file changed, 14 insertions(+), 3 deletions(-)
+
+commit 5c971f8dbc823dbad4a2869cf9e835095ab6ddb2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 9 16:05:17 2016 -0700
+
+    Minor change to GDEF, in prep for new version
+
+ src/hb-ot-layout-gdef-table.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit dc9f2297998b4cbc4f9e4c2591fc2bb5f92986d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 9 15:40:15 2016 -0700
+
+    [GX] Port variation stuff to Variation Store design
+
+    Not hooked up to GDEF yet.
+
+ src/hb-ot-layout-common-private.hh | 294
+ +++++++++++++++++++++++--------------
+ src/hb-ot-layout-gpos-table.hh     |   2 +-
+ 2 files changed, 184 insertions(+), 112 deletions(-)
+
+commit a7edeb6f02cbc4418285fdfc58ef8a8740a380e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 9 15:39:52 2016 -0700
+
+    Make OffsetArrayOf take OffsetType template argument
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8dddc231cf9d934eb93a39f2657717cbdad43a64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 9 13:17:33 2016 -0700
+
+    [GX] Revert "[GX] Add VariationAlternates, to allow conditional
+    lookups in GSUB/GPOS"
+
+    This reverts commit 2859f1c7174d6f7ae5dcf0db5411bc0182b21594.
+    We are going in a different direction.
+
+ src/hb-open-type-private.hh        |  1 -
+ src/hb-ot-layout-common-private.hh | 99
+ +-------------------------------------
+ 2 files changed, 2 insertions(+), 98 deletions(-)
+
+commit bb4d2e6ed562c248fff15313a013d49e38a18789
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 9 13:08:52 2016 -0700
+
+    [GX] Free GX coordinates
+
+ src/hb-font.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit baa329c6a12c7ffd56feed32351d9405b7d1651b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 18 15:52:24 2016 -0700
+
+    [GX] Add compact VariationDevice implementation
+
+    Add compact format that uses signed bytes instead of shorts.
+
+ src/hb-open-type-private.hh        |  1 +
+ src/hb-ot-layout-common-private.hh | 35
+ ++++++++++++++++++++++++-----------
+ 2 files changed, 25 insertions(+), 11 deletions(-)
+
+commit 71b06fd392680b6fcfece60d8a83ba6c56eada09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 12 23:49:09 2016 -0800
+
+    [GX] Add VariationAlternates, to allow conditional lookups in
+    GSUB/GPOS
+
+    Not hooked up to runtime yet.
+
+ src/hb-open-type-private.hh        |  1 +
+ src/hb-ot-layout-common-private.hh | 99
+ +++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 98 insertions(+), 2 deletions(-)
+
+commit 976eeb8e025e2b7601a91e661d6e9a88bf8afbd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 12 23:28:12 2016 -0800
+
+    [GX] Minor
+
+ src/hb-ot-layout-common-private.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit ed8a9067ca0fe51ac4b80dab55db596763df72bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 2 12:54:35 2016 -0800
+
+    [GX] Minor
+
+ src/hb-ot-layout-common-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 15c5ee67473a17859a919104c5e6fed1f813aa65
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 2 12:41:49 2016 +0900
+
+    [GX] Minor rename
+
+ src/hb-ot-layout-common-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 4c535a822f16b23a4e41e14d1b17fe179b83eabc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 2 12:21:36 2016 +0900
+
+    [GX] Hookup VariationDevice to Device table implementation
+
+ src/hb-ot-layout-common-private.hh | 65
+ +++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 64 insertions(+), 1 deletion(-)
+
+commit a0c2366075fcb894212b9bf137e4dd34bb65537c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 1 19:42:24 2016 +0900
+
+    [GX] Break out early if factor is zero
+
+    Also disable sanity-checking of variation records.
+
+ src/hb-ot-layout-common-private.hh | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit ca286703164caf1eda665f6f27ef83bf04e2f8ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 1 19:29:36 2016 +0900
+
+    [GX] Towards anisotropic interpolation
+
+    Also hookup to ValueRecord and Anchors.
+
+ src/hb-font-private.hh             |  5 +++--
+ src/hb-font.cc                     |  9 +++++++--
+ src/hb-ot-layout-common-private.hh |  4 ++--
+ src/hb-ot-layout-gpos-table.hh     | 20 ++++++++++----------
+ 4 files changed, 22 insertions(+), 16 deletions(-)
+
+commit 6d9d3c55bbd4209ba339ccd2b925bb4a6c97f622
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 1 19:12:08 2016 +0900
+
+    [GX] Add data types for encoding numerical variations
+
+ src/hb-font-private.hh             |  10 ++++
+ src/hb-font.cc                     |   3 +
+ src/hb-ot-layout-common-private.hh | 113
+ +++++++++++++++++++++++++++++++++++++
+ 3 files changed, 126 insertions(+)
+
+commit b843c6d8b66c2833cd35407ee494546465e6d775
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 5 13:42:28 2016 -0800
+
+    1.3.4
+
+ NEWS         | 8 ++++++++
+ configure.ac | 2 +-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 8c842e4a44908cce0f416481c73dc0866a0a9c95
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 4 20:28:38 2016 -0800
+
+    [hb-fuzzer] Get glyph extents for output glyphs
+
+    To exercise glyph-extents codepaths (glyf / CBLC+CBDT).
+
+ test/fuzzing/hb-fuzzer.cc | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit 9f6144cdb9dd2bc8cd147306e678d76ae82663d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 4 19:55:17 2016 -0800
+
+    [CBDT] Add test for fetching glyph extents
+
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf | Bin 0 ->
+ 3724 bytes
+ test/shaping/tests/color-fonts.tests                     |   1 +
+ 3 files changed, 2 insertions(+)
+
+commit e4bfccfb2a0f425ff69b0a50ca8a4731c4001069
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 4 19:43:33 2016 -0800
+
+    [CBDT] Minor
+
+ src/hb-ot-cbdt-table.hh | 21 ++++++++++++++-------
+ src/hb-ot-font.cc       | 38 ++++++++++++++++++++------------------
+ 2 files changed, 34 insertions(+), 25 deletions(-)
+
+commit b7068af423dba30fd831041aabf4b805d26fe349
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 4 19:36:30 2016 -0800
+
+    [CBDT] Fix thinko!
+
+ src/hb-ot-cbdt-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a141d1da9bb0f91521a9a7749f9533c75cfe6a2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 4 19:26:54 2016 -0800
+
+    [CBDT] Implement IndexSubtableFormat3
+
+ src/hb-ot-cbdt-table.hh | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 9eda74c92c9024ffb8ec6e9344c99d51dd763f0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 4 19:12:52 2016 -0800
+
+    [cbdt] Move some more code around
+
+ src/hb-ot-cbdt-table.hh | 61
+ ++++++++++++++++++++++++++++++++++---------------
+ src/hb-ot-font.cc       | 18 ++++++---------
+ 2 files changed, 49 insertions(+), 30 deletions(-)
+
+commit 654f9ab0d8d5ee032b5da763e34e7b1f454416b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 4 18:56:24 2016 -0800
+
+    [cbdt] Fix sign bug
+
+    Was introduced in d495fc5e38038f4cfb20425b1109324fa70bf2f9
+
+ src/hb-ot-cbdt-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c27d6fcf8db6f02e075dd1868ae67d878fff39d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 2 22:43:05 2016 -0800
+
+    [cbdt] Last of sanitization fixes
+
+    Should be all good now..
+
+ src/hb-ot-font.cc | 23 ++++++++++++++++-------
+ 1 file changed, 16 insertions(+), 7 deletions(-)
+
+commit d495fc5e38038f4cfb20425b1109324fa70bf2f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 2 21:36:42 2016 -0800
+
+    [cbdt] Clean up some more
+
+    Almost there..
+
+ src/hb-ot-cbdt-table.hh | 134
+ +++++++++++++++++++++++++++++++++++++++++++-----
+ src/hb-ot-font.cc       |  38 ++++----------
+ 2 files changed, 131 insertions(+), 41 deletions(-)
+
+commit ce09e90e1502d5f944bafd64e51c29e365a963ae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 2 20:12:57 2016 -0800
+
+    [cbdt] More sanitize work
+
+ src/hb-ot-cbdt-table.hh | 65
+ +++++++++++++++++++++++++++++--------------------
+ src/hb-ot-font.cc       | 46 ++++++++++++++++++----------------
+ 2 files changed, 63 insertions(+), 48 deletions(-)
+
+commit 70eb2ff682344688635cebb716fee0b73557c925
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 2 19:51:23 2016 -0800
+
+    Check for offset overflows during sanitize
+
+ src/hb-open-type-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 4b58c9e326acde09d389c699014e4e7f6259f50a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 2 19:25:54 2016 -0800
+
+    [cbdt] Start fixing sanitization (or lack thereof)
+
+ src/hb-ot-cbdt-table.hh | 77
+ ++++++++++++++++++++++++++++++++++++-------------
+ src/hb-ot-font.cc       | 22 +++++++-------
+ 2 files changed, 68 insertions(+), 31 deletions(-)
+
+commit b92ba7bafcd9545a401fb871eb342e6284032c47
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 2 15:21:43 2016 -0800
+
+    [CBDT] Use CHAR instead of int8_t
+
+ src/hb-open-type-private.hh |  1 +
+ src/hb-ot-cbdt-table.hh     | 28 ++++++++++++++--------------
+ 2 files changed, 15 insertions(+), 14 deletions(-)
+
+commit efca7bf97f9967af4fa399a6665b723af643cecd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 2 15:11:37 2016 -0800
+
+    Rename 'ebdt' to 'cbdt' since we only support the PNG format
+
+ src/Makefile.sources                             |  2 +-
+ src/{hb-ot-ebdt-table.hh => hb-ot-cbdt-table.hh} |  6 +++---
+ src/hb-ot-font.cc                                | 12 ++++++------
+ 3 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 831852594b777f250efedb76d19bee1cfc8eeaa4
+Author: Seigo Nonaka <nona@google.com>
+Date:   Fri Dec 2 15:03:50 2016 -0800
+
+    Introduce get_extent support for color bitmap font. (#351)
+
+    hb_font_get_glyph_extents now works for color bitmap fonts.
+    Currently only font having index format 1 and image format 17
+    is supported.
+
+ src/Makefile.sources    |   1 +
+ src/hb-ot-ebdt-table.hh | 193
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-font.cc       |  96 ++++++++++++++++++++++++
+ 3 files changed, 290 insertions(+)
+
+commit 261837e7202ec584f653f379851e1c6457396b07
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 28 21:49:11 2016 +0330
+
+    Fix "nmake install" when ADDITIONAL_LIB_DIR is provided and test it
+    on CI (#356)
+
+ appveyor.yml             | 1 +
+ win32/detectenv-msvc.mak | 4 ++--
+ win32/generate-msvc.mak  | 2 +-
+ 3 files changed, 4 insertions(+), 3 deletions(-)
+
+commit d163cd956246449e3e48b54ce6eb5cdb14e3a0a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 26 18:27:48 2016 +0200
+
+    [tests] Add tests for vertical origin with ft and ot font-funcs
+
+ .../sha1sum/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf | Bin 0 ->
+ 1004 bytes
+ test/shaping/tests/vertical.tests                        |   2 ++
+ 2 files changed, 2 insertions(+)
+
+commit 2b117720c03869c7714304fd7fbfb2b01199bb3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 26 18:12:50 2016 +0200
+
+    Use horizontal ascent as fallback vertical origin
+
+ src/hb-font-private.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit a7b32f2057098012b3ab43121397766ae45b3559
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 26 18:08:41 2016 +0200
+
+    Move code around
+
+ src/hb-font-private.hh | 38 +++++++++++++++++++++++---------------
+ 1 file changed, 23 insertions(+), 15 deletions(-)
+
+commit 63635c763dd9393df236f49d491510cca18a1ccc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 26 17:54:04 2016 +0200
+
+    [hb-ot-font] Use ascent+descent as fallback vertical advance
+
+ src/hb-ot-font.cc | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 9ee23c49a7a7b2479ae0d36a64720e92eb8a36e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 26 17:44:16 2016 +0200
+
+    Fix vertical glyph origin with hb-ot-font
+
+ src/hb-font-private.hh | 51
+ ++++++++++++++++++++++++++++----------------------
+ 1 file changed, 29 insertions(+), 22 deletions(-)
+
+commit b3b0816d5fc00298621f738cf400de60f8a42c5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 26 17:19:07 2016 +0200
+
+    Fix vertical font metrics
+
+    Ouch!
+
+ src/hb-font-private.hh | 4 ++--
+ src/hb-ot-font.cc      | 8 ++++++--
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+commit 966ac7ecd3d0128a3adacdd26aacef2bd8afa4d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 26 16:17:15 2016 +0200
+
+    1.3.3
+
+ NEWS         | 24 ++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 25 insertions(+), 1 deletion(-)
+
+commit 118164293cc7eb18ba03896f602aff816400134b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 26 16:04:30 2016 +0200
+
+    Fix "make distcheck"
+
+ configure.ac | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit b6c765871b752c9436ec993e47b48f9d4fecaed5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 26 10:33:33 2016 +0200
+
+    [ci] Fix appveyor.yml syntax error
+
+ appveyor.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0e79ebb3ca9b7b6d238a0007e5ca022845ee9afc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 23 14:39:43 2016 +0200
+
+    [gobject] Update for new MATH structs
+
+ src/hb-gobject-structs.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 8c854dc023b1f9e081a3bbd16416b88a4671c267
+Merge: bb9805f5 c3fa5d0e
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Oct 25 00:31:36 2016 +0300
+
+    Merge pull request #352 from fred-wang/makefile-am
+
+    Remove inexistent file ttx file from test/api/Makefile.am
+
+commit c3fa5d0e03b57be131c66ea8720806c946d0e10f
+Author: Frédéric Wang <fred.wang@free.fr>
+Date:   Mon Oct 24 21:42:04 2016 +0200
+
+    Remove inexistent file ttx file from test/api/Makefile.am
+
+ test/api/Makefile.am | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit bb9805f5419f18c7f5cab32d660fd4109c30f7cc
+Merge: 702d9f52 755a0c20
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 22 12:23:05 2016 +0330
+
+    Merge pull request #349 from ebraminio/mergebackvcpkgpatches
+
+    [ci] Enable hb-freetype on Windows build tests
+
+commit 755a0c20798e3c3e6bb933a28e38f9667fccdadc
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 21 11:48:58 2016 +0330
+
+    [ci] Enable freetype on msvc using vcpkg
+
+ appveyor.yml | 15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+commit 4631d84c2bb51395efe3156f9c9f1a6b0e277947
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 18 14:30:00 2016 +0330
+
+    Merge back @vlj's local patches of vcpkg
+
+ win32/config-msvc.mak    | 7 +++++++
+ win32/detectenv-msvc.mak | 3 +++
+ 2 files changed, 10 insertions(+)
+
+commit 702d9f522d1ac4797700f0ea056f69169b8d1a78
+Merge: 331c46c7 d8e2eb9e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 14 13:54:55 2016 +0330
+
+    Merge pull request #340 from ebraminio/nouniscribe
+
+    Make Uniscribe optional on nmake win32 builds
+
+commit d8e2eb9ee0f47af7e90056d8db5949d10a88786a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 9 09:06:05 2016 +0330
+
+    Make Uniscribe optional on nmake win32 builds
+
+    Most of harfbuzz clients don't need Uniscribe and DirectWrite support
+    at all
+    as harfbuzz is a replacement for Uniscribe so Chromium and Firefox
+    are using
+    harfbuzz without them on Windows.
+
+    This removal also helps win32 nmake clients to have reduced binary
+    size and
+    libs count.
+
+ appveyor.yml            |  2 +-
+ win32/README.txt        | 13 +++++++------
+ win32/config-msvc.mak   | 18 +++++++++++++-----
+ win32/config.h.win32.in |  2 +-
+ win32/info-msvc.mak     | 11 +++++++++--
+ 5 files changed, 31 insertions(+), 15 deletions(-)
+
+commit 331c46c79b4d18cb4948be12c78ebb71a143e7ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 11 13:45:22 2016 -0700
+
+    Fix configure on iOS
+
+    Fixes https://github.com/behdad/harfbuzz/issues/342
+
+ configure.ac | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit f6e194e77a2c34cd118b47c0d73a22afde85dfda
+Merge: 7201fdd0 bef240b3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 11 17:23:41 2016 +0330
+
+    Merge pull request #344 from ebraminio/fixmacci
+
+    [ci] Whitelist more symbols and unbreak mac CI
+
+commit bef240b36ee9086b0d92e351e4c5118c0bbb5df6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 10 17:27:52 2016 +0330
+
+    [ci] Whitelist more symbols and unbreak mac CI
+
+    Thanks to @khaledhosny, actually this is his work :)
+
+ src/check-symbols.sh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7201fdd0a8e26d49b13e289b53de375d5b1c9fcb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 4 14:53:17 2016 -0700
+
+    LFS (large file system?) support in hb-*shap*, hb-view
+
+    Fixes https://github.com/behdad/harfbuzz/issues/336
+
+ configure.ac | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 34fc4a2cfa61089b7ec2d9510d99cdc4c13bceb4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 28 19:17:27 2016 +0200
+
+    Fix dist
+
+ test/api/Makefile.am | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit d1c62370a0c2bdb365a1468dc8d782b9a7245946
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 28 19:11:22 2016 +0200
+
+    Aim math API for 1.3.3 instead of 1.4.0
+
+ docs/harfbuzz-docs.xml     |  6 +++---
+ docs/harfbuzz-sections.txt | 12 ++++++------
+ src/hb-ot-layout.cc        | 18 +++++++++---------
+ src/hb-ot-math.h           | 10 +++++-----
+ 4 files changed, 23 insertions(+), 23 deletions(-)
+
+commit 7adbc5dd62ca03a65d1886e0f32e7026964dc5e5
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Sep 30 04:01:24 2016 -0700
+
+    Fix building math docs (#335)
+
+ src/hb-ot-layout.cc | 9 ---------
+ 1 file changed, 9 deletions(-)
+
+commit fd7a245d3525905ffbce57472b52900fcb0e330b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 27 17:56:35 2016 +0200
+
+    Require glib >= 2.38.0 for G_TEST_DIST
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6d3e6abf0c6ad55dabae96c76b4da9ab14bf16ef
+Merge: f73a87d9 c3e21a66
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 27 17:15:59 2016 +0200
+
+    Merge branch 'math'
+
+    Supercedes https://github.com/behdad/harfbuzz/pull/326
+    Fixes https://github.com/behdad/harfbuzz/pull/331
+
+commit c3e21a6620c35500afa350d11620f69802920df3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 27 16:51:38 2016 +0200
+
+    [MATH] Fix more docs
+
+ src/hb-ot-layout.cc | 18 +++++++++---------
+ src/hb-ot-math.h    | 25 +++++++++++++++++++++++++
+ 2 files changed, 34 insertions(+), 9 deletions(-)
+
+commit 46cc4a3a2a529c80677babe38ca1542f9c773ac0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 27 16:44:22 2016 +0200
+
+    [MATH] Rename hb_math_*_t types to hb_ot_math_*_t
+
+    With this, I believe MATH table API is not ready to be merged.
+
+ docs/harfbuzz-sections.txt     |  6 +++---
+ src/hb-ot-layout-math-table.hh | 12 ++++++------
+ src/hb-ot-layout.cc            |  8 ++++----
+ src/hb-ot-math.h               | 16 ++++++++--------
+ test/api/test-ot-math.c        |  4 ++--
+ 5 files changed, 23 insertions(+), 23 deletions(-)
+
+commit db5ebcf10f8595d1f4a9df27befd6cb5e76ca94d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 27 16:42:25 2016 +0200
+
+    Update docs
+
+ docs/harfbuzz-docs.xml     |  9 +++++++++
+ docs/harfbuzz-sections.txt | 30 ++++++++++++++++++++++++++++--
+ 2 files changed, 37 insertions(+), 2 deletions(-)
+
+commit 0762b35474c47171e5661904e93851eb73a44e5c
+Author: Frédéric Wang <fred.wang@free.fr>
+Date:   Tue Sep 27 15:28:35 2016 +0200
+
+    Document API for MathVariants (#330)
+
+ src/hb-ot-layout.cc | 56
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 56 insertions(+)
+
+commit 8d622f1114d6a0eca1786b94c7fc1a0bcd87f74b
+Author: Frédéric Wang <fred.wang@free.fr>
+Date:   Tue Sep 27 13:53:34 2016 +0200
+
+    Add tests for get_mathvariant (#329)
+
+ test/api/test-ot-math.c | 160
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 160 insertions(+)
+
+commit f73a87d9a8c76a181794b74b527ea268048f78e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 27 13:50:54 2016 +0200
+
+    1.3.2
+
+ NEWS         | 7 +++++++
+ configure.ac | 2 +-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit 485e4873fb7cacfa9d853272c2275bbc5826023e
+Author: Frédéric Wang <fred.wang@free.fr>
+Date:   Tue Sep 27 13:18:00 2016 +0200
+
+    Add tests for hb_ot_math_get_glyph_variants (#328)
+
+ test/api/test-ot-math.c | 126
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 126 insertions(+)
+
+commit f16bf6c2dacf5b9c82b2d1ffacc092cc396189a7
+Author: Phil Krylov <phil.krylov@gmail.com>
+Date:   Tue Sep 27 12:38:49 2016 +0200
+
+    Allow building with graphite2 without pkg-config (#318)
+
+ configure.ac | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit a5629a2ed9c2e69f2b4ebb74d85fbe0b5ba2be67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 27 11:30:44 2016 +0200
+
+    [MATH] Simplify test
+
+ test/api/test-ot-math.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit edcfa789bf92c18f5badad31c0ad04a6a77d7226
+Author: Frédéric Wang <fred.wang@free.fr>
+Date:   Tue Sep 27 11:02:08 2016 +0200
+
+    test-ot-math: Use different scales for vertical
+    and horizontal directions and add test for
+    hb_ot_math_get_min_connector_overlap. (#327)
+
+ test/api/test-ot-math.c | 81
+ ++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 49 insertions(+), 32 deletions(-)
+
+commit bc19f7fe20e89823dba07a46c3d48c7406b781b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 27 10:58:08 2016 +0200
+
+    [MATH] Add HB_OT_MATH_SCRIPT
+
+ src/hb-ot-math.h | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit cdc9eef7da934ae71578694f29665e439686c3bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 22:18:41 2016 +0200
+
+    [MATH] Enable tests for glyph-assembly italics-correction
+
+ test/api/test-ot-math.c | 49
+ ++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 30 insertions(+), 19 deletions(-)
+
+commit 86106c7528d9bff8de6bc3e1487be780c31ea4fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 22:12:48 2016 +0200
+
+    [MATH] Rename all API to hb_ot_math_*
+
+ src/hb-ot-layout-private.hh    |  10 --
+ src/hb-ot-layout.cc            |  69 ++++----
+ src/hb-ot-math.h               |  56 +++---
+ test/api/Makefile.am           |   6 +-
+ test/api/test-ot-layout-math.c | 382
+ -----------------------------------------
+ test/api/test-ot-math.c        | 381
+ ++++++++++++++++++++++++++++++++++++++++
+ 6 files changed, 447 insertions(+), 457 deletions(-)
+
+commit 1ba767cd4e3606beb9dc59806b83b1e61f5958d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 21:57:14 2016 +0200
+
+    [MATH] Move API from hb-ot-layout.h to hb-ot-math.h
+
+ src/hb-ot-layout.h | 52
+ --------------------------------------------------
+ src/hb-ot-math.h   | 56
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot.h        |  1 +
+ 3 files changed, 57 insertions(+), 52 deletions(-)
+
+commit 97b72da6006d8d6355ee90d514f627e6604a4936
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 21:53:25 2016 +0200
+
+    Whitespace
+
+ src/hb-ot-layout-math-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 559eb564472575ae4d87a241314b8a3ca24418c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 21:46:05 2016 +0200
+
+    [MATH] Wire up get_glyph_assembly()
+
+ src/hb-ot-layout-math-table.hh | 64
+ ++++++++++++++++++++++++++++++++++++++----
+ src/hb-ot-layout.cc            | 26 +++++++++--------
+ src/hb-ot-layout.h             | 14 ++++-----
+ 3 files changed, 81 insertions(+), 23 deletions(-)
+
+commit 353f455af7ccbc1af8338dcb0c8ab87aef866c79
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 21:22:48 2016 +0200
+
+    [MATH] Wire up get_glyph_variants()
+
+ src/hb-font-private.hh         |  11 ++-
+ src/hb-ot-layout-math-table.hh | 178
+ +++++++++++++++++++----------------------
+ src/hb-ot-layout.cc            |   7 +-
+ src/hb-ot-layout.h             |   2 +-
+ 4 files changed, 95 insertions(+), 103 deletions(-)
+
+commit 7fe0e28c22331a353d396f8bc1e3a60f1580a96d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 17:51:47 2016 +0100
+
+    [MATH] Start fleshing out glyph variant API
+
+ src/hb-font-private.hh         |  4 +++
+ src/hb-ot-layout-math-table.hh | 10 ++----
+ src/hb-ot-layout.cc            | 73
+ +++++++++++++++---------------------------
+ src/hb-ot-layout.h             | 20 ++++++++++++
+ src/hb-ot-math.h               | 18 +++++++++++
+ 5 files changed, 71 insertions(+), 54 deletions(-)
+
+commit 1f3327f21045df8a050a21a949b44b9ce186ceaa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 16:10:08 2016 +0100
+
+    [MATH] Clean up math variants
+
+ src/hb-ot-layout-math-table.hh | 35 +++++++++--------------------------
+ 1 file changed, 9 insertions(+), 26 deletions(-)
+
+commit 51da7a1cd672aada84bdbb3a2a8dd77ab1134249
+Author: Frédéric Wang <fred.wang@free.fr>
+Date:   Thu Aug 25 11:17:50 2016 +0200
+
+    MATH table: Add API to access math variants.
+
+ src/hb-ot-layout-math-table.hh          | 253
+ +++++++++++++++++++++++++++++++-
+ src/hb-ot-layout-private.hh             |  10 ++
+ src/hb-ot-layout.cc                     |  54 +++++++
+ test/api/fonts/MathTestFontPartial4.otf | Bin 0 -> 14360 bytes
+ test/api/test-ot-layout-math.c          |  51 +++++++
+ 5 files changed, 364 insertions(+), 4 deletions(-)
+
+commit 722e620f20fa2225cf874f4aeb115a064142fcf1
+Author: Frédéric Wang <fred.wang@free.fr>
+Date:   Mon Sep 26 11:51:36 2016 +0200
+
+    Use G_TEST_DIST to build the path of math test fonts
+
+ test/api/Makefile.am           | 2 ++
+ test/api/test-ot-layout-math.c | 8 ++++++--
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+commit 8d58e3433e242bd9dd18aa08f55ab0a406583fb0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 13:39:58 2016 +0100
+
+    [MATH] Fix get_kerning() with negative y-scale
+
+ src/hb-ot-layout-math-table.hh | 36 +++++++++++++++++++++---------------
+ 1 file changed, 21 insertions(+), 15 deletions(-)
+
+commit 94f5df5626b223ad92d0c167f560c1f2e2f19042
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 13:31:47 2016 +0100
+
+    [MATH] Clean up get_kerning()
+
+ src/hb-ot-layout-math-table.hh | 29 +++++++++++++++++------------
+ src/hb-ot-layout.cc            |  5 +----
+ 2 files changed, 18 insertions(+), 16 deletions(-)
+
+commit 17ff30e9afde79e41c17786223293e867b49ebba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 12:18:32 2016 +0100
+
+    [MATH] Clean up get_top_accent_attachment()
+
+    Note, the function now returns "half of horizontal advance width"
+    if top accent attachment for glyph is not explicitly defined.
+    This is what the spec requires.  Updated tests.
+
+ src/hb-ot-layout-math-table.hh | 31 +++++++++++--------------------
+ src/hb-ot-layout.cc            |  7 +------
+ test/api/test-ot-layout-math.c |  8 ++++----
+ 3 files changed, 16 insertions(+), 30 deletions(-)
+
+commit 8bcf517fe59608d2247a8974445b3ff0f4b4b4ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 12:12:41 2016 +0100
+
+    [MATH] Clean up get_italics_correction()
+
+ src/hb-ot-layout-math-table.hh | 16 ++++++++--------
+ src/hb-ot-layout.cc            | 17 ++++++-----------
+ src/hb-ot-layout.h             |  4 ++--
+ test/api/test-ot-layout-math.c | 18 +++++++++---------
+ 4 files changed, 25 insertions(+), 30 deletions(-)
+
+commit 06003f71ba0d0327fb1a17098a9d7faa8fb336f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 12:07:29 2016 +0100
+
+    [MATH] Clean up a bit more
+
+ src/hb-ot-layout-math-table.hh | 12 +--------
+ src/hb-ot-layout.cc            | 57
+ ++++++++++++++++--------------------------
+ 2 files changed, 22 insertions(+), 47 deletions(-)
+
+commit 54c0cc38fba24fa4370231408ba121589b190a28
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 11:56:40 2016 +0100
+
+    [MATH] Clean up get_math_constant implementation
+
+ src/hb-ot-layout-math-table.hh | 10 +++++-----
+ src/hb-ot-layout.cc            |  5 ++---
+ 2 files changed, 7 insertions(+), 8 deletions(-)
+
+commit 8a8cfad9a0834fe278a747c1d755144bd78f564b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 11:47:05 2016 +0100
+
+    [MATH] Cleanup previous commit a bit
+
+ src/hb-ot-layout-math-table.hh | 186
+ ++++++++++++++++++++---------------------
+ src/hb-ot-layout.cc            |  30 +++----
+ src/hb-ot-layout.h             |  14 ++--
+ 3 files changed, 113 insertions(+), 117 deletions(-)
+
+commit d7182d129612c619b9026ee9b15f2dcfada132db
+Author: Frédéric Wang <fred.wang@free.fr>
+Date:   Thu Aug 25 11:15:31 2016 +0200
+
+    MATH Table: Add API to access glyph info.
+
+ src/hb-ot-layout-math-table.hh          | 271
+ +++++++++++++++++++++++++++++++-
+ src/hb-ot-layout.cc                     | 114 ++++++++++++++
+ src/hb-ot-layout.h                      |  18 +++
+ src/hb-ot-math.h                        |   7 +
+ test/api/fonts/MathTestFontPartial1.otf | Bin 0 -> 14348 bytes
+ test/api/fonts/MathTestFontPartial2.otf | Bin 0 -> 14356 bytes
+ test/api/fonts/MathTestFontPartial3.otf | Bin 0 -> 14380 bytes
+ test/api/test-ot-layout-math.c          | 155 ++++++++++++++++++
+ 8 files changed, 563 insertions(+), 2 deletions(-)
+
+commit 6fd2fe418dc838743f0d4a8a2222cdcaf587500c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 11:24:39 2016 +0100
+
+    [MATH] Fixup math constants commit a bit more
+
+ src/hb-ot-layout-math-table.hh | 24 +++++++++++-------------
+ 1 file changed, 11 insertions(+), 13 deletions(-)
+
+commit 1a381153a2e6a15bded1f8e31f6b0e0cadb078af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 11:15:59 2016 +0100
+
+    [MATH] Fixups for math constants commit
+
+ src/hb-ot-layout-math-table.hh | 19 +++++++++----------
+ 1 file changed, 9 insertions(+), 10 deletions(-)
+
+commit 319ff59161e6b027391f8b9fdce0db6dd44cc20d
+Author: Frédéric Wang <fred.wang@free.fr>
+Date:   Thu Aug 25 11:06:41 2016 +0200
+
+    MATH Table: Add API to access math contants.
+
+ src/Makefile.sources                |   1 +
+ src/hb-ot-layout-math-table.hh      | 146
+ +++++++++++++++++++++++++++++++++++-
+ src/hb-ot-layout.cc                 |  25 ++++++
+ src/hb-ot-layout.h                  |   5 ++
+ src/hb-ot-math.h                    | 100 ++++++++++++++++++++++++
+ test/api/fonts/MathTestFontFull.otf | Bin 0 -> 25412 bytes
+ test/api/test-ot-layout-math.c      |  72 ++++++++++++++++++
+ 7 files changed, 345 insertions(+), 4 deletions(-)
+
+commit 4d3892e9b05a4df67b2f5cfd6dd3a1e0f5b38fc7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 26 10:45:58 2016 +0100
+
+    [MATH] Fixups for previous commit
+
+ src/hb-ot-layout-math-table.hh |  8 ++++----
+ src/hb-ot-layout.cc            | 29 +++++++++++++++++++----------
+ src/hb-ot-layout.h             |  2 ++
+ test/api/Makefile.am           |  6 ++----
+ test/api/test-ot-layout-math.c | 16 +++++++++-------
+ 5 files changed, 36 insertions(+), 25 deletions(-)
+
+commit 5fbcb992bd7887f95b1cf2ca045c9226de8148fc
+Author: Frédéric Wang <fred.wang@free.fr>
+Date:   Thu Aug 25 10:47:15 2016 +0200
+
+    MATH Table: Add API to check availability of math data.
+
+ src/Makefile.sources                 |   1 +
+ src/hb-ot-layout-math-table.hh       |  60 +++++++++++++++++++++
+ src/hb-ot-layout-private.hh          |   3 ++
+ src/hb-ot-layout.cc                  |  45 ++++++++++++++++
+ src/hb-ot-layout.h                   |   7 +++
+ test/api/Makefile.am                 |  14 ++++-
+ test/api/fonts/MathTestFontEmpty.otf | Bin 0 -> 14320 bytes
+ test/api/fonts/MathTestFontNone.otf  | Bin 0 -> 14284 bytes
+ test/api/test-ot-layout-math.c       |  98
+ +++++++++++++++++++++++++++++++++++
+ 9 files changed, 227 insertions(+), 1 deletion(-)
+
+commit 02bfd965af588640250c47f344ad3096c8a373e0
+Author: Gregory Morse <gregory.morse@live.com>
+Date:   Mon Sep 12 10:22:15 2016 +0200
+
+    Update detectenv-msvc.mak (#316)
+
+    Windows x86 ARM capability
+
+ win32/detectenv-msvc.mak | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit fc4e671f311241e21c1cc3ed941b1fc651875a2e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Sep 9 23:28:28 2016 +0430
+
+    [coretext] Use intended coretext version check logic (#315)
+
+ src/hb-coretext.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 48677345281a93d8829dd37d0480a6062945416a
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Sep 8 04:44:37 2016 +0300
+
+    Try to unbreak building on older macOS again (#314)
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d22ab6cf040467e7f17476ccdfe9cab4dce16639
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 7 14:28:47 2016 -0700
+
+    1.3.1
+
+ NEWS         | 9 +++++++++
+ configure.ac | 2 +-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit b717cd7be506217e466e32a456df9af4d2720c0c
+Author: Dominik Röttsches <d-r@roettsches.de>
+Date:   Wed Sep 7 23:56:57 2016 +0300
+
+    Do reconfigure the cascade list for Emoji font on OS X 10.9.5 (#313)
+
+    This seems to fix crash issues on 10.9.5 reported on Chrome, compare
+    crbug.com/549610
+
+ src/hb-coretext.cc | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+commit 67e9fdf427e8536f0a134f84ad3bf1740245fe12
+Author: Dominik Röttsches <d-r@roettsches.de>
+Date:   Mon Sep 5 11:27:25 2016 +0300
+
+    Blacklist Padauk 2.80 and 3.00 (#311)
+
+    According to comments in issue #305 broken GDEF tables lead
+    to incorrect rendering of Latin characters. Blacklisting
+    this font.
+
+ src/hb-ot-layout.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 17f0dd2dfb9a15aed9d1a229115940cc23bdbc97
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Sep 2 01:21:48 2016 +0430
+
+    [ci] Add msys2 build to CI and run its testsuite on Windows (#310)
+
+ appveyor.yml | 20 ++++++++++++++++----
+ 1 file changed, 16 insertions(+), 4 deletions(-)
+
+commit 5362ce6a6455c539d615e7fb221a904ac744b74c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Sep 1 20:05:45 2016 +0430
+
+    [dwrite] Minor, don't include unnecessary headers (#309)
+
+ src/hb-directwrite.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit c4f36b04e32ae5111ef11d225e5d6e82c8216185
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Sep 1 17:31:16 2016 +0430
+
+    [ci] Add Windows CI support, provided by AppVeyor (#308)
+
+ README                  |  1 +
+ appveyor.yml            | 28 ++++++++++++++++++++++++++++
+ win32/generate-msvc.mak |  2 +-
+ 3 files changed, 30 insertions(+), 1 deletion(-)
+
+commit 3d976d20f1b97c771e64a9cfed2760ebec64037a
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Aug 27 16:38:42 2016 +0300
+
+    Show the shaper name in the debug message (#306)
+
+ src/hb-shape-plan.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 547ddb0721365dca985aef5b759d08718f7c5f82
+Merge: bd1aac9c e7ecbba2
+Author: Sascha Brawer <sascha@brawer.ch>
+Date:   Thu Aug 18 22:33:14 2016 +0200
+
+    Merge pull request #303 from behdad/fonnapa
+
+    Support Americanist Phonetic Notation
+
+commit e7ecbba2cc3c9369c5e7dc7296cb210018aca3bb
+Author: Sascha Brawer <sascha@brawer.ch>
+Date:   Thu Aug 18 12:48:38 2016 +0200
+
+    Support Americanist Phonetic Notation
+
+    OpenType language system tag: `APPH`
+    https://www.microsoft.com/typography/otspec/languagetags.htm
+
+    IETF BCP47 variant tag: `fonnapa`
+    http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
+
+ src/hb-ot-tag.cc       | 14 ++++++++++++--
+ test/api/test-ot-tag.c |  6 ++++++
+ 2 files changed, 18 insertions(+), 2 deletions(-)
+
+commit bd1aac9c0021a936058637424a478abf792533dd
+Merge: 18c19dd3 a0f1b44b
+Author: Sascha Brawer <sascha@brawer.ch>
+Date:   Thu Aug 18 13:59:38 2016 +0200
+
+    Merge pull request #302 from khaledhosny/master
+
+    [travis] Fix MacOS libtool issue
+
+commit a0f1b44b6c0e3b1e6a1ba63dde2be22e0425353f
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Aug 16 03:09:04 2016 +0200
+
+    [coretext] Blind fix for build on MacOS 10.9
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0634d5600e559a69a92d49173ffb8e715fe7576c
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Aug 16 02:49:48 2016 +0200
+
+    [travis] Fix MacOS libtool issue
+
+    Reveals another MacOS build breakage in the Core Text shaper.
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 18c19dd34dcdcaab0a6d47768339f8fb70c0d3f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 13:03:14 2016 -0700
+
+    Fix build
+
+ test/api/test-ot-tag.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 91f2585411aaf5565fcf0c991b9055b0b397f1cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 8 18:08:08 2016 -0700
+
+    Actually add test
+
+ test/shaping/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f1b76275da716a4174092e6389979e03c0e3be59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 8 18:06:09 2016 -0700
+
+    Add tests for Chinese language tags
+
+    Using font from https://github.com/behdad/harfbuzz/issues/300
+
+ .../sha1sum/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf | Bin 0 ->
+ 5596 bytes
+ test/shaping/tests/language-tags.tests                   |  12
+ ++++++++++++
+ 2 files changed, 12 insertions(+)
+
+commit 37f21bdbb75c98d741e749b7f1e0f367941aef4e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 8 17:57:06 2016 -0700
+
+    Map Macao to ZHH lang tag
+
+    Fixes https://github.com/behdad/harfbuzz/issues/300
+
+ src/hb-ot-tag.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 09c7a2d6bf00dc902343e999f92cac0e8146f949
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 8 17:28:54 2016 -0700
+
+    Limit bits-per-feature to eight
+
+    Limits number of alternatives per glyph per feature to 255, so be it.
+    That's better than possibly breaking shaping because of one bad
+    feature
+    value.
+
+ src/hb-ot-map.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 333173103bb618f721bd25d0c565a3c3c9ea224e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 8 17:24:04 2016 -0700
+
+    Fix sign of shift operators
+
+    This one:
+
+      map->mask = (1 << (next_bit + bits_needed)) - (1 << next_bit);
+
+    before the fix, the shift was done as an int, causing overflow
+    if it ever got to 1 << 31.  Sprinkle 'u's around.
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=634805
+
+ src/hb-buffer-private.hh | 6 +++---
+ src/hb-cache-private.hh  | 8 ++++----
+ src/hb-coretext.cc       | 2 +-
+ src/hb-directwrite.cc    | 2 +-
+ src/hb-face.cc           | 2 --
+ src/hb-font.cc           | 2 --
+ src/hb-ft.cc             | 6 ++++--
+ src/hb-ot-map.cc         | 4 ++--
+ src/hb-set-private.hh    | 4 ++--
+ src/hb-uniscribe.cc      | 4 ++--
+ 10 files changed, 19 insertions(+), 21 deletions(-)
+
+commit 10a0d4aa2254f783758bb908175047df3a0b41fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 8 16:51:08 2016 -0700
+
+    Map zh-Hant-HK to ZHH
+
+    Fixes https://github.com/behdad/harfbuzz/issues/300
+
+ src/hb-ot-tag.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit dd31fc9f7e6d23b414b22874de96eb3c002c80ba
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Jul 22 02:26:54 2016 +0300
+
+    Don’t build UCDN support when building with GLib (#296)
+
+    Regression from: b424b6c372dfe4c0ed75a49761eb34a416819446.
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 489acf6c3180d3726158864fa0e1adeea3c23fae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 22 17:41:43 2016 -0700
+
+    [coretext] "Fix" crashes on CoreText < 10.10
+
+    Fixes https://github.com/behdad/harfbuzz/issues/297
+
+ src/hb-coretext.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit a732e00ea4fffebaa85a89420f09df4c11d650e0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 01:58:00 2016 -0700
+
+    1.3.0
+
+ NEWS         | 15 +++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 16 insertions(+), 1 deletion(-)
+
+commit 08c08af2f9ed683ad20322c3ef1ba0f87ce15426
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 01:23:33 2016 -0700
+
+    [ucdn] Update to Unicode 9.0.0
+
+    Fixes https://github.com/grigorig/ucdn/issues/12
+
+ src/hb-ucdn.cc               |    6 +
+ src/hb-ucdn/README           |    1 -
+ src/hb-ucdn/ucdn.c           |   80 +-
+ src/hb-ucdn/ucdn.h           |   98 +-
+ src/hb-ucdn/unicodedata_db.h | 4750
+ +++++++++++++++++++++++-------------------
+ 5 files changed, 2783 insertions(+), 2152 deletions(-)
+
+commit f3f6c1ccbf89e15cda03e0c3a2df4297e98adf60
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Thu Jun 16 00:10:42 2016 +0100
+
+    Blacklist GDEF tables of more fonts
+
+    This is based on bug reports that have been filed against Firefox
+    since it
+    updated to a version of harfbuzz that uses zeroing by GDEF rather
+    than by
+    Unicode. I'm sure there are a bunch more font versions that should
+    also be
+    included; these are just the ones I have on hand and have confirmed
+    as having
+    bad GDEF data.
+
+    Given how the list here is growing, I think we should reconsider
+    the approach,
+    and perhaps revert to zeroing by Unicode instead.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/264
+    Fixes https://github.com/behdad/harfbuzz/pull/266
+
+ src/hb-ot-layout.cc | 39 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 39 insertions(+)
+
+commit 34f9aa582c3a03b578c7eae3d2e8860a0bd5cb00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 20 02:35:54 2016 -0700
+
+    Implement symbol cmap in ft and ot fonts
+
+    Fixes https://github.com/behdad/harfbuzz/issues/236
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=627953
+
+ src/hb-ft.cc      | 27 +++++++++++++++++++++++----
+ src/hb-ot-font.cc | 50 ++++++++++++++++++++++++++++++++++++++------------
+ 2 files changed, 61 insertions(+), 16 deletions(-)
+
+commit 6363d7df28dc4307ef1abb9857d14c35e656b85a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 20 01:43:56 2016 -0700
+
+    Clean up buffer area when rewinding
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=614647
+    If allocation fails, we might be leaving junk behind.  At least
+    clear it up.
+
+ src/hb-buffer.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit f80c34eb556d12c45c961d6742c289baef58899d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 12 11:18:26 2016 -0700
+
+    Whitespace
+
+ src/hb-unicode-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 874421203e0161db2cbfb27be6c039cba57f7c63
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 12 03:49:21 2016 +0430
+
+    [coretext] Speculative fix for CoreText nullptr access (#288)
+
+ src/hb-coretext.cc | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit 6bf9db4f1e1d51f9acb5e37b89caa8f4d275e7ce
+Author: Birunthan Mohanathas <birunthan@mohanathas.com>
+Date:   Mon Jul 11 13:38:23 2016 -0700
+
+    [ft] Fix unsafe cast of FT_Done_Face in
+    hb_ft_{face,font}_create_referenced (#289)
+
+    Prior to this change the function `FT_Error FT_Done_Face(FT_Face
+    *)` was
+    called through a pointer with the signature `void (void *)`
+    resulting in
+    undefined behaviour.
+
+ src/hb-ft.cc | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+commit 0b8f3ab0220ca4731516313828515f26bb480645
+Author: Steve Lhomme <slhomme@matroska.org>
+Date:   Mon Jul 11 21:57:26 2016 +0200
+
+    clang in MSVC mode doesn't like when we redefine __attribute__ (#283)
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2f522fd485c2e946c9bce9e3828b6ff6247c59e4
+Merge: d3e2a06b e4d451ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 1 17:09:28 2016 -0700
+
+    Merge pull request #286 from khaledhosny/gi-tag_from_string
+
+    [introspection] Fix hb_tag_from_string annotation
+
+commit e4d451ee55a57e1231b4076fcd1e87994f6b9528
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Jul 2 00:04:57 2016 +0200
+
+    [introspection] Fix hb_tag_from_string annotation
+
+ src/hb-common.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d3e2a06b0f2587e913a9c3ff1a20c187f260db80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 30 11:01:22 2016 -0700
+
+    [python] Use utf-32 / utf-16 based on build of Python
+
+    Fixes https://github.com/behdad/harfbuzz/pull/271
+
+ src/sample.py | 22 +++++++++++++++++++++-
+ 1 file changed, 21 insertions(+), 1 deletion(-)
+
+commit fc9de44a03a97f6e93bd98d804596cb1f9f4b5fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 30 09:46:52 2016 -0700
+
+    Comments
+
+ src/hb-coretext.cc | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 46809dee30232d493539519b1bb527fa816c37db
+Merge: 70e72e5f 1bea49eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 30 09:41:03 2016 -0700
+
+    Merge pull request #268 from drott/conflictingFontFix
+
+    Discard reconfigured CTFont if URL changes
+
+commit 1bea49eb4b7a94ab6222f9c3c40320cbdb247b2d
+Merge: 7aa3631d 70e72e5f
+Author: Dominik Röttsches <d-r@roettsches.de>
+Date:   Wed Jun 29 12:10:41 2016 +0200
+
+    Merge branch 'master' into conflictingFontFix
+
+commit 70e72e5f61d73c33d3c8f3bf07f5a9afd0db046a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 28 21:00:37 2016 -0700
+
+    [gobject] Fix a few warnings
+
+    Part of https://github.com/behdad/harfbuzz/issues/277
+
+ src/hb-buffer.cc         |  2 +-
+ src/hb-gobject-structs.h | 12 ++++++++++++
+ src/hb-shape.cc          |  2 --
+ src/hb-unicode.h         | 15 ---------------
+ 4 files changed, 13 insertions(+), 18 deletions(-)
+
+commit d8273aac19771033c5064a2f079c29d09a86e7c0
+Merge: abae93fa ae9054c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 28 21:15:28 2016 -0700
+
+    Merge pull request #280 from behdad/revert-271-patch-2
+
+    Revert "use utf32"
+
+commit ae9054c740631e36b7582b44c5afb42ff4509461
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 28 21:14:38 2016 -0700
+
+    Revert "use utf32"
+
+ src/sample.py | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 7aa3631dd06af74a1fa9f0bfaa5f721876be817f
+Merge: f7da0486 abae93fa
+Author: Dominik Röttsches <d-r@roettsches.de>
+Date:   Tue Jun 28 09:52:18 2016 +0200
+
+    Merge branch 'master' into conflictingFontFix
+
+commit abae93faef32562f34a72981d252c848cc4f7565
+Merge: 07461d06 8179ff5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 27 14:33:27 2016 -0400
+
+    Merge pull request #273 from ebraminio/master
+
+            [dwrite] Use stream font loader instead GDI interop
+
+commit 8179ff5d7ba4a140cf6743729a22072800e98a79
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 27 03:54:15 2016 +0430
+
+    [dwrite] Don't allocate more than needed
+
+    Addressing Nikolay Sivov reviews on harfbuzz mailing list
+
+ src/hb-directwrite.cc | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+commit 5967eaba728ca3e4f5026142c25d455fa3a59764
+Author: Sascha Brawer <sascha@brawer.ch>
+Date:   Fri Jun 24 16:42:27 2016 +0200
+
+    [CPAL] Return 0xFFFF as name id for unnamed palettes
+
+    The name id 0 is used as Copyright notice. It's quite unlikely that a
+    font supplies a color palette with the exact same name as the font's
+    copyright notice, but the API should not prevent this.
+
+    Also, try to fix a problem with GObject introspection, where the
+    auto-generated Python bindings could not return palette colors.
+
+ src/hb-ot-color.cc       | 13 ++++++-------
+ test/api/test-ot-color.c | 14 +++++++-------
+ 2 files changed, 13 insertions(+), 14 deletions(-)
+
+commit 07b724f3419a28c479cd8a75ae0eecb841a6d2f3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 24 12:23:25 2016 +0430
+
+    [dwrite] Delete remained objects
+
+    No longer noticeable memory increase on create/destroy iterations,
+    highly better than current state of uniscribe backend
+
+ src/hb-directwrite.cc | 33 ++++++++++++++++++++++++---------
+ 1 file changed, 24 insertions(+), 9 deletions(-)
+
+commit be565d17141818e006aa1e4582f3ae14c726fa85
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 24 11:42:01 2016 +0430
+
+    [dwrite] Release allocated blob on face destroy
+
+    This reduces memory consumption of my iterated font create/destroy
+    cycle test
+    significantly and makes it much better than uniscribe backend even
+
+ src/hb-directwrite.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit f3f0ea980a359343ac0e3d359a95855c2cf7be25
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 23 16:41:37 2016 +0430
+
+    [dwrite] Remove ifdefs without breaking execution on old Windows
+    versions
+
+ src/hb-directwrite.cc | 205
+ +++++++++++++++++++++++++-------------------------
+ 1 file changed, 103 insertions(+), 102 deletions(-)
+
+commit 6b861dbd8b3662d0fa0e51fad1736d72192da868
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 21 13:57:26 2016 +0430
+
+    [dwrite] Use stream font loader instead GDI interop
+
+    With help of
+    https://dxr.mozilla.org/mozilla-central/source/gfx/2d/NativeFontResourceDWrite.cpp
+
+ src/hb-directwrite.cc | 350
+ +++++++++++++++++++-------------------------------
+ src/hb-directwrite.h  |   2 +-
+ 2 files changed, 135 insertions(+), 217 deletions(-)
+
+commit f7da0486ed8884481d477ce08fcf928c4da9a0a3
+Merge: a0223274 07461d06
+Author: Dominik Röttsches <d-r@roettsches.de>
+Date:   Mon Jun 20 10:25:43 2016 +0300
+
+    Merge branch 'master' into conflictingFontFix
+
+commit d34d3ac985a6c8c848ae49635b648a72e0c8f30d
+Author: Sascha Brawer <sascha@brawer.ch>
+Date:   Mon Apr 25 18:20:57 2016 +0200
+
+    Support CPAL table
+
+ NEWS                                               |   6 +-
+ src/Makefile.am                                    |   3 +
+ src/Makefile.sources                               |   3 +
+ src/hb-ot-color.cc                                 | 213 ++++++++++++++
+ src/hb-ot-color.h                                  |  99 +++++++
+ src/hb-ot-cpal-table.hh                            | 121 ++++++++
+ src/hb-ot-layout-private.hh                        |   3 +
+ src/hb-ot-layout.cc                                |   7 +
+ src/hb-ot.h                                        |   1 +
+ test/api/Makefile.am                               |   1 +
+ test/api/hb-test.h                                 |  30 ++
+ test/api/test-ot-color.c                           | 318
+ +++++++++++++++++++++
+ .../319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf   | Bin 0 -> 2128 bytes
+ .../e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf   | Bin 0 -> 1948 bytes
+ 14 files changed, 804 insertions(+), 1 deletion(-)
+
+commit 07461d06d242cd5cfda7ccb891189f074a89b460
+Author: Kelvin <kelvinsthirteen@gmail.com>
+Date:   Sat Jun 18 22:46:38 2016 +0000
+
+    Use UTF-32  in Python sample
+
+ src/sample.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit fca0c61d67aa309fc824fb18f247493c2b7701ef
+Merge: 4b8de1ea 98835058
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sun Jun 19 00:08:51 2016 +0300
+
+    Merge pull request #270 from khaledhosny/travis-failure
+
+    Fix make check on Travis
+
+commit 988350586f607c7a46bbb658a2abecfd004f41fb
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Jun 18 21:12:19 2016 +0200
+
+    [tests] Workaround Python 2 “narrow” builds
+
+    The so-called Python 2 “narrow” builds support UCS2 only, this
+    is a
+    workaround to allow unichr to work with any Unicode character in such
+    builds. This fixes Travis-CI failure as it has narrow Python 2 builds.
+
+    Copied from:
+    https://github.com/behdad/fonttools/blob/master/Lib/fontTools/misc/py23.py
+
+ test/shaping/hb_test_tools.py | 38 +++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 37 insertions(+), 1 deletion(-)
+
+commit a0223274b97e82fe02730fd45729172511fec459
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Thu Jun 16 14:19:39 2016 +0200
+
+    Discard reconfigured CTFont if URL changes
+
+    Fixes https://github.com/behdad/harfbuzz/issues/267
+
+ src/hb-coretext.cc | 24 +++++++++++++++++++++---
+ 1 file changed, 21 insertions(+), 3 deletions(-)
+
+commit 4b8de1ea804b225e8357422d0686aad76b05ccf3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 6 23:08:54 2016 -0700
+
+    Round, not truncate, when scaling values
+
+    Fixes https://github.com/behdad/harfbuzz/issues/255
+
+ src/hb-font-private.hh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit a93078a0ece6dcdea8c5b46cabd30854dd7cf593
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 6 15:58:41 2016 -0700
+
+    Change bugreport URL to github
+
+    That's where everything is happening these days.
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bed201d2b839c1b1e727e17efc2e0c8f705b86c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 6 14:14:24 2016 -0700
+
+    Update for latest Unicode 9 data files
+
+ src/hb-ot-shape-complex-indic-table.cc | 10 +++++-----
+ src/hb-ot-shape-complex-indic.cc       |  5 -----
+ src/hb-ot-shape-complex-use-table.cc   |  4 ++--
+ 3 files changed, 7 insertions(+), 12 deletions(-)
+
+commit aba4b0ca52f490adfc2f3c6ec0accddd6596fdf6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 1 16:57:29 2016 -0700
+
+    Add TODO
+
+ src/hb-font.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit a2b03de5b30b7e83f7fbf3457e9ba9c00eb88d00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 17:56:07 2016 +0100
+
+    [myanmar] Handle U+AA74..U+AA76
+
+    Fixes https://github.com/behdad/harfbuzz/issues/218
+
+ src/hb-ot-shape-complex-myanmar.cc | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 6c0aa9e92bbd22011c85d98c6db021012f7b4101
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 17:50:06 2016 +0100
+
+    Fix build on droid.io
+
+ test/shaping/tests/use.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9b6312f9451db790db00dc2c2e27a5a1db852e72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 17:41:49 2016 +0100
+
+    [use] Update to draft spec from Andrew Glass from August 2015
+
+ src/gen-use-table.py                               |  29 +++--
+ src/hb-ot-shape-complex-use-machine.rl             |  15 +--
+ src/hb-ot-shape-complex-use-private.hh             |   1 -
+ src/hb-ot-shape-complex-use-table.cc               | 142
+ ++++++++++-----------
+ src/hb-ot-shape-complex-use.cc                     |  11 +-
+ .../6ff0fbead4462d9f229167b4e6839eceb8465058.ttf   | Bin 0 -> 1148 bytes
+ test/shaping/tests/use.tests                       |   1 +
+ 7 files changed, 93 insertions(+), 106 deletions(-)
+
+commit 3e4e7616a8ca80a50a438601b84428b4ba4c8694
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 17:28:25 2016 +0100
+
+    [use] Add a catch-all clause to the machine
+
+ src/hb-ot-shape-complex-use-machine.rl | 2 ++
+ src/hb-ot-shape-complex-use.cc         | 2 ++
+ 2 files changed, 4 insertions(+)
+
+commit d04e461fe3310ccaf8633efcb79b8eb6ca2201c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 17:17:00 2016 +0100
+
+    [use] Fix 'Number-joiner terminated cluster' to use HN instead of H
+
+    From draft update to USE.
+
+ src/hb-ot-shape-complex-use-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 359dead960c825edeb4587915a511d323f1c1f2a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 16:19:19 2016 +0100
+
+    Allow MultipleSubst to delete glyph
+
+    Fixes https://github.com/behdad/harfbuzz/issues/253
+
+    Hopefully we got the logic right.
+
+ src/hb-ot-layout-gsub-table.hh       | 17 +++++++----------
+ src/hb-ot-layout-gsubgpos-private.hh | 11 +++++++----
+ 2 files changed, 14 insertions(+), 14 deletions(-)
+
+commit 3c1666cfb589275de96d54eecb95a13a98e3819e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 16:05:07 2016 +0100
+
+    [indic] Remove more unused logic after Javanese is gone
+
+ src/hb-ot-shape-complex-indic.cc | 50
+ +++++++++++++++-------------------------
+ 1 file changed, 18 insertions(+), 32 deletions(-)
+
+commit 8b5d6e755b271d0d22b31a7726d5bfbf2aae8b2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 15:59:27 2016 +0100
+
+    [indic] Remove unused Javanese bits
+
+ src/hb-ot-shape-complex-indic-machine.rl | 3 +--
+ src/hb-ot-shape-complex-indic-private.hh | 5 ++---
+ src/hb-ot-shape-complex-indic.cc         | 4 ----
+ 3 files changed, 3 insertions(+), 9 deletions(-)
+
+commit 30e6e29f0f0f77eb65bfd1c4576b38c2da555017
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 15:52:27 2016 +0100
+
+    [indic/use] Move Javanese from Indic shaper to USE
+
+    Fixes https://github.com/behdad/harfbuzz/issues/243
+
+    With javatext.ttf, the reodering medial Ra gets its advance width
+    zero'ed in Uniscribe implementation, and the font adds the advance
+    back.  Our Indic shaper does not do that, but USE does.  So, route
+    Javanese through USE.  That's what Microsoft does anyway.  Test:
+
+      U+A9A5,U+A9BA
+
+    This also seems to fix the following sequence, and variations thereof:
+
+      U+A99F,U+A9C0,U+A9A2,U+A9BF
+
+ src/gen-indic-table.py                             |  1 -
+ src/hb-ot-shape-complex-indic-table.cc             | 23
+ ++++------------------
+ src/hb-ot-shape-complex-private.hh                 |  5 +----
+ .../south-east-asian/script-javanese/misc.txt      |  1 +
+ 4 files changed, 6 insertions(+), 24 deletions(-)
+
+commit c6ee5f5f06a27a6f147f63aaf51186622821f20b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 15:39:02 2016 +0100
+
+    Add Javanese sample text
+
+ .../south-east-asian/script-javanese/misc.txt      | 53
+ ++++++++++++++++++++++
+ 1 file changed, 53 insertions(+)
+
+commit e21921a68a959b7e929f71a4260a6cbe055ab4e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 15:24:39 2016 +0100
+
+    Minor
+
+ BUILD.md | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 01a30a6aa9a5827c93245961e3392a1f361745fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 11:50:02 2016 +0100
+
+    [indic] Remove data for scripts that don't go thorough this shaper
+
+ src/gen-indic-table.py                 |  29 +-
+ src/hb-ot-shape-complex-indic-table.cc | 604
+ +--------------------------------
+ 2 files changed, 43 insertions(+), 590 deletions(-)
+
+commit 7cd9269f4eba7b85cd72301a3fc39fab42a4e439
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 11:34:46 2016 +0100
+
+    Update tables to Unicode 9.0.0 beta
+
+    Fixes https://github.com/behdad/harfbuzz/issues/251
+
+ src/hb-ot-shape-complex-arabic-table.hh |  56 ++++++++-----
+ src/hb-ot-shape-complex-indic-table.cc  | 137
+ +++++++++++++++++++++++---------
+ src/hb-ot-shape-complex-use-table.cc    |  86 ++++++++++++++------
+ 3 files changed, 196 insertions(+), 83 deletions(-)
+
+commit f718fe370ea89e8aeb407addaa6cc926d52a4cdb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 11:21:12 2016 +0100
+
+    Minor
+
+ src/gen-indic-table.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 691086f131cb6c9d97e98730c27673484bf93f87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 12:08:18 2016 +0100
+
+    Add Unicode 9 beta scripts
+
+    These are frozen, so good time to add.
+
+ src/hb-common.cc                   | 3 +++
+ src/hb-common.h                    | 9 +++++++++
+ src/hb-ot-shape-complex-private.hh | 9 +++++++++
+ src/hb-ot-shape-complex-use.cc     | 3 +++
+ 4 files changed, 24 insertions(+)
+
+commit bc5198fe1277d662926a4f616913c085cd4fc8ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 11:59:05 2016 +0100
+
+    Whitespace
+
+ src/hb-common.h | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit a5b7b0dd4508d8a1e7573b75c4cb8832c9e34e3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 10:44:13 2016 +0200
+
+    1.2.7
+
+ NEWS         | 12 ++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit 9879fc1db3cad684f412c2f3d6b49e0435697d0e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 10:29:12 2016 +0200
+
+    [ot-font] Remove unused 'post' table include for now
+
+    To make a release...
+
+ src/hb-ot-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f8061ae7972462ad800c23be7cd7b3d7ab94b93b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 10:28:24 2016 +0200
+
+    [tests] Fix test
+
+ test/shaping/Makefile.am                                                |
+ 2 +-
+ .../tests/{fallback-positioning.test => fallback-positioning.tests}
+ | 0
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit f00ab2a33ab34ba64f38cbbe65830c770a3e071e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 10:24:00 2016 +0200
+
+    [hb-ot-font] Make 'glyf' table loading lazy
+
+    Apparently some clients have reference-table callbacks that copy
+    the table.
+    As such, avoid loading 'glyf' table which is only needed if fallback
+    positioning
+    happens.
+
+ src/hb-ot-font.cc                                  |  45
+ ++++++++++++++++++++-
+ test/shaping/Makefile.am                           |   1 +
+ .../7ef276fc886ea502a03b9b0e5c8b547d5dc2b61c.ttf   | Bin 0 -> 784 bytes
+ test/shaping/tests/fallback-positioning.test       |   2 +
+ 4 files changed, 46 insertions(+), 2 deletions(-)
+
+commit 587d46227a56940a7f5bb053cbeda6144394acf7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 30 19:20:56 2016 +0200
+
+    [ot-font] Start implementing 'post' table, for accessing glyph names
+
+ src/Makefile.sources        |   1 +
+ src/hb-open-type-private.hh |  12 ++++-
+ src/hb-ot-font.cc           |   1 +
+ src/hb-ot-post-table.hh     | 119
+ ++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 132 insertions(+), 1 deletion(-)
+
+commit 9abaaac409b8e3a0a9182b67dc384133013f7878
+Merge: 2f560ee4 264b7a72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 03:38:24 2016 -0700
+
+    Merge commit '264b7a728a41becfbf23ce258fc2a3af19d0cbbe' into HEAD
+
+commit 2f560ee44b7b08683e8e6955fe3b95187e8bda32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 03:11:41 2016 -0700
+
+    [tibetan] Reorder marks to better match Uniscribe
+
+    Fixes https://github.com/behdad/harfbuzz/issues/237
+
+    Note that Uniscribe enforces a certain syllable order.  We don't.
+    But with this change, I get all of the tibetan contractions pass
+    with Microsoft Himalaya font.
+
+ src/hb-unicode-private.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit f68390f196216718c22c434e1d8921118e646824
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 02:44:35 2016 -0700
+
+    [test] Add text for Tibetan shorthand contractions
+
+    From http://www.babelstone.co.uk/Tibetan/Contractions.html
+
+ .../script-tibetan/misc/contractions.txt           | 612
+ +++++++++++++++++++++
+ 1 file changed, 612 insertions(+)
+
+commit 264b7a728a41becfbf23ce258fc2a3af19d0cbbe
+Merge: 7e2da035 adafdcdd
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Apr 27 03:48:23 2016 +0300
+
+    Merge pull request #247 from khaledhosny/update-opentype-language-tags
+
+    Update opentype language tags
+
+commit adafdcddced076da4bfa3114a00e15a387aaf1f7
+Author: Arthur Reutenauer <arthur.reutenauer@normalesup.org>
+Date:   Sat Nov 7 23:37:21 2015 +0000
+
+    Mass-added “difficult” tags – to be curated.
+
+ src/hb-ot-tag.cc | 69
+ +++++++++++++++++++++++++++++---------------------------
+ 1 file changed, 36 insertions(+), 33 deletions(-)
+
+commit 3d6a2c0d7d9f6c5b3097f78c1123f9e59dcc76e2
+Author: Arthur Reutenauer <arthur.reutenauer@normalesup.org>
+Date:   Sat Nov 7 22:59:13 2015 +0000
+
+    Initial import of missing OpenType 1.7 language tags.
+
+ src/hb-ot-tag.cc | 67
+ +++++++++++++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 61 insertions(+), 6 deletions(-)
+
+commit 7e2da035f68e46ce8f4759b67b4ed3a1b211d793
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 26 16:42:25 2016 -0700
+
+    Undo accidental change
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b20305022a8235b19e6b640bc62651854e1336f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 26 16:41:17 2016 -0700
+
+    Do NOT ignore Mongolian Free Variation Selectors during matching
+
+    Fixes https://github.com/behdad/harfbuzz/issues/234
+
+ src/hb-ot-layout-gsubgpos-private.hh               |   2 +-
+ src/hb-ot-layout-private.hh                        |  23
+ +++++++++++++++++++--
+ src/hb-ot-shape-complex-arabic.cc                  |   2 +-
+ .../a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf   | Bin 0 -> 3700 bytes
+ .../tests/mongolian-variation-selector.tests       |   1 +
+ 5 files changed, 24 insertions(+), 4 deletions(-)
+
+commit 21ab5501f5f5267d20cf23256866dd9d82a667ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 26 16:02:04 2016 -0700
+
+    Move ZWJ/ZWNJ bits to top byte of unicode_props()
+
+    To make room to remember Mongolian Free Variation Selectors.
+    Part of fixing https://github.com/behdad/harfbuzz/issues/234
+
+ src/hb-ot-layout-private.hh | 40 ++++++++++++++++++++++------------------
+ 1 file changed, 22 insertions(+), 18 deletions(-)
+
+commit de508516cb06ddb064d75bd7be8e843a5ebcf70d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 26 11:28:37 2016 -0700
+
+    [util] Print out --debug buffer to stderr
+
+ util/main-font-text.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 29393884b9f045460fb65d6ad10a94461ba93430
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 26 10:35:23 2016 -0700
+
+    Annotate blacklisted fonts with their sha1sum
+
+ src/hb-ot-layout.cc | 18 ++++++++++++------
+ 1 file changed, 12 insertions(+), 6 deletions(-)
+
+commit 14bb4a56971fd45063cd6c1288d911627088abb2
+Merge: 1c625dff 5069062d
+Author: Sascha Brawer <sascha@brawer.ch>
+Date:   Tue Apr 26 11:38:16 2016 +0200
+
+    Merge pull request #245 from KonstantinRitt/fixes/ce
+
+    Unbreak build on Windows CE
+
+commit 5069062d0a9342bb716eebf3ddc1efad91924caa
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Tue Apr 26 12:02:26 2016 +0400
+
+    Unbreak build on Windows CE
+
+    0475ef2f97e3035a2eea9a0f96031331e07e8e29 broke the build by using
+    vsnprintf(), which is not defined on Windows CE
+
+ src/hb-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1c625dff2269c54ff429ca45be88893ff1fa6c34
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 9 12:53:23 2016 -0700
+
+    Minor
+
+ src/hb-ot-layout.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 851b0db36d1b724fc1e0db506445119c78186285
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 8 23:46:55 2016 -0700
+
+    Minor.  We should never get to this branch, but fix it anyway.
+
+ src/hb-ot-layout-common-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 00ea66f35754a1e6e4d3b7b139d611a9a623a9d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 8 13:51:01 2016 -0700
+
+    1.2.6
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 4f3d59a1877dcb94d09da48e9694a6c1b05a86fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 8 13:41:20 2016 -0700
+
+    Blacklist another set of timesi.ttf and timesbi.ttf
+
+ src/hb-ot-layout.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ef476be80d773332e0c768a3465d99381d76edd9
+Merge: a0331b55 d3134a66
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 8 13:16:33 2016 -0700
+
+    Merge pull request #239 from ebraminio/dwfix
+
+    Improve DirectWrite backend
+
+commit d3134a66ad551ded726db9528d3c25459088f105
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 5 21:01:05 2016 +0000
+
+    Fix when no feature is given
+
+ src/hb-directwrite.cc | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit a0331b55f7b45437980e1fc323251f4091bf2c4e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 4 16:25:32 2016 -0700
+
+    1.2.5
+
+ NEWS         | 7 +++++++
+ configure.ac | 2 +-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit 6e55199b5f097ac93bad38f32e9813e2da14c5a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 4 16:24:27 2016 -0700
+
+    Add test for 6dd80faf0dcb3e8a8915c3a25da44e2a67cb0cd8
+
+ test/shaping/Makefile.am                                |   1 +
+ .../f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf        | Bin 0 ->
+ 16736 bytes
+ test/shaping/tests/mark-filtering-sets.tests            |   5 +++++
+ 3 files changed, 6 insertions(+)
+
+commit 59089622dbb8dda783b1639c932123f125c3592d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 4 14:54:32 2016 -0700
+
+    [coretext] Clarify comment
+
+ src/hb-coretext.cc | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit 6dd80faf0dcb3e8a8915c3a25da44e2a67cb0cd8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 4 14:34:25 2016 -0700
+
+    Fix FixedVersion::to_int()
+
+    Ouch.  Had broken it in 9a13ed453ef96822a47d6e6f58332b87f38d5c59
+
+    Fixes https://github.com/behdad/harfbuzz/issues/238
+    Will add test soon.
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4a104021697439fd21390a1f4cdc9310348882fa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Apr 2 13:47:59 2016 +0000
+
+    Hide justification behind HB_DIRECTWRITE_EXPERIMENTAL_JUSTIFICATION
+
+ src/hb-directwrite.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 63ee9ca5d81b53eb035972754ed95572821c393c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Apr 1 15:47:07 2016 +0000
+
+    Use standard types instead Windows favourites ones
+
+ src/hb-directwrite.cc | 100
+ +++++++++++++++++++++++++-------------------------
+ 1 file changed, 50 insertions(+), 50 deletions(-)
+
+commit adf20ba0d18d1506e633dcd9b4827a6c93abcadd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Apr 1 15:36:40 2016 +0000
+
+    Limit GetJustifiedGlyphs only to scripts with custom justification
+    character
+
+ src/hb-directwrite.cc | 98
+ +++++++++++++++++++++++++++++++--------------------
+ 1 file changed, 60 insertions(+), 38 deletions(-)
+
+commit 32ae9d1b3ffbe7e26e654437a56a26a95fe9f5a6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Apr 1 06:39:57 2016 +0000
+
+    Add justification support
+
+ src/hb-directwrite.cc | 321
+ ++++++++++++++++++++++++++++++++------------------
+ 1 file changed, 205 insertions(+), 116 deletions(-)
+
+commit 10c3d9e41520595c88dd2a8321590e03ce8fcf47
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 31 18:19:44 2016 +0000
+
+    Basic opentype features support
+
+ src/hb-directwrite.cc | 62
+ ++++++++++++++++++++++++++++++++++-----------------
+ 1 file changed, 42 insertions(+), 20 deletions(-)
+
+commit d129897120d3ad414220d603557c15a60aa69fa6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 31 13:45:37 2016 +0000
+
+    Refactor and remove dupe getglyphs call
+
+ src/hb-directwrite.cc | 106
+ ++++++++++++++++++++++++--------------------------
+ 1 file changed, 51 insertions(+), 55 deletions(-)
+
+commit 5f1a8961008b93f72acc47336109af3a64e248d0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 31 12:26:16 2016 +0000
+
+    Better glyph offset support
+
+ src/hb-directwrite.cc | 44 ++++++++++++++++++++++++--------------------
+ 1 file changed, 24 insertions(+), 20 deletions(-)
+
+commit d691ba3f405738c6857450752b8cc0911dfcdb01
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 30 20:21:40 2016 +0000
+
+    Don't fail when language is not set
+
+ src/hb-directwrite.cc | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 1c00a46c7a608ebc0b03c5abfcfe7f2b9881d0df
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 30 20:15:09 2016 +0000
+
+    Make DirectWrite backend to work with different font sizes
+
+    Actually copyedited same logic from Uniscribe to make it just work
+
+ src/hb-directwrite.cc | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 0251b0cc5c39272d2299d4b2ab802faaafe96837
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 17 14:37:11 2016 -0700
+
+    1.2.4
+
+ NEWS         | 15 +++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 16 insertions(+), 1 deletion(-)
+
+commit 69f9fbc4200442a35484d3c790ae8f4979be5d60
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 17 11:59:43 2016 -0700
+
+    Synthesize GDEF glyph class for any glyph that does not have one
+    in GDEF
+
+    Previously we only synthesized GDEF glyph classes if the glyphClassDef
+    array in GDEF was null.  This worked well enough, and is indeed what
+    OpenType requires: "If the font does not include a GlyphClassDef
+    table,
+    the client must define and maintain this information when using the
+    GSUB and GPOS tables."  That sentence does not quite make sense since
+    one needs Unicode properties as well, but is close enough.
+
+    However, looks like Arial Unicode as shipped on WinXP, does have GDEF
+    glyph class array, but defines no classes for Hebrew.  This results
+    in Hebrew marks not getting their widths zeroed.  So, with this
+    change,
+    we synthesize glyph class for any glyph that is not specified in the
+    GDEF glyph class table.  Since, from our point of view, a glyph not
+    being listed in that table is a font bug, any unwanted consequence of
+    this change is a font bug :).
+
+    Note that we still don't get the same rendering as Uniscribe, since
+    Uniscribe seems to do fallback positioning as well, even though the
+    font does have a GPOS table (which does NOT cover Hebrew!).  We are
+    not going to try to match that though.
+
+    Test string for Arial Unicode:
+
+            U+05E9,U+05B8,U+05C1,U+05DC
+
+    Before:         [gid1166=3+991|gid1142=0+737|gid5798=0+1434]
+    After:          [gid1166=3+991|gid1142=0+0|gid5798=0+1434]
+    Uniscribe:      [gid1166=3+991|gid1142=0@348,0+0|gid5798=0+1434]
+
+    Note that our new output matches what we were generating until July
+    2014, because the Hebrew shaper used to zero mark advances based on
+    Unicode, NOT GDEF.  That's 9e834e29e0b657f0555df1ab9cea79ff7abcf08d.
+
+    Reported by Greg Douglas.
+
+ src/hb-ot-layout-gsub-table.hh | 22 ++++++++++++++++++++--
+ src/hb-ot-shape.cc             | 29 -----------------------------
+ 2 files changed, 20 insertions(+), 31 deletions(-)
+
+commit fef5dd9a72f326c160a7194f558749d24bac7283
+Merge: 01ea9eaa 5f995db1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 12 19:15:15 2016 -0800
+
+    Merge pull request #232 from c0nk/wip-icu
+
+    Add --with-icu=builtin option; fix compile error
+
+commit 01ea9eaac373d9f3de6e56c1ca26cdcd259ecc8e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 11 18:50:02 2016 -0800
+
+    [build] Use tar-ustar instead of tar-pax
+
+    The default tar-v7 is not good enough for us (99 char filename
+    limit), so I have had bumped to tar-pax.  We got one complaint
+    that someone's tar couldn't handle tar-pax.  Set to tar-ustar
+    which is ~13 years earlier than tar-pax and is good enough for us.
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3e10460a1dd41de32752e308771aa30d23565cc0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 11 18:45:19 2016 -0800
+
+    Minor comment
+
+ src/hb-unicode-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d14fea4bdcc1423fe9a585af3abdefa9605d17e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 8 12:16:41 2016 -0800
+
+    Remove default clause in minor switch statements
+
+    Bending to clang warnings...
+    https://bugs.chromium.org/p/chromium/issues/detail?id=593057
+
+ src/hb-ot-shape-complex-indic.cc | 4 ----
+ src/hb-ot-shape-complex-thai.cc  | 1 -
+ 2 files changed, 5 deletions(-)
+
+commit ce8ae9970102f83b67bb1e8e8b2bf894a0e26c07
+Merge: 731a430c 71248a84
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 4 17:20:35 2016 -0800
+
+    Merge pull request #231 from KonstantinRitt/post123buildfix
+
+    Fix build with HB_DISABLE_DEPRECATED
+
+commit 731a430cd36caabcef04e099b21ebc6daedd536f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 2 13:32:42 2016 -0800
+
+    Fix requiredFeature stage handling logic
+
+    Originally the way Jonathan had written this was correct in
+    "continue"ing:
+
+    https://github.com/jfkthame/harfbuzz/commit/35e28c7a733eaffcd9f062b18d7db9fbb3d990fc#diff-ead86a33a5cc9ad7f6e6381031a0baddR199
+
+    When I rewrote his patch, I messed it up:
+
+    https://github.com/behdad/harfbuzz/commit/da132937989acb4d8ca9bd41c79f98750e7dda30#diff-ead86a33a5cc9ad7f6e6381031a0baddR209
+
+    the intended behavior was NOT to set found=TRUE and NOT to continue.
+    This was resulting in feature_index[table_index] being left unset.
+    Oops!
+
+ src/hb-ot-map.cc | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit 68b6296d3333fd38bd5442d2ba087ced481603bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 1 16:41:53 2016 +0900
+
+    Add F2DOT14 type
+
+ src/hb-open-type-private.hh | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 082b79fe9f06607998178dcdcbe817af28b017de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 1 16:41:26 2016 +0900
+
+    Use FWORD and UFWORD when it makes sense
+
+    I had forgotten about those types.
+
+ src/hb-ot-glyf-table.hh | 8 ++++----
+ src/hb-ot-hmtx-table.hh | 6 +++---
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 5f995db10381172ec63fd7ffbb0acf2c6b3dae5e
+Author: Kal Conley <kcconley@gmail.com>
+Date:   Fri Feb 26 00:36:17 2016 +0100
+
+    Fix missing ICU #include
+
+    Fix compile error in hb-icu.cc when ICU configured with
+    U_NO_DEFAULT_INCLUDE_UTF_HEADERS=1
+
+ src/hb-icu.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b424b6c372dfe4c0ed75a49761eb34a416819446
+Author: Kal Conley <kcconley@gmail.com>
+Date:   Fri Feb 26 00:35:15 2016 +0100
+
+    Add --with-icu=builtin configure option
+
+ configure.ac    | 33 +++++++++++++++++++--------------
+ src/Makefile.am |  7 +++++++
+ 2 files changed, 26 insertions(+), 14 deletions(-)
+
+commit 71248a843f976c86022eb5bb8c6e8880b2499937
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Thu Feb 25 18:55:28 2016 +0400
+
+    Fix build with HB_DISABLE_DEPRECATED
+
+    When HB_DISABLE_DEPRECATED is defined, no code from hb-deprecated.h
+    should be used, even from within HB itself.
+
+ src/hb-font.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 0c7fb7419c20d04b803412945565562c32b42929
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 25 14:40:09 2016 +0900
+
+    Speed up buffer variable allocation sanity check
+
+    This makes defining HB_NDEBUG much less relevant, to the
+    point of irrelevance.  Sorry about all the fuss in previous
+    release!
+
+ src/hb-buffer-private.hh | 67
+ ++++++++++++++++++++++++++++-----------------
+ src/hb-buffer.cc         | 70
+ ------------------------------------------------
+ 2 files changed, 43 insertions(+), 94 deletions(-)
+
+commit 91dd11565221bdb108c138662ea013aac14bb968
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 25 13:56:47 2016 +0900
+
+    Add HB_NDEBUG
+
+    API changes:
+    - If NDEBUG is defined, define HB_NDEBUG
+    - Disable costlier sanity checks if HB_NDEBUG is defined.
+
+    In 1.2.3 introduced some code to disable costly sanity checks if
+    NDEBUG is defined.  NDEBUG, however, disables all assert()s as
+    well.  With HB_NDEBUG, one can disable costlier checks but keep
+    assert()s.
+
+    I'll probably add a way to define HB_NDEBUG automatically in
+    release tarballs.  But for now, production systems that do NOT
+    define NDEBUG, are encouraged to define HB_NDEBUG for our build.
+
+ src/Makefile.am          | 2 +-
+ src/hb-buffer-private.hh | 4 ++--
+ src/hb-buffer.cc         | 4 ++--
+ src/hb-private.hh        | 9 +++++++++
+ 4 files changed, 14 insertions(+), 5 deletions(-)
+
+commit 75568b0a7f811ea18e23037735ec8541a7431f88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 25 12:26:26 2016 +0900
+
+    1.2.3
+
+ NEWS         | 42 ++++++++++++++++++++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 43 insertions(+), 1 deletion(-)
+
+commit 988165021f8d48dc7120b071d056491256569f4f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 25 12:23:02 2016 +0900
+
+    Disable internal buffer variable bookkeeping in NDEBUG builds
+
+    Saves some sweet time and binary size!
+
+ src/Makefile.am          |  1 +
+ src/hb-buffer-private.hh | 30 ++++++++++++++++++++----------
+ src/hb-buffer.cc         |  6 ++++--
+ 3 files changed, 25 insertions(+), 12 deletions(-)
+
+commit 94dd0bb7e78125994cb7c833a5b03110f1ffc822
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 25 11:31:03 2016 +0900
+
+    Add blacklist signature for Times New Roman (Bold) Italic on OS X
+
+ src/hb-ot-layout.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit dd8598c1c7f29fc92253b0cd4e856c1941b1d0c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 25 11:20:05 2016 +0900
+
+    [test] Pass closure to hb_font_set_glyph_func()
+
+    Exercises fix in c335fd7986fe360ab8e1c032c9b988d0d30511eb
+
+ test/api/test-shape.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e23cf902e91142a10229e3514be4ceee69efde04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 25 11:11:15 2016 +0900
+
+    Blacklist GDEF table of timesi.ttf and timesbi.ttf on Win 7
+
+    See discussion:
+    https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
+
+ src/hb-ot-layout.cc | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+commit c335fd7986fe360ab8e1c032c9b988d0d30511eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 25 09:16:05 2016 +0900
+
+    In trampoline implementation of get_glyph(), don't destroy user
+    data twice!
+
+ src/hb-font.cc | 41 +++++++++++++++++++++++++++--------------
+ 1 file changed, 27 insertions(+), 14 deletions(-)
+
+commit 23335deaad9d4d9824ff41343264514d3f9f7e37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 24 20:27:13 2016 +0900
+
+    [ot-font] Accelerate cmap format4 get_glyph
+
+ src/hb-ot-cmap-table.hh | 111
+ ++++++++++++++++++++++++++++--------------------
+ src/hb-ot-font.cc       |  14 +++++-
+ 2 files changed, 77 insertions(+), 48 deletions(-)
+
+commit e0f16a715bc3e621ff21a8be88102e9672630574
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 24 19:52:36 2016 +0900
+
+    [ot-font] Towards accelerating get_glyph()
+
+ src/hb-ot-font.cc | 23 ++++++++++++++++++++---
+ 1 file changed, 20 insertions(+), 3 deletions(-)
+
+commit 5473ebfb84c7b6059ac16e04676b363acc51aa00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 24 19:32:43 2016 +0900
+
+    [ot-font] Remove level of indirection in get_glyph_variant
+
+ src/hb-ot-cmap-table.hh | 14 ++------------
+ src/hb-ot-font.cc       | 13 +++++++++----
+ 2 files changed, 11 insertions(+), 16 deletions(-)
+
+commit 49fe6ecf19522413e79a11a29aa0ffc5bdfcd2f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 24 19:10:06 2016 +0900
+
+    [TODO] Update
+
+    This file is rather obsolete.  Still, give it a refresh.
+
+ TODO | 16 ++--------------
+ 1 file changed, 2 insertions(+), 14 deletions(-)
+
+commit 8b5bc141cd3a6bfcea3c91a882a630426876ceb3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 24 19:05:23 2016 +0900
+
+    Add get_nominal_glyph() and get_variation_glyph() instead of
+    get_glyph()
+
+    New API:
+    - hb_font_get_nominal_glyph_func_t
+    - hb_font_get_variation_glyph_func_t
+    - hb_font_funcs_set_nominal_glyph_func()
+    - hb_font_funcs_set_variation_glyph_func()
+    - hb_font_get_nominal_glyph()
+    - hb_font_get_variation_glyph()
+
+    Deprecated API:
+    - hb_font_get_glyph_func_t
+    - hb_font_funcs_set_glyph_func()
+
+    Clients that implement their own font-funcs are encouraged to replace
+    their get_glyph() implementation with a get_nominal_glyph() and
+    get_variation_glyph() pair.  The variation version can assume that
+    variation_selector argument is not zero.
+
+ src/hb-deprecated.h                |  10 ++
+ src/hb-fallback-shape.cc           |   4 +-
+ src/hb-font-private.hh             |  26 +++--
+ src/hb-font.cc                     | 203
+ ++++++++++++++++++++++++++++++++++---
+ src/hb-font.h                      |  55 +++++++---
+ src/hb-ft.cc                       |  38 ++++---
+ src/hb-ot-font.cc                  |  57 +++++++----
+ src/hb-ot-shape-complex-indic.cc   |   8 +-
+ src/hb-ot-shape-complex-myanmar.cc |   2 +-
+ src/hb-ot-shape-complex-use.cc     |   2 +-
+ src/hb-ot-shape-fallback.cc        |   6 +-
+ src/hb-ot-shape-normalize.cc       |  18 ++--
+ src/hb-ot-shape.cc                 |   6 +-
+ 13 files changed, 344 insertions(+), 91 deletions(-)
+
+commit b30a971bf792b9c683c345e1be25c5a5869a113c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 24 17:32:22 2016 +0900
+
+    1.2.2
+
+ NEWS         | 14 +++++++++++++-
+ configure.ac |  2 +-
+ 2 files changed, 14 insertions(+), 2 deletions(-)
+
+commit af48e3d27c01c538f46f1dc376d994a0c24a8170
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 24 16:06:40 2016 +0900
+
+    Fix recent test
+
+    Not sure why the FT functions were returning advance 1024.  This
+    caused failure on drone.io.  Switch to hb-ot-font and disable
+    glyph names.
+
+ test/shaping/tests/cursive-positioning.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 17c831701756bb46300c412fd64b19d67f299c18
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 24 16:06:23 2016 +0900
+
+    [tests] Fix for multiple options in test runner scripts
+
+ test/shaping/run-tests.sh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit ebd7431f824c718db6ce5b85e94f2b3911127af4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 24 15:53:40 2016 +0900
+
+    Partially revert 86c68c7a2c971efe8e35b1f1bd99401dc8b688d2
+
+    That commit moved the advance adjustment for mark positioning to
+    be applied immediately, instead of doing late before.  This breaks
+    if mark advances are zeroed late, like in Arabic.  Also, easier to
+    hit it in RTL scripts since a single mark with non-zero advance is
+    enough to hit the bug, whereas in LTR, at least two marks are needed.
+
+    This reopens https://github.com/behdad/harfbuzz/issues/211
+    The cursive+mark interaction is broken again.  To be fixed in a
+    different way.
+
+ src/hb-ot-layout-gpos-table.hh               | 28
+ ++++++++++++----------------
+ test/shaping/tests/cursive-positioning.tests |  2 +-
+ 2 files changed, 13 insertions(+), 17 deletions(-)
+
+commit 284481b3120963353f5f34ed094f07ffc13480ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 24 15:52:37 2016 +0900
+
+    Add test for mark positioning in rtl with non-zero mark advance
+
+    Apparently I broke this 86c68c7a2c971efe8e35b1f1bd99401dc8b688d2.
+    Fix coming.
+
+ .../sha1sum/07f054357ff8638bac3711b422a1e31180bba863.ttf  | Bin 0 ->
+ 848 bytes
+ test/shaping/tests/cursive-positioning.tests              |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit 56a84e8dd18c63782b8db3a86e94651dae5bb01b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 24 15:50:33 2016 +0900
+
+    [tests] Allow commenting out tests to be skipped
+
+ test/shaping/run-tests.sh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 7cfd6cc486f2751d7f78c5008a636d677af4e12f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 24 12:30:57 2016 +0900
+
+    [Android.mk] Update with warning flags
+
+ Android.mk | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit dabf32a5ad706726412ba5c64e1ea614a707b928
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 23 15:38:43 2016 +0900
+
+    1.2.1
+
+ NEWS         | 13 +++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit 525cc7d28cbe4e8149ddba677224f134dc0a3274
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 23 15:19:27 2016 +0900
+
+    Add note re only adding tests with Free Software fonts
+
+ test/shaping/README.md | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 6a09d7e34b949f9929f616ee53278b2edfd9b7ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 23 13:47:16 2016 +0900
+
+    [test] Add README about how to add shaping tests
+
+ test/shaping/Makefile.am |  1 +
+ test/shaping/README.md   | 37 +++++++++++++++++++++++++++++++++++++
+ 2 files changed, 38 insertions(+)
+
+commit f8ee7906d0454d950081c621f2b04a6d08e1b92f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 23 13:45:38 2016 +0900
+
+    Remove MANIFEST files
+
+    They are unused currently.  We can add later if we hook them up
+    to anything useful.
+
+ test/shaping/fonts/sha1sum/MANIFEST                | 52
+ ----------------------
+ test/shaping/tests/MANIFEST                        | 19 --------
+ test/shaping/texts/MANIFEST                        |  1 -
+ test/shaping/texts/in-tree/MANIFEST                |  9 ----
+ test/shaping/texts/in-tree/shaper-arabic/MANIFEST  |  6 ---
+ .../in-tree/shaper-arabic/script-arabic/MANIFEST   |  3 --
+ .../script-arabic/language-persian/MANIFEST        |  1 -
+ .../script-arabic/language-urdu/MANIFEST           |  1 -
+ .../script-arabic/language-urdu/crulp/MANIFEST     |  1 -
+ .../language-urdu/crulp/ligatures/MANIFEST         |  7 ---
+ .../shaper-arabic/script-arabic/misc/MANIFEST      |  1 -
+ .../script-arabic/misc/diacritics/MANIFEST         |  7 ---
+ .../in-tree/shaper-arabic/script-mandaic/MANIFEST  |  1 -
+ .../shaper-arabic/script-mandaic/misc/MANIFEST     |  0
+ .../shaper-arabic/script-mongolian/MANIFEST        |  1 -
+ .../shaper-arabic/script-mongolian/misc/MANIFEST   |  4 --
+ .../in-tree/shaper-arabic/script-nko/MANIFEST      |  1 -
+ .../in-tree/shaper-arabic/script-nko/misc/MANIFEST |  1 -
+ .../in-tree/shaper-arabic/script-phags-pa/MANIFEST |  1 -
+ .../shaper-arabic/script-phags-pa/misc/MANIFEST    |  1 -
+ .../in-tree/shaper-arabic/script-syriac/MANIFEST   |  1 -
+ .../shaper-arabic/script-syriac/misc/MANIFEST      |  2 -
+ test/shaping/texts/in-tree/shaper-default/MANIFEST |  5 ---
+ .../shaper-default/script-ethiopic/MANIFEST        |  1 -
+ .../shaper-default/script-ethiopic/misc/MANIFEST   |  1 -
+ .../in-tree/shaper-default/script-han/MANIFEST     |  1 -
+ .../shaper-default/script-han/misc/MANIFEST        |  1 -
+ .../shaper-default/script-hiragana/MANIFEST        |  1 -
+ .../shaper-default/script-hiragana/misc/MANIFEST   |  2 -
+ .../shaper-default/script-linear-b/MANIFEST        |  1 -
+ .../shaper-default/script-linear-b/misc/MANIFEST   |  1 -
+ .../shaper-default/script-tifinagh/MANIFEST        |  1 -
+ .../shaper-default/script-tifinagh/misc/MANIFEST   |  1 -
+ test/shaping/texts/in-tree/shaper-hangul/MANIFEST  |  1 -
+ .../in-tree/shaper-hangul/script-hangul/MANIFEST   |  1 -
+ .../shaper-hangul/script-hangul/misc/MANIFEST      |  1 -
+ test/shaping/texts/in-tree/shaper-hebrew/MANIFEST  |  1 -
+ .../in-tree/shaper-hebrew/script-hebrew/MANIFEST   |  1 -
+ .../shaper-hebrew/script-hebrew/misc/MANIFEST      |  1 -
+ test/shaping/texts/in-tree/shaper-indic/MANIFEST   |  2 -
+ .../texts/in-tree/shaper-indic/indic/MANIFEST      | 11 -----
+ .../shaper-indic/indic/script-assamese/MANIFEST    |  2 -
+ .../indic/script-assamese/misc/MANIFEST            |  0
+ .../indic/script-assamese/utrrs/MANIFEST           |  3 --
+ .../indic/script-assamese/utrrs/codepoint/MANIFEST |  7 ---
+ .../indic/script-assamese/utrrs/gpos/MANIFEST      |  2 -
+ .../indic/script-assamese/utrrs/gsub/MANIFEST      |  1 -
+ .../shaper-indic/indic/script-bengali/MANIFEST     |  2 -
+ .../indic/script-bengali/misc/MANIFEST             |  2 -
+ .../indic/script-bengali/utrrs/MANIFEST            |  3 --
+ .../indic/script-bengali/utrrs/codepoint/MANIFEST  |  7 ---
+ .../indic/script-bengali/utrrs/gpos/MANIFEST       |  2 -
+ .../indic/script-bengali/utrrs/gsub/MANIFEST       |  1 -
+ .../shaper-indic/indic/script-devanagari/MANIFEST  |  2 -
+ .../indic/script-devanagari/misc/MANIFEST          |  6 ---
+ .../indic/script-devanagari/utrrs/MANIFEST         |  3 --
+ .../script-devanagari/utrrs/codepoint/MANIFEST     |  9 ----
+ .../indic/script-devanagari/utrrs/gpos/MANIFEST    |  2 -
+ .../indic/script-devanagari/utrrs/gsub/MANIFEST    |  1 -
+ .../shaper-indic/indic/script-gujarati/MANIFEST    |  2 -
+ .../indic/script-gujarati/misc/MANIFEST            |  0
+ .../indic/script-gujarati/utrrs/MANIFEST           |  3 --
+ .../indic/script-gujarati/utrrs/codepoint/MANIFEST |  7 ---
+ .../indic/script-gujarati/utrrs/gpos/MANIFEST      |  2 -
+ .../indic/script-gujarati/utrrs/gsub/MANIFEST      |  1 -
+ .../shaper-indic/indic/script-gurmukhi/MANIFEST    |  2 -
+ .../indic/script-gurmukhi/misc/MANIFEST            |  1 -
+ .../indic/script-gurmukhi/utrrs/MANIFEST           |  3 --
+ .../indic/script-gurmukhi/utrrs/codepoint/MANIFEST |  7 ---
+ .../indic/script-gurmukhi/utrrs/gpos/MANIFEST      |  2 -
+ .../indic/script-gurmukhi/utrrs/gsub/MANIFEST      |  1 -
+ .../shaper-indic/indic/script-kannada/MANIFEST     |  2 -
+ .../indic/script-kannada/misc/MANIFEST             |  2 -
+ .../indic/script-kannada/utrrs/MANIFEST            |  3 --
+ .../indic/script-kannada/utrrs/codepoint/MANIFEST  |  8 ----
+ .../indic/script-kannada/utrrs/gpos/MANIFEST       |  1 -
+ .../indic/script-kannada/utrrs/gsub/MANIFEST       |  1 -
+ .../shaper-indic/indic/script-malayalam/MANIFEST   |  2 -
+ .../indic/script-malayalam/misc/MANIFEST           |  3 --
+ .../indic/script-malayalam/utrrs/MANIFEST          |  2 -
+ .../script-malayalam/utrrs/codepoint/MANIFEST      |  7 ---
+ .../indic/script-malayalam/utrrs/gsub/MANIFEST     |  1 -
+ .../shaper-indic/indic/script-oriya/MANIFEST       |  2 -
+ .../shaper-indic/indic/script-oriya/misc/MANIFEST  |  2 -
+ .../shaper-indic/indic/script-oriya/utrrs/MANIFEST |  2 -
+ .../indic/script-oriya/utrrs/codepoint/MANIFEST    |  9 ----
+ .../indic/script-oriya/utrrs/gsub/MANIFEST         |  1 -
+ .../shaper-indic/indic/script-sinhala/MANIFEST     |  2 -
+ .../indic/script-sinhala/misc/MANIFEST             |  4 --
+ .../indic/script-sinhala/utrrs/MANIFEST            |  3 --
+ .../indic/script-sinhala/utrrs/codepoint/MANIFEST  |  5 ---
+ .../indic/script-sinhala/utrrs/gpos/MANIFEST       |  1 -
+ .../indic/script-sinhala/utrrs/gsub/MANIFEST       |  7 ---
+ .../shaper-indic/indic/script-tamil/MANIFEST       |  2 -
+ .../shaper-indic/indic/script-tamil/misc/MANIFEST  |  1 -
+ .../shaper-indic/indic/script-tamil/utrrs/MANIFEST |  3 --
+ .../indic/script-tamil/utrrs/codepoint/MANIFEST    | 10 -----
+ .../indic/script-tamil/utrrs/gpos/MANIFEST         |  2 -
+ .../indic/script-tamil/utrrs/gsub/MANIFEST         |  1 -
+ .../shaper-indic/indic/script-telugu/MANIFEST      |  2 -
+ .../shaper-indic/indic/script-telugu/misc/MANIFEST |  1 -
+ .../indic/script-telugu/utrrs/MANIFEST             |  3 --
+ .../indic/script-telugu/utrrs/codepoint/MANIFEST   |  7 ---
+ .../indic/script-telugu/utrrs/gpos/MANIFEST        |  1 -
+ .../indic/script-telugu/utrrs/gsub/MANIFEST        |  1 -
+ .../in-tree/shaper-indic/south-east-asian/MANIFEST |  1 -
+ .../south-east-asian/script-khmer/MANIFEST         |  1 -
+ .../south-east-asian/script-khmer/misc/MANIFEST    |  3 --
+ test/shaping/texts/in-tree/shaper-myanmar/MANIFEST |  1 -
+ .../in-tree/shaper-myanmar/script-myanmar/MANIFEST |  1 -
+ .../shaper-myanmar/script-myanmar/misc/MANIFEST    |  3 --
+ test/shaping/texts/in-tree/shaper-thai/MANIFEST    |  2 -
+ .../texts/in-tree/shaper-thai/script-lao/MANIFEST  |  1 -
+ .../in-tree/shaper-thai/script-lao/misc/MANIFEST   |  1 -
+ .../texts/in-tree/shaper-thai/script-thai/MANIFEST |  1 -
+ .../in-tree/shaper-thai/script-thai/misc/MANIFEST  |  4 --
+ test/shaping/texts/in-tree/shaper-tibetan/MANIFEST |  1 -
+ .../in-tree/shaper-tibetan/script-tibetan/MANIFEST |  1 -
+ .../shaper-tibetan/script-tibetan/misc/MANIFEST    |  1 -
+ test/shaping/texts/in-tree/shaper-use/MANIFEST     |  6 ---
+ .../texts/in-tree/shaper-use/script-batak/MANIFEST |  1 -
+ .../in-tree/shaper-use/script-buginese/MANIFEST    |  1 -
+ .../texts/in-tree/shaper-use/script-cham/MANIFEST  |  1 -
+ .../in-tree/shaper-use/script-kaithi/MANIFEST      |  1 -
+ .../in-tree/shaper-use/script-kharoshti/MANIFEST   |  1 -
+ .../in-tree/shaper-use/script-tai-tham/MANIFEST    |  2 -
+ 126 files changed, 381 deletions(-)
+
+commit 815bdd7700155efcffa9a4c3ca5bfc31833d0586
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 18:22:44 2016 +0900
+
+    In cluster-level=0, group ZWJ/ZWNJ with previous cluster
+
+    This better emulates Unicode grapheme clusters.
+
+    Note that Uniscribe does NOT do this, but should be harmless with
+    most clients,
+    and improve fallback with clients that use HarfBuzz cluster as unit
+    of fallback.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/217
+
+ src/hb-ot-layout-private.hh                           | 6 ++++++
+ src/hb-ot-shape.cc                                    | 3 ++-
+ test/shaping/tests/indic-joiner-candrabindu.tests     | 2 +-
+ test/shaping/tests/mongolian-variation-selector.tests | 2 +-
+ 4 files changed, 10 insertions(+), 3 deletions(-)
+
+commit 89137e325a19d62fb00979e1e8ab2ca59a2c1147
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 16:00:59 2016 +0900
+
+    Minor
+
+ src/hb-coretext.cc | 2 +-
+ src/hb-ot-shape.cc | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 15063b12f7619d4f44981248e28f38c172d12e1f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 15:56:29 2016 +0900
+
+    [coretext] Move CTFont construction to face_data
+
+ src/hb-coretext.cc | 66
+ +++++++++++++++++++++++++-----------------------------
+ 1 file changed, 30 insertions(+), 36 deletions(-)
+
+commit ba3d49d9a56932d341bf1916a30f322be665e3a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 15:50:12 2016 +0900
+
+    [coretext] Move code around
+
+ src/hb-coretext.cc | 70
+ +++++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 40 insertions(+), 30 deletions(-)
+
+commit 90194efb8480d58c55b7a19962624c7aadbdca63
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 15:42:53 2016 +0900
+
+    [coretext] Move code around
+
+ src/hb-coretext.cc | 46 ++++++++++++++++++++++++++--------------------
+ 1 file changed, 26 insertions(+), 20 deletions(-)
+
+commit ca539e37a4b71e585a267a288db1a3975cbb99fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 15:37:18 2016 +0900
+
+    [build] git.mk fix for m4/gtk-doc.m4
+
+ Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 54788cb1ecc5a5ffd63d07cd1f0b07b2afa9a8ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 15:32:52 2016 +0900
+
+    [win32] Install git.mk
+
+ win32/Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 9a13ed453ef96822a47d6e6f58332b87f38d5c59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 11:44:45 2016 +0900
+
+    Make FixedVersion a template
+
+ src/hb-open-file-private.hh          | 4 ++--
+ src/hb-open-type-private.hh          | 9 +++++----
+ src/hb-ot-head-table.hh              | 4 ++--
+ src/hb-ot-hhea-table.hh              | 2 +-
+ src/hb-ot-layout-gdef-table.hh       | 2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ src/hb-ot-layout-jstf-table.hh       | 2 +-
+ src/hb-ot-maxp-table.hh              | 2 +-
+ 8 files changed, 14 insertions(+), 13 deletions(-)
+
+commit 238b943e850ea1ab0093e12c74d2cd7c686f318e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 15:31:22 2016 +0900
+
+    [coretext] Fix leak!
+
+ src/hb-coretext.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit e561122856a50ed405d71cb1629317e7ae63f316
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 15:28:37 2016 +0900
+
+    [coretext] Move code around
+
+ src/hb-coretext.cc | 109
+ ++++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 62 insertions(+), 47 deletions(-)
+
+commit 04c64431530a4a6d9ebd33674c4665a8e6d25bdd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 15:12:27 2016 +0900
+
+    [coretext] Ignore PPEM in font size selection
+
+ src/hb-coretext.cc | 14 ++++----------
+ 1 file changed, 4 insertions(+), 10 deletions(-)
+
+commit 62c2711121fe78f373c15c0f53090b62b52d11c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 15:07:20 2016 +0900
+
+    [coretext] Limit grapheme-cluster forming to cluster-level=0
+
+ src/hb-coretext.cc | 1 +
+ src/hb-ot-shape.cc | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 061105ec443eb7350ffe217305f9d8902c179e2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 14:59:39 2016 +0900
+
+    [coretext] Fix shaping with varying font size
+
+    Fixes https://github.com/libass/libass/issues/212
+
+ src/hb-coretext.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 27847cab1264b4ce8342603f4626b4e0645979e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 19 15:56:50 2016 +0700
+
+    1.2.0
+
+ NEWS         | 20 ++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 21 insertions(+), 1 deletion(-)
+
+commit c3731559042e1730e85d19574321ad850010f7de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 19 15:13:07 2016 +0700
+
+    [fuzzing] Add test for recent fix
+
+    Test from https://github.com/behdad/harfbuzz/issues/223
+
+    I forgot that we do run hb-fuzzer on tests in
+    shaping/tests/fuzzed.tests.
+
+ .../sha1sum/205edd09bd3d141cc9580f650109556cc28b22cb.ttf | Bin 0 ->
+ 1966 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   1 +
+ test/shaping/tests/fuzzed.tests                          |   1 +
+ 3 files changed, 2 insertions(+)
+
+commit aa33cb72ab29c31e87f0cca9a0e72fe3a68247b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 19 15:12:24 2016 +0700
+
+    [fuzzing] Make test runner actually work
+
+ test/fuzzing/Makefile.am | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 2735555c6b0c95db7dfc2b391f92a1a5c06084c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 19 15:12:16 2016 +0700
+
+    [fuzzing] Add TODO item
+
+ test/fuzzing/hb-fuzzer.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b87e36f6f119fac80b8fd55f3abae563c2c5b798
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 19 14:52:31 2016 +0700
+
+    Avoid buffer->move_to() in case of buffer error
+
+    Fixes https://github.com/behdad/harfbuzz/issues/223
+
+    Right now we cannot test this because it has to be tested using
+    hb-fuzzer.
+    We should move all fuzzing tests from test/shaping/tests/fuzzed.tests
+    to
+    test/fuzzing/ and have its own test runner.  At that point, should add
+    test from this issue as well.
+
+ src/hb-buffer.cc                     | 2 ++
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 7e76bbabbaa56af314abff8ddba8866c634919cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 19 14:43:39 2016 +0700
+
+    [fuzzing] Make "make hb-fuzzer" build lib dependency
+
+    Not going to do with util/, but is convenient here.
+
+ test/fuzzing/Makefile.am | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 568a0c60e8695a6ad8a93ec60d55b137c48890cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 18 19:31:51 2016 +0700
+
+    Remove pointless overflow check in pointer math
+
+    Fixes https://github.com/behdad/harfbuzz/issues/227
+
+ src/hb-blob.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit aae2847099cbf05bf0668fbe526fc58736837c1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 18 17:06:25 2016 +0700
+
+    Emoji skin tone modifiers need to be treated as combining marks
+
+    Fixes https://github.com/behdad/harfbuzz/issues/169
+
+ src/hb-ot-layout-private.hh | 15 ++++++++++++++-
+ src/hb-unicode-private.hh   |  5 +++--
+ 2 files changed, 17 insertions(+), 3 deletions(-)
+
+commit da41e48f0a1a6af6d44ef25185d2421a29bd4166
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 16 17:16:33 2016 +0700
+
+    [USE] Zero mark advances by GDEF early
+
+    This is what Microsoft's implementation does.  Marks that need advance
+    need to add it back using 'dist' or other feature in GPOS.
+    Update tests to
+    match.
+
+ src/hb-ot-shape-complex-use.cc                           |   2 +-
+ test/shaping/fonts/sha1sum/MANIFEST                      |   1 +
+ .../sha1sum/f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf | Bin 0 ->
+ 1356 bytes
+ test/shaping/tests/context-matching.tests                |   2 +-
+ test/shaping/tests/use.tests                             |   2 ++
+ 5 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 86c68c7a2c971efe8e35b1f1bd99401dc8b688d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 16 16:07:20 2016 +0700
+
+    [GPOS] Fix interaction of mark attachments and cursive chaining
+
+    Fixes https://github.com/behdad/harfbuzz/issues/211
+
+    What happens in that bug is that a mark is attached to base first,
+    then a second mark is cursive-chained to the first mark.  This only
+    "works" because it's in the Indic shaper where mark advances are
+    not zeroed.
+
+    Before, we didn't allow cursive to run on marks at all.  Fix that.
+    We also where updating mark major offsets at the end of GPOS, such
+    that changes in advance of base will not change the mark attachment
+    position.  That was superior to the alternative (which is what
+    Uniscribe
+    does BTW), but made it hard to apply cursive to the mark after it
+    was positioned.  We could track major-direction offset changes and
+    apply that to cursive in the post process, but that's a much trickier
+    thing to do than the fix here, which is to immediately apply the
+    major-direction advance-width offsets...  Ie.:
+
+    https://github.com/behdad/harfbuzz/issues/211#issuecomment-183194739
+
+    If this breaks any fonts, the font should be fixed to do mark
+    attachment
+    after all the advances are set up first (kerning, etc).
+
+    Finally, this, still doesn't make us match Uniscribe, for I explained
+    in that bug.  Looks like Uniscribe applies minor-direction cursive
+    adjustment immediate as well.  We don't, and we like it our way, at
+    least for now.  Eg. the sequence in the test case does this:
+
+    - The first subscript attaches with mark-to-base, moving in x only,
+    - The second subscript attaches with cursive attachment to first
+    subscript
+      moving in x only,
+    - A final context rule moves the first subscript up by 104 units.
+
+    The way we do, the final shift-up, also shifts up the second subscript
+    mark because it's cursively-attached.  Uniscribe doesn't.  We get:
+
+    [ttaorya=0+1307|casubscriptorya=0@-242,104+-231|casubscriptnarroworya=0@20,104+507]
+
+    while Uniscribe gets:
+
+    [ttaorya=0+1307|casubscriptorya=0@-242,104+-211|casubscriptnarroworya=0+487]
+
+    note the different y-offset of the last glyph.  In our view,
+    after cursive,
+    things move together, period.
+
+ src/hb-ot-layout-gpos-table.hh                     |  31
+ +++++++++++----------
+ .../706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf   | Bin 0 -> 3868 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                |   1 +
+ test/shaping/tests/cursive-positioning.tests       |   1 +
+ 4 files changed, 18 insertions(+), 15 deletions(-)
+
+commit 80c8855cfeffa028d74a25df884d0e5577c95c6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 12 12:50:17 2016 +0700
+
+    Minor
+
+ src/hb-common.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6ab920224c32e38072a0bec5e84d4b0d58b74167
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 16:57:52 2016 +0700
+
+    [GPOS] Minor
+
+    No effect.
+
+ src/hb-ot-layout-gpos-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit cbc3a76c5a38ab24f72e80357377711bd3f54d56
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 16:48:13 2016 +0700
+
+    [GPOS] Merge fixing of offsets for cursive and mark attachments
+
+    Part of fixing https://github.com/behdad/harfbuzz/issues/211
+
+ src/hb-buffer-private.hh       |  3 +-
+ src/hb-ot-layout-gpos-table.hh | 73
+ ++++++++++++++++++------------------------
+ 2 files changed, 33 insertions(+), 43 deletions(-)
+
+commit 7d8d58ac81fe267e29ea68cdc6f4a4fa8c22d40f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 16:34:28 2016 +0700
+
+    [GPOS] Divide position_finish() into two phases, for advances
+    and offsets
+
+    Right now the position_finish_advances() is empty.  To be used for
+    spacing attachments proposal later.
+
+ src/hb-ot-layout-gpos-table.hh | 11 +++++++++--
+ src/hb-ot-layout-gsub-table.hh |  6 ------
+ src/hb-ot-layout-private.hh    | 19 +++++++++----------
+ src/hb-ot-layout.cc            | 16 ++++++++--------
+ src/hb-ot-shape.cc             |  7 +++----
+ 5 files changed, 29 insertions(+), 30 deletions(-)
+
+commit 8474231567a08873cc5e0aa08fea60316a04c27e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 16:27:41 2016 +0700
+
+    [ot] Minor shuffling code around
+
+ src/hb-ot-layout-gpos-table.hh |  2 --
+ src/hb-ot-shape.cc             | 13 ++++++++-----
+ 2 files changed, 8 insertions(+), 7 deletions(-)
+
+commit b0b11614e9fb9ecd1faae28b0ed71ac6bf5c1266
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 15:28:55 2016 +0700
+
+    [GPOS] Add harmless recursion in fix_mark_attachment()
+
+    Will do nothing.  Just useful for merging two functions.
+
+ src/hb-ot-layout-gpos-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 686567baab5a32ffea843538643e01de2885fa4f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 15:25:28 2016 +0700
+
+    [GPOS] Merge attach_chain() and cursive_chain()
+
+    Differentiate, using new attach_type().
+
+ src/hb-ot-layout-gpos-table.hh | 50
+ +++++++++++++++++++++++++++---------------
+ 1 file changed, 32 insertions(+), 18 deletions(-)
+
+commit 806ad8dc65931ab7893bff7d5592a67a9bd237ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 14:53:11 2016 +0700
+
+    [GPOS] Minor shuffling
+
+ src/hb-ot-layout-gpos-table.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 0f6278d1fbb75856132f1fa2d29648979f033316
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 14:49:10 2016 +0700
+
+    [GPOS] Negate sign of attach_lookback(), and rename it to
+    attach_chain()
+
+    No behavior change.  Preparing to unify how cursive and mark
+    attachments
+    work.
+
+ src/hb-ot-layout-gpos-table.hh | 17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
+
+commit 5b5dc2c0406d8180e72d97a54334c722fda325b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 12:15:38 2016 +0700
+
+    [tests] Add test for advance zeroing of an ASCII letter marked as
+    mark in GDEF
+
+ test/shaping/fonts/sha1sum/MANIFEST                      |   1 +
+ .../sha1sum/a98e908e2ed21b22228ea59ebcc0f05034c86f2e.ttf | Bin 0 ->
+ 1016 bytes
+ test/shaping/tests/zero-width-marks.tests                |   1 +
+ 3 files changed, 2 insertions(+)
+
+commit 660c9d3fc21172e8dc340b017122c084dac6334c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 12:14:27 2016 +0700
+
+    Remove font-dependent ASCII-only perf hack
+
+    Is confusing.  I already hit it myself.  Remove.  We can optimize
+    ASCII based on Unicode properties.  But should not do based on
+    assumptions on the font.
+
+ src/hb-ot-shape.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 3fe0cf10401875f1e9b8b5fbaf59826e64ea61d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 10 18:43:43 2016 +0700
+
+    Fix previous commit!
+
+ test/shaping/fonts/sha1sum/MANIFEST       | 6 +++---
+ test/shaping/tests/zero-width-marks.tests | 6 +++---
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 293a210eee0a53b59f4b33298f42ec6e59d785e0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 10 18:39:59 2016 +0700
+
+    [tests] Fix fonts in cc4a78bf22c4a735b84c89b04be3bb531f42135e
+
+    They had an invalid LookupFlag (32).
+
+ .../sha1sum/0dd3a51c3ea50997cb1f72515d1060408f8b4b59.ttf | Bin 1412 ->
+ 0 bytes
+ .../sha1sum/56cfd0e18d07f41c38e9598545a6d369127fc6f9.ttf | Bin 0 ->
+ 1412 bytes
+ .../sha1sum/828114d00931885bc25abf7cdb878b2914a2e743.ttf | Bin 1448 ->
+ 0 bytes
+ .../sha1sum/894e96a367f00c196d82e6243673a1d4414f4f6a.ttf | Bin 1448 ->
+ 0 bytes
+ .../sha1sum/cc5f3d2d717fb6bd4dfae1c16d48a2cb8e12233b.ttf | Bin 0 ->
+ 1448 bytes
+ .../sha1sum/ffa0f5d2d9025486d8469d8b1fdd983e7632499b.ttf | Bin 0 ->
+ 1448 bytes
+ 6 files changed, 0 insertions(+), 0 deletions(-)
+
+commit eaadcbbc53e02838c847e53ef214a55d6915d677
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 10 18:29:54 2016 +0700
+
+    Remove now-unused mark zeroing BY_UNICODE
+
+ src/hb-ot-shape-complex-private.hh |  2 --
+ src/hb-ot-shape.cc                 | 29 -----------------------------
+ 2 files changed, 31 deletions(-)
+
+commit cc4a78bf22c4a735b84c89b04be3bb531f42135e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 10 18:24:08 2016 +0700
+
+    [tests] Add tests for Latin mark zeroing
+
+ .../sha1sum/0dd3a51c3ea50997cb1f72515d1060408f8b4b59.ttf | Bin 0 ->
+ 1412 bytes
+ .../sha1sum/828114d00931885bc25abf7cdb878b2914a2e743.ttf | Bin 0 ->
+ 1448 bytes
+ .../sha1sum/894e96a367f00c196d82e6243673a1d4414f4f6a.ttf | Bin 0 ->
+ 1448 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   4 ++++
+ .../sha1sum/fcdcffbdf1c4c97c05308d7600e4c283eb47dbca.ttf | Bin 0 ->
+ 1344 bytes
+ test/shaping/tests/zero-width-marks.tests                |   4 ++++
+ 6 files changed, 8 insertions(+)
+
+commit 55ff34b9c157a839d026465af8f30424ce7f891b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 10 18:20:02 2016 +0700
+
+    [tests] Add tests for Thai mark zeroing
+
+ .../sha1sum/45855bc8d46332b39c4ab9e2ee1a26b1f896da6b.ttf | Bin 0 ->
+ 1088 bytes
+ .../sha1sum/7a37dc4d5bf018456aea291cee06daf004c0221c.ttf | Bin 0 ->
+ 1080 bytes
+ .../sha1sum/8099955657a54e9ee38a6ba1d6f950ce58e3cc25.ttf | Bin 0 ->
+ 1024 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   4 ++++
+ .../sha1sum/bb0c53752e85c3d28973ebc913287b8987d3dfe8.ttf | Bin 0 ->
+ 976 bytes
+ test/shaping/tests/zero-width-marks.tests                |   4 ++++
+ 6 files changed, 8 insertions(+)
+
+commit b3582a8ee82942a931130a83b2867b239f8ca71a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 10 18:10:15 2016 +0700
+
+    Change default mark advance zeroing behavior from Unicode to GDEF
+
+    See thread at:
+    https://lists.freedesktop.org/archives/harfbuzz/2016-February/005462.html
+
+ src/hb-ot-shape-complex-default.cc | 2 +-
+ src/hb-ot-shape-complex-thai.cc    | 2 +-
+ src/hb-ot-shape-complex-tibetan.cc | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 43bb2b8fb00705c3334730a58ade7984181018b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 10 14:11:43 2016 +0700
+
+    Minor
+
+ test/shaping/hb_test_tools.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bdaa784bb610ec65626d63cc068a0958ff5005fc
+Merge: a168db47 f6ffba63
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 10 11:11:36 2016 +0700
+
+    Merge pull request #164 from fanc999/msvc.build
+
+    Enable Build of HarfBuzz under Visual Studio using NMake Makefiles
+
+commit a168db4739148459bc33c7dae88e73efa0153d72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 10 11:10:08 2016 +0700
+
+    [README] Add ABI Tracker link
+
+ README | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f6ffba634bb33d6d4b051abce9c23fcae280c3fe
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Wed Dec 9 14:57:15 2015 +0800
+
+    MSVC builds: Add support to build DirectWrite shaping backend
+
+    Add into the NMake Makefiles to build the DirectWrite shaping backend,
+    but as PR #134 mentions, this is considered to be in an experimental
+    state,
+    so don't include this in the build by default for now.  This is
+    most probably
+    going to replace the Uniscribe backend eventually, since DirectWrite
+    is meant
+    to be Uniscribe's replacement, and is needed for Windows Store apps
+    if a
+    system shaping API is to be used.
+
+ win32/README.txt        |  4 ++++
+ win32/config-msvc.mak   | 10 ++++++++++
+ win32/config.h.win32.in |  3 +++
+ win32/info-msvc.mak     |  7 +++++++
+ 4 files changed, 24 insertions(+)
+
+commit c6792854557ca104948e8f0b142c9384105b0d05
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Wed Feb 3 18:31:23 2016 +0800
+
+    build: Build the DirectWrite sources if requested
+
+    This adds to the autotools build system so that the (experimental)
+    DirectWrite support for HarfBuzz is built (and dist'ed).
+
+ configure.ac         | 25 +++++++++++++++++++++++++
+ src/Makefile.am      |  7 +++++++
+ src/Makefile.sources |  3 +++
+ 3 files changed, 35 insertions(+)
+
+commit d7b6636e5ebf1ddf7d7a04007ffbc411cf7e462e
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Tue Nov 3 19:00:42 2015 +0800
+
+    build: Support Visual Studio builds using NMake
+
+    This adds a set of NMake Makefiles that can be used to build
+    HarfBuzz, from
+    the standard basic build building the minimal HarfBuzz DLL (consisting
+    of OpenType, fallback and Uniscribe support only), to a full
+    fledged build
+    consisting of GLib and FreeType support, as well as building the
+    utilities,
+    the test programs in src/ and test/api, and HarfBuzz-ICU and
+    HarfBuzz-GObject, and up to building the introspection files.
+    This means a
+    flexible build mechanism is supported here, so anything that is
+    supported
+    for a Windows build (code-wise), should all be supported by this build
+    system.
+
+    As in an earlier commit, the source listings are shared with the
+    autotools
+    builds with the various Makefile.sources in src/, src/hb-ucdn and
+    util/, and
+    this set of NMake Makefiles will transform these lists into the
+    form they
+    want.
+
+    In the current form, all the test programs in test/api pass, and
+    this has
+    been checked successfully with 'make -j8 distcheck'.
+
+ BUILD.md                        |   4 +-
+ Makefile.am                     |   2 +-
+ configure.ac                    |   2 +
+ win32/Makefile.am               |  14 +++
+ win32/Makefile.vc               |  52 +++++++++++
+ win32/README.txt                |  75 ++++++++++++++++
+ win32/build-rules-msvc.mak      | 140 ++++++++++++++++++++++++++++++
+ win32/config-msvc.mak           | 188
+ ++++++++++++++++++++++++++++++++++++++++
+ win32/create-lists-msvc.mak     | 151 ++++++++++++++++++++++++++++++++
+ win32/create-lists.bat          |  42 +++++++++
+ win32/detectenv-msvc.mak        | 136 +++++++++++++++++++++++++++++
+ win32/generate-msvc.mak         |  26 ++++++
+ win32/hb-introspection-msvc.mak |  42 +++++++++
+ win32/info-msvc.mak             | 130 +++++++++++++++++++++++++++
+ win32/install.mak               |  29 +++++++
+ win32/introspection-msvc.mak    |  73 ++++++++++++++++
+ 16 files changed, 1104 insertions(+), 2 deletions(-)
+
+commit 5c3e7260bcb4999b8b7cb9afb26e6eaff867634b
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Tue Nov 3 18:52:46 2015 +0800
+
+    MSVC builds: Add a pre-configured config.h(.win32) template
+
+    This adds a pre-configured config.h template that can be used
+    for Visual
+    Studio builds, where autotools is not normally available.  This has
+    the
+    configs that are suitable for Visual Studio builds, as well as all the
+    features used for Windows builds enabled (HAVE_OT, HAVE_FALLBACK and
+    HAVE_UNISCRIBE).
+
+    Note that the optional features are not enabled here, they are
+    enabled by
+    /D's (or -D's) in the NMake Makefiles as requested.
+
+ win32/config.h.win32.in | 155
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 155 insertions(+)
+
+commit 35ded3af74a5bc4b038a07308354d5f7501ae3c7
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Tue Nov 3 16:56:27 2015 +0800
+
+    build: Move source listings into separate Makefile snippets
+
+    This moves all the source listings in src/Makefile.am,
+    src/hb-ucdn/Makefile.am and util/Makefile.am into separate Makefile
+    snippets, so that they may be shared between different Makefile-based
+    build systems, such as NMake for Visual Studio.
+
+ src/Makefile.am              | 165
+ +++++++++----------------------------------
+ src/Makefile.sources         | 147 ++++++++++++++++++++++++++++++++++++++
+ src/hb-ucdn/Makefile.am      |   6 +-
+ src/hb-ucdn/Makefile.sources |   4 ++
+ util/Makefile.am             |  34 ++-------
+ util/Makefile.sources        |  32 +++++++++
+ 6 files changed, 223 insertions(+), 165 deletions(-)
+
+commit b894a85ad1e7c3ecfb6d3732a7c9779f5462fe70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 2 16:39:19 2016 +0800
+
+    Fix more hangs in case of buffer allocation errors
+
+    Hopefully
+    fixes https://github.com/behdad/harfbuzz/issues/214
+
+ src/hb-ot-shape-complex-indic.cc   | 2 +-
+ src/hb-ot-shape-complex-myanmar.cc | 2 +-
+ src/hb-ot-shape-complex-use.cc     | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit b693992ea160b66541f678dc9be29b513c77a30b
+Merge: 9a6a33cc 498574e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 2 12:33:32 2016 +0800
+
+    Merge pull request #222 from n8willis/master
+
+    Add usermanual chapter on cluster levels
+
+commit 498574e6c1a83bbd2768925af6e39806fe1ea8bb
+Author: n8willis <nwillis@glyphography.com>
+Date:   Thu Jan 28 12:21:32 2016 -0600
+
+    Update Makefile.am
+
+ docs/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit e12fc666994573dbabb6928a8b2e8698667088ce
+Author: n8willis <nwillis@glyphography.com>
+Date:   Thu Jan 28 12:14:12 2016 -0600
+
+    Added initial usermanual chapter on cluster levels.
+
+ docs/harfbuzz-docs.xml       |   1 +
+ docs/usermanual-clusters.xml | 304
+ +++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 305 insertions(+)
+
+commit 9a6a33ccbea8a2e23e779bd955958fa41974c1c7
+Merge: d05b7833 146fe252
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 18 12:47:18 2016 +0100
+
+    Merge pull request #216 from mhosken/master
+
+    Refactor graphite2 to make ovleraps into negative width spaces
+
+commit 146fe252c3ebd0253344ce20981554e40926497b
+Author: Martin Hosken <martin_hosken@sil.org>
+Date:   Sat Jan 16 17:24:00 2016 -0600
+
+    Refactor graphite2 to make ovleraps into negative width spaces
+
+ src/hb-graphite2.cc | 71
+ ++++++++++++++++++++++++++++++++---------------------
+ 1 file changed, 43 insertions(+), 28 deletions(-)
+
+commit d05b783322d90208b2ddf06a5ebffc7c301be3d7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 12 16:17:21 2016 +0000
+
+    Fix compiler warning
+
+    Fixes https://github.com/behdad/harfbuzz/issues/212
+
+ src/hb-ot-tag.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d163dc18e66c9e2f404d09310482464245cae704
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 12 13:05:01 2016 +0000
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 30 +++++++++++++++---------------
+ 1 file changed, 15 insertions(+), 15 deletions(-)
+
+commit 505b7d4732c6a8c423f43c0de46e05dc583e82c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 11 18:31:04 2016 +0000
+
+    [fuzzing] Fuzz input text
+
+    Very rudimentary right now, but will get kcc's bot going.
+
+    From
+    https://github.com/behdad/harfbuzz/issues/139#issuecomment-163580783
+
+ test/fuzzing/hb-fuzzer.cc | 25 +++++++++++++++++++------
+ 1 file changed, 19 insertions(+), 6 deletions(-)
+
+commit 3e704521f67e021fb51cda7319925fd39eba4f97
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 11 17:38:41 2016 +0000
+
+    [OT] Get list of lookup subtables once and loop through them
+
+    This speeds up shaping the Amiri font by over 15%.
+
+    This was primarily needed for my work on OpenType GX, since
+    we will be collecting only sublookups that are "active" for
+    current font instance; but it's a nice boost in general as
+    well.
+
+    We might, in the future, collect subtables in the lookup_accel.
+    That would also allow us to do a per-subtbale set-digest, which
+    should speed things up some more, specially for ContextChainFormat3
+    lookups...  Amiri, for example, contains one lookup with 53
+    subtables!
+
+ src/hb-ot-layout.cc | 120
+ +++++++++++++++++++++++++++++++++++-----------------
+ 1 file changed, 81 insertions(+), 39 deletions(-)
+
+commit 11441291bbf4326dca9b14ec3e9cad3d4d229303
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 11 13:16:35 2016 +0000
+
+    1.1.3
+
+ NEWS         | 29 +++++++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 30 insertions(+), 1 deletion(-)
+
+commit 97624d9244de0fdb9c03f60e03fe242028efa8a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 11 12:58:45 2016 +0000
+
+    [docs] Minor fixes.
+
+ src/hb-buffer.h | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit a39ff95fce39226e80850ff251cb34a7aad12bd7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 11 12:28:37 2016 +0000
+
+    [coretext] Speed up CoreText font fallback
+
+    Fixes https://code.google.com/p/chromium/issues/detail?id=547912
+
+ src/hb-coretext.cc | 45 ++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 40 insertions(+), 5 deletions(-)
+
+commit 5afebbdcb2dab0e9a42d580df629d8e60b50d2f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 7 22:53:59 2016 +0000
+
+    Add Homebrew build instructions
+
+ BUILD.md | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit e8a27d79476a5d7a83cf2287d92ca291257546f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 7 22:52:16 2016 +0000
+
+    Don't build hb-fuzzer in "make", only "make check"
+
+ test/fuzzing/Makefile.am | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 25671466d245449187f8ab17e1a233f1d087d5ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 7 19:11:41 2016 +0000
+
+    Add 9 reserved entries to hb_font_extents_t
+
+    Might add italic-angle, underline/strikethrough-position/thickness
+    in the future.  Do this before new struct goes into a release.
+
+ src/hb-font.h | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit e6d5e4c3106180cb22253c2c278b40f7c4c98f2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 6 12:29:50 2016 +0000
+
+    [uniscribe] Fix negative advance
+
+    This happens with at least one test font I have.
+
+ src/hb-uniscribe.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 99d34955762d0fff4b66a30e6fbe65fd1cf9976b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 6 12:20:47 2016 +0000
+
+    [test] Add test text for Kaithi
+
+ test/shaping/texts/in-tree/shaper-hangul/MANIFEST            | 1 +
+ test/shaping/texts/in-tree/shaper-hebrew/MANIFEST            | 1 +
+ test/shaping/texts/in-tree/shaper-tibetan/MANIFEST           | 1 +
+ test/shaping/texts/in-tree/shaper-use/MANIFEST               | 1 +
+ test/shaping/texts/in-tree/shaper-use/script-kaithi/MANIFEST | 1 +
+ test/shaping/texts/in-tree/shaper-use/script-kaithi/misc.txt | 6 ++++++
+ 6 files changed, 11 insertions(+)
+
+commit 53c47c85827a7e3ca82000e3baa9aa87c5770ce9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 5 13:26:20 2016 +0000
+
+    Increase sanitize edit count from 8 to 32
+
+    See previous commit.
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit da2fcfdc51a2cc0d0a782efa6c91b733f7aa84ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 5 13:23:45 2016 +0000
+
+    Don't count fixing-up FeatureParams offset as error
+
+    The font Garamond Premier Pro Caption (and possibly many other
+    Adobe fonts), have many FeatureParamsSize tables with the old
+    wrong offset.  We handle fixing those up, but they were still
+    contributing to edit_count, and when I reduced HB_SANITIZE_MAX_EDIT
+    from 100 to 8 in 14c2de321826c36037adde859ccca3e2011325a9, these
+    fonts were now getting GPOS dropped and hence kerning disabled.
+
+    Fix, by not counting edits made towareds offset fix-up.  I'll
+    also increase edit count again, in the next commit.
+
+ src/hb-ot-layout-common-private.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit d0adc80965506810820f9ec165b8df80cc8907e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 2 13:25:18 2016 +0000
+
+    Check magicNumber in head table during sanitize
+
+ src/hb-ot-head-table.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 3a48c776701a919e11b067129586e40372d90d54
+Merge: 9230911f 4b4948d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 2 00:59:14 2016 +0000
+
+    Merge pull request #208 from khaledhosny/travis-trusty
+
+    [travis] Try building on Trusty
+
+commit 4b4948d360a2141e0ffda2994aa308645dc32f59
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Jan 2 00:36:19 2016 +0400
+
+    [travis] Try building on Trusty
+
+    Trusty has gtk-doc 1.20 which has better markdown support which should
+    fix some of the brokenness in the newly added documentation. The build
+    seems to be as fast as the current container-based build on Precise.
+
+ .travis.yml | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 9230911facf90c06626e54023ca4d99f5e05f1a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 1 19:06:43 2016 +0000
+
+    [travis] Only run coveralls if testing behdad/harfbuzz
+
+    Fixes failures in others' forks, like:
+    https://travis-ci.org/khaledhosny/harfbuzz/jobs/99719710#L3912
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6f66f05757d3d5738571b3d4ee40afffb8f26ff9
+Merge: bfdf684f 9ab9f974
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 1 16:44:01 2016 +0000
+
+    Merge pull request #207 from khaledhosny/docs-4
+
+    [docs] More buffers documentation
+
+commit 9ab9f974d42e0001966e243a23a64e6aefbd4764
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Jan 1 20:38:21 2016 +0400
+
+    [docs] More buffers documentation
+
+ docs/harfbuzz-sections.txt |  4 +-
+ src/hb-buffer-serialize.cc | 85
+ ++++++++++++++++++++++++++++++-------------
+ src/hb-buffer.cc           | 91
+ +++++++++++++++++++++++++++++++++++-----------
+ src/hb-buffer.h            | 78 +++++++++++++++++++++++++--------------
+ src/hb-shape.cc            | 10 +++--
+ 5 files changed, 187 insertions(+), 81 deletions(-)
+
+commit bfdf684f7957645dd016fbf76700c5911c4bee2d
+Merge: d7ed6f50 85c2443b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 30 22:20:14 2015 +0100
+
+    Merge pull request #205 from khaledhosny/more-docs
+
+    More docs
+
+commit d7ed6f50b4ff13a94701131913d931f13a4d1266
+Merge: b758e5ea a7f0e25d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 30 22:20:00 2015 +0100
+
+    Merge pull request #206 from nico/patch-3
+
+    Remove unused HB_SHAPER_DATA_ENSURE_DECLARE lines.
+
+commit a7f0e25dafa90bd21b01c38cb0782ade54b75cdc
+Author: Nico Weber <nicolasweber@gmx.de>
+Date:   Wed Dec 30 16:05:52 2015 -0500
+
+    Remove unused HB_SHAPER_DATA_ENSURE_DECLARE lines.
+
+    The coretext_aat shaper delegates to the regular coretext_..._ensure()
+    functions, so coretext_aat_..._ensure() functions defined by these
+    macros are unused. The compiler warns about them, which in turn can
+    confuse people to think that the coretext_aat_..._ensure() functions
+    weren't called by accident.
+
+ src/hb-coretext.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 85c2443b737335b77c7e9bb6fd6741912f70fcef
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Dec 30 22:57:04 2015 +0400
+
+    [docs] Reduce gtkdoc-check errors
+
+    Now it is just reporting one error about “503 undocumented or
+    incomplete
+    symbols”, that will be the easy part I guess.
+
+ docs/harfbuzz-docs.xml     | 74
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ docs/harfbuzz-sections.txt | 40 +++++++++++++++++++++++++
+ 2 files changed, 114 insertions(+)
+
+commit 9cffe329f15b3a74a3af4e68c1884f1dbda49666
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Dec 30 22:50:08 2015 +0400
+
+    [docs] Typo
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b758e5ea223eced0fde9a3e62d0fdf04c04914a1
+Merge: 266bfa37 8b1224f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 30 16:44:19 2015 +0100
+
+    Merge pull request #203 from nico/patch-1
+
+    Remove unused `retry:` label.
+
+commit 266bfa3772e75fedcd93db22bf8672a13ad7a7d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 30 16:25:48 2015 +0100
+
+    [docs] Minor
+
+ .ci/deploy-docs.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d08035f8f15b7ddd89a318ea34bc386a9e33a8ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 30 16:15:36 2015 +0100
+
+    [docs] Fix up build, really
+
+ .ci/deploy-docs.sh | 9 ++++-----
+ .travis.yml        | 2 +-
+ 2 files changed, 5 insertions(+), 6 deletions(-)
+
+commit 0d45c3cf63692151166ca7071f755dfaa8922a67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 30 16:09:39 2015 +0100
+
+    [docs] Turn bash tracing on
+
+ .ci/deploy-docs.sh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 33b2d981a0b12ea165ef9282204a73f4a1ce0477
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 30 15:56:56 2015 +0100
+
+    [docs] Another try, not sure why the bot isn't building
+
+ .ci/deploy-docs.sh | 13 ++++---------
+ 1 file changed, 4 insertions(+), 9 deletions(-)
+
+commit f3a051149b3b565b5ad4e489bf730c5203c3549e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 30 15:45:43 2015 +0100
+
+    [docs] Shuffling code around in deploy-docs.sh
+
+    Temporarily makes it rebuild docs on every change again.
+
+ .ci/deploy-docs.sh | 46 +++++++++++++++++++++++++++-------------------
+ 1 file changed, 27 insertions(+), 19 deletions(-)
+
+commit 8f31d0a94b27bb658aabe600472fc10bc47885f6
+Merge: 9d280cf4 fb192c26
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 30 15:13:37 2015 +0100
+
+    Merge pull request #202 from khaledhosny/doc-fixes
+
+    Doc fixes
+
+commit fb192c263e17081c87f4cc971274d9be42f19513
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Dec 30 15:05:50 2015 +0400
+
+    [docs] A bit more buffers documentation
+
+ docs/harfbuzz-sections.txt |  2 ++
+ src/hb-buffer.cc           |  7 +++---
+ src/hb-buffer.h            | 56
+ ++++++++++++++++++++++++++++++++++++++++++++--
+ 3 files changed, 60 insertions(+), 5 deletions(-)
+
+commit 8ab797c5b86c33eab6ee024471fd3c147325d26a
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Dec 29 17:42:16 2015 +0400
+
+    [docs] A bit more buffers documentation
+
+ docs/harfbuzz-sections.txt | 60 +++++++++++++++---------------
+ src/hb-buffer.cc           | 93
+ +++++++++++++++++++++++++++++++---------------
+ src/hb-buffer.h            |  7 +++-
+ src/hb-common.cc           | 43 +++++++++++++--------
+ src/hb-common.h            | 15 +++++---
+ 5 files changed, 135 insertions(+), 83 deletions(-)
+
+commit f18d2226b62f20d29e6299c01ae8467c725ea971
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Dec 29 15:21:20 2015 +0400
+
+    [docs] Some documentation on buffers
+
+    Some of it (create, reference, destroy) are adapted from Cairo docs.
+
+ docs/harfbuzz-sections.txt |  55 +++++++-------
+ src/hb-buffer.cc           | 174
+ +++++++++++++++++++++++++++------------------
+ 2 files changed, 132 insertions(+), 97 deletions(-)
+
+commit d7bf9d05c519a369a7b3a02e9ed5ecc05a20cd3e
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Dec 29 02:23:24 2015 +0400
+
+    [docs] Fix comment syntax
+
+    To lower the number of gtk-doc warnings.
+
+ .travis.yml           |  2 +-
+ src/hb-directwrite.cc |  4 ++--
+ src/hb-ot-layout.cc   | 14 ++++++++++++++
+ src/hb-unicode.h      | 16 ++++++++++++++++
+ 4 files changed, 33 insertions(+), 3 deletions(-)
+
+commit 8b1224f0eece7a5b6846e206333e57ac4653a705
+Author: Nico Weber <nicolasweber@gmx.de>
+Date:   Mon Dec 28 21:31:28 2015 -0500
+
+    Remove unused `retry:` label.
+
+    Fixes a -Wunused-label warning when building harfbuzz with clang
+    -Wall.
+
+ src/hb-coretext.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 1f5559293f9bb1b4e911f4bdecf276ff1f6ae01c
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Dec 29 02:15:21 2015 +0400
+
+    [docs] Ignore the new HB_EXTERN decoration
+
+    Otherwise, almost all API functions are not extracted.
+
+ docs/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 9d280cf49f25181f64c978752f926b79e7c3746a
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Dec 26 06:45:51 2015 +0400
+
+    Fix previous commit
+
+ .ci/deploy-docs.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b789199f107912cfce5e4a95d6152f9a1a7993f2
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Dec 26 06:35:08 2015 +0400
+
+    [travis] Build docs only on tagged revisions
+
+    Lets see if it works…
+
+ .ci/deploy-docs.sh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit e5b90c08a4c1f475560209a5e47628f695606d89
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 25 18:41:41 2015 +0100
+
+    [travis] Remove secure var
+
+    I've set up a secure var for behdad/harfbuzz through Travis web
+    interface, no need
+    to set the var here.
+
+ .ci/deploy-docs.sh | 2 +-
+ .travis.yml        | 1 -
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit e75c1ffdf548185ce1f1df7937f0d028e5e40efe
+Merge: 6173c2a6 d25317f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 25 18:21:08 2015 +0100
+
+    Merge pull request #199 from behdad/travis-docs
+
+    Deploy docs to gh-pages branch from Travis builds
+
+commit 6173c2a6fc6ea0bf812f7f398770b5342974f9bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 25 18:18:23 2015 +0100
+
+    Fix flaky test
+
+    This test font had a upem of 769, which results in rounding-related
+    errors with
+    the FreeType font funcs.  Change the upem to 1024 to fix that.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/201
+
+ ...> 1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf} | Bin 4064 ->
+ 4064 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                |   2 +-
+ test/shaping/tests/ligature-id.tests               |  70
+ ++++++++++-----------
+ 3 files changed, 36 insertions(+), 36 deletions(-)
+
+commit 3fcae6d82da389c9944386a8ab41eb1c13b99330
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 25 18:18:02 2015 +0100
+
+    [tests] Add --reference, for re-recording tests
+
+ test/shaping/run-tests.sh | 18 ++++++++++++++----
+ 1 file changed, 14 insertions(+), 4 deletions(-)
+
+commit d25317f67f3c5c77f9059961935b0f35cbaa9ac4
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Dec 23 01:29:48 2015 +0400
+
+    Move more docs from FreeDesktop page
+
+ docs/Makefile.am                     |  1 +
+ docs/harfbuzz-docs.xml               | 15 ++++----
+ docs/usermanual-install-harfbuzz.xml | 70
+ ++++++++++++++++++++++++++++++++++++
+ 3 files changed, 80 insertions(+), 6 deletions(-)
+
+commit 493a92220844c8996be67c8a7a2c5447942fe2c1
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Dec 23 00:33:41 2015 +0400
+
+    Rename user manual files
+
+    Use chapter ids instead of numbers, so that we can reorder them,
+    introduce new ones etc. without the numbers becoming out of date.
+
+ docs/Makefile.am                                             | 12
+ ++++++------
+ docs/harfbuzz-docs.xml                                       | 12
+ ++++++------
+ ... => usermanual-buffers-language-script-and-direction.xml} |  0
+ docs/{usermanual-ch04.xml => usermanual-fonts-and-faces.xml} |  0
+ ...{usermanual-ch06.xml => usermanual-glyph-information.xml} |  0
+ docs/{usermanual-ch02.xml => usermanual-hello-harfbuzz.xml}  |  0
+ ...{usermanual-ch05.xml => usermanual-opentype-features.xml} |  0
+ .../{usermanual-ch01.xml => usermanual-what-is-harfbuzz.xml} |  0
+ 8 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 4dc2265918089ee08c6d82eed0cfd41e02d7d231
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Dec 23 00:26:20 2015 +0400
+
+    Intro from freedesktop.org/wiki/Software/HarfBuzz/
+
+ docs/HarfBuzz.png      | Bin 0 -> 3419 bytes
+ docs/Makefile.am       |   3 ++-
+ docs/harfbuzz-docs.xml |  31 ++++++++++++++++++++++++++++++-
+ 3 files changed, 32 insertions(+), 2 deletions(-)
+
+commit 22b07782ced6503a0bf33f2fe157b70540238f6d
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Dec 14 23:33:51 2015 +0400
+
+    Deploy docs to gh-pages branch from Travis builds
+
+    Build docs in Travis and push them to the gh-pages branch, which makes
+    them available at http://behdad.github.io/harfbuzz/
+
+ .ci/deploy-docs.sh | 25 +++++++++++++++++++++++++
+ .travis.yml        |  4 ++++
+ 2 files changed, 29 insertions(+)
+
+commit fc38e6034c76d5450f5398d667184bc3696efcc4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 23 14:50:53 2015 +0100
+
+    [layout] Collect coverage glyphs in PairPos
+
+    Apparently class=0 is used for ClassDef1.  See:
+    https://github.com/adobe-type-tools/afdko/issues/90
+
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8718dae818b22c3933c33bdfc8a7413ef4c3110a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 18 19:53:40 2015 +0000
+
+    [python] Hook up sample debugger
+
+ src/sample.py | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 0475ef2f97e3035a2eea9a0f96031331e07e8e29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 18 18:17:07 2015 +0000
+
+    [buffer] Add debugging, aka, message, API
+
+    Currently just announces lookup applications.  Message-API *will*
+    change.
+    hb-shape / hb-view are updated to print-out messages to stder
+    if --debug
+    is specified.
+
+ src/hb-buffer-private.hh | 18 ++++++++++++++++++
+ src/hb-buffer.cc         | 44
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.h          | 15 +++++++++++++++
+ src/hb-ot-layout.cc      | 12 ++----------
+ util/main-font-text.hh   | 18 ++++++++++++++++++
+ 5 files changed, 97 insertions(+), 10 deletions(-)
+
+commit 9ea0aa43ac5cf243b698aae0ec80241b5efd7488
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 18 17:30:18 2015 +0000
+
+    Don't deserialize positions if buffer has no positions
+
+ src/hb-buffer-serialize.cc | 3 +++
+ src/hb-ot-layout.cc        | 2 --
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 862b1644e9469a7e70555141f53729409d50d0d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 18 13:54:06 2015 +0000
+
+    [use] Only set syllable-based topographical features if not
+    Arabic-joining
+
+ src/hb-ot-shape-complex-use.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 45b7ec365225109eb0854e6c417f48860b5f24af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 18 13:47:16 2015 +0000
+
+    [indic] Followup fix for Malayalam context matching
+
+    We regeressed Malayalam in 508cc3d3cfcfb0383df0fe795cc28db4e0fd5729
+    This brings down the failures to 198 (from 750).
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366349 out of 366457 tests passed. 108 failed (0.0294714%)
+    GURMUKHI: 60732 out of 60747 tests passed. 15 failed (0.0246926%)
+    KANNADA: 951190 out of 951913 tests passed. 723 failed (0.0759523%)
+    KHMER: 299070 out of 299124 tests passed. 54 failed (0.0180527%)
+    MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed
+    (0.0188871%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%)
+    TAMIL: 1091753 out of 1091754 tests passed. 1 failed (9.15957e-05%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+    MYANMAR: 1123865 out of 1123883 tests passed. 18 failed (0.00160159%)
+
+ src/hb-ot-shape-complex-indic.cc | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+commit 2813e3049a69d64e5395f68c52c4690e1d256d55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 18 11:05:11 2015 +0000
+
+    [indic] Update data tables to Unicode 8.0
+
+    Test stats remain unchanged, except for Malayalam, which we
+    investigate:
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366349 out of 366457 tests passed. 108 failed (0.0294714%)
+    GURMUKHI: 60732 out of 60747 tests passed. 15 failed (0.0246926%)
+    KANNADA: 951190 out of 951913 tests passed. 723 failed (0.0759523%)
+    KHMER: 299070 out of 299124 tests passed. 54 failed (0.0180527%)
+    MALAYALAM: 1047584 out of 1048334 tests passed. 750 failed
+    (0.0715421%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%)
+    TAMIL: 1091753 out of 1091754 tests passed. 1 failed (9.15957e-05%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+    Myanmar, compared to Windows 10 mmrtext.ttf:
+
+    MYANMAR: 1123865 out of 1123883 tests passed. 18 failed (0.00160159%)
+
+ src/gen-indic-table.py                   |   1 +
+ src/hb-ot-shape-complex-indic-private.hh |  40 ++--
+ src/hb-ot-shape-complex-indic-table.cc   | 372
+ ++++++++++++++++++-------------
+ src/hb-ot-shape-complex-indic.cc         |  23 +-
+ src/hb-ot-shape-complex-myanmar.cc       |   4 +
+ 5 files changed, 244 insertions(+), 196 deletions(-)
+
+commit fc06cff40f136440f6402d0a5e735e2a4a3c062a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 17 17:47:35 2015 +0000
+
+    Remove HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT
+
+    The DEFAULT naming wasn't helpful, so just remove it.
+
+ src/hb-ot-shape-complex-default.cc | 2 +-
+ src/hb-ot-shape-complex-private.hh | 4 +---
+ src/hb-ot-shape-complex-thai.cc    | 2 +-
+ src/hb-ot-shape-complex-tibetan.cc | 2 +-
+ 4 files changed, 4 insertions(+), 6 deletions(-)
+
+commit 508cc3d3cfcfb0383df0fe795cc28db4e0fd5729
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 17 17:31:17 2015 +0000
+
+    [indic] Allow context when matching for Malayalam new-spec
+
+    Test sequence:
+            U+0995,U+09CD,U+09B0
+
+    With Nirmala shipped on Windows 10, this failed to form the below
+    form.
+    Works now.
+
+    Reported by Sairus.
+
+ src/hb-ot-shape-complex-indic.cc | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit eaf1e93ef1ee19a3e72d781e8abbd7f1165c1618
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 17 16:57:47 2015 +0000
+
+    [uniscribe] Handle E_NOT_SUFFICIENT_BUFFER as well as E_OUTOFMEMORY
+
+    On Windows 10 we are seeing that other error message...
+
+    Test sequence: U+0995,U+-9CD,U+09B0
+    With Nirmala shipped on Windows 10, this failed to form the below
+    form.
+    Works now.
+
+    Reported by Sairus.
+
+ src/hb-uniscribe.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 21e5d7edc4f28157254ef29a8ac247f3a572f6a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 17 16:28:38 2015 +0000
+
+    [util] Use O_BINARY instead of _O_BINARY
+
+    The latter doesn't seem to be available in Cygwin.  I'm surprised it
+    compiled before...
+
+ util/options.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 100fbeaf196515774c985ee839d0fa0695f9a6fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 17 15:23:09 2015 +0000
+
+    Fix ligature component of a mark happening after a ligature within
+    a ligature!
+
+    Say, if we are ligating "A B_C m D", then previously 'm' was being
+    attached to 'B' in the combined A_B_C_D ligature.  Now we attach it
+    to 'C'.  No test for this though :(.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2f02fc79a5018e3348fccf366c470803554e1e58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 17 15:21:14 2015 +0000
+
+    Improve ligature-component handling
+
+    We use three bits for lig_id these days, so we finally got a report of
+    two separate ligatures with the same lig_id happening adjacent to each
+    other, and then the component-handling code was breaking things.
+    Protect against that by ignoring same-lig-id but lig-comp=0 glyphs
+    after
+    a new ligature.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/198
+
+ src/hb-ot-layout-gsubgpos-private.hh               |  12 +++++--
+ test/shaping/Makefile.am                           |   1 +
+ test/shaping/fonts/sha1sum/MANIFEST                |   1 +
+ .../c78d1f25ea1df1210414f2fe2e0e1e53082bba76.ttf   | Bin 0 -> 4064 bytes
+ test/shaping/tests/MANIFEST                        |   1 +
+ test/shaping/tests/ligature-id.tests               |  35
+ +++++++++++++++++++++
+ 6 files changed, 47 insertions(+), 3 deletions(-)
+
+commit 2ab0de9fbd03231b647345b01e31b136e2e00978
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 17 11:59:15 2015 +0000
+
+    [use] Fix halant detection
+
+    Before, we were just checking the use_category().  This detects as
+    halant a ligature that had the halant as first glyph (as seen in
+    NotoSansBalinese.)  Change that to use the is_ligated() glyph prop
+    bit.  The font is forming this ligature in ccmp, which is before
+    the rphf / pref tests.  So we need to make sure the "ligated" bit
+    survives those tests.  Since those only check the "substituted" bit,
+    we now only clear that bit for them and "ligated" survives.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/180
+
+ src/hb-ot-layout-private.hh                          |   6 ++----
+ src/hb-ot-shape-complex-use.cc                       |  19
+ ++++++++++++-------
+ test/shaping/Makefile.am                             |   1 +
+ test/shaping/fonts/sha1sum/MANIFEST                  |   1 +
+ .../fbb6c84c9e1fe0c39e152fbe845e51fd81f6748e.ttf     | Bin 0 ->
+ 2616 bytes
+ test/shaping/tests/MANIFEST                          |   1 +
+ test/shaping/tests/use.tests                         |   1 +
+ 7 files changed, 18 insertions(+), 11 deletions(-)
+
+commit 86bcbd65b0d98357fb3d67a2f4f2a704ace55e10
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 17 11:04:33 2015 +0000
+
+    [arabic] Use glyph advance width in apply_stch() instead of extents
+
+    That seems to be what Windows is doing, and makes more sense.
+
+ src/hb-ot-shape-complex-arabic.cc | 24 +++++++-----------------
+ 1 file changed, 7 insertions(+), 17 deletions(-)
+
+commit f11c11a1f123ef245e59ba892230db14170a8e5a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 16 17:08:36 2015 +0100
+
+    Fix Since: tags for new API
+
+    https://github.com/behdad/harfbuzz/commit/e1d4d0f1dbd8518b5672245c05d73f22a9ed03ea#commitcomment-15006653
+
+ src/hb-font.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 15f2c055c17c54b0a6ae6eef50dcda13c58cda75
+Merge: 49e72634 a13b023d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 14 14:19:03 2015 +0100
+
+    Merge pull request #196 from srl295/aix
+
+    AIX fixes
+
+commit a13b023dbfd0532e8cd74c356fbbd4453d0ffaa0
+Author: Steven R. Loomis <srloomis@us.ibm.com>
+Date:   Fri Dec 11 10:21:27 2015 -0800
+
+    AIX fixes
+
+    - use '-w' instead of '\<...\>' for check-header-guards
+      grep manpage says these are the same
+
+    - put '-q' first in the grep options
+
+    - move VAR into hb-private.hh
+
+    - hb-font-private.hh - use [VAR] instead of [] for variable array
+
+ src/check-header-guards.sh  | 5 ++---
+ src/hb-font-private.hh      | 2 +-
+ src/hb-open-type-private.hh | 3 ---
+ src/hb-private.hh           | 2 ++
+ 4 files changed, 5 insertions(+), 7 deletions(-)
+
+commit 49e72634af74a9fbad01f42f48e104218413acc0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 10 17:44:19 2015 +0100
+
+    Limit use of AIX intrinsics to IBM's compiler
+
+ src/hb-atomic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e1d4d0f1dbd8518b5672245c05d73f22a9ed03ea
+Merge: 70b33eda 808d3fc0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 10 16:56:07 2015 +0100
+
+    Merge branch 'font-extents'
+
+    Fixes https://github.com/behdad/harfbuzz/pull/165
+
+commit 808d3fc0eadd379909f2a0308fd3db474f1efde8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 10 16:55:16 2015 +0100
+
+    [util] Port hb-view to use font metrics from HarfBuzz instead of cairo
+
+ util/helper-cairo.cc |  4 +++-
+ util/view-cairo.cc   | 24 ++++++++++++------------
+ 2 files changed, 15 insertions(+), 13 deletions(-)
+
+commit 31fa3892947138c7950303ea3719bb5ceb813625
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 10 16:38:29 2015 +0100
+
+    [ft] Use ftface->size->metrics for font extent info
+
+ src/hb-ft.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 3ad16048fdd841f31f1cb98d7ff9ea1871841146
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 10 16:37:49 2015 +0100
+
+    [ot-font] Respect OS/2 fsSelection USE_TYPO_METRICS bit
+
+ src/hb-ot-font.cc | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 70b33edae7c8b9c031b83c95f00cb383789f1041
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 10 15:54:42 2015 +0100
+
+    Add atomic ops for AIX
+
+    Patch from Volker Simonis.
+
+ src/hb-atomic-private.hh | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+commit 98460779bae19e4d64d29461ff154b3527bf8420
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 7 21:38:47 2015 +0100
+
+    Remove final pause from Arabic shaper
+
+    Back in the old days, we used to apply 'calt' and 'cswh' in Arabic
+    shaper,
+    with a pause in between.  Then we disabled the 'cswh' because
+    Microsoft
+    disabled it, but forgot to remove the unnecessary pause.  Do that now.
+
+    This has the benefit that it fixes shaping with monbaiti from
+    Windows 10.
+    In that version of that font, the lookups from 'calt' are duplicated
+    in
+    'rclt', and Mongolian was changed to go through Universal Shaping
+    Engine.
+    We still use the Arabic shaper for Mongolian.  With a pause after
+    'calt',
+    we were applying the duplicate lookups from 'calt' and 'rclt' twice.
+    It
+    happened to be the case that these lookups were NOT idempotent.  So we
+    were getting wrong shaping.  See thread "Windows 10 monbaiti.ttf
+    upgrade
+    (5.01 -> 5.51) caused loss of diacritical marks when shaped with
+    harfbuz"
+    on the mailing list.  This fixes that.
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dee0fbf9e2eac8b61730efc4978bc10c552b5227
+Merge: 255df680 a7ffe353
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 7 10:44:08 2015 +0100
+
+    Merge pull request #192 from behdad/jfkthame-stch
+
+    [issue 191] Make apply_stch() give a more precise fit
+
+commit 255df6801201fb22402420f7b7b7ea8b042df8ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 7 10:34:47 2015 +0100
+
+    Fix undefined behavior in cmp function
+
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=93274
+
+ src/hb-ot-map-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit fcf9e61bad13c828b5482f26491c82db65d91c96
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 7 10:30:43 2015 +0100
+
+    Fix sorting order of ot_languages array
+
+    Looks like the original sort was wrongly done.
+    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=93275
+
+ src/hb-ot-tag.cc | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 70952ddb5a29c5bcbb4b6c3a05a428496033234a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 7 10:28:46 2015 +0100
+
+    Add test to make sure ot-languages array is sorted
+
+    Currently fails.  Part of
+    https://bugs.freedesktop.org/show_bug.cgi?id=93275
+
+ src/Makefile.am  |  9 ++++++++-
+ src/hb-ot-tag.cc | 23 +++++++++++++++++++++++
+ 2 files changed, 31 insertions(+), 1 deletion(-)
+
+commit 8c37556f730d7e961394075cd863f624af4c53c4
+Merge: 8e5f9026 f35b3e93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 7 09:34:58 2015 +0100
+
+    Merge pull request #134 from ebraminio/dwrite
+
+    Add working but less prefect DirectWrite backend
+
+commit a7ffe3535836032dba5559080dffeec79473197b
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Sat Dec 5 17:47:37 2015 +0000
+
+    Make apply_stch() give a more precise fit
+
+    This aims to make Syriac Abbr Mark sizing more accurate when repeating
+    segments are used, by adding an extra repeat and tightening up the
+    spacing slightly rather than leaving a shortfall corresponding to
+    a partial repeat-width.
+
+ src/hb-ot-shape-complex-arabic.cc | 15 ++++++++++++++-
+ 1 file changed, 14 insertions(+), 1 deletion(-)
+
+commit 8e5f902656d2882d24c30e8b26ddbd3963baa55c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 30 16:53:21 2015 -0800
+
+    src/test.cc: wrong field printed
+
+    Fixes https://github.com/behdad/harfbuzz/issues/188
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=93182
+
+ src/test.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6f2e6de1fae0ab2269b472a750788817de6c2a6e
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Mon Oct 26 16:23:22 2015 +0900
+
+    Get font ascender and descender metrics from OS/2 table.
+
+ src/hb-font-private.hh |  39 ++++++++++++++++++-
+ src/hb-font.cc         | 102
+ ++++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-font.h          |  62 ++++++++++++++++++++++++++++--
+ src/hb-ft.cc           |  21 ++++++++++
+ src/hb-ot-font.cc      |  58 ++++++++++++++++++++++++++--
+ 5 files changed, 274 insertions(+), 8 deletions(-)
+
+commit 097c998a0c7b250924801bb69f5fa0c529edd183
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Mon Oct 26 16:22:38 2015 +0900
+
+    Parse the OS/2 table.
+
+ src/Makefile.am        |   1 +
+ src/hb-ot-os2-table.hh | 105
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 106 insertions(+)
+
+commit d44d52bd0da033865641dfd39d94852119fd4fd7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 26 19:35:43 2015 -0500
+
+    1.1.2
+
+ NEWS         | 15 +++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 16 insertions(+), 1 deletion(-)
+
+commit 35d18585fc57750d817f57bfffe569069f9803b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 26 19:30:37 2015 -0500
+
+    Fix a few docs blocks
+
+ src/hb-buffer.cc    | 4 ++++
+ src/hb-glib.cc      | 2 ++
+ src/hb-ot-font.cc   | 2 ++
+ src/hb-ot-layout.cc | 6 ++++++
+ src/hb-ot-shape.cc  | 4 ++++
+ 5 files changed, 18 insertions(+)
+
+commit 0e38c918b66df31978d8fd3d8271a9b781384545
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 26 19:26:26 2015 -0500
+
+    [introspection] Make scanner happy with HB_EXTERN
+
+ src/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit ea512f71084296be3bd893f78650def894066de0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 26 19:22:22 2015 -0500
+
+    Use C-style casts instead of compare to 0, to convert hb_bool_t
+    to bool
+
+ src/hb-common.cc                  | 2 +-
+ src/hb-fallback-shape.cc          | 2 +-
+ src/hb-font-private.hh            | 2 +-
+ src/hb-ot-layout.cc               | 2 +-
+ src/hb-ot-map.cc                  | 2 +-
+ src/hb-ot-shape-complex-hangul.cc | 2 +-
+ src/hb-ot-shape-complex-hebrew.cc | 2 +-
+ src/hb-ot-shape-complex-indic.cc  | 4 ++--
+ src/hb-ot-shape-normalize.cc      | 6 +++---
+ src/hb-ot-shape.cc                | 2 +-
+ 10 files changed, 13 insertions(+), 13 deletions(-)
+
+commit 67a36a725e2a61a096ba0324f359d17f9b02d312
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 26 18:48:42 2015 -0500
+
+    Fix vertical GPOS
+
+    This was brorken earlier, though, it's really hard to notice it.
+    Unlike the glyph_h_origin(), an unset glyph_v_origin() does NOT
+    mean that the vertical origin is at 0,0.
+
+    Related to https://github.com/behdad/harfbuzz/issues/187
+
+ src/hb-ot-shape.cc | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+commit 1c6a057dd1a52511474630896a597bf8e5215214
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 26 18:48:30 2015 -0500
+
+    Add tests for previous commit
+
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf | Bin 0 ->
+ 1496 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   1 +
+ test/shaping/tests/MANIFEST                              |   1 +
+ test/shaping/tests/simple.tests                          |   2 ++
+ 5 files changed, 5 insertions(+)
+
+commit c41c145c7386ebe72b1cfb0475d836a689fecc5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 26 18:43:15 2015 -0500
+
+    Make nil glyph_h_origin() function return true
+
+    Fixes https://github.com/behdad/harfbuzz/issues/187
+
+    Funcs implementations that have a non-zero horizontal origin must
+    implement the glyph_h_origin() callback, nothing new here.
+
+    Other implementations (all I know of!) can simply not set
+    glyph_h_origin() now.  I did that for hb-ot and hb-ft in
+    44f82750807475aa5b16099ccccd917d488df703, though that broke the
+    fallback shaper because the default was returning false...
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 766963adba6770dcd45de4417481ed8eda60a716
+Merge: b344af80 f798b8e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 24 15:38:43 2015 -0600
+
+    Merge pull request #114 from ThePhD/vc++-fixes
+
+    Fix all VC++ warnings and errors
+
+commit b344af80ca95b9eddfd6017aa6ae103388d6b5f8
+Merge: 662acd26 835bbdc7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 24 15:30:27 2015 -0600
+
+    Merge pull request #177 from fanc999/exporting
+
+    Enable use of compiler directives to export symbols
+
+commit 662acd26d10c38e96a9afcdaab2cb2979794966f
+Merge: b24e93e3 1979f6fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 24 15:29:44 2015 -0600
+
+    Merge pull request #181 from mhosken/master
+
+    Fix y_scale problems in hb-gr
+
+commit b24e93e3a4d98111c4684fa08e9080b471881d5c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 24 13:18:20 2015 -0600
+
+    1.1.1
+
+ NEWS         | 7 +++++++
+ configure.ac | 2 +-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit 233944ac91bb81250c0e63150eecfedfaf09f590
+Merge: 5a24b1d2 d5382019
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Nov 24 18:37:35 2015 +0400
+
+    Merge pull request #185 from khaledhosny/travis-osx
+
+    [travis] Enable Mac OS X support
+
+commit d538201918e6932ef7645f8d5b2c3491954936f8
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Nov 24 12:46:35 2015 +0400
+
+    [travis] Enable Mac OS X support
+
+    Fixes https://github.com/behdad/harfbuzz/issues/182
+
+ .travis.yml | 22 ++++++++++++++++------
+ 1 file changed, 16 insertions(+), 6 deletions(-)
+
+commit 5a24b1d25c59865e298bf105f54503e79587265c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 23 16:46:14 2015 -0600
+
+    [travis] Remove coverity scan
+
+    I never could get it to work, and it's a proprietary platform.
+
+ .travis.yml | 11 -----------
+ README      |  1 -
+ 2 files changed, 12 deletions(-)
+
+commit 1979f6fedca82fa1e4f65491de491db1aa6dc645
+Author: Martin Hosken <martin_hosken@sil.org>
+Date:   Mon Nov 23 10:03:56 2015 +0700
+
+    Fix y_scale problems in hb-gr
+
+ src/hb-graphite2.cc | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 835bbdc7c92bd774ff92c42a9277ded72066d29d
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Thu Nov 19 18:34:12 2015 +0800
+
+    Public headers: Decorate public symbols with HB_EXTERN
+
+    This prepares the headers for exporting symbols using visibility
+    attributes or __declspec(dllexport), so that we do not need to
+    maintain
+    symbols listing files, as this is what was and is done in GLib
+    and GTK+.
+
+ src/hb-blob.h               |  24 +++++-----
+ src/hb-buffer.h             | 100 +++++++++++++++++++-------------------
+ src/hb-common.h             |  22 ++++-----
+ src/hb-coretext.h           |   6 +--
+ src/hb-face.h               |  34 ++++++-------
+ src/hb-font.h               | 114
+ ++++++++++++++++++++++----------------------
+ src/hb-ft.h                 |  18 +++----
+ src/hb-glib.h               |   8 ++--
+ src/hb-gobject-enums.h.tmpl |   2 +-
+ src/hb-gobject-structs.h    |  26 +++++-----
+ src/hb-graphite2.h          |   4 +-
+ src/hb-icu.h                |   6 +--
+ src/hb-ot-font.h            |   2 +-
+ src/hb-ot-layout.h          |  56 +++++++++++-----------
+ src/hb-ot-shape.h           |   4 +-
+ src/hb-ot-tag.h             |   8 ++--
+ src/hb-set.h                |  52 ++++++++++----------
+ src/hb-shape-plan.h         |  18 +++----
+ src/hb-shape.h              |  10 ++--
+ src/hb-unicode.h            |  52 ++++++++++----------
+ src/hb-uniscribe.h          |   4 +-
+ src/hb-version.h.in         |   6 +--
+ src/hb.h                    |   4 ++
+ 23 files changed, 292 insertions(+), 288 deletions(-)
+
+commit f798b8e2d683a1b89b6905b1a8615375b847b468
+Author: ThePhD <phdofthehouse@gmail.com>
+Date:   Sat Nov 21 16:57:26 2015 -0500
+
+    c-style cast
+
+ src/hb-ot-shape-complex-use.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a6991813659376a6a11c00a9f67d85b4f7ba9b5d
+Merge: 1dc32ea4 f19c6db1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 20 13:28:42 2015 -0800
+
+    Merge pull request #176 from behdad/missing-braces
+
+    Add braces for subobject initializer in _hb_font_funcs_nil
+
+commit 1dc32ea4d2f294f9d1ae1c8fd19fb75f9278223b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 20 13:24:19 2015 -0800
+
+    Whitespace
+
+ src/hb-private.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit f94c0ecbb1488138d3ec3b9d6d9fb78113dfee4f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 20 13:21:29 2015 -0800
+
+    Define HB_MARK_AS_FLAG_T as a macro instead of using templates
+
+    The generic template operator overloading was causing more problems
+    than it
+    solved.  Eg:
+
+    https://github.com/behdad/harfbuzz/pull/163
+    https://github.com/behdad/harfbuzz/issues/175
+
+    So, just use macros.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/175
+    Fixes https://github.com/behdad/harfbuzz/pull/178
+
+ src/hb-private.hh | 27 +++++++++++----------------
+ 1 file changed, 11 insertions(+), 16 deletions(-)
+
+commit f19c6db18e2e2dd0e9a406fc7e8533049fab48b0
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Fri Nov 20 08:43:49 2015 +0000
+
+    Add braces for subobject initializer in _hb_font_funcs_nil
+
+    To avoid triggering -Wmissing-braces; see
+    https://bugzilla.mozilla.org/show_bug.cgi?id=1226175#c8
+
+ src/hb-font.cc | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 9cc1ed4fa68075b3b142a2737438109772dd0002
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 19 12:39:09 2015 -0800
+
+    Do not allow recursiving to same position and same lookup
+
+    This is just to make it harder to be extremely slow.  There definitely
+    are ways still, just harder.  Oh well... how do we tame this problem
+    without solving halting problem?!
+
+    Fixes https://github.com/behdad/harfbuzz/issues/174
+
+ src/hb-ot-layout-gsubgpos-private.hh                     |   5 +++++
+ test/shaping/fonts/sha1sum/MANIFEST                      |   1 +
+ .../sha1sum/fab39d60d758cb586db5a504f218442cd1395725.ttf | Bin 0 ->
+ 1894 bytes
+ test/shaping/tests/fuzzed.tests                          |   1 +
+ 4 files changed, 7 insertions(+)
+
+commit 7d75eee799bbb5ee7eef2651cf7b7d3aee6f09b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 19 12:03:04 2015 -0800
+
+    [fuzzing] Run fuzzing tests using hb-fuzzer as well
+
+ test/fuzzing/Makefile.am | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 13188cba7f0eaacd587beeb1c2258526ae24c438
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 19 11:59:03 2015 -0800
+
+    Revert "Fix hang in OOM situations"
+
+    This reverts commit f0599db761d7fc2d585d86e757a797f75ebc7499.
+
+    Commit abadc1717d997b69f987fdf1be9e12156d2d13d6 provides a better
+    fix for this.
+
+ src/hb-buffer-private.hh | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit 18e1c6b6ef7c85a1b02e3dae86280d8ed6b65118
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 19 11:50:58 2015 -0800
+
+    Revert "Make sure we make progress in OOM situations"
+
+    This reverts commit 68b507a3c3c62c28c38e13fee733702bb703b6ca.
+
+    Commit abadc1717d997b69f987fdf1be9e12156d2d13d6 provides a better
+    fix for this.
+
+ src/hb-buffer-private.hh |  7 +++++--
+ src/hb-buffer.cc         | 31 ++++++++-----------------------
+ 2 files changed, 13 insertions(+), 25 deletions(-)
+
+commit e1118aeac3b5556df0ce502732df8ac92bdac45a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 18 23:40:47 2015 -0800
+
+    1.1.0
+
+ NEWS         | 22 ++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 23 insertions(+), 1 deletion(-)
+
+commit 63fe05c8b1cd4f08b525028409e1299f34750810
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 18 23:52:34 2015 -0800
+
+    Fix make distcheck
+
+ src/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 9b087dec7753ad96d256ce1b9ae347bd8d697c75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 18 23:23:35 2015 -0800
+
+    [travis] Only coverity-scan the coverity_scan branch
+
+    This essentially disables coverity-scan right now, until we find
+    a pattern to continuously submit branches there.
+
+    For background reasoning, see:
+    Fixes https://github.com/behdad/harfbuzz/issues/171
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 85062e3b4655ec6d5c3cf5344ce22cd88c21a2aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 18 23:09:13 2015 -0800
+
+    Add tests for previous two commits
+
+    To fully test what these are supposed to test, they should be run
+    against libharfbuzz-fuzzing.la instead of libharfbuzz.la, but for
+    now just record the files.
+
+ .../sha1sum/43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf | Bin 0 ->
+ 1804 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   2 ++
+ .../sha1sum/b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf | Bin 0 ->
+ 1804 bytes
+ test/shaping/tests/fuzzed.tests                          |   2 ++
+ 4 files changed, 4 insertions(+)
+
+commit 37b40cd8a18e25d3324f829acec197f016f4a524
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 18 23:04:45 2015 -0800
+
+    Fix another move_to assertion failure
+
+    If buf->idx is at end, don't set end past it...
+
+    Fixes https://github.com/behdad/harfbuzz/issues/173
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit abadc1717d997b69f987fdf1be9e12156d2d13d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 18 17:52:08 2015 -0800
+
+    Try to better handle OOM situations
+
+    Fixes assert fail in https://github.com/behdad/harfbuzz/issues/161
+    with libharfbuzz-fuzzing.
+
+ src/hb-ot-layout-gsubgpos-private.hh |  2 +-
+ src/hb-ot-layout.cc                  |  2 +-
+ src/hb-ot-shape-complex-hangul.cc    |  2 +-
+ src/hb-ot-shape-complex-indic.cc     |  2 +-
+ src/hb-ot-shape-complex-thai.cc      |  2 +-
+ src/hb-ot-shape-complex-use.cc       |  8 +-------
+ src/hb-ot-shape-normalize.cc         | 10 +++++-----
+ src/hb-ot-shape.cc                   |  2 +-
+ 8 files changed, 12 insertions(+), 18 deletions(-)
+
+commit ec625f7dfb5f6df19d35d81af6605d05e08321f2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 18 16:37:59 2015 -0800
+
+    Try to fix gnome-continuous build fail
+
+ test/fuzzing/Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ff16ef3379e06afe44b5e78b8893aeae0cee2b5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 18 16:27:32 2015 -0800
+
+    Enable building a bounded version of the library for fuzzing
+
+    test/fuzzing/hb-fuzzer links against libharfbuzz-fuzzing.so now.
+
+ src/Makefile.am          | 16 ++++++++++++++++
+ test/fuzzing/Makefile.am |  9 ++-------
+ test/fuzzing/README      |  6 ++----
+ 3 files changed, 20 insertions(+), 11 deletions(-)
+
+commit e0082ae60dbd87d433f3b2b9d2bfa64b9a4c3663
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 17 18:42:13 2015 -0800
+
+    Move things around
+
+ src/hb-private.hh | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit dde8cc87bd880bd35baf764820f4c85bd0a58696
+Merge: e97835ad 167c3271
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 17 18:40:10 2015 -0800
+
+    Merge pull request #163 from fanc999/msvc.src
+
+    Update the sources so they will compile under Visual Studio
+
+commit 167c3271778cd1a8c4433b9d2230901ce17c099e
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Mon Nov 9 17:17:56 2015 +0800
+
+    Fix build on MSVC >= 2012
+
+    Use the DEFINE_ENUM_FLAG_OPERATORS macro in winnt.h on Visual Studio,
+    which defines the bitwise operators for the enumerations that we
+    want to
+    mark as hb_mark_as_flags_t, which will take care of the situation
+    on newer
+    Visual Studio (>= 2012), where the build breaks with C2057 errors
+    as the
+    underlying types of the enumerations is not clear to the compiler
+    when we
+    do a bitwise op within the declaration of the enumerations themselves.
+
+    Also disable the C4200 (nonstandard extension used : zero-sized
+    array in
+    struct/union) and C4800 ('type' : forcing value to bool 'true' or
+    'false'
+    (performance warning)) warnings as the C4200 is the intended
+    scenario and
+    C4800 is harmless but is so far an unavoidable side effect of using
+    DEFINE_ENUM_FLAG_OPERATORS.
+
+ src/hb-buffer-private.hh           |  6 +++---
+ src/hb-ot-layout-common-private.hh |  2 +-
+ src/hb-ot-layout-private.hh        |  4 ++--
+ src/hb-ot-map-private.hh           |  2 +-
+ src/hb-private.hh                  | 11 +++++++++++
+ 5 files changed, 18 insertions(+), 7 deletions(-)
+
+commit 4d27bb87468a1b84387e7ce084e3d92c0fc8f065
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Fri Nov 6 14:28:30 2015 +0800
+
+    hb-ot-shape-complex-arabic.cc: Fix build on Visual Studio
+
+    Visual Studio does not like declaring a enum variable within a for
+    statement, so fix the build by declaring the enum before doing the for
+    loop.
+
+ src/hb-ot-shape-complex-arabic.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit a49e7b7e40127beba25f39ef3c10d7a77e2bb0f0
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Tue Nov 3 18:49:34 2015 +0800
+
+    MSVC builds: Add fallback implementation for pre-2013 MSVC
+
+    Pre-2013 MSVC does not have scalbn() and scalbnf(), which are used
+    in the
+    utility programs.  Add  fallback implementations for these, which
+    can be
+    used when necessary.
+
+ util/options.hh | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+commit 998e8dda938cfef0146f1bfc4e8973a0e12d7d35
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Mon Nov 2 16:55:29 2015 +0800
+
+    util: Fix build on Visual Studio
+
+    Use the fallback implementation for lround() only on pre-2013 Visual
+    Studio, and ensure we are clear about the types of the parameters for
+    lround() and scalbnf(), since Visual Studio can be quite picky on
+    ambiguous parameter types.  Also, use g_ascii_strcasecmp() rather than
+    strcasecmp() as we are already using GLib for this code and we are
+    assured that g_ascii_strcasemp() is available.
+
+    For scalbnf() on pre-2013 Visaul Studio, a fallback implementation is
+    needed, but use another forced-included header for those compilers,
+    which
+    will be added later.
+
+    Also use (char)27 on Visual Studio builds as '\e' is not a recognized
+    escape sequence, which will do the same thing.
+
+ util/ansi-print.cc   | 16 +++++++++-------
+ util/helper-cairo.cc | 20 ++++++++++----------
+ util/options.cc      |  2 +-
+ 3 files changed, 20 insertions(+), 18 deletions(-)
+
+commit e97835ad43f5c68e8cb29599246cae0f4461d663
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 10 11:37:01 2015 -0800
+
+    [util] Fix crash when --output-file is specified but not
+    --output-format
+
+ util/options.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit d5f0d7c9fb14255388ab616f56e178cb7ca10ec2
+Merge: 04ff23e7 529a9331
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 7 07:50:58 2015 -0800
+
+    Merge pull request #167 from KonstantinRitt/unicode_cp_opt
+
+    Micro optimizations to UTF-16 and UTF-32 codecs
+
+commit 04ff23e73d847ab3a5da0e9fac4fbca19aefd284
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 16:29:44 2015 -0800
+
+    [arabic] Improve stretch length calculation
+
+    Err on the side of being too short, than too wide.  Reduces chance
+    of overlaps with neighboring glyphs.
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 59821ab8b413df3a444c38b80582a5137e364a70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 16:27:44 2015 -0800
+
+    [arabic] Don't stretch over cased letters
+
+    Addresses
+    https://github.com/behdad/harfbuzz/commit/6e6f82b6f3dde0fc6c3c7d991d9ec6cfff57823d#commitcomment-14248516
+
+ src/hb-ot-shape-complex-arabic.cc                  | 24
+ +++++++++++++++++++++-
+ src/hb-unicode-private.hh                          | 20
+ ------------------
+ .../script-syriac/misc/abbreviation-mark.txt       |  4 ++--
+ 3 files changed, 25 insertions(+), 23 deletions(-)
+
+commit 5337db29af39084d677a63154f404eca0c20cfeb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 16:18:09 2015 -0800
+
+    Revert "Don't process lookups if buffer is in error"
+
+    This reverts commit f92bd86cc8c11d262d1830c631cb7c63fc9d4bc8.
+
+    We don't want to be like cairo, where as soon as there's an error,
+    nothing works anymore.  So, lets process lookups as long as there's
+    no new memory needed.  That's also a model that hides fewer bugs.
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 529a93312815dff3c2f37f880bf6ccb428bd3da0
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Sat Nov 7 02:00:04 2015 +0400
+
+    Micro optimization to hb_utf16_t and hb_utf32_t ::prev()
+
+    Implement reverse lookup instead of re-using next()
+
+ src/hb-utf-private.hh | 29 +++++++++++++++++++----------
+ 1 file changed, 19 insertions(+), 10 deletions(-)
+
+commit 44ae9be7a29eebd6003cad2fdb90b40512a9c8eb
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Sat Nov 7 01:58:38 2015 +0400
+
+    Nano optimization to hb_utf16_t and hb_utf32_t ::next()
+
+ src/hb-utf-private.hh | 17 ++++++-----------
+ 1 file changed, 6 insertions(+), 11 deletions(-)
+
+commit a6d7668a954a763a053f8af8edbff4731aa43729
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 09:46:54 2015 -0800
+
+    [fuzzing] Cap max buffer len at 128
+
+ test/fuzzing/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f1c4adbcd3f6275e81e118ddadc9396f82daeccf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 09:46:05 2015 -0800
+
+    Fix typo
+
+ src/hb-buffer-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 68b507a3c3c62c28c38e13fee733702bb703b6ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 00:09:26 2015 -0800
+
+    Make sure we make progress in OOM situations
+
+ src/hb-buffer-private.hh |  7 ++-----
+ src/hb-buffer.cc         | 31 +++++++++++++++++++++++--------
+ 2 files changed, 25 insertions(+), 13 deletions(-)
+
+commit 5a7eb5d4d862f402136044c19ead87ad098bd78f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 00:01:24 2015 -0800
+
+    [fuzzing] Add test case for OOM
+
+    From https://github.com/behdad/harfbuzz/issues/161
+
+ .../sha1sum/3511ff5c1647150595846ac414c595cccac34f18.ttf | Bin 0 ->
+ 1483 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   2 +-
+ test/shaping/tests/fuzzed.tests                          |   1 +
+ 3 files changed, 2 insertions(+), 1 deletion(-)
+
+commit f0599db761d7fc2d585d86e757a797f75ebc7499
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 23:52:41 2015 -0800
+
+    Fix hang in OOM situations
+
+    Fixes https://github.com/behdad/harfbuzz/issues/161
+
+ src/hb-buffer-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit f92bd86cc8c11d262d1830c631cb7c63fc9d4bc8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 23:52:29 2015 -0800
+
+    Don't process lookups if buffer is in error
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4301703bddb63a01651a0d58474bb15ac0ebbcf6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 23:44:59 2015 -0800
+
+    Limit buffer max size growth
+
+    https://github.com/behdad/harfbuzz/issues/161
+
+ src/hb-buffer-private.hh | 11 +++++++++++
+ src/hb-buffer.cc         |  8 ++++++++
+ src/hb-ot-shape.cc       |  6 ++++++
+ test/fuzzing/Makefile.am |  2 ++
+ 4 files changed, 27 insertions(+)
+
+commit 19300183a6f0bac0d23f7a994b40a51e9c90d6e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 23:08:50 2015 -0800
+
+    [fuzzing] Add build system
+
+ configure.ac              |  1 +
+ test/Makefile.am          |  2 +-
+ test/fuzzing/Makefile.am  | 44
+ ++++++++++++++++++++++++++++++++++++++++++++
+ test/fuzzing/README       |  2 ++
+ test/fuzzing/hb-fuzzer.cc |  4 ++--
+ 5 files changed, 50 insertions(+), 3 deletions(-)
+
+commit 9c9ad214af43685b00f6d8493b7807d6607d4e2d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 22:50:52 2015 -0800
+
+    [fuzzer] Add README
+
+    https://github.com/behdad/harfbuzz/issues/139#issuecomment-154202645
+
+ test/fuzzing/README | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit 6e6f82b6f3dde0fc6c3c7d991d9ec6cfff57823d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 17:29:03 2015 -0800
+
+    Implement SYRIAC ABBREVIATION MARK with 'stch' feature
+
+    The feature is enabled for any character in the Arabic shaper.
+    We should experiment with using it for Arabic subtending marks.
+    Though, that has a directionality problem as well, since those
+    are used with digits...
+
+    Fixes https://github.com/behdad/harfbuzz/issues/141
+
+ src/hb-ot-shape-complex-arabic.cc                  | 219
+ ++++++++++++++++++++-
+ src/hb-unicode-private.hh                          |  19 ++
+ .../shaper-arabic/script-syriac/misc/MANIFEST      |   1 +
+ .../script-syriac/misc/abbreviation-mark.txt       |  11 ++
+ 4 files changed, 244 insertions(+), 6 deletions(-)
+
+commit c743ec5886a1f6d57de26da33a770a8706be83d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 17:33:57 2015 -0800
+
+    [ft] Fix extents with negative scales
+
+    Fixes https://github.com/behdad/harfbuzz/issues/162
+
+ src/hb-ft.cc | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 73fec3992acb492829bde1d885f1ebeed8dcc133
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 15:22:18 2015 -0800
+
+    Reserve a few scratch-flags bits for complex shapers
+
+ src/hb-buffer-private.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 136863371c1402769426d892aef1b92f9ca1a25e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 13:24:15 2015 -0800
+
+    Add new shaper method postprocess_glyphs()
+
+    Unused currently.  To be used for Syriac stretch implementation.
+
+    https://github.com/behdad/harfbuzz/issues/141
+
+ src/hb-ot-shape-complex-arabic.cc  | 3 ++-
+ src/hb-ot-shape-complex-default.cc | 1 +
+ src/hb-ot-shape-complex-hangul.cc  | 7 ++++---
+ src/hb-ot-shape-complex-hebrew.cc  | 1 +
+ src/hb-ot-shape-complex-indic.cc   | 1 +
+ src/hb-ot-shape-complex-myanmar.cc | 2 ++
+ src/hb-ot-shape-complex-private.hh | 9 +++++++++
+ src/hb-ot-shape-complex-thai.cc    | 1 +
+ src/hb-ot-shape-complex-tibetan.cc | 1 +
+ src/hb-ot-shape-complex-use.cc     | 1 +
+ src/hb-ot-shape.cc                 | 9 ++++++---
+ 11 files changed, 29 insertions(+), 7 deletions(-)
+
+commit 6c0ebd02c99e7536975ba7194832a1f33abd7faf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 11:37:48 2015 -0800
+
+    [util] If font has color, generate PNG with color
+
+ util/helper-cairo.cc | 33 ++++++++++++++++++++++++++-------
+ util/helper-cairo.hh |  6 +++++-
+ util/view-cairo.cc   |  7 ++++++-
+ 3 files changed, 37 insertions(+), 9 deletions(-)
+
+commit e95eb23a4ee920eab1e2f4eec9cf490bb431452c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 22:55:11 2015 -0800
+
+    Don't try zeroing marks by GDEF if there are no non-ASCII
+
+    This one is a hack, but should be ok.
+
+ src/hb-ot-shape.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 7fa54ed75aa30ae1d6ee9136ccb83b630c24fb65
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 22:54:49 2015 -0800
+
+    Don't try zeroing mark attachments by Unicode if there's no non-ASCII
+
+ src/hb-ot-shape.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 550bd14d2b21ec2a2b509ff42f4df4341dbf2d46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 22:58:58 2015 -0800
+
+    Actually commit changes for previous commit
+
+ src/hb-buffer-private.hh       |  2 ++
+ src/hb-ot-layout-gpos-table.hh | 15 ++++++++-------
+ 2 files changed, 10 insertions(+), 7 deletions(-)
+
+commit ff31b3c1b8a2a21b57dba37eb5bb5db0579e0640
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 22:42:41 2015 -0800
+
+    Skip GPOS cursive / attachment adjustmnent if none happened
+
+    I'm starting to really like how free these new scratch_flags are.
+
+ src/hb-ot-layout-gpos-table.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 0f407325f6923db11d332585e8250e3646cb74d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 22:28:44 2015 -0800
+
+    Minor
+
+ src/hb-ot-shape.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 497a6c2071cd0638e4c6af07621d01335fd963a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 22:24:19 2015 -0800
+
+    Skip forming clusters if text is all ASCII
+
+ src/hb-ot-shape.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 28de104f15b80df4b678267c4488b7d09a42720c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 22:00:25 2015 -0800
+
+    Move variable-sized struct member to end
+
+    Hopefully makes clang build happy
+
+ src/hb-font-private.hh | 21 ++++++++++-----------
+ src/hb-font.cc         | 20 ++++++++++++++++++++
+ 2 files changed, 30 insertions(+), 11 deletions(-)
+
+commit 5bc28b5f688ee90d103d052e98bc15d6e0e7e0b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 21:53:16 2015 -0800
+
+    Optimize positioning for when h_origin is nil
+
+ src/hb-ot-shape.cc | 38 ++++++++++++++++++++------------------
+ 1 file changed, 20 insertions(+), 18 deletions(-)
+
+commit 762770c964f9f0591bf4c44427f73ea3e1c51733
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 21:42:55 2015 -0800
+
+    Add font->has_...() to check for individual nil font funcs
+
+    Hopefully this wouldn't break any compiler.  There was some magic
+    moments to getting this to compile...
+
+ src/hb-font-private.hh | 19 +++++++++++++++++--
+ src/hb-font.cc         |  7 +++++++
+ 2 files changed, 24 insertions(+), 2 deletions(-)
+
+commit 88e9a9bcae61421d9dd65715d25e5f20b2847c03
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 21:16:26 2015 -0800
+
+    Minor reshaping of hb_font_funcs_t implementation
+
+    In anticipation of further changes.  No functional changes.
+
+ src/hb-font-private.hh | 80
+ ++++++++++++++++++++++++++------------------------
+ src/hb-font.cc         |  4 +--
+ 2 files changed, 43 insertions(+), 41 deletions(-)
+
+commit a6a7715bac8b0c8f5473b84bc649c315ad4d2d51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 20:51:21 2015 -0800
+
+    Comments
+
+ src/hb-font-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6c48ec830ffac00a920d047ed77acd1b05549074
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 20:47:42 2015 -0800
+
+    [ot] Remove font funcs that do nothing
+
+ src/hb-ot-font.cc | 95
+ ++++---------------------------------------------------
+ 1 file changed, 7 insertions(+), 88 deletions(-)
+
+commit 75ea2daa1d9bbe235cd4a8570efb1913d58c3c62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 20:43:59 2015 -0800
+
+    [ot] Port ot font funcs to allocated object
+
+ src/hb-ot-font.cc | 47 ++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 38 insertions(+), 9 deletions(-)
+
+commit 44f82750807475aa5b16099ccccd917d488df703
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 20:40:05 2015 -0800
+
+    [ft] Remove font funcs that do nothing
+
+ src/hb-ft.cc | 29 ++++-------------------------
+ 1 file changed, 4 insertions(+), 25 deletions(-)
+
+commit 7918c261efd283e0428ce7836e9e42768a6aa05c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 20:37:49 2015 -0800
+
+    [ft] Port ft font funcs to allocated object
+
+ src/hb-ft.cc | 45 ++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 36 insertions(+), 9 deletions(-)
+
+commit da29b43794cfa3f9a602c34b33c5d8a9c36f87b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 20:22:44 2015 -0800
+
+    Separate nil font-funcs from parent-peeking font-funcs
+
+    API change: all fonts created with hb_font_create() now inherit from
+    (ie have parent) hb_font_get_empty().
+
+ src/hb-font.cc       | 211
+ +++++++++++++++++++++++++++++++++++----------------
+ test/api/test-font.c |   2 +-
+ 2 files changed, 145 insertions(+), 68 deletions(-)
+
+commit bee901b38ef3c26a04f69c299c8d5e028a0090e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 19:28:17 2015 -0800
+
+    Optimize positioning direction calculations
+
+    It makes the binary smaller AND faster.  Yumm!
+
+ src/hb-font-private.hh | 40 +++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-shape.cc     | 51
+ +++++++++++++++++++++++++++-----------------------
+ 2 files changed, 68 insertions(+), 23 deletions(-)
+
+commit e3e4bb011ae1a2f1ba05e7ea450595b185304bec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 18:58:02 2015 -0800
+
+    Don't do fractions if buffer is ASCII-only
+
+ src/hb-buffer-private.hh    | 5 +++--
+ src/hb-ot-layout-private.hh | 1 +
+ src/hb-ot-shape.cc          | 3 ++-
+ 3 files changed, 6 insertions(+), 3 deletions(-)
+
+commit 6986208ba3b395534f4c7bcfa51df6bf9038f717
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 18:46:22 2015 -0800
+
+    Optimize runs without Default_Ignorable's
+
+    Now that we have a buffer-wide scratch flags facility, use it to
+    optimize away a few passes.
+
+ src/hb-buffer-private.hh     |  3 ++-
+ src/hb-ot-layout-private.hh  |  4 +++-
+ src/hb-ot-shape-normalize.cc |  4 ++--
+ src/hb-ot-shape.cc           | 10 ++++++----
+ src/hb-private.hh            |  3 +++
+ 5 files changed, 16 insertions(+), 8 deletions(-)
+
+commit 14c2de321826c36037adde859ccca3e2011325a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 18:00:57 2015 -0800
+
+    Limit max edits during sanitize to 8
+
+    Used to be 100.  If a tabe needs more than one or two edits, it's
+    probably completely bogus...
+
+    Might help with speeding up fuzzing for
+    https://github.com/behdad/harfbuzz/issues/157
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9cbc39aef962a95b0eba32c24ff9c415d1316d56
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 18:00:53 2015 -0800
+
+    Minor
+
+ src/hb-ot-shape-normalize.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 52e6c4e15893ed1cb0997795912a07b3e446b65a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 17:45:06 2015 -0800
+
+    If font doesn't support U+2011, fall back to U+2010
+
+    Test passes now.
+
+ src/hb-ot-shape-normalize.cc | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 75483aafa6ad02d6391712d082d093823edcd758
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 17:43:36 2015 -0800
+
+    Untangle if/else waterfall
+
+ src/hb-ot-shape-normalize.cc | 40
+ +++++++++++++++++++++++++++-------------
+ 1 file changed, 27 insertions(+), 13 deletions(-)
+
+commit 04fd8517f85ae9aa05b44f25578d2b19abfef7cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 17:38:22 2015 -0800
+
+    Add tests for hyphen fallback
+
+    U+2011 is <noBreak> equivaent of U+2010, so we should do the fallback
+    for it.  Currently fails.
+
+ test/shaping/Makefile.am                                  |   1 +
+ .../sha1sum/1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf  | Bin 0 ->
+ 820 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                       |   2 ++
+ test/shaping/tests/MANIFEST                               |   1 +
+ test/shaping/tests/hyphens.tests                          |   2 ++
+ 5 files changed, 6 insertions(+)
+
+commit 550417117da7e14457a11f49a20145311f58587b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 17:37:30 2015 -0800
+
+    [test] Drop hintings when subsetting fonts to record
+
+ test/shaping/record-test.sh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 49ef630936325b2e56a870fcef9aa8473a8f8526
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 17:27:07 2015 -0800
+
+    Adjust the width of various spaces if font does not cover them
+
+    See discussion here:
+    https://github.com/behdad/harfbuzz/commit/81ef4f407d9c7bd98cf62cef951dc538b13442eb
+
+    There's no way to disable this fallback, but I don't think it would
+    be needed.  Let's hope for the best!
+
+    Fixes https://github.com/behdad/harfbuzz/issues/153
+
+ src/hb-buffer-private.hh            |  7 ++++
+ src/hb-buffer.cc                    |  2 ++
+ src/hb-ot-shape-fallback-private.hh |  4 +++
+ src/hb-ot-shape-fallback.cc         | 67
+ +++++++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-normalize.cc        |  1 +
+ src/hb-ot-shape.cc                  |  3 ++
+ src/hb-unicode-private.hh           | 56 +++++++++++++++++--------------
+ test/shaping/tests/spaces.tests     | 24 ++++++-------
+ 8 files changed, 126 insertions(+), 38 deletions(-)
+
+commit aa7044de0ceacd71cab19212d266c3a66c03b41e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 16:25:57 2015 -0800
+
+    Generalize flags types
+
+ src/hb-buffer-private.hh           |  3 +++
+ src/hb-ot-layout-common-private.hh |  5 +++++
+ src/hb-ot-layout-private.hh        |  8 +++++---
+ src/hb-ot-map-private.hh           | 16 +---------------
+ src/hb-ot-shape.cc                 |  2 +-
+ src/hb-private.hh                  | 14 ++++++++++++++
+ 6 files changed, 29 insertions(+), 19 deletions(-)
+
+commit 7793aad946e09b53523b30d57de85abd1d15f8b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 14:48:46 2015 -0800
+
+    Normalize various spaces to space if font doesn't support
+
+    This resurrects the space fallback feature, after I disabled
+    the compatibility decomposition.  Now I can release HarfBuzz
+    again without breaking Pango!
+
+    It also remembers which space character it was, such that later
+    on we can approximate the width of this particular space
+    character.  That part is not implemented yet.
+
+    We normalize all GC=Zs chars except for U+1680 OGHA SPACE MARK,
+    which is better left alone.
+
+ src/hb-ot-layout-private.hh                        |  47
+ +++------------------
+ src/hb-ot-shape-normalize.cc                       |  12 +++++-
+ src/hb-unicode-private.hh                          |  40
+ ++++++++++++++++++
+ test/shaping/Makefile.am                           |   1 +
+ .../1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf   | Bin 0 -> 316 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                |   1 +
+ test/shaping/tests/MANIFEST                        |   1 +
+ test/shaping/tests/spaces.tests                    |  17 ++++++++
+ 8 files changed, 76 insertions(+), 43 deletions(-)
+
+commit 8b3c7f9ede77052225cff8495d660860bf9c7629
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 15:30:48 2015 -0800
+
+    [test] Support recording multiple lines of text in record-test.sh
+
+ test/shaping/record-test.sh | 15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+commit 85658394809fe0593ab5dfb30fd96118765c7dc5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 14:46:52 2015 -0800
+
+    Protect against possible invalid-memory access after OOM
+
+ src/hb-buffer-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4cc80bed25450af3d84a30ea417fa9275b15e014
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 14:46:10 2015 -0800
+
+    Fix typo!
+
+    Ouch!  Fortunately that function was unused.
+
+ src/hb-buffer-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9ac4b9656dd78ffd129bc3d560a92e2692bc3058
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 14:18:39 2015 -0800
+
+    Add Unicode space category
+
+    Unused so far.
+
+ src/hb-ot-layout-private.hh | 78
+ +++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 76 insertions(+), 2 deletions(-)
+
+commit 8249ec3f86510fd24462ce71ed64a6978f0ade17
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 13:26:17 2015 -0800
+
+    Make top-byte of unicode_props available to be used differently per-GC
+
+ src/hb-ot-layout-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit cc5d3a33882b52f906ee4346707700f5e846d2ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 13:21:25 2015 -0800
+
+    Towards using top-byte of unicode-props for more things
+
+ src/hb-ot-layout-gsubgpos-private.hh | 1 -
+ src/hb-ot-layout-private.hh          | 3 ++-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 2f38dde5a1ea5459789fabaee661cae9235d204e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 13:17:33 2015 -0800
+
+    Add _hb_glyph_info_is_unicode_mark()
+
+    Unused right now.
+
+ src/hb-ot-layout-private.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 90d75f93bb85aeb627c4e6bb9e4cbd75895c99f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 12:58:12 2015 -0800
+
+    Tighten ccc-setting a bit and document it
+
+ src/hb-ot-layout-private.hh | 12 +++++++++++-
+ src/hb-unicode-private.hh   |  5 +++++
+ 2 files changed, 16 insertions(+), 1 deletion(-)
+
+commit 2f0dfd43cdc2259e6117704f8077ab6951c761e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 12:28:34 2015 -0800
+
+    Fix test expectation
+
+ test/shaping/tests/fuzzed.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit df698f3299d92867e3305715f675b2621c316acd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 12:15:12 2015 -0800
+
+    [ot-font] Fix hmtx table length checking, *again*
+
+    Exactly the same problem that I fixed in
+    63ef0b41dc48d6112d1918c1b1de9de8ea90adb5
+
+    I rewrote the table checking yesterday in
+    67f8821fb25d9bd55719f5e29a582ae1af4b02b3
+    and introduced the exact same issue again. :(
+    Good thing we have ongoing fuzzing going now.  Was discovered
+    immediately by libFuzzer.  Thanks kcc!
+
+    https://github.com/behdad/harfbuzz/issues/139#issuecomment-153449473
+    Fixes https://github.com/behdad/harfbuzz/issues/156
+
+ src/hb-ot-font.cc                                         |   4 ++--
+ .../sha1sum/8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf  | Bin 0 ->
+ 633 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                       |   1 +
+ test/shaping/tests/fuzzed.tests                           |   1 +
+ 4 files changed, 4 insertions(+), 2 deletions(-)
+
+commit 3530cc2d7c3b7102902cb0e38b0bf9f46188078d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 11:34:47 2015 -0800
+
+    [util] Fix option-parsing leaks
+
+ util/helper-cairo.cc   |  7 +++++--
+ util/main-font-text.hh | 22 ++++++++++++++++++---
+ util/options.cc        | 21 ++++++++++----------
+ util/options.hh        | 53
+ +++++++++++++++++++++++++++++++++-----------------
+ 4 files changed, 70 insertions(+), 33 deletions(-)
+
+commit 642135f3b2d6d6eb800153c76c4718239733c0e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 11:26:34 2015 -0800
+
+    [util] In --debug mode, duplicate font data
+
+    This has the effect that the font data will end up in a memory
+    section malloc()ed exactly to its size.  This gives us better
+    valgrind detection of out-of-bounds access.
+
+    Previously, the font data was placed in a mmap()ed section or
+    GString-allocated area, which didn't have proper protections
+    at the end when running under valgrind.
+
+ util/options.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit ed2024ef93ac3af214082016e5aa8c14db9d7515
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 17:58:12 2015 -0800
+
+    [perf] Micro-optimize
+
+ src/hb-ot-layout-private.hh | 23 ++++++++++++++---------
+ 1 file changed, 14 insertions(+), 9 deletions(-)
+
+commit 76a5310a830c7ae12037b768c5043bef0ff733a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 17:52:45 2015 -0800
+
+    Remove irrelevant comment
+
+    I tried moving the is_default_ignorable() function to an INTERNAL
+    function.  That made the binary size grow by 5k AND things got a
+    tad bit slower!
+
+ src/hb-ot-layout-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 8259669fbd1b070fc02287325894caf1bc4d590e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 17:44:05 2015 -0800
+
+    Minor
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ src/hb-ot-shape-complex-thai.cc      | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 9382c471eabce8d36d3a73c97499ab60af422716
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 17:36:51 2015 -0800
+
+    Combine unicode_props0/1 into a uint16
+
+    Slightly faster.  In prep for more changes.
+
+ src/hb-ot-layout-private.hh | 55
+ ++++++++++++++++++++++++---------------------
+ 1 file changed, 29 insertions(+), 26 deletions(-)
+
+commit 71277185454482cff9b0c10b85c416eb4d6e0ed9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 17:27:48 2015 -0800
+
+    [perf] Only call combining_class() for marks
+
+    Saves some time.  Also preparing for reusing the ccc byte for
+    other stuff.
+
+ src/hb-ot-layout-private.hh | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit 5ba450407b9d9856453e63a815499da8721ff6a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 15:43:08 2015 -0800
+
+    Make max context-length and max nesting level configurable
+
+    ...at compile time.
+
+ src/hb-ot-layout-common-private.hh   | 10 ++++++++--
+ src/hb-ot-layout-gsub-table.hh       |  4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 20 ++++++++++----------
+ 3 files changed, 20 insertions(+), 14 deletions(-)
+
+commit 67f8821fb25d9bd55719f5e29a582ae1af4b02b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 15:37:29 2015 -0800
+
+    [ot] Make bad-hmtx handling match FreeType
+
+    Also route fuzzing-related tests through hb-ot-font, to reduce
+    dependency
+    on FreeType behavior for badly-broken fonts.  Fixes failing test with
+    FreeType master.
+
+ src/hb-ot-font.cc               | 24 ++++++++++++++----------
+ test/shaping/tests/fuzzed.tests | 10 +++++-----
+ 2 files changed, 19 insertions(+), 15 deletions(-)
+
+commit 672ca3b4e65a75fb3a418ec5d117ad242a98acbb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 26 14:05:05 2015 -0700
+
+    Use templates for making sure expression is constant
+
+ src/hb-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 5c8174eda32c08187bc2ed40eefa1017f5b40668
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 21 18:51:40 2015 -0200
+
+    Update comments for removal of compat decompositions
+
+ src/hb-ot-shape-normalize.cc | 16 ++--------------
+ 1 file changed, 2 insertions(+), 14 deletions(-)
+
+commit f6799700404c49ae0a6018fd51be19551c76768a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 21 17:20:55 2015 -0200
+
+    Disable compatibility decomposition usage during normalization
+
+    Fixes https://github.com/behdad/harfbuzz/issues/152
+
+ src/hb-ot-shape-normalize.cc | 24 ------------------------
+ 1 file changed, 24 deletions(-)
+
+commit ce889189c1f8ef5b400a17f623dcb8b935d1102b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 21 11:23:12 2015 -0200
+
+    Fix two more -Wshadow warnings
+
+    https://bugzilla.mozilla.org/show_bug.cgi?id=1215894
+
+ src/hb-open-type-private.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 4a6b1eedbb0044b57505eea65a329d2dc4f9f917
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 21 11:20:55 2015 -0200
+
+    Fix one more -Wshadow warning
+
+    https://bugzilla.mozilla.org/show_bug.cgi?id=1215894
+
+ src/hb-ot-layout-gsubgpos-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 6f932bc8f9045b224613a617af2b4f3450c79467
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 21 11:16:49 2015 -0200
+
+    Fix a few more -Wshadow-local warnings
+
+    https://bugzilla.mozilla.org/show_bug.cgi?id=1215894
+
+ src/hb-ot-shape-complex-indic.cc   | 10 +++++-----
+ src/hb-ot-shape-complex-myanmar.cc | 10 +++++-----
+ src/hb-ot-shape-complex-use.cc     | 10 +++++-----
+ 3 files changed, 15 insertions(+), 15 deletions(-)
+
+commit b90cb366d7723c28758c6b75a0770613fbb5456e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 21 11:13:21 2015 -0200
+
+    Fix one -Wshadow-compatible-local warning
+
+    From https://bugzilla.mozilla.org/show_bug.cgi?id=1215894
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 50e5750bd8670b4cf4463471a2348d4c99c9d054
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 21 11:10:10 2015 -0200
+
+    Avoid unnecessary cast to 64-bit
+
+    Fixes https://github.com/behdad/harfbuzz/issues/146
+
+    Or I think it should.
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 305d2fbf5a2db51447c8ed894a48a88896930673
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 21 11:04:28 2015 -0200
+
+    Add HB_FALLTHROUGH
+
+    Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411
+
+ src/hb-ot-shape-complex-indic.cc |  2 +-
+ src/hb-ot-shape-complex-thai.cc  |  2 +-
+ src/hb-ot-shape-fallback.cc      |  4 +++-
+ src/hb-private.hh                | 30 ++++++++++++++++++++++++++++++
+ 4 files changed, 35 insertions(+), 3 deletions(-)
+
+commit f35b3e931ddacd075c5d0810e9b17de07b232ee2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Sep 11 09:48:12 2015 +0430
+
+    Add a prototype of DirectWrite as a shaping backend
+
+ src/hb-directwrite.cc | 827
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-directwrite.h  |  34 +++
+ src/hb-shaper-list.hh |   3 +
+ 3 files changed, 864 insertions(+)
+
+commit 6486e3755482563ecd89aeb3f8348ed190945e26
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 20 16:39:41 2015 -0200
+
+    Fix typo
+
+ Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 753ea7b90904c951c199861409458bea182abb37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 20 15:21:18 2015 -0200
+
+    Add BUILD.md to dist
+
+ Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5d7a30fde09320c2c62c7c73570ce3f2e298eba6
+Merge: 904b0dc3 2fb95a0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 20 15:19:41 2015 -0200
+
+    Merge pull request #148 from ebraminio/inst
+
+    Add BUILD.md based on harfbuzz.org docs
+
+commit 904b0dc3811464cf61dc9457664de95ee4f61a86
+Merge: 86cadc2c ba096bcc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 19 16:59:43 2015 -0200
+
+    Merge pull request #147 from ebraminio/dockerci
+
+    [ci] change to docker infrastructure
+
+commit ba096bcc28ca80e2096e0a15191848fcd175e395
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 19 21:41:01 2015 +0330
+
+    [ci] change to docker infrastructure
+
+ .travis.yml | 24 ++++++++++++++++--------
+ 1 file changed, 16 insertions(+), 8 deletions(-)
+
+commit 2fb95a0c9d2cb8b03b7c158706d6b0e41283a6df
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 19 22:02:12 2015 +0330
+
+    Add BUILD.md based on harfbuzz.org docs
+
+ BUILD.md | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+commit 86cadc2cd4171050e9d74306b76c42f6ec74b861
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 15 20:25:29 2015 -0300
+
+    1.0.6
+
+ NEWS         | 13 +++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit ca97ea7aa2cb7186f432aaba76f4f151aa90c1d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 15 20:20:22 2015 -0300
+
+    [ft] Revert change-of-behavior of hb_ft_font_create() introduced
+    in 1.0.5
+
+    The default FreeType load flags where changed from FT_LOAD_NO_HINTING
+    to FT_LOAD_DEFAULT in 2a9627c5641cd000e2adff0e42a0dc687b53ec70.
+    This is crashing HarfBuzz-enabled FreeType as I suppose it causes
+    infinite recursion between HB and FT autohinter...
+
+    Revert the behavior change.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/143
+
+ src/hb-ft.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 338ffec9e4a5819f2be21c3a320a567378c977b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 15 12:55:57 2015 -0300
+
+    Add tests for a couple of fixed issues found by libFuzzer
+
+    From:
+    https://github.com/behdad/harfbuzz/issues/139#issuecomment-147616887
+    https://github.com/behdad/harfbuzz/issues/139#issuecomment-148289957
+
+ .../sha1sum/375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf | Bin 0 ->
+ 1024 bytes
+ .../sha1sum/641bd9db850193064d17575053ae2bf8ec149ddc.ttf | Bin 0 ->
+ 305 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   2 ++
+ test/shaping/tests/fuzzed.tests                          |   2 ++
+ 4 files changed, 4 insertions(+)
+
+commit 63ef0b41dc48d6112d1918c1b1de9de8ea90adb5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 15 12:47:22 2015 -0300
+
+    [ot-font] Fix hmtx wrong table length check
+
+    Discovered by libFuzzer.  Ouch!
+
+    https://github.com/behdad/harfbuzz/issues/139#issuecomment-148289957
+
+ src/hb-ot-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 613e630617074eb9b62b794cc37c9b42a7fb079b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 13 23:33:28 2015 -0300
+
+    Reduce max nesting level from 8 to 6
+
+    We probably should implement better system to catch cyclic lookups.
+    But for now, this speeds up worst case behavior with broken fonts
+    considerably without compromising legitimate usecases.
+
+    https://github.com/behdad/harfbuzz/issues/139#issuecomment-147788447
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ab170529246ad80830bef2b3c8b48e9a8d2b7483
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 13 10:55:33 2015 -0300
+
+    1.0.5
+
+ NEWS         | 24 ++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 25 insertions(+), 1 deletion(-)
+
+commit ed13e2ce509408f849255be1d3cc3dbd7dbb3ba2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 13 10:32:56 2015 -0300
+
+    [ot-font] Fix leak
+
+    https://github.com/behdad/harfbuzz/issues/139#issuecomment-147616887
+
+ src/hb-ot-font.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 55db94be2b754ba9b9121f09abcf8496c798affc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 13 00:33:59 2015 -0400
+
+    Add test for previous commit
+
+ .../sha1sum/0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf   | Bin 0 ->
+ 61 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                        |   1 +
+ test/shaping/tests/fuzzed.tests                            |   1 +
+ 3 files changed, 2 insertions(+)
+
+commit f96664974774bfeb237a7274f512f64aaafb201e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 13 00:30:50 2015 -0400
+
+    Fix another memory access issue discovered by libFuzzer
+
+    Fixes
+    https://github.com/behdad/harfbuzz/issues/139#issuecomment-146984679
+
+ src/hb-ot-layout-gpos-table.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit c1a5dc46c2231f7b62421e06b9766ccfebaf3ef5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 12 17:39:52 2015 -0400
+
+    [fuzz] Add fuzzing script from kcc@
+
+    https://github.com/behdad/harfbuzz/issues/139
+
+ test/fuzzing/hb-fuzzer.cc | 47
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 47 insertions(+)
+
+commit cc6ea308d4c99b9dd6d625fa3a9b0ef62fa2614f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 12 17:21:52 2015 -0400
+
+    Extern "C" custom-allocator declerations
+
+ src/hb-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 98c6fccc00062ead7a86892dd059aa13d266b981
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 11 21:41:04 2015 -0400
+
+    Add test for ee9b0b6cb5fdb08671ab064f26c299135f828260
+
+ .../sha1sum/5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf   | Bin 0 ->
+ 61 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                        |   1 +
+ test/shaping/tests/fuzzed.tests                            |   1 +
+ 3 files changed, 2 insertions(+)
+
+commit 50f489a0a013fc589626bb532a9f64f50bb41f58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 11 20:59:29 2015 -0400
+
+    Typo
+
+ src/hb-font-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ee9b0b6cb5fdb08671ab064f26c299135f828260
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 9 14:23:15 2015 -0400
+
+    Fix another sanitize bug
+
+    Also discovered by "libFuzzer".
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 34379b49e6922b86c15ee62f7fe3bf016cdc2514
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 9 12:34:02 2015 -0400
+
+    Add test for previous fix
+
+ test/shaping/Makefile.am                                   |   1 +
+ .../sha1sum/1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf   | Bin 0 ->
+ 64 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                        |   1 +
+ test/shaping/tests/MANIFEST                                |   1 +
+ test/shaping/tests/fuzzed.tests                            |   1 +
+ 5 files changed, 4 insertions(+)
+
+commit f396fbb000dc1c8acddbf6a16e193b328c5e551e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 9 12:25:55 2015 -0400
+
+    Fix return value of sanitize when subformat is not readable
+
+    This is a fix on top of the previous issue fixed in
+    c917965b9e6fe2b21ed6c51559673288fa3af4b7.
+
+    This was caught by "libFuzzer" testing.
+
+ src/hb-open-type-private.hh          |  2 ++
+ src/hb-ot-layout-gpos-table.hh       | 15 +++++++--------
+ src/hb-ot-layout-gsub-table.hh       | 13 ++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh |  8 ++++----
+ 4 files changed, 19 insertions(+), 19 deletions(-)
+
+commit 77a1a2bc18e7b04d4e352a8777ccce345b2f8659
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 9 12:20:58 2015 -0400
+
+    Add hb_dispatch_context_t
+
+ src/hb-open-type-private.hh          | 26 ++++++++++++++++++++++----
+ src/hb-ot-layout-gsubgpos-private.hh | 36
+ ++++++++++++------------------------
+ src/hb-ot-layout.cc                  |  8 +++-----
+ 3 files changed, 37 insertions(+), 33 deletions(-)
+
+commit 3e905e396bcd745bda88e751998a76556c5cb8c6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 8 12:51:02 2015 -0400
+
+    Add hb_font_set_parent()
+
+    No reason to not have it.  Makes life easier later.
+    We (hb-ft, hb-ot-font, etc) can use this API to inject new
+    parent into a font...
+
+ src/hb-font.cc       | 26 ++++++++++++++++++++++++++
+ src/hb-font.h        |  4 ++++
+ test/api/test-font.c | 12 ++++++++++++
+ 3 files changed, 42 insertions(+)
+
+commit edeb3dabf4a589d67c3f1da7ba43a74e4d3a9afd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 8 12:47:15 2015 -0400
+
+    [ft] Add version for new API
+
+ src/hb-ft.cc | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+commit 2a9627c5641cd000e2adff0e42a0dc687b53ec70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 7 17:33:20 2015 -0400
+
+    [ft] API: Add hb_font_[sg]et_load_flags() API
+
+    This changes the default load_flags of fonts created using
+    hb_ft_font_create() from NO_HINTING to DEFAULT.  Hope that doesn't
+    break too much client code.
+
+    Code calling hb_ft_font_set_funcs() is unaffected.
+
+ src/hb-ft.cc | 163
+ +++++++++++++++++++++++++++++++++++++++--------------------
+ src/hb-ft.h  |  13 +++--
+ 2 files changed, 118 insertions(+), 58 deletions(-)
+
+commit 3224a594dcf2164b5585b4ccba34f244af3f61b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 7 17:33:02 2015 -0400
+
+    Minor
+
+ src/hb-ot-font.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 52b418555b62a3b25399f202c1fa72ab7288c224
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 3 13:20:55 2015 +0100
+
+    Allow compiling with custom allocators
+
+    User can define hb_malloc_impl, etc, to name of custom allocator
+    functions
+    that have the same signature as malloc.
+
+ src/hb-private.hh | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+commit 88da7bba9fa4665b33f5bfcd45add7443097eaf3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 2 14:38:20 2015 +0100
+
+    Default font scale to face upem
+
+    Makes for a better default and avoids nasty inheritance issues.
+    See mailing list thread "Default hb_font_t scale".
+
+ src/hb-font.cc       |  2 ++
+ test/api/test-font.c | 13 ++++++++-----
+ 2 files changed, 10 insertions(+), 5 deletions(-)
+
+commit 1866e17114b41d565eb066e7d9393c2ff3e0a12b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 2 14:21:29 2015 +0100
+
+    Make hb_font_create_sub_font() NOT make parent immutable
+
+    We don't rely on that.  However, whenever hb_font_make_immutable()
+    is called, it makes its parenting chain immutable.
+
+ src/hb-font.cc       |  4 +++-
+ test/api/test-font.c | 21 +++++++++++++++------
+ 2 files changed, 18 insertions(+), 7 deletions(-)
+
+commit 980e25cad2e58c31f5361862b9223d94ec47fc7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 2 08:21:12 2015 +0100
+
+    Fix hb-ot-shape-normalize with empty buffer
+
+    Part of https://github.com/behdad/harfbuzz/issues/136
+
+ src/hb-ot-shape-normalize.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit a5efaac4ff61b587f228830b265b39fe8e5e4e47
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 2 08:02:29 2015 +0100
+
+    Replace a couple of malloc()s with calloc()
+
+ src/hb-face.cc       | 2 +-
+ src/hb-shape-plan.cc | 2 +-
+ src/hb-shaper.cc     | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 26ba4d1e1fb8949632fe08e6a7600badfba4f142
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 2 07:25:52 2015 +0100
+
+    Fix segfault with empty buffer in hb_shape_plan_execute()
+
+    Move the empty-buffer check from hb_shape_full() to
+    hb_shape_plan_execute().
+
+    Reported by Simon Cozens.
+
+ src/hb-shape-plan.cc | 9 +++++++--
+ src/hb-shape.cc      | 5 -----
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 432ffc47a46d41bea17d839d0d3980e654c6e638
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 30 22:51:16 2015 +0100
+
+    1.0.4
+
+ NEWS         | 7 +++++++
+ configure.ac | 2 +-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit b47159011ca518c3b94d782ed16a91ffe9dd2ab2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 29 14:57:02 2015 +0100
+
+    Define return_trace()
+
+    Not functional change (expected!).
+
+ src/hb-open-file-private.hh          |  20 +--
+ src/hb-open-type-private.hh          |  62 +++----
+ src/hb-ot-cmap-table.hh              |  56 +++----
+ src/hb-ot-glyf-table.hh              |   4 +-
+ src/hb-ot-head-table.hh              |   2 +-
+ src/hb-ot-hhea-table.hh              |   2 +-
+ src/hb-ot-hmtx-table.hh              |   2 +-
+ src/hb-ot-layout-common-private.hh   | 108 ++++++-------
+ src/hb-ot-layout-gdef-table.hh       |  44 ++---
+ src/hb-ot-layout-gpos-table.hh       | 252 +++++++++++++++--------------
+ src/hb-ot-layout-gsub-table.hh       | 304
+ ++++++++++++++++++-----------------
+ src/hb-ot-layout-gsubgpos-private.hh | 205 +++++++++++------------
+ src/hb-ot-layout-jstf-table.hh       |  35 ++--
+ src/hb-ot-maxp-table.hh              |   5 +-
+ src/hb-ot-name-table.hh              |  14 +-
+ src/hb-private.hh                    |   6 +-
+ 16 files changed, 575 insertions(+), 546 deletions(-)
+
+commit c917965b9e6fe2b21ed6c51559673288fa3af4b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 29 14:45:35 2015 +0100
+
+    Add missing returns
+
+    Fixes possible invalid read of two bytes.
+
+    Reported by Behzad Najjarpour Jabbari, Secunia Research.
+
+ src/hb-ot-layout-gpos-table.hh       | 14 +++++++-------
+ src/hb-ot-layout-gsub-table.hh       | 12 ++++++------
+ src/hb-ot-layout-gsubgpos-private.hh |  8 ++++----
+ 3 files changed, 17 insertions(+), 17 deletions(-)
+
+commit f3159ba5141c2ab0e430e64742972df140f91c43
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 29 14:34:56 2015 +0100
+
+    Micro-optimize hb_language_from_string()
+
+    As measured / improved by Benson Limketkai.
+
+ src/hb-common.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit f2ad935e19338a29113492150f0c5a5fd5befd75
+Author: Sascha Brawer <sascha@brawer.ch>
+Date:   Sun Jun 28 03:29:47 2015 +0200
+
+    Handle language tags that indicate phonetic IPA transcription
+
+    The BCP-47 registry defines a variant subtag "fonipa" that can be used
+    in combination with arbitrary other language tags. For example,
+    "rm-CH-fonipa-sursilv" indicates the Sursilvan dialect of Romansh
+    as used in Switzerland, transcribed used the International Phonetic
+    Alphabet.
+
+    http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
+
+ src/hb-ot-tag.cc       | 15 ++++++++++++++-
+ test/api/test-ot-tag.c |  7 +++++++
+ 2 files changed, 21 insertions(+), 1 deletion(-)
+
+commit b8811429b6810c4f13be087b593a862c17d9d987
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 3 15:53:22 2015 +0430
+
+    Fix Since tags
+
+    Fixes https://github.com/behdad/harfbuzz/issues/103
+
+ src/hb-blob.cc             | 24 +++++++++----------
+ src/hb-buffer-serialize.cc | 10 ++++----
+ src/hb-buffer.cc           | 58
+ +++++++++++++++++++++++-----------------------
+ src/hb-buffer.h            |  9 +++++++
+ src/hb-common.cc           | 24 +++++++++----------
+ src/hb-common.h            |  3 +++
+ src/hb-coretext.cc         |  3 +++
+ src/hb-font.h              | 18 +++++++-------
+ src/hb-ft.cc               |  6 ++---
+ src/hb-graphite2.cc        |  6 +++++
+ src/hb-ot-layout.cc        |  2 +-
+ src/hb-ot-tag.cc           |  2 +-
+ src/hb-set.h               |  3 +++
+ src/hb-shape.cc            |  2 +-
+ src/hb-unicode.cc          | 18 +++++++-------
+ src/hb-unicode.h           | 10 ++++----
+ 16 files changed, 111 insertions(+), 87 deletions(-)
+
+commit 5d74ff02ab01df67808b416af8bb9cefb06f841e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 3 14:55:59 2015 +0430
+
+    Fix Since: version tags on font and face APIs
+
+    A while back we marked every API as version:1.0.  We should fix
+    them all
+    to reflect real version they were introduced.  This is a start.
+
+    Patch from Nikolay Sivov.
+
+ src/hb-face.cc | 22 ++++++++---------
+ src/hb-font.cc | 76
+ +++++++++++++++++++++++++++++-----------------------------
+ 2 files changed, 49 insertions(+), 49 deletions(-)
+
+commit 7f5405397406a24c5a001b5ef43dcf4d6926415e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 1 17:03:50 2015 +0100
+
+    1.0.3
+
+ NEWS         | 11 +++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 12 insertions(+), 1 deletion(-)
+
+commit 5828c45d7a816ccd0a7f10a665ea3cf8cfd63b05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 1 16:26:35 2015 +0100
+
+    [indic] Add comments to merge_clusters calls
+
+ src/hb-ot-shape-complex-indic.cc | 21 ++++++++++++++++-----
+ 1 file changed, 16 insertions(+), 5 deletions(-)
+
+commit bdc8215949a7add742cc800b4fdea6acaa37d152
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 1 16:24:54 2015 +0100
+
+    [thai] Respect cluster-level > 0
+
+ src/hb-ot-shape-complex-thai.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5b31fe383ead726ec77062501ed3bb24c02842b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 1 16:24:34 2015 +0100
+
+    [use] Merge /before/ reordering
+
+ src/hb-ot-shape-complex-use.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0d438f89bd9422c66838c776eb4aa867de0a2ad8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 1 16:24:13 2015 +0100
+
+    [hangul] Merge /before/ reordering
+
+ src/hb-ot-shape-complex-hangul.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f883de664fc4bfe01e30c89e07e31dc113f906d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 1 16:23:40 2015 +0100
+
+    [OT] Merge /before/ reordering
+
+ src/hb-ot-shape.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit c403d6320074455a5e8e48902c0ac4ee9685e33d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 1 16:15:25 2015 +0100
+
+    [myanmar] Use buffer->sort() to sort cluster
+
+    This can possibly produce more granular clusters.
+
+ src/hb-ot-shape-complex-myanmar.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit e995d33c10a4bd9404699d01bddb2b69d811e9ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 1 16:13:32 2015 +0100
+
+    [OT] Merge clusters when reordering marks for normalization
+
+    Fixes https://bugzilla.gnome.org/show_bug.cgi?id=541608
+    and cluster test.
+
+ src/hb-buffer-private.hh     |  2 ++
+ src/hb-buffer.cc             | 21 +++++++++++++++++++++
+ src/hb-ot-shape-normalize.cc |  2 +-
+ 3 files changed, 24 insertions(+), 1 deletion(-)
+
+commit b6d7d161a87b5dde710924e5c557d39c302f5630
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 1 16:12:44 2015 +0100
+
+    [tests] Add Hebrew test for normalization under cluster-level=1
+
+    Currently fails.
+    https://bugzilla.gnome.org/show_bug.cgi?id=541608
+
+ .../sha1sum/43ef465752be9af900745f72fe29cb853a1401a5.ttf | Bin 0 ->
+ 4272 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   1 +
+ test/shaping/tests/cluster.tests                         |   1 +
+ 3 files changed, 2 insertions(+)
+
+commit 93099748e39740a3f6f003c83d9dec1d21660ce8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 1 16:11:27 2015 +0100
+
+    Minor
+
+ src/hb-private.hh | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit 85846b3de7491b6a07fed6a2c0c6c1b09943b249
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 1 15:07:52 2015 +0100
+
+    Use insertion-sort instead of bubble-sort
+
+    Needed for upcoming merge-clusters fix.
+
+ src/hb-buffer.cc                           |  4 +--
+ src/hb-ot-shape-complex-arabic-fallback.hh |  6 ++--
+ src/hb-ot-shape-complex-indic.cc           |  2 +-
+ src/hb-ot-shape-complex-myanmar.cc         |  2 +-
+ src/hb-ot-shape-normalize.cc               |  6 ++--
+ src/hb-private.hh                          | 56
+ +++++++++++++-----------------
+ 6 files changed, 34 insertions(+), 42 deletions(-)
+
+commit fad2674874591b4a1df822603144c8864f5364c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 1 14:45:46 2015 +0100
+
+    Minor
+
+ test/Makefile.am         | 4 ++++
+ test/api/Makefile.am     | 4 ++++
+ test/shaping/Makefile.am | 4 ++++
+ 3 files changed, 12 insertions(+)
+
+commit 23e4fac6de913201f263a73e13d3c1fab31d1bdd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 31 19:41:01 2015 +0100
+
+    Update git.mk from upstream
+
+ git.mk | 17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
+
+commit 5783e05f81bbf6debf2618c8994d6852630d9847
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 31 19:18:10 2015 +0100
+
+    [docs] Move docs/reference/ contents into docs/
+
+ configure.ac                                |   3 +-
+ docs/Makefile.am                            | 117
+ ++++++++++++++++++++++++++-
+ docs/{reference => }/harfbuzz-docs.xml      |   0
+ docs/{reference => }/harfbuzz-overrides.txt |   0
+ docs/{reference => }/harfbuzz-sections.txt  |   0
+ docs/reference/Makefile.am                  | 118
+ ----------------------------
+ docs/{reference => }/usermanual-ch01.xml    |   0
+ docs/{reference => }/usermanual-ch02.xml    |   0
+ docs/{reference => }/usermanual-ch03.xml    |   0
+ docs/{reference => }/usermanual-ch04.xml    |   0
+ docs/{reference => }/usermanual-ch05.xml    |   0
+ docs/{reference => }/usermanual-ch06.xml    |   0
+ docs/{reference => }/version.xml.in         |   0
+ 13 files changed, 117 insertions(+), 121 deletions(-)
+
+commit cd5e3a13a6e0b6606d3a421f8cd44cdfb8314907
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 31 19:16:41 2015 +0100
+
+    [docs] Fix out-of-tree build
+
+ docs/reference/Makefile.am               |  9 ++++++++-
+ docs/reference/harfbuzz-docs.xml         | 12 ++++++------
+ docs/{ => reference}/usermanual-ch01.xml |  0
+ docs/{ => reference}/usermanual-ch02.xml |  0
+ docs/{ => reference}/usermanual-ch03.xml |  0
+ docs/{ => reference}/usermanual-ch04.xml |  0
+ docs/{ => reference}/usermanual-ch05.xml |  0
+ docs/{ => reference}/usermanual-ch06.xml |  0
+ 8 files changed, 14 insertions(+), 7 deletions(-)
+
+commit 3899795fa3c3e058e3885ec7a6638f0597a752cc
+Merge: d2059652 01e16e88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 31 10:46:01 2015 +0100
+
+    Merge pull request #131 from simoncozens/docs
+
+    Use gtk-doc to build user's manual as well as reference
+
+commit 01e16e88f50b65b82dcb84773f532f18a351319f
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Mon Aug 31 10:40:17 2015 +0100
+
+    Combine user / reference information into gtk-doc generated manual.
+
+ docs/reference/harfbuzz-docs.xml | 91
+ +++++++++++++++++++++++-----------------
+ 1 file changed, 52 insertions(+), 39 deletions(-)
+
+commit 11a07c4729174e1d4af028103ecb0a351e4c2707
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Mon Aug 31 10:39:10 2015 +0100
+
+    Correct tag hierarchy, to allow for table-of-contents entries.
+
+ docs/usermanual-ch01.xml | 12 ++++++------
+ docs/usermanual-ch02.xml |  8 ++++----
+ docs/usermanual-ch03.xml | 24 ++++++++++++------------
+ docs/usermanual-ch04.xml | 16 ++++++++--------
+ docs/usermanual-ch05.xml | 12 ++++++------
+ 5 files changed, 36 insertions(+), 36 deletions(-)
+
+commit 387d6af428ddd5d4f211fe5748412011013a3826
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Mon Aug 31 10:31:09 2015 +0100
+
+    Missing tag (oops).
+
+ docs/usermanual-ch02.xml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d205965286798af4b7ad07e1eafa58288bee4bdb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 31 10:12:05 2015 +0100
+
+    [docs] Fix typo
+
+ docs/usermanual-ch03.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c424b41705b50055c7f92b268cf78a2680af73af
+Merge: 31594b98 5470e744
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 31 09:53:16 2015 +0100
+
+    Merge pull request #129 from simoncozens/docs
+
+    First two chapters. More to follow.
+
+commit 31594b98af0c9181982c77d8d3803753007f8fd4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 30 17:33:04 2015 +0100
+
+    [test] Fix test-object
+
+    See previous commit.
+
+ test/api/test-object.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 326b5ebf5748f547e4eb7388d66b79fe23130e2a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 30 17:29:21 2015 +0100
+
+    Poison freed objects such that double-free is detected
+
+    Previously we were setting refcount of freed objects to the inert
+    value, which
+    was harmful because it caused further destroy()s of the freed object
+    to NOT
+    call free() and hence hide the bug.  Indeed, after eb0bf3ae6688b7
+    test-object
+    was double-free'ing objects and this was never caught on Linux.
+    It only was
+    caught as crashing on Mac.
+
+    Now we poison refcount upon freeing and check that it's valid
+    whenever reading
+    it.  Makes test-object fail now.
+
+ src/hb-object-private.hh | 21 ++++++++++++++++-----
+ 1 file changed, 16 insertions(+), 5 deletions(-)
+
+commit 5470e744dd264c2dc33437a68d20bcf7c5ffb905
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Sat Aug 29 08:21:18 2015 +0100
+
+    Current state and skeleton outline
+
+ docs/usermanual-ch03.xml | 77
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ docs/usermanual-ch04.xml | 18 +++++++++++
+ docs/usermanual-ch05.xml | 13 ++++++++
+ docs/usermanual-ch06.xml |  8 +++++
+ 4 files changed, 116 insertions(+)
+
+commit 6578575cc8aeb05341f2053039acfcd735707674
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 25 20:24:59 2015 +0100
+
+    [GPOS] Fix cursive connection with mix of RTL and non-RTL lookups
+
+    See thread "Issue with cursive attachment" started by Khaled.
+    Turned out fixing this wasn't as bad as I had assumed.  I like the
+    new code better; we now have a theoretical model of cursive
+    connections that is easier to reason about.
+
+ src/hb-ot-layout-gpos-table.hh | 34 ++++++++++++++++++++++++++++++++++
+ 1 file changed, 34 insertions(+)
+
+commit 7368da67244ea53195cd9b95a5c57485df695732
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 25 20:28:39 2015 +0100
+
+    [test] Add test for cursive-positioning with mixed directions
+
+    Fails now.  Fix coming.  See thread "Issue with cursive attachment"
+    started by Khaled.  Test fonts were made by modifying test font
+    from Khaled to add more anchors.
+
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf | Bin 0 ->
+ 2520 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   2 ++
+ .../sha1sum/c4e48b0886ef460f532fb49f00047ec92c432ec0.ttf | Bin 0 ->
+ 2512 bytes
+ test/shaping/tests/MANIFEST                              |   1 +
+ test/shaping/tests/cursive-positioning.tests             |   2 ++
+ 6 files changed, 6 insertions(+)
+
+commit f0807654da160bd7ceb9aff5b8338ec0b643171c
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Tue Aug 25 19:57:15 2015 +0100
+
+    First two chapters. More to follow.
+
+ docs/usermanual-ch01.xml | 115 ++++++++++++++++++++++++++++++
+ docs/usermanual-ch02.xml | 182
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 297 insertions(+)
+
+commit 58f2a73fb95af42e264a91cdef7bb5a89e965601
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 25 18:55:34 2015 +0100
+
+    [GPOS] Rewrite cursive attachment slightly differently
+
+    In anticipation for upcoming fix for bug reported by
+    Khaled in thread "Issue with cursive attachment".
+
+ src/hb-ot-layout-gpos-table.hh | 36 ++++++++++++++++++++++++------------
+ 1 file changed, 24 insertions(+), 12 deletions(-)
+
+commit fdd1770e006ca2d2973c049177ceda87a575e07f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 24 13:49:55 2015 +0100
+
+    Add API/cmdline to show glyph extents when serializing buffer
+
+    New API: HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS
+
+    hb-shape now accepts --show-extents.
+
+    Patch from Simon Cozens.
+
+ src/hb-buffer-serialize.cc | 17 +++++++++++++++++
+ src/hb-buffer.h            |  3 ++-
+ util/hb-shape.cc           |  2 ++
+ util/options.cc            |  1 +
+ util/options.hh            |  2 ++
+ 5 files changed, 24 insertions(+), 1 deletion(-)
+
+commit 2cee5b68a07b99214ef9428fe5d03e7b378a558f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 24 13:45:12 2015 +0100
+
+    [ot-font] Fix short-offset calculation
+
+ src/hb-ot-font.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b50fcfa82994f93568a54dd1eb7fd327f6db5586
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 23 14:42:20 2015 +0100
+
+    [ot-font] Implement glyph_extents() for TrueType fonts
+
+    This brings ot-fonts into almost-complete shape and mostly in par with
+    ft font.
+
+ src/Makefile.am         |   1 +
+ src/hb-font.h           |   9 +++--
+ src/hb-ot-font.cc       |  90 +++++++++++++++++++++++++++++++++++++++--
+ src/hb-ot-glyf-table.hh | 104
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-head-table.hh |   3 +-
+ 5 files changed, 198 insertions(+), 9 deletions(-)
+
+commit 0299b45000b5047c0b9bf0fe51f3b8b68a7982f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 21 12:44:36 2015 +0100
+
+    Make BYTE a real type
+
+ src/hb-open-type-private.hh | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+commit ed6962c795ae7c54aaee9ed5667fa65ccf7412bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 20 15:39:53 2015 +0100
+
+    [coretext] Use i32 instead of u32 as well
+
+    Shouldn't cause *any* functional changes, but is more correct.
+
+ src/hb-coretext.cc | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 163c435f1807c138da9f74f09d29d913eb9e29e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 20 15:39:06 2015 +0100
+
+    [uniscribe] Fix negative offsets
+
+    Ouch!
+
+ src/hb-uniscribe.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 789b89ef7130ffe5f22c571fc3cb4e6d35456654
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 19 13:39:57 2015 +0100
+
+    1.0.2
+
+ NEWS         | 13 +++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit 958c268fa3a520666436e77a2111a3b564a36d96
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 19 13:22:12 2015 +0100
+
+    [coretext] Add TODO item
+
+ src/hb-coretext.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 7c5bee09d9c7c25672c7c77572ebae0b731892d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 19 13:20:31 2015 +0100
+
+    [uniscribe] Fix font scale handling
+
+    By default shape at upem (or ppem), and scale results.
+    Similar to work done in CoreText backend, but using upem as default.
+
+ src/hb-uniscribe.cc | 25 +++++++++++++++++++------
+ 1 file changed, 19 insertions(+), 6 deletions(-)
+
+commit 902e74a098dad8c3b487856284f9fdf99b04f9f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 18 18:55:03 2015 +0100
+
+    Commented-out code to print buffer before each lookup
+
+    To be turned into a useful HB_DEBUG_SHAPE infrastructure...
+
+ src/hb-ot-layout.cc | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 75504a50488a6aac0b9789f728fb5b87e641d4c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 18 18:47:02 2015 +0100
+
+    Allow serializing buffer with output-buffer being used
+
+    Ie, don't call get_positions() if positions are not
+    requested for serialization.
+
+ src/hb-buffer-serialize.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit e47b772a56af44a9a4f9ec907ee2091b725b94c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 18 18:42:47 2015 +0100
+
+    [ot] Change buffer content type right after we map to glyphs
+
+    Needed for upcoming debug output changes.
+
+ src/hb-ot-shape.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit d104415e4c1e0f9140f794cd8d09c6460c63e966
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 18 17:33:34 2015 +0100
+
+    [Android.mk] Update for SEA removal and USE addition
+
+ Android.mk | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit ddd6bf12f1cabaa298feed820313483b9893528c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 18 15:55:09 2015 +0100
+
+    Don't declare dependency on freetype in harfbuzz.pc
+
+    See comments.
+
+ src/Makefile.am | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 2c8b3b2e5312c9858584f568b1528c57e5bb8a10
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 18 14:36:43 2015 +0100
+
+    [debug] Print lookup index in debug-apply output
+
+ src/hb-ot-layout-gpos-table.hh       | 5 ++++-
+ src/hb-ot-layout-gsub-table.hh       | 5 ++++-
+ src/hb-ot-layout-gsubgpos-private.hh | 7 +++++--
+ src/hb-ot-layout.cc                  | 3 ++-
+ 4 files changed, 15 insertions(+), 5 deletions(-)
+
+commit 50ad7788eeb7160caef4ec78e65c7c630e601b06
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 18 10:22:16 2015 +0100
+
+    [coretext] Remove assert that kicks in on Mac OS 10.6
+
+    http://crbug.com/419769
+
+ src/hb-coretext.cc | 18 ++++++++++++++----
+ 1 file changed, 14 insertions(+), 4 deletions(-)
+
+commit 2b646fa07f5f9d4d10d563a91d22a2750b5fc771
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 17 16:03:28 2015 +0200
+
+    Remove unused function
+
+ src/hb-ot-shape-complex-use.cc | 8 --------
+ 1 file changed, 8 deletions(-)
+
+commit 23237b0279a04407addf33f599c45faa60f002ca
+Author: ThePhD <phdofthehouse@gmail.com>
+Date:   Fri Aug 14 01:19:08 2015 -0400
+
+    Last apparent boolean fix!
+
+ src/hb-ot-shape-complex-use.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5c99cf93d6242803bddcac2ca8300fdec7e0f8a7
+Merge: 8ad89f05 539a610e
+Author: ThePhD <phdofthehouse@gmail.com>
+Date:   Fri Aug 14 01:02:00 2015 -0400
+
+    Merge branch 'master' into vc++-fixes
+
+commit 539a610e2e72375e598ab29fd390ed9ec93816d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 11 12:58:49 2015 +0200
+
+    Add Libs.private and Requires.private to harfbuzz.pc
+
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=64501
+
+ configure.ac       | 12 +++++++++---
+ src/Makefile.am    | 15 ++++++++++++---
+ src/harfbuzz.pc.in |  2 ++
+ 3 files changed, 23 insertions(+), 6 deletions(-)
+
+commit c7dfe316f8c0fc04b7976fca5e58eb46d91b4821
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Fri Aug 7 17:55:03 2015 +0100
+
+    Don't rely on .cluster in _hb_ot_shape_normalize()
+
+    Fixes https://github.com/behdad/harfbuzz/pull/124
+
+ src/hb-ot-shape-normalize.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9099e48e29fe5cfdf8566c8f1ba6ddc8c0799e7e
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Fri Aug 7 17:51:28 2015 +0100
+
+    Don't rely on .cluster field in fallback_position
+
+    Fixes tests/cluster.
+
+    Fixes https://github.com/behdad/harfbuzz/pull/123
+
+ src/hb-ot-shape-fallback.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit f3792342f670978cdc3f8512fb5e80314ca0678d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 8 18:02:18 2015 +0200
+
+    [tests] Add test for fallback positioning with cluster_level > 0
+
+    For https://github.com/behdad/harfbuzz/pull/123
+    Currently fails.  Fix coming.
+
+ test/shaping/Makefile.am                                  |   1 +
+ .../sha1sum/6466d38c62e73a39202435a4f73bf5d6acbb73c0.ttf  | Bin 0 ->
+ 824 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                       |   1 +
+ test/shaping/tests/MANIFEST                               |   1 +
+ test/shaping/tests/cluster.tests                          |   1 +
+ 5 files changed, 4 insertions(+)
+
+commit bd22a5cfae24b3b9253bccaeb139e698e74cd0c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 7 11:13:27 2015 +0200
+
+    Bug 91559 - HarfBuzz 1.0.1: Inconsistent DLL files
+    specified/created...
+
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=91559
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 02d6439f420d959183dd446abd0b0118ee1ee061
+Merge: 9002c27b 160f6355
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 3 22:47:18 2015 +0300
+
+    Merge pull request #122 from RomainNaour/static-fix
+
+    fix static linking with icu-uc
+
+commit 160f635523d596f61e292776f638d4eb09673463
+Author: Romain Naour <romain.naour@openwide.fr>
+Date:   Wed Jul 22 23:26:23 2015 +0200
+
+    fix static linking with icu-uc
+
+    When linking test-unicode statically it needs $(ICU_LIBS)
+    which contains all required flags.
+    Especially -lstdc++.
+
+    Fixes:
+    http://autobuild.buildroot.net/results/210/2107f9dfb39eeb6559fb4271c7af8b39aef521ca/
+
+    Signed-off-by: Romain Naour <romain.naour@openwide.fr>
+
+ test/api/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9002c27b2f54bb5135db92045c0d770b47317577
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 27 12:17:54 2015 +0200
+
+    1.0.1
+
+ NEWS         | 9 ++++++++-
+ configure.ac | 2 +-
+ 2 files changed, 9 insertions(+), 2 deletions(-)
+
+commit f1c20e1ba5bf218df7dc3e198bdcf1f449fc9387
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 27 12:16:02 2015 +0200
+
+    [USE] Fix out-of-bounds static array access
+
+ src/hb-ot-shape-complex-use.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 260442346a5756c3538ee8fcbf157d1cddcf6f36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 26 23:39:10 2015 +0200
+
+    1.0.0
+
+ NEWS            | 10 ++++++++++
+ configure.ac    |  4 ++--
+ src/Makefile.am |  2 +-
+ 3 files changed, 13 insertions(+), 3 deletions(-)
+
+commit df6cb84449a473d540821e41fb5007b59644780f
+Merge: 2ed6be66 786ba458
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 26 19:40:55 2015 +0200
+
+    Merge branch 'use'
+
+commit 2ed6be66703e6cc67f3a3746e197001dad3d9b74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 26 19:29:53 2015 +0200
+
+    0.9.42
+
+ NEWS         | 12 ++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit 23e56e088a721863cfdef4f027fb66eecbd77457
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 25 17:36:46 2015 +0200
+
+    Fix broken sentence
+
+ src/hb-set-private.hh | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit 91a2e5d2878a8c0b4d4500e3d52d4fbaaf1ac0d7
+Author: Grigori Goronzy <greg@chown.ath.cx>
+Date:   Wed Jul 8 23:28:11 2015 +0200
+
+    Update UCDN to upstream commit 8af93f30
+
+    This adds support for Unicode 8.0 and fixes a bug with wrong
+    properties
+    for ranges of codepoints.
+
+ src/hb-ucdn.cc               |    6 +
+ src/hb-ucdn/ucdn.h           |    6 +
+ src/hb-ucdn/unicodedata_db.h | 2167
+ +++++++++++++++++++++---------------------
+ 3 files changed, 1118 insertions(+), 1061 deletions(-)
+
+commit 786ba45847127b9cd4d9c0c01ae0e6c61f3a8e06
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 23 13:04:34 2015 +0100
+
+    [test] Encode Kharoshti text
+
+    Ouch!
+
+ .../in-tree/shaper-use/script-kharoshti/misc.txt   | 72
+ +++++++++++-----------
+ 1 file changed, 36 insertions(+), 36 deletions(-)
+
+commit b4231255032e243153a6f32cf8c93c158cb0bf6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 23 13:01:55 2015 +0100
+
+    [test] Add Batak and Buginese test texts
+
+ test/shaping/texts/in-tree/shaper-use/MANIFEST     |  2 +
+ .../texts/in-tree/shaper-use/script-batak/MANIFEST |  1 +
+ .../texts/in-tree/shaper-use/script-batak/misc.txt |  9 +++
+ .../in-tree/shaper-use/script-buginese/MANIFEST    |  1 +
+ .../in-tree/shaper-use/script-buginese/misc.txt    | 70
+ ++++++++++++++++++++++
+ 5 files changed, 83 insertions(+)
+
+commit b8c159ffccad090974a2b97be0a0140fa09af132
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 23 12:59:17 2015 +0100
+
+    [test] Remove shaper-sea texts under shaper-use
+
+ test/shaping/texts/in-tree/MANIFEST                                     |
+ 1 -
+ test/shaping/texts/in-tree/shaper-sea/MANIFEST                          |
+ 2 --
+ test/shaping/texts/in-tree/shaper-sea/script-cham/MANIFEST              |
+ 1 -
+ test/shaping/texts/in-tree/shaper-sea/script-tai-tham/MANIFEST          |
+ 1 -
+ test/shaping/texts/in-tree/shaper-use/MANIFEST                          |
+ 2 ++
+ .../{shaper-sea/script-cham/misc => shaper-use/script-cham}/MANIFEST
+ | 0
+ .../{shaper-sea/script-cham/misc => shaper-use/script-cham}/misc.txt
+ | 0
+ .../script-tai-tham/misc => shaper-use/script-tai-tham}/MANIFEST
+ | 0
+ .../script-tai-tham/misc => shaper-use/script-tai-tham}/misc.txt
+ | 0
+ .../script-tai-tham/misc => shaper-use/script-tai-tham}/torture.txt
+ | 0
+ 10 files changed, 2 insertions(+), 5 deletions(-)
+
+commit 67ba7320cc5545baeacfcff64cea338223b9bd6d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 23 12:58:21 2015 +0100
+
+    [test] Remove New Tai Lue texts
+
+    New Tai Lue changed encoding to visual, boring, model.
+
+ test/shaping/texts/in-tree/shaper-sea/MANIFEST                         |
+ 1 -
+ test/shaping/texts/in-tree/shaper-sea/script-new-tai-lue/MANIFEST      |
+ 1 -
+ test/shaping/texts/in-tree/shaper-sea/script-new-tai-lue/misc/MANIFEST |
+ 1 -
+ test/shaping/texts/in-tree/shaper-sea/script-new-tai-lue/misc/misc.txt |
+ 1 -
+ 4 files changed, 4 deletions(-)
+
+commit c81d957a264539dfe3252f9a94ee066c4a44edf4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 23 12:50:48 2015 +0100
+
+    [test] Add tests for improved 'vert' feature
+
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/191826b9643e3f124d865d617ae609db6a2ce203.ttf | Bin 0 ->
+ 2140 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   1 +
+ test/shaping/tests/MANIFEST                              |   1 +
+ test/shaping/tests/vertical.tests                        |   1 +
+ 5 files changed, 4 insertions(+)
+
+commit 8a6a16dbcb1808c7ed50f9ba320384565bbf405a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 23 12:49:09 2015 +0100
+
+    [test] Add recently added test
+
+    Ouch.
+
+ test/shaping/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 895fb31c7f0201f13df5a6866b367476bc4aab2e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 23 12:14:03 2015 +0100
+
+    [test] Support additional options to hb-shape in micro-test suite
+
+ test/shaping/record-test.sh                        | 47
+ ++++++++++++++++++----
+ test/shaping/run-tests.sh                          |  9 ++++-
+ test/shaping/tests/arabic-fallback-shaping.tests   |  2 +-
+ test/shaping/tests/arabic-feature-order.tests      |  6 +--
+ test/shaping/tests/context-matching.tests          |  6 +--
+ test/shaping/tests/default-ignorables.tests        |  2 +-
+ test/shaping/tests/hangul-jamo.tests               |  4 +-
+ test/shaping/tests/indic-joiner-candrabindu.tests  |  4 +-
+ test/shaping/tests/indic-old-spec.tests            |  4 +-
+ test/shaping/tests/indic-pref-blocking.tests       |  4 +-
+ .../tests/mongolian-variation-selector.tests       |  6 +--
+ test/shaping/tests/zero-width-marks.tests          |  4 +-
+ 12 files changed, 67 insertions(+), 31 deletions(-)
+
+commit 0f98fe88f42471eb8fb28d08d45eca9cd8303f7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 23 11:52:11 2015 +0100
+
+    [ot] Search globally for 'vert' feature if not found in specified
+    script/lang
+
+    Fixes https://github.com/behdad/harfbuzz/issues/63
+
+ src/hb-ot-layout-private.hh |  9 +++++++++
+ src/hb-ot-layout.cc         | 22 ++++++++++++++++++++++
+ src/hb-ot-map-private.hh    |  7 ++++---
+ src/hb-ot-map.cc            | 10 ++++++++++
+ src/hb-ot-shape.cc          |  6 +++++-
+ 5 files changed, 50 insertions(+), 4 deletions(-)
+
+commit f327aacfa107bbef0c823ef9c3b7dfc91316040c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 23 11:32:59 2015 +0100
+
+    [ot] Minor
+
+ src/hb-ot-shape.cc | 11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+commit d78463c8016ff1852233479a1ebde30c3bb6de6e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 23 10:11:35 2015 +0100
+
+    Minor debug output fix
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d99f50bde0e8be0866385ca6886938d2023dbd4f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 23 10:08:48 2015 +0100
+
+    Add missing TRACE_RETURN
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2dc8e3f470d7c0b579f867605b8bf40688bc5722
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 23 10:07:21 2015 +0100
+
+    [ot] Add missing return!
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 582069172c39326c7f94373793c656439a4c2b59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 18:44:59 2015 +0100
+
+    Add test case for deleting default ignorables with positioning
+
+ .../sha1sum/051d92f8bc6ff724511b296c27623f824de256e9.ttf | Bin 0 ->
+ 2028 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   1 +
+ test/shaping/tests/MANIFEST                              |   1 +
+ test/shaping/tests/default-ignorables.tests              |   1 +
+ 4 files changed, 3 insertions(+)
+
+commit 8cfbc304ee563ec96e402beed34b10b6c0950a6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 18:41:10 2015 +0100
+
+    Fix hide-default-ignorables after
+    f0010dfd01ef4a927b0bdc175dd4e343a8637174
+
+    We can't delete things before hb_ot_layout_position_finish().  So,
+    just zero the advance before it, and remove later.
+
+ src/hb-ot-shape.cc | 25 +++++++++++++++++++------
+ 1 file changed, 19 insertions(+), 6 deletions(-)
+
+commit 2dbd3d29d6548bd96fd976606ed689fac8ad8817
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 18:28:39 2015 +0100
+
+    Fix hide-ignorables if font doesn't have space glyph
+
+    Was broken by 82b521aeb7cc73879b44ca4278d6fa8b4347527f, as we have
+    positioning data by then and can't use the output buffer.  Ouch!
+
+ src/hb-buffer-private.hh | 18 ------------------
+ src/hb-ot-shape.cc       | 44
+ +++++++++++++++++++++++++++++++++++---------
+ 2 files changed, 35 insertions(+), 27 deletions(-)
+
+commit 4ba796b26ee62de0d2830a550f3aa3b4aecf6f59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 17:41:31 2015 +0100
+
+    Refactor _hb_glyph_info_is_default_ignorable()
+
+ src/hb-ot-layout-gsubgpos-private.hh | 3 +--
+ src/hb-ot-layout-private.hh          | 4 +++-
+ src/hb-ot-shape.cc                   | 9 +++------
+ 3 files changed, 7 insertions(+), 9 deletions(-)
+
+commit f0010dfd01ef4a927b0bdc175dd4e343a8637174
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 17:36:23 2015 +0100
+
+    [ot] Hide default-ignorables before finishing off positioning
+
+    For example, fixes the following sequence with Arial XP:
+    628 25cc 651 25cc 64e 3a 20 628 651 34f 64e
+    628 25cc 64e 25cc 651 3a 20 628 64e 34f 651
+
+    Discovered as part of:
+    https://bugs.freedesktop.org/show_bug.cgi?id=85873
+
+ src/hb-ot-shape.cc | 125
+ +++++++++++++++++++++++++++--------------------------
+ 1 file changed, 63 insertions(+), 62 deletions(-)
+
+commit 376d587f36b4ff10342ee6ca3bacd73532ea44c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 16:51:12 2015 +0100
+
+    Implement more granular cluster-merging
+
+    TODO: Documentation.
+
+    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=71445
+
+ NEWS                              |  8 +++++++
+ src/hb-buffer-private.hh          |  1 +
+ src/hb-buffer.cc                  | 46
+ ++++++++++++++++++++++++++++++++++-----
+ src/hb-buffer.h                   | 12 ++++++++++
+ src/hb-ot-shape-complex-hangul.cc | 13 +++++------
+ src/hb-ot-shape.cc                |  7 ++++++
+ util/options.cc                   |  1 +
+ util/options.hh                   |  3 +++
+ 8 files changed, 77 insertions(+), 14 deletions(-)
+
+commit a60e2cfa395718cde48eb81f43adc27b4a92e117
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 15:49:08 2015 +0100
+
+    [ot] Don't rely on cluster numbers for ensure_native_direction()
+
+ src/hb-ot-shape.cc | 19 ++++++++++++++++++-
+ 1 file changed, 18 insertions(+), 1 deletion(-)
+
+commit 701112dad9f6e690b253f1e64f4e7e549f5ae65f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 15:42:20 2015 +0100
+
+    [ot] Simplify form_clusters()
+
+ src/hb-buffer-private.hh |  9 ++++++++-
+ src/hb-buffer.cc         |  7 ++-----
+ src/hb-ot-shape.cc       | 11 +++++++++--
+ 3 files changed, 19 insertions(+), 8 deletions(-)
+
+commit 7b8b63adc5e0389fc4cf2720ef7e5804ab6c29cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 15:24:26 2015 +0100
+
+    [ot] Don't mirror character if font doesn't support mirrored
+    character!
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 97d7c3a100e2673279f066540229d229aaf0df78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 14:28:25 2015 +0100
+
+    [graphite2] Fix bunch of stuff
+
+    Based on patch from Martin Hosken, with review from Jonathan and I.
+
+ src/hb-graphite2.cc | 82
+ +++++++++++++++++++++++++++++++++++------------------
+ 1 file changed, 54 insertions(+), 28 deletions(-)
+
+commit ea7f8414e34d4b5efc7b98974637c08f75440f0e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 13:53:45 2015 +0100
+
+    [graphite2] Enlarge buffer for output glyphs!
+
+ src/hb-graphite2.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 9cd59db1af47ff511edf251949d58b82673cf704
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 13:27:06 2015 +0100
+
+    [USE] Implement topographical features for non-Arabic-joining scripts
+
+    This works per-syllable as per the spec, but we think it should be per
+    spacing/base/??? glyph instead.
+
+ src/hb-ot-shape-complex-use.cc | 87
+ ++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 80 insertions(+), 7 deletions(-)
+
+commit ecb0b24ef3f8177e7c789f45a2e858bd67e31be3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 12:02:09 2015 +0100
+
+    Use foreach_cluster in Indic shaper
+
+ src/hb-ot-shape-complex-indic.cc | 90
+ +++++++++-------------------------------
+ 1 file changed, 19 insertions(+), 71 deletions(-)
+
+commit 56f71ff98890fc4fd13e8d9743dc34c4b9407309
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 11:58:11 2015 +0100
+
+    Use foreach_syllable in Myanmar shaper
+
+ src/hb-ot-shape-complex-myanmar.cc | 62
+ ++++++++------------------------------
+ 1 file changed, 12 insertions(+), 50 deletions(-)
+
+commit ac596511a8c9eeaeb455ca16b5b9c5f1b9923b3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 11:54:02 2015 +0100
+
+    Add foreach_syllable
+
+    Use it in USE.
+
+ src/hb-ot-layout-private.hh    |  24 ++++++++
+ src/hb-ot-shape-complex-use.cc | 129
+ +++++++++++++----------------------------
+ 2 files changed, 64 insertions(+), 89 deletions(-)
+
+commit 8ba9e689680f7685c04cfe7c6019222bdf0c52b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 11:16:01 2015 +0100
+
+    [USE] Do Arabic-like shaping
+
+ src/hb-ot-shape-complex-use.cc | 77
+ ++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 75 insertions(+), 2 deletions(-)
+
+commit 9daf2dfb6bd5683fd951bdf166c8b87938257e52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 22 10:32:30 2015 +0100
+
+    Add hb-ot-shape-complex-arabic-private.hh
+
+ src/Makefile.am                           |  1 +
+ src/hb-ot-shape-complex-arabic-private.hh | 50
+ +++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-arabic.cc         | 37 +++++++++++++----------
+ 3 files changed, 73 insertions(+), 15 deletions(-)
+
+commit a51a661fe1dcfdd3a274a6be6ad741c68d430c8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 18:24:21 2015 +0100
+
+    [USE] Only reorder the first component of a split left mark
+
+ src/hb-ot-shape-complex-use.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit a08a278b15c7e57a1d0a783f2bc877471b9d8229
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 18:09:40 2015 +0100
+
+    [USE] Don't compose split matras
+
+    Same logic as in Indic shaper.
+
+ src/hb-ot-shape-complex-use.cc | 15 ++++++++++++++-
+ 1 file changed, 14 insertions(+), 1 deletion(-)
+
+commit 21cb08a417f1203523191192d6a342e8cd0ea14c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 17:47:06 2015 +0100
+
+    Remove unused SEA shaper
+
+ src/Makefile.am                        |   4 -
+ src/hb-ot-shape-complex-sea-machine.rl | 102 ---------
+ src/hb-ot-shape-complex-sea.cc         | 380
+ ---------------------------------
+ 3 files changed, 486 deletions(-)
+
+commit db1e9cdd41ff7c97c29b4d9b64b2351ed0ef0403
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 17:46:06 2015 +0100
+
+    Retire SEA shaper in favor of USE
+
+ src/hb-ot-shape-complex-private.hh | 25 +++----------------------
+ 1 file changed, 3 insertions(+), 22 deletions(-)
+
+commit 87dde9c64753dea4017f11a7734e7528b8eecac0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 17:31:43 2015 +0100
+
+    [USE] Only use USE shaper if script system is not DFLT
+
+    Same logic as Indic and SEA.
+
+ src/hb-ot-shape-complex-private.hh | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+commit 29832d797ff2f3a96721dd44f2f03a83fb2e8dda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 17:24:18 2015 +0100
+
+    Route misc untested scripts through USE shaper instead of Indic
+
+    These were never tested with Indic shaper, and indeed wouldn't
+    work there
+    because they didn't have their viramas and other config defined.
+    They are
+    all also supported by MS through USE, so route them there.
+
+ src/hb-ot-shape-complex-private.hh | 91
+ +++++---------------------------------
+ 1 file changed, 11 insertions(+), 80 deletions(-)
+
+commit 40c4a991c7ea18017273ff8993eecc3953869e69
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 17:14:54 2015 +0100
+
+    [USE] Implement dotted-circle
+
+    This makes USE feature-complete as far as the Indic-like features
+    are concerned.
+
+ src/hb-ot-shape-complex-use-machine.rl | 10 ++++++++++
+ src/hb-ot-shape-complex-use.cc         | 18 +++++++++++++++---
+ 2 files changed, 25 insertions(+), 3 deletions(-)
+
+commit 7ce03ebe7c525919ce22d9094480847ff1b3c2b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 16:55:26 2015 +0100
+
+    [USE] Move pref
+
+ src/hb-ot-shape-complex-use-machine.rl |  9 +++++----
+ src/hb-ot-shape-complex-use-private.hh |  9 +++++----
+ src/hb-ot-shape-complex-use.cc         | 24 ++++++++++++++++++++++--
+ 3 files changed, 32 insertions(+), 10 deletions(-)
+
+commit 2d4b62ead931b13f95f5dc0e5b740d997a8d1a8e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 16:46:37 2015 +0100
+
+    [USE] Fix-up variation selectors and word joiner in table
+
+ src/gen-use-table.py                 |  7 ++++++-
+ src/hb-ot-shape-complex-use-table.cc | 34
+ +++++++++++++++++++++++-----------
+ 2 files changed, 29 insertions(+), 12 deletions(-)
+
+commit ad7178227f16abc17456f122deac1508031cbbc3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 16:43:27 2015 +0100
+
+    [USE] Use a couple warnings
+
+ src/gen-use-table.py                 | 20 ++++-----
+ src/hb-ot-shape-complex-use-table.cc | 82
+ ++++++++++++++++++------------------
+ 2 files changed, 51 insertions(+), 51 deletions(-)
+
+commit a85c4da9b1750c2f994f9f85226a3e755fafe50b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 16:07:10 2015 +0100
+
+    [USE] Move rphf
+
+ src/hb-ot-shape-complex-use.cc | 105
+ ++++++++++++++---------------------------
+ 1 file changed, 35 insertions(+), 70 deletions(-)
+
+commit 5b5617e0664e59770910d04d15175f643a5ffb73
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 15:52:15 2015 +0100
+
+    Add FLAG_UNSAFE()
+
+    Unused right now.
+
+ src/hb-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f8160a495966c790b79134a9f9382b6545f8c733
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 15:50:02 2015 +0100
+
+    Add FLAG_SAFE() for values known to be small-enough
+
+    And add check to FLAG()
+
+ src/hb-ot-shape-complex-arabic.cc  |  2 +-
+ src/hb-ot-shape-complex-indic.cc   | 12 ++++++------
+ src/hb-ot-shape-complex-myanmar.cc |  2 +-
+ src/hb-private.hh                  |  5 +++--
+ src/hb-unicode-private.hh          |  2 +-
+ 5 files changed, 12 insertions(+), 11 deletions(-)
+
+commit 366aeaad006b230481a3c08ab4d239fb6b64fef8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 15:45:48 2015 +0100
+
+    Add note re ASSERT_STATIC_EXPR_ZERO()
+
+ src/hb-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit d6adca9fbbbd6fc7c8906121b50c3930fbe2de8e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 15:17:27 2015 +0100
+
+    Remove unused macro ASSERT_STATIC_EXPR()
+
+ src/hb-ot-shape-complex-arabic-win1256.hh | 4 ++--
+ src/hb-ot-shape-complex-indic-private.hh  | 2 --
+ src/hb-private.hh                         | 1 -
+ 3 files changed, 2 insertions(+), 5 deletions(-)
+
+commit 1025e1a9e7785ac67cc90d05b02862e38b3e6026
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 15:05:35 2015 +0100
+
+    Use unsigned in FLAG()
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cf59c7589c2b4064f4b9f4936115f830089a8ee7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 14:51:45 2015 +0100
+
+    [USE] Use use_category() for rphf/pref memory
+
+ src/hb-ot-shape-complex-use.cc | 63
+ +++++++++++++++---------------------------
+ 1 file changed, 22 insertions(+), 41 deletions(-)
+
+commit 595936ec25e9c0924851bd1aa1af5eed3723b54f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 14:15:35 2015 +0100
+
+    [USE] Hook of rphf and pref custom processing
+
+    Still no reordering.
+
+ src/hb-ot-layout-private.hh    |   8 ++
+ src/hb-ot-shape-complex-use.cc | 181
+ +++++++++++++++++++++++++++++++++++++++--
+ 2 files changed, 181 insertions(+), 8 deletions(-)
+
+commit ba72801325e4bd58f7597938d4409762c9fa530c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 11:57:23 2015 +0100
+
+    [USE] Add CGJ to table
+
+ src/gen-use-table.py                 | 13 ++++++++++---
+ src/hb-ot-shape-complex-use-table.cc |  1 +
+ 2 files changed, 11 insertions(+), 3 deletions(-)
+
+commit 4febed61edc5367543e5a206ae01d3393841b612
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 10:24:32 2015 +0100
+
+    [USE] Set up features
+
+ src/hb-ot-shape-complex-use.cc | 68
+ +++++++++++++++++++++++-------------------
+ 1 file changed, 38 insertions(+), 30 deletions(-)
+
+commit 52a957795697085a5d379921ddd8aa6cf2f1a99d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 10:02:04 2015 +0100
+
+    [USE] Hook up new scripts to USE shaper
+
+    Don't reroute scripts that we were routing to other shapers
+    before (just yet).
+
+ src/hb-ot-shape-complex-private.hh | 71
+ ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 71 insertions(+)
+
+commit b4c0829bc18b696f140a260fa2e1089d10164519
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 21 09:31:19 2015 +0100
+
+    [USE] Remove unused Unicode data enums from USE C++ side
+
+ src/hb-ot-shape-complex-use-private.hh | 66
+ +---------------------------------
+ src/hb-ot-shape-complex-use.cc         | 14 ++------
+ 2 files changed, 3 insertions(+), 77 deletions(-)
+
+commit 44910cef626e6d03baa4d89d8fbe2c088971902d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 20 18:01:10 2015 +0100
+
+    [USE] Finish converting Unicode positional categories to USE
+
+    Even compiles.
+
+ src/gen-use-table.py                 | 114 +++++-
+ src/hb-ot-shape-complex-use-table.cc | 702
+ ++++++++++++++++++-----------------
+ 2 files changed, 467 insertions(+), 349 deletions(-)
+
+commit ad725552521273a1f571f04bc96a04221c3e067a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 20 17:00:06 2015 +0100
+
+    [USE] Map from Unicode data to USE syllabic categories
+
+    Positional sub-categories not applied yet.
+
+ src/gen-use-table.py                 |  128 ++--
+ src/hb-ot-shape-complex-use-table.cc | 1062
+ ++++++++++++----------------------
+ 2 files changed, 409 insertions(+), 781 deletions(-)
+
+commit 20e246e674155d5fb6527722fc3ef3accf2413df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 20 15:56:19 2015 +0100
+
+    [USE] Start moving Unicode-to-USE mapping into Python code
+
+ src/Makefile.am                      |   2 +-
+ src/gen-use-table.py                 | 176
+ +++++++++++++++++++++++++++++++++--
+ src/hb-ot-shape-complex-use-table.cc |   3 +-
+ 3 files changed, 169 insertions(+), 12 deletions(-)
+
+commit eb74535cc2c0d0de41e54e75bdc71825ec969523
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 20 15:33:25 2015 +0100
+
+    [USE] Fix Number clusters
+
+    The spec wrongly has "H" where "HN" is meant.
+
+ src/hb-ot-shape-complex-use-machine.rl | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a9663958fe861950b6f389b389f146232b2cd909
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 20 14:24:55 2015 +0100
+
+    [USE] Start putting together the shaper body
+
+ src/hb-ot-shape-complex-use-private.hh |   2 +-
+ src/hb-ot-shape-complex-use.cc         | 339
+ +++++++++++++++++++++++++++++++++
+ 2 files changed, 340 insertions(+), 1 deletion(-)
+
+commit e0eabd7f67462ac34fbfc749d897be478fbd1224
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 20 13:30:51 2015 +0100
+
+    [USE] Put a Ragel machine together
+
+    Grammar from the spec!
+
+ src/hb-ot-shape-complex-use-machine.rl | 169
+ +++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-use-private.hh | 160
+ +++++++++++++++++++++++++++++++
+ 2 files changed, 329 insertions(+)
+
+commit fd74b939b176f47d34d34b3d33e2a09d255c2d9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 20 13:30:45 2015 +0100
+
+    Minor
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5e5c8560cca3cb9c6be90c7c18ecb77d5cca0c0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 20 12:01:20 2015 +0100
+
+    [USE] Minor optimization of USE table
+
+ src/gen-use-table.py                 |  2 +-
+ src/hb-ot-shape-complex-use-table.cc | 30 ++++++++++++------------------
+ 2 files changed, 13 insertions(+), 19 deletions(-)
+
+commit 14b12f92a9ef7db57c5252ef0442239319ce4bca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 20 11:57:44 2015 +0100
+
+    [USE] Add Kharoshti test data from Unicode proposal
+
+ test/shaping/texts/in-tree/MANIFEST                |  1 +
+ test/shaping/texts/in-tree/shaper-use/MANIFEST     |  1 +
+ .../in-tree/shaper-use/script-kharoshti/MANIFEST   |  1 +
+ .../in-tree/shaper-use/script-kharoshti/misc.txt   | 36
+ ++++++++++++++++++++++
+ 4 files changed, 39 insertions(+)
+
+commit c48ff288522f33dc6c78520de0a0a74306630895
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 20 11:46:17 2015 +0100
+
+    [USE] Build Universal Shaping Engine data table from Unicode 8 files
+
+ src/gen-use-table.py                 |   35 +-
+ src/hb-ot-shape-complex-use-table.cc | 1016
+ ++++++++++++++++++++++++++++++++++
+ 2 files changed, 1032 insertions(+), 19 deletions(-)
+
+commit e2c95116e1423f83a692d6170553d0cc95733d24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 20 11:32:48 2015 +0100
+
+    [USE] Add Universal Shaping Engine to Makefile
+
+ src/Makefile.am                        |  23 +++-
+ src/gen-use-table.py                   | 237
+ +++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-use-machine.rl |   0
+ src/hb-ot-shape-complex-use-private.hh |   0
+ src/hb-ot-shape-complex-use-table.cc   |   0
+ src/hb-ot-shape-complex-use.cc         |   0
+ 6 files changed, 254 insertions(+), 6 deletions(-)
+
+commit 41a29af8053782e3a9c6a96a394bd76ef6d42099
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 15 01:39:57 2015 +0100
+
+    Update Arabic shaping table for Unicode 8.0
+
+ src/hb-ot-shape-complex-arabic-table.hh | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit 64a2726e2c6efce4379a7609024ec21eb4b5e4dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 15 01:36:39 2015 +0100
+
+    Add Unicode 8.0 scripts
+
+    Based on https://bugzilla.mozilla.org/show_bug.cgi?id=1183209
+
+ src/hb-common.cc | 3 +++
+ src/hb-common.h  | 7 +++++++
+ 2 files changed, 10 insertions(+)
+
+commit 9ae156b76820d9079bae062e7e38c34a386d9bd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 5 22:43:17 2015 +0100
+
+    Fix pragma usage
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=91228
+
+    Commit cdcdfe61b97a0a48ccf834b6d924d187da9609be changed two `#pragma
+    message` to `#pragma error` in hb-unicode.cc, however MSVC uses
+    #error,
+    just like the #else branch. `#pragma error` is an unknown pragma so
+    MSVC does not fail the build because of it, which I believe was the
+    intention of that commit.
+
+    If it's meant to be an #error, then the #ifdef for _MSC_VER can be
+    removed entirely.
+
+ src/hb-unicode.cc |  5 -----
+ src/hb-warning.cc | 10 ----------
+ 2 files changed, 15 deletions(-)
+
+commit 8ad89f057d737ccbc6f411e9ebcf11b8130a50bb
+Author: ThePhD <phdofthehouse@gmail.com>
+Date:   Tue Jun 23 09:09:24 2015 -0400
+
+    Spelling words is not my strong point.
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e0a828ecbd708757d67977f7e92a6f4c1b0b92fd
+Author: ThePhD <phdofthehouse@gmail.com>
+Date:   Tue Jun 23 09:07:17 2015 -0400
+
+    Back to using regular `strdup`, with an `hb-private.hh` fix that
+    special-cases VC++'s
+    definition and usage of the words
+
+ src/hb-common.cc  | 2 +-
+ src/hb-private.hh | 3 +++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 8e545d59610211261e684c10158b9e5df6fae24d
+Author: ThePhD <phdofthehouse@gmail.com>
+Date:   Mon Jun 22 22:29:04 2015 -0400
+
+    Fix all VC++ warnings and errors in the current commit's builds.
+
+ src/hb-common.cc                  | 4 ++--
+ src/hb-fallback-shape.cc          | 2 +-
+ src/hb-ot-layout.cc               | 2 +-
+ src/hb-ot-map.cc                  | 2 +-
+ src/hb-ot-shape-complex-hangul.cc | 2 +-
+ src/hb-ot-shape-complex-hebrew.cc | 2 +-
+ src/hb-ot-shape-complex-indic.cc  | 4 ++--
+ src/hb-ot-shape-normalize.cc      | 6 +++---
+ src/hb-ot-shape.cc                | 2 +-
+ 9 files changed, 13 insertions(+), 13 deletions(-)
+
+commit 5f13bbd9d4b0970851626e2ce3cf4ecb3cfde801
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 19 13:31:49 2015 -0700
+
+    When removing default-ignorables, merge clusters
+
+    Fixes test-shape, and:
+    https://code.google.com/p/chromium/issues/detail?id=497578
+
+ src/hb-buffer-private.hh |  2 ++
+ src/hb-buffer.cc         | 36 ++++++++++++++++++++++++++++++++++--
+ src/hb-ot-shape.cc       |  2 +-
+ 3 files changed, 37 insertions(+), 3 deletions(-)
+
+commit 82b521aeb7cc73879b44ca4278d6fa8b4347527f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 19 11:57:57 2015 -0700
+
+    Rewrite hide_default_ignorables
+
+    Separate the loops for the two cases of replacing with space
+    and deleting.  For deleting, use the out-buffer machinery.
+
+    Needed for upcoming cluster merge fix.
+
+ src/hb-buffer-private.hh | 18 ++++++++++++++
+ src/hb-ot-shape.cc       | 65
+ +++++++++++++++++++++++++++++-------------------
+ 2 files changed, 57 insertions(+), 26 deletions(-)
+
+commit b3a2f6afbac1956b65f29a17b9dc896e86135329
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 17:15:33 2015 -0700
+
+    [test] Add test for cluster merging
+
+    Based on test from
+    https://code.google.com/p/chromium/issues/detail?id=497578
+
+    Currently fails.  Basically, if there's a default_ignorable at the
+    start of text, and font has no space glyph, we remove the
+    default_ignorable,
+    and that makes the first char in text to correspond to no cluster.
+
+    Fix coming.
+
+ test/api/test-shape.c | 43 +++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 43 insertions(+)
+
+commit a6446d44e6d04e1eeea994682e29f9cb6265f7f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 11:14:56 2015 -0700
+
+    0.9.41
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit cd042fc8c4a3984c3647cd22a27c34f00636f6e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 10:55:13 2015 -0700
+
+    [util] Disable hb-fc-list for now
+
+    Until I figure out what to do about the API, and finalize
+    the tool.
+
+ util/Makefile.am | 28 ++++++++++++++--------------
+ 1 file changed, 14 insertions(+), 14 deletions(-)
+
+commit 351f68f4e01a107f62e4eb3458d7c7ae379939fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 12 17:46:06 2015 -0700
+
+    [bindings] Fix hb_language_get_default() and hb_ot_tag_to_language()
+
+    Part of https://github.com/behdad/harfbuzz/issues/91
+
+ src/hb-common.cc | 2 +-
+ src/hb-ot-tag.cc | 9 +++++++++
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit f0c80060763475aa34a18ecbef600b6811855cb6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 12 17:37:41 2015 -0700
+
+    [TravisCI] Hook up Coverity
+
+    First try...
+
+ .travis.yml | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit 8ac446908ca75bea989414a0f551a6da8885bf52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 12 17:29:05 2015 -0700
+
+    Add Coverity Scan badge
+
+ README | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit a5e4f6d6088f6ed37fb1d68d3682b8eb4c9b46fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 10 10:57:46 2015 -0700
+
+    Fix warnings: "member call on null pointer of type"
+
+    https://bugzilla.mozilla.org/show_bug.cgi?id=1167119
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 16dac7eccf04bb357e95a8e4c18c8418dcfb4030
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 3 12:07:46 2015 -0700
+
+    Fix build
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8dacb7f8b46c70f22b70c78e0a8efc3309137650
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 3 11:53:42 2015 -0700
+
+    Add include check to hb-ot-font.h
+
+ src/hb-ot-font.h | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 37c8daf724add4a41a06385e571277d137dc2a2f
+Merge: f1b44303 01c3a885
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 1 13:27:37 2015 -0700
+
+    Merge pull request #111 from brawer/since
+
+    Fix "Since:" tags
+
+commit 01c3a88543850c87483fd8671044df53b368c520
+Author: Sascha Brawer <sascha@brawer.ch>
+Date:   Mon Jun 1 13:22:01 2015 +0200
+
+    Fix "Since:" tags
+
+    Based on data from http://upstream-tracker.org/versions/harfbuzz.html
+    Resolves #103
+
+ src/hb-buffer.cc         | 32 +++++++++++++++++------------
+ src/hb-common.cc         |  4 ++--
+ src/hb-face.cc           | 12 +++++------
+ src/hb-font.cc           | 14 ++++++-------
+ src/hb-font.h            |  4 ++--
+ src/hb-ft.cc             |  4 ++--
+ src/hb-glib.cc           |  3 +++
+ src/hb-gobject-structs.h | 18 +++++++++++++++++
+ src/hb-ot-font.cc        |  3 +++
+ src/hb-ot-layout.cc      | 30 ++++++++++++++++++++++++++++
+ src/hb-ot-shape.cc       |  6 ++++++
+ src/hb-set.cc            | 52
+ ++++++++++++++++++++++++------------------------
+ src/hb-shape-plan.cc     | 18 ++++++++---------
+ src/hb-shape.cc          |  8 ++++----
+ src/hb-unicode.cc        |  6 +++---
+ src/hb-unicode.h         | 31 ++++++++++++++++++++++++++---
+ 16 files changed, 168 insertions(+), 77 deletions(-)
+
+commit f1b44303df0712b433e35e1e1e75115c353b279e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 21 14:00:15 2015 -0700
+
+    Fix unary minus operator applied to unsigned int
+
+    Applying unary minus operator to unsigned int causes the following
+    warning on MSVS:
+
+      warning C4146: unary minus operator applied to unsigned type,
+      result still unsigned
+
+    Based on patch from Koji Ishi.
+
+    Fixes https://github.com/behdad/harfbuzz/pull/110
+
+ src/hb-ot-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1ae6cdb365c15405500d4f50ec98016dde23a26b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 19 17:42:30 2015 -0700
+
+    [gobject] Remove hb_language_t workarounds for g-i shortcomings
+
+    Using latest gobject-introspection, I don't seem to be having this
+    problem anymore:
+
+      https://bugzilla.gnome.org/show_bug.cgi?id=707656
+
+    Removing that kludge makes language_t behave more like the way I
+    expect it
+    in Python.
+
+    Also fixes:
+    https://github.com/behdad/harfbuzz/issues/91
+
+ src/hb-gobject-structs.cc | 1 -
+ src/hb-gobject-structs.h  | 8 --------
+ 2 files changed, 9 deletions(-)
+
+commit ece434fa0fec6754e5164d881c1e967376729eca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 19 17:20:58 2015 -0700
+
+    [gobject] Macroize value types
+
+    Fixes user_data_t
+
+ src/hb-gobject-structs.cc | 73
+ +++++++++++------------------------------------
+ 1 file changed, 17 insertions(+), 56 deletions(-)
+
+commit 9df099b4837df722e738675af318efcc9ac39a78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 18:37:06 2015 -0700
+
+    [ft] Don't set *glyph in get_glyph() if glyph not found
+
+ src/hb-ft.cc | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+commit ff0f210519bcb0e44d4b986f7eef2004383cd344
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 14:16:28 2015 -0700
+
+    [util] Minor
+
+ util/ansi-print.cc | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit fbecde3d5c5c6d5af315140e4966dc850388ad63
+Merge: 58015215 74139f98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 7 10:46:42 2015 -0700
+
+    Merge pull request #105 from ebraminio/master
+
+    Fix Travis CI config to pass again
+
+commit 74139f9839f69ea3e7a1d17627f52fea6c06d58a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 7 13:09:32 2015 +0000
+
+    Fix Travis CI config to pass again
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 58015215321a76d68df8e0d51039904a67291108
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 6 00:40:31 2015 -0700
+
+    Add note re OpenType 1.7 language tags
+
+ src/hb-ot-tag.cc | 15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+commit f6266ad291d7686d5e110255ace5f2ff9e70bf38
+Author: Roozbeh Pournader <roozbeh@google.com>
+Date:   Tue May 5 22:31:19 2015 -0700
+
+    [minor] Remove comment about Navajo OpenType code.
+
+    Apparently the code is already standardized:
+    https://www.microsoft.com/typography/otspec/languagetags.htm
+
+ src/hb-ot-tag.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 42b00118eae46a5183e885e89e0856f41361f57e
+Merge: c60f3c8e cfeb0562
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 5 14:49:47 2015 -0700
+
+    Merge pull request #102 from roozbehp/master
+
+    Add OpenType language tag 'NAV ' for Navajo.
+
+commit c60f3c8e1156fe7328d42851013cca97333c3bf7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 4 23:10:32 2015 -0700
+
+    [README.python] Add package name for gobject-introspection on Ubuntu
+
+ README.python | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 82010a4bdb32248deb1337a3357dfae5b203c48d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 4 23:09:51 2015 -0700
+
+    [travis] Comment out gobject-introspection again
+
+    Apparently the version on Travis is 1.32.0, while we require 1.34.0.
+
+ .travis.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8a254bdd29a99eb91b37e9e540179a1a01f77605
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 4 19:22:11 2015 -0700
+
+    [travis] Build with introspection enabled
+
+ .travis.yml | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit be66ec5373634234f221ace9cfed45d76b87f20e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 30 18:27:13 2015 -0400
+
+    Use TRUE/FALSE instead of true/false in docs
+
+ src/hb-shape.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit d055e1fc781c123f38d321846937965ef794257e
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Jan 8 02:28:55 2014 +0200
+
+    Some attempt into initial hb-shape documentation
+
+    Very anaemic, needs to descripe the format understood by
+    hb_feature_from_string() etc., but it is just start.
+
+ src/hb-shape.cc | 70
+ ++++++++++++++++++++++++++++++++++++++-------------------
+ src/hb-shape.h  |  3 ---
+ 2 files changed, 47 insertions(+), 26 deletions(-)
+
+commit 81bedda58cfc15f1987aa1952290cf9d87b4d074
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 30 13:04:16 2015 -0400
+
+    New API: hb_buffer_reverse_range()
+
+ src/hb-buffer.cc | 17 +++++++++++++++++
+ src/hb-buffer.h  |  4 ++++
+ 2 files changed, 21 insertions(+)
+
+commit cfeb0562ebd8804dad731625153549eafeb78213
+Author: Roozbeh Pournader <roozbeh@google.com>
+Date:   Wed Apr 29 09:32:42 2015 -0700
+
+    Add OpenType language tag 'NAV ' for Navajo.
+
+    The code is not standardized yet, but is used in some Google fonts.
+
+ src/hb-ot-tag.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f724cc351640ee075a9867ef42df32cf5e0ef3b7
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Thu Apr 23 12:45:02 2015 +0100
+
+    Don't apply Arabic shaping to vertical text.
+
+ src/hb-ot-shape-complex-private.hh | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 97942420bbee1bc6953d5f805621066301fa17ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 23 18:56:24 2015 -0700
+
+    Update check-libstdc++ for clang
+
+ src/check-libstdc++.sh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 8f0a4d67143ccdef0b5a6ac99fb9b680c3a2f69c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 23 14:32:33 2015 -0700
+
+    [test] Ignor 'n' and 'i' in hb-unicode-encode
+
+    Allows accepting uniXXXX format.
+
+ test/shaping/hb_test_tools.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 39851ce84efd30f6d0570324ff8f3808a01b813b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 21 19:23:27 2015 -0700
+
+    [coretext] Oops; fix issue number for previous commit
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 24f17afeafd40ff77177ed42c9007a0f34fcbb78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 21 19:21:32 2015 -0700
+
+    [coretext] Fix positioning with trailing whitespace
+
+    Fixes https://code.google.com/p/chromium/issues/detail?id=476913
+
+ src/hb-coretext.cc | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+commit dba482fc4458776ffebdeb2d34b970b4223fa8fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 17 13:08:08 2015 -0700
+
+    [ot-font] Accept MS Symbol cmap if nothing else found
+
+ src/hb-ot-font.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3029e8b59d1667dc6a53355be89a2b55d7089b88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 14 13:32:22 2015 -0700
+
+    Revert "Add MSVC pragma for UTF-8 source code"
+
+    This reverts commit 89cbd4d9533011fb5487caa99a0cd58923e7cf59.
+
+    See discussion:
+    https://bugzilla.gnome.org/show_bug.cgi?id=747772
+
+ src/hb-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 820505a186ff60e4bae9d717fe4d7ab2390e6fef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 13 23:51:45 2015 -0700
+
+    Whitespace
+
+ util/options.cc | 18 +++++++++++-------
+ 1 file changed, 11 insertions(+), 7 deletions(-)
+
+commit 76d57331117be8e0c2d4a2aee8341969b62b6888
+Merge: 89cbd4d9 9ee176ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 13 23:40:35 2015 -0700
+
+    Merge pull request #86 from cpfair/hb-shape-output-help-improvement
+
+    Improve hb-shape/hb-view's help text w.r.t. output options
+
+commit 89cbd4d9533011fb5487caa99a0cd58923e7cf59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 13 12:27:08 2015 -0700
+
+    Add MSVC pragma for UTF-8 source code
+
+    Not sure we have any right now; motivated by this:
+    https://bugzilla.gnome.org/show_bug.cgi?id=747772
+
+ src/hb-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 713f99ff6138b4149d9fd382f9af3ace01ee0da5
+Merge: 1086f21e 22524a51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 10 14:34:05 2015 -0700
+
+    Merge pull request #99 from khaledhosny/introspection-fixes2
+
+    More ntrospection fixes
+
+commit 22524a514f6609a2bc009b6035f6b5b932c719c7
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Apr 10 18:14:45 2015 +0200
+
+    [bindings] Fix hb_buffer_get_segment_properties
+
+    Annotate the output parameter.
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1086f21e546e2435d9da6024fd6afa7a36ba3707
+Merge: 125cb083 fe97b65a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 10 12:21:04 2015 -0700
+
+    Merge branch 'hb-fc'
+
+commit 125cb08345a7f27e565329d37093b1a60a41a403
+Merge: e8fd8393 855a5d7c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 10 12:19:57 2015 -0700
+
+    Merge pull request #98 from KonstantinRitt/WEC2013
+
+    Fix build on WEC2013
+
+commit 04f89e8f7dfdb882e8c98afb613cba3f1d02ed7d
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Apr 10 17:49:01 2015 +0200
+
+    [bindings] Fix ownership of returned hb_language_t
+
+    It should not be freed by the caller.
+
+ src/hb-buffer.cc | 2 +-
+ src/hb-common.cc | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 855a5d7cb8f585bf66dd18cb480b8c3feef62480
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Fri Apr 10 17:18:01 2015 +0400
+
+    Fix build on WEC2013
+
+    Based on patch from Björn Breitmeyer
+
+ src/hb-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit fe97b65a54a416229e28b1c931e5e01ca19f31d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 6 16:49:51 2014 -0400
+
+    [utils] Add hb-fc-list
+
+    This is a tool that lists all fonts that can render a given string.
+    It uses hb_shape() to do so, and as such is aware of HarfBuzz's
+    normalizer.
+
+ configure.ac      |  19 +++++
+ util/Makefile.am  |  15 ++++
+ util/hb-fc-list.c | 222
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ util/hb-fc.cc     | 149 ++++++++++++++++++++++++++++++++++++
+ util/hb-fc.h      |  46 +++++++++++
+ 5 files changed, 451 insertions(+)
+
+commit eb0bf3ae6688b7e98a706df2ad2714c071d77e22
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 6 15:36:41 2014 -0400
+
+    Relax inert checks
+
+    Previously, when creating an object from inert inputs (eg:
+    "hb_font_create(hb_face_get_empty())") we returned the inert
+    empty object.  This is not helpful as there are legitimate
+    usecases to do that.
+
+    We now never return the inert object unless allocation failed.
+
+    Tests are revised to reflect.
+
+ src/hb-face.cc         |  4 ++--
+ src/hb-font.cc         |  4 +---
+ src/hb-shape-plan.cc   |  7 +++++--
+ test/api/test-font.c   | 10 +++++-----
+ test/api/test-object.c | 34 +++++++++++++++++-----------------
+ 5 files changed, 30 insertions(+), 29 deletions(-)
+
+commit e8fd83932a75cfbaa4638a757868915ebfac3c1f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 9 15:52:26 2015 -0700
+
+    [util/hb-view] Fix rendering with all combinations of negative scales
+
+ util/view-cairo.cc | 90
+ ++++++++++++++++++++++++++++--------------------------
+ util/view-cairo.hh |  2 --
+ 2 files changed, 47 insertions(+), 45 deletions(-)
+
+commit 69d5af93169ea2d87276b65d43c889a359d5d81e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 9 15:17:16 2015 -0700
+
+    [util] Minor
+
+ util/view-cairo.cc | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit a664810e38b479e05ea32cac263cb5730629f9d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 9 15:04:42 2015 -0700
+
+    [util] Accept comma as well as space when separating components
+    of args
+
+    Applies to --font-size and --margin.
+
+    Hopefully the scanf usage here doesn't have compatibility issues
+    (star being counted in the return value, etc).
+
+ util/options.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9c974360febcfd67247107352425fe8590d9d452
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 9 12:04:14 2015 -0700
+
+    Minor rename
+
+ src/hb-atomic-private.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit f3b170bdd970e31e9dbfed94c07c3cda41269aed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 8 16:26:24 2015 -0700
+
+    Minor
+
+ src/hb-common.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2958f2c147fc6327175b51a4eaca694263e34ac9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 8 16:26:16 2015 -0700
+
+    Fixup
+
+ src/hb-atomic-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b931e0b0ceeab0e4819d9c4b838c1a1eb87b52e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 8 14:39:00 2015 -0700
+
+    Fix warnings
+
+    Part of https://github.com/behdad/harfbuzz/pull/68
+
+ src/hb-ot-font.cc                    |  4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 22 +++++++++++-----------
+ 2 files changed, 13 insertions(+), 13 deletions(-)
+
+commit cdcdfe61b97a0a48ccf834b6d924d187da9609be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 8 13:25:04 2015 -0700
+
+    Err, instead of warn, if mutex / atomic / unicode funcs are missing
+
+    Hopefully this results in fewer badly built HarfBuzz integrations.
+
+ src/hb-unicode.cc |  8 ++++----
+ src/hb-warning.cc | 22 ++++++++--------------
+ 2 files changed, 12 insertions(+), 18 deletions(-)
+
+commit fc3c59a1d746c5280f6216a94fdc1be3e826051f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 8 13:03:27 2015 -0700
+
+    Fix unused var warnings
+
+ src/hb-ot-layout-gpos-table.hh | 1 -
+ src/hb-ot-layout-gsub-table.hh | 1 -
+ 2 files changed, 2 deletions(-)
+
+commit 3f174cd020b7762fae96f20ce14fc9e9abec748f
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Sat Mar 28 00:49:33 2015 +0400
+
+    Minor refactoring to the atomics implementation
+
+    s/atomic_int/atomic_int_impl/ and s/atomic_ptr/atomic_ptr_impl/
+    to bring it in par with hb_mutex_impl_t, then re-introduce
+    hb_atomic_int_t as a wrapper around hb_atomic_int_impl_t.
+
+    In hb_reference_count_t, make it clear the non-atomic get and set
+    are intentional due to nature of the cases they are used in
+    (comparison to -1 and the debug output/tracing).
+
+ src/hb-atomic-private.hh | 86
+ +++++++++++++++++++++++++++++++-----------------
+ src/hb-mutex-private.hh  |  4 ++-
+ src/hb-object-private.hh | 21 ++++++------
+ 3 files changed, 69 insertions(+), 42 deletions(-)
+
+commit 24930d544ee9e247e4cf6a5f6d5207ba9d7a3ddc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 8 12:52:06 2015 -0700
+
+    Minor
+
+ src/hb-mutex-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 45a8b46f478d4aa63ae5df74b6bb28ebdd7521ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 8 12:49:38 2015 -0700
+
+    Allow implementing atomic and mutex ops in config
+
+    Motivated by
+    https://github.com/behdad/harfbuzz/pull/92
+
+ src/hb-atomic-private.hh | 6 +++++-
+ src/hb-mutex-private.hh  | 7 ++++++-
+ 2 files changed, 11 insertions(+), 2 deletions(-)
+
+commit 3fe4e92bc5ff09d84c6763cedf06ce80d15a5fb2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 8 12:49:23 2015 -0700
+
+    Minor
+
+ src/hb-set-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 9868749abe468130d89c80a2501847a83acb4579
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 6 14:51:31 2015 -0700
+
+    [test] Use /usr/bin/env python instead of /usr/bin/python
+
+    Bug 76494 - #!/usr/bin/python in testsuite
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=76494
+
+ test/shaping/hb-diff                 | 2 +-
+ test/shaping/hb-diff-colorize        | 2 +-
+ test/shaping/hb-diff-filter-failures | 2 +-
+ test/shaping/hb-diff-ngrams          | 2 +-
+ test/shaping/hb-diff-stat            | 2 +-
+ test/shaping/hb-manifest-read        | 2 +-
+ test/shaping/hb-manifest-update      | 2 +-
+ test/shaping/hb-unicode-decode       | 2 +-
+ test/shaping/hb-unicode-encode       | 2 +-
+ test/shaping/hb-unicode-prettyname   | 2 +-
+ test/shaping/hb_test_tools.py        | 2 +-
+ 11 files changed, 11 insertions(+), 11 deletions(-)
+
+commit bfcddd32a674dd19fca1bf521e95466a0eec5179
+Merge: ce01ad7c 363ceec3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 6 14:41:32 2015 -0700
+
+    Merge pull request #93 from ebraminio/archpy3
+
+    Make hb_test_tools.py compatible with python 3
+
+commit ce01ad7c2f5a259030f4dbec746f85522aa9c3f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 1 11:05:59 2015 -0700
+
+    MSVC 2015 supports snprintf and not _snprintf
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 560718862f0bd994b62361652d6fd558c4182e2a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 1 11:04:33 2015 -0700
+
+    Move WinCE define to better place
+
+ src/hb-private.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 363ceec3fb0c9566db5a59da31e508f69dea1e92
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Mar 30 03:27:14 2015 +0430
+
+    Make hb_test_tools.py compatible with python 3
+
+    On ArchLinux, /usr/bin/python is linked to python 3 so
+    HarfBuzz `make check` is broken there.
+
+    This makes hb_test_tools.py compatible with python 3 while
+    no breaking it on python 2.
+
+ test/shaping/hb_test_tools.py | 44
+ ++++++++++++++++++++++++-------------------
+ 1 file changed, 25 insertions(+), 19 deletions(-)
+
+commit aee685086c8fde6f6c4590e483a177c19f222540
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 26 14:13:53 2015 -0400
+
+    Fix VC++ /analyze warnings
+
+    out\debug\hb-buffer-deserialize-text.rl(47) : warning C6001: Using
+    uninitialized memory 'pos'.
+
+ src/hb-buffer-deserialize-text.rl | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8886ab430ca68539cb318e175647e9f6973718b0
+Merge: e3671b8f a394bb66
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Mar 22 16:18:57 2015 -0400
+
+    Merge pull request #90 from khaledhosny/introspection-fixes
+
+    [bindings] Fix *_from_string functions
+
+commit a394bb66707184c995fe2d08c80e98220e6ec0b0
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sun Mar 22 20:29:10 2015 +0200
+
+    [bindings] Fix *_from_string functions
+
+    Without the element-type they will be getting garbage, at least with
+    Python.
+
+ src/hb-common.cc | 8 ++++----
+ src/hb-font.cc   | 2 +-
+ src/hb-shape.cc  | 2 +-
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit e3671b8f8bb339e8a563a9da9cd5069073200fec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 20 18:03:02 2015 -0400
+
+    0.9.40
+
+ NEWS         | 8 ++++++++
+ configure.ac | 2 +-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 9e401f6890f2bea1d11914bca436c2230f8d0f1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 20 16:08:38 2015 -0400
+
+    Fix reverse_range() for empty range
+
+    Fixes coretext notdef loop consisting of all default_ignorable glyphs
+
+    https://code.google.com/p/chromium/issues/detail?id=464755
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7481bd49d56d4e814ab1f85fc2df8bf934d520f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 4 15:47:25 2015 -0800
+
+    Fix previous commit
+
+    I misunderstood how which works.
+
+ autogen.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6763e21afb77b250ad4416ff921d46c63ea12443
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 4 15:43:05 2015 -0800
+
+    Accept glibtoolize as libtoolize
+
+    Of course, we don't really run it, autoreconf does.  We just
+    err if neither is available.  glibtoolize is the name it is
+    shipped under on OS X.  Reported by Adam.
+
+ autogen.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 02a04e6afb1a76894f3723a467716607970d95d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 4 12:32:03 2015 -0800
+
+    0.9.39
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 98e3ea8e34c798ce003e946c9a150bb41be9d09b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 4 12:03:39 2015 -0800
+
+    Fix hb-uniscribe build
+
+ src/hb-ot-name-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8ac345e5c0ed0aad6547592ea0839aabfb4ba980
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 2 16:06:55 2015 -0800
+
+    Fix reverse_range() to only reverse alt array if positions are used
+
+    In hb-coretext, when we were using scratch buffer for book-keeping,
+    a reverse_range() caused by the notdef-insertion loop could mess up
+    our log_clusters.  Ouch!
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1e03d7ac83f3e17aafed1e37390d9ff8394e36da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 26 13:58:32 2015 -0800
+
+    Better error message if libtool is not installed
+
+    Fixes https://github.com/behdad/harfbuzz/pull/88
+
+ autogen.sh | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 6c918e2997fb82e89485f2b50bee2bf4fcd70592
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 26 13:55:34 2015 -0800
+
+    Clean up gtk-doc.make
+
+ Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5ec5875acb12cf07447c9ebfb03212601368dfc4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 26 13:53:05 2015 -0800
+
+    Install git.mk in docs/
+
+ docs/Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit d146678d103425b3da7ef393bc6d66f6ba4c5593
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 26 13:52:50 2015 -0800
+
+    Update git.mk from upstream
+
+ git.mk | 35 ++++++++++++++++++++++++++++-------
+ 1 file changed, 28 insertions(+), 7 deletions(-)
+
+commit 5f541f8f7be82f29b77b481827deb212e12d53e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 16:51:17 2015 +0300
+
+    Minor refactoring
+
+ src/hb-private.hh | 44 ++++++++++++++++++++++++++++----------------
+ 1 file changed, 28 insertions(+), 16 deletions(-)
+
+commit ef79bdf73bbfde1bfaa222834809d105ab7755b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 16:49:15 2015 +0300
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 68e04afbb1e1073c47474f7a4d6d2cacf7057f6f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 16:30:28 2015 +0300
+
+    Typo
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 55553699b38d6481fbfacd0a32fc266e55553b34
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 16:29:08 2015 +0300
+
+    Minor
+
+ src/hb-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 5175300fbaf4ff19b7d38c14c86331bb614b0390
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 12:50:01 2015 +0300
+
+    [layout] Fix comparison of GlyphID and hb_codepoint_t
+
+    Before, the IntType::cmp functions providing this and was truncating
+    the hb_codepoint_t to 16bits before comparison.  I have no idea how
+    this was never discovered, and I'm too lazy to try to reproduce this
+    with Pango (which uses non-16bit codepoint numbers for missing
+    glyphs).
+
+ src/hb-open-type-private.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 7cce809cb11e0ce65dbdab899779ece3dc337763
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 12:41:08 2015 +0300
+
+    Remove unused (and wrong as of a few commits ago) cmp() function
+
+ src/hb-open-type-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 8e3d4bae033bdec649676da26cfc3eb7610832a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 12:31:59 2015 +0300
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f47cf1f12dd1fa3cd3aa84502139caca9d469af8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 11:45:22 2015 +0300
+
+    Minor
+
+ src/hb-ot-layout.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 640b66c6348653bfd7cf88ea9caa2133c0eb949f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 17:30:05 2015 +0300
+
+    [layout] If lookup has only one subtable, move the forward loop down
+    to subtable
+
+    I was hoping to see a nice speedup, but it resulted in a very
+    minor one.
+
+ src/hb-ot-layout.cc | 33 ++++++++++++++++++++++++++++++++-
+ 1 file changed, 32 insertions(+), 1 deletion(-)
+
+commit e2f50f2a7ebf9882ea89dc3f0c740e7fce964e37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 17:15:05 2015 +0300
+
+    [layout] Add apply_forward / apply_backward
+
+ src/hb-ot-layout.cc | 69
+ +++++++++++++++++++++++++++++++++++------------------
+ 1 file changed, 46 insertions(+), 23 deletions(-)
+
+commit 1d4a328472f094c0d75a062f6e176c6b1875cfdc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 11:33:30 2015 +0300
+
+    [layout] Remove unneeded return value from apply()
+
+ src/hb-ot-layout.cc | 12 +++++-------
+ 1 file changed, 5 insertions(+), 7 deletions(-)
+
+commit bbdd6fd21cc2e079defff7cb17c3eb8eff3f9e09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 17:03:02 2015 +0300
+
+    Minor simpilfy BEInt
+
+ src/hb-open-type-private.hh | 25 ++-----------------------
+ 1 file changed, 2 insertions(+), 23 deletions(-)
+
+commit 88a399acdc0fcb060803da0e7db56de2866981e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 16:57:12 2015 +0300
+
+    Optimize IntType comparison to avoid branches for 16bit numbers
+
+ src/hb-open-type-private.hh | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 37de2d533126245774417234e3536fcfb24f3a6b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 16:55:51 2015 +0300
+
+    Minor simplify IntType
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bd047d3b7f04d551c0a26bc0ce9b9d61481e34e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 10:47:18 2015 +0300
+
+    [layout] Minor
+
+ src/hb-ot-layout-gpos-table.hh | 6 ++++++
+ src/hb-ot-layout-gsub-table.hh | 6 ++++++
+ src/hb-ot-layout.cc            | 4 ++--
+ 3 files changed, 14 insertions(+), 2 deletions(-)
+
+commit b9d3f60520c022dc952e65a66eb138d1f7cae2e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 10:42:41 2015 +0300
+
+    [layout] Minor
+
+ src/hb-ot-layout.cc | 15 ++++-----------
+ 1 file changed, 4 insertions(+), 11 deletions(-)
+
+commit 1a2322134a5d7bba990da28baf893b35879a5a7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 10:40:23 2015 +0300
+
+    [layout] Don't check glyph props against lookup flags when recursing
+
+    Shouldn't be needed.  I have a hard time imagining this breaking any
+    legitimate use case.
+
+ src/hb-ot-layout-gpos-table.hh | 10 +---------
+ src/hb-ot-layout-gsub-table.hh | 10 +---------
+ 2 files changed, 2 insertions(+), 18 deletions(-)
+
+commit 095a1257cc3cc56b044b4cd842a92f0d0f933a50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 10:29:41 2015 +0300
+
+    [layout] Port sanitize() to use dispatch()
+
+    Needed some rework of Extension table.  Hopefully I got it right, and
+    the new template usage doesn't break any compilers...
+
+ src/hb-open-type-private.hh          |  5 ++-
+ src/hb-ot-layout-gpos-table.hh       | 82
+ +----------------------------------
+ src/hb-ot-layout-gsub-table.hh       | 72 ++-----------------------------
+ src/hb-ot-layout-gsubgpos-private.hh | 84
+ ++++++++++++------------------------
+ 4 files changed, 37 insertions(+), 206 deletions(-)
+
+commit 758fb20630f84c3d373cda37974b88f16c02995e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 18 13:45:03 2015 +0300
+
+    Remove unused macro
+
+ src/hb-ot-shape-complex-arabic-win1256.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 40c58923cbf689c465f9b65334c455a9b7f71ab0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 18 13:18:46 2015 +0300
+
+    [layout] Refactor Lookup::dispatch()
+
+ src/hb-ot-layout-common-private.hh   | 20 ++++++++++++++++++++
+ src/hb-ot-layout-gpos-table.hh       | 12 +-----------
+ src/hb-ot-layout-gsub-table.hh       | 12 +-----------
+ src/hb-ot-layout-gsubgpos-private.hh |  6 ------
+ 4 files changed, 22 insertions(+), 28 deletions(-)
+
+commit 70366f5d19df2e654f0933474fecf1aa16e27812
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 18 13:09:54 2015 +0300
+
+    [layout] Refactor get_subtable()
+
+ src/hb-ot-layout-common-private.hh | 12 ++++++++++++
+ src/hb-ot-layout-gpos-table.hh     |  4 ++--
+ src/hb-ot-layout-gsub-table.hh     |  6 +++---
+ 3 files changed, 17 insertions(+), 5 deletions(-)
+
+commit f72f326aea6d1e93f63040730f7aecd401676c1c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 17 19:18:07 2015 +0300
+
+    Minor
+
+ src/hb-ot-layout-gpos-table.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 8e36ccfd4f076888076ca176c055c18104af03b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 17 19:15:34 2015 +0300
+
+    [layout] Use dispatch() for add_coverage()
+
+ src/hb-ot-layout-gpos-table.hh       | 12 ++----------
+ src/hb-ot-layout-gsub-table.hh       | 12 ++----------
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++++++++++--
+ 3 files changed, 14 insertions(+), 22 deletions(-)
+
+commit 50b8dc79daffc7ef671dd5eedfea47f8d5e946f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 17 18:14:17 2015 +0300
+
+    [layout] Add may_dispatch()
+
+    No functional change right now.
+
+ src/hb-ot-layout-gpos-table.hh       |  7 +++++++
+ src/hb-ot-layout-gsub-table.hh       |  6 ++++++
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++++++++++++
+ 3 files changed, 25 insertions(+)
+
+commit de2118ed7a998a1df9b28fd1be96b4af89ed82c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 17 17:27:44 2015 +0300
+
+    Make sanitize() a const method
+
+    This makes a lot of code safer.  We only try modifying the object
+    in one
+    place, after making sure it's safe to do so.  So, do a const_cast<> in
+    that one place...
+
+ src/hb-open-file-private.hh          |  15 +++--
+ src/hb-open-type-private.hh          |  51 +++++++++++------
+ src/hb-ot-cmap-table.hh              |  35 ++++++++----
+ src/hb-ot-head-table.hh              |   6 +-
+ src/hb-ot-hhea-table.hh              |   3 +-
+ src/hb-ot-hmtx-table.hh              |   3 +-
+ src/hb-ot-layout-common-private.hh   |  58 ++++++++++++-------
+ src/hb-ot-layout-gdef-table.hh       |  30 ++++++----
+ src/hb-ot-layout-gpos-table.hh       | 108
+ +++++++++++++++++++++++------------
+ src/hb-ot-layout-gsub-table.hh       |  58 ++++++++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh |  65 +++++++++++++--------
+ src/hb-ot-layout-jstf-table.hh       |  12 ++--
+ src/hb-ot-maxp-table.hh              |   6 +-
+ src/hb-ot-name-table.hh              |   6 +-
+ 14 files changed, 296 insertions(+), 160 deletions(-)
+
+commit 6759ed95a3bec2874826376b68ebff19ba277ef2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 17 16:05:30 2015 +0300
+
+    Minor
+
+ src/hb-ot-layout-gpos-table.hh | 6 ++----
+ src/hb-ot-layout-gsub-table.hh | 6 ++----
+ 2 files changed, 4 insertions(+), 8 deletions(-)
+
+commit 6b599dac1f814a3c900300241d4c492a8f8b66d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 17 16:04:07 2015 +0300
+
+    Remove unnecessary check in sanitize
+
+ src/hb-ot-layout-gpos-table.hh | 2 --
+ src/hb-ot-layout-gsub-table.hh | 2 --
+ 2 files changed, 4 deletions(-)
+
+commit 365576d246949f9d587e90cf0539dc0381e4d0a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 13:59:42 2015 +0100
+
+    [layout] Allocate iters in the context
+
+    Can be further optimized, but I think I didn't break anything.
+
+    Saves another 3% off Roboto shaping.
+
+ src/hb-ot-layout-gpos-table.hh       | 18 ++++++------------
+ src/hb-ot-layout-gsubgpos-private.hh | 21 +++++++++++++--------
+ src/hb-ot-shape-fallback.cc          |  2 +-
+ 3 files changed, 20 insertions(+), 21 deletions(-)
+
+commit 514564f5444b8ad2f210b1e3d7d66378f7275317
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 13:48:48 2015 +0100
+
+    [layout] Move skippy_iter setup from constructor into init()
+
+ src/hb-ot-layout-gpos-table.hh       | 18 ++++++++++++------
+ src/hb-ot-layout-gsubgpos-private.hh | 28 +++++++++++++++-------------
+ src/hb-ot-shape-fallback.cc          |  3 ++-
+ 3 files changed, 29 insertions(+), 20 deletions(-)
+
+commit b051be542a8945ec14b0192bbc285f3e1a78c8f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 13:40:39 2015 +0100
+
+    [lookup] Add skippy_iter.reset()
+
+    Towards reducing the cost of initializing skippy_iter()
+
+ src/hb-ot-layout-gpos-table.hh       | 18 ++++++++++++------
+ src/hb-ot-layout-gsubgpos-private.hh | 27 ++++++++++++++++++---------
+ src/hb-ot-shape-fallback.cc          |  3 ++-
+ 3 files changed, 32 insertions(+), 16 deletions(-)
+
+commit 2cecc38c7cf49b2cf697efa7e974ceee7055f2c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 13:32:05 2015 +0100
+
+    [layout] Shuffle code around
+
+ src/hb-ot-layout-gsubgpos-private.hh | 111
+ ++++++++++++++++++-----------------
+ 1 file changed, 56 insertions(+), 55 deletions(-)
+
+commit 696266981df5ef6c62ad0115133dad1d6c1d9acc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 13:08:41 2015 +0100
+
+    [layout] Merge forward and backward iterators
+
+ src/hb-ot-layout-gpos-table.hh       | 12 +++---
+ src/hb-ot-layout-gsubgpos-private.hh | 71
+ ++++++++----------------------------
+ src/hb-ot-shape-fallback.cc          |  2 +-
+ 3 files changed, 23 insertions(+), 62 deletions(-)
+
+commit 1f038eec3c0dd6331036f795614fe1ddcbf613b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 13:05:25 2015 +0100
+
+    [layout] Fix backward reject()
+
+    Has no functional effect since reject was never used with
+    match_glyph_data.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 37d13acd8d414a4b53fac0152addfadecf755cd4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 11:38:01 2015 +0100
+
+    [layout] Remove some unnecessary checks in skippy
+
+ src/hb-ot-layout-gpos-table.hh       | 3 ---
+ src/hb-ot-layout-gsubgpos-private.hh | 9 ++-------
+ 2 files changed, 2 insertions(+), 10 deletions(-)
+
+commit baa14e18148d3f5493f78b4fe9e0c835a01f50f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 11:08:43 2015 +0100
+
+    [lookup] Don't initialize skippy if coverage match fails
+
+    Currently:
+
+      - Initializing skippy is very expensive,
+
+      - Our lookup accelerator (using set-digests) can be very ineffecite,
+
+    As such, we end up many times initializing skippy but then failing
+    coverage check.  Reordering fixes that.
+
+    When, later, we fix our accelerator to have truly small false-positive
+    rate (for example by using the frozen-sets), then we might want to
+    reorder these checks such that we wouldn't calculate coverage number
+    if skippy is going to fail.
+
+    This shows a 5% speedup with Roboto already.
+
+ src/hb-ot-layout-gpos-table.hh | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+commit 7788993bc19bf122f1e143ab64cc1da2ed1865a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 23:01:12 2015 -0800
+
+    [layout] Use setter method to set c->lookup_props
+
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-ot-layout-gsub-table.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit f4ee48fd7b312550faf9b0be4cd1b2f2849dd08d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 22:53:54 2015 -0800
+
+    [layout] Remove unused wrapper method
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 7b7129c7a997def599fb4d2ba05fda40d27aed20
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 21:46:07 2015 -0800
+
+    Add hb_frozen_set_t
+
+    I experimented with replacing use of hb_set_digest_t with this new
+    hb_frozen_set_t, hoping to get a huge speedup for busy lookups
+    (like kern lookup in Roboto), but I only got 6% speendup in Roboto
+    and 4% in NotoNastaliqUrduDraft :(.
+
+ src/hb-set-private.hh | 57
+ ++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 56 insertions(+), 1 deletion(-)
+
+commit 241eac9559465fa79f396570af4e87f455b7e9d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 20:55:42 2015 -0800
+
+    Hide internals of lookup accelerators
+
+ src/hb-ot-layout-gsub-table.hh | 5 +++--
+ src/hb-ot-layout-private.hh    | 5 +++++
+ src/hb-ot-layout.cc            | 6 +++---
+ 3 files changed, 11 insertions(+), 5 deletions(-)
+
+commit e2d4e8480d85436a3acad8145acac345ed593f5a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 20:29:48 2015 -0800
+
+    [util] Add convenience "make lib" target
+
+ util/Makefile.am | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit faaae64bf28abdcdd15185374bc09a3809794118
+Merge: 7888a6b0 9768e651
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 25 15:34:34 2015 -0800
+
+    Merge pull request #85 from KonstantinRitt/define_inline
+
+    Fix build with MSVC on CE
+
+commit 9ee176ee978e6668c4faf00028811ce70979122e
+Author: Collin Fair <cpf@cpfx.ca>
+Date:   Sat Feb 14 09:59:44 2015 -0500
+
+    Stop hb-shape docs leaking into hb-view
+
+ util/options.cc | 15 ++++++++-------
+ 1 file changed, 8 insertions(+), 7 deletions(-)
+
+commit 952b8dbdf61da9b4814e09ad3c1b9b76483bef5c
+Author: Collin Fair <cpf@cpfx.ca>
+Date:   Sat Feb 14 09:44:00 2015 -0500
+
+    'All' of the above, not 'each'
+
+ util/options.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9e867b64467c46eea5cc9b1d5a9404a1221bbbfc
+Author: Collin Fair <cpf@cpfx.ca>
+Date:   Sat Feb 14 09:32:04 2015 -0500
+
+    Remove reference to --help-output-content in --help-output (as
+    --help-output-format's options aren't available in hb-view)
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1d55ffeb66381889f11ebb9039ca4ec2ca5efbab
+Author: Collin Fair <cpf@cpfx.ca>
+Date:   Sat Feb 14 09:29:35 2015 -0500
+
+    Add serialization syntax documentation. Clarify naming and wording
+    in --help-output/--help-format
+
+ util/options.cc | 30 ++++++++++++++++--------------
+ 1 file changed, 16 insertions(+), 14 deletions(-)
+
+commit 9768e651be0561f07d6f38c3ed8bc5ee04882990
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Sat Feb 14 00:58:51 2015 +0400
+
+    Fix build with MSVC on CE
+
+    This code is C++ only. There isn't a single C++ compiler that fails to
+    understand the "inline" keyword, since it's required by C++98. Any
+    compiler older than C++98 is likely to choke on the template usage
+    further down, so this isn't necessary.
+
+    Moreover, the C++ standard says you cannot define macros.
+    [lib.macro.names] says "Nor shall such a translation unit define
+    macros
+    for names lexically identical to keywords." -- technically, it's a
+    promise that the Standard Library headers won't do it, the wording
+    means
+    that the entire translation unit won't do it, which implies no source
+    can do it.
+
+    MSVC complains about it:
+    fatal error C1189: #error : The C++ Standard Library forbids
+    macroizing
+    keywords. Enable warning C4005 to find the forbidden macro.
+
+    Author: Thiago Macieira <thiago.macieira@intel.com>
+
+ src/hb-private.hh | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+commit 7888a6b07a9922cedd3e0d235959058e0011357b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 12:40:40 2015 -0800
+
+    [ft] Handle negative scales with vertical writing
+
+ src/hb-ft.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 982d94eaa2a377616f22f39427e5ed9f1ce43263
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 10:51:33 2015 -0800
+
+    [coretext] Don't generate notdef glyph for default-ignorables
+
+    As discovered on Chrome Mac:
+    https://code.google.com/p/chromium/issues/detail?id=452326
+
+ src/hb-coretext.cc | 2 ++
+ src/hb-ot-shape.cc | 2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 6917a045fd8d16952cad75fda8b291b11e1d3564
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 10:43:32 2015 -0800
+
+    [coretext] Unbreak glyph positioning in presence of notdef runs
+
+    As discovered on Chrome Mac:
+    https://code.google.com/p/chromium/issues/detail?id=452326
+
+    This was originally broken in:
+
+            commit 5a0eed3b50629be4826e4e9428f2c3255195395d
+            Author: Behdad Esfahbod <behdad@behdad.org>
+            Date:   Mon Aug 11 23:47:16 2014 -0400
+
+                [coretext] Implement vertical shaping
+
+ src/hb-coretext.cc | 35 +++++++++++++++++++++++++++--------
+ 1 file changed, 27 insertions(+), 8 deletions(-)
+
+commit 1eff4350239b0768e1042b52db9fb1c0d266f96a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 27 12:26:04 2015 -0800
+
+    Minor optimization
+
+ src/hb-ot-shape-normalize.cc | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 675956aca01fc4e005a338af43d1c1f4f938abd1
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Tue Jan 27 11:23:07 2015 +0400
+
+    Do not leak hb_language_t on hb_language_item_t destruction
+
+ src/hb-common.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b306f9674a599da50754d24fa5aefcb6bba04420
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Tue Jan 27 20:08:41 2015 +0400
+
+    Minor improvement to HB_SHAPER_DATA_DESTROY
+
+ src/hb-shaper-private.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 61820bc4ca1f02433db4be7c81f27cf97e2bd519
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 26 14:25:52 2015 -0800
+
+    [API] Add hb_buffer_add_latin1()
+
+    This is by no ways to promote non-Unicode encodings.  This is an entry
+    point that takes Unicode codepoints that happen to all be the first
+    256 characters and hence fit in 8bit strings.  This is useful eg
+    in Chrome
+    where strings that can fit in 8bit are implemented that way, and this
+    avoids copying into UTF-8 or UTF-16.
+
+    Perhaps we should rename this to hb_buffer_add_codepoints8().
+    I'm also
+    curious if anyone would be really interested in
+    hb_buffer_add_codepoints16().
+
+    Please discuss!
+
+ src/hb-buffer.cc      | 36 +++++++++++++++++++++++++-------
+ src/hb-buffer.h       |  8 ++++++++
+ src/hb-utf-private.hh | 57
+ ++++++++++++++++++++++++++++++++++++++-------------
+ 3 files changed, 80 insertions(+), 21 deletions(-)
+
+commit 78c6e86c04f12154c88b9f9264d0bd50b721699b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 26 14:08:36 2015 -0800
+
+    Fix hb_buffer_add_codepoints to actually NOT validate
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 70c25ee215635db23eb0757641bd372940c0d85d
+Merge: 28f5e0b2 f3537b62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 25 13:06:03 2015 -0800
+
+    Merge pull request #81 from KonstantinRitt/fixes/build/win8phone
+
+    winrt_buildfixes
+
+commit f3537b620b0a7392ea27f01f465c5ba79459c858
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Sun Jan 25 09:50:51 2015 +0400
+
+    Move some code around
+
+    Just to keep Windows specific workarounds in a single place.
+
+ src/hb-private.hh | 25 ++++++++++++-------------
+ 1 file changed, 12 insertions(+), 13 deletions(-)
+
+commit afb62d88d78cacb6b881aaf329a654fd32f5ae29
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Sun Jan 25 08:16:26 2015 +0400
+
+    Do not define MemoryBarrier on WinCE
+
+    There is a _HBMemoryBarrier() wrapper function that emulates
+    MemoryBarrier() behavior when it is not defined.
+
+ src/hb-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 7db326a15b173c0d101adc608bf551a628c65dcd
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Sun Jan 25 08:13:24 2015 +0400
+
+    Fix build on WinRT
+
+    There is no environment (like WinCE) and the basic version
+    of InitializeCriticalSection is unsupported.
+
+    https://codereview.qt-project.org/#/c/92496/
+
+ src/hb-mutex-private.hh | 4 ++++
+ src/hb-private.hh       | 2 ++
+ 2 files changed, 6 insertions(+)
+
+commit 28f5e0b2f41670617bd778660364bbd58b1b68f2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 23 12:45:35 2015 -0800
+
+    0.9.38
+
+ NEWS         | 23 +++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 24 insertions(+), 1 deletion(-)
+
+commit a319d0777b746a2bbe5cd5a206172f1580da3379
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 23 12:44:24 2015 -0800
+
+    [ft] Handle negative x_scale / y_scale
+
+ src/hb-ft.cc | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+commit b0b38bb892473d9a65e06dd3b4713da39f92bef9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 21 19:19:33 2015 -0800
+
+    [coretext] Fix positioning of notdef
+
+ src/hb-coretext.cc | 19 ++++++++++---------
+ 1 file changed, 10 insertions(+), 9 deletions(-)
+
+commit 70622e5089c01ea16fd9deed11cb39d43145c121
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 21 18:50:57 2015 -0800
+
+    [coretext] Fix scaling
+
+    Before we were not accounting for possible differences in x_scale and
+    y_scale, as well as the signs of those.  All should be in good shape
+    now.
+
+ src/hb-coretext.cc | 26 +++++++++++++++++++-------
+ 1 file changed, 19 insertions(+), 7 deletions(-)
+
+commit 221ba02b0816584a02471037edae7cec9c1b8acc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 21 16:42:09 2015 -0800
+
+    [coretext] Use vertical advance for notdef in vertical direction
+
+ src/hb-coretext.cc | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 7988da24c507ee310772f72cc5bcfd3c0a1187a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 21 18:33:50 2015 -0800
+
+    Add convenience make target "make lib" in src/
+
+ src/Makefile.am | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 31d48dd919e3b4a0bec5ede384f76db9b44f4d71
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 21 01:57:44 2015 -0800
+
+    Add README.python
+
+ README.python | 26 ++++++++++++++++++++++++++
+ 1 file changed, 26 insertions(+)
+
+commit ca1c2813dd0b082a8c418bd3edd3f6cba97bd5f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 21 01:51:48 2015 -0800
+
+    [bindings] Add README.python
+
+ Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit cd4eb96abb90a84b42e9b288e39bad759e4411a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 20 12:30:45 2015 -0800
+
+    [util] Add --font-size to hb-shape
+
+    Also makes hb-view to use 8 bits of subpixel precision and shape at
+    requested size, instead of always shaping at upem and scaling results.
+
+ util/hb-ot-shape-closure.cc |  2 +-
+ util/hb-shape.cc            |  2 +-
+ util/hb-view.cc             |  5 ++++-
+ util/helper-cairo.cc        | 16 ++++++++--------
+ util/helper-cairo.hh        |  5 ++---
+ util/main-font-text.hh      |  4 ++--
+ util/options.cc             | 44
+ +++++++++++++++++++++++++++++++++++++++++---
+ util/options.hh             | 16 ++++++++++++----
+ util/view-cairo.cc          |  2 +-
+ util/view-cairo.hh          |  8 ++++----
+ 10 files changed, 76 insertions(+), 28 deletions(-)
+
+commit 5789ca69d7464bab5fa0c5bdf404f3afaa490faf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 9 14:22:01 2015 -0800
+
+    [util] Minor
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 67dfa8c7c2f2e9040a9c60c680f739ada4a35fb5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 19 17:00:31 2015 -0800
+
+    When matching second glyph of kerning pairs, use bsearch
+
+    Roboto has glyphs (like 'F') that have 200 kerning pairs.
+    Add a handcoded bsearch instead of previous linear search.
+
+    This doesn't show much speedup though, apparently we spend the
+    bulk of the time somewhere before here.
+
+ src/hb-ot-layout-gpos-table.hh | 21 ++++++++++++++++-----
+ 1 file changed, 16 insertions(+), 5 deletions(-)
+
+commit e9f5c65be027eb7759ab819e267e24dff3b017b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 19 14:42:11 2015 -0800
+
+    [bindings] Minor
+
+ src/sample.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 3704628d1f124234324b5f2bdd5fdd61c14c7801
+Merge: 1aaa7d67 5eb939dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 19 16:15:00 2015 -0800
+
+    Merge pull request #77 from roozbehp/master
+
+    Change New Tai Lue shaping engine from SEA to default
+
+commit 5eb939ddfe9ef217da2e48d7d0f1f4b7501714ad
+Author: Roozbeh Pournader <roozbeh@google.com>
+Date:   Sun Jan 18 14:30:08 2015 -0800
+
+    Change New Tai Lue shaping engine from SEA to default
+
+    This is to reflect the UTC decision to change the encoding model of
+    New Tai Lue from logical to visual to be similar to Thai, Lao, and
+    Tai Viet: http://www.unicode.org/L2/L2014/14250.htm#141-C26
+
+    The visual encoding is already the current practice of encoding New
+    Tai Lue on the web anyway:
+    http://www.unicode.org/L2/L2014/14195-newtailue.txt
+
+    Fixes behdad/harfbuzz#66.
+
+ src/hb-ot-shape-complex-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1aaa7d6799b42b392dd191d3c12011721ef99e74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 17 20:16:56 2015 -0800
+
+    [indic] Fix out-of-bounds access
+
+ src/gen-indic-table.py                 |  2 +-
+ src/hb-ot-shape-complex-indic-table.cc | 36
+ +++++++++++++++++-----------------
+ 2 files changed, 19 insertions(+), 19 deletions(-)
+
+commit 238d6a38f2ceb7d8dceec9365a823f032b3b9f7d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 7 10:51:44 2015 -0800
+
+    [bindings] Update sample.py
+
+ src/sample.py | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 2cd5323531dcd800549b2cb1cb51d708e72ab2d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 6 19:16:38 2015 -0800
+
+    [bindings] Use hb_glib_blob_create() in sample
+
+    hb_blob_create() is considered C-only API.
+
+ src/hb-blob.cc |  8 ++++----
+ src/sample.py  | 19 +++++++++----------
+ 2 files changed, 13 insertions(+), 14 deletions(-)
+
+commit 0ef179e2dc040c13497af847b8c1cec846dbdbf9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 6 16:58:33 2015 -0800
+
+    [glib] Add hb_glib_blob_create() that takes GBytes
+
+ src/hb-glib.cc | 11 +++++++++++
+ src/hb-glib.h  |  3 +++
+ 2 files changed, 14 insertions(+)
+
+commit b91904a40da6287f84bc79de60674fa57232ec09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 6 15:43:14 2015 -0800
+
+    [bindings] Replace deprecated allow-none with optional and nullable
+
+ src/hb-blob.cc    | 4 ++--
+ src/hb-shape.cc   | 2 +-
+ src/hb-unicode.cc | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 81a31f3eff44a85bb2160d51156a01a18f0a97df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 6 15:37:31 2015 -0800
+
+    [bindings] Make sample Python 2/3 compatible
+
+ src/sample.py | 15 ++++++++++++++-
+ 1 file changed, 14 insertions(+), 1 deletion(-)
+
+commit b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 6 14:05:26 2015 -0800
+
+    Fix up gobject-introspection a bit
+
+    Minimal shaping works now!
+
+ src/hb-blob.cc   |  6 +++---
+ src/hb-buffer.cc |  2 +-
+ src/sample.py    | 34 ++++++++++++++++++++++++++++------
+ 3 files changed, 32 insertions(+), 10 deletions(-)
+
+commit 3d1a666a8629a8502a2bcf23ab943e2b39a0da92
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 5 14:43:13 2015 -0800
+
+    Remove hardcoded ICU include paths.
+
+    ICU exports them using LOCAL_EXPORT_C_INCLUDE_DIRS.
+
+    https://android-review.googlesource.com/#/c/121311/
+
+ Android.mk | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 8cb41cb9508eb1bb6319e92f900cfe5e8a131be3
+Merge: 365c03fc fb85d618
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 4 20:32:18 2015 -0800
+
+    Merge pull request #76 from cpeterso/cpeterso/Wunused-function
+
+    Add #ifdef HB_USE_ATEXIT to fix -Wunused-function warnings
+
+commit fb85d618f5883458bacf0ecb0894772291a2d738
+Author: Chris Peterson <cpeterson@mozilla.com>
+Date:   Sun Jan 4 19:31:10 2015 -0800
+
+    Add #ifdef HB_USE_ATEXIT to fix -Wunused-function warnings
+
+ src/hb-common.cc | 2 +-
+ src/hb-ft.cc     | 4 +++-
+ src/hb-shape.cc  | 4 +++-
+ src/hb-shaper.cc | 4 +++-
+ 4 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 365c03fc2bcdb4098314a0e123c46018fb882586
+Merge: c36c4a99 d1897a98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 3 21:55:30 2015 -0800
+
+    Merge pull request #75 from cpeterso/cpeterso/Wunused-value
+
+    Fix hb_atomic_ptr_cmpexch -Wunused-value warnings
+
+commit d1897a98d8da40cffb57c07099a9a93cfeaacc36
+Author: Chris Peterson <cpeterson@mozilla.com>
+Date:   Sat Jan 3 19:46:19 2015 -0800
+
+    Fix hb_atomic_ptr_cmpexch -Wunused-value warnings
+
+ src/hb-common.cc | 2 +-
+ src/hb-icu.cc    | 4 +---
+ 2 files changed, 2 insertions(+), 4 deletions(-)
+
+commit c36c4a9924609df648e62e47fa017b19b844fd98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 2 14:09:23 2015 -0800
+
+    Add missing va_end()
+
+    Fixes https://github.com/behdad/harfbuzz/pull/74
+
+ util/options.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f34aaba8687a20794835e2dc878c52d1b53e6f85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 28 18:56:15 2014 -0800
+
+    [ft] Don't set font ppem
+
+    For discussion see:
+
+      http://lists.freedesktop.org/archives/harfbuzz/2012-April/001905.html
+
+    Over time we have had added NO_HINTING all over the place in hb-ft.
+    Finish it off.
+    Not setting ppem on hb-font disables get_contour_point() calls which
+    is good anyway.
+
+    See comments in the commit.
+
+ src/hb-ft.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 350f3a02ce225e5d78db8ac96de1351ff9f96dd5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 28 17:44:26 2014 -0800
+
+    [ft] Add hb_ft_face_create_referenced() and
+    hb_ft_font_create_referenced()
+
+    When I originally wrote hb-ft, FreeType objects did not support
+    reference
+    counting.  As such, hb_ft_face_create() and hb_ft_font_create() had a
+    "destroy" callback and client was responsible for making sure
+    FT_Face is
+    kept around as long as the hb-font/face are alive.
+
+    However, since this was not clearly documented, some clienets didn't
+    correctly did that.  In particular, some clients assumed that
+    it's safe
+    to destroy FT_Face and then hb_face_t.  This, indeed, used to work,
+    until
+    45fd9424c723f115ca98995b8f8a25185a6fc71d, which make face destroy
+    access
+    font tables.
+
+    Now, I fixed that issue in 395b35903e052aecc97d0807e4f813c64c0d2b0b
+    since
+    the access was not needed, but the problem remains that not all
+    clients
+    handle this correctly.  See:
+
+      https://bugs.freedesktop.org/show_bug.cgi?id=86300
+
+    Fortunately, FT_Reference_Face() was added to FreeType in 2010,
+    and so we
+    can use it now.  Originally I wanted to change hb_ft_face_create() and
+    hb_ft_font_create() to reference the face if destroy==NULL was
+    passed in.
+    That would improve pretty much all clients, with little undesired
+    effects.
+    Except that FreeType itself, when compiled with HarfBuzz support,
+    calls
+    hb_ft_font_create() with destroy==NULL and saves the resulting
+    hb-font on
+    the ft-face (why does it not free it immediately?).  Making hb-face
+    reference ft-face causes a cycling reference there.  At least,
+    that's my
+    current understanding.
+
+    At any rate, a cleaner approach, even if it means all clients will
+    need a
+    change, is to introduce brand new API.  Which this commit does.
+
+    Some comments added to hb-ft.h, hoping to make future clients
+    make better
+    choices.
+
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=75299
+
+ configure.ac |  4 ++--
+ src/hb-ft.cc | 32 ++++++++++++++++++++++++++++++++
+ src/hb-ft.h  | 59
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 3 files changed, 92 insertions(+), 3 deletions(-)
+
+commit 9a3b74884b2e41c7040611030f4336f13d18fd3e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 28 17:27:39 2014 -0800
+
+    Remove redundant check for FT_Face_GetCharVariantIndex
+
+    We require FreeType >= 2.8.3.  This symbol was introduced earlier
+    than that.
+
+ configure.ac | 9 +--------
+ src/hb-ft.cc | 2 --
+ 2 files changed, 1 insertion(+), 10 deletions(-)
+
+commit 1226b2e930aa456cc05bbe621c96f4286a95cff6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 28 17:04:23 2014 -0800
+
+    Fix FreeType version check
+
+ configure.ac | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit affacf2f37db767ab8df7f2db6cd9e0e9b0a2b8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 28 16:20:31 2014 -0800
+
+    [ft] Open blob in READONLY mode
+
+    HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE is deprecated and fairly
+    useless now.
+
+ src/hb-ft.cc | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit 395b35903e052aecc97d0807e4f813c64c0d2b0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 28 16:03:26 2014 -0800
+
+    Avoid accessing layout tables at face destruction
+
+    "Fixes" https://bugs.freedesktop.org/show_bug.cgi?id=86300
+
+    Based on discussion someone else who had a similar issue, most
+    probably
+    the user is releasing FT_Face before destructing hb_face_t /
+    hb_font_t.
+    While that's a client bug, and while we can (and should) use FreeType
+    refcounting to help avoid that, it happens that we were accessing
+    the table when we didn't really have to.  Avoid that.
+
+ src/hb-ot-layout-private.hh                | 3 +--
+ src/hb-ot-layout.cc                        | 4 ++--
+ src/hb-ot-shape-complex-arabic-fallback.hh | 2 +-
+ 3 files changed, 4 insertions(+), 5 deletions(-)
+
+commit 7d5e7613ced3dd39d05df83ca7e8952cbecd68f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 18 18:22:21 2014 -0800
+
+    Fail blob creation if length overflows or is too large
+
+    Fail if blob start plus length overflows; or if blob length
+    is greater than 2GB.  It takes a while for fonts to get to that
+    size.  In the mean time, it protects against bugs like this:
+
+      http://www.icu-project.org/trac/ticket/11450
+
+    Also avoids some weird issues with 32bit vs 64bit systems
+    as we accept length as unsigned int.  As such, a length of
+    -1 will cause overflow on 32bit machines, but happily
+    accepted on a 64bit machine.  Avoid that.
+
+ src/hb-blob.cc       | 5 ++++-
+ test/api/test-blob.c | 3 +++
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit d5a5052098b0aa79ff55c235e61a9db477c4120f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 18 18:09:41 2014 -0800
+
+    Assert that blob length doesn't overflow address.
+
+    This will crash now, if blob was created with wrong length.
+    Check for that coming next commit.
+
+ src/hb-open-type-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 66e37409b3bc1eddc86704ae26d9176677ce6aa6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 17 12:09:17 2014 -0800
+
+    0.9.37
+
+ NEWS         | 8 ++++++++
+ configure.ac | 2 +-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 093c520de506aec74f3fb1e195c0ca85813424dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 12 21:07:53 2014 -0800
+
+    [otlayout] Mark variables that are C arrays as opposed to OT::ArrayOf
+
+ src/hb-ot-layout-gpos-table.hh       | 24 +++++++--------
+ src/hb-ot-layout-gsubgpos-private.hh | 60
+ ++++++++++++++++++------------------
+ 2 files changed, 42 insertions(+), 42 deletions(-)
+
+commit 9df0a520306a491f973d42965597bfda6023e508
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 12 20:54:28 2014 -0800
+
+    [otlayout] Avoid invalid access with Context format 3
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 295ef1dd5229f47d8e0eb5b4eb48c90a6b470073
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 12 20:43:18 2014 -0800
+
+    [ot] Debug get_coverage
+
+ src/hb-ot-layout-gsubgpos-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 00f6a8e334ec4c586e4e633a95b411ccb50306d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 12 20:36:49 2014 -0800
+
+    [ot] Print format in dispatch trace
+
+ src/hb-ot-layout-gpos-table.hh       | 16 ++++++++--------
+ src/hb-ot-layout-gsub-table.hh       | 14 +++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh |  8 ++++----
+ 3 files changed, 19 insertions(+), 19 deletions(-)
+
+commit 5c7d6f02d71362c2b192a7d96e6181977682921c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 12 20:28:49 2014 -0800
+
+    Minor
+
+ src/hb-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 153beebba9b76901b8b62b90ba0dc69462ae2090
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 12 19:46:09 2014 -0800
+
+    [ot] Make sure all toplevel tables have tableTag
+
+ src/hb-open-file-private.hh | 2 ++
+ src/hb-ot-hhea-table.hh     | 2 ++
+ src/hb-ot-hmtx-table.hh     | 2 ++
+ 3 files changed, 6 insertions(+)
+
+commit 282b13f9b4d86b091714de7fbddc94b3e3ff3d91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 12 19:32:46 2014 -0800
+
+    [sanitize] Improve debug output some more
+
+ src/hb-open-type-private.hh | 30 ++++++++++++++++--------------
+ 1 file changed, 16 insertions(+), 14 deletions(-)
+
+commit 0766ee1f4e6046598a2e8fb1b167c3942b4a87a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 12 18:23:20 2014 -0800
+
+    [sanitize] Improve debug output
+
+ src/hb-open-type-private.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit e6f80fa1044243898c402ec6a59d6c1b5420be53
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 10 12:05:24 2014 -0800
+
+    [indic] Allow ZWJ/ZWNJ before SM
+
+    In Oriya, a ZWJ/ZWNJ might be added before candrabindu to encourage
+    or stop ligation of the candrabindu.  This is clearly specified in
+    the Unicode section on Oriya.  Allow it there.  Note that Uniscribe
+    doesn't allow this.
+
+    Micro tests added using Noto Sans Oriya draft.
+
+    No changes in numbers.  Currently at:
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366349 out of 366457 tests passed. 108 failed (0.0294714%)
+    GURMUKHI: 60732 out of 60747 tests passed. 15 failed (0.0246926%)
+    KANNADA: 951190 out of 951913 tests passed. 723 failed (0.0759523%)
+    KHMER: 299070 out of 299124 tests passed. 54 failed (0.0180527%)
+    MALAYALAM: 1048147 out of 1048334 tests passed. 187 failed
+    (0.0178378%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%)
+    TAMIL: 1091753 out of 1091754 tests passed. 1 failed (9.15957e-05%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+ src/hb-ot-shape-complex-indic-machine.rl                 |   2 +-
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/5028afb650b1bb718ed2131e872fbcce57828fff.ttf | Bin 0 ->
+ 4720 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   1 +
+ test/shaping/tests/MANIFEST                              |   1 +
+ test/shaping/tests/indic-joiner-candrabindu.tests        |   2 ++
+ 6 files changed, 6 insertions(+), 1 deletion(-)
+
+commit c0e95abc5f3f14121483b71f10837828a3a1d73a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 20 14:42:24 2014 -0800
+
+    0.9.36
+
+ NEWS         | 12 ++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit fde3e4a423871463c883cb969e99c29cb6f69f6b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 29 11:23:08 2014 -0700
+
+    In hb_ot_collect_glyphs(), don't recurse to a lookup more than once
+
+    Otherwise, we might process a lookup thousands of times, with no
+    benefit.  This pathological case was hit by Noto Nastaliq Urdu Draft
+    in Firefox's code to determine whether space glyph is involved in
+    any GSUB/GPOS rules.  A test page is at http://behdad.org/urdu
+
+    See:
+    https://bugzilla.mozilla.org/show_bug.cgi?id=1090869
+
+ src/hb-ot-layout-gsubgpos-private.hh | 17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
+
+commit 5a5640d8506ccfc99fd119e89e829170d1fea421
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 14 21:26:13 2014 -0700
+
+    Move code around
+
+ src/hb-open-type-private.hh | 50
+ ++++++++++++++++++++++-----------------------
+ 1 file changed, 25 insertions(+), 25 deletions(-)
+
+commit 666b42f73bd1f516657b206ef738108825bf239f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 14 21:24:59 2014 -0700
+
+    Move macros around
+
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=84491
+
+ src/hb-open-type-private.hh | 63
+ ++++++++++++++++++++++++++++++++++++++-------
+ src/hb-private.hh           | 41 -----------------------------
+ src/hb-uniscribe.cc         |  6 +++++
+ 3 files changed, 60 insertions(+), 50 deletions(-)
+
+commit 5c87120b8178566ddae99d9825edc24f9b87ea3d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 14 20:07:31 2014 -0700
+
+    Fix misc warnings
+
+    Fixes https://github.com/behdad/harfbuzz/pull/51
+
+ src/hb-buffer-deserialize-json.rl | 4 ++--
+ src/hb-ot-layout-gsub-table.hh    | 2 +-
+ src/hb-private.hh                 | 6 +++---
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit a1f27ac3c48cfe6d532dc422cf256952fea472ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 2 16:54:33 2014 -0400
+
+    Update test expectation for previous commit
+
+ test/shaping/tests/arabic-fallback-shaping.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8afaf096870d7895cf2fffb6438b02c0ad1b6c52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 2 16:40:41 2014 -0400
+
+    [ft] Add NO_HINTING in a couple other places
+
+ src/hb-ft.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7228011411f0e490ad1ba9894dd0d576823903ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 18:58:43 2014 -0400
+
+    [travis] Fix clang again
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 406a020e5228d4a04da6282f5a75165bab7a483e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 18:54:55 2014 -0400
+
+    [travis] Fail build if coveralls fails
+
+ .travis.yml | 15 ++-------------
+ 1 file changed, 2 insertions(+), 13 deletions(-)
+
+commit a8aa20260dbd9af9cbcc7d545fa8b41b07aae276
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 18:48:40 2014 -0400
+
+    [travis] Only run coveralls under gcc
+
+ .travis.yml | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 5de0407337d630117e424b7c715b7cbd432f4ef9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 18:18:25 2014 -0400
+
+    Help clang with gcov
+
+ src/check-defs.sh    | 2 +-
+ src/check-symbols.sh | 6 +++---
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit ef40ca8e5e830231539dc61088b58e907a840629
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 18:07:27 2014 -0400
+
+    [travis] Try to make coverage work with clang
+
+ .travis.yml | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 52784da17b7278f2587168234878bb15d918c9fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 17:57:43 2014 -0400
+
+    [travis] Minor
+
+ README | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit f2c9005f5123c7f9b227fd9ac9a3438c5fe4cf47
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 17:45:17 2014 -0400
+
+    Add README.md symlink to make github happy
+
+ README.md | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 40987e8aaca4155d9cff211549e8d23f24c334e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 17:44:30 2014 -0400
+
+    [travis] Re-enable clang
+
+ .travis.yml | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+commit 5400ac476e5a5bcc66559fcfb05a683a6b433ea1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 17:41:41 2014 -0400
+
+    Add build and coverage status links
+
+ README | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 19360e0a5609c65842a989587b01a4dc7c9eae36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 17:35:03 2014 -0400
+
+    [travis] Report matrix settings to help debugging
+
+ .travis.yml | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 9b89fc52f49b80df1f27ac7de69e0152bdcc94d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 17:20:31 2014 -0400
+
+    [travis] More coveralls
+
+ .travis.yml | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit a68f2b62c1f24009993911b1dbcb76b821e58c51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 17:05:58 2014 -0400
+
+    [travis] Give coveralls a hand
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5194d647e13aa5ba2cfcdbdcd4a659dc5bd11418
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 17:03:26 2014 -0400
+
+    [travis] Disable clang for now
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 715f27f85f97fee13b119f60037db5c139489ee6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 16:53:00 2014 -0400
+
+    [test] Fixup test
+
+ test/shaping/tests/hangul-jamo.tests | 9 ---------
+ 1 file changed, 9 deletions(-)
+
+commit 2a508ddae5de3852243725ce22caa3dcffccb83e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 16:49:22 2014 -0400
+
+    [travis] Another try at coveralls.io
+
+ .travis.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit dfe8078e5be46cab5e67aed977749c1d6725e6a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 16:38:47 2014 -0400
+
+    [travis] First try to hookup coveralls.io code coverage tracking
+
+ .travis.yml | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 1b387571e4d0eed883f1ae8ec85cf0e818b4a7f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 16:14:59 2014 -0400
+
+    [travis] Unbreak
+
+ .travis.yml | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+commit e281ed360dfdf803aea87b6078983867d08e07a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 16:09:08 2014 -0400
+
+    [travis] Minor
+
+ .travis.yml | 23 +++++++++++++++++++++--
+ 1 file changed, 21 insertions(+), 2 deletions(-)
+
+commit c0b82ba32a1987902a3b9c05b46f8be6b121883a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 14:24:07 2014 -0400
+
+    Create ragel-generated files in srcdir
+
+ src/Makefile.am | 25 ++++++++++---------------
+ 1 file changed, 10 insertions(+), 15 deletions(-)
+
+commit 79bbb10b0da49ace763a50f259c2ea687143f7ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 13:33:21 2014 -0400
+
+    Clean ragel-generated headers in maintainercleanfiles
+
+ src/Makefile.am | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 8971cac83eb4f06847abfa3eaa15857d27141810
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 12:41:03 2014 -0400
+
+    Don't use tmp files in Makefile
+
+    Useful for code-coverage generation of the ragel-generated files
+    as they will now contain the correct .hh filename in them.
+
+ src/Makefile.am | 27 +++++++++++++--------------
+ 1 file changed, 13 insertions(+), 14 deletions(-)
+
+commit 22723186652224a635f1dad5cda0f753e78c301d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 11:56:07 2014 -0400
+
+    check-static-inits: Filter out zero-length sections
+
+    When compiling with -O0, zero-sized constructors were showing up
+    and confusing the test.
+
+ src/check-static-inits.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b695a3dc2300ed970a4154ad8b997407b3cb4faf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 11:55:14 2014 -0400
+
+    check-static-inits: check for static finalizers
+
+ src/check-static-inits.sh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 250398b1e4f102e4e44eeb9e2aebf0cd2d397344
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 11:28:01 2014 -0400
+
+    Hide other bubble-sort
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c1e87442621beff98791ce56cfd1ccee506c4ee6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 1 11:07:08 2014 -0400
+
+    Hide bubble-sort!
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 80f77282264afb1356351024b1f062b2824bba3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 25 17:59:46 2014 +0300
+
+    [util] Fix ansi output when surface is empty
+
+ util/helper-cairo-ansi.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 156852991e18e5ac256ee4d6b2916931cc274977
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 25 17:45:49 2014 +0300
+
+    [ot-font] Add hb_ot_face_cmap_accelerator_t
+
+ src/hb-ot-font.cc | 113
+ +++++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 66 insertions(+), 47 deletions(-)
+
+commit d088ccaf11d9475fe0d269ce130b1793b8a1ffbf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 25 17:26:56 2014 +0300
+
+    [ot-font] Minor
+
+ src/hb-ot-font.cc | 23 ++++++++++++-----------
+ 1 file changed, 12 insertions(+), 11 deletions(-)
+
+commit d7c160a1530adabbcf33725b105072293115a34c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 25 17:15:35 2014 +0300
+
+    [ot-font] Handle missing vertical metrics tables
+
+ src/hb-ot-font.cc | 26 +++++++++++++++++++-------
+ 1 file changed, 19 insertions(+), 7 deletions(-)
+
+commit be1cca270257bfdfee3fbe821175269713acf408
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 25 16:53:24 2014 +0300
+
+    [ot-font] Add metrics_accel_t
+
+ src/hb-ot-font.cc       | 111
+ ++++++++++++++++++++++--------------------------
+ src/hb-ot-hhea-table.hh |   2 +-
+ src/hb-ot-hmtx-table.hh |   4 +-
+ 3 files changed, 54 insertions(+), 63 deletions(-)
+
+commit d41b809e9d21e655129a97c600d28f278fd7e62c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 25 13:04:08 2014 +0300
+
+    [ot-font] Start adding vertical support
+
+ src/hb-ot-font.cc       | 57 ++++++++++++++++++++++++++++++++++----------
+ src/hb-ot-hhea-table.hh | 63
+ ++++++++++++++++++++++++++-----------------------
+ src/hb-ot-hmtx-table.hh | 35 +++++++++++++++++----------
+ 3 files changed, 100 insertions(+), 55 deletions(-)
+
+commit 22f0de5025aeeef4c8b3ca876d291d4c8e558d94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 25 12:54:57 2014 -0400
+
+    Fix build
+
+ src/hb-ot-shape-complex-arabic-win1256.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit d457e3f0ff9b27616a34e4cc110d3edbf8796841
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 25 12:31:19 2014 -0400
+
+    [arabic] Don't #include __FILE__
+
+    Fine!
+
+    https://code.google.com/p/chromium/issues/detail?id=406957
+
+ src/hb-ot-shape-complex-arabic-win1256.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9ceb673d9c35bb28c9b2ed5359bdd8b23fda0019
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 25 11:48:12 2014 -0400
+
+    [arabic] Allow disabling win1256 fallback code
+
+    By defining HB_NO_WIN1256.
+
+ src/hb-ot-shape-complex-arabic-fallback.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8a9319502141c09695461c386e54f998250420e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 22 12:06:57 2014 -0400
+
+    [ot] Prefer Windows platform cmap tables / accept all Unicode
+    encodingIDs
+
+    Some fonts on the Mac ship with (0,1).
+
+ src/hb-ot-font.cc | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit 270971a0fccdf4964fd3e8ab8e5cf53037a3518d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 15 14:28:04 2014 -0400
+
+    [win32] Avoid preprocessor warnings re macros
+
+ src/hb-private.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 8c6bd34d38fb3007c3d660fce0095cc5c7e9962e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 14 13:33:37 2014 -0400
+
+    Fix check-symbols on OS X
+
+ src/check-libstdc++.sh | 14 +++++++-------
+ src/check-symbols.sh   |  8 +++++++-
+ 2 files changed, 14 insertions(+), 8 deletions(-)
+
+commit 522b1cc5261c1419166bfb90d2ff634b684be66a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 14 13:29:30 2014 -0400
+
+    [coretext] Hide feature_mappings
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0d2c2f238bf0a847ecd55a70cc0f081f18a053ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 14 13:25:55 2014 -0400
+
+    Simplify hb-object
+
+ src/hb-object-private.hh | 118
+ +++++++++++++++--------------------------------
+ 1 file changed, 36 insertions(+), 82 deletions(-)
+
+commit 9d861b81f349188a4507350398786a6e94038095
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 14 13:15:21 2014 -0400
+
+    Really fix clang build this time
+
+ src/hb-object-private.hh | 141
+ +++++++++++++++++++++++------------------------
+ 1 file changed, 68 insertions(+), 73 deletions(-)
+
+commit 272226f294382b0c6921b36e0e67fc53daa765d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 14 13:11:33 2014 -0400
+
+    Revert "Fix build on clang after previous commit"
+
+    This reverts commit 9c80cbc87f23040a334e30c750f64523d9ef10c8.
+
+ src/hb-object-private.hh | 34 +++++++++++++---------------------
+ 1 file changed, 13 insertions(+), 21 deletions(-)
+
+commit 9c80cbc87f23040a334e30c750f64523d9ef10c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 14 13:09:52 2014 -0400
+
+    Fix build on clang after previous commit
+
+ src/hb-object-private.hh | 34 +++++++++++++++++++++-------------
+ 1 file changed, 21 insertions(+), 13 deletions(-)
+
+commit a5a27073cfff91c4f80209ca8462543130af61dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 14 13:05:36 2014 -0400
+
+    Rewrite this==NULL checks to avoid undefined behavior
+
+    Fixes https://code.google.com/p/chromium/issues/detail?id=403594
+
+ src/hb-object-private.hh | 18 ++++++++----------
+ 1 file changed, 8 insertions(+), 10 deletions(-)
+
+commit cc3b2d432b02f9381cdf19e2dd5fbbdd002a750c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 14 12:59:16 2014 -0400
+
+    Remove this==NULL check from face->reference_table()
+
+    Not supposed to happen, and apparently this is undefined in C++.
+    https://code.google.com/p/chromium/issues/detail?id=403594
+
+ src/hb-face-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cd7ea4f791dc41d62ad238673e2ea0107883c9e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 14 12:57:02 2014 -0400
+
+    Make hb_object_t members private
+
+    In preparation for fixing:
+    https://code.google.com/p/chromium/issues/detail?id=403594
+
+ src/hb-object-private.hh | 26 +++++++++++++++++++++-----
+ src/hb-set-private.hh    |  2 +-
+ 2 files changed, 22 insertions(+), 6 deletions(-)
+
+commit c4308f895aef93ed884fd54e4ebc65b6d2cfc94a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 13 19:42:01 2014 -0400
+
+    Minor
+
+ test/shaping/hb_test_tools.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cd5a1149d980dc3c17b6bb9d961c761b2671ba1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 13 12:39:34 2014 -0400
+
+    0.9.35
+
+ NEWS         | 29 +++++++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 30 insertions(+), 1 deletion(-)
+
+commit 20076cc41e673c31305fcb58d37b3b292fd35f83
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 12 19:26:35 2014 -0400
+
+    [coretext] Add version guards for kCTLanguageAttributeName
+
+ src/hb-coretext.cc | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 1b3011c27df531875d432e909ae6b77f115c5017
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 12 19:17:19 2014 -0400
+
+    [coretext] Pass buffer language to CoreText
+
+ src/hb-coretext.cc | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 3eb6a4dbf25b11fce5e0e426e89f7457887aeca0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 12 19:10:33 2014 -0400
+
+    [coretext] Minor
+
+ src/hb-coretext.cc | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 08acfe0d3a1d8223a9fa0696703fff63d6c2ea8b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 12 18:57:08 2014 -0400
+
+    [hb-coretext] Fix cluster order of notdef runs in RTL text
+
+ src/hb-coretext.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 30eed75de24ac0b6648a72d98d10bb24a563d7ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 12 17:15:09 2014 -0400
+
+    [shape-plan] Fix typo!
+
+    The only effect is, if shaper_list was not NULL and no shaper
+    was found,
+    we now don't insert anything into cache and return earlier.
+
+ src/hb-shape-plan.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dc9aba6fc53898acd7281b118cec0355d61b1df2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 12 17:14:36 2014 -0400
+
+    [shape-plan] Better debug messages
+
+ src/hb-shape-plan.cc | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+commit e956c65bf724a8403471362288d2361361b6ac58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 12 17:03:27 2014 -0400
+
+    [shape-plan] Simplify macro
+
+ src/hb-shape-plan.cc | 22 ++++++++--------------
+ 1 file changed, 8 insertions(+), 14 deletions(-)
+
+commit 29e25550ce8fee3fecc42d20a45ce9c212dc59df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 12 17:02:59 2014 -0400
+
+    Fix gcc warning
+
+ src/hb-private.hh | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 8d5eebc0c6ada01128c6ee384340efdbef7ba29d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 12 16:50:22 2014 -0400
+
+    [shape-plan] Fix shape-plan caching with more than one requested
+    shaper
+
+    Wasn't breaking out of loop, ouch!
+
+    http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1246370.html
+
+ src/hb-shape-plan.cc | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit bc3d0dc60104f1cda465a5e8ba5b40ed5bec70b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 12 16:49:18 2014 -0400
+
+    [shape-plan] Add debug tracing
+
+ src/hb-shape-plan.cc | 26 ++++++++++++++++++++++++++
+ 1 file changed, 26 insertions(+)
+
+commit 81b8d9777b9c38c7e6408591763a4cac6de18e4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 12 15:49:47 2014 -0400
+
+    [coretext] Fix buffer resizing
+
+    Was very broken.  Now fixed and tested.
+
+ src/hb-coretext.cc | 17 +++++++++++++----
+ 1 file changed, 13 insertions(+), 4 deletions(-)
+
+commit c3e924fb9e0e2d4003790817655efd9c5688c7e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 12 14:25:11 2014 -0400
+
+    [coretext] Rewind scratch-allocated arrays when not needed anymore
+
+ src/hb-coretext.cc | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+commit 8fd4d70b1450d7261a35ab3dea1c70baea2e5c99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 12 13:12:31 2014 -0400
+
+    [wince] Two more Windows CE fixes
+
+    Report has it that it builds (and works) now:
+
+      https://codereview.qt-project.org/#/c/92087/
+
+ src/hb-mutex-private.hh | 2 +-
+ src/hb-private.hh       | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit fd0001d7dbe6ede99a9f87f96f231ffb53303be8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 12 10:32:41 2014 -0400
+
+    [coretext] Compare CGFont and PS name, if CTFont didn't match
+
+    See comments.
+
+    Fixes vertical text.  CoreText backend is in very good shape now!
+
+    Also see:
+    5a0eed3b50629be4826e4e9428f2c3255195395d
+    25f4fb9b56bb3f8bec821571c78f8829e40daa54
+
+    Fixes http://github.com/behdad/harfbuzz/pull/36
+
+ src/hb-coretext.cc | 54
+ ++++++++++++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 48 insertions(+), 6 deletions(-)
+
+commit 5a0eed3b50629be4826e4e9428f2c3255195395d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 23:47:16 2014 -0400
+
+    [coretext] Implement vertical shaping
+
+    Currently doesn't work though, we detect font fallback.  Apparently
+    matching on ct_font is not safe for this.  Looks like commit
+    25f4fb9b56bb3f8bec821571c78f8829e40daa54 wasn't enough after all.
+
+ src/hb-coretext.cc | 127
+ ++++++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 81 insertions(+), 46 deletions(-)
+
+commit 1b55077f03758e49f93b8bc1de678e96ea58718c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 20:45:12 2014 -0400
+
+    [coretext] Remove unnecessary alt_size
+
+    Wasn't needed after a6b8dc87421de33746b0b14d86d2d1532aec02af.
+
+ src/hb-coretext.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 10b1104d791a0b0103c6bbb083b5819f2b7d328d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 20:02:45 2014 -0400
+
+    [coretext] Use CFRunStatus
+
+    Assert that all runs had expected direction, and take hint for
+    non-monotone clusters.
+
+ src/hb-coretext.cc | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+commit fd1a6aa8d029c701b1532efa59ce901109cfc216
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 20:01:37 2014 -0400
+
+    [coretext] Minor
+
+ src/hb-coretext.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 130856c705641aa681307b5b51b5fb84e295f382
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 19:16:26 2014 -0400
+
+    [coretext] Remove debug printf!
+
+ src/hb-coretext.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit b5fbc3b8f560235d014c62e49220574ffcf89349
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 18:40:01 2014 -0400
+
+    API: Do not clear buffer-flags in hb_buffer_clear_contents()
+
+    After 763e5466c0a03a7c27020e1e2598e488612529a7, one doesn't
+    need to set flags for different pieces of text.  The flags now
+    are something the client sets up once, depending on how it
+    actually uses the buffer.  As such, don't clear it in
+    clear_contents().
+
+    Tests updated.
+
+ src/hb-buffer-private.hh |  4 +---
+ src/hb-buffer.cc         |  4 ++--
+ test/api/test-buffer.c   | 15 ++++++++++++---
+ 3 files changed, 15 insertions(+), 8 deletions(-)
+
+commit 104484cefeca03d95837bba5f39178693c86ce8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 18:23:43 2014 -0400
+
+    Minor
+
+ src/hb-common.h | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 4acce77db7dd588ba277779c4997b0256ebe426e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 17:46:50 2014 -0400
+
+    [coretext] Pass buffer direction to CoreText
+
+    Have to use a CTTypesetter for this.
+
+ src/hb-coretext.cc | 26 ++++++++++++++++++++++----
+ 1 file changed, 22 insertions(+), 4 deletions(-)
+
+commit 5ec45dd37caa8a87ce2689a66272ba8a343fe6ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 17:46:12 2014 -0400
+
+    [coretext] Minor
+
+    It's hard to handle all possible NULL returns from CoreText.  Add one
+    more...
+
+ src/hb-coretext.cc | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 624a299b829ccf9864dd2f3001b1a49476e96b4a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 15:29:18 2014 -0400
+
+    [coretext] Attach marks to base clusters
+
+    Fixes https://githu.com/behdad/harfbuzz/issues/49
+    to the extent that it can be fixed.
+
+ src/hb-coretext.cc | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+commit 3c41ccb5358b0be6cc68d49f436d2cb1792cd5e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 15:11:59 2014 -0400
+
+    [coretext] Use input clusters
+
+    Before, this shaper was returning UTF-16 cluster indices instead of
+    returning whatever cluster values the user had had set up in the
+    buffer.
+    Ouch!
+
+ src/hb-coretext.cc | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit a6b8dc87421de33746b0b14d86d2d1532aec02af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 15:08:19 2014 -0400
+
+    [coretext] Fix buffer resize handling
+
+    We can't really resize buffer and continue in this shaper as we are
+    using the scratch buffer for string_ref and log_cluster.  Restructure
+    shaper to retry from (almost) scratch.
+
+ src/hb-buffer-private.hh |   3 +
+ src/hb-coretext.cc       | 428
+ ++++++++++++++++++++++++++---------------------
+ 2 files changed, 238 insertions(+), 193 deletions(-)
+
+commit 9b3c60c88b118f01610ae7a608b138f79f2dc7be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 13:25:43 2014 -0400
+
+    [coretext] Always compute log_clusters
+
+    To be used soon.
+
+ src/hb-coretext.cc | 24 +++++++++++-------------
+ 1 file changed, 11 insertions(+), 13 deletions(-)
+
+commit 15c633dd1f412f9ef839d80a8f7af35e7ea48fbc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 13:42:42 2014 -0400
+
+    Minor
+
+ src/hb-graphite2.cc | 4 ++--
+ src/hb-uniscribe.cc | 6 ++----
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+commit 9ce067c77524a9ffc77ceabcba5e7dab36fd39de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 11 02:04:38 2014 -0400
+
+    [coretext] Simplify cluster mapping
+
+ src/hb-coretext.cc | 41 +++++++++++++++++------------------------
+ 1 file changed, 17 insertions(+), 24 deletions(-)
+
+commit 49f7fb63761e4ca9936990fb90a77fd3600f5ad2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 10 19:19:38 2014 -0400
+
+    [coretext] Minor
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 25f4fb9b56bb3f8bec821571c78f8829e40daa54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 10 19:05:25 2014 -0400
+
+    [coretext] Fix fallback detection
+
+    Fixes http://github.com/behdad/harfbuzz/pull/36
+
+ src/hb-coretext.cc | 29 ++++++++++++++++++++---------
+ 1 file changed, 20 insertions(+), 9 deletions(-)
+
+commit 77a7a53acef7de355116d488e7d64ff1d7e9e9e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 10 18:59:47 2014 -0400
+
+    [coretext] Fix last range
+
+    Test with:
+
+    hb-view /Library/Fonts/Zapfino.ttf ZapfinoZapfino --features=-dlig[7:]
+    --shaper=coretext
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c2b151d95262a8dc2d2ce94e19ab0ef5b0c8f98d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 10 18:52:07 2014 -0400
+
+    Fix hb_in_range() for types smaller than int
+
+    As exercised by hb-coretext .notdef code.
+
+ src/hb-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 26a963b9cb4af3119177f277a2d48a5d537458fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 10 18:04:50 2014 -0400
+
+    [wince] Try to fix some stuff on Windows CE
+
+    Based on errors seen here:
+    http://testresults.qt-project.org/ci/QtBase_dev_Integration/build_03837/wince70embedded-armv4i-msvc2008_Windows_7/log.txt.gz
+
+    Fully untested.
+
+ src/hb-private.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 92aeee3f040c2c32cbf70b27bd6954535388c870
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 10 17:42:19 2014 -0400
+
+    Minor
+
+ src/hb-coretext.cc  | 4 ++--
+ src/hb-uniscribe.cc | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit b9993d8d6d332994dfbd29e99ff8043622003417
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 10 17:40:24 2014 -0400
+
+    [coretext] Fix assert on Yosemite
+
+    Apparently those functions documented as sometimes returning NULL
+    actually exercise that right in OS X 10.10 Yosemite.  The scratch
+    was too small for that.  I *think* I fixed it, but haven't tested
+    as I don't have Yosemite.
+
+ src/hb-coretext.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 087733dd66e17297ef0e53680fafe42c84884104
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 18 11:21:08 2014 -0700
+
+    [coretext] Use CGFont as face_data
+
+ src/hb-coretext.cc | 26 +++++++++-----------------
+ 1 file changed, 9 insertions(+), 17 deletions(-)
+
+commit d277c3d7eee1fd4fb41c38255e5c4df539353e89
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 7 15:38:52 2014 -0400
+
+    [arabic] Bug 82306 - Mandaic had errors in its Unicode Joining_Type
+
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=82306
+
+ src/hb-ot-shape-complex-arabic-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 38fb30d7420a4b01f99cee31baa8c3990a1d1c5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 6 13:34:49 2014 -0400
+
+    Use atexit() only if it's safe to call from shared library
+
+    Apparently they are not (advertised as?) safe on BSD systems.
+    We ignore the case of static libraries.
+
+    Whitelisted on glibc, Android, and MSVC / mingw.
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=82246
+
+ src/hb-common.cc    |  4 ++--
+ src/hb-ft.cc        |  2 +-
+ src/hb-private.hh   | 25 +++++++++++++++++++++++++
+ src/hb-shape.cc     |  2 +-
+ src/hb-shaper.cc    |  2 +-
+ src/hb-uniscribe.cc |  2 +-
+ 6 files changed, 31 insertions(+), 6 deletions(-)
+
+commit d5e61470fa8e5046c35a79988e00e012ae4fff0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 5 14:19:01 2014 -0400
+
+    [arabic] Fix fallback shaping regression
+
+    Was broken in 615d00ea252739da57edbd980ff27e573.
+
+    Fixes https://github.com/behdad/harfbuzz/pull/48
+
+    Micro-test added.
+
+ src/hb-ot-shape-complex-arabic.cc                        |   4 ++--
+ test/shaping/Makefile.am                                 |   1 +
+ test/shaping/fonts/sha1sum/MANIFEST                      |   1 +
+ .../sha1sum/df768b9c257e0c9c35786c47cae15c46571d56be.ttf | Bin 0 ->
+ 6332 bytes
+ test/shaping/tests/MANIFEST                              |   1 +
+ test/shaping/tests/arabic-fallback-shaping.tests         |   1 +
+ 6 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 91c2c0fd2b0f660d79744b3dfaf39ab86883e96b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 2 19:24:55 2014 -0400
+
+    0.9.34
+
+ NEWS         | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 54 insertions(+), 1 deletion(-)
+
+commit d7c850f8037d2701366008eb8c2a527c9d40abde
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 2 17:46:38 2014 -0400
+
+    [uniscribe] Minor
+
+ src/hb-uniscribe.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 8f3eebf7ee4005f9a8efaafcb7f4058cc0a3756e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 2 17:18:46 2014 -0400
+
+    Make sure gsubgpos buffer vars are available during fallback_position
+
+    Add buffer var allocation asserts to a few key places.
+
+ src/hb-ot-layout-gpos-table.hh             |  4 ++--
+ src/hb-ot-layout-gsub-table.hh             |  2 +-
+ src/hb-ot-layout-private.hh                | 15 +++++++++++++++
+ src/hb-ot-shape-complex-arabic-fallback.hh |  2 +-
+ src/hb-ot-shape-fallback.cc                |  2 ++
+ src/hb-ot-shape-normalize.cc               |  2 ++
+ src/hb-ot-shape.cc                         |  3 +++
+ 7 files changed, 26 insertions(+), 4 deletions(-)
+
+commit 2053f369f84676f197ac41ea654a318c48922abd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 2 16:31:16 2014 -0400
+
+    Disable 'liga' for vertical text
+
+    The reason we turned it on is because Kazuraki uses it.  But that's
+    not reason enough.  Until the OpenType spec gets its act together re
+    adding design-direction to lookups, this is better user experience.
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 763e5466c0a03a7c27020e1e2598e488612529a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 2 16:17:44 2014 -0400
+
+    Make it easier to use HB_BUFFER_FLAG_BOT/EOT
+
+    Previously, we expected users to provide BOT/EOT flags when the
+    text *segment* was at paragraph boundaries.  This meant that for
+    clients that provide full paragraph to HarfBuzz (eg. Pango), they
+    had code like this:
+
+      hb_buffer_set_flags (hb_buffer,
+                           (item_offset == 0 ? HB_BUFFER_FLAG_BOT : 0) |
+                           (item_offset + item_length == paragraph_length
+                           ?
+                            HB_BUFFER_FLAG_EOT : 0));
+
+      hb_buffer_add_utf8 (hb_buffer,
+                          paragraph_text, paragraph_length,
+                          item_offset, item_length);
+
+    After this change such clients can simply say:
+
+      hb_buffer_set_flags (hb_buffer,
+                           HB_BUFFER_FLAG_BOT | HB_BUFFER_FLAG_EOT);
+
+      hb_buffer_add_utf8 (hb_buffer,
+                          paragraph_text, paragraph_length,
+                          item_offset, item_length);
+
+    Ie, HarfBuzz itself checks whether the segment is at the beginning/end
+    of the paragraph.  Clients that only pass item-at-a-time to HarfBuzz
+    continue not setting any flags whatsoever.
+
+    Another way to put it is: if there's pre-context text in the buffer,
+    HarfBuzz ignores the BOT flag.  If there's post-context, it ignores
+    EOT flag.
+
+ src/hb-ot-shape-complex-arabic.cc | 40
+ +++++++++++++++++++--------------------
+ src/hb-ot-shape.cc                |  1 +
+ 2 files changed, 20 insertions(+), 21 deletions(-)
+
+commit 0a5ae9336231c4d189e1682e4fd9c9c4552b8bbf
+Merge: ac53443f 6ab6be32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 2 15:00:34 2014 -0400
+
+    Merge branch 'win1256'
+
+commit 6ab6be32c5857ce3344021ad2996e80b2a8c8f99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 2 14:58:38 2014 -0400
+
+    [arabic/win1256] Remove unused MultipleSubst macros
+
+ src/hb-ot-shape-complex-arabic-win1256.hh | 12 ------------
+ 1 file changed, 12 deletions(-)
+
+commit abfa4252cce1c56c472693dcd8400cd97ededd2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 1 19:05:33 2014 -0400
+
+    [arabic/win1256] Really fix lam-alef this time
+
+    https://bugzilla.mozilla.org/show_bug.cgi?id=1045139#c26
+    https://github.com/behdad/harfbuzz/commit/b276e897d17519a2c28f79d024904ac2bdd86bcf#commitcomment-7243499
+
+ src/hb-ot-shape-complex-arabic-fallback.hh |  2 +-
+ src/hb-ot-shape-complex-arabic-win1256.hh  | 49
+ +++++++++---------------------
+ 2 files changed, 15 insertions(+), 36 deletions(-)
+
+commit 55977f2a462b7fa1248eab3787053dc82320d3e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 1 16:14:33 2014 -0400
+
+    [arabic/win1256] Hook up lamMedi lookup
+
+    Restructure lookup array to accommodate.
+
+    https://bugzilla.mozilla.org/show_bug.cgi?id=1045139#c18
+
+ src/hb-ot-shape-complex-arabic-fallback.hh | 26
+ ++++++++++----------------
+ src/hb-ot-shape-complex-arabic-win1256.hh  |  1 +
+ 2 files changed, 11 insertions(+), 16 deletions(-)
+
+commit e839e2523e64fd0cf21929f6a45e2facd59c7917
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 1 16:09:31 2014 -0400
+
+    [arabic/win1256] Fix TEH MARBUTA final form
+
+    https://bugzilla.mozilla.org/show_bug.cgi?id=1045139#c18
+
+ src/hb-ot-shape-complex-arabic-win1256.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit a2de193220ee2839125594bd1a60b5b66ab4598e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 31 18:21:05 2014 -0400
+
+    [arabic/win1256] Fix shaping of JEEM, HAH, and KHAH
+
+    https://bugzilla.mozilla.org/show_bug.cgi?id=1045139#c16
+
+ src/hb-ot-shape-complex-arabic-win1256.hh | 22 ++++++++++++----------
+ 1 file changed, 12 insertions(+), 10 deletions(-)
+
+commit 1789ccb1dd56af6117eac00e633eff94860ba252
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 31 11:04:00 2014 -0400
+
+    [arabic/win1256] Remove GCC'ism
+
+    The table can now compile independently too.  If we cannot make
+    it work
+    on MSVC, we can always generate the data and distribute it.
+
+    The code now compiles cleanly with:
+
+    gcc -c -xc -std=c99 -Werror -pedantic
+    hb-ot-shape-complex-arabic-win1256.hh
+    g++ -c -xc -std=c++1x -Werror -pedantic
+    hb-ot-shape-complex-arabic-win1256.hh
+
+    See:
+    https://github.com/behdad/harfbuzz/commit/a97f537cec209649302899975d76ca2b2661da7a#commitcomment-7218736
+
+ src/hb-ot-shape-complex-arabic-fallback.hh |   4 +-
+ src/hb-ot-shape-complex-arabic-win1256.hh  | 123
+ +++++++++++++++++------------
+ 2 files changed, 75 insertions(+), 52 deletions(-)
+
+commit f28b1c823db2ad56fed356ef864a7508d23048b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 30 02:15:44 2014 -0400
+
+    [arabic] Implement Windows-1256 private shaping
+
+    Bug 1045139 - The Arabic text with "MS Sans Serif" font is rendered
+    bad
+    https://bugzilla.mozilla.org/show_bug.cgi?id=1045139
+
+    This is only enabled on Windows platforms, and requires support from
+    Uniscribe to work.  But for clients that do hook up to Uniscribe, this
+    fixes shaping of Windows-1256-encoded bitmap fonts like "MS Sans
+    Serif".
+
+    The code and table together have just less than a 1kb footprint when
+    enabled.
+
+    UNTESTED.  I might even have broken regular Arabic fallback shaping.
+
+ src/Makefile.am                            |   1 +
+ src/check-includes.sh                      |   2 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh | 125 +++++++++--
+ src/hb-ot-shape-complex-arabic-win1256.hh  | 328
+ +++++++++++++++++++++++++++++
+ 4 files changed, 442 insertions(+), 14 deletions(-)
+
+commit ac53443f1cea83ed43a4e41a9fdb91902f7fae7b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 31 18:51:37 2014 -0400
+
+    [hangul] Don't apply 'calt'
+
+    See comments.
+
+    Micro-test added.
+
+ src/hb-ot-shape-complex-hangul.cc                        |  11
+ ++++++++++-
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf | Bin 0 ->
+ 1804 bytes
+ .../sha1sum/7e14e7883ed152baa158b80e207b66114c823a8b.ttf | Bin 0 ->
+ 1644 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   2 ++
+ test/shaping/tests/MANIFEST                              |   1 +
+ test/shaping/tests/hangul-jamo.tests                     |  11
+ +++++++++++
+ 7 files changed, 25 insertions(+), 1 deletion(-)
+
+commit 8292f96b2be173ebceb1b54426c271cfeaecd633
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 31 18:33:11 2014 -0400
+
+    [test] Fix record-test.sh
+
+ test/shaping/record-test.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 88911e8cc765c26e502503a3a00ac7f17973f3d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 29 19:47:26 2014 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-arabic-fallback.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 9e834e29e0b657f0555df1ab9cea79ff7abcf08d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 26 20:34:01 2014 -0400
+
+    [hebrew] Zero mark advance by GDEF late
+
+    Seems to be what Uniscribe does.
+
+    At this point I think it's work checking our default...
+
+    Fixes Bug 76767 - Zeroing of advance of 2nd component of multiple
+    substitution with SBL Hebrew
+    https://bugs.freedesktop.org/show_bug.cgi?id=76767
+
+    Micro-test added.
+
+ src/hb-ot-shape-complex-hebrew.cc                        |   2 +-
+ .../sha1sum/8454d22037f892e76614e1645d066689a0200e61.ttf | Bin 0 ->
+ 6068 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   1 +
+ test/shaping/tests/zero-width-marks.tests                |   1 +
+ 4 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 6f2d9ba52a6d1e3fc200da1ef0e85ba020fcd0dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 26 19:17:44 2014 -0400
+
+    Add old-Myanmar shaper
+
+    Looks like Unsicribe responds to the 'mymr' tag by zeroing marks
+    GDEF_LATE instead of generic-shaper UNICODE_LATE.  Implement that.
+
+    Fixes
+    Bug 81775 - Incorrect Rendering with harfbuzz-ng myanmar unicode
+    https://bugs.freedesktop.org/show_bug.cgi?id=81775
+
+    Micro-test added based on Padauk.
+
+ src/hb-ot-shape-complex-myanmar.cc                    |  18
+ ++++++++++++++++++
+ src/hb-ot-shape-complex-private.hh                    |   5 +++--
+ test/shaping/Makefile.am                              |   1 +
+ test/shaping/fonts/sha1sum/MANIFEST                   |   1 +
+ .../bb9473d2403488714043bcfb946c9f78b86ad627.ttf      | Bin 0 ->
+ 3440 bytes
+ test/shaping/tests/MANIFEST                           |   1 +
+ test/shaping/tests/zero-width-marks.tests             |   1 +
+ 7 files changed, 25 insertions(+), 2 deletions(-)
+
+commit 595d2b96c37de8147489dc5e0ddcc4ab1ad3eea9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 26 18:44:15 2014 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 1 +
+ src/hb-ot-shape.cc               | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit fe6788bc570d77d5b3aafc68efd51ca6b80499b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 25 12:40:56 2014 -0400
+
+    Typo
+
+ src/hb-common.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0de25d4184d2d92b1a2ebb6fa054275aaae4c316
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 25 12:35:03 2014 -0400
+
+    [util] Note CSS compatibility in --help-features
+
+ util/options.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 6e69200a2aadbc6bba35ffb4a058c14286b84f46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 25 12:30:47 2014 -0400
+
+    Fix snprintf() format
+
+    Patch from Maks Naumov.
+    Fixes https://github.com/behdad/harfbuzz/pull/22
+
+ src/hb-shape.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 5c5cdbbdf8be231c433e21b050a6c6991d327b61
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 25 12:21:49 2014 -0400
+
+    Make sure broken feature strings are not partially parsed
+
+    If user doesn't check hb_feature_from_string() return value, we
+    don't want them to end up see the partially-parsed feature.
+
+ src/hb-shape.cc | 18 ++++++++++++++----
+ 1 file changed, 14 insertions(+), 4 deletions(-)
+
+commit a795fe637846e0d9561d2f7cdd84cfafd58b23a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 25 12:15:33 2014 -0400
+
+    Allow quotation marks around feature tag in hb_feature_from_string()
+
+    With this, I believe we accept CSS feature strings completely.
+
+ src/hb-shape.cc | 24 +++++++++++++++++++++---
+ 1 file changed, 21 insertions(+), 3 deletions(-)
+
+commit 3f6461847412e78bcddc8eba97200f3afcde869a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 25 12:04:27 2014 -0400
+
+    Allow space at the end of feature string with values, eg 'dlig=1 '
+
+ src/hb-shape.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit f31f7d2259dd8edffc070af55938cb7aa23514c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 25 12:03:52 2014 -0400
+
+    Minor
+
+ src/hb-shape.cc | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 60cb18a5dea2d30793f89e80995bb729c014864a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 25 12:01:22 2014 -0400
+
+    Allow on/off in hb_feature_from_string()
+
+    We now allow things like "dlig on" / "dlig=on".
+
+ src/hb-shape.cc | 26 ++++++++++++++++++++++++--
+ 1 file changed, 24 insertions(+), 2 deletions(-)
+
+commit d9e618eca9e01c2eb6db65504af3f73be370a1e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 25 11:56:01 2014 -0400
+
+    Remove duplicate definition of ISALNUM
+
+    It's defined in hb-private.h already.
+
+ src/hb-shape.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 2ee5f665ded86147acedc400153c0b3a90fe07c6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 25 11:53:46 2014 -0400
+
+    Fix parsing of features like "- liga" (with the space)
+
+ src/hb-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e15fa7a8cffbe6a67b1048d7b87b7df77d8b1686
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 25 11:44:35 2014 -0400
+
+    Do not require the '=' in hb_feature_from_string()
+
+    Towards accepting CSS font-feature-settings strings.
+
+ src/hb-shape.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit f4fe9baefdb7e0ff9946f88b6f4b55738fa30cdf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 25 11:39:55 2014 -0400
+
+    Reject tags longer than 4 chars in hb_feature_from_string()
+
+ src/hb-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7e8c38954649c0bf2e6051d84ca08dce090ec169
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 25 11:18:11 2014 -0400
+
+    Minor warnings fixes
+
+    Some systems insist on -Wmissing-field-initializers.  We have
+    too many,
+    by design.  Fix a few easy ones.
+
+ src/hb-open-type-private.hh | 2 +-
+ src/hb-ot-layout-private.hh | 2 +-
+ src/hb-private.hh           | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit fc0daafab0336b847ac14682e581a8838f36a0bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 23 16:48:51 2014 -0400
+
+    [indic] Handle old-spec Malayalam reordering with final Halant
+
+    See comment.
+
+    Micro-tests added.
+
+ src/hb-ot-shape-complex-indic.cc                   |  28
+ +++++++++++++++++----
+ test/shaping/Makefile.am                           |   1 +
+ .../270b89df543a7e48e206a2d830c0e10e5265c630.ttf   | Bin 0 -> 3428 bytes
+ .../57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf   | Bin 0 -> 2272 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                |   2 ++
+ test/shaping/tests/MANIFEST                        |   1 +
+ test/shaping/tests/indic-old-spec.tests            |   2 ++
+ .../indic/script-malayalam/misc/misc.txt           |   1 +
+ 8 files changed, 30 insertions(+), 5 deletions(-)
+
+commit d6d349d17898529ecdf8217a54987a3e9f81ce05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 23 11:38:49 2014 -0400
+
+    Give CC to gir-scanner
+
+    From:
+    https://github.com/Alexpux/MINGW-packages/blob/master/mingw-w64-harfbuzz/0001-give-cc-to-gir-scanner.all.patch
+
+ src/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 8c1bdb46facb79cfca5ebfea9a7e467b40337f47
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 22 17:56:43 2014 -0400
+
+    0.9.33
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit d218bdb26b226fbf68331eb586b24460c061313d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 22 18:01:46 2014 -0400
+
+    Fix test runner under Windows
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3f310dc0cae9015c45ba642b9b83d5695c807aad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 22 16:26:27 2014 -0400
+
+    Disallow changing settings on immutable face
+
+    Ouch!
+
+ src/hb-face.cc    | 8 ++++----
+ src/hb-font.cc    | 4 ++--
+ src/hb-unicode.cc | 2 +-
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 0fc0a1022854324261fea8893678a3e9fd9443eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 21 11:12:54 2014 -0400
+
+    [win] Fix Cygwin build
+
+    https://github.com/behdad/harfbuzz/commit/db308280488c2ee11ba865a9922eb6a0c1abeef3#commitcomment-7077778
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1132a7dd0ecf1c425078e39e5471330bace42659
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 20 01:17:40 2014 -0400
+
+    Add HB_TAG_MAX_SIGNED / _HB_SCRIPT_MAX_VALUE_SIGNED
+
+    To make C language police happy.
+
+ src/hb-common.h | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+commit df99976398a53521e0228541055dcaee8f5ba87f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 19 17:31:23 2014 -0400
+
+    [gobject] Skip _HB_SCRIPT_MAX_VALUE
+
+    Fixes https://github.com/behdad/harfbuzz/pull/38
+
+ src/hb-common.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f1a8d50a87edfb8147aa1bec732ed7ccbfef2877
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 19 16:52:32 2014 -0400
+
+    [win] Don't define visibility attribtue under Cygwin
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9c77027d645142794c3ff1590a96bb151c3f2e91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 19 16:37:22 2014 -0400
+
+    [win] Turn STRICT on for including windows.h
+
+ src/hb-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit db308280488c2ee11ba865a9922eb6a0c1abeef3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 19 16:32:04 2014 -0400
+
+    [win] Consolidate windows.h include tips and tricks
+
+ src/hb-atomic-private.hh |  4 ----
+ src/hb-mutex-private.hh  |  1 -
+ src/hb-private.hh        | 12 ++++++++++++
+ src/hb-uniscribe.cc      |  3 ---
+ src/hb-uniscribe.h       |  3 ---
+ 5 files changed, 12 insertions(+), 11 deletions(-)
+
+commit f26d59d4684be3419c976d781b6dbc956248e3bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 19 16:10:21 2014 -0400
+
+    More fixing MemoryBarrier() on Mingw32
+
+    Set requested windows header to Vista.  See discussion:
+
+    https://github.com/behdad/harfbuzz/commit/fbb2847f541389f40718af71c4945024ae177ab2#commitcomment-7054700
+
+ src/hb-atomic-private.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 00a57eb4b50fd894dc68c6525a5bbebf0ebc30e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 18 14:42:50 2014 -0400
+
+    [test] Remove unused micro-font
+
+ .../9d64156923a1b9fed1e05f74599c16563eca42d9.ttf        | Bin 81968 ->
+ 0 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                     |   1 -
+ 2 files changed, 1 deletion(-)
+
+commit ed29b15f5d0d9e7b40143926ca7d40bf645f67e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 18 14:37:49 2014 -0400
+
+    [test] Add more Mongolian variation selector tests
+
+    From
+    https://code.google.com/p/chromium/issues/detail?id=393896
+
+ .../9d64156923a1b9fed1e05f74599c16563eca42d9.ttf        | Bin 0 ->
+ 81968 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                     |   2 ++
+ .../bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf        | Bin 0 ->
+ 74856 bytes
+ test/shaping/tests/mongolian-variation-selector.tests   |   1 +
+ .../shaper-arabic/script-mongolian/misc/MANIFEST        |   1 +
+ .../script-mongolian/misc/variation-selectors.txt       |   8 ++++++++
+ 6 files changed, 12 insertions(+)
+
+commit 385cf37cf084198e3aedb4354a7b025938a9f11b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 17 18:22:07 2014 -0400
+
+    Fix hb_in_range() unused-var warning on Windows
+
+ src/hb-private.hh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit e3b42f1af409c073b819bfc696024ccb1f1da63f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 17 17:13:54 2014 -0400
+
+    [arabic] Disable 'cswh' again
+
+    Ouch!
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 66f30915b185727a0041c998641edb550eb8a7fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 17 16:05:47 2014 -0400
+
+    0.9.32
+
+ NEWS         | 12 ++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit 82f4d9d53f348f41b14b877c1ac77c0372c49caa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 17 15:57:37 2014 -0400
+
+    [arabic] Add note re disabled 'cswh'
+
+ src/hb-ot-shape-complex-arabic.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 615d00ea252739da57edbd980ff27e573f88ee7e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 17 13:36:09 2014 -0400
+
+    [arabic] Apply init/medi/isol/fini/... in separate stages
+
+    Follows the order of the Arabic/Syriac specs.  Also don't stop
+    between rlig and calt in non-Arabic scripts.
+
+    Micro-tests for Arabic and Mongolian added for the latter.
+
+ src/hb-ot-shape-complex-arabic.cc                  |  56
+ +++++++++++++--------
+ test/shaping/Makefile.am                           |   2 +
+ .../813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf   | Bin 0 -> 3428 bytes
+ .../8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf   | Bin 0 -> 3428 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                |   3 ++
+ .../a919b33197965846f21074b24e30250d67277bce.ttf   | Bin 0 -> 12560 bytes
+ test/shaping/tests/MANIFEST                        |   1 +
+ test/shaping/tests/arabic-feature-order.tests      |   3 ++
+ 8 files changed, 43 insertions(+), 22 deletions(-)
+
+commit d21e997035b16e9807dfb29c3605abb93f92f1ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 17 15:27:46 2014 -0400
+
+    [test] Make record_test understand cmdline args to hb-shape
+
+ test/shaping/record-test.sh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 7cd33f230441093dbfb1fec48f8c580ee8d9ef71
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 17 14:22:11 2014 -0400
+
+    Micro optimization
+
+ src/hb-fallback-shape.cc           | 36
+ +++++++++++++++++++-----------------
+ src/hb-ot-shape-complex-arabic.cc  | 19 +++++++++++--------
+ src/hb-ot-shape-complex-indic.cc   | 15 ++++++++++-----
+ src/hb-ot-shape-complex-myanmar.cc |  7 +++++--
+ src/hb-ot-shape-complex-sea.cc     |  7 +++++--
+ src/hb-ot-shape-fallback.cc        | 30 ++++++++++++++++--------------
+ src/hb-ot-shape.cc                 | 18 ++++++++++++------
+ 7 files changed, 78 insertions(+), 54 deletions(-)
+
+commit 164c13d73f67fdddba28e6409d76b4903e8ffab3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 17 14:16:38 2014 -0400
+
+    Another try to fix Mongolian free variation selectors
+
+    This reverts bf029281 and fixes it properly.  That commit
+    was not enough as it was only inheriting the shaping_action
+    for prev_action, but not curr_action.
+
+    Micro-test added.
+
+    https://code.google.com/p/chromium/issues/detail?id=393896
+
+ src/hb-ot-shape-complex-arabic.cc                  |  24
+ +++++++++++++++------
+ src/hb-unicode-private.hh                          |   3 ++-
+ test/shaping/fonts/sha1sum/MANIFEST                |   1 +
+ .../ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf   | Bin 0 -> 2748 bytes
+ .../tests/mongolian-variation-selector.tests       |   1 +
+ 5 files changed, 22 insertions(+), 7 deletions(-)
+
+commit 5209c505061130854a2bfea8849928ade3ee92f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 17 12:23:44 2014 -0400
+
+    Revert "Show U+FFFD REPLACEMENT CHARACTER for invalid Unicode
+    codepoints"
+
+    We now handle U+FFFD replacement in hb_buffer_add_utf*().  Any other
+    manipulation can happen in user callbacks.  No need for this.
+
+    https://github.com/behdad/harfbuzz/commit/efe74214bbb68eaa3d7621e73869b5d58210107e#commitcomment-7039404
+
+    This reverts commit efe74214bbb68eaa3d7621e73869b5d58210107e.
+
+    Conflicts:
+            src/hb-ot-shape-normalize.cc
+
+ src/hb-ot-shape-normalize.cc | 7 -------
+ 1 file changed, 7 deletions(-)
+
+commit 9e7c720100e432b43564ed5ff12f3175ca2ed74a
+Author: Dominik Röttsches <dominik.rottsches@intel.com>
+Date:   Thu Jul 17 14:40:34 2014 +0300
+
+    Fix CoreText build after a8b89a09f6d3a34
+
+ src/hb-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit a4d643755a531c82ab91e1e43d6bb0b7bd46453a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 16 20:15:45 2014 -0400
+
+    Minor
+
+ src/hb-utf-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a18897f87ce2c6048c3a0339074924b2232e2b95
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 16 16:02:15 2014 -0400
+
+    0.9.31
+
+ NEWS         | 29 +++++++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 30 insertions(+), 1 deletion(-)
+
+commit 976c8f455221eb599d1c446eafd88d51d7d2aa65
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 16 15:34:20 2014 -0400
+
+    New API: hb_buffer_[sg]et_replacement_codepoint()
+
+    With this change, we now by default replace broken UTF-8/16/32 bits
+    with U+FFFD.  This can be changed by calling new API on the buffer.
+    Previously the replacement value used to be (hb_codepoint_t)-1.
+
+    Note that hb_buffer_clear_contents() does NOT reset the replacement
+    character.
+
+    See discussion here:
+
+    https://github.com/behdad/harfbuzz/commit/6f13b6d62daae4989e3cc2fe4b168e5c59650964
+
+    New API:
+
+      hb_buffer_set_replacement_codepoint()
+      hb_buffer_get_replacement_codepoint()
+
+ src/hb-buffer-private.hh |  1 +
+ src/hb-buffer.cc         | 45
+ ++++++++++++++++++++++++++++++++++++++++++---
+ src/hb-buffer.h          | 15 ++++++++++++++-
+ src/hb-utf-private.hh    | 34 ++++++++++++++++++++--------------
+ test/api/test-buffer.c   | 26 +++++++++++++++-----------
+ 5 files changed, 92 insertions(+), 29 deletions(-)
+
+commit bcba8b45024e1eca8be77ca2657de1dc44dbf8fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 16 14:59:04 2014 -0400
+
+    New API hb_buffer_add_codepoints()
+
+    Like hb_buffer_add_utf32, but doesn't do any Unicode validation.
+    This is like what hb_buffer_add_utf32 used to be until a couple
+    commits ago.
+
+ src/hb-buffer.cc | 32 +++++++++++++++++++++++++++-----
+ src/hb-buffer.h  |  8 ++++++++
+ 2 files changed, 35 insertions(+), 5 deletions(-)
+
+commit 625dbf141a05f1ae81a7b8cbc529996370101284
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 16 14:49:55 2014 -0400
+
+    [buffer] Templatize UTF-* functions
+
+ src/hb-buffer.cc      |  10 +-
+ src/hb-utf-private.hh | 307
+ ++++++++++++++++++++++++++------------------------
+ 2 files changed, 166 insertions(+), 151 deletions(-)
+
+commit e634fed4285ce440d277345727ed01757df6d779
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 16 14:17:26 2014 -0400
+
+    [buffer] Validate UTF-32 input
+
+    Same as what we do for UTF-8 and UTF-16.
+
+ src/hb-utf-private.hh  | 13 +++++++++---
+ test/api/test-buffer.c | 55
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 65 insertions(+), 3 deletions(-)
+
+commit b98c5db32d15fcfb27ce2f6737203ce1ad124319
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 16 13:44:01 2014 -0400
+
+    Minor refactoring
+
+ src/hb-ot-layout-gsubgpos-private.hh | 25 ++++++-------------------
+ 1 file changed, 6 insertions(+), 19 deletions(-)
+
+commit 844f1a487d9c39724ebff20e89f6184c9a59be0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 16 13:32:51 2014 -0400
+
+    [tests] Add record-test.sh
+
+ test/shaping/Makefile.am    |  1 +
+ test/shaping/record-test.sh | 49
+ +++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 50 insertions(+)
+
+commit 3b861421a772f52eb232ff93bd74b5a8214801ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 16 13:22:05 2014 -0400
+
+    Fix Mongolian Variation Selectors for fonts without GDEF
+
+    Originally we fixed those in 79d1007a501fd63c0ba4d51038c513e6b8b94740.
+    However, fonts like MongolianWhite don't have GDEF, but have
+    IgnoreMarks
+    in their LigatureSubstitute init/etc features.  We were synthesizing a
+    GDEF class of mark for Mongolian Variation Selectors and as such the
+    ligature lookups where not matching.  Uniscribe doesn't do that.
+
+    I tried with more sophisticated fixes, like, if there is no GDEF and
+    a lookup-flag mismatch happens, instead of rejecting a match, try
+    skipping that glyph.  That surely produces some interesting behavior,
+    but since we don't want to support fonts missing GDEF more than
+    we have
+    to, I went for this simpler fix which is to always mark
+    default-ignorables as base when synthesizing GDEF.
+
+    Micro-test added.
+
+    Fixes rest of https://bugs.freedesktop.org/show_bug.cgi?id=65258
+
+ src/hb-ot-shape.cc                                       |  13
+ +++++++++++--
+ .../sha1sum/37033cc5cf37bb223d7355153016b6ccece93b28.ttf | Bin 0 ->
+ 2780 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                      |   1 +
+ test/shaping/tests/MANIFEST                              |   1 +
+ test/shaping/tests/mongolian-variation-selector.tests    |   1 +
+ 5 files changed, 14 insertions(+), 2 deletions(-)
+
+commit 878a25375b2fdf64cf0cc30c23fca9fcd58548e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 16 13:21:26 2014 -0400
+
+    Minor
+
+ src/hb-ot-shape.cc        | 1 +
+ src/hb-unicode-private.hh | 6 +++---
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit ec181e50140fc65b32d6080e2f7f73bbe0269ba9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 16 13:10:03 2014 -0400
+
+    Minor moving around
+
+ src/hb-ot-shape.cc | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit e7ce50d9eb6e3678f731b10dfeb308ffc478af8d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 16 12:30:39 2014 -0400
+
+    [indic] Fix access past end of array
+
+ src/hb-ot-shape-complex-indic.cc | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 73e23b0acfd2948d500321769035c56c9e072d77
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 15 18:43:49 2014 -0400
+
+    Whitespace
+
+ src/hb-ot-layout-gsubgpos-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit f27be105afb86b337c7d940badc5a6462f0b58bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 11 18:15:34 2014 -0400
+
+    [Android.mk] Actually remove static library
+
+ Android.mk | 26 --------------------------
+ 1 file changed, 26 deletions(-)
+
+commit 96b80e9bcc4796eedac09d284dc8cc0439ced6ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 11 17:00:12 2014 -0400
+
+    [Android.mk] Remove static library, add note re how to build
+
+ Android.mk | 41 +++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 37 insertions(+), 4 deletions(-)
+
+commit b7bc0b671d2d568cb64b647dad2ca866a4e0183b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 11 16:20:28 2014 -0400
+
+    Simplify / speed up UTF-8 code
+
+ src/hb-utf-private.hh | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+commit af2490c0959daa0fe7f32a8b3b3a3699c7fc5f48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 11 16:10:58 2014 -0400
+
+    Only accept well-formed UTF-8 sequences
+
+    Enable tests that were disabled before, and adjust one test,
+    and add more tests.
+
+ src/hb-utf-private.hh  | 93
+ +++++++++++++++++++++++++++++++++-----------------
+ test/api/test-buffer.c |  9 +++--
+ 2 files changed, 68 insertions(+), 34 deletions(-)
+
+commit 7323d385cc758c06671cb38239d240eb517b28bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 11 15:10:05 2014 -0400
+
+    Simplify hb_utf_prev<16> to call hb_utf_next<16>
+
+ src/hb-utf-private.hh | 23 ++++++++---------------
+ 1 file changed, 8 insertions(+), 15 deletions(-)
+
+commit c09a607a842fdd7b33e2c57e8af96d21ff091acd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 11 15:05:36 2014 -0400
+
+    Use hb_in_range() for arabic and indic tables
+
+    Though, looks like gcc was smart enough to produce the same code
+    before...
+
+ src/gen-arabic-table.py                 |  18 +-
+ src/gen-indic-table.py                  |  10 +-
+ src/hb-ot-shape-complex-arabic-table.hh | 420
+ ++++++++++++++++----------------
+ src/hb-ot-shape-complex-indic-table.cc  |  88 +++----
+ 4 files changed, 268 insertions(+), 268 deletions(-)
+
+commit 7627100f428ac0ec8509d961d368d2d25d8f0b6e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 11 14:54:42 2014 -0400
+
+    Mark unsigned integer literals with the u suffix
+
+    Simplifies hb_in_range() calls as the type can be inferred.
+    The rest is obsessiveness, I admit.
+
+ src/hb-buffer-serialize.cc                 |   2 +-
+ src/hb-common.cc                           |   4 +-
+ src/hb-coretext.cc                         |  16 +--
+ src/hb-open-file-private.hh                |   4 +-
+ src/hb-open-type-private.hh                |   2 +-
+ src/hb-ot-cmap-table.hh                    |   4 +-
+ src/hb-ot-head-table.hh                    |   6 +-
+ src/hb-ot-hhea-table.hh                    |   2 +-
+ src/hb-ot-layout-common-private.hh         |  14 +--
+ src/hb-ot-layout-gdef-table.hh             |   8 +-
+ src/hb-ot-layout-gpos-table.hh             |  24 ++--
+ src/hb-ot-layout-gsub-table.hh             |   6 +-
+ src/hb-ot-layout-gsubgpos-private.hh       |   2 +-
+ src/hb-ot-layout-jstf-table.hh             |   2 +-
+ src/hb-ot-layout-private.hh                |   4 +-
+ src/hb-ot-layout.h                         |   6 +-
+ src/hb-ot-map-private.hh                   |   8 +-
+ src/hb-ot-maxp-table.hh                    |   4 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh |   2 +-
+ src/hb-ot-shape-complex-hangul.cc          |  36 +++---
+ src/hb-ot-shape-complex-hebrew.cc          | 134 ++++++++++-----------
+ src/hb-ot-shape-complex-indic.cc           | 182
+ ++++++++++++++---------------
+ src/hb-ot-shape-complex-myanmar.cc         |  56 ++++-----
+ src/hb-ot-shape-complex-sea.cc             |   8 +-
+ src/hb-ot-shape-complex-thai.cc            |  84 ++++++-------
+ src/hb-ot-shape-fallback.cc                |  40 +++----
+ src/hb-ot-shape-normalize.cc               |   2 +-
+ src/hb-ot-shape.cc                         |   6 +-
+ src/hb-ot-tag.cc                           |  18 +--
+ src/hb-unicode-private.hh                  |  40 +++----
+ src/hb-uniscribe.cc                        |  14 +--
+ src/hb-utf-private.hh                      |  16 +--
+ 32 files changed, 378 insertions(+), 378 deletions(-)
+
+commit a8b89a09f6d3a3466282aae07fd65e143f9f8f83
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 11 14:18:01 2014 -0400
+
+    Simplify hb_in_range()
+
+    It's both faster and produces smaller code.  Now I feel stupid for
+    not writing it this way before.
+
+ src/hb-private.hh | 16 ++++++----------
+ 1 file changed, 6 insertions(+), 10 deletions(-)
+
+commit db8934faa1854dafaf4c4ce34d1818e12f67ef52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 11 13:58:36 2014 -0400
+
+    Simplify hb_utf_prev<8> to call hb_utf_next<8>
+
+ src/hb-utf-private.hh | 24 ++++--------------------
+ 1 file changed, 4 insertions(+), 20 deletions(-)
+
+commit efe74214bbb68eaa3d7621e73869b5d58210107e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 11 11:59:48 2014 -0400
+
+    Show U+FFFD REPLACEMENT CHARACTER for invalid Unicode codepoints
+
+    Only if the font doesn't support it.  Ie, this gives the user to
+    use non-Unicode codepoints as private values and return a meaningful
+    glyph for them.  But if it's invalid and font callback doesn't
+    like it, and if font has U+FFFD, show that instead.
+
+    Font functions that do not want this automatic replacement to
+    happen should return true from get_glyph() if unicode > 0x10FFFF.
+
+    Replaces https://github.com/behdad/harfbuzz/pull/27
+
+ src/hb-ot-shape-normalize.cc | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 6f13b6d62daae4989e3cc2fe4b168e5c59650964
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 10 19:31:40 2014 -0400
+
+    When parsing UTF-16, generate invalid codepoint for lonely low
+    surrogate
+
+    Test passes now.
+
+ src/hb-utf-private.hh | 42 ++++++++++++++++++++++++++++--------------
+ 1 file changed, 28 insertions(+), 14 deletions(-)
+
+commit 24b2ba9dfa7c35769cd843a07079ef88fa594bf8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 10 19:31:16 2014 -0400
+
+    [test-buffer] Add test for lonely low-surrogate
+
+    Currenty fails.  Ouch!
+
+ test/api/test-buffer.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 6334495ac1ee0a86228e67794b7a41ee91146f3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 10 19:22:07 2014 -0400
+
+    Use zh-Hans / zh-Hant when converting OT language tag to hb_language_t
+
+ src/hb-ot-tag.cc       | 15 +++------------
+ test/api/test-ot-tag.c |  6 +++---
+ 2 files changed, 6 insertions(+), 15 deletions(-)
+
+commit f381e320df795a9d73ac81499f8ed8c311bcb2f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 10 19:20:35 2014 -0400
+
+    Fix lang matching logic
+
+    Previous code was broken logically, but harmless.
+
+ src/hb-ot-tag.cc       | 2 +-
+ test/api/test-ot-tag.c | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit ee5350d667f3a9644667202597694581f2cf657d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 10 19:06:45 2014 -0400
+
+    Accept BCP 47 zh-Hans / zh-Hant language tags
+
+ src/hb-ot-tag.cc       | 27 ++++++++++++++++++---------
+ test/api/test-ot-tag.c |  3 +++
+ 2 files changed, 21 insertions(+), 9 deletions(-)
+
+commit 431540286794e023ec5eafd5eeedc008d4f31b4c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 10 17:37:26 2014 -0400
+
+    [Android.mk] Add note re static library
+
+ Android.mk | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 5b4131eb1c670c20fd9a45a5617c64060a505ef5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 9 19:09:08 2014 -0400
+
+    [Android.mk] Update for new ICU
+
+    https://android-review.googlesource.com/#/c/100722/1/Android.mk
+
+ Android.mk | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ab28196c9557a63971a56915aa6f98bb5803bd1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 9 18:18:06 2014 -0400
+
+    [Android.mk] Re-enable ICU unicode funcs
+
+ Android.mk | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit ea001374b86c4f1b24246c08a3d66d2a0e95a827
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 9 17:28:43 2014 -0400
+
+    0.9.30
+
+ NEWS         | 17 +++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 18 insertions(+), 1 deletion(-)
+
+commit 8b16ff12590200afb08e8821e3f14d2fdf8efbda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 9 17:40:52 2014 -0400
+
+    [uniscribe] Fix build after recent changes to Offset
+
+ src/hb-ot-name-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 73f7f8919ea1f09b8c5b29f231ac84105cde2145
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 9 17:17:18 2014 -0400
+
+    Define _POSIX_C_SOURCE only if it is not defined
+
+    Fixes https://github.com/behdad/harfbuzz/pull/45
+
+ src/hb-blob.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 6bd5646f1b865a76304a67e03a6161afcfef293f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 9 17:07:06 2014 -0400
+
+    [tests] Remove bash'ish
+
+    Apparently on travis-ci, bash is linked to dash, which doesn't
+    understand "let".  Failing tests were not being noticed.  See eg:
+
+      https://travis-ci.org/behdad/harfbuzz/jobs/29544211
+
+    Don't rely on bash.
+
+ test/shaping/run-tests.sh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0afedaa96c81b63774a4a0ef9b4cb4995d24ec9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 9 17:00:48 2014 -0400
+
+    [util/hb-shape] Fix crash; oops
+
+ util/hb-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0cd94491b99aed438ad79a55cdfced8d1b657179
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 9 16:51:38 2014 -0400
+
+    [ucdn] Update to Unicode 7.0.0 data
+
+    From http://github.com/behdad/ucdn
+
+ src/hb-ucdn.cc               |   23 +
+ src/hb-ucdn/README           |    1 +
+ src/hb-ucdn/ucdn.c           |    2 +-
+ src/hb-ucdn/ucdn.h           |   27 +
+ src/hb-ucdn/unicodedata_db.h | 3711
+ ++++++++++++++++++++++--------------------
+ 5 files changed, 2039 insertions(+), 1725 deletions(-)
+
+commit 9d4ede3a97fff544a5ec2a671e49a92a79645b61
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 9 16:19:55 2014 -0400
+
+    [Android.mk] Update source list
+
+ Android.mk | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 7e1ab1f6d812a55f75d4844f7981d5604481049c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 9 16:13:40 2014 -0400
+
+    [Android.mk] Whitespace
+
+ Android.mk | 26 ++++++--------------------
+ 1 file changed, 6 insertions(+), 20 deletions(-)
+
+commit 5c6695c42470e0a15e9029ebe8ecbebf3fa4f95b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 9 16:07:12 2014 -0400
+
+    [Android.mk] Remove -lpthread; we build with -DHB_NO_MT
+
+ Android.mk | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 9109f1e944dd4bd4ae8057b75c8a31e9d31797aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 8 20:02:29 2014 -0400
+
+    [util/hb-shape] Accept an empty output-format that would skip output
+
+    Useful for benchmarking, to avoid buffer serialization overhead (which
+    seems to by far dominate shaping!)
+
+ util/hb-shape.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 8656408572c2685f278a3b742ee69c767c29788c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 8 18:10:20 2014 -0400
+
+    [util] Fix hb-view rendering with --font-funcs=ot
+
+ util/helper-cairo.cc | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+commit 8650def73500204b79c651f58b1be3f94a41973d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 5 15:50:18 2014 -0400
+
+    [util] Add option to set font function implementation to use
+
+    Supports ft and ot right now.  hb-view currently not rendering
+    with ot.
+    Will fix after some clean up.
+
+ util/options.cc | 76
+ ++++++++++++++++++++++++++++++++++++++++++++++++++-------
+ util/options.hh | 21 ++++++++++++++++
+ 2 files changed, 88 insertions(+), 9 deletions(-)
+
+commit 2306ad46dce1c53b0b1bfabdc04d70e3b99eabb7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 4 18:09:29 2014 -0400
+
+    [util] Fix memory issue
+
+ util/options.cc | 6 ++----
+ util/options.hh | 9 +++++++++
+ 2 files changed, 11 insertions(+), 4 deletions(-)
+
+commit 14a4a9d649798d32c31f79b4045a885626dffc7f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 1 15:51:54 2014 -0400
+
+    Add Roozbeh to AUTHORS
+
+    He's been my shadow for all Indic-related changes in the last
+    few months.
+
+ AUTHORS | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 68f724484b1663255ee249481624e552d2e2313f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 30 15:46:53 2014 -0400
+
+    [indic] Remove some more now-unused special-cases
+
+ src/hb-ot-shape-complex-indic.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit e79c9489802f99dc7eb8b4c2765c4c71b5f80e60
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 30 15:39:39 2014 -0400
+
+    [indic] Remove special-casing of U+1CF2,1CF3
+
+    These were introduced in a498565cedf0441ae723c5e5969f637d792a15e7,
+    but IndicSyllabicCategory has had the correct value already, so the
+    special code was never needed.
+
+ src/hb-ot-shape-complex-indic.cc | 6 ------
+ 1 file changed, 6 deletions(-)
+
+commit d743ce78e10758b7dbaf0cfd191309e5ef646881
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 30 15:24:02 2014 -0400
+
+    [indic-table] Update to Unicode 7.0 data
+
+    Touch code just enough to preserve previous syllable structure
+    and functionality as closely as possible.  Many further cleanups
+    coming later.
+
+ src/gen-indic-table.py                   |   4 +
+ src/hb-ot-shape-complex-indic-private.hh |  23 +-
+ src/hb-ot-shape-complex-indic-table.cc   | 468
+ ++++++++++++++++++++++---------
+ src/hb-ot-shape-complex-indic.cc         |  21 --
+ src/hb-ot-shape-complex-myanmar.cc       |   2 -
+ 5 files changed, 355 insertions(+), 163 deletions(-)
+
+commit 5fa21b3ab7175f55f89cb194b544d5d4bd06a481
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 30 14:30:54 2014 -0400
+
+    [indic-table] Fix category frequency counts in comments
+
+ src/gen-indic-table.py                 |  2 +-
+ src/hb-ot-shape-complex-indic-table.cc | 46
+ +++++++++++++++++-----------------
+ 2 files changed, 24 insertions(+), 24 deletions(-)
+
+commit 5c4e3e9a57b6b735e7d72cbd5f4070cf024d7015
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 30 14:25:18 2014 -0400
+
+    Whitespace
+
+ src/hb-ot-shape-complex-indic-private.hh | 76
+ ++++++++++++++++----------------
+ 1 file changed, 38 insertions(+), 38 deletions(-)
+
+commit af528b6674bccac3efd13f8b33fcdc6aeb178f4c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 27 18:07:00 2014 -0400
+
+    Fix typo; ouch!
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7d4ada66c96a748ce92f8e8edac149361c3dc829
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 27 17:30:59 2014 -0400
+
+    Mark unsed members with a "Z" suffix
+
+    There may be more.  There are members that are by definition
+    redundant or reserved and not needed, NOT what we *currently*
+    don't use.
+
+    I'm sure there's more...
+
+ src/hb-open-file-private.hh        |  6 +++---
+ src/hb-ot-cmap-table.hh            | 24 ++++++++++++------------
+ src/hb-ot-layout-common-private.hh |  2 +-
+ 3 files changed, 16 insertions(+), 16 deletions(-)
+
+commit 23afcff1d14e57f5ce30a4100698d4f2dc530958
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 27 17:22:36 2014 -0400
+
+    [ot-font] Implement Unicode variation selectors
+
+ src/hb-ot-font.cc | 20 +++++++++++++++++++-
+ 1 file changed, 19 insertions(+), 1 deletion(-)
+
+commit a5a4736916b6035e6413d4619f9e7287e683d51b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 27 17:03:22 2014 -0400
+
+    [cmap] Implement subtable format 14
+
+ src/hb-ot-cmap-table.hh | 147
+ +++++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 133 insertions(+), 14 deletions(-)
+
+commit 586b60622c33878f9ca4826b4ef07369d32bf039
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 27 15:39:47 2014 -0400
+
+    Minor: final bits of cleanup
+
+ src/hb-open-type-private.hh        | 1 +
+ src/hb-ot-layout-common-private.hh | 4 ++--
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 51d9ba09bc78188ec87218aef5232e80568c1712
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 27 15:27:15 2014 -0400
+
+    Minor
+
+ src/hb-open-type-private.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 3084767e92483c669f38319f153c498e9a6b92c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 27 15:24:35 2014 -0400
+
+    Minor: Remove LongArrayOf
+
+ src/hb-open-file-private.hh | 2 +-
+ src/hb-open-type-private.hh | 4 ----
+ 2 files changed, 1 insertion(+), 5 deletions(-)
+
+commit 41ea59495032e712fa6f801350ee00d5f00b5724
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 27 15:23:18 2014 -0400
+
+    Minor: Remove LongSortedArrayOf
+
+ src/hb-open-type-private.hh | 4 ----
+ src/hb-ot-cmap-table.hh     | 2 +-
+ 2 files changed, 1 insertion(+), 5 deletions(-)
+
+commit bb6ecf2ce5c2679c298741af17836a22e1d68121
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 27 15:13:44 2014 -0400
+
+    Minor: Remove LongOffsetArrayOf and LongOffsetLongArrayOf
+
+ src/hb-open-file-private.hh    | 2 +-
+ src/hb-open-type-private.hh    | 8 --------
+ src/hb-ot-layout-gdef-table.hh | 2 +-
+ 3 files changed, 2 insertions(+), 10 deletions(-)
+
+commit 99d281712390fd54e523b2f0580d10445457ec2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 27 15:12:52 2014 -0400
+
+    Minor: Remove GenericOffset
+
+ src/hb-open-type-private.hh        | 13 +++++--------
+ src/hb-ot-layout-common-private.hh |  8 ++++----
+ 2 files changed, 9 insertions(+), 12 deletions(-)
+
+commit 9da552dcc5b89b3bbbe5a55fb7c543222382e12a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 27 15:09:42 2014 -0400
+
+    Minor: Remove some GenericXXX templates
+
+ src/hb-open-type-private.hh        | 32 +++++++++++---------------------
+ src/hb-ot-cmap-table.hh            |  4 ++--
+ src/hb-ot-layout-common-private.hh |  2 +-
+ 3 files changed, 14 insertions(+), 24 deletions(-)
+
+commit 36073ede5b52bd1231622cbacd1bee6b82696d81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 27 14:48:54 2014 -0400
+
+    Minor: Reorder template parameter order
+
+ src/hb-open-type-private.hh | 14 +++++++-------
+ src/hb-ot-cmap-table.hh     |  2 +-
+ 2 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 0394ec1bfbd7806cbe9fc809b34f96f8d12ffbf2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 27 14:40:35 2014 -0400
+
+    Minor: Introduce GenericOffset
+
+ src/hb-open-type-private.hh | 16 ++++++----------
+ 1 file changed, 6 insertions(+), 10 deletions(-)
+
+commit 0d1b3419a7bbfd18ab8fed1abd3a41dec11e8d97
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 26 19:13:34 2014 -0400
+
+    Minor: Use template parameter default values for OffsetTo
+
+ src/hb-open-type-private.hh | 13 +++++--------
+ 1 file changed, 5 insertions(+), 8 deletions(-)
+
+commit 546b1adcdce2d3592843938b0b81ff32e67b0b83
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 26 19:10:21 2014 -0400
+
+    Minor: Use template parameter default values for hb_prealloced_array_t
+
+ src/hb-private.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 911ca38645bd51764e7859bc482319e8f6d2f710
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 24 10:20:36 2014 -0600
+
+    Add back API removed recently
+
+    Add hb_ot_layout_language_get_required_feature_index() again, which
+    is used in Pango.  This was removed in
+    da132937989acb4d8ca9bd41c79f98750e7dda30 in favor of
+    hb_ot_layout_language_get_required_feature().
+
+    API changes:
+
+      - Added hb_ot_layout_language_get_required_feature_index back.
+
+ src/hb-ot-layout.cc | 15 +++++++++++++++
+ src/hb-ot-layout.h  |  7 +++++++
+ 2 files changed, 22 insertions(+)
+
+commit 89e4946929a8cd2359c7d76fa9272d5604243002
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 22 11:32:13 2014 -0600
+
+    Add new IndicSyllabicCategory short forms for Unicode 7.0
+
+ src/gen-indic-table.py | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit dcee838e89c2863c2fda4e8f098e720637e02335
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 22 11:29:59 2014 -0600
+
+    Minor
+
+ src/gen-arabic-table.py | 2 +-
+ src/gen-indic-table.py  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit f2ad86e6053fa87ab188c36edc3d98c92324c049
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 21 15:31:10 2014 -0600
+
+    [indic-table-gen] Minor
+
+ src/gen-indic-table.py | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 2ec62279aab8c2263f17ffbc7c6f74304674f9a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 21 15:25:59 2014 -0600
+
+    [indic-table] Update to Unicode 6.3.0
+
+    Was from 6.2.0.  It's a no-op.  Committing for the record.
+
+ src/hb-ot-shape-complex-indic-table.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 5d4d7384efa97a30893ad28b9ad9a994722de12c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 21 14:53:21 2014 -0600
+
+    Minor: format
+
+ src/hb-ot-shape-complex-arabic.cc | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit 44243ae5902cc420e6bf6ec2fca2584ba93ff2fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 21 14:19:34 2014 -0600
+
+    [arabic-table] Update to Unicode 7.0
+
+    Old table was from 6.2.  Remove hard-coded Mongolian and Phags-pa
+    data.
+    This completes support for new scripts Manichian and Psaltar Pahlavi.
+
+ src/hb-ot-shape-complex-arabic-table.hh | 72
+ ++++++++++++++++++++++++++++-----
+ src/hb-ot-shape-complex-arabic.cc       | 22 ----------
+ 2 files changed, 63 insertions(+), 31 deletions(-)
+
+commit cd86ab9b4f4d7bd4f563be64a83714fc8fb395d7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 21 14:10:38 2014 -0600
+
+    [arabic-table] Add ZWJ/ZWNJ now that table is segmented
+
+ src/gen-arabic-table.py                 |  2 --
+ src/hb-ot-shape-complex-arabic-table.hh | 12 +++++++++++-
+ src/hb-ot-shape-complex-arabic.cc       |  5 -----
+ 3 files changed, 11 insertions(+), 8 deletions(-)
+
+commit 2390d9b67e1dfeccd3f0850d1304c52b54817ca0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 21 14:07:00 2014 -0600
+
+    [arabic-table] Further tune
+
+    In anticipation of Unicode 7.0 data coming in the next commit.
+
+ src/gen-arabic-table.py                 | 10 ++++++---
+ src/hb-ot-shape-complex-arabic-table.hh | 38
+ +++++++++++++++------------------
+ 2 files changed, 24 insertions(+), 24 deletions(-)
+
+commit a133e6067aaebc494c0156b5fac7f4a879e12dbe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 20 18:01:34 2014 -0400
+
+    [indic-table] Minor
+
+ src/gen-indic-table.py | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit b900fa2c8cc088dbcbdbf90bfdf8764f9ee1c96a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 20 17:59:43 2014 -0400
+
+    [arabic-table] Use segmented table
+
+    No functional change.
+
+ src/gen-arabic-table.py                 | 82
+ +++++++++++++++++++++++----------
+ src/hb-ot-shape-complex-arabic-table.hh | 53 ++++++++++++++-------
+ src/hb-ot-shape-complex-arabic.cc       |  8 ++--
+ 3 files changed, 97 insertions(+), 46 deletions(-)
+
+commit c2e113404640bf9b8bac469d0803ac946e77964f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 20 17:57:03 2014 -0400
+
+    [indic-table] Make output stable
+
+ src/gen-indic-table.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 55abfbd2ac1626af16151298a0837b837d0796df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 20 16:47:43 2014 -0400
+
+    [indic-table] Minor
+
+    No output change.
+
+ src/gen-indic-table.py | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit f88670749006991282bcc4e8b6218487295ca670
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 20 16:30:10 2014 -0400
+
+    [arabic-table] Don't write comments
+
+    No functional change.
+
+ src/gen-arabic-table.py                 |  20 +-
+ src/hb-ot-shape-complex-arabic-table.hh | 710
+ ++------------------------------
+ 2 files changed, 38 insertions(+), 692 deletions(-)
+
+commit 200dfe3eb10feda2ad25940338b08011f4757ca4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 20 16:20:59 2014 -0400
+
+    [arabic-table] Use short names for values
+
+    No functional change.
+
+ src/gen-arabic-table.py                 |   16 +-
+ src/hb-ot-shape-complex-arabic-table.hh | 1386
+ ++++++++++++++++---------------
+ 2 files changed, 716 insertions(+), 686 deletions(-)
+
+commit 3f5327a41efcf50f64d9498ef3dfd6875ef6a5ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 20 16:17:42 2014 -0400
+
+    [arabic-table] Read Blocks.txt and shuffle code around
+
+    No functional change.
+
+ src/Makefile.am                         |  2 +-
+ src/gen-arabic-table.py                 | 80
+ +++++++++++++++++++--------------
+ src/hb-ot-shape-complex-arabic-table.hh | 30 ++++++++-----
+ 3 files changed, 67 insertions(+), 45 deletions(-)
+
+commit 171f970e4f72d9fe1af30eab32b96906ee4a14f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 20 15:25:30 2014 -0400
+
+    [indic-table] Black-list Thai, Lao, and Tibetan
+
+    We don't need Indic table for those.
+
+ src/gen-indic-table.py                 |  3 ++
+ src/hb-ot-shape-complex-indic-table.cc | 94
+ +++++++---------------------------
+ 2 files changed, 21 insertions(+), 76 deletions(-)
+
+commit 65ac2dae4f284f563b2dc476a21e2b5a48124de8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 20 15:12:49 2014 -0400
+
+    [indic-table] Speed up lookup
+
+ src/gen-indic-table.py                 | 22 +++++++++---
+ src/hb-ot-shape-complex-indic-table.cc | 61
+ +++++++++++++++++++++++-----------
+ 2 files changed, 59 insertions(+), 24 deletions(-)
+
+commit 64442a3f4c5c7be08893454742cad6bfe73cb8d7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 20 14:58:53 2014 -0400
+
+    [indic-table] Fix compiler warning
+
+ src/gen-indic-table.py                 | 4 +---
+ src/hb-ot-shape-complex-indic-table.cc | 4 +---
+ 2 files changed, 2 insertions(+), 6 deletions(-)
+
+commit 0436e1d50527497ebe5053b51a34ce6590276249
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 20 14:56:22 2014 -0400
+
+    [indic-table] Make table more compact by not covering full blocks
+
+    -#define indic_offset_total 4416
+    +#define indic_offset_total 3816
+
+    -}; /* Table occupancy: 60% */
+    +}; /* Table occupancy: 69% */
+
+ src/gen-indic-table.py                 |  24 ++++--
+ src/hb-ot-shape-complex-indic-table.cc | 150
+ +++++++++------------------------
+ 2 files changed, 57 insertions(+), 117 deletions(-)
+
+commit 190a251479b3cfc68871ff1daf9a9d1abe3f86e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 20 14:41:39 2014 -0400
+
+    [indic-table] Remove block range from data table
+
+    No functional change.
+
+ src/gen-indic-table.py                 |   4 +-
+ src/hb-ot-shape-complex-indic-table.cc | 102
+ ++++++++++++++++-----------------
+ 2 files changed, 54 insertions(+), 52 deletions(-)
+
+commit 2b051c6057920c564c13c5d6a3e6dca93446fa12
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 20 14:09:57 2014 -0400
+
+    Rename HB_VERSION_CHECK and hb_version_check to "atleast"
+
+    HB_VERSION_CHECK's comparison was originally written wrongly
+    by mistake.  When API tests were written, they were also written
+    wrongly to pass given the wrong implementation... Sigh.
+
+    Given the purpose of this API, there's no point in fixing it
+    without renaming it.  As such, rename.
+
+    API changes:
+
+      HB_VERSION_CHECK -> HB_VERSION_ATLEAST
+      hb_version_check -> hb_version_atleast
+
+ docs/reference/harfbuzz-sections.txt |  4 ++--
+ src/hb-common.cc                     | 10 +++++-----
+ src/hb-version.h.in                  | 10 +++++-----
+ test/api/test-version.c              | 29 +++++++++++++++--------------
+ 4 files changed, 27 insertions(+), 26 deletions(-)
+
+commit cabfa538ed4b1355326fa8de05f7209dda1c1c7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 20 13:51:21 2014 -0400
+
+    Adjust unused doc symbols
+
+ docs/reference/harfbuzz-sections.txt | 19 +++++++++++++++++--
+ src/hb-ot-shape.h                    | 21 ++++++++++-----------
+ 2 files changed, 27 insertions(+), 13 deletions(-)
+
+commit da132937989acb4d8ca9bd41c79f98750e7dda30
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Sun Apr 27 14:05:24 2014 +0100
+
+    Rework handling of requiredFeature to solve problem with rlig in
+    arial.ttf from winxp
+
+    https://bugzilla.mozilla.org/show_bug.cgi?id=986802
+    Fixes https://github.com/behdad/harfbuzz/pull/39
+
+    API Change:
+
+    -hb_ot_layout_language_get_required_feature_index
+    +hb_ot_layout_language_get_required_feature
+
+    New API takes an extra pointer argument.  Pass NULL in to get
+    behavior of previous API.
+
+    Reworked by behdad
+
+ src/hb-ot-layout-gsubgpos-private.hh |  4 +--
+ src/hb-ot-layout.cc                  | 29 ++++++++++++---------
+ src/hb-ot-layout.h                   | 11 ++++----
+ src/hb-ot-map.cc                     | 50
+ ++++++++++++++++++++++++++----------
+ src/main.cc                          |  4 +--
+ 5 files changed, 64 insertions(+), 34 deletions(-)
+
+commit df554af99db390e42d378983bb3fcf583477a1d7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 19 15:39:18 2014 -0400
+
+    Rename search() to bsearch() and lsearch()
+
+    Such that the complexity of the algorithm used is clear at
+    call site.
+
+ src/hb-open-type-private.hh        |  4 ++--
+ src/hb-ot-cmap-table.hh            | 14 +++++++-------
+ src/hb-ot-layout-common-private.hh |  9 +++++----
+ 3 files changed, 14 insertions(+), 13 deletions(-)
+
+commit fb8cc86ff99c08064ac58a559bb66cc340693b92
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 19 15:30:18 2014 -0400
+
+    Rename sort() to qsort()
+
+    In an effort to make the algorithm used clear.
+
+ src/hb-coretext.cc  | 4 ++--
+ src/hb-ot-map.cc    | 4 ++--
+ src/hb-private.hh   | 8 ++++----
+ src/hb-uniscribe.cc | 4 ++--
+ 4 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 577ca4814314c374824cac736996b9cdd4f9d11f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 18 12:29:23 2014 -0400
+
+    [unicode7] Update list of Default_Ignorable codepoints
+
+ src/hb-unicode-private.hh | 66
+ +++++++++++++++++++++--------------------------
+ 1 file changed, 30 insertions(+), 36 deletions(-)
+
+commit 7cfee3827636f0dff7df5c8975a4fadd1b4bfbd5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 28 15:09:30 2014 -0700
+
+    [unicode7] Route Manichaean and Psalter Pahlavi through Arabic shaper
+
+    Still needs update to joining table to fully work.
+
+ src/hb-ot-shape-complex-private.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit a4a7899cd93fb9d1bc2163a4bbabfa733ee5bd52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 28 15:06:42 2014 -0700
+
+    [unicode7] Mark right-to-left scripts
+
+ src/hb-common.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 62587bfc5178a447ef66d88eab7412a7efe84692
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 28 15:07:21 2014 -0700
+
+    [unicode7] Declare Unicode 7 scripts
+
+ src/hb-common.h | 21 +++++++++------------
+ 1 file changed, 9 insertions(+), 12 deletions(-)
+
+commit dc61294aa93d36d0c5d187d4a692560a7cb46444
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 28 14:58:28 2014 -0700
+
+    [unicode7] Add missing ISO 15924 tags
+
+ src/hb-common.h | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 7526373e70bc4c2e2072da36babf9399fcf483b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 17 11:45:26 2014 -0400
+
+    [coretext] Remove unused var
+
+ src/hb-coretext.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 798e4185bc71b1a63528e6b0af236d4c964ec607
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Tue Jun 10 13:10:30 2014 +0100
+
+    When zeroing mark widths for LTR, also adjust offset...
+
+    ...so that they overstrike preceding glyph.
+
+    https://github.com/behdad/harfbuzz/pull/43
+
+ src/hb-ot-shape.cc | 50
+ +++++++++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 39 insertions(+), 11 deletions(-)
+
+commit 80f7405a5208f88b8615aa4ce4c54ffeb16f04f8
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Tue Jun 10 13:10:02 2014 +0100
+
+    [Thai] set the correct general category on Nikhahit when decomposing
+    Sara-Am.
+
+ src/hb-ot-shape-complex-thai.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 1d634cbb4b0338e1c2841127a72c5fac3a2a5ca1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 6 17:55:02 2014 -0400
+
+    Fix base-position when 'pref' is NOT formed
+
+    If pre-base reordering Ra is NOT formed (or formed and then
+    broken up), we should consider that Ra as base.  This is
+    observable when there's a left matra or dotreph that positions
+    before base.
+
+    Now, it might be that we shouldn't do this if the Ra happend
+    to form a below form.  We can't quite deduce that right now...
+
+    Micro test added.  Also at:
+
+    https://code.google.com/a/google.com/p/noto-alpha/issues/detail?id=186#c29
+
+ src/hb-ot-shape-complex-indic.cc                   |  28
+ +++++++++++++++++++--
+ test/shaping/fonts/sha1sum/MANIFEST                |   5 ++++
+ .../e207635780b42f898d58654b65098763e340f5c7.ttf   | Bin 0 -> 3000 bytes
+ test/shaping/tests/indic-pref-blocking.tests       |   3 ++-
+ 4 files changed, 33 insertions(+), 3 deletions(-)
+
+commit 04dc52fa15f5b7f9eb5f448ea43e7ef1b2269e88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 6 17:28:38 2014 -0400
+
+    [indic] Recover OT_H undergone ligation and multiplication
+
+    Sometimes font designers form half/pref/etc consonant forms
+    unconditionally and then undo that conditionally.  Try to
+    recover the OT_H classification in those cases.
+
+    No test number changes expected.
+
+ src/hb-ot-layout-private.hh      |  8 ++++++++
+ src/hb-ot-shape-complex-indic.cc | 21 +++++++++++++++++++++
+ 2 files changed, 29 insertions(+)
+
+commit 39c8201f8e361e8c0f23f07bf20124ccadc6086c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 6 17:19:35 2014 -0400
+
+    [indic] Improve base re-finding
+
+    No test numbers change.
+
+ src/hb-ot-shape-complex-indic.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit c04d5f0dd24d0ed9560fb9aebb5561ce946743c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 6 17:02:39 2014 -0400
+
+    [indic] Minor
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 824d00dce483d0f4030c0cac253f994810e10f32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 9 14:17:33 2014 -0400
+
+    Fix commit 3f38c1137b6219a646da141b08463ffa922d4e35
+
+    Previous commit was not compiling with clang.
+
+ configure.ac | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3f38c1137b6219a646da141b08463ffa922d4e35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 6 16:03:40 2014 -0400
+
+    Don't use -mstructure-size-boundary=8 on clang arm
+
+    As in building for Android / iPhone.  Only set it if
+    struct{char} alignment is not 1.
+
+    NOT tested on an actual Arm architecture.  Guess we'll know
+    when this makes it to people's build bots.
+
+ configure.ac | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit 0ff74b09d2ccf7a9ea0f0b463d8b6d819c86c837
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 5 21:55:23 2014 -0400
+
+    Add missing test file.  Oops
+
+ test/shaping/tests/indic-pref-blocking.tests | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 832a6f99b34f334b1e82b8e3a7ad137e823d203c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 4 16:57:42 2014 -0400
+
+    [indic] Don't reorder reph/pref if ligature was expanded
+
+    Normally if you want to, say, conditionally prevent a 'pref', you
+    would use blocking contextual matching.  Some designers instead
+    form the 'pref' form, then undo it in context.  To detect that
+    we now also remember glyphs that went through MultipleSubst.
+
+    In the only place that this is used, Uniscribe seems to only care
+    about the "last" transformation between Ligature and Multiple
+    substitions.  Ie. if you ligate, expand, and ligate again, it
+    moves the pref, but if you ligate and expand it doesn't.  That's
+    why we clear the MULTIPLIED bit when setting LIGATED.
+
+    Micro-test added.  Test: U+0D2F,0D4D,0D30 with font from:
+
+    [1]
+    https://code.google.com/a/google.com/p/noto-alpha/issues/detail?id=186#c29
+
+ src/hb-ot-layout-gsub-table.hh                      |   2 +-
+ src/hb-ot-layout-gsubgpos-private.hh                |  20
+ ++++++++++++++++----
+ src/hb-ot-layout-private.hh                         |  16
+ +++++++++++++++-
+ src/hb-ot-shape-complex-indic.cc                    |   4 ++--
+ test/shaping/Makefile.am                            |   5 ++++-
+ .../226bc2deab3846f1a682085f70c67d0421014144.ttf    | Bin 0 -> 2828 bytes
+ test/shaping/tests/MANIFEST                         |   1 +
+ 7 files changed, 39 insertions(+), 9 deletions(-)
+
+commit b5be2317201774c84470167767ad83c8637cad5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 5 19:00:22 2014 -0400
+
+    [gsub] Adjust single-length ligature subst to act like single subst
+
+ src/hb-ot-layout-gsub-table.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit aae69451dfbf2e3671c555c234f788c194302818
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 5 18:54:44 2014 -0400
+
+    [gsub] Minor shuffling
+
+ src/hb-ot-layout-gsub-table.hh | 29 ++++++++++++++++-------------
+ 1 file changed, 16 insertions(+), 13 deletions(-)
+
+commit b6b304f12be917b7449b3ac9409069fcd4a27d95
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 5 17:12:54 2014 -0400
+
+    [ot] Add TODO re zero-len MultipleSubst sequences
+
+ src/hb-ot-layout-gsub-table.hh       | 9 +++++++++
+ src/hb-ot-layout-gsubgpos-private.hh | 4 +++-
+ 2 files changed, 12 insertions(+), 1 deletion(-)
+
+commit f1a72fe7bf863535ec09b559cc0bd878fd0799f2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 4 19:00:29 2014 -0400
+
+    [ot-font] Fix cmap EncodingRecord cmp order
+
+ src/hb-ot-cmap-table.hh | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit ce34f0b07e5324ed52e6e2c43000c2b09ee010d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 4 18:57:46 2014 -0400
+
+    [ot-font] Use binary search for format12 cmap subtable
+
+ src/hb-open-type-private.hh | 4 ++++
+ src/hb-ot-cmap-table.hh     | 2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 257d1adfa1b3422c511c55e641840a6e31ec6008
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 4 18:47:55 2014 -0400
+
+    [ot-font] Work around broken cmap subtable format 4 length
+
+    Roboto was hitting this.  FreeType also has pretty much the
+    same code for this, in ttcmap.c:tt_cmap4_validate():
+
+        /* in certain fonts, the `length' field is invalid and goes */
+        /* out of bound.  We try to correct this here...            */
+        if ( table + length > valid->limit )
+        {
+          if ( valid->level >= FT_VALIDATE_TIGHT )
+            FT_INVALID_TOO_SHORT;
+
+          length = (FT_UInt)( valid->limit - table );
+        }
+
+ src/hb-ot-cmap-table.hh | 22 ++++++++++++++++++----
+ 1 file changed, 18 insertions(+), 4 deletions(-)
+
+commit 51f563579b94e1ee23ced9bbcc7dd3341535ce72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 4 18:42:32 2014 -0400
+
+    Move try_set to sanitize context
+
+ src/hb-open-type-private.hh        | 22 ++++++++++------------
+ src/hb-ot-layout-common-private.hh |  2 +-
+ 2 files changed, 11 insertions(+), 13 deletions(-)
+
+commit 500737e8e16dce5248aff394899bb3761a9c3bbf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 4 18:17:29 2014 -0400
+
+    [ot-font] Don't select a Null cmap subtable
+
+    Can happen either in broken fonts, or as a result of sanitize().
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dac86026a6bae5a8a03cfe885bf93f32e5f48614
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 3 17:57:00 2014 -0400
+
+    Fix some cppcheck warnings
+
+    Bug 77800 - cppcheck reports
+
+ src/hb-common.cc                   | 4 +++-
+ src/hb-ot-layout-common-private.hh | 2 +-
+ src/hb-private.hh                  | 2 +-
+ src/hb-shape-plan.cc               | 4 ++--
+ 4 files changed, 7 insertions(+), 5 deletions(-)
+
+commit c306410cab368a27c1941a2625d3b475edeaac04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 3 16:59:41 2014 -0400
+
+    Bug 77732 - Fix unused typedef warning for ASSERT_STATIC with GCC 4.8
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ae2b854eab7f1c48e56751c987a714c2c18d6eb6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 3 16:59:09 2014 -0400
+
+    Move code around
+
+ src/hb-private.hh | 134
+ ++++++++++++++++++++++++++----------------------------
+ 1 file changed, 65 insertions(+), 69 deletions(-)
+
+commit 17c3b809f42aec34d83dba2e6229ad85804bebae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 2 15:08:18 2014 -0400
+
+    [indic] Treat U+A8E0..A8F1 as OT_A instead of OT_VD
+
+    Apparently they can intermix with other OT_A.
+
+    Test: U+0915,A8E2,1CD0
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6ae13f257c3986517c097fa666ab9f58bdc918b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 30 17:38:14 2014 -0400
+
+    [graphite2] Fix cluster mapping
+
+    Patch from Martin Hosken.  I expect this to fix the following bugs:
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=75076
+    https://bugzilla.gnome.org/show_bug.cgi?id=723582
+    https://bugzilla.redhat.com/show_bug.cgi?id=998812
+
+ src/hb-graphite2.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 5875ad9c467b39d00ad4d98fd425179c701e6fd0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 29 15:48:16 2014 -0400
+
+    0.9.29
+
+ NEWS         | 12 ++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit 7977ca17aac34b9ab10622928bed8afa2177f16a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 29 15:34:26 2014 -0400
+
+    [indic] Allow decimal and Brahmi digits as placeholders
+
+    Tests: U+0967,0951 U+0031,093F
+
+ src/hb-ot-shape-complex-indic.cc                                      |
+ 4 ++++
+ .../texts/in-tree/shaper-indic/indic/script-devanagari/misc/misc.txt  |
+ 2 ++
+ 2 files changed, 6 insertions(+)
+
+commit e8b5d64039614ecce472eda1a7a603736da25d86
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 29 15:18:27 2014 -0400
+
+    [indic] Do NOT allow reph formation on placeholders
+
+    Only allow it on DOTTED CIRCLE.  No effect on test numbers.
+
+    Test: U+0930,094D,00A0
+
+ src/hb-ot-shape-complex-indic-machine.rl                                |
+ 2 +-
+ .../in-tree/shaper-indic/indic/script-devanagari/misc/dottedcircle.txt  |
+ 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 52b562a6a058131c0103aaa5404d053e6465bb23
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 27 18:18:23 2014 -0400
+
+    [indic] Clean up a bit
+
+    No functional change intended.
+
+ src/hb-ot-shape-complex-indic.cc | 17 +++++------------
+ 1 file changed, 5 insertions(+), 12 deletions(-)
+
+commit 3bf652b90783e8244c153739585d95dc4162efb4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 27 18:07:26 2014 -0400
+
+    [indic] Treat U+002D and U+2010..2014 as placeholders
+
+ src/hb-ot-shape-complex-indic.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit e0de95f40244924cb8f9f7abca7f53117044a0eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 27 17:58:34 2014 -0400
+
+    [indic] Treat U+00D7 MULTIPLICATION SIGN as placeholder
+
+ src/hb-ot-shape-complex-indic.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit cf78dd483cbe1759a8ecb731879e041a53ba9bb3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 27 17:53:37 2014 -0400
+
+    [indic/myanmar] Rename OT_NBSP to OT_PLACEHOLDER
+
+ src/hb-ot-shape-complex-indic-machine.rl | 4 ++--
+ src/hb-ot-shape-complex-indic-private.hh | 6 +++---
+ src/hb-ot-shape-complex-indic.cc         | 4 ++--
+ src/hb-ot-shape-complex-myanmar.cc       | 2 +-
+ 4 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 186ece94c8838e95db240d3e7c3ce415da6be81e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 27 17:49:45 2014 -0400
+
+    [myanmar] Use OT_NBSP instead of OT_DOTTEDCIRCLE for OT_GB
+
+    No functional change.
+
+ src/hb-ot-shape-complex-myanmar-machine.rl | 2 +-
+ src/hb-ot-shape-complex-myanmar.cc         | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit cf71d28c380819cb0f7f0f22f6ff9e4aa881a2b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 27 17:47:43 2014 -0400
+
+    [indic/myanmar] Refactor a few macros
+
+ src/hb-ot-shape-complex-indic-private.hh | 12 ++++++++++++
+ src/hb-ot-shape-complex-indic.cc         | 10 ----------
+ src/hb-ot-shape-complex-myanmar.cc       |  6 ------
+ 3 files changed, 12 insertions(+), 16 deletions(-)
+
+commit 2307268e01d27a999b56a2f573dfcee8b2a7949b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 27 17:39:01 2014 -0400
+
+    [indic] Treat U+0A72..0A73 like regular consonants
+
+    Unicode 6.x IndicSyllableCategory categorizes them as
+    placeholders, but they can subjoin.
+
+ src/hb-ot-shape-complex-indic.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit e9b2a4cfe593bdbe9288571635ba26ac42ede987
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 23 15:49:10 2014 -0400
+
+    [indic] Support U+1CED
+
+ src/hb-ot-shape-complex-indic.cc | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit d19f8e85702a1e473efe2f02027984dcc127602a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 23 15:45:50 2014 -0400
+
+    [indic] Support U+A8F2..A8F7,1CE9..1CEC,1CEE..1CF1
+
+ src/hb-ot-shape-complex-indic.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit ddbdfcbf1c10eed0a7b81b29fee99f1bd22113e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 23 15:39:55 2014 -0400
+
+    [indic] Simplify grammar
+
+    No functional change.
+
+ src/hb-ot-shape-complex-indic-machine.rl | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 4e9b1f662b23966e67c548b86afeff2bec9b0eb7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 23 15:38:42 2014 -0400
+
+    [indic] Always start new syllable for Avagraha
+
+    In fact, the previous grammar was ambigious.  No functional
+    change.
+
+ src/hb-ot-shape-complex-indic-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9f9bd9bf31161660214b8b39a78cdafbb79db1be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 23 15:33:13 2014 -0400
+
+    [indic] Rename avagraha cluster to symbol cluster
+
+    In anticipation of adding more characters to that class of clusters.
+
+ src/hb-ot-shape-complex-indic-machine.rl | 10 +++++-----
+ src/hb-ot-shape-complex-indic-private.hh |  4 ++--
+ src/hb-ot-shape-complex-indic.cc         | 14 +++++++-------
+ 3 files changed, 14 insertions(+), 14 deletions(-)
+
+commit a498565cedf0441ae723c5e5969f637d792a15e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 22 19:39:56 2014 -0400
+
+    [indic] Support U+1CF2,U+1CF3
+
+ src/hb-ot-shape-complex-indic.cc | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit ecb98babbaa065940b40ca8954a454f0e2cdcff0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 22 19:36:21 2014 -0400
+
+    [indic] Support U+1CE2..U+1CE8
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 37bf2c9224e32fdc99c20158c6dc0a4602ec1292
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 22 19:35:17 2014 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 131e17ff9ae792cafa7a500043acb373802ee872
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 22 19:32:51 2014 -0400
+
+    [indic] Support U+1CF5,1CF6
+
+ src/hb-ot-shape-complex-indic.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 72ead0cc72dac4d1c985ead065bb820f93f14a1d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 22 19:12:10 2014 -0400
+
+    [indic] Treat U+1CE1 as a tone-mark too
+
+    It's spacing, but otherwise the same as the other ones.
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e848bfae7c975a6fae434daf8e3db4d69914df9f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 22 18:50:34 2014 -0400
+
+    [indic] Recategorize U+A8E0..A8F1 as OT_VD
+
+    Up to two of them come after all OT_A characters.
+
+ src/hb-ot-shape-complex-indic-machine.rl |  2 +-
+ src/hb-ot-shape-complex-indic.cc         | 10 ++++++----
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+commit c519536c34c842304da558dd4a9e3844fc261b20
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 22 18:43:14 2014 -0400
+
+    [indic] Allow up to three tone marks
+
+    According to Roozbeh, there are valid combinations in Unicode
+    proposals for up to three.  Previously we were allowing up to two.
+
+ src/hb-ot-shape-complex-indic-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c11fc6833980fce6d70c5ae0c6623de97a3eb30a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 22 18:41:49 2014 -0400
+
+    [indic] Support more extended Devanagari tone marks
+
+    Also adjust U+0953,0954 handling.
+
+ src/hb-ot-shape-complex-indic.cc | 18 ++++++++++++------
+ 1 file changed, 12 insertions(+), 6 deletions(-)
+
+commit 26c836e53d55a2e2d4c17fd9ea1884eec33ce015
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 21 18:35:48 2014 -0400
+
+    [indic] Handle "Cantillation marks for the Samaveda"
+
+ src/hb-ot-shape-complex-indic.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 29531128f2f4342d537817746863705df80efe4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 15 14:04:02 2014 -0600
+
+    [indic] Improve reph formation of Sinhala and Telugu
+
+    Sinhala and Telugu use "explicit" reph.  That is, the reph is
+    formed by
+    a Ra,H,ZWJ sequence.  Previously, upon detecting this sequence,
+    we were
+    checking checking whether the 'rphf' feature applies to the first two
+    glyphs of the sequence.  This is how the Microsoft fonts are designed.
+    However, testing with Noto shows that apparently Uniscribe also forms
+    the reph if the lookup ligates all three glyphs.  So, try both
+    sequences.
+
+    Doesn't affect test results for Sinhala or Telugu.
+
+    https://code.google.com/a/google.com/p/noto-alpha/issues/detail?id=232
+
+ src/hb-ot-shape-complex-indic.cc | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 8c703f13bf8b4b276093b1c42cd3759e34b6787f
+Author: Oleg Oshmyan <chortos@inbox.lv>
+Date:   Wed May 14 22:10:09 2014 +0100
+
+    Fix build with --coretext on older OS X
+
+    Fixes https://github.com/behdad/harfbuzz/pull/40
+
+ src/hb-coretext.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 439b05867c0856a81fa8f9bea3a7465b4b4bdd91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 14 16:44:39 2014 -0600
+
+    [myanmar] Allow MedialYa+Asat in the grammar
+
+    The grammar in the OT spec, and the existing Windows implementation
+    seem to be confused around where to allow Asat around the medial
+    consonants.
+
+    The previous grammar for medial group was allowing an Asat after
+    the medial group only if there was a medial Wa or Ha, but not if
+    there was only a medial Ya.  This doesn't make sense to me and
+    sounds reversed, as both medial Wa and Ha are below marks while
+    Asat is an above mark.  An Asat can come before the medial group
+    already (in fact, multiple ones can.  Why?!).  The medial Ya
+    however is a spacing mark and according to Roozbeh it's valid
+    to want an Asat on the medial Ya instead of the base, so it looks
+    to me like we want to allow an Asat after the medial group if
+    there *was* a Ya but not if there wasn't any.  Not wanting to
+    produce dotted-circle where Windows is not, this commit changes
+    the grammar to allow one Asat after the medial group no matter
+    what comes in the group.
+
+    Test: U+1002,103A,103B vs U+1002,103B,103A
+
+ src/hb-ot-shape-complex-myanmar-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0a017ce169d791c9aea56671fe5837961e0a3c09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 14 16:44:16 2014 -0600
+
+    Add tests for Myanmar Asat+MedialYa and MedialYa+Asat sequences
+
+    One of them currently produces dotted-circle.  Fix and detailed
+    message coming.
+
+ test/shaping/texts/in-tree/shaper-myanmar/script-myanmar/misc/misc.txt |
+ 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit c95587618c88d187be64f923033dae151cf820be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 14 00:42:18 2014 -0400
+
+    [ot] Minor note re cmap subtable format 2 and 8
+
+ src/hb-ot-cmap-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit b7878cd58ea9a67236e1e0228c35b5b03ec4ff9c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 13 21:47:51 2014 -0400
+
+    [ot] Implement cmap subtable format 0
+
+ src/hb-open-type-private.hh |  3 ++-
+ src/hb-ot-cmap-table.hh     | 32 ++++++++++++++++++++++++++++++++
+ 2 files changed, 34 insertions(+), 1 deletion(-)
+
+commit ca7b77431d1e0aaa803722be8be85a368a385f47
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 13 21:26:34 2014 -0400
+
+    [ot] Factor out code between cmap sutable format 12 and 13
+
+ src/hb-ot-cmap-table.hh | 43 +++++++++++++------------------------------
+ 1 file changed, 13 insertions(+), 30 deletions(-)
+
+commit 94759e8219ed08392573bae948a8135e16b8e0d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 13 21:17:28 2014 -0400
+
+    [ot] Factor out code between cmap subtable format 6 and 10
+
+ src/hb-ot-cmap-table.hh | 49
+ ++++++++++---------------------------------------
+ 1 file changed, 10 insertions(+), 39 deletions(-)
+
+commit 1a8ffc512987c1ff1b4896549f80b145c85454a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 13 21:06:39 2014 -0400
+
+    Minor
+
+ src/hb-blob.h | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 91bbfca87527fa14d6ebec86b087f2a989381872
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 12 18:19:29 2014 -0400
+
+    [ot] Implement cmap subtable formats 6 and 10
+
+ src/hb-ot-cmap-table.hh | 77
+ +++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 74 insertions(+), 3 deletions(-)
+
+commit d294a2cb165c4f20daa5624969067c51eb9aef58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 12 17:58:31 2014 -0400
+
+    [ot] Implement cmap subtable format 13
+
+ src/hb-ot-cmap-table.hh | 47
+ +++++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 41 insertions(+), 6 deletions(-)
+
+commit 0d75793fae95ed9f6b8522ae3af4fcdf397d8c36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 12 17:51:15 2014 -0400
+
+    [ot] Implement cmap subtable format 12
+
+ src/hb-ot-cmap-table.hh | 63
+ +++++++++++++++++++++++++++++++++++++++++++++++--
+ src/hb-ot-font.cc       |  5 ++++
+ 2 files changed, 66 insertions(+), 2 deletions(-)
+
+commit 3608a6847e7b7eb4206df049158513a085810afd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 12 13:46:29 2014 -0400
+
+    [ot] Hook up cmap table to hb_ot_font_funcs()
+
+ src/hb-ot-cmap-table.hh | 10 +++++++---
+ src/hb-ot-font.cc       | 33 +++++++++++++++++++--------------
+ 2 files changed, 26 insertions(+), 17 deletions(-)
+
+commit c8a47452993b9dee6854bfc866aca4a20142696f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 9 19:55:51 2014 -0400
+
+    [ot] Implement cmap subtable format 4
+
+ src/hb-ot-cmap-table.hh | 52
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 52 insertions(+)
+
+commit 4719621f20dfd6a0377c650a7b4df223c18dc143
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 9 16:09:11 2014 -0400
+
+    Minor
+
+ src/hb-open-type-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 41ca1fbebf61cf26e1e0e4b11f4a5b52fb7d88a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 9 15:35:56 2014 -0400
+
+    [ot] Start implementing cmap table
+
+ src/Makefile.am         |   1 +
+ src/hb-ot-cmap-table.hh | 171
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-font.cc       |   1 +
+ 3 files changed, 173 insertions(+)
+
+commit c7074b8798048324cb8850c55908ce77fc33d11e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 8 18:24:31 2014 -0400
+
+    [otlayout] Add GenericArrayOf::search()
+
+ src/hb-open-type-private.hh | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+commit 40a479797add42fa42b78d4267920ef75bfb6b9a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 8 18:21:04 2014 -0400
+
+    [otlayout] Add GenericSortedArrayOf
+
+ src/hb-open-type-private.hh | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+commit 0ddecabc6de205b121bec31fbf670f37cc9454ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 1 16:01:40 2014 -0700
+
+    [main] Minor improvement to output
+
+ src/main.cc | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit 79ecdc3f9525212053d2bc88a5541c41697159da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 28 14:24:23 2014 -0700
+
+    0.9.28
+
+ NEWS         | 13 +++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit 6faff8e4132197ba06f0e685b82efe35b546cf64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 28 14:29:39 2014 -0700
+
+    Add static storage classifier to inline functions
+
+    Before we were just relying on the compiler inlining them and not
+    leaving a trace in our public API.  Try to fix.  Hopefully not
+    breaking anyone's build.
+
+ src/hb-open-type-private.hh    | 22 +++++++++++-----------
+ src/hb-ot-layout-gpos-table.hh |  4 ++--
+ src/hb-ot-layout-gsub-table.hh |  6 +++---
+ src/hb-ot-layout-private.hh    | 36 ++++++++++++++++++------------------
+ src/hb-ot-map-private.hh       | 10 +++++-----
+ src/hb-private.hh              |  2 +-
+ 6 files changed, 40 insertions(+), 40 deletions(-)
+
+commit 9c9411839bb89d0a1a83120af0982c60e0e393d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 28 12:38:25 2014 -0700
+
+    [tibetan] Reorder PADMA sign to occur after other below marks
+
+    Based on suggestion from Andrew Glass.
+
+    Test: U+0F40,0FC6,0F83
+
+ src/hb-unicode-private.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 659cd3c5b470ff9724ce5e53fedd1fea3e7512c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 28 12:43:42 2014 -0700
+
+    [test] Add test case for Tibetan sign PADMA
+
+    Currently fails.
+
+ test/shaping/texts/in-tree/shaper-tibetan/script-tibetan/misc/misc.txt |
+ 1 +
+ 1 file changed, 1 insertion(+)
+
+commit ee703bc3ef740c300718fca7a12c050c322dce19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 28 12:43:18 2014 -0700
+
+    Reshuffle test data
+
+ test/shaping/texts/in-tree/MANIFEST                                    |
+ 3 +++
+ test/shaping/texts/in-tree/shaper-default/MANIFEST                     |
+ 3 ---
+ .../in-tree/{shaper-default => shaper-hangul}/script-hangul/MANIFEST
+ | 0
+ .../{shaper-default => shaper-hangul}/script-hangul/misc/MANIFEST
+ | 0
+ .../{shaper-default => shaper-hangul}/script-hangul/misc/misc.txt
+ | 0
+ .../in-tree/{shaper-default => shaper-hebrew}/script-hebrew/MANIFEST
+ | 0
+ .../{shaper-default => shaper-hebrew}/script-hebrew/misc/MANIFEST
+ | 0
+ .../script-hebrew/misc/diacritics.txt                                  |
+ 0
+ .../in-tree/{shaper-default => shaper-tibetan}/script-tibetan/MANIFEST
+ | 0
+ .../{shaper-default => shaper-tibetan}/script-tibetan/misc/MANIFEST
+ | 0
+ .../{shaper-default => shaper-tibetan}/script-tibetan/misc/misc.txt
+ | 0
+ 11 files changed, 3 insertions(+), 3 deletions(-)
+
+commit b082ef373cefb35dd98b5f2f0b677ccc7806f51e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 25 11:48:10 2014 -0700
+
+    Typo
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 828e109c7aac3389cc3b89ea1f13388aefb63804
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 18 16:53:34 2014 -0700
+
+    [indic] Fix-up zero-context matching
+
+    commit b5a0f69e47ace468b06e21cf069a18ddcfcf6064
+    Author: Behdad Esfahbod <behdad@behdad.org>
+    Date:   Thu Oct 17 18:04:23 2013 +0200
+
+        [indic] Pass zero-context=false to would_substitute for newer
+        scripts
+
+        For scripts without an old/new spec distinction, use
+        zero-context=false.
+        This changes behavior in Sinhala / Khmer, but doesn't seem
+        to regress.
+        This will be useful and used in Javanese.
+
+    The *intention* was to change zero-context from true to false for
+    scripts that
+    don't have old-vs-new specs.  However, checking the code, looks
+    like we
+    essentially change zero-context to always be true; ie. we only
+    changed things
+    for old-spec, and we broke them.  That's what causes this bug:
+
+      https://bugs.freedesktop.org/show_bug.cgi?id=76705
+
+    The root of the bug is here:
+
+      /* Use zero-context would_substitute() matching for new-spec of
+      the main
+       * Indic scripts, but not for old-spec or scripts with one spec
+       only. */
+      bool zero_context = indic_plan->config->has_old_spec ||
+      !indic_plan->is_old_spec;
+
+    Note that is_old_spec itself is:
+
+      indic_plan->is_old_spec = indic_plan->config->has_old_spec &&
+      ((plan->map.chosen_script[0] & 0x000000FF) != '2');
+
+    It's easy to show that zero_context is now always true.  What we
+    really meant was:
+
+      bool zero_context = indic_plan->config->has_old_spec &&
+      !indic_plan->is_old_spec;
+
+    Ie, "&&" instead of "||".  We made this change supposedly to make
+    Javanese
+    work.  But apparently we got it working regardless!  So I'm going
+    to fix this
+    to only change the logic for old-spec and not touch other cases.
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 66c6a48b6ce9dab6375ba1a23d7e450d6974852a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 14 15:55:42 2014 -0700
+
+    Add HB_NO_MERGE_CLUSTERS
+
+    Disables any cluster-merging.  Added for testing purposes while
+    we investigate what kind of API to add for this.
+
+ src/hb-buffer.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 897c7b804d6817470a364ba31b1719555b12f751
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 10 16:27:13 2014 -0700
+
+    Add Khmer test for U+17DD
+
+ .../shaper-indic/south-east-asian/script-khmer/misc/other-marks.txt
+ | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 50a00535ccac538bbf93358fd2d2442e4c12542f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 10 16:03:29 2014 -0700
+
+    Require gobject-introspection 1.34.0
+
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=75384
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5fd996c4a4049a75c6d9e964f1a81c00ff191893
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 9 16:38:26 2014 -0700
+
+    Further adjust check-defs and check-symbols for mipsel
+
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=74491
+
+ src/check-defs.sh    | 2 +-
+ src/check-symbols.sh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 75ec6d0bc5ca0170c73e4d1099a898d38d8f85c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 9 16:33:32 2014 -0700
+
+    Tighten up check-static-inits.sh check
+
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=74490
+
+ src/check-static-inits.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 110ec0714a11b9417eed82f7d25b85c9dc7b6df4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 8 17:32:08 2014 -0700
+
+    Typo
+
+ src/hb-blob.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0682ddd05c22a400ff5ce97d4ea4b52a18b845ae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 8 16:03:35 2014 -0700
+
+    [indic] Support U+17DD KHMER SIGN ATTHACAN
+
+    As requested by Martin Hosken on the list.
+
+ src/hb-ot-shape-complex-indic.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 05870ed62edd8728d6d732f60d6b7e149d45e6f4
+Author: Primiano Tucci <primiano@chromium.org>
+Date:   Wed Apr 2 11:35:27 2014 +0100
+
+    Use __aarch64__ for 64-bit ARM detection, not __arm64__
+
+    Many GCC versions don't define __arm64__
+
+ src/hb-atomic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 04d894e89795041b2055dc172744a018644f2bca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 25 12:11:32 2014 -0700
+
+    Minor
+
+ src/hb-ot-layout-gsubgpos-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 903648437c180c7b039801cdb0672e0f8e14afd4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 24 14:26:36 2014 -0700
+
+    Start fleshing out builtin font functions
+
+ src/Makefile.am                     |   3 +-
+ src/hb-glib.cc                      |   2 +-
+ src/hb-icu.cc                       |   2 +-
+ src/hb-ot-font.cc                   | 260
+ ++++++++++++++++++++++++++++++++++++
+ src/{hb-tt-font.cc => hb-ot-font.h} |  56 ++------
+ src/hb-ot-hhea-table.hh             |   2 +-
+ src/hb-ot-hmtx-table.hh             |   2 +-
+ src/hb-ot.h                         |   1 +
+ util/Makefile.am                    |   4 +-
+ util/options.cc                     |   4 +
+ 10 files changed, 283 insertions(+), 53 deletions(-)
+
+commit 343a0e4e747d93eeeb724c5d585f5ba036a0df84
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 21 14:37:27 2014 -0700
+
+    Add "make built-sources"
+
+ src/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit e9853f33d1f53d4d69ee0fa340ce9225a5ed17ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 21 12:53:08 2014 -0700
+
+    One more fix for build without gtk-doc
+
+    Fixes https://github.com/behdad/harfbuzz/pull/35
+
+ autogen.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b96af03c20e46105982b3608b608614403540661
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Thu Mar 20 16:01:30 2014 +0200
+
+    Fix build with --coretext on iOS
+
+    On iOS CoreText and CoreGraphics are stand-alone frameworks
+
+ configure.ac      | 23 +++++++++++++++++++----
+ src/hb-coretext.h |  8 +++++++-
+ 2 files changed, 26 insertions(+), 5 deletions(-)
+
+commit ea5e8a02eb83ad19f3009b0008893f77ce113118
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 19 15:38:02 2014 -0700
+
+    [util] Plug minor leak
+
+ util/hb-shape.cc     |  6 +++---
+ util/helper-cairo.cc | 21 ++++++++++++---------
+ util/helper-cairo.hh |  2 +-
+ util/options.cc      |  6 +++++-
+ util/options.hh      |  6 +++---
+ 5 files changed, 24 insertions(+), 17 deletions(-)
+
+commit 09732cc6695b8e41ba6cdcd4058a4f7cad90167a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 19 12:00:17 2014 -0700
+
+    Remove dead warning
+
+ src/hb-unicode.cc |  9 +++++++--
+ src/hb-warning.cc | 11 -----------
+ 2 files changed, 7 insertions(+), 13 deletions(-)
+
+commit b934b0f9d1b39fc7a06c812bea3d79ca5424e278
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 19 11:52:40 2014 -0700
+
+    Yet another try to make build without gtk-doc succeed
+
+ autogen.sh                 | 1 +
+ docs/reference/Makefile.am | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit a7a5be090dd9cc39605853e8994eb417550939d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 19 11:39:23 2014 -0700
+
+    Another try to make gtk-doc optional
+
+ docs/reference/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ba8c9d92935ea351970a80d0d3441858ad4cf33f
+Author: Dominik Röttsches <dominik.rottsches@intel.com>
+Date:   Tue Mar 18 14:39:03 2014 +0200
+
+    0.9.27
+
+ NEWS         | 16 ++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 17 insertions(+), 1 deletion(-)
+
+commit a949cd329e49d2c0ad6f1e023f324790d886dafe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Mar 16 20:22:42 2014 -0700
+
+    Don't use "register" storage class specifier
+
+    Fixes warnings.
+    https://bugzilla.mozilla.org/show_bug.cgi?id=984081
+
+ src/hb-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 0082dbeae6c25a7859960b7e791a540ad04246d9
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Sun Mar 16 08:25:17 2014 +0000
+
+    wrap definition of free_langs() with HAVE_ATEXIT
+
+    ...to avoid an unused function warning; see mozilla bug
+    https://bugzilla.mozilla.org/show_bug.cgi?id=984081.
+
+ src/hb-common.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit a9e25e90a4ca05746fda4a598ad698db1d2c5c1a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 14 19:55:46 2014 -0700
+
+    [coretext] Add hb_coretext_face_create()
+
+    Not tested.
+
+ src/hb-coretext.cc | 57
+ +++++++++++++++++++++++++++++++++++++++++++++---------
+ src/hb-coretext.h  |  4 ++++
+ 2 files changed, 52 insertions(+), 9 deletions(-)
+
+commit c79865f90f62309dc64c8d3f2f503ec2aa4b7ec1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 14 19:37:55 2014 -0400
+
+    [coretext] Add coretext_aat shaper
+
+    This is a higher-priority shaper than default shaper ("ot"), but
+    only picks up fonts that have AAT "morx"/"mort" table.
+
+    Note that for this to work the font face's get_table() implementation
+    should know how to return the full font blob.
+
+    Based on patch from Konstantin Ritt.
+
+ src/hb-coretext.cc    | 94
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-coretext.h     |  4 +++
+ src/hb-shaper-list.hh |  4 +++
+ 3 files changed, 102 insertions(+)
+
+commit af1aa362cacc652ab8ffda05a5d98a3ff5430439
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 14 15:52:47 2014 -0700
+
+    If HAVE_ICU_BUILTIN is defined, use hb-icu Unicode callbacks
+
+    Useful for Android / Chrome / etc when ICU is built in the same
+    library as harfbuzz itself.
+
+ src/hb-unicode.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 853daf857f231c9ce0277a78abff1241150ea903
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 14 15:49:18 2014 -0700
+
+    Remove old cruft
+
+ src/hb-shaper-list.hh | 6 ------
+ 1 file changed, 6 deletions(-)
+
+commit 2a473338da1538efa4ff14ae9e4aba8dd50f9b0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 10 15:04:46 2014 -0700
+
+    Add Myanmar test case from OpenType Myanmar spec
+
+ test/shaping/texts/in-tree/shaper-myanmar/script-myanmar/misc/MANIFEST  |
+ 1 +
+ .../shaping/texts/in-tree/shaper-myanmar/script-myanmar/misc/otspec.txt |
+ 2 ++
+ 2 files changed, 3 insertions(+)
+
+commit 158985908981189a2fd4d15275a641286fc770fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 10 14:57:55 2014 -0700
+
+    Minor
+
+ test/shaping/texts/in-tree/shaper-myanmar/script-myanmar/misc/MANIFEST
+ | 1 -
+ test/shaping/texts/in-tree/shaper-sea/script-tai-tham/misc/MANIFEST
+ | 1 +
+ .../script-myanmar => shaper-sea/script-tai-tham}/misc/torture.txt
+ | 0
+ 3 files changed, 1 insertion(+), 1 deletion(-)
+
+commit bb8ffb581b89cf27fb8e0743b81bbda21654233e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 4 13:03:51 2014 -0800
+
+    Use AM_MISSING_PROG for ragel and git
+
+ Makefile.am     | 4 ++--
+ configure.ac    | 2 ++
+ src/Makefile.am | 2 +-
+ 3 files changed, 5 insertions(+), 3 deletions(-)
+
+commit a82165248cddb720576464b8e59a986491d3f2e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 18 15:53:56 2014 -0500
+
+    Only do fallback Hebrew composition if no GPOS 'mark' available
+
+    Apparently some modern fonts have proper GPOS mark positioning
+    tables, but undesirable precomposed forms!  See thread
+    "Hebrew composition to presentation forms" and:
+
+      http://tex.stackexchange.com/questions/156775/having-trouble-with-vowel-positioning-in-ezra-sil-xelatex
+
+    Test case: U+fb1d,05d9,05b4
+
+ src/hb-ot-shape-complex-hebrew.cc | 2 +-
+ src/hb-ot-shape-private.hh        | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit b456d42bf68c4374f71f09867e375a51c7f2b3ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 11 17:29:40 2014 -0500
+
+    Allow bootstrapping without gtk-doc
+
+    Seems like configure.ac is already able to handle it.
+
+ autogen.sh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 1eacde00cc8c57a08fb74276e3530844ef463d67
+Author: Luis de Bethencourt <luis@debethencourt.com>
+Date:   Thu Feb 6 23:20:47 2014 -0500
+
+    check hb_set_is_emtpy in test-set.c
+
+ test/api/test-set.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit db068d81cda180a91638e5539984f8139aff49c6
+Author: Werner Lemberg <wl@gnu.org>
+Date:   Mon Feb 10 10:38:56 2014 -0500
+
+    typo in ucdn's Makefile.am
+
+ src/hb-ucdn/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fbb2847f541389f40718af71c4945024ae177ab2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 5 08:22:06 2014 -0500
+
+    Improve MemoryBarrier() implementation
+
+    See thread "[HarfBuzz] compilation error of 0.9.26 with MinGW"
+    started by Werner.
+
+ src/hb-atomic-private.hh | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 189bf23bfc90405d8bdc70bf3d6d3ffec38b470c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 30 15:14:58 2014 -0500
+
+    0.9.26
+
+ NEWS         | 20 ++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 21 insertions(+), 1 deletion(-)
+
+commit 7691a154e50f8c8c77bbd94787686262955bf5d4
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Wed Jan 29 14:07:58 2014 +0000
+
+    Ensure hb_script_t can safely hold any hb_tag_t value it's given.
+
+    Fixes https://github.com/behdad/harfbuzz/pull/21
+
+ src/hb-common.h | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit c29993a181c2139eaec97b5f6225824040ca3ac9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 28 17:29:42 2014 -0500
+
+    [coretext] Handle surrogate pairs when generating notdef glyphs
+
+    Fixes github.com/behdad/harfbuzz/pull/19
+
+ src/hb-coretext.cc | 18 ++++++++++++++----
+ 1 file changed, 14 insertions(+), 4 deletions(-)
+
+commit 748b2782e4898420003a3bbc041dcccbe9e3edc2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 28 17:10:05 2014 -0500
+
+    [coretext] Minor optimization
+
+ src/hb-coretext.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 24e6b11f12788500182715a64d4771a22c5b7525
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Tue Jan 28 18:16:01 2014 +0200
+
+    Fix double destruction in case of OOM
+
+ src/hb-graphite2.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 083225916a19f6d67017523af87386933bd9ecdc
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Wed Jan 22 20:31:30 2014 +0200
+
+    Micro optimizations
+
+ src/hb-ot-layout-gpos-table.hh | 28 +++++++++++++++++-----------
+ 1 file changed, 17 insertions(+), 11 deletions(-)
+
+commit c9522de2335e4ef5fe65a72745c10943827a8da2
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Wed Jan 22 21:07:13 2014 +0200
+
+    Make it possible to disable the fallback shaper at configure time
+
+    The OT shaper supersedes the fallback shaper in every case
+    and the latter become an extra weight for 99.9% of users.
+
+ configure.ac          | 6 ++++++
+ src/Makefile.am       | 5 ++++-
+ src/hb-shaper-list.hh | 2 ++
+ 3 files changed, 12 insertions(+), 1 deletion(-)
+
+commit 6775da3a7c07db6c032cf429dc199d471948db56
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 23 14:18:49 2014 -0500
+
+    Fix clang warning 'private field 'xxx' is not used
+
+    Fixes https://github.com/behdad/harfbuzz/pull/16
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 62299826f4905e080b9497bce335e093b287494e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 23 14:11:03 2014 -0500
+
+    Fix typo in _hb_buffer_serialize_glyphs_text()
+
+    Fixes https://github.com/behdad/harfbuzz/pull/17
+
+ src/hb-buffer-serialize.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ae23c24c32f474a34484ee78bc177ad31fa5e6d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 22 11:03:02 2014 -0500
+
+    [arabic] Disable 'cswh' by default
+
+    I believe Windows 8 disables it, and spec update dated
+    Jan 2014 also clearly says it's disabled by default:
+
+      http://www.microsoft.com/typography/OpenTypeDev/arabic/intro.htm#features
+
+ src/hb-ot-shape-complex-arabic.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 08cf5d75ef0c75095173dec822ccb07defaaa6c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 22 07:53:55 2014 -0500
+
+    [ot] Don't try to compose if normalization is off
+
+ src/hb-ot-shape-normalize.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 0596343bfeb80ad6b19d459654edf7dfded6affe
+Merge: 62cb28df 83d7e791
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 22 04:43:51 2014 -0800
+
+    Merge pull request #13 from jfkthame/hangul-shaper
+
+    Tone-mark reordering and improved Old Hangul support
+
+commit 62cb28dfc668cae9cbff826229bde2271e157927
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Mon Jan 20 14:23:08 2014 +0000
+
+    fixup for 64-bit windows build
+
+ src/hb-uniscribe.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 83d7e7915a5eaa8ff4c7014c319844e7dffd8225
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Mon Jan 20 19:49:47 2014 +0000
+
+    [hangul] Fix ordering of dotted circle with Hangul tone mark (reported
+    by Dohyun Kim).
+
+ src/hb-ot-shape-complex-hangul.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit deef1862657d55b7ae8d45f4eecbe45c80785c4e
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Mon Jan 20 10:38:27 2014 +0000
+
+    [hangul] Don't force zero-width for marks - this is not wanted for
+    the Jamo Filler glyphs.
+
+ src/hb-ot-shape-complex-hangul.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 391934db0a171aeb2057ebcd4a38ed81621e7393
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Mon Jan 20 10:37:32 2014 +0000
+
+    [unicode] Exclude the Jamo Filler characters from Default_Ignorable,
+    as some fonts want these to be visible/spacing glyphs.
+
+ src/hb-unicode-private.hh | 15 +++++++--------
+ 1 file changed, 7 insertions(+), 8 deletions(-)
+
+commit 7244b3fc3bf9757dd094709d36bea68682264e20
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Mon Jan 20 10:35:51 2014 +0000
+
+    [hangul] Reorder Hangul tone mark to beginning of syllable, unless
+    font implements it using a zero-width glyph.
+
+ src/hb-ot-shape-complex-hangul.cc | 59
+ ++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 58 insertions(+), 1 deletion(-)
+
+commit 103436838df3a77552d3d33fc4bd80f09d9bf079
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Mon Jan 20 10:35:07 2014 +0000
+
+    [hangul] Apply the appropriate *jmo features to decomposed
+    syllables, including Old Hangul sequences that don't have Unicode
+    compositions. Merge clusters in decomposed syllables.
+
+ src/hb-ot-shape-complex-hangul.cc | 197
+ +++++++++++++++++++++++++++++++-------
+ 1 file changed, 165 insertions(+), 32 deletions(-)
+
+commit 8fc1f7fe74a25bf8549f5edd79c7da6b720eb064
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 2 17:04:04 2014 +0800
+
+    [ot/hangul] Don't decompose Hangul even when combining marks present
+
+    As discussed on
+    https://github.com/behdad/harfbuzz/pull/10#issuecomment-31442030
+
+ src/hb-ot-shape-complex-hangul.cc    |  2 +-
+ src/hb-ot-shape-normalize-private.hh |  1 +
+ src/hb-ot-shape-normalize.cc         | 24 +++++++++++++-----------
+ 3 files changed, 15 insertions(+), 12 deletions(-)
+
+commit 64426ec73a987bfe1e71a293ee195f268897e8d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 2 14:33:10 2014 +0800
+
+    [ot] Simplify composing
+
+    Not tested.  Ouch.
+
+ src/hb-ot-shape-normalize.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 8de20b1e8a1c4d2081f64e695045e6e4da7ce144
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 2 14:30:45 2014 +0800
+
+    Add font->has_glyph()
+
+ src/hb-font-private.hh            |  6 ++++++
+ src/hb-ot-shape-complex-hangul.cc | 14 ++++++--------
+ src/hb-ot-shape.cc                |  3 +--
+ 3 files changed, 13 insertions(+), 10 deletions(-)
+
+commit f6298e55ae0f0f23f66935226f78afb98320ea78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 2 14:23:56 2014 +0800
+
+    [fallback] Minor
+
+ src/hb-fallback-shape.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 29ea403d67e29c2d531c1f613ce3d69e60f078f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 2 14:20:00 2014 +0800
+
+    [hangul] Fix decomposition logic
+
+    Seems to be working now.
+
+ src/hb-ot-shape-complex-hangul.cc | 19 ++++++++-----------
+ 1 file changed, 8 insertions(+), 11 deletions(-)
+
+commit bdb20dafc3f737923da3dca0c832fdf4ab8daabc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 2 14:04:30 2014 +0800
+
+    [hangul] Fix decomposition
+
+    Part of https://github.com/behdad/harfbuzz/pull/10
+
+ src/hb-ot-shape-complex-hangul.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 32478656ce6e7926c3ad481511f02187ca743af6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 2 14:01:56 2014 +0800
+
+    [hangul] Tighten up character categories
+
+    I had tried to expand to fill the blocks, but that sounds wrong in
+    retrospect.
+
+ src/hb-ot-shape-complex-hangul.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f14bb7de631b20e2868fb62e5311cd0d9e24bb49
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 31 16:49:15 2013 +0800
+
+    [ot] Separate out hebrew and tibetan shapers from default
+
+    Now default shaper is truly no-op.
+
+ src/Makefile.am                    |   2 +
+ src/hb-ot-shape-complex-default.cc | 161
+ +---------------------------------
+ src/hb-ot-shape-complex-hebrew.cc  | 172
+ +++++++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-private.hh |  17 +++-
+ src/hb-ot-shape-complex-tibetan.cc |  61 +++++++++++++
+ 5 files changed, 251 insertions(+), 162 deletions(-)
+
+commit 6300cd72539284ca294ee8286bbbb7f9c72af320
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 31 16:38:47 2013 +0800
+
+    [ot] Define HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT
+
+ src/hb-ot-shape-complex-default.cc | 2 +-
+ src/hb-ot-shape-complex-hangul.cc  | 2 +-
+ src/hb-ot-shape-complex-private.hh | 4 +++-
+ src/hb-ot-shape-complex-thai.cc    | 2 +-
+ 4 files changed, 6 insertions(+), 4 deletions(-)
+
+commit 3d6ca0d32e5c6597acfcf59301cb1905586ddb52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 31 16:04:35 2013 +0800
+
+    [ot] Simplify normalization_preference again
+
+    No shaper has more than one behavior re this, so no need for
+    a callback.
+
+ src/hb-ot-shape-complex-arabic.cc  | 2 +-
+ src/hb-ot-shape-complex-default.cc | 8 +-------
+ src/hb-ot-shape-complex-hangul.cc  | 2 +-
+ src/hb-ot-shape-complex-indic.cc   | 8 +-------
+ src/hb-ot-shape-complex-myanmar.cc | 9 +--------
+ src/hb-ot-shape-complex-private.hh | 7 +------
+ src/hb-ot-shape-complex-sea.cc     | 9 +--------
+ src/hb-ot-shape-complex-thai.cc    | 2 +-
+ src/hb-ot-shape-normalize.cc       | 4 +---
+ 9 files changed, 9 insertions(+), 42 deletions(-)
+
+commit c98b7183f7dc453d5bac1f2503017cded317a495
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 31 15:55:40 2013 +0800
+
+    [ot] Add Hangul shaper
+
+    Not exhaustively tested, but I think I got the intended logic
+    right.
+
+    The logic can perhaps be simplified.  Maybe we should disabled
+    normalization with this shaper.  Then again, for now focusing on
+    correctness.
+
+ src/Makefile.am                    |   1 +
+ src/hb-ot-shape-complex-default.cc |  13 ---
+ src/hb-ot-shape-complex-hangul.cc  | 232
+ +++++++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-private.hh |  10 +-
+ src/hb-private.hh                  |   6 +
+ 5 files changed, 240 insertions(+), 22 deletions(-)
+
+commit 15f67048e45853ad4069fd4334e132bc3db4d2c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 27 19:33:28 2013 -0500
+
+    Reorder Tai Tham SAKOT to ensure it comes after any tone marks
+
+ src/hb-unicode-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 3216e44feb7b97f44620b51e197425a80a41cdb7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 23 14:39:23 2013 -0500
+
+    [uniscribe] Fix scratch-buffer accounting
+
+ src/hb-uniscribe.cc | 15 ++++++++-------
+ 1 file changed, 8 insertions(+), 7 deletions(-)
+
+commit beeb12c9af4e0e66378cd36cf3dbb1560763a8e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 22 22:53:27 2013 -0500
+
+    Add TODO item
+
+ src/hb-ot-shape.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit fbd4acc58a4bb501625b482bd318be9764ff8e02
+Author: Luis de Bethencourt <luis@debethencourt.com>
+Date:   Sun Dec 22 08:02:11 2013 -0500
+
+    Clean ht-ob headers
+
+ src/Makefile.am    |  1 +
+ src/hb-ot-layout.h |  5 -----
+ src/hb-ot-shape.h  | 53
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot.h        |  9 +--------
+ 4 files changed, 55 insertions(+), 13 deletions(-)
+
+commit 5497a8a274a7066c0230c850baadef681785c8bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 22 20:48:53 2013 -0500
+
+    Cache various masks on the shape plan
+
+ src/hb-ot-shape-fallback.cc |  6 ++----
+ src/hb-ot-shape-private.hh  | 15 +++++++++++++++
+ src/hb-ot-shape.cc          | 26 +++++++-------------------
+ 3 files changed, 24 insertions(+), 23 deletions(-)
+
+commit 02f909664fa24a7ccf7cf73d75d1d3426aaaae7d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 22 19:35:27 2013 -0500
+
+    Minor correction to kern mask checking
+
+ src/hb-ot-shape-fallback.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a7e8bbb080aef318b16750ca1771d0d3af3d0ae9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 22 19:33:35 2013 -0500
+
+    Minor fraction mask setting improvement
+
+ src/hb-ot-map-private.hh | 2 --
+ src/hb-ot-shape.cc       | 8 +++++---
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 76fff252a96b4357b5e71694d5201daef822aa60
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 22 17:55:59 2013 -0500
+
+    Don't form fractions if only one of numr/dnom exist
+
+ src/hb-ot-shape.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 3aeee519f0b82df5263974945ae852badc4dbded
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 22 16:17:54 2013 -0500
+
+    Bug 72698 - Automatically support frac / numr / dnom
+
+    When seeing U+2044 FRACTION SLASH in the text, find decimal
+    digits (Unicode General Category Decimal_Number) around it,
+    and mark the pre-slash digits with 'numr' feature, the post-slash
+    digits with 'dnom' feature, and the whole sequence with 'frac'
+    feature.
+
+    This beautifully renders fractions with major Windows fonts,
+    and any other font that implements those features (numr/dnom is
+    enough for most fonts.)
+
+    Not the fastest way to do this, but good enough for a start.
+
+ src/hb-ot-shape.cc | 51
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 51 insertions(+)
+
+commit 014f369ec98fdbb3e7a2ef68aea2c4e017e7b680
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 22 16:15:30 2013 -0500
+
+    Add XXX note
+
+ src/hb-ot-map-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 739325178aba00ea5526c6a54ce588a79e5d45e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 21 00:18:18 2013 -0500
+
+    Initialize masks before mirroring
+
+    We were throwing away the rtlm feature mask set during
+    mirroring...
+
+ src/hb-ot-shape.cc | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit d507f6b5b7a052f4d0eb9ba4ec88fd2e3d6f64b4
+Author: Luis de Bethencourt <luis@debethencourt.com>
+Date:   Mon Dec 16 15:48:44 2013 -0500
+
+    Have Gtk-Doc ignore UCDN files
+
+ docs/reference/Makefile.am | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit d688475ea9cd236bc9b9e0153489fac0025f07f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 12 13:21:57 2013 -0500
+
+    Minor
+
+ util/options.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2a8c49ade07a0bd4f2c9543f4bd129da82083ea0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 11 20:22:28 2013 -0500
+
+    Remove unnecessary includes
+
+ src/hb-blob.cc                       | 1 -
+ src/hb-buffer-private.hh             | 1 -
+ src/hb-common.cc                     | 2 --
+ src/hb-face-private.hh               | 1 -
+ src/hb-face.cc                       | 1 -
+ src/hb-font-private.hh               | 1 -
+ src/hb-font.cc                       | 1 -
+ src/hb-graphite2.cc                  | 2 --
+ src/hb-open-type-private.hh          | 2 --
+ src/hb-ot-layout-private.hh          | 2 --
+ src/hb-ot-shape-normalize-private.hh | 2 --
+ src/hb-ot-tag.cc                     | 1 -
+ src/hb-set-private.hh                | 1 -
+ src/hb-shape-plan-private.hh         | 1 -
+ src/hb-tt-font.cc                    | 2 --
+ src/hb-unicode-private.hh            | 2 --
+ 16 files changed, 23 deletions(-)
+
+commit 2646aec1e67cd6e09f5f7859c9d5898917acc2d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 5 18:19:35 2013 -0500
+
+    Drop required automake version back to 1.11.3
+
+    Work around broken automake-1.13 changes.
+
+ configure.ac             | 3 ++-
+ test/shaping/Makefile.am | 7 +++++++
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 860fc9aa7b4c49a1d50e64cfdf4d4dffadb7aa8f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 4 20:06:59 2013 -0500
+
+    0.9.25
+
+ NEWS         | 12 ++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit adb039554de0c98a4121f26423bec8df09a62e61
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 4 20:10:02 2013 -0500
+
+    Minor
+
+ util/view-cairo.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 95d18a7cab480712d8c95a587ac2a8fdcbec5e71
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 4 20:01:22 2013 -0500
+
+    [git.mk] Update
+
+ git.mk | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d913f98d88098fc0f4163dfbc54d8ca9ebe9dd81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 4 19:59:48 2013 -0500
+
+    Require automake 1.13
+
+    Fix tests build.
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=71353
+
+ configure.ac             |  2 +-
+ test/shaping/Makefile.am | 19 ++++++++++++++-----
+ 2 files changed, 15 insertions(+), 6 deletions(-)
+
+commit 205bf834d80f81471f0c3da4f400e60ce3a533dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 2 20:41:41 2013 -0500
+
+    Revert "Karen" language mapping back to what it was before
+
+    https://bugzilla.mozilla.org/show_bug.cgi?id=941470
+
+ src/hb-ot-tag.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f47b9219546edcfdeb3991ee27f6d9ba455c3e08
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 2 05:57:27 2013 -0500
+
+    Fix unsafe shape_plan->face dependency
+
+ src/hb-ot-shape-private.hh   |  2 +-
+ src/hb-shape-plan-private.hh |  2 +-
+ src/hb-shape-plan.cc         | 12 +++---------
+ 3 files changed, 5 insertions(+), 11 deletions(-)
+
+commit c704a8700e169885f1d9cbab93544d85aa4358e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 2 05:42:04 2013 -0500
+
+    [util] Fix uninitialized memory access
+
+ util/view-cairo.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 260a3198f44a4ece60864b6f6caab2ee756ad762
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 2 05:39:39 2013 -0500
+
+    [util] Plug leak
+
+ util/options.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit ca8d96c8ba33ce581684cbc07936a3696b6c83d9
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Mon Dec 2 05:22:00 2013 -0500
+
+    cache shape plans even if (global) user features are set
+
+ src/hb-shape-plan-private.hh |  3 +++
+ src/hb-shape-plan.cc         | 59
+ ++++++++++++++++++++++++++++++++++++++++----
+ 2 files changed, 57 insertions(+), 5 deletions(-)
+
+commit 8ffa528f28a24ae85952ad1c1b0206e736bcfeab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 2 05:17:14 2013 -0500
+
+    Add note about unsafe shape_plan->face
+
+    Will fix by removing shape_plan->face completely.
+
+ src/hb-shape-plan.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit aec468f01e866c99e65a8f764a792c74c96840d7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 29 19:21:58 2013 -0500
+
+    [coretext] Add TODO
+
+ src/hb-coretext.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 58cc233e8b5fdc9dce603acc1b968540a2dea3e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 29 19:17:42 2013 -0500
+
+    [coretext] Cleanup
+
+ src/hb-coretext.cc | 27 ++++++++++++++++-----------
+ 1 file changed, 16 insertions(+), 11 deletions(-)
+
+commit c8213c6198abff97822e29a6d565722cfbb43832
+Author: Khaled Hosny <khaledhosny.eglug.org>
+Date:   Fri Nov 29 19:01:56 2013 -0500
+
+    [coretext] Avoid font fallback with CoreText shaper
+
+    CoreText does automatic font fallback (AKA "cascading") for
+    characters
+    not supported by the requested font, and provides no way to turn
+    it off,
+    so detect if the returned run uses a font other than the requested one
+    and fill in the buffer with .notdef glyphs instead of random indices
+    glyph from a different font.
+
+ src/hb-coretext.cc | 35 +++++++++++++++++++++++++++++++++++
+ 1 file changed, 35 insertions(+)
+
+commit 63bae73aefb0e5988ef6975f1ed38e040e50e91d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 26 22:57:24 2013 -0500
+
+    [fallback] Add TODO note
+
+ src/hb-fallback-shape.cc | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit e1ebf01d0cf3df55bb9137136e2d0c9630e7bd78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 26 18:00:35 2013 -0500
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a182dbc9e4e51fa7990c4aea3eaa425a061b29c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 26 17:53:41 2013 -0500
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 9174a9db5c4e01284143ed8bd318ce9454535987
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 25 18:10:38 2013 -0500
+
+    [myanmar] Allow punctuation clusters
+
+    The spec and Uniscribe don't allow these, but UTN#11
+    specifically says the sequence U+104B,U+1038 is valid.
+    As such, allow all "P V" sequences.  There's about
+    eight sequences that match that structure, but Roozbeh
+    thinks it's fine to allow all of them.
+
+    Test case: U+104B, U+1038
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=71947
+
+ src/hb-ot-shape-complex-myanmar-machine.rl |  3 +++
+ src/hb-ot-shape-complex-myanmar.cc         | 19 ++++++++++++++++++-
+ 2 files changed, 21 insertions(+), 1 deletion(-)
+
+commit 096b71e8ef0c1443f3f86069d5416b887af6e9e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 25 18:03:34 2013 -0500
+
+    [myanmar] Mark U+104E MYANMAR SYMBOL AFOREMENTIONED as Consonant
+
+    The spec and Uniscribe treat it as consonant in the grammar, but
+    it's not in IndicSyllableCategory.txt, so fix up.
+
+    Test sequence: U+1004,U+103A,U+1039,U+104E
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=71948
+
+ src/hb-ot-shape-complex-myanmar.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit d2da5e0b4b4ffc1722403ffb90b8777cfa1cd174
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 25 17:50:07 2013 -0500
+
+    [myanmar] Relax pwo-tone group a bit
+
+    This is broken sequence according to OpenType spec, Uniscribe,
+    and current HarfBuzz implementation.  But Roozbeh says this
+    is a valid sequence, so allow it.  There are multiple
+    "(DB As?)?" constructs in the grammar, but Roozbeh thinks only
+    this one needs changing.
+
+    Test case: 1014,1063,103A
+
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=71949
+
+ src/hb-ot-shape-complex-myanmar-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9af91ca8ffee4a8d2804eff5d380b4f9749414d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 25 17:47:19 2013 -0500
+
+    Add more Myanmar test cases
+
+    All three are broken right now according to Roozbeh.
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=71947
+    https://bugs.freedesktop.org/show_bug.cgi?id=71948
+    https://bugs.freedesktop.org/show_bug.cgi?id=71949
+
+ .../shaping/texts/in-tree/shaper-myanmar/script-myanmar/misc/misc.txt |
+ 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 08c2d27d35093e07142168665139274ac99395e8
+Author: Roozbeh Pournader <roozbeh@google.com>
+Date:   Sat Nov 23 21:39:31 2013 -0800
+
+    Added support for several new languages
+
+    Based on research into latest SIL and Windows fonts, pulling in
+    the latest OpenType language tag proposal from Microsoft, and updating
+    to latest language tags and names from ISO 639.
+
+ src/hb-ot-tag.cc | 314
+ +++++++++++++++++++++++++++++++++++++++++++------------
+ 1 file changed, 247 insertions(+), 67 deletions(-)
+
+commit 05511acd198d0c2157cdb41e1d36eac0b8075357
+Author: Roozbeh Pournader <roozbeh@google.com>
+Date:   Sat Nov 23 15:19:07 2013 -0800
+
+    Added language tags for S'gaw Karen and Khamti
+
+    Tags based on support in Windows 8.1's 'Myanmar Text' font.
+
+ src/hb-ot-tag.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 0bb31e4497523442fbb26bbd55b194ab70205ca4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 20 14:21:07 2013 -0500
+
+    Bug 71845 - Use 64-bit cmpexch on ARM64 iOS
+
+ src/hb-atomic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 02c6c8cd6e8c93b63c75b25de6bf76bb45755bb4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 15 13:05:38 2013 -0500
+
+    Set buffer content type to INVALID in hb_buffer_set_length(0)
+
+    Previously we were only setting this in hb_buffer_clear_contents(),
+    but set_length(0) is a valid way to reinitialize buffer to use with
+    new text.
+
+ src/hb-buffer-private.hh | 2 +-
+ src/hb-buffer.cc         | 3 +++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 6300694f6e531593e7e932000f9540b0367940b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 13 14:54:07 2013 -0500
+
+    0.9.24
+
+ NEWS         | 8 ++++++++
+ configure.ac | 2 +-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 061cb4649342b005fb1de93abae25e889cc560bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 13 14:50:25 2013 -0500
+
+    Use long alignment for scratch buffer
+
+    Fixes last of scratch alignment warnings in hb-coretext.
+
+ src/hb-buffer-private.hh | 2 +-
+ src/hb-buffer.cc         | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 68c372ed2eac76a6d347811293fe2ba2fd6a1eed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 13 14:44:01 2013 -0500
+
+    More scratch-buffer cleanup
+
+ src/hb-buffer-private.hh |  3 ++-
+ src/hb-buffer.cc         | 10 +++++-----
+ src/hb-coretext.cc       |  5 ++---
+ src/hb-graphite2.cc      |  2 +-
+ src/hb-uniscribe.cc      | 30 ++++++++++++++----------------
+ 5 files changed, 24 insertions(+), 26 deletions(-)
+
+commit 8fcadb9cf9418345610e3f4e38c28c12b768b589
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 13 14:33:57 2013 -0500
+
+    [coretext] More scratch buffer fixes
+
+ src/hb-coretext.cc | 25 +++++++++++++------------
+ 1 file changed, 13 insertions(+), 12 deletions(-)
+
+commit 16f175cb2e081e605fe7f9cd01bbe8c24380278a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 12 17:22:49 2013 -0500
+
+    Fix scratch-buffer alignment warnings
+
+ src/hb-buffer-private.hh |  2 +-
+ src/hb-buffer.cc         |  9 +++++----
+ src/hb-coretext.cc       | 17 ++++++++++-------
+ src/hb-graphite2.cc      | 28 +++++++++++++++++-----------
+ src/hb-private.hh        |  3 +++
+ src/hb-uniscribe.cc      | 29 +++++++++++++++++------------
+ 6 files changed, 53 insertions(+), 35 deletions(-)
+
+commit c7c4ccf8a1e784b6f8798388a219dda9a26fbd93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 12 15:41:22 2013 -0500
+
+    [travis] Enable graphite2
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 83408cf804a6908873c41b70bb7c43448e66ddd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 6 14:46:04 2013 -0500
+
+    Fix llvm warnings on Mac
+
+    Patch from Scott Fleischman.  Warnings were:
+
+    harfbuzz/src/hb-font-private.hh:121:42: Implicit conversion loses
+    integer precision: 'long long' to 'hb_position_t' (aka 'int')
+    harfbuzz/src/hb-font-private.hh:126:42: Implicit conversion loses
+    integer precision: 'long long' to 'hb_position_t' (aka 'int')
+    harfbuzz/src/hb-font-private.hh:400:85: Implicit conversion loses
+    integer precision: 'long long' to 'hb_position_t' (aka 'int')
+    harfbuzz/src/hb-ot-layout-common-private.hh:1115:37: Implicit
+    conversion
+    loses integer precision: 'long long' to 'int'
+    harfbuzz/src/hb-ft.cc:421:97: Implicit conversion loses integer
+    precision: 'unsigned long long' to 'int'
+    harfbuzz/src/hb-ft.cc:422:97: Implicit conversion loses integer
+    precision: 'unsigned long long' to 'int'
+
+ src/hb-font-private.hh             | 6 +++---
+ src/hb-ft.cc                       | 4 ++--
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 333cc6e2d11831bcd2370723456e678574d570ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 30 17:30:11 2013 +0000
+
+    [otlayout] Remove unused is_inplace()
+
+    Patch from Jonathan Kew.
+
+ src/hb-ot-layout-gpos-table.hh       |   6 --
+ src/hb-ot-layout-gsub-table.hh       |  56 ------------
+ src/hb-ot-layout-gsubgpos-private.hh | 159
+ -----------------------------------
+ 3 files changed, 221 deletions(-)
+
+commit 176fd17d02ac183af32a0e710ec32d25c9322021
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 30 17:27:24 2013 +0000
+
+    Bug 70971 - Signed/unsigned compiler warnings on windows
+
+    Patch from Emil Eklund.
+
+ src/hb-buffer-serialize.cc | 8 ++++----
+ src/hb-ot-map.cc           | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 3d436d325edccc0f3dd820e06e3d529cc8f3eca4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 28 21:00:37 2013 +0100
+
+    [otlayout] Reset ccc when marking glyph as letter
+
+ src/hb-ot-layout-gsubgpos-private.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit b9d0077ac1a8e8a62ee15c64ad302f7976e23bdd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 28 20:44:03 2013 +0100
+
+    Fix win32 testing
+
+ test/shaping/Makefile.am  | 1 +
+ test/shaping/run-tests.sh | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit dce79c2bd747d398bdf2f4b171b0ba9b5b951f72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 28 20:26:40 2013 +0100
+
+    0.9.23
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 2e990a3d722c10d1eefdc4c5ccbdaa384625c3fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 28 20:23:07 2013 +0100
+
+    Make "make distcheck" happy
+
+ configure.ac             | 2 +-
+ test/shaping/Makefile.am | 3 +++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 6ffc007b61402c9d1d4de368deed4971a10ed00b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 28 19:26:02 2013 +0100
+
+    [otlayout] Optimize inplace
+
+    See thread started by Jonathan with subject "an optimization for
+    complex
+    fonts".
+
+ src/hb-ot-layout.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 71b4c999a511bf018acaf48a45e070470c0daf12
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 28 00:20:59 2013 +0100
+
+    Revert "Zero marks by GDEF for Tibetan"
+
+    This reverts commit d5bd0590ae2fbc7b0dee86385a565aef00ffb835.
+
+    The reasoning behind that logic was flawed and made under
+    a misunderstanding of the original problem, and caused
+    regressions as reported by Jonathan Kew in thread titled
+    "tibetan marks" in Oct 2013.  Apparently I have had fixed
+    the original problem with this commit:
+
+      7e08f1258da229dfaf7e1c4b5c41e5bb83906cb0
+
+    So, revert the faulty commit and everything seems to be in good
+    shape.
+
+ src/hb-ot-layout-gsubgpos-private.hh |  4 ++--
+ src/hb-ot-shape-complex-arabic.cc    | 10 +++-------
+ src/hb-ot-shape-complex-default.cc   | 17 +----------------
+ src/hb-ot-shape-complex-indic.cc     |  8 +-------
+ src/hb-ot-shape-complex-myanmar.cc   | 15 +++++----------
+ src/hb-ot-shape-complex-private.hh   |  8 ++------
+ src/hb-ot-shape-complex-sea.cc       | 14 ++++----------
+ src/hb-ot-shape-complex-thai.cc      |  9 +--------
+ src/hb-ot-shape.cc                   |  4 ++--
+ 9 files changed, 21 insertions(+), 68 deletions(-)
+
+commit 9596b2bf569dae6fbe268803e3cb248001f10954
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 28 00:09:05 2013 +0100
+
+    Pass CPPFLAGS=-Werror to Travis-CI
+
+    We want default gcc / clang warnings to fail the CI build.
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c77d1ade6898cea161f0709c5c5a912e14aff951
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 27 23:52:26 2013 +0100
+
+    Fix warnings
+
+ test/api/test-blob.c      | 2 +-
+ util/helper-cairo-ansi.cc | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit c2bc818706df56022c8bb922df2b741cb120f7e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 27 23:36:35 2013 +0100
+
+    Work with old and new glib
+
+    Avoids "deprecated" warnings.
+
+ src/test-buffer-serialize.cc | 7 +++++--
+ src/test-size-params.cc      | 7 +++++--
+ src/test-would-substitute.cc | 7 +++++--
+ src/test.cc                  | 7 +++++--
+ util/options.cc              | 4 ++--
+ util/options.hh              | 4 ++++
+ util/view-cairo.hh           | 4 ++++
+ 7 files changed, 30 insertions(+), 10 deletions(-)
+
+commit 46a863d91dbcc9a4c796e3715ea3828939f4d941
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 27 23:24:50 2013 +0100
+
+    [indic] Adjust pref reordering logic
+
+    For Javanese (pref_len == 1) only reorder if it didn't ligate.  That's
+    sensible, and what the spec says.  For other Indic (pref_len > 1)
+    only reorder if ligated.
+
+    Doesn't change any test numbers.
+
+ src/hb-ot-shape-complex-indic.cc | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 6b03e3c724ec6cd255f4a323bf4aa7d8c93a056e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 27 21:04:55 2013 +0100
+
+    Optimize fallback kerning
+
+    Patch from Jonathan Kew.  "These changes seem to yield a small but
+    just-about-measurable improvement with old fonts that lack GPOS
+    kerning."
+
+ src/hb-ot-shape-fallback.cc | 47
+ ++++++++++++++++++++++++++++-----------------
+ 1 file changed, 29 insertions(+), 18 deletions(-)
+
+commit 133eeba6a32769ec1a7520e7c8a0d2eb1ad986f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 27 00:24:59 2013 +0200
+
+    Minor
+
+    See:
+    https://github.com/prezi/harfbuzz-js/pull/1/files#r7032397
+
+ src/hb-common.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a74f0de225c403998212e2618dcf9452bc5b590d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 24 11:46:33 2013 +0200
+
+    [indic] Fix CM2, really
+
+    Followup from 6e613f3365bf4e9fd778758c53e7de00c64beca1.
+
+ src/hb-ot-shape-complex-indic-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6e613f3365bf4e9fd778758c53e7de00c64beca1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 23 23:34:13 2013 +0200
+
+    Fix "shift count >= width of type" issue
+
+ src/hb-ot-shape-complex-indic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ac8cd511911c7dca6222d14fa758bff75d601567
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 19:33:09 2013 +0200
+
+    Refactor
+
+ src/hb-ot-layout-gpos-table.hh | 120
+ ++++++++++++++++++++++-------------------
+ src/hb-ot-layout.cc            |  31 +++++------
+ src/hb-ot-shape-normalize.cc   |  29 +++++-----
+ src/hb-ot-shape.cc             |  82 ++++++++++++++++------------
+ 4 files changed, 145 insertions(+), 117 deletions(-)
+
+commit 0f3fe37fccfb540437adf13dd580f2c5164a0b1f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 19:14:22 2013 +0200
+
+    Comment
+
+ src/hb-ot-layout-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit ddce2d8df6fed9c033f1f13e235666680c5beb67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 18:07:11 2013 +0200
+
+    [indic] Improve positioning of post-base bells and whistles
+
+    Bug 58714 - Kannada u+0cb0 u+200d u+0ccd u+0c95 u+0cbe does not
+    provide
+    same results as Windows8
+    https://bugs.freedesktop.org/show_bug.cgi?id=58714
+
+    Test with U+0CB0,U+200D,U+0CCD,U+0C95,U+0CBF and tunga.ttf.
+
+    Improves some scripts.  Improves Bengali too, but numbers
+    are up because we produce better results than Uniscribe for some
+    sequences now.
+
+    New numbers:
+    BENGALI: 353724 out of 354188 tests passed. 464 failed (0.131004%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366349 out of 366457 tests passed. 108 failed (0.0294714%)
+    GURMUKHI: 60732 out of 60747 tests passed. 15 failed (0.0246926%)
+    KANNADA: 951190 out of 951913 tests passed. 723 failed (0.0759523%)
+    KHMER: 299070 out of 299124 tests passed. 54 failed (0.0180527%)
+    MALAYALAM: 1048140 out of 1048334 tests passed. 194 failed
+    (0.0185056%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%)
+    TAMIL: 1091753 out of 1091754 tests passed. 1 failed (9.15957e-05%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+ src/hb-ot-shape-complex-indic.cc | 19 ++++++++++---------
+ 1 file changed, 10 insertions(+), 9 deletions(-)
+
+commit d5bd0590ae2fbc7b0dee86385a565aef00ffb835
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 16:44:54 2013 +0200
+
+    Zero marks by GDEF for Tibetan
+
+    See:
+    http://lists.freedesktop.org/archives/harfbuzz/2013-April/003101.html
+
+ src/hb-ot-layout-gsubgpos-private.hh |  4 ++--
+ src/hb-ot-shape-complex-arabic.cc    | 10 +++++++---
+ src/hb-ot-shape-complex-default.cc   | 17 ++++++++++++++++-
+ src/hb-ot-shape-complex-indic.cc     |  8 +++++++-
+ src/hb-ot-shape-complex-myanmar.cc   | 15 ++++++++++-----
+ src/hb-ot-shape-complex-private.hh   |  8 ++++++--
+ src/hb-ot-shape-complex-sea.cc       | 14 ++++++++++----
+ src/hb-ot-shape-complex-thai.cc      |  9 ++++++++-
+ src/hb-ot-shape.cc                   |  4 ++--
+ 9 files changed, 68 insertions(+), 21 deletions(-)
+
+commit bf029281b1b0f854f671969ab40eac3046a111bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 16:20:13 2013 +0200
+
+    Bug 65258 - [...] Mongolian with free variation selector
+
+ src/hb-ot-shape-complex-arabic.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 0193649ce4ca78b8e2835a50bd51ee594cffe34e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 16:08:53 2013 +0200
+
+    [otfallback] Don't shift down above-marks too much
+
+    This seems to generate much better, almost-perfect, positioning for
+    Arabic as well as Latin above marks.
+
+ src/hb-ot-shape-fallback.cc | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit dba9580237da788275b1ab5fe6be75c8a3f359b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 15:57:36 2013 +0200
+
+    [otfallback] Never fallback-position a below-mark upwards
+
+    Test with WinXP times.ttf and U+05D9,U+05B5.
+
+ src/hb-ot-shape-fallback.cc | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 8177da29ad07d8fa444ce07003fa65cd31a2776b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 15:50:29 2013 +0200
+
+    Minor
+
+ src/hb-ot-shape-fallback.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c16012e9019ec59c2200a3cc29b8a37ea70eda70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 02:27:00 2013 +0200
+
+    [indic] Add Javanese support!
+
+    Seems to be working just fine!
+
+ src/hb-ot-shape-complex-indic-machine.rl | 14 ++++++------
+ src/hb-ot-shape-complex-indic-private.hh | 37
+ ++++++++++++++++----------------
+ src/hb-ot-shape-complex-indic.cc         |  9 ++++++--
+ 3 files changed, 34 insertions(+), 26 deletions(-)
+
+commit 755b44cce6dc23376a3cf0212893609231fa4967
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 11:17:42 2013 +0200
+
+    [ft] Round metrics instead of truncate
+
+    Lohit-Punjabi has a upem of 769!  We were losing one unit in our
+    code, and FreeType is losing another one...  Test with U+0A06.
+    Has an advance of 854 in the font.  We were producing 852.
+    Now we do 853, which is what FreeType is telling us.
+
+ src/hb-ft.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 9a49351cc2625de16a73e0e153d3097ef6c7cc0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 02:14:53 2013 +0200
+
+    [indic] Swith pref logic to use _hb_glyph_info_substituted()
+
+    See comments from caveat!  Seems to work fine.
+
+    This is useful for Javanese which has an atomically encoded pre-base
+    reordering Ra which should only be reordered if it was substituted
+    by the pref feature.
+
+ src/hb-ot-shape-complex-indic.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit f175aa33c5e94397c60648ac0697c80f5fe0dcb7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 02:07:44 2013 +0200
+
+    [indic] Fix compiler warnings
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 857027341423f15fd6084c7563cc355b06e7cbdd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 01:11:05 2013 +0200
+
+    [otlayout] Add _hb_glyph_info_substituted()
+
+    Currently unused.
+
+ src/hb-ot-layout-private.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit a1f7b2856184959e965c9c2b80363f9f46d486a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 01:09:08 2013 +0200
+
+    [otlayout] Switch over from old is_a_ligature() to IS_LIGATED
+
+    Impact should be minimal and positive.
+
+ src/hb-ot-layout-gsubgpos-private.hh |  2 +-
+ src/hb-ot-layout-private.hh          | 12 +++++++++---
+ src/hb-ot-shape-complex-indic.cc     |  4 ++--
+ src/hb-ot-shape-complex-myanmar.cc   |  2 +-
+ src/hb-ot-shape.cc                   |  2 +-
+ 5 files changed, 14 insertions(+), 8 deletions(-)
+
+commit 09675a8115b9d77261c33940401aa919cede8662
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 01:05:58 2013 +0200
+
+    [otlayout] Add HB_OT_LAYOUT_GLYPH_PROPS_LIGATED
+
+    Currently unused.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 15 ++++++++++-----
+ src/hb-ot-layout-private.hh          |  5 ++++-
+ 2 files changed, 14 insertions(+), 6 deletions(-)
+
+commit 05ad6b50ac0a1b9a8da10d2ee2238068b7811e7d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 00:45:59 2013 +0200
+
+    [otlayout] Add HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED
+
+    Currently unused.
+
+ src/hb-ot-layout-gsubgpos-private.hh |  5 +++--
+ src/hb-ot-layout-private.hh          | 10 ++++++----
+ 2 files changed, 9 insertions(+), 6 deletions(-)
+
+commit 101303dbf7cf15d044bf2518f14b3aec65970fea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 00:42:39 2013 +0200
+
+    [otlayout] More shuffling around
+
+ src/hb-ot-layout-gpos-table.hh       | 16 +++----
+ src/hb-ot-layout-gsub-table.hh       | 13 +++--
+ src/hb-ot-layout-gsubgpos-private.hh |  8 ++--
+ src/hb-ot-layout-private.hh          | 92
+ ++++++++++++++++++++++++++++++++----
+ src/hb-ot-shape.cc                   |  8 ++--
+ 5 files changed, 102 insertions(+), 35 deletions(-)
+
+commit 91689de2603e4151e2a2d3a3852c61667f0c6264
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 00:21:59 2013 +0200
+
+    [otlayout] Add _hb_glyph_info_set_glyph_props()
+
+    No functional change.
+
+ src/hb-ot-layout-gsub-table.hh       | 2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 4 ++--
+ src/hb-ot-layout-private.hh          | 9 +++++++++
+ src/hb-ot-shape.cc                   | 8 +++++---
+ 4 files changed, 17 insertions(+), 6 deletions(-)
+
+commit a0161746589934e93c3b115814bbd81f56ab962f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 00:06:30 2013 +0200
+
+    [otlayout] Simplify set_class() usage
+
+ src/hb-ot-layout-gsubgpos-private.hh | 31 ++++++++++++++++++-------------
+ 1 file changed, 18 insertions(+), 13 deletions(-)
+
+commit 3ddf892b5328b74afb6e7d9da727d8771ca5d288
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 18 00:02:43 2013 +0200
+
+    [otlayout] Renaming
+
+ src/hb-ot-layout-gpos-table.hh       | 18 +++++++-------
+ src/hb-ot-layout-gsub-table.hh       |  2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 36 +++++++++++++--------------
+ src/hb-ot-layout-private.hh          | 48
+ +++++++++++++++++++++---------------
+ src/hb-ot-shape-complex-indic.cc     |  5 ++--
+ src/hb-ot-shape-complex-myanmar.cc   |  2 +-
+ src/hb-ot-shape-fallback.cc          |  8 +++---
+ src/hb-ot-shape.cc                   |  2 +-
+ 8 files changed, 65 insertions(+), 56 deletions(-)
+
+commit 2e96d2c6ee34142375373be07217c9953e7822cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 21:16:20 2013 +0200
+
+    [otlayout] More shuffling
+
+ src/hb-ot-layout-private.hh | 252
+ +++++++++++++++++++++++---------------------
+ 1 file changed, 130 insertions(+), 122 deletions(-)
+
+commit 469524692bd0a258b28e63294c984e677a9c2477
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 21:01:57 2013 +0200
+
+    [otlayout] Code shuffling
+
+ src/hb-ot-layout-private.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 11fb16cb849285a178d9e80991b1d60a960326ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 20:57:57 2013 +0200
+
+    Use unsigned enums for mask types
+
+ src/hb-buffer.h             | 16 ++++++++--------
+ src/hb-ot-layout-private.hh |  8 ++++----
+ 2 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 03058c3d1e8c18858c1e0b0c738ce9d299f2787a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 20:55:34 2013 +0200
+
+    [otlayout] Remove two unused HB_OT_LAYOUT_GLYPH_PROPS_* values
+
+ src/hb-ot-layout-gdef-table.hh | 1 -
+ src/hb-ot-layout-gsub-table.hh | 3 ++-
+ src/hb-ot-layout-private.hh    | 7 +++++--
+ 3 files changed, 7 insertions(+), 4 deletions(-)
+
+commit 941b6992042e7b73b3a2aab1448383adf33bef28
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 20:47:33 2013 +0200
+
+    [otlayout] Remove unused HB_OT_LAYOUT_GLYPH_PROPS_UNCLASSIFIED
+
+ src/hb-ot-layout-gdef-table.hh |  7 +++++--
+ src/hb-ot-layout-private.hh    | 10 ++++------
+ 2 files changed, 9 insertions(+), 8 deletions(-)
+
+commit 8f9ec92dfce5c469fb85ad301296b5dde1b2ab0a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 19:52:47 2013 +0200
+
+    [indic] Adjust Javanese base algorithm
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 49901862e36e1c153835877a9f1183729333bbbe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 19:48:51 2013 +0200
+
+    [otlayout] Guard against use of ReverseChain through Context
+
+ src/hb-ot-layout-gsub-table.hh | 4 +++-
+ src/hb-ot-layout.cc            | 4 ++--
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit 74f4bbf0560a5fd2d295e100e96f0c6c7033e852
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 19:07:53 2013 +0200
+
+    [indic] Towards supporting atomicly-encoded prebase-reorderings
+
+ src/hb-ot-shape-complex-indic.cc | 65
+ ++++++++++++++++++++++++----------------
+ 1 file changed, 40 insertions(+), 25 deletions(-)
+
+commit efed40b975110d78c9c505441e7e17a8c13e85c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 18:50:11 2013 +0200
+
+    [indic] Minor refactoring of reph handling
+
+ src/hb-ot-shape-complex-indic.cc | 14 ++++++++------
+ src/hb-ot-shape-complex-sea.cc   |  2 +-
+ 2 files changed, 9 insertions(+), 7 deletions(-)
+
+commit 684fe59ff858a0ecba71b3ed80378afb0b8bbb48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 18:30:06 2013 +0200
+
+    [indic] Minor refactoring of would_substitute()
+
+ src/hb-ot-shape-complex-indic.cc | 19 ++++++++++---------
+ 1 file changed, 10 insertions(+), 9 deletions(-)
+
+commit 321df83fb4f0b8a5310888129cb70bfda8ae0c96
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 18:16:14 2013 +0200
+
+    Route Buginese through the SEA shaper
+
+    Both Indic and SEA seem to do it just fine, but SEA is much
+    simpler.
+
+ src/hb-ot-shape-complex-private.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit b5a0f69e47ace468b06e21cf069a18ddcfcf6064
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 18:04:23 2013 +0200
+
+    [indic] Pass zero-context=false to would_substitute for newer scripts
+
+    For scripts without an old/new spec distinction, use
+    zero-context=false.
+    This changes behavior in Sinhala / Khmer, but doesn't seem to regress.
+    This will be useful and used in Javanese.
+
+ src/hb-ot-shape-complex-indic.cc | 35 +++++++++++++++++++----------------
+ 1 file changed, 19 insertions(+), 16 deletions(-)
+
+commit c4e71ff36d1f86a6ea56539728a964d97217e2b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 17:04:47 2013 +0200
+
+    [indic] Clean up Khmer and Sinhala base finding algorithm
+
+ src/hb-ot-shape-complex-indic.cc | 24 +++++++++++-------------
+ 1 file changed, 11 insertions(+), 13 deletions(-)
+
+commit e10453e6fb2544724ccd7ddfdbb9de90ef9274ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 16:49:06 2013 +0200
+
+    [indic] Add BASE_POS_LAST_SINHALA
+
+    Previously we planted this into the mode used for Khmer.  There's not
+    really much in common between the two, so separate again.
+
+ src/hb-ot-shape-complex-indic.cc | 21 +++++++++++++++++++--
+ 1 file changed, 19 insertions(+), 2 deletions(-)
+
+commit 9ac6b01e0cd8e2d66dfc727157f45b615bc77109
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 16:27:38 2013 +0200
+
+    [indic] Adjust Sinhala cluster merging under uniscribe
+
+    Similar to 190c8f2b60af0851bf692f653c1604cfbf0561a5 but for
+    Sinhala.
+
+ src/hb-ot-shape-complex-indic.cc | 23 ++++++++++++++++-------
+ 1 file changed, 16 insertions(+), 7 deletions(-)
+
+commit 3c3df9cba13fec2c35e0e7ae587d9699ac0c37f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 13:58:31 2013 +0200
+
+    [otlayout] Minor
+
+ src/hb-ot-layout-gsubgpos-private.hh | 62
+ +++++++++++++++++++-----------------
+ 1 file changed, 33 insertions(+), 29 deletions(-)
+
+commit 6cc136f7531a45e71ea08a7dc8a2187172cb813d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 13:55:48 2013 +0200
+
+    [otlayout] Minor
+
+ src/hb-ot-layout-gsubgpos-private.hh | 14 ++++++--------
+ 1 file changed, 6 insertions(+), 8 deletions(-)
+
+commit ba6ddc421e5e440231c2ece2db1363f8e6d2ecbf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 13:52:51 2013 +0200
+
+    [otlayout] Increase MAX_CONTEXT_LENGTH
+
+    It's cheap.
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e714fe6d6a2633494cb1fa7170a32ca2638cbb51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 13:49:51 2013 +0200
+
+    [otlayout] Simplify ligate_input()
+
+    Shouldn't change behavior at all, but is faster / more robust.
+
+ src/hb-ot-layout-gsub-table.hh       | 16 +++++++---------
+ src/hb-ot-layout-gsubgpos-private.hh | 17 +++++++----------
+ 2 files changed, 14 insertions(+), 19 deletions(-)
+
+commit 6b2abdcd203204131f3017ca85c91de9d43959cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 13:15:43 2013 +0200
+
+    [indic] Improve clusters in presence of reph
+
+ src/hb-ot-shape-complex-indic.cc | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit 42d0f55cbc68285e22d713df7062e520af708c82
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 13:05:05 2013 +0200
+
+    [indic] Apply calt,clig in the same stage as presentation features
+
+    Whic means these twp are applied per-syllable now.  Apparently
+    in some Khmer fonts the clig interacts with presentation features.
+
+    Test case: U+1781,U+17D2,U+1789,U+17BB,U+17C6 with Mondulkiri-R.ttf
+    should produce one big ligature.
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit ae9a5834df477006686421d494b55a1569789327
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 12:24:55 2013 +0200
+
+    [indic] Fix pref vs blwf interaction
+
+    If a glyph can be both blwf and pref, we were wrongly sorting it
+    in the post position instead of below position.
+
+ src/hb-ot-shape-complex-indic.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit c7dacac02cfe8526eaf131ce6c5e7b6df7ca2ccd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 12:20:24 2013 +0200
+
+    [indic] Don't apply blwf before base under old-spec mode
+
+    Test case: U+09AC,U+09CD,U+09A6 with Lohit-Bengali 2.5.3.
+
+ src/hb-ot-shape-complex-indic.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit da72042c52ed3cc0ee19d3eabb8db7c7dd34d3ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 17 12:01:50 2013 +0200
+
+    [otlayout] Fix up recent Context matching change
+
+    Commit 6b65a76b40522a4f57a6fedcbdfc5a4d736f1d3c.  "end" was becoming
+    negative.  Was trigerred by Lohit-Kannada 2.5.3 and the sequence:
+    U+0CB0,U+200D,U+0CBE,U+0CB7,U+0CCD,U+0C9F,U+0CCD,U+0CB0,U+0C97,U+0CB3
+    Two glyphs were being duplicated.
+
+ src/hb-buffer.cc                     | 7 ++++++-
+ src/hb-ot-layout-gsubgpos-private.hh | 3 ++-
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+commit 1a7de1ba9876b0554c758acbc6459366d9d98a5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 16 19:55:06 2013 +0200
+
+    [indic] Improve Avagraha support in machine
+
+ src/hb-ot-shape-complex-indic-machine.rl | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 3756efaf4e14ec3b5b1def700a1b5985f162372b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 16 19:06:29 2013 +0200
+
+    [indic] Misc harmless fixes!
+
+    First, we were abusing OT_VD instead of OT_A.  Fix that
+    but moving OT_A in the grammar where it belongs (which
+    is different from what the spec says).
+
+    Also, only allow medial consonants after all other
+    consonants.  This doesn't affect any current character.
+
+    Finally, fix Halant attachment in presence of medial
+    consonants.  Again, this currently doesn't affect any
+    sequence.
+
+    I lied.  There's Gurmukhi U+0A75 which is Consonant_Medial.
+    Uniscribe allows one of those in each of these positions:
+    before matras, after matras and before syllable modifiers,
+    and after syllable modifiers!  We currently just allow
+    unlimited numbers of it, before matras.
+
+ src/hb-ot-shape-complex-indic-machine.rl |  8 ++++----
+ src/hb-ot-shape-complex-indic-private.hh |  2 +-
+ src/hb-ot-shape-complex-indic.cc         | 11 ++++++-----
+ 3 files changed, 11 insertions(+), 10 deletions(-)
+
+commit c52ddab72e025d1bee8274c8f3416208b12f68f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 16 13:42:38 2013 +0200
+
+    [arabic] Make ZWJ prevent ligatures instead of facilitating it
+
+    Unicode 6.2.0 Section 16.2 / Figure 16.3 says:
+
+    "For backward compatibility, between Arabic characters a ZWJ acts just
+    like the sequence <ZWJ, ZWNJ, ZWJ>, preventing a ligature from forming
+    instead of requesting the use of a ligature that would not normally be
+    used. As a result, there is no plain text mechanism for requesting the
+    use of a ligature in Arabic text."
+
+    As such, we flip internal zwj to zwnj flags for GSUB matching, which
+    means it will block ligation in all features, unless the font
+    explicitly matches U+200D glyph.  This doesn't affect joining
+    behavior.
+
+ src/hb-ot-layout-private.hh       |  6 ++++++
+ src/hb-ot-shape-complex-arabic.cc | 18 ++++++++++++++++++
+ 2 files changed, 24 insertions(+)
+
+commit 1a31f9f820c4538015ddaf4ca2b790649c5997ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 16 13:42:18 2013 +0200
+
+    [otlayout] Minor
+
+ src/hb-ot-layout-private.hh | 23 +++++++++++++++--------
+ 1 file changed, 15 insertions(+), 8 deletions(-)
+
+commit 28d5daec948e1a24f13e492ce301aeb9abff37c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 16 12:32:12 2013 +0200
+
+    [indic] More granular post-base cluster merging!
+
+ src/hb-ot-shape-complex-indic.cc | 45
+ ++++++++++++++++++++++++++++++++++------
+ 1 file changed, 39 insertions(+), 6 deletions(-)
+
+commit 9cb59d460e80d769087045535a8d54ec9ed7985c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 16 11:34:07 2013 +0200
+
+    [indic] Fix cluster merging of left matras
+
+    The merge_clusters there was totally broken.
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 190c8f2b60af0851bf692f653c1604cfbf0561a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 16 11:33:18 2013 +0200
+
+    [indic] Adjust cluster merging under uniscribe mode for Tamil
+
+    Apparently Uniscribe Tamil shaper doesn't ship chubby clusters
+    for Tamil.  Adjust to that.
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5c558877da5db8c734ba072f01e5e4797876619c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 16 11:14:15 2013 +0200
+
+    [indic] Allow up to two syllable modifiers
+
+    Bug 70509 - Candrabindu+Visarga doesn't work in Devanagari
+    https://bugs.freedesktop.org/show_bug.cgi?id=70509
+
+    We categorize both bindus and visarga as syllable-modifiers.
+    OT spec doesn't actually say what characters go in the syllable
+    modifier category, and allows one.  We just allow up to two now.
+
+    Test case: U+0930,U+0941,U+0901,U+0903
+
+    Uniscribe currently doesn't support that and produces a
+    dotted circle.
+
+ src/hb-ot-shape-complex-indic-machine.rl                                |
+ 2 +-
+ .../texts/in-tree/shaper-indic/indic/script-devanagari/misc/misc.txt    |
+ 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit f5299eff5c0065d6329cd536c0ac339abea085b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 15 18:13:07 2013 +0200
+
+    [indic] Simplify reph logic
+
+    *Shouldn't* break anything.
+
+ src/hb-ot-shape-complex-indic.cc | 11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+commit 65a929b1c033e91919c931b495a775f76b6dcbb3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 15 18:08:05 2013 +0200
+
+    [indic] If Malayalam dot-reph formed a ligature, don't move it
+
+    Rachana-0.6 implements dot-reph by ligation, so we shouldn't move it.
+    Uniscribe doesn't either.  Test case:
+
+      U+0D4E,U+0D1A,U+0D4D,U+0D1A,U+0D4D
+
+ src/hb-ot-shape-complex-indic.cc                   | 23
+ ++++++++++++++++------
+ .../indic/script-malayalam/misc/dot-reph.txt       |  3 +++
+ 2 files changed, 20 insertions(+), 6 deletions(-)
+
+commit a01cbf6cbe0021722302cfb58fb638a0a2427b26
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 15 16:37:53 2013 +0200
+
+    [indic] Harmless reordering of Khmer features!
+
+ src/hb-ot-shape-complex-indic.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit c46f406973024051877e867b93614942ff80c107
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 15 16:24:21 2013 +0200
+
+    [tests] Remove Myanmar micro-font and test
+
+ .../sha1sum/ceadd106a8205214fbe7337ef9de32a862b59762.ttf | Bin 3040 ->
+ 0 bytes
+ test/shaping/tests/context-matching.tests                |   1 -
+ 2 files changed, 1 deletion(-)
+
+commit eb10233b267909dee0245f126000e117f3b21c35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 15 15:26:44 2013 +0200
+
+    [indic] Apply 'kern' for all scripts except for Khmer in Uniscribe
+    mode
+
+    Seems to better match Uniscribe.
+
+    Note: NotoSansTelugu-Regular has kern feature, so this fixes most
+    of the
+    positioning failures there, except for the kern pairs blocked by a
+    (non-)joiner, in which case we (correctly) kern, but Uniscribe
+    doesn't.
+
+ src/hb-ot-shape-complex-indic.cc | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 30145272a7d428bc62a903388bd7be43f4da7fc3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 15 13:47:27 2013 +0200
+
+    [indic] Don't apply presentation features across syllables
+
+    More like Uniscribe...  We still allow user-defined features to
+    work across syllables, but not pres,blws,abs,psts,etc.
+
+    This "regressed" Sinhala numbers by 11.  These are cases were
+    there's Consonant followed by Ra,Halant,ZWJ at the of text.
+    The Ra,Halant,ZWJ ends up forming reph, which is wrong...
+    But before we were also ligating that reph with the previous
+    consonant.  That's even more wrong.  That's also what Uniscribe
+    does.
+
+    Current numbers:
+
+    BENGALI: 353732 out of 354188 tests passed. 456 failed (0.128745%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366349 out of 366457 tests passed. 108 failed (0.0294714%)
+    GURMUKHI: 60732 out of 60747 tests passed. 15 failed (0.0246926%)
+    KANNADA: 951030 out of 951913 tests passed. 883 failed (0.0927606%)
+    KHMER: 299070 out of 299124 tests passed. 54 failed (0.0180527%)
+    MALAYALAM: 1048140 out of 1048334 tests passed. 194 failed
+    (0.0185056%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271655 out of 271847 tests passed. 192 failed (0.070628%)
+    TAMIL: 1091753 out of 1091754 tests passed. 1 failed (9.15957e-05%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+ src/hb-ot-shape-complex-indic.cc                    | 21
+ +++++++++++++++++----
+ .../shaper-indic/indic/script-sinhala/misc/misc.txt |  1 +
+ 2 files changed, 18 insertions(+), 4 deletions(-)
+
+commit 3c7b3641cfb00f2c4dcc0768b9854e4f4410d15f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 15 11:21:01 2013 +0200
+
+    [indic] Handle Avagraha
+
+    It can come either at the end(ish!) of the syllable, or independently.
+    When independent, it accepts a few bits and pieces.
+
+ src/hb-ot-shape-complex-indic-machine.rl                   |  5 ++++-
+ src/hb-ot-shape-complex-indic-private.hh                   |  5 +++--
+ src/hb-ot-shape-complex-indic.cc                           | 14
+ +++++++++++++-
+ .../shaper-indic/indic/script-devanagari/misc/misc.txt     |  1 +
+ .../in-tree/shaper-indic/indic/script-telugu/misc/misc.txt |  1 +
+ 5 files changed, 22 insertions(+), 4 deletions(-)
+
+commit 5e7432b8172473aa4dda3d51a79add9e97c2d2c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 15 12:28:23 2013 +0200
+
+    [myanmar] Apply abvm/blwm
+
+ src/hb-ot-shape-complex-myanmar.cc | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 8acbb6be271817c12d2ee0066b355e2fb0f9a934
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 15 12:15:49 2013 +0200
+
+    [indic] Some scripts like blwf applied to pre-base characters
+
+    ...while some don't!
+
+    Improved Bengali, Devanagari, Gurmukhi, Malayalam.
+
+    Updated numbers:
+
+    BENGALI: 353732 out of 354188 tests passed. 456 failed (0.128745%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366349 out of 366457 tests passed. 108 failed (0.0294714%)
+    GURMUKHI: 60732 out of 60747 tests passed. 15 failed (0.0246926%)
+    KANNADA: 951030 out of 951913 tests passed. 883 failed (0.0927606%)
+    KHMER: 299070 out of 299124 tests passed. 54 failed (0.0180527%)
+    MALAYALAM: 1048134 out of 1048334 tests passed. 200 failed
+    (0.0190779%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271666 out of 271847 tests passed. 181 failed (0.0665816%)
+    TAMIL: 1091753 out of 1091754 tests passed. 1 failed (9.15957e-05%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+ src/hb-ot-shape-complex-indic.cc | 33 ++++++++++++++++++++-------------
+ 1 file changed, 20 insertions(+), 13 deletions(-)
+
+commit 2c85a3df0983f28aed77a0ea3bf2417ef65d4b84
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 14 19:41:52 2013 +0200
+
+    Fix issue with automake
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6b65a76b40522a4f57a6fedcbdfc5a4d736f1d3c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 14 18:51:39 2013 +0200
+
+    [otlayout] Fix (Chain)Context recursion!
+
+    Previously we only supported recursive sublookups with
+    ascending indices.  We were also not correctly handling
+    non-1-to-1 recursed lookups.
+
+    Fix all that!
+
+    Fixes the three tests in test/shaping/tests/context-matching.tests,
+    which were derived from NotoSansBengali and NotoSansDevanagari
+    among others.
+
+ src/hb-buffer-private.hh             |   4 +
+ src/hb-buffer.cc                     |  46 ++++++++++
+ src/hb-ot-layout-common-private.hh   |   1 +
+ src/hb-ot-layout-gsub-table.hh       |   1 +
+ src/hb-ot-layout-gsubgpos-private.hh | 157
+ +++++++++++++++++------------------
+ 5 files changed, 127 insertions(+), 82 deletions(-)
+
+commit 841e20d083aec8d814cd8d90aa6ab60127c0d1f2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 14 18:47:51 2013 +0200
+
+    Add test suite for shaping results
+
+    The new test suite runs tests included under
+    hb/test/shaping/tests/*.tests, which themselves reference
+    font files stored by sha1sum under hb/test/shaping/fonts/sha1sum.
+    The fonts are produced using a subsetter to only include glyphs
+    needed to run the test.
+
+    Four initial tests are added for (Chain)Context matching,
+    of which three currently fail.
+
+ test/shaping/Makefile.am                           |  10 +++++-
+ .../4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf   | Bin 0 -> 1320 bytes
+ .../ceadd106a8205214fbe7337ef9de32a862b59762.ttf   | Bin 0 -> 3040 bytes
+ .../d629e7fedc0b350222d7987345fe61613fa3929a.ttf   | Bin 0 -> 1768 bytes
+ .../f499fbc23865022234775c43503bba2e63978fe1.ttf   | Bin 0 -> 3564 bytes
+ test/shaping/run-tests.sh                          |  34
+ +++++++++++++++++++++
+ test/shaping/tests/MANIFEST                        |   1 +
+ test/shaping/tests/context-matching.tests          |   4 +++
+ 8 files changed, 48 insertions(+), 1 deletion(-)
+
+commit e2dab69291a5d86fc90a8c273c458c16574eafb5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 14 16:44:44 2013 +0200
+
+    Minor
+
+ test/shaping/hb_test_tools.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4e6e53db5da0a5da87ae732c3f9d01babf4ae6c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 14 13:06:36 2013 +0200
+
+    [otlayout] "Minor"
+
+ src/hb-ot-layout.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 9326d48e4309901e7e0b0e15230936a21ee3df72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 10 20:04:42 2013 +0200
+
+    Don't use g_mapped_file_unref()
+
+    Was introduced in glib 2.22.
+
+ src/test-buffer-serialize.cc | 2 +-
+ src/test-size-params.cc      | 2 +-
+ src/test-would-substitute.cc | 2 +-
+ src/test.cc                  | 2 +-
+ util/options.cc              | 4 ++--
+ 5 files changed, 6 insertions(+), 6 deletions(-)
+
+commit e152d1a27891bd1d9d46a9c028c026843bad384a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 3 15:09:37 2013 -0400
+
+    0.9.22
+
+ NEWS         | 13 +++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit 27674b4bb351e501373bd9994e4ba6546e465cf7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 3 14:54:50 2013 -0400
+
+    [OTLayout] Protect against out-of-range lookup indices
+
+    Filter them out when compiling map.
+
+ src/hb-ot-layout.cc | 17 +++++++++++++++++
+ src/hb-ot-layout.h  |  5 +++++
+ src/hb-ot-map.cc    |  8 +++++++-
+ 3 files changed, 29 insertions(+), 1 deletion(-)
+
+commit 6b4fdded94b7efb96c6e41cca4350878ed859ff1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 30 13:48:19 2013 -0400
+
+    Update git.mk
+
+ git.mk | 20 +++++++++++++-------
+ 1 file changed, 13 insertions(+), 7 deletions(-)
+
+commit 2a2b5b89ef3a606ba2996bc89fd1c577a6c98f40
+Author: M1cha <sigmaepsilon92@gmail.com>
+Date:   Mon Sep 30 08:55:52 2013 +0000
+
+    Cleanup Android.mk
+    - use common src files for both static and shared libs
+    - remove empty LOCAL_SHARED_LIBRARIES
+
+ Android.mk | 58
+ +++++++++++++++++-----------------------------------------
+ 1 file changed, 17 insertions(+), 41 deletions(-)
+
+commit 622bc3d829cab84c3a4148b88f2c91fee491ef39
+Merge: 3d2c4f0c d583df1e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 29 13:31:58 2013 -0700
+
+    Merge pull request #4 from amarullz/master
+
+    Add build static library on Android.mk
+
+commit 3d2c4f0c2ff8fab4262988aad65b170e5b479b20
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 27 17:06:29 2013 -0400
+
+    Fix hiding of default_ignorables if font doesn't have space glyph
+
+    Based on patch from Jonathan Kew.  See discussion on the list.
+
+ src/hb-ot-shape.cc | 40 ++++++++++++++++++++++++++++++----------
+ 1 file changed, 30 insertions(+), 10 deletions(-)
+
+commit d583df1e78003f8f1039ad72331bf877b13d1ae5
+Author: Ahmad Amarullah <support@amarullz.com>
+Date:   Fri Sep 27 19:04:32 2013 +0700
+
+    Add build static library on Android.mk
+
+    Use UCDN instead ICU
+    HAVE Freetype
+
+ Android.mk | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 50 insertions(+)
+
+commit 078de49ca10285f6cd1452abd40f831a17af5d1a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 26 18:26:43 2013 -0400
+
+    [util] Don't use g_array_unref()
+
+    Was introduced in glib 2.22.
+
+ util/view-cairo.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 48360ec03b225dfec5f90bc5cb93122203d2dd6b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 26 16:48:42 2013 -0400
+
+    Bug 68990 - test-common fails on i686-linux
+
+    Fix use-after-end-of-scope.
+
+ src/hb-common.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit b61f97d544ce43d85f5fe93e682c324e042c0770
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 16 22:07:22 2013 -0400
+
+    0.9.21
+
+ NEWS         | 12 ++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit 2af826296315d89f3a433952903c5968e56044ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 16 21:49:56 2013 -0400
+
+    Improve library checks
+
+ src/Makefile.am      |  1 +
+ src/check-defs.sh    | 44 ++++++++++++++++++++++++++++++++++++++++++++
+ src/check-symbols.sh | 37 ++++++++++++-------------------------
+ 3 files changed, 57 insertions(+), 25 deletions(-)
+
+commit 882edce48e507a1c76c908ec2db04aac218b67d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 13 20:36:43 2013 -0400
+
+    [graphite2] Fix include
+
+ src/hb-graphite2.cc | 5 ++---
+ src/hb-graphite2.h  | 2 ++
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit ace5c7eb4c2302a6a7eb3576e6dbc3bc026e569c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 13 20:34:42 2013 -0400
+
+    [introspection] hb-ft annotations
+
+ src/hb-face.cc |  2 +-
+ src/hb-ft.cc   | 30 +++++++++++++++++++++++++++++-
+ 2 files changed, 30 insertions(+), 2 deletions(-)
+
+commit a8949df48780e680e03b9afbbafb3628a0acef52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 13 20:23:51 2013 -0400
+
+    [introspection] Annotate Unicode / font callbacks
+
+    Should move these out of the public header...
+
+    We're "clean" of introspection warnings now.  Remaining ones are about
+    graphite2 / freetype types not being introspectable.
+
+ src/hb-blob.cc   |   4 +-
+ src/hb-face.cc   |   2 +-
+ src/hb-font.cc   |   4 +-
+ src/hb-font.h    | 132
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ src/hb-unicode.h | 106 ++++++++++++++++++++++++++++++++++++++++----
+ 5 files changed, 231 insertions(+), 17 deletions(-)
+
+commit 4b011094d5e90cf93df2891e47aeab1bffad5bbf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 13 20:17:42 2013 -0400
+
+    Move code around
+
+    I believe I didn't break anything...
+
+ src/hb-ot-shape.cc | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 4878db218202ed804c9f76edb7e4aa220de8a8d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 12 20:56:32 2013 -0400
+
+    Remove contrib/ Python hand-coded binding stuff
+
+    gobject-introspection coming together.
+
+ contrib/README                    |   2 -
+ contrib/python/README             |  10 --
+ contrib/python/lib/fontconfig.pyx |  47 ---------
+ contrib/python/lib/harfbuzz.pyx   | 213
+ --------------------------------------
+ contrib/python/scripts/hbtestfont | 116 ---------------------
+ contrib/python/setup.py           |  39 -------
+ 6 files changed, 427 deletions(-)
+
+commit e478ebe4d3f74dc271ffe88680fd29f6b1924c93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 12 20:53:07 2013 -0400
+
+    [introspection] Add sample.py
+
+ src/sample.py | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit dfdbe7f932daffcf73911ff4e4a36f749164d960
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 12 20:52:20 2013 -0400
+
+    [introspection] Make hb_blob_create() introspectable
+
+ src/Makefile.am | 2 ++
+ src/hb-blob.cc  | 2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 085d4291a9f253a4b8e2eec8003ac11d02a9394f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 12 17:14:33 2013 -0400
+
+    [introspection] Disable constructors for now
+
+    Since our types are not associated with their methods, marking
+    constructors makes them inaccessible from bindings.  Undo for now.
+
+ src/hb-blob.cc       | 2 +-
+ src/hb-buffer.cc     | 2 +-
+ src/hb-face.cc       | 2 +-
+ src/hb-font.cc       | 4 ++--
+ src/hb-set.cc        | 2 +-
+ src/hb-shape-plan.cc | 2 +-
+ src/hb-unicode.cc    | 2 +-
+ 7 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 6c48f20eea22c6e686416ab4ec8388be3e8cd0b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 9 15:43:10 2013 -0400
+
+    [otlayout] Add structs for JSTF table
+
+ src/Makefile.am                |   1 +
+ src/hb-ot-head-table.hh        |   2 +-
+ src/hb-ot-hhea-table.hh        |   2 +-
+ src/hb-ot-hmtx-table.hh        |   2 +-
+ src/hb-ot-layout-gdef-table.hh |   2 +-
+ src/hb-ot-layout-gpos-table.hh |   2 +-
+ src/hb-ot-layout-gsub-table.hh |   2 +-
+ src/hb-ot-layout-jstf-table.hh | 229
+ +++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout.cc            |   1 +
+ src/hb-ot-layout.h             |   1 +
+ src/hb-ot-maxp-table.hh        |   2 +-
+ src/hb-ot-name-table.hh        |   2 +-
+ src/main.cc                    |   2 +-
+ 13 files changed, 241 insertions(+), 9 deletions(-)
+
+commit 70303cf23b22647bf641be22c8650310128322a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 6 17:35:57 2013 -0400
+
+    [docs/introspection] Some more annotations
+
+ src/hb-common.cc    | 151
+ ++++++++++++++++++++++++++++++++++++++++++++++++++--
+ src/hb-font.cc      |  16 +++---
+ src/hb-version.h.in |  19 -------
+ 3 files changed, 155 insertions(+), 31 deletions(-)
+
+commit 288f2899979bcc9e68f8115cb76e3271ed0e17bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 6 15:40:22 2013 -0400
+
+    [docs/introspection] More annotations
+
+ src/hb-blob.cc             |  63 +++---
+ src/hb-buffer-serialize.cc |  63 ++++++
+ src/hb-buffer.cc           | 307 ++++++++++++++++++++++++++-
+ src/hb-face.cc             | 171 +++++++++++++++
+ src/hb-font-private.hh     |   4 +-
+ src/hb-font.cc             | 504
+ ++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-set.cc              |   2 +-
+ src/hb-shape-plan.cc       | 104 ++++++++++
+ src/hb-shape.cc            |  56 +++++
+ src/hb-unicode.cc          | 128 ++++++++++++
+ 10 files changed, 1355 insertions(+), 47 deletions(-)
+
+commit 17905c54f1bab9e6dfe13f59f5ec208de12832f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 6 16:57:01 2013 -0400
+
+    [introspection] Work around g-i limitation with hb_language_t
+
+ src/hb-gobject-structs.cc | 15 +++++++++++----
+ src/hb-gobject-structs.h  |  8 ++++++++
+ 2 files changed, 19 insertions(+), 4 deletions(-)
+
+commit cd361c3cbe4a288e3019b9a029f44e4c5f24436c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 6 16:20:21 2013 -0400
+
+    Minor change to hb_language_t
+
+    Let me know if this breaks anyone's anything.
+
+ src/hb-common.cc | 2 +-
+ src/hb-common.h  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 20cbc1f8eb0811e6cefa3be3550e80df9c372782
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 6 15:29:22 2013 -0400
+
+    Annotate hb-set a bit; add HB_SET_VALUE_INVALID
+
+ src/hb-set-private.hh |  20 +++--
+ src/hb-set.cc         | 244
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-set.h          |   2 +
+ src/hb-version.h.in   |   6 +-
+ test/api/test-set.c   |  26 +++---
+ 5 files changed, 276 insertions(+), 22 deletions(-)
+
+commit c44b81833d5bfb9a926d348a76463314c3ec2018
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 6 15:13:16 2013 -0400
+
+    Whitespace
+
+ src/hb-buffer.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit ae9dc717d37d58efdd3fabbe4a9c3c2bf9dc3568
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 5 16:40:37 2013 -0400
+
+    [gtk-doc] Pass source files to gtk-doc
+
+ docs/reference/Makefile.am | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 5f512017ba615ba6ac8e5da2ea0c57a72db2c26b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 4 18:28:39 2013 -0400
+
+    [docs] Document a few symbols
+
+ src/hb-blob.cc      | 160
+ +++++++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-buffer.cc    |  78 ++++++++++++++++++++++++-
+ src/hb-version.h.in |  17 ++++++
+ 3 files changed, 251 insertions(+), 4 deletions(-)
+
+commit e0dbf99b4497be305d689a528282fd37214e7f1c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 5 16:00:47 2013 -0400
+
+    [introspection] Pass source files to scanner
+
+ src/Makefile.am | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 5a5350b39b81e0128d36ebc81307a6d698a4dc50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 3 20:11:01 2013 -0400
+
+    Revert "Round when scaling values"
+
+    This reverts commit 10f964623f003c70f6bdd33423420abda3820ce0.
+
+    See discussion with Khaled Hosny on mailing list.  In short, since
+    integers here can be negative, and int division is "round towards
+    zero", proper rounding should take sign into account.  Just skip
+    doing it again, has been serving us well before.
+
+ TODO                   | 2 ++
+ src/hb-font-private.hh | 6 +-----
+ 2 files changed, 3 insertions(+), 5 deletions(-)
+
+commit 74ff41c3a573bdf74b60623065eb92a49f055893
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 3 20:09:14 2013 -0400
+
+    Minor
+
+ Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 63dd4b0ac2076fe9cc3dfe5d31ef3616d4ed01e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 3 20:01:40 2013 -0400
+
+    [gtk-doc] Remove hack for deleting tmpl/
+
+    This was introduced in 029f46bde7e39094d3decb46525e91a97c5cc02c
+    and was in fact a bug in gtk-doc master:
+
+      https://bugzilla.gnome.org/show_bug.cgi?id=707426
+
+ docs/reference/Makefile.am | 5 -----
+ 1 file changed, 5 deletions(-)
+
+commit 213001aa99003422199245e96878f9fe348c55b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 3 20:00:16 2013 -0400
+
+    [build] Fix EXTRA_DIST
+
+    I was under the impression that EXTRA_DISTs will happen regardless of
+    automake conditionals.  Apparently I was wrong.
+
+ src/Makefile.am | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 1e994a8fcc94dfea42a6cbfe23a401142d79a1a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 3 18:11:47 2013 -0400
+
+    [gtk-doc] Copy makefile
+
+ autogen.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 81a007ffad683e53f12093a0c9e30112106f415d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 30 19:45:13 2013 -0400
+
+    [TODO] Update
+
+ TODO | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit a2a28235e8131a1e1d4b8c3d0933df5cf056bbc6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 30 19:38:47 2013 -0400
+
+    [gtk-doc] Generate version.xml from configure
+
+    Even though this is not what autoconf recommends, it reduces doc
+    rebuilds when version doesn't change but configure changes.
+
+ configure.ac                  |  1 +
+ docs/reference/Makefile.am    | 11 +++--------
+ docs/reference/version.xml.in |  1 +
+ 3 files changed, 5 insertions(+), 8 deletions(-)
+
+commit ac1b723917d9b8f247a350f8d3e1bc5d1e472073
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 30 19:32:10 2013 -0400
+
+    Remove hb-old and hb-icu-le test shapers
+
+    They've been disabled for a while and no one cared.  We're past
+    the point to need them for testing, and if we ever need to
+    resurrect them again, well, they're in git graveyard somewhere.
+
+ configure.ac                           |   23 +-
+ src/Makefile.am                        |   28 +-
+ src/hb-icu-le.cc                       |  265 --
+ src/hb-icu-le/COPYING                  |    2 -
+ src/hb-icu-le/FontTableCache.cpp       |   91 -
+ src/hb-icu-le/FontTableCache.h         |   48 -
+ src/hb-icu-le/Makefile.am              |   25 -
+ src/hb-icu-le/PortableFontInstance.cpp |  275 --
+ src/hb-icu-le/PortableFontInstance.h   |  119 -
+ src/hb-icu-le/README                   |    3 -
+ src/hb-icu-le/cmaps.cpp                |  200 --
+ src/hb-icu-le/cmaps.h                  |   87 -
+ src/hb-icu-le/letest.h                 |   63 -
+ src/hb-icu-le/license.html             |   51 -
+ src/hb-icu-le/sfnt.h                   |  453 ---
+ src/hb-old.cc                          |  410 ---
+ src/hb-old/COPYING                     |   24 -
+ src/hb-old/Makefile.am                 |   56 -
+ src/hb-old/README                      |    7 -
+ src/hb-old/harfbuzz-arabic.c           | 1150 ------
+ src/hb-old/harfbuzz-buffer-private.h   |  107 -
+ src/hb-old/harfbuzz-buffer.c           |  383 --
+ src/hb-old/harfbuzz-buffer.h           |  102 -
+ src/hb-old/harfbuzz-external.h         |  106 -
+ src/hb-old/harfbuzz-gdef-private.h     |  135 -
+ src/hb-old/harfbuzz-gdef.c             | 1163 ------
+ src/hb-old/harfbuzz-gdef.h             |  140 -
+ src/hb-old/harfbuzz-global.h           |  125 -
+ src/hb-old/harfbuzz-gpos-private.h     |  729 ----
+ src/hb-old/harfbuzz-gpos.c             | 6094
+ --------------------------------
+ src/hb-old/harfbuzz-gpos.h             |  155 -
+ src/hb-old/harfbuzz-greek.c            |  447 ---
+ src/hb-old/harfbuzz-gsub-private.h     |  483 ---
+ src/hb-old/harfbuzz-gsub.c             | 4329 -----------------------
+ src/hb-old/harfbuzz-gsub.h             |  148 -
+ src/hb-old/harfbuzz-hangul.c           |  268 --
+ src/hb-old/harfbuzz-hebrew.c           |  187 -
+ src/hb-old/harfbuzz-impl.c             |   84 -
+ src/hb-old/harfbuzz-impl.h             |  135 -
+ src/hb-old/harfbuzz-indic.cpp          | 1868 ----------
+ src/hb-old/harfbuzz-khmer.c            |  642 ----
+ src/hb-old/harfbuzz-myanmar.c          |  511 ---
+ src/hb-old/harfbuzz-open-private.h     |  102 -
+ src/hb-old/harfbuzz-open.c             | 1433 --------
+ src/hb-old/harfbuzz-open.h             |  288 --
+ src/hb-old/harfbuzz-shaper-all.cpp     |   37 -
+ src/hb-old/harfbuzz-shaper-private.h   |  159 -
+ src/hb-old/harfbuzz-shaper.cpp         |  996 ------
+ src/hb-old/harfbuzz-shaper.h           |  265 --
+ src/hb-old/harfbuzz-stream-private.h   |   81 -
+ src/hb-old/harfbuzz-stream.c           |  114 -
+ src/hb-old/harfbuzz-stream.h           |   51 -
+ src/hb-old/harfbuzz-tibetan.c          |  249 --
+ src/hb-old/harfbuzz.h                  |   38 -
+ 54 files changed, 2 insertions(+), 25532 deletions(-)
+
+commit b94243d6a9457864ad8ef3ad47ad01985b138862
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 30 18:41:33 2013 -0400
+
+    [g-i] Rename library from harfbuzz to HarfBuzz
+
+ src/Makefile.am | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit f730b5d1e2369762952481f1a2d3db26a2b48015
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 29 15:53:33 2013 -0400
+
+    0.9.20
+
+ NEWS         | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 49 insertions(+), 1 deletion(-)
+
+commit b0e03508bad04d7dcf2c50ac81f6261425b34c5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 29 15:56:32 2013 -0400
+
+    Dist with gobject and introspection enabled
+
+ Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit e4ce6745e15eab33ed693874e7a56981f4d6f79a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 29 15:56:16 2013 -0400
+
+    [gtk-doc] Fix build without gobject
+
+ docs/reference/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 263372f15ffdf4c0e4386133f64ff389ba73de33
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 13:43:54 2013 -0400
+
+    Remove gtk-doc.make
+
+    It's copied by gtk-docize.
+
+ gtk-doc.make | 302
+ -----------------------------------------------------------
+ 1 file changed, 302 deletions(-)
+
+commit 79d754efeef89543d51775b110e8bd49cf7e699b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 13:43:35 2013 -0400
+
+    Fix build
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 71ef22b04d466803076af1da6763fecab95ce5bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 12:52:55 2013 -0400
+
+    Turn hb-gobject, and introspection off by default
+
+    Also enable bootstrapping without them.
+
+ configure.ac    | 39 ++++++++++++++++++++++++++++++++++-----
+ src/Makefile.am |  5 +++--
+ 2 files changed, 37 insertions(+), 7 deletions(-)
+
+commit d8f507099b9ae5f0c643fb8dddbb069df6f62a94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 26 21:26:24 2013 -0400
+
+    Hookup harfbuzz-gobject to introspection
+
+ src/Makefile.am | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+commit 71439a8c7ae9df25193bc3ad0f203117d2884a19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 26 20:56:58 2013 -0400
+
+    [gobject] Flesh out hb-gobject
+
+    Move it to new harfbuzz-gobject library.  Implement enums and
+    boxed types for object-types.  Still have to do boxed types for
+    value types.
+
+ configure.ac                         | 12 ++++-
+ docs/reference/Makefile.am           | 12 ++++-
+ docs/reference/harfbuzz-docs.xml     |  3 ++
+ docs/reference/harfbuzz-sections.txt | 48 +++++++++++++++++++-
+ src/Makefile.am                      | 48 +++++++++++++-------
+ src/harfbuzz-gobject.pc.in           | 12 +++++
+ src/hb-gobject-enums.cc.tmpl         | 11 +++--
+ src/hb-gobject-enums.h.tmpl          | 55 +++++++++++++++++++++++
+ src/hb-gobject-structs.cc            | 84
+ +++++++++++++++++++++++++++-------
+ src/hb-gobject-structs.h             | 87
+ ++++++++++++++++++++++++++++++++++++
+ src/hb-gobject.h                     | 38 ++--------------
+ 11 files changed, 333 insertions(+), 77 deletions(-)
+
+commit 23027f7611b53b594e4b4008e916e42b5154f6ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 22 19:03:21 2013 -0400
+
+    [introspection] Enable gobject-introspection again
+
+ configure.ac    |  7 ++++---
+ src/Makefile.am | 49 ++++++++++++++++++++++++++++---------------------
+ 2 files changed, 32 insertions(+), 24 deletions(-)
+
+commit 757a7a9018577dcc399be03dc45a59589585d2fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 12:35:13 2013 -0400
+
+    [uniscribe] Fixed build with wide chars
+
+    https://github.com/blinkseb/harfbuzz/commit/f65dafa4138e1fb4395bf646fa33bb01a86a7e9a
+
+ src/hb-uniscribe.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4dc798de19c767b91fd3025c85593fa6809d1340
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 26 20:39:00 2013 -0400
+
+    Add hb-deprecated.h, and rename a couple enum values
+
+    Add deprecated alias for old name.
+
+ src/Makefile.am              |  1 +
+ src/hb-buffer.cc             |  4 ++--
+ src/hb-buffer.h              |  8 +++----
+ src/hb-common.h              |  5 -----
+ src/hb-deprecated.h          | 51
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb.h                     |  1 +
+ src/test-buffer-serialize.cc |  2 +-
+ test/api/test-buffer.c       |  2 +-
+ util/Makefile.am             |  1 +
+ util/hb-shape.cc             |  2 +-
+ util/options.hh              |  2 +-
+ 11 files changed, 64 insertions(+), 15 deletions(-)
+
+commit 2e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 26 18:49:07 2013 -0400
+
+    Separate face source code from font
+
+    Makes documentation / introspection easier.
+
+ Android.mk                           |   1 +
+ docs/reference/harfbuzz-docs.xml     |   1 +
+ docs/reference/harfbuzz-sections.txt |   6 +-
+ src/Makefile.am                      |   3 +
+ src/hb-face-private.hh               | 108 ++++++++++++
+ src/hb-face.cc                       | 311
+ +++++++++++++++++++++++++++++++++++
+ src/hb-face.h                        | 117 +++++++++++++
+ src/hb-font-private.hh               |  67 +-------
+ src/hb-font.cc                       | 269 ------------------------------
+ src/hb-font.h                        |  75 +--------
+ src/hb.h                             |   1 +
+ 11 files changed, 549 insertions(+), 410 deletions(-)
+
+commit d3490761e11ae308fbd8aaf02059653f579035c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 26 21:15:29 2013 -0400
+
+    Improve check-includes.sh
+
+ src/check-includes.sh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 381f2fb5e664715d67ffc9a234b0fd8aa540fada
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 26 19:20:38 2013 -0400
+
+    Minor
+
+ docs/reference/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ac1f09b53e2c5d14c874e4d9f1b25b03ea1d1c44
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 26 18:50:12 2013 -0400
+
+    [gtk-doc] Fix maintainer-clean rule
+
+ docs/reference/Makefile.am | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 38b8b40526a85f33521542e24d1e0c82588efc85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 27 11:44:09 2013 -0400
+
+    Fix possible snprintf OOM
+
+    https://bugzilla.redhat.com/show_bug.cgi?id=1001645
+
+ src/hb-buffer-serialize.cc | 14 +++++++-------
+ src/hb-font-private.hh     |  3 ++-
+ src/hb-shape.cc            |  6 +++---
+ 3 files changed, 12 insertions(+), 11 deletions(-)
+
+commit d22548c0e362cc9447557440af9ecbb11badfa78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 26 18:46:21 2013 -0400
+
+    [check-*] Minor
+
+ src/check-c-linkage-decls.sh | 4 ++--
+ src/check-header-guards.sh   | 4 ++--
+ src/check-includes.sh        | 4 ++--
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 029f46bde7e39094d3decb46525e91a97c5cc02c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 26 18:11:07 2013 -0400
+
+    [gtk-doc] Remove tmpl in make maintainer-clean
+
+ docs/reference/Makefile.am | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit dddf990c3687a47297eafc82b54fa96842e68003
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 26 17:58:25 2013 -0400
+
+    [git.mk] Update
+
+ git.mk | 17 +++++++++++++----
+ 1 file changed, 13 insertions(+), 4 deletions(-)
+
+commit 700a15fe4b80da9c67befd85ae10a166f5b65962
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 26 17:49:36 2013 -0400
+
+    Add HB_DISABLE_DEPRECATED
+
+    That moment that you have to accept that you made API mistakes...
+
+ docs/reference/Makefile.am           | 2 +-
+ docs/reference/harfbuzz-sections.txt | 8 +++++---
+ src/hb-common.h                      | 4 +++-
+ 3 files changed, 9 insertions(+), 5 deletions(-)
+
+commit ddc456a519a9a59e96f9d7fcad988369e0a8842b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 26 17:34:18 2013 -0400
+
+    [travis] Add graphite2
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f7c72b42efb8d42859023659fd2e3d589523436d
+Author: Anthony Carrico <acarrico@memebeam.org>
+Date:   Sun Feb 24 13:00:33 2013 -0500
+
+    [gtk-doc] Initial setup
+
+    Initial setup of gtk-doc. Straight forward setup following the gtk-doc
+    instructions. Ignore some troublesome types in src/hb-gobject.h. To
+    build use "./autogen.sh --enable-gtk-doc" then "make". Docs are in
+    harfbuzz/docs/reference/html/index.html.
+
+ .travis.yml                           |  10 +-
+ Makefile.am                           |   7 +-
+ autogen.sh                            |   7 +
+ configure.ac                          |   7 +-
+ docs/Makefile.am                      |   1 +
+ docs/reference/Makefile.am            | 109 +++++++++
+ docs/reference/harfbuzz-docs.xml      |  61 +++++
+ docs/reference/harfbuzz-overrides.txt |   0
+ docs/reference/harfbuzz-sections.txt  | 431
+ ++++++++++++++++++++++++++++++++++
+ gtk-doc.make                          | 302 ++++++++++++++++++++++++
+ src/Makefile.am                       |   2 +-
+ src/hb-gobject.h                      |   3 +-
+ 12 files changed, 931 insertions(+), 9 deletions(-)
+
+commit 3409fb1c767118067cf7edfb97068936b6f4b717
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 21 17:22:21 2013 -0400
+
+    [uniscribe] Ask Uniscribe to return shaping results in logical order
+
+    See discussion on the list in the thread "Arabic presentation forms
+    and the uniscribe backend".
+
+    Based on patch from Jonathan Kew.
+
+ src/hb-uniscribe.cc | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit 1d05fdd09fa271b641f30a2138171e6fafcd8db7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 20 13:22:21 2013 -0400
+
+    [uniscribe] Print run info
+
+ src/hb-uniscribe.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 3613696b57225111507a3f4263f5fa6937d0bc72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 12 00:33:28 2013 -0400
+
+    [coretext] Fully support user features
+
+    Based on patch from Jonathan Kew and data from Apple.
+
+    It's not working correctly though, and I suspect I'm hitting a bug in
+    CoreText.  When I do this:
+
+    hb-shape /Library/Fonts/Zapfino.ttf ZapfinoZapfino --shaper coretext \
+    --features=-liga
+
+    I expect both ligatures to turn off, but only the second one does:
+
+    [Z_a_p_f_i_n_o=0+2333|Z=7+395|a=8+285|p_f=9+433|i=11+181|n=12+261|o=13+250]
+
+    whereas if I disable 'dlig' instead of 'liga', both are turned off.
+    Smells...
+
+    Doesn't resolve conflicting feature settings.
+
+ src/hb-coretext.cc  | 446
+ +++++++++++++++++++++++++++++++++++++++++++++++-----
+ src/hb-uniscribe.cc |   2 +-
+ 2 files changed, 404 insertions(+), 44 deletions(-)
+
+commit 54e6f6c588a164f7de62ff88b3eff4f25adb8f17
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 9 14:34:54 2013 -0400
+
+    Clean up list of Unicode scripts
+
+    Rename HB_SCRIPT_CANADIAN_ABORIGINAL to HB_SCRIPT_CANADIAN_SYLLABICS
+    and a macro for the old name.
+
+ src/hb-common.h                    | 277
+ ++++++++++++++++++++-----------------
+ src/hb-glib.cc                     |   2 +-
+ src/hb-ot-shape-complex-private.hh |   2 +
+ src/hb-ucdn.cc                     |   2 +-
+ test/api/test-unicode.c            |   2 +-
+ 5 files changed, 153 insertions(+), 132 deletions(-)
+
+commit 7cd4a715848c44be9aec6b6b622cfc2a60b1a5a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 9 09:41:48 2013 -0400
+
+    Update TODO
+
+ TODO | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 515a0ac81e531c95b1bb7f1a3c5df73a9e64b14f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 9 09:40:59 2013 -0400
+
+    Fix compiler warning
+
+ src/hb-ot-layout-common-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 10f964623f003c70f6bdd33423420abda3820ce0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 9 09:40:01 2013 -0400
+
+    Round when scaling values
+
+    Doesn't matter for most users since they should be working in a
+    fixed sub-pixel scale anyway (ie. 22.10, 26.6, 16.16, etc).
+
+ TODO                   | 2 --
+ src/hb-font-private.hh | 6 +++++-
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit df8f70ae5de6181d56efa3f076f14e4d52119a5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 9 09:35:10 2013 -0400
+
+    Minor
+
+ src/hb-font-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ce8badf1808f9fbdd9a22e9215c7475d3afde5ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 9 09:31:06 2013 -0400
+
+    Minor
+
+ src/hb-font-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d71c0df2d17f4590d5611239577a6cb532c26528
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 9 09:28:32 2013 -0400
+
+    Remove vrt2, vkrn, vpal, and valt from default vertical features
+
+    See thread by John Dagget on the list.
+
+ TODO               | 2 --
+ src/hb-ot-shape.cc | 9 ---------
+ 2 files changed, 11 deletions(-)
+
+commit a782a5e9a37c8733ac2830410a514d38635b543a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 7 21:08:54 2013 -0400
+
+    [coretext] Start adding support for features
+
+    Unlike AAT, looks like with CoreText very few OT features can
+    be mapped.
+    :(
+
+ src/hb-coretext.cc | 65
+ +++++++++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 54 insertions(+), 11 deletions(-)
+
+commit bdd8873fd8ae5c794018f6edac242b0a8b62ff31
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 7 17:58:25 2013 -0400
+
+    Revert "[Indic] don't apply 'calt' by default in Indic shaper"
+
+    This reverts commit 952121007c6f6f374e4cf1734ebcfe2d2d71c71c.
+
+    In light of discussion on the mailing list...
+
+ src/hb-ot-shape-complex-indic.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 9a175914d72187d0c3f50ddad50c9569649c3072
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 7 17:26:13 2013 -0400
+
+    [uniscribe] Support feature ranges
+
+    As Khaled pointed out, right now setting any features, turns kern
+    and possibly other features off.
+
+ src/hb-uniscribe.cc | 232
+ ++++++++++++++++++++++++++++++++++++++++++++--------
+ 1 file changed, 199 insertions(+), 33 deletions(-)
+
+commit 627af695e48ef10b6e634c34b723f7e7013467f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 6 16:53:56 2013 -0400
+
+    More git.mk updates
+
+ git.mk | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 722252743d59e4cd53cb71720d823ea00b708ad8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 6 15:19:23 2013 -0400
+
+    Update git.mk
+
+ git.mk | 37 +++++++++++++++++++++++--------------
+ 1 file changed, 23 insertions(+), 14 deletions(-)
+
+commit 38d5c58d23fce38221689cda98cea1c3e42ed615
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 6 14:45:36 2013 -0400
+
+    [uniscribe] Half-support user features
+
+    Turning features on globally works now.
+
+ src/hb-uniscribe.cc | 54
+ ++++++++++++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 43 insertions(+), 11 deletions(-)
+
+commit 639afdc690c681a302080239a1967ce735ba5be5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 6 14:28:12 2013 -0400
+
+    Minor
+
+ src/hb-private.hh | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+commit 952121007c6f6f374e4cf1734ebcfe2d2d71c71c
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Tue Aug 6 10:36:14 2013 -0400
+
+    [Indic] don't apply 'calt' by default in Indic shaper
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 625678436c29100eef82d87e635b251030a18f60
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 5 22:44:18 2013 -0400
+
+    Fix glyph closure with class==0
+
+    As reported by cibu.  Untested.
+
+ src/hb-ot-layout-common-private.hh | 29 +++++++++++++++++++++++++++++
+ 1 file changed, 29 insertions(+)
+
+commit 580d5eb93af5bbbc64994b626d5e011e2c256d74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 4 16:55:21 2013 -0400
+
+    Don't apply 'dlig' by default
+
+    Windows 8 doesn't, and the spec will be fixed.
+
+ src/hb-ot-shape-complex-arabic.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 48382e2f41499a91181bea0acc5792989d2485bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 30 18:25:39 2013 -0400
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit c461371419d186811d4bfc768e26535f48a807f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 30 14:48:23 2013 -0400
+
+    [CoreText] Don't leak the CTLine object (and everything that hangs
+    off it)
+
+    Patch from Jonathan Kew.
+
+ src/hb-coretext.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5fbc952524ac8840f007dc0136823a4ab6e25f70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 29 14:34:40 2013 -0400
+
+    Fix glyph name printing in hb-ot-shape-closure
+
+ util/hb-ot-shape-closure.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6fadd9dd7cc220f131c29946285831635afc8044
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 26 10:33:06 2013 -0400
+
+    Apply 'mark' to Myanmar
+
+    According to Andrew Glass: "The issue with Myanmar <mark> feature was
+    fixed via a servicing patch as soon as Windows 8 became available."
+
+ src/hb-ot-shape-complex-myanmar.cc | 11 -----------
+ 1 file changed, 11 deletions(-)
+
+commit 86522e493d071f395b5abf64289232bf8867ac29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 22 19:07:53 2013 -0400
+
+    Fix glyph closure recursion!
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 74439d0aa10184451adc6c6469f5119be352ecbb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 22 19:02:29 2013 -0400
+
+    Minor
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8b427c78efa988ed27a2a394146d73f59688707b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 22 10:57:05 2013 -0400
+
+    [uniscribe] Sanitize font file
+
+ src/hb-uniscribe.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 12ff69df21ac91ae21860db7000d9f9973d3da1a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 22 10:52:12 2013 -0400
+
+    [uniscribe] Handle TTC when renaming font
+
+ src/hb-uniscribe.cc | 31 ++++++++++++++++++-------------
+ 1 file changed, 18 insertions(+), 13 deletions(-)
+
+commit 05bad3b8c25a89bc0f20f99f9215e492f48f03fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 21 17:05:02 2013 -0400
+
+    [uniscribe] Use OT::* types
+
+ src/hb-open-type-private.hh |  10 ++++-
+ src/hb-ot-name-table.hh     |   4 +-
+ src/hb-uniscribe.cc         | 107
+ +++++++++++++++++++++++---------------------
+ 3 files changed, 66 insertions(+), 55 deletions(-)
+
+commit bdeea605fe597bff4430eaae3317189bb81ec76e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 21 16:22:10 2013 -0400
+
+    [uniscribe] Move name generation into separate function
+
+ src/hb-uniscribe.cc | 34 ++++++++++++++++++++++------------
+ 1 file changed, 22 insertions(+), 12 deletions(-)
+
+commit 73f947e2a7bc5b29d731da2e9d1fafe958be839e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 21 16:16:35 2013 -0400
+
+    [uniscribe] Use blob to pass data around
+
+ src/hb-uniscribe.cc | 28 ++++++++++++++--------------
+ 1 file changed, 14 insertions(+), 14 deletions(-)
+
+commit 8ac2e88deff3d069c19fd59d0fbbfb88a762b113
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 21 16:06:49 2013 -0400
+
+    [uniscribe] Use unique font name
+
+    When installing per-process fonts using AddFontMemResourceEx(),
+    if a font with the same family name is already installed, sometimes
+    that one gets used.  Which is problematic for us.  As such, we
+    now mangle the font to install a new 'name' table with a unique
+    name, which we then use to choose the font.
+
+    Patch from Jonathan Kew.
+
+ configure.ac        |   2 +-
+ src/hb-uniscribe.cc | 136
+ ++++++++++++++++++++++++++++++++++++++++++++--------
+ 2 files changed, 116 insertions(+), 22 deletions(-)
+
+commit 8751de50831338ce550601c34c17d152ad89c1fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 18 16:29:50 2013 -0400
+
+    Followup fix for 3f9e2dced298c3d00f31b2dfc38685bb071a3a22
+
+    During GSUB, if a ligation happens, subsequence context input matching
+    matches the new indexing.  During GPOS however, the indices never
+    change.  So just go one by one.
+
+    Fixes 'dist' positioning with mmrtext.ttf and the following sequence:
+
+      U+1014,U+1039,U+1011,U+1014,U+1039,U+1011,U+1014,U+1039,U+1011
+
+    Reported by Jonathan Kew.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 2b78d67e9f38f77086fbd9c3fd6f1c8c73927a51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 16 16:06:27 2013 -0400
+
+    0.9.19
+
+ NEWS         | 11 +++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 12 insertions(+), 1 deletion(-)
+
+commit e509d35cf1160f1449bc736b9445cdf61ab81d06
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 11 14:56:45 2013 -0400
+
+    [ft] hb_ft_get_glyph_from_name fails for the name of glyph id 0
+
+    Based on patch from Jonathan Kew, as reported on the mailing list.
+
+ src/hb-ft.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 29b596ac67806c44441e65f3ece227df0fe2bb63
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 8 08:37:15 2013 -0600
+
+    [uniscribe] Fix buffer allocation
+
+    Email from Jonathan Kew:
+
+    My cygwin build kept aborting on certain test words when run with the
+    uniscribe backend. Turned out this was caused by a bug in the
+    allocation
+    of scratch buffers in hb-uniscribe.cc.
+
+    Commit 2a17f9568d9724e045d2c1d660e007f3acd747d9 introduced a new line
+
+      ALLOCATE_ARRAY (SCRIPT_VISATTR, vis_attr, glyphs_size);
+
+    but it failed to account for this in the computation of glyphs_size
+    (the number of glyphs for which scratch buffer space is available),
+    with the result that the vis_clusters array ends up overrunning the
+    end of the scratch buffer and clobbering the beginning of the buffer's
+    info[].
+
+    AFAICS, the vis_attr array is not actually used, so the simple fix is
+    to remove the line that allocates it. (If/when we -do- need to use
+    vis_attr for something, we'll need to add another term to the earlier
+    calculation of glyphs_size.)
+
+    With this patch, the uniscribe backend runs reliably again.
+
+    JK
+
+ src/hb-uniscribe.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 9245e98742667dfffe06523e8051beda1bc04811
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 20:57:58 2013 -0400
+
+    [Indic] Add Javanese config
+
+    We should add for other scripts too, send me the virama codepoint
+    and script name...
+
+ src/hb-ot-shape-complex-indic.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5f85c80a07dd2d18348824866bf4e984ac711a24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 20:14:18 2013 -0400
+
+    [OT] Collect requiredFeature only if features are not provided
+
+    As per Werner's report on the list.
+
+ src/hb-ot-layout.cc | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 3f9e2dced298c3d00f31b2dfc38685bb071a3a22
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 19:46:55 2013 -0400
+
+    Fix contextual lookup recursion indexing
+
+    See email thread "Skipping Control for Attaching Marks using OpenType"
+    from earlier this month.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 10 ++--------
+ 1 file changed, 2 insertions(+), 8 deletions(-)
+
+commit f5da11e0fa5adf8f782883dc5c30d8faaafc9c27
+Merge: 79d1007a 89312b74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 22 08:04:05 2013 -0700
+
+    Merge pull request #3 from LogosBible/master
+
+    Destroy lookups before blobs.
+
+commit 89312b7417c0198a0635ca6b7e8ea11f6af2a4f8
+Author: Bradley Grainger <bgrainger@gmail.com>
+Date:   Fri Jun 21 15:02:18 2013 -0700
+
+    Destroy lookups before blobs.
+
+    'layout->gsub' may depend on data owned by 'layout->gsub_blob',
+    so it must
+    be deinitialized before the blob is destroyed.
+
+ src/hb-ot-layout.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 79d1007a501fd63c0ba4d51038c513e6b8b94740
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 13 19:01:07 2013 -0400
+
+    If variation selector is not consumed by cmap, pass it on to GSUB
+
+    This changes the semantics of get_glyph() callback and expect that
+    callbacks return false if the requested variant is not available, and
+    then we will call them back with variation_selector=0 and will retain
+    the glyph for the selector in the glyph stream.
+
+    Apparently most Mongolian fonts implement the Mongolian Variation
+    Selectors using GSUB, not cmap.
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=65258
+
+    Note that this doesn't fix the Mongolian shaping yet, because the way
+    that's implemented is that the, say, 'init' feature ligates the letter
+    and the variation-selector.  However, since currently the variation
+    selector doesn't have the 'init' mask on, it will not be matched...
+
+ src/hb-ft.cc                 |  3 +--
+ src/hb-ot-shape-normalize.cc | 14 ++++++++++++--
+ 2 files changed, 13 insertions(+), 4 deletions(-)
+
+commit c7a84917208528040aaf9ad0a9a0b26aabeabc9c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 6 20:17:32 2013 -0400
+
+    Skip over multiple variation selectors in a row
+
+ src/hb-ot-shape-normalize.cc | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 7235f33f9e5e031622a00a84f4b2e98f16803579
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 10 14:39:51 2013 -0400
+
+    Fix misc warnings reported by cppcheck
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=65544
+
+ src/hb-common.cc            |  2 +-
+ src/hb-coretext.cc          |  3 ---
+ src/hb-font-private.hh      | 17 +++++++++++------
+ src/hb-private.hh           |  2 +-
+ src/hb-shape.cc             |  2 +-
+ test/api/test-font.c        |  1 -
+ util/ansi-print.cc          |  1 +
+ util/hb-ot-shape-closure.cc |  5 +++--
+ util/hb-shape.cc            |  5 ++++-
+ util/shape-consumer.hh      |  6 ++++--
+ util/view-cairo.hh          |  6 ++++--
+ 11 files changed, 30 insertions(+), 20 deletions(-)
+
+commit 570bcccd3f41b9aecd51765a401299833a6d8ebd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 10 13:56:51 2013 -0400
+
+    Fix PKG_CHECK_MODULES usage
+
+    Oops.
+
+    Bug 65246 - Fix build without graphite2
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 270cfd7a9c01dfb1b1789929f020943ad63aca99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 6 18:57:15 2013 -0400
+
+    Fix PKG_CHECK_MODULES usage
+
+    Bug 65246 - Fix build without graphite2
+
+    If we don't provide ACTION-IF-NOT-FOUND, configure aborts if it can't
+    find the libraries.  We handle that ourselves so we don't want the
+    macro to abort.
+
+ configure.ac | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 2fd0e02706857bcaf61bf5151657eac96cfa73b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 6 17:16:01 2013 -0400
+
+    Minor
+
+ src/Makefile.am | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit b4c5c52944a44ba863a22a53035ff561af7318ca
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Mon Jun 3 17:55:29 2013 +0800
+
+    util/ansi-print.cc: Use fallback implementation for lround on MSVC
+
+    Unfortuately Visual Studio (still) does not support the C99 function
+    lround, so provide a fallback implementation for it.
+
+ util/ansi-print.cc | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+commit a4446b10bfe0a9e7236bf941fa69a96697939e11
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 3 18:39:14 2013 -0400
+
+    Fix build for C89 compilers
+
+ test/api/test-buffer.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4ddf937242048c4a044ada4559e26664a0c09b48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 3 18:36:26 2013 -0400
+
+    Remove unnecessary stdint.h include
+
+ src/hb-ucdn/ucdn.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 93a04b8b5e6d8067cb925fdf532aadc24c1d4861
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Mon Jun 3 17:49:37 2013 +0800
+
+    hb-uniscribe.cc: Re-enable build under Visual Studio
+
+    -Declare hinstLib at the top of block
+    -Fix the definitions of the typedefs of ScriptItemizeOpenType,
+     ScriptShapeOpenType and ScriptPlaceOpenType
+
+ src/hb-uniscribe.cc | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 280e52ae95df0cbee0bb305f5354381bc1d563f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 30 18:04:24 2013 -0400
+
+    Fix ChangeLog regen
+
+ Makefile.am | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit c1824daefa1253507636e4bfdf46374f835f10b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 29 15:30:54 2013 -0400
+
+    Update TODO
+
+ TODO | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 2966d3603259430800cb5880491d28a1c5ea2314
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 28 17:34:37 2013 -0400
+
+    Fix test build
+
+ test/api/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 6873f6cc42aa1405e71be903bd0f39a7a15320ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 28 17:33:16 2013 -0400
+
+    Minor
+
+ TODO | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 4014aa4e53bddb29d939a168bd733942d3683732
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 28 17:28:59 2013 -0400
+
+    0.9.18
+
+ NEWS         | 28 ++++++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 29 insertions(+), 1 deletion(-)
+
+commit d70be29831bb99e34fe18744129088f45d5b2023
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 28 17:23:56 2013 -0400
+
+    Fix dist
+
+ src/Makefile.am | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 22ce0961742df0a213f2cc86ca3d5a72453c00b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 28 17:18:30 2013 -0400
+
+    Generate harfbuzz-icu.pc
+
+    Currently it only works with ICU that has .pc files.  I'll
+    wait till someone complains before fixing it for icu-config
+    systems.
+
+ Makefile.am            |  3 ---
+ configure.ac           |  5 ++---
+ harfbuzz.pc.in         | 11 -----------
+ src/Makefile.am        | 13 +++++++++++++
+ src/harfbuzz-icu.pc.in | 13 +++++++++++++
+ src/harfbuzz.pc.in     | 11 +++++++++++
+ 6 files changed, 39 insertions(+), 17 deletions(-)
+
+commit d9afa111330771461b6182ada9f4edd68bcfce77
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 28 15:27:40 2013 -0400
+
+    Build hb-icu into libharfbuzz-icu.so
+
+ src/Makefile.am      | 29 +++++++++++++++--------------
+ src/hb-unicode.cc    |  2 +-
+ test/api/Makefile.am |  1 +
+ 3 files changed, 17 insertions(+), 15 deletions(-)
+
+commit 7d395c2a255a44fd0d65365ea9b525dba70c062c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 28 15:25:06 2013 -0400
+
+    Minor
+
+ test/api/test-c.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 2a17f9568d9724e045d2c1d660e007f3acd747d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 28 13:10:51 2013 -0400
+
+    Bug 55494 - ScriptItemizeOpenType doesn't exists under Windows XP
+
+    Fallback to older API if OpenType variants are not available.
+
+ configure.ac        |  14 +--
+ src/hb-uniscribe.cc | 322
+ +++++++++++++++++++++++++++++++++++++++++++---------
+ 2 files changed, 271 insertions(+), 65 deletions(-)
+
+commit f8087ffbadc83a15d59367ba82976eae675736a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 19:43:48 2013 -0400
+
+    Add --with-cairo
+
+ configure.ac | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+commit 82eddfe5d658ef791d6ef6a566401c50601dfb1c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 19:33:36 2013 -0400
+
+    Add --with-freetype
+
+    Defaults to auto.
+
+ configure.ac | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit 5e25eb77a49e7f95b6a6d540b26d60d430f89d4c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 19:30:48 2013 -0400
+
+    Default glib to auto again
+
+ configure.ac | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit eb63e786f37468867c81707504128cf8a4016e5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 19:29:09 2013 -0400
+
+    Add --with-coretext
+
+    Defaults to no.
+
+ configure.ac | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit ab2af17bc6faa8394656e6e82948dc3e9f437626
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 19:27:43 2013 -0400
+
+    Add --with-uniscribe
+
+    Defaults to no.
+
+ configure.ac | 55 +++++++++++++++++++++++++++++++++++++++----------------
+ 1 file changed, 39 insertions(+), 16 deletions(-)
+
+commit 58db2c2542717858acbdf480b3f19a8aef4918cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 19:10:33 2013 -0400
+
+    Disable UCDN if glib is available
+
+    We only want UCDN if we don't have any other Unicode provider.
+    I'm going to remove ICU from the list of default Unicode providers
+    as part of moving hb-icu into its own library.  As such, the only
+    providers will be UCDN and glib.
+
+ configure.ac | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit ca65326cbd49b48792c4e3125af6c5006364f194
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 19:09:50 2013 -0400
+
+    Minor
+
+ configure.ac | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 7ae14973ecb4614a83769d2bbd01f33d8474ffc0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 19:06:50 2013 -0400
+
+    Disable icu_le shaper
+
+    Will add a way to enable it later.
+
+ configure.ac | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7e6ebf76236cc5ea69302e68186bdf8166d04a98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 19:05:23 2013 -0400
+
+    Remove icu-config fallback for icu_le shaper
+
+    Bug 64878 - compile error with ICU but not ICU
+
+ configure.ac | 18 ------------------
+ 1 file changed, 18 deletions(-)
+
+commit 932b7471479c639244051b4dbae678e7d47ae99f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 19:04:40 2013 -0400
+
+    Bug 65053 - Add configure option to enable/disable ICU support
+
+ configure.ac | 46 ++++++++++++++++++++++++++++------------------
+ 1 file changed, 28 insertions(+), 18 deletions(-)
+
+commit cf2c1c7eb81b54a344ed5cf36d5fbd3cd297eed1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 18:54:30 2013 -0400
+
+    Disable hb-old shaper
+
+    Will add proper way to enable it later.
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5a78d23f255a649353044af8e5df315f62907b7f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 18:47:58 2013 -0400
+
+    Bug 65054 - Add configure option to enable/disable Graphite2
+
+    Add --with-graphite2.  Defaults to off.
+
+ configure.ac | 20 +++++++++++++++-----
+ 1 file changed, 15 insertions(+), 5 deletions(-)
+
+commit 61e7775fa75c7c1bdc29a6992c8c215897364600
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 18:24:56 2013 -0400
+
+    Remove hb-icu dependency from hb-icu-le shaper
+
+ src/hb-icu-le.cc | 33 +++++++++++++++++++++++++++++----
+ 1 file changed, 29 insertions(+), 4 deletions(-)
+
+commit 7e08f1258da229dfaf7e1c4b5c41e5bb83906cb0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 14:48:34 2013 -0400
+
+    Don't zero advance of mark-non-mark ligatures
+
+    If there's a mark ligating forward with non-mark, they were
+    inheriting the GC of the mark and later get advance-zeroed.
+    Don't do that if there's any non-mark glyph in the ligature.
+
+    Sample test: U+1780,U+17D2,U+179F with Kh-Metal-Chrieng.ttf
+
+    Also:
+    Bug 58922 - Issue with mark advance zeroing in generic shaper
+
+ src/hb-ot-layout-gsubgpos-private.hh | 4 ++++
+ src/hb-ot-layout-private.hh          | 6 ++++++
+ 2 files changed, 10 insertions(+)
+
+commit cf059ac69d10d9eb09f0d2a29b1bd989647bd800
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 24 15:28:11 2013 -0400
+
+    [icu_le] Support non-BMP text
+
+ src/hb-icu-le.cc | 35 ++++++++++++++++++++++++++++-------
+ 1 file changed, 28 insertions(+), 7 deletions(-)
+
+commit a447c528e68cabc9ca6e24e2c436f3d605ef9aaa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 23 17:05:39 2013 -0400
+
+    [icu_le] A bit better scaling
+
+ src/hb-icu-le.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit fb502a22787f4110472771ef771619342e64577a
+Merge: b9408d24 9d9e72e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 23 15:54:52 2013 -0400
+
+    Merge commit '9d9e72e94e7914f82ce62a304e7242f79c13edaf'
+
+commit b9408d24f3029f5287b17779235b1c750ff5158a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 23 15:43:02 2013 -0400
+
+    [icu_le] Fix scaling
+
+    Seems to work...
+
+ src/hb-icu-le.cc                       |  2 ++
+ src/hb-icu-le/PortableFontInstance.cpp | 23 +++++++++++++++--------
+ src/hb-icu-le/PortableFontInstance.h   |  9 ++++++++-
+ 3 files changed, 25 insertions(+), 9 deletions(-)
+
+commit 601526392dec5d8432f147c91658ba50ed6a4322
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 21 17:22:13 2013 -0400
+
+    Copy stdint.h boilerplate to ucdn
+
+ src/hb-ucdn/ucdn.h | 24 +++++++++++++++++++++++-
+ 1 file changed, 23 insertions(+), 1 deletion(-)
+
+commit f1b02f4f3c0db9fbfa6747188429df828b000010
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 20 09:23:58 2013 -0400
+
+    0.9.17
+
+ NEWS         | 8 ++++++++
+ configure.ac | 2 +-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit d785fa0c45f7f25f5e5f352b933a5f6fa29be5c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 20 09:18:52 2013 -0400
+
+    Minor refactoring
+
+ src/hb-ot-shape.cc | 54
+ ++++++++++++++++++++++++++++--------------------------
+ 1 file changed, 28 insertions(+), 26 deletions(-)
+
+commit 127daf15e0b2f509ebd29a104236c8b38884efb0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 20 09:11:35 2013 -0400
+
+    Arabic mark width-zeroing regression
+
+    Mozilla Bug 873902 - Display Arabic text with diacritics is bad
+    https://bugzilla.mozilla.org/show_bug.cgi?id=873902
+
+ src/hb-ot-shape-complex-arabic.cc  |  2 +-
+ src/hb-ot-shape-complex-default.cc |  2 +-
+ src/hb-ot-shape-complex-myanmar.cc |  2 +-
+ src/hb-ot-shape-complex-private.hh |  6 ++++--
+ src/hb-ot-shape-complex-thai.cc    |  2 +-
+ src/hb-ot-shape.cc                 | 36
+ ++++++++++++++++++++++++++++--------
+ 6 files changed, 36 insertions(+), 14 deletions(-)
+
+commit fa3d0a0ce60a9fcf2b7f906dec916463b1319eda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 14 15:30:55 2013 -0400
+
+    Bug 64476 - Typo in hb_set_t.get_min()
+
+    Fixes previous commit's test.
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dfbd115e6c1a86a5f1b8d15200672f1e9410b5de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 14 15:30:17 2013 -0400
+
+    [test] Add test for hb_set_get_min() bug
+
+    Failing now.
+
+    Bug 64476 - Typo in hb_set_t.get_min()
+
+ test/api/test-set.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 9d9e72e94e7914f82ce62a304e7242f79c13edaf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 3 18:10:10 2013 -0400
+
+    [OTLayout] Use is_inplace() when flipping buffers
+
+ src/hb-ot-layout.cc | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 45f3d980c9503bd94e64f6e3f67f97688347d00c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 3 17:49:44 2013 -0400
+
+    [OTLayout] Merge / templateize apply_string()
+
+ src/hb-ot-layout-gpos-table.hh | 25 ---------------
+ src/hb-ot-layout-gsub-table.hh | 48 ----------------------------
+ src/hb-ot-layout.cc            | 72
+ ++++++++++++++++++++++++++++++++++++++++--
+ 3 files changed, 69 insertions(+), 76 deletions(-)
+
+commit e015b8f2187d1102b9c34d1a63504e7b05ee20ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 3 17:34:29 2013 -0400
+
+    [OTLayout] Minor
+
+ src/hb-ot-layout-gpos-table.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 780cd930a974165d76dbf7a87701d11b7f15db06
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 3 17:33:16 2013 -0400
+
+    [OTLayout] Minor
+
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-ot-layout-gsub-table.hh | 2 +-
+ src/hb-ot-layout.cc            | 4 ++--
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 2e0c44f4bedd3e24c731c0e9e23358e9a4891a35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 24 16:42:05 2013 -0400
+
+    [OTLayout] Add is_inplace() method to GSUB
+
+ src/hb-ot-layout-gpos-table.hh       |   8 +-
+ src/hb-ot-layout-gsub-table.hh       |  58 ++++++++++++-
+ src/hb-ot-layout-gsubgpos-private.hh | 158
+ +++++++++++++++++++++++++++++++++++
+ 3 files changed, 222 insertions(+), 2 deletions(-)
+
+commit bac1dd6a0ff4d4fae4254506d38ae662b7e9dda7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 2 18:52:24 2013 -0400
+
+    [OTLayout] Refactor a bit more
+
+ src/hb-ot-layout-gsubgpos-private.hh       |  10 +--
+ src/hb-ot-layout-private.hh                |  26 ++++----
+ src/hb-ot-layout.cc                        | 100
+ ++++++++++++++---------------
+ src/hb-ot-map-private.hh                   |   7 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh |   7 +-
+ src/hb-ot-shape-fallback.cc                |   3 +-
+ 6 files changed, 78 insertions(+), 75 deletions(-)
+
+commit d2c96819de9a7428b65ef0adf794416224221f36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 2 18:18:24 2013 -0400
+
+    Move code around
+
+ src/hb-ot-layout.cc | 52
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-map.cc    | 43 -------------------------------------------
+ 2 files changed, 52 insertions(+), 43 deletions(-)
+
+commit 45fd9424c723f115ca98995b8f8a25185a6fc71d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 2 18:06:51 2013 -0400
+
+    [OTLayout] Add hb_ot_layout_lookup_accelerator_t
+
+ src/hb-ot-layout-private.hh                | 21 +++++++++++++++++--
+ src/hb-ot-layout.cc                        | 33
+ +++++++++++++++---------------
+ src/hb-ot-shape-complex-arabic-fallback.hh | 10 +++++----
+ 3 files changed, 41 insertions(+), 23 deletions(-)
+
+commit 76ea563673d24ae1673a5aa3a21da6014479d433
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 4 16:01:20 2013 -0400
+
+    [OTLayout] Add note about collect_glyphs() and recursive lookups
+
+ src/hb-ot-layout-gsubgpos-private.hh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit a8bf0e91f18341e1e20f4e3341fc7dcdd0c990e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 3 14:45:04 2013 -0400
+
+    Add U+061C ARABIC LETTER MARK to Default_Ignorable
+
+ src/hb-unicode-private.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 5d59f999204aedfc433ab4989664d875f96b0364
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 2 14:44:45 2013 -0400
+
+    [OTLayout] Make MultipleSubst in-place for sequences of len=1
+
+ src/hb-ot-layout-gsub-table.hh | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+commit 54f84a6b8571ac7aaaa66f3eff562d23d69d7552
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 2 15:27:53 2013 -0400
+
+    [OTLayout] Whitespace
+
+ src/hb-ot-layout-gsub-table.hh | 56
+ +++++++++++++++++++++---------------------
+ 1 file changed, 28 insertions(+), 28 deletions(-)
+
+commit 3276c354daaff3acabecff11f8e4b5c54d53fc25
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 2 15:16:59 2013 -0400
+
+    [OTLayout] Minor refactoring
+
+ src/hb-ot-map-private.hh |  4 ++++
+ src/hb-ot-map.cc         | 46
+ +++++++++++++++++++++++++---------------------
+ 2 files changed, 29 insertions(+), 21 deletions(-)
+
+commit ea86efa486a5076e9bf844239bccf86d67577f88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 2 14:41:39 2013 -0400
+
+    Minor
+
+ src/hb-ot-map-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 8b63efb6f80b2e9b2de5ec6ab24d6e15826565cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 2 14:29:32 2013 -0400
+
+    Minor
+
+ src/hb-buffer-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 2265be0a620bc76ab65f12fedde67791beb51314
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 2 14:25:09 2013 -0400
+
+    Minor
+
+ src/hb-ot-map-private.hh   | 17 ++++++++++-------
+ src/hb-ot-map.cc           |  2 ++
+ src/hb-ot-shape-private.hh |  3 +--
+ 3 files changed, 13 insertions(+), 9 deletions(-)
+
+commit e6f19af08717a6a63ad0b5bf4bf368778edc63f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 2 13:59:46 2013 -0400
+
+    Minor
+
+ src/hb-set-private.hh | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit 6c15ddfe2b45383824b64058ae69939d002183a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 30 11:34:00 2013 -0400
+
+    Renamed DEBUG to something else
+
+    Some infrastructures use DEBUG as a generic symbol.
+
+ src/hb-buffer.cc  | 6 +++---
+ src/hb-private.hh | 4 ++--
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 00b93f6610f36d8d14ca65fb99864be6d5bdb1ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 29 13:48:49 2013 -0400
+
+    Fix icu linking by requesting the library searchpath from icu-config
+
+    This is not ideal as we don't like -L/usr/lib in our linker line.
+    But this is only relevant to environments that don't have pkgconfig
+    files for ICU...
+
+    https://github.com/behdad/harfbuzz/pull/2
+
+ configure.ac | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 03adf38b22a37216dffac50d075ea9c881f1a22d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 29 13:40:52 2013 -0400
+
+    Make both old autoconf and new automake happy
+
+    Sigh..
+
+    Bug 64039 - undefined macro AM_PROG_AR
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ed79dff517bacfc87279079d5d42d079c21a0373
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Apr 21 15:39:25 2013 -0400
+
+    Minor
+
+ src/hb-ot-layout-gpos-table.hh | 5 -----
+ 1 file changed, 5 deletions(-)
+
+commit 893f57b32f01da3411b5596d59170bc340e9fa39
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Apr 21 15:21:49 2013 -0400
+
+    Minor renaming
+
+ src/hb-ot-map-private.hh | 10 +++++-----
+ src/hb-ot-map.cc         | 22 +++++++++++-----------
+ 2 files changed, 16 insertions(+), 16 deletions(-)
+
+commit 8ac3c9c0b6b8e76bce282825b9bb706c0c78c2a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Apr 21 15:19:38 2013 -0400
+
+    Rename "pause" to "stage"
+
+    The compile() function is starting to become illegible...
+
+ src/hb-ot-map-private.hh | 24 ++++++++++++------------
+ src/hb-ot-map.cc         | 38 +++++++++++++++++++-------------------
+ 2 files changed, 31 insertions(+), 31 deletions(-)
+
+commit dd0641a432691f9b6186b081c38053858c8bc5c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Apr 21 15:13:57 2013 -0400
+
+    Minor
+
+ src/hb-ot-map.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 06a44e859328f5f1e2f6034e711b474116d22e22
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Apr 21 15:13:08 2013 -0400
+
+    Remove unneeded code
+
+    We always push a pause at the end such that each lookup falls
+    in exactly
+    one pause_map_t.  Now, only if I can find a better name for that...
+
+ src/hb-ot-map-private.hh |  2 +-
+ src/hb-ot-map.cc         | 12 +-----------
+ 2 files changed, 2 insertions(+), 12 deletions(-)
+
+commit a408d2375aa2ad96b58e56aef18e5000daf2516b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 19 16:32:06 2013 -0400
+
+    0.9.16
+
+ NEWS         | 13 ++++++++++++-
+ configure.ac |  2 +-
+ 2 files changed, 13 insertions(+), 2 deletions(-)
+
+commit 8659c636087e433f56da458351e8b4d85fdb347c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 19 14:33:17 2013 -0400
+
+    Hand-code bsearch in the hot inner loop.
+
+    Saves another 3 / 4 percent with Amiri.
+
+ src/hb-open-type-private.hh | 29 +++++++++++++++--------------
+ 1 file changed, 15 insertions(+), 14 deletions(-)
+
+commit 797d76d07f80d796a825d850772087104e5a2575
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 18 19:04:12 2013 -0400
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit e4046080c5d785c8dbf9ec9e3478ab9acc83e479
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 17 23:49:54 2013 -0400
+
+    [util] Unbreak --show-text / --show-unicode
+
+ util/shape-consumer.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0dc3a4e0349d28f387a3b4c60a2f51962742738e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 17 23:04:03 2013 -0400
+
+    Obssesive optimization
+
+    Not measurable by any means, but conceptually this is faster since
+    the mask matches more often than the digest.
+
+ src/hb-ot-layout-gpos-table.hh | 4 ++--
+ src/hb-ot-layout-gsub-table.hh | 8 ++++----
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit f9a611026785a80baa4cbff31ad0847beb70ca9a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 17 19:01:49 2013 -0400
+
+    Remove HB_DEBUG_SET_DIGESTS
+
+    Wasn't correct with the new combiner.  I should add it back somehow,
+    but for now the digests seem to be working very well...
+
+ src/hb-set-private.hh | 16 +---------------
+ src/hb-set.cc         | 14 --------------
+ 2 files changed, 1 insertion(+), 29 deletions(-)
+
+commit f7466ee76f2bd3812209426e2c39fe517227406d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 17 18:20:44 2013 -0400
+
+    Remove hb_set_digest_common_bits_t
+
+    Was unused.
+
+ src/hb-set-private.hh | 38 --------------------------------------
+ 1 file changed, 38 deletions(-)
+
+commit 0d5798a137b52d9be7ef88c79e59f9bf01d54f3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 17 18:19:21 2013 -0400
+
+    Improve hb_set_digest_t
+
+    Make Amiri rendering faster a whopping 45% again!  Speends up pretty
+    much anything I tested.
+
+ src/hb-set-private.hh | 28 +++++++++++++++++++++++-----
+ 1 file changed, 23 insertions(+), 5 deletions(-)
+
+commit c7851efcd3a1e5317ab4ea57535cb755bace0848
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 17 17:45:39 2013 -0400
+
+    Templatize hb_set_digest_lowest_bits_t filter
+
+ src/hb-set-private.hh | 21 +++++++++++++++++----
+ 1 file changed, 17 insertions(+), 4 deletions(-)
+
+commit 0edd0fd255790471118fae1fd7a1309a2b77cf62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 17 17:26:56 2013 -0400
+
+    Add comment
+
+ src/hb-set-private.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit b40f2c0372acbc51b13be5cda7dd013e74e3e11a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 16 23:21:38 2013 -0400
+
+    Add hb_set_digest_combiner_t
+
+ src/hb-set-private.hh | 33 ++++++++++++++++++++-------------
+ 1 file changed, 20 insertions(+), 13 deletions(-)
+
+commit 02e5e583688999c4dc04f11b3924da65f99af7e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 16 23:13:10 2013 -0400
+
+    Speed up Speed up hb_set_digest_common_bits_t calcs
+
+    Correctly this time.
+
+ src/hb-set-private.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 893991fc9d2d3a57c4c148f3a9c3b98263cf3aed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 16 21:50:33 2013 -0400
+
+    Initialize set digests
+
+    We were not initializing the digests properly and as a result
+    they were
+    being initialized to zero, making digest1 to never do any useful work.
+
+    Speeds up Amiri shaping significantly.
+
+ src/hb-ot-layout.cc                        | 6 ++++++
+ src/hb-ot-shape-complex-arabic-fallback.hh | 4 +++-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 4d2813d3e980c8e6150caafa604a78cc44bf62a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 16 21:57:21 2013 -0400
+
+    Print set-digest hit ratio with HB_DEBUG_SET_DIGESTS
+
+ src/hb-set-private.hh | 13 +++++++++++++
+ src/hb-set.cc         | 13 +++++++++++++
+ 2 files changed, 26 insertions(+)
+
+commit 1357c2dd120d005ceecfa83ed328d05dc634d7bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 16 21:47:40 2013 -0400
+
+    Revert "Speed up hb_set_digest_common_bits_t calcs"
+
+    This reverts commit 3d1b66a35e1ab3be19335705f310b278d76d66d2.
+
+    The calculations were buggy.  It's not worth optimizing right now.
+
+ src/hb-set-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 2b712bba3f7c459653737dfa2f7d26f17f3b9f64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 16 16:11:09 2013 -0400
+
+    Fix typo in unused macro
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 50067e280f381918b8e90b26df9e7bf20f98f0bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 11 16:31:01 2013 -0400
+
+    [util] Add --num-iterations
+
+    Useful for profiling shapers.
+
+ util/options.cc        |  1 +
+ util/options.hh        |  2 ++
+ util/shape-consumer.hh | 15 +++++++++------
+ 3 files changed, 12 insertions(+), 6 deletions(-)
+
+commit 08677c250767bfc2c0dd1fc934dea92984741291
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 11 14:45:58 2013 -0400
+
+    [old] Speed up Unicode properties access in hb-old shaper
+
+    Just to be sure it's not punishing the old shaper performance
+    numbers.  Doesn't seem to have a measurable effect.
+
+ src/hb-old/harfbuzz-arabic.c   | 44
+ +++++++++++++++++++++---------------------
+ src/hb-old/harfbuzz-external.h | 18 ++++++++---------
+ src/hb-old/harfbuzz-greek.c    |  2 +-
+ src/hb-old/harfbuzz-hebrew.c   |  2 +-
+ src/hb-old/harfbuzz-indic.cpp  | 10 +++++-----
+ src/hb-old/harfbuzz-shaper.cpp |  6 ++++--
+ src/hb-old/harfbuzz-shaper.h   |  1 +
+ 7 files changed, 43 insertions(+), 40 deletions(-)
+
+commit 36a661c0a03d958b95c9ea64a435b55bcd99c3d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 11 13:38:37 2013 -0400
+
+    [git.mk] Update
+
+ git.mk | 33 ++++++++++++++++++++-------------
+ 1 file changed, 20 insertions(+), 13 deletions(-)
+
+commit ef9e02eddfc9a37d50723e96839635d79191d849
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 9 14:06:54 2013 -0400
+
+    Minor
+
+ src/test.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 22e47456154ca0b8173268486e56ef3a0e1e7150
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 5 18:02:43 2013 -0400
+
+    0.9.15
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 4d4fc920496c95621d5bb4800282ea8c028cdde3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 5 17:58:25 2013 -0400
+
+    [git.mk] Ignore ar-lib
+
+ git.mk | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 587e5753e088b4d0b82c74ddbde790a8369a7517
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 5 12:38:58 2013 -0400
+
+    Add note re Hangul shaping
+
+ src/hb-ot-shape-complex-private.hh | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit 269de14dda7a86a20917fa9ea6a5864929c41364
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 4 23:06:54 2013 -0400
+
+    Don't compose Hangul jamo
+
+    See thread "an issue regarding discrepancy between Korean and Unicode
+    standards" on the mailing list for the rationale.  In short: Uniscribe
+    doesn't, so fonts are designed to work without it.
+
+ src/hb-ot-shape-complex-default.cc   |  6 ------
+ src/hb-ot-shape-normalize-private.hh |  1 -
+ src/hb-ot-shape-normalize.cc         | 11 +++++------
+ 3 files changed, 5 insertions(+), 13 deletions(-)
+
+commit 1f970609850bb4999b94e1e11b764ab4279cbd38
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 4 15:02:03 2013 -0400
+
+    Put back MemoryBarrier fallback implementation on MINGW32
+
+    This almost reverts 2761e8a632c14353f286708898be8df6ebad7407,
+    but only if under MINGW32, so it doesn't affect MSVC.
+
+ src/hb-atomic-private.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit f368ba4a9edec4e297616698097546e8e6c89e53
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 4 14:25:36 2013 -0400
+
+    [Arabic] Zero marks by GDEF, not Unicode category
+
+    Testing shows that this is closer to what Uniscribe does.
+
+    Reported by Khaled Hosny:
+
+    """
+    commit 568000274c8edb5f41bc4f876ce21fcc8bdaeed8
+    ...
+    This commit is causing a regression with Amiri, the string
+    “هَٰذ” with
+    Uniscribe and HarfBuzz before this commit, gives:
+
+            [uni0630.fina=3+965|uni0670.medi=0+600|uni064E=0@-256,0+0|uni0647.init=0+926]
+
+    But now it gives:
+
+            [uni0630.fina=3+965|uni0670.medi=0+0|uni064E=0@-256,0+0|uni0647.init=0+926]
+
+    i.e. uni0670.medi is zeroed though it has a base glyph GDEF class.
+    """
+
+    The test case is U+0647,U+064E,U+0670,U+0630 with Amiri.
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3b80674c50b8c3133848a4034f7106b2b9bfe224
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 4 12:06:46 2013 -0400
+
+    Bug 63107 - FTBFS on ppc64: symbols marked with 'D' on powerpc64
+    instead
+
+ src/check-symbols.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7148dc1a978610af25b4f490691a62d709c8c463
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 2 14:08:53 2013 -0400
+
+    [graphite2] Don't crash if language is not set
+
+    https://bugs.webkit.org/show_bug.cgi?id=113796
+
+ src/hb-graphite2.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a88a62f70f87563725d47b9b6824565e5d6b78ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 21 21:02:16 2013 -0400
+
+    Minor
+
+ src/hb-ot-shape-normalize.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 0a2b2a505b647f6b4802750c87cd9c5f0baaadef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 21 16:26:39 2013 -0400
+
+    Remove gthread leftovers
+
+    We don't use gthread anymore, remove leftovers.
+
+ configure.ac         | 6 ------
+ test/api/Makefile.am | 4 ++--
+ test/api/hb-test.h   | 3 ---
+ 3 files changed, 2 insertions(+), 11 deletions(-)
+
+commit b93de1ea085bfc0661ce3ad0e21fb5eba722c951
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 21 16:25:20 2013 -0400
+
+    Minor
+
+ configure.ac | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit f872a17462a75a3493623747bf3a3fbe54556c7b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 21 13:38:06 2013 -0400
+
+    0.9.14
+
+ NEWS         | 14 ++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+commit cc50bf5b13bfe88137fa7a42782872c40fb9aefb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 19 06:59:40 2013 -0400
+
+    Remove Hangul filler characters from Default_Ignorable chars
+
+    See discussion on mailing list.
+
+ src/hb-unicode-private.hh                                      |
+ 10 +++++++---
+ .../texts/in-tree/shaper-default/script-hangul/misc/misc.txt   |  1 +
+ 2 files changed, 8 insertions(+), 3 deletions(-)
+
+commit a8cf7b43fa795150ae3d42d64424bb6e0373d0b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 19 05:53:26 2013 -0400
+
+    [Indic] Futher adjust ZWJ handling in Indic-like shapers
+
+    After the Ngapi hackfest work, we were assuming that fonts
+    won't use presentation features to choose specific forms
+    (eg. conjuncts).  As such, we were using auto-joiner behavior
+    for such features.  It proved to be troublesome as many fonts
+    used presentation forms ('pres') for example to form conjuncts,
+    which need to be disabled when a ZWJ is inserted.
+
+    Two examples:
+
+            U+0D2F,U+200D,U+0D4D,U+0D2F with kartika.ttf
+            U+0995,U+09CD,U+200D,U+09B7 with vrinda.ttf
+
+    What we do now is to never do magic to ZWJ during GSUB's main input
+    match for Indic-style shapers.  Note that backtrack/lookahead
+    are still
+    matched liberally, as is GPOS.  This seems to be an acceptable
+    compromise.
+
+    As to the bug that initially started this work, that one needs to
+    be fixed differently:
+
+      Bug 58714 - Kannada u+0cb0 u+200d u+0ccd u+0c95 u+0cbe does not
+      provide same results as Windows8
+      https://bugs.freedesktop.org/show_bug.cgi?id=58714
+
+    New numbers:
+
+    BENGALI: 353689 out of 354188 tests passed. 499 failed (0.140886%)
+    DEVANAGARI: 707305 out of 707394 tests passed. 89 failed (0.0125814%)
+    GUJARATI: 366349 out of 366457 tests passed. 108 failed (0.0294714%)
+    GURMUKHI: 60706 out of 60747 tests passed. 41 failed (0.067493%)
+    KANNADA: 951030 out of 951913 tests passed. 883 failed (0.0927606%)
+    KHMER: 299070 out of 299124 tests passed. 54 failed (0.0180527%)
+    LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
+    MALAYALAM: 1048102 out of 1048334 tests passed. 232 failed
+    (0.0221304%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271666 out of 271847 tests passed. 181 failed (0.0665816%)
+    TAMIL: 1091753 out of 1091754 tests passed. 1 failed (9.15957e-05%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+    TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)
+
+ src/hb-ot-layout-gsubgpos-private.hh               | 30
+ ++++++++--------------
+ src/hb-ot-layout-private.hh                        |  4 +--
+ src/hb-ot-layout.cc                                |  8 +++---
+ src/hb-ot-map-private.hh                           |  8 +++---
+ src/hb-ot-map.cc                                   | 18 ++++++-------
+ src/hb-ot-shape-complex-arabic-fallback.hh         |  2 +-
+ src/hb-ot-shape-complex-indic.cc                   | 30
+ +++++++++++-----------
+ src/hb-ot-shape-complex-myanmar.cc                 |  4 +--
+ src/hb-ot-shape-complex-sea.cc                     |  4 +--
+ src/hb-ot-shape-fallback.cc                        |  2 +-
+ .../indic/script-bengali/misc/misc.txt             |  1 +
+ .../indic/script-malayalam/misc/misc.txt           |  1 +
+ 12 files changed, 53 insertions(+), 59 deletions(-)
+
+commit 8226fb56f131362db877dc4be6857c684b8fd022
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 19 05:22:27 2013 -0400
+
+    Allow disabling ICU by using a fake icu-config script
+
+ configure.ac | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a1f3e8ccbfad0d1148b905ae008ba63a26090cb9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 11 20:18:49 2013 -0400
+
+    [travis] Install libicu
+
+ .travis.yml | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 14cfab52daa8d22b843110f32ca09af5bbc855a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 11 19:53:44 2013 -0400
+
+    Add build system fallback to icu-config
+
+    Ubuntu doesn't (or didn't until recently?) ship icu pkg-config
+    files.  That's quite unfortunate.  Work around it.
+
+    Bug 57608 - ICU Detection fallback for non-pkgconfig systems
+
+ configure.ac | 37 +++++++++++++++++++++++++++++++++++++
+ 1 file changed, 37 insertions(+)
+
+commit 190e19e6842875c7a487c66235300ee6b42fb5da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 9 20:30:22 2013 -0500
+
+    [ft] Remove TODO items that I'm not going to fix
+
+ src/hb-ft.cc | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit 392ee97431b368ee74e1b521fd539b69d2efadfb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 9 20:27:55 2013 -0500
+
+    [ft] Remove TODO item re FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH
+
+    That flag is redundant, deprecated, and ignored since April 2011.
+    From FreeType git log:
+
+    commit 8c82ec5b17d0cfc9b0876a2d848acc207a62a25a
+    Author: Behdad Esfahbod <behdad@behdad.org>
+    Date:   Thu Apr 21 08:21:37 2011 +0200
+
+        Always ignore global advance.
+
+        This makes FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH redundant,
+        deprecated, and ignored.  The new behavior is what every
+        major user
+        of FreeType has been requesting.  Global advance is broken in many
+        CJK fonts.  Just ignoring it by default makes most sense.
+
+        * src/truetype/ttdriver.c (tt_get_advances),
+        src/truetype/ttgload.c (TT_Get_HMetrics, TT_Get_VMetrics,
+        tt_get_metrics, compute_glyph_metrics, TT_Load_Glyph),
+        src/truetype/ttgload.h: Implement it.
+
+        * docs/CHANGES: Updated.
+
+ src/hb-ft.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit c5d91f39802078fc6f6de71940739ec4d04eca07
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 9 04:34:21 2013 -0500
+
+    Add hb_auto_array_t
+
+ src/hb-private.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit ee5464d17fa4c59f5adaaa13dde70dd5264dbc64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 9 01:59:30 2013 -0500
+
+    [OTLayout] Move code around
+
+ src/hb-ot-layout-gpos-table.hh |  33 ++++++------
+ src/hb-ot-layout-gsub-table.hh | 115
+ +++++++++++++++++++++--------------------
+ 2 files changed, 75 insertions(+), 73 deletions(-)
+
+commit 9c5a9ee967120c8a968a1160c420e03620d46c24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 9 01:55:04 2013 -0500
+
+    [OTLayout] Rename process() to dispatch()
+
+ src/hb-open-type-private.hh          |  2 +-
+ src/hb-ot-layout-gpos-table.hh       | 80
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gsub-table.hh       | 78
+ +++++++++++++++++------------------
+ src/hb-ot-layout-gsubgpos-private.hh | 36 ++++++++--------
+ 4 files changed, 98 insertions(+), 98 deletions(-)
+
+commit 2761e8a632c14353f286708898be8df6ebad7407
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 7 20:51:30 2013 -0500
+
+    [win32] Remove MemoryBarrier() fallback implementation
+
+    I added these because the older mingw32 toolchain didn't have
+    MemoryBarrier().  The newer mingw-w64 toolchain however has.
+    As reported by John Emmas this was causing build failure with
+    MSVC (on glib) because of inline issues.  But that reminded me
+    that we may be taking this path even if the system implements
+    MemoryBarrier as a function, which is a waste.  So, just remove
+    it.
+
+ src/hb-atomic-private.hh | 14 +-------------
+ 1 file changed, 1 insertion(+), 13 deletions(-)
+
+commit ea11abfc5de8bc5cf651b37c9570593eed6a8f9b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 6 20:21:11 2013 -0500
+
+    [build] Port to newer automake recommended syntax
+
+ test/api/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c39def9bc71559d59325a2c3282c1cec4286b2ae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 6 20:20:45 2013 -0500
+
+    Move valgrind suppressions to the correct directory
+
+ test/{ => api}/.valgrind-suppressions | 0
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit a8ac1d33c731f6200ee472ab6c37a80b72770564
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 6 20:05:34 2013 -0500
+
+    [build] Add AM_PROG_AR
+
+    Newer automake / libtools warns otherwise.
+
+ configure.ac | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5594c2d112c295147ee69215a2ce9dfd99984aa0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 6 19:37:31 2013 -0500
+
+    [FT] Just return if glyph name not found
+
+    The fallback happens in higher level already.  No need to do here.
+
+ src/hb-ft.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit fb7c182bf92142540bff1ad7fb82de0d115fb2b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 6 00:53:24 2013 -0500
+
+    [Indic] Minor
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8144936d072f94104242edf9e7aaa31d315b4094
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 5 20:08:59 2013 -0500
+
+    [Indic] Work around fonts with broken new-spec tables
+
+    See comments, and this thread:
+
+    http://lists.freedesktop.org/archives/harfbuzz/2013-March/002990.html
+
+    Originally reported here:
+
+    https://code.google.com/p/chromium/issues/detail?id=96143
+
+    Doesn't change test suite numbers.
+
+ src/hb-ot-shape-complex-indic.cc | 42
+ +++++++++++++++++++++++++++-------------
+ 1 file changed, 29 insertions(+), 13 deletions(-)
+
+commit dfb799f57572e8123035a42a30f93c7fc4d37692
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 5 17:23:33 2013 -0500
+
+    [travis] Oops.  Run make check, not make test!
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8bdce1cac1be9e79344c1f9a9811d98ed2e5c5fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 5 02:35:31 2013 -0500
+
+    Run autogen.sh, not configure, in travis-ci
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5f705b437cb116275a8c20366e694d740bce715c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 5 01:37:44 2013 -0500
+
+    Add .travis.yml for continuous building with travis-ci.org
+
+    Notifications sent to IRC channel and mailing list.
+
+ .travis.yml | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit cd54d505d1a2467a67e5ff96fe0eb101b953b265
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 4 21:29:38 2013 -0500
+
+    Fix distcheck
+
+ src/Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 22c625a490bbaac52ead2cd29ee49b170e6e9845
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 4 20:56:15 2013 -0500
+
+    [git.mk] Update to commit efc928222179576270c5910416d8055dd7a97896
+
+        Move reusable list of files into variable definitions modules can
+        reuse
+
+ Makefile.am | 22 ++++------------------
+ git.mk      | 59
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
+ 2 files changed, 60 insertions(+), 21 deletions(-)
+
+commit 66f7b3509a121b8f3289ad4c4aed2b5b10a6de2e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 4 18:52:12 2013 -0500
+
+    Add libtool m4 macros to MAINTAINERCLEANFILES
+
+ Makefile.am | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 41732f1fe3ce856d8bb95850635034537b6ba047
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 27 20:40:54 2013 -0500
+
+    [Indic] Help compiler put indic_features table in .rodata
+
+    The overridden "or" operator was preventing the flag expression from
+    being const, and putting the table in .data instead or .rodata.
+
+ src/hb-ot-map-private.hh         |  2 ++
+ src/hb-ot-shape-complex-indic.cc | 24 ++++++++++++------------
+ 2 files changed, 14 insertions(+), 12 deletions(-)
+
+commit 778d7f844cb330289830c95431269db06ba1c969
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 27 18:47:26 2013 -0500
+
+    [buffer] Better parse glyph names
+
+ src/hb-buffer-deserialize-json.rl | 9 ++++++---
+ src/hb-buffer-deserialize-text.rl | 5 ++++-
+ 2 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 20b817ac21147e0a8edbf23ef071c2f4ce6c2b95
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 27 18:39:37 2013 -0500
+
+    [buffer] Implement buffer deserialization for format=json
+
+    Using a ragel machine.
+
+ src/Makefile.am                   |   2 +
+ src/hb-buffer-deserialize-json.rl | 129
+ ++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer-deserialize-text.rl |  52 +--------------
+ src/hb-buffer-serialize.cc        |  45 +++++++++++--
+ src/hb-private.hh                 |   6 +-
+ src/hb-shape.cc                   |   2 -
+ src/test-buffer-serialize.cc      |   4 +-
+ 7 files changed, 179 insertions(+), 61 deletions(-)
+
+commit 847794e929831750e97525137ab5e285ccd1064e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 27 17:59:28 2013 -0500
+
+    [buffer] Implement buffer deserialization for format=text
+
+    Using a ragel machine.
+
+ src/Makefile.am                   |   2 +
+ src/hb-buffer-deserialize-text.rl | 169
+ ++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer-private.hh          |   3 +-
+ src/hb-buffer-serialize.cc        |  36 +++-----
+ src/hb-buffer.cc                  |  13 ++-
+ src/hb-buffer.h                   |   2 +-
+ src/hb-private.hh                 |   5 +-
+ src/hb-shape.cc                   |   9 +-
+ src/test-buffer-serialize.cc      |  16 +++-
+ 9 files changed, 221 insertions(+), 34 deletions(-)
+
+commit 4ee803b42a3baae4b0f295a07cb7ad591a538e4c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 27 16:09:55 2013 -0500
+
+    [buffer] Fix serializing of buffer with invalid direction
+
+ src/hb-buffer-serialize.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e54dd26300f50eb19907a9d39269a363279b3e07
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 27 13:01:02 2013 -0500
+
+    [buffer] Start implementing buffer deserialization
+
+ src/Makefile.am              |  12 ++++-
+ src/hb-buffer-serialize.cc   |  64 ++++++++++++++++++++++--
+ src/hb-buffer.h              |   2 +-
+ src/test-buffer-serialize.cc | 114
+ +++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 187 insertions(+), 5 deletions(-)
+
+commit bcc8f32b4c46cd73f591924c64a6f63df6eaf9e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 27 12:02:42 2013 -0500
+
+    [buffer] Minor
+
+ src/hb-buffer-serialize.cc | 10 +++++++---
+ src/hb-buffer.h            |  4 ++--
+ 2 files changed, 9 insertions(+), 5 deletions(-)
+
+commit d3e14aafff60e1314d0ef66e42cdde6bf949bb66
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 27 11:06:36 2013 -0500
+
+    [buffer] Move buffer serialization code to a new file
+
+ Android.mk                 |   1 +
+ src/Makefile.am            |   1 +
+ src/hb-buffer-serialize.cc | 251
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.cc           | 228 ----------------------------------------
+ 4 files changed, 253 insertions(+), 228 deletions(-)
+
+commit 8da51112696ec8641d7dd9184b7ab1dd48458813
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 27 17:48:31 2013 -0500
+
+    Minor
+
+ src/hb-shape.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 94789fd6012125acc8426dd88df97f03b0948ea5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 26 21:22:37 2013 -0500
+
+    [Indic] Sort pre-base reordering consonants with post-forms
+
+    Before, we were marking them as below-form for initial reordering.
+    However, there is a rule that says "post consonants should follow
+    below consonsnts" for base determination purposes.  Malayalam has
+    port-form YA/VA, and RA is pre-base.  As such, for a sequence like
+    YA,Virama,YA,Virama,RA, the correct base is at index 0.  But
+    because the code was seeing RA as a below-base, it was stopping at
+    the second YA as base, instead of jumping it as a post-base.
+
+    By treating prebase-reordering consonants like post-forms, this
+    is fixed.
+
+    MALAYALAM went down from 351 to 265.  Other numbers didn't change:
+
+    BENGALI: 353686 out of 354188 tests passed. 502 failed (0.141733%)
+    DEVANAGARI: 707305 out of 707394 tests passed. 89 failed (0.0125814%)
+    GUJARATI: 366262 out of 366457 tests passed. 195 failed (0.0532122%)
+    GURMUKHI: 60706 out of 60747 tests passed. 41 failed (0.067493%)
+    KANNADA: 950680 out of 951913 tests passed. 1233 failed (0.129529%)
+    KHMER: 299074 out of 299124 tests passed. 50 failed (0.0167155%)
+    LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
+    MALAYALAM: 1048069 out of 1048334 tests passed. 265 failed
+    (0.0252782%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271539 out of 271847 tests passed. 308 failed (0.113299%)
+    TAMIL: 1091753 out of 1091754 tests passed. 1 failed (9.15957e-05%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+    TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6d69a2cec158061ef097c488d08813c9503824b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 26 19:35:50 2013 -0500
+
+    [tests] Add Malayalam tests frim cibu
+
+ .../indic/script-malayalam/misc/MANIFEST           |   1 +
+ .../indic/script-malayalam/misc/cibu.txt           | 188
+ +++++++++++++++++++++
+ 2 files changed, 189 insertions(+)
+
+commit 1edc6b97b67363d55cfb5914c991ae54d42a6440
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 26 15:01:45 2013 -0500
+
+    Update Android.mk
+
+ Android.mk | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 05d5d3cd63ba2fadfdb62190dd24ef80ee3df40c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 25 23:57:51 2013 -0500
+
+    Fix "comparison between signed and unsigned" warnings
+
+    Patch from Jonathan Kew.
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 07a52b62115f10caea5c2d174a4272eb9ddb2284
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 25 19:09:57 2013 -0500
+
+    Give up sanitizing after 100 edit requests
+
+    Such fonts are *definitely* really broken.  Give up.
+    Limits time spent in sanitize for extremely / deliberately broken
+    fonts.  For example, two fonts with these md5sum / names:
+
+      9343f0a1b8c84b8123e7d201cae62ffd.ttf
+      eb8c978547f09d368fc204194fb34688.ttf
+
+    were spending over a second in sanitize!  Not anymore.
+
+ src/hb-open-type-private.hh | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 29ff25481584e20a2fa39195f295c8eb4bf3bad0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 25 19:04:56 2013 -0500
+
+    Add HB_DEBUG_VERBOSE
+
+    Only affects the verbosity of function name printing right now.
+
+ src/hb-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 05686b5f697ed40dd21b330d044c3c286461fb26
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 25 18:19:20 2013 -0500
+
+    0.9.13
+
+ NEWS         | 29 +++++++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 30 insertions(+), 1 deletion(-)
+
+commit 9e5ac7b8c02c86a4f28c79173a5237503eaa7115
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 25 17:54:10 2013 -0500
+
+    Fix blob test to match c3ba49b6fa1865e8318926eaa6c0f2063d1053bb
+
+ test/api/test-blob.c | 57
+ ++++++++++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 51 insertions(+), 6 deletions(-)
+
+commit c3ba49b6fa1865e8318926eaa6c0f2063d1053bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 25 17:06:35 2013 -0500
+
+    Always create sub-blobs in MEMORY_MODE_READONLY
+
+    This fixes a design bug with sanitize and sub-blobs that can
+    cause crashes.  Jonathan and I found and debugged this issue
+    when we tested a corrupt font with the md5sum / filename:
+    ea395483d37af0cb933f40689ff7b60a.  Two hours of intense
+    debugging we found out that the font has overlapping GSUB/GPOS
+    tables, and as such, sanitizing the second table can modify
+    the first one, which can cause all kinds of undefined behavior.
+
+    The correct way to fix this is to make sure sub-blobs are
+    always created readonly, since we consider the parent blob
+    to be a shared resource and can't modify it, even if it *is*
+    writable.
+
+    This essentially makes the READONLY_MAY_MAKE_WRITABLE mode
+    unused...  Maybe we should simply remove / deprecate it.
+
+ src/hb-blob.cc |  2 +-
+ src/hb-blob.h  | 26 ++++++++++++++++++++++++++
+ 2 files changed, 27 insertions(+), 1 deletion(-)
+
+commit 57542d7f411c71d9b8110ce6f64090b2c0f6a925
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 21 15:54:05 2013 -0500
+
+    Minor
+
+ src/hb-ot-layout-private.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit d46606e119b48dcca375d6313abd0f93ba5d09c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 21 15:39:57 2013 -0500
+
+    Port TrueType-kerning to use skippy iterator
+
+    It skips joiners and default ignorables now.  Skips marks too,
+    but only
+    if there is proper GDEF classes for marks.
+
+ src/hb-ot-shape-fallback.cc | 50
+ +++++++++++++++++++++++++--------------------
+ 1 file changed, 28 insertions(+), 22 deletions(-)
+
+commit 722e8b857eafc52e07dee5d9b253b88ed5c5c8ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 21 15:37:51 2013 -0500
+
+    Fixup previous commit
+
+    Was not decreasing num_items.  Ouch!
+
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit ba87b8fc89bf745068ccd19264a2631ea0904846
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 21 15:23:39 2013 -0500
+
+    Move code around
+
+ src/hb-ot-shape-fallback-private.hh |  5 +++++
+ src/hb-ot-shape-fallback.cc         | 40
+ +++++++++++++++++++++++++++++++++++++
+ src/hb-ot-shape.cc                  | 38
+ +----------------------------------
+ 3 files changed, 46 insertions(+), 37 deletions(-)
+
+commit 2b2a6e8944144755ab641f2842e36d9a847719f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 21 15:07:03 2013 -0500
+
+    [OTLayout] Correctly skip Default_Ignorable when match_func not set
+
+    When a match_func was not set on the matcher_t object (ie. from GPOS),
+    then the Default_Ignorables (including joiners) were never skipped.
+    This meant that they were not skipped as they should during GPOS
+    matching.  Fix that.
+
+    A few Indic numbers have "regressed": BENGALI and DEVANAGARI went
+    up from 290 and 58 respectively, but in both cases new results are
+    superior to Uniscribe, as they apply GPOS when we weren't (and
+    Uniscribe isn't) before.
+    BENGALI: 353686 out of 354188 tests passed. 502 failed (0.141733%)
+    DEVANAGARI: 707305 out of 707394 tests passed. 89 failed (0.0125814%)
+    GUJARATI: 366262 out of 366457 tests passed. 195 failed (0.0532122%)
+    GURMUKHI: 60706 out of 60747 tests passed. 41 failed (0.067493%)
+    KANNADA: 950680 out of 951913 tests passed. 1233 failed (0.129529%)
+    KHMER: 299074 out of 299124 tests passed. 50 failed (0.0167155%)
+    LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
+    MALAYALAM: 1047983 out of 1048334 tests passed. 351 failed
+    (0.0334817%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271539 out of 271847 tests passed. 308 failed (0.113299%)
+    TAMIL: 1091753 out of 1091754 tests passed. 1 failed (9.15957e-05%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+    TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)
+
+ src/hb-ot-layout-gsubgpos-private.hh | 32
+ ++++++++++++++++++++++----------
+ 1 file changed, 22 insertions(+), 10 deletions(-)
+
+commit ff93ac8cb24cbc3d9dc1a2bfb0faa88950f4a507
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 21 14:51:40 2013 -0500
+
+    Minor
+
+ src/hb-ot-layout-gsubgpos-private.hh | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit e0486fc1affd3796fb8f664e2e7fc208f1d2106c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 19 00:58:10 2013 -0500
+
+    [tests] Add Myanmar torture tests from Martin Hosken
+
+ .../shaper-myanmar/script-myanmar/misc/MANIFEST    |  1 +
+ .../shaper-myanmar/script-myanmar/misc/torture.txt | 23
+ ++++++++++++++++++++++
+ 2 files changed, 24 insertions(+)
+
+commit a3df9a7bf87aeba7a3d6110cd5e01a65bd0b16d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 19 00:50:46 2013 -0500
+
+    Minor
+
+    Moving files around
+
+ test/shaping/texts/in-tree/MANIFEST                                     |
+ 2 --
+ test/shaping/texts/in-tree/shaper-default/MANIFEST                      |
+ 2 ++
+ .../in-tree/{script-default => shaper-default/script-hangul}/MANIFEST
+ | 0
+ .../{script-default => shaper-default/script-hangul}/misc/MANIFEST
+ | 0
+ .../{shaper-hangul => shaper-default}/script-hangul/misc/misc.txt
+ | 0
+ .../script-hangul => shaper-default/script-tibetan}/MANIFEST            |
+ 0
+ .../script-hangul => shaper-default/script-tibetan}/misc/MANIFEST
+ | 0
+ .../{script-default => shaper-default/script-tibetan}/misc/misc.txt
+ | 0
+ test/shaping/texts/in-tree/shaper-hangul/MANIFEST                       |
+ 1 -
+ 9 files changed, 2 insertions(+), 3 deletions(-)
+
+commit b1f440759161cb5a54e1b1b910f3a8383b8e8472
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 17 12:12:37 2013 -0500
+
+    [SEA] Fix order of pre-base reordering Ra and left matras
+
+    The code was confused because it was expecting left matra to have
+    POS_PRE_M, like we do in the Myanmar shaper, but that is not what
+    we were doing in this shaper.  Rewrite to rely on category only.
+
+    Test case: U+AA06,U+AA34,U+AA2F
+
+ src/hb-ot-shape-complex-sea.cc                              | 13
+ +++++++------
+ .../texts/in-tree/shaper-sea/script-cham/misc/misc.txt      |  1 +
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+commit 99fa9ea020f26ed2697f38a7690ee1e1b5d946c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 15 11:47:24 2013 -0500
+
+    Minor
+
+ src/hb-ot-layout-gsub-table.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 27589620ba2dcf356fd7fa21cd80221a07803202
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 15 11:47:09 2013 -0500
+
+    [OTLayout] Remove unused code
+
+ src/hb-open-type-private.hh | 5 -----
+ 1 file changed, 5 deletions(-)
+
+commit ebb77b9c5e357ff7c9badb0f4bf1c3a965c3e91d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 15 09:33:10 2013 -0500
+
+    Remove TODO items that don't make sense
+
+    The spec says those features need to be disabled by default.
+
+ TODO | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit c2a1cdc4c4cc51f4680ebc4ec2c462cb660f9492
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 15 09:27:02 2013 -0500
+
+    [Arabic] Fix shaping of left-joining 'Phags-Pa U+A872
+
+    This is the first character in Unicode to have Arabic left-joining
+    behavior.  Update the machine to recognize that.
+
+    Test case: U+A840,U+A872,U+A840.
+
+ src/hb-ot-shape-complex-arabic.cc | 40
+ +++++++++++++++++++--------------------
+ 1 file changed, 19 insertions(+), 21 deletions(-)
+
+commit 05ac87813d17d9ebbfa315eee3f80f25b53135c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 15 09:26:41 2013 -0500
+
+    [tests] Add Syriac Alaph shaping test cases
+
+ .../shaper-arabic/script-syriac/misc/MANIFEST      |  1 +
+ .../shaper-arabic/script-syriac/misc/alaph.txt     | 98
+ ++++++++++++++++++++++
+ 2 files changed, 99 insertions(+)
+
+commit c462b32dcb883a7aca066af24c4d28c7a2b7fa28
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 15 07:51:47 2013 -0500
+
+    Disable automatic segment properties guessing
+
+    Before, if one called hb_shape() without setting script, language, and
+    direction on the buffer, hb_shape() was calling
+    hb_buffer_guess_segment_properties() on the user's behalf to guess
+    these.
+
+    This is very dangerous, since any serious user of HarfBuzz must set
+    these properly (specially important is direction).  So now, we don't
+    guess properties by default.  People not setting direction will get
+    an abort() now.  If the old behavior is desired (fragile, good for
+    simple testing only), users can call
+    hb_buffer_guess_segment_properties() on the buffer just before calling
+    hb_shape().
+
+ src/hb-fallback-shape.cc | 1 -
+ src/hb-ot-shape.cc       | 2 --
+ src/hb-shape.cc          | 2 --
+ util/options.hh          | 1 +
+ 4 files changed, 1 insertion(+), 5 deletions(-)
+
+commit 7abddbb47a489aaac8e76ac6e700cd815739b1d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 15 07:46:57 2013 -0500
+
+    Add assertions for a couple programmer errors
+
+ src/hb-shape-plan.cc | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 038c98f6866fe1177b04bd2ae3bb461b2f0fd1ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 15 07:41:07 2013 -0500
+
+    Allow disabling of TrueType kerning
+
+    Responds to the same feature tag that GPOS kerning does:
+    'kern' for horizontal and 'vkrn' for vertical.
+
+ TODO               |  2 --
+ src/hb-ot-shape.cc | 55
+ ++++++++++++++++++++++++++++++++++--------------------
+ 2 files changed, 35 insertions(+), 22 deletions(-)
+
+commit 398238a2526d322eb79e255c24634a275473920f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 15 07:40:10 2013 -0500
+
+    Fix partial disabling of default-on features
+
+    Surprisingly, if user ever tried to turn a default feature off
+    partially
+    (say, disable liga for a range), the feature was being turned off
+    globally!  Fixed now.
+
+ src/hb-ot-map.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit cb90b1bbe6d27ca6968b70d2dbfea7ab7fb73293
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 15 07:02:08 2013 -0500
+
+    [OTLayout] Respect syllable boundaries for backtrack/lookahead
+    matching
+
+    Originally we meant to match backtrack/lookahead across syllable
+    boundaries.  But a bug in the code meant that this was NOT done for
+    backtrack.  We "fixed" that in
+    2c7d0b6b80d412de3fddd443ed1a485ea1cbb03c,
+    but that broke Myanmar shaping.
+
+    We now believe that for Indic-like shapers (which is where syllables
+    are
+    used), all basic shaping forms should be fully contained within their
+    syllables, so now we limit backtrack/lookahead matching to the
+    syllable
+    too.  Unbreaks Myanmar.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ee9c3a17d0bf263c5eee479fd778db97cff8e189
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 15 06:22:26 2013 -0500
+
+    Minor refactoring
+
+ src/hb-ot-shape-complex-myanmar.cc | 36
+ ++++++++++--------------------------
+ src/hb-ot-shape-complex-sea.cc     | 37
+ ++++++++++---------------------------
+ src/hb-ot-shape.cc                 | 17 ++++++-----------
+ 3 files changed, 26 insertions(+), 64 deletions(-)
+
+commit cfc507c5432e6327e8484b07b9e091212653bc92
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 14 10:40:12 2013 -0500
+
+    [Indic-like] Disable automatic joiner handling for basic shaping
+    features
+
+    Not for Arabic, but for Indic-like scripts.  ZWJ/ZWNJ have special
+    meanings in those scripts, so let font lookups take full control.
+
+    This undoes the regression caused by automatic-joiners handling
+    introduced two commits ago.
+
+    We only disable automatic joiner handling for the "basic shaping
+    features" of Indic, Myanmar, and SEAsian shapers.  The "presentation
+    forms" and other features are still applied with automatic-joiner
+    handling.
+
+    This change also changes the test suite failure statistics, such that
+    a few scripts show more "failures".  The most affected is Kannada.
+    However, upon inspection, we believe that in most, if not all, of the
+    new failures, we are producing results superior to Uniscribe.  Hard to
+    count those!
+
+    Here's an example of what is fixed by the recent joiner-handling
+    changes:
+
+      https://bugs.freedesktop.org/show_bug.cgi?id=58714
+
+    New numbers, for future reference:
+
+    BENGALI: 353892 out of 354188 tests passed. 296 failed (0.0835714%)
+    DEVANAGARI: 707336 out of 707394 tests passed. 58 failed (0.00819911%)
+    GUJARATI: 366262 out of 366457 tests passed. 195 failed (0.0532122%)
+    GURMUKHI: 60706 out of 60747 tests passed. 41 failed (0.067493%)
+    KANNADA: 950680 out of 951913 tests passed. 1233 failed (0.129529%)
+    KHMER: 299074 out of 299124 tests passed. 50 failed (0.0167155%)
+    LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
+    MALAYALAM: 1047983 out of 1048334 tests passed. 351 failed
+    (0.0334817%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271539 out of 271847 tests passed. 308 failed (0.113299%)
+    TAMIL: 1091753 out of 1091754 tests passed. 1 failed (9.15957e-05%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+    TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)
+
+ src/hb-ot-layout-gsubgpos-private.hh       | 35
+ +++++++++++++++++++-----------
+ src/hb-ot-layout-private.hh                |  6 +++--
+ src/hb-ot-layout.cc                        | 10 +++++----
+ src/hb-ot-map-private.hh                   | 12 ++++++----
+ src/hb-ot-map.cc                           | 32
+ +++++++++++++++++++++------
+ src/hb-ot-shape-complex-arabic-fallback.hh |  2 +-
+ src/hb-ot-shape-complex-indic.cc           | 29 +++++++++++++------------
+ src/hb-ot-shape-complex-myanmar.cc         |  4 ++--
+ src/hb-ot-shape-complex-sea.cc             |  4 ++--
+ 9 files changed, 85 insertions(+), 49 deletions(-)
+
+commit 0b45479198d61d5135dad771e9c68408eb13f930
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 14 10:46:52 2013 -0500
+
+    [OTLayout] Add fine-grained control over ZWJ matching
+
+    Not used yet.  Next commit...
+
+ src/hb-ot-layout-gsubgpos-private.hh | 10 ++++++++--
+ src/hb-ot-layout-private.hh          | 11 +++++++++--
+ 2 files changed, 17 insertions(+), 4 deletions(-)
+
+commit 607feb7cff0e50f8738d2e49ca463fc9d7d494de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 14 07:43:13 2013 -0500
+
+    [OTLayout] Ignore default-ignorables when matching GSUB/GPOS
+
+    When matching lookups, be smart about default-ignorable characters.
+    In particular:
+
+    Do nothing specific about ZWNJ, but for the other default-ignorables:
+
+    If the lookup in question uses the ignorable character in a sequence,
+    then match it as we used to do.  However, if the sequence match will
+    fail because the default-ignorable blocked it, try skipping the
+    ignorable character and continue.
+
+    The most immediate thing it means is that if Lam-Alef forms a
+    ligature,
+    then Lam-ZWJ-Alef will do to.  Finally!
+
+    One exception: when matching for GPOS, or for backtrack/lookahead of
+    GSUB, we ignore ZWNJ too.  That's the right thing to do.
+
+    It certainly is possible to build fonts that this feature will result
+    in undesirable glyphs, but it's hard to think of a real-world case
+    that that would happen.
+
+    This *does* break Indic shaping right now, since Indic Unicode has
+    specific rules for what ZWJ/ZWNJ mean, and skipping ZWJ is breaking
+    those rules.  That will be fixed in upcoming commits.
+
+ src/hb-ot-layout-gpos-table.hh       |   1 +
+ src/hb-ot-layout-gsub-table.hh       |   2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 279
+ ++++++++++++++++++++++++-----------
+ src/hb-ot-layout-private.hh          |  45 ++++++
+ src/hb-ot-shape-private.hh           |  44 ------
+ 5 files changed, 237 insertions(+), 134 deletions(-)
+
+commit ec5448667b30ad662401c2b4f5fc0da524c013fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 14 11:25:10 2013 -0500
+
+    Add hb_ot_map_feature_flags_t
+
+    Code cleanup.  No (intended) functional change.
+
+ src/hb-ot-map-private.hh           | 29 +++++++++++++++++---
+ src/hb-ot-map.cc                   | 24 ++++++++---------
+ src/hb-ot-shape-complex-arabic.cc  |  4 +--
+ src/hb-ot-shape-complex-indic.cc   | 55
+ +++++++++++++++++++-------------------
+ src/hb-ot-shape-complex-myanmar.cc |  4 +--
+ src/hb-ot-shape-complex-sea.cc     |  2 +-
+ src/hb-ot-shape.cc                 |  6 +++--
+ 7 files changed, 74 insertions(+), 50 deletions(-)
+
+commit e7ffcfafb1108801ac504f18f820e497226bf07f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 14 11:05:56 2013 -0500
+
+    Clean-up add_bool_feature
+
+ src/hb-ot-map-private.hh           |  4 ++--
+ src/hb-ot-shape-complex-arabic.cc  | 16 ++++++++--------
+ src/hb-ot-shape-complex-default.cc |  2 +-
+ src/hb-ot-shape-complex-indic.cc   |  8 ++++----
+ src/hb-ot-shape-complex-myanmar.cc |  8 ++++----
+ src/hb-ot-shape-complex-sea.cc     |  8 ++++----
+ src/hb-ot-shape.cc                 | 10 +++++-----
+ 7 files changed, 28 insertions(+), 28 deletions(-)
+
+commit e7562f53fe6a506d2c6d59d6688e4fa468bba462
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 14 11:05:36 2013 -0500
+
+    Fix compile warnings for ragel-generated machines
+
+ src/hb-ot-shape-complex-indic-machine.rl   | 2 +-
+ src/hb-ot-shape-complex-myanmar-machine.rl | 2 +-
+ src/hb-ot-shape-complex-sea-machine.rl     | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 4e51df73a337f7232a7dfa85df78a4f19b24771b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 14 07:42:42 2013 -0500
+
+    [OTLayout] Remove unused function
+
+ src/hb-ot-layout-gsubgpos-private.hh | 5 -----
+ 1 file changed, 5 deletions(-)
+
+commit 8820bb235b1f63e4d93c8a2f5c08b44d89e06b78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 14 07:41:03 2013 -0500
+
+    [OTLayout] Port apply_lookup to skippy_iter
+
+ src/hb-ot-layout-gsubgpos-private.hh | 50
+ +++++++++++++++++++++++++-----------
+ 1 file changed, 35 insertions(+), 15 deletions(-)
+
+commit dfca269f069dae2f99990dac24da15d316eccb9f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 14 07:20:52 2013 -0500
+
+    [OTLayout] Port ligate_input to skippy_iter
+
+ src/hb-ot-layout-gsubgpos-private.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 7e53415c2d8859e8b5948a2edb38c39a8f78b825
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 14 06:24:30 2013 -0500
+
+    [OTLayout] Minor fix for apply_lookup()
+
+    Should NOT change behavior, since first glyph is a match.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit 6880f7e19d44c50e45ecb86d26381aad956d9acb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 13 12:17:25 2013 -0500
+
+    [OTLayout] Make table type known to apply context
+
+ src/hb-ot-layout-gsubgpos-private.hh       | 5 ++++-
+ src/hb-ot-layout.cc                        | 4 ++--
+ src/hb-ot-shape-complex-arabic-fallback.hh | 2 +-
+ 3 files changed, 7 insertions(+), 4 deletions(-)
+
+commit 2c7d0b6b80d412de3fddd443ed1a485ea1cbb03c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 13 12:10:08 2013 -0500
+
+    [OTLayou] Unbreak backtrack matching
+
+    Was introduced by 28b9d502bb69a8045818d5f6113ded9c59a56bd7.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit c074ebc466dcc9bcc0d8a5dd7e942dea974ff718
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 13 11:22:42 2013 -0500
+
+    [OTLayout] Minor refactoring
+
+ src/hb-ot-layout-gpos-table.hh       |  9 ++++++---
+ src/hb-ot-layout-gsubgpos-private.hh | 30 +++++++++++++++++-------------
+ 2 files changed, 23 insertions(+), 16 deletions(-)
+
+commit 407fc12466ef460d0edf11b89f0d04c4d724875f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 13 11:13:06 2013 -0500
+
+    [OTLayout] Remove bogus caching of glyph property
+
+ src/hb-ot-layout-gpos-table.hh       | 21 ++++++++-----------
+ src/hb-ot-layout-gsub-table.hh       |  7 +++----
+ src/hb-ot-layout-gsubgpos-private.hh | 40
+ ++++++++++++++----------------------
+ 3 files changed, 26 insertions(+), 42 deletions(-)
+
+commit 6b1e3502e23c110dd810f854ba021f83baab1548
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 13 11:02:54 2013 -0500
+
+    Remember ZWNJ
+
+    To be used in upcoming changes.
+
+ src/hb-ot-shape-private.hh | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 1f91c39677f840a1f630696d16d083060069abf5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 13 09:38:40 2013 -0500
+
+    Indent
+
+ src/hb-ot-shape-complex-indic.cc | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit a0cb9f33ee064628debe8e848094dfd661334640
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 13 09:26:55 2013 -0500
+
+    [Indic] Improve base finding in final_reordering
+
+    Fixes 5 Malayalam failures!
+
+    MALAYALAM: 1048016 out of 1048334 tests passed. 318 failed
+    (0.0303338%)
+
+ src/hb-ot-shape-complex-indic.cc | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 126f39cd16cea87b2696f66467c83a585bd4c2cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 13 08:29:21 2013 -0500
+
+    Add more dot-reph tests
+
+ .../shaper-indic/indic/script-malayalam/misc/dot-reph.txt      |
+ 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit f22b7e77783fa2f44365e0fe6413c4474c07048d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 13 07:32:46 2013 -0500
+
+    [Indic] Track base position when reordering things
+
+    Ouch, how did things ever work without this?!  The added test that
+    has a
+    dot-reph as well as a pre-base reordering Ra perfectly demonstrates
+    the
+    bug (tested with Nirmala font from Win8 for example).  Testing
+    suggests
+    that Win8 shaper has the *exact* same bug / behavior that we used to
+    have.  Odd.
+
+ src/hb-ot-shape-complex-indic.cc                                    |
+ 6 ++++++
+ .../in-tree/shaper-indic/indic/script-malayalam/misc/dot-reph.txt   | 1 +
+ 2 files changed, 7 insertions(+)
+
+commit bc11de144c0a7a95fa0945aa7f053d8117af282a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 13 05:59:06 2013 -0500
+
+    [SEA] Don't zero any mark advances
+
+    Keep the logic simple, easier to explain to font developers.
+
+ src/hb-ot-shape-complex-sea.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0291a6528685f1f593707655943fb2360579cb9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 13 05:57:24 2013 -0500
+
+    Further adjust mark advance zeroing
+
+    This is a followup to 568000274c8edb5f41bc4f876ce21fcc8bdaeed8.
+    Looks like in the Latin shaper, Uniscribe zeroes all Unicode NSM
+    advances *after* GPOS, not before.  Match that.
+
+    Can be tested using DejaVu Sans Mono, since that font has GPOS
+    rules to zero the mark advances on its own.
+
+ src/hb-ot-shape.cc | 33 +++++++++++++++++++++++----------
+ 1 file changed, 23 insertions(+), 10 deletions(-)
+
+commit 85c51ec2e1d518019e32801ae38659c74fc20d80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 18:17:39 2013 -0500
+
+    [Indic] Fix Eyelash Ra with old Devanagari spec
+
+ src/hb-ot-shape-complex-indic.cc | 32 ++++++++++++++++++++++++++++++++
+ 1 file changed, 32 insertions(+)
+
+commit cc5f24cde079b451799562b3af7ce06d932cbe6b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 18:17:12 2013 -0500
+
+    [tests] Add tests for Devanagary Eyelash Ra
+
+    Currently broken with Sanskrit 2003 font.
+
+ .../texts/in-tree/shaper-indic/indic/script-devanagari/misc/MANIFEST   |
+ 1 +
+ .../in-tree/shaper-indic/indic/script-devanagari/misc/eyelash.txt      |
+ 3 +++
+ 2 files changed, 4 insertions(+)
+
+commit 63e48bc33b68f940c351af623a55a4cf650db102
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 17:57:49 2013 -0500
+
+    [Indic] Apply 'blwf' before 'half'
+
+    This reverts 167b625d988b74572d6b2f646c285b666b650d49.  It didn't
+    matter before, but that's going to change with next commit.
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 70d656571194d2bd32671244530edbe159722cec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 18:01:21 2013 -0500
+
+    [Indic] Apply 'vatu' before 'cjct'
+
+    This essentially reverts 1d6846db9ebf84561bb30a4e48c6c43184914099,
+    but that commit is from way back when.  We should be better
+    following the spec order now again.
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 64bb2ae857cfda35dd71c7f1e962722069674ec6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 16:29:25 2013 -0500
+
+    Didn't mean to push this out
+
+    Ouch!
+
+ test/shaping/hb_test_tools.py | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit f9b660534c269d2257d6b5e8ec2173ee71668f2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 16:13:56 2013 -0500
+
+    [Myanmar] Use master Indic table for syllable data
+
+ src/hb-ot-shape-complex-myanmar.cc | 144
+ +++++++++----------------------------
+ test/shaping/hb_test_tools.py      |   1 +
+ 2 files changed, 35 insertions(+), 110 deletions(-)
+
+commit f60793e854393c32337a483c5d1700bf17d767fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 15:45:59 2013 -0500
+
+    [tests] Add Cham sample
+
+ test/shaping/texts/in-tree/shaper-sea/script-cham/misc/misc.txt | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit e2aab4b5db88c368c11cee81368b9ad41399e585
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 15:35:32 2013 -0500
+
+    Improve checks for setmode()
+
+    As reported by Jonathan, OS X has setmode() that is something other
+    than what setmode() is on Win32.  So, limit invocation to Windows
+    platforms only.
+
+ configure.ac    | 4 ++--
+ util/options.cc | 4 ++--
+ util/options.hh | 2 +-
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit a6c1e040e594faeefd61b456ef995c7886cdea78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 15:31:58 2013 -0500
+
+    Improve check for Windows platforms
+
+    Instead of checking for compiler, check for platform.
+
+ src/hb-atomic-private.hh | 2 +-
+ src/hb-mutex-private.hh  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 9e1f80ab3eea4a74cdaa6a390e4925a479ece1c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 15:28:21 2013 -0500
+
+    [SEA] Treat Consonant_Final like Consonant_Medial
+
+ src/hb-ot-shape-complex-indic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bab02d339f39ed5168daaef9461227f78e596a2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 15:26:45 2013 -0500
+
+    Rename HB_OT_INDIC_OPTIONS env var to HB_OPTIONS
+
+    The Myanmar shaper now respects the uniscribe-bug-compatibility
+    option too.
+
+ src/hb-common.cc                   | 20 ++++++++++++--
+ src/hb-ot-shape-complex-indic.cc   | 53
+ ++++----------------------------------
+ src/hb-ot-shape-complex-myanmar.cc |  7 ++---
+ src/hb-private.hh                  | 29 +++++++++++++++++++++
+ 4 files changed, 54 insertions(+), 55 deletions(-)
+
+commit 3a83d33ec0b1be6f5992816ff5ebb0f43c8dff00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 12:14:10 2013 -0500
+
+    Add South-East Asian shaper
+
+    Handles Tai Tham, Cham, and New Tai Lue for now.
+
+ src/Makefile.am                                    |  12 +-
+ src/gen-indic-table.py                             |   9 +-
+ src/hb-ot-shape-complex-indic-private.hh           | 241 +------------
+ ...table.hh => hb-ot-shape-complex-indic-table.cc} |   9 +-
+ src/hb-ot-shape-complex-indic.cc                   | 239 ++++++++++++
+ src/hb-ot-shape-complex-myanmar.cc                 |   2 +-
+ src/hb-ot-shape-complex-private.hh                 |  28 +-
+ src/hb-ot-shape-complex-sea-machine.rl             | 102 ++++++
+ src/hb-ot-shape-complex-sea.cc                     | 400
+ +++++++++++++++++++++
+ test/shaping/texts/in-tree/MANIFEST                |   1 +
+ .../in-tree/shaper-indic/south-east-asian/MANIFEST |   1 -
+ test/shaping/texts/in-tree/shaper-myanmar/MANIFEST |   1 +
+ test/shaping/texts/in-tree/shaper-sea/MANIFEST     |   3 +
+ .../script-cham}/MANIFEST                          |   0
+ .../script-cham}/misc/MANIFEST                     |   0
+ .../in-tree/shaper-sea/script-cham/misc/misc.txt   |   1 +
+ .../in-tree/shaper-sea/script-new-tai-lue/MANIFEST |   1 +
+ .../shaper-sea/script-new-tai-lue/misc/MANIFEST    |   1 +
+ .../script-new-tai-lue/misc/misc.txt               |   0
+ .../in-tree/shaper-sea/script-tai-tham/MANIFEST    |   1 +
+ .../shaper-sea/script-tai-tham/misc/MANIFEST       |   1 +
+ .../shaper-sea/script-tai-tham/misc/misc.txt       |   2 +
+ 22 files changed, 792 insertions(+), 263 deletions(-)
+
+commit fb960212063016656dfaba83f072c81d1efc3202
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 10:33:58 2013 -0500
+
+    Minor test reshufflings
+
+ test/shaping/texts/in-tree/MANIFEST
+ | 1 +
+ .../{shaper-indic/south-asian/script-tibetan => script-default}/MANIFEST
+ | 0
+ .../south-asian/script-tibetan => script-default}/misc/MANIFEST
+ | 0
+ .../south-asian/script-tibetan => script-default}/misc/misc.txt
+ | 0
+ test/shaping/texts/in-tree/shaper-indic/MANIFEST
+ | 1 -
+ test/shaping/texts/in-tree/shaper-indic/south-asian/MANIFEST
+ | 1 -
+ test/shaping/texts/in-tree/shaper-indic/south-east-asian/MANIFEST
+ | 1 -
+ .../texts/in-tree/shaper-indic/south-east-asian/script-thai/MANIFEST
+ | 1 -
+ .../in-tree/shaper-indic/south-east-asian/script-thai/misc/MANIFEST
+ | 0
+ 9 files changed, 1 insertion(+), 4 deletions(-)
+
+commit 5676d5d52784e16068ae483103d59111a8081854
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 10:31:14 2013 -0500
+
+    [Indic] Make sure New Tai Lue works!
+
+ src/hb-ot-shape-complex-private.hh                           | 12
+ ++++++++----
+ .../texts/in-tree/shaper-indic/south-east-asian/MANIFEST     |  1 +
+ .../south-east-asian/script-new-tai-lue/MANIFEST             |  1 +
+ .../south-east-asian/script-new-tai-lue/misc/MANIFEST        |  1 +
+ .../south-east-asian/script-new-tai-lue/misc/misc.txt        |  1 +
+ 5 files changed, 12 insertions(+), 4 deletions(-)
+
+commit 568000274c8edb5f41bc4f876ce21fcc8bdaeed8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 09:44:57 2013 -0500
+
+    Adjust mark advance-width zeroing logic for Myanmar
+
+    Before, we were zeroing advance width of attached marks for
+    non-Indic scripts, and not doing it for Indic.
+
+    We have now three different behaviors, which seem to better
+    reflect what Uniscribe is doing:
+
+      - For Indic, no explicit zeroing happens whatsoever, which
+        is the same as before,
+
+      - For Myanmar, zero advance width of glyphs marked as marks
+        *in GDEF*, and do that *before* applying GPOS.  This seems
+        to be what the new Win8 Myanmar shaper does,
+
+      - For everything else, zero advance width of glyphs that are
+        from General_Category=Mn Unicode characters, and do so
+        before applying GPOS.  This seems to be what Uniscribe does
+        for Latin at least.
+
+    With these changes, positioning of all tests matches for Myanmar,
+    except for the glitch in Uniscribe not applying 'mark'.  See preivous
+    commit.
+
+ src/hb-ot-layout-gpos-table.hh     | 12 ++++--------
+ src/hb-ot-layout-private.hh        |  3 +--
+ src/hb-ot-layout.cc                |  4 ++--
+ src/hb-ot-shape-complex-arabic.cc  |  2 +-
+ src/hb-ot-shape-complex-default.cc |  2 +-
+ src/hb-ot-shape-complex-indic.cc   |  2 +-
+ src/hb-ot-shape-complex-myanmar.cc |  2 +-
+ src/hb-ot-shape-complex-private.hh |  9 ++++++++-
+ src/hb-ot-shape-complex-thai.cc    |  2 +-
+ src/hb-ot-shape.cc                 | 31 +++++++++++++++++++++++++++++--
+ 10 files changed, 49 insertions(+), 20 deletions(-)
+
+commit 99749ca8e0c4c8dbea4620f07c4d0e6d1515cc65
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 12 09:44:35 2013 -0500
+
+    [Myanmar] Add note re Uniscribe NOT applying 'mark'
+
+ src/hb-ot-shape-complex-myanmar.cc | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit b8427801381180da9611b2e3e0f0b3514274de81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 11 17:02:17 2013 -0500
+
+    Minor
+
+ src/hb-atomic-private.hh | 2 +-
+ src/hb-mutex-private.hh  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 419c933ed1b5d97c7561546536ef5810a7b0ebd0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 11 16:16:16 2013 -0500
+
+    [Myanmar] Fix handling of Punctuation and Symbol types
+
+    Testing with "clusters" now on par with testing without them.  15
+    failures both.
+
+ src/hb-ot-shape-complex-myanmar.cc | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 0572c1410a9cb0ac5dd5dc84a8034698cc5c4892
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 11 16:06:02 2013 -0500
+
+    [Myanmar] Fixup handling of joiners and GB characters
+
+ src/hb-ot-shape-complex-myanmar-machine.rl |  6 ++----
+ src/hb-ot-shape-complex-myanmar.cc         | 19 +++++++++++++++++--
+ 2 files changed, 19 insertions(+), 6 deletions(-)
+
+commit 1c8654ead41ca746d577549c92d2a41c594ab639
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 11 14:27:02 2013 -0500
+
+    [Myanmar] Prevent reordering between Asat and Dot below
+
+    Implemented as a hack for now.  Myanmar failures down from 23 to 15.
+
+    MYANMAR: 1123868 out of 1123883 tests passed. 15 failed (0.00133466%)
+
+    The remaining 15 cases are all where the syllable is wrong according
+    to
+    the OpenType spec.  We insert dottedcircle.  Uniscribe fails to
+    do that,
+    but it also fails to reorder the prebase-reordering medial-Ra.  So it
+    gets it wrong.
+
+ src/hb-unicode-private.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit bed687f886b8def06642ad986648e9149a935add
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 11 14:24:03 2013 -0500
+
+    Shuffle test data around
+
+ test/shaping/texts/in-tree/MANIFEST
+ | 1 +
+ test/shaping/texts/in-tree/shaper-indic/south-east-asian/MANIFEST
+ | 1 -
+ .../in-tree/shaper-indic/south-east-asian/script-thai/misc/MANIFEST
+ | 1 -
+ .../south-east-asian => shaper-myanmar}/script-myanmar/MANIFEST
+ | 0
+ .../south-east-asian => shaper-myanmar}/script-myanmar/misc/MANIFEST
+ | 0
+ .../south-east-asian => shaper-myanmar}/script-myanmar/misc/misc.txt
+ | 0
+ .../south-east-asian => shaper-myanmar}/script-myanmar/misc/utn11.txt
+ | 0
+ test/shaping/texts/in-tree/shaper-thai/script-thai/misc/MANIFEST
+ | 1 +
+ .../south-east-asian => shaper-thai}/script-thai/misc/misc.txt
+ | 0
+ 9 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 98628cac9f733f2674d6409954cddb7d0634c233
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 11 13:36:23 2013 -0500
+
+    Add Win8-style Myanmar shaper
+
+    Myanmar failures down from 51% to 0.00204648%!
+
+    MYANMAR: 1123860 out of 1123883 tests passed. 23 failed (0.00204648%)
+
+ src/Makefile.am                            |  14 +-
+ src/hb-ot-shape-complex-indic.cc           |   2 -
+ src/hb-ot-shape-complex-myanmar-machine.rl | 127 ++++++
+ src/hb-ot-shape-complex-myanmar.cc         | 599
+ +++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-private.hh         |   5 +-
+ 5 files changed, 740 insertions(+), 7 deletions(-)
+
+commit 1df56449586bd32275a6fa69dcadd5fb77a84f82
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 11 14:17:54 2013 -0500
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 54f7b4d9ec13f8454aa298534da318c023fa3c63
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 11 13:27:17 2013 -0500
+
+    [OTLayout] Respect lookup-flags skipping over non-mark glyphs
+
+    Before, when matching ligatures, we never skipping over base / liga
+    glyphs even if that was what the LookupFlags asked for.
+
+    Fixed now.  We carefully reviewed all instances of this, and
+    tested with
+    Amiri as well as some Indic scripts, and are confident that this
+    should
+    NOT break anyone's fonts.  It's also how Uniscribe does it, from what
+    we can tell.
+
+ src/hb-ot-layout-gpos-table.hh       |  2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 25 ++++++++++---------------
+ 2 files changed, 11 insertions(+), 16 deletions(-)
+
+commit 9082efc4aacb34de8574d6a4a3c037987df58bd8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 11 13:14:15 2013 -0500
+
+    [OTLayout] s/mark_skipping/skipping/
+
+    In aticipation of upcoming changes.
+
+ src/hb-ot-layout-gpos-table.hh       | 12 ++++++------
+ src/hb-ot-layout-gsubgpos-private.hh | 28 ++++++++++++++--------------
+ 2 files changed, 20 insertions(+), 20 deletions(-)
+
+commit 9621e0ba294c9cc6d458bbf632e63e92fda71e10
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 11 06:58:27 2013 -0500
+
+    [Indic] Fix bug introduced in 8b217f5ac54aa0dcbba2dd6d59aa89dde33e56c2
+
+    Was breaking reph formation logic when the Ra is the only consonant.
+    Devanagari regression fixed.  Down to 57 failures again.  Ouch.
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6e74c64211b6aaac48bae8c87f9420d8dc03fd93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 11 06:50:17 2013 -0500
+
+    Improve normalization heuristic
+
+    Before, for most scripts, we were not trying to recompose two
+    characters
+    if the second one had ccc=0.  That fails for Myanmar where U+1026
+    decomposes to U+1025,U+102E, both of which have ccc=0.  However, we do
+    want to try to recompose those.  We now check whether the second is a
+    mark, using general category instead.
+
+    At the same time, remove optimization that was conflicting with this.
+
+    [Let the Ngapi hackfest begin!]
+
+ src/hb-ot-shape-normalize.cc | 39 +++++++++++++--------------------------
+ 1 file changed, 13 insertions(+), 26 deletions(-)
+
+commit 614242efb043f2ed78916377138d456279a20a54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 6 23:45:27 2013 -0500
+
+    Revert "Include config.h.in in tree"
+
+    This reverts commit 01013a0f5c58d5d54a37e5b4d6692e0bbd4baf80.
+
+    Conflicts:
+            config.h.in
+
+    Same argument as previous commit.
+
+ Makefile.am |   1 +
+ config.h.in | 153
+ ------------------------------------------------------------
+ 2 files changed, 1 insertion(+), 153 deletions(-)
+
+commit adff3778155facb7b149ce66ab7d573368e048de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 6 23:43:27 2013 -0500
+
+    Revert "[Indic] Import ragel-generated Indic machine in git"
+
+    This reverts commit fab7a71f110ed646745d54b23284537c50058c21.
+
+    Conflicts:
+            src/hb-ot-shape-complex-indic-machine.hh
+
+    Keeping that generated file in-tree causes problems with processes
+    like
+    tinderbox  that automatically fetch and build harfbuzz.  It's harder
+    to
+    bootstrap harfbuzz now (as was previously), but I'm willing to
+    give this
+    another chance and see how it goes.
+
+ autogen.sh                               |    6 +
+ src/Makefile.am                          |    1 +
+ src/hb-ot-shape-complex-indic-machine.hh | 1443
+ ------------------------------
+ 3 files changed, 7 insertions(+), 1443 deletions(-)
+
+commit 5898fa94d12b19686f649104bd6efe8daa1ba0c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 6 15:29:07 2013 -0500
+
+    Don't use $(ENV)
+
+    As reported by Peter Breitenlohner:
+
+    I think this is a very bad idea because ENV is used to specify
+    a startup
+    file to be read by some/all shells.
+
+ test/api/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 52d66c26a2102bd1a49463b8e8f04612598f8ac1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 4 23:31:24 2013 -0500
+
+    Add color-tests automake option
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9de5f98f363d96f308adc33f1c2286e5c33117de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 4 23:28:22 2013 -0500
+
+    Bug 60035 - intermittent make install failure on hb-version.h
+
+ src/Makefile.am | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit 6c1e8b614cfd6ed016fba6bf20af1e422e79eb71
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 4 23:24:16 2013 -0500
+
+    Bug 59637 - check-exported-symbols.sh & check-internal-symbols.sh
+    fail on mips/mipsel
+
+ src/check-symbols.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bafdf3d983dcc277d6e7e322277c0bb25b41a173
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 4 23:06:50 2013 -0500
+
+    Merge check-internal-symbols.sh and check-exported-symbols.sh
+
+ src/Makefile.am                                    |  3 +-
+ src/check-internal-symbols.sh                      | 34
+ ----------------------
+ ...{check-exported-symbols.sh => check-symbols.sh} | 16 ++++++++--
+ 3 files changed, 14 insertions(+), 39 deletions(-)
+
+commit ceeae30f47b9d628484ae398bc38f3f60ee8eab4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 31 19:27:36 2013 -0500
+
+    Really fix setmode this time
+
+    Thanks to Khaled for spotting it.
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7cba8a673b4b436a737fc4ffe85dc84ddd2bf41f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 31 18:37:10 2013 -0500
+
+    Fixup previous commit
+
+    Now, it looks like this breaks Cygwin again.  Have to figure out
+    what's
+    going on.
+
+ util/options.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit bc76449f51f20491a4540b4f240f5a3e0dcb20fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 31 18:18:05 2013 -0500
+
+    Use setmode() instead of _setmode()
+
+    Looks like Cygwin / MSVC declare it that way, and it still works on
+    MinGW32 cross.
+
+ config.h.in     | 6 +++---
+ configure.ac    | 2 +-
+ util/options.cc | 2 +-
+ util/options.hh | 2 +-
+ 4 files changed, 6 insertions(+), 6 deletions(-)
+
+commit e9171af55cc6a402eb20db4ea74c86a0b1e70e85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 29 22:45:00 2013 -0500
+
+    Bug 60053 - hb-common.cc:181:6: warning: ‘void free_langs()’
+    defined but not used
+
+ src/hb-common.cc | 2 +-
+ src/hb-ft.cc     | 2 +-
+ src/hb-shape.cc  | 2 +-
+ src/hb-shaper.cc | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 09b5393874e56fcfd63a92d28e6c1c2ddeee0942
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 18 17:10:47 2013 -0600
+
+    0.9.12
+
+ NEWS         | 7 +++++++
+ configure.ac | 2 +-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit eb45c0a2fbaeeb34e77a2935934e8d1302728ec8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 16 22:07:50 2013 -0600
+
+    Minor
+
+ src/hb-ot-layout.cc | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 52c8d1226f3509276b11a1fadbd29e5363c0ecd7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 14 13:51:46 2013 -0600
+
+    Minor
+
+ src/hb-blob.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f88d3bd7e407d332bb04688344c54756d24128c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 14 00:33:58 2013 -0600
+
+    Fix build with Sun compiler
+
+ src/hb-blob.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 08b29c08094097f1c23ec53b10084bc390cea833
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 14 00:32:12 2013 -0600
+
+    Revert "Minor"
+
+    This reverts commit 0a492357016bc9a614d2a726f2006c10af68ca58.
+
+    Enables code on more compilers.
+
+ src/hb-warning.cc | 33 ++++++++++++++++++++++++++++++---
+ 1 file changed, 30 insertions(+), 3 deletions(-)
+
+commit e78463211e7d85f237bd55afab7e8e5dae42346c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 14 00:27:21 2013 -0600
+
+    Fix linking with non-gcc compilers
+
+ configure.ac    | 2 ++
+ src/Makefile.am | 6 +++++-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit de649f07f1f8fdeb998a0b049759f4f7363e25d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 14 00:26:43 2013 -0600
+
+    Fix residuals from fontconfig changes
+
+ src/hb-atomic-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit cf81fb3624466b9df2250b58b27a92187c5b5b5c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 10 09:06:34 2013 -0600
+
+    0.9.11
+
+ NEWS         | 14 ++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+commit 2dcb333f52492018816f0d5d67a47634a612e49c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 10 01:17:59 2013 -0600
+
+    Add atomic ops for Solaris
+
+    Based on fontconfig patch from Raimund Steger.
+
+ config.h.in              |  5 ++++-
+ configure.ac             | 27 +++++++++++++++++++++++++--
+ src/hb-atomic-private.hh | 12 ++++++++++++
+ 3 files changed, 41 insertions(+), 3 deletions(-)
+
+commit 69fd6e157c7ec83a5d5d8731fc14675ce4509b09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 10 00:03:36 2013 -0600
+
+    Fix crasher during multi-thread shaper data creation
+
+    Sample crash:
+
+    0  _hb_graphite2_shaper_face_data_destroy (data=0xffffffffffffffff)
+        at ../../src/hb-graphite2.cc:129
+    1  0x00007ffff4271d7d in hb_graphite2_shaper_face_data_ensure (
+        face=<optimized out>) at ../../src/hb-shaper-list.hh:35
+    2  hb_shape_plan_plan (shaper_list=<optimized out>,
+    num_user_features=0,
+        user_features=0x0, shape_plan=0xf7b490) at
+        ../../src/hb-shaper-list.hh:35
+    3  hb_shape_plan_create (face=<optimized out>, props=<optimized out>,
+        user_features=0x0, num_user_features=0, shaper_list=<optimized
+        out>)
+        at ../../src/hb-shape-plan.cc:108
+    4  0x00007ffff4272c93 in hb_shape_plan_create_cached (face=0x10cf2b0,
+        props=0x11980d8, user_features=0x0, num_user_features=<optimized
+        out>,
+        shaper_list=0x0) at ../../src/hb-shape-plan.cc:283
+
+ src/hb-shaper-private.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit ecd454b3cd75050e0c95e1d2aa55744559338ec8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 8 18:09:46 2013 -0600
+
+    [Indic] In old-spec shaping, don't move viramas around if seq ends
+    with one
+
+    For example: u0c9a u0ccd u0c9a u0ccd with Lohit.  See:
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=59118
+
+ src/hb-ot-shape-complex-indic.cc                                   |
+ 7 ++++---
+ .../texts/in-tree/shaper-indic/indic/script-kannada/misc/misc.txt  | 1 +
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit e95e031b5682809488cc965883e15404cb9cfb6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 8 16:15:46 2013 -0600
+
+    [GPOS] If an Anchor offset is NULL, return false
+
+    If in a MarkPos table, a base has no anchor for a particular mark
+    class,
+    return NULL such that the subsequent subtables get a chance at it.
+
+    Test case:
+    hb-shape ./EBGaramond12-Regular.otf ἂ --features="ss20","smcp"
+
+ src/hb-open-type-private.hh    | 14 ++++++++++++--
+ src/hb-ot-layout-gpos-table.hh | 10 ++++++++--
+ 2 files changed, 20 insertions(+), 4 deletions(-)
+
+commit e5dbf39900fa63051f64cc447a6742665cbee339
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 7 17:34:24 2013 -0600
+
+    Bug 58638 - Building fails with ICU due to not passing required flags
+
+ configure.ac | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1172dc736280566426eb6dade1a886b2a0ca9aa4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 7 16:46:37 2013 -0600
+
+    Rename hb_buffer_clear() to hb_buffer_clear_contents()
+
+    The previous name was clashing with harfbuzz.old.  There are systems
+    that need to link both...
+
+    Clash-free now again.
+
+ src/hb-buffer.cc       | 2 +-
+ src/hb-buffer.h        | 2 +-
+ test/api/test-buffer.c | 2 +-
+ util/options.hh        | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 7b912c1936c3e8a7df27a30782ca127d0a83822d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 4 01:25:27 2013 -0600
+
+    Remove a few unnecessary const's
+
+    Apparently helps with MSVC compilation.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 34e6c3e3e452bdf6f93df565a70453a6e74d4c6e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 3 00:14:24 2013 -0600
+
+    0.9.10
+
+ NEWS         | 24 ++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 25 insertions(+), 1 deletion(-)
+
+commit f0c82410dbe800cb6429ba4aa7cfd9f5a11cc70c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 3 00:07:16 2013 -0600
+
+    [OTLayout] Always collect default language system in collect_lookups
+
+    Not sure if this is the most desired behavior.  It's the most easily
+    defined though.
+
+ src/hb-ot-layout.cc | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 15e9e4e1ddaad655988144e7a56a765e8adf8782
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 3 00:04:40 2013 -0600
+
+    [OTLayout] Fix feature iteration in collect_lookups
+
+    Previous logic was just wrong.
+
+ src/hb-ot-layout.cc | 46 ++++++++++++++++++++++++++++++++--------------
+ 1 file changed, 32 insertions(+), 14 deletions(-)
+
+commit 733e8c0d7bf0765884f2cc953c8edcd7ab7fb49b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 3 00:00:23 2013 -0600
+
+    [OTLayout] Whitespace
+
+ src/hb-ot-layout.cc | 82
+ ++++++++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 68 insertions(+), 14 deletions(-)
+
+commit d37ae38047bee12639741af9bb083b857fab950d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 2 23:57:36 2013 -0600
+
+    [OTLayout] Handle required_feature_index in collect_lookups
+
+ src/hb-ot-layout.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 11fba79ee9383eb995ddf7eb924dd64c67e2df63
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 2 23:36:37 2013 -0600
+
+    [OTLayout] Fix various introspection issues with ClassDef's
+
+    As reported by Jonathan Kew.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 19 +++++++++++++++----
+ 1 file changed, 15 insertions(+), 4 deletions(-)
+
+commit e81aff9ef785be28751aab1fcd484af550656181
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 2 23:22:54 2013 -0600
+
+    [tests] Finish test-set.c
+
+    All passing now.
+
+ test/api/test-set.c | 373
+ +++++++++++++++++++++-------------------------------
+ 1 file changed, 149 insertions(+), 224 deletions(-)
+
+commit 7b1b720a8da69b68b775ce17104a40d55401b7ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 2 23:02:59 2013 -0600
+
+    Protect sets in-error from further modication
+
+    Fixes test-set.c
+
+ src/hb-set-private.hh | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit 8165f2765b93e99577ecc79b7956ae38c614bc78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 2 22:50:36 2013 -0600
+
+    [tests] Start adding tests for hb-set.h
+
+    Fails now.  Fixing.
+
+ TODO                  |   2 -
+ src/hb-set-private.hh |   6 +
+ src/hb-set.cc         |   9 +-
+ src/hb-set.h          |   3 +
+ test/api/Makefile.am  |   1 +
+ test/api/test-set.c   | 312
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 6 files changed, 330 insertions(+), 3 deletions(-)
+
+commit b9d28f696c433b94c5ffbad8d7c87cf3acff4056
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 2 22:49:58 2013 -0600
+
+    [tests] Add set object to test-object.c
+
+ test/api/test-object.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 11d2956553f0d4a0086166a04ffc352fcfacf56e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 2 17:41:27 2013 -0600
+
+    Minor
+
+ src/hb-atomic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 596740db04e7c1dadae0d8be6e401089fcaffc2d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 19:41:04 2012 -0500
+
+    [Indic] Insert dottedcircle after a lone Malayalam dot-reph
+
+ src/hb-ot-shape-complex-indic-machine.hh | 1617
+ ++++++++++++++++--------------
+ src/hb-ot-shape-complex-indic-machine.rl |    2 +-
+ src/hb-ot-shape-complex-indic.cc         |   13 +-
+ 3 files changed, 881 insertions(+), 751 deletions(-)
+
+commit 3cdce6497b2b9aeb2841bf077daa9dd9b196429d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 16:54:22 2012 -0500
+
+    Remove TODO that I don't intend to fix
+
+ TODO | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 6f69fa283e0a488da811df78bc83c41ed248b688
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 16:51:15 2012 -0500
+
+    Minor
+
+ src/hb-shape.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f4abcbfc628718bb276363746440df06e7658f6e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 16:48:51 2012 -0500
+
+    Minor
+
+ src/hb-buffer.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4a765f092d71bb4adeb468c004987a9121d39db5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 16:48:47 2012 -0500
+
+    Minor
+
+ util/hb-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9815a88111072aa51e78e258c5f660993b47d4df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 16:46:53 2012 -0500
+
+    [util] List supported output formats in --help output
+
+ util/hb-shape.cc     | 6 +++---
+ util/helper-cairo.cc | 2 +-
+ util/helper-cairo.hh | 1 +
+ util/options.cc      | 9 ++++++++-
+ util/options.hh      | 5 ++++-
+ util/view-cairo.hh   | 2 +-
+ 6 files changed, 18 insertions(+), 7 deletions(-)
+
+commit f95a87b7b813f588c7910ad4785ee68bb452e864
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 16:35:28 2012 -0500
+
+    [util] List supported output formats in hb-view
+
+ TODO                 |  1 -
+ util/helper-cairo.cc | 30 +++++++++++++++++++++++++++++-
+ 2 files changed, 29 insertions(+), 2 deletions(-)
+
+commit 6bad092aa87bc3e6bbf0b9faf07693e6ebbe55f2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 16:01:52 2012 -0500
+
+    [util] Default to "text" output format in hb-shape
+
+    If you say:
+
+      hb-shape font.ttf text --output-file out.txt
+
+    This was previously failing:
+
+      Unknown output format `txt'; supported formats are: TEXT / JSON
+
+    Now we simply fallback to TEXT if no explicit format was requested.
+
+ util/hb-shape.cc | 11 ++++++++---
+ util/options.hh  |  5 +++++
+ 2 files changed, 13 insertions(+), 3 deletions(-)
+
+commit 8b217f5ac54aa0dcbba2dd6d59aa89dde33e56c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 15:48:32 2012 -0500
+
+    [Indic] Reorder Malayalam dot-reph to after base
+
+    Test sequence is simple: U+0D4E,U+0D15.  The doth-reph should be
+    reordered to after the Ka.
+
+    https://bugzilla.redhat.com/show_bug.cgi?id=799565
+
+ src/hb-ot-shape-complex-indic.cc                            | 13
+ ++++++++++---
+ .../shaper-indic/indic/script-malayalam/misc/MANIFEST       |  1 +
+ .../shaper-indic/indic/script-malayalam/misc/dot-reph.txt   |  1 +
+ 3 files changed, 12 insertions(+), 3 deletions(-)
+
+commit 742c4ee97e1311e000ebcdf9f33361c4dc6400a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 15:35:03 2012 -0500
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 94afeb6ebe27534fc80d7173cc6f67375c3aaca6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 21 11:54:50 2012 -0500
+
+    Add Android.mk
+
+ Android.mk  | 74
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Makefile.am |  1 +
+ 2 files changed, 75 insertions(+)
+
+commit d16ddbcbbee39b07a028776995c635119fe3cd98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 20 01:02:36 2012 -0500
+
+    Add build confirmation notice to configure
+
+ configure.ac | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+commit e24d8dab749a1a796e7484e18572da5f7a733bd4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 19 15:23:02 2012 -0500
+
+    [TODO] Remove done items
+
+ TODO | 7 -------
+ 1 file changed, 7 deletions(-)
+
+commit 044d38527664d933c18c751c38fcf6fb4b5f888e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 19 13:00:16 2012 -0500
+
+    Bug 58498 - Tests fail with gold linker on ARM
+
+ src/check-exported-symbols.sh | 2 +-
+ src/check-internal-symbols.sh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit b68b86daf1a8478b86aeae44a8c39a606ed873cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 18 20:39:40 2012 -0500
+
+    Use C++ linker if ICU is disabled
+
+    Bug 54948 - Undefined symbols: "operator delete(void*)" "operator
+    new(unsigned long)" "___cxa_pure_virtual"
+
+ src/Makefile.am | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 1ffd23cb47a61465d52a7aeebb9c1b676e7c9a7e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 23:29:15 2012 -0500
+
+    [OTLayout] Limit alternate-location FeatureParams to 'size' feature
+
+ src/hb-ot-layout-common-private.hh | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit efe252e6000558f78075adadb2a3dba25ab67c04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 23:21:05 2012 -0500
+
+    [OTLayout] Fix 'size' featureParams implementation
+
+    Looks at alternate location now.
+
+ src/hb-ot-layout-common-private.hh | 133
+ ++++++++++++++++++++++++++++---------
+ src/hb-ot-layout.cc                |  93 ++++----------------------
+ 2 files changed, 117 insertions(+), 109 deletions(-)
+
+commit e77b4425746ac9eb407ca4e742d962f1955971b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 18:42:59 2012 -0500
+
+    [OTLayout] Fix tracing
+
+ src/hb-open-type-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 9b54562d63f1a9e0e5b33d71c32bd1588759ebf1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 17 13:55:36 2012 -0500
+
+    [OTLayout] Towards correct FeatureParams handling
+
+ src/hb-open-type-private.hh        |  8 +++++++-
+ src/hb-ot-layout-common-private.hh | 25 +++++++++++++++++++++++--
+ 2 files changed, 30 insertions(+), 3 deletions(-)
+
+commit 87e43b7f2be25840748f920ca33ff553833da45f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 14 17:48:23 2012 -0500
+
+    [OTLayout] Wire tag and list start all the way to Feature
+
+    To fix FeatureParam issues.  No actual fix yet, just plumbing.
+
+ src/hb-ot-layout-common-private.hh | 16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+commit 85bc44b90a19c6a669ed567a9cd8513448600afe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 12 11:38:49 2012 -0500
+
+    [OTLayout] More 'size' feature sanity checking
+
+    We still don't look for the old incorrect place of the featureParams.
+    I'll wait till someone actually complains about it...
+
+ src/hb-ot-layout.cc | 99
+ ++++++++++++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 79 insertions(+), 20 deletions(-)
+
+commit 0bae50a36f3022f9bb6b2c001c191eeaaa4ef954
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 11 16:01:31 2012 -0500
+
+    [OTLayout] Add FeatureParamsCharacterVariants struct
+
+    No API yet.
+
+ src/hb-ot-layout-common-private.hh | 52
+ +++++++++++++++++++++++++++++++++++---
+ 1 file changed, 49 insertions(+), 3 deletions(-)
+
+commit bd61bc13ea8ff350ada5449b2cfeb612e66ecafa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 11 16:00:43 2012 -0500
+
+    [OTLayout] Add UINT24 type
+
+ src/hb-open-type-private.hh | 33 ++++++++++++++++++++++-----------
+ src/hb-private.hh           |  4 ++++
+ 2 files changed, 26 insertions(+), 11 deletions(-)
+
+commit 9cf7f9d4f61741932570afbefdee5edf61f79ae4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 11 14:31:13 2012 -0500
+
+    Make test-size-params write size in points
+
+ src/test-size-params.cc | 18 ++++--------------
+ 1 file changed, 4 insertions(+), 14 deletions(-)
+
+commit 372fe2b67b1757e809bf33e1e9055a00c5bed304
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 11 14:30:57 2012 -0500
+
+    [OTLayout] Make hb_ot_layout_get_size_params() do some checks
+
+ src/hb-ot-layout.cc | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit 875a5cbc9c37f4264241c43b80afad2628eab749
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 11 14:17:01 2012 -0500
+
+    [OTLayout] Change hb_ot_layout_get_params() API
+
+    And add implementation for StylisticSet UINameID.  No API yet.
+
+ src/hb-ot-layout-common-private.hh | 85
+ ++++++++++++++++++++++++++++++++++++--
+ src/hb-ot-layout.cc                | 28 +++++++++----
+ src/hb-ot-layout.h                 |  8 +++-
+ src/test-size-params.cc            |  9 +++-
+ 4 files changed, 115 insertions(+), 15 deletions(-)
+
+commit 5e7e52ddf2b0c4fbc9d933d24336100368d39a5c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 10 17:44:22 2012 -0500
+
+    [uniscribe] Enable Uniscribe backend only if it has
+    ScriptShapeOpenType()
+
+    Bug 55494 - ScriptItemizeOpenType doesn't exists under Windows XP
+
+ config.h.in  |  6 ------
+ configure.ac | 14 +++++++++++++-
+ 2 files changed, 13 insertions(+), 7 deletions(-)
+
+commit d41c0c955b8ad9b52191ca47e1f3b1bfe606deb1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 10 16:41:20 2012 -0500
+
+    Update config template
+
+ config.h.in | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit c48a04e5ea899b82465a0f3f2cfdcffb3bf38f61
+Author: John Ralls <jralls@ceridwen.fremont.ca.us>
+Date:   Mon Dec 10 16:24:24 2012 -0500
+
+    [coretext] Better test for CoreText
+
+    Instead of checking for ApplicationServices.h, which is present in all
+    versions of MacOSX, check for CTFontRef, a CoreText basic type.
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0e9f0f3e5f16a45951423a1229af42dc2fd798c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 10 15:25:21 2012 -0500
+
+    Fix atomic ops on iOS
+
+    Patch from John Ralls.
+
+ src/hb-atomic-private.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 5f9569c1391c65d7addff363ad6e5ec9b087f01a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 10 13:38:42 2012 -0500
+
+    Make older MSVC happy
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 071d5b831e6de5f3b24160dc77b139cb040ab886
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 10 00:57:00 2012 -0500
+
+    Work around missing OSAtomicCompareAndSwapPtrBarrier() on OS X 10.4
+
+    Not sure how to handle iOS.
+
+ src/hb-atomic-private.hh | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+commit e923e6487b25ab86f6f629af480b291e8e5407b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 9 19:39:40 2012 -0500
+
+    [coretext] Fixed typo
+
+    Oops.  Thanks Khaled for catching this.
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9a8395824bf51c2ff2cfe0887ecad52b3d2c02e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 9 18:47:36 2012 -0500
+
+    [coretext] Add hb_coretext_face_get_cg_font()
+
+    Not sure if it's useful, but it was missing.
+
+ src/hb-coretext.cc | 20 ++++++++++++++------
+ src/hb-coretext.h  |  3 +++
+ 2 files changed, 17 insertions(+), 6 deletions(-)
+
+commit 86112356885fde32163882b6c9dd19a494304f7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 9 18:47:09 2012 -0500
+
+    [coretext] Remove hack around GlyphID
+
+    We not namespace our types, so the hack is not needed anymore.
+
+ src/hb-coretext.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 8e58459aeb949591bb5bca340ef9bdd5cfd54e47
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 9 18:45:47 2012 -0500
+
+    [graphite2] "Update to new API"
+
+    Part of patch from Martin Hosken.  I believe he knows what he's doing
+    :).
+
+ src/hb-graphite2.cc | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+commit a5a4ab3846ef06769784e6469d76eace35e68805
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 9 18:44:41 2012 -0500
+
+    [graphite2] Add hb_graphite2_face_get_gr_face and
+    hb_graphite2_font_get_gr_font
+
+    Based on patch from Martin Hosken.  I believe it returns NULL if the
+    font doesn't have graphite tables, but have not tested.
+
+ src/hb-graphite2.cc | 14 ++++++++++++++
+ src/hb-graphite2.h  |  8 +++++++-
+ 2 files changed, 21 insertions(+), 1 deletion(-)
+
+commit 737ba156442f723d126c7c58c73729786b67c17a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 9 18:43:03 2012 -0500
+
+    [graphite2] Preload all tables
+
+    Part of patch from Martin Hosken.
+
+ src/hb-graphite2.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0ae6dbf1b4de8a0326b8a2f201597427cecfb6db
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 9 18:37:38 2012 -0500
+
+    Minor
+
+ src/hb-uniscribe.cc | 32 ++++++++++++++++----------------
+ 1 file changed, 16 insertions(+), 16 deletions(-)
+
+commit 3fe5c159d3532f8ce8a85d217a00681225dd8ed1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 9 18:20:19 2012 -0500
+
+    Remove excess return
+
+    Oops!
+
+ src/hb-uniscribe.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit ba2d543004573e8e4e56df70b7fe2a66a42bc83f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 8 19:28:41 2012 -0500
+
+    Update OT language tags
+
+    Patch from Roozbeh Pournader.
+
+ src/hb-ot-tag.cc | 212
+ +++++++++++++++++++++++++++++--------------------------
+ 1 file changed, 110 insertions(+), 102 deletions(-)
+
+commit aba38173c6b464c2884b73ef6cd4577d4efcebbc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 5 19:54:48 2012 -0500
+
+    Minor
+
+ src/hb-ot-tag.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 61865745e35eb60aeb59968e7826e37059090780
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 5 19:42:10 2012 -0500
+
+    Fix test with gold linker
+
+    Bug 57633 - Symbol tests should ignore __bss_start, _edata, _end
+
+ src/check-exported-symbols.sh | 2 +-
+ src/check-internal-symbols.sh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit b71b0bd9ee64feadd7289e195bc58f6361ce707a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 5 19:20:31 2012 -0500
+
+    [Indic] Add link to Sinhala split matra section of the Sinhala spec
+
+ src/hb-ot-shape-complex-indic.cc | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 9a34a50daac3563464e0031f377e85f0c704f2d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 5 19:18:18 2012 -0500
+
+    Fix build with C++11
+
+ util/options.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 0beb66e3a61ae8bb1fa66e54b1ff1abb2f8711e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 5 18:46:04 2012 -0500
+
+    Fix warnings
+
+ src/hb-fallback-shape.cc                   | 10 +++++-----
+ src/hb-glib.cc                             |  2 +-
+ src/hb-icu-le.cc                           |  6 +++---
+ src/hb-old.cc                              | 14 +++++++-------
+ src/hb-open-type-private.hh                |  4 +---
+ src/hb-ot-layout-gsubgpos-private.hh       | 24 ++++++++++++------------
+ src/hb-ot-shape-complex-arabic-fallback.hh |  4 ++--
+ src/hb-ot-shape-complex-arabic.cc          |  2 +-
+ src/hb-ot-shape-complex-indic-machine.hh   |  2 +-
+ src/hb-ot-shape-complex-indic-machine.rl   |  2 +-
+ src/hb-ot-shape-complex-indic.cc           |  6 +++---
+ src/hb-ot-shape-complex-thai.cc            |  2 +-
+ src/hb-ot-shape-fallback.cc                |  4 ++--
+ src/hb-private.hh                          |  8 ++++----
+ src/hb-ucdn.cc                             | 27
+ +++++++++++++++------------
+ src/hb-utf-private.hh                      |  4 ++--
+ 16 files changed, 61 insertions(+), 60 deletions(-)
+
+commit c6408a1009d2370fbdcfa694898819d99d53c3df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 5 17:36:52 2012 -0500
+
+    0.9.9
+
+ NEWS         | 8 ++++++++
+ configure.ac | 2 +-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 130bb3f6144afe5c88bb5b4e4c98e7cba03b1e26
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 5 16:49:47 2012 -0500
+
+    Rename VOID and void_t to have HarfBuzz prefix
+
+    Fixes build on Windows.  Ouch!
+
+ src/hb-ot-layout-gsubgpos-private.hh | 22 +++++++++++-----------
+ src/hb-private.hh                    | 12 ++++++------
+ 2 files changed, 17 insertions(+), 17 deletions(-)
+
+commit 4a350d0eb25db60d95638664c892d4c8dacf050b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 4 17:13:09 2012 -0500
+
+    [OTLayout] Reuse context in collect_glyphs() recursion
+
+ src/hb-ot-layout-gsubgpos-private.hh | 19 +++++++++++++++----
+ 1 file changed, 15 insertions(+), 4 deletions(-)
+
+commit 8303593ba1db06e402eab52df47f21f13049112d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 4 17:08:41 2012 -0500
+
+    Minor
+
+    Use pointers instead of references, in preparation for upcoming
+    change.
+
+ src/hb-ot-layout-gpos-table.hh       | 28 +++++++++++++-------------
+ src/hb-ot-layout-gsub-table.hh       | 30 ++++++++++++++--------------
+ src/hb-ot-layout-gsubgpos-private.hh | 38
+ ++++++++++++++++++------------------
+ 3 files changed, 48 insertions(+), 48 deletions(-)
+
+commit 1bcfa06d1173f219809542a7380ce77f1c907bec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 4 16:58:09 2012 -0500
+
+    [OTLayout] Don't recurse in collect_glyphs() for GPOS
+
+ src/hb-ot-layout-gpos-table.hh       | 2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 4 ++++
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit b5e04c7dc6b78e311d1a14f1f808fac76a64c889
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 4 15:57:02 2012 -0500
+
+    [ucdn] Match upstream changes
+
+ src/hb-ucdn/ucdn.c | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit a52f51b21635c626f6e5ccdba505c4df19bcff2c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 4 15:43:38 2012 -0500
+
+    0.9.8
+
+ NEWS         | 16 ++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 17 insertions(+), 1 deletion(-)
+
+commit 7babfe5a7904c26060c5b8441ca1bf23e1444f35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 4 00:35:54 2012 +0200
+
+    Move object mutext into the user-data array
+
+    We are not using it for anything lse it seems.
+
+ src/hb-common.cc         | 12 ++----------
+ src/hb-object-private.hh | 24 ++++++++++--------------
+ 2 files changed, 12 insertions(+), 24 deletions(-)
+
+commit a1900114770952778563dd6f3bc79334b0ca8df5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 4 00:29:35 2012 +0200
+
+    Remove unused functions
+
+ src/hb-object-private.hh | 20 --------------------
+ 1 file changed, 20 deletions(-)
+
+commit 88b7564183ae1cf59500b13c7e48756fe200c7cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 2 19:14:29 2012 +0200
+
+    "Update" to Unicode 6.2.0 tables
+
+    Nothing changed...
+
+ src/hb-ot-shape-complex-arabic-table.hh |  4 ++--
+ src/hb-ot-shape-complex-indic-table.hh  | 12 ++++++------
+ 2 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 4ab99fb8c363cfc6a4f5952e69a19757f0cab344
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 15:02:04 2012 +0200
+
+    Minor
+
+ src/hb-ot-layout.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6748b96d27477b35dd69129e55d861259d66bf9f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 12:02:21 2012 +0200
+
+    Minor
+
+ src/hb-ot-layout.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 624933f67642997ee0a46d5acea285362e837142
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 11:46:35 2012 +0200
+
+    Add Persian test cases from Mehran Mehr
+
+ test/shaping/texts/in-tree/shaper-arabic/script-arabic/MANIFEST   | 1 +
+ .../in-tree/shaper-arabic/script-arabic/language-persian/MANIFEST | 1 +
+ .../shaper-arabic/script-arabic/language-persian/mehran.txt       |
+ 8 ++++++++
+ 3 files changed, 10 insertions(+)
+
+commit 0f3f5299047e3cfc4d1202fee83d484b871279ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 09:06:59 2012 +0200
+
+    Add test-size-params
+
+    Eventually this will become part of a yet-to-be-written hb-ot cmdline
+    tool.
+
+ src/Makefile.am         | 10 ++++-
+ src/test-size-params.cc | 98
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 107 insertions(+), 1 deletion(-)
+
+commit 8465a05a89742295d4b009a9b4442eb0a899fd80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 08:46:43 2012 +0200
+
+    Fix hb_buffer_guess_segment_properties() for empty buffer
+
+    Was causing assertion failure in shape_plan().
+
+ src/hb-buffer.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e75943de803f571b7ad2cf2f777119753a209656
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 08:38:24 2012 +0200
+
+    [OTLayout] Fix collect_glyphs() recursion in ContextFormat3
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3038ae6adbb61e55d6c665dea0c5271e0c9f0ed8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 08:24:13 2012 +0200
+
+    [OTLayout] Minor
+
+ src/hb-ot-layout-gpos-table.hh | 4 ----
+ src/hb-ot-layout-gsub-table.hh | 4 ----
+ src/hb-ot-layout.cc            | 4 ++--
+ 3 files changed, 2 insertions(+), 10 deletions(-)
+
+commit 0dff11f6bfbda444a153ca75ff2b947f94e9b3c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 08:14:20 2012 +0200
+
+    [OTLayout] Look for any 'size' feature, not only in DFLT script
+
+    The old code doesn't work with all fonts, as Khaled has reported.
+
+ src/hb-ot-layout.cc | 14 +++++---------
+ 1 file changed, 5 insertions(+), 9 deletions(-)
+
+commit e9ad71dee845407da74ccacfbb53ad7ededf07fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 08:10:26 2012 +0200
+
+    [OTLayout] Rename hb_ot_layout_position_get_size() to
+    hb_ot_layout_get_size_params()
+
+ src/hb-ot-layout.cc | 4 ++--
+ src/hb-ot-layout.h  | 7 ++++---
+ 2 files changed, 6 insertions(+), 5 deletions(-)
+
+commit f18ff5a84d9fe859c40a7a0c9a207cb40df0e84a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 30 08:07:06 2012 +0200
+
+    [OTLayout] Return correct value from recursion
+
+    Commit 4c4e8f0e754b79ac6190d21878eaaf0b790c7579 broke contextual
+    lookups
+    by making the recurse() function always return false.
+
+    Reported by Khaled.  Test case: لا in Amiri.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit f54cce3c6a0432268ce159dbe6c5c6b7f583b87a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 26 14:02:31 2012 +0200
+
+    [OTLayout] Implement 'size' feature
+
+ src/hb-ot-layout-common-private.hh | 36
+ ++++++++++++++++++++++++++++++++++--
+ src/hb-ot-layout.cc                | 31 +++++++++++++++++++++++++++++++
+ src/hb-ot-layout.h                 |  5 +++++
+ 3 files changed, 70 insertions(+), 2 deletions(-)
+
+commit 2dc1141d7d0a9f5818862b09d6b9cfe0a27f1fc1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 19:16:34 2012 -0500
+
+    [OTLayout] Remove operator() from ClassDef
+
+ src/hb-ot-layout-common-private.hh   | 2 --
+ src/hb-ot-layout-gpos-table.hh       | 4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 8 ++++----
+ 3 files changed, 6 insertions(+), 8 deletions(-)
+
+commit b67881b171a7cf865af58df146da52fc1e27b160
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 19:13:55 2012 -0500
+
+    [OTLayout] Remove operator() from Coverage
+
+ src/hb-ot-layout-common-private.hh   |  2 --
+ src/hb-ot-layout-gdef-table.hh       |  4 ++--
+ src/hb-ot-layout-gpos-table.hh       | 24 ++++++++++++------------
+ src/hb-ot-layout-gsub-table.hh       | 24 ++++++++++++------------
+ src/hb-ot-layout-gsubgpos-private.hh | 16 ++++++++--------
+ 5 files changed, 34 insertions(+), 36 deletions(-)
+
+commit a88e7160217b9f44e4e5b4b814d0ca98c457ee40
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 02:31:02 2012 -0500
+
+    [OTLayout] Implement hb_ot_layout_collect_lookups()
+
+    Untested.
+
+ src/hb-ot-layout.cc | 97
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout.h  |  4 +--
+ 2 files changed, 98 insertions(+), 3 deletions(-)
+
+commit 1ea375da446bf68f705a70ce4a480db9fb9d13f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 02:05:52 2012 -0500
+
+    [OTLayout] Only collect output glyphs during recursion in
+    collect_glyphs()
+
+ src/hb-ot-layout-gsubgpos-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit f1b12781d279a73b5754afee31e930b5cd87aac6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:55:34 2012 -0500
+
+    [OTLayout] Implement ChainContext collect_glyphs()
+
+    All of collect_glyphs() complete and untested now.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 103
+ ++++++++++++++++++++++++++++++++---
+ 1 file changed, 96 insertions(+), 7 deletions(-)
+
+commit cdd756b9f40665a201f5c4e65a87b9a27c390601
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:38:41 2012 -0500
+
+    [OTLayout] Implement GPOS collect_glyphs()
+
+ src/hb-ot-layout-gpos-table.hh | 95
+ +++++++++++++++++++++++++++++++++++++++++-
+ src/hb-ot-layout.cc            |  9 ++--
+ 2 files changed, 99 insertions(+), 5 deletions(-)
+
+commit 4c4e8f0e754b79ac6190d21878eaaf0b790c7579
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:13:20 2012 -0500
+
+    [OTLayout] Reuse apply context for recursion
+
+ src/hb-ot-layout-gpos-table.hh       | 7 ++++++-
+ src/hb-ot-layout-gsub-table.hh       | 7 ++++++-
+ src/hb-ot-layout-gsubgpos-private.hh | 8 ++++----
+ 3 files changed, 16 insertions(+), 6 deletions(-)
+
+commit 53a69f49e58ef4c4226958e0496fc22455ee6c87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 24 01:03:05 2012 -0500
+
+    [OTLayout] Remove unused members
+
+ src/hb-ot-layout-gsubgpos-private.hh | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit d0a5233785eb327c4080432f597fe470a1046af3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 18:54:59 2012 -0500
+
+    [OTLayout] Implement Context::collect_glyphs()
+
+ src/hb-ot-layout-gsubgpos-private.hh | 122
+ +++++++++++++++++++++++++++++++----
+ 1 file changed, 111 insertions(+), 11 deletions(-)
+
+commit 26514d51b6669f092d9ccb7523443a5ece74169a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 18:13:48 2012 -0500
+
+    [OTLayout] More collect_glyphs()
+
+ src/hb-ot-layout-gpos-table.hh       |  6 ++---
+ src/hb-ot-layout-gsub-table.hh       | 32 +++++++++++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh | 51
+ ++++++++++++++++++++++++++++++++----
+ 3 files changed, 71 insertions(+), 18 deletions(-)
+
+commit c6fb843f2a1c26322c6f4c85d1589f01a9e7a2ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 18:04:08 2012 -0500
+
+    [OTLayout] Templatize process_recurse_func
+
+ src/hb-ot-layout-gpos-table.hh | 10 ++++++++++
+ src/hb-ot-layout-gsub-table.hh |  8 +++++---
+ 2 files changed, 15 insertions(+), 3 deletions(-)
+
+commit 9b34677f362fb0ef5a7cb8a284a9e06d1a4cc03b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 17:55:40 2012 -0500
+
+    [OTLayout] Clean up closure() a bit
+
+ src/hb-ot-layout-gsub-table.hh       | 29 ++++++++++++++---------------
+ src/hb-ot-layout-gsubgpos-private.hh |  7 ++++---
+ src/hb-ot-layout.cc                  |  6 +++++-
+ 3 files changed, 23 insertions(+), 19 deletions(-)
+
+commit adf7758a27a11fb1a8a14a2673867589437d22a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 17:32:00 2012 -0500
+
+    Improve debug log format in presence of templates
+
+ src/hb-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 2c53bd3c3ec4f81eff126c5bf84b7f2ddf2f0fef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 17:29:05 2012 -0500
+
+    [OTLayout] Start porting sanitize() to process()
+
+ src/hb-open-type-private.hh          | 12 +++++++++++-
+ src/hb-ot-layout-gsubgpos-private.hh |  8 ++++----
+ 2 files changed, 15 insertions(+), 5 deletions(-)
+
+commit f48ec0e83432c038b50d9715a38ba1469e82e1e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 17:23:41 2012 -0500
+
+    [OTLayout] Add process() tracing
+
+ src/hb-ot-layout-gpos-table.hh       | 60
+ ++++++++++++++++++++----------------
+ src/hb-ot-layout-gsub-table.hh       | 51 +++++++++++++++++-------------
+ src/hb-ot-layout-gsubgpos-private.hh | 17 +++++-----
+ 3 files changed, 72 insertions(+), 56 deletions(-)
+
+commit ed2e13594479c6ed7909401509962ea2f03f9a6e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 17:10:40 2012 -0500
+
+    [OTLayout] More Extension templatizing
+
+ src/hb-ot-layout-gpos-table.hh       | 11 -----------
+ src/hb-ot-layout-gsub-table.hh       | 11 -----------
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++++++++++--
+ 3 files changed, 10 insertions(+), 24 deletions(-)
+
+commit 7dddd4e72bc35be962d93dc1b76c7e26c63aaa6d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 17:04:55 2012 -0500
+
+    [OTLayout] More templatizing Extension
+
+ src/hb-ot-layout-gpos-table.hh       |  7 +------
+ src/hb-ot-layout-gsub-table.hh       |  9 ++-------
+ src/hb-ot-layout-gsubgpos-private.hh | 10 +++++++++-
+ 3 files changed, 12 insertions(+), 14 deletions(-)
+
+commit 653eeb26450053b731b46346606931f5ae88db72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 16:57:36 2012 -0500
+
+    Make Extension a template
+
+ src/hb-ot-layout-gpos-table.hh       | 11 +----------
+ src/hb-ot-layout-gsub-table.hh       | 11 +----------
+ src/hb-ot-layout-gsubgpos-private.hh |  7 +++++++
+ 3 files changed, 9 insertions(+), 20 deletions(-)
+
+commit 08f1eede1bbc01ece2adf89847614a0670e50443
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 16:51:43 2012 -0500
+
+    Minor
+
+ src/hb-ot-layout-gpos-table.hh | 19 ++-----------------
+ src/hb-ot-layout-gsub-table.hh | 19 ++-----------------
+ 2 files changed, 4 insertions(+), 34 deletions(-)
+
+commit 2c9d6485a1f89c11f84e720d3c7978dc11a5039a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 16:49:19 2012 -0500
+
+    More tracing fixup
+
+ src/hb-private.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit a1733db1c6ff40aae71fa142a12b1fea7b53dd37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 16:40:04 2012 -0500
+
+    [OTLayout] Start adding process() tracing
+
+ src/hb-ot-layout-gsubgpos-private.hh | 44
+ +++++++++++++++++++++++++++---------
+ src/hb-private.hh                    |  6 +++--
+ 2 files changed, 37 insertions(+), 13 deletions(-)
+
+commit 73c18ae1b982a4e65086afe5177afa79e721e2c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 15:34:11 2012 -0500
+
+    Cleanup
+
+ src/hb-ot-layout-gsubgpos-private.hh | 16 ++++------------
+ 1 file changed, 4 insertions(+), 12 deletions(-)
+
+commit be218c688cbb037a99c8c64bb835f3c980040c0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 15:32:14 2012 -0500
+
+    Pass this object to trace macros
+
+ src/hb-open-file-private.hh          |  10 +--
+ src/hb-open-type-private.hh          |  34 +++++-----
+ src/hb-ot-head-table.hh              |   2 +-
+ src/hb-ot-hhea-table.hh              |   2 +-
+ src/hb-ot-hmtx-table.hh              |   2 +-
+ src/hb-ot-layout-common-private.hh   |  36 +++++------
+ src/hb-ot-layout-gdef-table.hh       |  20 +++---
+ src/hb-ot-layout-gpos-table.hh       |  80 +++++++++++------------
+ src/hb-ot-layout-gsub-table.hh       | 122
+ +++++++++++++++++------------------
+ src/hb-ot-layout-gsubgpos-private.hh | 100 ++++++++++++++--------------
+ src/hb-ot-maxp-table.hh              |   2 +-
+ src/hb-ot-name-table.hh              |   6 +-
+ 12 files changed, 208 insertions(+), 208 deletions(-)
+
+commit 902cc8aca0b3ff25eeee50b3a84d729e31731ef3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 15:06:59 2012 -0500
+
+    [OTLayout] Start unbreaking tracing
+
+ src/hb-open-type-private.hh          | 37
+ +++++++++++++++++++++---------------
+ src/hb-ot-layout-gsubgpos-private.hh | 37
+ +++++++++++++++++++++++++-----------
+ src/hb-private.hh                    | 30 +++++++++++++++++++----------
+ 3 files changed, 68 insertions(+), 36 deletions(-)
+
+commit dabe698fcbeb02911128b17aa8e3b2d864795960
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 14:21:35 2012 -0500
+
+    Minor
+
+ src/hb-open-type-private.hh          |  5 -----
+ src/hb-ot-layout-gsubgpos-private.hh | 10 ++++------
+ src/hb-private.hh                    | 27 +++++++++++++++++++++++++--
+ 3 files changed, 29 insertions(+), 13 deletions(-)
+
+commit c779d82b2fc801eec0d349a106c0e860448fcf4e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 14:07:24 2012 -0500
+
+    Fix warnings
+
+ src/hb-ot-layout-gpos-table.hh       | 2 --
+ src/hb-ot-layout-gsub-table.hh       | 8 +++-----
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ src/hb-private.hh                    | 2 +-
+ 4 files changed, 5 insertions(+), 9 deletions(-)
+
+commit 81822528efc63d867cb2343a8ff7af64fac1c70d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 23 13:27:16 2012 -0500
+
+    Minor
+
+ src/hb-open-type-private.hh          | 6 ++++++
+ src/hb-ot-layout-gsubgpos-private.hh | 3 ---
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+commit 1d67ef980f35ae30d4f8975f65ee07b8cc5deeea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 16:47:53 2012 -0500
+
+    Move code around
+
+ src/hb-ot-layout-gsubgpos-private.hh | 44
+ ++++++++++++++++++------------------
+ 1 file changed, 22 insertions(+), 22 deletions(-)
+
+commit ec35a72a44301934b8f123ab2833f59d8c875a09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 16:05:59 2012 -0500
+
+    [OTLayout] Port apply() operator to process() template
+
+ src/hb-ot-layout-gpos-table.hh       | 117
+ ++++-------------------------------
+ src/hb-ot-layout-gsub-table.hh       | 108
+ +++-----------------------------
+ src/hb-ot-layout-gsubgpos-private.hh |  99 +++++++++++++----------------
+ src/hb-ot-layout.cc                  |   2 +-
+ 4 files changed, 65 insertions(+), 261 deletions(-)
+
+commit 2005fa5340fc528c32dc2af945ad2431964a47d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 14:38:10 2012 -0500
+
+    [OTLayout] Port would_apply() and get_coverage() to process()
+    templates
+
+ src/hb-ot-layout-gpos-table.hh       | 175
+ +++++++++++--------------------
+ src/hb-ot-layout-gsub-table.hh       | 198
+ ++++++++++++-----------------------
+ src/hb-ot-layout-gsubgpos-private.hh |  76 +++++---------
+ 3 files changed, 156 insertions(+), 293 deletions(-)
+
+commit 44fc237b53ebfbaf8a539de16ad735d2c6afc52b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 21 23:33:13 2012 -0500
+
+    [OTLayout] Port closure() to process() template
+
+ src/hb-ot-layout-gsub-table.hh       | 297
+ ++++++++---------------------------
+ src/hb-ot-layout-gsubgpos-private.hh | 209 ++++++++++++------------
+ src/hb-ot-layout.cc                  |  10 +-
+ 3 files changed, 171 insertions(+), 345 deletions(-)
+
+commit 5be86b1bb4fbb37b50a1e2798df0c9a3a528b6b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 16:26:22 2012 -0500
+
+    [ucdn] Make data tables const!
+
+ src/hb-ucdn/ucdn.c           | 16 ++++++++--------
+ src/hb-ucdn/unicodedata_db.h | 28 ++++++++++++++--------------
+ 2 files changed, 22 insertions(+), 22 deletions(-)
+
+commit 7c5b7fe686c9163afe2f31fbeac6f8c8512f5516
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 22 14:15:08 2012 -0500
+
+    Fix hb_shape_plan_get_shaper()
+
+ src/hb-shape-plan.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 4c8963576573483269b327c6465f6ec99f489e05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 21 01:20:56 2012 -0500
+
+    0.9.7
+
+ NEWS         | 86
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 87 insertions(+), 1 deletion(-)
+
+commit ac064a2db2b7a010d99527e183145286215aea81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 21 01:14:19 2012 -0500
+
+    Rename hb_set_population() to hb_set_get_population()
+
+ src/hb-set.cc | 2 +-
+ src/hb-set.h  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 16c914c2a6efeb6999054333985b1f711e33cf94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 21 01:04:15 2012 -0500
+
+    [Indic] One more try at unbreaking Khmer fonts
+
+    See comments and discussion on the list.
+
+ src/hb-ot-shape-complex-private.hh | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+commit e8cfdd7fa8d0fb66e0a261f3547e5824897e5131
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 19:07:06 2012 -0800
+
+    Start implementing collect_glyphs() operation
+
+    Not functional yet.
+
+ src/hb-ot-layout-gsub-table.hh       | 185
+ +++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-gsubgpos-private.hh |  57 +++++++++++
+ src/hb-ot-layout.cc                  |  29 ++++++
+ src/hb-ot-layout.h                   |   4 +-
+ 4 files changed, 272 insertions(+), 3 deletions(-)
+
+commit 7d52e6601f0e695690cd168a288466746cf25300
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 18:49:54 2012 -0800
+
+    Whitespace
+
+ src/hb-coretext.cc                   |  32 +++++-----
+ src/hb-icu-le.cc                     |   2 +-
+ src/hb-old.cc                        |  10 ++--
+ src/hb-open-file-private.hh          |   2 +-
+ src/hb-open-type-private.hh          |   2 +-
+ src/hb-ot-head-table.hh              |   2 +-
+ src/hb-ot-hhea-table.hh              |   2 +-
+ src/hb-ot-hmtx-table.hh              |   2 +-
+ src/hb-ot-layout-common-private.hh   |   2 +-
+ src/hb-ot-layout-gdef-table.hh       |   2 +-
+ src/hb-ot-layout-gpos-table.hh       |   2 +-
+ src/hb-ot-layout-gsub-table.hh       |   2 +-
+ src/hb-ot-layout-gsubgpos-private.hh |   2 +-
+ src/hb-ot-maxp-table.hh              |   2 +-
+ src/hb-ot-name-table.hh              |   2 +-
+ src/hb-ot-shape-complex-default.cc   | 109
+ ++++++++++++++++++-----------------
+ src/hb-tt-font.cc                    |   2 +-
+ 17 files changed, 87 insertions(+), 92 deletions(-)
+
+commit 51bb498b7b07bff4a447405b72f09b68d07a3e95
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 14:08:05 2012 -0800
+
+    Minor
+
+ src/hb-ot-shape.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 89ca8eeb83fedde06727d386369a0a39d410f12b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 13:53:40 2012 -0800
+
+    Implement hb_ot_layout_get_glyphs_in_class()
+
+ src/hb-ot-layout-common-private.hh | 24 ++++++++++++++++++++++++
+ src/hb-ot-layout-gdef-table.hh     |  2 ++
+ src/hb-ot-layout.cc                |  8 ++++++++
+ src/hb-ot-layout.h                 |  5 ++---
+ 4 files changed, 36 insertions(+), 3 deletions(-)
+
+commit 5a08ecf9200a6ac9b4ebb7ec5c13dcb42d8820ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 13:34:29 2012 -0800
+
+    Implement hb_ot_layout_get_glyph_class()
+
+ src/hb-ot-layout-gdef-table.hh       | 10 +++++-----
+ src/hb-ot-layout-gpos-table.hh       |  8 ++++----
+ src/hb-ot-layout-gsub-table.hh       |  2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 10 +++++-----
+ src/hb-ot-layout-private.hh          | 10 +++++++++-
+ src/hb-ot-layout.cc                  |  6 ++++++
+ src/hb-ot-layout.h                   | 14 ++++++--------
+ src/hb-ot-shape.cc                   |  4 ++--
+ 8 files changed, 38 insertions(+), 26 deletions(-)
+
+commit f9edd5d56bd219625f5b16b23eac53b4c4a8b194
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 13:23:37 2012 -0800
+
+    Implement hb_shape_plan_get_shaper()
+
+    Untested.
+
+ src/hb-shape-plan-private.hh | 1 +
+ src/hb-shape-plan.cc         | 7 +++++++
+ src/hb-shape-plan.h          | 4 +---
+ 3 files changed, 9 insertions(+), 3 deletions(-)
+
+commit 43b653150081a2f9dc6b7481229ac4cd952575dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 13:12:35 2012 -0800
+
+    [Indic] Another try to unbreak Sinhala split matras
+
+    Just read the comments...
+
+ src/hb-ot-shape-complex-indic.cc                   | 43
+ ++++++++++++++++++----
+ .../indic/script-sinhala/misc/MANIFEST             |  1 +
+ .../indic/script-sinhala/misc/split-matras.txt     |  4 ++
+ 3 files changed, 40 insertions(+), 8 deletions(-)
+
+commit 977f1740ace730dcdff8221a17f2a592c2ec7c74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 13:10:07 2012 -0800
+
+    Unbreak tests
+
+ src/hb-ot-layout.h  | 14 +++++++-------
+ src/hb-shape-plan.h |  2 +-
+ 2 files changed, 8 insertions(+), 8 deletions(-)
+
+commit eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 16 12:39:23 2012 -0800
+
+    Plumbing to get shape plan and font into complex decompose function
+
+    So we can handle Sinhala split matras smartly...  Coming soon.
+
+ src/hb-ot-shape-complex-default.cc   |  6 ++--
+ src/hb-ot-shape-complex-indic.cc     | 14 ++++-----
+ src/hb-ot-shape-complex-private.hh   | 16 +++++------
+ src/hb-ot-shape-normalize-private.hh | 22 ++++++++++++--
+ src/hb-ot-shape-normalize.cc         | 56
+ ++++++++++++++----------------------
+ src/hb-ot-shape.cc                   |  2 +-
+ 6 files changed, 61 insertions(+), 55 deletions(-)
+
+commit 3f82f8ff07a9d16a7c047129658c1bbedfdb5436
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 18:45:31 2012 -0800
+
+    Rename hb_buffer_guess_properties() to
+    hb_buffer_guess_segment_properties()
+
+ src/hb-buffer-private.hh | 2 +-
+ src/hb-buffer.cc         | 6 +++---
+ src/hb-buffer.h          | 2 +-
+ src/hb-fallback-shape.cc | 2 +-
+ src/hb-ot-shape.cc       | 2 +-
+ src/hb-shape.cc          | 2 +-
+ 6 files changed, 8 insertions(+), 8 deletions(-)
+
+commit f30641038ba96e83950729b1bd9d86d2e98e46c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 18:39:46 2012 -0800
+
+    Bunch of independent changes (ouch)
+
+    API additions:
+
+            hb_segment_properties_t
+            HB_SEGMENT_PROPERTIES_DEFAULT
+            hb_segment_properties_equal()
+            hb_segment_properties_hash()
+
+            hb_buffer_set_segment_properties()
+            hb_buffer_get_segment_properties()
+
+            hb_ot_layout_glyph_class_t
+
+            hb_shape_plan_t
+            hb_shape_plan_create()
+            hb_shape_plan_create_cached()
+            hb_shape_plan_get_empty()
+            hb_shape_plan_reference()
+            hb_shape_plan_destroy()
+            hb_shape_plan_set_user_data()
+            hb_shape_plan_get_user_data()
+            hb_shape_plan_execute()
+
+            hb_ot_shape_plan_collect_lookups()
+
+    API changes:
+
+            Rename hb_ot_layout_feature_get_lookup_indexes() to
+            hb_ot_layout_feature_get_lookups().
+
+    New header file:
+
+            hb-shape-plan.h
+
+    And a bunch of prototyped but not implemented stuff.  Coming soon.
+    (Tests fail because of the prototypes right now.)
+
+ src/Makefile.am              |   2 +-
+ src/hb-buffer-private.hh     |  37 ---------------
+ src/hb-buffer.cc             |  45 +++++++++++++++++-
+ src/hb-buffer.h              |  47 +++++++++++++++++--
+ src/hb-ot-layout-private.hh  |   8 ----
+ src/hb-ot-layout.cc          |  12 ++---
+ src/hb-ot-layout.h           | 108
+ ++++++++++++++++++++++++++++++++++++++++---
+ src/hb-ot-map-private.hh     |   2 +-
+ src/hb-ot-map.cc             |  15 +++---
+ src/hb-ot-shape-private.hh   |  11 ++++-
+ src/hb-ot-shape.cc           |  52 ++++++++++++++-------
+ src/hb-ot.h                  |   1 +
+ src/hb-shape-plan-private.hh |   3 +-
+ src/hb-shape-plan.cc         |  23 +++++++--
+ src/hb-shape-plan.h          |  50 +++++++++++++-------
+ src/hb-shaper-private.hh     |   2 -
+ src/hb-shaper.cc             |   2 +-
+ src/hb.h                     |   1 +
+ 18 files changed, 304 insertions(+), 117 deletions(-)
+
+commit 75da37dcb17aacc0be6bb006683a84aa31155938
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 18:39:23 2012 -0800
+
+    Minor
+
+ util/hb-ot-shape-closure.cc | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit e05a999495e6575f7cebd7f35db087d964f11ef6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 16:23:21 2012 -0800
+
+    Add hb_face_[sg]et_glyph_count()
+
+ src/hb-font-private.hh |  9 +++++++++
+ src/hb-font.cc         | 29 ++++++++++++++++++++++++++++-
+ src/hb-font.h          |  7 +++++++
+ 3 files changed, 44 insertions(+), 1 deletion(-)
+
+commit aec89de5641fbe1c3031d63dd5f40ec99bf2a538
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 16:15:42 2012 -0800
+
+    Add / modify set API a bit
+
+ src/hb-ot-shape.cc          |  2 +-
+ src/hb-set-private.hh       | 35 ++++++++++++++++--
+ src/hb-set.cc               | 86
+ ++++++++++++++++++++++++++++++---------------
+ src/hb-set.h                | 55 +++++++++++++++++++----------
+ util/hb-ot-shape-closure.cc |  2 +-
+ 5 files changed, 128 insertions(+), 52 deletions(-)
+
+commit c54599ad269380c7aa28d885fcfd660fc2c10a7b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 16:14:23 2012 -0800
+
+    Minor
+
+ src/hb-buffer.cc | 2 +-
+ src/hb-buffer.h  | 8 +++-----
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+commit d1aa143ca434fe272de21d2002768c83387b583b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 15:38:08 2012 -0800
+
+    [Thai] Remove U+0E2C from "AC" consonants
+
+    WinXP doesn't include it.
+
+ src/hb-ot-shape-complex-thai.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 362a990b2246f5448ecb9d600761f710aea7d42d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 14:57:31 2012 -0800
+
+    Rename hb_ot_layout_would_substitute_lookup() and
+    hb_ot_layout_substitute_closure_lookup()
+
+    To match upcoming API.
+
+ src/hb-ot-layout-private.hh      | 2 +-
+ src/hb-ot-layout.cc              | 8 ++++----
+ src/hb-ot-layout.h               | 4 ++--
+ src/hb-ot-map.cc                 | 2 +-
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ src/test-would-substitute.cc     | 2 +-
+ 6 files changed, 10 insertions(+), 10 deletions(-)
+
+commit a4bef84e375b090c1bc7e4221b8e0ee435dfcbba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 13:29:51 2012 -0800
+
+    [util] Make hb-shape err if output-format is not understood
+
+    And list supported formats.
+
+ util/hb-shape.cc | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 3cec819d39e45470d03085bb6fa132882cc85943
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 13:15:39 2012 -0800
+
+    Make the OT shaper default, even if CoreText or Uniscribe is enabled
+
+ src/hb-shaper-list.hh | 15 ++++++++-------
+ 1 file changed, 8 insertions(+), 7 deletions(-)
+
+commit 072ae7a982bf640804eee0b41525e7c328806bf5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 13:14:12 2012 -0800
+
+    Add hb_buffer_serialize_list_formats()
+
+ src/hb-buffer.cc | 6 ++++++
+ src/hb-buffer.h  | 3 +++
+ 2 files changed, 9 insertions(+)
+
+commit f9edf1672511c3bcc3796cc79578ffea43b2bda1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 12:14:09 2012 -0800
+
+    Add buffer serialization / deserialization API
+
+    Two output formats for now: TEXT, and JSON.  For example:
+
+      hb-shape --output-format=json
+
+    Deserialization API is added, but not implemented yet.
+
+ src/hb-buffer.cc | 222
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.h  |  42 +++++++++++
+ util/hb-shape.cc |  21 +++++-
+ util/options.cc  |  57 +++++---------
+ util/options.hh  |   7 +-
+ 5 files changed, 304 insertions(+), 45 deletions(-)
+
+commit fd0de881f4fc004da6f36d50a91d0e62f8eb4d8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 10:47:14 2012 -0800
+
+    Avoid C++ undefined behavior
+
+    https://bugzilla.mozilla.org/show_bug.cgi?id=810823
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f41dc2d35b23220d59d38990bb66f1cbd66a55b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 15 10:36:43 2012 -0800
+
+    Fix undefined behavior in Indic dottedcircle
+
+    Chromium Issue 158998:  Conditional jump in harfbuzz-ng
+    http://code.google.com/p/chromium/issues/detail?id=158998
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1eb3e94fe99a072ce422e60ac4d4d89ef489b08a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 17:25:03 2012 -0800
+
+    [Thai] Implement PUA-based fallback shaping
+
+    As explained here:
+
+      http://linux.thai.net/~thep/th-otf/shaping.html
+
+    Our output now matches Uniscribe for old fonts (eg. XP Tahoma) with no
+    Thai GSUB table.
+
+ src/hb-ot-shape-complex-thai.cc | 217
+ ++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 217 insertions(+)
+
+commit 851784f8372004e0a40b698c0cdc2d7db8629aa2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 16:24:05 2012 -0800
+
+    Improve shaper selection
+
+ src/hb-ot-map-private.hh           |  8 ++++----
+ src/hb-ot-map.cc                   |  6 ++++--
+ src/hb-ot-shape-complex-indic.cc   |  2 +-
+ src/hb-ot-shape-complex-private.hh | 13 ++++++++-----
+ src/hb-ot-shape-complex-thai.cc    | 24 ++++++++++++++++++++++--
+ 5 files changed, 39 insertions(+), 14 deletions(-)
+
+commit f3584d3a3a627e38dfd7769975a670db340d2a48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 15:55:17 2012 -0800
+
+    Add test cases for Thai PUA shaping
+
+ .../texts/in-tree/shaper-thai/script-thai/misc/MANIFEST       |  1 +
+ .../in-tree/shaper-thai/script-thai/misc/pua-shaping.txt      |
+ 11 +++++++++++
+ 2 files changed, 12 insertions(+)
+
+commit 43f04a7456419153cb03e610a825056a47824780
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 15:51:54 2012 -0800
+
+    Move Thai shaper into a separate file
+
+ src/Makefile.am                                    |   3 +-
+ ...plex-misc.cc => hb-ot-shape-complex-default.cc} | 114
+ -----------------
+ src/hb-ot-shape-complex-thai.cc                    | 141
+ +++++++++++++++++++++
+ 3 files changed, 143 insertions(+), 115 deletions(-)
+
+commit ba82325b7a6311b787ae47f41a56964e2f2cba9f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 15:36:53 2012 -0800
+
+    Add note re 'Phags-pa letter U+A872, which is Joining_Type=L
+
+ src/hb-ot-shape-complex-arabic.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d469fadce8290c7dda559c5927dd19df65f91c1a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 15:07:36 2012 -0800
+
+    [Indic] Exchange abort() for assert()
+
+ src/hb-ot-shape-complex-indic.cc | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 0f80a89de99293ddbf0b8b815fe360677d057e38
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 15:05:19 2012 -0800
+
+    Don't route Kharoshthi through the Indic shaper
+
+    It's a simple, right-to-left, script.
+
+ src/hb-ot-shape-complex-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e67072bb179a5c17db04075de74215597fb43c82
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 15:00:53 2012 -0800
+
+    [Indic] Handle overstruck matra position
+
+ src/hb-ot-shape-complex-indic-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 7e99e4f0740e47efda5882604954cb7d12700a4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 14:09:46 2012 -0800
+
+    Reposition Lao marks
+
+    Lao marks are center-aligned, unlike Thai ones.
+
+ src/hb-ot-shape-fallback.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 865745b5b87236651f5663cae3461db9cb505eed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 13:48:26 2012 -0800
+
+    Don't do fallback positioning for Indic and Thai shapers
+
+ src/hb-ot-shape-complex-arabic.cc  |  1 +
+ src/hb-ot-shape-complex-indic.cc   |  1 +
+ src/hb-ot-shape-complex-misc.cc    |  2 ++
+ src/hb-ot-shape-complex-private.hh |  1 +
+ src/hb-ot-shape.cc                 | 20 +++++---------------
+ 5 files changed, 10 insertions(+), 15 deletions(-)
+
+commit 981748cb2e9b48b77177b19ec1f972cab7afda89
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 13:38:16 2012 -0800
+
+    [Indic] If Khmer fonts have a 'liga' feature, use generic shaper
+
+    Seems to produce more coherent results than trying the Indic shaper on
+    them.  I'm looking at you, Kh-* fonts...
+
+ src/hb-ot-shape-complex-private.hh | 21 +++++++++++++++++----
+ 1 file changed, 17 insertions(+), 4 deletions(-)
+
+commit 6b19fa48621dbf36d471d5005f6ae20df350954f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 11:38:50 2012 -0800
+
+    Adjust diff rule for the new hb-shape output format
+
+ test/shaping/hb_test_tools.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dde5506fd963e3cec27c3389bb1fc092f86d1e06
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 11:37:04 2012 -0800
+
+    [Indic] Don't move virama with left matra
+
+    This is important for the Sinhala U+0DDA split matra since it
+    decomposes
+    to U+0DD9,U+0DCA where U+0DD9 is a left matra and U+0DCA is the
+    virama.
+    We don't want to move the virama with the left matra.
+    TEST: U+0D9A,U+0DDA
+
+    Note that we were already doing this in the Uniscribe bug
+    compatibility
+    mode.  We now do it all the time.
+
+ src/hb-ot-shape-complex-indic.cc | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 82c4d9880a2cd321f6426888511c5f0318f96ad5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 10:56:02 2012 -0800
+
+    Add Sinhala test case for split matra U+0DDA
+
+ .../texts/in-tree/shaper-indic/indic/script-sinhala/misc/misc.txt
+ | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d04b12853167d756a8cccaf4154f0fd894bce6de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 14 10:53:10 2012 -0800
+
+    Fix test
+
+ test/api/test-buffer.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 92f9bfed42f720c1fd78e795845542661aaf4f8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 16:50:45 2012 -0800
+
+    Minor
+
+ src/hb-buffer.h | 26 ++++++++++++++------------
+ 1 file changed, 14 insertions(+), 12 deletions(-)
+
+commit 66ac2ff32e24f0d5658ca172147613081a133847
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 16:26:32 2012 -0800
+
+    API change: Remove "mask" from hb_buffer_add()
+
+    I don't expect anybody using hb_buffer_add(), so this shouldn't break
+    anyone's code.
+
+ src/hb-buffer-private.hh | 1 -
+ src/hb-buffer.cc         | 8 +++-----
+ src/hb-buffer.h          | 1 -
+ 3 files changed, 3 insertions(+), 7 deletions(-)
+
+commit 407f80d62589774f845ef1a6a0a7d841b09d57c6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 15:33:27 2012 -0800
+
+    [util] Add --bot / --eot / --preserve-default-ignorables
+
+ util/options.cc |  3 +++
+ util/options.hh | 12 ++++++++++++
+ 2 files changed, 15 insertions(+)
+
+commit 78d41d8d69142ae95928b51215c0c0c5e3f5b3f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 15:15:09 2012 -0800
+
+    Minor
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 321f73c16efa0730c96e001d65268f4927a0f735
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 15:12:24 2012 -0800
+
+    [util] Add --text-before and --text-after to hb-shape / hb-view
+
+    Use with Arabic, for example, to see the effect on joining.
+
+ util/hb-ot-shape-closure.cc |  4 +++-
+ util/main-font-text.hh      |  2 +-
+ util/options.cc             |  2 ++
+ util/options.hh             | 18 ++++++++++++++++--
+ util/shape-consumer.hh      |  6 ++++--
+ 5 files changed, 26 insertions(+), 6 deletions(-)
+
+commit e13f8d280bafc6a6b6e31e2eee587660b8333c56
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 15:12:06 2012 -0800
+
+    Fix UTF-8 backward iteration
+
+    Ouch!
+
+ src/hb-utf-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5669a6cf418f3a8b9281c36e9d662d843be80433
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 15:11:51 2012 -0800
+
+    [Arabic] Fix post-context handling
+
+    Ouch!
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0c7df2222862122ebbdc8665a21d6771ef5e0252
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 14:42:35 2012 -0800
+
+    Add buffer flags
+
+    New API:
+
+            hb_buffer_flags_t
+
+            HB_BUFFER_FLAGS_DEFAULT
+            HB_BUFFER_FLAG_BOT
+            HB_BUFFER_FLAG_EOT
+            HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES
+
+            hb_buffer_set_flags()
+            hb_buffer_get_flags()
+
+    We use the BOT flag to decide whether to insert dottedcircle if the
+    first char in the buffer is a combining mark.
+
+    The PRESERVE_DEFAULT_IGNORABLES flag prevents removal of characters
+    like
+    ZWNJ/ZWJ/...
+
+ src/hb-buffer-private.hh          |  1 +
+ src/hb-buffer.cc                  | 18 ++++++++++++++++++
+ src/hb-buffer.h                   | 13 +++++++++++++
+ src/hb-ot-shape-complex-arabic.cc | 40
+ ++++++++++++++++++++-------------------
+ src/hb-ot-shape.cc                |  9 ++++++---
+ test/api/test-buffer.c            |  9 +++++++++
+ 6 files changed, 68 insertions(+), 22 deletions(-)
+
+commit 1c7e55511a870f2689680ca8f977e00879f3b3e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 14:42:22 2012 -0800
+
+    Minor fix
+
+    Ouch
+
+ src/hb-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c8d4f8b0fe56ce909e3ca07f8a30cb4fb940868b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 14:10:19 2012 -0800
+
+    Minor
+
+ test/api/test-object.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 82ecaff736e245e117d70b6ec1497508c6eb08d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 13:57:52 2012 -0800
+
+    Add hb_buffer_clear()
+
+    Which is like _reset(), but does NOT clear unicode-funcs.
+
+ src/hb-buffer-private.hh |  1 +
+ src/hb-buffer.cc         | 15 +++++++++++++++
+ src/hb-buffer.h          |  4 ++++
+ test/api/test-buffer.c   | 22 +++++++++++++++++++++-
+ 4 files changed, 41 insertions(+), 1 deletion(-)
+
+commit da43a92b04929e93356ae393803ef101154d2267
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 13:48:26 2012 -0800
+
+    0.9.6
+
+ NEWS         | 28 ++++++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 29 insertions(+), 1 deletion(-)
+
+commit 0736915b8ed789a209205fec762997af3a8af89c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 12:35:35 2012 -0800
+
+    [Indic] Decompose Sinhala split matras the way old HarfBuzz /
+    Pango did
+
+    Had to do some refactoring to make this happen...
+
+    Under uniscribe bug compatibility mode, we still plit them
+    Uniscrie-style, but Jonathan and I convinced ourselves that there
+    is no
+    harm doing this the Unicode way.  This change makes that happen, and
+    unbreaks free Sinhala fonts.
+
+ src/hb-ot-shape-complex-arabic.cc    |   2 +
+ src/hb-ot-shape-complex-indic.cc     |  74 +++++++++-
+ src/hb-ot-shape-complex-misc.cc      | 133 ++++++++++++++++-
+ src/hb-ot-shape-complex-private.hh   |  28 +++-
+ src/hb-ot-shape-normalize-private.hh |   6 +-
+ src/hb-ot-shape-normalize.cc         | 278
+ ++++++++++-------------------------
+ src/hb-ot-shape.cc                   |   5 +-
+ 7 files changed, 312 insertions(+), 214 deletions(-)
+
+commit c8149ca85ed97112778590bc9f090f3ee0254100
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 13 11:07:20 2012 -0800
+
+    [hb-shape] Adjust postioning output format
+
+    1. If there is any offset (x or y), print out both x and y offsets.
+
+    2. Always print out the advance in the major direction of the buffer.
+    Ie. even for zero-advance glyphs, print a "+0".  This is more
+    intuitive.
+
+ util/options.cc | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit 6fd5335622087e87739684f581aa9f88635ff970
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 18:42:18 2012 -0800
+
+    [Indic] Update auto-generated Indic machine to reflect previous commit
+
+ src/hb-ot-shape-complex-indic-machine.hh | 1126
+ +++++++++++++++---------------
+ 1 file changed, 567 insertions(+), 559 deletions(-)
+
+commit 9cac1338c4bc3e9034cbfa104291ed0329debefe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 18:41:22 2012 -0800
+
+    [Indic] Allow Consonant_Medial's after Consonant's
+
+    Mostly affects Myanmar, but also Tai Tham, Javanese, and Cham.  The
+    latter three are untested (no fonts!).
+
+ src/hb-ot-shape-complex-indic-machine.rl | 3 ++-
+ src/hb-ot-shape-complex-indic-private.hh | 7 ++++---
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+commit d187099cbab8e75f870a2bc9c23b6a1cf226905e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 18:38:06 2012 -0800
+
+    [Indic] Categorize Myanmar "tone marks" as nuktas
+
+ src/hb-ot-shape-complex-indic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8173f23f3f16972c2e8e0a120724533100acfda2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 18:37:20 2012 -0800
+
+    [Indic] Add config for Myanmar
+
+ src/hb-ot-shape-complex-indic.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 9e92978c8aa3d3cdab4d20c81698c56adbb3dbdd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 18:36:10 2012 -0800
+
+    [Indic] Route "new" Myanmar tag through the Indic shaper
+
+    Windows 8 adds a Myanmar shaper using the 'mym2' tag.  Route that
+    through the Indic shaper.  It's still very broken, but at least this
+    does NOT break old-style Myanmar shaping using the generic shaper.
+
+ src/hb-ot-shape-complex-private.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 5ab3855f8106158ee7e68797e8c35e63e9216e5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 18:27:42 2012 -0800
+
+    Choose shaper based on chosen OT script tag
+
+    For Arabic and Indic shapers, if the font doesn't have a script system
+    for the script, use default shaper.
+
+    Make an exception for Arabic script since we have fallback logic for
+    that one.
+
+ src/hb-ot-map-private.hh           |  4 ++++
+ src/hb-ot-shape-complex-private.hh | 11 +++++++++--
+ 2 files changed, 13 insertions(+), 2 deletions(-)
+
+commit 9b37b4c5800b158f61602d2aba8a01349e24d251
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 18:23:38 2012 -0800
+
+    Make planner available to complex shaper choosing logic
+
+ src/hb-ot-shape-complex-private.hh | 4 ++--
+ src/hb-ot-shape.cc                 | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 6fddf2d7397411bba8a23ac535e8b851495d3105
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 17:57:24 2012 -0800
+
+    Refactoring ot-map building to make chosen script available earlier
+
+ src/hb-ot-map-private.hh   | 13 ++++++++----
+ src/hb-ot-map.cc           | 51
+ ++++++++++++++++++++++++++--------------------
+ src/hb-ot-shape-private.hh |  4 ++--
+ 3 files changed, 40 insertions(+), 28 deletions(-)
+
+commit f17ed8116e7b6429af3fa60bb43d5f4fac66eae3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 17:48:26 2012 -0800
+
+    Minor TODO
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit de796a6fb98f4deda276caa82266b7c830978e0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 17:27:51 2012 -0800
+
+    Add "new" Myanmar OT Script tag
+
+    Windows 8 added support for Myanmar shaping using the "mym2"
+    script tag,
+    even though Windows never supported the old "mymr" tag.
+
+ src/hb-ot-tag.cc       | 2 ++
+ test/api/test-ot-tag.c | 1 +
+ 2 files changed, 3 insertions(+)
+
+commit 27f52dc3f6bbb97594a44f27b180aed73d9e5608
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 16:54:03 2012 -0800
+
+    Add Myanmar tests from UTN#11
+
+ .../south-east-asian/script-myanmar/misc/MANIFEST  |  1 +
+ .../south-east-asian/script-myanmar/misc/utn11.txt | 34
+ ++++++++++++++++++++++
+ 2 files changed, 35 insertions(+)
+
+commit e9334ce97bb7f1de87fb211bb5a8168033629b14
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 14:57:02 2012 -0800
+
+    Break build when ragel is needed and missing
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dba186711e3f5e723f917b7104e849c4c525d3b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 14:48:33 2012 -0800
+
+    [Indic] Make more room in the table
+
+    To be used in upcoming commits.
+
+ src/hb-ot-shape-complex-indic-private.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit c4be9917438c45b972ec76dc68409014110f0837
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 14:27:33 2012 -0800
+
+    Typo
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 56be677781736bbedc80df6f6aaa2b5f0bc4041c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 14:09:40 2012 -0800
+
+    [Indic] Port 'pref' logic to look into font tables
+
+    ...instead of using a hardcoded list of Ra characters.
+
+ src/hb-ot-shape-complex-indic.cc | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit f2c0f59043c93c225274fc0c8177077d16c89d61
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 14:02:02 2012 -0800
+
+    [Indic] Port reph handling logic to look into font features
+
+    ...instead of using a hardcoded list of Ra characters.
+
+ src/hb-ot-shape-complex-indic.cc | 48
+ +++++++++++++++++++++++++---------------
+ 1 file changed, 30 insertions(+), 18 deletions(-)
+
+commit 43149afbc0007ea075a7017c0e56056c3c0f3614
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 13:34:17 2012 -0800
+
+    Route MEETEI_MAYEK through the Indic shaper
+
+    Since it has a couple of left-"matras".
+
+ src/hb-ot-shape-complex-private.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit d0905c3400085f9c0901c558ba1b81b5039510e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 13:02:20 2012 -0800
+
+    Minor
+
+ src/hb-ot-head-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 365f27ab5ba025bf1be6a882ed213c695cbfed7e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 11:16:57 2012 -0800
+
+    Work around older compilers
+
+    As reported on the list:
+
+    I am seeing a similar problem building harfbuzz 0.9.5 with Apple gcc
+    4.0.1 on OS X 10.5 Leopard:
+
+    hb-ot-layout-common-private.hh:406: error: 'struct
+    OT::CoverageFormat1::Iter' is private
+    hb-ot-layout-common-private.hh:646: error: within this context
+    hb-ot-layout-common-private.hh:500: error: 'struct
+    OT::CoverageFormat2::Iter' is private
+    hb-ot-layout-common-private.hh:647: error: within this context
+    make[4]: *** [libharfbuzz_la-hb-ot-layout.lo] Error 1
+
+    Also reported as happening with MSVC 2005.
+
+ src/hb-ot-layout-common-private.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 6b389ddc3623d042ded4731f4d62dc354002fdd0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 11:02:56 2012 -0800
+
+    [Indic] Don't apply 'liga'
+
+    Uniscribe doesn't.  And some fonts abuse this feature to get Indic
+    shaping working in non-complex applications like Adobe's apps.
+
+    No change in numbers:
+
+    BENGALI: 353897 out of 354188 tests passed. 291 failed (0.0821598%)
+    DEVANAGARI: 707337 out of 707394 tests passed. 57 failed (0.00805774%)
+    GUJARATI: 366440 out of 366457 tests passed. 17 failed (0.00463902%)
+    GURMUKHI: 60704 out of 60747 tests passed. 43 failed (0.0707854%)
+    KANNADA: 951046 out of 951913 tests passed. 867 failed (0.0910798%)
+    KHMER: 299074 out of 299124 tests passed. 50 failed (0.0167155%)
+    LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
+    MALAYALAM: 1048011 out of 1048334 tests passed. 323 failed
+    (0.0308108%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271666 out of 271847 tests passed. 181 failed (0.0665816%)
+    TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
+    TELUGU: 970557 out of 970573 tests passed. 16 failed (0.00164851%)
+    TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)
+
+ src/hb-ot-shape-complex-indic.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit d05ac7dc3f2949e85f1fe996315b31b7aae370fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 10:26:50 2012 -0800
+
+    Fix hb-ft glyph name for broken fonts that return empty glyph names
+
+ src/hb-ft.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3bc22eb7b843c77706bb13fc332009097f247813
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 12 10:07:28 2012 -0800
+
+    Minor
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4899801155cc0fef7a8aa58c33ac2d30ba34bcc3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 8 15:08:26 2012 -0800
+
+    U+A872 PHAGS-PA SUPERFIXED LETTER RA is "Right"-Joining
+
+ src/hb-ot-shape-complex-arabic.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 22a685836a59d1c02914761c02d3852810b83ec5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 15:20:10 2012 -0800
+
+    Adjust Mongolian shaping
+
+    For U+1880..U+1886 Uniscribe thinks they are non-joining.
+    For U+1887 Uniscribe thinks it's joining, but looks wrong to me.
+    For now, match Uniscribe.
+
+ src/hb-ot-shape-complex-arabic.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit e6b86c8519f894bf7fe18d5c143276521fcacece
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 5 15:18:49 2012 -0800
+
+    Add test for non-joining Mongolian letters
+
+    For U+1880..U+1886 Uniscribe thinks they are non-joining.
+    For U+1887 Uniscribe thinks it's joining, but looks wrong to me.
+
+ .../texts/in-tree/shaper-arabic/script-mongolian/misc/MANIFEST    | 1 +
+ .../in-tree/shaper-arabic/script-mongolian/misc/non-joining.txt   |
+ 8 ++++++++
+ 2 files changed, 9 insertions(+)
+
+commit c26a52fbe62e5ba4d0e1e2ba13bfb6ceb3f773dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 4 16:48:45 2012 -0800
+
+    Minor
+
+ src/hb-ot-shape-fallback.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f60d3ed35d94f1adcfd73ca05d03d7e81fb5de03
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 4 16:44:47 2012 -0800
+
+    Minor
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f5e55754f962184d2fb7dcab837cdba56e8c7731
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 13:53:18 2012 -0700
+
+    Add Tifinagh test data
+
+ test/shaping/texts/in-tree/shaper-default/MANIFEST            |  2 ++
+ .../texts/in-tree/shaper-default/script-tifinagh/MANIFEST     |  1 +
+ .../in-tree/shaper-default/script-tifinagh/misc/MANIFEST      |  1 +
+ .../in-tree/shaper-default/script-tifinagh/misc/misc.txt      |
+ 11 +++++++++++
+ 4 files changed, 15 insertions(+)
+
+commit 10a33296e674ee84b9ed2df25cf373de7d020b8d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 13:38:55 2012 -0700
+
+    Minor
+
+ src/hb-ot-tag.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit c21498afd857e78230f761ee5c9e73adece89dd0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 2 10:21:26 2012 -0700
+
+    Add Mongolian and 'Phags-pa joining test cases
+
+ test/shaping/texts/in-tree/shaper-arabic/MANIFEST          |  1 +
+ .../in-tree/shaper-arabic/script-mongolian/misc/misc.txt   |  3 +++
+ .../texts/in-tree/shaper-arabic/script-phags-pa/MANIFEST   |  1 +
+ .../in-tree/shaper-arabic/script-phags-pa/misc/MANIFEST    |  1 +
+ .../in-tree/shaper-arabic/script-phags-pa/misc/misc.txt    | 14
+ ++++++++++++++
+ 5 files changed, 20 insertions(+)
+
+commit 3ba7bc14ea652d27639f34109e51a497a678a54a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 1 20:05:04 2012 -0700
+
+    Implement 'Phags-pa shaping
+
+    Through the Arabic shaper.  It's similar to Mongolian.
+
+ src/hb-ot-shape-complex-arabic.cc  | 15 ++++++++++++---
+ src/hb-ot-shape-complex-private.hh |  4 +---
+ 2 files changed, 13 insertions(+), 6 deletions(-)
+
+commit 431bef2e16c7888ca3960f5797432d3a20903550
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 1 16:26:01 2012 -0700
+
+    Minor build fix
+
+ test/api/Makefile.am | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit da70111ab234e8b740ce6fb1789a1809fbec0c44
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 31 13:45:30 2012 -0700
+
+    Don't clear buffer pre-context if no new context is being provided
+
+    Patch from Jonathan Kew.
+
+    Part of fixing:
+
+    Mozilla Bug 801410 - avoid inserting dotted-circle for run-initial
+    Unicode combining characters in "simple" scripts such as Latin
+
+    https://bugzilla.mozilla.org/show_bug.cgi?id=801410
+
+ src/hb-buffer.cc | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 0bc7a38463bfb37f12efeb1b8cb2024cf4a347bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 22:02:45 2012 -0700
+
+    [OT] Fix ReverseChainingSubst
+
+    We should make it clear that we don't want output buffer in this case,
+    otherwise buffer->backtrack_len() would be wrong.
+
+ src/hb-buffer-private.hh       |  1 +
+ src/hb-buffer.cc               | 13 +++++++++++++
+ src/hb-ot-layout-gsub-table.hh |  1 +
+ 3 files changed, 15 insertions(+)
+
+commit 2616689d159024d2b1cb1e68f9936b2129bf9be6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 21:51:56 2012 -0700
+
+    More tracing fixups
+
+ src/hb-ot-layout-gsubgpos-private.hh | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit 937f8d3871863b8b1ed1d8900cf41999d92ba30f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 21:49:33 2012 -0700
+
+    [Arabic] Enable dlig and mset for Arabic
+
+    That's what the spec says, and what Uniscribe does.
+
+ src/hb-ot-shape-complex-arabic.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 911ed096980630fd4a37bf2024036daae13a6056
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 19:42:19 2012 -0700
+
+    Ignore gid0 in test results
+
+ test/shaping/hb_test_tools.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit bc513add7999baf32f126ceebbd318105ee66985
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 19:03:55 2012 -0700
+
+    Add missing TRACE_RETURN
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 10b88d89ef1efcfddbbfabd3669399b472c8a900
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 18:18:24 2012 -0700
+
+    Add Ethiopic test case
+
+    This sequence: U+120B,U+135F,U+120B with the Nyala font from Win7
+    exposes a GPOS bug in Uniscribe, in that the positioned mark is
+    wrongly
+    moved as a result a following kern.
+
+    This is the one "failure" in the Ethiopic test suite :-).
+
+    ETHIOPIC: 118900 out of 118901 tests passed. 1 failed (0.000841036%)
+
+ test/shaping/texts/in-tree/shaper-default/script-ethiopic/MANIFEST      |
+ 1 +
+ test/shaping/texts/in-tree/shaper-default/script-ethiopic/misc/MANIFEST |
+ 1 +
+ test/shaping/texts/in-tree/shaper-default/script-ethiopic/misc/misc.txt |
+ 1 +
+ 3 files changed, 3 insertions(+)
+
+commit 88d3c98e309e14c3115825d1d8d40d0b3eec2d97
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 16:27:02 2012 -0700
+
+    [Indic] Position pre-base reordering Ra after Chillus in Malayalam
+
+    The logic for pre-base reordering follows the left matra logic.
+    We had an exception for Malayalam/Tamil in the left matra
+    repositioning
+    which was not reflected in pre-base reordering.
+
+    Malayalam failures down from 337 to 323.
+
+    BENGALI: 353996 out of 354285 tests passed. 289 failed (0.0815727%)
+    DEVANAGARI: 707339 out of 707394 tests passed. 55 failed (0.00777502%)
+    GUJARATI: 366489 out of 366506 tests passed. 17 failed (0.0046384%)
+    GURMUKHI: 60769 out of 60809 tests passed. 40 failed (0.0657797%)
+    KANNADA: 951086 out of 951913 tests passed. 827 failed (0.0868777%)
+    KHMER: 299106 out of 299124 tests passed. 18 failed (0.00601757%)
+    LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
+    MALAYALAM: 1048011 out of 1048334 tests passed. 323 failed
+    (0.0308108%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271726 out of 271847 tests passed. 121 failed (0.0445103%)
+    TAMIL: 1091837 out of 1091837 tests passed. 0 failed (0%)
+    TELUGU: 970558 out of 970573 tests passed. 15 failed (0.00154548%)
+    TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)
+
+ src/hb-ot-shape-complex-indic.cc | 35 +++++++++++++++++++++--------------
+ 1 file changed, 21 insertions(+), 14 deletions(-)
+
+commit 21bf796954678d02f136709cade43adef6f8f42b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 14:21:09 2012 -0700
+
+    Add missed file
+
+ src/hb-ucdn/COPYING | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit 01013a0f5c58d5d54a37e5b4d6692e0bbd4baf80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 29 10:56:04 2012 -0700
+
+    Include config.h.in in tree
+
+    I typically don't like including generating files in tree.
+    But like to
+    make an exception for this, since this forms the canonical list of
+    options one would need to go through when building with alternative
+    build systems.
+
+ Makefile.am |   1 -
+ config.h.in | 160
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 160 insertions(+), 1 deletion(-)
+
+commit 02ed52169ad3bb48f4989f721b0c6572e064a712
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 21:26:19 2012 -0700
+
+    Improve license information
+
+ COPYING                   | 2 ++
+ src/hb-icu-le/COPYING     | 2 ++
+ src/hb-icu-le/Makefile.am | 2 +-
+ src/hb-ucdn/Makefile.am   | 2 +-
+ src/hb-ucdn/README        | 7 +++++++
+ 5 files changed, 13 insertions(+), 2 deletions(-)
+
+commit 4c1d9244617e472464722e64d2cdbc1f9e8827f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 20:27:25 2012 -0700
+
+    Minor
+
+ src/hb-icu-le.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 38b015e57ffa75d3b078a368c23685beb7c3f946
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 20:11:47 2012 -0700
+
+    Fix hb_buffer_set_length(buffer, 0)
+
+    Was causing invalid realloc()s.
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b7115b63be72e109b51f538ba581aed1017b2d55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 20:11:42 2012 -0700
+
+    Add XXX
+
+ src/hb-icu-le.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 71ee1f24503cd066ffc1a36cc5dd9a3c1d1a6dfd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 28 19:18:11 2012 -0700
+
+    Port to ICU LayoutEngine C API
+
+    Incidentally, this makes it not crash with icu-le-hb anymore...
+    I'm not smart / stupid enough to spend two more days debugging C++
+    linking issues, and this is ABI-stable at least.
+
+ src/hb-icu-le.cc | 31 ++++++++++++++++---------------
+ 1 file changed, 16 insertions(+), 15 deletions(-)
+
+commit 0144f05e57088b30ac894cdae8b04b265d4dfbe7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 26 13:48:06 2012 -0700
+
+    Remove unused members
+
+ src/hb-icu-le/PortableFontInstance.h | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit cf3afd8979b1db76d437f428cbd51cb363e0d18e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 25 16:32:54 2012 -0700
+
+    Rename and revamp is_zero_width() to be is_default_ignorable()
+
+    That's really the logic desired.  Except that MONGOLIAN VOWEL
+    SEPARATOR
+    is not default_ignorable but it really should be.  Reported to
+    Unicode.
+
+    Based on suggestion from Konstantin Ritt.
+
+ src/hb-fallback-shape.cc   |  2 +-
+ src/hb-ot-shape-private.hh |  4 +--
+ src/hb-ot-shape.cc         |  2 +-
+ src/hb-unicode-private.hh  | 90
+ +++++++++++++++++++++++++++++-----------------
+ 4 files changed, 62 insertions(+), 36 deletions(-)
+
+commit a724139e641bf1592b1ff786a75a9de2ea8163cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 24 14:02:15 2012 -0700
+
+    Update TODO
+
+ TODO | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+commit 13c058472913b7b6d689f9022226079da65420b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 14 18:37:09 2012 -0500
+
+    0.9.5
+
+ NEWS         | 23 +++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 24 insertions(+), 1 deletion(-)
+
+commit fecdfa95daf4916695f23e7dab89ab363be11b89
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 17:19:58 2012 -0400
+
+    Fixup hb_ot_shape_closure()
+
+    Broke it when merged cmap mapping and normalizer.  Ouch!
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2d1dcb3ce3354c2d5e2b4d1d291beb8d23cdea22
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 7 17:13:46 2012 -0400
+
+    Mark debug message functions static
+
+ src/hb-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 9947bd6daffb5ec76b67536575e7617ba4f10b1e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 20:44:43 2012 -0400
+
+    Update UCDN to upstream commit
+    3f159c87824230b59af56e40e2db32caf6afa51a
+
+    - Unicode 6.2.0 goodness,
+    - Unassigned codepoints now have correct properties.  Passes test
+    suite.
+
+ src/hb-ucdn/unicodedata_db.h | 1966
+ ++++++++++++++++++++++--------------------
+ 1 file changed, 1036 insertions(+), 930 deletions(-)
+
+commit 32dbfcf763d1ae497d3c95de986a83441331678f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 17:42:13 2012 -0400
+
+    Fix visibility of UCDN symbols
+
+ src/hb-ucdn.cc     |  2 --
+ src/hb-ucdn/ucdn.h | 19 +++++++++++++++++++
+ 2 files changed, 19 insertions(+), 2 deletions(-)
+
+commit 3f33f0d1f2603f22e86adffe3c3836136ba5e5fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 16:03:18 2012 -0400
+
+    Import UCDN into source tree
+
+    https://github.com/grigorig/ucdn
+
+ configure.ac                 |   11 +-
+ src/Makefile.am              |    7 +
+ src/hb-ucdn.cc               |  207 ++
+ src/hb-ucdn/Makefile.am      |   18 +
+ src/hb-ucdn/README           |   33 +
+ src/hb-ucdn/ucdn.c           |  282 +++
+ src/hb-ucdn/ucdn.h           |  290 +++
+ src/hb-ucdn/unicodedata_db.h | 4648
+ ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-unicode.cc            |    3 +
+ 9 files changed, 5498 insertions(+), 1 deletion(-)
+
+commit 0e292eb2a2abbac152eeea2060e58b7a66449745
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 14:59:00 2012 -0400
+
+    Remove Glib thread-safety support
+
+    Now that we have pthread detection in configure, we don't need Glib
+    anymore.  Glib will only be a Unicode data provider.
+
+ configure.ac             |  8 ++++----
+ src/hb-atomic-private.hh | 13 -------------
+ src/hb-mutex-private.hh  | 20 --------------------
+ 3 files changed, 4 insertions(+), 37 deletions(-)
+
+commit 66efe896483c58f3ef9bd218c02bb7ea604f68ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 14:55:32 2012 -0400
+
+    Check for pthreads
+
+ configure.ac    | 7 +++++++
+ src/Makefile.am | 5 +++++
+ 2 files changed, 12 insertions(+)
+
+commit 10a8162dddb8b39ae130fe5bb7d1819471fa7e06
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 14:46:34 2012 -0400
+
+    Add ax_pthread.m4
+
+ m4/ax_pthread.m4 | 309
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 309 insertions(+)
+
+commit 8ac34bc6ff1d0646503a45659b1846d8cf9c0603
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 14:46:04 2012 -0400
+
+    Add pkg.m4 to git repo
+
+ m4/pkg.m4 | 157
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 157 insertions(+)
+
+commit c7afac0aa6e51e6a49ebf13f72537398698c9e49
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 2 14:44:47 2012 -0400
+
+    Add AC_CONFIG_MACRODIR
+
+ Makefile.am  | 2 ++
+ configure.ac | 2 ++
+ 2 files changed, 4 insertions(+)
+
+commit f2eb3fa9dca8d21fae20c9b9dddad3245df74a05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 25 21:35:35 2012 -0400
+
+    [OT] Only insert dottedcircle if at the beginning of paragraph
+
+    If the first char in the run is a combining mark, but there is text
+    before the run, don't insert dottedcircle.
+
+    Part of addressing:
+    https://bugzilla.redhat.com/show_bug.cgi?id=858736
+
+ src/hb-ot-shape.cc | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit bdc2fc8294da7f374701aafe9f5a82d60633946f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 25 21:32:35 2012 -0400
+
+    [Arabic] Respect Arabic joining from neighboring context
+
+    Now we respect Arabic joining across runs.
+
+ src/hb-ot-shape-complex-arabic.cc | 31 +++++++++++++++++++++++++++++--
+ 1 file changed, 29 insertions(+), 2 deletions(-)
+
+commit 05207a79e0ae1769c5feaebe3fd99bdf9cfcf834
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 25 17:44:53 2012 -0400
+
+    [buffer] Save pre/post textual context
+
+    To be used for a variety of purposes.  We save up to five characters
+    in each direction.  No public API changes, everything is taken care
+    of already.  All clients need to do is to call hb_buffer_add_utf* with
+    the full text + segment info (or at least some context) instead of
+    just passing in the segment.
+
+    Various operations (hb_buffer_reset, hb_buffer_set_length,
+    hb_buffer_add*) automatically reset the relevant contexts.
+
+ src/hb-buffer-private.hh | 13 ++++++++++++-
+ src/hb-buffer.cc         | 44
+ ++++++++++++++++++++++++++++++++++++++++----
+ src/hb-buffer.h          |  2 +-
+ 3 files changed, 53 insertions(+), 6 deletions(-)
+
+commit 89ac39dbbe028e6379f64392f2e590e3f1fdd847
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 25 13:59:24 2012 -0400
+
+    Add hb_utf_prev()
+
+ src/hb-utf-private.hh | 71
+ +++++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 69 insertions(+), 2 deletions(-)
+
+commit 70ea4ac6887c7057113d714a98e55738b6196562
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 25 12:30:16 2012 -0400
+
+    Slightly optimize UTF-8 parsing
+
+ src/hb-utf-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4445e5e2ecc257a5d0fa2f2715bb7181a47346da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 25 12:26:12 2012 -0400
+
+    [buffer] Cleanup / optimize UTF-16 parsing a bit
+
+ src/hb-utf-private.hh | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit 1f66c3c1a0eb869c0d85a015235313177e0cec62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 25 11:42:16 2012 -0400
+
+    Add hb_utf_strlen()
+
+    Speeds up UTF-8 parsing by calling strlen().
+
+ src/hb-buffer.cc      | 13 ++-----------
+ src/hb-utf-private.hh | 22 ++++++++++++++++++++++
+ 2 files changed, 24 insertions(+), 11 deletions(-)
+
+commit 7f19ae7b9f806a2e35206b2ad41651c5f80b2537
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 25 11:22:28 2012 -0400
+
+    [buffer] Templatize UTF handling
+
+    Also move UTF routines into a separate file, to be reused from shapers
+    that need it.
+
+ src/Makefile.am       |   1 +
+ src/hb-buffer.cc      | 157
+ +++++++++++++-------------------------------------
+ src/hb-utf-private.hh | 113 ++++++++++++++++++++++++++++++++++++
+ 3 files changed, 155 insertions(+), 116 deletions(-)
+
+commit 0e0a4da9b7677a09e00d27313236e1f333864dd6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 25 11:09:04 2012 -0400
+
+    [buffer] Towards template'izing different UTF adders
+
+ src/hb-buffer.cc | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit 7d37280600c157f3c4eae8746e99511702a58e8f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 25 11:04:41 2012 -0400
+
+    Minor
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 54d5da4ee9d902ff36473cec558137eef8f23825
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 25 10:50:41 2012 -0400
+
+    Remove unused indic.cc
+
+ src/Makefile.am |  6 +-----
+ src/indic.cc    | 51 ---------------------------------------------------
+ 2 files changed, 1 insertion(+), 56 deletions(-)
+
+commit fab7a71f110ed646745d54b23284537c50058c21
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 21:51:13 2012 -0400
+
+    [Indic] Import ragel-generated Indic machine in git
+
+    I don't expect ragel to be creating too much noise in its generated
+    output, and including this in-tree helps users right now.  We can
+    revisit this later if it proved to be too much trouble.
+
+ autogen.sh                               |    6 -
+ src/Makefile.am                          |    1 -
+ src/hb-ot-shape-complex-indic-machine.hh | 1314
+ ++++++++++++++++++++++++++++++
+ 3 files changed, 1314 insertions(+), 7 deletions(-)
+
+commit 20a840c7cd08069720050782b4533cde505df09a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 24 20:23:00 2012 -0400
+
+    Use a C++ linker on Windows
+
+    On Windows we don't care whether or not we link to libstdc++.
+    Seems to fix build with mingw32 on msys, as reported by Werner.
+
+ src/Makefile.am | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit eb7669a38072b66eef3bd905a93c4815bef3f0e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 18 19:42:06 2012 -0400
+
+    Better autofoo
+
+ src/Makefile.am | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit d00f7d83750258eff915a3826700c4819e63e481
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 17 20:59:09 2012 -0400
+
+    Fix dependencies
+
+ src/Makefile.am | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 811eefe225d20b20f1de20c6e62a0ebd6d89102a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 10 09:56:27 2012 -0400
+
+    Return NULL, not false
+
+    Oh well...
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 166b5cf7ec2d37fb54a909c437ccdec1edaf37aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 7 14:55:07 2012 -0400
+
+    [Indic] Find syllables before any features are applied
+
+    With FreeSerif, it seems that the 'ccmp' feature does ligature
+    substituttions.  That was then causing syllable match failures.
+    We now
+    find syllables before any features have been applied.
+
+    Test sequence: U+0D9A,U+0DCA,U+200D,U+0DBB,U+0DCF
+
+ src/hb-ot-shape-complex-indic-machine.rl           |  4 +-
+ src/hb-ot-shape-complex-indic.cc                   | 56
+ +++++++++++++++-------
+ .../indic/script-sinhala/misc/misc.txt             |  1 +
+ 3 files changed, 43 insertions(+), 18 deletions(-)
+
+commit 96fdc04e5c6daafce3d45e7508418e4db94df44c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 6 22:26:16 2012 -0400
+
+    Add hb_buffer_[sg]et_content_type
+
+    And hb_buffer_content_type_t and enum values.
+
+ TODO                     |  1 +
+ src/hb-buffer-private.hh |  2 ++
+ src/hb-buffer.cc         | 34 ++++++++++++++++++++++++++++++++++
+ src/hb-buffer.h          | 14 ++++++++++++++
+ src/hb-shape.cc          |  5 +++++
+ 5 files changed, 56 insertions(+)
+
+commit e30ebd2794b37bd8ec716a258d5cb017fb1dfadc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 6 22:09:06 2012 -0400
+
+    Add hb_feature_to/from_string()
+
+ TODO             |   4 +-
+ src/hb-common.cc |   9 +++
+ src/hb-common.h  |   6 +-
+ src/hb-shape.cc  | 168
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-shape.h   |  13 +++++
+ util/options.cc  | 132 ++-----------------------------------------
+ 6 files changed, 201 insertions(+), 131 deletions(-)
+
+commit f67917161bbe317a33d6407fbc62ebffcafe7154
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 6 17:22:31 2012 -0400
+
+    [OT] Do per-ligature-component fallback mark positioning
+
+    With this in place, you can remove GDEF/GSUB/GPOS tables from Arabic
+    fonts and still get per-component marks positioned on
+    oh-yeah-fallback-formed LAM-ALEF ligatures with marks in between
+    the LAM
+    and ALEF.
+
+    Now *that*'s pretty cool, if a bit anachronistic...
+
+ src/hb-ot-shape-fallback.cc | 43
+ ++++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 36 insertions(+), 7 deletions(-)
+
+commit 525c6855783a018d52867b9ece2ee90868ff1f91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 6 16:02:07 2012 -0400
+
+    [OT] Make fallback mark positioning more robust
+
+    ...with clusters spanning multiple base characters.
+
+ src/hb-ot-shape-fallback.cc | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 5d502443f5a07cbd0aa860dd71a0fa4ea8b6ff9f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 6 15:29:29 2012 -0400
+
+    [old] Clear offset array
+
+ src/hb-old.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 9433c218b4853442dd9ad53d0588a837a33dbf1e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 6 14:27:15 2012 -0400
+
+    [OT] Simplify fallback positioning condition
+
+ src/hb-ot-shape-fallback.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 028a1706f898bfcee0d14acfba47ebe1de09f0c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 6 14:25:48 2012 -0400
+
+    Refactor common macro
+
+ src/hb-ot-shape-fallback.cc  | 5 +----
+ src/hb-ot-shape-normalize.cc | 5 +----
+ src/hb-ot-shape.cc           | 5 +----
+ src/hb-unicode-private.hh    | 9 +++++++++
+ 4 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 07cfbe21b511056d5c3c75cbfe84e4e982c3e8fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 6 01:16:39 2012 -0400
+
+    [OT] Streamline Arabic fallback shaping table
+
+ src/gen-arabic-table.py                    |   6 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh |   2 +-
+ src/hb-ot-shape-complex-arabic-table.hh    | 266
+ ++++++++++++++---------------
+ 3 files changed, 137 insertions(+), 137 deletions(-)
+
+commit 82f6b6f388b801a1483854cb56a2cadbb94e0f2b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 6 01:12:50 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-arabic-fallback.hh | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit fabd3113a98c5f4114f48920fa7ea38bd65a8d32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 5 22:19:28 2012 -0400
+
+    [OT] Port Arabic fallback shaping to synthetic GSUB
+
+    All of init/medi/fina/isol and rlig implemented.
+
+    Let there be dragons... ⻯
+
+ src/Makefile.am                            |   1 +
+ src/hb-open-type-private.hh                |  69 +++++---
+ src/hb-ot-layout-common-private.hh         |   9 +-
+ src/hb-ot-layout-gsub-table.hh             |  11 +-
+ src/hb-ot-map-private.hh                   |   6 +
+ src/hb-ot-map.cc                           |   1 +
+ src/hb-ot-shape-complex-arabic-fallback.hh | 252
+ +++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-arabic.cc          | 158 ++++++------------
+ src/hb-ot-shape.cc                         |   7 +-
+ src/hb-private.hh                          |  11 +-
+ 10 files changed, 369 insertions(+), 156 deletions(-)
+
+commit f0b8ed1b6dd9f1d2b9084c101a6fc5dee0cc22a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 5 17:32:57 2012 -0400
+
+    [Indic] Allow "H,ZWJ,M"
+
+    Uniscribe accepts a Halant,ZWJ before matras.  Allow that.
+
+    BENGALI down from 295 to 291
+    DEVANAGARI down from 69 to 57
+    GUJARATI down from 19 to 17
+    KANNADA down from 871 to 867
+    MALAYALAM down from 340 to 337
+    TELUGU down from 20 to 16
+
+    Currently at:
+
+    BENGALI: 353897 out of 354188 tests passed. 291 failed (0.0821598%)
+    DEVANAGARI: 707337 out of 707394 tests passed. 57 failed (0.00805774%)
+    GUJARATI: 366440 out of 366457 tests passed. 17 failed (0.00463902%)
+    GURMUKHI: 60704 out of 60747 tests passed. 43 failed (0.0707854%)
+    KANNADA: 951046 out of 951913 tests passed. 867 failed (0.0910798%)
+    KHMER: 299077 out of 299124 tests passed. 47 failed (0.0157125%)
+    LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
+    MALAYALAM: 1047997 out of 1048334 tests passed. 337 failed
+    (0.0321462%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271666 out of 271847 tests passed. 181 failed (0.0665816%)
+    TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
+    TELUGU: 970557 out of 970573 tests passed. 16 failed (0.00164851%)
+    TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)
+
+ src/hb-ot-shape-complex-indic-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4ed717ef61813fa16cf74f2874848e9feb81568f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 5 17:21:17 2012 -0400
+
+    [Indic] Relax grammar
+
+    Now that we insert dotted-circle, tests break more easily when
+    our indic
+    machine breaks.
+
+    In particular, a few Devanagari tests were having sequences like
+    "C,H,ZWJ,N", and because of the ZWJ the Nukta does NOT get reordered
+    to
+    before the Halant as the grammar used to expect...  Fixup.
+
+    Another case is as simple as "C,ZWJ,SM".
+
+    Fixes 10 out of 79 failures:
+
+    DEVANAGARI: 707325 out of 707394 tests passed. 69 failed (0.00975411%)
+
+ src/hb-ot-shape-complex-indic-machine.rl | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit aa7141efe49991a1160489106984e95163fe2ab8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 5 15:54:21 2012 -0400
+
+    [Indic] Fix Khmer syllable-final coeng-consonant
+
+    Brings down Khmer failures from 162 to 47.
+
+    KHMER: 299077 out of 299124 tests passed. 47 failed (0.0157125%)
+
+    Also rebaselined some of the test files that had only-inherited lines.
+    Removing those, the stats are:
+
+    BENGALI: 353893 out of 354188 tests passed. 295 failed (0.0832891%)
+    DEVANAGARI: 707315 out of 707394 tests passed. 79 failed (0.0111678%)
+    GUJARATI: 366438 out of 366457 tests passed. 19 failed (0.00518478%)
+    GURMUKHI: 60704 out of 60747 tests passed. 43 failed (0.0707854%)
+    KANNADA: 951042 out of 951913 tests passed. 871 failed (0.0915%)
+    KHMER: 299077 out of 299124 tests passed. 47 failed (0.0157125%)
+    LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
+    MALAYALAM: 1047994 out of 1048334 tests passed. 340 failed
+    (0.0324324%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271666 out of 271847 tests passed. 181 failed (0.0665816%)
+    TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
+    TELUGU: 970553 out of 970573 tests passed. 20 failed (0.00206064%)
+    TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)
+
+    Still some regressions, but some of the more egregious cases are
+    addressed.
+
+ src/hb-ot-shape-complex-indic-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit efb8d3eb713bca7cbfca41380a012bdb4d380e5c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 5 15:50:47 2012 -0400
+
+    Fixup test failure reporting
+
+    After we implemented dotted-circle, we were still ignoring any tests
+    that had dottedcircle in it for any of the shapers.  That meant
+    that if
+    we wrongly outputted dottedcircle, the test was being ignored.  Ouch!
+
+    Fixing that shows regressions across the board.  Most are Uniscribe
+    bugs: NOT inserting dotted-circle when it should.  Some are arou
+    machine bugs.  This is in fact a nice way to catch Indic-machine
+    deficiencies and when I fix the regressions, our clusters should be
+    much closer to Uniscribe.  For now, we regressed from:
+
+    BENGALI: 353997 out of 354285 tests passed. 288 failed (0.0812905%)
+    DEVANAGARI: 707339 out of 707394 tests passed. 55 failed (0.00777502%)
+    GUJARATI: 366489 out of 366506 tests passed. 17 failed (0.0046384%)
+    GURMUKHI: 60769 out of 60809 tests passed. 40 failed (0.0657797%)
+    KANNADA: 951086 out of 951913 tests passed. 827 failed (0.0868777%)
+    KHMER: 299106 out of 299124 tests passed. 18 failed (0.00601757%)
+    LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
+    MALAYALAM: 1048104 out of 1048416 tests passed. 312 failed
+    (0.0297592%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271747 out of 271847 tests passed. 100 failed (0.0367854%)
+    TAMIL: 1091837 out of 1091837 tests passed. 0 failed (0%)
+    TELUGU: 970558 out of 970573 tests passed. 15 failed (0.00154548%)
+    TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)
+
+    To:
+
+    BENGALI: 353990 out of 354285 tests passed. 295 failed (0.0832663%)
+    DEVANAGARI: 707315 out of 707394 tests passed. 79 failed (0.0111678%)
+    GUJARATI: 366447 out of 366506 tests passed. 59 failed (0.016098%)
+    GURMUKHI: 60707 out of 60809 tests passed. 102 failed (0.167738%)
+    KANNADA: 951042 out of 951913 tests passed. 871 failed (0.0915%)
+    KHMER: 298962 out of 299124 tests passed. 162 failed (0.0541581%)
+    LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
+    MALAYALAM: 1048074 out of 1048416 tests passed. 342 failed
+    (0.0326206%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271666 out of 271847 tests passed. 181 failed (0.0665816%)
+    TAMIL: 1091835 out of 1091837 tests passed. 2 failed (0.000183178%)
+    TELUGU: 970553 out of 970573 tests passed. 20 failed (0.00206064%)
+    TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)
+
+    Investigating.
+
+ test/shaping/hb_test_tools.py | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 27bd55bd2ca599d501f10c2fae81861137517e46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 5 15:11:14 2012 -0400
+
+    [Indic] Tamil does not have half-forms either
+
+    The Win7 Tamil font does not realy on this behavior, but the WinXP
+    version does.  Handle Tamil like Malayalam: Matras always move to
+    before base.
+
+    WinXP Tamil failures went down from 168964 (15.4752%) to 167
+    (0.0152953%) (two orders of magnitude reduction!).
+
+    Included in this is a minor fixup that actually fixed a few tests
+    with non-Tamil too.  Numbers at:
+
+    BENGALI: 353997 out of 354285 tests passed. 288 failed (0.0812905%)
+    DEVANAGARI: 707339 out of 707394 tests passed. 55 failed (0.00777502%)
+    GUJARATI: 366489 out of 366506 tests passed. 17 failed (0.0046384%)
+    GURMUKHI: 60769 out of 60809 tests passed. 40 failed (0.0657797%)
+    KANNADA: 951086 out of 951913 tests passed. 827 failed (0.0868777%)
+    KHMER: 299106 out of 299124 tests passed. 18 failed (0.00601757%)
+    LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
+    MALAYALAM: 1048104 out of 1048416 tests passed. 312 failed
+    (0.0297592%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271747 out of 271847 tests passed. 100 failed (0.0367854%)
+    TAMIL: 1091837 out of 1091837 tests passed. 0 failed (0%)
+    TELUGU: 970558 out of 970573 tests passed. 15 failed (0.00154548%)
+    TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)
+
+ src/hb-ot-shape-complex-indic.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 87b75d0a4aa03fe7a03e3bf7baf8ece131aec1bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 4 23:06:38 2012 -0400
+
+    [OT] Allow adding features with fallback implementation
+
+ src/hb-ot-map-private.hh | 7 ++++---
+ src/hb-ot-map.cc         | 6 ++++--
+ 2 files changed, 8 insertions(+), 5 deletions(-)
+
+commit 1d3947a6bda6986c9c7d993589053051c119cc81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 4 22:42:17 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-ot-layout-gsub-table.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit b3b89b66586897a69b410ef02e7434691de84ae6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 4 21:13:17 2012 -0400
+
+    [OT] Add SubstLookup serialize API
+
+ src/hb-ot-layout-common-private.hh |  2 +-
+ src/hb-ot-layout-gsub-table.hh     | 65
+ +++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 65 insertions(+), 2 deletions(-)
+
+commit 715e03bc21d6adaa8e1f647235843839dc47dad1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 4 20:10:17 2012 -0400
+
+    Minor
+
+ src/hb-open-type-private.hh | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+commit 652d1e0d64e47313ead2fc8318d1236f0e0d80ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 4 20:00:44 2012 -0400
+
+    [OT] Start adding Lookup-level serialize API
+
+ src/hb-ot-layout-common-private.hh | 20 +++++++++++++++++++-
+ 1 file changed, 19 insertions(+), 1 deletion(-)
+
+commit a930c68e9c50aade78c1eb0eef075c9c117e4ef6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 4 18:17:57 2012 -0400
+
+    [OT] More serialize.  Implements all basic GSUB subtables
+
+ src/hb-open-type-private.hh        |  53 +++++++++++++++-
+ src/hb-ot-layout-common-private.hh |   8 ++-
+ src/hb-ot-layout-gsub-table.hh     | 125
+ +++++++++++++++++++++++++++++--------
+ 3 files changed, 156 insertions(+), 30 deletions(-)
+
+commit 1b38b4e817d871b9549be65af6030bd0eea7f775
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 4 18:17:21 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-gsub-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f7e81ce0b882aa942ae33c787e741c5e8e5a0173
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 4 15:32:37 2012 -0400
+
+    0.9.4
+
+ NEWS         | 18 ++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 19 insertions(+), 1 deletion(-)
+
+commit 2bd9fe359839a653f7caae534bf768af1735f155
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 4 15:15:19 2012 -0400
+
+    Refactor
+
+ src/hb-ot-layout-gpos-table.hh       |  7 ++-----
+ src/hb-ot-layout-gsub-table.hh       | 16 +++++-----------
+ src/hb-ot-layout-gsubgpos-private.hh | 13 +++----------
+ src/hb-ot-layout.cc                  | 23 +++++++++++++++++------
+ src/hb-ot-shape-complex-arabic.cc    |  4 +---
+ 5 files changed, 28 insertions(+), 35 deletions(-)
+
+commit a5ddd9e31cd7906c4b559aa5b2fafdae4b9c8935
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 4 14:55:00 2012 -0400
+
+    [OT] Really fix possible NULL dereference this time
+
+ src/hb-ot-layout-gsubgpos-private.hh | 8 ++++----
+ src/hb-ot-layout.cc                  | 6 +++---
+ src/hb-ot-shape-complex-arabic.cc    | 4 +++-
+ 3 files changed, 10 insertions(+), 8 deletions(-)
+
+commit 29416833584d7831ece84aaeada6f5ebba7828c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 3 23:31:14 2012 -0400
+
+    [OT] Implement serialize() for AlternateSubst
+
+ src/hb-ot-layout-gsub-table.hh | 33 +++++++++++++++++++++++++++++++++
+ 1 file changed, 33 insertions(+)
+
+commit 1f07e3382a1608b054cbf88b89fef74f6c485434
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 3 23:28:34 2012 -0400
+
+    [OT] Implement serialize() for MultiSubst
+
+ src/hb-open-type-private.hh    | 10 ++++++++++
+ src/hb-ot-layout-gsub-table.hh | 43
+ ++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 53 insertions(+)
+
+commit 4912030dfba740c822e200d33cbb5c6dbbeaf79e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 3 20:58:03 2012 -0400
+
+    Minor
+
+ src/hb-open-type-private.hh    | 4 ++--
+ src/hb-ot-layout-gsub-table.hh | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit f8fa2b5cf67b02d74514dec7885d03de73ec7349
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 3 20:19:46 2012 -0400
+
+    Fix possible NULL dereference
+
+    As reported by Kenichi Ishibashi.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4b312fb288faa383a2c5bd3be0428f0e58e02699
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 1 21:56:06 2012 -0400
+
+    [OT] Remove serialize alignment
+
+    Will reintroduce in a different way when we actually need it.
+
+ src/hb-open-type-private.hh | 24 +++++++++++-------------
+ 1 file changed, 11 insertions(+), 13 deletions(-)
+
+commit c61be03d6df122f18eebda3b29e42c9e768d45b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 1 21:43:38 2012 -0400
+
+    [OT] A bit more serialize
+
+ src/hb-open-type-private.hh        | 14 +++++++++++++
+ src/hb-ot-layout-common-private.hh |  2 +-
+ src/hb-ot-layout-gsub-table.hh     | 43
+ ++++++++++++++++++++++++++++++++++++--
+ 3 files changed, 56 insertions(+), 3 deletions(-)
+
+commit abcc5ac1fde1c493e4055dd2f27b8aade7713156
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 1 21:30:17 2012 -0400
+
+    [OT] Improve serialize syntax
+
+    For some definition of improvement...
+
+ src/hb-open-type-private.hh    | 6 ++++--
+ src/hb-ot-layout-gsub-table.hh | 3 +--
+ 2 files changed, 5 insertions(+), 4 deletions(-)
+
+commit bc5be24014371ceb811b9ffd37062ede63d87bb1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 1 20:48:22 2012 -0400
+
+    [OT] Restart work on serialize()
+
+ src/hb-open-type-private.hh        | 39 ++++++++++++++++++------
+ src/hb-ot-layout-common-private.hh | 61
+ +++++++++++++++++++-------------------
+ src/hb-ot-layout-gsub-table.hh     | 13 ++++++++
+ 3 files changed, 73 insertions(+), 40 deletions(-)
+
+commit 6912e476dd92639c3ddf07ca51c8d4a262c8b3a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 1 20:38:45 2012 -0400
+
+    [OT] Insert dotted-circle for run-initial marks
+
+    Unfortunately if the font has GPOS and 'mark' feature does
+    not position mark on dotted-circle, our inserted dotted-circle
+    will not get the mark repositioned to itself.  Uniscribe cheats
+    here.
+
+    If there is no GPOS however, the fallback positioning kicks in
+    and sorts this out.
+
+    I'm not willing to address the first case.
+
+ src/hb-ot-shape.cc | 32 ++++++++++++++++++++++++++++++++
+ 1 file changed, 32 insertions(+)
+
+commit 1d581ec384bc1780995e32e1c44103af57596eda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 1 20:06:26 2012 -0400
+
+    [OT] Fallback-position ccc=0 Thai / Lao marks
+
+    Not perfect, but so is fallback positioning in 2012...
+
+ src/hb-ot-shape-fallback.cc | 56
+ +++++++++++++++++++++++++++++++++++++--------
+ 1 file changed, 46 insertions(+), 10 deletions(-)
+
+commit 3992b5ec4cb43d114d87ff7ee2b992bcf819c9cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 1 19:20:41 2012 -0400
+
+    Move code around
+
+ src/hb-ot-shape-fallback-private.hh |  5 ++++
+ src/hb-ot-shape-fallback.cc         | 46
+ +++++++++++++++++++++++++------------
+ src/hb-ot-shape-private.hh          |  6 +++++
+ src/hb-ot-shape.cc                  |  4 ++++
+ 4 files changed, 46 insertions(+), 15 deletions(-)
+
+commit b85800f9de8976a7418ef9df467d3080c6ab0199
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 31 18:12:01 2012 -0400
+
+    [Indic] Implement dotted-circle insertion for broken clusters
+
+    No panic, we reeally insert dotted circle when it's absolutely broken.
+
+    Fixes most of the dotted-circle cases against Uniscribe. (for
+    Devanagari
+    fixes 80% of them, for Khmer 70%; the rest look like Uniscribe being
+    really bogus...)
+
+    I had to make a decision.  Apparently Uniscribe adds one dotted circle
+    to each broken character.  I tried that, but that goes wrong
+    easily with
+    split matras.  So I made it add only one dotted circle to an entire
+    broken syllable tail.  As in: "if there was a dotted circle here, this
+    would have formed a correct cluster."  That works better for split
+    stuff, and I like it more.
+
+ src/hb-buffer-private.hh                 |  1 +
+ src/hb-buffer.cc                         | 10 +++++
+ src/hb-ot-shape-complex-indic-machine.rl |  4 +-
+ src/hb-ot-shape-complex-indic-private.hh |  2 +-
+ src/hb-ot-shape-complex-indic.cc         | 67
+ +++++++++++++++++++++++++++++---
+ src/hb-ot-shape-normalize-private.hh     |  1 +
+ src/hb-ot-shape-normalize.cc             | 11 +++---
+ 7 files changed, 83 insertions(+), 13 deletions(-)
+
+commit 327d14ef188396006d54af976506ab6f8bb2869a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 31 16:49:34 2012 -0400
+
+    [Indic] Start adding dotted-circle instrastructure
+
+ src/hb-ot-shape-complex-indic-machine.rl | 19 +++++++------
+ src/hb-ot-shape-complex-indic.cc         | 46
+ +++++++++++++++++++++++++++++---
+ 2 files changed, 51 insertions(+), 14 deletions(-)
+
+commit 1be368e96fb7de8c77bf992874e0d5bd6b272ebe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 31 16:29:17 2012 -0400
+
+    Minor
+
+ src/hb-buffer-private.hh | 16 +++++++++++++++-
+ src/hb-buffer.cc         | 15 ---------------
+ 2 files changed, 15 insertions(+), 16 deletions(-)
+
+commit 784f29d061a2939562eca0c4943feb01174aee00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 31 14:06:26 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape.cc | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 5a7f18767a87a3f07269d0814f984a98f86ab852
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 30 22:53:29 2012 -0400
+
+    [OT] Better fallback-position Thai / Lao ccc!=0 marks
+
+ src/hb-ot-shape-fallback.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 9f2348de58f0f85593027378169bc03c4dd64e59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 29 21:08:59 2012 -0400
+
+    [OT] Add serialize() for Coverage
+
+ src/hb-open-type-private.hh        | 34 +++++++++++++++++----
+ src/hb-ot-layout-common-private.hh | 62
+ ++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 90 insertions(+), 6 deletions(-)
+
+commit e901b954c6ec44ac3ae7fb3c326e6e7a40718e4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 29 20:26:08 2012 -0400
+
+    [OT] Start adding serialize() API
+
+ src/hb-open-type-private.hh | 77
+ +++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 77 insertions(+)
+
+commit 965c280de09b49d711cb78d629da321c802084de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 29 13:59:16 2012 -0400
+
+    Add HB_BUFFER_ASSERT_VAR
+
+    To be used in places we access buffer vars...
+
+ src/hb-buffer-private.hh |  3 +++
+ src/hb-buffer.cc         | 16 ++++++++++++++++
+ 2 files changed, 19 insertions(+)
+
+commit 0ccf9b64736559a230425fd131c9eb8aa3048221
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 29 11:53:26 2012 -0400
+
+    Move code around
+
+ src/hb-ot-shape.cc | 21 ++++++++++-----------
+ 1 file changed, 10 insertions(+), 11 deletions(-)
+
+commit 2fcbbdb41a322f54b61d9ce983ab54434504c5ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 29 11:11:54 2012 -0400
+
+    Port Arabic fallback ligating to share code with GSUB
+
+    This will eventually allow us to skip marks, as well as (fallback)
+    attach marks to ligature components of fallback-shaped Arabic.
+    That would be pretty cool.  I kludged GDEF props in, so mark-skipping
+    works, but the produced ligature id/components will be cleared later
+    by substitute_start() et al.
+
+    Perhaps using a synthetic table for Arabic fallback shaping was
+    a better
+    idea.  The current approach has way too many layering violations...
+
+ src/hb-ot-layout-gsubgpos-private.hh |  4 ++
+ src/hb-ot-shape-complex-arabic.cc    | 72
+ ++++++++++++++++++++++++------------
+ src/hb-ot-shape.cc                   |  4 +-
+ 3 files changed, 56 insertions(+), 24 deletions(-)
+
+commit 5e399a8a45bddb49e06e2ca39df1ed04398c0aff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 29 10:40:49 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-gsub-table.hh       | 1 -
+ src/hb-ot-layout-gsubgpos-private.hh | 1 -
+ 2 files changed, 2 deletions(-)
+
+commit a177d027d1d0ad9539e30ed75d8652e0e8da20ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 28 23:18:22 2012 -0400
+
+    [GSUB] Move ligation logic over
+
+ src/hb-ot-layout-gsub-table.hh       | 78
+ ++++-------------------------------
+ src/hb-ot-layout-gsubgpos-private.hh | 80
+ ++++++++++++++++++++++++++++++++++++
+ 2 files changed, 89 insertions(+), 69 deletions(-)
+
+commit 191fa885d9e0a2dce92dd8727cddd18495e62409
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 28 22:58:55 2012 -0400
+
+    [GSUB] Merge Ligature and context input matching
+
+    Looks better now...
+
+ TODO                                 |  4 --
+ src/hb-ot-layout-gsub-table.hh       | 71
+ +++++++-----------------------------
+ src/hb-ot-layout-gsubgpos-private.hh | 29 ++++++++++++++-
+ 3 files changed, 40 insertions(+), 64 deletions(-)
+
+commit 93814ca7dc2a7251f861c1c47ba155ba6e6bdf19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 28 22:24:51 2012 -0400
+
+    Start converging Ligature and match_input
+
+ src/hb-ot-layout-gsub-table.hh       | 58
+ +++++++++++++++++----------------
+ src/hb-ot-layout-gsubgpos-private.hh | 62
+ ++++++++++++++++++++++++++++--------
+ 2 files changed, 78 insertions(+), 42 deletions(-)
+
+commit 2eef71737ea29ffadbb5a2be4a898b44f53f66ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 28 19:16:38 2012 -0400
+
+    [hb-icu-le] Add visbility
+
+ src/hb-icu-le/FontTableCache.h         |  6 +++++-
+ src/hb-icu-le/PortableFontInstance.cpp | 39
+ ----------------------------------
+ src/hb-icu-le/PortableFontInstance.h   |  7 ++++--
+ src/hb-icu-le/cmaps.cpp                |  2 +-
+ src/hb-icu-le/cmaps.h                  |  5 ++++-
+ src/hb-icu-le/letest.h                 | 14 ++++++++++++
+ src/hb-icu-le/sfnt.h                   |  6 +++++-
+ 7 files changed, 34 insertions(+), 45 deletions(-)
+
+commit d59e28e49204ed609d8a1bf3c0f21ab5fc178337
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 28 19:08:36 2012 -0400
+
+    Minor
+
+ src/Makefile.am           | 6 +++++-
+ src/check-libstdc++.sh    | 2 +-
+ src/check-static-inits.sh | 4 ++--
+ 3 files changed, 8 insertions(+), 4 deletions(-)
+
+commit af169d2813ff8075288cd4a7811f0715e4fea3da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 28 19:08:22 2012 -0400
+
+    Minor
+
+ src/hb-icu-le/PortableFontInstance.h | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 52ff2681d88886e2165ced397966ba29c2073583
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 28 18:03:35 2012 -0400
+
+    Use VisualStudio-style atomic intrinsics on mingw32
+
+ src/hb-atomic-private.hh | 25 ++++++++++++++++++-------
+ 1 file changed, 18 insertions(+), 7 deletions(-)
+
+commit 7c8e844d92aa604fc4b396343721ea90eb83adb8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 28 17:57:49 2012 -0400
+
+    Use namespace for OpenType tables
+
+    Avoids USHORT, SHORT, ULONG, LONG clashes with Windows API.
+
+ src/hb-font.cc                       | 12 ++---
+ src/hb-open-file-private.hh          |  4 ++
+ src/hb-open-type-private.hh          |  9 ++--
+ src/hb-ot-head-table.hh              |  4 ++
+ src/hb-ot-hhea-table.hh              |  5 ++
+ src/hb-ot-hmtx-table.hh              |  6 +++
+ src/hb-ot-layout-common-private.hh   |  5 ++
+ src/hb-ot-layout-gdef-table.hh       |  4 ++
+ src/hb-ot-layout-gpos-table.hh       |  4 ++
+ src/hb-ot-layout-gsub-table.hh       |  4 ++
+ src/hb-ot-layout-gsubgpos-private.hh |  4 ++
+ src/hb-ot-layout-private.hh          | 12 +++--
+ src/hb-ot-layout.cc                  | 91
+ ++++++++++++++++++------------------
+ src/hb-ot-maxp-table.hh              |  4 ++
+ src/hb-ot-name-table.hh              |  4 ++
+ src/hb-uniscribe.cc                  |  8 ++--
+ src/main.cc                          |  2 +
+ 17 files changed, 117 insertions(+), 65 deletions(-)
+
+commit dc5df5af6b349c3d9e4ab876864d9dec8096401f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 28 16:31:23 2012 -0400
+
+    Revert "Minor"
+
+    This reverts commit 3e0a03978b91994bb7fa7922593cbdfc50878dfc.
+
+    I know remember why that line is there :).
+
+ src/hb-ot-shape-complex-arabic.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3e0a03978b91994bb7fa7922593cbdfc50878dfc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 27 17:10:02 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-arabic.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 667218a5b134728863a318c73070f4e323590bbd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 27 17:00:44 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape-fallback.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 30dd62251fcd04c2cbaa9b979d47ddbf62c6d460
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 27 16:54:34 2012 -0400
+
+    Only fallback-position glyphs if we have the ccc
+
+    Previously, ccc=0 Thai / Lao marks were being
+    mispositioned.  Don't touch them.
+
+ src/hb-ot-shape-fallback.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e1ba62811a61afb046d349e578cd141363c7fb34
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 27 16:28:05 2012 -0400
+
+    Center unknown marks horizontally
+
+ src/hb-ot-shape-fallback.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit a4e75e4128751bb902117abc1a59dce4f2147672
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 27 15:54:15 2012 -0400
+
+    Minor
+
+ test/shaping/hb_test_tools.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 23b0e9d7dc801e11640979af3c2b00649a519bb1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 14:30:18 2012 -0400
+
+    [Indic] Fix switch
+
+    D'oh.  Was working by pure chance :)).
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ae4d4e1de6b4512576080e95896383887b30982f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 26 14:27:44 2012 -0400
+
+    Bug 53815 - CoreText backend doesn't link
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ec0e46376a2afec4ff7606f95582b0ec49c2a44a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 24 00:44:53 2012 -0400
+
+    Remove TODO items
+
+ TODO | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 56e878ab875ff06d74702145e380e198be967bd6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 24 00:41:51 2012 -0400
+
+    [graphite2] Cleanup scratch buffer allocation
+
+ src/hb-graphite2.cc | 77
+ ++++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 44 insertions(+), 33 deletions(-)
+
+commit 2f7586c6229096143ca0a96712a27416ee0d3c85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 23 23:59:55 2012 -0400
+
+    [icu-le] Implement icu layout engine shaper
+
+ configure.ac          |   2 +-
+ src/hb-icu-le.cc      | 113
+ +++++++++++++++++++++++++++++++++++++++++++++-----
+ src/hb-icu-le/cmaps.h |   1 -
+ src/hb-shaper-list.hh |   4 ++
+ 4 files changed, 108 insertions(+), 12 deletions(-)
+
+commit ba7f6c3797e5b440557bacd9b666bf09713dca76
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 23 21:52:44 2012 -0400
+
+    [icu-le] Hook up to hb_face_t
+
+ src/hb-icu-le.cc                       |  17 +++-
+ src/hb-icu-le/FontTableCache.cpp       |  34 ++++----
+ src/hb-icu-le/FontTableCache.h         |   9 ++-
+ src/hb-icu-le/PortableFontInstance.cpp | 144
+ +++------------------------------
+ src/hb-icu-le/PortableFontInstance.h   |  21 ++---
+ src/hb-icu-le/README                   |   1 +
+ 6 files changed, 57 insertions(+), 169 deletions(-)
+
+commit e96bb36995b2a5321b4d32bb11906e1701aaf115
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 23 21:37:51 2012 -0400
+
+    [icu-le] Actually use the FontTableCache
+
+ src/hb-icu-le/PortableFontInstance.cpp | 25 ++++++++-----------------
+ 1 file changed, 8 insertions(+), 17 deletions(-)
+
+commit 7d242364ea647f655a7092bda25f9a10774c57f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 23 21:23:41 2012 -0400
+
+    [icu-le] Start adding a icu-layout-engine backend
+
+    Import PortableFontInstance and add shaper stub.
+
+ configure.ac                           |   9 +
+ src/Makefile.am                        |   8 +
+ src/hb-icu-le.cc                       | 111 ++++++++
+ src/hb-icu-le/FontTableCache.cpp       |  91 +++++++
+ src/hb-icu-le/FontTableCache.h         |  41 +++
+ src/hb-icu-le/Makefile.am              |  25 ++
+ src/hb-icu-le/PortableFontInstance.cpp | 436
+ ++++++++++++++++++++++++++++++++
+ src/hb-icu-le/PortableFontInstance.h   | 117 +++++++++
+ src/hb-icu-le/README                   |   2 +
+ src/hb-icu-le/cmaps.cpp                | 200 +++++++++++++++
+ src/hb-icu-le/cmaps.h                  |  85 +++++++
+ src/hb-icu-le/letest.h                 |  49 ++++
+ src/hb-icu-le/license.html             |  51 ++++
+ src/hb-icu-le/sfnt.h                   | 449
+ +++++++++++++++++++++++++++++++++
+ 14 files changed, 1674 insertions(+)
+
+commit b5584ee4be46b47e1678acf28426970a6d670b4f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 23 16:26:07 2012 -0400
+
+    [Indic] For old-spec, match non-zero context
+
+    Fixes consonant-position with old-spec Malayalam.  Uniscribe seem
+    to be
+    doing this.  Fixes below-base La (eg. Pa,H,La) with AnjaliNewLipi.ttf.
+    Doesn't regress new-spec or other scripts.
+
+ src/hb-ot-shape-complex-indic.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit d9b204d3d24cde165167714728bf380267903d6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 23 16:22:28 2012 -0400
+
+    [GSUB] Allow non-zero-context matching in would_apply()
+
+    To be used in the next patch.
+
+ src/hb-ot-layout-gsubgpos-private.hh |  6 ++++--
+ src/hb-ot-layout-private.hh          |  3 ++-
+ src/hb-ot-layout.cc                  | 14 ++++++++------
+ src/hb-ot-layout.h                   |  7 ++++---
+ src/hb-ot-map.cc                     | 12 ++----------
+ src/hb-ot-shape-complex-indic.cc     |  2 +-
+ src/test-would-substitute.cc         |  2 +-
+ 7 files changed, 22 insertions(+), 24 deletions(-)
+
+commit 1f2bb172fe9a173ecfd61054f1fdd850943ef059
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 23 16:10:37 2012 -0400
+
+    Revert "[Indic/GSUB] Ignore context when matching would_apply()"
+
+    This reverts commit 24dd4e56743c6ce5e01cb710ca9e01b3e527af58.
+
+    Oops.  My bad.  The change _regressed_ Malayalam test suite, not
+    improved it.  I'll redo it, differentiating between old-spec and
+    new-spec cases.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit 24dd4e56743c6ce5e01cb710ca9e01b3e527af58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 23 15:47:10 2012 -0400
+
+    [Indic/GSUB] Ignore context when matching would_apply()
+
+    The MS Indic specs say "...all classifications are determined
+    ... using
+    context-free substitutions."  However, testing shows that MS's
+    Malayalam
+    shapers (both old and new), "match" even if there is no zero-context
+    rule.
+    We follow.
+
+    Fixes below-base La (eg. Pa,H,La) with AnjaliNewLipi.ttf (old spec).
+    Moreover, test suite Malayalam failures are down to 312 from 875!  No
+    change in other scripts.
+
+    Current numbers:
+
+    BENGALI: 353996 out of 354285 tests passed. 289 failed (0.0815727%)
+    DEVANAGARI: 707339 out of 707394 tests passed. 55 failed (0.00777502%)
+    GUJARATI: 366489 out of 366506 tests passed. 17 failed (0.0046384%)
+    GURMUKHI: 60769 out of 60809 tests passed. 40 failed (0.0657797%)
+    KANNADA: 951086 out of 951913 tests passed. 827 failed (0.0868777%)
+    KHMER: 299106 out of 299124 tests passed. 18 failed (0.00601757%)
+    LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
+    MALAYALAM: 1047541 out of 1048416 tests passed. 875 failed
+    (0.0834592%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271726 out of 271847 tests passed. 121 failed (0.0445103%)
+    TAMIL: 1091837 out of 1091837 tests passed. 0 failed (0%)
+    TELUGU: 970558 out of 970573 tests passed. 15 failed (0.00154548%)
+    TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)
+
+ src/hb-ot-layout-gsubgpos-private.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 6732d62e78b13842ead9549c97bede25c73976cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 23 15:19:45 2012 -0400
+
+    [Indic] Implement pre-base reordering Ra for old-spec Malayalam
+
+    Fixes Pa,H,Ra sequence with AnjaliNewLipi.ttf.
+
+ src/hb-ot-shape-complex-indic.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 80cd92326f8a3f48a7821e720e8ecb2072e73286
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 23 12:06:14 2012 -0400
+
+    [Indic] Only apply basic features per-syllable
+
+    Free up syllables and let features work across syllables for the
+    presentation forms features and GPOS.
+
+    Fixed:
+    - 1 GURMUKHI test (remains 40)
+    - 12 KHMER tests (remains 18)
+    - 11 SINHALA tests (remains 121)
+
+    Regresses:
+    - 5 MALAYALAM tests (up to 312)
+
+    Current numbers:
+
+    BENGALI: 353996 out of 354285 tests passed. 289 failed (0.0815727%)
+    DEVANAGARI: 707339 out of 707394 tests passed. 55 failed (0.00777502%)
+    GUJARATI: 366489 out of 366506 tests passed. 17 failed (0.0046384%)
+    GURMUKHI: 60769 out of 60809 tests passed. 40 failed (0.0657797%)
+    KANNADA: 951086 out of 951913 tests passed. 827 failed (0.0868777%)
+    KHMER: 299106 out of 299124 tests passed. 18 failed (0.00601757%)
+    LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
+    MALAYALAM: 1048104 out of 1048416 tests passed. 312 failed
+    (0.0297592%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271726 out of 271847 tests passed. 121 failed (0.0445103%)
+    TAMIL: 1091837 out of 1091837 tests passed. 0 failed (0%)
+    TELUGU: 970558 out of 970573 tests passed. 15 failed (0.00154548%)
+    TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit df5d5c68f3a5cab17bf4a429802a1a1a834c3456
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 23 09:33:30 2012 -0400
+
+    Whitespace
+
+ src/hb-ot-layout-gpos-table.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 7fe00d15da20193ca94a8ead9aee60df24074a9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 18 13:59:46 2012 -0400
+
+    Release 0.9.3
+
+ NEWS         | 16 ++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 17 insertions(+), 1 deletion(-)
+
+commit 7068e534c4ef7ed2eb7ef8e1370fd4a449556ce8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 18 13:56:10 2012 -0400
+
+    Fix ChangeLog generation rule
+
+ Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2f1747ed7d28148807ad07eb8e22db3ab5c54966
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 16 11:46:46 2012 -0400
+
+    Add comment
+
+ src/hb-ot-shape-complex-arabic.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit bd08d5d126aa878d1dbf7bfd4b1a764c170cd9ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 16 11:35:50 2012 -0400
+
+    [OT] Fix Arabic shaper OOB access
+
+    https://bugzilla.mozilla.org/show_bug.cgi?id=782908
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b161bfc4f6f2db0edea780b95b798ff7b559cf33
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 16 08:09:44 2012 -0400
+
+    [configure] Cleanup check for ICU
+
+    Check for upstream-provided 'icu-uc' pkgconfig package.
+
+ configure.ac | 21 +--------------------
+ 1 file changed, 1 insertion(+), 20 deletions(-)
+
+commit daf0731865f91da960446928667d4095bde471ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 16 07:32:59 2012 -0400
+
+    [ICU] Fix includes
+
+    As reported by Steven Loomis, including uversion.h works everywhere.
+
+ src/hb-icu.cc | 6 ------
+ 1 file changed, 6 deletions(-)
+
+commit a67ba9c0fe6798a3500af9f4acee8d678f5144ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 15 18:52:17 2012 -0400
+
+    Whitespace
+
+ src/hb-old/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9fe76051f7003d6b6a10486c5595bf1a4dbf5fe6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 15 17:24:28 2012 -0400
+
+    [NEWS] Fix date
+
+    Oops!
+
+ NEWS | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 45c1383cc7315f89c23c0ed388b99e87224884e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 14 09:33:18 2012 -0400
+
+    Minor
+
+ src/hb-coretext.cc       | 8 ++++----
+ src/hb-fallback-shape.cc | 8 ++++----
+ src/hb-graphite2.cc      | 8 ++++----
+ src/hb-uniscribe.cc      | 8 ++++----
+ 4 files changed, 16 insertions(+), 16 deletions(-)
+
+commit 4ac4c6f2e12ddc8bf5e750671321458218b6e0c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 13 10:52:52 2012 -0400
+
+    Fix ICU build with older ICUs
+
+ src/hb-icu.cc | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 883cbf5ed79d2b60191f803a5ee3f3e4496f3441
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 12 17:11:27 2012 -0400
+
+    Minor
+
+ contrib/README | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit b7a4d37d0b162f2222b65d09b9271b8c636086f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 11 21:32:23 2012 -0400
+
+    minor
+
+ configure.ac | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit d5045a5f4017631a4660f985fe451c5a64c42ca0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 11 21:26:25 2012 -0400
+
+    [ICU] Use new normalizer2 compose/decompose API
+
+    It's considerably faster than the fallback implementation we had
+    previously!
+
+ src/hb-buffer.cc          |  9 +++---
+ src/hb-glib.cc            | 26 +++++++---------
+ src/hb-icu.cc             | 75
+ +++++++++++++++++++++++++++++++++++++----------
+ src/hb-unicode-private.hh | 13 ++------
+ src/hb-unicode.cc         | 35 ++++++++++++++++++++--
+ src/hb-warning.cc         |  8 -----
+ 6 files changed, 110 insertions(+), 56 deletions(-)
+
+commit 2b73a1f112c489c2553743c08dc03cd89f60cb2d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 11 19:17:54 2012 -0400
+
+    Add TODO
+
+ TODO | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 9f9f04c2229227bb0712166e824157bbbf5cef80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 11 18:34:13 2012 -0400
+
+    [OT] Unbreak Thai shaping and fallback Arabic shaping
+
+    The merger of normalizer and glyph-mapping broke shapers that
+    modified text stream.  Unbreak them by adding a new preprocess_text
+    shaping stage that happens before normalizing/cmap and disallow
+    setup_mask modification of actual text.
+
+ src/hb-ot-shape-complex-arabic.cc  | 42
+ ++++++++++++++++++++++++++++----------
+ src/hb-ot-shape-complex-indic.cc   |  1 +
+ src/hb-ot-shape-complex-misc.cc    | 12 ++++++-----
+ src/hb-ot-shape-complex-private.hh | 15 +++++++++++---
+ src/hb-ot-shape.cc                 |  3 +++
+ 5 files changed, 54 insertions(+), 19 deletions(-)
+
+commit e9f28a38f54b98fa59f9159ccaaa3be6027e1378
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 11 18:20:28 2012 -0400
+
+    [OT] Add shape_plan to Arabic shaper
+
+ src/hb-ot-shape-complex-arabic.cc | 82
+ +++++++++++++++++++++++++--------------
+ 1 file changed, 53 insertions(+), 29 deletions(-)
+
+commit 344cc56698a8c84c4c1a05a71d829e5171aa3a60
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 11 17:36:23 2012 -0400
+
+    Add TODO
+
+ TODO | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit daf13afb0801740dcc7900c4af190e24b80a05c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 10 16:38:44 2012 -0400
+
+    [OT] Implement fallback mark positioning for "double" combining marks
+
+ src/hb-ot-shape-fallback.cc | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit d345313104d9e3c8a8533ccdebd74e0648d0bee3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 10 16:34:04 2012 -0400
+
+    [OT] Fix fallback mark positioning with left-to-right text
+
+    Ouch!
+
+ src/hb-ot-shape-fallback.cc | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
+
+commit e297ee4acd6f9d950f8542fc6ad71fd580b69284
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 10 14:49:37 2012 -0400
+
+    Bump version to 0.9.2
+
+    A *real* release this time, with NEWS, ChangeLog, etc.
+
+ AUTHORS      |   8 ++++
+ COPYING      |   9 ++--
+ Makefile.am  |  13 +++---
+ NEWS         | 136
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ THANKS       |   7 +++
+ configure.ac |   4 +-
+ 6 files changed, 165 insertions(+), 12 deletions(-)
+
+commit 6efe1200b97cefe019857b0b5951a4a87deeb02b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 10 13:49:32 2012 -0400
+
+    Bump version to 0.9.1
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 206ab6057303273590a3d005660e075bdcee0f5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 10 09:06:30 2012 -0400
+
+    [test] Move around
+
+ test/shaping/texts/in-tree/shaper-arabic/script-arabic/MANIFEST         |
+ 2 +-
+ .../texts/in-tree/shaper-arabic/script-arabic/language-urdu/MANIFEST    |
+ 1 +
+ .../shaper-arabic/script-arabic/{ => language-urdu}/crulp/MANIFEST
+ | 0
+ .../script-arabic/{ => language-urdu}/crulp/ligatures/2grams.txt
+ | 0
+ .../script-arabic/{ => language-urdu}/crulp/ligatures/3grams.txt
+ | 0
+ .../script-arabic/{ => language-urdu}/crulp/ligatures/4grams.txt
+ | 0
+ .../script-arabic/{ => language-urdu}/crulp/ligatures/5grams.txt
+ | 0
+ .../script-arabic/{ => language-urdu}/crulp/ligatures/6grams.txt
+ | 0
+ .../script-arabic/{ => language-urdu}/crulp/ligatures/7grams.txt
+ | 0
+ .../script-arabic/{ => language-urdu}/crulp/ligatures/8grams.txt
+ | 0
+ .../script-arabic/{ => language-urdu}/crulp/ligatures/LICENSE
+ | 0
+ .../script-arabic/{ => language-urdu}/crulp/ligatures/MANIFEST
+ | 0
+ .../script-arabic/{ => language-urdu}/crulp/ligatures/README            |
+ 0
+ .../script-arabic/{ => language-urdu}/crulp/ligatures/SOURCES
+ | 0
+ 14 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 7a484c601e0958533eb85a6902296733c39537fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 10 09:05:29 2012 -0400
+
+    [test] Add Urdu ligature sequences from CRULP
+
+ .../in-tree/shaper-arabic/script-arabic/MANIFEST   |    1 +
+ .../shaper-arabic/script-arabic/crulp/MANIFEST     |    1 +
+ .../script-arabic/crulp/ligatures/2grams.txt       |  601 ++
+ .../script-arabic/crulp/ligatures/3grams.txt       | 3415 +++++++++++
+ .../script-arabic/crulp/ligatures/4grams.txt       | 6316
+ ++++++++++++++++++++
+ .../script-arabic/crulp/ligatures/5grams.txt       | 5029
+ ++++++++++++++++
+ .../script-arabic/crulp/ligatures/6grams.txt       | 1542 +++++
+ .../script-arabic/crulp/ligatures/7grams.txt       |  354 ++
+ .../script-arabic/crulp/ligatures/8grams.txt       |   26 +
+ .../script-arabic/crulp/ligatures/LICENSE          |    3 +
+ .../script-arabic/crulp/ligatures/MANIFEST         |    7 +
+ .../script-arabic/crulp/ligatures/README           |   16 +
+ .../script-arabic/crulp/ligatures/SOURCES          |    4 +
+ 13 files changed, 17315 insertions(+)
+
+commit f4cb4762986a28634fa7de9b706f9d37859b881e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 10 03:51:44 2012 -0400
+
+    [OT] Slightly adjust normalizer
+
+    The change is very subtle.  If we have a single-char cluster that
+    decomposes to three or more characters, then try recomposition, in
+    case the farther mark may compose with the base.
+
+ src/hb-ot-shape-normalize.cc | 81
+ +++++++++++++++++++++++++++++---------------
+ 1 file changed, 54 insertions(+), 27 deletions(-)
+
+commit 07d682806349aee81f53114778ce0beb23909ed7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 10 03:28:50 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape-normalize.cc | 25 ++++++++-----------------
+ src/hb-ot-shape.cc           |  2 +-
+ 2 files changed, 9 insertions(+), 18 deletions(-)
+
+commit b00321ea78793d9b3592b5173a9800e6322424fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 9 22:33:32 2012 -0400
+
+    [OT] Avoid calling get_glyph() twice
+
+    Essentially move the glyph mapping to normalization process.
+    The effect on Devanagari is small (but observable).  Should be more
+    observable in simple text, like ASCII.
+
+ src/hb-ot-shape-normalize-private.hh |  2 +
+ src/hb-ot-shape-normalize.cc         | 76
+ +++++++++++++++++++++++++-----------
+ src/hb-ot-shape.cc                   | 44 ++++++++++-----------
+ 3 files changed, 77 insertions(+), 45 deletions(-)
+
+commit 12c0875eafa4bd92db650e5acca046d99594d1e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 9 22:00:53 2012 -0400
+
+    [OT] Remove redundant check
+
+ src/hb-ot-shape.cc | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit 5c60b70c89b4e0a6512d9fd1ab5394dd76feb742
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 9 21:58:07 2012 -0400
+
+    [OT] More code shuffling around
+
+    Preparing for merging map_glyphs() and normalize().
+
+ src/hb-ot-shape.cc | 167
+ +++++++++++++++++++++++++++--------------------------
+ 1 file changed, 86 insertions(+), 81 deletions(-)
+
+commit cd0c6e148f6d078b364370cb2f808b793b921be2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 9 21:48:55 2012 -0400
+
+    Shuffle buffer variable allocations around
+
+    To room for more allocations, coming.
+
+ src/hb-ot-layout-private.hh              | 6 +++---
+ src/hb-ot-shape-complex-arabic.cc        | 2 +-
+ src/hb-ot-shape-complex-indic-private.hh | 4 ++--
+ src/hb-ot-shape-complex-private.hh       | 5 ++---
+ src/hb-ot-shape-private.hh               | 4 ++--
+ 5 files changed, 10 insertions(+), 11 deletions(-)
+
+commit 8d1eef3f32fb539de2a72804fa3834acc18daab5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 9 21:31:52 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape-normalize.cc | 50
+ +++++++++++++++++++++++++++-----------------
+ 1 file changed, 31 insertions(+), 19 deletions(-)
+
+commit 56c9e7c004e802ddcb8c704346026f1d7a812f9f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 9 21:12:30 2012 -0400
+
+    Fill out combining class resetting for fallback shaping
+    Thai/Lao/Tibetan
+
+ src/hb-ot-shape-fallback.cc | 38 +++++++++++++++++++++++++++++++++++++-
+ src/hb-unicode-private.hh   |  7 ++++---
+ src/hb-unicode.cc           |  2 +-
+ 3 files changed, 42 insertions(+), 5 deletions(-)
+
+commit a321e1d51e0e7fa02738410e8d6e77c841bc6b13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 9 18:30:34 2012 -0400
+
+    Revert "Reject lookups with no subTable"
+
+    This reverts commit 30ec9002d84e8b49290e782e6192069821ffa942.
+
+    See previous commit.
+
+ src/hb-ot-layout-common-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 2eaf482b371034ce6ebfaedee98049b036fd3493
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 9 18:30:05 2012 -0400
+
+    Revert "[GSUB/GPOS] Reject Context/ChainContext lookups with zero
+    input"
+
+    This reverts commit 0981068b75710397f08e0d2d776a0a2ea68d7117.
+
+    I was confused.  Even if we access coverage[0] unconditionally,
+    we don't
+    need bound checks since the array machinary already handles that.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit a02d86484be870615297abfc7be9f94645434762
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 18:04:29 2012 -0400
+
+    Add check-exported-symbols.sh
+
+    And misc linking fixes.
+
+ src/Makefile.am                  |  1 +
+ src/check-exported-symbols.sh    | 40
+ ++++++++++++++++++++++++++++++++++++++++
+ src/check-internal-symbols.sh    |  2 +-
+ src/hb-ot-shape-complex-indic.cc |  2 +-
+ src/hb-ot-shape.cc               |  6 +++---
+ 5 files changed, 46 insertions(+), 5 deletions(-)
+
+commit 4c8ac4f47e95d2b266b2f64e75c55af8233b6b91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 17:44:19 2012 -0400
+
+    Misc minor fixes
+
+ src/check-internal-symbols.sh |  10 +--
+ src/hb-font-private.hh        |  29 +++++++-
+ src/hb-font.cc                |  63 +++++++---------
+ src/hb-font.h                 |   2 +-
+ src/hb-graphite2.cc           |   4 +-
+ src/hb-old.cc                 |   2 +-
+ src/hb-ot-layout.cc           |   6 +-
+ src/hb-ot-shape-fallback.cc   |  10 +--
+ src/hb-ot-shape.cc            |   2 +-
+ src/hb-shape-plan.cc          |   2 +-
+ src/hb-shape-plan.h           |   2 +-
+ src/hb-tt-font.cc             | 166
+ +-----------------------------------------
+ 12 files changed, 72 insertions(+), 226 deletions(-)
+
+commit 560d68af8168d1baff607b9616a3590af70fe9ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 17:16:01 2012 -0400
+
+    Use a export-file for Windows builds
+
+    Apparently even that doesn't make check-internal-symbols.sh happy with
+    mingw32.  Going to disable that for DLLs again, but hopefully the
+    export-file is doing *something*.
+
+ configure.ac    | 14 +++++++++++++-
+ src/Makefile.am | 22 +++++++++++++++++++++-
+ src/hb-buffer.h |  4 ++--
+ 3 files changed, 36 insertions(+), 4 deletions(-)
+
+commit f8751cf8e0a16125d63a88da65fdbfa76a19453f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 17:15:44 2012 -0400
+
+    [hb-old] speed-up build
+
+ src/hb-old/harfbuzz-external.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 5f4c52867ce67faa15f5d26b59c18c8d068e9261
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 16:53:37 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout.h | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit fe2b8a7777ab1c84980424ede713cb0d6701f987
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 15:27:14 2012 -0400
+
+    Minor
+
+ TODO | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7e7d245b332306949a19c628bacd920717434769
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 15:23:48 2012 -0400
+
+    Make default_language threadsafe
+
+ src/hb-common.cc | 15 +++++----------
+ 1 file changed, 5 insertions(+), 10 deletions(-)
+
+commit 06b192c458010c847362d809673209c87ea29949
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 15:23:45 2012 -0400
+
+    Minor
+
+ src/hb-common.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 37191ede7583fdb864db32a8f4d90956657926c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 14:59:09 2012 -0400
+
+    Minor
+
+ src/hb-common.h | 4 ++--
+ src/hb-icu.h    | 1 -
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 6d9a329a8a0f11f4b175e407de59c55924de1ef6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 14:48:41 2012 -0400
+
+    Adjust a couple source checks
+
+ src/check-internal-symbols.sh |  4 ++--
+ src/check-static-inits.sh     | 10 ++++++++--
+ 2 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 9c929abdcfef44c0193a2917b20981df37ade21c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 14:33:37 2012 -0400
+
+    Minor renaming
+
+ src/Makefile.am                                                   |
+ 4 ++--
+ ...sition-fallback-private.hh => hb-ot-shape-fallback-private.hh} |
+ 8 ++++----
+ src/{hb-ot-shape-position-fallback.cc => hb-ot-shape-fallback.cc} |
+ 4 ++--
+ src/hb-ot-shape.cc                                                |
+ 4 ++--
+ 4 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 801298b590effd768607bb532dc83c73ba65d16b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 14:26:36 2012 -0400
+
+    Fix cast
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=53233
+
+ src/hb-buffer-private.hh | 10 ++++++----
+ src/hb-shape-plan.cc     |  4 ++--
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+commit 21756934a15e31dc243e2b6d80adec5752477652
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 8 01:20:45 2012 -0400
+
+    [OT] Implement fallback positioning
+
+    Implemented for Arabic, Hebrew, and generic marks.
+    Activated if no GPOS table present.
+
+ src/hb-font.h                        |   3 +-
+ src/hb-ft.cc                         |   3 +-
+ src/hb-old.cc                        |   2 +-
+ src/hb-ot-shape-position-fallback.cc | 237
+ ++++++++++++++++++++++++++++++++++-
+ src/hb-unicode-private.hh            |  81 ++++++++++++
+ src/hb-unicode.cc                    | 107 ++++++----------
+ 6 files changed, 356 insertions(+), 77 deletions(-)
+
+commit fb56e7628362a73e20f7f0b49fe31e802dc01f4f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 23:44:47 2012 -0400
+
+    [hb-old] Fix warnings
+
+ src/hb-old/harfbuzz-shaper.cpp | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit affaf8a0e5aa38e5820455f789eebf916e02eb7b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 22:41:38 2012 -0400
+
+    [OT] Start adding fallback positioning
+
+    Used when there is no GPOS.
+
+ src/Makefile.am                              |  2 ++
+ src/hb-ot-shape-position-fallback-private.hh | 39 +++++++++++++++++++++++
+ src/hb-ot-shape-position-fallback.cc         | 47
+ ++++++++++++++++++++++++++++
+ src/hb-ot-shape.cc                           | 23 +++-----------
+ 4 files changed, 93 insertions(+), 18 deletions(-)
+
+commit 7e4920fd1577987bf6804f67765e22a84983e057
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 22:32:23 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 472f229a63f0d1bb21b02179ef430b7698df8f12
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 22:25:24 2012 -0400
+
+    [GSUB] Generalize would_apply()
+
+    Fixes logic also, where before we were always matching if
+    glyphs_len==1
+    and a ligature started with the glyph.
+
+ src/hb-ot-layout-gsub-table.hh       | 26 ++++++++++++++++++++-----
+ src/hb-ot-layout-gsubgpos-private.hh | 37
+ ++++++++++++++++++------------------
+ src/hb-ot-layout.cc                  |  3 +--
+ 3 files changed, 40 insertions(+), 26 deletions(-)
+
+commit 6f3a300138f659020c21c3e08b7981c78df5f332
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 22:13:25 2012 -0400
+
+    Add hb_font_glyph_from/to_string
+
+ src/hb-font-private.hh       | 43
+ +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-font.cc               | 24 ++++++++++++++++++++----
+ src/hb-font.h                | 11 +++++++++++
+ src/hb-private.hh            | 16 ++++++++++++++++
+ src/test-would-substitute.cc | 11 ++++++++++-
+ util/options.cc              |  2 +-
+ 6 files changed, 101 insertions(+), 6 deletions(-)
+
+commit eb56f6ae96260c5b4bcd4e1dfb7ab733a230f3a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 21:44:25 2012 -0400
+
+    Minor
+
+ src/hb-mutex-private.hh | 1 +
+ src/hb-uniscribe.cc     | 1 +
+ src/hb-uniscribe.h      | 2 ++
+ 3 files changed, 4 insertions(+)
+
+commit f4e48adcdd4315ce09e755f87a0f801d88194f42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 21:12:49 2012 -0400
+
+    [OT] Apply 'rclt' feature in horizontal mode
+
+    'rclt' is "Required Contextual Forms" being proposed by Microsoft.
+    It's like 'calt', but supposedly always on.  We apply 'calt' anyway,
+    and now apply this too.
+
+ src/hb-ot-shape.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b1914b8bd08ecdea79930dda7e3bb2ae9e6134a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 16:57:48 2012 -0400
+
+    Fix warnings
+
+ src/hb-icu.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 0f8881d6bbf6cd59938315eeff9b71cfc736aa4e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 16:57:02 2012 -0400
+
+    More refactoring
+
+ src/hb-ot-shape-normalize.cc | 161
+ +++++++++++++++++++++++++++++++++++++++++-
+ src/hb-unicode-private.hh    | 164
+ +------------------------------------------
+ 2 files changed, 162 insertions(+), 163 deletions(-)
+
+commit 428dfcab6634ff264570a0a5d715efb8048c3db5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 16:51:48 2012 -0400
+
+    Minor refactoring
+
+ src/hb-ot-shape-normalize.cc | 27 +++++++++++++++++++++++----
+ 1 file changed, 23 insertions(+), 4 deletions(-)
+
+commit 61f41849af6ff9edf8b55cf9610066d1bfb4a8df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 16:45:27 2012 -0400
+
+    Add Hebrew presentation forms shaping
+
+    Lifted from https://bugzilla.mozilla.org/show_bug.cgi?id=728866
+
+ src/hb-unicode-private.hh | 121
+ +++++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 120 insertions(+), 1 deletion(-)
+
+commit 32d71dc13317b322e2c5de00d767b2cb15fddd8b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 14:11:16 2012 -0400
+
+    [Graphite] Minor
+
+ src/hb-graphite2.cc | 60
+ +++++++++++++++++++++++++----------------------------
+ 1 file changed, 28 insertions(+), 32 deletions(-)
+
+commit 030ac5022e8a43b9329c26e72527bafc582ef44b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 7 13:01:12 2012 -0400
+
+    Remove enum trailing comma
+
+    ...again.
+
+ src/hb-ot-shape-normalize-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 368b4e7649f9bc8c6bebf7c7ff03c9b9ec425a25
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 23:06:04 2012 -0400
+
+    Minor
+
+ src/hb-font.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit ade7459ea7c75b4f33f7cfa43dd5bdfa0c18d6d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 19:42:47 2012 -0700
+
+    [util] Fix leaks
+
+ src/hb-graphite2.cc | 18 ++++++++++++++----
+ util/options.cc     |  2 +-
+ util/options.hh     |  2 +-
+ 3 files changed, 16 insertions(+), 6 deletions(-)
+
+commit 2fef993460dcfd94c92ab35413bdde18ad2b0ceb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 19:35:04 2012 -0700
+
+    [Graphite] Fix graphite2 backend with RTL text
+
+    Patch from Martin Hosken.
+
+ src/hb-graphite2.cc | 33 ++++++++++++++++++---------------
+ 1 file changed, 18 insertions(+), 15 deletions(-)
+
+commit e4992e13e19877a73ea05fc1d31005a262c685ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 19:25:39 2012 -0700
+
+    [Graphite] Port graphite2 backend to new shaper infrastructure
+
+ src/hb-graphite2.cc   | 234
+ +++++++++++++++++++++++---------------------------
+ src/hb-graphite2.h    |   2 +-
+ src/hb-shaper-list.hh |   2 +-
+ 3 files changed, 109 insertions(+), 129 deletions(-)
+
+commit 66591ececfba9791de06c814f5f30131e95e5fd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 17:07:19 2012 -0700
+
+    Remove unnecessary lifecycle bits
+
+    We already set recount to INVALID when destroying.
+    This block was not necessary.
+
+ src/hb-font.cc | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit e3320ecc1b5a7eaccc7c9370b2d1b76850f054be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 6 11:44:10 2012 -0700
+
+    Fix compiler warnings
+
+ configure.ac | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+commit 167b625d988b74572d6b2f646c285b666b650d49
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 5 21:16:26 2012 -0700
+
+    [Indic] Minor, move 'blwf' after 'half'
+
+    We don't apply them together anyway.  Should not make any difference
+    right now.
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 048e3b596fb7fccd3fb5f48de98b6b67788f774a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 4 18:04:57 2012 -0700
+
+    Speed up hb_set_digest_lowest_bits_t calcs
+
+ src/hb-set-private.hh | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+commit 3d1b66a35e1ab3be19335705f310b278d76d66d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 4 17:42:28 2012 -0700
+
+    Speed up hb_set_digest_common_bits_t calcs
+
+ src/hb-set-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bdc48a879a1900138d8caaa8d90fb9fe1e768d1d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 4 17:08:38 2012 -0700
+
+    Enlarge glyph_name buffer
+
+    Lohit Devanagari has a glyph named:
+    u0924_u094D.half_u0930_u094D.blwf.vatu
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 25326c2359b0a3e25222b94acd142bc36eff78a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 4 16:43:18 2012 -0700
+
+    Rewrite ARRAY_LENGTH as a template function
+
+    Such it wouldn't apply to pointers accidentally.
+
+ src/hb-ot-shape-complex-arabic-table.hh | 4 ++--
+ src/hb-private.hh                       | 9 ++++++---
+ 2 files changed, 8 insertions(+), 5 deletions(-)
+
+commit 8ba8042821e4581fe4e87419e58c823520441205
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 3 18:54:54 2012 -0700
+
+    [Indic] Fix consonant position font lookup logic
+
+    Oops.  I broken this badly and the test suite did not notice.  That
+    worries me.  Have to investigate.
+
+ src/hb-ot-shape-complex-indic.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit abd0c05f1f7f0546593bb2f1c4d59db12cb32e46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 3 18:45:05 2012 -0700
+
+    Minor
+
+ src/test-would-substitute.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 46ee108ef80f5d4675899862698a8c34d8fcfab5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 3 18:21:13 2012 -0700
+
+    Fix leak
+
+ src/hb-shape-plan.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 71baea0062da4d7f143d62da38492a0813814e49
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 3 17:40:07 2012 -0700
+
+    [OT] Use general-category, not GDEF class, to decide to zero mark
+    advances
+
+    At this point, the GDEF glyph synthesis looks pointless.  Not that I
+    have many fonts without GDEF lying around.
+
+    As for mark advance zeroing when GPOS not available, that also
+    is being
+    replaced by proper fallback mark positioning soon.
+
+ src/hb-ot-shape.cc | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+commit 3a7e137a68ec8f723dc3afa89c918ca2df7ff6bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 3 17:23:40 2012 -0700
+
+    Dn't use gint
+
+ src/hb-glib.cc | 4 ++--
+ src/hb-icu.cc  | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 11b0e20ba42bf0b17133c3e1087732802bb4f230
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 14:21:40 2012 -0400
+
+    [Indic] Add per-script configuration tables
+
+    This concludes the Indic shape_plan work.  May do for Arabic also...
+
+ src/hb-ot-shape-complex-indic-private.hh |  16 +-
+ src/hb-ot-shape-complex-indic.cc         | 309
+ +++++++++++++++----------------
+ 2 files changed, 159 insertions(+), 166 deletions(-)
+
+commit 85fc6c483f6d734febbe39270e84701a651f01f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 12:21:44 2012 -0400
+
+    [Indic] Move more stuff to the shape_plan
+
+    Almost done.  Need to add per-script static tables.
+
+ src/hb-ot-shape-complex-indic-machine.rl |   4 +-
+ src/hb-ot-shape-complex-indic.cc         | 216
+ ++++++++++++++++---------------
+ 2 files changed, 116 insertions(+), 104 deletions(-)
+
+commit 914ffaa40fcca020f65bacdd709421e9047afd83
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 11:03:39 2012 -0400
+
+    [Indic] Move more repeated work into shape_plan
+
+ src/hb-ot-shape-complex-indic.cc | 63
+ ++++++++++++++++++++++++++--------------
+ 1 file changed, 42 insertions(+), 21 deletions(-)
+
+commit a8c6da90f4c6e8d27a3a1b758a55476776d9f750
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 10:46:34 2012 -0400
+
+    [OT] Add per-complex-shaper shape_plan data
+
+    Hookup some Indic data to it.  More to come.
+
+ src/hb-ot-shape-complex-arabic.cc  |   2 +
+ src/hb-ot-shape-complex-indic.cc   | 128
+ ++++++++++++++++++++++---------------
+ src/hb-ot-shape-complex-misc.cc    |   4 ++
+ src/hb-ot-shape-complex-private.hh |  16 ++++-
+ src/hb-ot-shape-private.hh         |   1 +
+ src/hb-ot-shape.cc                 |  23 +++++--
+ 6 files changed, 113 insertions(+), 61 deletions(-)
+
+commit 8bb5deba9630d35878eb6edb4643ecfabf99f15f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 10:07:58 2012 -0400
+
+    [OT] Pipe shape_plan down to pause_callbacks
+
+ src/hb-ot-map-private.hh                 |  8 ++---
+ src/hb-ot-map.cc                         | 11 ++++---
+ src/hb-ot-shape-complex-indic-machine.rl |  4 +--
+ src/hb-ot-shape-complex-indic.cc         | 50
+ +++++++++++++++-----------------
+ src/hb-ot-shape-private.hh               |  6 ++++
+ src/hb-ot-shape.cc                       | 28 ++++++++++--------
+ 6 files changed, 57 insertions(+), 50 deletions(-)
+
+commit 3e38c0f2886c38d2f0a9d80a97a36edf2479d2c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 09:44:18 2012 -0400
+
+    More massaging
+
+ src/hb-ot-map-private.hh          | 20 ++++++++------------
+ src/hb-ot-map.cc                  | 17 ++++++++---------
+ src/hb-ot-shape-complex-arabic.cc |  8 ++++----
+ src/hb-ot-shape-complex-indic.cc  | 18 +++++++-----------
+ 4 files changed, 27 insertions(+), 36 deletions(-)
+
+commit 16c6a27b4bffc19026944c7bea9cf0a3a8ff1d8f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 09:38:28 2012 -0400
+
+    [OT] Port complex_shaper to planner/plan
+
+ src/hb-ot-shape-complex-arabic.cc  | 17 ++++++++---------
+ src/hb-ot-shape-complex-indic.cc   | 19 ++++++++-----------
+ src/hb-ot-shape-complex-misc.cc    | 20 ++++++++------------
+ src/hb-ot-shape-complex-private.hh | 32 +++++++++++---------------------
+ src/hb-ot-shape-private.hh         | 14 +++++++++++---
+ src/hb-ot-shape.cc                 |  9 +++++----
+ 6 files changed, 51 insertions(+), 60 deletions(-)
+
+commit 5393e3a62ba09fd7bcf3767b36225c8f49badb9d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 09:24:35 2012 -0400
+
+    [OT] Minor refactoring
+
+ src/hb-ot-map.cc           |  4 ----
+ src/hb-ot-shape-private.hh | 26 ++++++++++++++++++++++++++
+ src/hb-ot-shape.cc         | 26 ++------------------------
+ src/hb-shape-plan.cc       |  2 ++
+ src/hb-shape.cc            |  2 --
+ 5 files changed, 30 insertions(+), 30 deletions(-)
+
+commit 24eacf17c801c66a2d466e8ae02b73f501a26b25
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 08:42:11 2012 -0400
+
+    [Indic] Move consonant-position-setting into initial_reordering()
+
+ src/hb-ot-shape-complex-indic.cc | 65
+ +++++++++++++++++++++-------------------
+ 1 file changed, 35 insertions(+), 30 deletions(-)
+
+commit afbcc24be01a64bdb5c05c63880269145fa1d3c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 08:36:40 2012 -0400
+
+    [GSUB] Wire the font, not just the face, down to substitute()
+
+    We need the font for glyph lookup during GSUB pauses in Indic shaper.
+    Could perhaps be avoided, but at this point, we don't mean to support
+    separate substitute()/position() entry points (anymore), so there is
+    no point in not providing the font to GSUB.
+
+ src/hb-ot-layout-gsub-table.hh       | 13 +++++--------
+ src/hb-ot-layout-gsubgpos-private.hh |  7 ++-----
+ src/hb-ot-layout-private.hh          |  6 +++---
+ src/hb-ot-layout.cc                  | 18 +++++++++---------
+ src/hb-ot-map-private.hh             | 15 ++++++---------
+ src/hb-ot-map.cc                     |  8 ++++----
+ src/hb-ot-shape-complex-indic.cc     |  8 ++++----
+ src/hb-ot-shape.cc                   |  6 +++---
+ 8 files changed, 36 insertions(+), 45 deletions(-)
+
+commit b0e6a26a10ccca70ebc88a9e158a89ccfab0add5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 08:11:14 2012 -0400
+
+    [OT] Hide some API
+
+    It was impossible to meaningfully use them from the outside these
+    days.
+
+ src/hb-ot-layout-private.hh | 40 ++++++++++++++++++++++++++++++++--------
+ src/hb-ot-layout.cc         | 20 --------------------
+ src/hb-ot-layout.h          | 34 ----------------------------------
+ src/hb-ot-map.cc            |  8 ++++----
+ 4 files changed, 36 insertions(+), 66 deletions(-)
+
+commit 305246744ed178f116e01498b7f9d1af6950ca30
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 08:08:04 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8ef3d53255ae9fbb0e46c22909e50009d1e7eeb0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 07:53:18 2012 -0400
+
+    [Indic] More refactoring of consonant position peeking in the font
+
+    To be moved to initial_reordering next...
+
+ src/hb-ot-shape-complex-indic.cc | 59
+ ++++++++++++++++++++++++++++------------
+ 1 file changed, 41 insertions(+), 18 deletions(-)
+
+commit 3eb6f81fd3f1e56679eec10d08f5e2303121753f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 07:37:46 2012 -0400
+
+    [Indic] Refactor
+
+    Move all the logic that needs to eventually move into the indic table
+    into hb-ot-shape-complex-indic-private.hh.
+
+ src/hb-ot-shape-complex-indic-private.hh | 210
+ ++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-indic.cc         | 227
+ ++-----------------------------
+ 2 files changed, 218 insertions(+), 219 deletions(-)
+
+commit 3614ba242fc7d338761acdda365a134706035b6d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 07:13:55 2012 -0400
+
+    [Indic] Rename
+
+ src/hb-ot-shape-complex-indic.cc | 40
+ +++++++++++++++++++++-------------------
+ 1 file changed, 21 insertions(+), 19 deletions(-)
+
+commit 610e5e8f713bb2a68939b72cb2b801a7aaede4f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 05:27:46 2012 -0400
+
+    [Indic] Streamline feature would_apply()
+
+    Comes with some 10% speedup for Devanagari even!
+
+ src/hb-ot-map-private.hh         | 85
+ +++++++++++++++++++++++++---------------
+ src/hb-ot-map.cc                 | 18 ++++-----
+ src/hb-ot-shape-complex-indic.cc | 85
+ +++++++++++++++++++++++-----------------
+ 3 files changed, 110 insertions(+), 78 deletions(-)
+
+commit 1d002048d5afcd45abbb09fdf0419f13b2e2265c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 05:01:11 2012 -0400
+
+    [Indic] Minor
+
+ src/hb-ot-shape-complex-indic-private.hh | 16 --------
+ src/hb-ot-shape-complex-indic.cc         | 64
+ +++++++++++++++++++++-----------
+ 2 files changed, 43 insertions(+), 37 deletions(-)
+
+commit 6f7611375521c6d285a9aa763f2ea5cb44cd0d39
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 04:00:31 2012 -0400
+
+    [GSUB/GPOS] Check array size before accessing digests
+
+ src/hb-ot-layout-private.hh |  3 +++
+ src/hb-ot-layout.cc         | 32 ++++++++++++++++----------------
+ 2 files changed, 19 insertions(+), 16 deletions(-)
+
+commit 22148b8c4af3ed296d96e969cdd47bac97b32307
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 03:51:51 2012 -0400
+
+    Use Coverage digests in would_apply
+
+ src/hb-ot-layout-gsub-table.hh       | 1 +
+ src/hb-ot-layout-gsubgpos-private.hh | 6 +++++-
+ src/hb-ot-layout.cc                  | 4 ++--
+ 3 files changed, 8 insertions(+), 3 deletions(-)
+
+commit 6c459c8fef85bc44f45d7b58c28a34abfb2c33fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 2 03:45:53 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-gpos-table.hh       | 2 +-
+ src/hb-ot-layout-gsub-table.hh       | 4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 4 ++--
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit e2b8d75fa6e847ecf5c040f4e1e16a565c5d8aaf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 22:17:48 2012 -0400
+
+    Use wider set digests on 64-bit archs
+
+ src/hb-set-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 0120ce9679aab3ac936aeb18f6709529eef000a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 21:56:35 2012 -0400
+
+    [GSUB/GPOS] Remove unused get_coverage() methods
+
+ src/hb-ot-layout-gpos-table.hh | 11 -----------
+ src/hb-ot-layout-gsub-table.hh | 11 -----------
+ 2 files changed, 22 deletions(-)
+
+commit 1336ecdf8e4e9879b96b26ecfbf5c9ba6c49e2b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 21:46:36 2012 -0400
+
+    [GSUB/GPOS] Use Coverage digests as gatekeeper
+
+    Gives me a good 10% speedup for the Devanagari test case.  Less so
+    for less lookup-intensive tests.
+
+    For the Devanagari test case, the false positive rate of the GSUB
+    digest
+    is 4%.
+
+ src/hb-ot-layout-gpos-table.hh       | 30 +++++++++---------------------
+ src/hb-ot-layout-gsub-table.hh       | 35
+ ++++++++++++-----------------------
+ src/hb-ot-layout-gsubgpos-private.hh |  8 ++++++--
+ src/hb-ot-layout-private.hh          |  4 ++++
+ src/hb-ot-layout.cc                  | 29 +++++++++++++++++++++++++----
+ 5 files changed, 56 insertions(+), 50 deletions(-)
+
+commit a878c58a8fc1500986d713b2bcedfeb90a0087b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 21:18:54 2012 -0400
+
+    [GSUB/GPOS] Add add_coverage()
+
+ src/hb-ot-layout-gpos-table.hh | 18 ++++++++++++++++++
+ src/hb-ot-layout-gsub-table.hh | 18 ++++++++++++++++++
+ 2 files changed, 36 insertions(+)
+
+commit 60a3035ac5ec8227e4cc0e6708732bb139c9e0b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 21:06:27 2012 -0400
+
+    Add hb_set_digest_t
+
+    Implement two set digests, and one that combines the two.
+
+ src/hb-set-private.hh | 95
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 95 insertions(+)
+
+commit c8accf1dd2d92cc4f714393eb0ea46f69bb182a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 21:05:57 2012 -0400
+
+    [OT] Templatize Coverage::add_coverage()
+
+ src/hb-ot-layout-common-private.hh | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 8fbfda920e0b3bb4ab7afb732826026964b79be9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 19:03:46 2012 -0400
+
+    Inline font getters
+
+ src/hb-fallback-shape.cc          |  21 ++--
+ src/hb-font-private.hh            | 204
+ ++++++++++++++++++++++++++++++++++++++
+ src/hb-font.cc                    | 129 ++++--------------------
+ src/hb-graphite2.cc               |   6 +-
+ src/hb-old.cc                     |  10 +-
+ src/hb-ot-layout-gdef-table.hh    |   2 +-
+ src/hb-ot-layout-gpos-table.hh    |   2 +-
+ src/hb-ot-shape-complex-arabic.cc |   4 +-
+ src/hb-ot-shape-complex-indic.cc  |   6 +-
+ src/hb-ot-shape-normalize.cc      |  12 +--
+ src/hb-ot-shape.cc                |  47 +++++----
+ 11 files changed, 277 insertions(+), 166 deletions(-)
+
+commit 6adf417bc15d4524e280b284e3accd1ae647662e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 18:07:42 2012 -0400
+
+    Use a lookup table for modified_combining_class
+
+ src/hb-unicode-private.hh |  10 ++-
+ src/hb-unicode.cc         | 213
+ +++++++++++++++++++++++++++++++---------------
+ src/hb-unicode.h          |   4 +
+ 3 files changed, 157 insertions(+), 70 deletions(-)
+
+commit 208f70f0553d73d2908b21b9552298029482a8b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 17:13:10 2012 -0400
+
+    Inline Unicode callbacks internally
+
+ src/hb-buffer.cc                |   2 +-
+ src/hb-fallback-shape.cc        |   2 +-
+ src/hb-old.cc                   |   2 +-
+ src/hb-ot-shape-complex-misc.cc |   2 +-
+ src/hb-ot-shape-normalize.cc    |  13 +++--
+ src/hb-ot-shape-private.hh      |   6 +--
+ src/hb-ot-shape.cc              |   4 +-
+ src/hb-unicode-private.hh       | 112
+ ++++++++++++++++++++--------------------
+ src/hb-unicode.cc               |   5 +-
+ 9 files changed, 73 insertions(+), 75 deletions(-)
+
+commit 7470315a3e782aa6192bbe64f7a3944266fb1521
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 17:01:59 2012 -0400
+
+    Move unicode accessors around
+
+ src/hb-unicode-private.hh | 73
+ ++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-unicode.cc         | 65 ++++-------------------------------------
+ 2 files changed, 78 insertions(+), 60 deletions(-)
+
+commit 21fdcee00125b6e1c09f0bed3064d16ccd3a7a5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 16:23:44 2012 -0400
+
+    Add hb_unicode_combining_class_t
+
+ src/hb-common.h           |  38 +-------------
+ src/hb-glib.cc            |   4 +-
+ src/hb-icu.cc             |   4 +-
+ src/hb-unicode-private.hh |   2 +-
+ src/hb-unicode.cc         |  11 ++--
+ src/hb-unicode.h          | 124
+ +++++++++++++++++++++++++++++++++++++++++++++-
+ 6 files changed, 134 insertions(+), 49 deletions(-)
+
+commit 84186a64004e5dcd2ce98b564d0e0a09aa5d68b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 13:32:39 2012 -0400
+
+    Add commentary on the compatibility decomposition in the normalizer
+
+ src/hb-ot-shape-normalize.cc | 18 +++++++++++++++---
+ 1 file changed, 15 insertions(+), 3 deletions(-)
+
+commit 0834d952017a04c6f4599e574cb75ecf3ca27d3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 00:21:09 2012 -0400
+
+    [hb-old] Adjust mark positioning parameters
+
+    Fallback mark positioning works now...  With hb-ft and hb-view /
+    hb-shape at least.
+
+ src/hb-old.cc                  | 10 +++++-----
+ src/hb-old/harfbuzz-shaper.cpp |  1 +
+ 2 files changed, 6 insertions(+), 5 deletions(-)
+
+commit 4ca743dfb8e09f9fa525061c7f1144d55f72effb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 1 00:03:41 2012 -0400
+
+    [old] Implement fontMetrics
+
+ src/hb-old.cc | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit 1e7d860613032e40a3f90e2caa2ee5ac44ab8c8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 23:41:06 2012 -0400
+
+    [GPOS] Adjust mark advance-width zeroing logic
+
+    If there is no GPOS, zero mark advances.
+
+    If there *is* GPOS and the shaper requests so, zero mark advances for
+    attached marks.
+
+    Fixes regression with Tibetan, where the font has GPOS, and marks a
+    glyph as mark where it shouldn't get zero advance.
+
+ src/hb-ot-layout-gpos-table.hh     | 14 ++++++++------
+ src/hb-ot-layout.cc                |  4 ++--
+ src/hb-ot-layout.h                 |  3 ++-
+ src/hb-ot-shape-complex-arabic.cc  |  2 +-
+ src/hb-ot-shape-complex-indic.cc   |  2 +-
+ src/hb-ot-shape-complex-misc.cc    |  4 ++--
+ src/hb-ot-shape-complex-private.hh |  2 +-
+ src/hb-ot-shape.cc                 |  6 ++----
+ 8 files changed, 19 insertions(+), 18 deletions(-)
+
+commit a8842e4a448efb30f3f2f3c628d6dc4824829726
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 23:10:11 2012 -0400
+
+    Remove some TODO items
+
+ TODO            | 27 ---------------------------
+ src/hb-shape.cc |  2 ++
+ 2 files changed, 2 insertions(+), 27 deletions(-)
+
+commit 2bc3b9a616cedbc56ff4a915f9e3439ff3a6bf13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 23:08:25 2012 -0400
+
+    [OT] Zero mark advances if the shaper desires so
+
+    Enabled for all shapers except for Indic.
+
+ src/hb-ot-shape-complex-arabic.cc  |  1 +
+ src/hb-ot-shape-complex-indic.cc   |  1 +
+ src/hb-ot-shape-complex-misc.cc    |  2 ++
+ src/hb-ot-shape-complex-private.hh |  2 ++
+ src/hb-ot-shape.cc                 | 15 +++++++++++++++
+ 5 files changed, 21 insertions(+)
+
+commit 5fecd8b0355894ceda14b3d3c654f20c3d5e77f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 22:48:38 2012 -0400
+
+    [OT] Synthesize glyph classes
+
+ TODO               |  2 --
+ src/hb-ot-shape.cc | 20 ++++++++++++++++++--
+ 2 files changed, 18 insertions(+), 4 deletions(-)
+
+commit 03b09214c073ce37eeb8af5218942c85b2d393df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 22:43:58 2012 -0400
+
+    [GSUB] Minor
+
+ src/hb-ot-layout-gsub-table.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit f0fc1df8fc949739b68d55948741016081b69c3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 22:43:32 2012 -0400
+
+    [hb-old] Implement getGlyphMetrics()
+
+    Still working on it.
+
+ src/hb-old.cc | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+commit 378d279bbf692195c4654e312dae854ab3be04cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 21:36:16 2012 -0400
+
+    Implement Unicode compatibility decompositions
+
+    Based on patch from Philip Withnall.
+    https://bugs.freedesktop.org/show_bug.cgi?id=41095
+
+ src/hb-glib.cc               | 30 +++++++++++++++++++++++++
+ src/hb-icu.cc                | 36 +++++++++++++++++++++++++++++-
+ src/hb-ot-shape-normalize.cc | 53
+ +++++++++++++++++++++++++++++---------------
+ src/hb-unicode-private.hh    |  1 +
+ src/hb-unicode.cc            | 27 +++++++++++++++++++++-
+ src/hb-unicode.h             | 37 ++++++++++++++++++++++++++++++-
+ test/api/hb-test.h           |  1 +
+ test/api/test-unicode.c      | 50
+ +++++++++++++++++++++++++++++++++++++++++
+ 8 files changed, 214 insertions(+), 21 deletions(-)
+
+commit 321ec29cc270e7e66a529696b70b2caac553c95f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 21:10:16 2012 -0400
+
+    Remove unused function
+
+ src/hb-ot-shape-complex-indic.cc | 7 -------
+ 1 file changed, 7 deletions(-)
+
+commit 69cc492dc120847ed00cae65ec958593ebf550c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 31 14:51:36 2012 -0400
+
+    [buffer] Minor
+
+ src/hb-buffer-private.hh |  3 ++-
+ src/hb-buffer.cc         | 24 ++++++++++++------------
+ 2 files changed, 14 insertions(+), 13 deletions(-)
+
+commit 693918ef8541014a5ef7dfb91c6ea0ae36d9c368
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 21:08:51 2012 -0400
+
+    [OT] Streamline complex shaper enumeration
+
+    Add a shaper class struct.
+
+ src/hb-ot-shape-complex-arabic.cc    |  37 ++++----
+ src/hb-ot-shape-complex-indic.cc     |  47 ++++++---
+ src/hb-ot-shape-complex-misc.cc      |  67 ++++++-------
+ src/hb-ot-shape-complex-private.hh   | 179
+ ++++++++++-------------------------
+ src/hb-ot-shape-normalize-private.hh |   4 +-
+ src/hb-ot-shape-private.hh           |   2 +-
+ src/hb-ot-shape.cc                   |  16 ++--
+ 7 files changed, 143 insertions(+), 209 deletions(-)
+
+commit c2e42c3db691515f3a458eb4c71fe1e6439d5620
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 19:54:50 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-gpos-table.hh       | 2 +-
+ src/hb-ot-layout-gsub-table.hh       | 4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 8 ++++----
+ src/hb-ot-layout-private.hh          | 4 ++--
+ 4 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 03f67bc012f42131b36083a23efc78e1b04b828c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 19:47:53 2012 -0400
+
+    More refactoring glyph class access
+
+ src/hb-ot-layout-gpos-table.hh       |   2 +-
+ src/hb-ot-layout-gsub-table.hh       |   2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 154
+ +++++++++++++++++------------------
+ 3 files changed, 76 insertions(+), 82 deletions(-)
+
+commit 300c7307eb7943ba7416b672345506be1e27c6ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 19:37:44 2012 -0400
+
+    [OT] Don't crash if no GDEF available
+
+ src/hb-ot-layout-gsubgpos-private.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 3dcbdc2125c04c173f29f04922fc031929893f4e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 19:31:17 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout.cc | 15 +++++----------
+ 1 file changed, 5 insertions(+), 10 deletions(-)
+
+commit 05bd1b63426e07d1df7a1b40bf845dc94ab995a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 19:30:01 2012 -0400
+
+    [GSUB/GPOS] Move glyph props matching around
+
+ src/hb-ot-layout-gpos-table.hh       |  11 ++--
+ src/hb-ot-layout-gsub-table.hh       |  18 +++---
+ src/hb-ot-layout-gsubgpos-private.hh |  99
+ +++++++++++++++++++++++++++++----
+ src/hb-ot-layout-private.hh          |  12 ----
+ src/hb-ot-layout.cc                  | 104
+ +++--------------------------------
+ src/hb-ot-layout.h                   |  12 ++--
+ src/hb-ot-shape.cc                   |  10 ++--
+ 7 files changed, 127 insertions(+), 139 deletions(-)
+
+commit 2fca1426ca06cabbe8f027f2dc9dee9c27560c76
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 18:46:41 2012 -0400
+
+    [GSUB] Don't erase glyph classes if GDEF does not have glyph classes
+
+ src/hb-ot-layout-gsubgpos-private.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit fd42257f8c45ff8e036e1c3eb1a788a101be7ead
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 18:40:27 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout.cc | 29 +++++------------------------
+ 1 file changed, 5 insertions(+), 24 deletions(-)
+
+commit 7fbbf86efe675e4c038dfc5985c24bbc544620cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 18:36:42 2012 -0400
+
+    [GSUB] Minor
+
+ src/hb-ot-layout-gsub-table.hh       | 2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 6 ++++++
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 713914d3203109a8e9213f5a1d3b384730703ce9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 17:54:38 2012 -0400
+
+    [Uniscribe] Clean up a bit
+
+ src/hb-uniscribe.cc | 17 +++++------------
+ 1 file changed, 5 insertions(+), 12 deletions(-)
+
+commit 301168dae77a63ee25adfb26ce2b54a708f83791
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 17:48:04 2012 -0400
+
+    [CoreText] Port to shape_plan infrastructure
+
+ src/hb-coretext.cc | 161
+ ++++++++++++++++++++++++++---------------------------
+ 1 file changed, 80 insertions(+), 81 deletions(-)
+
+commit 6cdfd14bb19d60ac3d6b20ff611408432254f273
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 17:22:17 2012 -0400
+
+    Fix build on Mac
+
+ src/hb-ot-layout-gsub-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7e34601dededd521bcef15111e39293df3d0d13d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 14:53:41 2012 -0400
+
+    Unbreak Hangul jamo composition
+
+    When we removed the separate Hangul shaper, the specific normalization
+    preference of Hangul was lost.  Fix that.  Also, the Thai shaper was
+    copied from Hangul, so had the fully-composed normalization behavior,
+    which was unnecessary.  So, fix that too.
+
+ src/hb-ot-shape-complex-arabic.cc  |  2 +-
+ src/hb-ot-shape-complex-indic.cc   |  4 +---
+ src/hb-ot-shape-complex-misc.cc    | 12 +++++++++---
+ src/hb-ot-shape-complex-private.hh |  9 ++++-----
+ src/hb-ot-shape.cc                 |  4 +++-
+ 5 files changed, 18 insertions(+), 13 deletions(-)
+
+commit 7afb14407e59dfeaa79c33aca1ffa60e7982e349
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 13:54:46 2012 -0400
+
+    [Indic] Recategorize Telugu length marks
+
+    Fixes 8 more Telugu tests.  Failures at 15 (0.00154548%).
+
+ src/hb-unicode.cc |  8 ++++++++
+ src/indic.cc      | 11 ++++++++---
+ 2 files changed, 16 insertions(+), 3 deletions(-)
+
+commit 70b3dc327232b20051b36397aa2b196ab8c62397
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 12:40:18 2012 -0400
+
+    Add Hebrew test
+
+ .../texts/in-tree/shaper-default/script-hebrew/misc/diacritics.txt
+ | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f2377155e35c15919af4d7db21b6edc6783146b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 10:50:57 2012 -0400
+
+    [hb-old] Fix misc leaks
+
+    Backport (forward-port?!) from upstream:
+
+    commit 3ab7b37bdebf0f8773493a1fee910b151c4de30f
+    Author: Behdad Esfahbod <behdad@behdad.org>
+    Date:   Mon Jul 30 10:50:22 2012 -0400
+
+        Fix misc leaks
+
+        https://bugs.freedesktop.org/show_bug.cgi?id=31992
+        https://bugs.freedesktop.org/show_bug.cgi?id=31993
+        https://bugs.freedesktop.org/show_bug.cgi?id=31994
+        https://bugs.freedesktop.org/show_bug.cgi?id=31995
+
+ src/hb-old/harfbuzz-arabic.c  | 12 +++++++++---
+ src/hb-old/harfbuzz-gpos.c    |  6 +++---
+ src/hb-old/harfbuzz-gsub.c    |  6 +++---
+ src/hb-old/harfbuzz-tibetan.c |  1 +
+ 4 files changed, 16 insertions(+), 9 deletions(-)
+
+commit 3f4764bb56bb7e42ba8859f1905810bd2f998838
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 10:06:42 2012 -0400
+
+    Don't lock user_data set during destruction if empty
+
+ src/hb-private.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 4ba647eecf0f70917ac4229af1f2dd3c62fcb7d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 09:53:06 2012 -0400
+
+    Fix leak
+
+ src/hb-ot-shape.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit f860366456d9e59b139a940da6d89c3c4fb9e96e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 02:38:39 2012 -0400
+
+    [OT] Gain back some lost speed
+
+ src/hb-ot-layout-private.hh        | 27 +++++++++++++++-
+ src/hb-ot-layout.cc                | 63
+ ++++++++++++++++++++++++++++++++++----
+ src/hb-ot-map-private.hh           | 26 +++-------------
+ src/hb-ot-map.cc                   | 35 +++++++++++++++------
+ src/hb-ot-shape-complex-indic.cc   |  2 +-
+ src/hb-ot-shape-complex-private.hh |  5 ---
+ 6 files changed, 114 insertions(+), 44 deletions(-)
+
+commit 11f4c87d01924cac43bf40044f67838440e19e42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 02:36:46 2012 -0400
+
+    [OT] Remove hb_ot_layout_ensure()
+
+    I didn't like it from the beginning.
+
+ src/hb-ot-layout.cc | 9 +++++----
+ src/hb-ot-layout.h  | 5 -----
+ 2 files changed, 5 insertions(+), 9 deletions(-)
+
+commit 578e42182b9b9cf15b4c5426fae36e224160cbd7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 02:35:07 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-private.hh | 2 --
+ src/hb-ot-layout.cc         | 1 -
+ 2 files changed, 3 deletions(-)
+
+commit a973b5ce86051e8ef0d20df362db1a50488842ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 01:46:34 2012 -0400
+
+    [GSUB] Further adjustments to mark-attachment vs ligation interaction
+
+    The d1d69ec52e75a78575b620a1c456d528b6078170 change broke Kannada
+    badly,
+    since it was ligating consonants, pushing matra out, and then ligating
+    with the matra.  Adjust for that.  See comments.
+
+ src/hb-ot-layout-gsub-table.hh                                |
+ 11 ++++++++---
+ .../in-tree/shaper-indic/indic/script-kannada/misc/misc.txt   |  1 +
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+commit 0aef425e25e2c58445157057f17ef18f695c5240
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 00:55:15 2012 -0400
+
+    [GSUB] Minor
+
+ src/hb-ot-layout-gpos-table.hh | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+commit d1d69ec52e75a78575b620a1c456d528b6078170
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 00:51:47 2012 -0400
+
+    [GSUB] Don't ligate glyphs attached to different components of
+    ligatures
+
+    This concludes the mark-attachment vs ligating interaction fixes
+    (for now).
+
+ src/hb-ot-layout-gsub-table.hh | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit 4751dec8be05883483fd5f6b474ebd22583ae566
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 00:42:07 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-private.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit f24bcfbed1f3b4f4f6311246bd870f73ad6ba750
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 00:39:00 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-gsub-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fe20c0f84f5ff518dc471bf22ac5a83ef079eb69
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 30 00:00:59 2012 -0400
+
+    [GSUB] Fix mark component stuff when ligatures form ligatures!
+
+    See comments.
+
+    Fixes https://bugzilla.gnome.org/show_bug.cgi?id=437633
+
+ src/hb-ot-layout-gsub-table.hh       | 117
+ +++++++++++++++++++++++------------
+ src/hb-ot-layout-gsubgpos-private.hh |   8 ---
+ src/hb-ot-layout-private.hh          |   8 +--
+ 3 files changed, 79 insertions(+), 54 deletions(-)
+
+commit 2ec3ba46a3c24469096e901750e38f6ee555479a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 29 22:02:24 2012 -0400
+
+    [GSUB/GPOS] Minor
+
+    Start squeezing more out of lig_id/lig_comp.
+
+ src/hb-ot-layout-gsub-table.hh |  6 +++---
+ src/hb-ot-layout-private.hh    | 35 +++++++++++++++++++++++++++++++----
+ 2 files changed, 34 insertions(+), 7 deletions(-)
+
+commit ef6e9cec3399e4f63f4b662abd77cf6d4683e8a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 29 21:35:22 2012 -0400
+
+    Fixup bb0e4ba3e9c5a407fc5d73c914e429d24d336380
+
+ src/hb-shape-plan.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cb3d34063154bf164c61eeba41c6166b0bd304fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 29 20:37:38 2012 -0400
+
+    [GSUB] Don't set new lig_id on mark ligatures
+
+    If two marks form a ligature, retain their previous lig_id, such that
+    the mark ligature can attach to ligature components...
+
+    Fixes https://bugzilla.gnome.org/show_bug.cgi?id=676343
+
+    In fact, I noticed that we should not let ligatures form between
+    glyphs
+    coming from different components of a previous ligature.  For example,
+    if the sequence is: LAM,SHADDA,LAM,FATHA,HEH, the LAM,LAM,HEH form a
+    ligature, putting SHADDA and FATHA next to eachother.  However,
+    it would
+    be wrong to ligate them.  Uniscribe has this bug also.
+
+ src/hb-ot-layout-gsub-table.hh | 18 ++++++++++++++----
+ 1 file changed, 14 insertions(+), 4 deletions(-)
+
+commit 97a201becf936f62046914b568e5763e27ee936e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 29 20:31:36 2012 -0400
+
+    Add Arabic tests for mark ligature component attachments
+
+ .../script-arabic/misc/diacritics/MANIFEST             |  1 +
+ .../misc/diacritics/ligature-components.txt            | 18
+ ++++++++++++++++++
+ 2 files changed, 19 insertions(+)
+
+commit a15b70a81a609f024083cb04f9819483f4d5cab7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 29 20:09:22 2012 -0400
+
+    [hb-old] Fix cluster formation in RTL
+
+    Unlike Uniscribe, hb-old returns glyphs in logical order, so the logic
+    does not need to duplicated for RTL.
+
+ src/hb-old.cc | 12 +++---------
+ 1 file changed, 3 insertions(+), 9 deletions(-)
+
+commit 8a7e70ef65952fc16b8c1d5f1126c94d9d81e755
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 29 19:56:54 2012 -0400
+
+    [Minor]
+
+ src/test.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bb0e4ba3e9c5a407fc5d73c914e429d24d336380
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 29 17:34:14 2012 -0400
+
+    Minor
+
+ src/hb-shape-plan.cc         | 2 +-
+ src/test-would-substitute.cc | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit a00ad60bc0fe74bf0e11d73da563239f3392f351
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 28 21:16:08 2012 -0400
+
+    [Uniscribe] Remove hb_uniscribe_font_ensure()
+
+    Wasn't a huge fan of putting the burden on the user.  Just remove
+    it and
+    do what we've got to do transparently.
+
+ src/hb-uniscribe.cc | 6 +++++-
+ src/hb-uniscribe.h  | 4 ----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 5d874d566fe5d2cc4cfaf02c79b663d8a626ca1e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 28 21:05:25 2012 -0400
+
+    [GPOS] Fix mark-to-mark positioning when one of the marks is
+    a ligature
+
+    This commit: a3313e54008167e415b72c780ca7b9cda958d07e broke
+    MarkMarkPos
+    when one of the marks itself is a ligature.  That regressed 26 Tibetan
+    tests (up from zero!).  Fix that.  Tibetan back to zero.
+
+ src/hb-ot-layout-gpos-table.hh                     | 27
+ ++++++++++++++++------
+ src/hb-ot-layout-private.hh                        |  5 ++--
+ test/shaping/texts/in-tree/shaper-indic/MANIFEST   |  1 +
+ .../indic/script-sinhala/misc/MANIFEST             |  1 +
+ .../in-tree/shaper-indic/south-asian/MANIFEST      |  1 +
+ .../south-asian/script-tibetan/MANIFEST            |  1 +
+ .../south-asian/script-tibetan/misc/MANIFEST       |  1 +
+ .../south-asian/script-tibetan/misc/misc.txt       |  1 +
+ 8 files changed, 29 insertions(+), 9 deletions(-)
+
+commit 338fe662b50f9309bf0050dd99becb644874195b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 28 18:53:01 2012 -0400
+
+    [GSUB] Minor
+
+ src/hb-ot-layout-gsub-table.hh | 33 ++++++++++++++++-----------------
+ 1 file changed, 16 insertions(+), 17 deletions(-)
+
+commit e6f7479fe34fb4a7cada61d84c2ed70d1fd565c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 28 18:34:58 2012 -0400
+
+    [GSUB] Simplify would-apply
+
+ src/hb-ot-layout-gsub-table.hh       | 71
+ +++---------------------------------
+ src/hb-ot-layout-gsubgpos-private.hh | 24 +++---------
+ 2 files changed, 11 insertions(+), 84 deletions(-)
+
+commit dadede012e4841f9fcb70d514fdc752f3ea4663d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 28 18:03:20 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 7 +++----
+ src/hb-ot-layout-gpos-table.hh     | 2 +-
+ src/hb-ot-layout-gsub-table.hh     | 2 +-
+ 3 files changed, 5 insertions(+), 6 deletions(-)
+
+commit 0b99429ead05ae32b3c210cb499af401b02770a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 28 17:31:01 2012 -0400
+
+    [GSUB/GPOS] Add get_coverage() and use it to speed up main loop
+
+    And use it to speed up the hotspot by checking coverage directly in
+    the main loop, not 10 functions deep in.
+
+    Gives me a solid 20% boost with Indic test suite.  Less so for less
+    lookup-intensive scenarios.
+
+    Remove the "fast_path" hack from before.
+
+ src/hb-ot-layout-gpos-table.hh       | 179
+ ++++++++++++++++++++++++++++++-----
+ src/hb-ot-layout-gsub-table.hh       | 166
+ ++++++++++++++++++++++++++------
+ src/hb-ot-layout-gsubgpos-private.hh |  26 +++++
+ 3 files changed, 321 insertions(+), 50 deletions(-)
+
+commit 30ec9002d84e8b49290e782e6192069821ffa942
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 28 17:25:20 2012 -0400
+
+    Reject lookups with no subTable
+
+ src/hb-ot-layout-common-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0981068b75710397f08e0d2d776a0a2ea68d7117
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 28 17:01:59 2012 -0400
+
+    [GSUB/GPOS] Reject Context/ChainContext lookups with zero input
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 2f87cebe1062c7007021ebd05c1664e60da80825
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 27 04:02:38 2012 -0400
+
+    Implement shape_plan caching
+
+    Should give us some performance boost.
+
+ TODO                     |   4 ++
+ src/hb-buffer-private.hh |  30 ++++++++++++++
+ src/hb-font-private.hh   |   6 +++
+ src/hb-font.cc           |  15 ++++++-
+ src/hb-shape-plan.cc     | 100
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-shape-plan.h      |   7 ++++
+ src/hb-shape.cc          |   2 +-
+ 7 files changed, 162 insertions(+), 2 deletions(-)
+
+commit e9eb9503e97044222f843daacfa47e26e51312b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 27 03:16:22 2012 -0400
+
+    Add default_shaper_list to shape_plan
+
+ src/hb-shape-plan-private.hh | 1 +
+ src/hb-shape-plan.cc         | 2 ++
+ 2 files changed, 3 insertions(+)
+
+commit 3b7c4e270694ed962e2a2839e44f2a59c26b326c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 27 03:12:23 2012 -0400
+
+    Don't fail choosing shaper on planning failure
+
+    Shapers have a chance to reject a font in face shaper_data creation.
+    No need to allow failing during planning.
+
+ src/hb-shape-plan.cc | 17 ++++++-----------
+ 1 file changed, 6 insertions(+), 11 deletions(-)
+
+commit cfe9882610489e1b917e09a74dfbf6bbba2e4a57
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 27 03:06:30 2012 -0400
+
+    Add hb_ot_layout_ensure() and hb_uniscribe_font_ensure()
+
+ src/hb-ot-layout.cc      |  7 +++++++
+ src/hb-ot-layout.h       |  6 ++++++
+ src/hb-shape-plan.cc     | 22 ++--------------------
+ src/hb-shaper-private.hh | 18 ++++++++++++++++++
+ src/hb-uniscribe.cc      | 11 +++++++++++
+ src/hb-uniscribe.h       |  4 ++++
+ 6 files changed, 48 insertions(+), 20 deletions(-)
+
+commit c5b668fb9239c912d2448280a7176e331ebc9181
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 27 02:49:39 2012 -0400
+
+    Choose one shaper per plan
+
+ src/hb-shape-plan-private.hh |  2 +-
+ src/hb-shape-plan.cc         | 19 +++++++++----------
+ 2 files changed, 10 insertions(+), 11 deletions(-)
+
+commit e82061e8db922f0ddbefd5a184ee2f9f967b9a05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 27 02:29:32 2012 -0400
+
+    Move ot shaper completely to shape_plan
+
+ src/hb-ot-shape-private.hh |   6 --
+ src/hb-ot-shape.cc         | 181
+ +++++++++++++++++++++------------------------
+ src/hb-uniscribe.cc        |   2 +-
+ 3 files changed, 84 insertions(+), 105 deletions(-)
+
+commit ea278d3895fe0c92801d692cd71d8d9f1de7c048
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 27 02:12:28 2012 -0400
+
+    Partially switch ot shaper to shape_plan
+
+ src/hb-buffer-private.hh       |  1 +
+ src/hb-buffer.cc               |  1 -
+ src/hb-font-private.hh         |  2 --
+ src/hb-font.cc                 | 22 ++++++++++++++--------
+ src/hb-ot-layout-gpos-table.hh |  2 +-
+ src/hb-ot-layout-gsub-table.hh |  4 ++--
+ src/hb-ot-layout-private.hh    |  1 +
+ src/hb-ot-layout.cc            |  9 ++++++---
+ src/hb-ot-shape.cc             |  3 ++-
+ src/hb-shape-plan.cc           | 11 +++++++++++
+ src/hb-shaper-private.hh       |  3 ++-
+ 11 files changed, 40 insertions(+), 19 deletions(-)
+
+commit b6b7ba1313bf686e6ed567183466104c90504a67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 27 01:26:11 2012 -0400
+
+    Switch old and uniscribe backends to shape_plan
+
+ src/hb-old.cc                 |  80 ++------------------------
+ src/hb-shape.cc               |   5 ++
+ src/hb-shaper-impl-private.hh |   3 +-
+ src/hb-shaper-private.hh      |   4 --
+ src/hb-uniscribe.cc           | 130
+ ++++++++++++------------------------------
+ 5 files changed, 48 insertions(+), 174 deletions(-)
+
+commit c32c096a429da3e64896cf42ff5ab8c775d3c2ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 27 01:13:53 2012 -0400
+
+    Switch to shape_plan
+
+    Not optimized yet.  Eats babies.  And no shaper uses the shape_plan.
+
+ src/hb-shape-plan.cc | 37 +++++++++++++++++++++++++++++++++++--
+ src/hb-shape-plan.h  |  8 ++++++++
+ src/hb-shape.cc      | 27 ++++-----------------------
+ 3 files changed, 47 insertions(+), 25 deletions(-)
+
+commit 5b95c148cc485f79fd7018bc4520b4cb5f728a18
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 26 23:46:53 2012 -0400
+
+    Start implementing shape_plan
+
+ src/hb-fallback-shape.cc     |  4 ++-
+ src/hb-font-private.hh       |  4 +++
+ src/hb-old.cc                |  4 ++-
+ src/hb-ot-shape.cc           |  4 ++-
+ src/hb-shape-plan-private.hh |  7 ++++
+ src/hb-shape-plan.cc         | 76
+ ++++++++++++++++++++++++++++++++++++++++++--
+ src/hb-shape.cc              |  4 +++
+ src/hb-shaper-private.hh     |  4 +--
+ src/hb-uniscribe.cc          |  4 ++-
+ 9 files changed, 103 insertions(+), 8 deletions(-)
+
+commit bd26b4d21f59312805d294f46f15182adbcc47da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 26 22:05:39 2012 -0400
+
+    Minor
+
+ src/Makefile.am              |   1 +
+ src/hb-fallback-shape.cc     |   3 +-
+ src/hb-old.cc                |   3 +-
+ src/hb-ot-shape.cc           |   3 +-
+ src/hb-shape-plan-private.hh |   2 +-
+ src/hb-shape-plan.cc         |   2 +
+ src/hb-shape.cc              |  98 ++++----------------------------------
+ src/hb-shaper-private.hh     |  16 ++++++-
+ src/hb-shaper.cc             | 109
+ +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-uniscribe.cc          |   3 +-
+ 10 files changed, 145 insertions(+), 95 deletions(-)
+
+commit 027857d0412477fb4427dcb8a8c45287c272e143
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 26 17:34:25 2012 -0400
+
+    Start adding a unified shaper access infrastructure
+
+    Add global shape_plan.  Unused so far.
+
+ src/Makefile.am                                    |  15 +-
+ src/hb-coretext-private.hh                         |  42 -----
+ src/hb-coretext.cc                                 |   6 +-
+ src/hb-fallback-shape.cc                           |  62 ++++++-
+ src/hb-font-private.hh                             |  12 ++
+ src/hb-font.cc                                     |  15 +-
+ src/hb-old.cc                                      | 109 +++++++++---
+ src/hb-ot-shape-private.hh                         |   8 -
+ src/hb-ot-shape.cc                                 |  60 ++++++-
+ ...aphite2-private.hh => hb-shape-plan-private.hh} |  28 +++-
+ src/hb-shape-plan.cc                               |  85 ++++++++++
+ ...b-fallback-shape-private.hh => hb-shape-plan.h} |  39 +++--
+ src/hb-shape.cc                                    |  48 +-----
+ ...scribe-private.hh => hb-shaper-impl-private.hh} |  20 ++-
+ src/{hb-old-private.hh => hb-shaper-list.hh}       |  30 ++--
+ src/hb-shaper-private.hh                           |  81 +++++++++
+ src/hb-uniscribe.cc                                | 186
+ +++++++++++++--------
+ 17 files changed, 608 insertions(+), 238 deletions(-)
+
+commit fa2dfcd560444d8c54b6349ee106134d3536f79b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 26 16:06:16 2012 -0400
+
+    Fix visibility warnings with MinGW32
+
+ src/hb-old/harfbuzz-global.h | 17 +++++++++++------
+ src/hb-old/harfbuzz-impl.h   |  6 +++++-
+ 2 files changed, 16 insertions(+), 7 deletions(-)
+
+commit ac2085d4b391b0a72473ecac3dd6c22efe66833f
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Thu Jul 26 15:58:45 2012 -0400
+
+    [CoreText] Ensure cluster indices in output buffer are non-decreasing.
+
+    Does not provide Uniscribe-compatible results, but should at least
+    avoid
+    breaking hb-view due to out-of-order cluster values.
+
+    For RTL runs, ensure cluster values are non-increasing (instead of
+    non-decreasing).
+
+ src/hb-coretext.cc | 37 +++++++++++++++++++++++++++++++++++++
+ 1 file changed, 37 insertions(+)
+
+commit 441d3bb7de311d54b9f0a5210344f9a96e97e153
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 26 12:01:12 2012 -0400
+
+    Minor
+
+ src/hb-coretext.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2e7f223054d310695bdb3498b2b2b5d17b6cce78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 25 19:30:15 2012 -0400
+
+    [hb-old] Fix Arabic cursive positioning
+
+    Backporting from upstream:
+
+    commit b847f24ce855d24f6822bcd9c0006905e81b94d8
+    Author: Behdad Esfahbod <behdad@behdad.org>
+    Date:   Wed Jul 25 19:29:16 2012 -0400
+
+        [arabic] Fix Arabic cursive positioning
+
+        This was clearly broken in testing.  Who knows...  Fixes for me.
+        Test with a Nastaleeq font, or with Arabic Typesetting.
+
+        Backporting from Chromium.
+
+ src/hb-old/harfbuzz-shaper.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9550a8c4e8b4e28be60d38c27d59253846ff9569
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 25 19:22:57 2012 -0400
+
+    [hb-old] Fixup not-enough-space handling
+
+ src/hb-old.cc | 15 ++++++++-------
+ 1 file changed, 8 insertions(+), 7 deletions(-)
+
+commit 91e721ea8693205f4f738bca97a5055ee75cf463
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 25 19:20:34 2012 -0400
+
+    [hb-old] Fix clusters
+
+    Unlike its "documentation", hb-old's log_clusters are, well, indeed
+    logical, not visual.  Fixup.  Adapted / copied from hb-uniscribe.
+
+ src/hb-old.cc                | 51
+ ++++++++++++++++++++++++++++++++++----------
+ src/hb-old/harfbuzz-shaper.h |  1 +
+ src/hb-uniscribe.cc          |  5 +++--
+ 3 files changed, 44 insertions(+), 13 deletions(-)
+
+commit a3313e54008167e415b72c780ca7b9cda958d07e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 25 18:37:51 2012 -0400
+
+    [GPOS] Fix MarkMarkPos applied to results of MultipleSubst
+
+    This was broken as a result of
+    7b84c536c10ab90ed96a033d88e9ad232d46c5b8.
+    As Khaled reported, MarkMark positioning was broken with glyphs
+    resulting from a MultipleSubst.  Fixed.  Test with the ALLAH character
+    in Amiri.
+
+ src/hb-ot-layout-gpos-table.hh | 10 +++++-----
+ src/hb-ot-layout-private.hh    | 23 +++++++++++++++++++++--
+ 2 files changed, 26 insertions(+), 7 deletions(-)
+
+commit 35bdab3cf1f0836807160e3ce93766c321b32e8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 25 11:59:52 2012 -0400
+
+    Minor
+
+ src/hb-unicode-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8fe4c7405b922cf0f936a46a9baedf4885b05254
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 21:05:12 2012 -0400
+
+    [hb-old] Add HarfBuzz.old shaper
+
+    Choose using shaper name "old".
+
+ configure.ac           |   8 +
+ src/Makefile.am        |  14 +-
+ src/hb-old-private.hh  |  40 +++
+ src/hb-old.cc          | 369 ++++++++++++++++++++++++
+ src/hb-old/.gitignore  |   7 -
+ src/hb-old/Makefile.am |   2 +
+ src/hb-old/Makefile.in | 762
+ -------------------------------------------------
+ src/hb-shape.cc        |   8 +-
+ 8 files changed, 436 insertions(+), 774 deletions(-)
+
+commit 5e1987005eb1b9af7a4d3d9f90c5768d8cc80015
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 19:53:55 2012 -0400
+
+    [hb-old] Define Unicode funcs in terms of new HarfBuzz
+
+ src/hb-old/Makefile.am         |   4 +
+ src/hb-old/Makefile.in         | 182
+ ++++++++++++++++++++++++++++++++++++-----
+ src/hb-old/harfbuzz-external.h | 100 +++++++++++++---------
+ 3 files changed, 224 insertions(+), 62 deletions(-)
+
+commit 4a31166b2853c1ec052844140e114158f47c2355
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 19:49:48 2012 -0400
+
+    [hb-old] Shovel out the line-breaking / word-segmentation stuff
+
+ src/hb-old/Makefile.am               |  10 +-
+ src/hb-old/Makefile.in               |  13 +-
+ src/hb-old/harfbuzz-external.h       |  66 ------
+ src/hb-old/harfbuzz-indic.cpp        |  26 ---
+ src/hb-old/harfbuzz-khmer.c          |  25 ---
+ src/hb-old/harfbuzz-myanmar.c        |  28 ---
+ src/hb-old/harfbuzz-shaper-private.h |  12 --
+ src/hb-old/harfbuzz-shaper.cpp       | 403
+ +++--------------------------------
+ src/hb-old/harfbuzz-shaper.h         |  31 ---
+ src/hb-old/harfbuzz-thai.c           | 111 ----------
+ src/hb-old/harfbuzz-tibetan.c        |  26 ---
+ src/hb-old/harfbuzz.c                |  32 ---
+ 12 files changed, 33 insertions(+), 750 deletions(-)
+
+commit 0bcbe88cf313117f739b98a11dbe698b75784e9d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 19:38:24 2012 -0400
+
+    [hb-old] Add visibility attributes
+
+ src/hb-old/harfbuzz-global.h | 10 ++++++----
+ src/hb-old/harfbuzz-impl.h   |  2 +-
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+commit 6a9d43c3178c920672a84382ca3797e3c478b2b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 19:21:22 2012 -0400
+
+    [hb-old] Remove unused header file
+
+ src/hb-old/harfbuzz-shape.h | 199
+ --------------------------------------------
+ 1 file changed, 199 deletions(-)
+
+commit fb47209c5b3aa992faf18d1a3f78b9d7682cf62f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 19:20:19 2012 -0400
+
+    [hb-old] Rename hb_buffer_* to HB_Buffer_*
+
+ src/hb-old/harfbuzz-buffer.c   | 22 +++++++++++-----------
+ src/hb-old/harfbuzz-buffer.h   |  8 ++++----
+ src/hb-old/harfbuzz-shaper.cpp |  8 ++++----
+ 3 files changed, 19 insertions(+), 19 deletions(-)
+
+commit 1512a7357513b72e2a07dda706a176bb23d694e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 19:16:56 2012 -0400
+
+    [hb-old] Start adding HarfBuzz-old as a new backend
+
+ configure.ac                         |    1 +
+ src/Makefile.am                      |    5 +
+ src/hb-old/.gitignore                |    7 +
+ src/hb-old/COPYING                   |   24 +
+ src/hb-old/Makefile.am               |   56 +
+ src/hb-old/Makefile.in               |  631 ++++
+ src/hb-old/README                    |    7 +
+ src/hb-old/harfbuzz-arabic.c         | 1144 +++++++
+ src/hb-old/harfbuzz-buffer-private.h |  107 +
+ src/hb-old/harfbuzz-buffer.c         |  383 +++
+ src/hb-old/harfbuzz-buffer.h         |  102 +
+ src/hb-old/harfbuzz-external.h       |  151 +
+ src/hb-old/harfbuzz-gdef-private.h   |  135 +
+ src/hb-old/harfbuzz-gdef.c           | 1163 +++++++
+ src/hb-old/harfbuzz-gdef.h           |  140 +
+ src/hb-old/harfbuzz-global.h         |  118 +
+ src/hb-old/harfbuzz-gpos-private.h   |  729 ++++
+ src/hb-old/harfbuzz-gpos.c           | 6094
+ ++++++++++++++++++++++++++++++++++
+ src/hb-old/harfbuzz-gpos.h           |  155 +
+ src/hb-old/harfbuzz-greek.c          |  447 +++
+ src/hb-old/harfbuzz-gsub-private.h   |  483 +++
+ src/hb-old/harfbuzz-gsub.c           | 4329 ++++++++++++++++++++++++
+ src/hb-old/harfbuzz-gsub.h           |  148 +
+ src/hb-old/harfbuzz-hangul.c         |  268 ++
+ src/hb-old/harfbuzz-hebrew.c         |  187 ++
+ src/hb-old/harfbuzz-impl.c           |   84 +
+ src/hb-old/harfbuzz-impl.h           |  131 +
+ src/hb-old/harfbuzz-indic.cpp        | 1894 +++++++++++
+ src/hb-old/harfbuzz-khmer.c          |  667 ++++
+ src/hb-old/harfbuzz-myanmar.c        |  539 +++
+ src/hb-old/harfbuzz-open-private.h   |  102 +
+ src/hb-old/harfbuzz-open.c           | 1433 ++++++++
+ src/hb-old/harfbuzz-open.h           |  288 ++
+ src/hb-old/harfbuzz-shape.h          |  199 ++
+ src/hb-old/harfbuzz-shaper-all.cpp   |   37 +
+ src/hb-old/harfbuzz-shaper-private.h |  171 +
+ src/hb-old/harfbuzz-shaper.cpp       | 1338 ++++++++
+ src/hb-old/harfbuzz-shaper.h         |  294 ++
+ src/hb-old/harfbuzz-stream-private.h |   81 +
+ src/hb-old/harfbuzz-stream.c         |  114 +
+ src/hb-old/harfbuzz-stream.h         |   51 +
+ src/hb-old/harfbuzz-thai.c           |  111 +
+ src/hb-old/harfbuzz-tibetan.c        |  274 ++
+ src/hb-old/harfbuzz.c                |   32 +
+ src/hb-old/harfbuzz.h                |   38 +
+ 45 files changed, 24892 insertions(+)
+
+commit 478fd0529b868b22905a9dedf331ac7cc9721723
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 17:09:01 2012 -0400
+
+    Minor
+
+ src/hb-unicode-private.hh | 27 ++++++++++++++-------------
+ 1 file changed, 14 insertions(+), 13 deletions(-)
+
+commit 8979a7f6f2b44ade4c0198a31ae08561b35ce009
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 17:03:55 2012 -0400
+
+    [Mongolian] Remove Mongolian Vowel Separator at the end of shaping
+
+    Results match Uniscribe now.
+
+ src/hb-unicode-private.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit aa6d849838d5231465ae1a25a4dd5ea1e9380ff9
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Tue Jul 24 15:52:32 2012 -0400
+
+    [CoreText] Add basic Core Text backend for comparison with our
+    native shaping
+
+    Does not attempt to handle clusters in a Uniscribe- or
+    HarfBuzz-compatible way;
+    just returns the original string indexes that CT maintains. These
+    may even be
+    out-of-order in the case of reordrant glyphs.
+
+ configure.ac               |  12 ++
+ src/Makefile.am            |   7 +
+ src/hb-coretext-private.hh |  42 ++++++
+ src/hb-coretext.cc         | 323
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-coretext.h          |  43 ++++++
+ src/hb-shape.cc            |   6 +
+ 6 files changed, 433 insertions(+)
+
+commit ec8d2494694275dfbbac2dd0d33ca2894b0463d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 15:40:37 2012 -0400
+
+    Make data members of various OpenType structs protected instead
+    of private
+
+    Should fix warnings generated when building with
+    -Wunused-private-field.
+    Based on patch from Jonathan Kew.
+
+ src/hb-open-file-private.hh          |  8 +++---
+ src/hb-ot-head-table.hh              |  2 +-
+ src/hb-ot-hhea-table.hh              |  2 +-
+ src/hb-ot-hmtx-table.hh              |  2 +-
+ src/hb-ot-layout-common-private.hh   | 14 ++++++-----
+ src/hb-ot-layout-gdef-table.hh       | 20 +++++++--------
+ src/hb-ot-layout-gpos-table.hh       | 48
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gsub-table.hh       | 30 +++++++++++-----------
+ src/hb-ot-layout-gsubgpos-private.hh | 32 ++++++++++++------------
+ src/hb-ot-maxp-table.hh              |  2 +-
+ src/hb-ot-name-table.hh              |  2 +-
+ 11 files changed, 82 insertions(+), 80 deletions(-)
+
+commit 97aa0b738a33b73a3f9763dd2950f2dd39f596ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 15:02:34 2012 -0400
+
+    Minor const correctness shuffling
+
+ src/hb-shape.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 6411e74caf23af7b0545f1fe54d19a1c8da895e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 13:48:49 2012 -0400
+
+    [Indic] Reposition Gurmukhi top matras to after post
+
+    The font is forming a post-base consonant in some samples, and
+    Uniscribe
+    positions top matra on the post-base.  Do the same.
+
+    Gurmukhi failures down from 59 to 41 (0.0674242%).
+
+ src/hb-ot-shape-complex-indic.cc                                        |
+ 2 +-
+ .../texts/in-tree/shaper-indic/indic/script-gurmukhi/misc/misc.txt      |
+ 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit c3f769ba09df319fa69d04f68c57444f95eceee6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 13:26:32 2012 -0400
+
+    [Indic] Ignore Uniscribe output containing two zero-width space glyphs
+
+    Uniscribe is buggy and sometimes /eats/ a mark next to a non-joiner.
+    Most of Malayalam failures where actually hitting this bug.
+
+    Ignore test output with two zero-width space glyphs.  This is a hack
+    until we build up the test suite infrastructure better.
+
+    Bengali went down by 9, Devanagari by 2, Kannada by 130, Malayalm down
+    from 1197 to 307, Sinhala down by 16, Telugu down by 26.  New stats:
+
+    BENGALI: 353996 out of 354285 tests passed. 289 failed (0.0815727%)
+    DEVANAGARI: 693573 out of 693628 tests passed. 55 failed (0.00792932%)
+    GUJARATI: 366489 out of 366506 tests passed. 17 failed (0.0046384%)
+    GURMUKHI: 60750 out of 60809 tests passed. 59 failed (0.0970251%)
+    KANNADA: 951086 out of 951913 tests passed. 827 failed (0.0868777%)
+    KHMER: 299094 out of 299124 tests passed. 30 failed (0.0100293%)
+    MALAYALAM: 1048109 out of 1048416 tests passed. 307 failed
+    (0.0292823%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271715 out of 271847 tests passed. 132 failed (0.0485567%)
+    TAMIL: 1091837 out of 1091837 tests passed. 0 failed (0%)
+    TELUGU: 970550 out of 970573 tests passed. 23 failed (0.00236973%)
+
+ test/shaping/hb_test_tools.py                                           |
+ 1 +
+ .../texts/in-tree/shaper-indic/indic/script-malayalam/misc/misc.txt     |
+ 2 ++
+ 2 files changed, 3 insertions(+)
+
+commit 65c43accdc4d2082282d5cedba8514b8df0c18a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 03:36:47 2012 -0400
+
+    [Indic] Better position left-matra in Malayalam
+
+    Just put it before base, which is what's expected.
+
+    Malayalam failures down from 1559 to 1197 (0.114172%).
+
+    BENGALI: 353988 out of 354285 tests passed. 297 failed (0.0838308%)
+    DEVANAGARI: 693571 out of 693628 tests passed. 57 failed (0.00821766%)
+    GUJARATI: 366489 out of 366506 tests passed. 17 failed (0.0046384%)
+    GURMUKHI: 60750 out of 60809 tests passed. 59 failed (0.0970251%)
+    KANNADA: 950956 out of 951913 tests passed. 957 failed (0.100534%)
+    KHMER: 299094 out of 299124 tests passed. 30 failed (0.0100293%)
+    MALAYALAM: 1047219 out of 1048416 tests passed. 1197 failed
+    (0.114172%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271699 out of 271847 tests passed. 148 failed (0.0544424%)
+    TAMIL: 1091837 out of 1091837 tests passed. 0 failed (0%)
+    TELUGU: 970524 out of 970573 tests passed. 49 failed (0.00504856%)
+
+ src/hb-ot-shape-complex-indic.cc                   | 41
+ +++++++++++++++-------
+ .../indic/script-malayalam/misc/misc.txt           |  1 +
+ 2 files changed, 29 insertions(+), 13 deletions(-)
+
+commit 88f413b56f2858d149e2fc067685aeecaea779ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 03:04:36 2012 -0400
+
+    [Indic] Implement Reph+Ya-Phalaa interaction
+
+    The sequence Ra,H,Ya in Bengali is ambigious and Unicode encoded
+    that to
+    get Ya-Phalaa, one would place ZWJ before Halant.  Ie. a ZWJ,H
+    sequence
+    requests subjoining, while a H,ZWJ requests Half form.  Implement
+    that.
+
+    Bengali failures go down from 377 to 297 (0.0838308%).
+    Gujarati is down by 4 to 17 (0.0046384%).
+    Kannada is down by 226 to 957 (0.100534%).
+
+    Current status:
+
+    BENGALI: 353988 out of 354285 tests passed. 297 failed (0.0838308%)
+    DEVANAGARI: 693571 out of 693628 tests passed. 57 failed (0.00821766%)
+    GUJARATI: 366489 out of 366506 tests passed. 17 failed (0.0046384%)
+    GURMUKHI: 60750 out of 60809 tests passed. 59 failed (0.0970251%)
+    KANNADA: 950956 out of 951913 tests passed. 957 failed (0.100534%)
+    KHMER: 299094 out of 299124 tests passed. 30 failed (0.0100293%)
+    MALAYALAM: 1046857 out of 1048416 tests passed. 1559 failed
+    (0.148701%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271699 out of 271847 tests passed. 148 failed (0.0544424%)
+    TAMIL: 1091837 out of 1091837 tests passed. 0 failed (0%)
+    TELUGU: 970524 out of 970573 tests passed. 49 failed (0.00504856%)
+
+ src/hb-ot-shape-complex-indic.cc                               |
+ 10 ++++++++--
+ .../in-tree/shaper-indic/indic/script-bengali/misc/reph.txt    |  4 ++++
+ 2 files changed, 12 insertions(+), 2 deletions(-)
+
+commit dff0ece11d61978c04e839501f179a5c3077f340
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 02:30:38 2012 -0400
+
+    [Indic] Limit matras to 4 per syllable
+
+    Also limit joiners.
+
+    This limits our syllable length to a constant, and is
+    closer to what Uniscribe does anyway.
+
+    Two Devanagari tests regressed, but who cares about tests with 20
+    joiners in a row?!  Devanagari at 57 (0.00821766%) now.
+
+ src/hb-ot-shape-complex-indic-machine.rl | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 330b329c8905a37ca88c556dea82c70d74c77458
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 02:25:26 2012 -0400
+
+    [Indic] Unmark U+17D1 KHMER SIGN VIRIAM to NOT be a Virama
+
+    Fixes another 1 Khmer failure.  Down to 30 (0.0100293%) now.
+
+ src/hb-ot-shape-complex-indic.cc                                        |
+ 2 ++
+ .../in-tree/shaper-indic/south-east-asian/script-khmer/misc/misc.txt    |
+ 1 +
+ 2 files changed, 3 insertions(+)
+
+commit 6824a7194e01b77eddb95bd95a9b32e219140912
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 02:22:18 2012 -0400
+
+    [Indic] Recategorize Khmer various signs as top matras
+
+    Khmer failures down from 39 to 31 (0.0103636%).
+
+ src/hb-ot-shape-complex-indic.cc | 23 ++++++++++-------------
+ 1 file changed, 10 insertions(+), 13 deletions(-)
+
+commit d90b8e841e0068a601c96ab184d18b0f48eec9d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 02:10:20 2012 -0400
+
+    [Indic] Reposition Khmer prebase-reordering Ra around split matras
+
+    In Khmer coeng model, a V,Ra can go *after* matras.  If it goes
+    after a
+    split matra, it should be reordered to *before* the left part of
+    such matra.
+
+    Khmer failures down from 136 to 39 (0.0130381%).
+
+ src/hb-ot-shape-complex-indic.cc                            | 13
+ +++++++++++++
+ .../south-east-asian/script-khmer/misc/misc.txt             |  4 ++++
+ 2 files changed, 17 insertions(+)
+
+commit 0afb84c12567ac35adac657bf8be29999b8c5a50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 01:44:47 2012 -0400
+
+    [Indic] Fix minor bug in pre-base Ra positioning
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7573799126e812a047daa5f64121ec959866b3c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 01:32:07 2012 -0400
+
+    [Indic] Position Khmer U+17CE
+
+    Fixes another 6 Khmer failures.  Now at 136 (0.0454661%).
+
+ src/hb-ot-shape-complex-indic.cc                                    |
+ 6 ++++++
+ .../shaper-indic/south-east-asian/script-khmer/misc/misc.txt        | 1 +
+ 2 files changed, 7 insertions(+)
+
+commit 8d00e8d0e7d10f823e6975fecaffb9d557b1a99a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 01:04:18 2012 -0400
+
+    [Indic] Don't reposition Khmer Bindu
+
+    Khmer Bindu doesn't like to move to syllable end.  Leave it where it
+    was.
+
+    Brings down Khmer failures from 510 to 142 (0.047572%).
+
+ src/hb-ot-shape-complex-indic.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 2278eefcdb3dd0d492b9d07176fbecc1f0516bb7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 00:26:43 2012 -0400
+
+    [Indic] In Sinhala, form forced Reph even if no other consonant found
+
+    Fixes another 10 Sinhala failures.  Down to 148 (0.0544424%).
+
+ src/hb-ot-shape-complex-indic.cc                               |
+ 10 +++++-----
+ .../in-tree/shaper-indic/indic/script-sinhala/misc/misc.txt    |  1 +
+ 2 files changed, 6 insertions(+), 5 deletions(-)
+
+commit 71fd5e80ad06c8e85a1112cc89e129d6cd03f82c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 00:21:16 2012 -0400
+
+    [Indic] Further adjust base algorithm for Sinhala
+
+    Apparently if there is C,V,ZWJ,C, the first C will be base, but if
+    it's C,ZWJ,V,C, the second one will be.
+
+    Note that Uniscribe implements this differently, by breaking
+    syllable in
+    the case of C,ZWJ,V,C and putting the first consonant in one syllable
+    and the rest in the next syllable.
+
+    Sinhala failures down from 208 to 158 (0.0581209%).  No changes to
+    Khmer.
+
+ src/hb-ot-shape-complex-indic.cc                              |
+ 11 +++++++----
+ .../in-tree/shaper-indic/indic/script-sinhala/misc/misc.txt   |  3 +++
+ 2 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 73d71cc527d28fd5519c5d965c272ea1fb149a0e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 24 00:09:12 2012 -0400
+
+    [Indic] End Vowel-based syllable at ZWJ
+
+    One Devanagari test regressed, plus 10 Malayalam (at 1545 now).
+
+    Fixed 120 Sinhala failures.  Now at 208 (0.0765136%).
+
+ src/hb-ot-shape-complex-indic-machine.rl                                |
+ 2 +-
+ .../texts/in-tree/shaper-indic/indic/script-sinhala/misc/misc.txt       |
+ 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 34c215036f5fcdc7599b1ab0591b56dbb3811902
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 23:51:29 2012 -0400
+
+    [Indic] Improve Sinhala base algorithm and reph positioning
+
+    Sinhala does not have half forms.  And most (all?) consonants can be
+    base, except when preceded by ZWJ, which would request a subjoined
+    form.
+    Hence switch the base algorithm to categorize with Khmer, start search
+    at start, and stop at a ZWJ.
+
+    Also, mark all pos=base consonants after base to be subjoined.  Mark
+    base itself to have pos=base.
+
+    Finally, adjust Sinhala's reph position to after-main.
+
+    Brings down Sinhala failures from 455 to 328 (0.120656%).
+
+ src/hb-ot-shape-complex-indic.cc                       | 18
+ +++++++++++++++++-
+ .../shaper-indic/indic/script-sinhala/misc/misc.txt    |  1 +
+ 2 files changed, 18 insertions(+), 1 deletion(-)
+
+commit 2ec934c6c25423e7af20d909a9c698a149808ea9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 23:49:04 2012 -0400
+
+    [Indic] Change "unknown" position to end of syllable
+
+ src/hb-ot-shape-complex-indic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b70021f7c81a0ed08475b14b07291f662cd9f905
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 20:18:17 2012 -0400
+
+    When removing zero-width marks, don't remove ligatures
+
+    If a mark ligated, it probably should NOT be removed.
+
+ src/hb-ot-shape.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 49c5ec51444f27f33e1eb6aa1959c61b08fa89c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 20:14:13 2012 -0400
+
+    Minor refactoring
+
+ src/hb-ot-layout-gsubgpos-private.hh | 32
+ --------------------------------
+ src/hb-ot-layout-private.hh          | 35
+ +++++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-indic.cc     |  2 +-
+ 3 files changed, 36 insertions(+), 33 deletions(-)
+
+commit c3e6fdc3791168cf2b4c9412e751f187d58faa42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 20:11:42 2012 -0400
+
+    [Indic] Improve check on ligatures
+
+    Only skip actual ligatures, not marks in-between ligature components.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 5 +++++
+ src/hb-ot-shape-complex-indic.cc     | 2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 771a8f50289e8fa458cfc3cd84f73a380ce98077
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 20:07:50 2012 -0400
+
+    [Indic] exclude ligatures when matching on Indic category
+
+    If, say, a H,ZWJ,C ligature was formed, we don't want the code
+    to detec
+    that as a Halant.  So, ignore ligatures when matching category in
+    final_reordering.
+
+    Sinhala failures down from 514 to 455 (0.167374%).
+
+ src/hb-ot-shape-complex-indic.cc                   | 41
+ ++++++++++++----------
+ .../indic/script-sinhala/misc/misc.txt             |  1 +
+ 2 files changed, 23 insertions(+), 19 deletions(-)
+
+commit d1af9e82e5309158ed334ab8e21f3a3b64b9540f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 19:55:35 2012 -0400
+
+    [GSUB/GPOS] Const correctness
+
+ src/hb-ot-layout-gsubgpos-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit baacd090df97610e3f6d1b2a110dc67b6c6f9f5c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 19:51:48 2012 -0400
+
+    [Indic] Minor refactoring
+
+ src/hb-ot-shape-complex-indic.cc | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit c7c4de2fb9bba216e37875d79815eef55c0acc01
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 18:25:02 2012 -0400
+
+    [Indic] Remove syllable length check before sorting
+
+    We now limit syllable lengths in the machine.  No need to match here.
+
+ src/hb-ot-shape-complex-indic.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 9fa052733eb93a3ce1205f63ff8f74cb295cbe99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 18:19:17 2012 -0400
+
+    [Indic] Limit syllables to at most five consonants
+
+    Seems to be about what Uniscribe does.  Not exactly.  But close
+    enough.
+    More consonants will start a new cluster.
+
+    A few scripts went way down in failures.  In particular:
+
+      - Devanagari failures went down from 490 to 56.
+      - Telugu went down from 113 to 49.
+
+    Other scripts went down slightly or didn't change.  New numbers:
+
+    BENGALI: 353908 out of 354285 tests passed. 377 failed (0.106412%)
+    DEVANAGARI: 693572 out of 693628 tests passed. 56 failed (0.00807349%)
+    GUJARATI: 366485 out of 366506 tests passed. 21 failed (0.00572978%)
+    GURMUKHI: 60750 out of 60809 tests passed. 59 failed (0.0970251%)
+    KANNADA: 950730 out of 951913 tests passed. 1183 failed (0.124276%)
+    KHMER: 298613 out of 299124 tests passed. 511 failed (0.170832%)
+    MALAYALAM: 1046881 out of 1048416 tests passed. 1535 failed
+    (0.146411%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271333 out of 271847 tests passed. 514 failed (0.189077%)
+    TAMIL: 1091837 out of 1091837 tests passed. 0 failed (0%)
+    TELUGU: 970524 out of 970573 tests passed. 49 failed (0.00504856%)
+
+    Some of the remaining Telugu and Devanagari issues seem to be
+    Uniscribe
+    eating Anusvara when placed before a non-joiner.  Ouch!
+
+ src/hb-ot-shape-complex-indic-machine.rl | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 093cd583263a5d427e3377b31585043fb55d2557
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 14:04:42 2012 -0400
+
+    [Thai] Fix SARA AM handling
+
+    Oops, thinko.
+
+ src/hb-ot-shape-complex-misc.cc | 6 +++---
+ src/hb-private.hh               | 4 ++--
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 42848453bf260b456b46a07f066e31b8c3aac2f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 13:52:07 2012 -0400
+
+    [Thai] Reorder U+0E3A THAI VOWEL SIGN PHINTHU
+
+    Uniscribe reorders U+0E3A to be after U+0E38 and U+0E39.  We do
+    that by
+    modifying the ccc for U+0E3A.
+
+    Fixes the two remaining Thai failures (see previous commit).
+
+ src/hb-ot-shape-complex-misc.cc                          |  7 +++++++
+ src/hb-unicode.cc                                        |  6 ++++++
+ .../texts/in-tree/shaper-thai/script-thai/misc/MANIFEST  |  1 +
+ .../in-tree/shaper-thai/script-thai/misc/phinthu.txt     | 16
+ ++++++++++++++++
+ 4 files changed, 30 insertions(+)
+
+commit 4a7f4f3e56f8f7640ae7337aa1b3324f31e0d4ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 13:15:33 2012 -0400
+
+    [Thai] Adjust SARA AM reordering to match Uniscribe
+
+    Adjust the list of marks before SARA AM that get the reordering
+    treatment.  Also adjust cluster formation to match Uniscribe.
+
+    With Wikipedia test data, now I see:
+
+      - For Thai, with the Angsana New font from Win7, I see 54
+      failures out
+        of over 4M tests  (0.00129107%).  Of the 54, two are legitimate
+        reordering issues (fix coming soon), and the other 52 are simply
+        Uniscribe using a zero-width space char instead of an unknown
+        character for missing glyphs.  No idea why.  The missing-glyph
+        sequences include one that is a Thai character followed by
+        an Arabic
+        Sokun.  Someone confused it with Nikhahit I assume!
+
+      - For Lao, with the Dokchampa font from Win7, 33 tests fail out of
+        54k (0.0615167%).  All seem to be insignificant mark positioning
+        with two marks on a base.  Have to investigate.
+
+ src/hb-ot-shape-complex-misc.cc                    | 42
+ +++++++++++++---------
+ src/hb-private.hh                                  |  6 ++++
+ test/shaping/texts/in-tree/shaper-thai/MANIFEST    |  1 +
+ .../texts/in-tree/shaper-thai/script-lao/MANIFEST  |  1 +
+ .../in-tree/shaper-thai/script-lao/misc/MANIFEST   |  1 +
+ .../shaper-thai/script-lao/misc/sara-am.txt        | 20 +++++++++++
+ .../shaper-thai/script-thai/misc/sara-am.txt       | 18 +++++++++-
+ 7 files changed, 72 insertions(+), 17 deletions(-)
+
+commit 2cc933aff97916e5d0fe42883f40f0879f848e25
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 08:22:55 2012 -0400
+
+    [Indic] Fix cluster formation with left-matras and conjunct forms
+
+    Test case was: <U+0D15,U+0D4D,U+0D15,U+0D4A>.
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e6b01a878cd2e63cb675e7e0c6ac4d83a8c10f37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 23 00:11:26 2012 -0400
+
+    [Indic] Further streamline cluster formation
+
+    This should address all possible cluster misformations that I had in
+    mind.
+
+ src/hb-ot-shape-complex-indic.cc | 21 ++++++++++-----------
+ 1 file changed, 10 insertions(+), 11 deletions(-)
+
+commit 7b2a7dadd6c616bbfe1d8358700cab9cee88e584
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 22 23:58:55 2012 -0400
+
+    [Indic] Merge clusters before sorting
+
+    This should fix any instabilities in cluster formation that we were
+    speculating may happen with surrounding syllables.  Or most of it
+    perhaps.
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit abb3239ef92cc5dccb4638806d7ae9868b9ac9b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 22 23:55:19 2012 -0400
+
+    [Indic] Update clusters for left-matra even if matra didn't move
+
+    Fixes crashes reported with left matra under
+    non-uniscribe-bug-compatibilty mode.
+
+ src/hb-ot-shape-complex-indic.cc | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 60554f14d8dca208721f0da8b69d84b92819c54f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 22 23:23:56 2012 -0400
+
+    [Indic] Merge in Malayalam tests
+
+    From:
+    http://silpa.org.in/pub/tests/hb/ml/ml-harfbuzz-testdata.txt
+
+ .../indic/script-malayalam/misc/misc.txt           | 94
+ +++++++++++-----------
+ 1 file changed, 46 insertions(+), 48 deletions(-)
+
+commit 5c7081770c7a611bbe79b451b7b86dec4fa6395d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 22 23:20:27 2012 -0400
+
+    [Indic] Add extensive Sinhala tests
+
+    Generated by:
+    http://git.savannah.gnu.org/cgit/sinhala.git/plain/utils/gen-unicode-sinhala.py
+
+ .../indic/script-sinhala/misc/extensive.txt        | 4390
+ ++++++++++++++++++++
+ 1 file changed, 4390 insertions(+)
+
+commit 2efe4707b1b449962f6e161716477d9775456c46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 22 23:17:59 2012 -0400
+
+    [Indic] Add Sinhala tests
+
+    Merge tests from:
+    http://git.savannah.gnu.org/cgit/sinhala.git/plain/patches/icu-sinhala-rendering.txt
+
+ .../indic/script-sinhala/misc/misc.txt             | 26
+ ++++++++++++++++++++--
+ 1 file changed, 24 insertions(+), 2 deletions(-)
+
+commit 3d4c111b7a13700b2f7a0b087eb3992283295f21
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 19:34:39 2012 -0400
+
+    Add a test case
+
+ .../texts/in-tree/shaper-indic/indic/script-bengali/misc/misc.txt
+ | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 92a1ad7bef9efb456ab87bd63818cfbed7da3f6f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 18:38:27 2012 -0400
+
+    [Indic] Stop searching for base if a post form is found before
+    below form
+
+    Improves Bengali and Gurmukhi.  Malayalam regressed a bit.  We will
+    deal
+    with that later.
+
+ src/hb-ot-shape-complex-indic.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 4c450c703f8e4618c587bcd7ef46dcc1f2c7947b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 18:13:04 2012 -0400
+
+    [Indic] Recompose Bengali Ya,Nukta
+
+    This is a bunch of hacks for now.
+
+    Improves Bengali a bit.
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ src/hb-unicode.cc                | 8 ++++++++
+ 2 files changed, 10 insertions(+), 2 deletions(-)
+
+commit e9c0f152a38cb2e76650a3e43f7fdcda266af696
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 17:05:46 2012 -0400
+
+    [Uniscribe] Fix script fallback
+
+    Gurmukhi failures half now.  Others changed slightly.
+
+ src/hb-uniscribe.cc | 34 ++++++++++++++--------------------
+ 1 file changed, 14 insertions(+), 20 deletions(-)
+
+commit 5791f329159c9863317e2b507514c29321be31a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 16:26:55 2012 -0400
+
+    [Indic] Allow a ZWNJ after SM's
+
+    Malayalam failures go way down.  Other scripts benefitted slightly
+    too.
+    Sinhala had one or two test regressions, but...
+
+ src/hb-ot-shape-complex-indic-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 34ae336f3fae93ef9372881d545c817bce383041
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 16:17:28 2012 -0400
+
+    [Indic] Improve Reph AfterMain positioning
+
+    Fixes 20 out of 48 failing Oriya tests.  Failure rate down to
+    0.066% now.
+
+ src/hb-ot-shape-complex-indic.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit bdd080431a40bc941ece3230f338b94a46bd12a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 16:03:09 2012 -0400
+
+    [Indic] Reposition Oriya Candrabindu
+
+    Oriya failures down from 0.65% to 0.20%.
+
+ src/hb-ot-shape-complex-indic.cc                                        |
+ 1 +
+ .../shaping/texts/in-tree/shaper-indic/indic/script-oriya/misc/MANIFEST |
+ 1 +
+ .../texts/in-tree/shaper-indic/indic/script-oriya/misc/bindu.txt        |
+ 2 ++
+ 3 files changed, 4 insertions(+)
+
+commit 5f0eaaad129ff04d56b8756bebf19fbc242718c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 15:47:24 2012 -0400
+
+    [Indic] Fix base search in final_reordering
+
+    Fixes most Malayalam failures.  Down from 1.6% to 0.38% now.  Fixes a
+    few more in other scripts too.
+
+ src/hb-ot-shape-complex-indic.cc | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 81202bd860e4034c18d9f80c5a4f33d9f48463a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 15:10:02 2012 -0400
+
+    [Indic] Don't attach SM/VD to other characters
+
+ src/hb-ot-shape-complex-indic-private.hh |  3 +++
+ src/hb-ot-shape-complex-indic.cc         | 38
+ ++++++++++++++++++--------------
+ 2 files changed, 24 insertions(+), 17 deletions(-)
+
+commit efb4ad735691837a52447bedc1a66a87d0d9af51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 14:27:38 2012 -0400
+
+    Fix compiler warnings
+
+    If x is not constant, we cannot ASSERT_STATIC on it.
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f31d97e44eeb6fb141f3de928e27e033fc7b1f47
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 14:13:35 2012 -0400
+
+    [Indic] Form Telugu Reph out of Ra,Virama,ZWJ
+
+    Apparently this was approved in Feb 2012.  No font yet.
+
+ src/hb-ot-shape-complex-indic-private.hh | 2 +-
+ src/hb-ot-shape-complex-indic.cc         | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 2e193b240ec85cab0d4e2f8a375c5a7f0ef99985
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 14:02:35 2012 -0400
+
+    [Indic] Don't split U+0AC9
+
+    Althought IndicMatraCategory.txt classifies it as Top_And_Right matra,
+    it does not have Unicode decomposition, and Uniscribe does not do
+    anything special about it either.
+
+    Gujarati failures down from 0.672% to 0.0130966%.
+
+ src/hb-unicode.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 30c3d5e9fc61b49c2c6ad4e744300edd6f3e0261
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 13:56:32 2012 -0400
+
+    [Indic] Simplify Uniscribe cluster emulation
+
+    Now that we break syllables on Halant,ZWNJ, this code can be
+    simplified.
+
+ src/hb-ot-shape-complex-indic.cc | 11 ++---------
+ 1 file changed, 2 insertions(+), 9 deletions(-)
+
+commit decf6ffca475fe01ff3151b7641f629f031137d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 13:51:31 2012 -0400
+
+    [Indic] Minor!
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9e4f94a72cea6d65a6a7ba5a47db92e00dbfbb91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 13:48:03 2012 -0400
+
+    [Indic] Break syllables at Halant,ZWNJ
+
+    That's really what Uniscribe does, and explains a lot of pecularities
+    of
+    Halant,ZWNJ before the base.
+
+    Sent Telugu from 1% failures to 0.03%.  Improved Kannada and Malayalam
+    slightly.  Fixed half of Bengali, and did NOT break anything!
+
+ src/hb-ot-shape-complex-indic-machine.rl | 5 +++--
+ src/hb-ot-shape-complex-indic.cc         | 5 ++---
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 2c372b80f6befad69e216e3f218b38640b8cc044
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 13:37:48 2012 -0400
+
+    [Indic] Better check for applying 'init'
+
+    Specifically, don't apply 'init' if previous char is a joiner.
+
+    Fixes some more of Bengali.
+
+ src/hb-ot-shape-complex-indic.cc | 9 +--------
+ src/hb-private.hh                | 3 ++-
+ 2 files changed, 3 insertions(+), 9 deletions(-)
+
+commit 34a7440b7c6c6e53394ddbdbedaad57b23f85105
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 12:32:59 2012 -0400
+
+    [GPOS] Don't zero mark advances
+
+    Fixes more of Telugu, Kannada, and Oriya.
+
+    May break things (outside Indic...), but we cannot think of any
+    font relying
+    on this immediately.
+
+ src/hb-ot-layout-gpos-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8ed248de77e5d2ed978e55c0ce1a11727bc9e34c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 11:42:24 2012 -0400
+
+    [Indic] Minor
+
+ src/hb-ot-shape-complex-indic.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit d0e68dbd0b9fc9a42c4280d01c8ffd9c5015d550
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 11:25:41 2012 -0400
+
+    [Indic] Implement reph positioning step 5
+
+    Not tuned, just copied from step 2.  Fixes another 0.5% of Kannada
+    failures.  1% to go.
+
+ src/hb-ot-shape-complex-indic.cc | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit a9e45c32e4a0d6da33c52f8427aa694e57f52eb9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 11:04:15 2012 -0400
+
+    [Indic] Don't let ZWNJ at the end of syllable affect base search
+
+    Fixes a few Devanagari, half of remaining Kannada failures,
+    quarter for
+    Telugu, and others slightly improved or unchanged.
+
+ src/hb-ot-shape-complex-indic.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 20b68e699f73e6ce046c0ec143d40b3d6d48e06b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 10:47:46 2012 -0400
+
+    [Indic] Apply 'cjct' globally
+
+    Fixes 5 Devanagari failures, and no regressions.
+
+ src/hb-ot-shape-complex-indic.cc | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit 51e764de441072e7c9f67de23e8ed717b9b8957d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 10:30:24 2012 -0400
+
+    [Indic] Unbreak old scriptures
+
+    Brings down failures with Lohit-Telugu from 57% to 1.40%.
+
+ src/hb-ot-shape-complex-indic.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 900cf3d449bf36d4f8b1474590cae925fef48fc8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 20 10:18:23 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 87cd63266e73af316b250573ef57388a0bcc9133
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 21:17:48 2012 -0400
+
+    [Indic] Recategorize some Kannada right matras
+
+    Kannada failures down from 3.5% to 2.93%.
+
+ src/hb-ot-shape-complex-indic.cc                                   | 2 +-
+ .../texts/in-tree/shaper-indic/indic/script-kannada/misc/MANIFEST  | 1 +
+ .../shaper-indic/indic/script-kannada/misc/right-matras.txt        |
+ 7 +++++++
+ 3 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 3604d64ced909ade91998d294a7b4b2ee14d47aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 21:13:04 2012 -0400
+
+    [Indic] Recategorize GURMUKHI ADDAK
+
+    It's not in IndicSyllabicCategory.txt.  Fixes most of Gurmukhi
+    failures.
+    Failures down from 7.7% to 0.222%!
+
+ src/hb-ot-shape-complex-indic.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 89328581236a53ec16508b95db54c7e5315b178f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 21:02:38 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-gsubgpos-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 47ef931f13778b894090139a64238a5ab9ac1154
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 20:52:44 2012 -0400
+
+    [buffer] Make sure out_info = info during GPOS
+
+ src/hb-buffer.cc | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit ae63cf206291befe3920adfe015e6cd0961580e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 20:45:41 2012 -0400
+
+    Print line number during return when tracing
+
+ src/hb-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 5249f3aee108b0f41770d137e63a625f594418e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 20:30:22 2012 -0400
+
+    [Indic] Unbreak Khmer
+
+    For Khmer, all consonants are subjoining.  No need to look in
+    the font.
+    We were looking in the wrong order anyway.
+
+ src/hb-ot-shape-complex-indic.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit e0475345d5d7db8dbc8b554beedfa2435c5d7fd1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 20:24:14 2012 -0400
+
+    [Indic] Apply 'akhn' globally
+
+    Fixes 1.5% more failures for Telugu, 2% for Kannada.
+    Breaks one test in Devanagari.
+
+ src/hb-ot-shape-complex-indic.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit c87bcddb10752b407c0471ee5ac4de6f1b00b711
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 20:03:25 2012 -0400
+
+    [Indic] Add failing test for Kannada
+
+ .../texts/in-tree/shaper-indic/indic/script-kannada/misc/misc.txt
+ | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit fa247ebe524f92fa95d344ba912f704262879c13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 19:52:19 2012 -0400
+
+    [Indic] Better position U+0CD5
+
+    Fixes another 5% of Kannada failures.
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f055442716ec7543ed156d4789955b19c11a5255
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 16:20:21 2012 -0400
+
+    [Indic] Lookup consonant position in the font
+
+    Fixes most failures of Oriya, and improves others a bit.
+
+ src/hb-ot-map-private.hh                 |  13 ++--
+ src/hb-ot-shape-complex-indic-private.hh | 105
+ -------------------------------
+ src/hb-ot-shape-complex-indic.cc         |  63 +++++++++++++------
+ 3 files changed, 54 insertions(+), 127 deletions(-)
+
+commit 74d1d88781e91866a52e27f391e34df03b313442
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 16:14:23 2012 -0400
+
+    [GSUB] Fix would_apply() for LigatureSubst
+
+ src/hb-ot-layout-gsub-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 787f7d1e9ba9ad038f24e5a1063d12c7d169ad37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 15:29:13 2012 -0400
+
+    [TODO] Minor
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit be73a5f9368136ecbdb211b96516ad0c554c8201
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 14:59:15 2012 -0400
+
+    Add src/test-would-substitute tool
+
+ src/Makefile.am              |   6 +-
+ src/test-would-substitute.cc |  94 ++++++++++++++++++++++++++++++
+ src/test.cc                  | 132
+ +++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 231 insertions(+), 1 deletion(-)
+
+commit e72b360ac6381b549249b8836fa3e70b909d3437
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 14:35:23 2012 -0400
+
+    Refactor / finish would_apply() operation
+
+    Untested.
+
+ src/hb-ot-layout-gpos-table.hh       |   6 +-
+ src/hb-ot-layout-gsub-table.hh       | 126 +++++++++----------
+ src/hb-ot-layout-gsubgpos-private.hh | 233
+ ++++++++++++++++++++++++++++++++++-
+ src/hb-ot-layout.cc                  |  11 ++
+ src/hb-ot-layout.h                   |   7 ++
+ 5 files changed, 308 insertions(+), 75 deletions(-)
+
+commit 8c973ebf0f59abb5ee920edd5d64e23d8e47ad75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 13:25:08 2012 -0400
+
+    [Indic] Implement per-script matra positioning
+
+    Following what the spec says.
+
+    Brings down Telugu failures from 40% to 3.75%, and Kannada failures
+    from
+    44% to 10%.  Does NOT affect other scripts' test results.
+
+ src/hb-ot-shape-complex-indic-private.hh |  2 +-
+ src/hb-ot-shape-complex-indic.cc         | 40
+ +++++++++++++++++++++++++++++---
+ src/hb-unicode.cc                        |  2 +-
+ 3 files changed, 39 insertions(+), 5 deletions(-)
+
+commit 8bb32458f95f13f66688e0811cc91f1bfffb867d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 12:59:06 2012 -0400
+
+    [Indic] More refactoring
+
+ src/hb-ot-shape-complex-indic-private.hh |  9 ++---
+ src/hb-ot-shape-complex-indic.cc         | 65
+ ++++++++++++++++++++++++--------
+ 2 files changed, 54 insertions(+), 20 deletions(-)
+
+commit 9ccc6382ba43760167c134c18c1c4ada4b8c3f22
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 12:32:16 2012 -0400
+
+    [Indic] Minor refactoring
+
+ src/hb-ot-shape-complex-indic.cc | 127
+ ++++++++++++++++++++++-----------------
+ 1 file changed, 71 insertions(+), 56 deletions(-)
+
+commit f83aaa3133de5d807be267a100d6a200e8db9017
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 12:23:23 2012 -0400
+
+    [Indic] Minor
+
+ src/hb-ot-shape-complex-indic-private.hh | 42
+ ++++++++++++++++++++------------
+ 1 file changed, 26 insertions(+), 16 deletions(-)
+
+commit be8b9f5f715f6fb36b98bd33c3303f79cc068f8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 12:11:12 2012 -0400
+
+    [Indic] Start refactoring different matra positions per script
+
+ src/hb-ot-shape-complex-indic-private.hh | 36
+ +++++++++++++++++++-------------
+ src/hb-ot-shape-complex-indic.cc         |  4 ++--
+ 2 files changed, 24 insertions(+), 16 deletions(-)
+
+commit deeb540a74f8d394db273145b17bf385d14d01bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 11:30:48 2012 -0400
+
+    [test] Ignore tests with DOTTED CIRCLE in the output
+
+ test/shaping/hb_test_tools.py | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit b01d9b3d90e892341ee4463f2eda4600850b97d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 19 11:25:49 2012 -0400
+
+    [Indic] Disallow decomposition of a couple characters
+
+    This is a hack for now.  Will be fixed when we do
+    complex-shaper-driven
+    normalization properly.
+
+    The results with or without decomposition are the same, but Uniscribe
+    does not normalize, so this matches better.
+
+ src/hb-unicode.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 422ecd2d3c198a36d07d409341cb82ea57c7ad6b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 23:25:58 2012 -0400
+
+    [Indic] Accept a forced Rakar sequence at the end of syllable
+
+    In Sinhala, Rakar is formed by Al-Lakuna,ZWJ,Ra.  If you put that
+    at the
+    end of a Consonant,Matra syllable, you get a dotted-circle from
+    Uniscribe.  Apparently adding a ZWJ before the Al-Lakuna "fixes" that.
+    And people have been encoding that sequence...  So, allow a forced
+    "ZWJ,Virama,ZWJ,Ra" sequence at the of syllables.
+
+    Fixes some 100 or more of Sinhala failures.  Now at 622 only (0.23%).
+
+ src/hb-ot-shape-complex-indic-machine.rl                               |
+ 3 ++-
+ .../texts/in-tree/shaper-indic/indic/script-sinhala/misc/misc.txt      |
+ 2 ++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 6fc1732003d71cf90d37247482772c3da884687f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 17:49:19 2012 -0400
+
+    [Indic] Allow joiners on both sides of Halant at the same time
+
+    The sequence <ZWJ,Al-Lakuna,ZWJ> is used in Sinhala to explicitly ask
+    for Rakar.  Fixes two-thousand Sinhala tests.  Not many left.
+
+ src/hb-ot-shape-complex-indic-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 10cdc94eee2225f14c198c015256a5a0063eecad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 17:42:34 2012 -0400
+
+    [Indic] In final reordering, find base, even if it disappeared
+
+    POS_BASE can disappear if base ligated backward.  Define base as last
+    with position not after base.
+
+    Fixes a few hundred of Sinhala failures with Iskoola Pota.
+
+ src/hb-ot-shape-complex-indic.cc                                   |
+ 7 ++-----
+ .../texts/in-tree/shaper-indic/indic/script-sinhala/misc/misc.txt  | 1 +
+ 2 files changed, 3 insertions(+), 5 deletions(-)
+
+commit 9c4d24a3a677a58ec59c7fb0f8b70b8aad30a032
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 17:29:10 2012 -0400
+
+    [Indic] Minor
+
+ src/hb-ot-shape-complex-indic.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3285e107c9a83aeb552e67f9460680ff6d167d88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 17:22:14 2012 -0400
+
+    [Indic] Implement Sinhala "Al Lakuna" Reph behavior
+
+    In Sinhala, Reph is formed only explicitly, by the presence of a ZWJ.
+
+ src/hb-ot-shape-complex-indic-private.hh                           | 2 ++
+ src/hb-ot-shape-complex-indic.cc                                   |
+ 7 ++++++-
+ .../texts/in-tree/shaper-indic/indic/script-sinhala/misc/MANIFEST  | 1 +
+ .../texts/in-tree/shaper-indic/indic/script-sinhala/misc/reph.txt  |
+ 3 +++
+ 4 files changed, 12 insertions(+), 1 deletion(-)
+
+commit 91cade755534c42bb826a6aefcbca8a543d94387
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 16:50:41 2012 -0400
+
+    [Indic/Unicode] Decompose Sinhala split matras the way Uniscribe likes
+
+    Makes no visual difference.
+
+    Fixes most of the failures.  Down from 15% to 1.3%!
+
+ src/hb-unicode.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit d8942dcbb4e3249a2d78a6455c119294ed4390bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 16:34:10 2012 -0400
+
+    Apply Tibetan (global) features.
+
+    Fixes all Tibetan failures.  All 180k of them!
+
+    Merges back Hangul into the default shaper.
+
+ src/hb-ot-shape-complex-misc.cc    | 82
+ +++++++++++++++++---------------------
+ src/hb-ot-shape-complex-private.hh |  7 ----
+ 2 files changed, 37 insertions(+), 52 deletions(-)
+
+commit 552d19b7a11f7dff888587fce4d56d9f8e47e819
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 16:00:49 2012 -0400
+
+    [Indic] Treat Register Shifters like Nukta
+
+    Really this time.
+
+    Fixes another 18 Khmer tests.
+
+ src/hb-ot-shape-complex-indic-machine.rl                                |
+ 2 +-
+ src/hb-ot-shape-complex-indic.cc                                        |
+ 2 --
+ .../in-tree/shaper-indic/south-east-asian/script-khmer/misc/misc.txt    |
+ 1 +
+ 3 files changed, 2 insertions(+), 3 deletions(-)
+
+commit e8cd81f76d159f3ecf808952dab24bc07782497a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 16:00:20 2012 -0400
+
+    [Indic] Minor
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 69f26bf39c824d6bf5b1c0d410380cc5462ad5ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 15:45:43 2012 -0400
+
+    [Indic] Fix Matra reordering when base is at end of syllable
+
+    For example: U+915,U+200c,U+93f
+
+    Fixes last Tamil failure!
+
+ src/hb-ot-shape-complex-indic.cc                                        |
+ 2 +-
+ .../texts/in-tree/shaper-indic/indic/script-devanagari/misc/misc.txt    |
+ 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit d16ccc4ae7aa8be460881042413fa2637929fede
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 15:43:55 2012 -0400
+
+    Leave one extra item at the end of buffer allocation
+
+    Just in case, for the times we do out-of-bounds access.
+
+    jk
+
+ src/hb-buffer-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 075d671f1093d2e3c58f7f45568696030f1b3efd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 15:41:53 2012 -0400
+
+    [Indic] Fix out-of-bounds array access
+
+ src/hb-ot-shape-complex-indic.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit dcb527242b1eca4db1e190a7802f9cd132aaf46e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 15:28:25 2012 -0400
+
+    [Indic] Allow joiners before matras
+
+    Fixes 1 more Devanagari test!
+
+ src/hb-ot-shape-complex-indic-machine.rl | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 391cc0331749e263bdfe83a8f5f6d76f2360ee7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 15:10:05 2012 -0400
+
+    [Indic] Allow halant group in Vowel and placeholder syllables
+
+    Fixes 2 out of 560 Devanagari failures.  AND:
+    Fixes 1 out of 2 Tamil failures.
+
+ src/hb-ot-shape-complex-indic-machine.rl                           |
+ 7 ++++---
+ .../in-tree/shaper-indic/indic/script-devanagari/misc/misc.txt     | 1 +
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit ca4e3d3eab7b738c2b8e2a81696a28bca1b81495
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 15:05:40 2012 -0400
+
+    [Indic] Streamline halant/joiner in grammar
+
+ src/hb-ot-shape-complex-indic-machine.rl | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 418d00dffddd95a1f27e9be15752d494c627d45e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 14:57:28 2012 -0400
+
+    [Indic] Minor
+
+ src/hb-ot-shape-complex-indic-machine.rl                               |
+ 3 ++-
+ .../texts/in-tree/shaper-indic/indic/script-devanagari/misc/misc.txt   |
+ 3 +++
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 4c3691d2a32ca7e54a54f7c08098fd96fa7af39e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 14:23:55 2012 -0400
+
+    [Indic] Hopefully minor!
+
+    Refactoring Indic machin.  No semantic change.
+
+ src/hb-ot-shape-complex-indic-machine.rl | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit e092c556fb1cf38be3cea1f4b75a0d879372dfa2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 14:09:25 2012 -0400
+
+    [Indic] Minor
+
+ src/hb-ot-shape-complex-indic-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 14dbdd9e39d3a869fd1521000c889c347433d22b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 18 13:13:03 2012 -0400
+
+    [Indic] Unbreak Tamil
+
+    Tamil has only about 150 failures now!
+
+ src/hb-ot-shape-complex-indic.cc | 18 +++++++++++++++++-
+ 1 file changed, 17 insertions(+), 1 deletion(-)
+
+commit db8981f1e0e8625714568c6d0f11f0b317b11d0a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 18:17:30 2012 -0400
+
+    [Indic] Position Khmer Robat
+
+    It's a visual Repha.
+
+    Still not positioning logical Repha as occurs in Malayalam.
+
+    Another 200 Khmer failures fixed.  547 to go.  That's better than
+    Devanagari!
+
+ src/hb-ot-shape-complex-indic-machine.rl | 36
+ +++++++++++++++++---------------
+ src/hb-ot-shape-complex-indic-private.hh |  7 ++++---
+ src/hb-ot-shape-complex-indic.cc         | 13 ++++++++++++
+ 3 files changed, 36 insertions(+), 20 deletions(-)
+
+commit 25bc489498ef7d0beb8fe9ab663e3f0b2f52c9c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 17:53:03 2012 -0400
+
+    [Indic] Better categorize Register Shifters and Khmer Various signs
+
+    Down another 500 or so Khmer failures!
+
+ src/hb-ot-shape-complex-indic-machine.rl                   | 14
+ +++++++-------
+ src/hb-ot-shape-complex-indic-private.hh                   |  2 +-
+ src/hb-ot-shape-complex-indic.cc                           |  8 ++++----
+ .../south-east-asian/script-khmer/misc/MANIFEST            |  2 ++
+ .../script-khmer/misc/other-marks-invalid.txt              |  4 ++++
+ .../south-east-asian/script-khmer/misc/other-marks.txt     |  6 ++++++
+ 6 files changed, 24 insertions(+), 12 deletions(-)
+
+commit 39b17837b4064d59c18cebb49c1c0b5b8cc0c117
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 17:09:29 2012 -0400
+
+    Add hb_buffer_normalize_glyphs() and hb-shape --normalize-glyphs
+
+    This reorders glyphs within the cluster to a nominal order.
+    This should
+    have no visible effect on the output, but helps with testing, for
+    getting the same hb-shape output for visually-equal glyphs for each
+    cluster.
+
+ src/hb-buffer.cc  | 76
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.h   | 13 ++++++++++
+ src/hb-private.hh | 29 ++++++++++++++++-----
+ util/options.cc   |  1 +
+ util/options.hh   |  7 ++++-
+ 5 files changed, 118 insertions(+), 8 deletions(-)
+
+commit 25e302da9a712e6f1d63b0d243a8df0d326ddba3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 14:25:14 2012 -0400
+
+    [Indic] Minor
+
+ src/hb-ot-shape-complex-indic.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 5d32690a3428fa86eb26fe5fcec943a10aa95881
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 14:23:28 2012 -0400
+
+    [Indic] For scripts without Half forms, always choose first consonant
+    as base
+
+    In such scripts (ie. Khmer), a ZWJ/ZWNJ shouldn't stop the search for
+    base.  So, instead just choose the first consonant as base directly.
+
+    Test sequence:
+    U+1798,200c,U+17C9,U+17D2,U+179B,U+17C1,U+17C7
+
+ src/hb-ot-shape-complex-indic.cc | 59
+ ++++++++++++++++++++++++----------------
+ 1 file changed, 35 insertions(+), 24 deletions(-)
+
+commit 34b57149065d96f7528aaccaa7654e956ce27e93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 14:09:32 2012 -0400
+
+    [Indic] Treat Khmer Register Shifters more like Nuktas
+
+    Except that there may be a ZWNJ before a Register Shifter.
+
+ src/hb-ot-shape-complex-indic-machine.rl                                |
+ 2 +-
+ .../in-tree/shaper-indic/south-east-asian/script-khmer/misc/misc.txt    |
+ 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 11e2a601b19861b05dbb2051d2d078c3cfd75b29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 14:02:28 2012 -0400
+
+    [Indic] Minor
+
+ src/hb-ot-shape-complex-indic-machine.rl | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0201e0a4649ad5b607e50bcb9605e7a5b7143812
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 13:55:10 2012 -0400
+
+    [Indic] Apply 'cfar' for Khmer
+
+    Mark stuff after a pre-base reordering Ro 'cfar'.  Used in Khmer.
+    This allows distinguishing the following cases with MS Khmer fonts:
+
+      U+1784,U+17D2,U+179A,U+17D2,U+1782
+      U+1784,U+17D2,U+1782,U+17D2,U+179A
+
+ src/hb-ot-shape-complex-indic.cc                         | 16
+ ++++++++++++++--
+ .../south-east-asian/script-khmer/misc/misc.txt          |  2 ++
+ 2 files changed, 16 insertions(+), 2 deletions(-)
+
+commit 55f70ebfb95083f515d9b0044a2a65ab11484bb5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 12:50:13 2012 -0400
+
+    [Indic] Position final subjoined consonants (and vowels) after matras
+
+    In Khmer, a final subjoined consonant or independent vowel can occur
+    after matras.  This final subjoined thing should NOT be reordered to
+    before the matra even though it's subjoined.
+
+    Fixes another 1k of the Khmer failures.  Not much left really.
+
+ src/hb-ot-shape-complex-indic-private.hh                    |  1 +
+ src/hb-ot-shape-complex-indic.cc                            | 13
+ +++++++++++++
+ .../south-east-asian/script-khmer/misc/misc.txt             |  2 ++
+ 3 files changed, 16 insertions(+)
+
+commit c50ed71e9a3df1844f564de66d54b46a696c1356
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 11:54:28 2012 -0400
+
+    [Indic] Recategorize Khmer coeng sign as a separate category OT_Coeng
+
+    Amend the syllable structure to allow a final subscripted consonant
+    (Coeng+C) and a final subscripted independent vowel (Coeng+V).
+    Fixes another 2k of Khmer failures.
+
+ src/hb-ot-shape-complex-indic-machine.rl                           |
+ 7 ++++---
+ src/hb-ot-shape-complex-indic.cc                                   |
+ 6 +++++-
+ .../shaper-indic/south-east-asian/script-khmer/misc/misc.txt       | 1 +
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit deb521dee4fdca8c2124cfb39a205e6269d4a70d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 11:37:32 2012 -0400
+
+    [Indic] Add a separate Coeng class
+
+    No characters recategorized yet.  No semantic change.
+
+ src/hb-ot-shape-complex-indic-machine.rl |  1 +
+ src/hb-ot-shape-complex-indic-private.hh |  3 ++-
+ src/hb-ot-shape-complex-indic.cc         | 26 ++++++++++++++++----------
+ 3 files changed, 19 insertions(+), 11 deletions(-)
+
+commit 74ccc6a1322f8c48c5f2a05f04821783c4b87a14
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 11:16:19 2012 -0400
+
+    [Indic] Move Halant with after-base consonants
+
+    Normally, we attach the Halant to the previous character and move it
+    with it.  For after-base consonants however, the Halant "belongs"
+    to the
+    consonant after, so attach it so.
+
+    This fixes Bengali sequences involving post-base consonant Ya, which
+    should ligate with the Halant to form Ya Phala, but previously a
+    reordered matras was blocking the ligation.
+
+ src/hb-ot-shape-complex-indic.cc                              |
+ 11 +++++++++++
+ .../in-tree/shaper-indic/indic/script-bengali/misc/misc.txt   |  1 +
+ 2 files changed, 12 insertions(+)
+
+commit d5c4edcdd6df32f2f23aca44f14838b4baab4d7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 17 10:40:59 2012 -0400
+
+    [Indic] Apply presentation-forms features all at once
+
+    Seems like this is what Uniscribe is doing, and does not break
+    any fonts
+    we tested (with Devanagari, Malayalam, Khmer, and Bengali), while
+    fixing
+    some Ra Phala sequences for Bengali with Vrinda.  Fixes another 2% of
+    Bengali failures (a couple more to go).
+
+ src/hb-ot-shape-complex-indic.cc                                    |
+ 6 +++---
+ .../texts/in-tree/shaper-indic/indic/script-bengali/misc/misc.txt   | 1 +
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 559f70667891a3ceeffb36f40de38a4f85868945
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 22:43:17 2012 -0400
+
+    Fix MarkAttachmentType matching
+
+    Fixes issue reported by Khaled Hosny with his Hussaini Nastaleeq font
+    and sequences like those added in the previous commit.
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6de103547e4a7fb34c833861713ea373cd912261
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 22:46:06 2012 -0400
+
+    [test/arabic] Add Arabic tests for mark skipping
+
+    Expose a bug with Khaled's Hussaini Nastaleeq font.
+
+ .../shaper-arabic/script-arabic/misc/diacritics/MANIFEST       |  1 +
+ .../script-arabic/misc/diacritics/mark-skipping.txt            |
+ 10 ++++++++++
+ 2 files changed, 11 insertions(+)
+
+commit ad4494759fa8bfd2497800c24fa414075ed1aa61
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 22:40:21 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit af92b4cc90e4184d5bdd8037c551ed482700114f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 20:31:24 2012 -0400
+
+    [Indic] Disable 'kern' in Uniscribe bug compatibility mode
+
+    Uniscribe does not apply 'kern' in the Indic module.  Some of
+    the Khmer
+    fonts they ship have small adjustments in the 'kern' table.  Disable
+    'kern' in the Indic module under Uniscribe bug compatibility mode.
+
+    Fixes some 10% of the Khmer failures.  Remains under 3% (excluding
+    dotted-circle ones).
+
+ src/hb-ot-shape-complex-indic.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit d96838ef951ce6170eb2dc576ebcba2262cf7008
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 20:26:57 2012 -0400
+
+    Allow complex shapers overriding common features
+
+    In a new callback...  Currently unused by all complex shapers.
+
+ src/hb-ot-shape-complex-arabic.cc  |  6 ++++++
+ src/hb-ot-shape-complex-indic.cc   |  6 ++++++
+ src/hb-ot-shape-complex-misc.cc    | 18 ++++++++++++++++++
+ src/hb-ot-shape-complex-private.hh | 30 ++++++++++++++++++++++++++++++
+ src/hb-ot-shape.cc                 |  2 ++
+ 5 files changed, 62 insertions(+)
+
+commit df50b8474094f0563ccfdae12c4425a51b72add6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 19:56:29 2012 -0400
+
+    [Indic] Categorize other Khmer marks
+
+    Mark them the same as the Register Shifters for now.  Need to rename
+    that category to something more sensible after all is settled.
+
+    Fixes another percent of Khmer failures.  Down to under 3%!
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 8e7b5882fb4c1921c9d030d354a9b998115cdb8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 17:04:46 2012 -0400
+
+    [Indic] Recognize pre-base reordering Ra anywhere in the syllable
+
+    We were doing that only immediately after base.
+
+    Fixes another percent in the Khmer failures.  About three more
+    to go...
+
+ src/hb-ot-shape-complex-indic.cc | 84
+ ++++++++++++++++++++++------------------
+ 1 file changed, 46 insertions(+), 38 deletions(-)
+
+commit 7d09c98a1fff97127e48eae48d380dc9fcff288e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 16:45:22 2012 -0400
+
+    [Indic] Recognizer Register Shifter marks
+
+    Fixes another 6% of the Khmer failures.
+
+ src/hb-ot-shape-complex-indic-machine.rl | 3 ++-
+ src/hb-ot-shape-complex-indic-private.hh | 5 +++--
+ src/hb-ot-shape-complex-indic.cc         | 2 ++
+ 3 files changed, 7 insertions(+), 3 deletions(-)
+
+commit 60da763dfac96a7931d6e6bdef8b9973bd5209ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 16:13:32 2012 -0400
+
+    [GSUB/GDEF] Guess glyph classes after substitution only if no GDEF
+
+    Brings down Khmer failures with Daun Penh font from 36% to 20%.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 20 +++++++++++++-------
+ 1 file changed, 13 insertions(+), 7 deletions(-)
+
+commit fcdc5f1c8849a7f38d9f34f64d60c6d95d7501f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 15:52:54 2012 -0400
+
+    [Indic] Categorize Khmer Ro
+
+    Khmer failures down from 58% to 36%.
+
+ src/hb-ot-shape-complex-indic-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 78818124b17691ec2c647142fdb9ae743aa03dee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 15:49:08 2012 -0400
+
+    [Indic] Reoder pre-base reordering Ra
+
+    Brings down Malayalam failures from 14% down to 3%.
+
+ src/hb-ot-shape-complex-indic.cc | 42
+ +++++++++++++++++++++++++++-------------
+ 1 file changed, 29 insertions(+), 13 deletions(-)
+
+commit 1a1dbe9a2787f226f3e43063da8eb6633438b0a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 15:40:33 2012 -0400
+
+    [Indic] Rename
+
+ src/hb-ot-shape-complex-indic.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 46e645ec4b59f0a278347be11f40c7df700d5bb6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 15:30:05 2012 -0400
+
+    [Indic] Start implementing pre-base reordering
+
+ src/hb-ot-shape-complex-indic.cc | 33 ++++++++++++++++++---------------
+ 1 file changed, 18 insertions(+), 15 deletions(-)
+
+commit 921ce5b17daf06af8e17989a3e335b9f5df20483
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 15:26:56 2012 -0400
+
+    [Indic] Rename
+
+    No semantic change.
+
+ src/hb-ot-shape-complex-indic.cc | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit b504e060f008e95b1ba36c06600c9fea4f5d4808
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 15:21:12 2012 -0400
+
+    [Indic] Implement After-Main Reph positioning
+
+    Almost...
+
+ src/hb-ot-shape-complex-indic.cc | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 17d7de91d76406d3e92db37d9eef2fc615f06e68
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 15:20:15 2012 -0400
+
+    [Indic] Apply 'pref' to pre-base reodering Ra
+
+    No reordering yet.
+
+ src/hb-ot-shape-complex-indic.cc | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 362d3db8d3527d0fef260a17d2466e92a4a25425
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 15:15:28 2012 -0400
+
+    [Indic] Minor
+
+    Should not be any semantic change.  In preparation for implementing
+    pre-base reordering Ra.
+
+ src/hb-ot-shape-complex-indic.cc | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+commit 70fe77bb9a25922bd34f206826d8731d901fb451
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 14:52:18 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 44
+ ++++++++++++++++++++--------------------
+ 1 file changed, 22 insertions(+), 22 deletions(-)
+
+commit 2f903215c5da2330a37abe489a3f45f7c3fd5a09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 13:54:43 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a3e04bee2c2fa648759a87e460db6b4f1b685586
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 13:47:19 2012 -0400
+
+    [Indic] Reorder virama only for old Indic spec
+
+ src/hb-ot-shape-complex-indic.cc | 15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+commit 0de771b72da6b342b015e3556190821547a4011d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 13:39:36 2012 -0400
+
+    [Indic] Categorize Khmer consonants
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit d487fff266258eb1af056e9704cfb09d04251ddc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 13:25:17 2012 -0400
+
+    Split matras without a Unicode decomposition
+
+    This is a hack for now, to get us going with Khmer.  This will be
+    refactored properly later to move the complex logic into complex
+    shapers.
+
+ src/hb-unicode.cc | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+commit 8aa801a6fd1a737fa20b851edf7528bdd6635b8b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 13:24:26 2012 -0400
+
+    [Indic] Adjust position for split matras
+
+    We are going to split matras without a Unicode decompositions in a way
+    that the second half takes the codepoint of the whole matra.  So,
+    position them where the second half is supposed to end up.
+
+ src/hb-ot-shape-complex-indic-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1feb8345a5fd92297eb6796e6dce633bafa0c76e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 13:23:40 2012 -0400
+
+    [GSUB] Allow 1-to-1 ligature substitutions!
+
+    Apparently Uniscribe allows these, and they are used in some Khmer
+    fonts
+    shipped with Windows, namely, Daun Penh.
+
+ src/hb-ot-layout-gsub-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 29f106d7fba25e1464debd3a4831a7380d75c4c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 16 12:05:35 2012 -0400
+
+    [Indic] Apply Above Forms
+
+ src/hb-ot-shape-complex-indic.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit fa2bd9fb63d83b657373764d4b657084d8327fc9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 14 12:15:54 2012 -0400
+
+    Further simplify atomic ops on Visual Studio
+
+ src/hb-atomic-private.hh | 5 -----
+ 1 file changed, 5 deletions(-)
+
+commit 0a492357016bc9a614d2a726f2006c10af68ca58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 13 13:20:49 2012 -0400
+
+    Minor
+
+ src/hb-warning.cc | 29 +++++------------------------
+ 1 file changed, 5 insertions(+), 24 deletions(-)
+
+commit 11c4ad439ef2b39a840f397a693b1ba643f52c21
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 13 11:29:31 2012 -0400
+
+    Add -Wcast-align
+
+ configure.ac    | 3 +++
+ src/Makefile.am | 2 +-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit a98d0ab18624501ee60551304f2715361ac643da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 13 10:19:10 2012 -0400
+
+    Make sure HB_BEGIN_DECLS / HB_END_DECLS is only used in public headers
+
+    So we can use them to switch default visibility to internal if
+    desired,
+    and use these to make only declared symbols public.
+
+ src/check-c-linkage-decls.sh             | 10 +++++++++-
+ src/hb-fallback-shape-private.hh         |  6 ------
+ src/hb-ot-shape-complex-indic-machine.rl |  4 ----
+ 3 files changed, 9 insertions(+), 11 deletions(-)
+
+commit 5c5bc96216c9ad58243eb3ed27b253e237f08ebe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 13 10:15:37 2012 -0400
+
+    Allow overriding HB_BEGIN_DECLS / HB_END_DECLS
+
+ src/hb-common.h | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ec5f5f0f8a1d5b3ff98452175bb4450a59897620
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 13 10:00:42 2012 -0400
+
+    Don't export inline methods
+
+ configure.ac | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 50a4e78b530563917eb606ff3b96dcc9eed5b3ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 13 09:48:39 2012 -0400
+
+    Check for exported weak symbols
+
+    Ouch, all our C++ inline functions are being exported (weakly)
+    already.
+    Fix coming.
+
+ src/check-internal-symbols.sh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit b5aeb95afeb13a66177caada9f5d5ad4cddbd35f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 13 09:45:54 2012 -0400
+
+    Make hb_in_range() static
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 271c8f89075607c689938b4f5e60323d9a1acd70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 13 09:32:30 2012 -0400
+
+    Minor
+
+ src/hb-ft.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 391f1ff5d894b60bfe0f606be436ffe7e43f7455
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 13 09:04:07 2012 -0400
+
+    Fix _InterlockedCompareExchangePointer on x86
+
+ src/hb-atomic-private.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 2023e2b54d91924dddfd228ffdbb46021135b068
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 11 19:00:30 2012 -0400
+
+    [ft] Disable ppem setting
+
+    The calculations were wrong.
+
+    FreeType makes it really hard to set size and ppem independently.
+    For now, disable it.  Need to come up with a fix later.
+
+ src/hb-ft.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit cdf7444505a7ae49d20f9ba6776dea92c1fde2a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 11 18:52:39 2012 -0400
+
+    [ft] Use unfitted kerning if x_ppem is zero
+
+ src/hb-ft.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 6d08c7f1b3601095f9a12630045331dd0fe75380
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 11 18:01:27 2012 -0400
+
+    Revert "Towards templatizing common Lookup types"
+
+    This reverts commit 727135f3a9938c1ebd5b9f5015a46c7ccc8573c5.
+
+    This is work-in-progress.  Didn't mean to push it out just yet.
+
+ src/hb-ot-layout-gpos-table.hh       | 16 ++++++----------
+ src/hb-ot-layout-gsub-table.hh       | 24 ++++++++++--------------
+ src/hb-ot-layout-gsubgpos-private.hh | 33
+ ++-------------------------------
+ 3 files changed, 18 insertions(+), 55 deletions(-)
+
+commit 552bf3a9f9651311084b7979805dbdc18c0335ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 11 16:44:51 2012 -0400
+
+    Bump WINNT version requested from 500 to 600
+
+    Since we use the OpenType versions of Uniscribe functions, we are
+    relying on that version of the WINNT API.  Otherwise, usp10.h
+    will hide
+    those symbols.
+
+ src/hb-uniscribe.cc | 2 +-
+ src/hb-uniscribe.h  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 9a5b421a64db1bb23d5c6ebbc3bf3f3a5513dc36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 11 16:35:04 2012 -0400
+
+    Fix build with no Unicode funcs implementations provided
+
+ src/hb-unicode-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 6efe1eca660135096f05987ac0ef9b635de6cdfd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 11 15:30:08 2012 -0400
+
+    Update git.mk to upstream
+
+ git.mk | 58 ++++++++++++++++++++++++++++++++++++++--------------------
+ 1 file changed, 38 insertions(+), 20 deletions(-)
+
+commit 727135f3a9938c1ebd5b9f5015a46c7ccc8573c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 3 22:15:35 2012 -0400
+
+    Towards templatizing common Lookup types
+
+ src/hb-ot-layout-gpos-table.hh       | 16 ++++++++++------
+ src/hb-ot-layout-gsub-table.hh       | 24 ++++++++++++++----------
+ src/hb-ot-layout-gsubgpos-private.hh | 33
+ +++++++++++++++++++++++++++++++--
+ 3 files changed, 55 insertions(+), 18 deletions(-)
+
+commit 1167c7bfc9e61f145e11da4881968293a4d3c0a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 3 11:38:46 2012 -0400
+
+    Minor
+
+ test/shaping/texts/in-tree/shaper-thai/MANIFEST                     |
+ 2 +-
+ test/shaping/texts/in-tree/shaper-thai/misc/MANIFEST                | 1 -
+ test/shaping/texts/in-tree/shaper-thai/script-thai/MANIFEST         | 1 +
+ test/shaping/texts/in-tree/shaper-thai/script-thai/misc/MANIFEST    | 1 +
+ .../shaper-thai/{misc/misc.txt => script-thai/misc/sara-am.txt}     |
+ 6 ++----
+ 5 files changed, 5 insertions(+), 6 deletions(-)
+
+commit aa116582e69d18777448e7993078e5d6335ddfed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 29 10:50:12 2012 -0400
+
+    Minor
+
+ .../texts/in-tree/shaper-indic/indic/script-malayalam/misc/misc.txt
+ | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1f13c7185f02ea18d4fadd2ea8ad444bea863c39
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 27 10:07:27 2012 -0400
+
+    Add TODO item
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 12f5c0a222a2f0aebe63c0d367937a0ff985474a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 26 11:16:13 2012 -0400
+
+    Fix check for Intel atomic ops
+
+ configure.ac             | 9 +++++----
+ src/hb-atomic-private.hh | 2 +-
+ 2 files changed, 6 insertions(+), 5 deletions(-)
+
+commit 6932a41fb61ffc2901c260587b1e98ed9c2a7ea1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 26 10:46:31 2012 -0400
+
+    Use octal-escaped UTF-8 characters instead of plain text
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=50970
+
+ src/hb-private.hh | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+commit 8c0ea7bcb4409aaf8c96ad641f2db30003228ad0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 24 13:20:56 2012 -0400
+
+    Disable introspection again
+
+    Until I figure out the build issues.  Sigh...
+
+ configure.ac    |  2 +-
+ src/Makefile.am | 42 +++++++++++++++++++++---------------------
+ 2 files changed, 22 insertions(+), 22 deletions(-)
+
+commit 8c5f5e6f5ec2b6a219fbdfc955f6299325a0adde
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 17 14:58:59 2012 -0400
+
+    Minor
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 49f8e0cd9a5493ae26857c43bac0711cdf47c80d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 16 15:40:03 2012 -0400
+
+    GStaticMutex is deprecated
+
+ src/hb-mutex-private.hh | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 5e113a4b7921ced6af2d53460a7a2f1d0185c02a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 16 15:26:13 2012 -0400
+
+    g_thread_init() is deprecated
+
+ test/api/hb-test.h | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 1bc1cb3603167f5da309336f7018c8b0608ac104
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 16 15:21:55 2012 -0400
+
+    Make source more digestable for gobject-introspection
+
+ src/hb-blob.cc            | 2 +-
+ src/hb-blob.h             | 2 +-
+ src/hb-buffer-private.hh  | 4 ++--
+ src/hb-buffer.h           | 6 +++---
+ src/hb-common.cc          | 2 +-
+ src/hb-common.h           | 4 ++--
+ src/hb-font-private.hh    | 6 +++---
+ src/hb-font.cc            | 2 +-
+ src/hb-font.h             | 8 ++++----
+ src/hb-set-private.hh     | 2 +-
+ src/hb-set.h              | 2 +-
+ src/hb-shape.h            | 2 +-
+ src/hb-unicode-private.hh | 2 +-
+ src/hb-unicode.h          | 2 +-
+ 14 files changed, 23 insertions(+), 23 deletions(-)
+
+commit 84d781e54cc75c81a06ba43fd7b1a74b8c7d9591
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 16 15:21:41 2012 -0400
+
+    Flesh out gobject-introspection stuff a bit
+
+ configure.ac    |  1 +
+ src/Makefile.am | 23 +++++++++++++++++++++--
+ 2 files changed, 22 insertions(+), 2 deletions(-)
+
+commit 49ee12ccd00870d4976339dc546c74eaf08a8fc0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 16 14:53:51 2012 -0400
+
+    Add TODO item
+
+ TODO | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d3c8115d1ad09404b8970b98e6b5ab74510a35f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 12 09:52:57 2012 -0400
+
+    Minor
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 2cf301968cb8c1150cead0ab909457cdd3ee2d01
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 14:58:01 2012 -0400
+
+    Add hb_object_lock/unlock()
+
+ src/hb-object-private.hh | 32 ++++++++++++++++++++++++++------
+ 1 file changed, 26 insertions(+), 6 deletions(-)
+
+commit 6a5661f1e69c937083e8d976cb12429b99180d54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 03:26:16 2012 -0400
+
+    Ugh
+
+ util/shape-consumer.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit f211d5c291b4c947cfd732e873627567173057e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 03:11:22 2012 -0400
+
+    More Oops!  Fix fast-path with sub-type==0
+
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-ot-layout-gsub-table.hh | 2 +-
+ util/shape-consumer.hh         | 2 ++
+ 3 files changed, 4 insertions(+), 2 deletions(-)
+
+commit b1de6aa1f33b228afe231c8209aef90a5fa1ee5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 03:07:59 2012 -0400
+
+    Oops!
+
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-ot-layout-gsub-table.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit b12e2549cbcd4f1ef46e66c75533686ee560f59b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 03:05:20 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-gsubgpos-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit faf0f20253d954cc4cfa4c967ece7573a5ddae3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 03:02:36 2012 -0400
+
+    Add sanitize() logic for fast-paths
+
+ src/hb-ot-layout-gpos-table.hh | 15 ++++++++++++---
+ src/hb-ot-layout-gsub-table.hh | 20 ++++++++++++++------
+ 2 files changed, 26 insertions(+), 9 deletions(-)
+
+commit 4e766ff28d1fb831ded20666799787478129c07c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 02:53:57 2012 -0400
+
+    Add fast-path for GPOS too
+
+    Shaves another 3% for DejaVu Sans long Latin strings.
+
+ src/hb-ot-layout-gpos-table.hh | 16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+commit 993c51915f503f74ee00eee646b67bf2e3f73596
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 02:48:16 2012 -0400
+
+    Add fast-path to GSUB to check coverage
+
+    Shaves a good 10% off DejaVu Sans with simple Latin text for me.
+    Now, DejaVu is very ChainContext-intensive, but it's also a very
+    popular font!
+
+ src/hb-ot-layout-gsub-table.hh | 18 ++++++++++++++++--
+ 1 file changed, 16 insertions(+), 2 deletions(-)
+
+commit f19e0b0099ec73b8fedccacff4902403f5eabc42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 02:26:57 2012 -0400
+
+    Match input before backtrack
+
+    Makes more sense, optimization-wise.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 67bb9e8cea49a44be6996515e1c7d8cdc95a77e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 02:02:46 2012 -0400
+
+    Add set add_coverage() to Coverage()
+
+ src/hb-ot-layout-common-private.hh | 24 ++++++++++++++++++++++++
+ src/hb-set-private.hh              |  5 +++++
+ 2 files changed, 29 insertions(+)
+
+commit 4952f0aa5b2f4368d9e3418252e0a1b9294cd5ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 01:39:11 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-gsub-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ad6a6f22401d6256e34521d0f52e91348c5ed4c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 01:21:02 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 46617a42133fbab151de4111a74dcbdc4e769c74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 01:18:58 2012 -0400
+
+    Fix cache implementation
+
+ src/hb-cache-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ce47613889aa3ff9b0067d3e51ba63cfdb139adb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 01:10:26 2012 -0400
+
+    Micro-optimize
+
+    I know...
+
+ src/hb-ot-layout-gsubgpos-private.hh |  3 ++-
+ src/hb-ot-layout.cc                  | 46
+ ++++++++++++++++++++++--------------
+ 2 files changed, 30 insertions(+), 19 deletions(-)
+
+commit 70416de298b811ab6be53a1c67f0d2531d99cd46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 00:56:41 2012 -0400
+
+    Minor
+
+ src/hb-open-type-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 99159e52a3c9d5ae6c0fbdec64e7ed684fa70b61
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 00:50:40 2012 -0400
+
+    Use linear search for small counts
+
+    I see about 8% speedup with long strings with DejaVu Sans.
+
+ src/hb-open-type-private.hh | 19 ++++++++++++++-----
+ 1 file changed, 14 insertions(+), 5 deletions(-)
+
+commit caf0412690542e58e23246dccc4b2fb83bd652ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 00:26:32 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0f8fea71a66b1e01ee4398967db464393f478d42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 00:24:38 2012 -0400
+
+    Minor.  Hide _hb_ot_layout_get_glyph_property()
+
+ src/hb-ot-layout-private.hh | 4 ----
+ src/hb-ot-layout.cc         | 2 +-
+ 2 files changed, 1 insertion(+), 5 deletions(-)
+
+commit 44b8ee0c90d7b1dd91e5848114141e3186534a0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 9 00:23:24 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-gpos-table.hh | 3 ++-
+ src/hb-ot-layout.cc            | 2 +-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 7b84c536c10ab90ed96a033d88e9ad232d46c5b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 22:04:23 2012 -0400
+
+    In MarkBase attachment, only attach to first of a MultipleSubst
+    sequence
+
+    This is apparently what Uniscribe does.  Test case is:
+
+      SEEN FATHA TEH ALEF
+
+    with Arabic Typesetting.  Originally reported by Khaled Hosny.
+
+ src/hb-ot-layout-gpos-table.hh       | 7 ++++++-
+ src/hb-ot-layout-gsubgpos-private.hh | 8 ++++++++
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit ec57e0c5655ced5109c4638bf802772d336448fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 21:47:23 2012 -0400
+
+    Set lig_comp for MultipleSubst components
+
+    To be used for correct mark attachment to first component of a
+    MultipleSubst output.  That's what Uniscribe does.
+
+ src/hb-ot-layout-gsub-table.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit e085fcf7ca302eb7802a032197c022819e7e7074
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 21:45:00 2012 -0400
+
+    Remove unused buffer->replace_glyphs_be16
+
+ src/hb-buffer-private.hh             |  3 ---
+ src/hb-buffer.cc                     | 23 -----------------------
+ src/hb-ot-layout-gsubgpos-private.hh |  8 --------
+ 3 files changed, 34 deletions(-)
+
+commit 3ec77d6ae0510dc2c0ec64382c4948bc6e109844
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 21:44:06 2012 -0400
+
+    Don't use replace_glyphs_be for MultipleSubst
+
+ src/hb-ot-layout-gsub-table.hh       | 5 ++++-
+ src/hb-ot-layout-gsubgpos-private.hh | 7 ++++++-
+ 2 files changed, 10 insertions(+), 2 deletions(-)
+
+commit 4b7192125ffd295091d6b3a0bdfca7011947c2ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 21:41:46 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-gsub-table.hh       | 3 ++-
+ src/hb-ot-layout-gsubgpos-private.hh | 8 ++++++++
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 4508789f4b5e0ece5620d35598aeeb7ecbe3e3aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 21:32:43 2012 -0400
+
+    Add test for static initializers and other C++ stuff
+
+ src/Makefile.am           |  3 ++-
+ src/check-static-inits.sh | 33 +++++++++++++++++++++++++++++++++
+ 2 files changed, 35 insertions(+), 1 deletion(-)
+
+commit 56bd259b9ac22dd98913c8ca2e2cf7b30b632373
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 21:29:18 2012 -0400
+
+    Minor
+
+ src/check-internal-symbols.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4538b47bf08e73e7f5cce6337df5fe154233c168
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 21:01:45 2012 -0400
+
+    Remove done TODO items
+
+ TODO | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit bc8357ea7b4c0d7c715aae353176434fb9460205
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 21:01:20 2012 -0400
+
+    Merge clusters during normalization
+
+ src/hb-ot-shape-normalize.cc | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+commit fe3dabc08df7501010564f8844bd4d11771cc6a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 20:56:05 2012 -0400
+
+    Minor
+
+ src/hb-buffer.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e88e14421a33ca5bdfd76bc0b2f801fcb6e78911
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 20:55:21 2012 -0400
+
+    Use merge_clusters instead of open-coding
+
+ src/hb-buffer.cc | 16 ++++------------
+ 1 file changed, 4 insertions(+), 12 deletions(-)
+
+commit 330a2af3ff0e12c01b3b451357b8bdc83b2e9b47
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 20:40:02 2012 -0400
+
+    Use merge_clusters when forming Unicode clusters
+
+ src/hb-ot-shape.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit bd300df9adf955c1e69b3783c1c061876940fb8b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 20:35:18 2012 -0400
+
+    Minor
+
+ src/hb-object-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e51d2b6ed1c794ac28c5610bfd01dbc9fb383633
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 20:33:27 2012 -0400
+
+    Extend into main buffer if extension hit end of out-buffer merging
+    clusters
+
+ src/hb-buffer.cc                | 5 +++++
+ src/hb-ot-shape-complex-misc.cc | 9 ---------
+ 2 files changed, 5 insertions(+), 9 deletions(-)
+
+commit 5ced012d9f58c51d557a835593c3277e35fe3b35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 20:31:32 2012 -0400
+
+    Extend end when merging clusters in out-buffer
+
+ src/hb-buffer.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 72c0a1878313e7232d554bc226f4c6dc01418a95
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 20:30:03 2012 -0400
+
+    Extend clusters backward in out-buffer
+
+ src/hb-buffer.cc                | 8 ++++++++
+ src/hb-ot-shape-complex-misc.cc | 2 --
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+commit cd5891493df06fdb92e1ae526d29dee8df250235
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 20:27:53 2012 -0400
+
+    Extend clusters backwards, into the out-buffer too
+
+ src/hb-buffer.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 77471e037122548bfc08cacea6fbb472831c34f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 20:21:02 2012 -0400
+
+    Clear output buffer before calling GSUB pause functions
+
+ src/hb-ot-map.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit cafa6f372721fd6b0a7c0da68b9421d3e94931bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 20:17:10 2012 -0400
+
+    When merging clusters, extend the end
+
+ src/hb-buffer.cc | 20 ++++++++++++++------
+ 1 file changed, 14 insertions(+), 6 deletions(-)
+
+commit 28ce5fa454b54f728044ee12a9dbe7d016783d4a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 20:13:56 2012 -0400
+
+    Merge clusters when ligating
+
+ src/hb-ot-layout-gsub-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2bb1761ccb7d300744ced6427165f4ea75ddf96c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 19:29:44 2012 -0400
+
+    Minor, use next_glyph()
+
+ src/hb-ot-layout-gsub-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5f68f8675e5ccaee91f5a90d86bc3b022b9a54e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 19:23:43 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 872969126756456a69bf958f3df6e56a26e57b0a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 14:18:30 2012 -0400
+
+    Increase Uniscribe MAX_ITEMS
+
+ src/hb-uniscribe.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dbffa4c83d29c689ee4cd8a1c53e84521028c711
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 14:08:32 2012 -0400
+
+    Fix Uniscribe charset matching
+
+    Previously was failing to match fonts that didn't support
+    CHARSET_ANSI.
+
+    There still remains a problem with the Uniscribe backend, in that if a
+    font with the same family name is installed, and is newer, the native
+    one is preferred over the font we provide.  Fixing it requires
+    rewriting
+    the name table with a unique family name...
+
+ src/hb-uniscribe.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 82e8bd8628aeb37835fb019a71b6bdac87824b97
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 11:48:29 2012 -0400
+
+    Remove unused code
+
+ src/hb-uniscribe.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 6da9dbff21b47fb10794b8d6cb747393c9eab7dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 10:53:35 2012 -0400
+
+    Remove zero-width chars in the fallback shaper too
+
+ src/hb-fallback-shape.cc | 16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+commit 68b76121f83fc9b87dc84f03e8bef38d4332734d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 10:43:49 2012 -0400
+
+    Fix regressions introduced by sed.  Ouch!
+
+    Introduced in 99c2695759a6af855d565f4994bbdf220570bb48.
+    Broken mark-mark and mark-ligature stuff.
+
+ src/hb-ot-layout-gpos-table.hh       | 6 +++---
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 0dd86f9f6849d82d60a99e66b6928795cfb2a3c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 10:23:03 2012 -0400
+
+    Whitespace
+
+ src/hb-uniscribe.cc | 144
+ ++++++++++++++++++++++++++--------------------------
+ 1 file changed, 72 insertions(+), 72 deletions(-)
+
+commit 8e7beba7c3b3dea3cb3b7e280c5aab4f13b92d31
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 10:22:06 2012 -0400
+
+    Fix Uniscribe clusters with direction-overriden Arabic
+
+ src/hb-uniscribe.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b069c3c31bfbbf160eb897c7474be9ea90ed4fc1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 10:10:29 2012 -0400
+
+    Really fix override-direction in Uniscribe
+
+ src/hb-uniscribe.cc | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+commit fcd6f5326166e993b8f5222efbaffe916da98f0a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 09:59:43 2012 -0400
+
+    Unbreak Uniscribe
+
+    Oops.  hb_tag_t and OPENTYPE_TAG have different endianness.  Perhaps
+    something to add API for in hb-uniscribe.h
+
+ src/hb-private.hh   | 12 +++++++++++-
+ src/hb-uniscribe.cc |  8 ++++----
+ 2 files changed, 15 insertions(+), 5 deletions(-)
+
+commit 29eac8f591fdb86f1c4fdc0a6ab63910ff286b84
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 09:26:17 2012 -0400
+
+    Override direction in Uniscribe backend
+
+    Matches OT backend now.
+
+ src/hb-uniscribe.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1c1233e57686d77d89fe3ac1dc53de9ee60798c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 8 09:20:53 2012 -0400
+
+    Make Uniscribe backend respect selected script
+
+ src/hb-uniscribe.cc | 15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+commit 0bb0f5d41976ae27c5c7a51cbb82144b48315a4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 7 17:42:48 2012 -0400
+
+    Add note re _NullPool
+
+ src/hb-open-type-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2a3d911fe0ff5d6442659d3381d5b08c30ee2896
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 7 17:31:46 2012 -0400
+
+    Fix alignment-requirement missmatch
+
+    Detected by clang and lots of cmdline options.
+
+ src/hb-buffer-private.hh             | 2 +-
+ src/hb-buffer.cc                     | 5 +++--
+ src/hb-ot-layout-gsub-table.hh       | 4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 4 files changed, 7 insertions(+), 6 deletions(-)
+
+commit 6095de1635441af16340c7b2c5a6b4c531ec242f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 7 15:48:18 2012 -0400
+
+    Fix clang warning with NO_MT path
+
+ src/hb-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a18280a8ce9128fc9d75f8a367ae8ce0886a9599
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 7 15:44:12 2012 -0400
+
+    Fix warnings produced by clang analyzer
+
+ src/hb-icu.cc          | 6 ++++--
+ test/api/test-blob.c   | 2 +-
+ test/api/test-buffer.c | 4 ++--
+ util/helper-cairo.cc   | 2 +-
+ 4 files changed, 8 insertions(+), 6 deletions(-)
+
+commit 7ec83051c05777c0e6e2eea6ef6c71effede9527
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 7 13:32:57 2012 -0400
+
+    Fix warnings
+
+ util/ansi-print.cc | 30 +++++++++++++-----------------
+ 1 file changed, 13 insertions(+), 17 deletions(-)
+
+commit 73cb02de2dd28b09d4aa76230132248215cfe83d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 6 11:29:25 2012 -0400
+
+    Minor
+
+ src/hb-private.hh | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit 79e2b4791fe95ede9a1e6b1c71ccc6e36c4fc0e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 6 11:27:17 2012 -0400
+
+    Fix ASSERT_POD on clang
+
+    As reported by bashi.  Not tested.
+
+ src/hb-private.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 4282d2f3771d6510c27b62e54cc1254d6f2389b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 6 03:42:36 2012 -0400
+
+    Enabled ICU again
+
+ configure.ac | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 6220e5fc0dad728e67a92e838d3ac275d032f2c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 6 03:30:09 2012 -0400
+
+    Add ASSERT_POD for most objects
+
+ src/hb-blob.cc            | 1 +
+ src/hb-buffer-private.hh  | 2 ++
+ src/hb-font-private.hh    | 3 +++
+ src/hb-object-private.hh  | 2 ++
+ src/hb-private.hh         | 2 +-
+ src/hb-set-private.hh     | 4 +++-
+ src/hb-unicode-private.hh | 1 +
+ 7 files changed, 13 insertions(+), 2 deletions(-)
+
+commit a00a63b5ef503fafa87e26b517732b2214e01719
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 6 03:07:01 2012 -0400
+
+    Add macros to check that types are POD
+
+ configure.ac                |  1 +
+ src/hb-open-type-private.hh | 32 ++++++++++++++++++++------------
+ src/hb-private.hh           | 24 ++++++++++++++++++++++++
+ 3 files changed, 45 insertions(+), 12 deletions(-)
+
+commit 61eb60c129e865e92f6a5767a88c44a391f4d413
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 21:14:04 2012 -0400
+
+    Don't link to libstdc++
+
+    New try.
+
+ src/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 81a4b9fd4eb8995c5930db1df3669db93661eb52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 20:49:51 2012 -0400
+
+    Remove unused hb_static_mutex_t
+
+ src/hb-mutex-private.hh | 11 -----------
+ 1 file changed, 11 deletions(-)
+
+commit 4a3a9897b3698dd09c3e880b3ddd4db24c6fb460
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 20:39:07 2012 -0400
+
+    Disable Intel atomic ops on mingw32
+
+    Apparently the configure test is not enough...
+
+ src/hb-atomic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0594a2448440208efa0acac9a5d8d52d43108289
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 20:35:40 2012 -0400
+
+    Cleanup TRUE/FALSE vs true/false
+
+ src/hb-atomic-private.hh           |  4 +--
+ src/hb-blob.cc                     | 28 +++++++++---------
+ src/hb-buffer-private.hh           |  2 +-
+ src/hb-buffer.cc                   | 38 ++++++++++++-------------
+ src/hb-buffer.h                    |  4 +--
+ src/hb-fallback-shape.cc           |  2 +-
+ src/hb-font.cc                     | 22 +++++++--------
+ src/hb-ft.cc                       | 22 +++++++--------
+ src/hb-glib.cc                     | 16 +++++------
+ src/hb-graphite2.cc                |  8 +++---
+ src/hb-icu.cc                      | 30 ++++++++++----------
+ src/hb-ot-layout.cc                | 28 +++++++++---------
+ src/hb-ot-shape-complex-private.hh |  2 +-
+ src/hb-ot-shape-normalize.cc       | 16 +++++------
+ src/hb-ot-shape.cc                 |  4 +--
+ src/hb-private.hh                  | 18 ++++--------
+ src/hb-set.cc                      |  2 +-
+ src/hb-set.h                       |  2 +-
+ src/hb-shape.cc                    |  6 ++--
+ src/hb-tt-font.cc                  | 12 ++++----
+ src/hb-unicode.cc                  |  8 +++---
+ src/hb-uniscribe.cc                | 18 ++++++------
+ src/main.cc                        |  2 +-
+ util/hb-shape.cc                   |  2 +-
+ util/helper-cairo.cc               | 16 +++++------
+ util/main-font-text.hh             |  2 +-
+ util/options.cc                    | 58
+ +++++++++++++++++++-------------------
+ util/options.hh                    |  2 +-
+ util/view-cairo.hh                 |  2 +-
+ 29 files changed, 185 insertions(+), 191 deletions(-)
+
+commit e1ac38f8dd04c29d2d4140f5a492cdaf25d72901
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 20:31:49 2012 -0400
+
+    Fix inert buffer set_length() with zero
+
+    Oops!
+
+ src/hb-buffer.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 04bc1eebe7a304c0e6f86ab6814c65889f152602
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 20:16:56 2012 -0400
+
+    Add configure tests for Intel atomic intrinsics
+
+ configure.ac             | 17 +++++++++++++++++
+ src/hb-atomic-private.hh | 12 ++++++------
+ src/hb-mutex-private.hh  |  2 +-
+ 3 files changed, 24 insertions(+), 7 deletions(-)
+
+commit 68c75b46977beb57e35082db26be712b3cd65678
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 19:55:46 2012 -0400
+
+    Shuffle
+
+ configure.ac | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit f64b2ebf82c5f355cd95806478cd30c00b1a2731
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 19:23:29 2012 -0400
+
+    Remove last static initializer
+
+    We're free!  Lazy or immediate...
+
+ src/hb-ft.cc    |   2 +
+ src/hb-shape.cc | 150
+ ++++++++++++++++++++++++++++++++++++++++----------------
+ 2 files changed, 110 insertions(+), 42 deletions(-)
+
+commit 4a8a529068fc380298bb05b9d878bede3e9f4da1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 19:17:02 2012 -0400
+
+    Make hb-view err if all shapers failed
+
+ util/view-cairo.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 04aed572f112b96a6033cd6c3df7bdba5e29e93c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 18:30:19 2012 -0400
+
+    Make hb-ft static-initializer free
+
+ src/hb-common.cc |  5 ++---
+ src/hb-ft.cc     | 38 +++++++++++++++++++++++++++-----------
+ 2 files changed, 29 insertions(+), 14 deletions(-)
+
+commit be4560a3b5e8599cbe2b29a01a60c21c9e2b194f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 18:14:03 2012 -0400
+
+    Undo default unicode-funcs to avoid static initializer again
+
+ src/hb-buffer.cc          |  2 +-
+ src/hb-glib.cc            | 23 ++++++++++++-----------
+ src/hb-icu.cc             | 24 +++++++++++++-----------
+ src/hb-unicode-private.hh | 10 +++++-----
+ src/hb-unicode.cc         | 26 ++++++++++++++------------
+ 5 files changed, 45 insertions(+), 40 deletions(-)
+
+commit 093171cceca63e48e735bbf05a2c11b1b7e95ef1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 18:00:45 2012 -0400
+
+    Implement lock-free hb_language_t
+
+    Another static-initialization down.  One more to go.
+
+ src/hb-common.cc | 66
+ +++++++++++++++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 54 insertions(+), 12 deletions(-)
+
+commit 6843ce01be0df501ef3149a2c1c54cdfb693195d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 17:27:20 2012 -0400
+
+    Add atomic-pointer functions
+
+    Gonig to use these for lock-free linked-lists, to be used for
+    hb_language_t among other things.
+
+ src/hb-atomic-private.hh | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit cdafe3a7d8483ac586e2c16487e2a09164e0f65c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 16:34:49 2012 -0400
+
+    Add gcc intrinsics implementations for atomic and mutex
+
+ configure.ac             |  4 ++--
+ src/hb-atomic-private.hh | 11 +++++++++--
+ src/hb-mutex-private.hh  | 51
+ +++++++++++++++++++++++++++++++++++++++++-------
+ src/hb-object-private.hh |  4 +++-
+ src/hb-warning.cc        | 14 ++++++-------
+ 5 files changed, 65 insertions(+), 19 deletions(-)
+
+commit d970d2899b36a2fbd002b224b8bd37b0906fdd5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 16:06:28 2012 -0400
+
+    Add gcc implementation for atomic ops
+
+ src/hb-atomic-private.hh | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 0e253e97af71e2a7ead153589f61fd579a247502
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 15:37:19 2012 -0400
+
+    Add a mutex to object header
+
+    Removes one more static-initialization.  A few more to go.
+
+ src/hb-common.cc         | 24 +++++++++---------------
+ src/hb-mutex-private.hh  | 19 +++++++------------
+ src/hb-object-private.hh | 36 ++++++++++++++++++++++--------------
+ src/hb-private.hh        | 11 +++++------
+ 4 files changed, 43 insertions(+), 47 deletions(-)
+
+commit a2b471df821b32625d127f83b2f90e6d6a967e7e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 15:17:44 2012 -0400
+
+    Remove static initializers from indic
+
+ src/hb-ot-shape-complex-indic.cc | 50
+ +++++++++++++++++++++++++++++++---------
+ 1 file changed, 39 insertions(+), 11 deletions(-)
+
+commit f06ab8a4262c759b4723614fd28f55ee77aa8466
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 12:31:51 2012 -0400
+
+    Better hide nil objects and make them const
+
+ src/hb-blob.cc            | 34 +++++++++++------------
+ src/hb-buffer.cc          | 39 +++++++++++++-------------
+ src/hb-font.cc            | 70
+ +++++++++++++++++++++++------------------------
+ src/hb-ft.cc              | 49 +++++++++++++++------------------
+ src/hb-glib.cc            | 25 ++++++++---------
+ src/hb-icu.cc             | 25 ++++++++---------
+ src/hb-set.cc             | 16 +++++------
+ src/hb-unicode-private.hh | 11 ++++----
+ src/hb-unicode.cc         | 34 +++++++++++------------
+ 9 files changed, 146 insertions(+), 157 deletions(-)
+
+commit bf93b636c4963cbc32d5fba7ace1053db6719192
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 14:17:32 2012 -0400
+
+    Remove constructor from hb_prealloced_array_t
+
+    This was causing all object types to be non-POD and have static
+    initializers.  We don't need that!
+
+    Now, most nil objects just moved from .bss to .data.  Fixing for that
+    coming soon.
+
+ src/hb-object-private.hh | 3 +++
+ src/hb-private.hh        | 4 +++-
+ src/hb-set-private.hh    | 1 +
+ 3 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 7037291aacb858f8090fd7d9028c196cc1a21703
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 13:30:11 2012 -0400
+
+    Check for atexit()
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f1971a217424bd6db5c7072ba5cf197f318d4e47
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 5 13:04:20 2012 -0400
+
+    Fix warnings
+
+ src/indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b0a6e58bb3dda72dcce37d54d987591630a3db6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 4 10:21:22 2012 -0400
+
+    s/script-punjabi/script-gurmukhi/
+
+ test/shaping/texts/in-tree/shaper-indic/indic/MANIFEST                  |
+ 2 +-
+ .../shaper-indic/indic/{script-punjabi => script-gurmukhi}/MANIFEST
+ | 0
+ .../indic/{script-punjabi => script-gurmukhi}/misc/MANIFEST             |
+ 0
+ .../indic/{script-punjabi => script-gurmukhi}/misc/misc.txt             |
+ 0
+ .../indic/{script-punjabi => script-gurmukhi}/utrrs/LICENSE             |
+ 0
+ .../indic/{script-punjabi => script-gurmukhi}/utrrs/MANIFEST            |
+ 0
+ .../shaper-indic/indic/{script-punjabi => script-gurmukhi}/utrrs/README
+ | 0
+ .../indic/{script-punjabi => script-gurmukhi}/utrrs/SOURCES             |
+ 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt            |
+ 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt                |
+ 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-GurmukhiSpecific.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+ | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt              |
+ 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+ | 0
+ .../indic/{script-punjabi => script-gurmukhi}/utrrs/codepoint/MANIFEST
+ | 0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt                       |
+ 0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt                       |
+ 0
+ .../indic/{script-punjabi => script-gurmukhi}/utrrs/gpos/MANIFEST
+ | 0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt                                 |
+ 0
+ .../indic/{script-punjabi => script-gurmukhi}/utrrs/gsub/MANIFEST
+ | 0
+ 21 files changed, 1 insertion(+), 1 deletion(-)
+
+commit c1885483120d4b686b2fe95b217dce7248e040b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 4 08:56:00 2012 -0400
+
+    Add --verbose to hb-shape
+
+    Just turns all --show-* options on.
+
+ util/options.cc | 11 +++++++++++
+ util/options.hh |  1 -
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 9fc7a11469113d31d8095757c4fc038c3427d44a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 4 08:28:19 2012 -0400
+
+    Remove comma at the end of enum
+
+    As reported by Jonathan Kew on the list.
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3b8fd9c48f4bde368bf2d465c148b9743a9216ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 3 15:54:19 2012 -0400
+
+    Remove const from ref_count.ref_count
+
+    According to Tom Hacohen this was breaking build with some compilers.
+
+    In file included from hb-buffer-private.hh:35:0,
+                     from hb-ot-map-private.hh:32,
+                     from hb-ot-shape-private.hh:32,
+                     from hb-ot-shape.cc:29:
+    hb-object-private.hh: In constructor
+    '_hb_object_header_t::_hb_object_header_t()':
+    hb-object-private.hh:97:8: error: uninitialized const member in
+    'struct hb_reference_count_t'
+    hb-object-private.hh:51:25: note: 'hb_reference_count_t::ref_count'
+    should be initialized
+    In file included from hb-ot-shape.cc:33:0:
+    hb-set-private.hh: In constructor '_hb_set_t::_hb_set_t()':
+    hb-set-private.hh:37:8: note: synthesized method
+    '_hb_object_header_t::_hb_object_header_t()' first required here
+    hb-ot-shape.cc: In function 'void
+    hb_ot_shape_glyphs_closure(hb_font_t*, hb_buffer_t*, const
+    hb_feature_t*, unsigned int, hb_set_t*)':
+    hb-ot-shape.cc:521:12: note: synthesized method
+    '_hb_set_t::_hb_set_t()' first required here
+
+ src/hb-object-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 70600dbf626808a30fb0fd8b7ae860e64d9ffe87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 3 15:52:51 2012 -0400
+
+    Minor
+
+ src/hb-object-private.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit ae62166519291057316a9d15cea3f1570fcb5eaf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 2 12:21:19 2012 -0400
+
+    [util] Minor
+
+ util/options.cc        |  4 +---
+ util/options.hh        | 26 ++++++++++++++------------
+ util/shape-consumer.hh |  4 +++-
+ 3 files changed, 18 insertions(+), 16 deletions(-)
+
+commit 5db0683a822f70c914468430cda6487cee740ae3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 2 12:13:08 2012 -0400
+
+    [util] Make hb-shape continue shaping other lines if shapers failed
+
+ util/hb-ot-shape-closure.cc |  3 +++
+ util/hb-shape.cc            | 36 +++++++++++++++++++++++++------
+ util/main-font-text.hh      |  2 +-
+ util/options.cc             | 34 ++++++++++++++++++++++-------
+ util/options.hh             | 33 ++++++++++++++--------------
+ util/shape-consumer.hh      | 17 ++++++++++++---
+ util/view-cairo.cc          | 47 +++++++---------------------------------
+ util/view-cairo.hh          | 52
+ +++++++++++++++++++++++++++++++++++++++------
+ 8 files changed, 143 insertions(+), 81 deletions(-)
+
+commit 96a9ef0c9fca8d58d8dc6baf6b262d96587abee0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 1 13:46:26 2012 -0400
+
+    Remove tab character like other "zero-width" characters
+
+    Uniscribe does that, this make comparing results to Uniscribe
+    easier.
+
+ src/hb-unicode-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit cd6a5493411fea30a04466128e1a37b4d89c6a72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 1 13:45:25 2012 -0400
+
+    Remove unused variable
+
+ util/hb-ot-shape-closure.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 0558d55bac7fb9279aac859b465e7c0e3ad97492
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 28 10:46:47 2012 -0400
+
+    Remove hb_atomic_int_set/get()
+
+    We never use them in fact...
+
+    I'm just adjusting these as I better understand the requirements of
+    the code and the guarantees of each operation.
+
+ src/hb-atomic-private.hh |  8 --------
+ src/hb-object-private.hh | 12 +++++-------
+ 2 files changed, 5 insertions(+), 15 deletions(-)
+
+commit 4efdffec095e19ceeb4b319d60201e84ece30fd9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 27 22:39:48 2012 -0400
+
+    Minor Malayalam test case
+
+    From https://bugs.freedesktop.org/show_bug.cgi?id=45166
+
+ .../texts/in-tree/shaper-indic/indic/script-malayalam/misc/misc.txt
+ | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit dfff5b3021016d3a472c100272fd8e2f52307860
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 27 22:07:04 2012 -0400
+
+    Add Myanmar test case
+
+ test/shaping/texts/in-tree/shaper-indic/south-east-asian/MANIFEST
+ | 1 +
+ .../texts/in-tree/shaper-indic/south-east-asian/script-myanmar/MANIFEST
+ | 1 +
+ .../in-tree/shaper-indic/south-east-asian/script-myanmar/misc/MANIFEST
+ | 1 +
+ .../in-tree/shaper-indic/south-east-asian/script-myanmar/misc/misc.txt
+ | 1 +
+ 4 files changed, 4 insertions(+)
+
+commit bce095524b3e69a47f8e88a2fb02d6ab537f9b0a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 27 11:29:21 2012 -0400
+
+    Add hb_font_get_glyph_name() and hb_font_get_glyph_from_name()
+
+ TODO                        |  1 +
+ src/hb-font-private.hh      |  2 ++
+ src/hb-font.cc              | 80
+ +++++++++++++++++++++++++++++++++++----------
+ src/hb-font.h               | 28 ++++++++++++++++
+ src/hb-ft.cc                | 52 ++++++++++++++++++++++++-----
+ util/hb-ot-shape-closure.cc |  9 ++---
+ util/options.cc             | 10 ++----
+ 7 files changed, 142 insertions(+), 40 deletions(-)
+
+commit bc145658bdaeaeea0cdbd719e2756f09a2dbfb48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 27 10:45:57 2012 -0400
+
+    Warn if no Unicode functions implementation is found
+
+ src/hb-unicode-private.hh |  1 +
+ src/hb-warning.cc         | 13 +++++++++++++
+ 2 files changed, 14 insertions(+)
+
+commit a3547330fa88e30a138f6f17e60d9c7d1e316622
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 27 10:20:47 2012 -0400
+
+    Cleanup atomic ops on OS X
+
+ src/hb-atomic-private.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit e4b6d503c5575ddbf49249e3fef693d75ae75170
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 27 10:11:13 2012 -0400
+
+    Don't use atomic ops in hb_cache_t
+
+    We don't care about linearizability, so unprotected int read/write
+    are enough, no need for expensive memory barriers.  It's a cache,
+    that's all.
+
+ src/hb-cache-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 819faa05307aa192015f4b43d8103a35e87d6cc7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 27 10:09:18 2012 -0400
+
+    Minor
+
+ src/hb-atomic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 303d5850ec0516e198db241456b0cfc4899ef9c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 27 10:01:13 2012 -0400
+
+    Fix Windows atomic get/set
+
+    According to:
+    http://msdn.microsoft.com/en-us/library/65tt87y8.aspx
+
+    MemoryBarrier() is the right macro to protect these, not
+    _ReadBarrier()
+    and/or _WriteBarrier().
+
+ src/hb-atomic-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8f8956a55fff95e5ad529d2f124c9528d1f4f81d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 25 14:30:24 2012 -0400
+
+    [util] Add hidden --shaper that is equivalent of --shapers
+
+ util/helper-cairo.cc | 2 +-
+ util/options.cc      | 6 +++++-
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 29ce446d3161b7ea5874352e5f8eb33cd59338c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 25 14:17:54 2012 -0400
+
+    Add set iterator
+
+ src/hb-set-private.hh       | 26 +++++++++++++++++++++++---
+ src/hb-set.cc               |  7 +++++++
+ src/hb-set.h                | 11 +++++++++--
+ util/hb-ot-shape-closure.cc |  8 +++++---
+ 4 files changed, 44 insertions(+), 8 deletions(-)
+
+commit 62c3e111fce0ad34960871134c2eb6da572df303
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 25 13:48:00 2012 -0400
+
+    Add set symmetric difference
+
+ src/hb-set-private.hh | 5 +++++
+ src/hb-set.cc         | 7 +++++++
+ src/hb-set.h          | 6 ++++++
+ 3 files changed, 18 insertions(+)
+
+commit 27aba594c90b4444c35273a38f5fedc8e09d9a88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 24 15:00:01 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-indic-machine.rl | 2 +-
+ src/hb-ot-shape-complex-indic.cc         | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit cde1c0114ba66a45d907e81a49bf625e0dc946b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 24 10:46:39 2012 -0400
+
+    Fix hb_atomic_int_set() implementation for HB_NO_MT
+
+    As pointed out by Jonathan Kew.
+
+ src/hb-atomic-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3b9b7133bea787f787170beea073f185e36d2327
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 23 22:00:25 2012 -0400
+
+    Update TODO
+
+ TODO | 18 ++++++++++++++++--
+ 1 file changed, 16 insertions(+), 2 deletions(-)
+
+commit ff3524c21aabf5d0d6014d1ce1b3e12ca5f0990f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 23 21:50:43 2012 -0400
+
+    Add Arabic diacritics tests
+
+ .../shaper-arabic/script-arabic/misc/MANIFEST      |   2 +-
+ .../script-arabic/misc/diacritics/MANIFEST         |   5 +
+ .../script-arabic/misc/diacritics/lam-alef.txt     |  28 +
+ .../misc/diacritics/language-arabic.txt            | 695
+ +++++++++++++++++++++
+ .../misc/diacritics/language-persian.txt           |  48 ++
+ .../misc/diacritics/language-urdu.txt              | 188 ++++++
+ .../misc/{ => diacritics}/ligature-diacritics.txt  |   0
+ 7 files changed, 965 insertions(+), 1 deletion(-)
+
+commit ed2f1363a391add41f10cff18792003583a10257
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 22 22:12:22 2012 -0400
+
+    Fix substitution glyph class propagation
+
+    The old code was doing nothing.
+
+    Still got to find an example font+string that makes this matter, but
+    need this for fixing synthetic GDEF anyway.
+
+ src/hb-ot-layout-gsub-table.hh       | 10 ++++------
+ src/hb-ot-layout-gsubgpos-private.hh | 23 ++++++-----------------
+ 2 files changed, 10 insertions(+), 23 deletions(-)
+
+commit a6de53664df9549a5dc93752647ea1d3bb336f7b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 18 15:04:35 2012 -0400
+
+    Add CJK Compatibility Ideographs tests
+
+    From:
+    http://people.mozilla.org/~jdaggett/tests/cjkcompat.html
+
+ test/shaping/texts/in-tree/shaper-default/MANIFEST                     |
+ 3 ++-
+ .../in-tree/shaper-default/{script-japanese => script-han}/MANIFEST
+ | 0
+ test/shaping/texts/in-tree/shaper-default/script-han/misc/MANIFEST     |
+ 1 +
+ .../texts/in-tree/shaper-default/script-han/misc/cjk-compat.txt        |
+ 3 +++
+ test/shaping/texts/in-tree/shaper-default/script-hiragana/MANIFEST     |
+ 1 +
+ .../shaper-default/{script-japanese => script-hiragana}/misc/MANIFEST
+ | 0
+ .../{script-japanese => script-hiragana}/misc/kazuraki-liga-lines.txt
+ | 0
+ .../{script-japanese => script-hiragana}/misc/kazuraki-liga.txt
+ | 0
+ 8 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 20fdb0f41d81b226e076a4830d4b0d03da31fc19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 17 22:04:45 2012 -0400
+
+    Add a lock-free cache type for int->int functions
+
+    To be used for cmap and advance caching if desired.
+
+ TODO                    |  2 ++
+ src/Makefile.am         |  1 +
+ src/hb-cache-private.hh | 72
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-font.cc          |  2 ++
+ 4 files changed, 77 insertions(+)
+
+commit bd908b4f102b5ae18a3ad4a8b137994cf74b86ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 17 22:02:08 2012 -0400
+
+    Implement hb_atomic_int_set() for OS X
+
+ src/hb-atomic-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 022a05ae90f30bcddff413022e0cd801809b5390
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 17 21:53:24 2012 -0400
+
+    Minor
+
+ src/hb-atomic-private.hh | 4 +++-
+ src/hb-mutex-private.hh  | 4 +++-
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 22afd66a30d01b6771405e76777306f600807bea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 17 21:23:49 2012 -0400
+
+    Add hb_atomic_int_set() again
+
+ src/hb-atomic-private.hh | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 4aa7258cb16176a89e1547fee8f86571fdd98307
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 17 21:01:04 2012 -0400
+
+    Fix type conflicts on Windows without glib
+
+ src/hb-tt-font.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit f039e79d5438a8fc4a3ec11a387bbfc0f6b83024
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 17 20:55:12 2012 -0400
+
+    Don't use min/max as function names
+
+    They can be macros on some systems.  Eg. mingw32.
+
+ src/hb-set-private.hh | 4 ++--
+ src/hb-set.cc         | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 34961e3198e27fa37fd4cfdad12ef86a2e9e51c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 17 20:50:38 2012 -0400
+
+    Prefer native atomic/mutex ops to glib's
+
+ src/hb-atomic-private.hh | 29 ++++++++++++++++-------------
+ src/hb-mutex-private.hh  | 24 ++++++++++++++----------
+ 2 files changed, 30 insertions(+), 23 deletions(-)
+
+commit ec3ba4b96fc4f262db1ff9f906628c32f26c9b7d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 17 20:30:46 2012 -0400
+
+    Move atomic ops into their own header
+
+ src/Makefile.am          |  1 +
+ src/hb-atomic-private.hh | 78
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-mutex-private.hh  |  1 -
+ src/hb-object-private.hh | 52 ++------------------------------
+ src/hb-warning.cc        |  2 +-
+ 5 files changed, 82 insertions(+), 52 deletions(-)
+
+commit de0878395be5c72d7058faac8f64715bdd42eb3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 17 20:15:49 2012 -0400
+
+    Update TODO
+
+ TODO | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit c87b317f0eb118e67134e8e419a6d65e0fa40d30
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 15 23:53:18 2012 -0400
+
+    [util] Add hb-ot-shape-closure tool
+
+    Computes all the glyphs that may be generated given a font and
+    set of Unicode characters.
+
+    The order of the Unicode characters is irrelevant.
+
+    Sample output:
+
+    behdad:util 0$ ./hb-ot-shape-closure Doulos\ SIL\ Regular.ttf f
+    f f_f
+
+    behdad:util 0$ ./hb-ot-shape-closure Doulos\ SIL\ Regular.ttf i
+    i
+
+    behdad:util 0$ ./hb-ot-shape-closure Doulos\ SIL\ Regular.ttf fi
+    f f_i f_f_i f_f i
+
+    behdad:util 0$ ./hb-ot-shape-closure DroidNaskh-Regular.ttf ب
+    uni0628 uni0628.init uni0628.medi uni0628.fina
+
+    behdad:util 0$ ./hb-ot-shape-closure DroidNaskh-Regular.ttf ا
+    uni0627 uni0627.fina
+
+    behdad:util 0$ ./hb-ot-shape-closure DroidNaskh-Regular.ttf با
+    uni0627 uni0627.fina uni0628 uni0628.init uni0628.medi uni0628.fina
+
+    behdad:util 0$ ./hb-ot-shape-closure DroidNaskh-Regular.ttf با
+    --no-glyph-names
+    5 6 133 134 135 136
+
+ configure.ac                |   2 +-
+ util/Makefile.am            |  22 ++++++---
+ util/hb-ot-shape-closure.cc | 112
+ ++++++++++++++++++++++++++++++++++++++++++++
+ util/options.hh             |  12 +++++
+ 4 files changed, 140 insertions(+), 8 deletions(-)
+
+commit 45675e589e6ef9f81b2a4199cf33e3e7778433a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 15 23:10:39 2012 -0400
+
+    [util] Refactor to accommodate for upcoming new tool
+
+ util/Makefile.am                       | 10 +++--
+ util/hb-shape.cc                       | 70
+ +++++++++++++++-------------------
+ util/hb-view.cc                        |  8 ++--
+ util/{hb-view.hh => main-font-text.hh} | 48 +++++++++++------------
+ util/shape-consumer.hh                 | 69
+ +++++++++++++++++++++++++++++++++
+ 5 files changed, 135 insertions(+), 70 deletions(-)
+
+commit 1d6846db9ebf84561bb30a4e48c6c43184914099
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 18:09:29 2012 +0200
+
+    [Indic] Apply vatu feature after cjct
+
+    Testing with old Deva spec this reduces failures.
+    Test sequence: U+0915,U+094D,U+0930.
+
+ src/hb-ot-shape-complex-indic.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 8caf5dcd66550351c6038b9ae7ecc5254eed64ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 17:10:18 2012 +0200
+
+    Minor
+
+ util/ansi-print.cc | 67
+ +++++++++++++++++++++++++++---------------------------
+ 1 file changed, 33 insertions(+), 34 deletions(-)
+
+commit 617f4ac46f1084859d2034c08760e31e52d3bec3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 16:48:03 2012 +0200
+
+    Refactor
+
+ src/hb-ot-shape-complex-indic.cc | 44
+ +++++++++++++++++++++-------------------
+ 1 file changed, 23 insertions(+), 21 deletions(-)
+
+commit 5e4e21fce4b548b0b8a5951bc8f35a9f27428192
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 16:46:08 2012 +0200
+
+    Revert "[Indic] Refactoring"
+
+    This reverts commit 0831061efb78983b9c6e1e72574c977e56383c08.
+
+ src/hb-ot-shape-complex-indic.cc | 28 ++++++++--------------------
+ 1 file changed, 8 insertions(+), 20 deletions(-)
+
+commit 3f18236a03880c0960f5990dc90685f6146951a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 16:20:10 2012 +0200
+
+    Fix more warnings
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ src/hb-ot-layout-gsub-table.hh     | 2 +-
+ src/hb-ot-shape-complex-indic.cc   | 8 ++++----
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 9f377ed3210fe7d9f15e0c4f82020556f9a8f6f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 16:13:44 2012 +0200
+
+    Fix more unused-var warnings
+
+ src/hb-ot-shape-complex-arabic.cc |  7 +++++--
+ src/hb-ot-shape-complex-indic.cc  | 25 ++++++++++++++++++-------
+ src/hb-ot-shape-complex-misc.cc   | 21 +++++++++++++++------
+ src/hb-ot-shape-normalize.cc      | 13 ++++++-------
+ src/hb-set.cc                     |  2 +-
+ 5 files changed, 45 insertions(+), 23 deletions(-)
+
+commit d993e72331c6c4c783b803e01e4d4a02c8e3eb77
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 16:04:36 2012 +0200
+
+    Fix hb_face_set_index()
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 93345edcbea49bdf0e22f26b5b74a23e601dfab4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 16:01:08 2012 +0200
+
+    Fix warnings
+
+ src/hb-fallback-shape.cc |  4 ++--
+ src/hb-private.hh        | 54
+ ++++++++++++++++++++++++------------------------
+ 2 files changed, 29 insertions(+), 29 deletions(-)
+
+commit eace47b173807d94b29a6490d0bc3c9f8f6168d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 15:54:43 2012 +0200
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 99c2695759a6af855d565f4994bbdf220570bb48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 15:45:18 2012 +0200
+
+    Add accessort to buffer for current info, current pos, and prev info
+
+ src/hb-buffer-private.hh             |  9 ++++++++
+ src/hb-ot-layout-gpos-table.hh       | 44
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gsub-table.hh       | 28 +++++++++++------------
+ src/hb-ot-layout-gsubgpos-private.hh | 28 +++++++++++------------
+ src/hb-ot-shape-complex-arabic.cc    |  4 ++--
+ src/hb-ot-shape-complex-misc.cc      |  5 ++--
+ src/hb-ot-shape-normalize.cc         | 16 ++++++-------
+ src/hb-ot-shape.cc                   |  8 +++----
+ 8 files changed, 76 insertions(+), 66 deletions(-)
+
+commit 6736f3c5b09af6a71935afc04248b033e171a9b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 15:21:06 2012 +0200
+
+    Minor
+
+ src/hb-ot-layout-gsubgpos-private.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 5df809b655bb1318115651fd87d4555cdd9b41cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 15:17:51 2012 +0200
+
+    [GSUB/GPOS] Remove context_length
+
+    The spec doesn't say contextual matching should be done this way,
+    and AOTS doesn't do it either.  It was inherited from old HarfBuzz.
+    Remove it.
+
+ src/hb-ot-layout-common-private.hh   |  1 -
+ src/hb-ot-layout-gpos-table.hh       |  3 ---
+ src/hb-ot-layout-gsub-table.hh       |  6 ++----
+ src/hb-ot-layout-gsubgpos-private.hh | 32
+ +++++++++++---------------------
+ 4 files changed, 13 insertions(+), 29 deletions(-)
+
+commit 28b9d502bb69a8045818d5f6113ded9c59a56bd7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 15:04:00 2012 +0200
+
+    Minor
+
+ src/hb-ot-layout-gsubgpos-private.hh | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+commit 50f630c17ced1bd59b4da4f27728dcfbb876400a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 13:03:44 2012 +0200
+
+    Remove ioctl checks
+
+    Ended up not using terminal size after all.
+
+ configure.ac       |  2 +-
+ util/ansi-print.cc | 11 -----------
+ 2 files changed, 1 insertion(+), 12 deletions(-)
+
+commit db0de7cd616e1e9d6fde6659e52a541477fb0148
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 13:02:38 2012 +0200
+
+    [util] Set ansi color only on color change
+
+ util/ansi-print.cc | 28 +++++++++++++++++++++++-----
+ 1 file changed, 23 insertions(+), 5 deletions(-)
+
+commit 912c5ff80a255edb8145b9db69e2ed828f8eab5c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 12:51:02 2012 +0200
+
+    Reduce default margin
+
+ util/options.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 52e7b1424a3613122e9ca30879298df42733acda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 02:02:58 2012 +0200
+
+    [util] Make hb-view print out Unicode art if stdout is a terminal
+
+ configure.ac              |   4 +-
+ util/Makefile.am          |   4 +
+ util/ansi-print.cc        | 411
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ util/ansi-print.hh        |  39 +++++
+ util/helper-cairo-ansi.cc | 102 ++++++++++++
+ util/helper-cairo-ansi.hh |  39 +++++
+ util/helper-cairo.cc      |  70 +++++++-
+ util/options.hh           |   3 +
+ 8 files changed, 668 insertions(+), 4 deletions(-)
+
+commit 8b2753ce2bea8a21ea757186d86dc4a55d8c8b0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 13 00:54:07 2012 +0200
+
+    Minor
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 30874b4819a99cc84fa39e794266685e1b8735d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 12 15:54:27 2012 +0200
+
+    [util] Make tools default to stdin if no text is provided
+
+    One less argument to type in typical testing workflow!
+
+ util/hb-view.hh |  4 +++-
+ util/options.cc | 12 +++++-------
+ util/options.hh |  2 +-
+ 3 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 2097951110e33fe091ed9515ae77e2683c46c889
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 12 15:41:48 2012 +0200
+
+    [util] Change default font size of hb-view to 256
+
+    Most common usecase of hb-view is to test rendering of short words for
+    testing / inspection.  Not having to type "--font-size 150" each time
+    isn't such a bad idea...
+
+ util/options.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 737dded2e08fcc19935db51c05201a987184d337
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 12 15:40:11 2012 +0200
+
+    Fix compiler warnings
+
+ src/hb-ot-shape-complex-indic.cc | 5 -----
+ 1 file changed, 5 deletions(-)
+
+commit f538fcb538f1decb4100ba89457eb83f2350d64b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 12 15:34:40 2012 +0200
+
+    [test] Make tool usage easier by not requiring "--stdin"
+
+    Just default to it.  Added "--help" instead to get usage.
+
+ test/shaping/hb_test_tools.py | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit a3273e30bb7ffd727ffc18af5716dfef705d3d94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 12 13:34:18 2012 +0200
+
+    [Indic] Add more Malayalam tests
+
+ .../indic/script-malayalam/misc/misc.txt           | 38
+ ++++++++++++++++++++++
+ 1 file changed, 38 insertions(+)
+
+commit 7f852b644b8143492a02edfc853114aaa23446bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 23:10:31 2012 +0200
+
+    Fix compiler warnings
+
+ src/hb-ot-shape-complex-indic.cc   | 2 +-
+ src/hb-ot-shape-complex-private.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit f7e8dcfd4fc377e3d786b097beb656284240456d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 22:00:06 2012 +0200
+
+    [Indic] Unbreak Devanagari
+
+    And this, concludes the HarfBuzz Massala Hackfest.
+
+    I like to specially thank Jonathan Kew for doing all the decription
+    and
+    letting me get commit points.
+
+ configure.ac                             | 2 +-
+ src/hb-ot-shape-complex-indic-private.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 6a091df9b403b147ef78f3974610dedf4ce1e08a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 21:42:27 2012 +0200
+
+    [Indic] Disambiguate sub vs post vs above matras
+
+    Bengali is at *just* above 5% now.
+
+ src/hb-ot-shape-complex-indic-private.hh | 31
+ +++++++++++++++----------------
+ src/hb-ot-shape-complex-indic.cc         | 12 ++++++------
+ 2 files changed, 21 insertions(+), 22 deletions(-)
+
+commit 9d0d319a4a7e85d922e58fade0f40caae1c9f109
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 21:36:32 2012 +0200
+
+    [Indic] Position Bengali Reph before matras
+
+ src/hb-ot-shape-complex-indic.cc | 62
+ +++++++++++++++++++++++-----------------
+ 1 file changed, 36 insertions(+), 26 deletions(-)
+
+commit f89367251109af235f4f0446c13c261a5a4a6f72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 21:10:03 2012 +0200
+
+    [Indic] Start categorizing Reph per script
+
+ src/hb-ot-shape-complex-indic.cc | 41
+ ++++++++++++++++++++++++++++++++++------
+ 1 file changed, 35 insertions(+), 6 deletions(-)
+
+commit a913b024d84973556094fd64ce5f0b7106fcc3b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 20:59:26 2012 +0200
+
+    [Indic] Apply 'init' feature for Bengali
+
+    Error down from 20% to 7%.
+
+ src/hb-ot-shape-complex-indic.cc | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+commit eed903b1644e087178438959664a6a57bebc398b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 20:50:53 2012 +0200
+
+    [Indic] Refactor for the arrival of 'init' feature
+
+    Yep, on Bengali now!
+
+ src/hb-ot-shape-complex-indic.cc | 52
+ +++++++++++++++++++++++++++-------------
+ 1 file changed, 36 insertions(+), 16 deletions(-)
+
+commit 18c06e189bd078affbb84c3bb5bb80687a227c5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 20:02:14 2012 +0200
+
+    [Indic] Add Uniscribe bug feature for dotted circle
+
+    For dotted-circle independent clusters, Uniscribe does no Reph shaping
+    for the exact sequence Ra+Halant+25CC.  Which also is the only
+    possible
+    sequence with 25CC at the end.
+
+ src/hb-ot-shape-complex-indic-machine.rl |  4 +++-
+ src/hb-ot-shape-complex-indic-private.hh |  3 ++-
+ src/hb-ot-shape-complex-indic.cc         | 20 ++++++++++++++++----
+ 3 files changed, 21 insertions(+), 6 deletions(-)
+
+commit 5b16de97bcc4b24da4c77ca6c1a42e814d8cdbd1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 19:55:42 2012 +0200
+
+    [Indic] Add tests for dottedcircle
+
+ .../in-tree/shaper-indic/indic/script-devanagari/misc/MANIFEST     | 1 +
+ .../shaper-indic/indic/script-devanagari/misc/dottedcircle.txt     |
+ 7 +++++++
+ 2 files changed, 8 insertions(+)
+
+commit 0831061efb78983b9c6e1e72574c977e56383c08
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 19:07:58 2012 +0200
+
+    [Indic] Refactoring
+
+ src/hb-ot-shape-complex-indic.cc | 26 ++++++++++++++++++--------
+ 1 file changed, 18 insertions(+), 8 deletions(-)
+
+commit 7ea58db311bfb0d8f804d1e9f4a1f004bd45075a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 18:58:57 2012 +0200
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 9c09928989316e2befe00d52ed66e055637ccd36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 18:46:35 2012 +0200
+
+    [Indic] Allow multiple Consonants in Vowel/NBSP syllables
+
+    Uniscribe allows multiple Halant+Consonant after a Vowel.
+    Tests:
+    ↦       * U+0905,U+094D,U+092B,U+094D,930,94d,930
+
+ src/hb-ot-shape-complex-indic-machine.rl | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 8c0aa486f31e9b6cbb31ce295573b53b0a214124
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 18:13:42 2012 +0200
+
+    [Indic] Allow two Nuktas per consonant
+
+    Uniscribe allows up to two nuktas per consonant and one per matra. It
+    does so
+    indepent of whether the consonant already has a nukta in it.  Tests:
+
+            * U+0916,U+093C,U+0941
+            * U+0959,U+093C,U+0941
+            * U+0916,U+093C,U+093C,U+0941
+            * U+0959,U+093C,U+093C,U+0941
+            * U+0916,U+093C,U+093C,U+093C,U+0941
+            * U+0959,U+093C,U+093C,U+093C,U+0941
+            * 915,93c,93c,,94d,U+0916,U+093C,U+093C,U+093e,93c,93c
+
+ src/hb-ot-shape-complex-indic-machine.rl | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 3399a06e7033651ee926448737bdb18e553c1796
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 17:54:26 2012 +0200
+
+    [Indic] Fix U+0952 and similar classification to match Uniscribe
+
+    See comments.
+
+ src/hb-ot-shape-complex-indic-machine.rl |  1 +
+ src/hb-ot-shape-complex-indic.cc         | 16 +++++++++++-----
+ 2 files changed, 12 insertions(+), 5 deletions(-)
+
+commit 11aa3ef18dbc6ac9561bd119f5ca2c1aa1209c3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 17:30:48 2012 +0200
+
+    [Indic] Treat U+0951..U+0954 all similar to U+0952
+
+ src/hb-ot-shape-complex-indic.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 5f131d3226131df440d7f36655e57f6effcae204
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 17:29:40 2012 +0200
+
+    [GSUB/GPOS/Indic] Apply GSUB/GPOS within syllables only
+
+    This does not apply to the context matchings.
+
+    This regresses tests right now.  And we are not sure whether this is
+    the right thing to do for GPOS.  But we'll figure out.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 18 ++++++++++++------
+ 1 file changed, 12 insertions(+), 6 deletions(-)
+
+commit 8fd83aaf6e50c2c25002c51fee26d82847a61769
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 17:18:37 2012 +0200
+
+    [GSUB/GPOS] Fix wrong buffer access in backward skippy mask matching
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ff24d1081af08a887895975285d7e38f5d07bc37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 17:07:08 2012 +0200
+
+    [Indic] Don't use syllable serial value 0
+
+ src/hb-ot-shape-complex-indic-machine.rl | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 892eb7878238d810a2a70f9dadbf958207bfeaa1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 16:54:40 2012 +0200
+
+    [Indic] Implement Uniscribe Reph+Matra+Halant bug feature
+
+ src/hb-ot-shape-complex-indic.cc | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit 67ea29af49bb08ee679914076808327992cf6676
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 16:51:23 2012 +0200
+
+    [Indic] Add example of different Uniscribe behavior
+
+ src/hb-ot-shape-complex-indic.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit ebe29733d44fe0fa9fb30f946ab0dd7a40336a24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 16:43:12 2012 +0200
+
+    [Indic] Add runtime Uniscribe bug compatibility mode!
+
+    Enable by setting envvar:
+
+      HB_OT_INDIC_OPTIONS=uniscribe-bug-compatible
+
+    Plus, LeftMatra+Halant "feature".
+
+ src/hb-ot-shape-complex-indic.cc | 44
+ ++++++++++++++++++++++++++++++----------
+ 1 file changed, 33 insertions(+), 11 deletions(-)
+
+commit 616e692e2950d326b6c46aba5b5bead3cc29d315
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 16:25:02 2012 +0200
+
+    [Indic] Add #define UNISCRIBE_BUG_COMPATIBLE 1
+
+ src/hb-ot-shape-complex-indic.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 6782bdae3be0357da1dadc7b806a43ceefa67a90
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 16:23:43 2012 +0200
+
+    [Indic] Fix Left Matra + Halant reordering
+
+    As can be seen in: U+092B,U+093F,U+094D
+
+ src/hb-ot-shape-complex-indic.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 3c2ea9481b1028e927e615a5434ebf8edcb5f891
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 16:23:38 2012 +0200
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 73
+ ++++++++++++++++++++--------------------
+ 1 file changed, 37 insertions(+), 36 deletions(-)
+
+commit c071b99f150a9344a2056dfeba8c613f8a5602db
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 16:22:46 2012 +0200
+
+    [Indic] Add test for Left Matra with Halant
+
+    Uniscribe doesn't move the Halant, we do.  And do a broken job of
+    it now.
+
+ .../shaper-indic/indic/script-devanagari/misc/tricky-reordering.txt
+ | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 203d71069c45048b6dd8fa22b61fd8f2c844b4f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 16:01:44 2012 +0200
+
+    [GSUB/GPOS] Check all glyph masks when matching input
+
+ src/hb-ot-layout-gsubgpos-private.hh | 18 ++++++++++++------
+ 1 file changed, 12 insertions(+), 6 deletions(-)
+
+commit 668c6046c1b3af3bd316bda0cc8636f2a5e8df42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 15:34:13 2012 +0200
+
+    [Indic] Apply Reph mask to all POS_REPH glyphs
+
+    Needed for upcoming changes to GSUB/GPOS mask matching.
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4be46bade26faf13f7b4d447e9cc608e183955dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 14:39:01 2012 +0200
+
+    [Indic] Fix state machine to backtrack
+
+ src/hb-ot-shape-complex-indic-machine.rl | 42
+ +++++++++++++++-----------------
+ src/hb-private.hh                        |  2 ++
+ 2 files changed, 21 insertions(+), 23 deletions(-)
+
+commit cee7187447b76b22e1bb6136d137b35ac49c3a5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 11:41:39 2012 +0200
+
+    [Indic] Move syllable tracking from Indic to generic layer
+
+    This is to incorporate it into GSUB/GPOS processing.
+
+ src/hb-ot-layout-gpos-table.hh           |  1 +
+ src/hb-ot-layout-gsub-table.hh           |  3 ++-
+ src/hb-ot-layout-gsubgpos-private.hh     |  3 ---
+ src/hb-ot-layout-private.hh              |  4 +---
+ src/hb-ot-shape-complex-indic-machine.rl |  2 +-
+ src/hb-ot-shape-complex-indic-private.hh |  1 -
+ src/hb-ot-shape-complex-indic.cc         |  8 +++-----
+ src/hb-ot-shape-complex-private.hh       | 13 ++++++++-----
+ 8 files changed, 16 insertions(+), 19 deletions(-)
+
+commit 3bf27a9f0e92aa31b464bd3b9fdea5933c9ae8b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 11:17:23 2012 +0200
+
+    [Indic] Disable conjuncts when a ZWJ happens
+
+    Not that the code makes any difference since the presence of ZWJ
+    itself
+    causes the ligature to fail to match anyway.
+
+ src/hb-ot-shape-complex-indic.cc | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit c6d904d67db589dd6209928e56504f04f6a07756
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 11:07:40 2012 +0200
+
+    [Indic] Fix bitops typo!
+
+    Another 1000 down!
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 55fe2cf79b11d9a63ea33b3ee76bd0ebca345157
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 03:45:28 2012 +0200
+
+    Make APPLY debug output print current index and codepoint
+
+    Yay!
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7bd2b04fea5649d77d796d58b7f4918fe0378ee5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 03:40:58 2012 +0200
+
+    Minor
+
+ src/hb-object-private.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit cf26510dbbd8d38486e6ba423800db6427ade332
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 03:35:08 2012 +0200
+
+    Some more...
+
+    Done.  I promise.
+
+ src/hb-object-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 9659523ca32b0e254d0e5fe387d817208d9cb6bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 03:33:36 2012 +0200
+
+    More beauty in debug output!
+
+ src/hb-private.hh | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit cf26e88a5ab477295479f5b9450c2019b6430eaa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 03:16:57 2012 +0200
+
+    Finish off debug output beautification
+
+ src/hb-open-type-private.hh | 58
+ ++++++++++++++++++++-------------------------
+ 1 file changed, 26 insertions(+), 32 deletions(-)
+
+commit d7bba01a353efc7432c474dd8755a02db4abd2ae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 02:46:26 2012 +0200
+
+    Only print class name in debug output if there's one available
+
+ src/hb-private.hh | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit 85f73fa8da1fbb864aef0f3a592b1d65e24d593d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 02:40:42 2012 +0200
+
+    Only printout class name in tracing, if one is available
+
+    Makes debug output much more pleasant.
+
+ src/hb-private.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 98619ce4fa650c593b030d06d2f89fec83a10015
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 02:34:06 2012 +0200
+
+    Minor
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit acea183e986dd378c6f95120fe0feb0586a8ef36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 02:33:11 2012 +0200
+
+    Add return annotation for APPLY
+
+ src/hb-ot-layout-gpos-table.hh       | 163
+ +++++++++++++++--------------------
+ src/hb-ot-layout-gsub-table.hh       | 114 +++++++++++-------------
+ src/hb-ot-layout-gsubgpos-private.hh |  83 ++++++++----------
+ 3 files changed, 151 insertions(+), 209 deletions(-)
+
+commit 5ccfe8e2154ad0b58dabcc236bbe9478c17b02ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 02:19:41 2012 +0200
+
+    /Minor/
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0ab8c8621712d33e1e91dfdb4ad0b335e3d2a3fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 01:25:34 2012 +0200
+
+    Annotate SANITIZE return values
+
+    More to come, for APPLY, CLOSURE, etc.
+
+ src/hb-open-file-private.hh          |  23 ++---
+ src/hb-open-type-private.hh          |  49 +++++-----
+ src/hb-ot-head-table.hh              |   4 +-
+ src/hb-ot-hhea-table.hh              |   4 +-
+ src/hb-ot-hmtx-table.hh              |   4 +-
+ src/hb-ot-layout-common-private.hh   |  51 +++++-----
+ src/hb-ot-layout-gdef-table.hh       |  48 +++++-----
+ src/hb-ot-layout-gpos-table.hh       | 180
+ ++++++++++++++++-------------------
+ src/hb-ot-layout-gsub-table.hh       | 101 +++++++++-----------
+ src/hb-ot-layout-gsubgpos-private.hh |  88 ++++++++---------
+ src/hb-ot-maxp-table.hh              |   7 +-
+ src/hb-ot-name-table.hh              |  17 ++--
+ src/hb-private.hh                    |  39 ++++++--
+ 13 files changed, 299 insertions(+), 316 deletions(-)
+
+commit 829e814ff358c5e700ba4df54932696801aa9f65
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 00:52:16 2012 +0200
+
+    Minor
+
+ src/hb-private.hh | 32 ++++++++++----------------------
+ 1 file changed, 10 insertions(+), 22 deletions(-)
+
+commit 6eec6f406d2cc13dbca422e88492d3d498af02bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 00:50:38 2012 +0200
+
+    Code reshuffling
+
+ src/hb-private.hh | 36 +++++++++++++++++++++++++-----------
+ 1 file changed, 25 insertions(+), 11 deletions(-)
+
+commit 1e08830b4fac3a60ae52349cab6e101d389d30cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 11 00:16:40 2012 +0200
+
+    Beautify debug output
+
+ src/hb-open-type-private.hh | 20 ++++++------
+ src/hb-private.hh           | 74
+ +++++++++++++++++++++++++++------------------
+ 2 files changed, 55 insertions(+), 39 deletions(-)
+
+commit 6f4553801729a06e506ffdde7b27c72780d4bb80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 23:24:43 2012 +0200
+
+    More massaging trace messaging
+
+ src/hb-open-type-private.hh          | 2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 4 ++--
+ src/hb-private.hh                    | 4 ++--
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit b5fa37cb694b01a7df3a656710391c40dd3fcc04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 23:09:48 2012 +0200
+
+    Minor
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 208109703c929428c684ddcf9310b8ba780c4c31
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 23:06:58 2012 +0200
+
+    Better trace message support infrastructure
+
+    We have varargs in the trace interface now.  To be used soon...
+
+ src/hb-open-type-private.hh          | 17 ++++------
+ src/hb-ot-layout-gsubgpos-private.hh |  4 +--
+ src/hb-private.hh                    | 64
+ ++++++++++++++++++++++++++----------
+ 3 files changed, 56 insertions(+), 29 deletions(-)
+
+commit 02b2922fbf098c8282eb23dc2c54d5829cf67024
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 21:44:50 2012 +0200
+
+    [Indic] Towards better Reph positioning
+
+    Fixed for Deva cases with two full-form consonants.  Failures **way**
+    down.
+    Not much left to go :-).
+
+ src/hb-ot-shape-complex-indic.cc | 111
+ ++++++++++++++++++++++++++++-----------
+ 1 file changed, 80 insertions(+), 31 deletions(-)
+
+commit 74e54cf446bb979e488685e8c09eeed6b9d03c24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 21:20:37 2012 +0200
+
+    [Indic] Add Ra back for scripts without Reph
+
+    We now check that the 'rphp' table exists before forming Reph, so
+    we don't need to comment out Ra for those scripts.
+
+ src/hb-ot-shape-complex-indic-private.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 2b70df5cc008617453b12bafeaac50e6d61b3224
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 18:38:22 2012 +0200
+
+    [Indic] Add note re Uniscribe clusters
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 21d2803133c2c424ed37a9f3d17c7fc4963e5a60
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 18:34:34 2012 +0200
+
+    [Indic] Do clustering like Uniscribe does
+
+    Hindi Wikipedia failures down to 6639 (0.938381%)!
+
+ src/hb-ot-shape-complex-indic.cc | 24 ++++++++++++++++++++----
+ 1 file changed, 20 insertions(+), 4 deletions(-)
+
+commit b20c9ebaf5176101fdfcffbe4714a2e619dd94b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 18:31:17 2012 +0200
+
+    [Indic] Add test for matra group
+
+    The spec says: "[{M}+[N]+[H]]", and that's what Uniscribe implements.
+    We instead do: "{M+[N]+[H]}", which means we allow Nukta and Halant
+    after all Matras, not just the last one.  It makes more sense.
+
+ .../texts/in-tree/shaper-indic/indic/script-devanagari/misc/MANIFEST
+ | 1 +
+ .../shaper-indic/indic/script-devanagari/misc/spec-deviations.txt
+ | 1 +
+ 2 files changed, 2 insertions(+)
+
+commit 8df5636968389ac7bf8620ccd091fd4872b0bbee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 15:41:04 2012 +0200
+
+    [Indic] Reorder Reph to before the Halant after Matras
+
+    Uniscribe doesn't do it, but we want to do as it gives the Reph the
+    opportunity to interact with the Matras.  Test with mangal for
+    example.
+    Sequence: <0930,094d,0915,094b,094d>
+    In test suite already.
+
+ src/hb-ot-shape-complex-indic.cc | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit daf3234bdc82c669302599a76d2b14f5e69989db
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 15:28:27 2012 +0200
+
+    [Indic] Don't clear the mask for Reph
+
+    This was removing the mandatory global 1 bit in the mask and hence
+    disabling GPOS for Reph!
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7708ee23cbcc8c8edce13e73b6e549b77bd8c2d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 14:48:25 2012 +0200
+
+    [Indic] Improve Left Matra repositioning
+
+    Move its dependents too.
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 61a58e26a5bda16851669404fc8206896e124740
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 14:43:53 2012 +0200
+
+    [Indic] Add tricky reordering test cases
+
+    In the case of Consonant,LeftMatra,Halant, Uniscribe leaves the Halant
+    where it is, but we want to move it with the Matra as that makes more
+    logical sense.
+
+ .../texts/in-tree/shaper-indic/indic/script-devanagari/misc/MANIFEST  |
+ 1 +
+ .../shaper-indic/indic/script-devanagari/misc/tricky-reordering.txt   |
+ 4 ++++
+ 2 files changed, 5 insertions(+)
+
+commit dbb105883c6e9b83e78dc8b10766cd56b98cd7e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 13:45:52 2012 +0200
+
+    [Indic] Do Reph repositioning in final reordering like the spec says
+
+    This introduced a failure, which we tracked down to a test case
+    like this:
+
+      U+092E,U+094B,U+094D,U+0930
+
+    The final character is a Ra that should be put in a syllable of it's
+    own.  And we do.  But it will interact with the Halant before it.  So
+    now we finally are convinced that we have to limit features to
+    syllable
+    boundaries.  That's coming after lunch!
+
+ src/hb-ot-shape-complex-indic-private.hh |   2 -
+ src/hb-ot-shape-complex-indic.cc         | 103
+ +++++++++++++++++++------------
+ 2 files changed, 64 insertions(+), 41 deletions(-)
+
+commit 4705a7026900e51f6430f03a73c87f2df035df92
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 13:09:08 2012 +0200
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 4ac9e98d9d2ea973dd612dc4063cf78496c643a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 12:53:53 2012 +0200
+
+    [Indic] Reorder left matras to be closer to base
+
+ src/hb-ot-shape-complex-indic-private.hh |  4 ---
+ src/hb-ot-shape-complex-indic.cc         | 50
+ +++++++++++++++++++++++++++++---
+ 2 files changed, 46 insertions(+), 8 deletions(-)
+
+commit 1a1fa8c655a082fc1439608457ba717306cc83ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 12:20:21 2012 +0200
+
+    [Indic] Treat the standalone cluster case reusing the consonant logic
+
+ src/hb-ot-shape-complex-indic.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 190eb31a16178269aecaf5d2ecc9012f956749f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 12:17:16 2012 +0200
+
+    [Indic] Minor
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c5306b6861cfaa50af40e8ceb058791fa06d7981
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 12:07:33 2012 +0200
+
+    [Indic] Handle Vowel syllables
+
+    Reusing the consonant logic!
+
+ src/hb-ot-shape-complex-indic-private.hh |  3 +--
+ src/hb-ot-shape-complex-indic.cc         | 11 ++++++-----
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 6d8e0cb74c02f6bc09cd4abe9e4bc82062e1b517
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 11:41:51 2012 +0200
+
+    [Indic] Simplify Reph logic
+
+ src/hb-ot-shape-complex-indic.cc | 24 +++++-------------------
+ 1 file changed, 5 insertions(+), 19 deletions(-)
+
+commit 3d25079f8d6be81b9b4b91d3a97016b8a572f571
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 11:37:42 2012 +0200
+
+    [Indic] Don't form Reph is Ra is the only consonant in the syllable
+
+ src/hb-ot-shape-complex-indic-private.hh |  2 +-
+ src/hb-ot-shape-complex-indic.cc         | 10 ++++++++++
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit b99d63ae114fb58f129562b293a8a66543d499ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 11:32:52 2012 +0200
+
+    [Indic] Increase max syllable length
+
+    20 was way too low, one could hit a syllable with 7ish consonants
+    with it.
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a391ff50b9a7b6ac3e58d199ea726b20ee6839bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 11:31:20 2012 +0200
+
+    [Indic] Adjust base after sorting
+
+ src/hb-ot-shape-complex-indic.cc | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit d3637edb248162970e202e9d0671540274192844
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 10 10:51:38 2012 +0200
+
+    [Indic] Don't return for long syllables.  Just not sort.
+
+ src/hb-ot-shape-complex-indic.cc | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit dfa0cade7fce3791e47eaa7edcd23da76c7a0ed0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 19:10:07 2012 +0200
+
+    Fix Uniscribe clusters with multiple items
+
+ src/hb-uniscribe.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 86e5dd386a7989701da476db89be268e4ac1e219
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 18:57:37 2012 +0200
+
+    [Indic] Don't give up syllable parsing upon junk
+
+ src/hb-ot-shape-complex-indic-machine.rl | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ef24cc8c8e2478a6352c340f4611a617646de4cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 17:56:03 2012 +0200
+
+    [Indic] Towards multi-cluster syllables and final reordering
+
+ src/hb-ot-shape-complex-arabic.cc        |  2 +-
+ src/hb-ot-shape-complex-indic-machine.rl | 21 ++++++++++-----
+ src/hb-ot-shape-complex-indic-private.hh |  1 +
+ src/hb-ot-shape-complex-indic.cc         | 45
+ +++++++++++++++++++++++---------
+ src/hb-ot-shape-complex-private.hh       |  5 ++--
+ 5 files changed, 51 insertions(+), 23 deletions(-)
+
+commit a9844d41c6cb30d8a2d733130a0e72f51b6c81c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 17:53:13 2012 +0200
+
+    Combine lig_id and lig_comp into one byte, to free up one for Indic
+
+ src/hb-ot-layout-gpos-table.hh       | 14 ++++++++------
+ src/hb-ot-layout-gsub-table.hh       | 11 ++++-------
+ src/hb-ot-layout-gsubgpos-private.hh | 26 ++++++++++++++++++++++----
+ 3 files changed, 34 insertions(+), 17 deletions(-)
+
+commit 92332e5116271a5d96e532005fe750e7552a6cbb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 17:40:00 2012 +0200
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 41
+ ++++++++++++++++++++--------------------
+ 1 file changed, 21 insertions(+), 20 deletions(-)
+
+commit dbccf87eef0d26838fa4bb3ae26410f6c4818836
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 17:24:39 2012 +0200
+
+    [Indic] Make room for more reordering positions
+
+ src/hb-ot-shape-complex-indic-private.hh | 213
+ ++++++++++++++++---------------
+ src/hb-ot-shape-complex-indic.cc         |  12 +-
+ 2 files changed, 115 insertions(+), 110 deletions(-)
+
+commit d4480ace7fdbe48aeaf77278c032b8b2ef2ebe8e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 15:56:35 2012 +0200
+
+    [Indic] Improve matra vs consonant ordering
+
+    Another 1.5% down.
+
+ src/hb-ot-shape-complex-indic-private.hh | 32
+ ++++++++++++++++++++------------
+ src/hb-ot-shape-complex-indic.cc         |  6 +++---
+ src/indic.cc                             |  2 +-
+ 3 files changed, 24 insertions(+), 16 deletions(-)
+
+commit 33c92e769563ec2a6c1249b57d8cac742eea6f88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 15:41:51 2012 +0200
+
+    [Indic] Categorize Anudatta
+
+ src/hb-ot-shape-complex-indic.cc | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 3943293a9942201d8fc8d59212fcc8cca5132e3d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 15:27:56 2012 +0200
+
+    [Indic] Add joiner test cases for Devanagari
+
+ .../indic/script-devanagari/misc/MANIFEST             |  1 +
+ .../indic/script-devanagari/misc/joiners.txt          | 19
+ +++++++++++++++++++
+ 2 files changed, 20 insertions(+)
+
+commit 19d984edaa4f86c842345a9d4150597e045e1887
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 15:21:13 2012 +0200
+
+    [Indic] Make sure Reph jumps over all matras to the right
+
+    Another 12 thousand failures gone! (78 to go)
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9034641333d7bfb41a0784cce72e43591faea083
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 15:04:58 2012 +0200
+
+    [Indic] Keep Vedic signs at the right too
+
+ src/hb-ot-shape-complex-indic.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit d1deaa2f5bd028e8076265cba92cffa4fa2834ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 15:04:13 2012 +0200
+
+    Replace zerowidth invisible chars with a zero-advance space glyph
+
+    Like Uniscribe does.
+
+ src/hb-ot-shape-complex-arabic.cc  |  3 ++-
+ src/hb-ot-shape-complex-indic.cc   | 20 -------------------
+ src/hb-ot-shape-complex-private.hh |  4 ++--
+ src/hb-ot-shape-normalize.cc       | 25 +++++++++--------------
+ src/hb-ot-shape-private.hh         | 27 +++++++++++++++++++++++++
+ src/hb-ot-shape.cc                 | 41
+ +++++++++++++++++++++++++-------------
+ src/hb-unicode-private.hh          | 38
+ +++++++++++++++++++++++++++++++++++
+ 7 files changed, 105 insertions(+), 53 deletions(-)
+
+commit 49e5da1591b8d28f01e7ff9caac9d9ac53668bba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 13:23:27 2012 +0200
+
+    [indic] Keep the syllable modifier marks to the right
+
+    Shaping failures on Hindi Wikipedia go down from 25% to 14%!
+
+ src/hb-ot-shape-complex-indic.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5b1260909350bffa3e3d06da346f9f86ce651dbb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 12:37:27 2012 +0200
+
+    Minor
+
+ src/hb-ot-shape-complex-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9ce939232bbce8f51e235195e3854d1e8bb961f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 12:03:09 2012 +0200
+
+    Minor
+
+ src/hb-ot-shape-complex-indic-private.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 76b3409de6887c1cdd5c679939497b1b56f4554b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 11:43:43 2012 +0200
+
+    [indic] Better Reph matching
+
+ src/hb-ot-shape-complex-indic.cc | 21 +++++++++++++++------
+ 1 file changed, 15 insertions(+), 6 deletions(-)
+
+commit df6d45c693c417bf311e6fa49f18a8558542e525
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 11:38:31 2012 +0200
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 412b91889d9a1ae477e8b6907d0b9a76e78a6c91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 11:07:18 2012 +0200
+
+    [indic] Apply Indic features in order
+
+ src/hb-ot-shape-complex-indic.cc | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 1ac075b227090a9ad930dcc1670236c176b27067
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 11:06:47 2012 +0200
+
+    [indic] Apply rakaar forms
+
+    Fixes 10% of the failures against all of Hindi Wikipedia!
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2214a03900d32710573a1b05c7665195b3129761
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 09:54:54 2012 +0200
+
+    Add hb-diff-ngrams
+
+ test/shaping/Makefile.am      |  1 +
+ test/shaping/hb-diff-ngrams   |  5 +++
+ test/shaping/hb_test_tools.py | 71
+ ++++++++++++++++++++++++++++++++++++++++---
+ 3 files changed, 72 insertions(+), 5 deletions(-)
+
+commit 178e6dce01ad28c8708bad62ce0fb79c46e836dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 08:57:29 2012 +0200
+
+    Add N-gram generator
+
+ test/shaping/hb_test_tools.py | 72
+ +++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 70 insertions(+), 2 deletions(-)
+
+commit 98669ceb77657d60435f2cb2e3fc18272c0a2c6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 08:16:15 2012 +0200
+
+    Use groupby()
+
+ test/shaping/hb_test_tools.py | 26 ++++++++------------------
+ 1 file changed, 8 insertions(+), 18 deletions(-)
+
+commit c438a14b62433db488b5c90854a4a3934adf3305
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 07:45:17 2012 +0200
+
+    Add hb-diff-stat
+
+ test/shaping/Makefile.am      |  1 +
+ test/shaping/hb-diff-stat     |  5 +++++
+ test/shaping/hb_test_tools.py | 22 ++++++++++++++++++++--
+ 3 files changed, 26 insertions(+), 2 deletions(-)
+
+commit 1058d031e2046eb80331b0950eaff75c2bf608dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 9 07:30:07 2012 +0200
+
+    Make hb-diff-filter-failtures retain all test info for failed tests
+
+ test/shaping/hb_test_tools.py | 33 ++++++++++++++++++++++++++-------
+ 1 file changed, 26 insertions(+), 7 deletions(-)
+
+commit f1eb008cc727370e1bd0dc32fdf301f62d9ff981
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 23:41:41 2012 +0200
+
+    Add hb-diff-colorize
+
+    Accepts --format=html now.
+
+ test/shaping/Makefile.am      |   1 +
+ test/shaping/hb-diff          |   4 +-
+ test/shaping/hb-diff-colorize |   7 ++
+ test/shaping/hb_test_tools.py | 158
+ +++++++++++++++++++++++++-----------------
+ 4 files changed, 106 insertions(+), 64 deletions(-)
+
+commit 9155e4ffe00c96a2c14e14a300004b1038ca3a9c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 22:44:21 2012 +0200
+
+    Cleanup diff
+
+    Doesn't do --color anymore.  That will go into a new hb-diff-colorize
+    tool.
+
+ test/shaping/hb-diff          | 10 +++-------
+ test/shaping/hb_test_tools.py | 32 ++++++++++++++++++--------------
+ 2 files changed, 21 insertions(+), 21 deletions(-)
+
+commit 7d22135b4c3f8fb70552302bf8239df9976dddda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 19:38:49 2012 +0200
+
+    Make hb-diff faster
+
+ test/shaping/hb_test_tools.py | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit a93e238e05a2f70a6e664e5d04ba25bbd54493dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 8 18:55:29 2012 +0200
+
+    More tests
+
+ .../texts/in-tree/shaper-arabic/script-mongolian/misc/MANIFEST |  1 +
+ .../texts/in-tree/shaper-arabic/script-mongolian/misc/poem.txt |  4 ++++
+ .../in-tree/shaper-indic/indic/script-bengali/misc/MANIFEST    |  1 +
+ .../in-tree/shaper-indic/indic/script-bengali/misc/reph.txt    |
+ 10 ++++++++++
+ 4 files changed, 16 insertions(+)
+
+commit 1a2a4a0078dda834443edd421037a4bcbad18c5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 5 22:38:20 2012 +0200
+
+    Fix warning and build issues
+
+    As reported by Jonathan Kew on the list.
+
+ src/hb-set-private.hh | 2 +-
+ src/main.cc           | 9 +++++----
+ 2 files changed, 6 insertions(+), 5 deletions(-)
+
+commit a5e39fed85e069ba1afbf90408349ad99ceb0e1d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 25 00:14:46 2012 -0400
+
+    Minor
+
+ src/hb-set-private.hh | 2 ++
+ src/hb-set.cc         | 2 ++
+ 2 files changed, 4 insertions(+)
+
+commit 1827dc208c867e433a95237d1ed3fc7a73d1d9a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 24 16:56:37 2012 -0400
+
+    Add hb_ot_shape_glyphs_closure()
+
+    Experimental API for now.
+
+ src/hb-ot-map-private.hh |  7 ++++---
+ src/hb-ot-shape.cc       | 35 +++++++++++++++++++++++++++++++++++
+ src/hb-ot.h              |  8 ++++++++
+ src/hb-set-private.hh    |  3 +++
+ 4 files changed, 50 insertions(+), 3 deletions(-)
+
+commit bb09f0ec10216b11189b5e8584856adf0f14d1fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 24 16:02:12 2012 -0400
+
+    Minor
+
+ src/hb-unicode.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 29a7e306e30e894f7a38daf73eca9fc772c58158
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 24 16:01:30 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape-normalize.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 585b107cdee7305920dacc83c9ee1f8eeff7afd1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 24 16:00:50 2012 -0400
+
+    Add test caes for a minority language using Bengali
+
+    U+0985 BENGALI LETTER A followed by U+09D7 BENGALI AU LENGTH MARK.
+    According to Bobby de Vos on the mailing list, this results in
+    a dotted
+    circle with most shaping engines, but is a legitimate sequence in this
+    minority language.
+
+    We reached the consensus on the list to NOT implement dotted-circle
+    in HarfBuzz.
+
+ .../texts/in-tree/shaper-indic/indic/script-bengali/misc/misc.txt
+ | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 6c6ccaf575392f6e6bb9a15534026e4ea462705b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 24 14:21:15 2012 -0400
+
+    Add a few more set operations
+
+    TODO: Tests for hb_set_t.
+
+ src/hb-set-private.hh | 54
+ +++++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-set.cc         | 55
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-set.h          | 34 ++++++++++++++++++++++++++++---
+ 3 files changed, 139 insertions(+), 4 deletions(-)
+
+commit 5caece67ab9eee322bdcdf6f4b607eadde297e56
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 23 23:03:12 2012 -0400
+
+    Make closure() return void
+
+ src/hb-ot-layout-gsub-table.hh       | 142 +++++++++++++-----------------
+ src/hb-ot-layout-gsubgpos-private.hh | 165
+ ++++++++++++++++++-----------------
+ src/hb-ot-layout.cc                  |  10 +--
+ src/hb-ot-layout.h                   |   8 +-
+ src/hb-set-private.hh                |  20 ++---
+ 5 files changed, 157 insertions(+), 188 deletions(-)
+
+commit 0b08adb3539f2ec29682456b89c69e89ff5e9c03
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 23 22:41:09 2012 -0400
+
+    Add hb_set_t
+
+ TODO                               |   2 +
+ src/Makefile.am                    |   3 +
+ src/hb-ot-layout-common-private.hh |   1 +
+ src/hb-ot-layout-private.hh        |  47 ---------------
+ src/hb-ot-layout.h                 |   2 -
+ src/hb-set-private.hh              |  95 +++++++++++++++++++++++++++++
+ src/hb-set.cc                      | 120
+ +++++++++++++++++++++++++++++++++++++
+ src/hb-set.h                       |  91 ++++++++++++++++++++++++++++
+ src/hb.h                           |   1 +
+ 9 files changed, 313 insertions(+), 49 deletions(-)
+
+commit 5b93e8d94fb4c2474816304ae3f52e1c704882de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 23 22:26:13 2012 -0400
+
+    Update copyright headers
+
+ src/hb-ot-layout-common-private.hh   | 2 +-
+ src/hb-ot-layout-gpos-table.hh       | 2 +-
+ src/hb-ot-layout-gsub-table.hh       | 2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 6a9be5bd3524dc3eb1e88d1063bde2e4d8b57011
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 23 22:23:17 2012 -0400
+
+    Rename hb_glyph_map_t to hb_set_t
+
+ src/hb-ot-layout-common-private.hh   | 16 ++++++++--------
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++++++------
+ src/hb-ot-layout-private.hh          |  2 +-
+ src/hb-ot-layout.cc                  |  2 +-
+ src/hb-ot-layout.h                   |  4 ++--
+ src/hb-ot-map-private.hh             |  2 +-
+ src/hb-ot-map.cc                     |  2 +-
+ 7 files changed, 20 insertions(+), 20 deletions(-)
+
+commit a4385f0b0a6949e2ce49e6a147ad4beaa724f6c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 23 22:20:14 2012 -0400
+
+    Improve clustering
+
+ src/hb-ot-shape.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 8e3715f8a16b315c1c7dd4b256e7f68a36c53e7c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 23 22:18:54 2012 -0400
+
+    Minor
+
+ src/hb-buffer-private.hh          | 2 +-
+ src/hb-buffer.cc                  | 2 +-
+ src/hb-graphite2.cc               | 5 ++---
+ src/hb-ot-shape-complex-arabic.cc | 4 ++--
+ src/hb-ot-shape-complex-misc.cc   | 4 ++--
+ 5 files changed, 8 insertions(+), 9 deletions(-)
+
+commit d2984a241e4819474d827b1dd5d4b6d76596b3a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 23 17:21:14 2012 -0400
+
+    Add map->substitute_closure()
+
+ src/hb-ot-map-private.hh |  3 +++
+ src/hb-ot-map.cc         | 15 +++++++++++++++
+ 2 files changed, 18 insertions(+)
+
+commit 31081f7390e5130df72f89acc609ccab5dc77a48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 23 16:54:58 2012 -0400
+
+    Implement closure() for Context and ChainContext lookups
+
+ src/hb-ot-layout-common-private.hh   |  54 ++++++
+ src/hb-ot-layout-gsubgpos-private.hh | 347
+ ++++++++++++++++++++++++++++-------
+ src/hb-ot-layout-private.hh          |  23 ++-
+ 3 files changed, 351 insertions(+), 73 deletions(-)
+
+commit c64ddab3c34897cd520d4d73a054866e649e8793
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 23 15:28:35 2012 -0400
+
+    Flesh out closure() for GSUB
+
+    The GSUBGPOS part still missing.
+
+ src/hb-ot-layout-common-private.hh |  61 ++++++++++++++------
+ src/hb-ot-layout-gsub-table.hh     | 112
+ ++++++++++++++++++++++++++++---------
+ src/hb-ot-layout-private.hh        |  34 +++++++++++
+ src/hb-ot-layout.h                 |   2 +-
+ 4 files changed, 165 insertions(+), 44 deletions(-)
+
+commit 0da132bde4d576a03095d6738507954f7f85103d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 23 14:21:33 2012 -0400
+
+    Fix Coverage iters
+
+ src/hb-ot-layout-common-private.hh | 30 +++++++++++++++++++++---------
+ 1 file changed, 21 insertions(+), 9 deletions(-)
+
+commit 3e32cd9570fd8b09901fb790b80365ae425f681a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 23 13:20:52 2012 -0400
+
+    Minor
+
+ src/hb-ot-layout-gsubgpos-private.hh | 1 -
+ src/hb-ot-layout.cc                  | 6 +++---
+ src/hb-ot-layout.h                   | 8 ++++++++
+ src/hb-private.hh                    | 4 +++-
+ 4 files changed, 14 insertions(+), 5 deletions(-)
+
+commit 650ac00da3d2f988197393f34d40f0ba1a0fa093
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 23 13:17:09 2012 -0400
+
+    Minor refactoring
+
+ src/hb-ot-layout-gpos-table.hh       | 27 +++++++++++--------------
+ src/hb-ot-layout-gsub-table.hh       | 39
+ +++++++++++++++++-------------------
+ src/hb-ot-layout-gsubgpos-private.hh |  8 ++------
+ src/hb-ot-layout.cc                  |  6 ++++--
+ 4 files changed, 36 insertions(+), 44 deletions(-)
+
+commit f94b0aa64609654497ced9c00312c9643eb69053
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 23 13:04:38 2012 -0400
+
+    Add "closure" operation stubs to GSUB
+
+    Filling in.
+
+ src/hb-ot-layout-gsub-table.hh       | 179
+ +++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-gsubgpos-private.hh | 110 ++++++++++++++++++++-
+ src/hb-ot-layout.cc                  |   8 ++
+ 3 files changed, 293 insertions(+), 4 deletions(-)
+
+commit 7d50d502635d7c95e6bd091e7d4cc993f0853f76
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 23 13:02:14 2012 -0400
+
+    Add Coverage iterators
+
+ src/hb-ot-layout-common-private.hh | 59
+ ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 59 insertions(+)
+
+commit 3ed4634ec349fa9e943ad23718c04be4dd4bba62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 19 22:34:06 2012 -0400
+
+    Add Indic inspection tool
+
+ src/Makefile.am                          |   7 +-
+ src/hb-ot-shape-complex-indic-private.hh | 264
+ +++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-indic.cc         | 229
+ +--------------------------
+ src/indic.cc                             |  46 ++++++
+ 4 files changed, 317 insertions(+), 229 deletions(-)
+
+commit a06411ecf93c7e5256e363eef3ef69554896dd55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 19 22:28:25 2012 -0400
+
+    Minor matra renumbering
+
+    Should have no visible effect.
+
+ src/hb-ot-shape-complex-indic.cc | 30 +++++++++++++++++-------------
+ 1 file changed, 17 insertions(+), 13 deletions(-)
+
+commit 36608941f3cc530fea57282fa175e4cc3b4c66c6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 19 22:21:38 2012 -0400
+
+    Add GSUB "would_apply" API
+
+    To be used in the Indic shaper later.  Unused for now.
+
+ src/hb-ot-layout-gsub-table.hh | 140
+ ++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 138 insertions(+), 2 deletions(-)
+
+commit a0d4caeb91fa5e5f2090db4efc35c64ff9a64789
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 17 13:42:30 2012 -0400
+
+    Minor
+
+ TODO | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit a5e40542ab9508f0ba6f822f1262d93fccb71f45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 17 12:37:19 2012 -0400
+
+    Make font immutable in hb_shape()
+
+ src/hb-shape.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 3cde23664fbbe9cd2ac1b8fd5eb2ea288309cc9c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 17 11:44:49 2012 -0400
+
+    Minor note re Graphite
+
+ src/hb-graphite2.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 4dc2449d92308f8dd366142831c0b85bd30ea5a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 17 11:39:48 2012 -0400
+
+    Fix leak in graphite
+
+ src/hb-graphite2.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0290bbf8611aa881daed907f22256a431250c90a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 17 10:28:21 2012 -0400
+
+    Add another Thai test
+
+ test/shaping/texts/in-tree/shaper-thai/misc/misc.txt | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 9ceca3aeb14cc096f5f87660cf7351bc35073084
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 16 21:05:51 2012 -0400
+
+    Fix ragel regexp in vowel-based syllable
+
+    As reported by datao zhang on the mailing list.
+
+ src/hb-ot-shape-complex-indic-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b870afcd1b436614af95db6dc297e54c8f03f0cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 16 21:05:11 2012 -0400
+
+    Rewrite ragel expression to better match the one on MS spec
+
+    https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx
+
+ src/hb-ot-shape-complex-indic-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 95cefdf96efe43a44133aa8a186155cf4e63e2b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 16 18:08:20 2012 -0400
+
+    Add --utf8-clusters
+
+    Also fix cairo cluster generation.
+
+ util/hb-shape.cc     |  8 +++++---
+ util/hb-view.hh      |  2 +-
+ util/helper-cairo.cc | 22 +++++++++++++++++-----
+ util/helper-cairo.hh |  3 ++-
+ util/options.cc      | 19 ++++++++++++++-----
+ util/options.hh      | 26 ++++++++++++++++----------
+ util/view-cairo.cc   |  5 +++--
+ util/view-cairo.hh   |  3 ++-
+ 8 files changed, 60 insertions(+), 28 deletions(-)
+
+commit effb42e5c520128bdc2e29398ed801730c5c0f52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 16 16:04:07 2012 -0400
+
+    Always use cairo_show_text_glyphs()
+
+    Better catches cluster errors.
+
+ util/view-cairo.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 799cfdd15ab369580b2283200c3aca6866214b59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 16 16:00:36 2012 -0400
+
+    Make page progression be right to left for vertical text
+
+ util/view-cairo.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit a5f1834f57ea3fb254f5c7d372747de316fcc8f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 16 15:55:13 2012 -0400
+
+    Apply 'liga' for vertical writing mode too
+
+    Apparently that's what Kazuraki uses to form vertical ligatures,
+    which suggests that it's what Adobe does.
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4d85252bda25cddd1fbdd744687e449888f0b5fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 16 15:54:26 2012 -0400
+
+    Add Japanese test data from Adobe's Kazuraki font ligatures
+
+ test/shaping/texts/in-tree/shaper-default/MANIFEST |  1 +
+ .../shaper-default/script-japanese/MANIFEST        |  1 +
+ .../shaper-default/script-japanese/misc/MANIFEST   |  2 +
+ .../script-japanese/misc/kazuraki-liga-lines.txt   |  8 ++++
+ .../script-japanese/misc/kazuraki-liga.txt         | 53
+ ++++++++++++++++++++++
+ 5 files changed, 65 insertions(+)
+
+commit e74616b8898b5f18d9bf82b9e81aefad056c1e36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Apr 15 14:12:13 2012 -0400
+
+    Add comment
+
+ src/hb-private.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 683b503f30bba29d57a93d7e8ac7138c2e7f49f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 14 20:47:14 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape-normalize.cc | 11 +++++++++--
+ src/hb-ot-shape-private.hh   |  9 ---------
+ src/hb-ot-shape.cc           |  9 ++++++++-
+ 3 files changed, 17 insertions(+), 12 deletions(-)
+
+commit b9f199c8e38cc5ed0d73845568630f3bcbdd4374
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 14 20:23:58 2012 -0400
+
+    Move code around
+
+ src/hb-ot-shape-private.hh | 40 ----------------------------------------
+ src/hb-ot-shape.cc         | 45
+ +++++++++++++++++++++++++++++++++++++++++----
+ 2 files changed, 41 insertions(+), 44 deletions(-)
+
+commit 38a83019e6a7f4aa47662fd557344f62ae001abe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 14 19:40:18 2012 -0400
+
+    Minor
+
+ src/hb-common.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d4adade217a61007dd2da5cd9eccf889f79a019a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 14 19:23:17 2012 -0400
+
+    Add assert
+
+ src/hb-ot-shape.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit fe28b997fbbeb2cfeab62ac453993ccffe3e6719
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 14 19:19:26 2012 -0400
+
+    Add HB_DIRECTION_IS_VALID
+
+ src/hb-common.h        | 1 +
+ test/api/test-common.c | 7 +++++++
+ 2 files changed, 8 insertions(+)
+
+commit 5e88aa66822ba64324b4428c9ffbe06a43b4f310
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 14 18:51:50 2012 -0400
+
+    Remove public enum names again
+
+    As was reported to me, glib-mkenum does not understand named enums,
+    so remove for now.
+
+ src/hb-blob.h               | 2 +-
+ src/hb-common.h             | 6 +++---
+ src/hb-ot-layout-private.hh | 2 +-
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 08569c0eaab026c7122c0dc29922cf44011c4d10
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 14 18:47:07 2012 -0400
+
+    Minor
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 4bf90f648313e35d21b427a956aa1fe762bae757
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 12 17:38:23 2012 -0400
+
+    Make HB_DIRECTION_INVALID be zero
+
+    This changes all the HB_DIRECTION_* enum member values, but is
+    nicer, in preparation for making hb_segment_properties_t public.
+
+ src/hb-common.cc       |  7 ++++---
+ src/hb-common.h        | 20 ++++++++++----------
+ test/api/test-common.c |  9 +++++++--
+ 3 files changed, 21 insertions(+), 15 deletions(-)
+
+commit d01402da9c756f90a84bfb1f964fd56caf2b35c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 12 17:38:02 2012 -0400
+
+    Minor
+
+ TODO | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 69b84a8f6c789726815261c2e86692de7a65d6e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 12 15:50:40 2012 -0400
+
+    Fix hb-view surface size calc for vertical text
+
+    For some reason it doesn't quite work with IranianNastaliq, but
+    that looks like a font issue.
+
+ util/helper-cairo.hh |  5 +++--
+ util/options.hh      |  7 +++++++
+ util/view-cairo.cc   | 31 +++++++++++++++++++++----------
+ util/view-cairo.hh   |  1 +
+ 4 files changed, 32 insertions(+), 12 deletions(-)
+
+commit 6bd9b479b8b2befbb0847282e93beade197c8038
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 12 14:53:53 2012 -0400
+
+    Hide backend-specific shape functions
+
+    Also remove shaper_options argument to hb_shape_full().  That was
+    unused and for "future".  Let it go.
+
+    More shaper API coming in preparation for plan/planned API.
+
+ configure.ac                                   |  6 ++--
+ src/Makefile.am                                | 11 +++----
+ src/hb-fallback-shape-private.hh               |  9 +++---
+ src/hb-fallback-shape.cc                       |  9 +++---
+ src/{hb-ot-shape.h => hb-graphite2-private.hh} | 30 ++++++++----------
+ src/hb-graphite2.cc                            |  5 ++-
+ src/hb-graphite2.h                             |  7 -----
+ src/hb-ot-shape-private.hh                     |  8 +++--
+ src/hb-ot-shape.cc                             | 11 +++----
+ src/hb-ot.h                                    |  1 -
+ src/hb-shape.cc                                | 24 ++++++---------
+ src/hb-shape.h                                 |  1 -
+ src/hb-uniscribe-private.hh                    | 42
+ ++++++++++++++++++++++++++
+ src/hb-uniscribe.cc                            |  9 +++---
+ src/hb-uniscribe.h                             |  7 -----
+ util/options.hh                                |  2 +-
+ 16 files changed, 96 insertions(+), 86 deletions(-)
+
+commit c6035cf802c60f0526f421f39a55886061df94ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 12 13:23:59 2012 -0400
+
+    Add names to enums
+
+    gdb was showing <anonymous enum> instead of useful stuff, so name
+    all our enums.
+
+ src/hb-blob.h                      | 2 +-
+ src/hb-common.h                    | 6 +++---
+ src/hb-ot-layout-common-private.hh | 2 +-
+ src/hb-ot-layout-gdef-table.hh     | 2 +-
+ src/hb-ot-layout-gpos-table.hh     | 5 ++---
+ src/hb-ot-layout-gsub-table.hh     | 2 +-
+ src/hb-ot-layout-private.hh        | 2 +-
+ 7 files changed, 10 insertions(+), 11 deletions(-)
+
+commit d1c9eb458c843215da8df84b596bfae51fee135b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 12 13:17:44 2012 -0400
+
+    Make it an error to include non-top-level headers
+
+    Users should #include <hb.h> (or hb-ft.h, hb-glib.h, etc), but
+    never things like hb-shape.h directly.  This makes it easier to
+    refactor headers later on without breaking compatibility.
+
+ src/hb-blob.h       | 4 ++++
+ src/hb-buffer.h     | 4 ++++
+ src/hb-common.h     | 4 ++++
+ src/hb-font.h       | 4 ++++
+ src/hb-ft.h         | 2 --
+ src/hb-glib.h       | 1 +
+ src/hb-gobject.h    | 1 +
+ src/hb-graphite2.h  | 5 +++--
+ src/hb-icu.h        | 1 +
+ src/hb-ot-layout.h  | 8 +++++---
+ src/hb-ot-shape.h   | 9 +++++----
+ src/hb-ot-tag.h     | 6 +++++-
+ src/hb-ot.h         | 2 ++
+ src/hb-private.hh   | 5 ++++-
+ src/hb-shape.h      | 4 ++++
+ src/hb-unicode.h    | 4 ++++
+ src/hb-uniscribe.h  | 3 +--
+ src/hb-version.h.in | 4 ++++
+ src/hb.h            | 2 ++
+ 19 files changed, 58 insertions(+), 15 deletions(-)
+
+commit 323190c27b80cddc9b3c42d19f1f243e2acb2411
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 12 12:29:10 2012 -0400
+
+    Minor
+
+ src/hb-ft.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 0e3361464b00b76aa7375515163e0710a691db0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 12 10:06:52 2012 -0400
+
+    Fix bug with not setting Unicode props of the first character
+
+    Fixes Mongolian shaping issue:
+    https://bugs.freedesktop.org/show_bug.cgi?id=45695
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f9746b600a6e14dbe48aabfc17df8f12a5b46b11
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 12 09:59:26 2012 -0400
+
+    Minor
+
+ test/shaping/texts/in-tree/shaper-arabic/script-mongolian/misc/misc.txt |
+ 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 7470b0ff805e4ff59d23d7a1808888fafdf550eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 12 09:44:27 2012 -0400
+
+    Add Mongolian test case
+
+ test/shaping/texts/in-tree/MANIFEST                                   |
+ 1 +
+ .../texts/in-tree/shaper-arabic/script-mongolian/misc/MANIFEST        |
+ 1 +
+ .../texts/in-tree/shaper-arabic/script-mongolian/misc/misc.txt        |
+ 4 ++++
+ test/shaping/texts/in-tree/shaper-thai/MANIFEST                       |
+ 1 +
+ test/shaping/texts/in-tree/shaper-thai/misc/MANIFEST                  |
+ 1 +
+ 5 files changed, 8 insertions(+)
+
+commit c65662b71e6160f5adfb6226d97589ca457d98b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 12 09:31:55 2012 -0400
+
+    Fix left-matra positioning in Indic
+
+    Fixes 200 failures out of previous 4290 cases in the OO.o Indic
+    dictionary (of ~16000 entries).
+
+ src/hb-ot-shape-complex-indic.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 6d16403bfaa4d710d80c93298eca7211ecaa419f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 11 22:04:42 2012 -0400
+
+    Adjust TODO
+
+ TODO | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 029a82d81d8ffa1b6771d19018d592fec1dbc934
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 11 22:00:46 2012 -0400
+
+    [hangul] Apply *jmo features to all Hangul chars
+
+    This is what old HB does.  Morever, fixes rendering with Win8 malgun
+    font.  The Win7 version doesn't compose with either Uniscribe nor HB,
+    but Win8 version works as expected, like Uniscribe, with this change.
+
+    Lets call Hangul done for now.
+
+ src/hb-ot-shape-complex-misc.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 3baae2440de69577d330209edb708e7d2bb2231d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 11 21:54:37 2012 -0400
+
+    Update TODO
+
+ TODO | 28 +++++++++++++++-------------
+ 1 file changed, 15 insertions(+), 13 deletions(-)
+
+commit a4976447cd1a1feffdecd0d501a2690716b1cf4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 11 17:48:40 2012 -0400
+
+    Add Hangul test
+
+ test/shaping/texts/in-tree/shaper-hangul/script-hangul/misc/misc.txt |
+ 1 +
+ 1 file changed, 1 insertion(+)
+
+commit e95d912b3b0af027c4384553f95236db822e5acc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 11 17:33:02 2012 -0400
+
+    Fix diff tool
+
+ test/shaping/hb_test_tools.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 41ae674f6871f43d0a6e4ca67a747074d63ae576
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 11 17:11:05 2012 -0400
+
+    Don't create hb_apply_context_t per glyph!
+
+    I couldn't measure significant performance gains out of this; maybe
+    about 5% (with one million Malayalam strings).  Still, not bad.
+    But reminds me that optimizing this codebase without profiling first
+    is simply not going to work.  Oh well...
+
+ src/hb-ot-layout-gpos-table.hh       | 24 ++++++------------------
+ src/hb-ot-layout-gsub-table.hh       | 26 +++++++-------------------
+ src/hb-ot-layout-gsubgpos-private.hh | 22 ++++++++++++++++++++++
+ 3 files changed, 35 insertions(+), 37 deletions(-)
+
+commit 4a1e02ef7979d58fe0c726ee7c665b2420c42ddd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 11 14:37:53 2012 -0400
+
+    Fix shape to presentation forms font check
+
+    As reported by Jonathan Kew on the list.
+
+ src/hb-ot-shape-complex-arabic.cc | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 6062f5f01436b4044be729890ed00b9b62737824
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 11 14:19:55 2012 -0400
+
+    Fix build with some compilers
+
+    As reported by Jonathan Kew on the list.
+
+ src/hb-ot-shape-complex-misc.cc | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit acd88e659fdb2fa1cbf7171f0a1c7fbc81b9f298
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 10 18:02:20 2012 -0400
+
+    In Arabic fallback shaping, check that the font has glyph for new char
+
+ src/hb-ot-shape-complex-arabic.cc  | 12 +++++++-----
+ src/hb-ot-shape-complex-indic.cc   |  2 +-
+ src/hb-ot-shape-complex-misc.cc    |  6 +++---
+ src/hb-ot-shape-complex-private.hh |  7 ++++---
+ src/hb-ot-shape.cc                 |  2 +-
+ 5 files changed, 16 insertions(+), 13 deletions(-)
+
+commit 7752aa73e72301a46c64c533c1e423ff5987cc05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 10 17:22:14 2012 -0400
+
+    Minor
+
+ src/hb-ot-shape-private.hh |  1 -
+ src/hb-ot-shape.cc         | 10 ----------
+ 2 files changed, 11 deletions(-)
+
+commit 939c010211b063f78874a3b72b032c1ed9a13b87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 10 17:20:05 2012 -0400
+
+    Implement Arabic fallback shaping mandatory ligatures
+
+ src/gen-arabic-table.py                 | 32
+ ++++++++++++++++++++++----------
+ src/hb-ot-shape-complex-arabic-table.hh | 28 +++++++++++++++++++---------
+ src/hb-ot-shape-complex-arabic.cc       | 31
+ +++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-misc.cc         |  4 ++--
+ 4 files changed, 74 insertions(+), 21 deletions(-)
+
+commit b7d04eb606800100faa11100d2adf559e297a4ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 10 16:44:38 2012 -0400
+
+    Do Arabic fallback shaping
+
+ src/hb-ot-shape-complex-arabic.cc | 38
+ +++++++++++++++++++++++++++++++++-----
+ 1 file changed, 33 insertions(+), 5 deletions(-)
+
+commit ae4a2b9365051c23c9a299cf76f3ab7e661999b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 10 16:25:08 2012 -0400
+
+    Generate fallback Arabic shaping table
+
+    Not hooked up yet.
+
+ src/Makefile.am                         |   6 +-
+ src/gen-arabic-table.py                 | 220
+ +++++++++++++++++++++++---------
+ src/gen-indic-table.py                  |   4 +-
+ src/hb-ot-shape-complex-arabic-table.hh | 205
+ ++++++++++++++++++++++++++++-
+ 4 files changed, 367 insertions(+), 68 deletions(-)
+
+commit 3b26f96ebe859570d14c6902afc23462bca40712
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 10 10:52:07 2012 -0400
+
+    Add Thai shaper that does SARA AM decomposition / reordering
+
+    That's not in the OpenType spec, but it's what MS and Adobe do.
+
+ src/hb-buffer.cc                   |   1 +
+ src/hb-ot-shape-complex-misc.cc    | 104
+ ++++++++++++++++++++++++++++++++++++-
+ src/hb-ot-shape-complex-private.hh |   8 +++
+ 3 files changed, 112 insertions(+), 1 deletion(-)
+
+commit 0b6d2ac6a1d04877ae4542fc2a3b920185547053
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 10 10:52:03 2012 -0400
+
+    Minor
+
+ TODO | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+commit e099dd6592b4ea887696330f4718efb572494d93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 10 10:47:33 2012 -0400
+
+    Add Thai test case for SARA AM decomposition
+
+ test/shaping/texts/in-tree/shaper-hangul/MANIFEST    | 1 +
+ test/shaping/texts/in-tree/shaper-thai/misc/misc.txt | 5 +++++
+ 2 files changed, 6 insertions(+)
+
+commit 4450dc9354b18cd68980b0891b24ea8efa4f38b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 7 22:07:23 2012 -0400
+
+    Move around
+
+ test/shaping/texts/in-tree/MANIFEST
+ | 1 +
+ test/shaping/texts/in-tree/shaper-default/MANIFEST
+ | 1 -
+ .../in-tree/{shaper-default => shaper-hangul}/script-hangul/MANIFEST
+ | 0
+ .../{shaper-default => shaper-hangul}/script-hangul/misc/MANIFEST
+ | 0
+ .../{shaper-default => shaper-hangul}/script-hangul/misc/misc.txt
+ | 0
+ 5 files changed, 1 insertion(+), 1 deletion(-)
+
+commit d4cc44716c1e098f8abbc0e495404598026ef242
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 7 21:52:28 2012 -0400
+
+    Move code around, in prep for Thai/Lao shaper
+
+ src/hb-buffer-private.hh                 |  5 +++++
+ src/hb-buffer.cc                         | 23 +++++++++++++++++++++++
+ src/hb-ot-shape-complex-indic-machine.rl | 14 +-------------
+ 3 files changed, 29 insertions(+), 13 deletions(-)
+
+commit c9a841f4452921c5361b8f5697bbff7736ce60cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 7 15:06:55 2012 -0400
+
+    Add simple Hangul shaper that recomposes Jamo when feasible
+
+    Previously, we were NOT actually recomposing Hangul Jamo.  We do now.
+    The two lines in:
+
+    test/shaping/texts/in-tree/shaper-default/script-hangul/misc/misc.txt
+
+    Now render the same with the UnDotum.ttf font.  Previously the second
+    linle was rendering boxes.
+
+    We can also start applying OpenType Jamo features later.  At this
+    time,
+    I have no idea how the 'ljmo', 'vjmo', 'tjmo' features are supposed to
+    work.  Maybe someone can explain them to me?
+
+ src/hb-ot-shape-complex-misc.cc    | 16 ++++++++++++++++
+ src/hb-ot-shape-complex-private.hh | 15 +++++++++++++--
+ 2 files changed, 29 insertions(+), 2 deletions(-)
+
+commit 968318455304804dc53045e8ba0cd4d76800c02d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 7 14:57:21 2012 -0400
+
+    Implement normalization mode
+    HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_FULL
+
+    In this mode we try composing CCC=0 with CCC=0 characters.  Useful for
+    Hangul.
+
+ src/hb-ot-shape-normalize.cc | 21 +++++++++++++--------
+ 1 file changed, 13 insertions(+), 8 deletions(-)
+
+commit bec2ac4fde1ba0dd6dba02adbb836ce569a5cf6f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 7 14:51:17 2012 -0400
+
+    Bring normalization algorithm closer to the spec
+
+    No logical difference so far.
+
+ src/hb-ot-shape-normalize.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit e02d9257863b49e33ab5942971266349d3c548f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 7 14:49:13 2012 -0400
+
+    Flip logic around
+
+ src/hb-ot-shape-normalize.cc | 38 +++++++++++++-------------------------
+ 1 file changed, 13 insertions(+), 25 deletions(-)
+
+commit aaa25d5f458127f53f4b5ecdeb986ae91fabbad3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 5 17:27:23 2012 -0400
+
+    Add Hangul test case
+
+    Composed, and decomposed, of the same text.
+
+ test/shaping/texts/in-tree/shaper-default/MANIFEST                    |
+ 1 +
+ test/shaping/texts/in-tree/shaper-default/script-hangul/MANIFEST      |
+ 1 +
+ test/shaping/texts/in-tree/shaper-default/script-hangul/misc/MANIFEST |
+ 1 +
+ test/shaping/texts/in-tree/shaper-default/script-hangul/misc/misc.txt |
+ 2 ++
+ 4 files changed, 5 insertions(+)
+
+commit 11138ccff71f442da1fcf64faa0e1d22e083e775
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 5 17:25:19 2012 -0400
+
+    Add normalize mode
+
+    In preparation for Hangul shaper.
+
+ src/Makefile.am                      |  1 +
+ src/hb-ot-layout-common-private.hh   |  1 -
+ src/hb-ot-shape-complex-arabic.cc    |  6 +--
+ src/hb-ot-shape-complex-indic.cc     |  6 +--
+ src/hb-ot-shape-complex-misc.cc      |  8 ++--
+ src/hb-ot-shape-complex-private.hh   | 13 ++++---
+ src/hb-ot-shape-normalize-private.hh | 46 +++++++++++++++++++++++
+ src/hb-ot-shape-normalize.cc         | 73
+ +++++++++++++++++-------------------
+ src/hb-ot-shape-private.hh           |  7 +---
+ src/hb-ot-shape.cc                   |  2 +-
+ 10 files changed, 102 insertions(+), 61 deletions(-)
+
+commit 6769f21d579a354e32577ec57348e97d2cb1b438
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 5 16:46:46 2012 -0400
+
+    More moving code around
+
+ src/hb-ot-shape-normalize.cc | 2 +-
+ src/hb-ot-shape-private.hh   | 8 --------
+ src/hb-ot-shape.cc           | 2 +-
+ src/hb-unicode-private.hh    | 8 ++++++++
+ 4 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 2db2a566826ed4763ce69629194ec656bd48b0bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 5 16:40:37 2012 -0400
+
+    Move code around
+
+ src/hb-ot-shape-private.hh | 53
+ --------------------------------------------
+ src/hb-unicode-private.hh  |  3 +++
+ src/hb-unicode.cc          | 55
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 58 insertions(+), 53 deletions(-)
+
+commit cad3821f3d5b68d490b0728bd37bd57428ec809c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 17:13:25 2012 -0500
+
+    More sorting by Unicode version
+
+    This is the most convenient way to browse scripts.
+
+ src/hb-common.cc                   |  2 +-
+ src/hb-common.h                    |  2 +-
+ src/hb-ot-shape-complex-private.hh | 94
+ ++++++++++++++++++++++++++++----------
+ 3 files changed, 72 insertions(+), 26 deletions(-)
+
+commit 317b9504d7a4faa70dcf21e5c2aff4792dbd201a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 16:51:29 2012 -0500
+
+    Minor
+
+ src/hb-ot-shape-complex-private.hh | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit fa2673c1ee954ddbbfbfca7cced7b839d7776fc0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 15:52:02 2012 -0500
+
+    More Unicode script age annotation, and a couple more RTL scripts
+
+    Cross-checked with Mark Davis's spreadsheet at http://goo.gl/x9ilM
+
+ src/hb-common.cc |  8 ++++++++
+ src/hb-common.h  | 52
+ +++++++++++++++++++++++++++++-----------------------
+ 2 files changed, 37 insertions(+), 23 deletions(-)
+
+commit 6d4016f1ba48d409800dc3281b93e5cd58c99d9f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 15:33:14 2012 -0500
+
+    Make src tests pass again
+
+ src/gen-arabic-table.py                 | 11 ++++++-----
+ src/gen-indic-table.py                  |  9 +++++----
+ src/hb-ot-shape-complex-arabic-table.hh |  6 ++++++
+ src/hb-ot-shape-complex-indic-table.hh  |  4 ++++
+ 4 files changed, 21 insertions(+), 9 deletions(-)
+
+commit 7da435f08cc406080a5ee9b1ab5351db6a93acae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 15:20:20 2012 -0500
+
+    Separate Unicode 3.1 and Unicode 3.2 additions
+
+ src/hb-common.h | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit f91136cb528e298651c4a8a8a1d6dc54136e09ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 12:56:22 2012 -0500
+
+    Route three Unicode 6.1 scripts through Indic shaper
+
+ src/hb-ot-shape-complex-private.hh | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit f32c0012ad794cd2df669dfc7b0438fafbe38b2d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 12:53:34 2012 -0500
+
+    Add Unicode 6.1.0 scripts
+
+ src/hb-common.h |  9 +++++++++
+ src/hb-glib.cc  | 11 ++++++++++-
+ 2 files changed, 19 insertions(+), 1 deletion(-)
+
+commit 50e810cd0e55c25fddb0a2fd0861c51fbf65700e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 12:49:08 2012 -0500
+
+    Lydian and Kharoshthi are right-to-left
+
+ src/hb-common.cc | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit a52835635e4a2a12715aff2febb561515a10cd5a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 12:38:39 2012 -0500
+
+    Whitespace
+
+ src/hb-common.h | 194
+ ++++++++++++++++++++++++++++----------------------------
+ 1 file changed, 97 insertions(+), 97 deletions(-)
+
+commit 183224684a45d7dcd7d28510d4383a7a7cb3dff3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 12:21:28 2012 -0500
+
+    Use generic shaper for Buhid
+
+    As requested by Jonathan Kew.
+
+    We need to devise a better mechanism to choose which scripts to
+    pass through the Indic shaper.  Moreover, currently we are storing
+    data for some scripts in the Indic shaper that are not even going
+    through that shaper.  Need to find a better way...
+
+ src/hb-ot-shape-complex-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cdc8b491a8e7cec5082ca2ad0346c1f41fdd5c92
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 12:08:33 2012 -0500
+
+    Update Indic table to Unicode 6.1 data
+
+ src/Makefile.am                         |  15 +++
+ src/gen-indic-table.py                  |  20 ++--
+ src/hb-ot-shape-complex-arabic-table.hh |  35 -------
+ src/hb-ot-shape-complex-indic-table.hh  | 178
+ +++++++++++++++++++-------------
+ 4 files changed, 134 insertions(+), 114 deletions(-)
+
+commit e3b2e077f549b04779c08a9fedb1f35b9f11075c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 10:21:24 2012 -0500
+
+    Typo
+
+ src/hb-ot-shape-normalize.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c346671b6b9b05fa51b95c16212eb29ac69510fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 6 20:47:50 2012 -0500
+
+    Minor doc fixes
+
+ src/hb-ot-shape-normalize.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 406044986a68676f3050f9350ccc448c615fc685
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 6 20:24:31 2012 -0500
+
+    Add Hebrew diacritics test cases
+
+    From:
+    https://bugzilla.mozilla.org/show_bug.cgi?id=662055
+
+ test/shaping/texts/in-tree/shaper-default/MANIFEST        |  1 +
+ .../texts/in-tree/shaper-default/script-hebrew/MANIFEST   |  1 +
+ .../in-tree/shaper-default/script-hebrew/misc/MANIFEST    |  1 +
+ .../shaper-default/script-hebrew/misc/diacritics.txt      | 15
+ +++++++++++++++
+ 4 files changed, 18 insertions(+)
+
+commit 461b9b6347e4f58589f5be82c40a2df61da2c715
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 1 18:11:19 2012 -0800
+
+    Fix cluster formation in Indic
+
+    Makes number of failures against Uniscribe with hi_IN dictionary from
+    OO.o to go down from 6334 to 4290.  Not bad for a one-line change!
+
+    Mozilla Bug 729626 - ASAN: heap-buffer-overflow HTML
+
+ src/hb-ot-shape-complex-indic-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bc71ad4973842f25216b48842a46d6c9cbce6aa3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 1 17:30:29 2012 -0800
+
+    Fix atomic-int op on Apple
+
+    The OSAtomicAdd32Barrier operator returns the new value, we want the
+    old value.
+
+ src/hb-blob.cc           | 2 +-
+ src/hb-object-private.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit a1970d9afc15b2c6b7513b923019bb223bd95154
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 24 13:51:09 2012 -0500
+
+    Add support for atomic int and mutex on Apple systems
+
+    So, apparently there's no atomic int 'get' method on Apple.
+    You have to
+    add(0) to get.  And that's not const-friendly.  So switch inert-object
+    checking to a non-atomic get.  This, however, is safe, and a
+    negligible
+    performance boost too.
+
+ src/hb-mutex-private.hh  | 14 +++++++++-----
+ src/hb-object-private.hh | 15 ++++++++++-----
+ 2 files changed, 19 insertions(+), 10 deletions(-)
+
+commit 8004429102d7d3a8c42e1cbfe231835de4d3d782
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 23 18:47:17 2012 -0500
+
+    Remove unused hb_atomic_int_set()
+
+    Apparently it can't be implemented on OS X.  We weren't using
+    it anyway.
+
+ src/hb-object-private.hh | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 45227c10e416894ba7f84fdf72d849cecdb9b898
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 23 19:47:43 2012 -0500
+
+    Add hb-warning.cc.  Oops!
+
+ src/hb-warning.cc | 53
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 53 insertions(+)
+
+commit bd7ff1dec5b92ee59fa060e793f88499adcd8c11
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 23 15:06:16 2012 -0500
+
+    Allow disabling multi-threaded support
+
+    By defining HB_NO_MT.
+
+    Also, only warn once per missing MT feature support.
+
+    Mozilla Bug 666661 - gfx/harfbuzz/src/hb-prive.h - compiler warnings
+    on mac
+
+ src/Makefile.am          |  1 +
+ src/hb-mutex-private.hh  |  6 +++---
+ src/hb-object-private.hh | 11 +++--------
+ 3 files changed, 7 insertions(+), 11 deletions(-)
+
+commit 634c9e3423a9c23793400d1f56e98070e00b6056
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 22 16:43:21 2012 -0500
+
+    Minor
+
+ src/hb-ot-shape-private.hh | 69
+ ++++++++++++++++++++++++++--------------------
+ 1 file changed, 39 insertions(+), 30 deletions(-)
+
+commit 514b6f88668da4eab85103c536dabe24b7bc457b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 22 16:34:37 2012 -0500
+
+    Followup: Reorder Hebrew combining classes for better rendering
+
+    Patch from Jonathan Kew.
+
+    Bug 662055 - advanced Hebrew diacritics are shown correctly only in
+    particular order.
+
+ src/hb-ot-shape-private.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 6e78607ea71e3e5306f88f227ddba76133d16ed0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 22 16:31:15 2012 -0500
+
+    Reorder Hebrew combining classes for better rendering
+
+    Patch from Jonathan Kew.
+
+    Bug 662055 - advanced Hebrew diacritics are shown correctly only in
+    particular order
+
+ src/hb-ot-shape-private.hh | 28 ++++++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+commit 7a70ca78e06c676befe1ae17199fff1f000f8188
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 21 11:31:47 2012 -0500
+
+    Add test case from https://bugzilla.mozilla.org/show_bug.cgi?id=714067
+
+ test/shaping/texts/in-tree/shaper-arabic/script-arabic/misc/MANIFEST
+ | 1 +
+ .../in-tree/shaper-arabic/script-arabic/misc/ligature-diacritics.txt
+ | 1 +
+ 2 files changed, 2 insertions(+)
+
+commit f51e167436a51b890ffe3f7f7920498fa287acd9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 30 09:48:33 2012 -0500
+
+    Minor error handling
+
+ util/options.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit bee74efbdebc4e46ce57daa8a88bcf06b13411fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 27 02:14:08 2012 -0500
+
+    Update git.mk to new upstream
+
+ git.mk | 44 +++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 33 insertions(+), 11 deletions(-)
+
+commit 134aa7bc7e3f9b9de76c9de2ed4b7344a7b323f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 27 02:09:40 2012 -0500
+
+    Make checks more OS X friendly
+
+ src/check-internal-symbols.sh | 21 +++++++++++++--------
+ src/check-libstdc++.sh        | 21 +++++++++++++--------
+ 2 files changed, 26 insertions(+), 16 deletions(-)
+
+commit 6152199368399bf98368ea3c794fa760b49756ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 27 01:57:59 2012 -0500
+
+    Fix check-header-guards on OS X
+
+ src/check-header-guards.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c62e41b6aad1fc56225d0e53d6d4abd0f005fe3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 27 02:20:58 2012 -0500
+
+    Minor
+
+ configure.ac | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 1a5a91dc0d8bf4b72a2f22dc6300b06ad7000b79
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 19:57:00 2012 -0500
+
+    Add a few more tests
+
+ .../in-tree/shaper-indic/indic/script-devanagari/misc/misc.txt   | 3 +++
+ .../shaper-indic/south-east-asian/script-thai/misc/misc.txt      |
+ 9 +++++++++
+ 2 files changed, 12 insertions(+)
+
+commit 1795f3a222a85cdf80c78a0e9181d23dd1673876
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 19:29:45 2012 -0500
+
+    Add a couple Thai test cases from Thep
+
+ test/shaping/texts/in-tree/shaper-indic/south-east-asian/MANIFEST       |
+ 1 +
+ .../texts/in-tree/shaper-indic/south-east-asian/script-thai/MANIFEST    |
+ 1 +
+ .../in-tree/shaper-indic/south-east-asian/script-thai/misc/MANIFEST     |
+ 1 +
+ .../in-tree/shaper-indic/south-east-asian/script-thai/misc/misc.txt     |
+ 2 ++
+ 4 files changed, 5 insertions(+)
+
+commit ec3f506682fc6e2d7d7455e49d6c82ac9dd0c660
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 19:10:55 2012 -0500
+
+    Add Devanagari test from Tom Hacohen
+
+ .../texts/in-tree/shaper-indic/indic/script-devanagari/misc/misc.txt
+ | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 71be4ca3dd5eaaca31957e34fef11f6aeb4aebdf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 16:26:49 2012 -0500
+
+    Also ignore "ChangeLog" in manifests
+
+ test/shaping/hb_test_tools.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3c9a39ecd65990f2c7b29bb741c6a538fa425531
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 16:21:19 2012 -0500
+
+    Remove newline
+
+ test/shaping/hb_test_tools.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit e4ccbfe276db5ed098ddcf78a7bb8f2da4263128
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 16:07:32 2012 -0500
+
+    Allow --color=html in hb-diff
+
+    Not that useful right now as we don't escape < and >.  Perhaps
+    another tool can be added to convert the ANSI output to HTML.
+
+ test/shaping/hb-diff          |  2 +-
+ test/shaping/hb_test_tools.py | 22 +++++++++++++++++-----
+ 2 files changed, 18 insertions(+), 6 deletions(-)
+
+commit 71632c96daa4ba15e13f4d9e7f2c121d0162614e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 22 15:31:44 2012 -0500
+
+    Fallback to Latin script if the font has no other usable scripts
+
+    Patch and description from Jonathan Kew:
+
+    It turns out that some legacy Thai fonts provide OpenType substitution
+    features to implement mark positioning, but (incorrectly) put those
+    features/lookups under the 'latn' script tag instead of using 'thai'
+    (or
+    possibly 'DFLT'). See
+    https://bugzilla.mozilla.org/show_bug.cgi?id=719366 for an example and
+    more detailed description.
+
+    Although this is really a font bug, I suggest that we could improve
+    the
+    rendering of such fonts by looking for the 'latn' as a fallback if
+    neither the requested script nor "default" is found in
+    hb_ot_layout_table_choose_script. Suggested patch against harfbuzz
+    master is attached.
+
+    This does _not_ affect the other kind of legacy Thai font, where
+    custom
+    code to support vendor-specific PUA codepoints would be needed. I'm
+    not
+    keen to go down that path; IMO, such fonts should be ruthlessly
+    stamped
+    out in favour of standards-based solutions. :)
+
+    JK
+
+ src/hb-ot-layout.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 8f80f93491be73f05eba908591c856339acda51e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 20:03:25 2012 -0500
+
+    More shoveling around
+
+ test/shaping/hb-diff-filter-failures |  2 +-
+ test/shaping/hb-manifest-read        |  2 +-
+ test/shaping/hb_test_tools.py        | 27 ++++++++++++++++-----------
+ 3 files changed, 18 insertions(+), 13 deletions(-)
+
+commit c78c6e9844a23144ce7fa29afbf57b74587bfcd0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 19:55:16 2012 -0500
+
+    Cleanup
+
+ test/shaping/hb-manifest-read |  2 +-
+ test/shaping/hb_test_tools.py | 13 ++++++++-----
+ 2 files changed, 9 insertions(+), 6 deletions(-)
+
+commit ab94a9c542f7ec9143335b73493ccb75d4586a3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 19:43:58 2012 -0500
+
+    Distribute testing tools
+
+ test/shaping/Makefile.am | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit 3e86feb54c94e46b60168fd2a4773183eb1354b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 19:40:30 2012 -0500
+
+    Speed up colorless diff
+
+ test/shaping/hb_test_tools.py | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 1e58df603457cb4b57da78b5d4a8df66aa7d7be4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 19:37:31 2012 -0500
+
+    Cleanup manifest code
+
+ test/shaping/hb_test_tools.py | 18 ++++++++++++------
+ 1 file changed, 12 insertions(+), 6 deletions(-)
+
+commit 956d552e108eeb50bb3ad21588830af7a2f3862a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 19:31:51 2012 -0500
+
+    Port hb-manifest-update to Python
+
+ test/shaping/hb-manifest-update | 23 +++--------------------
+ test/shaping/hb_test_tools.py   | 38
+ ++++++++++++++++++++++++++++++--------
+ 2 files changed, 33 insertions(+), 28 deletions(-)
+
+commit 3a34e9e351ed0ee3eb27f9c0f154bc227f1226bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 19:15:41 2012 -0500
+
+    Ignore Broken Pipe errors
+
+ test/shaping/hb_test_tools.py | 76
+ +++++++++++++++++++++++++++----------------
+ 1 file changed, 48 insertions(+), 28 deletions(-)
+
+commit d5300241680844f5625f32792f7dd7181ed05f9b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 19:07:22 2012 -0500
+
+    [util] Make clusters work with char offset instead of UTF-8 offset
+
+    This means the --features indices also refer to char position
+    instead of byte position now.  Same for cluster values reported
+    by hb-shape.
+
+    Will add an option for byte indices later.
+
+ util/options.cc |  7 +++++--
+ util/options.hh | 12 ++++++++++++
+ 2 files changed, 17 insertions(+), 2 deletions(-)
+
+commit 0f68f4a0b5ee78cbdb2a89a9a1a9125afe72ed2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 21 18:59:48 2012 -0500
+
+    Correctly print out Unicode strings
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f22089ac24f43ff048c2a0f1c1f604ae3a96be8b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 21:21:47 2012 -0500
+
+    Misc fixes
+
+ test/shaping/hb-diff          | 8 ++++----
+ test/shaping/hb_test_tools.py | 4 ++--
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 96968bfae5ce61a0a098bf0e6acd2210a309a499
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 21:16:34 2012 -0500
+
+    Port hb-manifest-read to Python
+
+ test/shaping/hb-diff-filter-failures |  2 +-
+ test/shaping/hb-manifest-read        | 37 +++------------------------
+ test/shaping/hb_test_tools.py        | 49
+ ++++++++++++++++++++++++++++++++----
+ 3 files changed, 48 insertions(+), 40 deletions(-)
+
+commit a59ed46fa4f7b76605f8ce6e75783ead406468f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 20:56:32 2012 -0500
+
+    Add final residues from test-shape-complex
+
+ .../shaping/texts/in-tree/shaper-arabic/script-nko/misc/MANIFEST | 1 +
+ .../shaping/texts/in-tree/shaper-arabic/script-nko/misc/misc.txt |
+ 5 +++++
+ test/shaping/texts/in-tree/shaper-default/MANIFEST               | 1 +
+ .../texts/in-tree/shaper-default/script-linear-b/MANIFEST        | 1 +
+ .../texts/in-tree/shaper-default/script-linear-b/misc/MANIFEST   | 1 +
+ .../texts/in-tree/shaper-default/script-linear-b/misc/misc.txt   | 1 +
+ test/shaping/texts/in-tree/shaper-indic/MANIFEST                 | 1 +
+ .../shaping/texts/in-tree/shaper-indic/south-east-asian/MANIFEST | 1 +
+ .../in-tree/shaper-indic/south-east-asian/script-khmer/MANIFEST  | 1 +
+ .../shaper-indic/south-east-asian/script-khmer/misc/MANIFEST     | 1 +
+ .../shaper-indic/south-east-asian/script-khmer/misc/misc.txt     |
+ 9 +++++++++
+ 11 files changed, 23 insertions(+)
+
+commit 820e0ed318d9b187a131baa9491d5d390ec33ef4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 20:51:52 2012 -0500
+
+    Add Punjabi tests from test-shape-complex also
+
+ .../texts/in-tree/shaper-indic/indic/script-punjabi/misc/MANIFEST
+ | 1 +
+ .../texts/in-tree/shaper-indic/indic/script-punjabi/misc/misc.txt
+ | 1 +
+ 2 files changed, 2 insertions(+)
+
+commit a7d71c105772fb612871b4cae59bdae47bbc8751
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 20:50:09 2012 -0500
+
+    Add Tamil test data from Muguntharaj Subramanian
+
+ .../shaper-indic/indic/script-tamil/misc/MANIFEST  |  1 +
+ .../shaper-indic/indic/script-tamil/misc/misc.txt  | 43
+ ++++++++++++++++++++++
+ 2 files changed, 44 insertions(+)
+
+commit 5992a9941e7f19181df1e34e79e514ccedc3d284
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 20:48:14 2012 -0500
+
+    Import test data from late test-shape-complex
+
+ .../in-tree/shaper-arabic/script-arabic/MANIFEST   |  1 +
+ .../shaper-arabic/script-arabic/misc/MANIFEST      |  0
+ .../in-tree/shaper-arabic/script-mandaic/MANIFEST  |  1 +
+ .../shaper-arabic/script-mandaic/misc/MANIFEST     |  0
+ .../shaper-arabic/script-mongolian/MANIFEST        |  1 +
+ .../shaper-arabic/script-mongolian/misc/MANIFEST   |  0
+ .../in-tree/shaper-arabic/script-nko/MANIFEST      |  1 +
+ .../in-tree/shaper-arabic/script-nko/misc/MANIFEST |  0
+ .../in-tree/shaper-arabic/script-syriac/MANIFEST   |  1 +
+ .../shaper-arabic/script-syriac/misc/MANIFEST      |  0
+ .../shaper-indic/indic/script-assamese/MANIFEST    |  1 +
+ .../indic/script-assamese/misc/MANIFEST            |  0
+ .../shaper-indic/indic/script-bengali/MANIFEST     |  1 +
+ .../indic/script-bengali/misc/MANIFEST             |  1 +
+ .../indic/script-bengali/misc/misc.txt             | 48
+ ++++++++++++++++++++++
+ .../shaper-indic/indic/script-devanagari/MANIFEST  |  1 +
+ .../indic/script-devanagari/misc/MANIFEST          |  1 +
+ .../indic/script-devanagari/misc/misc.txt          | 23 +++++++++++
+ .../shaper-indic/indic/script-gujarati/MANIFEST    |  1 +
+ .../indic/script-gujarati/misc/MANIFEST            |  0
+ .../shaper-indic/indic/script-kannada/MANIFEST     |  1 +
+ .../indic/script-kannada/misc/MANIFEST             |  1 +
+ .../indic/script-kannada/misc/misc.txt             | 17 ++++++++
+ .../shaper-indic/indic/script-malayalam/MANIFEST   |  1 +
+ .../indic/script-malayalam/misc/MANIFEST           |  1 +
+ .../indic/script-malayalam/misc/misc.txt           | 22 ++++++++++
+ .../shaper-indic/indic/script-oriya/MANIFEST       |  1 +
+ .../shaper-indic/indic/script-oriya/misc/MANIFEST  |  1 +
+ .../shaper-indic/indic/script-oriya/misc/misc.txt  | 28 +++++++++++++
+ .../shaper-indic/indic/script-punjabi/MANIFEST     |  1 +
+ .../indic/script-punjabi/misc/MANIFEST             |  0
+ .../shaper-indic/indic/script-sinhala/MANIFEST     |  1 +
+ .../indic/script-sinhala/misc/MANIFEST             |  1 +
+ .../indic/script-sinhala/misc/misc.txt             |  6 +++
+ .../shaper-indic/indic/script-tamil/MANIFEST       |  1 +
+ .../shaper-indic/indic/script-tamil/misc/MANIFEST  |  0
+ .../shaper-indic/indic/script-telugu/MANIFEST      |  1 +
+ .../shaper-indic/indic/script-telugu/misc/MANIFEST |  1 +
+ .../shaper-indic/indic/script-telugu/misc/misc.txt | 11 +++++
+ 39 files changed, 178 insertions(+)
+
+commit 46ac45647760984c6220f04ba4521038e628b169
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 19:32:17 2012 -0500
+
+    Fix Unicode encoding issue
+
+ test/shaping/hb_test_tools.py | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit ad34e39a4a320310b1edd9fc4d7e740373510c69
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 18:39:27 2012 -0500
+
+    Make test tools interactive
+
+    By bypassing readlines() buffering.
+
+ test/shaping/hb_test_tools.py | 33 +++++++++++++++++++++++++++------
+ 1 file changed, 27 insertions(+), 6 deletions(-)
+
+commit 91540a7d97051a3d6e97fdcd1e98af23e0780cdd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 18:27:52 2012 -0500
+
+    Move most testing logic into hb_test_tools.py
+
+    The actual utils are one-liners now.
+
+ test/shaping/hb-diff                 |  77 ++-------------
+ test/shaping/hb-diff-filter-failures |  27 +-----
+ test/shaping/hb-unicode-decode       |  18 +---
+ test/shaping/hb-unicode-encode       |  21 +---
+ test/shaping/hb-unicode-prettyname   |  53 +----------
+ test/shaping/hb_test_tools.py        | 180
+ +++++++++++++++++++++++++++++++++++
+ 6 files changed, 197 insertions(+), 179 deletions(-)
+
+commit 66aa080033dcff07b8bb5e7b1f0e3511f067d6c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 17:36:10 2012 -0500
+
+    Remove test-shape-complex
+
+    New shaping testsuite and framework coming.
+
+ test/api/Makefile.am               |    6 -
+ test/api/test-shape-complex.c      | 1237
+ ------------------------------------
+ test/shaping/hb-unicode-prettyname |    1 +
+ 3 files changed, 1 insertion(+), 1243 deletions(-)
+
+commit ed459bfb63c58b59fc0dbe25021c396e8ef8683c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 17:24:05 2012 -0500
+
+    Add hb-unicode-encode
+
+ test/shaping/hb-unicode-encode | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+commit d8134bc017ca3383e0978ddee57070eb3aab8964
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 17:18:59 2012 -0500
+
+    [hb-shape] Add parantheses around --show-text output
+
+ util/options.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit b12c4d43614199f8910a06507603f6c431d9df67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 17:17:44 2012 -0500
+
+    Add hb-diff-filter-failures
+
+ test/shaping/hb-diff-filter-failures | 28 ++++++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+commit d4bffbc55bf4c23ab5c7f46af613aeecc79ac515
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 17:16:35 2012 -0500
+
+    Move
+
+ test/shaping/texts/MANIFEST                                           |
+ 4 +---
+ test/shaping/texts/in-tree/MANIFEST                                   |
+ 3 +++
+ test/shaping/texts/{ => in-tree}/shaper-arabic/MANIFEST               | 0
+ test/shaping/texts/{ => in-tree}/shaper-arabic/script-arabic/MANIFEST | 0
+ .../shaping/texts/{ => in-tree}/shaper-arabic/script-mandaic/MANIFEST | 0
+ .../texts/{ => in-tree}/shaper-arabic/script-mongolian/MANIFEST       | 0
+ test/shaping/texts/{ => in-tree}/shaper-arabic/script-nko/MANIFEST    | 0
+ test/shaping/texts/{ => in-tree}/shaper-arabic/script-syriac/MANIFEST | 0
+ test/shaping/texts/{ => in-tree}/shaper-default/MANIFEST              | 0
+ test/shaping/texts/{ => in-tree}/shaper-indic/MANIFEST                | 0
+ test/shaping/texts/{ => in-tree}/shaper-indic/indic/MANIFEST          | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-assamese/MANIFEST   | 0
+ .../{ => in-tree}/shaper-indic/indic/script-assamese/utrrs/LICENSE    | 0
+ .../{ => in-tree}/shaper-indic/indic/script-assamese/utrrs/MANIFEST   | 0
+ .../{ => in-tree}/shaper-indic/indic/script-assamese/utrrs/README     | 0
+ .../{ => in-tree}/shaper-indic/indic/script-assamese/utrrs/SOURCES    | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt    | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt          | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt     | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt              | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt   | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt            | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt        | 0
+ .../shaper-indic/indic/script-assamese/utrrs/codepoint/MANIFEST       | 0
+ .../script-assamese/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt     | 0
+ .../script-assamese/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt     | 0
+ .../shaper-indic/indic/script-assamese/utrrs/gpos/MANIFEST            | 0
+ .../indic/script-assamese/utrrs/gsub/IndicFontFeatureGSUB.txt         | 0
+ .../shaper-indic/indic/script-assamese/utrrs/gsub/MANIFEST            | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-bengali/MANIFEST    | 0
+ .../{ => in-tree}/shaper-indic/indic/script-bengali/utrrs/LICENSE     | 0
+ .../{ => in-tree}/shaper-indic/indic/script-bengali/utrrs/MANIFEST    | 0
+ .../{ => in-tree}/shaper-indic/indic/script-bengali/utrrs/README      | 0
+ .../{ => in-tree}/shaper-indic/indic/script-bengali/utrrs/SOURCES     | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt    | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt          | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt     | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt              | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt   | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt            | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt        | 0
+ .../shaper-indic/indic/script-bengali/utrrs/codepoint/MANIFEST        | 0
+ .../script-bengali/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt      | 0
+ .../script-bengali/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt      | 0
+ .../shaper-indic/indic/script-bengali/utrrs/gpos/MANIFEST             | 0
+ .../indic/script-bengali/utrrs/gsub/IndicFontFeatureGSUB.txt          | 0
+ .../shaper-indic/indic/script-bengali/utrrs/gsub/MANIFEST             | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-devanagari/MANIFEST | 0
+ .../{ => in-tree}/shaper-indic/indic/script-devanagari/utrrs/LICENSE  | 0
+ .../{ => in-tree}/shaper-indic/indic/script-devanagari/utrrs/MANIFEST | 0
+ .../{ => in-tree}/shaper-indic/indic/script-devanagari/utrrs/README   | 0
+ .../{ => in-tree}/shaper-indic/indic/script-devanagari/utrrs/SOURCES  | 0
+ .../codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt      | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt    | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt          | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt     | 0
+ .../codepoint/IndicFontFeatureCodepoint-DevnagariSpecificAddition.txt | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt              | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-GenericPunctuation.txt  | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt   | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt        | 0
+ .../shaper-indic/indic/script-devanagari/utrrs/codepoint/MANIFEST     | 0
+ .../script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt   | 0
+ .../script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt   | 0
+ .../shaper-indic/indic/script-devanagari/utrrs/gpos/MANIFEST          | 0
+ .../indic/script-devanagari/utrrs/gsub/IndicFontFeatureGSUB.txt       | 0
+ .../shaper-indic/indic/script-devanagari/utrrs/gsub/MANIFEST          | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-gujarati/MANIFEST   | 0
+ .../{ => in-tree}/shaper-indic/indic/script-gujarati/utrrs/LICENSE    | 0
+ .../{ => in-tree}/shaper-indic/indic/script-gujarati/utrrs/MANIFEST   | 0
+ .../{ => in-tree}/shaper-indic/indic/script-gujarati/utrrs/README     | 0
+ .../{ => in-tree}/shaper-indic/indic/script-gujarati/utrrs/SOURCES    | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt    | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt          | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt     | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt              | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt   | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt            | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt        | 0
+ .../shaper-indic/indic/script-gujarati/utrrs/codepoint/MANIFEST       | 0
+ .../script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt     | 0
+ .../script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt     | 0
+ .../shaper-indic/indic/script-gujarati/utrrs/gpos/MANIFEST            | 0
+ .../indic/script-gujarati/utrrs/gsub/IndicFontFeatureGSUB.txt         | 0
+ .../shaper-indic/indic/script-gujarati/utrrs/gsub/MANIFEST            | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-kannada/MANIFEST    | 0
+ .../{ => in-tree}/shaper-indic/indic/script-kannada/utrrs/LICENSE     | 0
+ .../{ => in-tree}/shaper-indic/indic/script-kannada/utrrs/MANIFEST    | 0
+ .../{ => in-tree}/shaper-indic/indic/script-kannada/utrrs/README      | 0
+ .../{ => in-tree}/shaper-indic/indic/script-kannada/utrrs/SOURCES     | 0
+ .../codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt      | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt    | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt          | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt     | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt              | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt   | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt            | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt        | 0
+ .../shaper-indic/indic/script-kannada/utrrs/codepoint/MANIFEST        | 0
+ .../script-kannada/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt      | 0
+ .../shaper-indic/indic/script-kannada/utrrs/gpos/MANIFEST             | 0
+ .../indic/script-kannada/utrrs/gsub/IndicFontFeatureGSUB.txt          | 0
+ .../shaper-indic/indic/script-kannada/utrrs/gsub/MANIFEST             | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-malayalam/MANIFEST  | 0
+ .../{ => in-tree}/shaper-indic/indic/script-malayalam/utrrs/LICENSE   | 0
+ .../{ => in-tree}/shaper-indic/indic/script-malayalam/utrrs/MANIFEST  | 0
+ .../{ => in-tree}/shaper-indic/indic/script-malayalam/utrrs/README    | 0
+ .../{ => in-tree}/shaper-indic/indic/script-malayalam/utrrs/SOURCES   | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt    | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt          | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt     | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt              | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt   | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt            | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt        | 0
+ .../shaper-indic/indic/script-malayalam/utrrs/codepoint/MANIFEST      | 0
+ .../indic/script-malayalam/utrrs/gsub/IndicFontFeatureGSUB.txt        | 0
+ .../shaper-indic/indic/script-malayalam/utrrs/gsub/MANIFEST           | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-oriya/MANIFEST      | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-oriya/utrrs/LICENSE | 0
+ .../{ => in-tree}/shaper-indic/indic/script-oriya/utrrs/MANIFEST      | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-oriya/utrrs/README  | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-oriya/utrrs/SOURCES | 0
+ .../codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt      | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt    | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt          | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt     | 0
+ .../script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt   | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-OriyaSpecific.txt       | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt            | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt        | 0
+ .../shaper-indic/indic/script-oriya/utrrs/codepoint/MANIFEST          | 0
+ .../indic/script-oriya/utrrs/gsub/IndicFontFeatureGSUB.txt            | 0
+ .../{ => in-tree}/shaper-indic/indic/script-oriya/utrrs/gsub/MANIFEST | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-punjabi/MANIFEST    | 0
+ .../{ => in-tree}/shaper-indic/indic/script-punjabi/utrrs/LICENSE     | 0
+ .../{ => in-tree}/shaper-indic/indic/script-punjabi/utrrs/MANIFEST    | 0
+ .../{ => in-tree}/shaper-indic/indic/script-punjabi/utrrs/README      | 0
+ .../{ => in-tree}/shaper-indic/indic/script-punjabi/utrrs/SOURCES     | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt          | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt     | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt              | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-GurmukhiSpecific.txt    | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt   | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt            | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt        | 0
+ .../shaper-indic/indic/script-punjabi/utrrs/codepoint/MANIFEST        | 0
+ .../script-punjabi/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt      | 0
+ .../script-punjabi/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt      | 0
+ .../shaper-indic/indic/script-punjabi/utrrs/gpos/MANIFEST             | 0
+ .../indic/script-punjabi/utrrs/gsub/IndicFontFeatureGSUB.txt          | 0
+ .../shaper-indic/indic/script-punjabi/utrrs/gsub/MANIFEST             | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-sinhala/MANIFEST    | 0
+ .../{ => in-tree}/shaper-indic/indic/script-sinhala/utrrs/LICENSE     | 0
+ .../{ => in-tree}/shaper-indic/indic/script-sinhala/utrrs/MANIFEST    | 0
+ .../{ => in-tree}/shaper-indic/indic/script-sinhala/utrrs/README      | 0
+ .../{ => in-tree}/shaper-indic/indic/script-sinhala/utrrs/SOURCES     | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt          | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt     | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt   | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Punctuation.txt         | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt        | 0
+ .../shaper-indic/indic/script-sinhala/utrrs/codepoint/MANIFEST        | 0
+ .../indic/script-sinhala/utrrs/gpos/IndicFontFeatureGPOS.txt          | 0
+ .../shaper-indic/indic/script-sinhala/utrrs/gpos/MANIFEST             | 0
+ .../indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt | 0
+ .../script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt  | 0
+ .../indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt   | 0
+ .../script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Special-Cases.txt  | 0
+ .../utrrs/gsub/IndicFontFeatureGSUB-TouchingLetters.txt               | 0
+ .../indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt  | 0
+ .../indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB.txt          | 0
+ .../shaper-indic/indic/script-sinhala/utrrs/gsub/MANIFEST             | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-tamil/MANIFEST      | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-tamil/utrrs/LICENSE | 0
+ .../{ => in-tree}/shaper-indic/indic/script-tamil/utrrs/MANIFEST      | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-tamil/utrrs/README  | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-tamil/utrrs/SOURCES | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt          | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-CurrencySymbols.txt     | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt     | 0
+ .../script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt   | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Numerics.txt            | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt            | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Symbols.txt             | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-TamilSymbol.txt         | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt        | 0
+ .../shaper-indic/indic/script-tamil/utrrs/codepoint/MANIFEST          | 0
+ .../indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  | 0
+ .../indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  | 0
+ .../{ => in-tree}/shaper-indic/indic/script-tamil/utrrs/gpos/MANIFEST | 0
+ .../indic/script-tamil/utrrs/gsub/IndicFontFeatureGSUB.txt            | 0
+ .../{ => in-tree}/shaper-indic/indic/script-tamil/utrrs/gsub/MANIFEST | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-telugu/MANIFEST     | 0
+ .../{ => in-tree}/shaper-indic/indic/script-telugu/utrrs/LICENSE      | 0
+ .../{ => in-tree}/shaper-indic/indic/script-telugu/utrrs/MANIFEST     | 0
+ .../texts/{ => in-tree}/shaper-indic/indic/script-telugu/utrrs/README | 0
+ .../{ => in-tree}/shaper-indic/indic/script-telugu/utrrs/SOURCES      | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt    | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt          | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt     | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt              | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt   | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt            | 0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt        | 0
+ .../shaper-indic/indic/script-telugu/utrrs/codepoint/MANIFEST         | 0
+ .../indic/script-telugu/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt | 0
+ .../shaper-indic/indic/script-telugu/utrrs/gpos/MANIFEST              | 0
+ .../indic/script-telugu/utrrs/gsub/IndicFontFeatureGSUB.txt           | 0
+ .../shaper-indic/indic/script-telugu/utrrs/gsub/MANIFEST              | 0
+ 212 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 45f640c98d752161e51eda63061d70fad9ab9f68
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 14:24:21 2012 -0500
+
+    Minor
+
+ test/shaping/hb-diff | 35 ++++++++++++++++++++---------------
+ 1 file changed, 20 insertions(+), 15 deletions(-)
+
+commit 47ca766a9cbdfb304f60e23a4dee0a155075a277
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 14:21:53 2012 -0500
+
+    Minor
+
+ test/shaping/hb-unicode-decode     | 2 +-
+ test/shaping/hb-unicode-prettyname | 5 ++---
+ 2 files changed, 3 insertions(+), 4 deletions(-)
+
+commit 8f1db07894674b02c36ca9352e666b4618ee8832
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 13:57:57 2012 -0500
+
+    [test/shaping] Add some Indic test data for the new test suite
+
+    Imported from UTRRS.
+
+ test/shaping/texts/shaper-indic/indic/MANIFEST     |    2 +-
+ .../shaper-indic/indic/script-assamese/MANIFEST    |    1 +
+ .../indic/script-assamese/utrrs/LICENSE            |   19 +
+ .../indic/script-assamese/utrrs/MANIFEST           |    3 +
+ .../indic/script-assamese/utrrs/README             |   13 +
+ .../indic/script-assamese/utrrs/SOURCES            |    2 +
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |    4 +
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   40 +
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   10 +
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   10 +
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   11 +
+ .../IndicFontFeatureCodepoint-Reserved.txt         |    2 +
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |    6 +
+ .../indic/script-assamese/utrrs/codepoint/MANIFEST |    7 +
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   59 +
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |  131 ++
+ .../indic/script-assamese/utrrs/gpos/MANIFEST      |    2 +
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |  139 ++
+ .../indic/script-assamese/utrrs/gsub/MANIFEST      |    1 +
+ .../shaper-indic/indic/script-bengali/MANIFEST     |    1 +
+ .../indic/script-bengali/utrrs/LICENSE             |   19 +
+ .../indic/script-bengali/utrrs/MANIFEST            |    3 +
+ .../shaper-indic/indic/script-bengali/utrrs/README |   13 +
+ .../indic/script-bengali/utrrs/SOURCES             |    2 +
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |    1 +
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   36 +
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   10 +
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   10 +
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   12 +
+ .../IndicFontFeatureCodepoint-Reserved.txt         |    2 +
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |    6 +
+ .../indic/script-bengali/utrrs/codepoint/MANIFEST  |    7 +
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   58 +
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |  119 ++
+ .../indic/script-bengali/utrrs/gpos/MANIFEST       |    2 +
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |  215 +++
+ .../indic/script-bengali/utrrs/gsub/MANIFEST       |    1 +
+ .../shaper-indic/indic/script-devanagari/MANIFEST  |    1 +
+ .../indic/script-devanagari/utrrs/LICENSE          |   19 +
+ .../indic/script-devanagari/utrrs/MANIFEST         |    3 +
+ .../indic/script-devanagari/utrrs/README           |   13 +
+ .../indic/script-devanagari/utrrs/SOURCES          |    2 +
+ ...icFontFeatureCodepoint-AdditionalConsonants.txt |    8 +
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |    4 +
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   45 +
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   14 +
+ ...tFeatureCodepoint-DevnagariSpecificAddition.txt |    1 +
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   10 +
+ ...ndicFontFeatureCodepoint-GenericPunctuation.txt |    2 +
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   16 +
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   10 +
+ .../script-devanagari/utrrs/codepoint/MANIFEST     |    9 +
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |  185 +++
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |  185 +++
+ .../indic/script-devanagari/utrrs/gpos/MANIFEST    |    2 +
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            | 1367
+ ++++++++++++++++++++
+ .../indic/script-devanagari/utrrs/gsub/MANIFEST    |    1 +
+ .../shaper-indic/indic/script-gujarati/MANIFEST    |    1 +
+ .../indic/script-gujarati/utrrs/LICENSE            |   19 +
+ .../indic/script-gujarati/utrrs/MANIFEST           |    3 +
+ .../indic/script-gujarati/utrrs/README             |   13 +
+ .../indic/script-gujarati/utrrs/SOURCES            |    2 +
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |    1 +
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   34 +
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   12 +
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   10 +
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   13 +
+ .../IndicFontFeatureCodepoint-Reserved.txt         |    2 +
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |    7 +
+ .../indic/script-gujarati/utrrs/codepoint/MANIFEST |    7 +
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |  170 +++
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |  170 +++
+ .../indic/script-gujarati/utrrs/gpos/MANIFEST      |    2 +
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            | 1156
+ +++++++++++++++++
+ .../indic/script-gujarati/utrrs/gsub/MANIFEST      |    1 +
+ .../shaper-indic/indic/script-kannada/MANIFEST     |    1 +
+ .../indic/script-kannada/utrrs/LICENSE             |   19 +
+ .../indic/script-kannada/utrrs/MANIFEST            |    3 +
+ .../shaper-indic/indic/script-kannada/utrrs/README |   13 +
+ .../indic/script-kannada/utrrs/SOURCES             |    2 +
+ ...icFontFeatureCodepoint-AdditionalConsonants.txt |    1 +
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |    4 +
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   40 +
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   13 +
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   10 +
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   14 +
+ .../IndicFontFeatureCodepoint-Reserved.txt         |    2 +
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |    9 +
+ .../indic/script-kannada/utrrs/codepoint/MANIFEST  |    8 +
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |  188 +++
+ .../indic/script-kannada/utrrs/gpos/MANIFEST       |    1 +
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |  306 +++++
+ .../indic/script-kannada/utrrs/gsub/MANIFEST       |    1 +
+ .../shaper-indic/indic/script-malayalam/MANIFEST   |    1 +
+ .../indic/script-malayalam/utrrs/LICENSE           |   19 +
+ .../indic/script-malayalam/utrrs/MANIFEST          |    2 +
+ .../indic/script-malayalam/utrrs/README            |   13 +
+ .../indic/script-malayalam/utrrs/SOURCES           |    2 +
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |    2 +
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   36 +
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   12 +
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   10 +
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   14 +
+ .../IndicFontFeatureCodepoint-Reserved.txt         |    2 +
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |    4 +
+ .../script-malayalam/utrrs/codepoint/MANIFEST      |    7 +
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |  254 ++++
+ .../indic/script-malayalam/utrrs/gsub/MANIFEST     |    1 +
+ .../texts/shaper-indic/indic/script-oriya/MANIFEST |    1 +
+ .../shaper-indic/indic/script-oriya/utrrs/LICENSE  |   19 +
+ .../shaper-indic/indic/script-oriya/utrrs/MANIFEST |    2 +
+ .../shaper-indic/indic/script-oriya/utrrs/README   |   13 +
+ .../shaper-indic/indic/script-oriya/utrrs/SOURCES  |    2 +
+ ...icFontFeatureCodepoint-AdditionalConsonants.txt |    3 +
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |    2 +
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   34 +
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   12 +
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   10 +
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   12 +
+ .../IndicFontFeatureCodepoint-OriyaSpecific.txt    |    2 +
+ .../IndicFontFeatureCodepoint-Reserved.txt         |    2 +
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |    8 +
+ .../indic/script-oriya/utrrs/codepoint/MANIFEST    |    9 +
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |  170 +++
+ .../indic/script-oriya/utrrs/gsub/MANIFEST         |    1 +
+ .../shaper-indic/indic/script-punjabi/MANIFEST     |    1 +
+ .../indic/script-punjabi/utrrs/LICENSE             |   19 +
+ .../indic/script-punjabi/utrrs/MANIFEST            |    3 +
+ .../shaper-indic/indic/script-punjabi/utrrs/README |   13 +
+ .../indic/script-punjabi/utrrs/SOURCES             |    2 +
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   38 +
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |    9 +
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   10 +
+ .../IndicFontFeatureCodepoint-GurmukhiSpecific.txt |    6 +
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   10 +
+ .../IndicFontFeatureCodepoint-Reserved.txt         |    2 +
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |    6 +
+ .../indic/script-punjabi/utrrs/codepoint/MANIFEST  |    7 +
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   22 +
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |    2 +
+ .../indic/script-punjabi/utrrs/gpos/MANIFEST       |    2 +
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |  152 +++
+ .../indic/script-punjabi/utrrs/gsub/MANIFEST       |    1 +
+ .../shaper-indic/indic/script-sinhala/MANIFEST     |    1 +
+ .../indic/script-sinhala/utrrs/LICENSE             |   19 +
+ .../indic/script-sinhala/utrrs/MANIFEST            |    3 +
+ .../shaper-indic/indic/script-sinhala/utrrs/README |   13 +
+ .../indic/script-sinhala/utrrs/SOURCES             |    2 +
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   41 +
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   17 +
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   18 +
+ .../IndicFontFeatureCodepoint-Punctuation.txt      |    1 +
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |    3 +
+ .../indic/script-sinhala/utrrs/codepoint/MANIFEST  |    5 +
+ .../utrrs/gpos/IndicFontFeatureGPOS.txt            |  162 +++
+ .../indic/script-sinhala/utrrs/gpos/MANIFEST       |    1 +
+ .../utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt   |    1 +
+ .../gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt    |   41 +
+ .../utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt     |   42 +
+ .../gsub/IndicFontFeatureGSUB-Special-Cases.txt    |    2 +
+ .../gsub/IndicFontFeatureGSUB-TouchingLetters.txt  |    1 +
+ .../utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt    |   41 +
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |    1 +
+ .../indic/script-sinhala/utrrs/gsub/MANIFEST       |    7 +
+ .../texts/shaper-indic/indic/script-tamil/MANIFEST |    1 +
+ .../shaper-indic/indic/script-tamil/utrrs/LICENSE  |   19 +
+ .../shaper-indic/indic/script-tamil/utrrs/MANIFEST |    3 +
+ .../shaper-indic/indic/script-tamil/utrrs/README   |   13 +
+ .../shaper-indic/indic/script-tamil/utrrs/SOURCES  |    2 +
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   23 +
+ .../IndicFontFeatureCodepoint-CurrencySymbols.txt  |    1 +
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   11 +
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   10 +
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   12 +
+ .../IndicFontFeatureCodepoint-Numerics.txt         |    3 +
+ .../IndicFontFeatureCodepoint-Reserved.txt         |    2 +
+ .../IndicFontFeatureCodepoint-Symbols.txt          |    6 +
+ .../IndicFontFeatureCodepoint-TamilSymbol.txt      |    1 +
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |    4 +
+ .../indic/script-tamil/utrrs/codepoint/MANIFEST    |   10 +
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   64 +
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   44 +
+ .../indic/script-tamil/utrrs/gpos/MANIFEST         |    2 +
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |    4 +
+ .../indic/script-tamil/utrrs/gsub/MANIFEST         |    1 +
+ .../shaper-indic/indic/script-telugu/MANIFEST      |    1 +
+ .../shaper-indic/indic/script-telugu/utrrs/LICENSE |   19 +
+ .../indic/script-telugu/utrrs/MANIFEST             |    3 +
+ .../shaper-indic/indic/script-telugu/utrrs/README  |   13 +
+ .../shaper-indic/indic/script-telugu/utrrs/SOURCES |    2 +
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |    2 +
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   38 +
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   13 +
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   10 +
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   14 +
+ .../IndicFontFeatureCodepoint-Reserved.txt         |    2 +
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |    6 +
+ .../indic/script-telugu/utrrs/codepoint/MANIFEST   |    7 +
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |  385 ++++++
+ .../indic/script-telugu/utrrs/gpos/MANIFEST        |    1 +
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |  287 ++++
+ .../indic/script-telugu/utrrs/gsub/MANIFEST        |    1 +
+ 202 files changed, 7581 insertions(+), 1 deletion(-)
+
+commit 11267aef364b1cc5683ce65aaf544b7f2a127fb3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 13:57:14 2012 -0500
+
+    Fix
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4e84ce48d5d41cf1bad2fb8774e5c66745b0e75e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 13:50:55 2012 -0500
+
+    Move hb-diff to test/shaping/
+
+ {util => test/shaping}/hb-diff | 0
+ util/Makefile.am               | 2 --
+ 2 files changed, 2 deletions(-)
+
+commit f868e1b84d2f73688d4d6558d44610b1ac75ec13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 13:50:05 2012 -0500
+
+    Add hb-unicode-decode
+
+ test/shaping/{hb-read-manifest => hb-manifest-read}   |  0
+ .../{hb-update-manifests => hb-manifest-update}       |  0
+ test/shaping/hb-unicode-decode                        | 19
+ +++++++++++++++++++
+ 3 files changed, 19 insertions(+)
+
+commit 9ab23ef4749b51e60464b9ef2a92739cdc2b36ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 13:49:56 2012 -0500
+
+    Minor
+
+ test/shaping/hb-unicode-prettyname | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit c8d81db03335192f20f08ab8fabe9869fd7350a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 13:39:27 2012 -0500
+
+    Recognize more characters
+
+ test/shaping/hb-unicode-prettyname | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 0016d4662d486fa32c2191df801a2792f44b273c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 20 13:31:59 2012 -0500
+
+    [test] Make hb-unicode-prettyname take a --stdin option
+
+ test/shaping/hb-unicode-prettyname | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit ad8c6446f2e0d21d065203924467f6a2c418401e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 20:28:31 2012 -0500
+
+    [test/shaping] Add hb-unicode-prettyname
+
+ test/shaping/hb-unicode-prettyname | 38
+ ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 38 insertions(+)
+
+commit e900869b0f373d25b72d966338beb6cbc53e6446
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 20:28:15 2012 -0500
+
+    [test/shaping] Add hb-read-manifest
+
+ test/shaping/hb-read-manifest | 36 ++++++++++++++++++++++++++++++++++++
+ 1 file changed, 36 insertions(+)
+
+commit a211cd3ffce3aa100e92d837384bbaa9decf6b09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 20:27:53 2012 -0500
+
+    Ignore AUTHORS also
+
+ test/shaping/hb-update-manifests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c91c4fa47140c0d6191241a832fc534b1c1514ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 17:51:57 2012 -0500
+
+    [hb-shape] Change glyphstring brackets from </> to [/]
+
+    Sorry for the disruption but I need this to differentiate from the
+    Unicode string.
+
+ util/options.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 36fe87d1b4bf8317074a597501d1ee52c0bec38d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 16:55:26 2012 -0500
+
+    More Indic tests from Pravin
+
+ test/api/test-shape-complex.c | 48
+ +++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 48 insertions(+)
+
+commit a33e46cf7d9862856fd7ecb04e047cc58a9785c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 15:43:48 2012 -0500
+
+    [test/shaping] Add hb-update-manifests
+
+ test/shaping/Makefile.am                       |  6 ++----
+ test/shaping/hb-update-manifests               | 22
+ ++++++++++++++++++++++
+ test/shaping/texts/shaper-indic/indic/MANIFEST |  1 +
+ 3 files changed, 25 insertions(+), 4 deletions(-)
+
+commit d4de562adf691425b15e3e9c0eec035feaa60413
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 15:21:04 2012 -0500
+
+    Start adding new shaping test suite together
+
+ configure.ac                                                   |  1 +
+ test/Makefile.am                                               |  2 +-
+ test/shaping/Makefile.am                                       |
+ 10 ++++++++++
+ test/shaping/texts/MANIFEST                                    |  3 +++
+ test/shaping/texts/shaper-arabic/MANIFEST                      |  5 +++++
+ test/shaping/texts/shaper-arabic/script-arabic/MANIFEST        |  0
+ test/shaping/texts/shaper-arabic/script-mandaic/MANIFEST       |  0
+ test/shaping/texts/shaper-arabic/script-mongolian/MANIFEST     |  0
+ test/shaping/texts/shaper-arabic/script-nko/MANIFEST           |  0
+ test/shaping/texts/shaper-arabic/script-syriac/MANIFEST        |  0
+ test/shaping/texts/shaper-default/MANIFEST                     |  0
+ test/shaping/texts/shaper-indic/MANIFEST                       |  1 +
+ test/shaping/texts/shaper-indic/indic/MANIFEST                 |
+ 10 ++++++++++
+ test/shaping/texts/shaper-indic/indic/script-assamese/MANIFEST |  0
+ test/shaping/texts/shaper-indic/indic/script-bengali/MANIFEST  |  0
+ .../texts/shaper-indic/indic/script-devanagari/MANIFEST        |  0
+ test/shaping/texts/shaper-indic/indic/script-gujarati/MANIFEST |  0
+ test/shaping/texts/shaper-indic/indic/script-kannada/MANIFEST  |  0
+ .../shaping/texts/shaper-indic/indic/script-malayalam/MANIFEST |  0
+ test/shaping/texts/shaper-indic/indic/script-oriya/MANIFEST    |  0
+ test/shaping/texts/shaper-indic/indic/script-punjabi/MANIFEST  |  0
+ test/shaping/texts/shaper-indic/indic/script-tamil/MANIFEST    |  0
+ test/shaping/texts/shaper-indic/indic/script-telugu/MANIFEST   |  0
+ 23 files changed, 31 insertions(+), 1 deletion(-)
+
+commit 7a4a848db27d1605195f677c9c8632cde558aa05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 15:15:21 2012 -0500
+
+    Minor
+
+ src/hb-ot-shape-complex-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 4d6dafd47f4271549e528d2e8047d50562aef399
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 14:52:02 2012 -0500
+
+    Rename test/ to test/api/
+
+ configure.ac                        |   1 +
+ test/Makefile.am                    | 128
+ +----------------------------------
+ test/api/Makefile.am                | 131
+ ++++++++++++++++++++++++++++++++++++
+ test/{ => api}/hb-test.h            |   0
+ test/{ => api}/test-blob.c          |   0
+ test/{ => api}/test-buffer.c        |   0
+ test/{ => api}/test-c.c             |   0
+ test/{ => api}/test-common.c        |   0
+ test/{ => api}/test-cplusplus.cc    |   0
+ test/{ => api}/test-font.c          |   0
+ test/{ => api}/test-object.c        |   0
+ test/{ => api}/test-ot-tag.c        |   0
+ test/{ => api}/test-shape-complex.c |   0
+ test/{ => api}/test-shape.c         |   0
+ test/{ => api}/test-unicode.c       |   0
+ test/{ => api}/test-version.c       |   0
+ 16 files changed, 133 insertions(+), 127 deletions(-)
+
+commit 3b5c22c39b87155f315853fb0c40edcf14e99b54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 14:28:11 2012 -0500
+
+    Remove src/test.cc
+
+    Not really useful.
+
+ src/Makefile.am |   6 +--
+ src/test.cc     | 132
+ --------------------------------------------------------
+ 2 files changed, 1 insertion(+), 137 deletions(-)
+
+commit 4983feebbbb25e79201bf34035e4d58e61218758
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 13:54:52 2012 -0500
+
+    [hb-diff] Clean up
+
+ util/hb-diff | 41 ++++++++++++++++++++++++++---------------
+ 1 file changed, 26 insertions(+), 15 deletions(-)
+
+commit cdc673d97c5ffedb386865a81f54a5cedcbad27c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 12:46:18 2012 -0500
+
+    [hb-shape] Add --show-line-num
+
+    Ok, much more useful as a test suite driver now.
+
+ util/hb-shape.cc | 24 +++++-------------------
+ util/options.cc  | 34 ++++++++++++++++++++++++++++++++++
+ util/options.hh  | 25 ++++++++++++++++++++-----
+ 3 files changed, 59 insertions(+), 24 deletions(-)
+
+commit cc4d9810d6318ca2e4de3b8d62f03b51cc21ee05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 12:32:20 2012 -0500
+
+    [hb-shape] Add --show-text and --show-unicode options
+
+ util/hb-shape.cc | 19 ++++++++++++++++++-
+ util/options.cc  | 26 +++++++++++++++++++++++---
+ util/options.hh  | 12 +++++++++---
+ 3 files changed, 50 insertions(+), 7 deletions(-)
+
+commit 27c36af411c7c4d75dd25d79fc76dd92c6bb9643
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 12:30:43 2012 -0500
+
+    Fix OOB in hb-shape
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8d2781d69274672303e30522e222bd01c6b5e781
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 19 11:36:39 2012 -0500
+
+    [test] Add two Indic test cases from Bernard Massot
+
+ test/test-shape-complex.c | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+commit 8750abaf8410005facbea8c886c592bead7f959b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 18 22:47:44 2012 -0500
+
+    [util] Add --help-features
+
+    Patch from Khaled Hosny.
+
+ util/options.cc | 42 +++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 41 insertions(+), 1 deletion(-)
+
+commit 889caa52fa1bef61013ec1d127f84d7d5907ef1e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 18 22:32:52 2012 -0500
+
+    [icu] Use U_FAILURE
+
+ src/hb-icu.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 36a4f4a482456ee816dcb59befa0b0538ba487df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 18 22:16:49 2012 -0500
+
+    Replace u_strlen() with u_countChar32()
+
+    The latter is what I meant.
+
+ src/hb-icu.cc | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit 055fb24d03ae518fa0aa6c2860a03f3cb6a5ef0d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 18 21:58:34 2012 -0500
+
+    Add test for bug in ICU decompose
+
+    As reported by Kenichi Ishibashi on 2011-10-28.
+
+ test/test-unicode.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c521e793bd6c1dafacb94253a45b9c70ab38525e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 18 21:51:05 2012 -0500
+
+    Fix OOB in replace_glyph()
+
+    Patch from Kenichi Ishibashi.
+
+ src/hb-buffer.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 03408ce73d003ed4e58e3f8472f9445e72b86bee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 18 21:28:34 2012 -0500
+
+    Fix more possible buffer overruns
+
+    I have this function, but can't clean up it to my satisfaction.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 7d479900cd11bc88148cd601ee43bc5492ce5843
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 18 21:19:32 2012 -0500
+
+    Refactor the two remaining uses of _hb_ot_layout_skip_mark()
+
+ src/hb-ot-layout-gsub-table.hh       | 2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 7 +++++--
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+commit 506ffeb8e77a668fa305139582d215c32e46bb03
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 18 16:07:53 2012 -0500
+
+    Further mark skippy fixes from Jonathan Kew
+
+    We should be in good shape now.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit a4a48fe6d4f884a37e720430347d10dbe3562a79
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 17 18:08:41 2012 -0500
+
+    Fix mark skipping regression
+
+    Ouch!
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4ab97311541225906f6b737a2b47de252224cc09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 16 22:05:08 2012 -0500
+
+    Refactor mark skipping
+
+ src/hb-ot-layout-gpos-table.hh       |  95 ++++++++++----------------
+ src/hb-ot-layout-gsub-table.hh       |  21 +++---
+ src/hb-ot-layout-gsubgpos-private.hh | 125
+ +++++++++++++++++++++++++++--------
+ 3 files changed, 143 insertions(+), 98 deletions(-)
+
+commit 370f03e9c69d98d735eafb7e72b13b17f42cbaa9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 16 17:03:55 2012 -0500
+
+    Minor
+
+ src/hb-ot-layout-gsub-table.hh       | 5 ++---
+ src/hb-ot-layout-gsubgpos-private.hh | 6 ++----
+ 2 files changed, 4 insertions(+), 7 deletions(-)
+
+commit 4d3aeb8cb2bc1ca7cdd03ba28ba8c334f12d4c03
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 16 16:43:26 2012 -0500
+
+    [GSUB/GPOS] Fix mark skip indexing issues
+
+    Mozilla bug 701637 and 714067 combined.
+
+    Patch from Jonathan Kew.
+
+ src/hb-ot-layout-gpos-table.hh       | 42
+ ++++++++++++++++-----------------
+ src/hb-ot-layout-gsub-table.hh       | 21 +++++++++--------
+ src/hb-ot-layout-gsubgpos-private.hh | 45
+ ++++++++++++++++++------------------
+ 3 files changed, 54 insertions(+), 54 deletions(-)
+
+commit e8eedf2687f05372bf5476e84139d01ba67c9f73
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 16 16:39:40 2012 -0500
+
+    Avoid enum trailing commas
+
+    Based on patch from Jonathan Kew.
+
+ src/hb-ot-shape-complex-indic.cc   | 4 ++--
+ src/hb-ot-shape-complex-private.hh | 2 ++
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+commit 3d0ddd12801689b4093ffca97da4dd9ca669b64a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 15 15:55:52 2012 -0500
+
+    Require glib >= 2.16 for the gobject option
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 95ab82a992ab916046c2e6205db7cadeec88d206
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 15 14:56:56 2012 -0500
+
+    Disable gtk-doc macro
+
+    We don't have any docs yet.
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 299ae0c3a367c84a835eadbd1276ca284d2720c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 14 21:29:45 2012 -0500
+
+    [icu] Remove glib-ism
+
+ src/hb-icu.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a097043f9a81e6c20caf69a5dabdf9e00438d79b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 14 17:55:51 2012 -0500
+
+    Allow space in one more place when parsing features
+
+ util/options.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit af92135424b994062648f4fb7e26af0bd970a4b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 21 09:18:43 2011 -0700
+
+    Minor
+
+ src/hb-object-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 89d89646e8163b6c0874b9a3c14d4da974ea8219
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 17 11:50:54 2011 -0700
+
+    Fix intrin.h b0rkage with older MSVC
+
+    Reported by Jonathan Kew.
+
+ src/hb-object-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit af913c5788e600e36d29f44fe4e77db84cf8c442
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 17 11:39:28 2011 -0700
+
+    Fix infinite loop in normalization code with variation selectors
+
+    Reported by Jonathan Kew.
+
+ src/hb-ot-shape-normalize.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit fd528c17b7b5ac912f1ac980e1d9981f561c3b46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 12 15:03:58 2011 -0400
+
+    [util] Add --list-shapers to hb-view and hb-shape
+
+ util/options.cc | 17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
+
+commit a17554bfd51dc8a37b1674d1ede63e616618e0a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 28 16:57:34 2011 -0400
+
+    Make test-c.c actually use hb
+
+    This will make sure we test that C code can actually link to the
+    library.
+
+ test/test-c.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 55deff7595ef357d000fef83559c74c9f8acad00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 28 16:20:09 2011 -0400
+
+    Add comments
+
+ src/hb-ot-shape-normalize.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit a240d5a0a3ccc71902e7a341b6d531995319999d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 27 13:50:45 2011 -0400
+
+    Add TODO item
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 52ebdff49d13f239efc886de935d47be9860f6e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 27 12:38:16 2011 -0400
+
+    Fix GSUB lookuptype 1 subtype 1 delta wrapping
+
+ src/hb-ot-layout-gsub-table.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 5857720cd35078d1c3906c8b2db3190b5166b66f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 27 12:36:26 2011 -0400
+
+    [util] s/%d/%u/ when printing glyph ids and clusters
+
+ util/options.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit b95324cdd217f44c40c5fd44898e659500f19511
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 21 16:50:39 2011 -0400
+
+    Minor
+
+ src/hb-blob.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0cd33592ab4bb486ffc438ba0efdac2fa7a1bb7f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 21 16:49:33 2011 -0400
+
+    Fix possible leaks
+
+ src/hb-font.cc | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+commit d3f3690b485e1d240fec4f204aef54e07853a244
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 21 16:41:43 2011 -0400
+
+    hb-shape: In --no-glyph-names, output glyph number directly
+
+    Ie. write "86" instead of "gid86".
+
+ util/options.cc | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+commit 088c1e27c0fc0cdef999cf1f567e4d5eb2cfb2e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 20 14:43:55 2011 -0400
+
+    [util] Fix option parsing
+
+    Wow, who knew bool is one byte and I was using it as a 4byte int?!
+
+    C++ auto casts fails you in mysterious ways...
+
+ util/helper-cairo.cc |  2 +-
+ util/options.cc      |  3 ++-
+ util/options.hh      | 14 +++++++-------
+ 3 files changed, 10 insertions(+), 9 deletions(-)
+
+commit d606daa4cca323c8977b2e52e6863dc0f1b72fa9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 20 14:34:06 2011 -0400
+
+    Whitespace
+
+ src/gen-arabic-table.py | 2 +-
+ src/gen-indic-table.py  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit e700bce1189465a159a7c3c179f231be224f31cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 20 11:20:53 2011 -0400
+
+    [util] Add hb-diff
+
+    A diff program written in Python that is more suitable for comparing
+    hb-shape output from different backends.  Main differences with stock
+    diff:
+
+    1. It outputs one line's comparison at a time, as opposed to batching
+    '+' lines and '-' lines.
+
+    2. It colors the part of the line that changed, taking word boundaries
+    into consideration.
+
+    You can pipe the colored output to 'less -r'.
+
+ util/Makefile.am |  2 ++
+ util/hb-diff     | 59
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 61 insertions(+)
+
+commit 880c1f0e4ede65890592d28dfb38bb06f5b57500
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 19 23:10:22 2011 -0400
+
+    Rewrite ICU detection code with in-house macros
+
+    At least works for cross-compiling now...
+
+ configure.ac | 26 +++++++++++++++-----------
+ 1 file changed, 15 insertions(+), 11 deletions(-)
+
+commit f83f0f4836691b04306c2ef80979f2e1d76a2f28
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 19 18:51:48 2011 -0400
+
+    [graphite] Add note about graphite shaker brokenness
+
+ src/hb-graphite2.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 422558142aabb996d8ad1848df7ea4d5a8ade98a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 19 17:57:02 2011 -0400
+
+    [util] Account for line-space in surface size
+
+ util/options.cc    | 2 +-
+ util/options.hh    | 1 -
+ util/view-cairo.cc | 2 +-
+ 3 files changed, 2 insertions(+), 3 deletions(-)
+
+commit b5afd8f78e6b372f1bbed469329c1554adb20eea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 19 16:56:21 2011 -0400
+
+    [util] Rename --output to --output_file, and --format to
+    --output-format
+
+ util/options.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0a965eee880428a43ad7f9d1317c344666247dd7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 19 16:53:47 2011 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 466393c2f04fb5b3dcb3e81ea9609905fa8c9648
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 19 16:50:18 2011 -0400
+
+    Really fix build this time
+
+ util/hb-view.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit fe1605db4f28ed75d5debe0db45a19aa77f0585f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 19 16:49:03 2011 -0400
+
+    Fix dist
+
+ util/Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 8b8b19056decaf09e4e0ccd9412ee1aeb30f4de7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 19 16:41:17 2011 -0400
+
+    [util] Add hb-shape utility
+
+    Like hb-view, but prints out buffer contents.
+
+    The output format is kinda cryptic.  Suggestions welcome.
+
+ configure.ac                        |   6 -
+ util/Makefile.am                    |  44 +++--
+ util/{common.cc => hb-shape.cc}     |  57 ++++--
+ util/hb-view.cc                     |  44 +----
+ util/hb-view.hh                     |  79 ++++++++
+ util/helper-cairo.cc                | 375
+ +++++++++++++++++++++++++++++++++++
+ util/{common.hh => helper-cairo.hh} |  64 ++++--
+ util/options.cc                     |  79 ++++++++
+ util/options.hh                     |  53 ++++-
+ util/view-cairo.cc                  | 381
+ ++----------------------------------
+ util/view-cairo.hh                  |   8 +-
+ 11 files changed, 717 insertions(+), 473 deletions(-)
+
+commit eb2d8be7a8ede0c0f5e346cf06516792f83f36f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 19 16:15:22 2011 -0400
+
+    Minor
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit f6496663c2f6849a944e41afcf9511f378477532
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 19 15:45:52 2011 -0400
+
+    [util] If no text is provided, simply call cairo_show_glyphs()
+
+ util/view-cairo.cc | 92
+ ++++++++++++++++++++++++++++++------------------------
+ 1 file changed, 51 insertions(+), 41 deletions(-)
+
+commit 5c299343118d1eaff32ffb2a5dac077cfff67dee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 19 14:53:26 2011 -0400
+
+    [uniscribe] Various improvements
+
+ src/hb-uniscribe.cc | 30 +++++++++++++++++++-----------
+ 1 file changed, 19 insertions(+), 11 deletions(-)
+
+commit 11e51993ab562d4c7460eb7c43d0e97404e628e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 19 09:58:55 2011 -0400
+
+    [util] Move font-size into view-options
+
+ util/options.cc    | 2 +-
+ util/options.hh    | 7 +++----
+ util/view-cairo.cc | 4 ++--
+ 3 files changed, 6 insertions(+), 7 deletions(-)
+
+commit 0fe296019746689551d224a5f6fb7e0ebe1b91dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 17 09:59:58 2011 -0400
+
+    Fix Linux build when io.h is available
+
+    Bug 40953 - fail compile git: make[2]: *** [hb_view-options.o] Error 1
+
+ configure.ac    | 2 +-
+ util/options.cc | 8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit d2b3ab9ecebbf46cb9dac1f09c17379c50ea4575
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 16 16:59:17 2011 -0400
+
+    Fix "[util] Fix hb-view crash with bogus font."
+
+ util/view-cairo.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit da4a2a1426ee3aa9d9678ec12c9ba4dfcba0bcf8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 16 16:56:34 2011 -0400
+
+    Cosmetic
+
+ util/view-cairo.cc | 31 +++++++++++++++++++++++--------
+ 1 file changed, 23 insertions(+), 8 deletions(-)
+
+commit 4274ed7ab6fb03fbf8eaaa43ab06647dc0beed79
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 16 16:52:26 2011 -0400
+
+    [util] Fix hb-view crash with bogus font
+
+ util/view-cairo.cc | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 5ddd9cc499f2470eca239ae357a5c8a3626c0809
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 16 16:40:44 2011 -0400
+
+    Minor
+
+ src/hb-private.hh         | 2 +-
+ src/hb-unicode-private.hh | 4 ++--
+ src/test.cc               | 4 ++--
+ util/common.hh            | 2 +-
+ util/options.cc           | 8 ++++----
+ 5 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 652d64aa8d32d914bf3ee2f2c451de103fea8fa9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 16 16:34:39 2011 -0400
+
+    TODO items
+
+ TODO | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 947c9a778c0d4b428b58806f98c34ede59b7439c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 16 16:33:18 2011 -0400
+
+    Minor
+
+ src/hb-ot-shape-normalize.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d5476a30a10da5e54783c8dbf04340225a9a00d7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 16 12:30:50 2011 -0400
+
+    Minor
+
+ src/hb-object-private.hh | 26 +++++++++++++++-----------
+ 1 file changed, 15 insertions(+), 11 deletions(-)
+
+commit 55aeb0490454cc1ba93a42f307ed1230f59dee4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 16 02:08:36 2011 -0400
+
+    Fix reading text from stdin
+
+ util/options.cc    | 76
+ +++++++++++++++++++++++++++++++++++-------------------
+ util/options.hh    | 16 +++++++-----
+ util/view-cairo.cc |  6 +++--
+ 3 files changed, 64 insertions(+), 34 deletions(-)
+
+commit a75c1b125159f6cfb6b652a9ec40803f7c7e3f71
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 16 01:16:41 2011 -0400
+
+    Move code around
+
+ util/options.cc | 27 +++++++++++++++++++++++++--
+ util/options.hh | 20 +-------------------
+ 2 files changed, 26 insertions(+), 21 deletions(-)
+
+commit 7bf6ecd3bfb1ccf5d9ac6fe274efa74b46885fea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 16 01:11:30 2011 -0400
+
+    Always shape at size=upem
+
+    Fixes bug with uniscribe not handling GIGANTIC sizes.
+
+ util/options.cc    | 2 +-
+ util/view-cairo.cc | 8 ++++----
+ util/view-cairo.hh | 2 +-
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 674ee58d9bc9f825d769220d77f58513edae4558
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 16 00:54:05 2011 -0400
+
+    Minor
+
+ util/options.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 4451168e5d1ea26560899e9a9733b3a3f1853050
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 16 00:38:19 2011 -0400
+
+    Fix binary stdin/stdout io in Windows
+
+    Make --font-file accept "-" to mean stdin, and have it work
+    in Windows too!
+
+ configure.ac    |  2 +-
+ util/common.hh  |  5 +++++
+ util/options.cc | 64
+ +++++++++++++++++++++++++++++++++++++++++++++++----------
+ util/options.hh | 10 +++++++--
+ 4 files changed, 67 insertions(+), 14 deletions(-)
+
+commit 639b5957d9c7b6d8bef6784e3467ccc055ddeea4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 15 18:09:49 2011 -0400
+
+    Minor
+
+ util/options.cc | 5 +++--
+ util/options.hh | 4 ++--
+ 2 files changed, 5 insertions(+), 4 deletions(-)
+
+commit f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 15 17:52:00 2011 -0400
+
+    [hb-view] Make print to stdout work in Windows
+
+    Apparently there's no equivalent to "/dev/stdout", so write using
+    stdio to be able to output to stdout.
+
+ util/common.hh     |  1 +
+ util/options.hh    | 31 ++++++++++++++++-----
+ util/view-cairo.cc | 79
+ ++++++++++++++++++++++++++++++++++++------------------
+ 3 files changed, 78 insertions(+), 33 deletions(-)
+
+commit 36b10f58cc70ce9570d17b30616f9cb27423e03b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 15 16:29:51 2011 -0400
+
+    Minor
+
+ src/hb-ot-shape-normalize.cc | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit c4611cb66f8e3a133ec00e3ace62ef19d9b95b28
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 13 13:33:11 2011 -0400
+
+    Fix test
+
+ src/hb-graphite2.h | 1 +
+ src/hb-ot-shape.h  | 1 +
+ src/hb-uniscribe.h | 1 +
+ 3 files changed, 3 insertions(+)
+
+commit b9b10ad78b1f977494a3a42b58f8040fe16505a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 13 13:30:39 2011 -0400
+
+    [util] Refactor hb-view completely
+
+    Now we can use the same code to do other utils...
+
+ configure.ac       |   2 +
+ util/Makefile.am   |   2 +
+ util/common.cc     |   7 +-
+ util/common.hh     |   2 +-
+ util/hb-view.cc    | 244 ++++-------------------------
+ util/options.cc    | 321 ++++++++++++++++++++++++++------------
+ util/options.hh    | 179 +++++++++++++++++++---
+ util/view-cairo.cc | 440
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ util/view-cairo.hh |  63 ++++++++
+ 9 files changed, 927 insertions(+), 333 deletions(-)
+
+commit bc4b07b05ea9e39eb9f966eb2c3e1c737efa77ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 8 17:08:32 2011 -0400
+
+    More reshuffling
+
+ util/hb-view.cc |  4 ++--
+ util/options.cc | 64
+ ++++++++++++++++++++++++++++++---------------------------
+ util/options.hh | 13 ++++++------
+ 3 files changed, 43 insertions(+), 38 deletions(-)
+
+commit 516857eb51bbb79ff4adf44e3fefbf460f9ee8f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 8 16:50:24 2011 -0400
+
+    [util] Simplify more
+
+ util/options.hh | 9 +++------
+ 1 file changed, 3 insertions(+), 6 deletions(-)
+
+commit 4f4b114a5592c2f5d128ee795f159b438ad97829
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 8 16:49:02 2011 -0400
+
+    [util] Move code around
+
+ util/hb-view.cc |  8 +-------
+ util/options.hh | 14 ++++++++++++++
+ 2 files changed, 15 insertions(+), 7 deletions(-)
+
+commit 46d86a73a103b061144018c3fe947b57548fc58f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 8 16:43:15 2011 -0400
+
+    Minor
+
+    We now support using -1 for NUL-terminated strings.
+
+ util/hb-view.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 90e312cb85df7a6dc350cb62138ab950790e3d15
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 8 16:42:37 2011 -0400
+
+    [util] Move code around
+
+ util/hb-view.cc | 5 -----
+ util/options.hh | 4 ++++
+ 2 files changed, 4 insertions(+), 5 deletions(-)
+
+commit 109cb382898f491eed733dba4ef5ba12de94aaf6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 8 16:00:04 2011 -0400
+
+    [util] Further refactor option parsing
+
+ util/options.cc | 80
+ +++++++++++++++++++++++++++++++++++++++++++++++----------
+ util/options.hh | 20 ++++++++++++---
+ 2 files changed, 83 insertions(+), 17 deletions(-)
+
+commit bc187e5ac7433f5561b0e97e8c62172c73883f3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 8 13:35:17 2011 -0400
+
+    Refine Indic scripts, following Martin Hosken's recommendation
+
+ src/hb-ot-shape-complex-private.hh | 56
+ +++++++++++++++++++++++---------------
+ 1 file changed, 34 insertions(+), 22 deletions(-)
+
+commit 738d096a06822e63b3894bd817ecb90e5fb94f73
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 2 13:31:19 2011 -0400
+
+    Pass through unknown ISO 639-3 language tags to OpenType engine
+
+    In hb_ot_tag_from_language(), if first component of an unknown
+    language is three letters long, use it directly as OpenType language
+    tag (after case conversion and padding).
+
+ src/hb-ot-tag.cc   | 8 ++++++++
+ test/test-ot-tag.c | 5 +++++
+ 2 files changed, 13 insertions(+)
+
+commit ea02cbf03c084b3ead6e9e4c9af07b3b47608d5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 2 12:39:20 2011 -0400
+
+    [graphite] Don't preload glyphs
+
+    Doesn't seem to be slower.
+
+ src/hb-graphite2.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 210a06f3d7bd2df55ebd1743da74f327c5a7a967
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 26 13:39:49 2011 +0200
+
+    Minor
+
+ src/hb-graphite2.h | 12 ++++++------
+ src/hb-ot-shape.h  |  1 -
+ src/hb-uniscribe.h |  1 -
+ 3 files changed, 6 insertions(+), 8 deletions(-)
+
+commit 4a8d2e379a34b19bccc72bc3e2d9ace3fdd27733
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 26 09:40:54 2011 +0200
+
+    [graphite2] Chop a few more lines
+
+ src/hb-graphite2.cc | 13 ++++---------
+ 1 file changed, 4 insertions(+), 9 deletions(-)
+
+commit 81ec289da799bd2f50da9382507c606d2c779ab9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 26 09:33:06 2011 +0200
+
+    Minor
+
+ src/hb-graphite2.cc | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit 3380de5abbaff535e1cf57ea7e5c2a7c4fdcfe66
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 26 09:30:49 2011 +0200
+
+    [graphite] Use buffer->replace_glyphs()
+
+ src/hb-graphite2.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 9ebe8c0286856d46430ae184ba7303bd34485883
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 26 09:29:42 2011 +0200
+
+    Add buffer->replace_glyphs()
+
+ src/hb-buffer-private.hh |  3 +++
+ src/hb-buffer.cc         | 26 ++++++++++++++++++++++++++
+ 2 files changed, 29 insertions(+)
+
+commit a5edb1031c204464da4f852ba3d90e8cc20cd20e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 26 09:27:13 2011 +0200
+
+    Minor
+
+ src/hb-graphite2.cc | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 290e3ee51727df75d136ccfff79831b94d1583b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 26 09:25:04 2011 +0200
+
+    [graphite] Only pass the first part language tag to graphite
+
+    Still not sure about:
+
+    1) Case.  We pass lowercase for now.  Would be nice if graphite was
+    uppercase 3letter like OpenType,
+
+    2) Padding.  IMO, tag padding is always with spaces, but Martin was
+    talking about NUL bytes.
+
+ src/hb-graphite2.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 4c9fe88d30036340fe592bcbc375049b84602b8b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 26 09:18:53 2011 +0200
+
+    [API] Make all _from_string() functions take a len parameter
+
+    Can be -1 for NUL-terminated string.  This is useful for passing parts
+    of a larger string to a function without having to copy or modify the
+    string first.
+
+    Affected functions:
+
+            hb_tag_t hb_tag_from_string()
+            hb_direction_from_string()
+            hb_language_from_string()
+            hb_script_from_string()
+
+ src/hb-common.cc    | 29 +++++++++++++-------
+ src/hb-common.h     | 12 +++++---
+ src/hb-graphite2.cc |  2 +-
+ src/hb-icu.cc       |  2 +-
+ src/hb-ot-tag.cc    |  8 +++---
+ test/test-buffer.c  |  4 +--
+ test/test-common.c  | 79
+ +++++++++++++++++++++++++++++++----------------------
+ test/test-ot-tag.c  | 22 +++++++--------
+ util/hb-view.cc     |  6 ++--
+ util/options.cc     |  5 +---
+ 10 files changed, 96 insertions(+), 73 deletions(-)
+
+commit a499bdea5cc5097dec62eeafdef58d08ba534be0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 25 22:46:21 2011 +0200
+
+    [graphite2] Bail if grface is NULL
+
+ src/hb-graphite2.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3007ffa9e53e6100a761c2363f50a2b19a0764fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 25 09:08:53 2011 +0200
+
+    Reorder combining-class to better suit Arabic shadda mark-mark
+    positioning
+
+    As reported by Khaled on the list:
+
+    "After the introduction of canonical reordering of combining marks
+    (commit 34c22f8), I'm no longer able to do mark/mark substitution or
+    positioning for mark sequences that involve shadda as a first mark (or
+    most interesting sequences at least).
+
+    "After some digging, it turned out that shadda have a ccc=33
+    while most
+    Arabic marks that combine with it have a lower ccc value, which
+    results
+    in the shadda being reordered after the other mark which,
+    unsurprisingly, breaks my contextual substitution and mkmk anchors."
+
+    See:
+
+    http://unicode.org/faq/normalization.html#8
+    http://unicode.org/faq/normalization.html#9
+
+ src/hb-ot-shape-private.hh | 18 +++++++++++++++++-
+ 1 file changed, 17 insertions(+), 1 deletion(-)
+
+commit 74ef81a0b0f9adddfb42c3cb87f08f8156054519
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 24 19:16:13 2011 +0200
+
+    Fix make distcheck
+
+ src/Makefile.am              | 15 ++++++++-------
+ src/hb-gobject-enums.cc.tmpl |  2 +-
+ 2 files changed, 9 insertions(+), 8 deletions(-)
+
+commit 24bcdbcc0639ca9e9c0fde1a71cbbf1c3d2ef98d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 24 19:13:15 2011 +0200
+
+    Add hb-ot-hmtx-table.hh
+
+    Oops!
+
+ src/hb-ot-hmtx-table.hh | 86
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 86 insertions(+)
+
+commit a3bd8a0e1862212a2d4141b973039bd000a3054f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 24 03:22:49 2011 +0200
+
+    [graphite] Rewrite properly
+
+ src/hb-graphite2.cc | 633
+ ++++++++++++++++++++++------------------------------
+ src/hb-uniscribe.cc |   2 +
+ 2 files changed, 273 insertions(+), 362 deletions(-)
+
+commit 5072934c35bddc23d6bcb07a41010da51eb1b090
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 24 02:24:27 2011 +0200
+
+    Minor
+
+ src/hb-uniscribe.cc | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 46377396accf6b43792ffba553dcd9847608aa86
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 24 02:12:05 2011 +0200
+
+    [configure] Fix graphite bits
+
+ configure.ac | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 71388b3ee71c7d3b79f842db7588bd683691797c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 24 02:09:04 2011 +0200
+
+    [uniscribe] Minor
+
+ src/hb-uniscribe.cc | 19 +++++++++----------
+ 1 file changed, 9 insertions(+), 10 deletions(-)
+
+commit cd2b901027bd154e31aa509c0cb2d86633e36398
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 24 01:47:25 2011 +0200
+
+    [graphite] Minor
+
+ src/hb-graphite2.cc | 10 ++++------
+ src/hb-shape.cc     |  1 -
+ 2 files changed, 4 insertions(+), 7 deletions(-)
+
+commit 834af3b48a1aca3e53811d1eb4ca09b582b8e598
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 24 01:45:47 2011 +0200
+
+    [graphite] Remove hb_graphite2_feature_check()
+
+    I don't see how this function can be useful.
+
+ src/hb-graphite2.cc | 10 ----------
+ src/hb-graphite2.h  |  2 --
+ 2 files changed, 12 deletions(-)
+
+commit 1f49cf32c96cb45a4d8ba2c210aeb7a8076b4762
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 24 01:29:25 2011 +0200
+
+    Add graphite2 integration from Martin Hosken
+
+    To be modified, a lot.
+
+ configure.ac                      |   9 +-
+ contrib/python/lib/harfbuzz.pyx   |  20 +-
+ contrib/python/runpy              |   2 -
+ contrib/python/scripts/hbtestfont |   4 +-
+ contrib/python/setup.py           |  18 +-
+ src/Makefile.am                   |   7 +
+ src/hb-graphite2.cc               | 446
+ ++++++++++++++++++++++++++++++++++++++
+ src/hb-graphite2.h                |  47 ++++
+ src/hb-shape.cc                   |   7 +
+ 9 files changed, 542 insertions(+), 18 deletions(-)
+
+commit 0e6d36d8a3f9f533cb6eb04408af62bfd1ad83da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 24 01:31:29 2011 +0200
+
+    Minor
+
+ src/Makefile.am                                | 2 +-
+ src/{hb-uniscribe-shape.cc => hb-uniscribe.cc} | 0
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit efde8113258b117ec0a7fbffe6d681442d045c41
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 23 00:04:57 2011 +0200
+
+    Add a constructor for hb_prealloced_array_t
+
+    Fixes build with MSVC.
+
+ src/hb-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit d75333f166d21e9b9f2341c3bc8a9ef8a886f4b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 19 19:59:24 2011 +0200
+
+    Add gobject enum support, but disabled for now
+
+    need to figure out the naming.  The generated code doesn't have the
+    right name.
+
+ configure.ac                                 |  2 +
+ src/Makefile.am                              | 13 +++--
+ src/hb-gobject-enums.cc.tmpl                 | 74
+ ++++++++++++++++++++++++++++
+ src/{hb-gobject.cc => hb-gobject-structs.cc} |  0
+ 4 files changed, 86 insertions(+), 3 deletions(-)
+
+commit 7d235d272f4c9213f54c9c807fb8fba5068c45b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 17 23:55:29 2011 +0200
+
+    Flesh out tt funcs a bit
+
+ src/hb-tt-font.cc | 36 +++++++++++++++++++++++++++++++++++-
+ 1 file changed, 35 insertions(+), 1 deletion(-)
+
+commit b9415e76d7b41da203b9ae85e38b6dc777481184
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 17 19:21:44 2011 +0200
+
+    [API] Add hb_font_set_funcs_data()
+
+ src/hb-font.cc | 15 +++++++++++++++
+ src/hb-font.h  |  6 ++++++
+ 2 files changed, 21 insertions(+)
+
+commit e6c09cdf43201ff1b7f38e411ae1f9977e4f9271
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 17 19:07:59 2011 +0200
+
+    Remove the pre_allocate argument from hb_buffer_create()
+
+    For two reasons:
+
+    1. User can always call hb_buffer_pre_allocate() themselves, and
+
+    2. Now we do a pre_alloc in add_utfX anyway, so the total number of
+    reallocs is limited to a small number (~3) anyway.  This just
+    makes the
+    API cleaner.
+
+ src/hb-buffer.cc          | 7 +------
+ src/hb-buffer.h           | 2 +-
+ src/test.cc               | 2 +-
+ test/test-buffer.c        | 9 ++++-----
+ test/test-object.c        | 4 ++--
+ test/test-shape-complex.c | 2 +-
+ test/test-shape.c         | 2 +-
+ util/hb-view.cc           | 2 +-
+ 8 files changed, 12 insertions(+), 18 deletions(-)
+
+commit 187bdeaa6c82fcb95fdd546da9c78b843e1dea0e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 17 19:03:06 2011 +0200
+
+    Do (nothing for) hmtx sanitize
+
+ src/hb-ot-hhea-table.hh | 1 -
+ src/hb-tt-font.cc       | 1 +
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit d6016e49108be183ab2dc9c226447d1db3a09b90
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 17 14:47:41 2011 +0200
+
+    Fix name-table sanitize
+
+ src/hb-ot-name-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ae9877dea6a1aed3566d9b87a75ede84259deaca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 17 14:43:45 2011 +0200
+
+    Add hhea-table support
+
+ src/Makefile.am                |   1 +
+ src/hb-open-type-private.hh    |   6 ++
+ src/hb-ot-head-table.hh        |   2 +-
+ src/hb-ot-hhea-table.hh        |  93 ++++++++++++++++++
+ src/hb-ot-layout-gdef-table.hh |   2 +-
+ src/hb-ot-layout-gpos-table.hh |   2 +-
+ src/hb-ot-layout-gsub-table.hh |   2 +-
+ src/hb-ot-maxp-table.hh        |   2 +-
+ src/hb-ot-name-table.hh        |   3 +-
+ src/hb-tt-font.cc              | 207
+ +++++++++++++++++++++++++++++++++++++++++
+ 10 files changed, 314 insertions(+), 6 deletions(-)
+
+commit 7a750ac33ec482e2c4856c19ea607f3563741c24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 17 14:19:59 2011 +0200
+
+    Rename table files from eg maxp-private.hh to maxp-table.hh
+
+ src/Makefile.am                                              | 12
+ ++++++------
+ src/hb-font.cc                                               |  2 +-
+ src/{hb-ot-head-private.hh => hb-ot-head-table.hh}           |  6 +++---
+ ...-ot-layout-gdef-private.hh => hb-ot-layout-gdef-table.hh} |  6 +++---
+ ...-ot-layout-gpos-private.hh => hb-ot-layout-gpos-table.hh} |  6 +++---
+ ...-ot-layout-gsub-private.hh => hb-ot-layout-gsub-table.hh} |  6 +++---
+ src/hb-ot-layout-gsubgpos-private.hh                         |  2 +-
+ src/hb-ot-layout.cc                                          |
+ 8 ++++----
+ src/{hb-ot-maxp-private.hh => hb-ot-maxp-table.hh}           |  6 +++---
+ src/{hb-ot-name-private.hh => hb-ot-name-table.hh}           |  6 +++---
+ src/hb-uniscribe-shape.cc                                    |  2 +-
+ src/main.cc                                                  |  2 +-
+ 12 files changed, 32 insertions(+), 32 deletions(-)
+
+commit 0b7e4d9f20b3ed947d0c441ca59b43c4097cdb0e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 15 20:41:59 2011 +0200
+
+    [ft] FT_Get_Advance() for advance-width callbacks
+
+    Using graphite2's comparerenderer suggests that this makes hb-ft 15
+    times faster.  No caching layer needed anymore.
+
+ configure.ac   |  2 +-
+ src/hb-ft.cc   | 19 +++++++++++++------
+ util/common.hh |  4 +++-
+ 3 files changed, 17 insertions(+), 8 deletions(-)
+
+commit 97796453aab56873809a15b5e316cba8acea7449
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 15 19:03:43 2011 +0200
+
+    Fix falloffs of the GOption conversion
+
+ util/options.cc | 8 ++++----
+ util/options.hh | 4 ++--
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 4e9ff1dd6ee3ea63fd91a76a91d9725a10a294a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 15 16:21:22 2011 +0200
+
+    Pre-allocate buffers when adding string
+
+    We do a conservative estimate of the number of characters, but still,
+    this limits the number of buffer reallocs to a small constant.
+
+ src/hb-buffer.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 553bc3de82cfda8d83db26a93205e0d39440cbd1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 15 16:21:06 2011 +0200
+
+    Minor
+
+ src/hb-ft.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 254142bb67a5c520a304142301479eb5292592d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 15 16:15:44 2011 +0200
+
+    [ft] FT_Select_Charmap() when we create face
+
+ src/hb-ft.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit a4cbd03dd17990783d8fd4c6be0c9c0d3d9cae5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 15 09:52:05 2011 +0200
+
+    Apply 'locl' with 'ccmp' in Arabic shaper
+
+    According to Peter Constable this is indeed what Uniscribe has been
+    doing for years.
+
+    Mozilla Bug 667166 - wrong shape of letter when it comes at the end of
+    word in the arabic version of Firefox 5.0
+
+ src/hb-ot-shape-complex-arabic.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c214cff55ce539d004d069a484dac3988953cb11
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 14 15:17:16 2011 +0200
+
+    Start adding gobject-introspection support
+
+ configure.ac      | 13 ++++++++++-
+ src/Makefile.am   | 43 ++++++++++++++++-------------------
+ src/hb-common.h   |  1 +
+ src/hb-glib.cc    |  3 ---
+ src/hb-gobject.cc | 63
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-gobject.h  | 68
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 6 files changed, 163 insertions(+), 28 deletions(-)
+
+commit 9527fb200ffbbd839334e99b51d9671752d393db
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 13 19:03:48 2011 +0200
+
+    Fix missing return
+
+ src/hb-ft.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 77a328769545f6b2970d8491fe77fe98781961cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 13 17:16:45 2011 +0200
+
+    Minor
+
+ src/hb-common.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3bb300ee78a40f9ded21ab19283863b733aeb677
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 11 11:54:31 2011 +0200
+
+    Refactor hb-view code
+
+ util/Makefile.am |  26 +++-
+ util/common.cc   |  40 ++++++
+ util/common.hh   |  49 +++++++
+ util/hb-view.cc  | 387
+ ++++---------------------------------------------------
+ util/options.cc  | 318 +++++++++++++++++++++++++++++++++++++++++++++
+ util/options.hh  |  86 +++++++++++++
+ 6 files changed, 541 insertions(+), 365 deletions(-)
+
+commit d6660356dd81358033743f72d8a5fbf2fc70eaf7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 10 22:08:36 2011 +0200
+
+    Add uniscribe font getters
+
+ src/hb-uniscribe-shape.cc | 24 +++++++++++++++++++++---
+ src/hb-uniscribe.h        |  8 ++++++++
+ 2 files changed, 29 insertions(+), 3 deletions(-)
+
+commit 01ec13a1d9ae380305b593e1c52cebb0e8327cb6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 10 22:00:35 2011 +0200
+
+    Implement hb_ft_font_get_face
+
+ src/hb-ft.cc | 15 ++++++++++++++-
+ src/hb-ft.h  |  2 ++
+ 2 files changed, 16 insertions(+), 1 deletion(-)
+
+commit 36a4fe037df201f85b7a544eb30d75dc3585a1b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 10 21:54:22 2011 +0200
+
+    Fix charset conversion
+
+ util/hb-view.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 25c4830593064f023e296aa795b72ddcaa1c9322
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 10 16:28:38 2011 +0200
+
+    [util] Add hb-shape --shapers
+
+    If the specified shapers fail, hb-shape will fail immediately
+
+ util/hb-view.cc | 57
+ +++++++++++++++++++++++++++++++++------------------------
+ 1 file changed, 33 insertions(+), 24 deletions(-)
+
+commit 0501573deda3a8dcdfcea491392f554f21ed0154
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 10 16:25:56 2011 +0200
+
+    Fix const correctness in the API
+
+ src/hb-fallback-shape-private.hh |  2 +-
+ src/hb-fallback-shape.cc         |  2 +-
+ src/hb-ot-shape.cc               |  2 +-
+ src/hb-ot-shape.h                |  2 +-
+ src/hb-shape.cc                  | 14 +++++++-------
+ src/hb-shape.h                   | 12 ++++++------
+ src/hb-uniscribe-shape.cc        |  2 +-
+ src/hb-uniscribe.h               |  2 +-
+ 8 files changed, 19 insertions(+), 19 deletions(-)
+
+commit a21add6c0da067173d51792d716d6e38379f138f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 10 16:07:49 2011 +0200
+
+    Reformat
+
+ util/hb-view.cc | 49 ++++++++++++++++++-------------------------------
+ 1 file changed, 18 insertions(+), 31 deletions(-)
+
+commit 8df90c81187db58eee6b90426cd16c32feef6be3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 10 15:26:41 2011 +0200
+
+    [util] Port hb-view to GOption
+
+ util/hb-view.cc | 267
+ +++++++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 156 insertions(+), 111 deletions(-)
+
+commit 511a136f0c092880b19250a5df53bcf9f4b043ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 15:03:00 2011 +0200
+
+    Move hb-view into util/
+
+ Makefile.am              |  3 +--
+ configure.ac             |  1 +
+ src/Makefile.am          | 13 -------------
+ util/Makefile.am         | 24 ++++++++++++++++++++++++
+ {src => util}/hb-view.cc |  0
+ 5 files changed, 26 insertions(+), 15 deletions(-)
+
+commit d753ac78da5619a0a545cdaf7a8e65787e996570
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 14:03:12 2011 +0200
+
+    [uniscribe] Remove zerowidth glyphs from output
+
+ src/hb-uniscribe-shape.cc | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit 217cc81cd9c3de30b2ef226983ec43c0f78b5c7d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 14:00:44 2011 +0200
+
+    [test/shape-complex] Print cluster and position info in --verbose
+
+ test/test-shape-complex.c | 20 +++++++++++++++++---
+ 1 file changed, 17 insertions(+), 3 deletions(-)
+
+commit 708403e7f3e4a5cf9b0d2bd764fb74b148af7adb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 13:52:36 2011 +0200
+
+    Fix warnings with old glib
+
+ test/hb-test.h | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit ddd247b0c528cdb8bdf5f8063180abe884afa305
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 11:44:42 2011 +0200
+
+    Minor
+
+ src/test.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 1b8196c98638ba05ae0ebcb8ba7aa99ed9c08e0a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 11:37:46 2011 +0200
+
+    Add fallback shaper
+
+ src/hb-fallback-shape.cc | 23 +++++++++++++++++++++--
+ 1 file changed, 21 insertions(+), 2 deletions(-)
+
+commit 13a601fe99f237b08b7166448e386eaea0b77294
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 11:36:54 2011 +0200
+
+    [FT] Don't make font immutable
+
+ src/hb-ft.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 38b2118724600521c6ad1e49df0667dcdf863634
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 10:51:24 2011 +0200
+
+    [API] Add hb_ft_font_set_funcs(), remove hb_ft_get_font_funcs()
+
+    Remove hb_ft_get_font_funcs() as it cannot be used by the user anyway.
+
+    Add hb_ft_font_set_funcs().  Which will make the font internally use
+    FreeType.  That is, no need for the font to have created using the
+    hb-ft API.  Just create using hb_face_create()/hb_font_create() and
+    then call this on the font (after having set font scale).  This
+    internally creates an FT_Face and attached to the font.
+
+ src/Makefile.am    |  4 +--
+ src/hb-ft.cc       | 76
+ +++++++++++++++++++++++++++++++++++++++++++++++++++---
+ src/hb-ft.h        | 10 ++++---
+ src/test.cc        |  7 +++++
+ test/Makefile.am   |  8 ------
+ test/test-object.c |  9 -------
+ 6 files changed, 89 insertions(+), 25 deletions(-)
+
+commit 255f176fdcd42ab94f9c3c54e2bffb55d0b1a8f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 08:35:07 2011 +0200
+
+    Minor
+
+ src/hb-uniscribe-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a9057eb3f38018faa1ece53c4aaeeba798b41fd1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 00:47:55 2011 +0200
+
+    [uniscribe] Unbreak
+
+ src/hb-uniscribe-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c0975e12315b7167b92411584d2f00a751bbc204
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 00:46:18 2011 +0200
+
+    Fix build again
+
+ test/Makefile.am | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 33ccc77902660ed4b49184e5ec99f4fd0ef63175
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 00:43:24 2011 +0200
+
+    [API] Make set_user_data() functions take a replace parameter
+
+    We need this to set data on objects safely without worrying that some
+    other thread unsets it by setting it at the same time.
+
+ src/hb-blob.cc            |  5 +++--
+ src/hb-blob.h             |  3 ++-
+ src/hb-buffer.cc          |  5 +++--
+ src/hb-buffer.h           |  3 ++-
+ src/hb-common.cc          | 13 ++++++++-----
+ src/hb-font.cc            | 15 +++++++++------
+ src/hb-font.h             |  9 ++++++---
+ src/hb-object-private.hh  | 13 ++++++++-----
+ src/hb-private.hh         | 16 +++++++++++-----
+ src/hb-shape.cc           |  2 +-
+ src/hb-unicode.cc         |  5 +++--
+ src/hb-unicode.h          |  3 ++-
+ src/hb-uniscribe-shape.cc | 18 ++++++++++++++----
+ test/test-object.c        | 33 +++++++++++++++++----------------
+ 14 files changed, 89 insertions(+), 54 deletions(-)
+
+commit 944b2ba1ce076385f985212bbdf2df96a8a995f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 00:23:58 2011 +0200
+
+    [buffer] Make API take signed int length
+
+    Since we already switched to accepting -1 as 'zero-terminated'.
+
+ src/hb-buffer.cc    | 12 ++++++------
+ src/hb-buffer.h     | 12 ++++++------
+ src/hb-ot-layout.cc |  2 --
+ src/main.cc         |  1 -
+ 4 files changed, 12 insertions(+), 15 deletions(-)
+
+commit de1e1cf9bccfd116d495804e230dc2e12b733a2d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 00:19:38 2011 +0200
+
+    [FT] Adapt to new face API
+
+ src/hb-ft.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 458c89a85695220d43b69dbae36fc93e3fe78d89
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 00:19:19 2011 +0200
+
+    Minor
+
+ test/test-c.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit bf3eef540f81fdeba1c36263d7d5b2ec4c5f07b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 9 00:13:24 2011 +0200
+
+    [uniscribe] Cleanup backend
+
+ TODO                      |   2 +
+ src/hb-uniscribe-shape.cc | 161
+ ++++++++++++++++++++++++++++++++++------------
+ 2 files changed, 123 insertions(+), 40 deletions(-)
+
+commit f1f848e2e46ac54ff08aca7cd83390af31c7c9ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 8 23:41:06 2011 +0200
+
+    Fix build
+
+ test/Makefile.am | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 3897335c7620c37e9a0224b0c42ade0dfdce4053
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 8 23:37:41 2011 +0200
+
+    [API] Sort out get_blob API
+
+    hb_face_get_blob() renamed to hb_face_reference_blob(), returns a
+    reference now.
+
+    hb_face_[sg]et_index() added.
+
+    hb_face_set_upem() added.
+
+ src/hb-font-private.hh      |  3 +-
+ src/hb-font.cc              | 67
+ +++++++++++++++++++++++++++++++++++----------
+ src/hb-font.h               | 17 ++++++++++--
+ src/hb-ft.cc                |  3 +-
+ src/hb-ot-layout-private.hh |  9 ------
+ src/hb-ot-layout.cc         | 21 --------------
+ src/hb-uniscribe-shape.cc   |  3 +-
+ 7 files changed, 72 insertions(+), 51 deletions(-)
+
+commit e715784be35f0846c0e084b7c53c7556ce933a45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 8 21:42:02 2011 +0200
+
+    Rename get_table to reference_table in all API
+
+ src/hb-font-private.hh |  6 +++---
+ src/hb-font.cc         | 20 ++++++++++----------
+ src/hb-font.h          |  8 ++++----
+ src/hb-ft.cc           |  4 ++--
+ 4 files changed, 19 insertions(+), 19 deletions(-)
+
+commit 670c873499f7f03fdfc07b8a0567b041628c6ab0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 8 21:36:24 2011 +0200
+
+    Fix shaper ordering logic
+
+ src/hb-shape.cc | 80
+ ++++++++++++++++++++++++---------------------------------
+ 1 file changed, 34 insertions(+), 46 deletions(-)
+
+commit cc797e0d5368b2f5732d77eb3e3882283bd87cf7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 8 03:49:30 2011 +0200
+
+    Minor
+
+ TODO            | 2 --
+ src/hb-shape.cc | 2 ++
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 826e22732dd8697600a1392f48af21b7b3ce6271
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 7 03:53:42 2011 -0400
+
+    [uniscribe] Fix blob lifecycles
+
+ src/hb-uniscribe-shape.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit ff199ba356f0eb5bc6252203eea18a1d1fd28934
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 7 03:43:46 2011 -0400
+
+    Fix shaper_list manipulation, aaaaaaaaaaaaargh
+
+ src/hb-shape.cc | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit 206e32934592b915b1f3052aecf014c6ced729e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 7 01:10:55 2011 -0400
+
+    [test] test-object is not FreeType-specific, move it to the right
+    place
+
+ test/Makefile.am | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit 577326b86af80cc137eea81f4cc1e30adf9232b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 7 01:04:40 2011 -0400
+
+    [uniscribe] Fix cluster calculation
+
+ src/hb-uniscribe-shape.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit f6d83b2dcf120f9d6f0a28c6f5de2da7addf9089
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 7 00:59:58 2011 -0400
+
+    Minor
+
+ src/test.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2eb474afb4a09f4da8f14b444bd6066769010224
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 7 00:59:38 2011 -0400
+
+    [uniscribe] Fix shaper
+
+    It's kinda working finally!
+
+ src/hb-uniscribe-shape.cc | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit f22e661147691ebc9d531aa28a850988e6503f9b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 7 00:59:12 2011 -0400
+
+    [glib] Protect against invalid characters
+
+ src/hb-glib.cc | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 144cd49a0eb3ccc749325d0ee14b3ebf4367c971
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 7 00:51:50 2011 -0400
+
+    [buffer] Accept -1 for text_length and item_length
+
+    A -1 text_length means: zero-terminated string.
+    A -1 item_length means: to the end of string.
+
+ src/hb-buffer.cc | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit e9c71fab30fd1d5b163c8a072f9e2d3eb8ba3a92
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 7 00:00:27 2011 -0400
+
+    Fix name-table lookup
+
+    Oops!
+
+ src/hb-ot-name-private.hh | 2 +-
+ src/hb-uniscribe-shape.cc | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 3fd2b5bece28c81e3e379352f09eee39d19ac372
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 6 22:59:54 2011 -0400
+
+    [uniscribe] Use font size directly
+
+ src/hb-uniscribe-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 892eb2e462b40451b8f73879eab66310d884386a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 6 22:06:52 2011 -0400
+
+    [uniscribe] Make font selection work
+
+    Not tested yet.
+
+ src/hb-ot-name-private.hh | 37 +++++++++++++++++++++++++++++++++++++
+ src/hb-uniscribe-shape.cc | 30 +++++++++++++++++++++++-------
+ src/test.cc               |  1 -
+ 3 files changed, 60 insertions(+), 8 deletions(-)
+
+commit b492299eb3c398701557e452f6c2c9bd370fbbf3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 5 20:34:50 2011 -0400
+
+    Start implementing the 'name' table
+
+ src/Makefile.am           |  3 +-
+ src/hb-ot-name-private.hh | 91
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-uniscribe-shape.cc | 12 ++++---
+ 3 files changed, 100 insertions(+), 6 deletions(-)
+
+commit 4538efacca84329a60ff69851de70027d9b4f567
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 5 20:11:06 2011 -0400
+
+    Skip tests by returning 77
+
+    automake test runner understands this.
+
+ src/check-internal-symbols.sh | 3 ++-
+ src/check-libstdc++.sh        | 3 ++-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+commit 54eb65538da0a6ab0389d09944c90e12a913157d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 5 20:09:25 2011 -0400
+
+    Fix check on OS X sh
+
+ src/check-header-guards.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9da554504e30a326fc57b28cdb0e57108bfa9555
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 5 19:48:49 2011 -0400
+
+    Add hb_shape_list_shapers()
+
+ src/hb-shape.cc   | 22 ++++++++++++++++++----
+ src/hb-shape.h    |  3 +++
+ test/Makefile.am  |  2 ++
+ test/test-c.c     |  8 ++++++++
+ test/test-shape.c | 15 +++++++++++++++
+ 5 files changed, 46 insertions(+), 4 deletions(-)
+
+commit d7bf473ef222ab420456ff155ffaa09bacb3a394
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 5 18:18:21 2011 -0400
+
+    Minor
+
+ src/check-header-guards.sh  |  1 -
+ src/hb-open-type-private.hh | 10 +++++-----
+ 2 files changed, 5 insertions(+), 6 deletions(-)
+
+commit c62a8f10f3b9a4ac3ac6b686464ac734ebfa2f7f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 5 18:02:30 2011 -0400
+
+    Free all static memory upon exit
+
+ src/hb-common.cc | 8 +++++---
+ src/hb-shape.cc  | 4 ++--
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+commit c4d63ef744f79701458ab7af2055afb87ffe8de3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 5 17:54:25 2011 -0400
+
+    Fix env parsing code
+
+    Also changed the separator to comma instead of colon.
+
+ src/hb-shape.cc | 34 +++++++++++++++++++++++++---------
+ 1 file changed, 25 insertions(+), 9 deletions(-)
+
+commit 3931837bebd79c5eb1bd5b24ff12e2c8e7d3f24c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 5 17:22:19 2011 -0400
+
+    Change hb_shape() API back to what it was, add hb_shape_full()
+
+    I disliked changing hb_shape() API, and disliked the fact that it was
+    returning a bool now.  So, reverted.  Added new API for the extra
+    functionality.
+
+ src/hb-view.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3ca6c4ecc299295b6682fa2b6b9f83b213223bad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 5 17:22:19 2011 -0400
+
+    Change hb_shape() API back to what it was, add hb_shape_full()
+
+    I disliked changing hb_shape() API, and disliked the fact that it was
+    returning a bool now.  So, reverted.  Added new API for the extra
+    functionality.
+
+ src/hb-shape.cc   | 21 +++++++++++++++------
+ src/hb-shape.h    | 14 ++++++++++----
+ src/test.cc       |  2 +-
+ test/test-shape.c |  2 +-
+ 4 files changed, 27 insertions(+), 12 deletions(-)
+
+commit 02aeca985b570763342c35e99af90025bfa088d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 4 22:31:05 2011 -0400
+
+    [API] Changes to main shape API
+
+    hb_shape() now accepts a shaper_options and a shaper_list argument.
+    Both can be set to NULL to emulate previous API.  And in most
+    situations
+    they are expected to be set to NULL.
+
+    hb_shape() also returns a boolean for now.  If shaper_list is
+    NULL, the
+    return value can be ignored.
+
+    shaper_options is ignored for now, but otherwise it should be a
+    NULL-terminated list of strings.
+
+    shaper_list is a NULL-terminated list of strings.  Currently
+    recognized
+    strings are "ot" for native OpenType Layout implementation,
+    "uniscribe"
+    for the Uniscribe backend, and "fallback" for the non-complex backend
+    (that will be implemented shortly).  The fallback backend never fails.
+
+    The env var HB_SHAPER_LIST is also parsed and honored.  It's a
+    colon-separated list of shaper names.  The fallback shaper is
+    invoked if
+    none of the env-listed shapers succeed.
+
+    New API hb_buffer_guess_properties() added.
+
+ TODO                             |   2 -
+ configure.ac                     |   9 +++
+ src/Makefile.am                  |  14 ++--
+ src/hb-buffer-private.hh         |   1 +
+ src/hb-buffer.cc                 |  35 ++++++++++
+ src/hb-buffer.h                  |   3 +
+ src/hb-fallback-shape-private.hh |  48 ++++++++++++++
+ src/hb-fallback-shape.cc         |  43 +++++++++++++
+ src/hb-ot-shape.cc               |   9 ++-
+ src/hb-ot-shape.h                |   5 +-
+ src/hb-shape.cc                  | 135
+ +++++++++++++++++++++++----------------
+ src/hb-shape.h                   |  13 ++--
+ src/hb-uniscribe-shape.cc        |  52 ++++++---------
+ src/hb-uniscribe.h               |   5 +-
+ src/hb-view.cc                   |   2 +-
+ src/test.cc                      |   3 +-
+ test/test-shape.c                |   2 +-
+ 17 files changed, 274 insertions(+), 107 deletions(-)
+
+commit 57692adf1294a6db4627d0de7c671e4aa01d2a8f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 4 20:49:16 2011 -0400
+
+    Make test.cc do something more useful
+
+    Hardcoded to the uniscribe backend for now.  Will fix soon.
+
+ src/test.cc | 38 ++++++++++++++++++++++++++++++++++----
+ 1 file changed, 34 insertions(+), 4 deletions(-)
+
+commit c605bbbb6d4b2a98b1f40ca818760088d991f7d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 4 20:00:53 2011 -0400
+
+    Remove C++ guards from source files
+
+    Where causing issues for people with MSVC.
+
+ src/check-c-linkage-decls.sh            | 3 +--
+ src/hb-blob.cc                          | 2 --
+ src/hb-buffer-private.hh                | 2 --
+ src/hb-buffer.cc                        | 2 --
+ src/hb-common.cc                        | 2 --
+ src/hb-font-private.hh                  | 2 --
+ src/hb-font.cc                          | 2 --
+ src/hb-ft.cc                            | 2 --
+ src/hb-glib.cc                          | 2 --
+ src/hb-icu.cc                           | 2 --
+ src/hb-mutex-private.hh                 | 2 --
+ src/hb-object-private.hh                | 4 ----
+ src/hb-open-file-private.hh             | 2 --
+ src/hb-open-type-private.hh             | 4 ----
+ src/hb-ot-head-private.hh               | 2 --
+ src/hb-ot-layout-common-private.hh      | 4 ----
+ src/hb-ot-layout-gdef-private.hh        | 2 --
+ src/hb-ot-layout-gpos-private.hh        | 4 ----
+ src/hb-ot-layout-gsub-private.hh        | 4 ----
+ src/hb-ot-layout-gsubgpos-private.hh    | 6 ------
+ src/hb-ot-layout-private.hh             | 2 --
+ src/hb-ot-layout.cc                     | 2 --
+ src/hb-ot-map-private.hh                | 2 --
+ src/hb-ot-map.cc                        | 2 --
+ src/hb-ot-maxp-private.hh               | 2 --
+ src/hb-ot-shape-complex-arabic-table.hh | 2 --
+ src/hb-ot-shape-complex-arabic.cc       | 2 --
+ src/hb-ot-shape-complex-indic-table.hh  | 2 --
+ src/hb-ot-shape-complex-indic.cc        | 2 --
+ src/hb-ot-shape-complex-misc.cc         | 2 --
+ src/hb-ot-shape-complex-private.hh      | 2 --
+ src/hb-ot-shape-normalize.cc            | 2 --
+ src/hb-ot-shape-private.hh              | 2 --
+ src/hb-ot-shape.cc                      | 2 --
+ src/hb-ot-tag.cc                        | 2 --
+ src/hb-private.hh                       | 8 --------
+ src/hb-shape.cc                         | 2 --
+ src/hb-unicode-private.hh               | 2 --
+ src/hb-unicode.cc                       | 2 --
+ src/hb-uniscribe-shape.cc               | 2 --
+ src/hb-view.cc                          | 2 --
+ src/main.cc                             | 2 --
+ src/test.cc                             | 2 --
+ 43 files changed, 1 insertion(+), 106 deletions(-)
+
+commit 8336186a52813b53e90b4399dc462d55750e2d37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 4 19:49:05 2011 -0400
+
+    Zero map objects
+
+ src/hb-ot-map-private.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit ecd3b6e4ad253cf9d0dae1ed2da8ba6caed16b85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 4 01:57:40 2011 -0400
+
+    More build fixes
+
+ configure.ac | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit c747f509bcc4e6a34ced04e9e79ed414a44437b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 4 01:51:30 2011 -0400
+
+    More out-of-tree build fixes
+
+ src/check-c-linkage-decls.sh | 3 +--
+ src/check-header-guards.sh   | 8 ++++----
+ 2 files changed, 5 insertions(+), 6 deletions(-)
+
+commit 0530ca9a180edc330ab801c535907cefa4a0c298
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 4 01:42:59 2011 -0400
+
+    Fix out-of-tree build
+
+ test/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ddbf4edc5d09a645351b1bd1722b068aba6a6dec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 4 01:38:37 2011 -0400
+
+    Minor
+
+ configure.ac | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 20dde6101662fd9ebe5f613631ea468f4c0a995f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 4 01:07:33 2011 -0400
+
+    Minor
+
+ src/hb-uniscribe.h | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 44b4f50d05fd51d8056a78e359fbb00fbcac43a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 4 00:52:20 2011 -0400
+
+    Fix typo
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0fbb2dc83132a89201ad8b56c6909610437d2da0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 3 19:55:04 2011 -0400
+
+    Add draft experimental Uniscribe backend
+
+    Not complete yet, font selection doesn't work.  But hey it shapes!
+
+    This is not supposed to be a production backend, more like a testing
+    backend.
+
+ configure.ac              |   9 ++
+ src/Makefile.am           |  11 ++
+ src/hb-private.hh         |   4 +-
+ src/hb-uniscribe-shape.cc | 325
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-uniscribe.h        |  46 +++++++
+ 5 files changed, 394 insertions(+), 1 deletion(-)
+
+commit 0d7d4824b2edc7aeeb995077655a9a89b5c360a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 3 17:39:24 2011 -0400
+
+    Minor
+
+ configure.ac | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit e62df43649e31b7815c272f01808b3f726c7d07d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 3 17:38:54 2011 -0400
+
+    Add internal hb_buffer_t::get_scratch_buffer()
+
+ src/hb-buffer-private.hh |  2 ++
+ src/hb-buffer.cc         | 10 ++++++++++
+ 2 files changed, 12 insertions(+)
+
+commit 71e7936fcadfd375a8bdc47987ef8b1b2b542df5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 3 17:38:34 2011 -0400
+
+    Minor
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit bf8c57ba745c02370c38198adfdcd8075ba38b13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 3 17:38:04 2011 -0400
+
+    [API] Add hb_face_get_blob()
+
+    Need to think more about it.
+
+ src/hb-font.cc | 10 ++++++++++
+ src/hb-font.h  |  3 +++
+ 2 files changed, 13 insertions(+)
+
+commit 2118fdb9f584e6735e904638e48bae48314372fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 2 14:06:51 2011 -0400
+
+    Fix fallback shaping
+
+    Broke it a few commits ago.
+
+ src/hb-ot-shape.cc | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 199abbd0f15bd295c3a56845c71b38dd20af1332
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 2 13:59:47 2011 -0400
+
+    Minor
+
+ test/test-unicode.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 4f052b93c0b17d92b9f0adddf64ef77518bf2ac4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 2 13:44:24 2011 -0400
+
+    Fix build with glib but not freetype
+
+ test/Makefile.am | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit c21be799daa85d5edb2d831ac985d3e43c8755ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 2 12:05:49 2011 -0400
+
+    Minor
+
+ test/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit e9c2341b1384c161bbab9871411af0bc9f6c3cf4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 2 11:40:44 2011 -0400
+
+    Don't use icu-config when cross-compiling
+
+ configure.ac | 17 ++++++++++-------
+ 1 file changed, 10 insertions(+), 7 deletions(-)
+
+commit 390dab49b6cf34f263b67d20a13f0752ada57bcc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 2 11:29:55 2011 -0400
+
+    Unbreak icu-config results a bit
+
+ configure.ac | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b301478a69d961c724a4875b839a81fb458d1153
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 2 11:25:13 2011 -0400
+
+    Bug 39763 - autogen.sh should check pkg-config availability
+
+    (and revert change have_icu change I mistakenly pushed out)
+
+ autogen.sh   | 10 ++++++++--
+ configure.ac |  1 -
+ 2 files changed, 8 insertions(+), 3 deletions(-)
+
+commit f60271c0c2b0101e7b2725f9a9ad950c277a616c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 2 09:56:30 2011 -0400
+
+    Add mingw32 support
+
+    With these changes, on Ubuntu I can do:
+
+    ./configure --host=i586-mingw32msvc  && make
+
+ configure.ac                | 1 +
+ src/hb-mutex-private.hh     | 4 ++--
+ src/hb-open-type-private.hh | 5 +++++
+ src/hb-private.hh           | 6 +++++-
+ src/main.cc                 | 1 +
+ 5 files changed, 14 insertions(+), 3 deletions(-)
+
+commit 1264b23e4a4ae1c9831a3009e1c7ab8e65a5b434
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 1 16:39:32 2011 -0400
+
+    Bug 39702 - configure check for ragel
+
+ autogen.sh | 18 +++++++++++++-----
+ 1 file changed, 13 insertions(+), 5 deletions(-)
+
+commit f5414cf0a220d6e6f3d4b6e8221cd583b4684187
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 1 16:34:16 2011 -0400
+
+    Use missing script for calling ragel
+
+ src/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit a91c58bf98258a34e5f7c1ad39a38db58fadc4b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 1 16:30:11 2011 -0400
+
+    [Indic] Disable CJCT-disabling logic
+
+    Read comment.
+
+ src/hb-ot-shape-complex-indic.cc | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 5e72071062c015237b79fbd0521341a63166a204
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 31 17:51:50 2011 -0400
+
+    [Indic] Stop looking for base upon seeing joiners
+
+    Not sure where this is documented, but I remember this being the
+    desired
+    behavior.
+
+    test-shape-complex failures are down from 48 to 46.  Meh.
+
+ src/hb-ot-shape-complex-indic.cc | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 281683995a46ed37aeeb84061249758c59822457
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 31 16:00:35 2011 -0400
+
+    Cosmetic
+
+ src/hb-ot-shape-complex-indic.cc | 23 +++++++++++++++--------
+ 1 file changed, 15 insertions(+), 8 deletions(-)
+
+commit 6b37bc80843e38ca7b62500f95fd70c08af68d62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 31 15:57:00 2011 -0400
+
+    [Indic] Fix ZWJ/ZWNJ application
+
+    Not quite working just yet.  False alarm re 10 failures.  It was
+    crashing.  Ouch!  Back to 48 failures.
+
+ src/hb-ot-shape-complex-indic.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit e7be05702447ae270d797398132c1930cd3a9b86
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 31 15:18:57 2011 -0400
+
+    [Indic] Add Final Reordering rules into comments
+
+    Not applied yet.
+
+ src/hb-ot-shape-complex-indic.cc | 86
+ ++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 83 insertions(+), 3 deletions(-)
+
+commit cfd4382ec1af91640129551697de36fd42c0849a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 31 15:07:11 2011 -0400
+
+    [Indic] Handle Reph when determining base consonant
+
+ src/hb-ot-shape-complex-indic.cc | 24 +++++++++++++++---------
+ 1 file changed, 15 insertions(+), 9 deletions(-)
+
+commit 97158392a5899ddb739afaac925128f33f699bd7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 31 15:01:28 2011 -0400
+
+    [Indic] Ra is a consonant too
+
+ src/hb-ot-shape-complex-indic.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 0d8f8a177c4bfd4dc642a353bab8d03674e839ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 31 14:57:59 2011 -0400
+
+    [Indic] Fix reph inhibition logic
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9da0487cd452d780673e24329ce03e174a4ef83b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 31 13:46:44 2011 -0400
+
+    [Indic] Support ZWJ/ZWNJ
+
+    Brings test-shape-complex failures down from 52 to 10!
+
+    I hereby declare harfbuzz-ng supporting Indic!
+
+ src/hb-ot-shape-complex-indic.cc | 57
+ +++++++++++++++++++++++++++++++++-------
+ 1 file changed, 48 insertions(+), 9 deletions(-)
+
+commit 9ee27a928a989c71923cef82a9e9828f8e9ca051
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 31 11:10:14 2011 -0400
+
+    [Indic] Suppress reph formation upon joiners
+
+ src/hb-ot-shape-complex-indic.cc | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 8354e004e553856d7d743e0f0b4de4668484026a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 31 02:24:51 2011 -0400
+
+    Un-Ra U+09F1.  According to the test suite this is correct.
+
+    But I'm not sure...  Down from 54 failures to 52.
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 07cedd81f48907b2e372cd2e963716bbded9ce29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 30 21:16:51 2011 -0400
+
+    Minor
+
+ test/test-shape-complex.c | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+commit ba7e85c104e68b4685c1b3b5c9a260fe0f6879df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 30 21:11:53 2011 -0400
+
+    Cosmetic
+
+ src/hb-ot-shape-complex-indic.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f5bc2725cb892264ba223e0a49f7fd2c622a0730
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 30 21:08:10 2011 -0400
+
+    [Indic] For old-style Indic tables, move Halant around
+
+    In old-style Indic OT standards, the post-base Halants are moved after
+    their base.  Emulate that by moving first post-base Halant to
+    post-last-consonant.
+
+    Brings test-shape-complex failures down from 88 to 54.  Getting there!
+
+ src/hb-ot-map-private.hh         |  3 +++
+ src/hb-ot-shape-complex-indic.cc | 20 ++++++++++++++++++++
+ 2 files changed, 23 insertions(+)
+
+commit c47a31fb4793b825f4be57e9cb1b10db352b9512
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 30 20:57:01 2011 -0400
+
+    [OT] Save chosen script tag
+
+ src/hb-ot-layout.cc      | 20 ++++++++++++++++----
+ src/hb-ot-layout.h       |  3 ++-
+ src/hb-ot-map-private.hh |  1 +
+ src/hb-ot-map.cc         |  2 +-
+ 4 files changed, 20 insertions(+), 6 deletions(-)
+
+commit 3a9b14dfdfc278b432890e1537672a4ca141a3b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 30 20:23:55 2011 -0400
+
+    Minor
+
+ test/test-shape-complex.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 8613193bbf28fe8951c900b68c4418a6fb929626
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 30 20:21:40 2011 -0400
+
+    [test] Fix problem with N'ko test direction
+
+    Old HarfBuzz test suite always shaped as left-to-right and hence
+    had wrong
+    0x14db, direction expected glyphstring for N'ko.  Doh!
+
+    Failures down from 92 to 88.
+
+ test/test-shape-complex.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit fd06bf56110e73826b3d5c73ac964e2609450d46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 30 20:14:44 2011 -0400
+
+    [Indic] Handle initial Ra+Halant in scripts that support Reph
+
+    Brings test-shape-complex failures down from 104 to 92.  Way to go!
+
+ src/hb-ot-shape-complex-indic.cc | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit ee58f3bc75d2d071a71b94063bf12205a5871acb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 30 19:15:53 2011 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 23 ++++++++++++-----------
+ 1 file changed, 12 insertions(+), 11 deletions(-)
+
+commit 352372ae5ea0998e40cf9fe43c22b6b610a5764e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 30 19:04:02 2011 -0400
+
+    [Indic] Categorize Ra in scripts that have Reph
+
+    Is the categorization correct?  I don't know.
+
+ src/hb-ot-shape-complex-indic.cc | 31 ++++++++++++++++++++++++++++++-
+ 1 file changed, 30 insertions(+), 1 deletion(-)
+
+commit 45d6f29f15f1d2323bcaa2498aed23ff0c8a1567
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 30 14:44:30 2011 -0400
+
+    [Indic] Reorder matras
+
+    Number of failing shape-complex tests goes from 125 down to 94.
+
+    Next: Add Ra handling and it's fair to say we kinda support Indic :).
+
+ src/hb-ot-shape-complex-indic.cc | 29 +++++++++++++++++++++++++++--
+ src/hb-ot-shape-normalize.cc     | 26 ++++++++++----------------
+ src/hb-private.hh                | 36
+ ++++++++++++++++++++++++++++++------
+ 3 files changed, 67 insertions(+), 24 deletions(-)
+
+commit 911bf32acad7f1cd161f666cb659990ade0925ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 30 11:16:00 2011 -0400
+
+    Bug 39686 - Add '-no-undefined' to libharfbuzz LDFLAGS
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8f0b64fb6988f9502d2c5e39768a9af133d9a83f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 29 17:02:48 2011 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-arabic.cc | 6 +++---
+ src/hb-private.hh                 | 8 ++++++--
+ 2 files changed, 9 insertions(+), 5 deletions(-)
+
+commit 743807a3ce1b2229e5307a8aea074a7544623d8d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 29 16:37:02 2011 -0400
+
+    [Indic] Apply Indic features
+
+    Find the base consonant and apply basic Indic features accordingly.
+    Nothing complete, but does something for now.  Specifically:
+    no Ra handling right now, and no ZWJ/ZWNJ.
+
+    Number of failing shape-complex tests goes from 174 down to 125.
+
+    Next: reorder matras.
+
+ src/hb-ot-shape-complex-indic-machine.rl |  35 ++++--
+ src/hb-ot-shape-complex-indic.cc         | 209
+ ++++++++++++++++++++++++++++---
+ 2 files changed, 212 insertions(+), 32 deletions(-)
+
+commit 1a1b5013159369b343d0c32df02c9c419277aead
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 29 16:36:46 2011 -0400
+
+    Minor
+
+ test/test-shape-complex.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit dd5546de15e63c0320b7db2bf42b0f15271f7915
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 29 16:27:31 2011 -0400
+
+    Minor
+
+ test/test-shape-complex.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9f9bcceca6321d5a5812f878de1de39901349a78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 28 17:06:46 2011 -0400
+
+    Register buffer vars in Indic shaper
+
+ src/hb-ot-shape-complex-indic.cc | 6 ++++++
+ src/hb-ot-shape.cc               | 2 ++
+ 2 files changed, 8 insertions(+)
+
+commit be09bf6b799cafc2ff54a28915b307ffe99661b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 28 17:03:43 2011 -0400
+
+    Oops.  This should have gone into the previous commit
+
+ src/hb-ot-layout-gsub-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b65c06025d2b54a44f716e030d4b10072c65bea8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 28 16:48:43 2011 -0400
+
+    Formalize buffer var allocations
+
+ src/hb-buffer-private.hh           | 25 ++++++----------
+ src/hb-buffer.cc                   | 15 +++++-----
+ src/hb-ot-layout-gpos-private.hh   | 14 +++++----
+ src/hb-ot-layout-gsub-private.hh   |  5 +++-
+ src/hb-ot-shape-complex-arabic.cc  |  6 +++-
+ src/hb-ot-shape-complex-indic.cc   |  4 +--
+ src/hb-ot-shape-complex-private.hh | 10 ++++++-
+ src/hb-ot-shape.cc                 | 60
+ +++++++++++++++++++++++---------------
+ src/hb-private.hh                  |  1 +
+ 9 files changed, 83 insertions(+), 57 deletions(-)
+
+commit a9ad3d3460ba863a8d8f3766ccbeab288c3c6822
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 28 15:42:18 2011 -0400
+
+    Move more code around
+
+    Buffer var allocation coming into shape
+
+ src/hb-buffer-private.hh         |  1 +
+ src/hb-buffer.cc                 | 35 +++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-gpos-private.hh |  7 +++++++
+ src/hb-ot-layout-gsub-private.hh | 18 ++++++++++++++++++
+ src/hb-ot-layout.cc              |  8 +++-----
+ 5 files changed, 64 insertions(+), 5 deletions(-)
+
+commit cc06c243d8be3ebb1190281653d2dba504c16c0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 25 20:25:44 2011 -0400
+
+    Streamline debugging infrastructure even more
+
+ src/hb-blob.cc                       |  26 ++++-----
+ src/hb-object-private.hh             |   8 +--
+ src/hb-open-type-private.hh          |  64 ++++++--------------
+ src/hb-ot-layout-gsubgpos-private.hh |   2 +-
+ src/hb-private.hh                    | 109
+ +++++++++++++++++++++++++++++++----
+ 5 files changed, 136 insertions(+), 73 deletions(-)
+
+commit 43ff203d8ea3e1b09e316e3aae1a4e5ec15bfdd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 25 17:35:24 2011 -0400
+
+    Use variadic macros for debugging
+
+    Looks *so* much nicer!
+
+ src/hb-blob.cc              | 26 ++++++++--------
+ src/hb-object-private.hh    |  8 ++---
+ src/hb-open-type-private.hh | 75
+ ++++++++++++++++++++-------------------------
+ src/hb-private.hh           |  7 +++--
+ 4 files changed, 56 insertions(+), 60 deletions(-)
+
+commit decd4e3e16424dc311e9fb5b663170414a11556a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 25 16:47:02 2011 -0400
+
+    Add sugar syntax for debug messages
+
+    Buffer debugging coming soon.
+
+ src/hb-blob.cc              | 35 +++++++++++++----------------------
+ src/hb-object-private.hh    |  9 ++++-----
+ src/hb-open-type-private.hh | 44
+ ++++++++++++++++++++++----------------------
+ src/hb-private.hh           |  7 +++++--
+ 4 files changed, 44 insertions(+), 51 deletions(-)
+
+commit 3a81b1db89beba91fb91791918b9fdd9f8fc9fa0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 25 16:30:32 2011 -0400
+
+    Minor, fix leak from my previous refactorings
+
+ src/hb-buffer.cc | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit f4a579bc42fb811ff5c391a0e97b7d8656ef59b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 25 16:20:16 2011 -0400
+
+    Add internal API for buffer var allocation
+
+ src/hb-buffer-private.hh | 25 +++++++++++++++++++++++--
+ src/hb-buffer.cc         | 22 ++++++++++++++++++++++
+ 2 files changed, 45 insertions(+), 2 deletions(-)
+
+commit 651e8dd79ec8eaca5ab75a61e8ce961ff7bd26eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 25 14:54:08 2011 -0400
+
+    Start cleaning up buffer var allocation
+
+    I've messed up a lot of stuff recently, different parts of the
+    shaping process are stumbling on eachother's toes because
+    manually tracking what's in which buffer var is hard.  I'm
+    going to add some internal API to track those such that mistakes
+    are discovered as soon as they are introduced.
+
+ src/hb-ot-layout-gsubgpos-private.hh |  1 -
+ src/hb-ot-layout.cc                  |  1 +
+ src/hb-ot-shape.cc                   | 10 ----------
+ 3 files changed, 1 insertion(+), 11 deletions(-)
+
+commit c86f932015bdf5803572b0904d343d3bc033e009
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 25 00:44:50 2011 -0400
+
+    Move code around
+
+ src/hb-ot-shape.cc | 85
+ +++++++++++++++++++++++++++---------------------------
+ 1 file changed, 42 insertions(+), 43 deletions(-)
+
+commit 18c42850c9327ab4479ff150660a76d4ff6f3e9c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 25 00:36:58 2011 -0400
+
+    Shrink space used for ligature ids
+
+    This frees 16bits in the glyph_info struct during the ot_layout
+    process.
+    We can use the freed space in the shapers now.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit d8787493c9aa420544096cef07c29a591a0c1a99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 25 00:36:01 2011 -0400
+
+    Minor
+
+ src/hb-ot-layout-gsub-private.hh     | 6 ------
+ src/hb-ot-layout-gsubgpos-private.hh | 7 +++++++
+ 2 files changed, 7 insertions(+), 6 deletions(-)
+
+commit c311d852080b50ffc85e80168de62abb05a6be59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 23 23:43:54 2011 -0400
+
+    Keep Unicode props updated as we go so we avoid a scan later
+
+ src/hb-ot-shape-normalize.cc | 54
+ +++++++++++++++++++++-----------------------
+ 1 file changed, 26 insertions(+), 28 deletions(-)
+
+commit 5389ff4dbc46c76c9483e3c95f22524b60e21166
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 22 20:22:49 2011 -0400
+
+    Implement the Unicode Canonical Composition algorithm
+
+    Fallback normalization is complete and working now!
+
+ src/hb-ot-shape-normalize.cc | 49
+ +++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 46 insertions(+), 3 deletions(-)
+
+commit dcdc51cdc0ba9d9fb75f84dd5fa7a49aa0b24ea0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 22 17:14:46 2011 -0400
+
+    Handle singleton decompositions
+
+ src/hb-ot-shape-normalize.cc | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit 34c22f816808d061a980cffca12de03beb437fa0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 22 17:04:20 2011 -0400
+
+    Implement Unicode Canonical Reordering Algorithm
+
+ src/hb-ot-shape-normalize.cc | 80
+ +++++++++++++++++++++++++++++++++++++-------
+ src/hb-ot-shape-private.hh   |  2 ++
+ src/hb-ot-shape.cc           |  6 ++--
+ 3 files changed, 73 insertions(+), 15 deletions(-)
+
+commit 4ff0d2d9dfc4f7e4880a4e964ca9872624508ea0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 22 16:15:32 2011 -0400
+
+    Decomposition works now!
+
+ src/hb-ot-shape-normalize.cc | 109
+ +++++++++++++++++++++++++++----------------
+ src/hb-ot-shape.cc           |   3 +-
+ 2 files changed, 70 insertions(+), 42 deletions(-)
+
+commit 468e9cb25c9bc14781b7013e447d763f93bf76a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 22 11:28:07 2011 -0400
+
+    Move buffer methods into the object
+
+ src/hb-buffer-private.hh             | 110 +++----
+ src/hb-buffer.cc                     | 605
+ +++++++++++++++++------------------
+ src/hb-ot-layout-gpos-private.hh     |  88 ++---
+ src/hb-ot-layout-gsub-private.hh     |  58 ++--
+ src/hb-ot-layout-gsubgpos-private.hh |  50 +--
+ src/hb-ot-shape-normalize.cc         |  16 +-
+ src/hb-ot-shape.cc                   |  14 +-
+ 7 files changed, 456 insertions(+), 485 deletions(-)
+
+commit 45412523dc295cb5ee12e096bfacb282cc925843
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 22 11:07:05 2011 -0400
+
+    More normalization kick
+
+ src/hb-ot-shape-normalize.cc | 54
+ +++++++++++++++++++++++++++++---------------
+ src/hb-ot-shape-private.hh   |  8 ++++++-
+ src/hb-ot-shape.cc           | 13 +++--------
+ 3 files changed, 46 insertions(+), 29 deletions(-)
+
+commit 63c0ef4a0763e579c9c80887bbfbd2651de05067
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 20:58:42 2011 -0400
+
+    Fix decompose() implementations to work with non-starter
+    non-composables
+
+    Add tests.
+
+ src/hb-glib.cc      | 10 +++++-----
+ src/hb-icu.cc       | 20 +++++++++++++-------
+ test/test-unicode.c | 11 ++++++++---
+ 3 files changed, 26 insertions(+), 15 deletions(-)
+
+commit 5d90a342e319068716429bf7af76c3896b61a0e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 15:25:01 2011 -0400
+
+    Document normalization design
+
+ src/hb-ot-shape-normalize.cc | 78
+ +++++++++++++++++++++++++++++++++++---------
+ src/hb-ot-shape-private.hh   |  2 +-
+ src/hb-ot-shape.cc           |  6 ++--
+ 3 files changed, 67 insertions(+), 19 deletions(-)
+
+commit 02cdf743c2ec345a44d4fcf865594b6ac13fccd0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 12:23:12 2011 -0400
+
+    Add prefer_decomposed() complex-shaper callback
+
+    This allows the Indic shaper to request decomposed characters.
+    This will
+    handle split matra for free.  Other shapers prefer precomposed
+    characters.
+
+ src/hb-ot-shape-complex-arabic.cc  |  6 ++++++
+ src/hb-ot-shape-complex-indic.cc   |  7 +++++++
+ src/hb-ot-shape-complex-misc.cc    |  6 ++++++
+ src/hb-ot-shape-complex-private.hh | 31 +++++++++++++++++++++++++++++--
+ 4 files changed, 48 insertions(+), 2 deletions(-)
+
+commit d6b9c6d20041b4f4fa11befc179aee757c41904d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 12:16:45 2011 -0400
+
+    More kicking
+
+ src/hb-ot-shape-normalize.cc | 17 ++++++++++++++---
+ 1 file changed, 14 insertions(+), 3 deletions(-)
+
+commit 192445aef2e50087049243ce54ce7059ec441ffa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 12:13:04 2011 -0400
+
+    Remove intermittent_glyph()
+
+    Lets not worry about performance for now...
+
+ src/hb-ot-shape-normalize.cc | 3 ++-
+ src/hb-ot-shape-private.hh   | 2 --
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit d63adfc7d09b26764d9166da97372b21257e7611
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 11:48:57 2011 -0400
+
+    No need to handle variation-selectors seperately, they are GC=Mn
+
+ src/hb-ot-shape.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit aa7264123a088936f2043b45d4d41ca7413fabe5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 11:34:59 2011 -0400
+
+    Only form clusters if we are reversing
+
+    This produces more accurate cluster mappings.  Cluster mappings are
+    minimal now.  Combining marks get their own cluster value most of
+    the time.
+
+ src/hb-ot-shape.cc | 45 ++++++++++++++++++++++-----------------------
+ 1 file changed, 22 insertions(+), 23 deletions(-)
+
+commit 5c6f5982d78e2d7fadc2fbb8b4f3a4be9420c59a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 11:31:08 2011 -0400
+
+    Towards normalization
+
+ src/hb-ot-shape-normalize.cc | 33 ++++++++++++++++++++++-----------
+ src/hb-ot-shape-private.hh   |  3 ++-
+ src/hb-ot-shape.cc           |  4 +++-
+ 3 files changed, 27 insertions(+), 13 deletions(-)
+
+commit ad903e66b1cc4ec1b8160f93b3ab2b5e636f8d62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 10:17:22 2011 -0400
+
+    s/COMBINING_MARK/SPACING_MARK/ here too.  Oops!
+
+ test/test-unicode.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cf7f43ec3382cac2af11f5637c840500daabf889
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 01:12:26 2011 -0400
+
+    Remove stale comment
+
+ src/hb-ot-shape.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 54d1a0d2b2c4ffe15494967122c6422ecb1fc80b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 01:11:09 2011 -0400
+
+    Form clusters before ensuring native direciton
+
+    This is essential as ensure_native_direction uses cluster info that
+    is set by form_clusters().
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9111b21ef99d5e53348176f683261b0101eb427f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 00:58:29 2011 -0400
+
+    Add _hb_buffer_output_glyph() and _hb_buffer_skip_glyph()
+
+ src/hb-buffer-private.hh | 10 ++++++++++
+ src/hb-buffer.cc         | 19 ++++++++++++++++---
+ src/hb-ot-shape.cc       |  2 +-
+ 3 files changed, 27 insertions(+), 4 deletions(-)
+
+commit 655586fe5e1fadf2a2ef7826e61ee9a445ffa37a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 00:51:18 2011 -0400
+
+    Towards normalization
+
+ src/Makefile.am              |  1 +
+ src/hb-ot-shape-normalize.cc | 71
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-private.hh   | 12 ++++++++
+ src/hb-ot-shape.cc           | 10 ++-----
+ 4 files changed, 86 insertions(+), 8 deletions(-)
+
+commit 49741c86334d12fa08a5bfa2110ff3b9adcba1c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 00:35:37 2011 -0400
+
+    Include variation-selectors in cluster calculation
+
+ src/hb-ot-shape.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit dd89d958c139d85efb776fffaf314eead3952c78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 00:28:57 2011 -0400
+
+    Fix cluster calculation for non-LTR text
+
+ TODO             | 6 ------
+ src/hb-buffer.cc | 5 +++++
+ 2 files changed, 5 insertions(+), 6 deletions(-)
+
+commit 4a68684654e645882095c1189477146287ce9437
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 00:14:01 2011 -0400
+
+    When forming clusters, participate all mark types
+
+ src/hb-ot-shape.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 5157e12a55f943b7fc5be7dce0b2ee1bcacca6ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 21 00:12:33 2011 -0400
+
+    Rename HB_UNICODE_GENERAL_CATEGORY_COMBINING_MARK to
+    HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK
+
+    Spacing_Mark is the current Unicode long-name for this property value.
+    The previous name was wrongly carried from glib.
+
+ src/hb-common.h | 2 +-
+ src/hb-icu.cc   | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 7b08b0a7f2057937dfc3ab2ec191656bf2386463
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 20 23:59:07 2011 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-arabic.cc |  8 ++++----
+ src/hb-private.hh                 | 19 +++++++++++++++++++
+ 2 files changed, 23 insertions(+), 4 deletions(-)
+
+commit 498e1a9be673bb02c00aac3f12bb4c6993a85910
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 20 23:19:49 2011 -0400
+
+    [icu] Implement compose()/decompose()
+
+ src/hb-icu.cc       | 87
+ +++++++++++++++++++++++++++++++++++++++++++++++++++--
+ test/test-unicode.c |  1 +
+ 2 files changed, 86 insertions(+), 2 deletions(-)
+
+commit ffd4a436f7baccb68a0c3602f94ea0246e32844f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 20 22:30:29 2011 -0400
+
+    Add tests for compose()/decompose()
+
+    Adjust glib fallback implementation.
+
+    The tests are not hooked up for ICU yet.
+
+ src/hb-glib.cc      | 17 ++++++++++++--
+ src/hb-unicode.cc   |  2 +-
+ test/test-unicode.c | 66
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 82 insertions(+), 3 deletions(-)
+
+commit fca0923b04aeff9369849da97d247a647611f346
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 20 22:16:13 2011 -0400
+
+    Minor
+
+ src/hb-icu.cc | 62
+ ++++++++++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 38 insertions(+), 24 deletions(-)
+
+commit 26b6024962b254b624d4f22088b6c87745074743
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 20 21:58:14 2011 -0400
+
+    [glib] Use g_unicode_script_to/from_iso15924() if available
+
+ src/hb-glib.cc | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 22fdc66712464bdb02e45eed49e4be57e79b442f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 20 21:51:37 2011 -0400
+
+    [glib] Add compose() and decompose() implementations with fallback
+
+ src/hb-glib.cc    | 126
+ +++++++++++++++++++++++++++++++++++++++++++-----------
+ src/hb-unicode.cc |   6 ++-
+ 2 files changed, 106 insertions(+), 26 deletions(-)
+
+commit a54a5505a35eef5315a8e2e7a79502901e3eff5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 20 16:42:10 2011 -0400
+
+    Minor
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 23db8d5c92c96a34c716b68e1aa6819c5a20477a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 12 12:02:26 2011 -0400
+
+    [test] Work around glib <= 2.30 API
+
+ test/hb-test.h | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 22989c5ffc8cce1ea05d729cdf33661c35a52334
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 12 11:54:58 2011 -0400
+
+    Distribute hb-ot-shape-complex-indic-machine.rl
+
+ src/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f6fd3780e12b23ff7ed3743497c8996e71dcb064
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 8 00:22:40 2011 -0400
+
+    Let shapers decide when to apply ccmp and locl
+
+    Instead of always applying those two features before the complex
+    shaper,
+    let the complex shaper decide whether they should be applied first.
+
+    Also add stub for Indic's final_reordering().
+
+ src/hb-ot-shape-complex-arabic.cc |  2 ++
+ src/hb-ot-shape-complex-indic.cc  | 16 ++++++++++++++++
+ src/hb-ot-shape.cc                |  7 +------
+ 3 files changed, 19 insertions(+), 6 deletions(-)
+
+commit c4641723fbf6532b2e80a662e15573b31276bc73
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 7 23:47:19 2011 -0400
+
+    [API] Add compose() and decompose() unicode funcs, rename other ones
+
+    Add compose() and decompose() unicode funcs.  These implement
+    pair-wise canonical composition/decomposition.
+
+    The glib/icu implementations are lacking for now.  We are adding
+    API for this to glib, but I cannot find any useful API in ICU.
+    May end of implementing these in-house.
+
+    Changed all unicode_funcs callback names to remove the "_get" part.
+    Eg, hb_unicode_get_script_func_t is now hb_unicode_script_func_t,
+    and hb_unicode_get_script() is hb_unicode_script() now.
+
+ TODO                      |  4 ++-
+ src/hb-glib.cc            |  6 +++-
+ src/hb-icu.cc             |  6 +++-
+ src/hb-ot-shape.cc        |  6 ++--
+ src/hb-shape.cc           |  2 +-
+ src/hb-unicode-private.hh |  8 +++--
+ src/hb-unicode.cc         | 85
+ ++++++++++++++++++++++++++++++++++-------------
+ src/hb-unicode.h          | 70 +++++++++++++++++++++++++++-----------
+ test/test-unicode.c       | 21 +++++++-----
+ 9 files changed, 146 insertions(+), 62 deletions(-)
+
+commit d05dded1676924e8894c90f7a7c3527b492bcdff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 7 23:42:40 2011 -0400
+
+    More code generation through preprocessor
+
+ src/hb-ot-shape-complex-private.hh | 46
+ ++++++++++++++++++++++++--------------
+ 1 file changed, 29 insertions(+), 17 deletions(-)
+
+commit 891c4755baae6cd59fad59d27fd8933e5f548a74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 7 23:19:27 2011 -0400
+
+    Humm, undo some shuffling
+
+    In preparation for adding more advanced unicode funcs.
+
+ src/hb-ot-shape.cc        |  6 ++---
+ src/hb-shape.cc           |  2 +-
+ src/hb-unicode-private.hh | 36 +++++++++++++-------------
+ src/hb-unicode.cc         | 65
+ ++++++++++++++++++++++++++++++++++-------------
+ 4 files changed, 70 insertions(+), 39 deletions(-)
+
+commit 4b6317c4f426cfaf21e509dbf6ee6d4e0422cdac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 7 23:14:42 2011 -0400
+
+    More code shuffling
+
+ src/hb-font-private.hh    |  16 +++---
+ src/hb-font.cc            |   3 +-
+ src/hb-unicode-private.hh |  42 +++++++-------
+ src/hb-unicode.cc         | 140
+ +++++++++++++++++-----------------------------
+ 4 files changed, 82 insertions(+), 119 deletions(-)
+
+commit 3361c9a323575309d9fd55fe076697a3e22073c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 7 22:35:17 2011 -0400
+
+    Minor
+
+ src/Makefile.am                    |  1 +
+ src/hb-ot-shape-complex-misc.cc    | 51
+ ++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-private.hh | 12 ++++++---
+ 3 files changed, 60 insertions(+), 4 deletions(-)
+
+commit 76f76812ac7cca8ac6935952a2360d5e151480fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 7 22:25:25 2011 -0400
+
+    Shuffle code around, remove shape_plan from complex shapers
+
+ src/hb-ot-shape-complex-arabic.cc        | 36 +++++++++++++-------------
+ src/hb-ot-shape-complex-indic-machine.rl | 12 ++++-----
+ src/hb-ot-shape-complex-indic.cc         | 25 +++++++++---------
+ src/hb-ot-shape-complex-private.hh       | 44
+ +++++++++++++++++++++-----------
+ src/hb-ot-shape-private.hh               | 13 ++--------
+ src/hb-ot-shape.cc                       |  4 +--
+ 6 files changed, 69 insertions(+), 65 deletions(-)
+
+commit e88bff9b4d77dc86c04832163081effbff752216
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 7 22:03:02 2011 -0400
+
+    Minor, use function typedefs
+
+ src/hb-ot-shape-complex-private.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 359dcaa0d33271025ca42a5f54ecbac7ae3b56d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 7 21:55:05 2011 -0400
+
+    Update copyright headers
+
+ src/hb-ot-map-private.hh           | 2 +-
+ src/hb-ot-map.cc                   | 2 +-
+ src/hb-ot-shape-complex-private.hh | 2 +-
+ src/hb-ot-shape.cc                 | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit d8d0c480c85246a74d47dd5297019c7e39391ab0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 7 21:22:08 2011 -0400
+
+    Refactor some code common to GSUB and GPOS
+
+ src/hb-ot-map-private.hh | 29 ++++++++++++++++++--------
+ src/hb-ot-map.cc         | 54
+ +++++++++---------------------------------------
+ 2 files changed, 30 insertions(+), 53 deletions(-)
+
+commit b70c96dbe41d6512b80fe3d966a1942e1ef64a4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 7 21:07:41 2011 -0400
+
+    Enable applying GSUB/GPOS features in multiple segments
+
+    Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=644184
+    among others.
+
+    Shapers now can request segmented feature application by calling
+    add_gsub_pause() or add_gpos_pause().  They can also provide a
+    callback to be called at the pause.  Currently the Arabic shaper
+    uses pauses to enforce certain feature application.  The Indic
+    shaper can use the same facility to pause and do reordering in the
+    callback.
+
+ src/hb-ot-map-private.hh          |  50 +++++++++++----
+ src/hb-ot-map.cc                  | 132
+ +++++++++++++++++++++++++++++++++-----
+ src/hb-ot-shape-complex-arabic.cc |  24 ++++++-
+ src/hb-private.hh                 |   5 ++
+ 4 files changed, 181 insertions(+), 30 deletions(-)
+
+commit f6d7a9bb4c19e605f1f16d9ca40adefba138c37e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 7 16:20:35 2011 -0400
+
+    Shuffle code around
+
+ src/hb-ot-map-private.hh | 68
+ ++++++++++++++++++++++++------------------------
+ 1 file changed, 34 insertions(+), 34 deletions(-)
+
+commit fc551edbf236d71a522ae7c2c9461aa71c5f7d66
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 7 16:09:38 2011 -0400
+
+    Add todo
+
+    I'm too lazy to fix the tests now.
+
+ test/test-shape.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2e18c6dbdfbbfdec0490260bb7cb5213551b2188
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 6 16:05:45 2011 -0400
+
+    Fix reverse_range() position loop
+
+    Mozilla Bug 669175 - Slow rendering of text sometimes in this case,
+    using direction: rtl
+
+ src/hb-buffer.cc | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit fa2befa46f215d8c33a54dfc57889928a628164c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 4 17:18:57 2011 -0400
+
+    Minor
+
+ src/hb-view.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d69d5ceaa0ad30e8d4b9783507c59c6d4221de4f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 4 12:56:38 2011 -0400
+
+    [Indic] Well, at least finding syllables works now :)
+
+    Still not much there.
+
+ src/hb-ot-shape-complex-indic-machine.rl | 4 +++-
+ src/hb-ot-shape-complex-indic.cc         | 9 ++++++++-
+ 2 files changed, 11 insertions(+), 2 deletions(-)
+
+commit 253a57fb5ab211f67140e6139d183e49483a9074
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 28 17:26:03 2011 -0400
+
+    [test-shape-complex] Remove the greek tests
+
+    They are outdated with respect to the DejaVu Sans I'm using.
+    We need to add font version checking to the tests.
+
+ test/test-shape-complex.c | 17 -----------------
+ 1 file changed, 17 deletions(-)
+
+commit afa74bf90405fb121d3132982b87762c1686d80c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 28 17:25:17 2011 -0400
+
+    [test-shape-complex] Print out expected and actual glyphstrings
+    upon failure
+
+    One has to run the test with --verbose to see that right now.
+
+ test/test-shape-complex.c | 25 ++++++++++++++++++++++---
+ 1 file changed, 22 insertions(+), 3 deletions(-)
+
+commit 42d453b0236f67239342df2003b7abce6e2c51ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 28 16:59:16 2011 -0400
+
+    [test] Name tests after their input string
+
+ test/Makefile.am          |   2 +-
+ test/test-shape-complex.c | 150
+ ++++++++++++++++++++++++++++++----------------
+ 2 files changed, 100 insertions(+), 52 deletions(-)
+
+commit 27413169782fdf79e278dd6552c8e194b3bc4eaa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 28 16:21:31 2011 -0400
+
+    Minor
+
+    Towards a better test runner.
+
+ test/test-shape-complex.c | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit cc674cbf7fb9972975dc0499974e5e7fb4ae3c81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 28 16:17:16 2011 -0400
+
+    Minor
+
+ test/test-shape-complex.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 20d8a3982ae320035edd6a04b402cefc9a5e5779
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 28 16:16:21 2011 -0400
+
+    [test] Remove disabled code
+
+    We'd add normalization and decomposition tests later.
+
+ test/test-shape-complex.c | 92
+ -----------------------------------------------
+ 1 file changed, 92 deletions(-)
+
+commit 9704f0ca6c2defed52640da77506c80bc67b4f56
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 28 16:15:46 2011 -0400
+
+    [test] Restructure shape test data a bit
+
+ test/test-shape-complex.c | 75
+ +++++++++++++++++++++++++++--------------------
+ 1 file changed, 43 insertions(+), 32 deletions(-)
+
+commit 4ec30aec3014be6effc09cbbc88dcd075f3826df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 28 14:13:38 2011 -0400
+
+    [Indic] Optimize Indic table storage
+
+ src/hb-ot-shape-complex-indic.cc | 8 +++++---
+ src/hb-private.hh                | 1 +
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+commit c4a59de6d8c1e581b5c155319232be9e805e5cba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 28 14:03:29 2011 -0400
+
+    [Indic] Generate a single data table instead of multiple ones
+
+ src/gen-indic-table.py                 | 30 +++++++++-------
+ src/hb-ot-shape-complex-indic-table.hh | 62
+ ++++++++++++++++------------------
+ 2 files changed, 48 insertions(+), 44 deletions(-)
+
+commit a346e923a99f920bbebc25b335db51fdfb1429ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 28 12:49:18 2011 -0400
+
+    [test] Add Indic tests from harfbuzz.old
+
+    Needs fonts to be put in test/fonts.  Tests are skipped otherwise.
+    Run with --verbose for details.  Working on improving the test runner
+    to make it easier to make sense of what's going on.
+
+ test/Makefile.am          |   11 +-
+ test/hb-test.h            |   21 +
+ test/test-shape-complex.c | 1179
+ +++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 1209 insertions(+), 2 deletions(-)
+
+commit 8fdba506f0f1c66b50f8f4b114d624cb956d03b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 24 20:45:55 2011 -0400
+
+    [Indic] Define indic_position_t
+
+ src/hb-ot-shape-complex-indic.cc | 239
+ ++++++++++++++++++++-------------------
+ 1 file changed, 122 insertions(+), 117 deletions(-)
+
+commit 65988a145b4a52c37fd53c1473034f9e701f61d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 24 19:05:52 2011 -0400
+
+    [Indic] Add a table of consonant positions
+
+    Copied form HarfBuzz.old Indic data.  These are below and post
+    consonants.  This is temporary.  Read the comment in the patch.
+
+ src/hb-ot-shape-complex-indic.cc | 106
+ +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 106 insertions(+)
+
+commit c7fe56a1d5d3e969b6ec51cd9ecd471706a19568
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 24 19:05:34 2011 -0400
+
+    [Indic] Some of the basic features are global;  Mark them so
+
+ src/hb-ot-shape-complex-indic-machine.rl |  1 +
+ src/hb-ot-shape-complex-indic.cc         | 48
+ ++++++++++++++++++++++----------
+ 2 files changed, 35 insertions(+), 14 deletions(-)
+
+commit 867361c3ad39629a8d5b7dc48d558a1c19e37d43
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 17 18:35:46 2011 -0400
+
+    [indic] Add syllable recognition state machine
+
+    Using an incredible tool called Ragel.
+
+ src/Makefile.am                          |   5 ++
+ src/hb-ot-shape-complex-indic-machine.rl | 105
+ +++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-indic.cc         |  21 +++++--
+ 3 files changed, 125 insertions(+), 6 deletions(-)
+
+commit 422e08dbb8e2c0c5664f1bdc7e159a673cfea8c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 15 17:22:48 2011 -0400
+
+    Better categorize Indic character classes
+
+    Matches OT types now.
+
+ src/hb-ot-shape-complex-indic.cc | 51
+ +++++++++++++++++++++++++---------------
+ 1 file changed, 32 insertions(+), 19 deletions(-)
+
+commit 31f18abecb149f8888a72510f2660328dd6de16d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 15 09:49:58 2011 -0400
+
+    Minor compiler warning fixes
+
+ src/hb-buffer-private.hh           |  8 ++++----
+ src/hb-object-private.hh           |  4 ++--
+ src/hb-open-type-private.hh        |  6 +++---
+ src/hb-ot-layout-common-private.hh |  8 ++++----
+ src/hb-ot-map.cc                   | 28 +++++++++++++++-------------
+ src/hb-ot-shape-complex-arabic.cc  |  3 +--
+ src/hb-view.cc                     | 11 ++++++-----
+ test/test-object.c                 | 22 +++++++++++-----------
+ test/test-unicode.c                |  4 ++--
+ 9 files changed, 48 insertions(+), 46 deletions(-)
+
+commit e3693b72f0651985d4f619cde668611639dca885
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 15 09:33:52 2011 -0400
+
+    Change a couple strstr() to strchr()
+
+ src/hb-ot-tag.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b9452bfc1696457e156e79037c863903da5454fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 14 14:47:07 2011 -0400
+
+    Fix compiler warnings with -pedantic
+
+ src/hb-blob.cc                   | 18 +++++++++---------
+ src/hb-glib.cc                   | 20 ++++++++++----------
+ src/hb-icu.cc                    | 20 ++++++++++----------
+ src/hb-object-private.hh         |  2 +-
+ src/hb-open-type-private.hh      | 14 +++++++-------
+ src/hb-ot-layout-gdef-private.hh |  2 +-
+ src/hb-ot-layout.cc              |  2 +-
+ src/hb-ot-map-private.hh         |  2 +-
+ src/hb-ot-shape-complex-indic.cc |  8 ++++----
+ src/hb-ot-shape-private.hh       |  2 +-
+ src/hb-ot-shape.cc               |  2 +-
+ 11 files changed, 46 insertions(+), 46 deletions(-)
+
+commit 970e092dc23cbeb7897d4c7bb58c042209f518fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 14 14:35:44 2011 -0400
+
+    Remove extra semicolon
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 81426808020e2b88f008480bd63519aa68c579a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 13 16:02:18 2011 -0400
+
+    Cosmetic
+
+ src/gen-indic-table.py                 |    9 +-
+ src/hb-ot-shape-complex-indic-table.hh | 1038
+ ++++++++++++++++----------------
+ 2 files changed, 524 insertions(+), 523 deletions(-)
+
+commit 902ab866f2d2edc3a71c1203065e6ddf49e5b431
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 10 23:08:54 2011 -0400
+
+    GNOME Bug 652227 - Unconditional use of stdint.h
+
+ src/hb-common.h | 33 ++++++++++++++++++++++-----------
+ 1 file changed, 22 insertions(+), 11 deletions(-)
+
+commit 20503ccd578c9983162857954e3236413469ed35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 7 17:02:48 2011 -0400
+
+    More Indic data shuffling
+
+ src/hb-ot-shape-complex-indic.cc | 74
+ +++++++++++++++++++++++++++-------------
+ 1 file changed, 50 insertions(+), 24 deletions(-)
+
+commit 63b177e45c2405272da3fa6c26fe11ae37950bd0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 7 15:51:40 2011 -0400
+
+    Minor
+
+ src/hb-ot-shape.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b9ddbd55930228422e82b34a141ad1b6093f5376
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 2 17:43:12 2011 -0400
+
+    [Indic] Start an Indic shaper
+
+    Nothing functional in there yet.
+
+    So far, we're parsing IndicSyllabicCategory.txt and
+    IndicMatraCategory.txt
+    fils from Unicode Character Database and store them in an array to
+    be used
+    by the shaper.  Also hooked up the shaper, but it does not do anything
+    right now.
+
+ src/Makefile.am                        |   3 +
+ src/gen-indic-table.py                 | 201 ++++++++
+ src/hb-ot-shape-complex-arabic.cc      |   4 +-
+ src/hb-ot-shape-complex-indic-table.hh | 834
+ +++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-indic.cc       | 141 ++++++
+ src/hb-ot-shape-complex-private.hh     |  58 ++-
+ src/hb-ot-shape-private.hh             |   3 +-
+ 7 files changed, 1237 insertions(+), 7 deletions(-)
+
+commit 697a65c5f5cda53bc68720886a253a019e8212a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 1 20:52:00 2011 -0400
+
+    Minor
+
+ src/gen-arabic-table.py                 | 21 +++++++++++++--------
+ src/hb-ot-shape-complex-arabic-table.hh |  9 ++++-----
+ 2 files changed, 17 insertions(+), 13 deletions(-)
+
+commit 9de1481f2bbbf2a174280b849628612f36a2f701
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 1 20:45:14 2011 -0400
+
+    Update to ArabicShaping-6.1.0d2.txt
+
+ src/hb-ot-shape-complex-arabic-table.hh | 307
+ ++++++++++++++++++++------------
+ 1 file changed, 197 insertions(+), 110 deletions(-)
+
+commit 9d49433efba2217852f4e44f056465b451961c49
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 1 18:10:10 2011 -0400
+
+    Minor rename
+
+ src/Makefile.am                                          | 2 +-
+ src/{gen-arabic-joining-table.py => gen-arabic-table.py} | 2 +-
+ src/hb-ot-shape-complex-arabic-table.hh                  | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 0eafce56eed4c5166ee5b97b121a452ffd292a7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 1 12:44:30 2011 -0400
+
+    [TODO] New items
+
+ TODO | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 89a2bc9ba674e7e57fec1fd8ce7648a44f3aab63
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 31 15:18:13 2011 -0400
+
+    [Vertical] Apply vertical features
+
+    We apply all of vert, vrt2, vkrn, valt, and vpal.
+
+ TODO               |  7 -------
+ src/hb-ot-shape.cc | 50
+ +++++++++++++++++++++++++++++++++++++++++---------
+ 2 files changed, 41 insertions(+), 16 deletions(-)
+
+commit 0c6a9767c812c00f2a6a02d9f43f4694e1f43815
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 31 12:59:17 2011 -0400
+
+    [hb-view] Add --face-index to choose a face in a TrueType Collection
+
+ src/hb-view.cc | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 4f28fbdd804fabeec57a98fe267d892ab58b3a6d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 31 12:33:11 2011 -0400
+
+    Fix TTC header handling
+
+    Also change the Version type to avoid similar bugs in the future.
+
+    Reported by Grigori Goronzy.
+
+ src/hb-open-file-private.hh      | 6 +++---
+ src/hb-open-type-private.hh      | 2 +-
+ src/hb-ot-layout-gdef-private.hh | 6 +++---
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 21deab2bdc58d8e9f1a3ba1f9c61c30a79e288a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 30 11:08:40 2011 -0400
+
+    Fixed inifinite loop introduced in 7403e055cd1463f
+
+    k is the index, not j.
+
+    Reported by Tom Hacohen.
+
+ src/hb-ot-layout-gpos-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 51881a61ca96c3328e2d92927a5a61e60997a429
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 18:15:56 2011 -0400
+
+    Shrink code size
+
+ src/hb-ot-map-private.hh | 11 +----------
+ src/hb-ot-map.cc         | 11 +++++++++++
+ 2 files changed, 12 insertions(+), 10 deletions(-)
+
+commit 90645fb24bcbb78183576d3641a99560d87e49f2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 18:13:31 2011 -0400
+
+    [OT] Separate map_builder from the actual map
+
+    Respectively, separate planner from the actual plan.
+
+ src/hb-ot-map-private.hh           | 121
+ ++++++++++++++++++++-----------------
+ src/hb-ot-map.cc                   |  33 +++++-----
+ src/hb-ot-shape-complex-arabic.cc  |   6 +-
+ src/hb-ot-shape-complex-private.hh |   8 +--
+ src/hb-ot-shape-private.hh         |  22 +++++++
+ src/hb-ot-shape.cc                 |  28 +++++----
+ 6 files changed, 127 insertions(+), 91 deletions(-)
+
+commit 5560a19e2b3901437d8ee2e5905b4ac77073bfbe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 17:49:16 2011 -0400
+
+    Minor
+
+ src/hb-view.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1587c26fe94087040b4a5d682ec196f568e4a1a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 16:05:01 2011 -0400
+
+    [TODO] Add item
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5c9f14932d59e306fbc72f7daecb384a16da73d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 15:59:33 2011 -0400
+
+    Minor
+
+ Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5bc18195d55570ef01e4b24dd248f222f081b0a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 15:58:54 2011 -0400
+
+    Add check-includes.sh
+
+ src/Makefile.am               |  7 +++++++
+ src/check-c-linkage-decls.sh  |  6 +++++-
+ src/check-header-guards.sh    |  8 +++++++-
+ src/check-includes.sh         | 42
+ ++++++++++++++++++++++++++++++++++++++++++
+ src/check-internal-symbols.sh |  8 ++++----
+ src/check-libstdc++.sh        |  7 ++++---
+ src/hb-ot-shape.h             |  1 +
+ 7 files changed, 70 insertions(+), 9 deletions(-)
+
+commit 3f12c434e20261f6d5c600e56575b7dfdd5b1470
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 04:58:11 2011 -0400
+
+    [configure] Generate sha256sum and GPG-sign it
+
+ Makefile.am | 29 ++++++++++++++++++++++++++++-
+ 1 file changed, 28 insertions(+), 1 deletion(-)
+
+commit 75ba4073ca6f72c135927d9314197a605281b789
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 03:58:17 2011 -0400
+
+    [test] Rename valgrind-log to log-vaglring.txt
+
+ test/Makefile.am | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e3b0ba8e292e6a90666cfbbab6faf11ae11f9ddb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 03:56:37 2011 -0400
+
+    Minor
+
+ harfbuzz.doap | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 595dc63eee926a0e0fee26f8225b5fbe00610fcb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 04:14:12 2011 -0400
+
+    Bump version to 0.7.0 to open up for development
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f24557604281356131618546332d7ee3a0c8abef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 25 16:08:06 2011 -0400
+
+    Release 0.6.0.  First official tarball release!
+
+    There are no API guarantees just yet, but I *expect* that no
+    incompatible API changes to happen before 1.0.0.
+
+    Update NEWS.
+
+ NEWS         | 262
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ configure.ac |   2 +-
+ 2 files changed, 263 insertions(+), 1 deletion(-)
+
+commit 654f88fbc9bcb54f9bd2d5586236234e03424044
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 03:38:46 2011 -0400
+
+    [test-common] Test hb_direction_to_string()
+
+    Caught by "make check-symbols".
+
+ test/test-common.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 18bced134fc3379c9124ba029e22ff3f6434ca0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 03:38:30 2011 -0400
+
+    [test] Rename test-symbols to check-symbols
+
+    Shows undocumented symbols.
+
+ test/Makefile.am | 37 +++++++++++++++++++++----------------
+ 1 file changed, 21 insertions(+), 16 deletions(-)
+
+commit 376dafa6ed414e368e9dc1d5a2e0bfc8e55f410d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 03:35:58 2011 -0400
+
+    Hide internal symbols
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0e482ec6ba30b613f2d7ee97c61be458c5aebcd6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 02:46:28 2011 -0400
+
+    [test/unicode] Fix double-free
+
+    Caught by "make check-valgrind".
+
+ test/Makefile.am    | 2 +-
+ test/test-unicode.c | 2 --
+ 2 files changed, 1 insertion(+), 3 deletions(-)
+
+commit 28b1bac5415774cf892c9cc0afcac1324c2093f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 02:44:29 2011 -0400
+
+    [test] Switch to automake-based test-runner
+
+    Adds check-valgrind among other modes.  We do not run under gtester by
+    default anymore.
+
+ Makefile.am                 |  2 +
+ test/.valgrind-suppressions |  0
+ test/Makefile.am            | 48 ++++++++++++++++++++++--
+ test/Makefile.decl          | 90
+ ---------------------------------------------
+ 4 files changed, 47 insertions(+), 93 deletions(-)
+
+commit adbc97ddde27cf609d95d3249f3ea8060a6e1d20
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 01:33:18 2011 -0400
+
+    [test] Add test-symbols that checks API symbol text coverage
+
+    We're not at 100% coverage yet, so do not enable the test by default.
+
+ test/Makefile.am | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit 9313b9aa66a82fd3fa60d8417c22a5350e5a8791
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 27 01:00:55 2011 -0400
+
+    [test/version] Test hb-version.h
+
+ test/Makefile.am    |  1 +
+ test/test-version.c | 80
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 81 insertions(+)
+
+commit 329c15714be90d3fc2d9054f80cb14fa325dc959
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 25 16:07:07 2011 -0400
+
+    Add libtool versioning
+
+    The versioning is automatic.  For now, soname-major is 0.  With
+    the 1.0.0 release it will jump to 1 and stay there forever.
+
+ configure.ac    | 26 +++++++++++++++++++++-----
+ src/Makefile.am |  1 +
+ 2 files changed, 22 insertions(+), 5 deletions(-)
+
+commit 5b21eff8c4a00962d4315a47a65a143abe323299
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 25 14:49:35 2011 -0400
+
+    Update README, etc
+
+ COPYING      | 1 +
+ README       | 8 +++-----
+ configure.ac | 2 +-
+ 3 files changed, 5 insertions(+), 6 deletions(-)
+
+commit 5bf56ea056b30fba8e07e82ec818c430cab8cafd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 25 14:43:10 2011 -0400
+
+    [TODO] Add item
+
+ TODO              | 2 ++
+ test/test-shape.c | 2 ++
+ 2 files changed, 4 insertions(+)
+
+commit 2d8ebcb9d089c2cfbefac71ca6350e2703ab13e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 25 11:27:33 2011 -0400
+
+    [API] One last font-funcs API change
+
+    Now that vertical text works correctly, I'm doing a last round
+    modification of the font-funcs API to simplify.  Expect no more
+    changes around here.
+
+ src/hb-font.cc    | 107
+ ++++++++++++++++++------------------------------------
+ src/hb-font.h     |  50 +++++++++++--------------
+ src/hb-ft.cc      |  26 ++++++-------
+ test/test-font.c  |  27 +++++++-------
+ test/test-shape.c |  21 +++++------
+ 5 files changed, 91 insertions(+), 140 deletions(-)
+
+commit d31691296f7d3051fcd345bf1325d17835484b50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 25 11:01:32 2011 -0400
+
+    [test] Update to API changes
+
+ test/test-font.c  | 72
+ ++++++++++++++++++++++---------------------------------
+ test/test-shape.c | 35 +++++++++++++--------------
+ 2 files changed, 44 insertions(+), 63 deletions(-)
+
+commit 7403e055cd1463f38215ad9faedd61c3e1b66ac5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 24 21:04:15 2011 -0400
+
+    [Vertical] fix vertical gpos
+
+    Wow, it took me a few days to find the right fix!
+
+    We now set the advance for attached marks to zero, but we
+    do this in the _finish() state of gpos, so it shouldn't
+    regress with fonts like DejaVuSansMono that explicitly
+    decrease the mark advance width to set it to zero.
+
+ src/hb-ot-layout-gpos-private.hh | 167
+ +++++++++++++++++++++++----------------
+ src/hb-ot-shape.cc               |   9 ++-
+ 2 files changed, 103 insertions(+), 73 deletions(-)
+
+commit ff7cbd0219a7c260612c53b3bed343747d79ec4e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 25 09:56:06 2011 -0400
+
+    [TODO] Update
+
+ TODO | 14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+commit 3b0bb855e011099f1a4c77ffc5214c658e280b2d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 20 15:59:59 2011 -0400
+
+    [Vertical] GPOS x/y advance adjustments only apply in hori/vert
+    respectively
+
+ src/hb-ot-layout-gpos-private.hh | 31 +++++++++++++++++++++----------
+ 1 file changed, 21 insertions(+), 10 deletions(-)
+
+commit cc2086d67ce559878a5ce2b41d89a37eabac90b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 19 19:19:50 2011 -0400
+
+    [Vertical] Fix GPOS y-advance direction
+
+ src/hb-ot-layout-gpos-private.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 67d51ff96154c8909734046601e439dd8f6a86df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 19 19:08:57 2011 -0400
+
+    [Vertical] Do fallback origin calculation
+
+ src/hb-font.cc | 32 +++++++++++++++++++++++++++-----
+ 1 file changed, 27 insertions(+), 5 deletions(-)
+
+commit 60fbb36096e344e9af79409ce8cfe3f1f7b0d321
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 19 18:46:15 2011 -0400
+
+    [Vertical] GPOS is always done with horizontal origin
+
+ src/hb-font-private.hh           |   4 +-
+ src/hb-font.cc                   | 187
+ ++++++++++++++++++---------------------
+ src/hb-font.h                    |  53 ++++++-----
+ src/hb-ft.cc                     |  47 ++++------
+ src/hb-ot-layout-gdef-private.hh |  18 ++--
+ src/hb-ot-layout-gpos-private.hh |  23 ++---
+ src/hb-ot-layout.h               |   2 +-
+ src/hb-ot-shape.cc               |  15 ++++
+ 8 files changed, 166 insertions(+), 183 deletions(-)
+
+commit 8b38faeede41e64eb0f6ac2e12ce51dd7138d50a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 19 13:08:00 2011 -0400
+
+    More vertical
+
+    Starting to get there, but not without yet another round of changes.
+
+    I think I know wheere to go now.
+
+ src/hb-font.cc     | 44 ++++++++++++++++++++++++++++++++------------
+ src/hb-font.h      | 10 ++++++++++
+ src/hb-ft.cc       | 14 ++++++++++++--
+ src/hb-ot-shape.cc |  4 ++++
+ 4 files changed, 58 insertions(+), 14 deletions(-)
+
+commit e609aeb1e24da6b7c812396cddb93ee3c95ef87a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 18 10:17:02 2011 -0400
+
+    [hb-view] Add --annotate
+
+    Currently it only marks glyph origins.
+
+ src/hb-view.cc | 20 +++++++++++++++++++-
+ 1 file changed, 19 insertions(+), 1 deletion(-)
+
+commit b8d76dd74e50d295918cc015e9d2a55e2bf6a461
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 17 23:31:00 2011 -0400
+
+    Vertical: Adjust origin in glyph_extents() and glyph_contour_point()
+
+    The base for vertical is almost ready now.
+
+ src/hb-font.cc | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 190981851fe2bb6479b5c72451279f66fe4f6e23
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 17 23:27:22 2011 -0400
+
+    Cosmetic
+
+ src/hb-font.cc | 114
+ ++++++++++++++++++++++++++++-----------------------------
+ src/hb-ft.cc   |  36 +++++++++---------
+ 2 files changed, 74 insertions(+), 76 deletions(-)
+
+commit 2c3f51a11c176aa3fc12a9522325efaef2c79d35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 17 23:23:27 2011 -0400
+
+    Minor
+
+ src/hb-font.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7e2c85de305be59e1a6afa7d2061e4b7dd00acf7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 17 17:55:03 2011 -0400
+
+    [API] Vertical support, take 2
+
+    I like this API *much* better.  Implementation still incomplete, but
+    horizontal works.
+
+ src/hb-font-private.hh           |   7 +-
+ src/hb-font.cc                   | 185
+ +++++++++++++++++++++++----------------
+ src/hb-font.h                    | 109 ++++++++++++-----------
+ src/hb-ft.cc                     |  66 ++++++++------
+ src/hb-ot-layout-gdef-private.hh |   2 +-
+ src/hb-ot-layout-gpos-private.hh |   2 +-
+ src/hb-ot-shape.cc               |   8 +-
+ 7 files changed, 218 insertions(+), 161 deletions(-)
+
+commit 744970af4d884cc87ffa645804578fec8df674a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 16 18:15:37 2011 -0400
+
+    [API] Add support for vertical text
+
+    Design not final yet, and in fact I'm going to change it immediately,
+    but this is an standalone change for itself.
+
+ src/hb-font-private.hh               |  35 ++--
+ src/hb-font.cc                       | 387
+ +++++++++++++++++++++++++----------
+ src/hb-font.h                        | 164 +++++++++++----
+ src/hb-ft.cc                         | 227 +++++++++++++-------
+ src/hb-ot-layout-gdef-private.hh     |   2 +-
+ src/hb-ot-layout-gpos-private.hh     |  35 ++--
+ src/hb-ot-layout-gsub-private.hh     |   1 +
+ src/hb-ot-layout-gsubgpos-private.hh |   1 +
+ src/hb-ot-shape.cc                   |  14 +-
+ src/hb-ot-tag.cc                     |   2 +-
+ test/test-font.c                     |  61 +++---
+ test/test-shape.c                    |  17 +-
+ 12 files changed, 650 insertions(+), 296 deletions(-)
+
+commit 80dce8b7c8202766d52cc7666355446bbf5b0565
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 17 17:08:36 2011 -0400
+
+    Minor
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5be7d047f6bf54cc577e311b5426c463d2b9b131
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 17 15:05:34 2011 -0400
+
+    Check for mmap()
+
+    Apparently there exist systems with mprotect(), but not mmap()?
+
+ configure.ac     | 2 +-
+ test/test-blob.c | 6 ++++--
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit 4053f3f788353448b41e541ee617aafbe1cac366
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 16 16:20:48 2011 -0400
+
+    Cosmetic
+
+ src/hb-font.h     | 8 ++++----
+ test/test-shape.c | 6 +++---
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 56d12e0356bee5a95b870dfbc2100b8caeb5d593
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 16 16:01:58 2011 -0400
+
+    Remove unnecessary TODO item
+
+ src/hb-ft.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 1883af3796459cafe2d194064403b6b1152c584d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 16 15:18:16 2011 -0400
+
+    [hb-view] Start work on vertical support
+
+ src/hb-view.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 9aa6f96af5e5940ba5c9596c6ae377fea23c0ec0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 16 15:08:31 2011 -0400
+
+    [hb-view] No need to allocate an extra glyph item at the end
+
+ src/hb-view.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit a0359485c9997e3a211f7c00d40c09074d906c4f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 16 15:07:48 2011 -0400
+
+    Minor
+
+ test/test-shape.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 92de53ea450eaee077eb1730e6d7a487b20ac721
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 16 12:24:56 2011 -0400
+
+    [test/buffer] Add more tests for nil buffer
+
+ test/test-buffer.c | 38 ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 38 insertions(+)
+
+commit 065fb38c9a338ddb095f2ec9e034fcc5a02167bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 13 23:04:46 2011 -0400
+
+    [test/ot-tag] More tests
+
+ test/test-ot-tag.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 1a64f6e19a4b483e278c85e4941107be2f71b0a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 13 22:55:32 2011 -0400
+
+    [API] Add HB_LANGUAGE_INVALID
+
+ src/hb-common.cc   | 5 +++--
+ src/hb-common.h    | 2 ++
+ src/hb-ot-tag.cc   | 2 +-
+ src/hb-shape.cc    | 2 +-
+ test/test-common.c | 9 ++++++---
+ 5 files changed, 13 insertions(+), 7 deletions(-)
+
+commit 40b5c2e86c633441040196d158e965ad95d6ad37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 13 22:46:36 2011 -0400
+
+    [test/test-ot-tag] Test hb-ot-tag.h, fix many bugs
+
+    I'm in awe with how many bugs this test revealed.  All fixed.
+
+ src/hb-ot-tag.cc   | 153 +++++++++++++++++++++---------------
+ test/Makefile.am   |   3 +
+ test/test-ot-tag.c | 227
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 320 insertions(+), 63 deletions(-)
+
+commit 1368018b475c2a6dd5f625af99695ae2fcba1f05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 13 20:25:38 2011 -0400
+
+    [TODO] Add items
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 7fc5a30cb4fbe9a4633ab842b0a8cbbcc6f6bd1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 12 17:48:20 2011 -0400
+
+    [API] Add hb_face_make/is_immutable()
+
+ src/hb-font-private.hh |  2 ++
+ src/hb-font.cc         | 18 ++++++++++++++++++
+ src/hb-font.h          |  6 ++++++
+ test/test-font.c       |  2 ++
+ test/test-object.c     |  2 +-
+ 5 files changed, 29 insertions(+), 1 deletion(-)
+
+commit 20c8b908ddf50a9814dfdd9fca595f258273cd4f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 12 15:19:33 2011 -0400
+
+    Finish off previous change
+
+ src/hb-font.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0fd8c2f1be693616f19f2f1526369874763d6cf6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 12 15:14:13 2011 -0400
+
+    [API] Make get_glyph() callback return a boolean
+
+    We need to know whether the glyph exists, so we can fallback to
+    composing / decomposing.  Assuming that glyph==0 means "doesn't exist"
+    wouldn't work for applications like Pango that want to use different
+    "doesn't exist" glyph codes for different characters.  An explicit
+    return value fixes that.
+
+ src/hb-font.cc     | 15 +++++++++------
+ src/hb-font.h      | 12 +++++++-----
+ src/hb-ft.cc       | 12 +++++++-----
+ src/hb-ot-shape.cc | 13 +++++++++----
+ test/test-font.c   |  5 ++++-
+ test/test-shape.c  | 12 +++++++-----
+ 6 files changed, 43 insertions(+), 26 deletions(-)
+
+commit 8e07f93ab4a3ef9adc7942727ef21f2f9a141d10
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 12 14:27:44 2011 -0400
+
+    [test/shape] Check shape output
+
+ test/test-shape.c | 23 +++++++++++++++++++----
+ 1 file changed, 19 insertions(+), 4 deletions(-)
+
+commit 805af72405a2f653f08de392d7172291ffe8e902
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 12 12:39:40 2011 -0400
+
+    Rename get_kernings() arguments from first/second_glyph to
+    left/right_glyph
+
+    Makes it clear that kerning is in visual order.
+
+ src/hb-font.cc | 10 +++++-----
+ src/hb-font.h  |  4 ++--
+ src/hb-ft.cc   |  6 +++---
+ 3 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 23d2432219a91c6328efa9e041b1ecf137752ac3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 12 10:53:57 2011 -0400
+
+    [test] Add test-shape.c.  Oops
+
+ test/test-shape.c | 125
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 125 insertions(+)
+
+commit c098c3acc8c48b4b6883c50c9a87e81dbe98ba24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 12 10:49:30 2011 -0400
+
+    [test/blob] Use MAP_ANON instead of MAP_ANONYMOUS
+
+    More portable.
+
+ test/test-blob.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8329eb7c6ca39e162228733a2210e643b1a1019d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 12 01:39:17 2011 -0400
+
+    [test/shape] Add simplest test for hb_shape()
+
+ test/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit df077fadd7828b609bdfe4dbcad52ef2448525c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 12 01:19:39 2011 -0400
+
+    [object] Make object inert during destruction
+
+    Such that user_data and other finalizers cannot resurrect object
+
+ src/hb-object-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ee8dd83bb4e0b1c2ca5928391e35e8bd1fca6121
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 12 01:02:03 2011 -0400
+
+    [TODO] Update
+
+ TODO | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 52df150efeff4cf003cee65f8c91618f1a980bc8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 12 00:46:57 2011 -0400
+
+    Fix font subclass chainup
+
+    Test passing now.
+
+ src/hb-font.cc | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit f2c1dd4f746c36a44cf33d0257a3cd800107c286
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 12 00:35:12 2011 -0400
+
+    [test/font] Test font_funcs subclassing
+
+ test/test-font.c | 158
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 155 insertions(+), 3 deletions(-)
+
+commit 14f1e81b77971204e9325e2a8b6f8b690fac20a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 12 00:18:28 2011 -0400
+
+    [test/font] Test empty funcs
+
+ test/test-font.c | 75
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 73 insertions(+), 2 deletions(-)
+
+commit 2ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 23:57:36 2011 -0400
+
+    [test/font] Test more
+
+ test/test-font.c | 63
+ ++++++++++++++++++++++++++++++++++++++++++++++++--------
+ 1 file changed, 54 insertions(+), 9 deletions(-)
+
+commit 7033518f756490e9cf00b96387fee6f2f7fae785
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 23:31:15 2011 -0400
+
+    [API] Pass face to get_table()
+
+ src/hb-font.cc   | 4 ++--
+ src/hb-font.h    | 2 +-
+ src/hb-ft.cc     | 2 +-
+ test/test-font.c | 2 +-
+ 4 files changed, 5 insertions(+), 5 deletions(-)
+
+commit b46782780690e26a8221e2d63dd224159aebe413
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 23:25:28 2011 -0400
+
+    [API] Remove const from font user_data
+
+ src/hb-font.cc | 20 ++++++++++----------
+ src/hb-font.h  | 20 ++++++++++----------
+ src/hb-ft.cc   | 20 ++++++++++----------
+ 3 files changed, 30 insertions(+), 30 deletions(-)
+
+commit ea93e7b27ca04a1655d62bd1d18a32805994af44
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 23:22:55 2011 -0400
+
+    [test/font] More tests
+
+ test/test-font.c | 36 +++++++++++++++++++++++++++++++++---
+ 1 file changed, 33 insertions(+), 3 deletions(-)
+
+commit cdb153175f8a1521cde112c65b173f548ca6ee5c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 23:12:58 2011 -0400
+
+    [test/font] More tests
+
+ test/test-font.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 44 insertions(+)
+
+commit 74d9fa3d9ac226ed72702884e721ef94ecc48e22
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 23:07:47 2011 -0400
+
+    [test/font] More get_empty() tests
+
+ test/test-font.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit db9f4eb4e004fadae9d540522d1d21c3bbe659b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 23:06:02 2011 -0400
+
+    [test/font] Test get_face() / get_parent()
+
+ test/test-font.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 606923bb4304d5b9cf164745d657cba58949a80a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 23:05:02 2011 -0400
+
+    [test/font] Add test_font_properties()
+
+ test/test-font.c | 85
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 85 insertions(+)
+
+commit da603e80386b41b360acb070a862b6ed87da57b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 22:52:35 2011 -0400
+
+    [test/font] Start adding tests for hb-font.h
+
+ test/Makefile.am    |  1 +
+ test/test-buffer.c  |  2 +-
+ test/test-font.c    | 69
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ test/test-unicode.c |  1 +
+ 4 files changed, 72 insertions(+), 1 deletion(-)
+
+commit 9a14688e40e926b9453fcb75891f27bff1e45c49
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 22:49:29 2011 -0400
+
+    [API] Rename hb_face_create_for_data() to hb_face_create()
+
+ src/hb-font.cc     | 4 ++--
+ src/hb-font.h      | 4 ++--
+ src/hb-ft.cc       | 2 +-
+ src/test.cc        | 2 +-
+ test/test-object.c | 4 ++--
+ 5 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 46d6a21cc8613519e6ce27b1925e29285cccb71d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 22:33:13 2011 -0400
+
+    [API] Add hb_ot_layout_substitute_start/finish()
+
+ src/hb-ot-layout.cc | 13 +++++++++++++
+ src/hb-ot-layout.h  |  8 ++++++++
+ 2 files changed, 21 insertions(+)
+
+commit c84d15f52e1183164502d45b476b54f8fe812e0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 22:23:15 2011 -0400
+
+    Remove unused hb_set_t
+
+ src/hb-private.hh | 48 ------------------------------------------------
+ 1 file changed, 48 deletions(-)
+
+commit 389a7c9e67549b1a9f7c538965e4647077f8e6ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 22:21:38 2011 -0400
+
+    Remove hb_static_threadsafe_set_t
+
+ src/hb-common.cc        |  5 +++--
+ src/hb-mutex-private.hh | 42 ------------------------------------------
+ 2 files changed, 3 insertions(+), 44 deletions(-)
+
+commit e06d4eda7bbdb3a1be1f1ce8d98b059a0730f14d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 22:18:31 2011 -0400
+
+    Use constructor/destructor for hb_ot_shape_plan_t
+
+ src/hb-ot-shape-private.hh | 6 +++++-
+ src/hb-ot-shape.cc         | 4 +---
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+commit a5e4e109460ea23fa5e64926a1676c6a02ab6ba2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 22:00:56 2011 -0400
+
+    Minor
+
+ TODO | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit daa446f184fa27c9764ff7f8a2444d47cf34d986
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 21:31:25 2011 -0400
+
+    Fix compile with no mutex available
+
+ src/hb-mutex-private.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 1e56c476c10577fe319fe553c5ced000bd740940
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 21:28:01 2011 -0400
+
+    Free static mutex'es
+
+ src/hb-mutex-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 831886a9b4073cfe27f7e1db0e957cbd5913fd31
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 21:27:52 2011 -0400
+
+    Streamline mutex stuff
+
+ src/hb-mutex-private.hh | 61
+ ++++++++++++++++++++++++++++++-------------------
+ src/hb-private.hh       |  8 +++++++
+ 2 files changed, 46 insertions(+), 23 deletions(-)
+
+commit 438c4eee353ddf0de66171d84c6ef9b21cbdf8f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 21:14:34 2011 -0400
+
+    Remove unused hb_mutex_trylock()
+
+ src/hb-mutex-private.hh | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit b8477e1da2785708f3232f8f2577f602a5d320d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 21:12:44 2011 -0400
+
+    [test] Add tests for _get_empty() funcs
+
+ test/test-blob.c    |  1 +
+ test/test-buffer.c  |  7 +++++++
+ test/test-unicode.c | 10 ++++++++++
+ 3 files changed, 18 insertions(+)
+
+commit 3994be3ded40e5a3da0e187ad421b19a78865e02
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 21:08:31 2011 -0400
+
+    [TODO] Update
+
+ TODO | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 80a6833b032bc63b4e8c3da6489d3767af1168f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 18:14:44 2011 -0400
+
+    [API] Add hb_*_get_empty() for all objects
+
+ src/hb-buffer.cc   |  6 ++++++
+ src/hb-buffer.h    |  3 +++
+ src/hb-font.cc     | 18 ++++++++++++++++++
+ src/hb-font.h      |  9 +++++++++
+ src/hb-unicode.cc  |  6 ++++++
+ src/hb-unicode.h   |  3 +++
+ test/test-object.c | 36 +++++++++++++++++++++++++++++++++---
+ 7 files changed, 78 insertions(+), 3 deletions(-)
+
+commit d3b30be378c1dec0259a626d9a408bb9ca1b71ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 18:06:12 2011 -0400
+
+    [API] Add HB_UNTAG()
+
+    Useful in C API only.
+
+ src/hb-common.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3cc6e9dcb42551761c3a1a9d3c25b1f1bcdc2419
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 18:02:48 2011 -0400
+
+    Minor
+
+ src/test.cc | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 4101ca7dbbdf1438fa116fb8cad935501ac7cca8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 14:30:56 2011 -0400
+
+    Plug more leaks
+
+    All good now.
+
+ src/hb-blob.cc              | 2 +-
+ src/hb-open-type-private.hh | 8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 6a7ac79e26e85f6781186cf708a12825c0857324
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 14:19:18 2011 -0400
+
+    Plug leaks
+
+ src/hb-ot-map-private.hh   |  7 +++++++
+ src/hb-ot-shape-private.hh |  2 ++
+ src/hb-ot-shape.cc         |  2 ++
+ src/hb-private.hh          | 10 +++++++++-
+ 4 files changed, 20 insertions(+), 1 deletion(-)
+
+commit 7aa12ebdff11a4ffbd04bf9b164586eb0c172e37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 11:55:11 2011 -0400
+
+    [unicode] Simplify method setting
+
+ src/hb-unicode.cc   | 6 +-----
+ test/test-unicode.c | 6 +++++-
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit d5bfd0272130a315d3b5e6cdcf9b7e6395879204
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 11:48:28 2011 -0400
+
+    Minor
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6a4e7e1372ef9fde81b84ecc9c4d1f23d97396c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 10:31:33 2011 -0400
+
+    Add maxp table
+
+    Not used for anything right now.  Will use to get num_glyphs in
+    the future.
+
+ src/Makefile.am           |  1 +
+ src/hb-ot-head-private.hh |  1 -
+ src/hb-ot-layout.cc       |  1 +
+ src/hb-ot-maxp-private.hh | 68
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 70 insertions(+), 1 deletion(-)
+
+commit e0b0710ae52bcc8c6fbd87dfae83818faa5d5f5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 08:58:21 2011 -0400
+
+    Minor
+
+ TODO | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit a513dbcf73ab1cc39a7c9653034904d0c6cd9fe9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 00:24:34 2011 -0400
+
+    [API] Change signature of get_contour_point and get_kerning ffuncs
+
+    get_contour_point now takes glyph id before point_index.
+
+    get_kerning now takes a vector to fill-in.
+
+ src/hb-font.cc                   | 56
+ +++++++++++++++++++++-------------------
+ src/hb-font.h                    | 16 +++++++-----
+ src/hb-ft.cc                     | 11 +++++---
+ src/hb-ot-layout-gdef-private.hh |  2 +-
+ src/hb-ot-layout-gpos-private.hh |  2 +-
+ src/hb-ot-shape.cc               | 15 ++++++++---
+ 6 files changed, 59 insertions(+), 43 deletions(-)
+
+commit 63d646fb2933c2765ce526d321a498d0f7fae2f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 00:15:37 2011 -0400
+
+    [font] Do user-space conversion when chaining up to parent font
+
+ src/hb-font-private.hh | 28 ++++++++++++++++++++++++++++
+ src/hb-font.cc         | 23 +++++++++++++++++------
+ 2 files changed, 45 insertions(+), 6 deletions(-)
+
+commit b6f902a1a9c8b72b5d6a241a14a7bacfaea3a56a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 00:04:15 2011 -0400
+
+    Minor
+
+ src/hb-font-private.hh           |  6 +++---
+ src/hb-ot-layout-gdef-private.hh |  6 +++---
+ src/hb-ot-layout-gpos-private.hh | 20 ++++++++++----------
+ 3 files changed, 16 insertions(+), 16 deletions(-)
+
+commit abcfe9b59b4475eb02dd679aac4bc59616713b28
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 11 00:02:02 2011 -0400
+
+    Remove hb_ot_layout_context_t, simplify code
+
+ src/hb-font-private.hh               |  12 +++-
+ src/hb-font.cc                       |   6 +-
+ src/hb-ot-layout-common-private.hh   |   8 +--
+ src/hb-ot-layout-gdef-private.hh     |  34 +++++-----
+ src/hb-ot-layout-gpos-private.hh     | 121
+ ++++++++++++++++++-----------------
+ src/hb-ot-layout-gsub-private.hh     |  24 +++----
+ src/hb-ot-layout-gsubgpos-private.hh |  11 ++--
+ src/hb-ot-layout-private.hh          |  13 ----
+ src/hb-ot-layout.cc                  |  15 +----
+ 9 files changed, 118 insertions(+), 126 deletions(-)
+
+commit 1ded6d8bbf93b7dabf2b1f620c07bd3236e7a60f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 20:49:02 2011 -0400
+
+    Make default font-funcs chain-up to the parent
+
+ src/hb-font.cc | 44 +++++++++++++++++++++++++++++++++++++++-----
+ src/hb-font.h  | 41 +++++++++++++++++++++--------------------
+ 2 files changed, 60 insertions(+), 25 deletions(-)
+
+commit b9d975b931d6310f25fab5ac280f523cdc27bf94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 20:41:13 2011 -0400
+
+    [API] Pass down closure user_data to font funcs
+
+ src/hb-font-private.hh |  30 ++++++--
+ src/hb-font.cc         | 184
+ +++++++++++++++++++++++++------------------------
+ src/hb-font.h          |  42 ++++++-----
+ src/hb-ft.cc           | 103 ++++++++++++++-------------
+ 4 files changed, 198 insertions(+), 161 deletions(-)
+
+commit 446df9cdb1fddb51819b731436fca54146d0bb23
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 20:14:44 2011 -0400
+
+    Whitespace
+
+ src/hb-unicode.h | 30 +++++++++++++++---------------
+ 1 file changed, 15 insertions(+), 15 deletions(-)
+
+commit 686c2d165dfb284b74b78f6b902d04b585dcaef3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 20:04:26 2011 -0400
+
+    [API] Remove font_funcs func getter functions
+
+ src/hb-font.cc | 32 --------------------------------
+ src/hb-font.h  | 18 ------------------
+ 2 files changed, 50 deletions(-)
+
+commit defc45be6d75aba4a67fa7814b91b73bad953fe6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 20:02:49 2011 -0400
+
+    [API] Add hb_font_create_sub_font() and hb_font_get_parent()
+
+    Not quite useful just yet.
+
+ src/hb-font-private.hh |  1 +
+ src/hb-font.cc         | 41 ++++++++++++++++++++++++++++++++++++++---
+ src/hb-font.h          |  5 +++++
+ src/hb-unicode.h       |  2 +-
+ 4 files changed, 45 insertions(+), 4 deletions(-)
+
+commit 11bb8fe7b3925bc9b019ad0c0218a231e581f152
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 19:57:00 2011 -0400
+
+    [font] Fix internal sign of x/y_scale
+
+    Should have been done as part of
+    da975419884a535281745f30f4b32fee0bc8a7a1
+
+ src/hb-font-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 85e6218e3306165d69ef44277459511d5b54b9ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 19:40:44 2011 -0400
+
+    [API] Remove broken-by-design hb_font_unset_funcs()
+
+ src/hb-font.cc | 22 ----------------------
+ src/hb-font.h  | 16 ----------------
+ 2 files changed, 38 deletions(-)
+
+commit 74f1d896f2479500d65649cf3ec86dd201f0663a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 19:39:32 2011 -0400
+
+    Add hb_font_make/is_immutable()
+
+ src/hb-font-private.hh |  2 ++
+ src/hb-font.cc         | 26 +++++++++++++++++++++++---
+ src/hb-font.h          |  6 ++++++
+ test/test-object.c     |  2 +-
+ 4 files changed, 32 insertions(+), 4 deletions(-)
+
+commit 8c7a100a4d0f3a257fb7563cb08ed4356c3af669
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 19:21:07 2011 -0400
+
+    Fix build without mutex
+
+ src/hb-mutex-private.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 19d3035c40e73923bcad709dc5eefe31cb34d681
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 19:18:12 2011 -0400
+
+    Remove duplicate atomic_int implementation
+
+ src/hb-mutex-private.hh | 17 -----------------
+ 1 file changed, 17 deletions(-)
+
+commit 45bfa99034512e886d75b1d45a5a649647f4711f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 19:12:49 2011 -0400
+
+    Fix set implementation to be truly threadsafe even with destroy()
+    callbacks
+
+    The test/object test is passing again, instead of deadlocking.
+
+ src/hb-common.cc         |  26 +++++------
+ src/hb-mutex-private.hh  |  47 +++++++------------
+ src/hb-object-private.hh |   6 ++-
+ src/hb-private.hh        | 117
+ ++++++++++++++++++++++++++++++++++++++---------
+ 4 files changed, 128 insertions(+), 68 deletions(-)
+
+commit 0c2ec1d78bfa0166ffd4afc204c2668d4f456ed9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 19:11:27 2011 -0400
+
+    [test] Always initialize gthread such that our mutex() stuff is tested
+
+    Now the test/object test deadlocks as expected.  Fix coming.
+
+ configure.ac     | 1 +
+ test/Makefile.am | 4 ++--
+ test/hb-test.h   | 1 +
+ 3 files changed, 4 insertions(+), 2 deletions(-)
+
+commit 6a9093cc486c1899197cd7cc9a3eb907c2e756f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 19:00:07 2011 -0400
+
+    [test/object] Test user_data with destroy() callback that calls
+    user_data
+
+    Exposes the non-atomicity of user_data opertaions at this time because
+    we call finish() while still locked and modifying the object.
+    In fact,
+    I'm surprised that it doesn't deadlock.  It should.
+
+ test/test-object.c | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+commit abe636b8761e47ea60b193c7e72a044de224d172
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 17:55:40 2011 -0400
+
+    Add DOAP file
+
+ Makefile.am   |  6 +++++-
+ harfbuzz.doap | 24 ++++++++++++++++++++++++
+ 2 files changed, 29 insertions(+), 1 deletion(-)
+
+commit f82c18630471216a04e4e3ad42396da4e6d74cba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 17:48:34 2011 -0400
+
+    [test/blob] Fix bug in test
+
+ test/test-blob.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 785d23acd0ce72d399f9c5021bebc854872648af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 17:41:44 2011 -0400
+
+    [test/blob] Add create_sub_blob()
+
+ test/test-blob.c | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+commit 0617b1558234673d3924f37541be01b04d36f05a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 10 17:37:08 2011 -0400
+
+    [test] Test blob API
+
+ test/Makefile.am   |   1 +
+ test/test-blob.c   | 280
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ test/test-buffer.c | 149 ++++++++++++++--------------
+ 3 files changed, 359 insertions(+), 71 deletions(-)
+
+commit 1c9f8717eb12c37c219333cbb0d123e1d2da4896
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 22:28:26 2011 -0400
+
+    [API] Simplify blob API, remove lock
+
+ TODO                        |   2 -
+ src/hb-blob.cc              | 206
+ ++++++++++++++++++--------------------------
+ src/hb-blob.h               |  19 ++--
+ src/hb-font.cc              |   2 -
+ src/hb-open-type-private.hh |  32 ++++---
+ src/hb-ot-layout.cc         |   7 +-
+ test/test-object.c          |   2 +-
+ 7 files changed, 118 insertions(+), 152 deletions(-)
+
+commit 71cef14ac3de07e4fed0a2903b1f0f639406ec6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 19:30:59 2011 -0400
+
+    Add -Bsymbolic-functions to linker flags
+
+ configure.ac | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit ab428aeab724ca40341318b66640f992cd72d2fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 19:30:46 2011 -0400
+
+    [TODO] Update
+
+ TODO | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a0f337a1cce1788dbf3147b459e7f615acbfe81b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 19:20:52 2011 -0400
+
+    Remove unused hb_blob_try_writable_inplace()
+
+ src/hb-blob.cc | 20 --------------------
+ src/hb-blob.h  |  3 ---
+ 2 files changed, 23 deletions(-)
+
+commit 08611d5194144bbf5d96a1110aeb812db06e0901
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 16:28:10 2011 -0400
+
+    Add note re deadlocks
+
+ src/hb-common.cc        | 1 +
+ src/hb-mutex-private.hh | 4 ++++
+ 2 files changed, 5 insertions(+)
+
+commit 34fb5521a5fbb6b95ceff4bbac42a62628bc9f31
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 6 00:04:28 2011 -0400
+
+    [API] Add hb_language_get_default()
+
+    It uses locale information to detect default language.  It's used by
+    hb_shape() whenever language is not set on the buffer.
+
+    Not sure how to properly test it in the test suite.  Tested by
+    observing
+    that with DejaVu Sans we select the proper local glyph version
+    for U+431
+    under Serbian locale.  See http://www.pango.org/ScriptGallery
+
+ src/hb-common.cc   | 21 +++++++++++++++++++++
+ src/hb-common.h    |  3 +++
+ src/hb-shape.cc    |  2 +-
+ test/test-common.c |  5 +++++
+ 4 files changed, 30 insertions(+), 1 deletion(-)
+
+commit c78f4485587cc1dee07e772c164a13fde9d2859f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 21:31:04 2011 -0400
+
+    [API] Add version macros and functions
+
+    Step version up to 0.5.0.
+
+    Also, fix to pass "make distcheck"
+
+ configure.ac                 | 24 ++++++++++++-----
+ src/Makefile.am              |  9 +++++++
+ src/check-c-linkage-decls.sh |  2 +-
+ src/hb-common.cc             | 29 +++++++++++++++++++++
+ src/hb-version.h.in          | 62
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb.h                     |  1 +
+ test/Makefile.am             |  2 ++
+ 7 files changed, 122 insertions(+), 7 deletions(-)
+
+commit 9ff819f6571fd0d570f271162d7a30d97ee64148
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 19:47:59 2011 -0400
+
+    Add disable-static libtool flag
+
+    No one who builds harfbuzz static uses the autotools build system
+    to do it.
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7ca7571ef91754274f6c84bbf988962d74a74098
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 19:47:12 2011 -0400
+
+    Remove win32-dll libtool flag
+
+    Since we're not win32-dll clean the way libtool docs define it.
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 174e3fe89b72729c9c34c647544a2dc1bf63cd84
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 19:37:53 2011 -0400
+
+    Add AC_CANONICAL_HOST
+
+ configure.ac | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit e6a5b88c01420366a70e0c9ae1775fb3c930cb8b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 16:24:42 2011 -0400
+
+    Fix build with older glib
+
+ configure.ac   |  2 +-
+ test/hb-test.h | 55
+ +++++++++++++++++++++++++++++++++----------------------
+ 2 files changed, 34 insertions(+), 23 deletions(-)
+
+commit 3935af1c0d0f53a5fd6054e1ee219f3adda42dca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 16:09:45 2011 -0400
+
+    [buffer] Remove wrong optimization
+
+    While the cluster fields of the glyph string are usually sorted, they
+    wouldn't be in special cases (for example for non-native direction).
+    Blindly using bsearch is plain wrong.  If we want to reintroduce this
+    optimization we have to make sure we know the buffer clusters are
+    monotonic and in which direction.  Not sure it's worth it though.
+
+ src/hb-buffer.cc | 16 +++-------------
+ 1 file changed, 3 insertions(+), 13 deletions(-)
+
+commit 46df6828513d56cd60467e36cbe45aa06648f488
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 15:33:19 2011 -0400
+
+    Make user_data access threadsafe
+
+    For now, by taking a global user_data mutex.
+
+ src/hb-common.cc         | 25 +++++++++++++++++++++++--
+ src/hb-object-private.hh |  2 --
+ 2 files changed, 23 insertions(+), 4 deletions(-)
+
+commit 218e67b9eefa26e2e4fe43f99a84d082b185b1b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 15:28:37 2011 -0400
+
+    Shrink code
+
+ src/hb-common.cc         | 26 ++++++++++++++++++++++++++
+ src/hb-object-private.hh | 21 ++++-----------------
+ 2 files changed, 30 insertions(+), 17 deletions(-)
+
+commit b8d6183ebc4697a434776cf2aec7857d63a7d881
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 15:14:04 2011 -0400
+
+    Use threadsafe set implementation for hb_language lookups
+
+    Note that the static variable has to be a global static, as gcc
+    implements local statics differently and that would require linking
+    to libstdc++, which we don't want.
+
+ src/hb-common.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit d37486d87b65c5abaaa2998fa5c9e48eedde0933
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 15:07:54 2011 -0400
+
+    Add hb_threadsafe_set_t
+
+ src/hb-mutex-private.hh | 54
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-private.hh       |  3 +--
+ 2 files changed, 55 insertions(+), 2 deletions(-)
+
+commit b45f32ee4e599c515ce93e44315283d236b073bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 15:00:43 2011 -0400
+
+    Use hb_array_t for hb_language_t mapping
+
+ src/hb-common.cc         | 48
+ ++++++++++++++++++++++--------------------------
+ src/hb-object-private.hh |  4 ++--
+ src/hb-private.hh        | 19 +++++++++++++++----
+ 3 files changed, 39 insertions(+), 32 deletions(-)
+
+commit 21d2c92fdf7307c7117f8948021f0dd7d5a5d2a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 14:47:53 2011 -0400
+
+    Move code around
+
+ src/hb-object-private.hh | 28 ++++++++++++++--------------
+ 1 file changed, 14 insertions(+), 14 deletions(-)
+
+commit 448ea9bf63104d39f87fff66219034222fa632b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 14:39:24 2011 -0400
+
+    [TODO] Remove done items
+
+ TODO | 9 ---------
+ 1 file changed, 9 deletions(-)
+
+commit 265ac614ea6d26041c7d64739098b76a82bbc4f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 14:38:16 2011 -0400
+
+    Replace fixed-size lookup_maps array with hb_array_t
+
+ src/hb-ot-map-private.hh | 13 +++++--------
+ src/hb-ot-map.cc         | 47
+ +++++++++++++++++++++++++----------------------
+ src/hb-private.hh        |  6 ++----
+ 3 files changed, 32 insertions(+), 34 deletions(-)
+
+commit 6843569d2c70c1771ce964e3d1a4cf91e14e7687
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 14:12:37 2011 -0400
+
+    Replace fixed-size feature_maps array with hb_array_t
+
+ src/hb-ot-map-private.hh | 10 +++-------
+ src/hb-ot-map.cc         | 12 ++++++------
+ src/hb-ot-shape.cc       |  2 +-
+ src/hb-private.hh        | 42 +++++++++++++++++++++++++++++-------------
+ 4 files changed, 39 insertions(+), 27 deletions(-)
+
+commit 44b0a4d2fc62689fc56ef57f412b4bb1e439a614
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 13:42:19 2011 -0400
+
+    Replace fixed-size feature_infos array with hb_array_t
+
+ src/hb-ot-map-private.hh |  9 +++++----
+ src/hb-ot-map.cc         |  9 +++++----
+ src/hb-private.hh        | 12 ++++++++++++
+ 3 files changed, 22 insertions(+), 8 deletions(-)
+
+commit b214ec3ac0ce6568e9226fd09661d52de11dca96
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 13:24:07 2011 -0400
+
+    Minor
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 811482bd650fb5652a9835471ae8ecf0fb185611
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 13:21:04 2011 -0400
+
+    Replace hb_map_t with hb_set_t which is more intuitive and flexible
+
+ src/hb-object-private.hh | 24 ++++++++++++++----------
+ src/hb-private.hh        | 44
+ +++++++++++++++++---------------------------
+ test/test-object.c       |  4 ++++
+ 3 files changed, 35 insertions(+), 37 deletions(-)
+
+commit 478a42536ff7ab777a7774fbfdb9c5e51334a14e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 12:39:51 2011 -0400
+
+    Make array/map implementation more generic
+
+ src/hb-object-private.hh |  2 ++
+ src/hb-private.hh        | 13 +++++++------
+ 2 files changed, 9 insertions(+), 6 deletions(-)
+
+commit b81bd42951e1ce1569b29168015d3c5a2dacf773
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 00:21:16 2011 -0400
+
+    Make hb_mutex_*() macros take a pointer
+
+    More intuitive.
+
+ src/hb-blob.cc          | 28 ++++++++++++++--------------
+ src/hb-mutex-private.hh | 32 ++++++++++++++++----------------
+ 2 files changed, 30 insertions(+), 30 deletions(-)
+
+commit a4b1900913c91aa9db74c4fdfa7c691a5cdf02a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 00:17:43 2011 -0400
+
+    Add hb_static_mutex_t
+
+ src/hb-mutex-private.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 56eb5ad6f94c32189ad219438db9a18683ca6846
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 4 19:27:37 2011 -0400
+
+    Move code around
+
+    Mutex (and Windows.h by extension) are fairly isolated now.
+
+ src/Makefile.am          |   8 ++--
+ src/hb-blob-private.hh   |  60 ---------------------------
+ src/hb-blob.cc           |  24 ++++++++++-
+ src/hb-font-private.hh   |   3 --
+ src/hb-font.cc           |  12 +++---
+ src/hb-mutex-private.hh  | 105
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-object-private.hh |  33 ++-------------
+ src/hb-unicode.cc        |   1 -
+ 8 files changed, 141 insertions(+), 105 deletions(-)
+
+commit d292885893395dcb345dce1010e5c8628a715ef4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 3 01:03:53 2011 -0400
+
+    [ft] Fix font->face handling
+
+    Don't use _cached()
+
+ src/hb-ft.cc | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit 2000179487b49e0d504ec127450dc6fcb5568cec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 3 00:49:06 2011 -0400
+
+    Move Win32 thread-safety stuff to hb-object-private.h
+
+    The Win32 definitions for LONG, ULONG, etc conflicts with
+    hb-open-type.h.  Avoid that by making sure hb-object-private.h
+    and hb-open-type.h are not included in the same compilation unit.
+
+ src/hb-common.cc         | 54 ---------------------------------------
+ src/hb-object-private.hh | 66
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-private.hh        | 66
+ ------------------------------------------------
+ 3 files changed, 66 insertions(+), 120 deletions(-)
+
+commit 266b34418c9bbe23ccaf29cb354b58c465fa3b22
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 3 00:35:53 2011 -0400
+
+    Refactor to keep hb-object-private.h and hb-open-type.h separate
+
+    Needed to be able to include <Windows.h> from hb-object-private.h.
+
+ src/hb-font.cc              | 19 ++++----------
+ src/hb-ot-layout-private.hh | 60
+ +++++++++++++++++++++++++--------------------
+ src/hb-ot-layout.cc         | 28 ++++++++++++++++++---
+ 3 files changed, 63 insertions(+), 44 deletions(-)
+
+commit d4141a44b97377a65e6d2a3e03b3709307af38c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 3 00:19:18 2011 -0400
+
+    [blob] Implement sub_blob() in terms of create()
+
+    Fixes problem with uninitialized sub_blob->mutex among other things.
+
+    Reported by Bradley Grainger.
+
+ src/hb-blob.cc | 12 +++++-------
+ 1 file changed, 5 insertions(+), 7 deletions(-)
+
+commit fc52e9e44c2fe84d63f18dc0098720830f0b467d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 3 00:09:16 2011 -0400
+
+    Implement win32 thread-safety stuff
+
+    Patch from Bradley Grainger.
+
+ src/hb-common.cc  | 54
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-private.hh | 30 +++++++++++++++++++++++++-----
+ 2 files changed, 79 insertions(+), 5 deletions(-)
+
+commit f55272ecde857c116f97a3195f3abd1df3be4b86
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 20:57:28 2011 -0400
+
+    Add hb_mutex_free() and use it
+
+    Based on patch by Bradley Grainger.
+
+ src/hb-blob.cc    |  1 +
+ src/hb-private.hh | 16 +++++++++-------
+ 2 files changed, 10 insertions(+), 7 deletions(-)
+
+commit 8d5186484b28b5f629b523e067d7d5166eec557a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 20:52:21 2011 -0400
+
+    Cosmetic
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 72657e4ce757dcb055a8db7291b68f96f0d34bfb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 20:46:32 2011 -0400
+
+    [API] Make hb_font_create() take a face and reference it
+
+ src/hb-font-private.hh           |  2 ++
+ src/hb-font.cc                   | 42
+ +++++++++++++++++++++++++---------------
+ src/hb-font.h                    | 26 ++++++++++++++-----------
+ src/hb-ft.cc                     |  7 +------
+ src/hb-ot-layout-gdef-private.hh |  2 +-
+ src/hb-ot-layout-gpos-private.hh |  2 +-
+ src/hb-ot-layout.cc              | 10 ++++------
+ src/hb-ot-layout.h               |  2 --
+ src/hb-ot-map-private.hh         |  2 +-
+ src/hb-ot-shape.cc               | 23 +++++++++++-----------
+ src/hb-ot-shape.h                |  1 -
+ src/hb-shape.cc                  | 18 ++---------------
+ src/hb-shape.h                   |  1 -
+ src/hb-view.cc                   |  4 +---
+ test/test-object.c               |  7 +++++--
+ 15 files changed, 70 insertions(+), 79 deletions(-)
+
+commit cec6611c5ce84d69d910bf7e9ec1fdd594398f9f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 20:18:58 2011 -0400
+
+    Protect NULL in a couple places
+
+ src/hb-font.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 5a5030366e40baa8d96ca67b47a52ad5af143157
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 19:54:29 2011 -0400
+
+    Fix bug in array growth implementation
+
+    With this, test/object is now passing.  Yay!
+
+ src/hb-private.hh | 24 +++++++++++-------------
+ 1 file changed, 11 insertions(+), 13 deletions(-)
+
+commit 16123e10700436df18d14e37371bb621b31ea5d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 19:54:17 2011 -0400
+
+    Fix bug in map implementation
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1cd5969f253528b1fc05a06c7a9f222baa29f68d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 19:53:39 2011 -0400
+
+    [object] Fix bug in get_user_data() implementation
+
+ src/hb-object-private.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit db99589529a22a2113bcef1680ab6d9b934f382e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 19:52:47 2011 -0400
+
+    [test/object] Add test for object lifecycle stuff
+
+    Revealed many bugs in the (untested and known buggy) user_data
+    support.
+
+ test/Makefile.am   |   4 +
+ test/test-object.c | 316
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 320 insertions(+)
+
+commit f74d6c81f14f117b3cecfb65f0d5df22849c9a07
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 19:52:32 2011 -0400
+
+    Cosmetic
+
+ test/test-unicode.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 4911062d5be0d937ee8f1a70cc93e05d162f45b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 19:36:39 2011 -0400
+
+    [API] Rename hb_blob_create_empty() to hb_blob_get_empty()
+
+ src/hb-blob.cc              | 2 +-
+ src/hb-blob.h               | 2 +-
+ src/hb-font.cc              | 2 +-
+ src/hb-open-type-private.hh | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 1ab1d3e38cdf8e7331efdbc4ef0c02ee9d5c8c04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 19:35:53 2011 -0400
+
+    [face] Return nil face if blob is inert
+
+ src/hb-font.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit e87867cb88280e3f3a38d829e359cb686168b2cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 19:35:05 2011 -0400
+
+    [buffer] Fail in _create() if we cannot pre-allocate the requested
+    size
+
+ src/hb-buffer.cc | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit cd361ec9a1b2bfc271e5490dbfc0a870fd5c439a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 16:54:05 2011 -0400
+
+    Cosmetic
+
+ test/test-unicode.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c784c67a28f5b92d396eaa9529d57ef91a5cb9ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 15:59:57 2011 -0400
+
+    [unicode] Make _get_parent() return _nil object instead of NULL
+
+ src/hb-unicode.cc   | 29 ++++++++++++-----------------
+ test/test-unicode.c |  2 +-
+ 2 files changed, 13 insertions(+), 18 deletions(-)
+
+commit 07e22779abd089d5921bf2d19d4a3bf1bd0173c6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 14:58:04 2011 -0400
+
+    [test/unicode] Add script roundtrip tests for glib and ICU
+
+ test/test-unicode.c | 70
+ ++++++++++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 64 insertions(+), 6 deletions(-)
+
+commit 7cda65935c73c277550f6ac12f6730e96d4852a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 14:33:53 2011 -0400
+
+    [test/unicode] Better test chainup
+
+ test/test-unicode.c | 54
+ ++++++++++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 49 insertions(+), 5 deletions(-)
+
+commit 250c59225ead28449deb11522dee3819480a19b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 14:21:30 2011 -0400
+
+    [test/unicode] Port the _custom test to test all property setters
+
+ test/test-unicode.c | 186
+ +++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 104 insertions(+), 82 deletions(-)
+
+commit e74b5b339ab0af53d893ec84a0955d5aa508fed3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 14:03:55 2011 -0400
+
+    [test/unicode] Test Unicode 5.2+ but don't fail
+
+ test/test-unicode.c | 21 +++++++++++++++++++--
+ 1 file changed, 19 insertions(+), 2 deletions(-)
+
+commit c763aa42b46eaee95359806cab56fa632ff3ad58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 13:52:17 2011 -0400
+
+    [test/buffer] Clean up testing
+
+    Getting the hang of how to cleanly use gtest.
+
+ test/test-buffer.c | 154
+ +++++++++++++++++++++++++++++------------------------
+ 1 file changed, 85 insertions(+), 69 deletions(-)
+
+commit 819e9d9e5310e67e8dcce9fa885f8a086a9b9ee8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 12:38:54 2011 -0400
+
+    Minor
+
+ test/test-unicode.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 03034acb8a9fdd33135bc3775a1f932da9ebdd42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 12:37:45 2011 -0400
+
+    [icu] Make sure we return script UNKNOWN instead of INVALID
+
+ src/hb-icu.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit d02985ec5a24c659a0a133cc6bc103f1d76bcb29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 12:35:14 2011 -0400
+
+    ISO 15924 fixes
+
+    Update to http://unicode.org/iso15924
+
+    Fixes some of the test failures in test-unicode with ICU.  Still
+    one more to fix before the test passes.
+
+ src/hb-common.cc | 10 ++++++++--
+ src/hb-common.h  |  5 +++--
+ src/hb-ot-tag.cc |  2 --
+ 3 files changed, 11 insertions(+), 6 deletions(-)
+
+commit e8e29c725a72c2e991cd1c4422a020457e1684e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 12:06:18 2011 -0400
+
+    [test/unicode] Add log messages
+
+    Use with --verbose to see what's failing
+
+ test/test-unicode.c | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 208c2c31501f6eb2b81b6bf80fcf39f4646eb38b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 1 20:04:01 2011 -0400
+
+    Minor
+
+ test/test-unicode.c | 478
+ ++++++++++++++++++++++++++--------------------------
+ 1 file changed, 243 insertions(+), 235 deletions(-)
+
+commit 60833efaf1310c3f18e150b61daaeb0074ae3d91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 29 16:49:57 2011 -0400
+
+    [test/unicode] Add testing of all unicode properties
+
+    ICU fails for now.
+
+ test/hb-test.h      |   4 +-
+ test/test-unicode.c | 432
+ +++++++++++++++++++++++++++++++++++++++++++++++++---
+ 2 files changed, 416 insertions(+), 20 deletions(-)
+
+commit da96ee072fa3544c3d36cf0b82ada11806789d70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 29 12:17:09 2011 -0400
+
+    [test/unicode] Test is/make_immutable()
+
+ test/test-unicode.c | 46 ++++++++++++++++++++++++++++++----------------
+ 1 file changed, 30 insertions(+), 16 deletions(-)
+
+commit 6af9cff5e17e82100b435c8d21aed0765296d58d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 29 12:00:38 2011 -0400
+
+    [test/unicode] Use text fixture instead of static variables
+
+ src/hb-unicode-private.hh |   2 +-
+ src/hb-unicode.h          |   2 +-
+ test/test-buffer.c        |   2 +-
+ test/test-c.c             |   1 +
+ test/test-common.c        |   3 +-
+ test/test-cplusplus.cc    |   1 +
+ test/test-unicode.c       | 112
+ +++++++++++++++++++++++++++-------------------
+ 7 files changed, 74 insertions(+), 49 deletions(-)
+
+commit 13db3d40bfc09c68f9761a71435b1840b9d34099
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 28 19:44:45 2011 -0400
+
+    [test/buffer] Add UTF-16 tests
+
+ test/test-buffer.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 46 insertions(+), 2 deletions(-)
+
+commit 243673d601588a6f704ceafbff5dd5cdf66c47b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 28 19:37:51 2011 -0400
+
+    [test/buffer] Add more extensive UTF-8 test data from glib
+
+ src/hb-buffer.cc   |   2 +-
+ test/test-buffer.c | 317
+ ++++++++++++++++++++++++++++++++++++++++++++++++++---
+ 2 files changed, 303 insertions(+), 16 deletions(-)
+
+commit dfec67f958482e5c3bb01e06b08694cd4ded6f66
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 28 18:34:42 2011 -0400
+
+    [test/buffer] Add initial utf-8 tests
+
+ test/hb-test.h     | 25 ++++++++++++++++++++++++-
+ test/test-buffer.c | 46 +++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 69 insertions(+), 2 deletions(-)
+
+commit aafe395ab550d3ba2fabc69155662e87d45e74a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 28 17:10:44 2011 -0400
+
+    Add test suite infrastructure
+
+    Wraps around glib for convenience and ease of use.
+
+ test/Makefile.am    |   1 +
+ test/hb-test.h      | 132
+ ++++++++++++++++++++++++++++++++++++++++++++++++----
+ test/test-buffer.c  |  29 ++++++------
+ test/test-common.c  |  14 +++---
+ test/test-unicode.c |  32 ++++++-------
+ 5 files changed, 160 insertions(+), 48 deletions(-)
+
+commit c7ffe2ad5f6e97e26d14e2cc0d4098af8f5f36d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 28 16:03:29 2011 -0400
+
+    [API Remove hb_font_funcs_copy()
+
+    Will be adding font_funcs subclassing instead.
+
+ src/hb-font.cc | 13 -------------
+ src/hb-font.h  |  3 ---
+ 2 files changed, 16 deletions(-)
+
+commit 30f34d08d445722320db711c3ddf41e66225752c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 28 16:02:40 2011 -0400
+
+    [TODO] Remove finished items
+
+ TODO          |  2 --
+ src/hb-font.h | 10 ----------
+ 2 files changed, 12 deletions(-)
+
+commit 080a0eb7d82d7195be72c16ece6e0a3ffed636b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 28 16:01:01 2011 -0400
+
+    Add _hb_unsigned_int_mul_overflows
+
+ src/hb-buffer.cc                 | 7 ++-----
+ src/hb-open-type-private.hh      | 2 +-
+ src/hb-ot-layout-gsub-private.hh | 2 +-
+ src/hb-private.hh                | 9 ++++++++-
+ 4 files changed, 12 insertions(+), 8 deletions(-)
+
+commit 1d39d6e42b3d7628512d675a84a831a0f58624eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 28 15:54:16 2011 -0400
+
+    Desable possibly lethal test on 64-bit machines
+
+ test/test-buffer.c | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 3264042873fd639f3ef8ff0acfad777a0a9f3355
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 28 14:24:16 2011 -0400
+
+    [test/buffer] Test pre_allocate() and allocation_successful()
+
+ src/hb-buffer.cc   |  3 ++-
+ test/test-buffer.c | 26 +++++++++++++++++++++++++-
+ 2 files changed, 27 insertions(+), 2 deletions(-)
+
+commit 123aa04f7b3241d6e43de2d472c4a1cbdb250ac7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 28 12:58:28 2011 -0400
+
+    Fix possible but improbable overflow in hb_array_t
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e0db4b868f9fdd8e680890f87dd4e13a1c27b7a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 28 12:56:49 2011 -0400
+
+    [buffer] More error handling
+
+    Should be all set now.
+
+ src/hb-buffer-private.hh |  2 +-
+ src/hb-buffer.cc         | 60
+ +++++++++++++++++++++++++++++++++---------------
+ 2 files changed, 43 insertions(+), 19 deletions(-)
+
+commit 15c57e04bf05026ef424f8ae912d2f379301bf93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 28 12:28:54 2011 -0400
+
+    [test/buffer] Add test pre_alloc(); hangs in the buffer code right now
+
+    Because the following loop overflows:
+
+      while (size > new_allocated)
+          new_allocated += (new_allocated >> 1) + 32;
+
+ test/test-buffer.c | 33 ++++++++++++++++++++++++++-------
+ 1 file changed, 26 insertions(+), 7 deletions(-)
+
+commit 1e5527e2d60ed3b4a5adf62b258415ec3aef41fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 28 12:15:24 2011 -0400
+
+    [test/buffer] Test reset(), set_length(), and set/get_unicode_data()
+
+ test/test-buffer.c | 66
+ ++++++++++++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 59 insertions(+), 7 deletions(-)
+
+commit db126b5448ec802285cf2b6f0e7da412d02dfb28
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 28 11:56:29 2011 -0400
+
+    [test/buffer] Test reverse() and reverse_clusters()
+
+ test/test-buffer.c | 61
+ ++++++++++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 57 insertions(+), 4 deletions(-)
+
+commit 5fa849b77d49da2212825ebb1bea9145713b8449
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 21:46:01 2011 -0400
+
+    [API] Add _set/get_user_data() for all objects
+
+ src/hb-blob.cc    | 17 +++++++++++++++++
+ src/hb-blob.h     | 12 ++++++++++++
+ src/hb-buffer.cc  | 16 ++++++++++++++++
+ src/hb-buffer.h   | 10 ++++++++++
+ src/hb-font.cc    | 51
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-font.h     | 36 ++++++++++++++++++++++++++++++++++++
+ src/hb-unicode.cc | 17 +++++++++++++++++
+ src/hb-unicode.h  | 12 ++++++++++++
+ 8 files changed, 171 insertions(+)
+
+commit 852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 21:45:51 2011 -0400
+
+    Move code around
+
+ src/hb-object-private.hh | 153
+ ++++++++++-------------------------------------
+ src/hb-private.hh        | 136 +++++++++++++++++++++++++++++++++++++----
+ 2 files changed, 157 insertions(+), 132 deletions(-)
+
+commit 29c67d3f70b081766a6c01353980f457f38aeb12
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 21:22:32 2011 -0400
+
+    Add initial implementation of user_data to objects
+
+ src/hb-common.h          |  11 ++-
+ src/hb-object-private.hh | 186
+ ++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 193 insertions(+), 4 deletions(-)
+
+commit 47e71d9661946a4ffb96026bf1d697d788414ab5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 16:38:03 2011 -0400
+
+    [object] Remove unnecessary use of macros
+
+ TODO                     |  2 --
+ src/hb-blob.cc           | 18 +++++++++---------
+ src/hb-buffer.cc         |  6 +++---
+ src/hb-font.cc           | 30 +++++++++++++++---------------
+ src/hb-object-private.hh |  9 ---------
+ src/hb-unicode.cc        |  8 ++++----
+ 6 files changed, 31 insertions(+), 42 deletions(-)
+
+commit 8be1420f8fd0e5c53282245d6830efbee5c7409d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 16:14:04 2011 -0400
+
+    [blob] Use HB_FUNC instead of __FUNCTION__
+
+ src/hb-blob.cc | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit ae008b90cfc2028e878100f78b21d70f923a6044
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 16:12:12 2011 -0400
+
+    [object] Add tracing support back in
+
+ src/hb-object-private.hh | 38 ++++++++++++++++++++++++++------------
+ 1 file changed, 26 insertions(+), 12 deletions(-)
+
+commit 5b7f38979fa90117861fe327477de1707f117a8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 15:10:12 2011 -0400
+
+    GNOME Bug 612402 - (hb-arm) HarfBuzz compilation fix for arm
+
+    With gcc on arm, request 8-bit structure alignment.
+
+ configure.ac | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit 39a840ae65327b173e6eb1bb291e235a8305d7a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 14:48:19 2011 -0400
+
+    [API] Add hb_direction_from/to_string()
+
+    And hb-view --direction argument.
+
+ TODO               |  1 -
+ src/hb-common.cc   | 36 ++++++++++++++++++++++++++++++++++++
+ src/hb-common.h    |  6 ++++++
+ src/hb-view.cc     | 13 ++++++++++---
+ test/test-common.c | 21 ++++++++++++++++++++-
+ 5 files changed, 72 insertions(+), 5 deletions(-)
+
+commit f1425a549fef360c3750532de23604cd318999d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 12:15:06 2011 -0400
+
+    Rename hb-view.c and test.c to .cc files
+
+ src/Makefile.am               | 4 ++--
+ src/{hb-view.c => hb-view.cc} | 2 +-
+ src/{test.c => test.cc}       | 5 ++++-
+ 3 files changed, 7 insertions(+), 4 deletions(-)
+
+commit eb5796f58897ecfb9d76fd99915bf1a30669a0fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 12:14:53 2011 -0400
+
+    [TODO] Add hb-view items
+
+ TODO | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 65e0063eae2f3adb25315b8bd7b0e7757aa960f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 09:33:58 2011 -0400
+
+    Make buffer size growth start from 32 instead of 8
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d4bee9f813bb299b1c4aab7c33d588be2a7d354b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 09:24:37 2011 -0400
+
+    [API] Add hb_unicode_funcs_get_default()
+
+ src/hb-buffer.cc          |  4 ++--
+ src/hb-glib.cc            |  5 +++--
+ src/hb-icu.cc             |  5 +++--
+ src/hb-unicode-private.hh | 11 +++++++++++
+ src/hb-unicode.cc         |  7 +++++++
+ src/hb-unicode.h          |  8 ++++++++
+ src/hb-view.c             | 13 ++++++-------
+ test/test-unicode.c       | 11 ++++++++++-
+ 8 files changed, 50 insertions(+), 14 deletions(-)
+
+commit 153142dac8dd9abaf164bb88af07c600c17fc3a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 01:49:03 2011 -0400
+
+    Replace simple macros with inline functions for better type safety
+
+    Now that we use C++ for all source code, lets benefit from it!
+
+    The hb_be_int16/32_get/put/eq() macros grow code size if replaced with
+    inline functions, so leave them as is.
+
+ src/hb-open-type-private.hh |  4 ++--
+ src/hb-private.hh           | 30 +++++++++++++++++++++---------
+ 2 files changed, 23 insertions(+), 11 deletions(-)
+
+commit 40a9b8154f929947f4693bf90c64301afa407c3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 01:48:56 2011 -0400
+
+    Add TODO item
+
+ src/hb-object-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit ebdc83467c31574daa118fc18cd2ef2dc819b503
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 27 01:41:24 2011 -0400
+
+    Don't return in void function
+
+    Would have been nice if gcc had warned...
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ec6f9c2fd03a49d1e91cbaefa5bdbbfb35dff92e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 21 18:35:58 2011 -0400
+
+    Further simplify object handling
+
+ src/hb-object-private.hh | 53
+ ++++++++++++++++++++++++------------------------
+ 1 file changed, 27 insertions(+), 26 deletions(-)
+
+commit fca368c4682624346a0aaee690e1ad6ed4c0b337
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 21 18:24:02 2011 -0400
+
+    Add hb_object_header_t which is the common part of all objects
+
+    Makes way for adding arbitrary user_data support.
+
+ src/hb-blob-private.hh    |  3 +-
+ src/hb-blob.cc            |  2 +-
+ src/hb-buffer-private.hh  |  9 +++--
+ src/hb-buffer.cc          |  2 +-
+ src/hb-font-private.hh    |  7 ++--
+ src/hb-font.cc            |  7 ++--
+ src/hb-ft.cc              |  3 +-
+ src/hb-glib.cc            |  3 +-
+ src/hb-icu.cc             |  3 +-
+ src/hb-object-private.hh  | 95
+ ++++++++++++++++++++++++++---------------------
+ src/hb-private.hh         |  5 +--
+ src/hb-unicode-private.hh |  6 ++-
+ src/hb-unicode.cc         |  3 +-
+ 13 files changed, 82 insertions(+), 66 deletions(-)
+
+commit a9f24c802956d57180d71b83e96a0fb81197df4a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 21 17:18:22 2011 -0400
+
+    Move hb_reference_count_t to hb-private.h
+
+ src/hb-object-private.hh | 17 -----------------
+ src/hb-private.hh        | 20 ++++++++++++++++++++
+ 2 files changed, 20 insertions(+), 17 deletions(-)
+
+commit 2409d5f8d7dd8b535ce5ea29e933f7db27d33793
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 21 17:14:28 2011 -0400
+
+    Update Copyright headers
+
+ COPYING                                 | 15 ++++++++-------
+ src/hb-blob-private.hh                  |  2 +-
+ src/hb-blob.cc                          |  2 +-
+ src/hb-blob.h                           |  2 +-
+ src/hb-buffer-private.hh                |  4 ++--
+ src/hb-buffer.cc                        |  6 +++---
+ src/hb-buffer.h                         |  6 +++---
+ src/hb-common.cc                        |  4 +++-
+ src/hb-common.h                         |  4 +++-
+ src/hb-font-private.hh                  |  4 +++-
+ src/hb-font.cc                          |  2 +-
+ src/hb-font.h                           |  2 +-
+ src/hb-ft.cc                            |  4 ++--
+ src/hb-ft.h                             |  2 +-
+ src/hb-glib.cc                          |  4 +++-
+ src/hb-glib.h                           |  4 +++-
+ src/hb-icu.cc                           |  6 ++++--
+ src/hb-icu.h                            |  4 +++-
+ src/hb-object-private.hh                |  6 ++++--
+ src/hb-open-file-private.hh             |  2 +-
+ src/hb-open-type-private.hh             |  2 +-
+ src/hb-ot-head-private.hh               |  2 +-
+ src/hb-ot-layout-common-private.hh      |  4 ++--
+ src/hb-ot-layout-gdef-private.hh        |  4 ++--
+ src/hb-ot-layout-gpos-private.hh        |  4 ++--
+ src/hb-ot-layout-gsub-private.hh        |  4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh    |  4 ++--
+ src/hb-ot-layout-private.hh             |  2 +-
+ src/hb-ot-layout.cc                     |  6 +++---
+ src/hb-ot-layout.h                      |  2 +-
+ src/hb-ot-map-private.hh                |  4 ++--
+ src/hb-ot-map.cc                        |  4 ++--
+ src/hb-ot-shape-complex-arabic-table.hh |  2 +-
+ src/hb-ot-shape-complex-arabic.cc       |  2 +-
+ src/hb-ot-shape-complex-private.hh      |  2 +-
+ src/hb-ot-shape-private.hh              |  2 +-
+ src/hb-ot-shape.cc                      |  4 ++--
+ src/hb-ot-shape.h                       |  2 +-
+ src/hb-ot-tag.cc                        |  4 +++-
+ src/hb-ot-tag.h                         |  2 +-
+ src/hb-ot.h                             |  2 +-
+ src/hb-private.hh                       |  4 +++-
+ src/hb-shape.cc                         |  2 +-
+ src/hb-shape.h                          |  2 +-
+ src/hb-unicode-private.hh               |  4 ++--
+ src/hb-unicode.cc                       |  4 ++--
+ src/hb-unicode.h                        |  4 +++-
+ src/hb-view.c                           |  4 ++--
+ src/hb.h                                |  2 +-
+ src/main.cc                             |  2 +-
+ src/test.c                              |  2 +-
+ test/hb-test.h                          | 17 ++++++++++++++++-
+ test/test-buffer.c                      |  2 +-
+ test/test-c.c                           |  2 +-
+ test/test-common.c                      |  2 +-
+ test/test-cplusplus.cc                  |  2 +-
+ test/test-unicode.c                     |  2 +-
+ 57 files changed, 122 insertions(+), 84 deletions(-)
+
+commit 08da7a3841ca7dfcb627314cae1c3a668b9c7236
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 21 16:59:10 2011 -0400
+
+    [hb-view] Accept numbers in feature tag name
+
+    Reported by Adam Twardoch.
+
+ src/hb-view.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 24229eb13268a422efffbcb28a094b726824c7f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 21 16:55:17 2011 -0400
+
+    Remove obsolete comment
+
+    Talking to Ryan Lortie, he thinks my comment doesn't make sense.
+
+    So I'm making the getter const.  Note that g_atomic_int_get()
+    casts that away itself, so we don't need to worry about that
+    (which kinda makes me uncomfortable actually).
+
+ src/hb-object-private.hh | 16 ++--------------
+ 1 file changed, 2 insertions(+), 14 deletions(-)
+
+commit dcb7026f33cbcdf60e9b7fcdd44c64cc08702c74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 21 16:34:22 2011 -0400
+
+    Add ASSERT_STATIC_EXPR macro
+
+    Unused right now.
+
+ src/hb-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 3e8bdbf9414291da5cf61213d5f4275c1ae23ae5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 21 16:16:21 2011 -0400
+
+    Cleanup hb_refrence_count_t
+
+ src/hb-object-private.hh | 23 ++++++++++++++++++-----
+ src/hb-private.hh        |  6 +++---
+ 2 files changed, 21 insertions(+), 8 deletions(-)
+
+commit 783a7d69696bf0b1502ec9c1495e482e491c78e0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 21 16:03:59 2011 -0400
+
+    [TODO] Remove finished items
+
+ TODO         | 6 +-----
+ src/hb-ft.cc | 1 -
+ 2 files changed, 1 insertion(+), 6 deletions(-)
+
+commit da975419884a535281745f30f4b32fee0bc8a7a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 21 15:08:01 2011 -0400
+
+    [API] Allow negative font x_scale/y_scale
+
+    I was reconsidering whether y should grow down, since all three/four
+    times I've used this API I was tricked and got that wrong in my use.
+    So I was very inclined to make y grow down instead of up.  However,
+    considering that the font space has y up and it would be very
+    confusing
+    for callbacks to work against that, I decided that what I really want
+    is for the user to be able to set y_scale to a negative number
+    to imply
+    that user-space y grows down.
+
+    Changing x_scale/y_scale from unsigned int to int allows that,
+    and I've
+    made pango to use that instead of negating glyph y_offset later.
+    hb-ft
+    however still has y group up.  I *guess* that's how FreeType works?
+    I'm not sure, FreeType docs don't make this clear...
+
+    I'm happy with the resolution :-).
+
+ src/hb-font.cc                     | 8 ++++----
+ src/hb-font.h                      | 8 ++++----
+ src/hb-ot-layout-common-private.hh | 6 +-----
+ src/hb-ot-layout-private.hh        | 2 +-
+ 4 files changed, 10 insertions(+), 14 deletions(-)
+
+commit 4d559cddbb3b3a5c12c5167eba69598618a9f283
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 21 14:58:23 2011 -0400
+
+    [icu] Remove big script switch(), rely on reverse-lookup
+
+ src/hb-icu.cc | 137
+ ++++------------------------------------------------------
+ 1 file changed, 9 insertions(+), 128 deletions(-)
+
+commit d18431b4cd8c1b14523733cd60a62b862f5b471f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 18:59:10 2011 -0400
+
+    Move hb_reference_count_t from macros to inline methods
+
+ src/hb-object-private.hh | 25 +++++++++++--------------
+ 1 file changed, 11 insertions(+), 14 deletions(-)
+
+commit c57d454accff66e5f2c58006e8fb40bc020b6182
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 18:50:27 2011 -0400
+
+    Rename all private sources and headers to C++ files
+
+    So we can liberally use the simple features of C++ that parts of the
+    codebase is already using.
+
+ src/Makefile.am                                         | 17
+ +++++++++--------
+ src/{hb-blob-private.h => hb-blob-private.hh}           |  8 ++++----
+ src/hb-blob.cc                                          |  4 ++--
+ src/hb-buffer-private.hh                                |  2 +-
+ src/{hb-common.c => hb-common.cc}                       |  8 ++++----
+ src/{hb-font-private.h => hb-font-private.hh}           |  8 ++++----
+ src/hb-font.cc                                          |  6 +++---
+ src/{hb-ft.c => hb-ft.cc}                               |  4 ++--
+ src/hb-glib.cc                                          |  2 +-
+ src/hb-icu.cc                                           |  2 +-
+ src/{hb-object-private.h => hb-object-private.hh}       | 10 ++++------
+ src/hb-open-type-private.hh                             |  2 +-
+ src/hb-ot-layout-gdef-private.hh                        |  2 +-
+ src/hb-ot-layout-private.hh                             |  4 ++--
+ ...abic-table.h => hb-ot-shape-complex-arabic-table.hh} |  8 ++++----
+ src/hb-ot-shape-complex-arabic.cc                       |  2 +-
+ src/hb-ot-shape-complex-private.hh                      |  2 +-
+ src/hb-ot-shape-private.hh                              |  2 +-
+ src/{hb-ot-tag.c => hb-ot-tag.cc}                       |  8 ++++----
+ src/{hb-private.h => hb-private.hh}                     |  8 ++++----
+ src/hb-shape.cc                                         |  2 +-
+ src/hb-unicode-private.hh                               |  2 +-
+ src/hb-unicode.cc                                       |  2 +-
+ src/hb-view.c                                           |  6 ++++++
+ 24 files changed, 63 insertions(+), 58 deletions(-)
+
+commit f19f4f9b0965ad7473a0f3a1ffcdbf16930e35d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 18:25:56 2011 -0400
+
+    Rename hb-blob.c to hb-blob.cc in preparation of more changes
+
+ src/Makefile.am               | 2 +-
+ src/{hb-blob.c => hb-blob.cc} | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 04744e73bad22d679986173b5f0d84dbbf49dd57
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 17:24:03 2011 -0400
+
+    [TODO] Remove done items
+
+ TODO | 6 ------
+ 1 file changed, 6 deletions(-)
+
+commit 9417c1c0d2b005eadf0c087ca695121a6200d0f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 17:21:23 2011 -0400
+
+    [API] Make hb_face_reference_table() return empty blob instead of NULL
+
+    The idea here is that:
+
+      - Like pretty much all other API in harfbuzz, user does not have to
+        check for NULL.
+
+      - In any caller code, the case of missing table should be handled
+        exactly the same way that a too-short table is handled.  Turning
+        a non-existent talbe into a table of size 0 makes the user code
+        safer.
+
+ src/hb-font.cc              | 2 ++
+ src/hb-open-type-private.hh | 3 ---
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit c035812feb0d385a9e8c334631738e4915912c71
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 17:03:00 2011 -0400
+
+    [API] Rename hb_face_get_table() to hb_face_reference_table()
+
+    That correctly reflects the reference ownership transfer happening.
+
+ src/hb-font.cc      | 4 ++--
+ src/hb-font.h       | 7 ++-----
+ src/hb-ot-layout.cc | 6 +++---
+ src/hb-shape.cc     | 2 +-
+ 4 files changed, 8 insertions(+), 11 deletions(-)
+
+commit 2d7b61a4b0ed212ca414b3281c2eae3e3db19c13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 16:40:56 2011 -0400
+
+    [TODO] Remove done items
+
+ TODO        | 10 ++--------
+ src/hb-ft.h |  2 +-
+ 2 files changed, 3 insertions(+), 9 deletions(-)
+
+commit af02933739e03a156b9f7761fd7a63e2a02d0df1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 15:49:31 2011 -0400
+
+    [API] Remove hb_*_get_reference_count()
+
+    This was a bizzare piece of API that I inherited from cairo.  It has
+    been wrong adding them to cairo in the first place.  Remove them
+    before
+    someone uses them!
+
+ src/hb-blob.c           |  6 ------
+ src/hb-blob.h           |  3 ---
+ src/hb-buffer.cc        |  6 ------
+ src/hb-buffer.h         |  3 ---
+ src/hb-font.cc          | 18 ------------------
+ src/hb-font.h           |  9 ---------
+ src/hb-object-private.h |  7 -------
+ src/hb-unicode.cc       |  6 ------
+ src/hb-unicode.h        |  3 ---
+ test/test-unicode.c     | 24 ------------------------
+ 10 files changed, 85 deletions(-)
+
+commit 440a76b630a36a7336c93e8b05d988c6407b085e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 14:20:00 2011 -0400
+
+    [OT] Fix script to ot-script-tag conversion
+
+ src/hb-ot-tag.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a3036a3e97b14c8eb1df208aed944207f9b6cc0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 14:13:23 2011 -0400
+
+    Minor
+
+ src/hb-view.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit fb6291d9c9224bedf207bf0077ad9f0a2690f867
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 03:15:31 2011 -0400
+
+    [test] Add test for headers included from C and C++
+
+ test/Makefile.am       | 17 +++++++++++++++++
+ test/test-c.c          | 49
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ test/test-cplusplus.cc | 29 +++++++++++++++++++++++++++++
+ 3 files changed, 95 insertions(+)
+
+commit 107a50581ccab7df7c390d5b927fdab1bbe8e713
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 03:04:56 2011 -0400
+
+    [test] Add todo items
+
+ test/test-unicode.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 5668189c12c264e8d2caf0d12dac918363ef6f80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 03:03:32 2011 -0400
+
+    [API] font: move user_data before destroy()
+
+    This is the common convention for language binding tools.
+
+ src/hb-font-private.h |  4 ++--
+ src/hb-font.cc        | 30 +++++++++++++++---------------
+ src/hb-font.h         | 12 ++++++------
+ src/hb-ft.c           |  8 ++++----
+ 4 files changed, 27 insertions(+), 27 deletions(-)
+
+commit e5847f75fb7bd25c5db6061d8e20d61fa469f9fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 02:59:28 2011 -0400
+
+    [API] blob: move user_data before destroy()
+
+    This is the common convention for language binding tools.
+
+ src/hb-blob-private.h |  2 +-
+ src/hb-blob.c         | 16 ++++++++--------
+ src/hb-blob.h         |  4 ++--
+ 3 files changed, 11 insertions(+), 11 deletions(-)
+
+commit 1fd73b594d611624ccb73f614c61298debf48994
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 02:56:39 2011 -0400
+
+    [test] Rename test-types to test-common
+
+ test/Makefile.am                     | 2 +-
+ test/{test-types.c => test-common.c} | 0
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit f144a8ea840c6452c1fece2fd988b42a8ea7c5a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 02:54:42 2011 -0400
+
+    [icu] Add two-way script conversion functions
+
+    Also optimizes the common-direction script lookup.
+
+ src/hb-common.c   |   5 +-
+ src/hb-icu.cc     | 205
+ +++++++++++++++++++++++++++++-------------------------
+ src/hb-icu.h      |   9 +++
+ test/test-types.c |   2 +-
+ 4 files changed, 124 insertions(+), 97 deletions(-)
+
+commit 0809aadd4bbd5d0f256407def7cc10b79772a824
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 02:44:29 2011 -0400
+
+    [glib] Add two-way script conversion functions
+
+    Also optimizes the common-direction script lookup to be an array
+    lookup.
+
+ src/hb-glib.cc | 270
+ ++++++++++++++++++++++++++++++---------------------------
+ src/hb-glib.h  |   8 ++
+ 2 files changed, 148 insertions(+), 130 deletions(-)
+
+commit 5c8c1b680c4fa23c8574b9aebd21113e276f57a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 02:29:22 2011 -0400
+
+    Remove verbose comments
+
+ src/hb-glib.cc | 194 ++++++++++++++++++++---------------------
+ src/hb-icu.cc  | 266
+ ++++++++++++++++++++++++++++-----------------------------
+ 2 files changed, 230 insertions(+), 230 deletions(-)
+
+commit fb194b8794898f51eb596fa4092c26606889d376
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 02:00:47 2011 -0400
+
+    unicode: Cleanup implementation
+
+ src/Makefile.am                                    |   8 +-
+ src/hb-buffer-private.hh                           |   2 +-
+ src/{hb-glib.c => hb-glib.cc}                      |  65 +++----
+ src/{hb-icu.c => hb-icu.cc}                        |  30 +--
+ src/hb-ot-shape.cc                                 |  14 +-
+ src/hb-shape.cc                                    |   4 +-
+ ...{hb-unicode-private.h => hb-unicode-private.hh} |  65 ++++---
+ src/{hb-unicode.c => hb-unicode.cc}                | 213
+ +++++++++------------
+ src/hb-unicode.h                                   |  57 +++---
+ test/test-unicode.c                                |  23 ++-
+ 10 files changed, 237 insertions(+), 244 deletions(-)
+
+commit ecfb773829a5d98a4f5456a992f3e5ecd6731435
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 20 01:34:51 2011 -0400
+
+    Cosmetic
+
+ src/hb-unicode.h | 22 +++++++++-------------
+ 1 file changed, 9 insertions(+), 13 deletions(-)
+
+commit 2fd0c577e322ccbf762927bc4600b3ea31db4c80
+Author: Ryan Lortie <desrt@desrt.ca>
+Date:   Wed Apr 20 00:19:20 2011 -0400
+
+    [API] unicode: rework virtual functions for subclassing
+
+    Unicode data providers can now be subclassed, including support for
+    chain-up.  The interface should now be nicely bindable, as well.
+
+    Also fix glib unicode funcs that where broken after hb_script_t
+    changes.  Nicely caught by the test-unicode.c added in this commit.
+
+ src/hb-glib.c            | 186 ++++++++++++++++++++++++++++++++++++--
+ src/hb-icu.c             |  45 +++++++--
+ src/hb-ot-shape.cc       |   9 +-
+ src/hb-shape.cc          |   2 +-
+ src/hb-unicode-private.h |  17 ++++
+ src/hb-unicode.c         | 231
+ +++++++++++++++++++++++++----------------------
+ src/hb-unicode.h         |  68 +++++++-------
+ test/Makefile.am         |   1 +
+ test/test-unicode.c      | 215
+ +++++++++++++++++++++++++++++++++++++++++++
+ 9 files changed, 610 insertions(+), 164 deletions(-)
+
+commit f85faee9b3cb841ea977403945e2c877ab32b97a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 19 00:38:01 2011 -0400
+
+    [API] Rename hb_buffer_add_glyph() to hb_buffer_add()
+
+ src/hb-buffer.cc   | 10 +++++-----
+ src/hb-buffer.h    |  8 ++++----
+ test/test-buffer.c |  2 +-
+ 3 files changed, 10 insertions(+), 10 deletions(-)
+
+commit aab0de50e23727b69fa8c3d4e05c50c114c62835
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 19 00:32:19 2011 -0400
+
+    [API] Add hb_buffer_allocation_successful()
+
+    Returns the error status of the buffer.
+
+ src/hb-buffer.cc   | 6 ++++++
+ src/hb-buffer.h    | 6 ++++++
+ test/test-buffer.c | 2 +-
+ 3 files changed, 13 insertions(+), 1 deletion(-)
+
+commit 02a534b23f2d1e7475109563b9f61221ed020e8b
+Author: Ryan Lortie <desrt@desrt.ca>
+Date:   Fri Apr 15 18:34:45 2011 -0400
+
+    [API] Rename hb_buffer_ensure() to hb_buffer_pre_allocate()
+
+    The new name is self-documenting.
+
+ src/hb-buffer.cc | 4 ++--
+ src/hb-buffer.h  | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 70566befc59cfa8b9c43ac682749c40ea783b1dd
+Author: Ryan Lortie <desrt@desrt.ca>
+Date:   Fri Apr 15 18:32:36 2011 -0400
+
+    [API} hb_buffer_get_glyph_{infos,positions}: Add length out parameter
+
+    Return the length, whenever we return an array.  Makes it easier
+    on the
+    language bindings.
+
+ src/hb-buffer.cc                 | 12 ++++++++++--
+ src/hb-buffer.h                  |  6 ++++--
+ src/hb-ot-layout-gpos-private.hh |  4 ++--
+ src/hb-view.c                    |  4 ++--
+ test/test-buffer.c               |  7 ++-----
+ 5 files changed, 20 insertions(+), 13 deletions(-)
+
+commit 62879eebd9965179af8602ba29ac0a64a739b757
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 18 23:40:21 2011 -0400
+
+    [API] Use ISO 15924 tags for hb_script_t
+
+    This simplifies the code, reduces static data, and makes the design
+    more extensible to future additions of new scripts.
+
+ src/hb-common.c                    | 411
+ ++++---------------------------------
+ src/hb-common.h                    | 199 +++++++++---------
+ src/hb-ot-map.cc                   |   4 +-
+ src/hb-ot-shape-complex-private.hh |   3 +-
+ src/hb-ot-tag.c                    | 228 +++++++++-----------
+ src/hb-ot-tag.h                    |   6 +-
+ src/hb-shape.cc                    |   4 +-
+ test/test-types.c                  |   2 +-
+ 8 files changed, 252 insertions(+), 605 deletions(-)
+
+commit c0af193c8e25c4f11d23b8893e9ce1c2d2615bb2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 15 19:26:24 2011 -0400
+
+    Change buffer default properties to invalid
+
+    This includes HB_DIRECTION_INVALID and HB_SCRIPT_INVALID.
+
+    The INVALID will cause a "guess whatever from the text" in hb_shape().
+    While it's not ideal, it works better than the previous defaults at
+    least (HB_DIRECTION_LTR and HB_SCRIPT_COMMON).
+
+ src/hb-buffer-private.hh |  9 +++------
+ src/hb-buffer.cc         | 24 ++++++++++++++++--------
+ src/hb-view.c            |  6 ++----
+ test/test-buffer.c       |  4 ++--
+ 4 files changed, 23 insertions(+), 20 deletions(-)
+
+commit 00bec2c969555e76c3f84650a1d3c45308e585ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 15 19:16:54 2011 -0400
+
+    Move enum types to hb-common.h
+
+ src/hb-common.c  | 406
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-common.h  | 170 +++++++++++++++++++++++
+ src/hb-unicode.c | 406
+ -------------------------------------------------------
+ src/hb-unicode.h | 166 -----------------------
+ 4 files changed, 576 insertions(+), 572 deletions(-)
+
+commit 5dd4609f4da5674966a0169d9fa533ac5bc9f464
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 15 19:16:34 2011 -0400
+
+    [TODO] Add new item
+
+ TODO | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b54cd07b2623b68171e00179a9dc3ecbea7aa6a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 15 19:12:01 2011 -0400
+
+    Mark internal buffer variables private
+
+ src/hb-buffer.h | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 0e8d35c0932ddc20ebf430f2fd82c087da698954
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 15 19:07:10 2011 -0400
+
+    Add hb_script_from_string()
+
+ src/hb-unicode.c | 6 ++++++
+ src/hb-unicode.h | 4 ++++
+ src/hb-view.c    | 2 +-
+ 3 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 8f0d7e0c3fd4b05c43ac449be4f374dc2dc56127
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 15 18:59:56 2011 -0400
+
+    Remove hb_buffer_clear_positions(), add hb_ot_layout_position_start()
+
+ src/hb-buffer-private.hh |  6 +++++-
+ src/hb-buffer.cc         | 24 ++++++++++++------------
+ src/hb-buffer.h          |  5 +----
+ src/hb-ot-layout.cc      |  6 ++++++
+ src/hb-ot-layout.h       |  4 ++++
+ src/hb-ot-shape.cc       |  2 +-
+ 6 files changed, 29 insertions(+), 18 deletions(-)
+
+commit 2fc56edff6d64f190271454ccb1b5fd347d4f172
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 15 18:35:08 2011 -0400
+
+    [API] Remove hb_buffer_clear()
+
+    One should use hb_buffer_reset() really.
+
+ src/hb-buffer.cc   | 16 +++++-----------
+ src/hb-buffer.h    |  4 ----
+ test/test-buffer.c |  4 ----
+ 3 files changed, 5 insertions(+), 19 deletions(-)
+
+commit 7f5bdc80541cdc90aa1acafba5e9e0bd2df53ff4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 15 18:34:55 2011 -0400
+
+    [TODO] Remove done items
+
+ TODO | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 5814dfa3f5aa41bc3df06b78980d57d7bea0ba58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 15 14:41:04 2011 -0400
+
+    Cosmetic
+
+ src/hb-ot-shape.cc | 14 +++++++-------
+ src/hb-ot-shape.h  |  4 ++--
+ src/hb-shape.cc    | 20 ++++++++++----------
+ src/hb-shape.h     | 10 +++++-----
+ 4 files changed, 24 insertions(+), 24 deletions(-)
+
+commit cfbfeb88a6ec059ea97a6624e63cfacc642b685a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 15 12:40:40 2011 -0400
+
+    [TODO] Remove done items
+
+ TODO | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 3cbdf70e0a92f1c24e16c0d4dcfbec4ac59a77a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 15 12:32:06 2011 -0400
+
+    Make hb_language_t typesafe
+
+ src/hb-common.c | 18 +++++++++++-------
+ src/hb-common.h |  2 +-
+ 2 files changed, 12 insertions(+), 8 deletions(-)
+
+commit 2f2f448af35c232d18888c0e57cb21c9796ba7a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 15 11:45:14 2011 -0400
+
+    [test] Add more TODO items
+
+ test/test-buffer.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit c910bec863215f918c659f58debbc7fe5264d7b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 13 15:49:06 2011 -0400
+
+    Add hb_buffer_reset() and hb_buffer_set_length()
+
+ src/hb-buffer.cc | 31 +++++++++++++++++++++++++++++++
+ src/hb-buffer.h  | 15 ++++++++++++++-
+ 2 files changed, 45 insertions(+), 1 deletion(-)
+
+commit 69ea23cb5d47dd1cfd3129f68375021ef79bf63b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 13 15:02:40 2011 -0400
+
+    Minor
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7dea908cd582c8c25555015940065c69c1e7e65b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 13 01:35:58 2011 -0400
+
+    [test] Add todo items
+
+ test/test-buffer.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 07cbaac07d7f43437b171e9275430b5fb3097716
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 13 01:11:19 2011 -0400
+
+    [TODO] Add item re script iso15924 functions
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit d0f53fdbead15d9003b521b8ed47d02fd29a4c64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 13 01:09:09 2011 -0400
+
+    [test] Test hb-buffer.h
+
+ test/Makefile.am   |   8 ++-
+ test/test-buffer.c | 195
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 202 insertions(+), 1 deletion(-)
+
+commit 72d89404c2837d578f5305456c817130b6a15c73
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 13 01:07:42 2011 -0400
+
+    [TODO] Add item re hb_buffer_reset()
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5015c12dfb4de8525325178ae6def9e80fd83669
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 13 01:06:02 2011 -0400
+
+    [TODO] Add item re hb_buffer_resize()
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 9329ec92078d0e2d7bb04f683e0c6a582aab92f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 13 00:06:23 2011 -0400
+
+    [TODO] Add API item
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 4744379efc6063d94e15ff99381a7ab8b88ee567
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 19:47:33 2011 -0400
+
+    Minor
+
+ test/test-types.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9385caa8a693df0f06a511a71de9aa407637097c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 19:43:51 2011 -0400
+
+    [test] Actually hook up hb_script_t tests
+
+    I really shall find a way to automate the test enumeration.  Otherwise
+    it's too easy to add a test and wrongly hook it up.  Did it twice
+    today.
+
+ test/test-types.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8e4bb3cacc269ed32187aaaeaa166c64f41a0418
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 17:55:58 2011 -0400
+
+    Fold hb-language.[ch] into hb-common.[ch]
+
+ src/Makefile.am   |   2 -
+ src/hb-buffer.h   |   1 -
+ src/hb-common.c   |  92 ++++++++++++++++++++++++++++++++++++++++-
+ src/hb-common.h   |  42 +++++++++++++------
+ src/hb-language.c | 120
+ ------------------------------------------------------
+ src/hb-language.h |  46 ---------------------
+ src/hb-ot-tag.h   |   1 -
+ src/hb.h          |   1 -
+ 8 files changed, 120 insertions(+), 185 deletions(-)
+
+commit 09125576ca745b3393f3dc49071df891400bbdc9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 17:49:33 2011 -0400
+
+    [test] Test hb_language_t
+
+ test/test-types.c | 26 +++++++++++++++++++++++++-
+ 1 file changed, 25 insertions(+), 1 deletion(-)
+
+commit 316b7a1afb84a5dfeaed886a585669b4d549c9b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 17:49:10 2011 -0400
+
+    Make hb_language_from_string("") return NULL language
+
+ src/hb-language.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit db60c96f20426111ffa71e9802ef6e248f8b28d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 16:17:02 2011 -0400
+
+    [teset] Test hb_script_t
+
+ test/hb-test.h    |  8 ++++++++
+ test/test-types.c | 35 ++++++++++++++++++++++++++++++++++-
+ 2 files changed, 42 insertions(+), 1 deletion(-)
+
+commit 99b74760a4cddc798ab44b5ca897486bbb9c76d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 15:47:40 2011 -0400
+
+    Rename hb_category_t to hb_unicode_general_category_t
+
+ src/hb-glib.c                     |  2 +-
+ src/hb-icu.c                      | 64
+ ++++++++++++++++++-------------------
+ src/hb-ot-shape-complex-arabic.cc |  8 ++---
+ src/hb-ot-shape-private.hh        |  2 +-
+ src/hb-ot-shape.cc                |  2 +-
+ src/hb-unicode.c                  |  4 +--
+ src/hb-unicode.h                  | 66
+ +++++++++++++++++++--------------------
+ 7 files changed, 74 insertions(+), 74 deletions(-)
+
+commit 4188096a7722f09ffa9319986c0286071da10a27
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 14:58:28 2011 -0400
+
+    Make HB_TAG_CHAR4 private
+
+    It's just sugar.
+
+ src/hb-common.h   | 5 +----
+ src/hb-private.h  | 7 ++++++-
+ test/test-types.c | 2 --
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 7ff7401c9237cda661869c1cb196d685706ac4e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 13:27:30 2011 -0400
+
+    Make hb_tag_from_string(NULL) return HB_TAG_NONE
+
+ src/hb-common.c   | 3 +++
+ test/test-types.c | 3 +++
+ 2 files changed, 6 insertions(+)
+
+commit 02f6e62d6cabc7808c188daef26a1fe7ac626b1f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 13:27:21 2011 -0400
+
+    Build fix
+
+ test/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit db5227c40e5c35fe2ffb750f32b639cb44424a1d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 13:16:08 2011 -0400
+
+    Move macros around
+
+ src/hb-ot-tag.c  | 6 ++----
+ src/hb-private.h | 7 +++++++
+ 2 files changed, 9 insertions(+), 4 deletions(-)
+
+commit 07233581c9d953708d3c020907c42b8b89472b89
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 13:12:37 2011 -0400
+
+    Rename HB_TAG_STR() to HB_TAG_CHAR4()
+
+    The problem with HB_TAG_STR() was that it expected a string of size 4
+    exactly, and unlike hb_tag_from_string() it doesn't pad the tag with
+    space characters.  So, the new name is more appropriate.
+
+ src/hb-common.c   | 2 +-
+ src/hb-common.h   | 8 ++++----
+ src/hb-ot-tag.c   | 2 +-
+ test/test-types.c | 2 +-
+ 4 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 9faa980067f802f712c2adf8263152ed40c98088
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 12:46:49 2011 -0400
+
+    Add an in-tree test suite
+
+    Uses the glib testing framework.  Wrote unit tests for hb-common.h
+    types.
+
+ Makefile.am        |   2 +-
+ test/Makefile.am   |  18 +++++++++
+ test/Makefile.decl |  90 ++++++++++++++++++++++++++++++++++++++++++++
+ test/hb-test.h     |  67 +++++++++++++++++++++++++++++++++
+ test/test-types.c  | 108
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 284 insertions(+), 1 deletion(-)
+
+commit d77b76200efbaa0611691920f9f2018b1e8be340
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 12:29:52 2011 -0400
+
+    Add few more paratheses to the HB_TAG macro
+
+    Never hurts.
+
+ src/hb-common.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b13640de6992de9ee9d07e3581c33b8181b70ff9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 12:29:31 2011 -0400
+
+    A few more ASSERTs
+
+ src/hb-private.h | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit ae9eeaff9300f3bb7bed588c5478e8e5461b3df0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 11:49:08 2011 -0400
+
+    Remove warning message from public header file
+
+    Since we now assert thos in hb-private.h, the int types cannot
+    be wrong.
+    (Except for when someone else includes hb-common.h in a very broken
+    configuration, but that's not our problem!)
+
+    Plus, we don't use inline in the public headers, so remove that too.
+
+ src/hb-common.h  | 7 -------
+ src/hb-private.h | 4 ++++
+ 2 files changed, 4 insertions(+), 7 deletions(-)
+
+commit 6fd5364bdc3a2b459175377e9e16c86cff054232
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 11 11:47:14 2011 -0400
+
+    Assert int types
+
+ src/hb-private.h | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit bbdeff59646e5502b9fc53ab1761b3f014ee276c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 7 16:05:07 2011 -0400
+
+    Add test directory
+
+ configure.ac     | 1 +
+ test/Makefile.am | 0
+ 2 files changed, 1 insertion(+)
+
+commit 4accc92afc702177ea53280d977cec839af3c12c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 7 15:53:26 2011 -0400
+
+    Update TODO items
+
+ TODO | 31 ++++++++++++++++++++-----------
+ 1 file changed, 20 insertions(+), 11 deletions(-)
+
+commit a71b9c8579d73aea4549f12524bbc2e89f43b5c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 6 14:04:56 2011 -0400
+
+    Disable 'cswh' by default except for Arabic shaper
+
+    That better matches OpenType spec.  Note that we enable it for all
+    Arabic-shaper scripts.  Ie. we enable it by default for Syriac too,
+    but the SyriacOT spec does not require it.  I think this is a more
+    useful compromise than special-casing for Arabic script alone.
+
+ src/hb-ot-shape-complex-arabic.cc | 3 +++
+ src/hb-ot-shape.cc                | 1 -
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit cab6f65bba560ac1651d9152f1ecf12eb88eca74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 4 15:36:51 2011 -0400
+
+    [hb-view] setlocale (LC_ALL, "")
+
+    For now we don't use anything from the locale, but we should default
+    to using $LANG, etc, if --language is not specified.  Right?
+
+ src/hb-view.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit fb9ca1bfabde7da0c274e7a1bd12bffaf7949c18
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 4 14:50:09 2011 -0400
+
+    [hb-view] Rewrite --features parsing, with range support
+
+    The --features parsing handles errors now.  More importantly, it
+    allos limiting individual features to specific byte ranges.  The
+    format is Python-esque.  Here is how it all works:
+
+      Syntax:       Value:  Start:  End:
+
+    Setting value:
+      "kern"        1       0       ∞       # Turn feature on
+      "+kern"       1       0       ∞       # Turn feature off
+      "-kern"       0       0       ∞       # Turn feature off
+      "kern=0"      0       0       ∞       # Turn feature off
+      "kern=1"      1       0       ∞       # Turn feature on
+      "kern=2"      2       0       ∞       # Choose 2nd alternate
+
+    Setting index:
+      "kern[]"      1       0       ∞       # Turn feature on
+      "kern[:]"     1       0       ∞       # Turn feature on
+      "kern[5:]"    1       5       ∞       # Turn feature on, partial
+      "kern[:5]"    1       0       5       # Turn feature on, partial
+      "kern[3:5]"   1       3       5       # Turn feature on, range
+      "kern[3]"     1       3       3+1     # Turn feature on, single char
+
+    Mixing it all:
+
+      "kern[3:5]=0" 1       3       5       # Turn feature off for range
+
+ src/hb-view.c | 169
+ +++++++++++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 132 insertions(+), 37 deletions(-)
+
+commit ccc6745afaa68ce7497a6cd02ce85986d3c863d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 4 14:49:50 2011 -0400
+
+    [hb-view] Use cached hb-ft face creation
+
+    Avoids recreating the face the second time we call draw().
+
+ src/hb-view.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1b4a2cc095d165dc573e0235f00fbbf2a5d3c2c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 4 14:45:28 2011 -0400
+
+    [hb-view] Add --debug
+
+    Frees all allocated memory before exiting.  Useful for valgrind run.
+
+ src/hb-view.c | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+commit b2da26d1e32a012f7feaad7c7cced61e4fb269f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 1 15:48:43 2011 -0400
+
+    [hb-view] Support --features
+
+    Accepts values like:
+
+      --features="-mkmk,aalt=2,calt=1,+cswh"
+
+    A minus sign means "=0", a plus sign means "=1".  Default is "=1".
+    A minus sign overrides an explicit value.
+
+ src/hb-view.c | 70
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 68 insertions(+), 2 deletions(-)
+
+commit f48ff19b629070d13cee3c0eeeb06c98992f93c6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 1 14:19:10 2011 -0400
+
+    Sort options for clarity
+
+ src/hb-view.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 5d91c3d547f78163b36aa7436d4388a836cca94a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 16 17:36:32 2011 -0300
+
+    Add script to/from ISO 15924 tag support
+
+    Also adds --script support to hb-view.
+
+    If a script tag is not known to us, we pass the ISO 15924 tag around.
+    Right now, the OT layer ignores that, but we can fix it to blindly
+    convert that to an OT script tag.
+
+ src/hb-ot-tag.c  |   4 +
+ src/hb-unicode.c | 273
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-unicode.h |   8 +-
+ src/hb-view.c    |  10 +-
+ 4 files changed, 293 insertions(+), 2 deletions(-)
+
+commit 3286fc0e9adc3f2874c9409e7fdb09e4d2b7dda1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 16 14:53:32 2011 -0300
+
+    Let hb_shape() guess script and direction...
+
+    - Rename HB_SCRIPT_INVALID_CODE to HB_SCRIPT_INVALID
+
+    - Add HB_DIRECTION_INVALID
+
+    - Make hb_script_get_horizontal_direction() public
+
+    - Make hb_shape() guess script from buffer text (first non-common
+      non-inherit script) if buffer script is set to HB_SCRIPT_INVALID
+      (this
+      is NOT the default.)
+
+    - Make hb_shape() guess direction from buffer script if buffer
+    direction
+    is set to HB_DIRECTION_INVALID (this is NOT the default.)
+
+    - Make hb-view.c set INVALID script and direction on the buffer.
+
+    The above changes are meant to make hb-view fairly useful for
+    uni-script
+    uni-direction text.  The guessing behavior however is NOT the
+    default of
+    hb_shape() and must be asked for explicitly.  This is intended,
+    because
+    the guess is not a suitable substitute to full-fledged bidi and script
+    segmentation.  It's just a testing tool.
+
+ src/hb-common.h          |  3 ++-
+ src/hb-icu.c             |  2 +-
+ src/hb-ot-shape.cc       |  3 ++-
+ src/hb-shape.cc          | 52
+ ++++++++++++++++++++++++++++++++++++++++++------
+ src/hb-unicode-private.h |  4 ----
+ src/hb-unicode.c         |  2 +-
+ src/hb-unicode.h         |  8 +++++++-
+ src/hb-view.c            |  4 ++--
+ 8 files changed, 61 insertions(+), 17 deletions(-)
+
+commit b7b29684df67af7280b74ca4cf18f02ad6521bdc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 2 01:01:03 2011 -0500
+
+    [hb-view] Handle write_to_png errors
+
+ src/hb-view.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit c2cb98c8185c5560cfd04de7ee7c64c9496b986c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 1 23:18:09 2011 -0500
+
+    [hb-view] Link with -lm
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b5dd44e24669cd35affcd92788d39ff56cac94db
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 28 10:13:52 2011 -0800
+
+    Fix possible overflow
+
+ src/hb-buffer.cc | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+commit a4b781e93a0bee0549611e129b3564d9804d9090
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 23 12:47:56 2011 -0500
+
+    Default background color shall either be white or transparent
+
+    Definitely not black!
+
+ src/hb-view.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5353bf439c150492708ef9337078cfd73b83627b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 22 18:06:19 2011 -0500
+
+    Add initial hb-view tool
+
+    Currently doesn't handle script or direction.
+
+ configure.ac    |  18 +++
+ src/Makefile.am |  14 +++
+ src/hb-view.c   | 342
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 374 insertions(+)
+
+commit 82438c6ad5f60b6afc75c48cef72e18bef532468
+Author: Bradley Grainger <bgrainger@logos.com>
+Date:   Tue Feb 15 18:37:29 2011 -0500
+
+    Fix #pragma message for MSVC.
+
+    __LOC__ was renamed to _HB__LOC__ in cd7555 but the corresponding
+    change wasn't made in hb-private.h.
+
+ src/hb-private.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ba9ab8d6d9c863662c4b44ace4a4d89e29e592f2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 10 07:45:41 2011 -0500
+
+    Fix language extension matching
+
+ src/hb-ot-tag.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a07874300a669ec0ea09a67df2a3ee8b0612d6b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 10 02:27:49 2011 -0500
+
+    Don't use the m4/ dir
+
+    We just require people to have libtool, pkg-config, etc installed
+    when running autogen.sh
+
+ Makefile.am  | 2 --
+ configure.ac | 1 -
+ 2 files changed, 3 deletions(-)
+
+commit 7bbe14bed8a886ea5b293c927c4bf937cbfc6f51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 9 22:29:14 2011 -0500
+
+    Fix 'make distcheck'
+
+ src/Makefile.am | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 2abe1264a580858bf7803af1701117a462375fb4
+Author: Javier Jardón <jjardon@gnome.org>
+Date:   Sun Jan 9 22:18:53 2011 -0500
+
+    Bug 31174 - Update autotools configuration
+
+ Makefile.am  |   2 +
+ autogen.sh   | 188
+ ++++-------------------------------------------------------
+ configure.ac |  22 +++++--
+ 3 files changed, 29 insertions(+), 183 deletions(-)
+
+commit cc1a8a938b4c13e76b58825a9e1951c4134e634a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 6 14:58:52 2011 -0500
+
+    Fix ChanContext backtrack matching with GPOS
+
+    Reported on mailing list by Keith Stribley and Khaled Hosny.
+
+ src/hb-buffer-private.hh             | 5 +++--
+ src/hb-buffer.cc                     | 2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 6 +++---
+ 3 files changed, 7 insertions(+), 6 deletions(-)
+
+commit 1c3183027fe823cd673866ba29d169b69f8efba1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 6 14:44:14 2011 -0500
+
+    Remove unused realloc
+
+    We always allocate and grow str and pos together.
+
+ src/hb-buffer.cc | 6 ------
+ 1 file changed, 6 deletions(-)
+
+commit 76691f0240d6de230e9b42280b54e91639464635
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 6 14:16:59 2011 -0500
+
+    Fix ICU detection
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 756f794a1fce701092345a3f9afae039583fb55b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 26 20:52:40 2010 -0500
+
+    Remove Graphite backend
+
+    It was unmaintained and the code has to be replaced to use the new
+    grphite-ng code base.
+
+ configure.ac       |   6 --
+ src/Makefile.am    |  14 ---
+ src/hb-graphite.cc | 310
+ -----------------------------------------------------
+ src/hb-graphite.h  |  47 --------
+ 4 files changed, 377 deletions(-)
+
+commit f3d9d9879364609502d9d3a3a9f4647adb167d78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 22 01:39:29 2010 -0500
+
+    Docs
+
+ src/hb-unicode.h | 60
+ ++++++++++++++++++++++++++++----------------------------
+ 1 file changed, 30 insertions(+), 30 deletions(-)
+
+commit d86a5b3c5752abcc791724035ba4115958e6b5e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 21 18:36:25 2010 -0500
+
+    Bug 32274 - classic mongolian shaper
+
+    Add support for classic Mongolian script to the Arabic shaper.
+
+    Still work to be done around U+180E MONGOLIAN VOWEL SEPARATOR as it
+    should not be included in the final glyph stream the same way that
+    ZWNJ, etc should not appear in the final glyph stream.
+
+    But the joining part should be done.
+
+    There remains the question of how should the U+18A9 MONGOLIAN
+    LETTER ALI
+    GALI DAGALGA be handled as it has General Category NSM but a letter
+    nonetheless.  For now, our generic logic makes this a joining
+    T instead
+    of joining D as other Mongolian letters are.
+
+ src/hb-ot-shape-complex-arabic.cc  | 8 ++++++++
+ src/hb-ot-shape-complex-private.hh | 1 +
+ 2 files changed, 9 insertions(+)
+
+commit b0e7378fa9a4fc6fc74d9b3c27d927602eaacc5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 21 14:19:32 2010 -0500
+
+    Reroute Mandaic shaping through the Arabic shaper
+
+    We added Mandaic joining data to the Arabic shaper a while ago, but
+    were not actually using the Arabic shaper for Mandaic.  Fixed.
+
+ src/hb-ot-shape-complex-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 88e7f37488e4e8590619d815b975232a0c9d2ea0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 21 14:18:24 2010 -0500
+
+    Annotate the Arabic joining table with block information
+
+ src/gen-arabic-joining-table.py        | 93
+ +++++++++++++++++++++-------------
+ src/hb-ot-shape-complex-arabic-table.h | 24 +++++++--
+ 2 files changed, 80 insertions(+), 37 deletions(-)
+
+commit 1482a39e56cd4151874e5c073540274349240a87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 17 20:15:05 2010 -0500
+
+    Rename remaining metrics uses to extents
+
+ src/hb-font.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 22c537657cee1f47a4056a21e2cddfcbe6ab1c01
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 14 23:51:29 2010 -0500
+
+    Rename TableDirectory to TableRecord as per OpenType 1.6
+
+ src/hb-open-file-private.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 33e8b86197239e667a887709104357bdc6566b7c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 13 15:54:56 2010 -0500
+
+    Update 'head' table to OpenType 1.6
+
+ src/hb-ot-head-private.hh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit b7683335146bfe3a74d9419db92cd7a8019a9c10
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 13 14:22:35 2010 -0500
+
+    Disallow ligature substitutions replacing one glyph
+
+ src/hb-ot-layout-gsub-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7eb875118dc31e9fb0e23c45985396a8bfe977e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 13 14:13:35 2010 -0500
+
+    Mozilla Bug 618592 - freeze on typekit
+
+    Fix apply_lookup() for zero-input broken fonts.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit bbbbe80ec9bc45c5b685bc09c8f993e98496555c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 7 16:22:02 2010 -0500
+
+    Rename original_direction to target_direction
+
+ src/hb-ot-shape-private.hh | 2 +-
+ src/hb-ot-shape.cc         | 6 +++---
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit ee8aaf976a6eb42be49b63b4c51c7a0a338e0298
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 7 16:20:42 2010 -0500
+
+    Fix arabic shaping of LTR text
+
+    We should ensure-direction before doing any complex work.  The only
+    exception is mirroring that needs to see the original / final
+    direction,
+    not the native.  Handle that.
+
+ src/hb-ot-shape.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit d1f1707adc03317760b0f75e04d0f3dd425e547f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 30 00:57:15 2010 -0500
+
+    Bug 31965 - some GNU/Linux distributions lack icu.pc but have
+    icu-config
+
+    Patch from suzuki toshiya.
+
+ configure.ac | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit 3c48982be6b2286088541ee55cac78b0f2b6e771
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 28 19:39:47 2010 -0500
+
+    Adjust pyx files to reflect change from int to hb_var_int_t
+
+    Patch from Thomas Hunger.
+
+ contrib/python/lib/harfbuzz.pyx | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit 4f9e4a40bc248aeb1364ed6f4aa7f392aa364497
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 22 11:30:32 2010 -0500
+
+    Fix failing checks
+
+ src/hb-ot-shape-complex-arabic-table.h | 37
+ ++++++++++++++++++++++++++++++++++
+ 1 file changed, 37 insertions(+)
+
+commit 9da26d6669e7f3b91ba37e71f6f8a6e2ea806688
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 22 11:03:18 2010 -0500
+
+    Remove email address from Copyright headers
+
+ COPYING      | 2 +-
+ src/hb-ft.c  | 2 +-
+ src/hb-icu.c | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit a45f00019242734fca742adeb2ed507305baeda6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 18 13:58:32 2010 -0500
+
+    Clarify copyright notice
+
+ COPYING                 | 12 ++++++++++++
+ README                  |  4 ++--
+ src/hb-graphite.cc      |  4 ++--
+ src/hb-object-private.h |  2 +-
+ 4 files changed, 17 insertions(+), 5 deletions(-)
+
+commit 0884a8d9cd576f116400b3f7c8815e747c315d5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 17 16:58:21 2010 -0500
+
+    Move generated table to its own file
+
+ src/Makefile.am                        |   1 +
+ src/hb-ot-shape-complex-arabic-table.h | 619
+ ++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-arabic.cc      | 621
+ +--------------------------------
+ 3 files changed, 621 insertions(+), 620 deletions(-)
+
+commit 14d784116b08685425e4ddcb1c1f813dbe2b2986
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 17 16:52:58 2010 -0500
+
+    Update Arabic joining table to include Mandaic
+
+    Mandaic was added to Unicode 6.0, but the joining data was not
+    updated.
+    Draft ArabicShaping.txt from 6.1 includes the joining data for
+    Mandaic.
+    Use that.
+
+ src/gen-arabic-joining-table.py   |  45 ++++++++++----
+ src/hb-ot-shape-complex-arabic.cc | 123
+ ++++++++++++++++++++++++++++++++------
+ 2 files changed, 137 insertions(+), 31 deletions(-)
+
+commit 43bf2f7f1ec427c431e2ee2fd1a9345e7d5c9718
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 17 14:49:40 2010 -0500
+
+    Add OpenType script tags for Unicode 5.2 and Unicode 6.0 scripts
+
+    Based on tags proposed by Microsoft for inclusion in OpenType.
+
+ src/hb-ot-tag.c | 34 +++++++++++++++++-----------------
+ 1 file changed, 17 insertions(+), 17 deletions(-)
+
+commit afab01cf7caca79cf6dfabe6827d1703be1a74f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 17 14:35:34 2010 -0500
+
+    Add Unicode 6.0 scripts
+
+ src/hb-icu.c     | 6 ++++++
+ src/hb-ot-tag.c  | 7 ++++++-
+ src/hb-unicode.c | 7 ++++++-
+ src/hb-unicode.h | 7 ++++++-
+ 4 files changed, 24 insertions(+), 3 deletions(-)
+
+commit f234b68d18d956f7e4eb4bf58d6dc408d9e5146e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 17 14:25:44 2010 -0500
+
+    Change HB_SCRIPT_MEITEI_MAYEK to HB_SCRIPT_MEETEI_MAYEK
+
+    The new name matches the Unicode name.  Reported by Jonathan Kew.
+
+ src/hb-icu.c     | 2 +-
+ src/hb-ot-tag.c  | 2 +-
+ src/hb-unicode.h | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 3ca9a6d1cffe950b325e1d522b20d4a645ae448e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 17 13:08:47 2010 -0500
+
+    Add TODO item
+
+ TODO | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 300cb41417d40473268e3b4089bed24e9e77a753
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 17 12:57:23 2010 -0500
+
+    Add XXX marks
+
+ src/hb-ot-layout-gsubgpos-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit ea00aee9f94ae8c6cf03d620254817d5e1f51d64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 5 10:51:37 2010 -0400
+
+    Add TODO item
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 3a852ae7fe6edfaadd75625d27515a3689503395
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 3 16:37:24 2010 -0400
+
+    Save general category and combining class in the buffer for reuse
+
+ src/hb-ot-layout-private.hh       |  3 ++-
+ src/hb-ot-shape-complex-arabic.cc | 16 ++++++++++------
+ src/hb-ot-shape-private.hh        |  6 ++++++
+ src/hb-ot-shape.cc                | 26 +++++++++++++++++++++-----
+ 4 files changed, 39 insertions(+), 12 deletions(-)
+
+commit a5ab682b9ba8224fc132624f93e6fef9973a68ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 3 15:50:36 2010 -0400
+
+    More "unreached code" warning fixes
+
+    Ugly :(.
+
+ src/hb-blob.c | 48 ++++++++++++++++++++++++------------------------
+ 1 file changed, 24 insertions(+), 24 deletions(-)
+
+commit 4e22c7e94102c9f00c32b8cb6aaa832f83909149
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 3 15:47:12 2010 -0400
+
+    Add comment
+
+ src/hb-ot-layout-common-private.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 0342034d1cb577d34b42f7204da7fb930c12a464
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 3 15:40:07 2010 -0400
+
+    Pedantic
+
+ src/hb-ot-layout-gpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4a2d844c2f12dc1b858ab4ddd737ded7c0852221
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 3 15:28:56 2010 -0400
+
+    Minor code shuffling
+
+ src/hb-ot-layout-private.hh | 21 +++-------------
+ src/hb-ot-layout.cc         | 61
+ +++++++++++++++++++++++++++++++++------------
+ 2 files changed, 48 insertions(+), 34 deletions(-)
+
+commit 11e3ec444a85fc72541823c2e98cc92c4ceb19af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 3 15:11:04 2010 -0400
+
+    Fix a few more "unreachable code" warnings
+
+ src/hb-blob.c                        |  2 +-
+ src/hb-object-private.h              | 12 +++---
+ src/hb-open-type-private.hh          | 84
+ +++++++++++++++++-------------------
+ src/hb-ot-layout-gsubgpos-private.hh |  2 +-
+ src/hb-private.h                     |  3 +-
+ 5 files changed, 49 insertions(+), 54 deletions(-)
+
+commit 2304856340782c72cb30873f7907191dc359e921
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 3 12:46:58 2010 -0400
+
+    Remove another couple lines of dead code
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit b8783c85ac5dd9ea8f5a66eacb92dfcfbf649a6d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 3 11:50:21 2010 -0400
+
+    Fix unreachable-code warning
+
+ src/hb-ot-layout-gpos-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit c2709119c8c610a0d4d71884a7d4fdba7cb65b72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 23:18:51 2010 -0400
+
+    Move things around some more
+
+ src/hb-ot-layout-gpos-private.hh     | 8 ++++----
+ src/hb-ot-layout-gsub-private.hh     | 4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 9 +++++++--
+ src/hb-ot-layout-private.hh          | 7 +++----
+ src/hb-ot-layout.cc                  | 6 +++---
+ 5 files changed, 19 insertions(+), 15 deletions(-)
+
+commit 194d4566ec054db03fa31d369a9f1c6cf4941e74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 23:09:10 2010 -0400
+
+    Move buffer var allocation local
+
+ src/hb-ot-layout-gpos-private.hh | 19 ++++++++++++++-----
+ src/hb-ot-layout-private.hh      |  2 --
+ 2 files changed, 14 insertions(+), 7 deletions(-)
+
+commit 1e7c1fcbc33599faefc32d4a28e5d8506d2c56fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 22:48:31 2010 -0400
+
+    Move code around
+
+ src/hb-ot-layout-gpos-private.hh | 59
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout.cc              | 59
+ ++--------------------------------------
+ src/hb-ot-layout.h               |  4 +--
+ src/hb-ot-shape.cc               |  2 +-
+ 4 files changed, 63 insertions(+), 61 deletions(-)
+
+commit bf94b3ad22b2fe4730d4e64d673c63154fc5b5fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 22:37:59 2010 -0400
+
+    Move some more code around
+
+ src/hb-ot-layout-gdef-private.hh | 21 +++++++++++++++
+ src/hb-ot-layout-private.hh      | 27 ++++++++++++++++---
+ src/hb-ot-layout.cc              | 56
+ ++++++----------------------------------
+ 3 files changed, 52 insertions(+), 52 deletions(-)
+
+commit 6334658fe79d6acfb46a2a147721b78f92510ebb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 22:11:32 2010 -0400
+
+    Simplify mark skipping logic
+
+ src/hb-ot-layout.cc | 17 +++--------------
+ 1 file changed, 3 insertions(+), 14 deletions(-)
+
+commit 8c69e65abed961002d90024c92e18538c6516262
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 22:07:49 2010 -0400
+
+    Rename lookup_flags to lookup_props since it's more than just flags
+
+ src/hb-ot-layout-common-private.hh   |  6 +++++-
+ src/hb-ot-layout-gpos-private.hh     | 14 +++++++-------
+ src/hb-ot-layout-gsub-private.hh     |  8 ++++----
+ src/hb-ot-layout-gsubgpos-private.hh | 10 +++++-----
+ src/hb-ot-layout-private.hh          |  4 ++--
+ src/hb-ot-layout.cc                  | 36
+ ++++++++++++++++++------------------
+ src/main.cc                          |  4 ++--
+ 7 files changed, 43 insertions(+), 39 deletions(-)
+
+commit 98370e89d1bff248737b482d129c2a4deb8bfd95
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 17:39:01 2010 -0400
+
+    WIP removing external synthesized GDEF support and implementing
+    it internally
+
+ TODO                                 |   2 -
+ src/hb-buffer-private.hh             |   4 -
+ src/hb-buffer.cc                     |   3 -
+ src/hb-ot-layout-common-private.hh   |   8 +-
+ src/hb-ot-layout-gdef-private.hh     |   6 +-
+ src/hb-ot-layout-gpos-private.hh     |   4 +-
+ src/hb-ot-layout-gsub-private.hh     |  66 ++++++-----------
+ src/hb-ot-layout-gsubgpos-private.hh |  29 +++++++-
+ src/hb-ot-layout-private.hh          |  29 +++-----
+ src/hb-ot-layout.cc                  | 138
+ +++++------------------------------
+ src/hb-ot-layout.h                   |  26 -------
+ src/hb-ot-shape.cc                   |  10 +++
+ 12 files changed, 98 insertions(+), 227 deletions(-)
+
+commit 870e2d6eac01d004c72a925ea93e6823251d5fa2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 17:37:20 2010 -0400
+
+    Remove unused function
+
+ src/hb-buffer-private.hh | 10 ----------
+ src/hb-buffer.cc         | 27 ---------------------------
+ 2 files changed, 37 deletions(-)
+
+commit 1115890b90709fa5329a55d22f543020f3df9f6f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 17:07:04 2010 -0400
+
+    More cleanup
+
+ src/hb-buffer-private.hh    | 5 +----
+ src/hb-ot-layout-private.hh | 6 ++++++
+ 2 files changed, 7 insertions(+), 4 deletions(-)
+
+commit dbf56b1d94910f04823e53e39ace1e5145bddc04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 17:06:12 2010 -0400
+
+    More lig-id cleanup
+
+ src/hb-buffer-private.hh         | 4 ++--
+ src/hb-buffer.cc                 | 2 +-
+ src/hb-ot-layout-gsub-private.hh | 8 +++++++-
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit f6a23a0b9171958f76c1d0473b09fc08d2b3a0d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 17:01:03 2010 -0400
+
+    More removal of lig-id code from buffer
+
+ src/hb-buffer.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit dd2ffd282c059194fd87fb1664e2e0cdb56a87a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 16:57:01 2010 -0400
+
+    Minor renaming
+
+ src/hb-buffer-private.hh         | 41
+ ++++++++++++++++++++--------------------
+ src/hb-buffer.cc                 | 20 ++++++++++----------
+ src/hb-ot-layout-gsub-private.hh |  8 ++++----
+ src/hb-ot-shape.cc               |  6 +++---
+ 4 files changed, 37 insertions(+), 38 deletions(-)
+
+commit fe263272a2b26204bc39829a94d90ab537517f3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 16:51:02 2010 -0400
+
+    Move setting lig_id/component out of buffer and to the gsub code
+
+ src/hb-buffer-private.hh         | 30 +++++++----------------
+ src/hb-buffer.cc                 | 52
+ +++++++---------------------------------
+ src/hb-ot-layout-gsub-private.hh | 27 ++++++++++++---------
+ 3 files changed, 34 insertions(+), 75 deletions(-)
+
+commit 2e2b2480c01c788ea702d78ca830c2bb659654a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 16:25:28 2010 -0400
+
+    Always allocate new ligature id
+
+    No practical point in reusing ligature ids.
+
+ src/hb-ot-layout-gsub-private.hh | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit bf07d5a29c61baf6fd683289c7764f487ad7e413
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 16:19:13 2010 -0400
+
+    Set component=0 for ligature glyph
+
+ src/hb-ot-layout-gsub-private.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 37ab877149582c7ce7416425bb402340e3f948a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 15:38:06 2010 -0400
+
+    Remove comment
+
+ src/hb-buffer.cc | 20 --------------------
+ 1 file changed, 20 deletions(-)
+
+commit 88474c6fdaf35c56368694a5b164f4988a004d49
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 14:42:15 2010 -0400
+
+    Get rid of the OpenType-specific internal buffer representation
+
+    Add variant integers to buffer item types.  More cleanup coming.
+
+ TODO                              |  2 --
+ src/hb-buffer-private.hh          | 35 ++++++----------------
+ src/hb-buffer.cc                  | 62
+ +++++++++++++++++++--------------------
+ src/hb-buffer.h                   |  2 +-
+ src/hb-ot-layout-gpos-private.hh  | 24 +++++++--------
+ src/hb-ot-layout-gsub-private.hh  |  2 +-
+ src/hb-ot-layout-private.hh       |  4 +--
+ src/hb-ot-layout.cc               | 39 ++++++++++++------------
+ src/hb-ot-shape-complex-arabic.cc |  8 ++---
+ 9 files changed, 79 insertions(+), 99 deletions(-)
+
+commit 6cb8c3493019e1497921666fc268cb81943f9f1f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 14:27:03 2010 -0400
+
+    Add hb_var_int_t
+
+ src/hb-buffer.h |  6 +++---
+ src/hb-common.h | 10 ++++++++++
+ 2 files changed, 13 insertions(+), 3 deletions(-)
+
+commit f22802431a983bd4bc60a7653b1103973c3475cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 2 19:12:37 2010 -0400
+
+    Remove trailing comma
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 13528d0c78cadb1f67267c9a692558caef9fdaa6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 14:09:27 2010 -0400
+
+    Supposedly implement vertical support in GPOS
+
+    Not tested at all.
+
+ src/hb-ot-layout-gpos-private.hh | 27 ++++++++++++++++++++-------
+ src/hb-ot-layout.cc              | 39
+ ++++++++++++++++++++++++---------------
+ 2 files changed, 44 insertions(+), 22 deletions(-)
+
+commit 9624de5b496846cd89ee4f7b07d38029aca70ce1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 13:44:59 2010 -0400
+
+    Clarify cursive_chain (and change its sign)
+
+ src/hb-ot-layout-gpos-private.hh |  4 ++--
+ src/hb-ot-layout.cc              | 13 +++++++------
+ 2 files changed, 9 insertions(+), 8 deletions(-)
+
+commit d6c9eadb88240c40b3cb9a33f067e575cbc2f729
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 12:34:50 2010 -0400
+
+    Remove more pointless LONGTERMTODO items
+
+ src/hb-ot-layout-common-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit e204674fe340a57c48a9fe7e1ed02a9a08f4aca4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 12:32:02 2010 -0400
+
+    Rename hb_ot_layout_get_lig_carets() to
+    hb_ot_layout_get_ligature_carets()
+
+ src/hb-ot-layout.cc | 14 +++++++-------
+ src/hb-ot-layout.h  | 14 +++++++-------
+ 2 files changed, 14 insertions(+), 14 deletions(-)
+
+commit 3357d145f81cb7b746c910018fe3a0dfab00972c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 12:30:46 2010 -0400
+
+    Implement vertical support in get_lig_carets()
+
+ src/hb-ot-layout-gdef-private.hh | 34 ++++++++++++++++++----------------
+ src/hb-ot-layout.cc              |  3 ++-
+ src/hb-ot-layout.h               |  1 +
+ 3 files changed, 21 insertions(+), 17 deletions(-)
+
+commit 8eeed7eddc789151cbffe62ed6bfd77612266bf1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 12:07:49 2010 -0400
+
+    Remove LONGTERMTODO item that I'll never fix
+
+ src/hb-ot-layout-gsubgpos-private.hh | 6 ------
+ 1 file changed, 6 deletions(-)
+
+commit 184a5279c64f37bc2ceefbe2191bb64ca87f88d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 12:00:49 2010 -0400
+
+    Remove unused macro
+
+ src/hb-ot-layout-gpos-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit af5d02a269d55331300df1e382241893928d64e0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 11:54:26 2010 -0400
+
+    Rewrite Cursive joining to act more like other pair lookups
+
+    Look forward for next character instead of joining to the last
+    character.
+
+ src/hb-ot-layout-gpos-private.hh | 71
+ ++++++++++++++++++----------------------
+ src/hb-ot-layout-private.hh      | 10 ------
+ 2 files changed, 31 insertions(+), 50 deletions(-)
+
+commit ea22c749c7371cf66ca44f0bfe7030aef1926edd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 11:09:48 2010 -0400
+
+    Fix Cursive positioning
+
+    Test case: "مرا" rendered using IranNastaliq.
+
+ src/hb-ot-layout-gpos-private.hh | 124
+ +--------------------------------------
+ 1 file changed, 3 insertions(+), 121 deletions(-)
+
+commit aefdb64689aab19df76590a36c4a04052a8bffdb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 10:40:39 2010 -0400
+
+    Fix segfault with Arabic combining marks
+
+ src/hb-ot-shape-complex-arabic.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 12b2d09a87adc1e1aac089cd2e09a68fb7129829
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 01:28:28 2010 -0400
+
+    Remove obsolete TODO item
+
+    We don't cache any metrics internally, so the correct way to add more
+    glyph metrics items is to add new callbacks for them.  We already have
+    separeate callbacks for advance vs extents.
+
+ TODO | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 248e3c2ba47889c247959e44166644872aed59ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 01:23:14 2010 -0400
+
+    Oops, remove extra mask setting that broke complex shaping
+
+ src/hb-ot-shape.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 502f4cba3e0bcd625d31f8fd295b8b18e2d02a5a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 27 01:13:56 2010 -0400
+
+    Divide get_metrics into get_advance and get_extents
+
+    Graphite module not updated.
+    Bump version to 0.3.
+
+ configure.ac          |  2 +-
+ src/hb-font-private.h |  3 +-
+ src/hb-font.cc        | 96
+ +++++++++++++++++++++++++++++++++++----------------
+ src/hb-font.h         | 61 ++++++++++++++++++++------------
+ src/hb-ft.c           | 72 +++++++++++++++++++++++---------------
+ src/hb-ot-shape.cc    |  7 ++--
+ 6 files changed, 154 insertions(+), 87 deletions(-)
+
+commit ec6c0e54d322d58cbc835feb58dcec7ede6ab744
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 26 11:28:14 2010 -0400
+
+    Fix blob leak
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bd7378b2ef9793de4e7f57b920f29f48ac9d0c25
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 13 18:33:16 2010 -0400
+
+    Massage mask setting a bit more
+
+    Still finding the exact correct way the masks should be set.
+
+ src/hb-buffer-private.hh | 19 ++++++++++++++++---
+ src/hb-buffer.cc         |  9 +++++++++
+ src/hb-ot-shape.cc       |  6 ++++--
+ 3 files changed, 29 insertions(+), 5 deletions(-)
+
+commit 961f9baa7bc3556f1e4e7135859cebe1351f73a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 13 17:17:00 2010 -0400
+
+    Oops, actually set global mask
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 39dede9ffffe732f78cbd092ccb3b48d77ddd66d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 13 15:54:06 2010 -0400
+
+    Make sure boolean features always use value=1
+
+    Previously boolean features turned on the entire feature mask.
+    This is
+    wrong if feature is Alternate and user has provided values bigger
+    than one.
+    Though, I don't think other engines support such corner cases.
+
+ src/hb-ot-map-private.hh          | 10 ++++++++--
+ src/hb-ot-map.cc                  |  3 ++-
+ src/hb-ot-shape-complex-arabic.cc |  2 +-
+ src/hb-ot-shape.cc                |  2 +-
+ 4 files changed, 12 insertions(+), 5 deletions(-)
+
+commit 3506b2e78db27e7835bd2c09c053a9807c9cac40
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 13 15:38:52 2010 -0400
+
+    Return early if mask is 0
+
+ src/hb-buffer.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 5c1c8c9c50ddbe66ea595afb245a208b7775b27c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 13 15:36:38 2010 -0400
+
+    Make sure feature values don't leak out of their mask
+
+ src/hb-buffer.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 852912fc2db06b6183a2dc87c45ec1b563063572
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 13 15:34:50 2010 -0400
+
+    Fix applying default-value for features
+
+    Previously if a default global feature was overrided by a non-global
+    user feature, we were not setting any default mask for the feature,
+    essentially disabling the feature by default.  Fix that.
+
+ TODO                     |  2 --
+ src/hb-ot-map-private.hh | 10 ++++++----
+ src/hb-ot-map.cc         | 13 +++++++------
+ 3 files changed, 13 insertions(+), 12 deletions(-)
+
+commit 2989be4919242670c94825bded96db20a7b2035b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 13 15:18:29 2010 -0400
+
+    Set user masks after complex masks
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a7820b7b15a809b4a1a4077147ceed7bea528483
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 13 14:20:48 2010 -0400
+
+    Add TODO item
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 04a3023a66203d94b77f2d7a8d6bcdedf067e155
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 13 10:57:27 2010 -0400
+
+    Cleanup TODO
+
+    Looks like a roadmap now.
+
+ TODO | 72
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 59 insertions(+), 13 deletions(-)
+
+commit 3111b8a0d5b38da57c0f6285aec2b92eb690188f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 13 10:41:53 2010 -0400
+
+    Fix stupid bug, oops
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3703f88b74707113e782eb6ca9a77603561760d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 18:34:20 2010 -0400
+
+    Step the version up to 0.2 now that Arabic shaper is in
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 758f68b860b44b5a04eb3dde5cb40b1b04cf634a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 17:37:44 2010 -0400
+
+    Fix Arabic shaper
+
+    It's tested now.  It works!
+
+ src/hb-ot-shape-complex-arabic.cc | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 13403bc67a01e0d4908fb964093fd02ddd11c580
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 17:23:54 2010 -0400
+
+    Hookup Arabic shaper!
+
+    Not tested yet.
+
+ src/hb-ot-shape-complex-arabic.cc  |  6 +++---
+ src/hb-ot-shape-complex-private.hh | 37
+ ++++++++++++++++++++++---------------
+ src/hb-ot-shape-private.hh         | 14 +++++++++++++-
+ src/hb-ot-shape.cc                 |  3 ++-
+ 4 files changed, 40 insertions(+), 20 deletions(-)
+
+commit 57ac0ecb7843533b2e6e6d6c8a12b2a44437cc1c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 17:07:02 2010 -0400
+
+    Merge clearing masks and setting global masks
+
+ src/hb-buffer-private.hh | 11 ++++++-----
+ src/hb-buffer.cc         |  5 +++--
+ src/hb-ot-map.cc         |  2 +-
+ src/hb-ot-shape.cc       |  7 ++-----
+ 4 files changed, 12 insertions(+), 13 deletions(-)
+
+commit fc96596b7c1c4e62491e951a3c256fb00dcde550
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 17:00:25 2010 -0400
+
+    Form clusters before setting masks
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1e80782244cdb1dedae9d1e61079d0508e57ca72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 17:00:07 2010 -0400
+
+    Clear masks before setting them up, not after!
+
+ src/hb-ot-shape.cc | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit fd3d32d31cb6d74a9994b6850d539fd0b707d941
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 16:57:47 2010 -0400
+
+    Add hb_ot_shape_execute()
+
+    Not public yet.
+
+ src/hb-ot-shape-private.hh |  5 ++---
+ src/hb-ot-shape.cc         | 19 ++++++++++++++-----
+ 2 files changed, 16 insertions(+), 8 deletions(-)
+
+commit 49baa1f69efb0e3c62e45bd59dd88459a84bf390
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 16:50:36 2010 -0400
+
+    Add hb_ot_complex_shaper_t stuff and start hooking Arabic shaper up
+
+ src/Makefile.am                                    |  3 +-
+ src/hb-ot-map-private.hh                           |  2 +-
+ src/hb-ot-map.cc                                   |  2 +-
+ ...ape-arabic.cc => hb-ot-shape-complex-arabic.cc} |  9 +++
+ src/hb-ot-shape-complex-private.hh                 | 88
+ ++++++++++++++++++++++
+ src/hb-ot-shape-private.hh                         | 12 +--
+ src/hb-ot-shape.cc                                 |  8 +-
+ 7 files changed, 107 insertions(+), 17 deletions(-)
+
+commit 605ed468f380f86d642031f6451447d270cb6de1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 16:19:29 2010 -0400
+
+    Add hb_ot_shape_plan_t
+
+    This is the object that a separate plan/execute shaping API will
+    use in
+    between the two stages.
+
+ src/hb-ot-shape-private.hh | 12 ++++++++++--
+ src/hb-ot-shape.cc         | 38 ++++++++++++++++++--------------------
+ 2 files changed, 28 insertions(+), 22 deletions(-)
+
+commit 895fb5d364e7ae5d9d2e34b9f68b8651804369ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 16:00:21 2010 -0400
+
+    Refactor, in a different direction
+
+ src/hb-ot-map-private.hh   | 15 ++++++++-------
+ src/hb-ot-map.cc           | 23 ++++++++++++-----------
+ src/hb-ot-shape-private.hh | 13 +------------
+ src/hb-ot-shape.cc         | 33 +++++++++++++++++----------------
+ 4 files changed, 38 insertions(+), 46 deletions(-)
+
+commit d2ba016ca1ba7489537768b619980d5159b5870c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 15:35:45 2010 -0400
+
+    More refactoring
+
+ src/hb-ot-map-private.hh   | 32 +++++---------------------------
+ src/hb-ot-map.cc           | 32 +++++++++++++++++++++++++++++---
+ src/hb-ot-shape-private.hh | 16 ++++++++++++++--
+ src/hb-ot-shape.cc         | 43
+ ++++++++++++++++++++++++++++---------------
+ src/hb-ot-shape.h          | 10 +++++-----
+ 5 files changed, 81 insertions(+), 52 deletions(-)
+
+commit 66e487dfbfdccd0c4be8cd11661d412ca27c3425
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 13:51:19 2010 -0400
+
+    Update Arabic shaping table to Unicode 6.0.0.
+
+ src/hb-ot-shape-arabic.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit f4792d99eee0e8cd72b7cb01c96a09f16e2a72ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 12:32:18 2010 -0400
+
+    Fix infinite loop!
+
+    Untested code is indeed buggy code.
+
+    Mozilla bug #603352.
+
+ src/hb-ot-tag.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit 993d1e786a32612b796dae8309ce402a4121bec7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 11:17:30 2010 -0400
+
+    Fix missing negation in unreachable code!
+
+    Mozilla bug #603346
+
+ src/hb-open-type-private.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 52601275d5e4000dada4f925fb78723eeeee7bd4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 20:38:46 2010 -0400
+
+    More separation
+
+ src/hb-ot-shape.cc | 14 +++++---------
+ 1 file changed, 5 insertions(+), 9 deletions(-)
+
+commit 6b7e6758626268ba1c7c266128e618ec73ae2c0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 20:30:04 2010 -0400
+
+    Minor
+
+ src/hb-ot-shape.cc | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit aa9c450bb2d7c3c9e36ea32e3558250391a0582d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 20:27:38 2010 -0400
+
+    Enable 'rtlm' mirroring
+
+ src/hb-ot-map-private.hh |  9 +++++----
+ src/hb-ot-shape.cc       | 30 +++++++++++++++---------------
+ 2 files changed, 20 insertions(+), 19 deletions(-)
+
+commit 36925f695d349a53d52ecc3a58f18240a6977463
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 20:20:32 2010 -0400
+
+    Rename hb_mask_allocator_t to hb_ot_map_t
+
+    hb_ot_plan_t may be a better name, donno.
+
+ src/hb-ot-map-private.hh   |  4 ++--
+ src/hb-ot-map.cc           |  2 +-
+ src/hb-ot-shape-private.hh |  4 ++--
+ src/hb-ot-shape.cc         | 49
+ +++++++++++++++++++++-------------------------
+ 4 files changed, 27 insertions(+), 32 deletions(-)
+
+commit f5dd3be46b5c77a2c5b97b82a0b67ac9e851b898
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 20:16:23 2010 -0400
+
+    Improve checks
+
+ src/check-c-linkage-decls.sh | 2 +-
+ src/check-header-guards.sh   | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 5a2b0b3878cd9c62121bb4fd6344e102a9ee1825
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 20:14:57 2010 -0400
+
+    Add hb-ot-map.cc
+
+ src/Makefile.am          |   1 +
+ src/hb-ot-map-private.hh | 129 +-----------------------------------
+ src/hb-ot-map.cc         | 165
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 168 insertions(+), 127 deletions(-)
+
+commit ecc4550ed7bc900a61081edfbcd0ad09cbf29b36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 20:05:29 2010 -0400
+
+    Fix feature overriding
+
+ src/hb-ot-map-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8f08c3275040870a645ef034a38d30c05c619f21
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 19:43:48 2010 -0400
+
+    Minor cleanup
+
+ src/hb-open-type-private.hh |  8 ++----
+ src/hb-ot-map-private.hh    | 61
+ +++++++++++++--------------------------------
+ src/hb-ot-tag.c             | 11 ++++----
+ src/hb-private.h            |  4 +++
+ 4 files changed, 28 insertions(+), 56 deletions(-)
+
+commit a806762a314e83154793d96ee665e6668d6b56de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 19:18:40 2010 -0400
+
+    Add hb-ot-shape-private.hh
+
+ src/Makefile.am            |  1 +
+ src/hb-ot-shape-arabic.cc  |  2 +-
+ src/hb-ot-shape-private.hh | 60
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 62 insertions(+), 1 deletion(-)
+
+commit 4924affe0f0adf75f2a0e2137a71206b0576d63f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 19:18:16 2010 -0400
+
+    Add hb-ot-map-private.hh
+
+ src/Makefile.am          |   1 +
+ src/hb-ot-map-private.hh | 307
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-shape.cc       | 274 ++----------------------------------------
+ 3 files changed, 315 insertions(+), 267 deletions(-)
+
+commit a7c5046d6b676a32298b97403a49235f7f255161
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 18:47:47 2010 -0400
+
+    Add private hb_segment_properties_t
+
+ src/hb-buffer-private.hh | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit b897c607d91d569f4eaa681d1f5b3d9f3d2bb093
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 18:41:57 2010 -0400
+
+    Flip the OT bit-allocation vs gsub/gpos inside-out
+
+    We now build our entire attack plan before jumping in.
+
+ src/hb-ot-shape.cc | 333
+ ++++++++++++++++++++++++++++-------------------------
+ 1 file changed, 176 insertions(+), 157 deletions(-)
+
+commit e89b7d2a61b7f58e6c7cec00d5ce2246dee1e8a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 12:29:59 2010 -0400
+
+    Logically separate feature collection
+
+ src/hb-ot-shape.cc | 29 ++++++++++++++++++-----------
+ 1 file changed, 18 insertions(+), 11 deletions(-)
+
+commit 5b88908f12ad1d828dd6075fb8fc0036c2d6af3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 12:23:01 2010 -0400
+
+    Minor
+
+ src/hb-ot-shape.cc | 18 ++++++------------
+ 1 file changed, 6 insertions(+), 12 deletions(-)
+
+commit 5360ce0c5c33f921b3f9ad3f42529a19df5ad0fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 7 21:21:11 2010 -0400
+
+    Move some more code around
+
+ src/hb-ot-shape.cc | 27 +++++++++++++--------------
+ 1 file changed, 13 insertions(+), 14 deletions(-)
+
+commit d9c726078828d50db62e05407a3f38f2e7607533
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 7 21:19:54 2010 -0400
+
+    Minor
+
+ src/hb-ot-shape.cc | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit efe0d682e860ffd23a1d17c68c8273f17d51c1c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 7 21:12:46 2010 -0400
+
+    Simplify compiling lookups
+
+ src/hb-ot-shape.cc | 66
+ ++++++++++++++++++++++--------------------------------
+ 1 file changed, 27 insertions(+), 39 deletions(-)
+
+commit 476c94218b4f5b8e119e82b0e10b641e0c10bf56
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 7 17:47:33 2010 -0400
+
+    Rename
+
+ src/hb-ot-shape.cc | 18 ++++++++++--------
+ 1 file changed, 10 insertions(+), 8 deletions(-)
+
+commit 34db6f031d7ac009f554386ef990bad44886b9ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 7 01:21:19 2010 -0400
+
+    Add XXX note
+
+ src/hb-buffer.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 98aa3f65446496dc250d9b01d98cacfdf1157e06
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 6 00:23:36 2010 -0400
+
+    Call hb_ot_shape_setup_lookups_complex()
+
+ src/hb-ot-shape.cc | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit f1d07885dc358e79c237e824c94b3320c0a9c17d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 6 00:21:37 2010 -0400
+
+    Rename setup_lookups()
+
+ src/hb-ot-shape.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit affc5abac7bdae51df85856a5478d34d96fda4fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 6 00:18:16 2010 -0400
+
+    Move table_tag to hb_ot_shape_context_t
+
+ src/hb-ot-shape.cc | 31 +++++++++++++++++--------------
+ 1 file changed, 17 insertions(+), 14 deletions(-)
+
+commit 967240dd8b96802345ef273e75427066e91ea8fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 5 23:00:05 2010 -0400
+
+    Add internal hb_ot_shape_context_t
+
+ src/hb-ot-shape-arabic.cc |  26 ++---
+ src/hb-ot-shape.cc        | 237
+ +++++++++++++++++++---------------------------
+ 2 files changed, 108 insertions(+), 155 deletions(-)
+
+commit 3eb936f1539475098f39be78654b9c39b86f0799
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 5 18:36:58 2010 -0400
+
+    Add Arabic/Syriac/N'ko shaping logic
+
+    Not hooked up just yet.
+
+ src/Makefile.am                 |   9 +
+ src/gen-arabic-joining-table.py |  39 +++
+ src/hb-ot-shape-arabic.cc       | 716
+ ++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 764 insertions(+)
+
+commit 0109816b50064a314389333ff64aaf22cb4b1e56
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 5 18:36:45 2010 -0400
+
+    Update build system
+
+ autogen.sh   | 3 ---
+ configure.ac | 1 +
+ 2 files changed, 1 insertion(+), 3 deletions(-)
+
+commit e81d7afe6e0e9dd26025f3243a11cf0b408a8046
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 4 18:18:48 2010 -0400
+
+    Add hb_face_get_upem()
+
+ src/hb-font.cc | 6 ++++++
+ src/hb-font.h  | 3 +++
+ 2 files changed, 9 insertions(+)
+
+commit d47f79db92fa45d51cd5f7845db8a206f5ec122b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 4 18:13:30 2010 -0400
+
+    Add TODO item
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit bd361945a89ea31e6c4525aa030e18744ea81fb3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 4 17:22:57 2010 -0400
+
+    Add API comments
+
+ src/hb-font.h | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+commit 645f6f265b5f6fb85b3c0f59ea874d58c86e3917
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 4 17:01:01 2010 -0400
+
+    Add is_mutable() functions
+
+    Correspond to the make_mutable() ones.
+
+ src/hb-font.cc   | 6 ++++++
+ src/hb-font.h    | 2 ++
+ src/hb-unicode.c | 6 ++++++
+ src/hb-unicode.h | 2 ++
+ 4 files changed, 16 insertions(+)
+
+commit 19c0eab8cf96d00e168c4b11ec435019c1ed44f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 4 16:45:21 2010 -0400
+
+    Add getters for all setter APIs
+
+    One in particular is not a straight getter: hb_font_unset_funcs() is
+    special because of the specific needs of the lifecycle management of
+    the user_data object.
+
+ src/hb-font.cc   | 64
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-font.h    | 40 +++++++++++++++++++++++++++++++++++
+ src/hb-unicode.c | 32 ++++++++++++++++++++++++++++
+ src/hb-unicode.h | 31 ++++++++++++++++++++++++++-
+ 4 files changed, 166 insertions(+), 1 deletion(-)
+
+commit f0feb084b0fd1510474b25404d1dcc5686ee0538
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 3 19:09:39 2010 -0400
+
+    Minor
+
+ src/hb-ot-layout-private.hh | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit ac0c1663fa6e93a5a94c88fc7497bc11ca17f0a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 1 19:09:23 2010 -0400
+
+    Avoid div-by-zero, validate upem
+
+ src/hb-ot-head-private.hh   | 7 +++++++
+ src/hb-ot-layout-private.hh | 6 +++---
+ 2 files changed, 10 insertions(+), 3 deletions(-)
+
+commit 7f97d2cd904ea999c099c73c52187c5d65aeec67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 1 18:58:50 2010 -0400
+
+    Pedantic
+
+ src/hb-open-type-private.hh        | 12 ++++++------
+ src/hb-ot-layout-common-private.hh |  2 +-
+ src/hb-ot-layout-gdef-private.hh   | 10 +++++-----
+ src/hb-ot-layout-gpos-private.hh   |  6 +++---
+ 4 files changed, 15 insertions(+), 15 deletions(-)
+
+commit 2841436926d6a406bd1f4a35c66a0e3c2fdbeca7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 29 12:20:36 2010 -0400
+
+    Don't zero glyph advances in MarkToBase and similar lookups
+
+    See email thread "Should MarkToBase attachment zero the mark advance?"
+    started by Jonathan Kew on 23 August 2010 for details.
+
+ src/hb-ot-layout-gpos-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 36b3862009c00ad922d68810173a69ac59723365
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 29 12:10:24 2010 -0400
+
+    One fewer cmp() implementation...
+
+ src/hb-ot-layout-common-private.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 4e573715ae5f5ed486ad66382bb44c47a86591ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 28 16:23:58 2010 -0400
+
+    Improve cmp function parameter namings and casts
+
+    No semantic change.
+
+ src/hb-open-type-private.hh        | 6 +++---
+ src/hb-ot-layout-common-private.hh | 6 +++---
+ src/hb-ot-shape.cc                 | 8 ++++----
+ 3 files changed, 10 insertions(+), 10 deletions(-)
+
+commit dca8aff24652c83c53efbb9d06e5e1c7ef1c2fa5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 28 16:25:23 2010 -0400
+
+    Add comment re DejaVu Sans Mono having 'dflt' script
+
+ src/hb-ot-layout.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 9dc45401c07cb40114067cafbe286c63a9598f3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 28 16:23:28 2010 -0400
+
+    Fix stupid bug in bsearch cmp function!
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6fca4c18c42bdcbc67ee8855499c51c7d6311eb2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 23 10:28:51 2010 -0400
+
+    Add TODO iteam
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit f2a30bd605a57b99fce4b78e288c2ca62f7191ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 23 10:27:08 2010 -0400
+
+    Remove unimplemented method hb_font_get_funcs()
+
+    Got to add a suitable replacement.
+
+ src/hb-font.h | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 7b9a38a112aa2421d97187a9b30619360edeabbe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 22 17:42:59 2010 -0400
+
+    Add test.c using public API
+
+ src/Makefile.am |  6 +++-
+ src/test.c      | 94
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 99 insertions(+), 1 deletion(-)
+
+commit 9ea7368fce3fa373d8d2925961ad211f5cf6ce70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 22 17:38:44 2010 -0400
+
+    Fix hb_ot_layout leak
+
+ src/hb-ot-layout.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 8e577acae2e605547b6a1b9b3a941cb9e3c56a4c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 22 17:37:02 2010 -0400
+
+    Fix blob refcounting with insane SFNT table directories
+
+ src/hb-font.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 75371bea4fbf50b8604d2698b4935c011648a6b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 22 17:12:10 2010 -0400
+
+    Add TODO item
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5bd1e95236320aed60fb29ca1e93b9595d4aeeec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 22 16:46:18 2010 -0400
+
+    Speedup Device table delta computation for common cases
+
+ src/hb-ot-layout-common-private.hh | 25 +++++++++++++++++++++----
+ 1 file changed, 21 insertions(+), 4 deletions(-)
+
+commit ed4acbde9c5e3323cc95037b500d1bf2878ed3ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 16 14:36:27 2010 -0400
+
+    Fix NULL dereference
+
+    Reported by Jonathan Kew.  Face table handling needs to be redone
+    anyway, but fix this for now.
+
+ src/hb-ot-layout.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 258305c2a5dd47bd2d83f12eaf9caa5b19ae5efb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 13 14:10:02 2010 -0400
+
+    [GPOS] Fix div-by-zero
+
+    Patch by Jonathan Kew.  Mozilla bug #465728.
+
+ src/hb-ot-layout-gpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2422c4b96d32037a5cdaef4c427ed1d25db5f647
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 13 14:00:34 2010 -0400
+
+    Add TODO
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 27f0b092a13344e8791c496c77a3c1e5de4f887c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 23 17:35:54 2010 -0400
+
+    Logically separate feature allocation from application
+
+ src/hb-ot-shape.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 6cf63132dc771e1bcd5627720daf4bd2ea0800a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 23 17:32:26 2010 -0400
+
+    Minor
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4e4ef24e46f273ad2bdda2f718223e05b37dd50f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 23 17:22:11 2010 -0400
+
+    Towards separating bit allocation from shaping
+
+ src/hb-buffer-private.hh         |  9 ++++++---
+ src/hb-buffer.cc                 | 12 ++++++------
+ src/hb-ot-layout-gpos-private.hh |  2 +-
+ src/hb-ot-layout.cc              |  2 +-
+ src/hb-ot-shape.cc               | 41
+ ++++++++++++++++------------------------
+ 5 files changed, 30 insertions(+), 36 deletions(-)
+
+commit da6cff3864d2ef4a061a29e5918359bafcd51f4c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 23 15:40:58 2010 -0400
+
+    Add TODO items
+
+ TODO | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit acdba3f90b232fc12fcb200dca2584481b339118
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 23 15:11:18 2010 -0400
+
+    Prefer C linkage
+
+ src/Makefile.am                      |  1 +
+ src/check-c-linkage-decls.sh         | 18 ++++++++++++++++++
+ src/hb-blob-private.h                |  2 ++
+ src/hb-blob.c                        | 18 ++++++++++++------
+ src/hb-blob.h                        |  2 ++
+ src/hb-buffer-private.hh             |  1 +
+ src/hb-buffer.cc                     |  7 ++++++-
+ src/hb-buffer.h                      |  1 +
+ src/hb-common.c                      |  6 ++++++
+ src/hb-common.h                      | 21 +++++++++++++--------
+ src/hb-font-private.h                |  1 +
+ src/hb-font.cc                       |  4 ++++
+ src/hb-font.h                        |  1 +
+ src/hb-ft.c                          | 10 ++++++++--
+ src/hb-ft.h                          |  2 ++
+ src/hb-glib.c                        |  6 ++++++
+ src/hb-glib.h                        |  2 ++
+ src/hb-graphite.cc                   |  6 ++++++
+ src/hb-graphite.h                    |  3 ++-
+ src/hb-icu.c                         |  6 ++++++
+ src/hb-icu.h                         |  2 ++
+ src/hb-language.c                    |  5 +++++
+ src/hb-language.h                    |  2 ++
+ src/hb-object-private.h              |  2 ++
+ src/hb-open-file-private.hh          |  4 ++++
+ src/hb-open-type-private.hh          |  5 +++++
+ src/hb-ot-head-private.hh            |  5 +++++
+ src/hb-ot-layout-common-private.hh   |  6 ++++++
+ src/hb-ot-layout-gdef-private.hh     |  4 ++++
+ src/hb-ot-layout-gpos-private.hh     |  6 ++++++
+ src/hb-ot-layout-gsub-private.hh     |  7 ++++++-
+ src/hb-ot-layout-gsubgpos-private.hh | 13 +++++++++++++
+ src/hb-ot-layout-private.hh          |  3 ++-
+ src/hb-ot-layout.cc                  |  5 +++++
+ src/hb-ot-layout.h                   |  1 +
+ src/hb-ot-shape.cc                   |  6 ++++++
+ src/hb-ot-shape.h                    |  2 ++
+ src/hb-ot-tag.c                      |  5 +++++
+ src/hb-ot-tag.h                      |  2 ++
+ src/hb-ot.h                          |  3 +++
+ src/hb-private.h                     |  5 +++++
+ src/hb-shape.cc                      |  5 +++++
+ src/hb-shape.h                       |  1 +
+ src/hb-unicode-private.h             |  1 +
+ src/hb-unicode.c                     |  6 ++++++
+ src/hb-unicode.h                     |  1 +
+ src/hb.h                             |  3 +++
+ src/main.cc                          |  6 ++++++
+ 48 files changed, 214 insertions(+), 20 deletions(-)
+
+commit cc6d52279d10a2edcf0d86c3a18a79ff4f6d3858
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 23 15:00:13 2010 -0400
+
+    De-C++ where possible
+
+    Helps with avoiding many "extern C" declarations in source files.
+
+ src/Makefile.am                               | 4 ++--
+ src/check-header-guards.sh                    | 2 +-
+ src/{hb-font-private.hh => hb-font-private.h} | 6 +++---
+ src/hb-font.cc                                | 2 +-
+ src/{hb-ft.cc => hb-ft.c}                     | 2 +-
+ src/hb-graphite.cc                            | 2 +-
+ src/hb-ot-layout-gdef-private.hh              | 2 +-
+ src/hb-ot-layout-private.hh                   | 2 +-
+ 8 files changed, 11 insertions(+), 11 deletions(-)
+
+commit 0dd200d28f51bf4062d8a377432c8977c80cb210
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 23 14:56:29 2010 -0400
+
+    Header dep cleanup
+
+ src/hb-font-private.hh      | 2 --
+ src/hb-ot-layout-private.hh | 1 +
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit fb0d25246267851a1fc200ead28c56359a40047e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 23 14:54:22 2010 -0400
+
+    dos2unix
+
+ src/hb-ot-head-private.hh | 256
+ +++++++++++++++++++++++-----------------------
+ 1 file changed, 128 insertions(+), 128 deletions(-)
+
+commit 81408cd51ce575891e79e6483be187130f864c28
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 23 14:46:57 2010 -0400
+
+    Don't use "operator ="
+
+    Some compilers don't like operator = defined on members of union
+    members
+    either.  Reported by Ginn Chen for Sun Studio compilers.
+
+ src/hb-open-type-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 39fe34d4c356516f0a92f42b13a168572829d24e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 22 18:12:38 2010 -0400
+
+    Add TODO option
+
+ TODO | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 243a96f41482edb83e4798358064bd3329dd278c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 21 17:21:12 2010 -0400
+
+    Add arm build fix to TODO
+
+ TODO | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c407f05f99f9225916d3d0ae06eac8fbc8b55b97
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 21 17:20:44 2010 -0400
+
+    Remove fixed TODO item
+
+ TODO | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 4f801bd6586defdbf70162e0c7f8968d2b476df2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 21 16:37:01 2010 -0400
+
+    Mozilla bug 580233 - check for zero-length record in hb sanitizer.
+
+    Patch / report by Jonathan Kew.
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 17e9ff938b638fd1cb80c990ba13bd47562116b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 15 11:21:34 2010 -0700
+
+    Fix 64bit issues with debug prints
+
+ src/hb-blob.c               | 10 +++++-----
+ src/hb-open-type-private.hh |  5 +++--
+ 2 files changed, 8 insertions(+), 7 deletions(-)
+
+commit fd56ae49637b978ea3b36fab5b48f1a3cc99e90e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 8 00:53:40 2010 -0400
+
+    Don't bother sorting, it's a safe font error if the array is not
+    sorted
+
+ src/hb-open-type-private.hh        | 29 -----------------------------
+ src/hb-ot-layout-common-private.hh |  7 -------
+ 2 files changed, 36 deletions(-)
+
+commit cc8a4abea68f2dba26feb5785f9e518e6853c744
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 8 00:40:04 2010 -0400
+
+    Use bsearch where applicable
+
+ src/hb-open-type-private.hh        |  49 +++++++++++++
+ src/hb-ot-layout-common-private.hh | 145
+ +++++++++++++------------------------
+ 2 files changed, 100 insertions(+), 94 deletions(-)
+
+commit 2f418f5709b2b8b3ef2f6056b9d8c13b66f0b74a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 7 22:07:40 2010 -0400
+
+    Remove useless TODO
+
+ src/hb-open-file-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit da8edbb62204dc39f93d500ef85929e234e0bd19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 9 07:15:39 2010 -0400
+
+    Fix header
+
+ src/hb-buffer-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit d05d13df02fbe76814694fe49cc01bbb41c3d0e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 9 07:15:03 2010 -0400
+
+    Add a test for header preprocessor guards
+
+ src/Makefile.am            |  4 +++-
+ src/check-header-guards.sh | 20 ++++++++++++++++++++
+ src/check-libstdc++.sh     |  1 -
+ 3 files changed, 23 insertions(+), 2 deletions(-)
+
+commit 0f0cd9d361f1bb614aa3fd4616160d027062370e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 9 06:32:56 2010 -0400
+
+    Fix header tags
+
+ src/hb-font-private.hh      | 6 +++---
+ src/hb-object-private.h     | 6 +++---
+ src/hb-open-type-private.hh | 4 ++--
+ src/hb-ot-layout-private.hh | 6 +++---
+ src/hb-ot-shape.h           | 2 +-
+ 5 files changed, 12 insertions(+), 12 deletions(-)
+
+commit f2a1b411b1d48c3dfac0df8e78c848d9aa3bb047
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 3 11:37:51 2010 -0400
+
+    Followup fix for variation-selectors
+
+    Patch from Jonathan Kew
+
+ src/hb-ot-shape.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit a224b4d502d026fa642ee4098bf7bc0b4ba7ce27
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 2 22:24:54 2010 -0400
+
+    Fix skipping variation-selectors
+
+ src/hb-ot-shape.cc | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit 81a77b115db401f69e869690f24b9047370bdfde
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 1 23:03:54 2010 -0400
+
+    Make feature sorting stable
+
+ src/hb-ot-shape.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit fdc322a82047c4bda9fa3dab4338a0eac1c1bde7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 28 20:55:52 2010 -0400
+
+    Minor
+
+ src/hb-ot-shape.cc | 38 +++++++++++++++++++++-----------------
+ 1 file changed, 21 insertions(+), 17 deletions(-)
+
+commit f062ec6bb24b1c21d37b12adc7e944a5fe53526a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 28 20:54:43 2010 -0400
+
+    Further simplify mask allocator
+
+ src/hb-ot-shape.cc | 23 +++++++----------------
+ 1 file changed, 7 insertions(+), 16 deletions(-)
+
+commit 8af45fda475d075c5a285002463a00a0423d3926
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 28 20:41:20 2010 -0400
+
+    Fix global feature handling
+
+ src/hb-ot-shape.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit e04685ee7be01695ec437fab50f919f1b7423c57
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 28 20:37:06 2010 -0400
+
+    Simplify mask allocation
+
+ src/hb-ot-shape.cc | 48 ++++++++++++++++++++----------------------------
+ 1 file changed, 20 insertions(+), 28 deletions(-)
+
+commit 0e235d0fc9bdeeaffa7215c21abc5d40767a10c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 28 20:21:47 2010 -0400
+
+    Towards a mask allocator
+
+ src/hb-ot-shape.cc | 291
+ ++++++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 186 insertions(+), 105 deletions(-)
+
+commit 81c5e8724b740c6e42ed3a45e0574c7c5f3ad8e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 28 18:31:16 2010 -0400
+
+    Allow disabling default features
+
+    Patch from Jonathan Kew
+
+ src/hb-buffer-private.hh |  18 +++--
+ src/hb-buffer.cc         |  15 ++--
+ src/hb-ot-shape.cc       | 196
+ ++++++++++++++++++++++++++++++++---------------
+ 3 files changed, 153 insertions(+), 76 deletions(-)
+
+commit 2163afbf35044f59dbf449254e65b8c9feb6cdeb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 27 14:04:15 2010 -0400
+
+    Add note about UTF-8 decoder
+
+ src/hb-buffer.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 226faa58f4e23eb655bebb0eff7206a3024c8d55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 27 11:42:34 2010 -0400
+
+    Fix loop
+
+ src/hb-ot-tag.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 56bef5680cc76a67d16ca14ac69f0dda1a691968
+Author: Martin Hosken <martin_hosken@sil.org>
+Date:   Thu May 27 10:09:04 2010 +0100
+
+    Fixes to Python and Graphite from Martin
+
+ contrib/python/README             |  10 ++++
+ contrib/python/lib/fontconfig.pyx |  47 +++++++++++++++++
+ contrib/python/lib/harfbuzz.pyx   | 104
+ ++------------------------------------
+ contrib/python/scripts/hbtestfont | 103
+ +++++++++++++++++++++++++++++++++----
+ contrib/python/setup.py           |   3 +-
+ src/hb-graphite.cc                |   8 +--
+ 6 files changed, 159 insertions(+), 116 deletions(-)
+
+commit b485da0b719cb03cc33da57802c5151301664c2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 27 11:39:19 2010 -0400
+
+    Disable Graphite as it crashes all over the place...
+
+ src/hb-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 93ac709b1f6b015371c29bf244a9ece62baedff0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 26 16:22:00 2010 -0400
+
+    Cypriot is RTL
+
+ src/hb-unicode.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 15c7379c16dbb9ee8ed1c0333ca7492532ce8423
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 26 10:48:10 2010 -0400
+
+    Revert "Merge remote branch 'martin/master'"
+
+    This reverts commit 80af2812fb3b231ddcb4608ec13c6038a681c818,
+    reversing
+    changes made to c442672ec2fb83ed41f3994b3aa4f92a097664ab.
+
+ contrib/python/README             |  10 ----
+ contrib/python/lib/fontconfig.pyx |  47 -----------------
+ contrib/python/lib/harfbuzz.pyx   | 104
+ ++++++++++++++++++++++++++++++++++++--
+ contrib/python/scripts/hbtestfont |  98
+ ++++-------------------------------
+ contrib/python/setup.py           |   3 +-
+ src/Makefile.am                   |   2 +-
+ src/hb-graphite.cc                |   8 +--
+ src/hb-ot-shape.cc                |   2 +-
+ src/hb-ot-tag.c                   |   1 -
+ src/hb-ot.h                       |   2 +-
+ src/hb-shape.cc                   |   2 +-
+ 11 files changed, 119 insertions(+), 160 deletions(-)
+
+commit 80af2812fb3b231ddcb4608ec13c6038a681c818
+Merge: c442672e 3109a86a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 24 18:14:24 2010 +0100
+
+    Merge remote branch 'martin/master'
+
+commit c442672ec2fb83ed41f3994b3aa4f92a097664ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 24 18:02:32 2010 +0100
+
+    Fix struct initializers
+
+ src/hb-ft.cc  | 12 ++++++------
+ src/hb-glib.c | 14 +++++++-------
+ src/hb-icu.c  | 14 +++++++-------
+ 3 files changed, 20 insertions(+), 20 deletions(-)
+
+commit f5ac9de259773a5f86809892e58166a485d70a3d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 24 18:01:09 2010 +0100
+
+    Minor
+
+ src/hb-object-private.h | 24 +++++++++++++-----------
+ 1 file changed, 13 insertions(+), 11 deletions(-)
+
+commit f97bf4f81257c97a46dff51be31b2ec214d6c270
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 24 17:50:19 2010 +0100
+
+    Make sure we initialize all callbacks upon creation
+
+    Also fixes issue with unicode callbacks never being set really.
+
+ src/hb-font.cc   | 18 +++++++-----------
+ src/hb-unicode.c |  9 ++-------
+ 2 files changed, 9 insertions(+), 18 deletions(-)
+
+commit bf36a1074ab23abeab0a7a6c47db26770dc1ab0a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 24 17:46:21 2010 +0100
+
+    Move all callback functions in a vtable structs
+
+ src/hb-font-private.hh   | 10 ++++++----
+ src/hb-font.cc           | 28 +++++++++++++++-------------
+ src/hb-ot-shape.cc       |  4 ++--
+ src/hb-unicode-private.h | 12 +++++++-----
+ src/hb-unicode.c         | 32 +++++++++++++++++---------------
+ 5 files changed, 47 insertions(+), 39 deletions(-)
+
+commit 3109a86add936ae4cc77541fc026c4fe2db4e328
+Author: Martin Hosken <martin_hosken@sil.org>
+Date:   Mon May 24 13:25:37 2010 +0100
+
+    hb-graphite now no longer has -ve advances within clusters. Fix
+    infinite loop in tag_to_script(). python fixed to use tag_to_script
+    and allow hbtestfont to be passed font files, where fontconfig knows
+    about them.
+
+ contrib/python/lib/harfbuzz.pyx   | 4 ++--
+ contrib/python/scripts/hbtestfont | 6 +++++-
+ src/hb-graphite.cc                | 4 ++--
+ src/hb-ot-tag.c                   | 1 +
+ 4 files changed, 10 insertions(+), 5 deletions(-)
+
+commit e5bed0a37fe1b0576d08435179e455cb28eadcdb
+Author: Martin Hosken <martin_hosken@sil.org>
+Date:   Sat May 22 20:19:00 2010 +0100
+
+    Tidy up hbtestfont and add README
+
+ contrib/python/README             |  10 +++
+ contrib/python/scripts/hbtestfont | 134
+ +++++++++++++++++++-------------------
+ 2 files changed, 77 insertions(+), 67 deletions(-)
+
+commit 70ae332fe66510500d303b6fcc79537833b42f05
+Author: Martin Hosken <martin_hosken@sil.org>
+Date:   Sat May 22 19:58:00 2010 +0100
+
+    Add fontconfig to hbtestfont
+
+ contrib/python/lib/fontconfig.pyx | 47 ++++++++++++++++++++++++++++
+ contrib/python/scripts/hbtestfont | 64
+ ++++++++++++++++++++++++---------------
+ contrib/python/setup.py           |  3 +-
+ 3 files changed, 88 insertions(+), 26 deletions(-)
+
+commit 72631c9d06b131d82080f212908e7d0b0266b841
+Merge: 1432ab15 1094a294
+Author: Martin Hosken <martin_hosken@sil.org>
+Date:   Sat May 22 09:38:02 2010 +0100
+
+    Merge branch 'master' of git://git.freedesktop.org/~behdad/harfbuzz-ng
+
+commit 1432ab15c163eb0b5be3de66a4cb3df15ad73500
+Author: Martin Hosken <martin_hosken@sil.org>
+Date:   Sat May 22 00:56:40 2010 +0100
+
+    Add graphical output to hbtestfont
+
+ contrib/python/lib/harfbuzz.pyx   | 100
+ +-------------------------------------
+ contrib/python/scripts/hbtestfont |  62 ++++++++++++++++++++++-
+ src/Makefile.am                   |   2 +-
+ src/hb-ot-shape.cc                |   2 +-
+ src/hb-ot.h                       |   2 +-
+ src/hb-shape.cc                   |   2 +-
+ 6 files changed, 67 insertions(+), 103 deletions(-)
+
+commit bbc7a99d01298f9be1ebaaceacbc9bc961e247e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 18:24:34 2010 +0100
+
+    Move mirroring around a bit
+
+ src/hb-ot-shape.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit bd0987386b3a4dddf208ccf1a70ebfff6242ba73
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 18:06:35 2010 +0100
+
+    Add a few more standard features
+
+ src/hb-ot-shape.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 75f3469ca6d626b08eb411984a2ba7fd48ca5b5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 17:59:04 2010 +0100
+
+    Add note
+
+ src/hb-ot-shape.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1094a294f6a44c47fc75867983f2b135a6442bab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 17:58:20 2010 +0100
+
+    Add rtlm
+
+ src/hb-ot-shape.cc | 26 +++++++++++++++++++++-----
+ 1 file changed, 21 insertions(+), 5 deletions(-)
+
+commit 074ea787493a37ae8f68d17be7820f13fff57520
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 17:53:10 2010 +0100
+
+    Add ltra, ltrm, and rtla features
+
+ src/hb-ot-shape.cc | 60
+ +++++++++++++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 48 insertions(+), 12 deletions(-)
+
+commit 1ce7b87c4d8d1ab3ec1d5198351d71b7199f7c64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 17:31:45 2010 +0100
+
+    Cleanup bitmask allocation
+
+ src/hb-buffer-private.hh | 16 +++++++++++++
+ src/hb-buffer.cc         | 36 +++++++++++++++++++++++++++++
+ src/hb-ot-shape.cc       | 60
+ +++++++++++++++++++++---------------------------
+ 3 files changed, 78 insertions(+), 34 deletions(-)
+
+commit dd22a8f7bfd424a69286e90f79d2a23af6e89ec1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 16:43:17 2010 +0100
+
+    Add note
+
+ src/hb-ot-layout-gsub-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit cbd1d6a63a5d696b7d6a5aba9ee7305ea228416a
+Author: Martin Hosken <martin_hosken@sil.org>
+Date:   Fri May 21 15:16:43 2010 +0100
+
+    Rename Grxxx to HbGrxxx
+
+ src/hb-graphite.cc | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit 0375bdd2027767ee7bebef1ed289b33dc64f430e
+Author: Martin Hosken <martin_hosken@sil.org>
+Date:   Fri May 21 15:01:37 2010 +0100
+
+    Rename classes from Grxxx to HbGrxxx
+
+ src/hb-graphite.cc | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit a5a72e004bb7123445c2c3a94352d358fc80d904
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 15:12:52 2010 +0100
+
+    Add hb-ot-shape.h, oops.
+
+ src/hb-ot-shape.h | 44 ++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 44 insertions(+)
+
+commit aa62a402a72bdecad2a955dbfaf6e24cd2c00e55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 14:42:11 2010 +0100
+
+    Fix Makefile to install hb-ot-shape.h
+
+ src/Makefile.am | 2 +-
+ src/hb-ot.h     | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 9722b8f005a10fd16e841df4da3ccd80be66e296
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 14:37:47 2010 +0100
+
+    Simple renames
+
+ src/hb-ot-shape.cc | 36 ++++++++++++++++++------------------
+ 1 file changed, 18 insertions(+), 18 deletions(-)
+
+commit 02f28550d785671cf92fd4239c5f913f7e71585f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 14:37:28 2010 +0100
+
+    Graphite also forces us to link to libstdc++ currently
+
+ src/Makefile.am | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit ca663bb23c16f6a1f04efa6e10dad0e3e7c260a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 14:34:23 2010 +0100
+
+    Move main shaper code into hb_ot_shape()
+
+ src/hb-ot-shape-private.hh |  53 -----------
+ src/hb-ot-shape.cc         | 225
+ ++++++++++++++++++++++++++++++++++++++++++---
+ src/hb-shape.cc            | 209
+ +----------------------------------------
+ 3 files changed, 214 insertions(+), 273 deletions(-)
+
+commit 7acd232d36c2b2ed03823e6aa6bb2b814bf673b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 14:20:48 2010 +0100
+
+    Fix test failing
+
+ src/hb-graphite.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dd47924d88d86b83e7f3ab040de6e7136ac0ca09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 14:18:08 2010 +0100
+
+    Fix warnings
+
+ src/hb-graphite.cc | 14 +++++---------
+ 1 file changed, 5 insertions(+), 9 deletions(-)
+
+commit 305ba8671553cd955c20a54db622666c0bb02532
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 14:02:20 2010 +0100
+
+    Import Graphite shaping backend by Martin Hosken
+
+ configure.ac       |   6 ++
+ src/Makefile.am    |  11 ++
+ src/hb-graphite.cc | 308
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-graphite.h  |  46 ++++++++
+ src/hb-shape.cc    |  15 +++
+ 5 files changed, 386 insertions(+)
+
+commit 3ba6818ba9be950e46902f0239f2451ec0e65d44
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 13:51:29 2010 +0100
+
+    Update the Python module
+
+ contrib/python/lib/harfbuzz.pyx | 40
+ +++++++++++++++++++++-------------------
+ 1 file changed, 21 insertions(+), 19 deletions(-)
+
+commit 83f34677bcbc6bb194940407b0fcb23575650e3d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 13:43:49 2010 +0100
+
+    Add hb_tag_from_string()
+
+ src/Makefile.am |  1 +
+ src/hb-common.c | 41 +++++++++++++++++++++++++++++++++++++++++
+ src/hb-common.h |  3 +++
+ 3 files changed, 45 insertions(+)
+
+commit 4a9a5c0b06e8aa5d15327242609a7c766d3e0e94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 13:33:46 2010 +0100
+
+    Don't allocate bits for features not available
+
+ src/hb-ot-shape.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit e53d77142ac4ecbe38ab3235491fa93cb7ff16ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 13:32:38 2010 +0100
+
+    Speed up feature mask setting
+
+    Patch from Jonathan Kew.
+
+ src/hb-ot-shape.cc | 31 +++++++++++++++++++++++++------
+ 1 file changed, 25 insertions(+), 6 deletions(-)
+
+commit 4fa67f34ecc65056ce60a572213fbdae66e0423b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 13:29:12 2010 +0100
+
+    Add Unicode 5.2 scripts
+
+ src/hb-icu.c     | 29 ++++++++++++++++++++++++++++-
+ src/hb-ot-tag.c  | 21 +++++++++++++++++++--
+ src/hb-unicode.c | 19 ++++++++++++++++++-
+ src/hb-unicode.h | 19 ++++++++++++++++++-
+ 4 files changed, 83 insertions(+), 5 deletions(-)
+
+commit ee1b322100a6bd575b999904592abbd9fed5587f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 12:55:57 2010 +0100
+
+    Fix feature mask setting
+
+ src/hb-ot-shape.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit b490fa343322f1b5abaf880abc073287c1f34132
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 11:15:07 2010 +0100
+
+    Add hb_ot_tag_to_script()
+
+ src/hb-ot-tag.c | 14 ++++++++++++++
+ src/hb-ot-tag.h |  3 +++
+ 2 files changed, 17 insertions(+)
+
+commit 50355309047765558ef8f5d60aefed42a7f954cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 21 10:33:23 2010 +0100
+
+    Add Python wrapper from Martin Hosken
+
+ contrib/python/lib/harfbuzz.pyx   | 306
+ ++++++++++++++++++++++++++++++++++++++
+ contrib/python/runpy              |   2 +
+ contrib/python/scripts/hbtestfont |  35 +++++
+ contrib/python/setup.py           |  24 +++
+ 4 files changed, 367 insertions(+)
+
+commit 280af1bddb958ff97cf7ce12fe7ec2b6352e61d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 18:33:35 2010 +0100
+
+    Let hb_face_get_table() return NULL if table not found
+
+ src/hb-font.cc              | 2 +-
+ src/hb-font.h               | 1 +
+ src/hb-open-type-private.hh | 3 +++
+ 3 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 1cdbfd944eecb58587461f57f037e47a44f39990
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 17:47:28 2010 +0100
+
+    Fix alternate, again
+
+ src/hb-ot-layout-gsub-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit fdca3d51603bd6bef6a4b0ee4a560f7dcd2f1d37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 17:46:20 2010 +0100
+
+    Fix alternate off-by-one
+
+ src/hb-ot-layout-gsub-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b634beb39e0a4fef7167a8af646f6b2d8cafe69b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 17:44:52 2010 +0100
+
+    Fix delta scale, again...
+
+ src/hb-ot-layout-common-private.hh |  8 ++++++++
+ src/hb-ot-layout-gdef-private.hh   |  3 +--
+ src/hb-ot-layout-gpos-private.hh   | 12 ++++++------
+ src/hb-ot-layout-private.hh        |  2 +-
+ 4 files changed, 16 insertions(+), 9 deletions(-)
+
+commit 40335d4533ac2b08121c9dc6003f3ebc5b44a67b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 17:35:14 2010 +0100
+
+    Remove unused operator
+
+ src/hb-ot-layout-common-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit f7acd8df5146155b51d6f50aeb04f54f3030c1c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 17:26:35 2010 +0100
+
+    Do alternate glyph selection!
+
+    Kinda hand-wavy right now.  Not tested.
+
+ src/hb-ot-layout-gpos-private.hh     | 12 +++++++-----
+ src/hb-ot-layout-gsub-private.hh     | 20 +++++++++-----------
+ src/hb-ot-layout-gsubgpos-private.hh |  1 +
+ src/hb-private.h                     | 19 ++++++++++++++++++-
+ 4 files changed, 35 insertions(+), 17 deletions(-)
+
+commit 750a2294553d252e28875b605fe61fd9d6696e0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 16:23:27 2010 +0100
+
+    get_table() is allowed to return NULL.  Use that to simplify code
+
+ src/hb-font.cc | 2 +-
+ src/hb-ft.cc   | 6 +++---
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 99d9ef785f108df76f80a307eaa2784685ea86ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 15:47:49 2010 +0100
+
+    Write hb_face_create_for_data() in terms of
+    hb_face_create_for_tables()
+
+    Fixes lack of head_table initialization in create_for_tables() also.
+
+ src/hb-font.cc | 35 ++++++++++++-----------------------
+ 1 file changed, 12 insertions(+), 23 deletions(-)
+
+commit 6774463883978b00b4d8c719ed75edfc4537c77f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 15:40:12 2010 +0100
+
+    Apply user features to ranges!
+
+ src/hb-ot-shape.cc | 23 ++++++++++++++++++++++-
+ 1 file changed, 22 insertions(+), 1 deletion(-)
+
+commit 9b6023338530a2dbb8214eb4391ef3e8372f3892
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 15:31:12 2010 +0100
+
+    Add _hb_bit_storage()
+
+ src/hb-private.h | 35 ++++++++++++++++++++++-------------
+ 1 file changed, 22 insertions(+), 13 deletions(-)
+
+commit 6b1b957f6d2955cbe4fa97e2659e033b3eaaf4d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 15:14:44 2010 +0100
+
+    Add lookup_map
+
+ src/hb-ot-shape.cc | 48 +++++++++++++++++++++++++++++++++---------------
+ 1 file changed, 33 insertions(+), 15 deletions(-)
+
+commit 60010a0c4d8efae5c61a0c9cf10cfe2c1860f41e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 14:05:02 2010 +0100
+
+    Update always-apply mask from 0xFFFF to 1
+
+    We plan to use the first bit to be always on.
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 009aad567863c05ee2ec4a3ee76fe0ee79c767bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 14:00:57 2010 +0100
+
+    Invert the mask logic
+
+    Before, the mask in the buffer was inverted.  That is, a 0 bit meant
+    feature should be applied and 1 meant not applied, whereas in the
+    lookups, the logic was positive.
+
+    Now both are in sync.  When calling hb_buffer_add_glyph() manually,
+    the mask should be 1 instead of 0.
+
+ src/hb-buffer.cc                 | 2 +-
+ src/hb-ot-layout-gpos-private.hh | 2 +-
+ src/hb-ot-layout-gsub-private.hh | 4 ++--
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 7f411dbfd9f8d5360c948531ff9f6c3998d1d897
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 13:40:18 2010 +0100
+
+    Apply user features
+
+    No ranges yet
+
+ src/hb-ot-shape.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 0db299ccad346d9ea5573ea8408b78d9997bd379
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 20 13:30:09 2010 +0100
+
+    Change hb_feature_t to keep tag/int instead of string
+
+ src/hb-shape.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0a4399ca228d244e646abdb3487da0f13b228889
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 19 15:45:06 2010 -0400
+
+    Fix scale issues
+
+    hb_font_set_scale() now sets the value to be used to represent a unit
+    pixel.  For example, if rendering a 10px font with a 26.6
+    representation,
+    you would set scale to (10 << 6).  For 10px in 16.16 you would set
+    it to
+    (10 << 16).  This space should be the same space that the
+    get_glyph_metrics
+    and get_kerning callbacks work in.
+
+ src/hb-common.h                  |  1 -
+ src/hb-font-private.hh           |  8 +++-----
+ src/hb-font.cc                   | 12 ++++++------
+ src/hb-font.h                    | 12 +++---------
+ src/hb-ft.cc                     |  4 ++--
+ src/hb-ot-layout-gdef-private.hh |  6 +++---
+ src/hb-ot-layout-gpos-private.hh | 37
+ +++++++++++++++++--------------------
+ src/hb-ot-layout-gsub-private.hh |  2 +-
+ src/hb-ot-layout-private.hh      | 20 +++++++++++---------
+ src/hb-ot-layout.cc              | 31 +++++++++++++++----------------
+ src/hb-private.h                 |  4 ----
+ 11 files changed, 61 insertions(+), 76 deletions(-)
+
+commit cf5585cfa6cac6fdf627a99941299e76af5ae0f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 19 12:03:35 2010 -0400
+
+    Add 'head' table
+
+ src/Makefile.am             |   1 +
+ src/hb-font-private.hh      |   5 ++
+ src/hb-font.cc              |   9 ++++
+ src/hb-open-type-private.hh |   2 +-
+ src/hb-ot-head-private.hh   | 128
+ ++++++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 144 insertions(+), 1 deletion(-)
+
+commit e29caf3f943b2b6f4997f469f7274252c82f465e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 19 11:47:17 2010 -0400
+
+    Add LONGDATETIME
+
+ src/hb-open-type-private.hh | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+commit f415755fdf011d3fa3b9aad04c38f2255dd7acf8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 17 15:14:14 2010 -0400
+
+    Minor
+
+ src/hb-ot-layout.cc | 52
+ +++++++++++++++++++++++++++-------------------------
+ 1 file changed, 27 insertions(+), 25 deletions(-)
+
+commit 73af7756dc6d3961f176854246e5722baff101fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 23:38:08 2010 -0400
+
+    Indent
+
+ src/hb-ot-layout-gsub-private.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 3567b87cce541dfb0af7caf024ec67c9d3c09214
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 23:28:44 2010 -0400
+
+    Add an inline version of hb_buffer_ensure()
+
+ src/hb-buffer.cc | 117
+ ++++++++++++++++++++++++++++++-------------------------
+ 1 file changed, 63 insertions(+), 54 deletions(-)
+
+commit a6a79df5fe2ed2cd307e7a991346faee164e70d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 23:20:16 2010 -0400
+
+    Handle malloc failture in the buffer
+
+ src/hb-buffer-private.hh |  5 ++--
+ src/hb-buffer.cc         | 71
+ +++++++++++++++++++++++++++++-------------------
+ src/hb-buffer.h          |  2 +-
+ 3 files changed, 47 insertions(+), 31 deletions(-)
+
+commit ca54a12658510f9aa0b2db82f20a8fac230d6bb6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 22:25:42 2010 -0400
+
+    Minor
+
+ src/hb-shape.cc | 60
+ +++++++++++++++++++++++++--------------------------------
+ 1 file changed, 26 insertions(+), 34 deletions(-)
+
+commit 910a33fe8457a8e13f7eb77fc92fa59c31f5e8fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 22:13:38 2010 -0400
+
+    Update buffer docs
+
+ src/hb-buffer-private.hh | 13 +++++++------
+ src/hb-buffer.cc         | 16 ++++++++--------
+ 2 files changed, 15 insertions(+), 14 deletions(-)
+
+commit 36b73c80df91e96492357c6da945e081e9046a93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 22:10:39 2010 -0400
+
+    Shortening buffer accessors: rename buffer->in_pos to buffer->i
+
+ src/hb-buffer-private.hh             |  2 +-
+ src/hb-buffer.cc                     | 52 ++++++++++----------
+ src/hb-ot-layout-gpos-private.hh     | 94
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gsub-private.hh     | 48 +++++++++---------
+ src/hb-ot-layout-gsubgpos-private.hh | 46 +++++++++---------
+ src/hb-shape.cc                      | 40 +++++++--------
+ 6 files changed, 141 insertions(+), 141 deletions(-)
+
+commit 29427c5c51ac70aca53ed523fa5ddb3de4355fb0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 22:08:22 2010 -0400
+
+    Shortening buffer accessors: rename buffer->out_length to
+    buffer->out_len
+
+ src/hb-buffer-private.hh             |  2 +-
+ src/hb-buffer.cc                     | 52
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gsub-private.hh     |  2 +-
+ src/hb-ot-layout-gsubgpos-private.hh |  6 ++---
+ 4 files changed, 31 insertions(+), 31 deletions(-)
+
+commit 6960350be97f24e97140391025b56369c393a3df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 22:07:46 2010 -0400
+
+    Shortening buffer accessors: rename buffer->in_length to buffer->len
+
+ src/hb-buffer-private.hh             |  2 +-
+ src/hb-buffer.cc                     | 26 +++++++++++++-------------
+ src/hb-ot-layout-gpos-private.hh     |  8 ++++----
+ src/hb-ot-layout-gsub-private.hh     |  8 ++++----
+ src/hb-ot-layout-gsubgpos-private.hh |  8 ++++----
+ src/hb-shape.cc                      | 12 ++++++------
+ 6 files changed, 32 insertions(+), 32 deletions(-)
+
+commit 1b621823f3e31b48c80cc8b0691dfa873ba086cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 22:05:53 2010 -0400
+
+    Shortening buffer accessors: rename buffer->positions to buffer->pos
+
+ src/hb-buffer-private.hh         |  4 ++--
+ src/hb-buffer.cc                 | 32 ++++++++++++++++----------------
+ src/hb-ot-layout-gpos-private.hh | 26 +++++++++++++-------------
+ src/hb-shape.cc                  | 10 +++++-----
+ 4 files changed, 36 insertions(+), 36 deletions(-)
+
+commit 9d5e26df0877aa5b187764ba09bd7bf221e92968
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 22:03:11 2010 -0400
+
+    Shortening buffer accessors: rename buffer->out_string to
+    buffer->out_info
+
+ src/hb-buffer-private.hh             |  2 +-
+ src/hb-buffer.cc                     | 56
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gsubgpos-private.hh |  4 +--
+ 3 files changed, 31 insertions(+), 31 deletions(-)
+
+commit 7e7007a1c9bf2c07a8369752126ece8fa6164248
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 22:02:37 2010 -0400
+
+    Shortening buffer accessors: rename buffer->in_string to buffer->info
+
+ src/hb-buffer-private.hh             |  2 +-
+ src/hb-buffer.cc                     | 82
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gpos-private.hh     | 58 ++++++++++++-------------
+ src/hb-ot-layout-gsub-private.hh     | 30 ++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh | 26 ++++++------
+ src/hb-shape.cc                      | 18 ++++----
+ 6 files changed, 108 insertions(+), 108 deletions(-)
+
+commit 8e6b6bb2932946ebc7b01c3abf575b654c741e20
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 21:58:22 2010 -0400
+
+    Merge buffer->out_pos and buffer->out_length
+
+ src/hb-buffer-private.hh             |  1 -
+ src/hb-buffer.cc                     | 48
+ +++++++++++++++---------------------
+ src/hb-ot-layout-gsub-private.hh     |  2 +-
+ src/hb-ot-layout-gsubgpos-private.hh |  6 ++---
+ 4 files changed, 24 insertions(+), 33 deletions(-)
+
+commit 22f668eb9ad5f62d9fcd2e0c826ea78977687e5c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 21:41:04 2010 -0400
+
+    Remove the unused BUFFER macro
+
+ src/hb-buffer-private.hh             | 6 ------
+ src/hb-ot-layout-gpos-private.hh     | 6 ------
+ src/hb-ot-layout-gsub-private.hh     | 6 ------
+ src/hb-ot-layout-gsubgpos-private.hh | 5 -----
+ 4 files changed, 23 deletions(-)
+
+commit 7e53ebe478597778c25c197ff9f0cb379f1d0043
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 21:38:13 2010 -0400
+
+    Remove the IN_CURGLYPH() macro
+
+ src/hb-buffer-private.hh             |  3 ---
+ src/hb-ot-layout-gpos-private.hh     | 24 ++++++++++++------------
+ src/hb-ot-layout-gsub-private.hh     | 16 ++++++++--------
+ src/hb-ot-layout-gsubgpos-private.hh | 16 ++++++++--------
+ src/hb-shape.cc                      | 14 +++++++-------
+ 5 files changed, 35 insertions(+), 38 deletions(-)
+
+commit d784da1923ff2ca093f8b0210449731d376b7513
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 21:37:18 2010 -0400
+
+    Remove the IN_CURINFO() macro
+
+ src/hb-buffer-private.hh             | 1 -
+ src/hb-ot-layout-gpos-private.hh     | 2 +-
+ src/hb-ot-layout-gsub-private.hh     | 4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 4 files changed, 4 insertions(+), 5 deletions(-)
+
+commit 281f59b4fb16f7c73767eb042a91f70f4c109b3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 21:34:22 2010 -0400
+
+    Remove IN_INFO() and IN_NEXTGLYPH() macros
+
+ src/hb-buffer-private.hh             |  2 --
+ src/hb-ot-layout-gpos-private.hh     | 10 +++++-----
+ src/hb-ot-layout-gsub-private.hh     |  2 +-
+ src/hb-ot-layout-gsubgpos-private.hh |  4 ++--
+ src/hb-shape.cc                      |  4 ++--
+ 5 files changed, 10 insertions(+), 12 deletions(-)
+
+commit 6e489cdf7623ac627d06d59a80ecea03ca97dc1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 21:07:35 2010 -0400
+
+    Remove the IN_GLYPH() macro
+
+ src/hb-buffer-private.hh             |  1 -
+ src/hb-ot-layout-gpos-private.hh     | 12 ++++++------
+ src/hb-ot-layout-gsub-private.hh     |  2 +-
+ src/hb-ot-layout-gsubgpos-private.hh |  4 ++--
+ src/hb-shape.cc                      |  2 +-
+ 5 files changed, 10 insertions(+), 11 deletions(-)
+
+commit 01feb74c78a3a302fa3472a0be7b2a1d52fd1ba3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 21:00:08 2010 -0400
+
+    Remove the IN_CLUSTER() macro
+
+ src/hb-buffer-private.hh | 1 -
+ src/hb-shape.cc          | 2 +-
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit d63a1e089acad9ab9f80addd936d36b6d38fb46a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 20:30:07 2010 -0400
+
+    Remove the IN_MASK() macro
+
+ src/hb-buffer-private.hh         | 1 -
+ src/hb-ot-layout-gpos-private.hh | 2 +-
+ src/hb-ot-layout-gsub-private.hh | 4 ++--
+ 3 files changed, 3 insertions(+), 4 deletions(-)
+
+commit 89e2834dabd2d17f2823c51fe3a7fcadeaba7a59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 20:25:55 2010 -0400
+
+    Remove the IN_LIGID() macro
+
+ src/hb-buffer-private.hh         | 1 -
+ src/hb-ot-layout-gpos-private.hh | 4 ++--
+ src/hb-ot-layout-gsub-private.hh | 2 +-
+ 3 files changed, 3 insertions(+), 4 deletions(-)
+
+commit 4a871041f4718834afa312ed17cdd157603468b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 20:25:04 2010 -0400
+
+    Remove IN_COMPONENT() macro
+
+ src/hb-buffer-private.hh         | 1 -
+ src/hb-ot-layout-gpos-private.hh | 8 ++++----
+ src/hb-ot-layout-gsub-private.hh | 2 +-
+ 3 files changed, 5 insertions(+), 6 deletions(-)
+
+commit 27da6dd89a359f7ef340c646c4cb79373782261d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 20:17:50 2010 -0400
+
+    Remove OUT_GLYPH() and OUT_INFO() macros
+
+ src/hb-buffer-private.hh             | 2 --
+ src/hb-ot-layout-gsubgpos-private.hh | 4 ++--
+ 2 files changed, 2 insertions(+), 4 deletions(-)
+
+commit cc6ae7ff91eeb93bef153f331ed02b500062f90e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 20:09:48 2010 -0400
+
+    Fix lookahead matching.  Oops!
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3109375b849f340b4807724218010c53dea58082
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 14 19:55:27 2010 -0400
+
+    Remove POSITION() and CURPOSITION() macros
+
+ src/hb-buffer-private.hh         |  2 --
+ src/hb-ot-layout-gpos-private.hh | 54
+ ++++++++++++++++++++--------------------
+ src/hb-shape.cc                  | 10 ++++----
+ 3 files changed, 32 insertions(+), 34 deletions(-)
+
+commit d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 13 14:18:49 2010 -0400
+
+    s/\<context\>/c/g
+
+ src/hb-open-file-private.hh          |  28 +--
+ src/hb-open-type-private.hh          | 100 ++++----
+ src/hb-ot-layout-common-private.hh   |  84 +++----
+ src/hb-ot-layout-gdef-private.hh     |  98 ++++----
+ src/hb-ot-layout-gpos-private.hh     | 460
+ +++++++++++++++++------------------
+ src/hb-ot-layout-gsub-private.hh     | 306 +++++++++++------------
+ src/hb-ot-layout-gsubgpos-private.hh | 258 ++++++++++----------
+ src/hb-ot-layout.cc                  |  24 +-
+ 8 files changed, 679 insertions(+), 679 deletions(-)
+
+commit f679635893eebc13402c5ee51a6f106eed0c76be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 13 13:34:17 2010 -0400
+
+    Don't use variable-length-arrays
+
+ src/hb-open-type-private.hh | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 72071a8afaba2952fe42be093024ae9dbd37f233
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 13 13:22:24 2010 -0400
+
+    Add a few more buffer convenience methods
+
+ src/hb-buffer-private.hh         | 12 ++++++++++++
+ src/hb-ot-layout-gsub-private.hh | 20 ++++++++++----------
+ 2 files changed, 22 insertions(+), 10 deletions(-)
+
+commit 11a81612e51c598e857507c268312206423cbfca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 13 00:01:40 2010 -0400
+
+    Minor
+
+ src/hb-unicode.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3f93518a634cb1852bf050877db23b9b9203ad03
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 12 23:48:40 2010 -0400
+
+    Improve check for internal symbols
+
+ src/check-internal-symbols.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 357d0f29c431b842179ee4b56c21bcc402178ce7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 12 23:46:16 2010 -0400
+
+    Make HB_PRIVATE more useful
+
+    So we can apply it to class methods also.  Not sure if that works!
+
+ src/hb-blob-private.h    | 2 +-
+ src/hb-font-private.hh   | 4 ++--
+ src/hb-private.h         | 2 +-
+ src/hb-unicode-private.h | 3 +--
+ 4 files changed, 5 insertions(+), 6 deletions(-)
+
+commit 1d5e78013696b10751d8a35027619e81978e1312
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 12 23:43:00 2010 -0400
+
+    Add a few other buffer methods
+
+ src/hb-buffer-private.hh             | 11 +++++++----
+ src/hb-buffer.cc                     |  7 -------
+ src/hb-ot-layout-gsub-private.hh     | 10 +++++-----
+ src/hb-ot-layout-gsubgpos-private.hh |  4 ++--
+ 4 files changed, 14 insertions(+), 18 deletions(-)
+
+commit d0316a81f59a4e814b0af78797d915d7ce04d119
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 12 23:34:52 2010 -0400
+
+    Add buffer->swap()
+
+ src/hb-buffer-private.hh         | 68
+ ++++++++++++++++++++++------------------
+ src/hb-ot-layout-gsub-private.hh |  2 +-
+ 2 files changed, 38 insertions(+), 32 deletions(-)
+
+commit 3b649a38b5772dd7aba7f07ff7698a7f427f421f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 12 23:28:38 2010 -0400
+
+    Add check for internal symbols
+
+ src/Makefile.am               |  3 ++-
+ src/check-internal-symbols.sh | 28 ++++++++++++++++++++++++++++
+ 2 files changed, 30 insertions(+), 1 deletion(-)
+
+commit eee8598d75d3af692d9ececf7e8ac458e892ba9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 12 23:22:55 2010 -0400
+
+    Hide internal symbols
+
+ src/hb-ot-layout-private.hh | 4 ++--
+ src/hb-private.h            | 8 ++++----
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 8951fc2c82f2db4865da6d9e303fce419b6363bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 12 23:13:39 2010 -0400
+
+    Add buffer->allocate_lig_id()
+
+ src/hb-buffer-private.hh         | 5 ++---
+ src/hb-buffer.cc                 | 6 ------
+ src/hb-ot-layout-gsub-private.hh | 4 ++--
+ 3 files changed, 4 insertions(+), 11 deletions(-)
+
+commit 1ce4dc95dbb28842085342aea4f9d12cbe9671a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 12 18:29:25 2010 -0400
+
+    Use bit tricks for HB_DIRECTION_IS_*
+
+    We already depend on the exact values of the direction enum
+    in HB_DIRECTION_REVERSE(), so we may as well use that.
+
+ src/hb-common.h | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 22da7fd94d6318c52df69d70470a85464ffc533d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 12 18:23:21 2010 -0400
+
+    Rename a few files to be C++ sources
+
+    In anticipation for buffer revamp coming.
+
+ src/Makefile.am                                         | 16
+ ++++++++--------
+ src/{hb-buffer-private.h => hb-buffer-private.hh}       |  2 +-
+ src/{hb-buffer.c => hb-buffer.cc}                       | 14
+ +++++++-------
+ src/hb-common.h                                         |  1 +
+ src/{hb-font-private.h => hb-font-private.hh}           |  2 +-
+ src/hb-font.cc                                          |  4 ++--
+ src/{hb-ft.c => hb-ft.cc}                               |  8 ++++----
+ src/hb-ot-layout-common-private.hh                      |  2 +-
+ src/hb-ot-layout-gdef-private.hh                        |  2 +-
+ src/hb-ot-layout-gsubgpos-private.hh                    |  2 +-
+ src/{hb-ot-layout-private.h => hb-ot-layout-private.hh} |  2 +-
+ src/hb-ot-layout.cc                                     |  2 +-
+ src/{hb-ot-shape-private.h => hb-ot-shape-private.hh}   |  0
+ src/{hb-ot-shape.c => hb-ot-shape.cc}                   |  4 ++--
+ src/{hb-shape.c => hb-shape.cc}                         |  6 +++---
+ 15 files changed, 34 insertions(+), 33 deletions(-)
+
+commit c3df649f258b334e93c7626a43cd8ebfbd5a610e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 11 13:54:12 2010 -0400
+
+    Fix comment
+
+ src/hb-buffer-private.h | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 281f08954a1d96d7807153c25073b8eb7630703b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 11 11:37:58 2010 -0400
+
+    Remove obsolete friend
+
+ src/hb-ot-layout-gpos-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 70c9bfd5646a4a55a7f43c0cf0b5ac5993615d5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 11 00:23:50 2010 -0400
+
+    Simplify PairSet
+
+ src/hb-ot-layout-gpos-private.hh | 101
+ +++++++++++++++++++++------------------
+ 1 file changed, 54 insertions(+), 47 deletions(-)
+
+commit 97e7f8f305c47caf2968a9da3b8407825547286d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 11 00:11:36 2010 -0400
+
+    Add CONST_FUNC annotation
+
+ src/hb-private.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 494d28ad988e505c1c45cc35a7ec6b880cfec5fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 23:50:07 2010 -0400
+
+    Simplify likely() implementation
+
+    Shrinks .text by 1%!
+
+ src/hb-private.h | 10 +---------
+ 1 file changed, 1 insertion(+), 9 deletions(-)
+
+commit 75651b20871047d3ec17f4221794b8ef5d60e14b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 23:44:51 2010 -0400
+
+    Fix warnings
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4c20d8c057738b66150a88472714690e137884f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 23:27:54 2010 -0400
+
+    Sprinkle a few strategic likely()'s
+
+    Shrinks the code size by some 2% even.
+
+ src/hb-open-file-private.hh |  4 ++--
+ src/hb-open-type-private.hh | 20 ++++++++++----------
+ 2 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 69cb28bc13d236a01acf40da62e345c7e83ccba7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 23:13:08 2010 -0400
+
+    Remove a few likely()'s
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ src/hb-ot-layout-gpos-private.hh   | 8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 24552ecf92982fe561dc47d5102fcf1a7b337c70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 23:08:41 2010 -0400
+
+    Remove excess sub_format sanitize
+
+ src/hb-ot-layout-gpos-private.hh | 1 -
+ src/hb-ot-layout-gsub-private.hh | 1 -
+ 2 files changed, 2 deletions(-)
+
+commit f7adc5e9be352ac31ad3ab847abb6fceb239aa12
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 22:41:50 2010 -0400
+
+    Shrink NullPool now that we have accurate size tracking
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3d44fb6f15177dc6518166e435597936b044acc1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 22:22:54 2010 -0400
+
+    Fix warning
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b5db4f1e4eefa266a71a28b5496f47ff9d1a81e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 22:22:22 2010 -0400
+
+    Clean up NO_INDEX
+
+ src/hb-open-file-private.hh        |  2 +-
+ src/hb-open-type-private.hh        | 10 ++++++----
+ src/hb-ot-layout-common-private.hh | 17 ++++-------------
+ src/hb-ot-layout.cc                |  8 ++++----
+ src/main.cc                        |  2 +-
+ 5 files changed, 16 insertions(+), 23 deletions(-)
+
+commit fe9bc070e1d545b0df2ea548eebf5a1fc4c92ddc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 21:39:24 2010 -0400
+
+    Fix awful confusion between lookup format and subtable format
+
+    As reported by John Daggett.
+
+ src/hb-ot-layout-gpos-private.hh | 14 +++++++-------
+ src/hb-ot-layout-gsub-private.hh | 14 +++++++-------
+ 2 files changed, 14 insertions(+), 14 deletions(-)
+
+commit 458ecbb60bb7e8e32aca62a562586d921d5396aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 21:11:35 2010 -0400
+
+    Fix tracing order
+
+ src/hb-open-type-private.hh          | 14 +++++---------
+ src/hb-ot-layout-gsubgpos-private.hh |  3 +--
+ 2 files changed, 6 insertions(+), 11 deletions(-)
+
+commit 48146e5612f6d272d6962f6829c6d64a31edef89
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 20:07:56 2010 -0400
+
+    Don't fail sanitize on NULL data
+
+ src/hb-open-type-private.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit d2c2ca8faf62fc380d4717d286556139a62d2356
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 19:58:25 2010 -0400
+
+    Fix comment
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b435ab7e29c388e3b100f729957319931625a3a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 19:51:57 2010 -0400
+
+    Fix accessing tables from NULL pointer
+
+ src/hb-font.cc              | 2 +-
+ src/hb-open-type-private.hh | 5 +++++
+ src/hb-ot-layout.cc         | 6 +++---
+ 3 files changed, 9 insertions(+), 4 deletions(-)
+
+commit dacebcadae36b35531d635d81df2afb937677b7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 19:45:41 2010 -0400
+
+    Simplify unions
+
+ src/hb-open-file-private.hh          |  24 +++----
+ src/hb-ot-layout-common-private.hh   |  24 +++----
+ src/hb-ot-layout-gdef-private.hh     |  24 +++----
+ src/hb-ot-layout-gpos-private.hh     | 120
+ +++++++++++++++++------------------
+ src/hb-ot-layout-gsub-private.hh     |  88 ++++++++++++-------------
+ src/hb-ot-layout-gsubgpos-private.hh |  44 ++++++-------
+ 6 files changed, 163 insertions(+), 161 deletions(-)
+
+commit fd671e02433bcbc1fd07901fa2d6065020f41ba8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 19:02:32 2010 -0400
+
+    Remove unused macro
+
+ src/hb-open-type-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 0eb9fc6e37935707dba2bf4b3705de2161a08cb7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 19:01:17 2010 -0400
+
+    Change DEFINE_SIZE_VAR to DEFINE_SIZE_ARRAY
+
+ src/hb-open-file-private.hh          |  4 ++--
+ src/hb-open-type-private.hh          | 10 +++++-----
+ src/hb-ot-layout-common-private.hh   | 27 +++++++++++++++------------
+ src/hb-ot-layout-gdef-private.hh     | 10 +++++-----
+ src/hb-ot-layout-gpos-private.hh     | 25 ++++++++++++-------------
+ src/hb-ot-layout-gsub-private.hh     | 14 +++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh | 16 ++++++++--------
+ 7 files changed, 54 insertions(+), 52 deletions(-)
+
+commit 596e471aa5053d955fb5d5b5923088c8814469b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 18:47:48 2010 -0400
+
+    Cleanup DEFINE_SIZE_VAR2
+
+ src/hb-open-type-private.hh          | 18 +++++++++++-------
+ src/hb-ot-layout-common-private.hh   |  6 +++---
+ src/hb-ot-layout-gdef-private.hh     |  4 ++--
+ src/hb-ot-layout-gpos-private.hh     |  4 ++--
+ src/hb-ot-layout-gsub-private.hh     |  2 +-
+ src/hb-ot-layout-gsubgpos-private.hh |  4 ++--
+ 6 files changed, 21 insertions(+), 17 deletions(-)
+
+commit 33afa4e2dc352f08cc094703e3f01d3ecd83b354
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 18:35:02 2010 -0400
+
+    Minor
+
+ src/hb-open-type-private.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit b961518b9611471ff7060e97686e5625974847eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 18:20:54 2010 -0400
+
+    Simplify array access
+
+ src/hb-open-type-private.hh          | 29 ++++++++++-------------------
+ src/hb-ot-layout-common-private.hh   |  8 ++++----
+ src/hb-ot-layout-gsub-private.hh     |  6 +++---
+ src/hb-ot-layout-gsubgpos-private.hh | 16 ++++++++--------
+ 4 files changed, 25 insertions(+), 34 deletions(-)
+
+commit 54842374c2b291ef208c51ae1d853ec0403ccf84
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 18:13:32 2010 -0400
+
+    Fix check_struct to check min_size instead of sizeof
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ed07422c33bbb52ff4d79e65986171e3f07697d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 18:08:46 2010 -0400
+
+    Further cleanup of sizeof
+
+ src/hb-open-type-private.hh          |  7 +++++--
+ src/hb-ot-layout-common-private.hh   |  4 ++++
+ src/hb-ot-layout-gdef-private.hh     |  4 ++++
+ src/hb-ot-layout-gpos-private.hh     | 10 +++++++---
+ src/hb-ot-layout-gsub-private.hh     |  4 +++-
+ src/hb-ot-layout-gsubgpos-private.hh |  2 ++
+ 6 files changed, 25 insertions(+), 6 deletions(-)
+
+commit a82ef7a893b773a17f7548375de9f588dfc83aba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 17:55:03 2010 -0400
+
+    Remove CastP completely
+
+ src/hb-open-type-private.hh | 39 +++++++++++++++++----------------------
+ 1 file changed, 17 insertions(+), 22 deletions(-)
+
+commit 40cbefe858192531ed64dd51d402f7ca7b8153a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 17:47:22 2010 -0400
+
+    Remove unnecessary casts
+
+ src/hb-open-type-private.hh          | 12 ++++++------
+ src/hb-ot-layout-common-private.hh   |  2 +-
+ src/hb-ot-layout-gpos-private.hh     | 34
+ +++++++++++++++++-----------------
+ src/hb-ot-layout-gsub-private.hh     |  4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 34
+ +++++++++++++++++-----------------
+ 5 files changed, 43 insertions(+), 43 deletions(-)
+
+commit 09766b1ec5ec55a61edbcd7a89ed3613cc92d4cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 17:36:03 2010 -0400
+
+    Make StructAtOffset take a pointer
+
+    Is safer.
+
+ src/hb-open-type-private.hh      | 26 +++++++++++++-------------
+ src/hb-ot-layout-gpos-private.hh |  6 +++---
+ src/hb-ot-layout-gsub-private.hh |  4 ++--
+ 3 files changed, 18 insertions(+), 18 deletions(-)
+
+commit bea34c7cbb583cf7660776e95cab3171590b8427
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 17:28:16 2010 -0400
+
+    Further cleanup of DEFINE_SIZE
+
+ src/hb-open-file-private.hh          |  2 +-
+ src/hb-open-type-private.hh          | 10 +++++-----
+ src/hb-ot-layout-common-private.hh   | 16 ++++++++--------
+ src/hb-ot-layout-gdef-private.hh     |  8 ++++----
+ src/hb-ot-layout-gpos-private.hh     | 16 +++++-----------
+ src/hb-ot-layout-gsub-private.hh     | 14 +++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh | 14 +++++++-------
+ 7 files changed, 37 insertions(+), 43 deletions(-)
+
+commit 0abcc3b48cfd51a22695c9e988938b2f45cb19d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 17:04:20 2010 -0400
+
+    Cleanup
+
+ src/hb-open-type-private.hh | 18 ++++++++++--------
+ 1 file changed, 10 insertions(+), 8 deletions(-)
+
+commit b3651231bf80bb7009214547a75ed90e21815c68
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 16:57:29 2010 -0400
+
+    Remove ASSERT_SIZE in favor of the safer DEFINE_SIZE_STATIC
+
+ src/hb-open-file-private.hh          |  3 ++-
+ src/hb-open-type-private.hh          | 20 +++++++++++++---
+ src/hb-ot-layout-common-private.hh   | 24 ++++++++++++--------
+ src/hb-ot-layout-gdef-private.hh     | 22 +++++++++++-------
+ src/hb-ot-layout-gpos-private.hh     | 44
+ ++++++++++++++++++++----------------
+ src/hb-ot-layout-gsub-private.hh     | 32 ++++++++++++++++----------
+ src/hb-ot-layout-gsubgpos-private.hh | 27 ++++++++++++++--------
+ src/hb-private.h                     |  2 --
+ 8 files changed, 109 insertions(+), 65 deletions(-)
+
+commit 569da92bc6956f42d9b2d65c784e184fb6380efe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 10 16:38:32 2010 -0400
+
+    Cleanup ASSERT_SIZE_VAR
+
+ src/hb-open-file-private.hh          |  9 ++++++---
+ src/hb-open-type-private.hh          |  6 ++++--
+ src/hb-ot-layout-common-private.hh   | 22 ++++++++++++----------
+ src/hb-ot-layout-gdef-private.hh     |  3 ++-
+ src/hb-ot-layout-gpos-private.hh     | 30 +++++++++++++++++++-----------
+ src/hb-ot-layout-gsubgpos-private.hh | 10 ++++++----
+ src/hb-private.h                     |  8 --------
+ 7 files changed, 49 insertions(+), 39 deletions(-)
+
+commit 99bf03459ff2f00cf3fb7fa3c8b8336ec9fcca56
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 6 19:37:32 2010 -0400
+
+    Whitespace
+
+ src/hb-ot-layout-gpos-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 65f46b00333e20ab8a52a4b350747507541ec1db
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 6 19:35:19 2010 -0400
+
+    Simplify DEFINE_NULL_DATA
+
+    Using ::min_size.
+
+ src/hb-open-type-private.hh        | 6 +++---
+ src/hb-ot-layout-common-private.hh | 9 +++++----
+ 2 files changed, 8 insertions(+), 7 deletions(-)
+
+commit e45d3f86f9a5f3d29ca35a282de7f98e702878f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 6 19:33:31 2010 -0400
+
+    Start cleaning up get_size()
+
+    So we know when the size is static and when dynamic.
+
+ src/hb-open-file-private.hh          |  7 +++---
+ src/hb-open-type-private.hh          | 42
+ +++++++++++++++++++++++++-----------
+ src/hb-ot-layout-common-private.hh   | 14 ++++++------
+ src/hb-ot-layout-gpos-private.hh     | 17 ++++++---------
+ src/hb-ot-layout-gsubgpos-private.hh | 19 ++++++++--------
+ 5 files changed, 55 insertions(+), 44 deletions(-)
+
+commit b157617644d1e38f680163889d1dc2e2f64d9ba3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 6 14:48:27 2010 -0400
+
+    Remove the last of SANITIZE macros: SANITIZE_SELF
+
+ src/hb-open-file-private.hh          |  4 ++--
+ src/hb-open-type-private.hh          | 21 ++++++++++++---------
+ src/hb-ot-layout-common-private.hh   | 16 ++++++++--------
+ src/hb-ot-layout-gdef-private.hh     |  6 +++---
+ src/hb-ot-layout-gpos-private.hh     | 26 +++++++++++++-------------
+ src/hb-ot-layout-gsubgpos-private.hh |  6 +++---
+ 6 files changed, 41 insertions(+), 38 deletions(-)
+
+commit 4f252fedc7136c66a9d7fbcb2978581986da6227
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 6 13:30:23 2010 -0400
+
+    Remove SANITIZE macro
+
+ src/hb-open-file-private.hh          |  4 ++--
+ src/hb-open-type-private.hh          |  6 ++----
+ src/hb-ot-layout-common-private.hh   | 18 +++++++++---------
+ src/hb-ot-layout-gdef-private.hh     |  6 +++---
+ src/hb-ot-layout-gpos-private.hh     | 18 +++++++++---------
+ src/hb-ot-layout-gsub-private.hh     | 26 +++++++++++++-------------
+ src/hb-ot-layout-gsubgpos-private.hh | 22 +++++++++++-----------
+ 7 files changed, 49 insertions(+), 51 deletions(-)
+
+commit c2ddfd2d268385257c77c09a9abeacf4230d5377
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 6 13:06:15 2010 -0400
+
+    Cleanup Value casts
+
+ src/hb-ot-layout-gpos-private.hh | 34 +++++++++++++++++++++-------------
+ 1 file changed, 21 insertions(+), 13 deletions(-)
+
+commit 41a93d2c1ff175ef06328a99983577459c2d34b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 6 12:55:14 2010 -0400
+
+    Remove SANITIZE_WITH_BASE
+
+ src/hb-open-file-private.hh          |  2 +-
+ src/hb-open-type-private.hh          |  2 -
+ src/hb-ot-layout-common-private.hh   |  6 +--
+ src/hb-ot-layout-gdef-private.hh     | 24 +++++-----
+ src/hb-ot-layout-gpos-private.hh     | 90
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gsub-private.hh     | 31 ++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh | 44 +++++++++---------
+ 7 files changed, 98 insertions(+), 101 deletions(-)
+
+commit f5fab0c71837371cce32dc3e9edca1ccb8d44e29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 6 10:26:52 2010 -0400
+
+    Remove SANITIZE_MEM
+
+ src/hb-open-type-private.hh          | 4 +---
+ src/hb-ot-layout-common-private.hh   | 2 +-
+ src/hb-ot-layout-gpos-private.hh     | 2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 6 +++---
+ 4 files changed, 6 insertions(+), 8 deletions(-)
+
+commit 4ad2cc5dec6b0639da2b1846282bdd99d06d5ff1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 6 09:24:24 2010 -0400
+
+    Rename check to check_range
+
+ src/hb-open-type-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 1cd1e117d060d38e314618b627d7663cb01ed584
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 20:15:14 2010 -0400
+
+    Remove SANITIZE_ARRAY
+
+ src/hb-open-file-private.hh          |  2 +-
+ src/hb-open-type-private.hh          | 16 +++++++---------
+ src/hb-ot-layout-gpos-private.hh     |  8 ++++----
+ src/hb-ot-layout-gsubgpos-private.hh |  4 ++--
+ 4 files changed, 14 insertions(+), 16 deletions(-)
+
+commit 583d7f9586ce69754f1354aa3895e6d732a0c2ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 01:49:22 2010 -0400
+
+    Cosmetic
+
+ src/hb-open-file-private.hh          |  3 ++-
+ src/hb-open-type-private.hh          |  6 ++++--
+ src/hb-ot-layout-common-private.hh   | 15 ++++++++++-----
+ src/hb-ot-layout-gpos-private.hh     |  5 ++---
+ src/hb-ot-layout-gsub-private.hh     |  3 ++-
+ src/hb-ot-layout-gsubgpos-private.hh |  9 +++++----
+ 6 files changed, 25 insertions(+), 16 deletions(-)
+
+commit 705e215268aa95c2bc6af8af9b48b72b690ec1f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 01:40:25 2010 -0400
+
+    Minor
+
+ src/hb-open-type-private.hh          | 4 ++--
+ src/hb-ot-layout-gpos-private.hh     | 2 +-
+ src/hb-ot-layout-gsub-private.hh     | 2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 4 files changed, 5 insertions(+), 5 deletions(-)
+
+commit b18eafd0f62f854d15276c78f99843aecd47acad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 01:39:26 2010 -0400
+
+    Minor
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4169710911450e0f9bc045fe279bfc8ba9e8457c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 01:37:58 2010 -0400
+
+    Simplify chaining
+
+ src/hb-ot-layout-gsubgpos-private.hh | 61
+ +++++++++++++++---------------------
+ 1 file changed, 25 insertions(+), 36 deletions(-)
+
+commit 1911b9d21b2b7b6b8219ce6c888540e3a60aa9c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 01:32:04 2010 -0400
+
+    Remove APPLY_ARG_DEF and APPLY_ARG
+
+ src/hb-ot-layout-gpos-private.hh     | 92
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gsub-private.hh     | 88
+ +++++++++++++++++-----------------
+ src/hb-ot-layout-gsubgpos-private.hh | 89
+ ++++++++++++++++------------------
+ 3 files changed, 132 insertions(+), 137 deletions(-)
+
+commit 6c42cddfe53a1c664081862bb9a3e1c38d05a823
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 01:30:48 2010 -0400
+
+    Port apply to use hb_trace_t
+
+ src/hb-ot-layout-gpos-private.hh     |  9 ++++-----
+ src/hb-ot-layout-gsub-private.hh     | 11 +++++------
+ src/hb-ot-layout-gsubgpos-private.hh | 13 +++++--------
+ 3 files changed, 14 insertions(+), 19 deletions(-)
+
+commit 969c9705ae0c64577c3f69f5300fec975f952e1f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 01:23:44 2010 -0400
+
+    Move context_length into apply_context
+
+ src/hb-ot-layout-gpos-private.hh     |  9 ++---
+ src/hb-ot-layout-gsub-private.hh     |  9 ++---
+ src/hb-ot-layout-gsubgpos-private.hh | 70
+ ++++++++++++++++++++----------------
+ 3 files changed, 50 insertions(+), 38 deletions(-)
+
+commit 94a23aaeca39c662614037ef887412249bdc8d49
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 01:13:09 2010 -0400
+
+    Move buffer into apply_context
+
+ src/hb-buffer-private.h              | 30 +++++++++--------
+ src/hb-ot-layout-gpos-private.hh     | 64
+ ++++++++++++++++++++----------------
+ src/hb-ot-layout-gsub-private.hh     | 45 ++++++++++++++-----------
+ src/hb-ot-layout-gsubgpos-private.hh | 49 ++++++++++++++-------------
+ 4 files changed, 106 insertions(+), 82 deletions(-)
+
+commit 63493f956dca519df49da0a6badc3cb0a1b92779
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 01:01:05 2010 -0400
+
+    Move layout_context into apply_context
+
+ src/hb-ot-layout-gpos-private.hh     | 105
+ ++++++++++++++++++-----------------
+ src/hb-ot-layout-gsub-private.hh     |  47 ++++++++--------
+ src/hb-ot-layout-gsubgpos-private.hh |  11 ++--
+ 3 files changed, 82 insertions(+), 81 deletions(-)
+
+commit fff9aa263d1daf7c5117cf383fafa5043d5eb5af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 00:32:21 2010 -0400
+
+    Minor
+
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 27e302dc8e794ff6bf878bc76e17d336d510849e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 00:26:16 2010 -0400
+
+    I keep changing my mind about this
+
+ src/hb-open-type-private.hh | 30 ++++++++++--------------------
+ 1 file changed, 10 insertions(+), 20 deletions(-)
+
+commit 39840474afd2cda9ff576c08aff9c87095496c27
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 00:23:19 2010 -0400
+
+    Remove SANITIZE_ARG_DEF and SANITIZE_ARG
+
+ src/hb-open-file-private.hh          |  16 ++---
+ src/hb-open-type-private.hh          |  59 +++++++--------
+ src/hb-ot-layout-common-private.hh   |  42 +++++------
+ src/hb-ot-layout-gdef-private.hh     |  28 ++++----
+ src/hb-ot-layout-gpos-private.hh     | 136
+ +++++++++++++++++------------------
+ src/hb-ot-layout-gsub-private.hh     |  72 +++++++++----------
+ src/hb-ot-layout-gsubgpos-private.hh |  46 ++++++------
+ 7 files changed, 197 insertions(+), 202 deletions(-)
+
+commit b261e2ad5c5a065599ce1dbc4ba437caa2cee1e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 00:20:16 2010 -0400
+
+    Remove trace from sanitize_shallow()
+
+ src/hb-open-type-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit dfc8cbe85479dde1ffdc6b2e73f4907331d77a19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 5 00:19:46 2010 -0400
+
+    Add hb_trace_t
+
+ src/hb-open-type-private.hh | 33 +++++++++++++++++++--------------
+ 1 file changed, 19 insertions(+), 14 deletions(-)
+
+commit 20e3dd5d292b65f70d2eae63b8d8713a1c889d47
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 4 23:21:57 2010 -0400
+
+    Make sanitize_depth variable automatic and not passed through
+    function args
+
+ src/hb-open-type-private.hh | 72
+ +++++++++++++++++++++++++++------------------
+ 1 file changed, 43 insertions(+), 29 deletions(-)
+
+commit 4a446ac35136eff23d55f47bdd7b40095ad707ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 4 22:46:21 2010 -0400
+
+    Use function template for pass-thru argument
+
+ src/hb-open-type-private.hh      | 26 ++++++--------------------
+ src/hb-ot-layout-gpos-private.hh |  6 +++---
+ 2 files changed, 9 insertions(+), 23 deletions(-)
+
+commit 98daaf183d6dbf2b68959da608cd9876ba55d7aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 4 22:42:49 2010 -0400
+
+    Make _hb_sanitize_*() methods of the context object
+
+ src/hb-open-type-private.hh | 190
+ +++++++++++++++++++++++---------------------
+ 1 file changed, 98 insertions(+), 92 deletions(-)
+
+commit bb029af943faa9905e652d58856998687e60c31d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 4 15:28:52 2010 -0400
+
+    Remove SANITIZE_THIS
+
+ src/hb-open-file-private.hh          |  2 +-
+ src/hb-open-type-private.hh          |  3 +-
+ src/hb-ot-layout-common-private.hh   |  4 +--
+ src/hb-ot-layout-gdef-private.hh     | 25 ++++++++--------
+ src/hb-ot-layout-gpos-private.hh     | 55
+ ++++++++++++++++++++----------------
+ src/hb-ot-layout-gsub-private.hh     | 29 ++++++++++---------
+ src/hb-ot-layout-gsubgpos-private.hh | 42 +++++++++++++--------------
+ 7 files changed, 85 insertions(+), 75 deletions(-)
+
+commit 2226fc93d1427b8830bfb892fe1b25b488ea36dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 4 15:12:17 2010 -0400
+
+    Rename SANITIZE_BASE to SANITIZE_WITH_BASE
+
+ src/hb-open-type-private.hh        | 11 +++++++----
+ src/hb-ot-layout-common-private.hh |  3 ++-
+ src/hb-ot-layout-gpos-private.hh   | 15 ++++++++-------
+ 3 files changed, 17 insertions(+), 12 deletions(-)
+
+commit 89da1346ec3a8dec8a368df46d61ca75356e22fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 4 15:01:45 2010 -0400
+
+    Remove SANITIZE_OBJ
+
+ src/hb-open-type-private.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 4d4cce96266b777a01cec03e8766dc8c0b159351
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 4 14:57:55 2010 -0400
+
+    Remove SANITIZE_THIS2
+
+ src/hb-open-type-private.hh          |  2 --
+ src/hb-ot-layout-common-private.hh   |  3 ++-
+ src/hb-ot-layout-gdef-private.hh     | 10 ++++++----
+ src/hb-ot-layout-gpos-private.hh     |  9 ++++++---
+ src/hb-ot-layout-gsub-private.hh     | 11 +++++++----
+ src/hb-ot-layout-gsubgpos-private.hh | 14 +++++++++-----
+ 6 files changed, 30 insertions(+), 19 deletions(-)
+
+commit 26bfcb64e473c40e439d6efbe974781dada28eca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 4 14:49:45 2010 -0400
+
+    Cosmetic
+
+ src/hb-ot-layout-gdef-private.hh     | 5 ++---
+ src/hb-ot-layout-gsubgpos-private.hh | 7 +++----
+ 2 files changed, 5 insertions(+), 7 deletions(-)
+
+commit be74284673a1944e0f1884e861c3fe8f9855172c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 4 14:47:05 2010 -0400
+
+    Remove SANITIZE_THIS3
+
+ src/hb-open-type-private.hh          |  1 -
+ src/hb-ot-layout-gpos-private.hh     | 21 +++++++++++++++------
+ src/hb-ot-layout-gsubgpos-private.hh |  8 ++++++--
+ 3 files changed, 21 insertions(+), 9 deletions(-)
+
+commit fbab9f9bd8ba59e7e5811f33c1dda198f95cf05a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 4 14:42:10 2010 -0400
+
+    Remove SANITIZE_BASE2
+
+ src/hb-open-type-private.hh      | 1 -
+ src/hb-ot-layout-gpos-private.hh | 3 ++-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 73c7dbf7f5433c0cdd467ef32402f52867e9798e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 4 14:40:55 2010 -0400
+
+    Remove SANITIZE2
+
+ src/hb-open-type-private.hh      | 1 -
+ src/hb-ot-layout-gsub-private.hh | 2 +-
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit c9f14687a30866181feb57ee2736a147ec9f25a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 4 14:38:08 2010 -0400
+
+    Remove the NEUTER macro, move code to a method
+
+ src/hb-open-type-private.hh | 21 +++++++++++++--------
+ 1 file changed, 13 insertions(+), 8 deletions(-)
+
+commit 30fa2821c277df99a14089749313dfe2b541e2d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 4 14:28:18 2010 -0400
+
+    Make internal method private
+
+ src/hb-open-type-private.hh | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit ce5694c79671bf75990923c1da17bb611e4e7d15
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 4 14:10:18 2010 -0400
+
+    [main] Recognize Apple SFNTs
+
+ src/hb-open-file-private.hh | 4 ++--
+ src/main.cc                 | 6 ++++++
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+commit 710500a93ecc2a0c595045602aa367073485ff91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 3 23:11:16 2010 -0400
+
+    Comment new SFNT tags
+
+ src/hb-open-file-private.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 64d3fc8d0dada673245cc8c0b1c12cd849b30997
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 3 22:51:19 2010 -0400
+
+    Cosmetic: Rename HB_LIKELY/HB_UNLIKELY to likely/unlikely
+
+ src/hb-buffer.c                      | 14 ++++----
+ src/hb-font.cc                       |  6 ++--
+ src/hb-ft.c                          | 14 ++++----
+ src/hb-language.c                    |  2 +-
+ src/hb-object-private.h              | 10 +++---
+ src/hb-open-file-private.hh          |  2 +-
+ src/hb-open-type-private.hh          | 38 ++++++++++-----------
+ src/hb-ot-layout-common-private.hh   | 16 ++++-----
+ src/hb-ot-layout-gdef-private.hh     |  2 +-
+ src/hb-ot-layout-gpos-private.hh     | 64
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gsub-private.hh     | 52 ++++++++++++++---------------
+ src/hb-ot-layout-gsubgpos-private.hh | 40 +++++++++++-----------
+ src/hb-ot-layout.cc                  | 12 +++----
+ src/hb-ot-tag.c                      |  2 +-
+ src/hb-private.h                     |  8 ++---
+ src/hb-shape.c                       | 10 +++---
+ src/hb-unicode.c                     |  2 +-
+ 17 files changed, 147 insertions(+), 147 deletions(-)
+
+commit fa3b3d58443a7c22eca3f86243993ba2d4bd9f4a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 3 22:47:22 2010 -0400
+
+    Mark a couple functions as inline
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6b84198f9d471defb6f55d44d4f5423df70b2a10
+Merge: 631d10b7 eaf29edb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 3 22:46:52 2010 -0400
+
+    Merge remote branch 'jrmuizel/master'
+
+commit eaf29edb8fa49390e5f48b78105dfd173aff445b
+Author: Jeff Muizelaar <jmuizelaar@mozilla.com>
+Date:   Mon May 3 22:27:56 2010 -0400
+
+    HB_UNUSED is unneeded on static inline functions
+
+ src/hb-object-private.h     | 2 +-
+ src/hb-open-type-private.hh | 6 +++---
+ src/hb-private.h            | 4 ++--
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 4ce578ed369f1526c91deedcf9e72537b3e4328f
+Author: Jeff Muizelaar <jmuizelaar@mozilla.com>
+Date:   Mon May 3 15:03:53 2010 -0400
+
+    Include the tags from the Apple specification for TrueType fonts
+
+ src/hb-open-file-private.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 631d10b728d9e1a02c7dddf505d4fae5e244c6e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 2 21:14:21 2010 -0400
+
+    Remove unused method
+
+ src/hb-open-file-private.hh | 5 -----
+ 1 file changed, 5 deletions(-)
+
+commit f0abcd69408a3af65207cdf8847575ade4579bd4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 2 18:14:25 2010 -0400
+
+    Whitespace
+
+ src/hb-open-type-private.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit a8d960bd26883ee937b04ca2a3c16a3644870356
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 14:31:56 2010 -0400
+
+    [GPOS] Speedup apply_value()
+
+ src/hb-ot-layout-gpos-private.hh | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 2cd1ea4411d0808559a942ff3fa4e637f9c9a9c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 14:15:32 2010 -0400
+
+    [ft] Disallow getting the entire font data with tag=0
+
+ src/hb-ft.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 33d13fdda99acaeffa9600737e8870278d053ebe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 13:56:44 2010 -0400
+
+    Rename HB_GNUC_UNUSED -> HB_UNUSED
+
+ src/hb-buffer.c                      |  6 ++---
+ src/hb-font.cc                       | 44
+ ++++++++++++++++++------------------
+ src/hb-ft.c                          | 16 ++++++-------
+ src/hb-object-private.h              |  2 +-
+ src/hb-open-type-private.hh          | 18 +++++++--------
+ src/hb-ot-layout-gdef-private.hh     |  4 ++--
+ src/hb-ot-layout-gpos-private.hh     |  4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh |  6 ++---
+ src/hb-ot-layout.cc                  |  4 ++--
+ src/hb-ot-shape.c                    |  2 +-
+ src/hb-private.h                     | 16 ++++++-------
+ src/hb-shape.c                       | 32 +++++++++++++-------------
+ src/hb-unicode.c                     |  8 +++----
+ 13 files changed, 81 insertions(+), 81 deletions(-)
+
+commit 7d3a126334f8e6f6441561c1bb592bd3fa7a2c5c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 13:54:01 2010 -0400
+
+    Define HB_FUNC for portability to non-gcc
+
+ src/hb-open-type-private.hh          | 12 ++++++------
+ src/hb-ot-layout-gsubgpos-private.hh |  2 +-
+ src/hb-private.h                     |  9 +++++++++
+ 3 files changed, 16 insertions(+), 7 deletions(-)
+
+commit fa030175ca998b00cc42cbced6e98de323ec01ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 13:48:26 2010 -0400
+
+    [sanitize] Make debug code always available to the compiler
+
+    Such that we don't break debug build all the time.
+
+ src/hb-open-type-private.hh | 71
+ ++++++++++++++++++++-------------------------
+ 1 file changed, 31 insertions(+), 40 deletions(-)
+
+commit fde6f5bd682f5ad0cc5e2ec69fc831b0192bf90b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 04:41:41 2010 -0400
+
+    Convert to uppercase in hb_ot_tag_from_language()
+
+ src/hb-ot-tag.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 6f729b45b04243c42ad7201b67cda9d5e5c363f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 03:59:06 2010 -0400
+
+    More contour point use
+
+ src/hb-font.cc                   |  1 +
+ src/hb-ot-layout-gdef-private.hh |  8 +++++---
+ src/hb-ot-layout-gpos-private.hh | 13 +++++++++----
+ 3 files changed, 15 insertions(+), 7 deletions(-)
+
+commit 3840b6b50503ba2c9a99f774284e0077baffa8a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 03:48:27 2010 -0400
+
+    [gdef] Fix delta scale
+
+ src/hb-ot-layout-gdef-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4ac6cc284b2c1eb670c2a3659ec385ed729acac4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 03:48:11 2010 -0400
+
+    [gdef] Fix rounding
+
+ src/hb-ot-layout-gdef-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b52fbb1bab608bda76efb936f08344afaec600a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 03:47:00 2010 -0400
+
+    [gdef] Implement getting contour point
+
+ src/hb-ot-layout-gdef-private.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 4c5fbae011a33b9efef5aedd61c357fc0ded1113
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 03:39:39 2010 -0400
+
+    Make sure mirroring is done in original direction
+
+    Reported by Jonathan Kew.
+
+ src/hb-shape.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit ce23c9234b87513d6460fb89bad178fb8537e161
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 03:31:03 2010 -0400
+
+    Use BCP47 private-use tags for OpenType tag language string mapping
+
+ src/hb-ot-tag.c | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit eaf1d9a46c4a320f3b0026c0a610f95a620d566f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 03:11:32 2010 -0400
+
+    Minor
+
+ src/hb-ot-tag.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3a4784fe88a0f14147ccdd3633952c9c0f3ae8f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 02:58:38 2010 -0400
+
+    Fix bug in hb_language_from_string()
+
+    Reported by Jonathan Kew.
+
+ src/hb-language.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 602e4f8d5512cdf48c696ad64ad62ff97f6dbdcc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 02:28:54 2010 -0400
+
+    Use const_cast
+
+ src/hb-open-type-private.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit abff3580a5b229641086e0da097efee11d22ff81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 02:27:20 2010 -0400
+
+    Add const
+
+ src/hb-object-private.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6617eada95928457a25e29f793f1a93c6b3edaec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 02:25:30 2010 -0400
+
+    Rename apply_context -> context
+
+ src/hb-ot-layout-gpos-private.hh     | 22 +++++++++++-----------
+ src/hb-ot-layout-gsub-private.hh     | 26 +++++++++++++-------------
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++++++------
+ 3 files changed, 30 insertions(+), 30 deletions(-)
+
+commit b4c7fab762935b9c182b3e2ac3415f29fc6a5558
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 02:24:25 2010 -0400
+
+    Rename
+
+ src/hb-ot-layout-gpos-private.hh     | 98
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gsub-private.hh     | 46 ++++++++---------
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++---
+ 3 files changed, 78 insertions(+), 78 deletions(-)
+
+commit 1376fb7bf9ef07970f0ba13dc64d6a8ab8252762
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 02:19:21 2010 -0400
+
+    [apply] Use a context object to reduce number of parameters passed
+    around
+
+ src/hb-open-type-private.hh          |  5 ++---
+ src/hb-ot-layout-gpos-private.hh     | 26 ++++++++++++++-----------
+ src/hb-ot-layout-gsub-private.hh     | 37
+ +++++++++++++++++++-----------------
+ src/hb-ot-layout-gsubgpos-private.hh | 29 +++++++++++++++-------------
+ 4 files changed, 53 insertions(+), 44 deletions(-)
+
+commit 173fde7087c0db3e99409f1119530477c14072f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 01:47:30 2010 -0400
+
+    Further simplify tracing
+
+ src/hb-open-type-private.hh          | 31 +++++++++++++++----------------
+ src/hb-ot-layout-gpos-private.hh     |  9 +++++----
+ src/hb-ot-layout-gsub-private.hh     | 11 ++++++-----
+ src/hb-ot-layout-gsubgpos-private.hh |  8 --------
+ 4 files changed, 26 insertions(+), 33 deletions(-)
+
+commit bc200457430c083914a64bf4b056153506749610
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 29 01:40:26 2010 -0400
+
+    Simplify trace code
+
+ src/hb-open-type-private.hh          | 41 +++++++++---------------------
+ src/hb-ot-layout-gsubgpos-private.hh | 25 +++++--------------
+ src/hb-private.h                     | 48
+ +++++++++++++++++++++++++-----------
+ 3 files changed, 51 insertions(+), 63 deletions(-)
+
+commit 807c5b03a2251a3c29a520852639421783101b55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 28 20:25:22 2010 -0400
+
+    [sanitize] Make debug code always available to the compiler
+
+    Such that we don't break debug build all the time.
+
+ src/hb-open-type-private.hh          | 31 ++++++++++++++++++++-----------
+ src/hb-ot-layout-gsubgpos-private.hh |  2 +-
+ 2 files changed, 21 insertions(+), 12 deletions(-)
+
+commit 74e313c016704e1d9157c2763691c4151f049dfc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 28 15:15:09 2010 -0400
+
+    [gsubgpos] Make debug code always available to the compiler
+
+    Such that we don't break debug build all the time.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 52
+ ++++++++++++++++++------------------
+ 1 file changed, 26 insertions(+), 26 deletions(-)
+
+commit 41011a6ed7c4891b20c0eddbb6d4ad9c820cfddb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 28 13:33:09 2010 -0400
+
+    Fix compiler warning about value unused
+
+ src/hb-object-private.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 863df68e894b7644dcd12da88aa22f73edf829dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 28 13:29:55 2010 -0400
+
+    [object] Make debug code always available to the compiler
+
+    Such that we don't break debug build all the time.
+
+ src/hb-object-private.h | 42 +++++++++++++++++++++++++++---------------
+ 1 file changed, 27 insertions(+), 15 deletions(-)
+
+commit 1d52151a19ed8ec776276aac5cc6ce3769e0d947
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 28 13:18:41 2010 -0400
+
+    Minor
+
+ src/hb-private.h | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 444fffb1ab378cb3022e2a8e9f90d20a00c82f6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 28 13:16:38 2010 -0400
+
+    [blob] Make debug code always available to the compiler
+
+    Such that we don't break debug build all the time.
+
+ src/hb-blob.c | 78
+ ++++++++++++++++++++++++-----------------------------------
+ 1 file changed, 32 insertions(+), 46 deletions(-)
+
+commit ba51b25c7ba568aeced17f016eceba987569c5d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 28 13:10:36 2010 -0400
+
+    Fix build.  Ouch!
+
+ src/hb-object-private.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a92f0fda7fee9d60b399b8865541bf73e6e30141
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 28 13:09:40 2010 -0400
+
+    Fix debug build
+
+ src/hb-open-type-private.hh          | 4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit c165f25410f817d248ad5d07e1827d33efd1b0a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 27 23:28:10 2010 -0400
+
+    [object] Actually handle malloc() failure
+
+    Caught by John Daggett.
+
+ src/hb-object-private.h | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit caff7db93d205e32a535d49e51a3cad70f91dfdd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 26 10:07:35 2010 -0400
+
+    Fix Device::get_size() calculation
+
+ src/hb-ot-layout-common-private.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 66d6eb30eb0b8d61e00f86ea0c7829abaddb52fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Apr 25 23:01:45 2010 -0400
+
+    Rename Var to Obj
+
+ src/hb-open-type-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 690b9194619589c32ffc0c092e45262ae7776e79
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Apr 25 22:51:05 2010 -0400
+
+    Remove use of flexible arrays
+
+    Also remove wrong ASSERT_SIZE that would trigger only when not using
+    flexible arrays (which was the case on win32, but not with gcc).
+
+ configure.ac                | 2 --
+ src/hb-open-file-private.hh | 1 -
+ src/hb-private.h            | 4 ----
+ 3 files changed, 7 deletions(-)
+
+commit 1cebfbb0636b13dc5dc6a4b8b7acbb7da28129d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 20:49:18 2010 -0400
+
+    Cleanup hb_face_create_for_data()
+
+ src/Makefile.am       |  1 +
+ src/hb-blob-private.h | 57 +++++++++++++++++++++++++++++++
+ src/hb-blob.c         | 20 ++---------
+ src/hb-font-private.h |  3 --
+ src/hb-font.cc        | 92
+ +++++++++++++++++++++++++++++++++++----------------
+ 5 files changed, 123 insertions(+), 50 deletions(-)
+
+commit d6b3c83a90f60bedb4049750ffb351161710980d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 19:59:53 2010 -0400
+
+    Allow get_table() to return NULL
+
+ src/hb-font.cc | 6 +++++-
+ src/hb-ft.c    | 2 +-
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit ad3653751b1e4a03f7058200cb83f64db46722d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 19:43:40 2010 -0400
+
+    Typo
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 990443e5f282ad61de00dcf1ebff9cf1d5bc2d70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 17:53:32 2010 -0400
+
+    Remove lock_instance()
+
+ src/hb-font.cc              | 2 +-
+ src/hb-open-type-private.hh | 4 ----
+ src/hb-ot-layout.cc         | 6 +++---
+ 3 files changed, 4 insertions(+), 8 deletions(-)
+
+commit 187454c595559ce48d072fee6bccb51f3de283d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 16:35:01 2010 -0400
+
+    Add different casts from pointer and ref to avoid bugs
+
+ src/hb-open-type-private.hh      | 22 +++++++++++++++-------
+ src/hb-ot-layout-gpos-private.hh |  8 ++++----
+ src/hb-ot-layout-gsub-private.hh | 12 ++++++------
+ src/main.cc                      |  6 +++---
+ 4 files changed, 28 insertions(+), 20 deletions(-)
+
+commit efb324a46ff64adb4ec8612b4089e8daff1e6d8e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 16:22:54 2010 -0400
+
+    Remove GET_FOR_DATA macros
+
+    The major-version check is now handled by sanitize.  If major
+    doesn't match, we reject and fall back to the Null object.
+
+ src/hb-open-file-private.hh          |  4 ----
+ src/hb-open-type-private.hh          | 23 ++---------------------
+ src/hb-ot-layout-gdef-private.hh     |  2 --
+ src/hb-ot-layout-gpos-private.hh     |  3 ---
+ src/hb-ot-layout-gsub-private.hh     |  3 ---
+ src/hb-ot-layout-gsubgpos-private.hh |  2 --
+ src/main.cc                          |  6 +++---
+ 7 files changed, 5 insertions(+), 38 deletions(-)
+
+commit f1aaa2a43654c28405ffd393de2cb127437c99a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 15:19:50 2010 -0400
+
+    Add TODO
+
+ src/hb-ft.c                        |  2 --
+ src/hb-ft.h                        |  1 +
+ src/hb-open-file-private.hh        |  2 +-
+ src/hb-open-type-private.hh        |  2 ++
+ src/hb-ot-layout-common-private.hh | 12 ++++++------
+ 5 files changed, 10 insertions(+), 9 deletions(-)
+
+commit 33d4d4325e15e332105ea8f361bab79ee542f0f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 14:56:55 2010 -0400
+
+    Zero glyph metrics before calling user callback
+
+ src/hb-font.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 4206e9511a222c0c50cc9b4fe72ec421983bba2c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 14:44:55 2010 -0400
+
+    More warning fixes
+
+ src/hb-ot-layout.cc |  4 ++--
+ src/hb-ot-shape.c   |  9 ++++-----
+ src/hb-shape.c      | 32 ++++++++++++++++----------------
+ 3 files changed, 22 insertions(+), 23 deletions(-)
+
+commit ef66ebeabc6c234004bd9e9bb67eb5c9711f4a1e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 14:40:36 2010 -0400
+
+    Remove unused parameter
+
+ src/hb-open-file-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1d720192b193f48b44be0385eda3c2c5d5cd28ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 14:39:10 2010 -0400
+
+    Fix compile warnings (HB_GNUC_UNUSED)
+
+ src/hb-buffer.c             |  6 +++---
+ src/hb-font.cc              | 31 ++++++++++++++++++++++---------
+ src/hb-ft.c                 | 29 +++++++++++++++++++++--------
+ src/hb-open-type-private.hh |  2 +-
+ src/hb-unicode.c            |  8 ++++----
+ 5 files changed, 51 insertions(+), 25 deletions(-)
+
+commit 8dfdca599c0a3ba5255131002910bca3b381acac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 14:07:34 2010 -0400
+
+    No need to keep blob in sanitize context
+
+ src/hb-open-type-private.hh | 13 +++++--------
+ 1 file changed, 5 insertions(+), 8 deletions(-)
+
+commit 254933c397f1ce9796f59689a25f9fc2e58df4ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 13:57:10 2010 -0400
+
+    When sanitizing, delay making writable
+
+    Before, as soon as we needed to make an edit, we tried to make
+    the blob
+    writable inplace.  That grows code unnecessarily though.  We can
+    simply
+    fail, make writable, then start again.  That's indeed what the
+    fallback
+    was doing anyway.
+
+ src/hb-open-type-private.hh | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+commit 71e735e915c85536ee4d3035576f7426e8cd19dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 13:48:06 2010 -0400
+
+    [blob] Fallback to copying if mprotect() fails
+
+ src/hb-blob.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 1aa4666b914da7747fc58a8f6f2d913c94e3b8da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 13:32:03 2010 -0400
+
+    Cleanup OpenTypeFontFile
+
+ src/hb-open-file-private.hh | 44
+ ++++++++++++++++++++++++++------------------
+ src/main.cc                 |  2 +-
+ 2 files changed, 27 insertions(+), 19 deletions(-)
+
+commit ae4190cafe927649f8ff8be6a0082478d1298fda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 23 12:33:02 2010 -0400
+
+    Properly define separate structs for TTCHeader and TTCHeaderVersion1
+
+ src/hb-open-file-private.hh | 71
+ +++++++++++++++++++++++++++++++++++----------
+ 1 file changed, 55 insertions(+), 16 deletions(-)
+
+commit a065f471b3bc23d33ef75217308efeaed4ffd033
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 20:15:11 2010 -0400
+
+    Cleanup Extension lookups
+
+    Two things:
+
+    1. Allow nested Extension lookups.  The offset is always positive, so
+    it can't loop circularly.
+
+    2. Move the check for all Extension subtables having the same lookup
+    type to the correct place.  Before it wasn't really working.
+
+ src/hb-ot-layout-gpos-private.hh | 29 +-------------------
+ src/hb-ot-layout-gsub-private.hh | 57
+ ++++++++++++++++++++++------------------
+ 2 files changed, 33 insertions(+), 53 deletions(-)
+
+commit a0bb49c5830f8a7f25d573ec57b79df2620ddba7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 18:47:03 2010 -0400
+
+    Add comment re bsearch effect on sanitize
+
+ src/hb-open-file-private.hh        | 2 +-
+ src/hb-ot-layout-common-private.hh | 8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit d632ec4000b3079150e6424e88a3ab7509f7445c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 18:33:12 2010 -0400
+
+    Cosmetic
+
+ src/hb-open-type-private.hh          | 6 +++---
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit a3263aa773ad7a914496792466c69047048b093c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 18:29:09 2010 -0400
+
+    Convert the last set of cast macros to templates
+
+ src/hb-open-file-private.hh          |  4 +--
+ src/hb-open-type-private.hh          | 53
+ +++++++++++++++++++++++-------------
+ src/hb-ot-layout-gpos-private.hh     | 16 +++++------
+ src/hb-ot-layout-gsub-private.hh     | 14 +++++-----
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++++----
+ 5 files changed, 57 insertions(+), 42 deletions(-)
+
+commit c38188a1912f72d9ef90ae1bcbdbba7ecce63371
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 16:52:09 2010 -0400
+
+    Remove unused macro
+
+ src/hb-open-type-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 3b2c2df41b90f2a1d9e33b3dc15a92cff58a689a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 16:51:42 2010 -0400
+
+    Cleanup Extension sanitize()
+
+ src/hb-ot-layout-common-private.hh   | 20 +++-----------------
+ src/hb-ot-layout-gpos-private.hh     | 20 +++++++++++++-------
+ src/hb-ot-layout-gsub-private.hh     | 20 +++++++++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh | 13 ++++---------
+ 4 files changed, 33 insertions(+), 40 deletions(-)
+
+commit 1856184b93760a1a54fb1a3c54281bb252df7ce6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 14:15:11 2010 -0400
+
+    Fail sanitize on major version mismatch
+
+    We handle major-version differences via get_for_data(), so sanitize
+    should never see a major version mismatch.
+
+ src/hb-open-file-private.hh          | 4 ++--
+ src/hb-ot-layout-gdef-private.hh     | 2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit df3f505dcfeefc8cd395900b116767d22549f756
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 14:11:33 2010 -0400
+
+    More sanitize cleanup
+
+ src/hb-open-file-private.hh | 24 ++----------------------
+ src/main.cc                 |  4 ++--
+ 2 files changed, 4 insertions(+), 24 deletions(-)
+
+commit 278a91f0cd802ac817c2603429bae1fa4a350ea0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 13:59:39 2010 -0400
+
+    Minor cleanup of sanitize
+
+    Done with an audit of all sanitize()
+
+ src/hb-ot-layout-gpos-private.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 9ac7dc73bc24b6dafb94df5de9cbf8fa0c82d5bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 13:50:22 2010 -0400
+
+    Check for (impossible) overflow
+
+ src/hb-ot-layout-gpos-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 9fc8684fd85ef6ec82b3b54323761bbdd4c3d891
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 13:37:58 2010 -0400
+
+    Cleanup ContextFormat3 sanitize
+
+ src/hb-ot-layout-gsubgpos-private.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit e77302c61f1f1620d1f438a997575fa6ee5c172e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 13:34:00 2010 -0400
+
+    Add comment
+
+ src/hb-ot-layout-common-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 7c469c3ca4ed4e45c50eff70df59b1a4780bae5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 13:26:21 2010 -0400
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dc228048a813e43356373505168d3822deea5d72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 13:22:41 2010 -0400
+
+    Remove integrity check in Tag sanitize
+
+    Serves no useful purpose.
+
+ src/hb-open-type-private.hh        | 9 ---------
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 2 files changed, 1 insertion(+), 10 deletions(-)
+
+commit 8015a8c762dc7be36998d529b7a3af59e3d14d87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 11:06:30 2010 -0400
+
+    Don't sanitize raw table data
+
+    That part is performed by individual table sanitize.
+
+ src/hb-open-file-private.hh | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit c293581e962b7982622e7d607fa3909b40da718e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 11:15:46 2010 -0400
+
+    Add coment
+
+ src/hb-open-type-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1faa76c6e848c6b0e360d9ddcf567533b87f8f31
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 10:54:26 2010 -0400
+
+    Remove unnecessary casts
+
+ src/hb-open-type-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 079dc40112d3908ff7b7028ea3019bfe82bf606d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 10:47:12 2010 -0400
+
+    Avoid overflow in TableDirectory sanitize
+
+ src/hb-open-file-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fb5904ec935d925a423401bc975ffaa22022ce1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 10:43:30 2010 -0400
+
+    Make casts more explicit
+
+ src/hb-ot-layout-gpos-private.hh | 4 ++--
+ src/hb-ot-layout-gsub-private.hh | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 565c80bd2960366ace2d10dd71beaaf2a80213c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 10:26:35 2010 -0400
+
+    Make sure semicolon is expected after DEFINE_NULL_DATA()
+
+ src/hb-open-type-private.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit bb1e16335e537231246f44740f73cc23c0707364
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 01:01:35 2010 -0400
+
+    Improve Subst/Pos SubTable access and sanitize
+
+ src/hb-ot-layout-gpos-private.hh | 4 ++--
+ src/hb-ot-layout-gsub-private.hh | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 81f2af40f9afd5bb9695018e6baddcd4aa3361c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 00:58:49 2010 -0400
+
+    Simplify Extension offset now that our int types have no alignment
+
+ src/hb-ot-layout-gsubgpos-private.hh | 9 +++------
+ 1 file changed, 3 insertions(+), 6 deletions(-)
+
+commit 19828ad42d8117563412aae3c70887aa117805a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 00:49:16 2010 -0400
+
+    Sanitize shallow in Lookup since the generic SubLookup has no methods
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e5546a4352c54311ac4a9ef138b187378155ebe1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 00:45:42 2010 -0400
+
+    Watch for overflow in Array sanitize
+
+ src/hb-open-type-private.hh        | 21 +++++++++++++++------
+ src/hb-ot-layout-common-private.hh |  2 +-
+ 2 files changed, 16 insertions(+), 7 deletions(-)
+
+commit 4f5f1c34dda1e0629bfa6d7b0ffa2e1ce003b7c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 00:27:39 2010 -0400
+
+    Rename const_sub_array to sub_array since all consts are implicit now
+
+ src/hb-open-type-private.hh        | 2 +-
+ src/hb-ot-layout-common-private.hh | 4 ++--
+ src/hb-ot-layout-gdef-private.hh   | 4 ++--
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 0795b784dd1009976c185482a376df250167e73b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 00:23:14 2010 -0400
+
+    Cosmetic
+
+ src/hb-ot-layout-common-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 2d98d3bbaa0ddadcb08b5a8f437b18c211c50768
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 00:19:30 2010 -0400
+
+    Simplify Lookup sanitize
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c755cb3e3ac55156d0d2ec05adea7a650b97cc41
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 22 00:11:43 2010 -0400
+
+    Change header comment
+
+ README                               | 2 +-
+ src/hb-blob.c                        | 2 +-
+ src/hb-blob.h                        | 2 +-
+ src/hb-buffer-private.h              | 2 +-
+ src/hb-buffer.c                      | 2 +-
+ src/hb-buffer.h                      | 2 +-
+ src/hb-common.h                      | 2 +-
+ src/hb-font-private.h                | 2 +-
+ src/hb-font.cc                       | 2 +-
+ src/hb-font.h                        | 2 +-
+ src/hb-ft.c                          | 2 +-
+ src/hb-ft.h                          | 2 +-
+ src/hb-glib.c                        | 2 +-
+ src/hb-glib.h                        | 2 +-
+ src/hb-icu.c                         | 2 +-
+ src/hb-icu.h                         | 2 +-
+ src/hb-language.c                    | 2 +-
+ src/hb-language.h                    | 2 +-
+ src/hb-object-private.h              | 2 +-
+ src/hb-open-file-private.hh          | 2 +-
+ src/hb-open-type-private.hh          | 2 +-
+ src/hb-ot-layout-common-private.hh   | 2 +-
+ src/hb-ot-layout-gdef-private.hh     | 2 +-
+ src/hb-ot-layout-gpos-private.hh     | 2 +-
+ src/hb-ot-layout-gsub-private.hh     | 2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ src/hb-ot-layout-private.h           | 2 +-
+ src/hb-ot-layout.cc                  | 2 +-
+ src/hb-ot-layout.h                   | 2 +-
+ src/hb-ot-shape-private.h            | 2 +-
+ src/hb-ot-shape.c                    | 2 +-
+ src/hb-ot-tag.c                      | 2 +-
+ src/hb-ot-tag.h                      | 2 +-
+ src/hb-ot.h                          | 2 +-
+ src/hb-private.h                     | 2 +-
+ src/hb-shape.c                       | 2 +-
+ src/hb-shape.h                       | 2 +-
+ src/hb-unicode-private.h             | 2 +-
+ src/hb-unicode.c                     | 2 +-
+ src/hb-unicode.h                     | 2 +-
+ src/hb.h                             | 2 +-
+ src/main.cc                          | 2 +-
+ 42 files changed, 42 insertions(+), 42 deletions(-)
+
+commit 243d20e011e251462a07947275e0e98cc19c7e9b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 23:57:01 2010 -0400
+
+    More cast simplification
+
+ src/hb-open-type-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 0dfcc13a4668cdd2c2ebdd5f4a7540a51222cf2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 23:41:26 2010 -0400
+
+    Rename ConstCharP to CharP (overloaded now)
+
+ src/hb-open-file-private.hh          | 10 +++++-----
+ src/hb-open-type-private.hh          | 24 ++++++++++++------------
+ src/hb-ot-layout-gpos-private.hh     | 12 ++++++------
+ src/hb-ot-layout-gsub-private.hh     |  4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 14 +++++++-------
+ 5 files changed, 32 insertions(+), 32 deletions(-)
+
+commit 62c0fd75737a69721dbf29e773405a4c529f8b6d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 23:30:48 2010 -0400
+
+    Cleanup de-const-casting during sanitize
+
+ src/hb-open-file-private.hh        |  2 +-
+ src/hb-open-type-private.hh        | 29 ++++++++++++++---------------
+ src/hb-ot-layout-common-private.hh |  4 ++--
+ src/hb-ot-layout-gpos-private.hh   | 12 ++++++------
+ 4 files changed, 23 insertions(+), 24 deletions(-)
+
+commit dd155870567cfb9647b2e71593ace8b2705d7cff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 23:13:33 2010 -0400
+
+    Add more comments
+
+ src/hb-open-type-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c85c3620675f38ffdca59134aeec2641485f40ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 23:12:54 2010 -0400
+
+    Add comment
+
+ src/hb-open-type-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2467c669c2aee4de2a6621a9d06cba0262376d41
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 23:11:45 2010 -0400
+
+    Add comment
+
+ src/hb-open-type-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 29c3f5e1b6212c775a7b911becd44ba093b7b0eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 23:01:00 2010 -0400
+
+    Improve comment
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 01c01618e98283611628cd54d5ba4bf122f24cd9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 22:49:56 2010 -0400
+
+    Further simplify IntType struct defs
+
+ src/hb-open-type-private.hh | 21 ++++++++++++---------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
+
+commit 2cb08458f674301cde9d962c13911035a251f7c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 22:37:31 2010 -0400
+
+    Rename const_array() to array() (overloaded)
+
+ src/hb-open-type-private.hh          | 12 ++++++------
+ src/hb-ot-layout-common-private.hh   |  4 ++--
+ src/hb-ot-layout-gsub-private.hh     |  6 +++---
+ src/hb-ot-layout-gsubgpos-private.hh | 16 ++++++++--------
+ 4 files changed, 19 insertions(+), 19 deletions(-)
+
+commit 2e2f43edf2f49f4047e28b1ce2ea95938536de9c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 22:30:36 2010 -0400
+
+    Remove ArrayAfter, use StructAfter in place
+
+ src/hb-open-type-private.hh | 21 ++++++---------------
+ 1 file changed, 6 insertions(+), 15 deletions(-)
+
+commit e961c86c579fd98ee604342a9c70c4e7f8d4f220
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 15:56:11 2010 -0400
+
+    Convert NEXT() and ARRAY_AFTER() macros to templates
+
+ src/hb-open-type-private.hh          | 40
+ ++++++++++++++++++++++++++----------
+ src/hb-ot-layout-common-private.hh   |  4 ++--
+ src/hb-ot-layout-gsub-private.hh     |  8 ++++----
+ src/hb-ot-layout-gsubgpos-private.hh | 24 +++++++++++-----------
+ 4 files changed, 47 insertions(+), 29 deletions(-)
+
+commit 198facdc55756cb48cdfb8ba7fa50916fac54ec3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 13:35:36 2010 -0400
+
+    Use templates for const char * casts
+
+ src/hb-open-file-private.hh          | 12 ++++-----
+ src/hb-open-type-private.hh          | 48
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-common-private.hh   |  2 +-
+ src/hb-ot-layout-gpos-private.hh     | 32 ++++++++++++------------
+ src/hb-ot-layout-gsub-private.hh     |  4 +--
+ src/hb-ot-layout-gsubgpos-private.hh | 14 +++++------
+ 6 files changed, 56 insertions(+), 56 deletions(-)
+
+commit 1922ffe7013c46014803a9f18c42e193a25b1968
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 04:19:51 2010 -0400
+
+    Const correctness
+
+ src/hb-ot-layout-gsub-private.hh     |  4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 30 +++++++++++++++---------------
+ 2 files changed, 17 insertions(+), 17 deletions(-)
+
+commit e032ed9f75d4a0f365649a25706871bbb5ae6651
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 03:11:46 2010 -0400
+
+    Use templates for defining int typess
+
+ src/hb-open-type-private.hh | 66
+ ++++++++++++++++++++++++++++++---------------
+ src/hb-private.h            | 10 ++-----
+ 2 files changed, 46 insertions(+), 30 deletions(-)
+
+commit 2c9fd2adce5a6a9dcd62c874bd64613ea68d8d9b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 02:15:39 2010 -0400
+
+    Remove unused macro
+
+ src/hb-open-type-private.hh | 15 ---------------
+ 1 file changed, 15 deletions(-)
+
+commit 7a52f281178867379adb6e6c6fb0022102f75d17
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 02:14:44 2010 -0400
+
+    Rename macros
+
+ src/hb-open-type-private.hh |  6 +++---
+ src/hb-private.h            | 30 +++++++++++++++---------------
+ 2 files changed, 18 insertions(+), 18 deletions(-)
+
+commit ffff7dc44cb2a35a60f92831165e9d3c3a61ce19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 02:13:55 2010 -0400
+
+    Minor
+
+ src/hb-private.h | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit f60f2166c48d07f556ff83f04e95181946eb03df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 02:12:45 2010 -0400
+
+    Move macros around
+
+ src/hb-private.h | 122
+ ++++++++++++++++++++++++++++---------------------------
+ 1 file changed, 62 insertions(+), 60 deletions(-)
+
+commit 649a4344ca363da3d44cdd908350449ec40ed0f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 02:11:59 2010 -0400
+
+    Remove unused macros
+
+ src/hb-private.h | 7 -------
+ 1 file changed, 7 deletions(-)
+
+commit eba8b4f644701cc6b78b0fcb4e932dce15561598
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 29 00:04:12 2010 -0400
+
+    GNOME Bug 613015 - [HB] Does not sanitize Device tables referenced
+    from ValueRecords
+
+ src/hb-ot-layout-gpos-private.hh | 47
+ ++++++++++++++++++++++++++++++----------
+ 1 file changed, 36 insertions(+), 11 deletions(-)
+
+commit 673a4efcbc72a62105a24d9b0b54047417160f7d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 02:02:57 2010 -0400
+
+    WIP
+
+ src/hb-ot-layout-gpos-private.hh | 102
+ +++++++++++++++++++++++++++++++--------
+ 1 file changed, 81 insertions(+), 21 deletions(-)
+
+commit 40d73bc68dd828cf68f90fde0f9499a6ce9fbb19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 00:49:40 2010 -0400
+
+    Improve comments
+
+ src/hb-open-type-private.hh | 22 ++++++++++++++--------
+ 1 file changed, 14 insertions(+), 8 deletions(-)
+
+commit 394bad41a76f90e441e327cef76efb99997e9ae0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 00:40:50 2010 -0400
+
+    Remove stale TODO item
+
+ src/hb-open-type-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 9d3677899f90abdc7fb3e3d854db654a8707a84b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 00:32:47 2010 -0400
+
+    Use a function template instead of struct template for Null
+
+ src/hb-open-type-private.hh | 24 ++++++++++--------------
+ 1 file changed, 10 insertions(+), 14 deletions(-)
+
+commit ffd321afd91429c5de7ab03d71ef1030044f53cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 21 00:14:12 2010 -0400
+
+    Simplify Tag struct
+
+ src/hb-open-file-private.hh        | 3 ++-
+ src/hb-open-type-private.hh        | 6 +-----
+ src/hb-ot-layout-common-private.hh | 3 ++-
+ 3 files changed, 5 insertions(+), 7 deletions(-)
+
+commit 00e23fcc6fd0eee5c582251bf3de6a2703fbbd3e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 20 23:50:45 2010 -0400
+
+    Cosmetic
+
+ src/hb-open-type-private.hh        | 8 ++++----
+ src/hb-ot-layout-common-private.hh | 6 +++---
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit a87072db5d41e25b2e31191545298bca4838c65c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 20 15:52:47 2010 -0400
+
+    Fix Class operator return type
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f9b37727985191c9b4aedb0e9835736027e59260
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 20 15:51:53 2010 -0400
+
+    Add couple consts to operators
+
+ src/hb-open-type-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 53d237ec6352d7c6fab3b2805b48154a25506beb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 20 15:25:27 2010 -0400
+
+    Remove ASSERT_SIZE_DATA
+
+ src/hb-open-type-private.hh        | 4 ----
+ src/hb-ot-layout-common-private.hh | 9 ++++++---
+ 2 files changed, 6 insertions(+), 7 deletions(-)
+
+commit 06558d2a745b8f3af11a8d6dce956ae52187a7e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 19 02:34:10 2010 -0400
+
+    Round instead of trunc
+
+ src/hb-ot-layout-gpos-private.hh | 20 ++++++++++----------
+ src/hb-private.h                 |  2 +-
+ 2 files changed, 11 insertions(+), 11 deletions(-)
+
+commit 0e206de98621ed8a55824b42e9e6bf320f4c6cc8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 19 02:29:04 2010 -0400
+
+    Fix warnings
+
+ src/hb-open-type-private.hh          | 2 +-
+ src/hb-ot-layout-gdef-private.hh     | 2 +-
+ src/hb-ot-layout-gpos-private.hh     | 4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 6 +++---
+ 4 files changed, 7 insertions(+), 7 deletions(-)
+
+commit d5943407a4251cb947fbfc130c0facb2f6216bd6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 19 02:27:56 2010 -0400
+
+    Fix debug build
+
+ src/hb-open-type-private.hh          | 2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 12b27ed91de0192deee4e9feffcaf4aca4c78113
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 27 17:00:19 2010 -0400
+
+    Fix leak when duplicating blob
+
+ src/hb-blob.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 4b8487d83e0c10076a6c573cb3487790ce366607
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 16 03:46:17 2010 -0400
+
+    Fix the mystery bug!
+
+    A couple bugs joined forces to exhibit the mystery behavior of
+    crashes / infinite loops on OS X / wrong kerning / invalid memory
+    access.  Pooh!
+
+    The bugs were involved:
+
+      - Wrong pointer math with ValueRecord in PairPosFormat1
+
+      - Fallout from avoiding flex arrays, code not correctly updated
+        to remove sizeof() usage.
+
+    We strictly never use sizeof() directly now.  And the PairPos code
+    is cleaned up.  Should fix them all.  Bugs are:
+
+      Bug 605655 - Pango 1.26.2 introduces kerning bug
+      Bug 611229 - Pango reads from uninitialized memory
+      Bug 593240 - (pangoosx) Crash / infinite loop with Mac OS X
+
+    We were also doing wrong math converting Device adjustments to
+    hb_position_t.  Fallout from FreeType days.  Should shift 16, not
+    6.  Fixed that too.
+
+    There's still another bug: we don't sanitize Device records
+    referenced from value records.  Fixing that also.
+
+ src/hb-open-file-private.hh          |  4 +++-
+ src/hb-open-type-private.hh          | 11 ++++++-----
+ src/hb-ot-layout-common-private.hh   | 10 ++++++++--
+ src/hb-ot-layout-gpos-private.hh     | 37
+ ++++++++++++++++++++----------------
+ src/hb-ot-layout-gsubgpos-private.hh | 15 ++++++++-------
+ 5 files changed, 46 insertions(+), 31 deletions(-)
+
+commit 9b39755d104603d1163738f77637cc1923d4055b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 15 14:00:25 2010 -0400
+
+    Typo
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f85ec1c7da36d2c2c9b1c94a988563697dcc79c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 10 04:14:40 2010 -0500
+
+    Cosmetic
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e48ed72230a83499dabbd02af2ac63340220a353
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 1 22:33:45 2010 -0500
+
+    [ft] Check stream->read instead of stream->base
+
+    The former is more robust.  See discussion on freetype-devel.
+
+ src/hb-ft.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 917c227500305aee543981ad24a39f868c5ca0b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 23 16:47:51 2010 -0500
+
+    Make blob unlocking 64bit-safe
+
+    GNOME Bug 604128 - Applications crash when displaying Hebrew
+    characters
+
+ src/hb-blob.c | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit ecd2e996d2137fef30011a41dd57ea45f9a796de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 23 02:42:00 2010 -0500
+
+    Improve the alignment for NullPool
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bc7830e4259755ce7549025c6f5bf750e78c2ff1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 17 15:14:57 2010 -0500
+
+    Use __attribute__((unused)) only with gcc 4 and later
+
+    See discussion at:
+    https://bugzilla.gnome.org/show_bug.cgi?id=610183
+
+ src/hb-private.h | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit 555d11273ee4c30e84eda3a78ffadb3ee7da65d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 26 12:58:59 2010 -0500
+
+    [GDEF] Fix bug in building synthetic GDEF
+
+ src/hb-ot-layout.cc | 5 +++--
+ src/hb-ot-layout.h  | 1 -
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 70834d89c30a56fcd78825fbc28fc9c6bec31124
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 26 12:17:37 2010 -0500
+
+    [TODO] Add kern/GPOS interaction
+
+ TODO | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit cd11a98fa1426e9dbc4b61e702913b23a4794ae2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 23:05:02 2009 +0100
+
+    Fix compile with older FreeType
+
+ configure.ac | 7 +++++++
+ src/hb-ft.c  | 2 ++
+ 2 files changed, 9 insertions(+)
+
+commit 7f7448a354c43650348b4e91b4e40ecf18718d66
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 21:42:14 2009 +0100
+
+    Indent
+
+ src/hb-ot-layout-gpos-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e70f45eb522bcb41388cc218b79bbd6aaecf8050
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 21:26:24 2009 +0100
+
+    Revert "Fallback to 'kern' if no GPOS applied"
+
+    This reverts commit d740c8f78bcbe80a8bcd8a9468830a406da37cc0.
+
+    The change is wrong.  If there is a GPOS table, we should not use
+    'kern'.
+
+ src/hb-ot-shape.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d740c8f78bcbe80a8bcd8a9468830a406da37cc0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 21:23:56 2009 +0100
+
+    Fallback to 'kern' if no GPOS applied
+
+ src/hb-ot-shape.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2f78c17197892b2bdc2f64caeb1c1c806ef44545
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 21:03:11 2009 +0100
+
+    Remove glibism!
+
+ src/hb-ot-shape-private.h | 4 ++--
+ src/hb-ot-shape.c         | 4 ++--
+ src/hb-shape.c            | 4 ++--
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 907e67da13b5ed719362702138703fe2f90e790d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 20:59:51 2009 +0100
+
+    Oops, add file.
+
+ src/hb-ot-shape-private.h | 53
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 53 insertions(+)
+
+commit 2014b8d110231b13e524008282ece7451f1ae9e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 20:58:26 2009 +0100
+
+    Hook OpenType shaping up
+
+    Default features only for now.
+
+ src/Makefile.am     |   2 +
+ src/hb-ot-layout.cc |  28 +++++++++
+ src/hb-ot-layout.h  |   7 +++
+ src/hb-ot-shape.c   | 165
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-shape.c      |   8 +--
+ 5 files changed, 206 insertions(+), 4 deletions(-)
+
+commit 196610ba4c7071c2b802d0fc921a63cbc0753114
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 19:01:14 2009 +0100
+
+    Pass features down
+
+ src/hb-shape.c | 49 +++++++++++++++++++++++++++++++++----------------
+ 1 file changed, 33 insertions(+), 16 deletions(-)
+
+commit 51f141a7f38a73f671b23f58cadf97a72c43b625
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 18:22:28 2009 +0100
+
+    Avoid overflow
+
+ src/hb-shape.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 26d7a75752631b2596a5bcb7e645b34cc3d139ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 17:58:25 2009 +0100
+
+    Refactor hb_shape a bit
+
+ src/hb-shape.c | 87
+ +++++++++++++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 74 insertions(+), 13 deletions(-)
+
+commit 001fc2d2aa22f14302739fe4ca45f7535855e0fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 17:24:05 2009 +0100
+
+    Add TrueType kern support
+
+ src/hb-shape.c | 74
+ +++++++++++++++++++++++++++++++++++++---------------------
+ 1 file changed, 48 insertions(+), 26 deletions(-)
+
+commit 2c1b85cf66e5ecb7521b6018b76f0e161fb68967
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 16:29:17 2009 +0100
+
+    Direct unicode->get_mirroring directly
+
+ src/hb-shape.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6a2ef5aa5459def232708af30ef8a484906b868b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 16:28:01 2009 +0100
+
+    Do mirroring
+
+ src/hb-shape.c | 18 +++++++++++++++++-
+ 1 file changed, 17 insertions(+), 1 deletion(-)
+
+commit 0465e69832393cc1ed36508ec5d597fbab64877a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 16:25:18 2009 +0100
+
+    Protect against NULL funcs
+
+ src/hb-buffer.c | 3 +++
+ src/hb-font.cc  | 3 +++
+ 2 files changed, 6 insertions(+)
+
+commit 5ceefa1d8dbd310570ea8d1c47107fe8d3dc96d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 15:29:16 2009 +0100
+
+    Add hb_unicode_get_*() functions
+
+ src/hb-unicode.c | 37 +++++++++++++++++++++++++++++++++++++
+ src/hb-unicode.h | 21 +++++++++++++++++++++
+ 2 files changed, 58 insertions(+)
+
+commit b8a53e44ce05911ce98b7cff34dee165e19d87ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 14:56:25 2009 +0100
+
+    We'll have to link to libstdc++ if linking to ICU, so disable test
+    for now
+
+    We have to get rid of the ICU in main lib.  Still thinking about
+    best way
+    to do it.
+
+ src/Makefile.am | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 314905d7548d5be58354546d660754b807b6efb2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 14:50:42 2009 +0100
+
+    Explicitly track whether the buffer has positions
+
+ src/hb-buffer-private.h |  3 ++-
+ src/hb-buffer.c         | 27 ++++++++++++++-------------
+ 2 files changed, 16 insertions(+), 14 deletions(-)
+
+commit 314b460d8a02ed4b2789ff527cf6c9bc19769114
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 20 13:58:50 2009 +0100
+
+    Add HB_DIRECTION_IS_FORWARD/BACKWARD
+
+ src/hb-common.h | 2 ++
+ src/hb-shape.c  | 3 +--
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit bdd0ff5290bae4db65c3fdf95c5728031f13ca84
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 15 04:07:40 2009 -0500
+
+    Make main.cc compile without glib
+
+ src/main.cc | 18 ++++++++++++++++--
+ 1 file changed, 16 insertions(+), 2 deletions(-)
+
+commit 8a7d16808200f4fa02d6d12a8b8492bdedeb2c24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 15 03:53:45 2009 -0500
+
+    Distribute autogen.sh
+
+ Makefile.am | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 807b8aa486753474e05e09f4fcca8ac94021b97c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 19 20:28:03 2009 -0500
+
+    Another C++ strictness fix
+
+    Pango Bug 602408 - Invalid C++ code breaks compile with Sun C++
+    Compiler
+    (Error: A union member cannot have a user-defined assignment operator)
+
+    According to the bug:
+
+    C++ Programming Language by Bjarne Stroustrup: Chapter 10.4.12 forbids
+    explicitly using of union members with constructors, destructors
+    or assignment
+    operations.
+
+    So we use a set() method instead of the assignment operator.  Ugly,
+    but hey,
+    that's life.
+
+ src/hb-open-type-private.hh        | 8 ++++----
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 8b9b866d3e495c186f0530fcf4e00ffcdc170d3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 19 20:27:57 2009 -0500
+
+    Fix warning
+
+ src/hb-ot-layout-gdef-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c65b26acf28bd1a5b346fd8f6f28bec1f7d17a2a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 18 11:27:33 2009 -0500
+
+    Use autoconf FLEXIBLE_ARRAY_MEMBER when available
+
+ configure.ac                     |  2 ++
+ src/hb-ot-layout-gpos-private.hh |  4 ++--
+ src/hb-private.h                 | 13 ++++++++++---
+ 3 files changed, 14 insertions(+), 5 deletions(-)
+
+commit d33f674cb793af40f1612df3660b138383f2de95
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 18 09:47:44 2009 -0500
+
+    Add Mongolian variation selectors
+
+ src/hb-shape.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit d6387757de2c27867d6f57c4ee7c4ef436b3a74f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 11 17:15:03 2009 -0500
+
+    Fix sanitize
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 636f017e387d46d4083c9f9ee57647a94dc5dc6d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 10 12:56:35 2009 -0500
+
+    Remove obsolete TODO item
+
+ src/hb-open-file-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit bf2b25dd8591e92f3944c763641b613a70c379a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 19:52:47 2009 -0500
+
+    Remove done item
+
+ src/hb-shape.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 4a8605315901e0ff1e6e09437a92dd5ac39164cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 19:52:01 2009 -0500
+
+    Reverse buffer at the end if RTL
+
+ src/hb-shape.c | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit ff44f88df2c46920f3ec2384ef321a4c7bb0f6ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 19:48:16 2009 -0500
+
+    Handle shaping in non-native direction
+
+ src/hb-buffer-private.h  |   1 +
+ src/hb-buffer.c          |  42 +++++++++++++++++--
+ src/hb-buffer.h          |  10 ++---
+ src/hb-common.h          |  11 +++++
+ src/hb-shape.c           |  38 +++++++++++++++--
+ src/hb-unicode-private.h |   5 +++
+ src/hb-unicode.c         | 103
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ 7 files changed, 196 insertions(+), 14 deletions(-)
+
+commit b4b4272c8d19ba3e0cb8f12b3b7d1590349e3d14
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 17:46:33 2009 -0500
+
+    Oops, wrong change
+
+ src/hb-ot-layout.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 52ea47767c7c35650ebddfba6ddc8203a3e33d3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 17:45:38 2009 -0500
+
+    Change order of font and face for API consistency
+
+ src/hb-ot-layout.cc | 14 +++++++-------
+ src/hb-ot-layout.h  | 14 +++++++-------
+ 2 files changed, 14 insertions(+), 14 deletions(-)
+
+commit f4f1fc970b3e37d9903cbf5e05bbd38be4df3047
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 17:42:38 2009 -0500
+
+    Remove debug info that crept in
+
+ src/hb-ot-layout.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit aa196d6026b496ec70be3d3588cc8cd2b8ccdb36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 17:23:31 2009 -0500
+
+    [GSUB] More ligature/component fixing
+
+    We can only reuse the ligid if it belongs to a previous ligature,
+    not a
+    component!
+
+ src/hb-ot-layout-gsub-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 25e7ef704633447f109b148620336c42d6fb310e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 17:21:01 2009 -0500
+
+    Add _hb_buffer_add_output_glyphs() that takes codepoint_t*
+
+ src/hb-buffer-private.h          | 10 ++++++++-
+ src/hb-buffer.c                  | 45
+ ++++++++++++++++++++++++++++++++++++++--
+ src/hb-ot-layout-gsub-private.hh | 16 +++++++-------
+ 3 files changed, 60 insertions(+), 11 deletions(-)
+
+commit 9db8ad75317d589807e7725455f49cafece58d5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 16:47:31 2009 -0500
+
+    Add hb_ot_layout_position_finish()
+
+    We expect buffer to be setup with default positions before GPOS.
+
+ src/hb-buffer-private.h          |  6 +----
+ src/hb-buffer.h                  | 11 +--------
+ src/hb-ot-layout-gpos-private.hh |  8 +++----
+ src/hb-ot-layout.cc              | 52
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout.h               | 16 +++++++++----
+ 5 files changed, 69 insertions(+), 24 deletions(-)
+
+commit edb54e9aeca25f4120a69ed3d5562cbb68fdb348
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 15:19:22 2009 -0500
+
+    Fix FT_Face finalizer call
+
+ src/hb-ft.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3d14528b8b2e7da425a9df7057fc9fb326d8298c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 15:13:17 2009 -0500
+
+    Rename hb_buffer_get_len() to hb_buffer_get_length()
+
+ src/hb-buffer.c | 2 +-
+ src/hb-buffer.h | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 1ff7775051559a8ca442be3938450c7ed3817806
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 6 13:52:57 2009 -0500
+
+    Minor.
+
+ src/hb-shape.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 3648bdf5b221adfe01ad99714de420b49964921e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 20:17:53 2009 -0500
+
+    Fix FT_Face generic finalizer
+
+ src/hb-ft.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit 5a11c875d8c95d480e6f32b57e969ee34ca1940d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 20:08:17 2009 -0500
+
+    Cosmetic
+
+ src/hb-blob.c | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 44533e773f75b9a1171d884fcbe91a2f3879e2d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 19:58:02 2009 -0500
+
+    Fix warning
+
+ src/hb-object-private.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bcc0406a525ca3fe597aec5f2a97e5c50965d49c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 19:54:23 2009 -0500
+
+    include errno.h
+
+ src/hb-blob.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 799b3c375ad0e1293fd37a0e3a0d422a3166dcd8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 19:37:58 2009 -0500
+
+    Add debugging to object lifecycle
+
+ src/hb-object-private.h | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+commit 25edb940ab050545f47a06648e73c192fa213548
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 19:20:06 2009 -0500
+
+    Cosmetic
+
+ src/hb-ft.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 850dc5bb551409bb9bf6113ec2199bb3fb905e43
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 18:26:52 2009 -0500
+
+    Return 0 from get_glyph_nil
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 85555a953376ee68a8fcc64485e74d44a353577b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 18:25:56 2009 -0500
+
+    Initialize font->klass
+
+ src/hb-font.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit bcd26bd7b1c96057bf154d7d50a61018d40f0d29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 18:03:26 2009 -0500
+
+    Add TODO item
+
+ src/hb-ft.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f4281e0a92a40746fa630fb15b877adaf3ff15b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 17:58:41 2009 -0500
+
+    Fix ref counting
+
+ src/hb-ft.c | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 6358ff45ae8cfc0b58b4976619319e3dde43add2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 17:39:16 2009 -0500
+
+    Add hb_ft_face_create_cached
+
+ src/hb-ft.c | 16 ++++++++++++++++
+ src/hb-ft.h |  3 +++
+ 2 files changed, 19 insertions(+)
+
+commit 2027f74b286cabe3c60c275170c4f4b437a30f55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 16:34:47 2009 -0500
+
+    Add default positioning to hb-shape
+
+ src/hb-shape.c | 28 ++++++++++++++++++++++++----
+ 1 file changed, 24 insertions(+), 4 deletions(-)
+
+commit c3f9f7e59d865f8664862b7ca99d9a3a9221e456
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 16:16:14 2009 -0500
+
+    Fix MarkMark issue with ligid and components
+
+ src/hb-ot-layout-gpos-private.hh | 11 ++++++-----
+ src/hb-ot-layout-gsub-private.hh |  6 +-----
+ 2 files changed, 7 insertions(+), 10 deletions(-)
+
+commit d0351314cd29fbdf0efb5c7f89a569648f7a7fc7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 16:16:06 2009 -0500
+
+    Include stdio.h if debugging
+
+ src/hb-blob.c                        | 4 ++++
+ src/hb-open-type-private.hh          | 1 +
+ src/hb-ot-layout-gsubgpos-private.hh | 1 +
+ 3 files changed, 6 insertions(+)
+
+commit 2e336692913405976392bf505028481a5caa53b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 13:55:41 2009 -0500
+
+    Add hb_font_get_*
+
+ src/hb-font.cc | 35 +++++++++++++++++++++++++++++++++++
+ src/hb-font.h  | 18 ++++++++++++++++++
+ src/hb-shape.c |  2 +-
+ 3 files changed, 54 insertions(+), 1 deletion(-)
+
+commit 9bef3611f07b45ba8199a4a339c72f49d266216a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 12:20:11 2009 -0500
+
+    Rename [xy]_pos to [xy]_offset since we don't accumulate positions
+
+ src/hb-buffer-private.h          |  4 ++--
+ src/hb-buffer.h                  |  4 ++--
+ src/hb-font.h                    |  4 ++--
+ src/hb-ft.c                      | 10 +++++-----
+ src/hb-ot-layout-gpos-private.hh | 40
+ ++++++++++++----------------------------
+ src/hb-shape.c                   | 14 +++++++-------
+ src/hb-shape.h                   |  4 ++--
+ 7 files changed, 32 insertions(+), 48 deletions(-)
+
+commit 2daa47e9cdbfb027f76765301b3a78950e92eb09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 5 12:08:34 2009 -0500
+
+    Cosmetic
+
+ src/hb-shape.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2f50d873680ce0a43b6ec79df1ac946b91f31e63
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 21:07:03 2009 -0500
+
+    Start filling hb_shape() in
+
+ src/hb-buffer-private.h |  1 +
+ src/hb-shape.c          | 40 +++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 40 insertions(+), 1 deletion(-)
+
+commit ae070b7d39d03bd8bc1244f687b24db505f4af3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 20:29:54 2009 -0500
+
+    Add script and language to buffer
+
+ TODO                    |  1 -
+ src/hb-buffer-private.h |  6 +++---
+ src/hb-buffer.c         | 26 ++++++++++++++++++++++++++
+ src/hb-buffer.h         | 15 ++++++++++++++-
+ 4 files changed, 43 insertions(+), 5 deletions(-)
+
+commit 8a3511ac6c795226699c2b36e03401ecdf88f5f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 19:45:39 2009 -0500
+
+    Add hb_language_t as well as language/script conversion to OT tags
+
+ src/Makefile.am     |   4 +
+ src/hb-language.c   | 113 +++++++++
+ src/hb-language.h   |  44 ++++
+ src/hb-ot-layout.cc |   6 +-
+ src/hb-ot-layout.h  |   4 +-
+ src/hb-ot-tag.c     | 662
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-tag.h     |  49 ++++
+ src/hb-ot.h         |   1 +
+ src/hb-private.h    |   3 +
+ src/hb.h            |   1 +
+ 10 files changed, 882 insertions(+), 5 deletions(-)
+
+commit 4591753ad4b5ec0224e3f1befdfe4fc5f6075562
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 18:15:59 2009 -0500
+
+    Define ARRAY_LENGTH
+
+ src/hb-private.h | 15 ++++++++-------
+ 1 file changed, 8 insertions(+), 7 deletions(-)
+
+commit 214ac7c1ff51b397d227832526f882e824cb9ea3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 18:12:32 2009 -0500
+
+    Another one
+
+ src/hb-unicode.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1e91434569a9e9535ef021ca52b60b2e2af75d19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 18:12:09 2009 -0500
+
+    Minor
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 48de3730cdf91b9f6473509e22260a902ccec992
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 16:59:50 2009 -0500
+
+    Fix previous commit, ouch!
+
+ src/hb-open-type-private.hh        | 12 ++++++++++++
+ src/hb-ot-layout-common-private.hh | 12 ++++--------
+ src/hb-ot-layout-gdef-private.hh   | 12 ++++--------
+ 3 files changed, 20 insertions(+), 16 deletions(-)
+
+commit e21899bc3593aa0d3adf64cee21c5de2ea219783
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 16:36:14 2009 -0500
+
+    Fix array query API
+
+    The array query APIs now all do:
+
+      - Return the total number of items
+      - Take a start_offset, such that individual items can be fetched
+      - The _count IN/OUT variable always has number of items written
+        into the array upon return of the function
+
+ TODO                                 |  1 -
+ src/hb-ot-layout-common-private.hh   | 59 ++++++++++++++-----------
+ src/hb-ot-layout-gdef-private.hh     | 84
+ +++++++++++++++++++++---------------
+ src/hb-ot-layout-gsubgpos-private.hh | 14 +++---
+ src/hb-ot-layout.cc                  | 40 ++++++++++-------
+ src/hb-ot-layout.h                   | 24 +++++++----
+ 6 files changed, 131 insertions(+), 91 deletions(-)
+
+commit 3b59306b858d31d97be0ea8c64461de1d0d03572
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 4 15:48:32 2009 -0500
+
+    Finish FT glue.  Rough and untested
+
+ src/hb-font.cc |   2 +-
+ src/hb-font.h  |   2 +-
+ src/hb-ft.c    | 114
+ ++++++++++++++++++++++++++++++---------------------------
+ 3 files changed, 63 insertions(+), 55 deletions(-)
+
+commit f8be443aecd54b479470e6559b1dfbc8f33c5f55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 20:28:27 2009 -0500
+
+    Add TODO item
+
+ TODO | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 7951279b4a52b48f13631e7838dbc180c7249ea4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 20:27:05 2009 -0500
+
+    Implement nil font functions
+
+ TODO                             |  1 +
+ src/hb-font-private.h            |  8 ++---
+ src/hb-font.cc                   | 72
+ +++++++++++++++++++++++++++++++++++++---
+ src/hb-font.h                    |  9 +++--
+ src/hb-ot-layout-gpos-private.hh |  7 ++--
+ src/hb-ot-layout-gsub-private.hh |  2 +-
+ src/hb-private.h                 | 18 +++++-----
+ 7 files changed, 91 insertions(+), 26 deletions(-)
+
+commit 8fb3d1aa4e613cdf965a83bd650c668884c58ad8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 18:34:20 2009 -0500
+
+    Start ft glue
+
+ TODO                  |   3 -
+ src/Makefile.am       |  16 ++++-
+ src/hb-font-private.h |   4 +-
+ src/hb-font.cc        |  17 ++++-
+ src/hb-font.h         |   6 +-
+ src/hb-ft.c           | 192
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ft.h           |  52 ++++++++++++++
+ src/hb-glib.h         |   2 -
+ src/hb-icu.h          |   2 -
+ src/hb.h              |   4 +-
+ 10 files changed, 281 insertions(+), 17 deletions(-)
+
+commit d94647e2cd187bf4a4c8fb1c0c15c3d23c1293ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 16:35:10 2009 -0500
+
+    Add ICU glue
+
+ configure.ac    |   8 +-
+ src/Makefile.am |  23 +++++-
+ src/hb-icu.c    | 221
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-icu.h    |  41 +++++++++++
+ 4 files changed, 288 insertions(+), 5 deletions(-)
+
+commit b7dd4b945b4ec384526439b365a25739bf9cd2df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 15:21:15 2009 -0500
+
+    Fix hb_be_uint16()
+
+ src/hb-private.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cd7555eef27cb18857c0c06d2afdaf3a354a3c15
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 15:16:10 2009 -0500
+
+    Namespace MSVC defines in public header
+
+ src/hb-common.h | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 5ebabecef382c3e8b0a2a5657b2c01f7ff37d796
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 15:15:07 2009 -0500
+
+    Move unicode_funcs to buffer
+
+ TODO                    |  1 -
+ src/hb-buffer-private.h | 12 +++++++++++-
+ src/hb-buffer.c         | 47
+ ++++++++++++++++++++++++++++++++++++++---------
+ src/hb-buffer.h         | 10 ++++++++++
+ src/hb-font-private.h   |  3 ---
+ src/hb-font.cc          | 17 -----------------
+ src/hb-font.h           |  9 ++++-----
+ 7 files changed, 63 insertions(+), 36 deletions(-)
+
+commit d5a8e46099e363d928b54de104126b1b34ba401c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 15:14:40 2009 -0500
+
+    [Makefile] Install hb-unicode.h
+
+    Separate OT headers also.
+
+ src/Makefile.am | 27 ++++++++++++++++-----------
+ 1 file changed, 16 insertions(+), 11 deletions(-)
+
+commit 63d7a41dd0704a7e89bd2872ad096f470f51866a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 15:14:08 2009 -0500
+
+    [TODO] Add item for fixing buffer error handling
+
+ TODO | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 21d0fce3d5364c91e5582bd530210f03e054d1a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 14:28:32 2009 -0500
+
+    Add check for not linking to libstdc++
+
+ TODO                   |  3 +--
+ src/Makefile.am        |  4 ++++
+ src/check-libstdc++.sh | 28 ++++++++++++++++++++++++++++
+ 3 files changed, 33 insertions(+), 2 deletions(-)
+
+commit ca95ce460adf2ca6901595d4a6107fd000d90151
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 14:18:33 2009 -0500
+
+    Use the C linker, not C++ linker
+
+    Such that we don't link to libstdc++.
+
+ src/Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit eb4ebda2d10637b966f42a4ed5cfaec46082a050
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 14:09:32 2009 -0500
+
+    [configure] Fix check for FreeType
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cb0e99a5a76136c128faba1c27d7e7eac2f219ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 14:09:10 2009 -0500
+
+    [TODO] Remove obsolete item
+
+ TODO | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 3a59ec37c5576b711c7c36dcfa2a63f6c00a3f5c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 11:36:06 2009 -0500
+
+    Add bunch of TODO items
+
+ TODO | 15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+commit ffbe0a853d5e7defa85d0eef53814c22d1ecb412
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 10:52:45 2009 -0500
+
+    More MSVC fixes from Jonathan Kew
+
+ src/hb-common.h  | 7 ++++++-
+ src/hb-private.h | 5 +++++
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit d3480ba37fbb5d4be75b094060f5b2f1ce98fb53
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 3 10:47:29 2009 -0500
+
+    Don't use zero-sized arrays
+
+    It's not part of the standard and MSVC doesn't like it.  It makes
+    the code
+    a lot less elegant than it used to be, but I think it should work now.
+
+ src/hb-open-file-private.hh          |  4 +-
+ src/hb-open-type-private.hh          | 36 +++++++++++------
+ src/hb-ot-layout-common-private.hh   | 33 ++++++++--------
+ src/hb-ot-layout-gdef-private.hh     | 14 +++----
+ src/hb-ot-layout-gpos-private.hh     | 76
+ ++++++++++++++----------------------
+ src/hb-ot-layout-gsub-private.hh     | 44 ++++++++-------------
+ src/hb-ot-layout-gsubgpos-private.hh | 47 +++++++++++-----------
+ src/hb-private.h                     |  5 +++
+ 8 files changed, 122 insertions(+), 137 deletions(-)
+
+commit 6bec81aa3a58b8be255568b2ea63b7854e1b0ea7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 19:17:36 2009 -0500
+
+    Cosmetic
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f94cf6b969281cf8a7f701ff26ea4f134ff9746e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 18:55:19 2009 -0500
+
+    Another try at build without glib
+
+ configure.ac | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 2f3e69f3cb7e571cc62b0840d0b3f2072b29345a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 18:53:15 2009 -0500
+
+    Fix build without glib, again
+
+ src/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d03f81865914b40e941bf680557c0d8f98e30ad5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 18:52:21 2009 -0500
+
+    Disable configure cache
+
+ autogen.sh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit a6451aa626fa5850d7c3b716bd52126995154e27
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 18:35:12 2009 -0500
+
+    We don't really use gthread directly
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 63a792a811e0ad69d05e8805d4f347bd533db4c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 18:33:52 2009 -0500
+
+    Update Makefile to build without glib
+
+ src/Makefile.am | 12 +++++++++---
+ src/hb-glib.c   |  2 ++
+ 2 files changed, 11 insertions(+), 3 deletions(-)
+
+commit 68a2c771e2b923461a552bf3673e9e8245e1bfea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 18:31:53 2009 -0500
+
+    Build without glib
+
+    Thready-safety disabled in that case, until we add support for
+    pthread, etc.
+    Fun...
+
+ src/hb-private.h | 19 +++++++++++++++++--
+ 1 file changed, 17 insertions(+), 2 deletions(-)
+
+commit cc4c096a7e08ae96b3030fe27f871ce5b797f370
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 18:13:17 2009 -0500
+
+    MSVC has no stdint.h
+
+ src/hb-common.h | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit 9a204c7ab57ca0a866c72e1431c54a8883b15605
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 18:11:55 2009 -0500
+
+    Remove use of GINT16_FROM_BE
+
+ src/hb-private.h | 10 ++--------
+ 1 file changed, 2 insertions(+), 8 deletions(-)
+
+commit 1f0ceeb8cf2fad0a0dfd338ce1472470a81789d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 16:28:39 2009 -0500
+
+    Install library
+
+ autogen.sh      | 2 +-
+ src/Makefile.am | 5 ++---
+ 2 files changed, 3 insertions(+), 4 deletions(-)
+
+commit 5932f8f7c3b73ade3752020351fa8b6a9a3bf500
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 16:38:41 2009 -0500
+
+    Generate ChangeLog
+
+ Makefile.am | 39 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 39 insertions(+)
+
+commit 29aa40018301a4f138cd5e73463079c7704bf3ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 16:28:39 2009 -0500
+
+    Add build system
+
+ AUTHORS                |   0
+ src/COPYING => COPYING |   0
+ Makefile.am            |   3 +
+ NEWS                   |   0
+ src/README => README   |   0
+ src/TODO => TODO       |   0
+ autogen.sh             | 189
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ configure.ac           |  40 +++++++++++
+ git.mk                 | 184
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ harfbuzz.pc.in         |  11 +++
+ src/.gitignore         |   1 -
+ src/Makefile.ng        |  11 ---
+ 12 files changed, 427 insertions(+), 12 deletions(-)
+
+commit c09ed9801ead002d6f8e507ce664b83707b202e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 29 03:08:42 2009 -0400
+
+    [HB] Add glyph_metrics typedef
+
+ src/hb-font.h | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 91b1e03e0312be2a7a165308239b40449e3ab360
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 29 03:05:18 2009 -0400
+
+    [HB] Add point_index to get_contour_point()
+
+    Pointed out by Keith Stribley on HarfBuzz list.
+
+ src/hb-font.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit aa87d951739f6beacb66daa235cd033fdcfcadd7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 29 03:00:44 2009 -0400
+
+    [HB] Fix lookup_flag ignoring
+
+    Reported by Keith Stribley on HarfBuzz list.
+
+ src/hb-ot-layout-common-private.hh | 1 +
+ src/hb-ot-layout.cc                | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 52e9a71d578c5171bbb0f4bfc1b70841c3270328
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 21 13:58:56 2009 -0400
+
+    [HB] Add comment
+
+ src/hb-ot-layout-gsubgpos-private.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit f9c0a2dad09cd168fb28cdee09b4303f307ea56d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 21 13:43:54 2009 -0400
+
+    [HB] Fix apply_lookup() loop
+
+    Part of Bug 595539 - Regressions in rendering certain Thai sequences
+    with
+    OpenType font
+
+ src/hb-ot-layout-gsubgpos-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit c0ab43c05833e8fc06d770a89370bec58a627e74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 21 13:40:38 2009 -0400
+
+    [HB] Fix bug in chain_context_lookup() invocations
+
+    Part of Bug 595539 - Regressions in rendering certain Thai sequences
+    with
+    OpenType font
+
+ src/hb-ot-layout-gsubgpos-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e6bd4e93bd5722249ab977dfa98bdc8eb765318c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 30 21:02:28 2009 -0400
+
+    [HB] Add TODO item
+
+ src/TODO | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3e2401f6c53d2b047954d75c37aef5e5e7cdc51a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 28 17:17:11 2009 -0400
+
+    [HB] Rename DEBUG to TRACE where appropriate
+
+ src/hb-open-file-private.hh          |  8 ++--
+ src/hb-open-type-private.hh          | 50 ++++++++++----------
+ src/hb-ot-layout-common-private.hh   | 32 ++++++-------
+ src/hb-ot-layout-gdef-private.hh     | 20 ++++----
+ src/hb-ot-layout-gpos-private.hh     | 92
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gsub-private.hh     | 72 ++++++++++++++--------------
+ src/hb-ot-layout-gsubgpos-private.hh | 78 +++++++++++++++---------------
+ 7 files changed, 176 insertions(+), 176 deletions(-)
+
+commit 0535b50f436f3dac85e6df1761957f86c2bd7213
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 28 17:14:33 2009 -0400
+
+    [HB] Add GSUB/GPOS tracing
+
+ src/hb-ot-layout-gpos-private.hh     | 29 ++++++++++++++++++---
+ src/hb-ot-layout-gsub-private.hh     | 28 ++++++++++++++++++---
+ src/hb-ot-layout-gsubgpos-private.hh | 49
+ ++++++++++++++++++++++++++++++++++--
+ 3 files changed, 98 insertions(+), 8 deletions(-)
+
+commit 95e202403ffa543c817f45cca21fbc116eb8e807
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 28 16:31:20 2009 -0400
+
+    [HB] Allow enabling different debug facilities individually
+
+ src/hb-blob.c               | 28 ++++++++++++++++------------
+ src/hb-open-type-private.hh | 32 ++++++++++++++++++--------------
+ 2 files changed, 34 insertions(+), 26 deletions(-)
+
+commit 37006bd1bd107ac1a1c1b131579e9c494ba3a20f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 28 09:46:14 2009 -0400
+
+    Fix stupid array growing bug
+
+ src/hb-ot-layout.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 9897749113f76dc26a83bfae8de62e55d384fcad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 27 01:32:17 2009 -0400
+
+    [HB] Simplify counting
+
+ src/hb-ot-layout.cc | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 81a5c4df94e7c6066314d5fe75bbaf24483bc022
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 27 00:21:04 2009 -0400
+
+    [HB] Indent
+
+ src/hb-blob.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c91facd83b5dc3b9aed75617c7c35585ff18889f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 26 18:53:43 2009 -0400
+
+    [HB] Bug 593231 - < c99 compiler dislikes ValueRecord
+
+ src/hb-ot-layout-gpos-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit f0c7540c4e217a7354072365a7301453d1e25b80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 20 14:01:37 2009 -0400
+
+    Bug 592484 -  invalid write in HB
+
+    Fix off-by-one.
+
+ src/hb-ot-layout.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b614b004723ead60849dd37e7ba2faee67cebd93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 20 13:07:50 2009 -0400
+
+    [HB][glib] Make glib unicode funcs static
+
+ src/hb-glib.c | 36 +++++++++++++++++-------------------
+ 1 file changed, 17 insertions(+), 19 deletions(-)
+
+commit 8b5346130425c7c101f6ff2432874ba2fd372edc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 19 18:16:50 2009 -0400
+
+    [HB] Fix more casts
+
+ src/hb-open-type-private.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 9d2e02db74deb3b3b92beab96f112cc387c8bd88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 19 18:07:36 2009 -0400
+
+    [HB] Rename CAIRO_ in macro prefix to HB_
+
+    Hiss!
+
+ src/hb-private.h | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 388ad037ff399c23c5e24bbcede27e0e35bed07e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 19 16:45:41 2009 -0400
+
+    [HB] Remove HB_MEMORY_MODE_READONLY_NEVER_DUPLICATE
+
+    Unlike the rest of the memory-mode enum, this one didn't only
+    describe the access mode of the input memory region.  Remove it.
+
+    If someone wants to inhibit duplicating, they can lock the blob
+    and throw away the key.
+
+    Based on mailing list discussion with Carl Worth.
+
+ src/hb-blob.c | 51 +++++++++++++++++++++++++--------------------------
+ src/hb-blob.h |  1 -
+ 2 files changed, 25 insertions(+), 27 deletions(-)
+
+commit 977eeb714454630bd045bb11f58ff6397f10b143
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 19 16:17:24 2009 -0400
+
+    [HB] s/writeable/writable/g
+
+ src/hb-blob.c               | 38 +++++++++++++++++++-------------------
+ src/hb-blob.h               | 10 +++++-----
+ src/hb-open-type-private.hh |  6 +++---
+ 3 files changed, 27 insertions(+), 27 deletions(-)
+
+commit 2f5931e404cb56e31d24b2eb7ff0a849fb077b55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 19 16:07:40 2009 -0400
+
+    [HB] Hide lig_id and component members of hb_glyph_info_t
+
+ src/hb-buffer.h | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 6b600dd6199104cff01b3fa43d2abb52ae4319ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 19 14:45:24 2009 -0400
+
+    [HB] Fix typo
+
+ src/hb-font.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 32c65a5ca3bde673bf2aa8fca911dd32914d3122
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 18 18:37:36 2009 -0400
+
+    [HB] Add font funcs prototypes
+
+ src/hb-font-private.h |  2 --
+ src/hb-font.cc        | 14 ++++++--------
+ src/hb-font.h         | 23 ++++++++++++++++-------
+ 3 files changed, 22 insertions(+), 17 deletions(-)
+
+commit 8f034d5849627ee95a5889fa34c9ba294fff13ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 18 16:41:59 2009 -0400
+
+    Fix a few other pedantic warnings
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ src/hb-ot-layout-gdef-private.hh   | 2 +-
+ src/hb-ot-layout-gpos-private.hh   | 4 ++--
+ src/hb-ot-layout-gsub-private.hh   | 2 +-
+ 4 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 864e2560b627f1e73be3b0635e02f00844cb67c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 18 16:38:48 2009 -0400
+
+    [HB] Fix pedantic warnings
+
+ src/hb-blob.h           |  2 +-
+ src/hb-buffer-private.h | 18 +++++++++---------
+ src/hb-buffer.h         |  6 +++---
+ 3 files changed, 13 insertions(+), 13 deletions(-)
+
+commit 3e09722214d9bbcc9014409342072c79d0c4447f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 18 16:32:31 2009 -0400
+
+    [HB] Fix more wrong method signatures
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 822e99fe9ae920df41a0bd3f1125495c2ea96b45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 18 16:27:48 2009 -0400
+
+    [HB] Fix wrong method signature
+
+ src/hb-ot-layout-common-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4ff2a58952f010c6252f06e5f404d6840d257250
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 18 15:49:23 2009 -0400
+
+    Bug 592194 -  Fix missing _SC_PAGE_SIZE macro
+
+    Autoconfiscate a simple call to mprotect() even more.
+
+ src/hb-blob.c | 94
+ ++++++++++++++++++++++++++++++++++++++---------------------
+ 1 file changed, 60 insertions(+), 34 deletions(-)
+
+commit 3c69bd46e27069fac0bfdefdecf5492c17eb01df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 17 16:48:13 2009 -0400
+
+    [HB] Avoid int overflow in GPOS
+
+    Bug 592036 - integer overflow bug causes misrendering of Nepali
+    characters
+
+ src/hb-ot-layout-gpos-private.hh | 20 ++++++++++----------
+ src/hb-private.h                 |  3 +++
+ 2 files changed, 13 insertions(+), 10 deletions(-)
+
+commit b2b18ef43c5bac6a5bb8412da7c9a37f815d4deb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 14 19:37:18 2009 -0400
+
+    [HB] Simplify loop
+
+ src/hb-ot-layout-gpos-private.hh | 31 ++++++++++++++-----------------
+ 1 file changed, 14 insertions(+), 17 deletions(-)
+
+commit b41f210d12d8df48e645823463343f7e14b0ddd0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 14 19:33:24 2009 -0400
+
+    [HB] Merge mark positionin code between three types of lookups
+
+ src/hb-ot-layout-gpos-private.hh | 95
+ ++++++++++++----------------------------
+ 1 file changed, 29 insertions(+), 66 deletions(-)
+
+commit cd33cb9ed84308da72bd7c64b9355dc2410c63ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 14 18:42:42 2009 -0400
+
+    [HB] More minor shuffling
+
+ src/hb-open-type-private.hh        | 3 ---
+ src/hb-ot-layout-common-private.hh | 5 +++++
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit 80e2aa2e1bfa2c8ecedcfa4cce8cadeb15792ac3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 14 18:40:56 2009 -0400
+
+    [HB] Move code around
+
+ src/hb-open-type-private.hh        | 21 +++++++++++++++++++++
+ src/hb-ot-layout-common-private.hh | 19 -------------------
+ 2 files changed, 21 insertions(+), 19 deletions(-)
+
+commit 3564ee5216004d45d30b0ded61184cf8dde5dd89
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 14 18:32:56 2009 -0400
+
+    [HB] Correctly sanitize LigatureAttach
+
+ src/hb-open-type-private.hh        | 14 ++++++++++----
+ src/hb-ot-layout-common-private.hh |  4 ++++
+ src/hb-ot-layout-gdef-private.hh   |  4 ++--
+ src/hb-ot-layout-gpos-private.hh   |  6 +++---
+ 4 files changed, 19 insertions(+), 9 deletions(-)
+
+commit cb71a2fb76c6ddee050f775eb299ee44230c3ac9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 14 18:14:03 2009 -0400
+
+    [HB] Simplify MarkBase and MarkLig too
+
+ src/hb-ot-layout-gpos-private.hh | 127
+ +++++++++++++++------------------------
+ 1 file changed, 48 insertions(+), 79 deletions(-)
+
+commit dfa54f4440960c39d37ef02fff4c0d9eb315d4b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 14 17:53:31 2009 -0400
+
+    [HB] Simplify MarkMark
+
+ src/hb-ot-layout-gpos-private.hh | 29 ++++++++++++++++-------------
+ 1 file changed, 16 insertions(+), 13 deletions(-)
+
+commit 815a73e4202ca17677f12e862b70ca8724cf2f57
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 14 17:31:16 2009 -0400
+
+    [HB] Fix possible int overflows during sanitize
+
+ src/TODO                         |  1 -
+ src/hb-open-type-private.hh      | 22 ++++++++++++++++++++++
+ src/hb-ot-layout-gpos-private.hh | 15 ++++++++-------
+ 3 files changed, 30 insertions(+), 8 deletions(-)
+
+commit ae728e51e94d18d731b7c8dc524da1a4f427d63b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 14 16:41:00 2009 -0400
+
+    [HB] Debug output for SANITIZE_MEM()
+
+ src/hb-open-type-private.hh | 34 +++++++++++++++++++++++-----------
+ 1 file changed, 23 insertions(+), 11 deletions(-)
+
+commit 41895506cb6a41b1a833866f8822261ea449ea0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 14 16:25:33 2009 -0400
+
+    [HB] Use inline function for SANITIZE_MEM()
+
+ src/hb-open-type-private.hh | 33 ++++++++++++++++++++-------------
+ 1 file changed, 20 insertions(+), 13 deletions(-)
+
+commit 95528131b5ab9fc9e265ace715832135ebd457a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 14 16:17:32 2009 -0400
+
+    [HB] Use SANITIZE_THIS() when applicable
+
+ src/hb-open-type-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 5769538abfe153c503da4801649493e57a9854c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 14 16:12:22 2009 -0400
+
+    [HB] Add note about auditing sanitize code for overflows
+
+ src/TODO                         | 1 +
+ src/hb-ot-layout-gpos-private.hh | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 15232e26f4a89dab1b6de35ad9d3d16e75bf93d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 13 17:13:25 2009 -0400
+
+    [HB] Add empty hb_shape() API
+
+ src/Makefile.am |  2 ++
+ src/hb-shape.c  | 40 ++++++++++++++++++++++++++++++++++++++++
+ src/hb-shape.h  | 53
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 95 insertions(+)
+
+commit 2866d2974b6768e93cc7d473d14c5a8abae5f7fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 13 11:47:08 2009 -0400
+
+    [HB] Bitfield packing *is* very delicate
+
+    Fix the second instance.
+
+ src/hb-buffer.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ec90ee23b29aab187c3fa209970aa97434c84b1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 13 05:25:23 2009 -0400
+
+    Bug 591511 – hh-blob.c does not compile using mingw on windows
+
+    Check for sys/mman.h, not mprotect().
+
+ src/hb-blob.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 12eae6d55d468ff2fbe2bc12bec188d313c671f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 13 05:20:46 2009 -0400
+
+    [HB] Fix buffer sizing issue with mingw gcc
+
+    Bit field packing is a delicate field.  Issue reported in comment
+    3 here:
+    http://bugzilla.gnome.org/show_bug.cgi?id=591511
+
+ src/hb-buffer-private.h | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 6936706cd77f96961a1239d0c9dc8ede64d7f06d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 12 19:45:50 2009 -0400
+
+    Bug 591413 – needs to link with libstdc++
+
+    Enforce -fno-exceptions better.
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c486ea9c3582710474c1085c21c1dc5e2700adc3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 12 19:36:29 2009 -0400
+
+    Bug 591511 – hb-blob.c does not compile using mingw on windows
+
+    Only call mprotect() when available.  For optimal performance, a win32
+    way to make memory writeable needs to be added.
+
+ src/hb-blob.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit a579584594f1ca4781f1c5b92ad78513c0b37480
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 12 19:23:16 2009 -0400
+
+    [HB] Add comment
+
+ src/hb-buffer-private.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b6e66ee102eb5b64d945e5a73ab63fe8cac5edcb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 12 16:50:28 2009 -0400
+
+    [HB] Always clear positions if dirty, before returning to user
+
+ src/hb-buffer.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e4679d9fae43f3219c476c5b9e411d1f5d0d5bae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 12 16:47:27 2009 -0400
+
+    [HB] Fix _hb_buffer_next() when positioning
+
+    We were copying glyphs to output.  This should not happen when in
+    GPOS.  Back then it was fine, then some optimizations broke then
+    assumption.
+
+ src/hb-buffer-private.h |  1 +
+ src/hb-buffer.c         | 12 ++++++++++++
+ 2 files changed, 13 insertions(+)
+
+commit 5ccf1ba339d6ffb4469f1c4f20d8d8d00012c857
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 12 15:55:23 2009 -0400
+
+    [HB] Fixed signedness warnings
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f71329147bd3087588cfeafd6feff45f29d1ca7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 12 15:48:44 2009 -0400
+
+    [HB] Ouch.  Fix compilation.
+
+ src/hb-ot-layout-gpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0532ed160c678b5404b20594fd2ca9a640bf6a0a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 12 15:40:04 2009 -0400
+
+    [HB] Fix invalid access / overflow on x86-64
+
+    Bug 591557 – [HB] crash scrolling the evolution message list
+    Bug 591576 – crashed with SIGSEGV at pango
+
+ src/hb-ot-layout-gpos-private.hh | 21 ++++++++++++---------
+ src/hb-ot-layout-gsub-private.hh |  2 --
+ 2 files changed, 12 insertions(+), 11 deletions(-)
+
+commit 8d70312c7b899131c3aafa7a43527ef3ced33bfe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 23:50:51 2009 -0400
+
+    [HB] Add hb_font_funcs_make_immutable()
+
+ src/hb-font-private.h |  4 ++++
+ src/hb-font.cc        | 17 +++++++++++++++--
+ src/hb-font.h         |  3 +++
+ 3 files changed, 22 insertions(+), 2 deletions(-)
+
+commit 3284d05da27c338d94f0da99df66d924cd9d6717
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 23:45:57 2009 -0400
+
+    [HB] Add missing initializer
+
+ src/hb-font.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 081819ea8b98c0a4b4dffe8d4aca3512f9798719
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 23:40:28 2009 -0400
+
+    [OT] Hookup glib unicode funcs
+
+ src/hb-buffer.c     | 14 +++++++-------
+ src/hb-glib.c       |  4 +++-
+ src/hb-glib.h       |  4 ++--
+ src/hb-ot-layout.cc | 10 +++++-----
+ src/hb-private.h    |  2 +-
+ 5 files changed, 18 insertions(+), 16 deletions(-)
+
+commit 49f261df2aa753e8b09e97f7835e6a827f92970a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 23:35:05 2009 -0400
+
+    [HB] Add hb-glib
+
+ src/Makefile.am          |  4 +++-
+ src/hb-glib.c            | 56
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-glib.h            | 41 +++++++++++++++++++++++++++++++++++
+ src/hb-unicode-private.h |  2 +-
+ src/hb-unicode.c         | 10 ++++-----
+ src/hb-unicode.h         |  6 +++---
+ 6 files changed, 109 insertions(+), 10 deletions(-)
+
+commit eb27ec0cef0d92740875ab5035b53acc639e5fae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 23:25:28 2009 -0400
+
+    [HB] Add hb_unicode_funcs_make_immutable()
+
+ src/hb-unicode-private.h |  2 ++
+ src/hb-unicode.c         | 22 +++++++++++++++++-----
+ src/hb-unicode.h         |  2 ++
+ 3 files changed, 21 insertions(+), 5 deletions(-)
+
+commit af9e104028b7cdc1fbba0eb1d86cfa4d5258657f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 23:21:33 2009 -0400
+
+    [HB] Use nil unicode funcs in nil face
+
+ src/hb-font.cc           | 7 ++++---
+ src/hb-unicode-private.h | 3 +++
+ src/hb-unicode.c         | 2 +-
+ 3 files changed, 8 insertions(+), 4 deletions(-)
+
+commit 48910f8f0034c54b4e11cef3d08aa40e52c06b28
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 23:05:05 2009 -0400
+
+    [HB] Initialize unicode funcs to nil getters
+
+ src/hb-unicode.c | 29 +++++++++++++++++++----------
+ 1 file changed, 19 insertions(+), 10 deletions(-)
+
+commit 04cc0a29ee1472c318c36efcd19b9c1a6657d9ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 22:58:56 2009 -0400
+
+    [HB] Flesh out Unicode funcs
+
+ src/hb-object-private.h  |  2 +-
+ src/hb-unicode-private.h | 12 ++++-----
+ src/hb-unicode.c         | 67
+ ++++++++++++++++++++++++++++++++++++++++++------
+ src/hb-unicode.h         |  3 ---
+ 4 files changed, 65 insertions(+), 19 deletions(-)
+
+commit 299f08961ffcea27e8def4f0743d0c86ef8dadf1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 22:47:57 2009 -0400
+
+    [HB] Implement buffer UTF-X input
+
+ src/hb-buffer.c | 110
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.h |  12 +++----
+ 2 files changed, 116 insertions(+), 6 deletions(-)
+
+commit 1b7b97f28ac192006ca5b6d1cc9fbc80fa2bdb55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 21:10:37 2009 -0400
+
+    [HB] Add buffer UTF-X API
+
+ src/hb-buffer.h | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit fbaf8ffa098bd2b6fb4f4bc2d04b360a319c4af5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 20:59:25 2009 -0400
+
+    [HB] Add hb_buffer_reverse()
+
+ src/hb-buffer.c | 32 +++++++++++++++++++++++++++++---
+ src/hb-buffer.h |  7 +++++++
+ 2 files changed, 36 insertions(+), 3 deletions(-)
+
+commit cbe5a4e08e6c2ccfdf98e630d48ec9da69374516
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 20:24:49 2009 -0400
+
+    [HB] Reuse the positions array as alt string array
+
+ src/hb-buffer-private.h |  1 -
+ src/hb-buffer.c         | 28 +++++++++-------------------
+ 2 files changed, 9 insertions(+), 20 deletions(-)
+
+commit 5c44188455ca1b696aa24b20c3a83877dfae2fb2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 20:05:16 2009 -0400
+
+    [HB] Start adding Unicode funcs
+
+ src/Makefile.am          |   3 +
+ src/hb-font-private.h    |  29 ++-----
+ src/hb-font.cc           | 163 ++++++++++-------------------------
+ src/hb-font.h            | 140 ++++++++++--------------------
+ src/hb-unicode-private.h |  54 ++++++++++++
+ src/hb-unicode.c         |  89 +++++++++++++++++++
+ src/hb-unicode.h         | 220
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ 7 files changed, 463 insertions(+), 235 deletions(-)
+
+commit 20b035dad41247076815a2bbb0346d63058b322f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 19:00:36 2009 -0400
+
+    [HB] Put C++ inline's back
+
+    Apparetly in C++, inline means a totally different thing.
+
+ src/hb-open-file-private.hh          | 14 +++++++-------
+ src/hb-open-type-private.hh          | 16 ++++++++--------
+ src/hb-ot-layout-common-private.hh   | 12 ++++++------
+ src/hb-ot-layout-gdef-private.hh     |  4 ++--
+ src/hb-ot-layout-gpos-private.hh     | 12 ++++++------
+ src/hb-ot-layout-gsub-private.hh     | 12 ++++++------
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++++++------
+ 7 files changed, 41 insertions(+), 41 deletions(-)
+
+commit a62f776d8e7e3e57d28ee71b34abab0a5b8471eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 13:57:02 2009 -0400
+
+    [HB] Don't override CXX compiler
+
+    Just add couple of options to it (still assuming gcc)
+
+ src/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 6bdab706ecb41c1305e85d041a586e86c54d0ab7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 10 09:35:11 2009 -0400
+
+    [HB] Indent
+
+ src/hb-ot-layout.h | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 797724904a3ab294f8390d4ff80c299d8213a5c6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 9 22:25:17 2009 -0400
+
+    [HB] Remove unused code
+
+ src/hb-ot-layout-gdef-private.hh | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+commit 284899ccbe79fda7405ab09d3092fc25fd89e810
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 9 22:10:39 2009 -0400
+
+    [HB] Add a NEXT() macro
+
+ src/hb-open-type-private.hh          |  2 ++
+ src/hb-ot-layout-common-private.hh   |  4 ++--
+ src/hb-ot-layout-gsub-private.hh     |  8 ++++----
+ src/hb-ot-layout-gsubgpos-private.hh | 24 ++++++++++++------------
+ 4 files changed, 20 insertions(+), 18 deletions(-)
+
+commit 918572fc870dfd7596155ce700247a5bb024fb1a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 9 18:31:47 2009 -0400
+
+    [HB] Remove done TODO item
+
+ src/TODO | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 67cb8111f209de26b3afa46e9fb7e4d01c9ecad4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 9 13:05:08 2009 -0400
+
+    [HB] Print mark sets in main.cc
+
+ src/main.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 17878255fa88e76cd503461fc1ade2ed365cebd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 8 16:57:27 2009 -0400
+
+    [HB] Remove hb_ot_layout_table_find_feature()
+
+    That function doesn't make much sense as multiple features in the
+    table may
+    have the same tag.
+
+ src/hb-ot-layout.cc | 16 ----------------
+ src/hb-ot-layout.h  |  6 ------
+ 2 files changed, 22 deletions(-)
+
+commit 468769b8f5332940278244e744ec2bd5a5dc5ee9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 8 16:53:23 2009 -0400
+
+    [HB] Rename hb_ot_layout_feature_mask_t to hb_mask_t
+
+ src/TODO                         |  1 -
+ src/hb-buffer-private.h          |  4 ++--
+ src/hb-buffer.c                  | 12 ++++++------
+ src/hb-buffer.h                  |  4 ++--
+ src/hb-common.h                  |  1 +
+ src/hb-ot-layout-gpos-private.hh | 12 ++++++------
+ src/hb-ot-layout-gsub-private.hh | 14 +++++++-------
+ src/hb-ot-layout.cc              | 18 +++++++++---------
+ src/hb-ot-layout.h               | 34 +++++++++-------------------------
+ 9 files changed, 42 insertions(+), 58 deletions(-)
+
+commit 7f96b39a9d5a81ba77e0c3dea8fe2cdb9957c4c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 8 16:37:22 2009 -0400
+
+    [HB] Fix bug introduced recently
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit bff3c0fde5da04a70d1f7aeeb9fa2a75fe5c07f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 7 19:46:30 2009 -0400
+
+    [HB] Remove clumsy macros and improve API
+
+ src/TODO                             |   2 -
+ src/hb-open-file-private.hh          |  41 ++++++++--
+ src/hb-open-type-private.hh          | 104 +------------------------
+ src/hb-ot-layout-common-private.hh   | 103 ++++++++++++++++++------
+ src/hb-ot-layout-gsubgpos-private.hh |  35 +++++++--
+ src/hb-ot-layout.cc                  | 146
+ ++++++++++++-----------------------
+ src/hb-ot-layout.h                   | 101 ++++++++++--------------
+ 7 files changed, 240 insertions(+), 292 deletions(-)
+
+commit d0b657379bbe63602953412d6bc944b2a0f430eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 6 18:34:47 2009 -0400
+
+    [HB] Fix various XXX issues
+
+ src/hb-open-type-private.hh      | 13 ++++++++++---
+ src/hb-ot-layout-gdef-private.hh |  5 ++---
+ 2 files changed, 12 insertions(+), 6 deletions(-)
+
+commit 82199868fb036b63799af761762225d45d36f575
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 6 18:28:45 2009 -0400
+
+    [HB] Remove unused var
+
+ src/hb-ot-layout-private.h | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 07e69226cbd4167741fd868a3125487bbabb99dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 6 18:28:00 2009 -0400
+
+    [HB] Remove another stale XXX
+
+ src/hb-ot-layout.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit e605c367c5627e7ab05af9cb59247a89290e598a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 6 18:27:28 2009 -0400
+
+    [HB] Rebrand XXX as TODO
+
+ src/hb-open-file-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c5a13048e21fcfcfd3b74f800e8d521e6245b451
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 6 18:26:38 2009 -0400
+
+    [HB] Remove stale XXX
+
+ src/hb-blob.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 9e826ea2832f0444bcef9075b445d481a58a09c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 6 18:24:55 2009 -0400
+
+    [HB] Fix unaligned access
+
+ src/hb-open-type-private.hh | 20 +++++++++++++++++---
+ src/hb-private.h            | 22 ++++++++++++++++++++++
+ 2 files changed, 39 insertions(+), 3 deletions(-)
+
+commit 71a8344a5eeaa34e31d53138cf3bbe30b819f83c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 6 14:28:18 2009 -0400
+
+    [HB] Remove a few 'inline's, though the compiler mostly ignores them
+
+ src/hb-open-file-private.hh          |  1 -
+ src/hb-open-type-private.hh          | 16 ++++++++--------
+ src/hb-ot-layout-gsubgpos-private.hh |  6 +++---
+ 3 files changed, 11 insertions(+), 12 deletions(-)
+
+commit 7f3d5c8166e5205e9d9bf8b4b2f31d44387a8006
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 6 13:33:51 2009 -0400
+
+    [HB] Fix blob to use a actual mutex
+
+ src/hb-blob.c           | 125
+ +++++++++++++++++++++++++++++++++++-------------
+ src/hb-object-private.h |   4 +-
+ src/hb-private.h        |  20 +++++---
+ 3 files changed, 106 insertions(+), 43 deletions(-)
+
+commit a794ebf4be9896393f4badf02905a4007981a588
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 6 12:32:35 2009 -0400
+
+    [HB] Use glib again
+
+ src/Makefile.am         |  5 +++--
+ src/hb-blob.c           |  4 ++--
+ src/hb-object-private.h | 19 ++++++-------------
+ src/hb-private.h        | 45
+ ++++++++++++++++++++++++++-------------------
+ 4 files changed, 37 insertions(+), 36 deletions(-)
+
+commit 9b76a290a94f2603f3cb9498ae976125347cf54b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 6 10:27:38 2009 -0400
+
+    [HB] Improve debug output
+
+ src/hb-open-type-private.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 9faee63034d3965735bd6362c0beeca1613bd771
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 6 10:24:49 2009 -0400
+
+    [HB] Minor
+
+ src/hb-private.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f72059ee6946d9b4812b794f662ee83c7e25fe53
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 5 15:35:02 2009 -0400
+
+    [HB] Add a few TODO items
+
+ src/TODO | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 0d77ab8a73f57c9fca4c6f9301dae394d79526e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 5 15:27:42 2009 -0400
+
+    [HB] Improve debug output
+
+ src/hb-open-type-private.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 268cac4c9ef8cb592cfb8507273332165b8d3ad3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 5 15:21:48 2009 -0400
+
+    [HB] Fix blob unlock
+
+ src/hb-blob.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7acb389569cf99c6bae9db31a8ed7c7007fbb566
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 5 15:20:34 2009 -0400
+
+    [HB] Improve debug output and fix mprotect bug
+
+ src/hb-blob.c               | 57
+ ++++++++++++++++++++++++++++++++++++++-------
+ src/hb-open-type-private.hh | 30 +++++++++++-------------
+ src/hb-private.h            |  3 ++-
+ 3 files changed, 65 insertions(+), 25 deletions(-)
+
+commit ec9f8db0d3cad146801b7dc5c59e517de3b6fa34
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 5 14:52:03 2009 -0400
+
+    [HB] Minor
+
+ src/hb-private.h | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit d341881d9a0f835f691b121480046081ad162918
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 5 14:49:25 2009 -0400
+
+    [HB] Fix build of main.cc
+
+ src/Makefile.am | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 8f3be25e7ec88ea451ee8097bf32e5f729f4fef9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 23:43:40 2009 -0400
+
+    [HB] turn debugging off
+
+ src/hb-private.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 62ed5850d9e0e0d0231889470d58e815420c21e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 23:30:32 2009 -0400
+
+    [HB] Fix another sanitize() bug;  hopefully it's the last one
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 90482b68178b687c0f0a3f82cd6a36b2c0bb9384
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 23:24:35 2009 -0400
+
+    [HB] Fix a couple other sanitize() bugs
+
+ src/hb-ot-layout-gpos-private.hh | 4 ++--
+ src/hb-ot-layout-gsub-private.hh | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 4f3ad9115a4161fc23fa559c26082440196217ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 23:01:23 2009 -0400
+
+    [HB] More debugging output
+
+ src/hb-open-type-private.hh | 45
+ ++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 40 insertions(+), 5 deletions(-)
+
+commit 8cd6fa28d1b77100491519b8dedb2e113508bf59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 22:55:44 2009 -0400
+
+    [HB] Fix fatal Sanitizer bug
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2870ac5e5d5d87646a4b273a9805fb3fcf280f97
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 22:43:47 2009 -0400
+
+    [HB] Add missing sanitize
+
+ src/hb-open-file-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b28815c1f6e46d38471cacbc31248ca6fda8c4d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 22:35:36 2009 -0400
+
+    [HB] Add sanitize debugging facilities
+
+ src/hb-open-file-private.hh          |  4 ++++
+ src/hb-open-type-private.hh          | 43
+ +++++++++++++++++++++++++++++++-----
+ src/hb-ot-layout-common-private.hh   | 17 ++++++++++++++
+ src/hb-ot-layout-gdef-private.hh     | 10 +++++++++
+ src/hb-ot-layout-gpos-private.hh     | 28 +++++++++++++++++++++++
+ src/hb-ot-layout-gsub-private.hh     | 18 +++++++++++++++
+ src/hb-ot-layout-gsubgpos-private.hh | 16 ++++++++++++++
+ src/hb-private.h                     |  6 ++++-
+ 8 files changed, 136 insertions(+), 6 deletions(-)
+
+commit 7edb430f9182723b7b720708c56088cec1200a70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 22:06:57 2009 -0400
+
+    [HB] Rename open-types to open-type; beauty
+
+ src/Makefile.am                                           | 2 +-
+ src/hb-open-file-private.hh                               | 2 +-
+ src/{hb-open-types-private.hh => hb-open-type-private.hh} | 0
+ src/hb-ot-layout-common-private.hh                        | 2 +-
+ 4 files changed, 3 insertions(+), 3 deletions(-)
+
+commit f4b58d3fc2956a9d1b6178588d809c781f7a5c0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 21:47:29 2009 -0400
+
+    [HB] Save edit even if not writeable
+
+ src/hb-open-types-private.hh | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit 9bd629ccd064e739789e504c41ad875eed93abba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 21:42:23 2009 -0400
+
+    [HB] Fix warnings
+
+ src/hb-open-file-private.hh      | 1 +
+ src/hb-open-types-private.hh     | 5 +++++
+ src/hb-ot-layout-gsub-private.hh | 3 +--
+ 3 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 5ff4e13143c227fa57854c987b5a98e610f89361
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 21:35:32 2009 -0400
+
+    [HB] Avoid infinite recusion in Extension sanitize()
+
+ src/hb-ot-layout-gpos-private.hh | 1 +
+ src/hb-ot-layout-gsub-private.hh | 1 +
+ 2 files changed, 2 insertions(+)
+
+commit d60bb8ca2ae6edf29b2227b56c57f0d16879370b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 21:32:57 2009 -0400
+
+    [HB] Hook Sanitizer up.  Hell's breaking loose right now
+
+ src/hb-font.cc               |  7 ++-----
+ src/hb-open-types-private.hh |  2 +-
+ src/hb-ot-layout.cc          | 12 ++++++------
+ 3 files changed, 9 insertions(+), 12 deletions(-)
+
+commit 679f41fe61242aa8d7f45b64bdb66395aa530fe2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 21:32:06 2009 -0400
+
+    [HB] Fix leak
+
+ src/hb-ot-layout.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 4e8a0602bb0b3cbf7f26cc38790e37cdec7b0b37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 20:52:47 2009 -0400
+
+    [HB] Add Sanitizer
+
+ src/hb-open-types-private.hh | 58
+ ++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 53 insertions(+), 5 deletions(-)
+
+commit 2765d333e523a13dbd932fa33f3b39a5cf83f0f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 20:50:18 2009 -0400
+
+    [HB] Add XXX
+
+ src/hb-open-file-private.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit a328d66e6a8122f7d4d71941449d4d0136203e08
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 20:27:05 2009 -0400
+
+    [HB] Minor cleanup
+
+ src/hb-ot-layout-gdef-private.hh     | 2 +-
+ src/hb-ot-layout-gpos-private.hh     | 2 +-
+ src/hb-ot-layout-gsub-private.hh     | 2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 4 ++--
+ 4 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 577c1116493d785d3455626612f97dabb383abf0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 19:31:02 2009 -0400
+
+    [HB] Shuffle code around
+
+ src/hb-open-types-private.hh | 127
+ ++++++++++++++++++++++---------------------
+ 1 file changed, 65 insertions(+), 62 deletions(-)
+
+commit b1e187fc6365f5355c652a61494a5e9f6acf51b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 15:28:49 2009 -0400
+
+    [HB] More sanitize infrastructure
+
+ src/hb-open-types-private.hh | 29 ++++++++++++++++++++++++++++-
+ 1 file changed, 28 insertions(+), 1 deletion(-)
+
+commit b508e5ccd528f3f0f49f545bd5f30a525d5abd5a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 15:07:24 2009 -0400
+
+    [HB] open-file sanitize()
+
+ src/hb-open-file-private.hh  | 46
+ ++++++++++++++++++++++++++++++++++++++++----
+ src/hb-open-types-private.hh | 13 +++++++++++++
+ 2 files changed, 55 insertions(+), 4 deletions(-)
+
+commit 738c54d9caa3affc4b434e56bfb810ff6dc9b0b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 14:42:46 2009 -0400
+
+    [HB] Tag sanitize()
+
+ src/hb-open-types-private.hh       | 8 ++++++++
+ src/hb-ot-layout-common-private.hh | 6 +-----
+ 2 files changed, 9 insertions(+), 5 deletions(-)
+
+commit e49a84c9e37c08808880e74e94c8160731ababa1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 14:33:23 2009 -0400
+
+    [HB] GDEF sanitize()
+
+ src/hb-ot-layout-gdef-private.hh     | 54
+ ++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-gpos-private.hh     |  2 +-
+ src/hb-ot-layout-gsub-private.hh     |  2 +-
+ src/hb-ot-layout-gsubgpos-private.hh |  2 +-
+ 4 files changed, 57 insertions(+), 3 deletions(-)
+
+commit 18939487d04dba86880b0af8e89cf2cc44a431f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 14:27:56 2009 -0400
+
+    [HB] Fix Extension sanitize()
+
+ src/hb-ot-layout-gpos-private.hh     | 3 ++-
+ src/hb-ot-layout-gsub-private.hh     | 3 ++-
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 3 files changed, 5 insertions(+), 3 deletions(-)
+
+commit f2be750981be58a723831e69b1670275851d4be9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 14:12:46 2009 -0400
+
+    [HB] Remove stale TODO
+
+ src/hb-ot-layout.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit ac26e2a838d1266bb5f39c43245eb2a52c5e072d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 14:10:39 2009 -0400
+
+    [HB] Hookup NEUTER()
+
+ src/hb-open-types-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 15164d9258a74122a4db748d35532bd72c47cec2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 13:57:41 2009 -0400
+
+    [HB] Fix mix warnings
+
+ src/Makefile.am                    |  2 +-
+ src/hb-font.cc                     | 15 +++------------
+ src/hb-open-types-private.hh       |  2 +-
+ src/hb-ot-layout-common-private.hh |  6 +++---
+ src/hb-ot-layout-gdef-private.hh   |  2 +-
+ src/hb-ot-layout-gpos-private.hh   |  9 ++++-----
+ src/hb-ot-layout.cc                |  2 +-
+ src/main.cc                        |  4 +---
+ 8 files changed, 15 insertions(+), 27 deletions(-)
+
+commit 42b778f89e0818fe06910ce04e2203485823da09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 13:30:49 2009 -0400
+
+    [HB] GPOS sanitize()
+
+ src/hb-open-types-private.hh     |  22 ++++-
+ src/hb-ot-layout-gpos-private.hh | 195
+ ++++++++++++++++++++++++++++++++++++++-
+ src/hb-ot-layout-gsub-private.hh |   2 -
+ 3 files changed, 213 insertions(+), 6 deletions(-)
+
+commit dc9c4d93cd0f3ac991f32df08c1c17fc389054c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 12:26:26 2009 -0400
+
+    [HB] Sanitize DeviceTable
+
+ src/hb-open-types-private.hh       |  8 ++++----
+ src/hb-ot-layout-common-private.hh | 17 ++++++++++++++---
+ src/hb-ot-layout-gsub-private.hh   |  2 +-
+ 3 files changed, 19 insertions(+), 8 deletions(-)
+
+commit ad3a3cd4955661c591b20af1f2c493432f0bebf0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 12:13:52 2009 -0400
+
+    [HB] More casts
+
+ src/hb-ot-layout-gsub-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 95639fccc1ef18eadeb737e8b611d1d1f1315fc2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 12:05:24 2009 -0400
+
+    [HB] Fix couple of bugs
+
+ src/hb-open-types-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 2b5a59c277f4c5bf7aac9a9005054763e322e02d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 11:38:50 2009 -0400
+
+    [HB] More cast cleanup
+
+ src/hb-open-types-private.hh         | 23 ++++++++-----
+ src/hb-ot-layout-common-private.hh   |  7 ++--
+ src/hb-ot-layout-gsub-private.hh     | 27 ++++++---------
+ src/hb-ot-layout-gsubgpos-private.hh | 64
+ +++++++++++++-----------------------
+ 4 files changed, 50 insertions(+), 71 deletions(-)
+
+commit 196598bbccff08415ff5192314cba044df258cad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 11:04:32 2009 -0400
+
+    [Hb] Use reinterpret casts instead of direct casts to char *
+
+ src/hb-open-file-private.hh          |  4 ++--
+ src/hb-open-types-private.hh         | 19 +++++++++++-----
+ src/hb-ot-layout-common-private.hh   |  8 +++----
+ src/hb-ot-layout-gpos-private.hh     | 12 +++++-----
+ src/hb-ot-layout-gsub-private.hh     | 20 ++++++++--------
+ src/hb-ot-layout-gsubgpos-private.hh | 44
+ ++++++++++++++++++------------------
+ 6 files changed, 57 insertions(+), 50 deletions(-)
+
+commit 92b5dd8e71e1bdeaa6e86a53f167683a3f5f4289
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 10:41:32 2009 -0400
+
+    [HB] Merge more templates
+
+ src/hb-open-types-private.hh | 167
+ ++++++++++++++-----------------------------
+ 1 file changed, 55 insertions(+), 112 deletions(-)
+
+commit e6ab2c59ba2d37942ac5fcbfe61d38b7e359ac8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 10:23:01 2009 -0400
+
+    [HB] Simplify indirect sanitize()
+
+ src/hb-open-types-private.hh       | 52
+ ++++++++++++++++++--------------------
+ src/hb-ot-layout-common-private.hh | 11 +-------
+ 2 files changed, 26 insertions(+), 37 deletions(-)
+
+commit 29d8644a315ebe6976f15db2fe96069376d9b8cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 02:27:37 2009 -0400
+
+    [HB] Finish GSUB sanitize()
+
+ src/hb-ot-layout-gsub-private.hh | 21 ++++++++++++++++++++-
+ 1 file changed, 20 insertions(+), 1 deletion(-)
+
+commit cf086adca1b7b5a361a248808f9a847e513d3630
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 02:14:24 2009 -0400
+
+    [HB] Add comment
+
+ src/hb-ot-layout-common-private.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit a97ce570ab693190350886e4e80942851c4d5727
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 02:10:48 2009 -0400
+
+    [HB] Optimize sanitize()
+
+ src/hb-open-types-private.hh | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit cd3827ee567612c5500206b62840702fc956e0f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 02:09:34 2009 -0400
+
+    [HB] More sanitize()
+
+ src/hb-open-file-private.hh          |  2 +-
+ src/hb-open-types-private.hh         | 12 ++++---
+ src/hb-ot-layout-common-private.hh   | 64
+ +++++++++++++++++++++++++++++++-----
+ src/hb-ot-layout-gdef-private.hh     |  2 +-
+ src/hb-ot-layout-gsubgpos-private.hh | 15 +++++++--
+ 5 files changed, 79 insertions(+), 16 deletions(-)
+
+commit 70de50c11ed7037b20eb6814ff60f6e32a9944e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 4 00:58:28 2009 -0400
+
+    [HB] Start sanitize()
+
+ src/hb-open-types-private.hh         | 105 ++++++++++++++++++++++++++++-
+ src/hb-ot-layout-common-private.hh   |  48 +++++++++++++-
+ src/hb-ot-layout-gsub-private.hh     | 125
+ ++++++++++++++++++++++++++++++++++-
+ src/hb-ot-layout-gsubgpos-private.hh | 104 +++++++++++++++++++++++++++++
+ 4 files changed, 376 insertions(+), 6 deletions(-)
+
+commit 5fc22e647c8a2bf6d3cb59185e351ac625e7e322
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 3 22:43:02 2009 -0400
+
+    [HB] Remove use of typeof()
+
+ src/hb-blob.c           |  4 ++--
+ src/hb-buffer.c         |  2 +-
+ src/hb-font.cc          | 14 +++++++-------
+ src/hb-object-private.h |  4 ++--
+ 4 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 70e0f2a75ec1559f2f70ada837ce4bc4baca49e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 3 22:01:47 2009 -0400
+
+    [HB] Make it all work again
+
+ src/hb-font.cc             | 23 ++++++++++++---------
+ src/hb-ot-layout-private.h |  9 +++++---
+ src/hb-ot-layout.cc        | 51
+ +++++++++++++++++++++++-----------------------
+ 3 files changed, 44 insertions(+), 39 deletions(-)
+
+commit 23c86aa0009324433e78fcd0c47f2c0ff14b1949
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 3 21:40:20 2009 -0400
+
+    [HB] Use face_t directly instead of ot_layout_t
+
+ src/TODO                             |   1 +
+ src/hb-font-private.h                |   4 +
+ src/hb-font.cc                       |  74 +++++++++---
+ src/hb-font.h                        |   3 +
+ src/hb-object-private.h              |  36 +++---
+ src/hb-ot-layout-gdef-private.hh     |   2 +
+ src/hb-ot-layout-gpos-private.hh     |  14 +--
+ src/hb-ot-layout-gsub-private.hh     |  32 ++---
+ src/hb-ot-layout-gsubgpos-private.hh |   8 +-
+ src/hb-ot-layout-private.h           |  40 ++++---
+ src/hb-ot-layout.cc                  | 220
+ +++++++++++++++--------------------
+ 11 files changed, 237 insertions(+), 197 deletions(-)
+
+commit fc6c94002dd5478cf9fbdaff12d8374a786c85e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 3 21:27:08 2009 -0400
+
+    [HB] Simplify sub-blob support
+
+ src/hb-blob.c | 172
+ ++++++++++++++++++++++------------------------------------
+ src/hb-blob.h |  14 +++--
+ 2 files changed, 74 insertions(+), 112 deletions(-)
+
+commit a26442437ae9f11674e0d68cd5cbf395ade7695d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 3 17:53:29 2009 -0400
+
+    [HB] Add sub-blobs
+
+ src/hb-blob.c | 162
+ +++++++++++++++++++++++++++++++++++++++++++++++++---------
+ src/hb-blob.h |  12 ++++-
+ 2 files changed, 147 insertions(+), 27 deletions(-)
+
+commit b28e21b90c4105a0c2e17009b748777294614664
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 2 20:06:48 2009 -0400
+
+    [HB] Rename hb-font.c to hb-font.cc
+
+ src/Makefile.am               | 2 +-
+ src/{hb-font.c => hb-font.cc} | 0
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 5f5b24f99f52bbc922e238b65c06061ba07c8548
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 2 20:03:12 2009 -0400
+
+    [OT] Rename C++ header files from *.h to *.hh
+
+ src/Makefile.am                                            | 14
+ +++++++-------
+ src/{hb-open-file-private.h => hb-open-file-private.hh}    |  8 ++++----
+ src/{hb-open-types-private.h => hb-open-types-private.hh}  |  6 +++---
+ ...out-common-private.h => hb-ot-layout-common-private.hh} |  8 ++++----
+ ...-layout-gdef-private.h => hb-ot-layout-gdef-private.hh} |  8 ++++----
+ ...-layout-gpos-private.h => hb-ot-layout-gpos-private.hh} |  8 ++++----
+ ...-layout-gsub-private.h => hb-ot-layout-gsub-private.hh} |  8 ++++----
+ ...gsubgpos-private.h => hb-ot-layout-gsubgpos-private.hh} |  8 ++++----
+ src/hb-ot-layout.cc                                        |  8 ++++----
+ src/main.cc                                                |  6 +++---
+ 10 files changed, 41 insertions(+), 41 deletions(-)
+
+commit 2098a021a826e76ee27d5db74e32738d7d1c3d30
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 2 19:57:00 2009 -0400
+
+    [HB] Move OT file handling out of ot-layout
+
+ src/Makefile.am                                    |   3 +-
+ src/hb-open-file-private.h                         | 145
+ +++++++++++++++++++++
+ ...yout-open-private.h => hb-open-types-private.h} | 117
+ +----------------
+ src/hb-ot-layout-common-private.h                  |   4 +-
+ src/hb-ot-layout.cc                                |   2 +-
+ src/main.cc                                        |   4 +-
+ 6 files changed, 157 insertions(+), 118 deletions(-)
+
+commit 0ead481a5a8623103565fd7d924666e7342278dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 2 17:41:36 2009 -0400
+
+    [HB] Port ot-layout to new public API
+
+ src/TODO                            |   1 +
+ src/hb-common.h                     |   1 +
+ src/hb-font.c                       |   9 +
+ src/hb-font.h                       |   3 +
+ src/hb-ot-layout-gdef-private.h     |  32 ++--
+ src/hb-ot-layout-gpos-private.h     | 106 ++++++------
+ src/hb-ot-layout-gsub-private.h     |  50 +++---
+ src/hb-ot-layout-gsubgpos-private.h |  12 +-
+ src/hb-ot-layout-private.h          |  36 +++-
+ src/hb-ot-layout.cc                 | 334
+ ++++++++++++++++++++----------------
+ src/hb-ot-layout.h                  | 207 ++++++++++------------
+ 11 files changed, 415 insertions(+), 376 deletions(-)
+
+commit 678bed433371d90536976a2d57195c1e1867f766
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 2 15:35:31 2009 -0400
+
+    [HB] Add top-level header files
+
+ src/Makefile.am |  2 ++
+ src/hb-ot.h     | 34 ++++++++++++++++++++++++++++++++++
+ src/hb.h        | 35 +++++++++++++++++++++++++++++++++++
+ 3 files changed, 71 insertions(+)
+
+commit 2c80296aa5991ad67483889147f5c84fefe54af2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 2 15:20:22 2009 -0400
+
+    [HB] Add XXX marks
+
+ src/hb-ot-layout-private.h | 2 ++
+ src/hb-ot-layout.cc        | 7 ++-----
+ 2 files changed, 4 insertions(+), 5 deletions(-)
+
+commit c46f8efd6ddd981b5724b2600ac98a80193385be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 1 23:06:27 2009 -0400
+
+    [HB] Rename _duplicate to _copy
+
+    To be in line with cairo
+
+ src/hb-font.c | 4 ++--
+ src/hb-font.h | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit f1ebe44985e2192844cf1747a4e36ed81e715ce6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 1 22:55:11 2009 -0400
+
+    [HB] Cleanup TODO
+
+ src/TODO | 10 +---------
+ 1 file changed, 1 insertion(+), 9 deletions(-)
+
+commit f1322e52d557726baa010be8d35a594748e8fa1a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 1 22:53:04 2009 -0400
+
+    [HB] Cleanup public buffer structs
+
+ src/hb-buffer-private.h         | 46
+ +++++++++++++++++++++++++++++++-------
+ src/hb-buffer.c                 | 49
+ +++++++++++++++++++++--------------------
+ src/hb-buffer.h                 | 35 ++++++++++++++---------------
+ src/hb-ot-layout-gpos-private.h |  8 +++----
+ src/hb-ot-layout-private.h      |  5 +++--
+ src/hb-ot-layout.cc             | 20 ++++++++---------
+ 6 files changed, 97 insertions(+), 66 deletions(-)
+
+commit 6d5bb18e93d2a53350b342869a3ec8f25f0396c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 1 22:25:04 2009 -0400
+
+    [OT] Match struct with HB's
+
+ src/hb-buffer.c     |  6 +++---
+ src/hb-buffer.h     |  2 +-
+ src/hb-ot-layout.cc | 12 ++++++------
+ 3 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 11fbb5487d9900a019440ef8235f35c9f525decb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 1 22:19:06 2009 -0400
+
+    [HB] Port buffert to new object API
+
+ src/hb-buffer-private.h | 24 +++++++++++++++---
+ src/hb-buffer.c         | 65
+ +++++++++++++++++++++++++++++++++++++------------
+ src/hb-buffer.h         | 53 +++++++++++++++++++++++++---------------
+ 3 files changed, 104 insertions(+), 38 deletions(-)
+
+commit 0cc7bc59ea6e8f38bf1e196c558cca9862ac3302
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 1 21:38:39 2009 -0400
+
+    [HB] Move typedef's around
+
+ src/hb-blob.h   |  2 ++
+ src/hb-common.h |  9 ---------
+ src/hb-font.h   | 10 ++++++++++
+ 3 files changed, 12 insertions(+), 9 deletions(-)
+
+commit a12dd324a3859496a95602d426aee34ce6c5c8a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 1 21:36:15 2009 -0400
+
+    [HB] Add get_reference_count()
+
+ src/hb-blob.c           |  6 ++++++
+ src/hb-blob.h           |  3 +++
+ src/hb-font.c           | 24 ++++++++++++++++++++++++
+ src/hb-font.h           | 12 ++++++++++++
+ src/hb-object-private.h |  7 +++++++
+ 5 files changed, 52 insertions(+)
+
+commit baec684fde2303edb16341bfcf1022cd72acf129
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 1 21:06:11 2009 -0400
+
+    [HB] Remove glib dependency
+
+ src/Makefile.am  |  7 ++-----
+ src/hb-buffer.c  |  2 +-
+ src/hb-private.h | 30 ++++++++++++++++++------------
+ src/main.cc      |  1 +
+ 4 files changed, 22 insertions(+), 18 deletions(-)
+
+commit df66028781a7609a515980e64396e6f1044d764a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 1 20:46:02 2009 -0400
+
+    [HB] Assorted compiler macros
+
+ src/hb-ot-layout-open-private.h |  4 +-
+ src/hb-private.h                | 88
+ +++++++++++++++++++++++++++++++----------
+ 2 files changed, 70 insertions(+), 22 deletions(-)
+
+commit ba8d94ce3360bfaf2c530d01f2af69237018a531
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 1 20:29:22 2009 -0400
+
+    [HB] Simplify object creation
+
+ src/Makefile.am                                    |  2 +-
+ src/hb-blob.c                                      |  6 +---
+ src/hb-font-private.h                              |  1 -
+ src/hb-font.c                                      | 37
+ +++++++---------------
+ src/{hb-refcount-private.h => hb-object-private.h} | 14 ++++++--
+ src/hb-private.h                                   |  2 ++
+ 6 files changed, 27 insertions(+), 35 deletions(-)
+
+commit c62b503770325819f249885dfc9d4683a69c9efd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 1 19:54:49 2009 -0400
+
+    [HB] Add abstract font and face API
+
+    Not used yet.
+
+ src/Makefile.am           |   3 +
+ src/hb-blob.c             |   6 +-
+ src/hb-font-private.h     | 108 +++++++++++++++
+ src/hb-font.c             | 331
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-font.h             | 182 +++++++++++++++++++++++++
+ src/hb-refcount-private.h |  14 +-
+ 6 files changed, 636 insertions(+), 8 deletions(-)
+
+commit 35a7383c6138fd705560f0d4bb30659cbd1ab64c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 1 19:30:31 2009 -0400
+
+    [HB] Simplify refcounting functions
+
+ src/hb-blob.c             | 32 ++++++++++----------------------
+ src/hb-common.h           |  2 ++
+ src/hb-private.h          |  2 ++
+ src/hb-refcount-private.h | 31 ++++++++++++++++++++++++++++++-
+ 4 files changed, 44 insertions(+), 23 deletions(-)
+
+commit 23af767a4475fecc1fe9fe9108f12c05c89bc8c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 1 19:10:41 2009 -0400
+
+    [HB] Fix for dfont's with multiple faces
+
+ src/hb-ot-layout-open-private.h | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit e97a95f2ea2770689bbf076d3c3ac404f273271e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 1 19:05:44 2009 -0400
+
+    [HB] Use calloc instead of malloc where feasible
+
+ src/hb-blob.c   | 8 +++++---
+ src/hb-buffer.c | 4 ++--
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+commit 0090dc0f67b553d2f6eaaedc289c0956ade09ef6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 30 16:28:45 2009 -0400
+
+    [HB] Remove hinting setting and use ppem==0 to mean "no hinting"
+
+ src/hb-blob.h                   |  3 ---
+ src/hb-common.h                 |  9 +++++++++
+ src/hb-ot-layout-gpos-private.h | 36 ++++++++++++++++++++++++------------
+ src/hb-ot-layout-private.h      |  2 --
+ src/hb-ot-layout.cc             |  7 -------
+ src/hb-ot-layout.h              |  4 ----
+ 6 files changed, 33 insertions(+), 28 deletions(-)
+
+commit f0954d1e08ae288eda9904e17108fc73f48c0b98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 30 15:33:57 2009 -0400
+
+    [HB] Add a "blob" manager
+
+ src/Makefile.am           |   5 +-
+ src/hb-blob.c             | 181
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-blob.h             |  74 +++++++++++++++++++
+ src/hb-private.h          |   2 +
+ src/hb-refcount-private.h |  54 ++++++++++++++
+ 5 files changed, 315 insertions(+), 1 deletion(-)
+
+commit 02a370697d25b986dbf1d5c38f46a89a4833b495
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 29 18:41:25 2009 -0400
+
+    [HB] Move direction to buffer
+
+ src/hb-buffer.c                 |  9 +++++++++
+ src/hb-buffer.h                 | 14 ++++++++++++++
+ src/hb-ot-layout-gpos-private.h |  2 +-
+ src/hb-ot-layout-private.h      |  1 -
+ src/hb-ot-layout.cc             |  7 -------
+ src/hb-ot-layout.h              |  5 -----
+ 6 files changed, 24 insertions(+), 14 deletions(-)
+
+commit 7cda6fa24c26887c5543d0657b07aad466452cb3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 29 18:37:57 2009 -0400
+
+    [HB] Rename internal vars
+
+ src/hb-ot-layout-gsubgpos-private.h | 56
+ ++++++++++++++++++-------------------
+ 1 file changed, 28 insertions(+), 28 deletions(-)
+
+commit b196e6f2743d631ef181f1116370be3055063d36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 28 15:50:42 2009 -0400
+
+    [HB] Fix buffer enlargement.  Ouch
+
+ src/hb-buffer.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f9cd1014f8f4d0394b5e0e9eefc1e2af13c59cab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 28 15:43:34 2009 -0400
+
+    Apply patch from Jonathan Kew
+
+ src/hb-buffer.c     | 75
+ ++++++++++++++++++++++++++++-------------------------
+ src/hb-buffer.h     |  6 ++++-
+ src/hb-ot-layout.cc | 31 ++++++++++++++++++++++
+ src/hb-ot-layout.h  | 15 +++++++++++
+ src/hb-private.h    |  2 +-
+ 5 files changed, 91 insertions(+), 38 deletions(-)
+
+commit 2ebb89d63dd27e800f2b6cbf624924601105f48a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jul 25 19:09:01 2009 -0400
+
+    Revert "XX"
+
+    This reverts commit c939f6aff405ca7b10b1f1538f46148bff719fcb.
+
+ src/Makefile.am                     |   2 -
+ src/hb-buffer.c                     |   9 ---
+ src/hb-buffer.h                     |  14 -----
+ src/hb-common.h                     |   3 -
+ src/hb-ot-layout-gdef-private.h     |  32 +++++------
+ src/hb-ot-layout-gpos-private.h     | 108
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gsub-private.h     |  46 +++++++--------
+ src/hb-ot-layout-gsubgpos-private.h |  68 +++++++++++------------
+ src/hb-ot-layout-private.h          |  28 ++++------
+ src/hb-ot-layout.cc                 |  30 ++++++++++
+ src/hb-ot-layout.h                  |   5 ++
+ src/hb-private.h                    |  16 ------
+ 12 files changed, 174 insertions(+), 187 deletions(-)
+
+commit 55520d2af172f5f6617b909e80cbd7d898f2bc15
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 10 23:26:51 2009 -0400
+
+    XX
+
+ src/Makefile.am                     |   2 +
+ src/hb-buffer.c                     |   9 +++
+ src/hb-buffer.h                     |  14 +++++
+ src/hb-common.h                     |   3 +
+ src/hb-ot-layout-gdef-private.h     |  32 +++++------
+ src/hb-ot-layout-gpos-private.h     | 108
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gsub-private.h     |  46 +++++++--------
+ src/hb-ot-layout-gsubgpos-private.h |  68 +++++++++++------------
+ src/hb-ot-layout-private.h          |  28 ++++++----
+ src/hb-ot-layout.cc                 |  30 ----------
+ src/hb-ot-layout.h                  |   5 --
+ src/hb-private.h                    |  16 ++++++
+ 12 files changed, 187 insertions(+), 174 deletions(-)
+
+commit f53d434b9151c4ec43c148734b49bb165e522cc9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 30 22:17:32 2009 -0400
+
+    [GPOS] Advance buffer cursor in SinglePos lookups.  Ouch!
+
+ src/hb-ot-layout-gpos-private.h | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit e35bbd570a5d914f86f1ea83941ee4328f268059
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 30 12:02:46 2009 -0400
+
+    [HB] Improve buffer.  Don't dup out buffer unless out is longer
+    than in
+
+    That is, we work in-place even for ligatures now.
+
+ src/hb-buffer.c | 156
+ ++++++++++++++++++++++++--------------------------------
+ src/hb-buffer.h |   7 ++-
+ 2 files changed, 71 insertions(+), 92 deletions(-)
+
+commit 6734ed4b6b2ce382917bf644aaf1acfa993f00ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 27 18:16:55 2009 -0400
+
+    [GPOS] Fix property checking
+
+ src/hb-ot-layout-gpos-private.h | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit cc83ae12484108586fba6586bd9008971338b322
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 27 00:17:37 2009 -0400
+
+    [GPOS] Add vertical TODO
+
+ src/hb-ot-layout-gpos-private.h | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit b69d38e7eaea544ba6c1876cdc6ddac61a698dd3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 26 22:29:02 2009 -0400
+
+    [HB] Remove useless include
+
+ src/hb-ot-layout-private.h | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 6c8108cb583292a679b05844ab613b7f4587adc6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 26 22:26:08 2009 -0400
+
+    [GPOS] Remove unused variables
+
+ src/hb-ot-layout-gpos-private.h | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 09c292e3b688a67fbae67b645d1e6ffcf8d8eb6e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 26 19:48:16 2009 -0400
+
+    [HB] Fix glyph properties
+
+ src/hb-ot-layout-common-private.h | 6 +++---
+ src/hb-ot-layout-open-private.h   | 2 +-
+ src/hb-ot-layout.cc               | 2 +-
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 64e33f008ff9cc807fdfdc4553ad3fe01bb0615f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 26 18:57:56 2009 -0400
+
+    [GPOS] Fix PairPos signedness
+
+ src/hb-ot-layout-gpos-private.h | 11 ++++-------
+ 1 file changed, 4 insertions(+), 7 deletions(-)
+
+commit 80ea5bd10e72561a7627a5196621a6d7eccd91b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 26 17:58:37 2009 -0400
+
+    [GPOS] Fix mark matching
+
+ src/hb-ot-layout-gpos-private.h | 44
+ +++++++++++++++++++----------------------
+ 1 file changed, 20 insertions(+), 24 deletions(-)
+
+commit 4189b92aaa41e4a1756c561cc6e08b0ed024afda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 26 17:31:56 2009 -0400
+
+    [HB] When looking back/forward, skip marks only
+
+ src/TODO                            |  1 -
+ src/hb-ot-layout-gpos-private.h     | 13 ++-----
+ src/hb-ot-layout-gsub-private.h     | 38 +++++++++-----------
+ src/hb-ot-layout-gsubgpos-private.h | 14 ++++----
+ src/hb-ot-layout-private.h          |  6 ++++
+ src/hb-ot-layout.cc                 | 69
+ ++++++++++++++++++++++++-------------
+ 6 files changed, 76 insertions(+), 65 deletions(-)
+
+commit 1246e41021ab1d782b4c97e5d81c4917a57e3ed4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 26 15:58:34 2009 -0400
+
+    [GDEF] Support MarkFilteringSets
+
+ src/hb-ot-layout.cc | 59
+ +++++++++++++++++++----------------------------------
+ 1 file changed, 21 insertions(+), 38 deletions(-)
+
+commit 5130c35e93528bcf3095fee5baf3847589167a58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 26 15:45:41 2009 -0400
+
+    [HB] Simplify MarkAttachmentType handling
+
+ src/hb-ot-layout-gpos-private.h |  6 +++---
+ src/hb-ot-layout-gsub-private.h |  6 ++----
+ src/hb-ot-layout.cc             | 18 ++++++++----------
+ 3 files changed, 13 insertions(+), 17 deletions(-)
+
+commit e4b92b85a7750bd4271ad607b3c41f0184e89feb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 26 15:38:53 2009 -0400
+
+    [HB] Support parsing MarkFilteringSets introduced in OpenType 1.6
+
+ src/hb-ot-layout-gdef-private.h | 55
+ +++++++++++++++++++++++++++++++++++------
+ src/hb-ot-layout-gpos-private.h |  1 +
+ src/hb-ot-layout.cc             |  6 ++---
+ 3 files changed, 51 insertions(+), 11 deletions(-)
+
+commit 515ce4ceb2ab0151d8dfc03ff0bfc7d110dd93b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 26 13:08:00 2009 -0400
+
+    [HB] More de-C++'ization
+
+ src/hb-ot-layout-gsubgpos-private.h | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit d7df42d7ee586219475878d160f85ae5a188bd59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 26 13:04:59 2009 -0400
+
+    [HB] Start MarkFilteringSet support
+
+ src/hb-ot-layout-common-private.h | 24 +++++++++++++++++++-----
+ 1 file changed, 19 insertions(+), 5 deletions(-)
+
+commit 62964afcecd96038cfaa8bc2bc931f43ee83be7e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 26 12:40:10 2009 -0400
+
+    [HB] Implement get_lig_carets()
+
+ src/hb-ot-layout-gdef-private.h | 57
+ ++++++++++++++++++++++++++++++++---------
+ src/hb-ot-layout.cc             | 17 +++++++++---
+ src/hb-ot-layout.h              |  8 +++++-
+ src/main.cc                     |  9 +------
+ 4 files changed, 66 insertions(+), 25 deletions(-)
+
+commit 79420ad9caf2d5fc94c3693e8292edfa27060b2d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 26 12:24:16 2009 -0400
+
+    [HB] Add get_attach_points()
+
+ src/Makefile.am                 |  2 +-
+ src/hb-ot-layout-gdef-private.h | 35 +++++++++++++++++++++++++----------
+ src/hb-ot-layout-gpos-private.h | 28 +++++++---------------------
+ src/hb-ot-layout-gsub-private.h | 28 +++++++---------------------
+ src/hb-ot-layout-open-private.h | 12 +++---------
+ src/hb-ot-layout.cc             |  9 +++++++++
+ src/hb-ot-layout.h              |  6 ++++++
+ src/main.cc                     |  8 ++++----
+ 8 files changed, 62 insertions(+), 66 deletions(-)
+
+commit 855720ca47bf5a7a44eb5b84dce9f7da6e7156bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 26 12:00:28 2009 -0400
+
+    [HB] Remove more macros
+
+ src/hb-ot-layout-gdef-private.h | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit c968fc2dc87cf85b53f60a40db59d5ee7b992edf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 25 04:04:24 2009 -0400
+
+    [HB] More buffer cleanup
+
+ src/hb-buffer-private.h             |  39 +++--------
+ src/hb-buffer.c                     | 136
+ ++++++++++++++++++------------------
+ src/hb-buffer.h                     |  22 +++---
+ src/hb-ot-layout-gpos-private.h     |  29 ++++----
+ src/hb-ot-layout-gsub-private.h     |  10 +--
+ src/hb-ot-layout-gsubgpos-private.h |   8 +--
+ src/hb-ot-layout-private.h          |  13 ++--
+ src/hb-ot-layout.cc                 |  16 ++---
+ src/hb-private.h                    |  29 --------
+ 9 files changed, 125 insertions(+), 177 deletions(-)
+
+commit 88a5f5a49b6809d88560791f9cf6b8f78f22a4ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 25 03:39:11 2009 -0400
+
+    [HB] Cleanup buffer
+
+ src/hb-buffer-private.h             |  2 +-
+ src/hb-buffer.c                     | 26 ++++++++------
+ src/hb-ot-layout-gsub-private.h     | 26 +++++---------
+ src/hb-ot-layout-gsubgpos-private.h |  2 +-
+ src/hb-ot-layout.cc                 | 71
+ -------------------------------------
+ 5 files changed, 25 insertions(+), 102 deletions(-)
+
+commit 347f0b8621d3adfec157e5634ff3defc818ea37f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 25 03:30:31 2009 -0400
+
+    [HB] Clean more
+
+ src/hb-ot-layout-private.h | 10 ++++------
+ src/hb-ot-layout.cc        |  8 ++++----
+ 2 files changed, 8 insertions(+), 10 deletions(-)
+
+commit d9d2a07f4a8696666a12f5a206aa9cfb56dc2b35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 25 03:24:19 2009 -0400
+
+    [HB] Remove one XXX, add another
+
+ src/hb-buffer.h            | 2 ++
+ src/hb-ot-layout-private.h | 3 +--
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 6c78683c042250a7b5a6fc6ebae4717b03fadf9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 25 03:22:19 2009 -0400
+
+    [HB] Update copyright years
+
+ src/hb-buffer-private.h    | 2 +-
+ src/hb-buffer.h            | 2 +-
+ src/hb-common.h            | 2 +-
+ src/hb-ot-layout-private.h | 2 +-
+ src/hb-ot-layout.h         | 2 +-
+ src/hb-private.h           | 2 +-
+ 6 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 4497af0069a94c69fc1518b1db2c1282721b732a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 25 03:20:18 2009 -0400
+
+    [HB] Would have helped if I actually knew C++ before using it...
+
+ src/hb-ot-layout-gsubgpos-private.h |  4 ++--
+ src/hb-ot-layout-open-private.h     | 24 ++++++++++++------------
+ 2 files changed, 14 insertions(+), 14 deletions(-)
+
+commit cc6c644ff2af5f6669b6ec100ff13e904872b21c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 25 03:10:06 2009 -0400
+
+    [HB] More cleanup
+
+ src/hb-ot-layout-common-private.h | 4 ++--
+ src/hb-ot-layout-open-private.h   | 9 +++++----
+ 2 files changed, 7 insertions(+), 6 deletions(-)
+
+commit 20cc86b3592db33731de671f008d7d222776be49
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 25 02:41:49 2009 -0400
+
+    [HB] Simplify Tag
+
+ src/hb-ot-layout-open-private.h | 46
+ ++++++++++++++++-------------------------
+ 1 file changed, 18 insertions(+), 28 deletions(-)
+
+commit 3ec0092c5e2d48e8c4fc1618d3bee427adddb1e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 25 02:34:25 2009 -0400
+
+    [HB] Simplify more
+
+ src/hb-ot-layout-open-private.h | 31 ++++++++++---------------------
+ 1 file changed, 10 insertions(+), 21 deletions(-)
+
+commit 6ad8d5f3c7028147b371137ae4bca6aae66b3489
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 25 02:27:29 2009 -0400
+
+    [HB] Simplify some basic things
+
+ src/hb-ot-layout-open-private.h | 90
+ +++++++++++++++++++++++++++--------------
+ src/main.cc                     |  8 ++--
+ 2 files changed, 64 insertions(+), 34 deletions(-)
+
+commit f96ffd43bce0ac6d9c897933c9be0e51d543e570
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 24 15:01:16 2009 -0400
+
+    [HB] simplify macros
+
+ src/hb-buffer-private.h    | 4 ++--
+ src/hb-buffer.h            | 4 ++--
+ src/hb-common.h            | 8 ++++----
+ src/hb-ot-layout-private.h | 4 ++--
+ src/hb-ot-layout.h         | 4 ++--
+ 5 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 8e7b30782a12f3997b9a5a18e6b9d01f6bff8b46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 24 14:27:24 2009 -0400
+
+    [HB] Update text files
+
+ src/COPYING |  7 -------
+ src/README  | 13 ++-----------
+ 2 files changed, 2 insertions(+), 18 deletions(-)
+
+commit fa7d47249496fe00ea1ab6943b385c8dd80e5ce6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 24 14:24:35 2009 -0400
+
+    [HB] Remove stale makefile.msc too
+
+ src/makefile.msc | 19 -------------------
+ 1 file changed, 19 deletions(-)
+
+commit da2c52abcd75d46929b34cad55c4fb2c8892bc08
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 24 14:22:22 2009 -0400
+
+    [HB] Remove old code!
+
+    Goodbye 16 thousand lines of ten-year old code!
+
+ src/harfbuzz-dump-main.c      |   97 -
+ src/harfbuzz-dump.c           |  768 ------
+ src/harfbuzz-dump.h           |   41 -
+ src/harfbuzz-gdef-private.h   |  124 -
+ src/harfbuzz-gdef.c           | 1160 --------
+ src/harfbuzz-gdef.h           |  135 -
+ src/harfbuzz-global.h         |   84 -
+ src/harfbuzz-gpos-private.h   |  712 -----
+ src/harfbuzz-gpos.c           | 6071
+ -----------------------------------------
+ src/harfbuzz-gpos.h           |  174 --
+ src/harfbuzz-gsub-private.h   |  476 ----
+ src/harfbuzz-gsub.c           | 4304 -----------------------------
+ src/harfbuzz-gsub.h           |  140 -
+ src/harfbuzz-impl.c           |   84 -
+ src/harfbuzz-impl.h           |  126 -
+ src/harfbuzz-open-private.h   |  102 -
+ src/harfbuzz-open.c           | 1405 ----------
+ src/harfbuzz-open.h           |  282 --
+ src/harfbuzz-stream-private.h |   83 -
+ src/harfbuzz-stream.c         |  257 --
+ src/harfbuzz.c                |   31 -
+ src/harfbuzz.h                |   35 -
+ 22 files changed, 16691 deletions(-)
+
+commit e5372f1621602dcee4e14a4b22dc182c21502a50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 24 14:21:27 2009 -0400
+
+    [HB] Remove stale TODO mark
+
+ src/hb-ot-layout-open-private.h | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 96908b898476ca5d7da5f386b15be76f9e83d76e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 24 12:30:40 2009 -0400
+
+    [HB] Add FixedVersion cast to int
+
+ src/hb-ot-layout-open-private.h | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 957740dd253475020a94a62ec5dfcd03e3358176
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 24 12:29:55 2009 -0400
+
+    [HB] Simplify tag
+
+ src/hb-ot-layout-open-private.h | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 87fcdcbe3644da10154688765db2d62eb9ac079a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 24 01:03:24 2009 -0400
+
+    [HB] Remove unused data types
+
+ src/hb-ot-layout-gdef-private.h     |  2 +-
+ src/hb-ot-layout-gsubgpos-private.h |  2 +-
+ src/hb-ot-layout-open-private.h     | 54
+ ++++---------------------------------
+ 3 files changed, 7 insertions(+), 51 deletions(-)
+
+commit 5876bf1b73fcb56cc41b4d348248a4817f9688cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 24 00:53:28 2009 -0400
+
+    [HB] Simplify version check in GSUB/GPOS
+
+ src/hb-ot-layout-gpos-private.h | 5 ++++-
+ src/hb-ot-layout-gsub-private.h | 5 ++++-
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+commit 212aba6189d7aaac0bab169b77ae6bdab16800a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 24 00:50:27 2009 -0400
+
+    [HB] Check for GDEF/GSUB/GPOS versions
+
+ src/hb-ot-layout-gdef-private.h     |  3 +--
+ src/hb-ot-layout-gpos-private.h     |  3 +--
+ src/hb-ot-layout-gsub-private.h     |  3 +--
+ src/hb-ot-layout-gsubgpos-private.h |  5 ++---
+ src/hb-ot-layout-open-private.h     | 11 ++++++++++-
+ 5 files changed, 15 insertions(+), 10 deletions(-)
+
+commit a21b5062cc32c04eeee3c4b20d26c7e2b34133e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 23 22:39:42 2009 -0400
+
+    [HB] Minor
+
+ src/hb-ot-layout-gdef-private.h | 6 +++---
+ src/hb-ot-layout-open-private.h | 4 ++--
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit a080b1cc2f66d6e109d431a1e09519d7cf53bb9a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 23 18:50:44 2009 -0400
+
+    [HB] Add TODO items
+
+ src/TODO | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit e4efdd80a8fa4edbcdec9cd84f35f5f4521943c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 22 18:54:24 2009 -0400
+
+    [GDEF] Add some get_carret_value() code
+
+ src/hb-ot-layout-gdef-private.h | 36 ++++++++++++++++++------------------
+ 1 file changed, 18 insertions(+), 18 deletions(-)
+
+commit 9b006bc0322723d065271e4b0ea4f137f81101e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 22 18:29:45 2009 -0400
+
+    [GPOS] MarkLigPosFormat1
+
+    GPOS is complete now!  Yay!
+
+ src/hb-ot-layout-gpos-private.h | 128
+ +++++++++++++++++++++++++++++-----------
+ 1 file changed, 92 insertions(+), 36 deletions(-)
+
+commit 923923feb248250626c637c11a886804011197b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 22 17:58:09 2009 -0400
+
+    [HB] Remove apply_subtables() again
+
+ src/hb-ot-layout-gpos-private.h | 31 +++++++++++--------------------
+ src/hb-ot-layout-gsub-private.h | 33 ++++++++++++---------------------
+ 2 files changed, 23 insertions(+), 41 deletions(-)
+
+commit d468f9af5b9fdc2713b0b86f28129e4190ee5053
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 21 22:31:33 2009 -0400
+
+    [HB] Share Extension lookup code between GSUB and GPOS
+
+ src/hb-ot-layout-gpos-private.h     | 64 +++++-----------------------
+ src/hb-ot-layout-gsub-private.h     | 83
+ +++++++------------------------------
+ src/hb-ot-layout-gsubgpos-private.h | 52 +++++++++++++++++++++++
+ 3 files changed, 77 insertions(+), 122 deletions(-)
+
+commit 498f1909e0f7a32484b2058622c4a018cbfc1334
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 21 15:51:04 2009 -0400
+
+    [GPOS] Remove printf.  MarkMarkPos1 is working
+
+    The "bug" was in the font.
+
+ src/hb-ot-layout-gpos-private.h | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit c7d457aa3ae7138630f52ca7263f663a3ea284c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 21 12:46:29 2009 -0400
+
+    [HB] Ouch.  Add files.
+
+ src/hb-common.h  | 13 +++++-----
+ src/hb-private.h | 74
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 2 files changed, 78 insertions(+), 9 deletions(-)
+
+commit fe550f4dd815285e9de8c3cbff810b0a1c7b377f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 21 08:27:07 2009 -0400
+
+    [GPOS] MarkMarkPosFormat1
+
+    Still not quite working.
+
+ src/TODO                        |   4 +-
+ src/hb-ot-layout-gpos-private.h | 105
+ +++++++++++++++++++++++++++++-----------
+ 2 files changed, 79 insertions(+), 30 deletions(-)
+
+commit 357ccde36bba01a405d59b7da061fc5048cdc7b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 21 06:32:01 2009 -0400
+
+    [GPOS] MarkBasePosFormat1
+
+ src/TODO                        |  1 +
+ src/hb-ot-layout-gpos-private.h | 62
+ +++++++++++++++++++++++++++++++++++++----
+ 2 files changed, 58 insertions(+), 5 deletions(-)
+
+commit 377bfc5860ae018f54e4a2dd737b4b000383ab54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 21 04:58:24 2009 -0400
+
+    [GPOS] Implement MarkArray interface
+
+ src/hb-ot-layout-gpos-private.h | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit c18ec2b1d7b8c7abe6ebf4b53c9ec75d5c9bb255
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 21 04:54:01 2009 -0400
+
+    [GPOS] Implement Device support in AnchorFormat3
+
+ src/hb-ot-layout-gpos-private.h | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit fca6a0d158b847181dcf67a13f34499177df899b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 21 04:49:04 2009 -0400
+
+    [GPOS] Remove apply_value() return value
+
+ src/hb-ot-layout-gpos-private.h | 75
+ +++++++++++++++++++----------------------
+ 1 file changed, 34 insertions(+), 41 deletions(-)
+
+commit fb3b5ccfefc4c38c9184d432703e81f73e1f5bc7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 21 04:47:05 2009 -0400
+
+    [GPOS] Start MarkBasePosFormat1
+
+ src/TODO                        |  1 +
+ src/hb-ot-layout-gpos-private.h | 38
+ +++++++++++++++++---------------------
+ 2 files changed, 18 insertions(+), 21 deletions(-)
+
+commit ee8776d9e009a7fb8e1f3c1f9cf3ad42d9746a16
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 20 15:46:12 2009 -0400
+
+    [HB] Add TODO item
+
+ src/hb-ot-layout-gpos-private.h | 1 +
+ src/hb-ot-layout-gsub-private.h | 1 +
+ 2 files changed, 2 insertions(+)
+
+commit c6456ca5cfc35095378dcf29f8edc33ece9c3ea1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 20 06:15:23 2009 -0400
+
+    [HB] Add TODO item
+
+ src/TODO | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3015c4175179a1816aad2a4950da9a3b8baf2578
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 20 06:01:16 2009 -0400
+
+    [HB] Remove last dependence on the old code base!
+
+ src/hb-buffer-private.h         | 88
+ ++++++++++++++++++++---------------------
+ src/hb-buffer.c                 | 47 +++++++++++-----------
+ src/hb-ot-layout-gpos-private.h | 11 ++----
+ src/hb-ot-layout-gsub-private.h | 12 +++---
+ src/hb-ot-layout.cc             | 16 ++++----
+ 5 files changed, 85 insertions(+), 89 deletions(-)
+
+commit 5c0adce1ccc739415c4b26ff13ffd2d77ea4bc6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 20 05:42:12 2009 -0400
+
+    [HB] Rename harfbuzz-buffer to hb-buffer
+
+ src/Makefile.am                                        | 5 +++--
+ src/{harfbuzz-buffer-private.h => hb-buffer-private.h} | 8 ++++----
+ src/{harfbuzz-buffer.c => hb-buffer.c}                 | 6 ++----
+ src/{harfbuzz-buffer.h => hb-buffer.h}                 | 8 ++++----
+ src/hb-ot-layout-gsubgpos-private.h                    | 2 +-
+ src/hb-ot-layout-private.h                             | 2 +-
+ src/hb-ot-layout.cc                                    | 5 +++--
+ src/hb-ot-layout.h                                     | 2 +-
+ 8 files changed, 19 insertions(+), 19 deletions(-)
+
+commit b857b49c82782d29d6d189f1a9f4a84d39cd84ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 20 05:35:14 2009 -0400
+
+    [HB] Remove all references to the old code!
+
+ src/Makefile.am            |  76 +++++++---------------
+ src/harfbuzz-buffer.c      | 154
+ +++++++++++++++++++--------------------------
+ src/harfbuzz-buffer.h      |  80 +++++++++++------------
+ src/hb-ot-layout-private.h |   6 +-
+ src/hb-ot-layout.cc        |  17 ++---
+ src/hb-ot-layout.h         |   1 +
+ 6 files changed, 137 insertions(+), 197 deletions(-)
+
+commit e1593a6e620ee6a8184487185d1c95e0d1820ba5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 20 04:51:30 2009 -0400
+
+    [GPOS] Finally it's working, up to Cursive
+
+    Wow, IranNastaliq renders perfectly again!
+
+ src/hb-ot-layout.cc | 24 ++++++++++++++++++++++++
+ src/hb-ot-layout.h  | 12 ++++++++++++
+ 2 files changed, 36 insertions(+)
+
+commit 0f7e6b2cead0c7d527ef68ededb27e0afd71d819
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 20 04:16:35 2009 -0400
+
+    [GPOS] Fix more brokenness
+
+ src/Makefile.am                 |  2 +-
+ src/hb-ot-layout-gpos-private.h | 37
+ ++++++++++++++++++++-----------------
+ src/hb-ot-layout.cc             |  7 +++++++
+ src/hb-ot-layout.h              |  5 +++++
+ 4 files changed, 33 insertions(+), 18 deletions(-)
+
+commit ff05d257dd43221b7c8ebead188e78495daa8eda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 20 03:53:00 2009 -0400
+
+    [HB] Move lookup types enum into subtable class
+
+ src/hb-ot-layout-gpos-private.h | 66
+ ++++++++++++++++++++---------------------
+ src/hb-ot-layout-gsub-private.h | 44 +++++++++++++--------------
+ 2 files changed, 55 insertions(+), 55 deletions(-)
+
+commit 263bbef7670b59aa88ef9ba910579dfa51226524
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 20 00:00:09 2009 -0400
+
+    [GDEF] Simplify Device access
+
+ src/hb-ot-layout-gdef-private.h | 12 +++---------
+ 1 file changed, 3 insertions(+), 9 deletions(-)
+
+commit 60d77cf05fddc5304b4b1fc19cdedba15cbee1e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 19 23:58:54 2009 -0400
+
+    [HB] Indentation
+
+ src/hb-ot-layout-common-private.h   | 170
+ +++++++++++++++++-------------------
+ src/hb-ot-layout-gdef-private.h     |  65 +++++++-------
+ src/hb-ot-layout-gsubgpos-private.h | 150 +++++++++++++++++--------------
+ src/hb-ot-layout-open-private.h     | 159
+ ++++++++++++++++-----------------
+ src/hb-ot-layout-private.h          |   9 +-
+ 5 files changed, 288 insertions(+), 265 deletions(-)
+
+commit 90de3dfff9e82dae20b7517642511aebaf736b74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 19 23:43:04 2009 -0400
+
+    [HB] Remove unused methods
+
+ src/hb-ot-layout-common-private.h | 6 ------
+ 1 file changed, 6 deletions(-)
+
+commit 4c44d830d79431fcb143df2b5a29cdc8e8fccef3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 19 23:42:30 2009 -0400
+
+    [HB] Indentation
+
+ src/hb-ot-layout-gpos-private.h | 253
+ +++++++++++++++++++++-----------------
+ src/hb-ot-layout-gsub-private.h | 262
+ ++++++++++++++++++++++------------------
+ 2 files changed, 284 insertions(+), 231 deletions(-)
+
+commit d18fd8e3f7185f531fa4c4988d3f5d5c5282b8eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 19 23:25:41 2009 -0400
+
+    [GPOS] CursivePosFormat1
+
+ src/hb-ot-layout-gpos-private.h | 174
+ ++++++++++++++++++++++++++++++++++++++--
+ src/hb-ot-layout-private.h      |   2 +-
+ 2 files changed, 169 insertions(+), 7 deletions(-)
+
+commit 70632add333e4ab38f8f485bb87b25116128cf92
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 19 22:30:09 2009 -0400
+
+    [GSUB] PairPosFormat2
+
+ src/hb-ot-layout-gpos-private.h | 43
+ ++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 38 insertions(+), 5 deletions(-)
+
+commit b24ecbadf44d56fd3286d1d3ff6928151ccec9bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 19 22:16:04 2009 -0400
+
+    [GPOS] PairPosFormat1
+
+ src/hb-ot-layout-gpos-private.h | 91
+ +++++++++++++++++++++++++++++++++--------
+ 1 file changed, 73 insertions(+), 18 deletions(-)
+
+commit 056c7ec1aea1eca60a3b20b583b8a8072be9d758
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 19:47:52 2009 -0400
+
+    [GPOS] Start filling apply() functions in
+
+ src/harfbuzz-buffer-private.h     |   1 +
+ src/harfbuzz-buffer.c             |   3 -
+ src/hb-ot-layout-common-private.h |  35 ++++++-----
+ src/hb-ot-layout-gpos-private.h   | 127
+ ++++++++++++++++++++++++++++----------
+ 4 files changed, 116 insertions(+), 50 deletions(-)
+
+commit 4fa77d3c4305a76b956de8c1a9b83a961d035a80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 18:44:54 2009 -0400
+
+    [HB] Use enums
+
+ src/hb-ot-layout-common-private.h | 14 ++++++++------
+ src/hb-ot-layout-gdef-private.h   | 22 +++++++++++++---------
+ 2 files changed, 21 insertions(+), 15 deletions(-)
+
+commit 6b54c5d0446b514fbb6521e7e9e614d153435f0e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 18:30:25 2009 -0400
+
+    [HB] More reference cast simplification
+
+ src/hb-ot-layout-gsub-private.h     |  8 ++++----
+ src/hb-ot-layout-gsubgpos-private.h | 28 ++++++++++++++--------------
+ src/hb-ot-layout-open-private.h     |  2 +-
+ 3 files changed, 19 insertions(+), 19 deletions(-)
+
+commit eb0dfc830e09405492f494c85380e133ac5d0ea3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 18:22:44 2009 -0400
+
+    [HB] Rename LOOKUP_ARGS to APPLY_ARGS
+
+ src/hb-ot-layout-gpos-private.h     | 88
+ ++++++++++++++++++------------------
+ src/hb-ot-layout-gsub-private.h     | 84
+ +++++++++++++++++-----------------
+ src/hb-ot-layout-gsubgpos-private.h | 90
+ ++++++++++++++++++-------------------
+ 3 files changed, 131 insertions(+), 131 deletions(-)
+
+commit 2a8e6accdf798a78ff180dcb593140592d62b872
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 18:21:44 2009 -0400
+
+    [HB] Internally rename position() and substitute() to apply()
+
+ src/hb-ot-layout-gpos-private.h | 110
+ ++++++++++++++++++++--------------------
+ src/hb-ot-layout-gsub-private.h | 104
+ ++++++++++++++++++-------------------
+ 2 files changed, 107 insertions(+), 107 deletions(-)
+
+commit f6c8a6eacf27fd1c509d07c85985f0367c5e475f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 18:01:19 2009 -0400
+
+    [HB] Simplify casts
+
+ src/hb-ot-layout-gdef-private.h |  2 +-
+ src/hb-ot-layout-gpos-private.h |  6 +++---
+ src/hb-ot-layout-gsub-private.h |  6 +++---
+ src/hb-ot-layout-open-private.h | 10 +++++-----
+ 4 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 9c42f05a5ccbb48a9367b80ecdf3679e88088fcf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 17:43:49 2009 -0400
+
+    Switch Pango to new, defunt, GPOS
+
+ src/hb-ot-layout-gpos-private.h | 22 +++++++++++++++-------
+ src/hb-ot-layout.cc             | 13 +++++++++++++
+ src/hb-ot-layout.h              |  5 +++++
+ 3 files changed, 33 insertions(+), 7 deletions(-)
+
+commit 5e5eb0573f7ea2ce2cf037fef0df70a4351e82c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 17:09:33 2009 -0400
+
+    [HB] Start GPOS!
+
+ src/hb-ot-layout-gpos-private.h | 915
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-gsub-private.h |   2 -
+ src/hb-ot-layout-private.h      |  15 +-
+ src/hb-ot-layout.cc             |   5 +-
+ src/hb-ot-layout.h              |   8 +-
+ 5 files changed, 936 insertions(+), 9 deletions(-)
+
+commit 64e67f7599deeec98b104f8b70d0d321cf96799d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 15:32:40 2009 -0400
+
+    [GSUB] Minor
+
+ src/hb-ot-layout-gsub-private.h | 16 ++++++----------
+ 1 file changed, 6 insertions(+), 10 deletions(-)
+
+commit d79cae0b4eef8c2694ada791bb8e427c1202875e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 13:50:15 2009 -0400
+
+    [HB] Minor
+
+ src/hb-ot-layout-gsub-private.h | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 8533bb985e6af2b656d7c45620d8f11f36330b85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 06:00:12 2009 -0400
+
+    [GSUB] Protect against mismatching Extension subtable types
+
+ src/hb-ot-layout-gsub-private.h | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 969afd706e9b52adc79f6210c0088b2c6bbae9bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 05:47:47 2009 -0400
+
+    [GSUB] Implement ReverseChainSingleSubst
+
+    GSUB is done!
+
+ src/hb-ot-layout-gsub-private.h     | 55
+ +++++++++++++++++++++++++++----------
+ src/hb-ot-layout-gsubgpos-private.h | 43 +++++++++--------------------
+ 2 files changed, 54 insertions(+), 44 deletions(-)
+
+commit 4acaffd786a11b5bd7d41b39fc65625fd8cd5077
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 05:29:29 2009 -0400
+
+    [HB] Don't use G_LIKELY!
+
+ src/hb-ot-layout-gsub-private.h     | 12 ++++++------
+ src/hb-ot-layout-gsubgpos-private.h | 12 ++++++------
+ src/hb-ot-layout-open-private.h     |  4 ++--
+ src/hb-ot-layout.cc                 |  6 +++---
+ 4 files changed, 17 insertions(+), 17 deletions(-)
+
+commit 3dcb12f171ebbf44461e6ce6439d286c9520dd88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 05:22:32 2009 -0400
+
+    [GSUB] Oops, fix Extension check
+
+ src/hb-ot-layout-gsub-private.h | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 2e8fb6c38dbc01cb77b384c0ae0212514dfbb588
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 04:37:37 2009 -0400
+
+    [HB] Tweak some constants and fix Coverage
+
+ src/hb-ot-layout-common-private.h   | 11 ++++++-----
+ src/hb-ot-layout-gsubgpos-private.h |  2 ++
+ src/hb-ot-layout-open-private.h     |  6 +++---
+ 3 files changed, 11 insertions(+), 8 deletions(-)
+
+commit d6aae5f5cad54fc5dac8b0ff10a3921ebda533d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 04:25:22 2009 -0400
+
+    [HB] Cleanup TODOs
+
+ src/hb-ot-layout-gsub-private.h | 12 ++++++------
+ src/hb-ot-layout-open-private.h |  2 +-
+ src/hb-ot-layout.cc             |  4 ++--
+ 3 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 122f21fb9a3a0b914575929a3be11884f1ae00c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 04:21:53 2009 -0400
+
+    [GSUB] Fix context_length handling in Ligature too
+
+ src/hb-ot-layout-gsub-private.h     | 9 ++++-----
+ src/hb-ot-layout-gsubgpos-private.h | 5 +++--
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 47958dea214fd55725bf04aa13d233870255fb03
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 04:17:47 2009 -0400
+
+    [HB] Minor cleanup
+
+ src/hb-ot-layout-gsubgpos-private.h | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+commit e73a0c2a903112ce9a35b95e14e10ab8ea2dc337
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 04:15:25 2009 -0400
+
+    [HB] Correctly skip glyphs when applying (Chain)Context lookups
+
+ src/hb-ot-layout-gsubgpos-private.h | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+commit 7cff75babd64cd49dd2b3faaa15193d12c098f42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 04:09:05 2009 -0400
+
+    [HB] Fix context_length checking
+
+ src/hb-ot-layout-gsubgpos-private.h | 23 +++++++++++++----------
+ src/hb-ot-layout-open-private.h     |  2 +-
+ 2 files changed, 14 insertions(+), 11 deletions(-)
+
+commit d0ba0557007798db2c60ddd0b7a5a0624cd1698d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 03:56:39 2009 -0400
+
+    [HB] ChainContext complete
+
+    IranNastaliq renders perfectly again!
+
+ src/hb-ot-layout-gsubgpos-private.h | 63
+ +++++++++++++++++++++++++++----------
+ 1 file changed, 46 insertions(+), 17 deletions(-)
+
+commit e072c24e79f0e7c1e078a87c782ab5dd8f21dcda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 03:47:31 2009 -0400
+
+    [HB] Implement backtrack matching
+
+ src/hb-ot-layout-gsubgpos-private.h | 61
+ +++++++++++++++++++++++++++----------
+ 1 file changed, 45 insertions(+), 16 deletions(-)
+
+commit 02e1e5c63fa4f896053fa3c21e495239e1e9caa2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 02:47:57 2009 -0400
+
+    [HB] One more step to go, for fully working GSUB and ChainContext
+
+ src/hb-ot-layout-gsubgpos-private.h | 107
+ ++++++++++++++++++++----------------
+ 1 file changed, 61 insertions(+), 46 deletions(-)
+
+commit f14c2b7acfba75b8a6880f41ceec758f9a56abce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 02:36:18 2009 -0400
+
+    [HB] Further modularize Context matching
+
+ src/hb-ot-layout-gsubgpos-private.h | 92
+ +++++++++++++++++++++++++------------
+ 1 file changed, 63 insertions(+), 29 deletions(-)
+
+commit 13ed4405c558e445b052360f1ed8ee27ecf48e6e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 02:14:37 2009 -0400
+
+    [HB] A step closer to working ChainContext
+
+ src/hb-ot-layout-gsubgpos-private.h | 36
+ ++++++++++++++++++++++++++----------
+ 1 file changed, 26 insertions(+), 10 deletions(-)
+
+commit e8cbaaf6d538036ff9b880b018db402e0895ed01
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 02:03:58 2009 -0400
+
+    [HB] Add HeadlessArrayTo<>
+
+ src/hb-ot-layout-gsub-private.h     | 10 ++++------
+ src/hb-ot-layout-gsubgpos-private.h |  5 ++---
+ src/hb-ot-layout-open-private.h     | 19 +++++++++++++++++++
+ 3 files changed, 25 insertions(+), 9 deletions(-)
+
+commit dcb6b60254951a2831c03f3196962d229f7e556c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 18 01:49:57 2009 -0400
+
+    [HB] More template goodness
+
+ src/hb-ot-layout-gsubgpos-private.h | 37
+ +++++++++++++++----------------------
+ 1 file changed, 15 insertions(+), 22 deletions(-)
+
+commit aa3d7adca5c821c91a2a1b5380fd6b3d19656ab1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 23:17:56 2009 -0400
+
+    [HB] More churning towards ChainContext lookups
+
+ src/hb-ot-layout-common-private.h   |   6 +-
+ src/hb-ot-layout-gsub-private.h     |  15 +++-
+ src/hb-ot-layout-gsubgpos-private.h | 174
+ ++++++++++++++++++++++--------------
+ 3 files changed, 125 insertions(+), 70 deletions(-)
+
+commit 48f16ed96ac7041b511d9e0864623d2aa09c6da3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 22:11:30 2009 -0400
+
+    [HB] Towards sharing Context and ChainContext code
+
+ src/hb-ot-layout-gsubgpos-private.h | 220
+ ++++++++++++++++--------------------
+ 1 file changed, 99 insertions(+), 121 deletions(-)
+
+commit 6cf2a52593cb4b23e3efe5e16228e3172bdcdd05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 21:11:49 2009 -0400
+
+    [HB] Add check to avoid infinite recursion
+
+ src/hb-ot-layout-gsub-private.h | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 887c4b44165eeb8ac7fb09bc4474d11720b94a9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 21:06:08 2009 -0400
+
+    [HB] Cosmetic
+
+ src/hb-ot-layout-gsub-private.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ca5290f4994e1b2db4dac03f7a22b7071441ba06
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 20:48:27 2009 -0400
+
+    [HB] Start ChainContext and ReverseChainSingleSubst lookups
+
+ src/hb-ot-layout-gsub-private.h     | 269
+ ++++++++----------------------------
+ src/hb-ot-layout-gsubgpos-private.h | 214 +++++++++++++++++++++++++++-
+ 2 files changed, 268 insertions(+), 215 deletions(-)
+
+commit 433f4aea741e39df079126769441b79ab64fd236
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 20:30:05 2009 -0400
+
+    [HB] Remove stale TODO
+
+ src/hb-ot-layout-private.h | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 6f20f72e9c58ba23db2e31afa5d331acfea3d77e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 20:28:01 2009 -0400
+
+    [HB] Split Layout-common tables into new files
+
+ src/hb-ot-layout-common-private.h   | 429
+ ++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-gdef-private.h     |   3 +-
+ src/hb-ot-layout-gsub-private.h     |   1 +
+ src/hb-ot-layout-gsubgpos-private.h |   2 +
+ src/hb-ot-layout-open-private.h     | 408
+ ----------------------------------
+ 5 files changed, 434 insertions(+), 409 deletions(-)
+
+commit f45107fe0904414f1266648a6c42849c494fe611
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 20:13:02 2009 -0400
+
+    [HB] More shuffling
+
+ src/hb-ot-layout-gsub-private.h     | 71
+ +++++++++++++++++++++----------------
+ src/hb-ot-layout-gsubgpos-private.h | 30 ++++++++++++++++
+ src/hb-ot-layout-open-private.h     | 41 ---------------------
+ 3 files changed, 71 insertions(+), 71 deletions(-)
+
+commit f8dc67b3c24dfc805da756a73cb217b36e16b4b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 19:47:54 2009 -0400
+
+    [HB] Cleanup format unions
+
+ src/hb-ot-layout-gdef-private.h     | 18 ++++----
+ src/hb-ot-layout-gsub-private.h     | 87
+ +++++++++++++++++++------------------
+ src/hb-ot-layout-gsubgpos-private.h | 16 +++----
+ src/hb-ot-layout-open-private.h     | 41 +++++++----------
+ 4 files changed, 77 insertions(+), 85 deletions(-)
+
+commit da1097bc3b1995776c205707fd2b17603b804646
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 19:31:18 2009 -0400
+
+    [HB] Use four bytes for Null Tag, not 5
+
+ src/hb-ot-layout-open-private.h | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 19fc24f268b985d30971307ac2055622d11cb21f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 09:45:32 2009 -0400
+
+    [HB] Couple size checks
+
+ src/hb-ot-layout-gsub-private.h     | 7 +++++--
+ src/hb-ot-layout-gsubgpos-private.h | 4 ++--
+ src/hb-ot-layout-open-private.h     | 4 ++--
+ 3 files changed, 9 insertions(+), 6 deletions(-)
+
+commit ecf17e849db19599bbb816d0018380ebf979576b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 09:34:41 2009 -0400
+
+    [HB] Propagate property of first glyph
+
+    This slightly grows code size.
+
+ src/hb-ot-layout-gsub-private.h     | 100
+ +++++++++++++++++++-----------------
+ src/hb-ot-layout-gsubgpos-private.h |   7 +--
+ 2 files changed, 56 insertions(+), 51 deletions(-)
+
+commit eca8e33710cfce51454e64d974ff0c28b0eefa14
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 09:07:27 2009 -0400
+
+    [GSUB] Further optimize the main switch
+
+ src/hb-ot-layout-gsub-private.h | 31 +++++++++++++++++--------------
+ 1 file changed, 17 insertions(+), 14 deletions(-)
+
+commit 13068232e7054748ae5ba0d961ee5a95b959e92e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 08:59:01 2009 -0400
+
+    [HB] Unify first glyph property checking
+
+ src/hb-ot-layout-gsub-private.h     | 81
+ ++++++++++++++++---------------------
+ src/hb-ot-layout-gsubgpos-private.h | 12 ------
+ 2 files changed, 35 insertions(+), 58 deletions(-)
+
+commit 66bf7ce4e3135535c110a917178b84c4a2b1d11f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 08:28:42 2009 -0400
+
+    [HB] Move Context matching logic out of GSUB
+
+ src/hb-ot-layout-gdef-private.h     |   2 -
+ src/hb-ot-layout-gsub-private.h     | 331
+ +---------------------------------
+ src/hb-ot-layout-gsubgpos-private.h | 347
+ ++++++++++++++++++++++++++++++++++++
+ 3 files changed, 352 insertions(+), 328 deletions(-)
+
+commit a1625528cd5ed94bc8f18903da3300e823ee5b54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 07:52:11 2009 -0400
+
+    [GSUB] Unify ContextSubst matching
+
+ src/hb-ot-layout-gsub-private.h | 378
+ ++++++++++++++++------------------------
+ 1 file changed, 154 insertions(+), 224 deletions(-)
+
+commit c36238bea40e9e2b589028eb6de0710455b31585
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 07:39:34 2009 -0400
+
+    [HB] Renames
+
+ src/hb-ot-layout-gsub-private.h | 122
+ ++++++++++++++++++++--------------------
+ 1 file changed, 61 insertions(+), 61 deletions(-)
+
+commit 15c3e75b39797a153b6bc0598f87b27c4a487228
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 06:03:42 2009 -0400
+
+    [HB] Simplify buffer
+
+ src/harfbuzz-buffer-private.h   | 14 ++++++--------
+ src/harfbuzz-buffer.c           | 35 ++++++++++++++++-------------------
+ src/harfbuzz-gsub.c             |  6 +++---
+ src/hb-ot-layout-gsub-private.h | 12 ++++++------
+ 4 files changed, 31 insertions(+), 36 deletions(-)
+
+commit 36f78446cef8a7cbae000d5e742c9d13e1cc7f83
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 05:52:32 2009 -0400
+
+    [HB] Add TODO item
+
+ src/TODO              | 1 +
+ src/harfbuzz-buffer.c | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit ee58aaebd296ea8237516754fd4e825d524b11b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 05:14:33 2009 -0400
+
+    [HB] Update copyright years
+
+ src/hb-ot-layout-gdef-private.h | 2 +-
+ src/hb-ot-layout-open-private.h | 2 +-
+ src/hb-ot-layout.cc             | 2 +-
+ src/main.cc                     | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit f4c9514935cf97a58dcb3b1962ac3f3b5ba61264
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 04:59:56 2009 -0400
+
+    [HB] Simplify more arrays
+
+ src/hb-ot-layout-open-private.h | 241
+ ++++++++++++++++------------------------
+ src/hb-ot-layout.cc             |   8 +-
+ 2 files changed, 100 insertions(+), 149 deletions(-)
+
+commit c9a7cbe9cb52264af9954e5ce9ac7a45d7e310cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 01:22:51 2009 -0400
+
+    [HB] Use ArrayOf<> in GSUB
+
+ src/hb-ot-layout-gdef-private.h |   3 +-
+ src/hb-ot-layout-gsub-private.h | 157
+ +++++++++++++---------------------------
+ src/hb-ot-layout-open-private.h |   5 --
+ 3 files changed, 53 insertions(+), 112 deletions(-)
+
+commit 5f810363acc3ad3cba631a68620e3d37e54c95c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 00:54:25 2009 -0400
+
+    [HB] Add ArrayOf<>
+
+ src/hb-ot-layout-gdef-private.h | 62 ++++++++-------------------------
+ src/hb-ot-layout-open-private.h | 77
+ ++++++++++++++++++++++++++++++-----------
+ 2 files changed, 71 insertions(+), 68 deletions(-)
+
+commit 238c855fcd4f0ef97a94a8662d2a2f2bb5c21ecb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 00:22:37 2009 -0400
+
+    [HB] Use OffsetTo<> for Coverage
+
+ src/hb-ot-layout-gdef-private.h |  1 +
+ src/hb-ot-layout-gsub-private.h | 55
+ ++++++++++++++++-------------------------
+ src/hb-ot-layout-open-private.h | 10 +-------
+ 3 files changed, 23 insertions(+), 43 deletions(-)
+
+commit 3d54bd1293069fc3d3bdeeea8ad45036f3ee65f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 00:15:51 2009 -0400
+
+    [HB] Use OffsetTo<> in more places
+
+ src/hb-ot-layout-gdef-private.h | 12 +++++-------
+ src/hb-ot-layout-open-private.h |  4 ++++
+ 2 files changed, 9 insertions(+), 7 deletions(-)
+
+commit 9e4d9d7b2721859172bc9c59c1aea27b01eb9c07
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 17 00:09:20 2009 -0400
+
+    [HB] Add OffsetTo template.
+
+ src/hb-ot-layout-gdef-private.h | 26 ++++++++++++++------------
+ src/hb-ot-layout-gsub-private.h |  6 +++---
+ src/hb-ot-layout-open-private.h | 27 ++++++++++++++++++---------
+ 3 files changed, 35 insertions(+), 24 deletions(-)
+
+commit e07f89295b9b38d233dfd4acec1f6b4a3416f267
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 16 23:20:48 2009 -0400
+
+    [HB] Automate int-type size assertion
+
+ src/hb-ot-layout-open-private.h | 13 +++----------
+ 1 file changed, 3 insertions(+), 10 deletions(-)
+
+commit 8b8358033184198ff638ee1379093717596e162d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 16 22:48:14 2009 -0400
+
+    [HB] Use templates for Null objects
+
+    Also use a common pool for all nul-content ones.
+
+ src/hb-ot-layout-gdef-private.h |  12 ++--
+ src/hb-ot-layout-gsub-private.h |  28 ++++----
+ src/hb-ot-layout-open-private.h | 142
+ +++++++++++++++++++++++-----------------
+ src/hb-ot-layout.cc             |   8 +--
+ 4 files changed, 105 insertions(+), 85 deletions(-)
+
+commit 6e13d4140158aff736647fc53d8c0ae3a02c2afc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 16 20:15:16 2009 -0400
+
+    [HB] Remove obsolete comment
+
+ src/hb-ot-layout-gdef-private.h | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 9f721cf380954d67415dbfd0404a983cdd75b7df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 16 19:59:15 2009 -0400
+
+    [GSUB] Start ChainContextSubst
+
+ src/hb-ot-layout-gsub-private.h | 50
+ ++++++++++++++++++++++++++++++++---------
+ 1 file changed, 39 insertions(+), 11 deletions(-)
+
+commit 7fca9e5245d2d283e8b5354eb1ddf553a7ffc033
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 16 19:44:24 2009 -0400
+
+    [GSUB] Implement ContextSubstFormat3
+
+ src/hb-ot-layout-gsub-private.h | 62
+ ++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 61 insertions(+), 1 deletion(-)
+
+commit 1ff926a5681b5d4bfce65351062cda9dc1ffeba2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 15 20:25:37 2009 -0400
+
+    [GSUB] Implement ContextSubstFormat2
+
+ src/hb-ot-layout-gsub-private.h | 105
+ +++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 97 insertions(+), 8 deletions(-)
+
+commit fc36d9453ed7edb0a570abc44d7caa87aafb0fcf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 15 20:11:10 2009 -0400
+
+    [GSUB] Add GSUB::substitute_lookup()
+
+ src/hb-ot-layout-gsub-private.h | 7 +++++++
+ src/hb-ot-layout.cc             | 5 +----
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+commit c43562b2a7587fa3f9ef4c1c4338e4eda77368b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 15 18:54:53 2009 -0400
+
+    [GSUB] Finish ContextSubstFormat1
+
+ src/hb-ot-layout-gsub-private.h | 77
+ ++++++++++++++++++++++++++++++++---------
+ src/hb-ot-layout-private.h      | 14 ++++++++
+ src/hb-ot-layout.cc             | 13 -------
+ 3 files changed, 74 insertions(+), 30 deletions(-)
+
+commit 5ee21896224e3a9835a9695037a94ccf1c35a217
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 15 13:28:56 2009 -0400
+
+    [HB] Fix typo
+
+ src/hb-ot-layout-open-private.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6b59c9b445b6d2454008c83a2c7d6a995ea5995e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 15 01:00:36 2009 -0400
+
+    [HB] Add TODO item
+
+ src/TODO | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c5419b6cf28822e07f1ef9b0394825e9cb01a445
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 8 21:17:56 2009 -0400
+
+    [HB] Remove DEFINE_NON_INSTANTIABLE
+
+ src/hb-ot-layout-gdef-private.h |  2 --
+ src/hb-ot-layout-gsub-private.h |  3 ---
+ src/hb-ot-layout-open-private.h | 18 +-----------------
+ 3 files changed, 1 insertion(+), 22 deletions(-)
+
+commit 0dff25f0368c5f14ebb0a4af35f3bb6658740d57
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 8 21:12:18 2009 -0400
+
+    [HB] Remove get_size()
+
+ src/hb-ot-layout-gdef-private.h |  9 ------
+ src/hb-ot-layout-gsub-private.h | 63
+ -----------------------------------------
+ src/hb-ot-layout-open-private.h | 42 ++-------------------------
+ 3 files changed, 3 insertions(+), 111 deletions(-)
+
+commit 25c6c9a3f6c062ec639d9202a8b9844be64d6fc0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 8 19:09:17 2009 -0400
+
+    [GSUB] ContextSubst format 1
+
+ src/hb-ot-layout-gsub-private.h | 52
+ +++++++++++++++++++++++++++++++++++------
+ 1 file changed, 45 insertions(+), 7 deletions(-)
+
+commit f70229510303109bd0f71423cdf13aa200066d17
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 8 18:45:53 2009 -0400
+
+    [GSUB] Shuffle
+
+ src/hb-ot-layout-gsub-private.h | 170
+ ++++++++++++++++++++--------------------
+ 1 file changed, 86 insertions(+), 84 deletions(-)
+
+commit a83e08f8728439ef75e3dfab2191ac913d8f907b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 7 12:53:02 2009 -0400
+
+    [HarfBuzz] Start a TODO file
+
+ src/TODO | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit eed05b04ebc2cbb3fa699c99200db12a0081cefb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 6 00:25:59 2009 -0400
+
+    [GSUB] minor
+
+ src/hb-ot-layout-open-private.h | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit cdb317bc4e188421cad997b448abb19223d39e96
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 6 00:12:29 2009 -0400
+
+    [GSUB] Towards Context subtitutes
+
+ src/hb-ot-layout-gsub-private.h | 137
+ +++++++++++++++++++++++++++++++---------
+ 1 file changed, 108 insertions(+), 29 deletions(-)
+
+commit c9c6a78aec2b16ac06dfca8cbfaf28a77a10bae2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 5 16:22:02 2009 -0400
+
+    [GSUB] Minor refactoring
+
+ src/hb-ot-layout-gsub-private.h | 42
+ ++++++++++++++++++++++-------------------
+ 1 file changed, 23 insertions(+), 19 deletions(-)
+
+commit bb3899a579b00134b24df8891b69bf1621a8190f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 5 13:25:13 2009 -0400
+
+    [GSUB] Implement ligature substitutions
+
+ src/Makefile.am                 |   2 +
+ src/hb-ot-layout-gsub-private.h | 113
+ ++++++++++++++++++++++++++++++++--------
+ 2 files changed, 93 insertions(+), 22 deletions(-)
+
+commit 38b011a293181856463dd08d43e2106e5bf1d56e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 4 20:21:57 2009 -0400
+
+    [GSUB] Hook new GSUB up in Pango
+
+ src/hb-ot-layout-gsub-private.h | 15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+commit a84e71ad11a72feff47ead16772a8c4bcf4f69d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 16 16:53:40 2009 -0400
+
+    [GSUB] Start Ligature subtable support
+
+ src/hb-ot-layout-gsub-private.h | 132
+ +++++++++++++++++++++++++++++-----------
+ src/hb-ot-layout.h              |   2 +-
+ 2 files changed, 96 insertions(+), 38 deletions(-)
+
+commit 52886ca56b24a8335614b1df16a33dd4e2d7ae56
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 16 14:19:42 2009 -0400
+
+    [GSUB] Implement Alternate subtables
+
+ src/hb-ot-layout-gsub-private.h | 104
+ ++++++++++++++++++++++++++++++++++++----
+ src/hb-ot-layout-open-private.h |   2 +-
+ 2 files changed, 97 insertions(+), 9 deletions(-)
+
+commit 4f27ce7e0213ac5ba356f0fd2ec0a175ffd002e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 16 13:40:13 2009 -0400
+
+    [GSUB] Implement Extension subtables
+
+ src/hb-ot-layout-gsub-private.h | 169
+ +++++++++++++++++++++++++---------------
+ 1 file changed, 108 insertions(+), 61 deletions(-)
+
+commit 83e61ff4702121d3418fe82a8fe7ef6bb63bb5d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 16 12:30:51 2009 -0400
+
+    [GSUB] Fix reverse lookup loop like we did in the old code before
+
+ src/hb-ot-layout-gsub-private.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5a0b791184cf6ef39eae0570e14aca21abc32845
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 16 04:45:30 2009 -0400
+
+    [harfbuzz/GSUB] towards a partially working GSUB
+
+ src/harfbuzz-buffer.c           |   2 +-
+ src/harfbuzz-impl.h             |   2 +-
+ src/harfbuzz.c                  |   1 -
+ src/hb-ot-layout-gdef-private.h |   4 +-
+ src/hb-ot-layout-gsub-private.h | 383
+ +++++++++++++++++++++++++++++-----------
+ src/hb-ot-layout-open-private.h |  31 +++-
+ src/hb-ot-layout-private.h      |   6 +-
+ src/hb-ot-layout.cc             |  94 +++++++---
+ src/hb-ot-layout.h              |   2 -
+ 9 files changed, 381 insertions(+), 144 deletions(-)
+
+commit 30bd763fa2fa4aceee51433ec9fc8dc28480b5d7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 15 22:56:15 2009 -0400
+
+    Implement the first substitute()
+
+ src/harfbuzz-buffer-private.h   |  8 ++--
+ src/harfbuzz-buffer.c           |  4 +-
+ src/harfbuzz-buffer.h           |  2 +-
+ src/harfbuzz-gdef-private.h     |  4 +-
+ src/harfbuzz-gdef.c             |  6 +--
+ src/harfbuzz-gdef.h             |  2 +-
+ src/harfbuzz-gpos.c             |  8 ++--
+ src/harfbuzz-gpos.h             |  2 +-
+ src/harfbuzz-gsub.h             |  2 +-
+ src/hb-ot-layout-gsub-private.h | 88
+ +++++++++++++++++++++++++++++++++++++----
+ src/hb-ot-layout-open-private.h |  2 +-
+ src/hb-ot-layout-private.h      | 23 ++++++-----
+ src/hb-ot-layout.cc             | 54 +++++++++++++++++--------
+ src/hb-ot-layout.h              |  2 +-
+ 14 files changed, 151 insertions(+), 56 deletions(-)
+
+commit ce48f03946bef895912019046bdbe62bb1301d0b
+Merge: 0e13beeb 2d15e72c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 2 14:35:51 2009 -0500
+
+    Merge harfbuzz-ng
+
+commit 0e13beeb93077750183a8242780158b88df81e26
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 17 17:03:39 2009 -0400
+
+    Use git.mk
+
+ src/Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 2d15e72c75931398db5e027e660f1320bb979117
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 15 19:50:16 2009 -0400
+
+    Give it a start at GSUB
+
+ src/hb-common.h                 |   5 +-
+ src/hb-ot-layout-gdef-private.h |  24 ++++----
+ src/hb-ot-layout-gsub-private.h | 120
+ +++++++++++++++++++++++++++++++++++++++-
+ src/hb-ot-layout-open-private.h |  51 ++++++++++-------
+ src/hb-ot-layout-private.h      |   2 +-
+ src/hb-ot-layout.cc             |  63 +++++++++++++++++++--
+ src/hb-ot-layout.h              |  29 +++++++++-
+ src/main.cc                     |   4 +-
+ 8 files changed, 253 insertions(+), 45 deletions(-)
+
+commit 9d870f2a558f4e463e3ff953312202a8d144158b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 9 13:30:26 2009 -0400
+
+    Bug 577952 – Error loading {GDEF,GSUB,GPOS} table 0x6EAD
+
+    Detect TrueType Collections by checking the font data header instead
+    of checking for "face->num_faces >1".
+
+ src/harfbuzz-stream.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit d49caf1f77743550d83fc7feced1293ba34a4e99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 2 15:16:11 2009 +0330
+
+    [opentype] Protect against illegal access for arrays of length zero
+
+ src/harfbuzz-gpos.c | 22 ++++++++++++++++++----
+ src/harfbuzz-gsub.c |  6 ++++++
+ 2 files changed, 24 insertions(+), 4 deletions(-)
+
+commit 66871797af194f9d2161faf8bfbc9684f09e207e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 2 14:20:20 2009 +0330
+
+    [opentype] Use size_t instead of uint for malloc wrappers
+
+ src/harfbuzz-impl.c | 4 ++--
+ src/harfbuzz-impl.h | 6 ++++--
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+commit 3664e59c52ed56486a3e38126c0c3abb78f42233
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 2 11:09:29 2009 +0330
+
+    Fix Bug 572529 – Poor -I ordering can break build
+
+ src/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit aca4d11388eedd532a73bd34747abb65c0ea9291
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Mon Feb 2 00:13:07 2009 +0000
+
+    Allocate all array rows in a single ALLOC call. Saves over 100
+    alloc calls
+
+    2009-01-31  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-gpos.c (Load_Mark2Array),
+            (Free_Mark2Array):
+            Allocate all array rows in a single ALLOC call.  Saves over
+            100
+            alloc calls when loading DejaVu Sans,
+
+ src/harfbuzz-gpos.c | 59
+ +++++++++++++++--------------------------------------
+ 1 file changed, 17 insertions(+), 42 deletions(-)
+
+commit c561d69c721105b78bb06d1e3c5f21ca314d924a
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Jan 29 09:20:08 2009 +0000
+
+    Remove ClassDef->Defined field. This is the comment accompanying it:
+
+    2009-01-29  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-open.h:
+            * pango/opentype/harfbuzz-gdef.c (Make_ClassRange),
+            (HB_GDEF_Build_ClassDefinition):
+            * pango/opentype/harfbuzz-gpos.c (Load_PosClassRule),
+            (Load_ChainPosClassRule):
+            * pango/opentype/harfbuzz-gsub.c (Load_SubClassRule),
+            (Load_ChainSubClassRule):
+            * pango/opentype/harfbuzz-open.c (Load_ClassDef1),
+            (Load_ClassDef2), (_HB_OPEN_Load_ClassDefinition),
+            (_HB_OPEN_Load_EmptyClassDefinition),
+            (_HB_OPEN_Free_ClassDefinition):
+            Remove ClassDef->Defined field.  This is the comment
+            accompanying it:
+
+              The `Defined' field is not defined in the OpenType
+              specification
+              but apparently needed for processing fonts like trado.ttf:
+              This
+              font refers to a class which contains not a single element.
+              We
+              map such classes to class 0.
+
+            The comment is correct that trado.ttf (MS Traditional
+            Arabic) uses
+            such classes.  However, in my testing I couldn't identify any
+            problems with the font if the special handling is removed.
+            I also
+            processed as many fonts as I could get my hand on and
+            trado.ttf was
+            the only not-totally-broken font hitting the special-case
+            code.
+            DejaVu fonts hit it too, but I'm sure they do not require the
+            special-handling code.  Most probably, that code introduces
+            bugs
+            in them.
+
+            The special-casing was consuming lots of memory.
+            EIGHT MEGABYTES
+            for loading DejaVu Sans!  While this could be complete
+            fixed, I
+            decided to remove the special-handling code altogether.
+            I don't
+            think it will make any real difference, and if it does,
+            we'll fix
+            fonts.  Such hacks will not be in harfbuzz-ng anyway.
+
+            Bug originally reported by nsf.
+
+ src/harfbuzz-gdef.c |  8 --------
+ src/harfbuzz-gpos.c | 32 --------------------------------
+ src/harfbuzz-gsub.c | 31 -------------------------------
+ src/harfbuzz-open.c | 30 +++---------------------------
+ src/harfbuzz-open.h |  8 --------
+ 5 files changed, 3 insertions(+), 106 deletions(-)
+
+commit 9372edd6f020c92609853609dcb504c72551c9c3
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Jan 29 09:19:56 2009 +0000
+
+    Use calloc(), instead of malloc()ing and memset()ing.
+
+    2009-01-29  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-impl.c (_hb_alloc): Use calloc(),
+            instead of malloc()ing and memset()ing.
+
+ src/harfbuzz-impl.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 94c21d26ba878b3168a21f2e76f02bc52e8fe6fd
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Jan 29 09:19:43 2009 +0000
+
+    Remove old cruft.
+
+    2009-01-29  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-dump-main.c (main): Remove old
+            cruft.
+
+ src/harfbuzz-dump-main.c | 144
+ +----------------------------------------------
+ 1 file changed, 1 insertion(+), 143 deletions(-)
+
+commit 0a47c4f78e8a9e81cd305f24ec92ea61ead7dd8d
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Jan 29 09:19:20 2009 +0000
+
+    Allocate all array rows in a single ALLOC call. Saves over 2000 alloc
+
+    2009-01-29  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-gpos.c (Load_BaseArray),
+            (Free_BaseArray):
+            Allocate all array rows in a single ALLOC call.  Saves over
+            2000
+            alloc calls when loading DejaVu Sans!
+
+ src/harfbuzz-gpos.c | 57
+ ++++++++++++++++-------------------------------------
+ 1 file changed, 17 insertions(+), 40 deletions(-)
+
+commit 549be924bccd187f53791dfa27647981ac909545
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Fri Dec 26 02:31:47 2008 +0000
+
+    Bug 469049 – Fix all compiler warnings
+
+    2008-12-25  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 469049 – Fix all compiler warnings
+
+            * pango-view/viewer-pangocairo.c (render_callback):
+            * pango/fonts.c (append_field),
+            (pango_font_description_to_string):
+            * pango/opentype/harfbuzz-dump.c:
+            * pango/pango-bidi-type.c
+            (pango_log2vis_get_embedding_levels):
+            * pango/pango-coverage.c (pango_coverage_set):
+            * pango/pango-markup.c (span_parse_func):
+            * pango/pango-renderer.c
+            (pango_renderer_default_draw_error_underline):
+            * pango/pango-utils.c (pango_scan_string):
+            * pango/pangocairo-render.c
+            (pango_cairo_renderer_draw_trapezoid),
+            (draw_error_underline), (pango_cairo_renderer_class_init):
+            Fix all the remaining warnings.
+
+ src/harfbuzz-dump.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 719f9eaa755396ff377da10c5eeced01d3456b1b
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Fri Dec 26 02:31:35 2008 +0000
+
+    Fix more warnings.
+
+    2008-12-25  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/modules.c (pango_module_load), (script_info_free):
+            * pango/opentype/harfbuzz-gpos.c (HB_Load_GPOS_Table):
+            * pango/pango-bidi-type.c:
+            * pango/pango-coverage.c (pango_coverage_ref),
+            (pango_coverage_unref):
+            * pango/pango-engine.c (pango_engine_shape_real_covers),
+            (fallback_engine_shape), (fallback_engine_covers):
+            * pango/pango-fontmap.c (pango_font_map_init):
+            * pango/pango-ot-ruleset.c (pango_ot_ruleset_finalize),
+            (pango_ot_ruleset_new):
+            * pango/pangofc-decoder.c (pango_fc_decoder_init),
+            (pango_fc_decoder_class_init):
+            * pango/pangofc-font.c (pango_fc_font_find_shaper),
+            (pango_fc_font_get_coverage):
+            * pango/pangofc-fontmap.c (pango_fc_font_map_list_families),
+            (pango_fc_make_pattern), (pango_fc_font_map_get_patterns),
+            (get_first_font), (_pango_fc_font_map_get_coverage),
+            (cleanup_font), (pango_fc_font_description_from_pattern),
+            (pango_fc_face_list_sizes), (pango_fc_family_list_faces):
+            * pango/pangoft2-fontmap.c
+            (pango_ft2_font_map_get_resolution):
+            * pango/pangoft2-render.c (pango_ft2_renderer_init),
+            (pango_ft2_renderer_draw_trapezoid):
+            * pango/pangoft2.c (pango_ft2_font_get_face),
+            (pango_ft2_font_real_unlock_face),
+            (pango_ft2_free_glyph_info_callback):
+            Fix more warnings.
+
+ src/harfbuzz-gpos.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 21f7d507f4b50e2743ab47954270f4c72d5a722a
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Oct 15 03:45:29 2008 +0000
+
+    Bug 528272 – "Error loading GPOS table 5503" when using katakana
+
+    2008-10-14  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 528272 – "Error loading GPOS table 5503" when using
+            katakana
+            characters
+
+            * pango/opentype/harfbuzz-gpos.c (Load_Mark2Array): Skip
+            parsing
+            null anchor tables.
+
+ src/harfbuzz-gpos.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit a26c6ae70502b4d60c52a0648662b1619c688b9a
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Mon Sep 29 22:28:47 2008 +0000
+
+    Fix left-to-right positioning. Reported by Peter Hunter.
+
+    2008-09-29  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-gpos.c (Position_CursiveChain):
+            Fix left-to-right positioning.  Reported by Peter Hunter.
+
+ src/harfbuzz-gpos.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b6c06c56a33f1e1ec15e3b525ecafe8fadc679db
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Sun Jun 29 18:30:14 2008 +0000
+
+    Bug 540592 – Crash in HB_GSUB_Apply_String with Linux-Libertine font
+
+    2008-06-29  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 540592 – Crash in HB_GSUB_Apply_String with
+            Linux-Libertine font
+
+            * pango/opentype/harfbuzz-gsub.c (GSUB_Do_String_Lookup):
+            Fix reverse
+            loops for type 8 lookups.
+
+ src/harfbuzz-gsub.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c44733596c6648e209c12349e18e35424edf3d59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 18 21:14:23 2008 -0500
+
+    [hb-ot-layout] Add proper namespace to accessors
+
+ src/hb-ot-layout.cc | 165
+ ++++++++++++++++++++++++++++++++++++++--------------
+ src/hb-ot-layout.h  | 115 +++++++++++++++++++++++-------------
+ 2 files changed, 198 insertions(+), 82 deletions(-)
+
+commit 57225672098ebdafb0c06ae091a1b55635daca29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 18 20:58:39 2008 -0500
+
+    Fix typo, add TODOs
+
+ src/hb-ot-layout-open-private.h | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 4a26ea408c87f0bb59deca9ff44008d138471aa3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 28 07:40:10 2008 -0500
+
+    Finish script, language, and feature public API
+
+ src/hb-ot-layout-open-private.h |  22 ++++++---
+ src/hb-ot-layout.cc             | 107
+ +++++++++++++++++++++++++++++++---------
+ src/hb-ot-layout.h              |  34 ++++++++++++-
+ 3 files changed, 132 insertions(+), 31 deletions(-)
+
+commit 706ab25a4cb043d46e6088aa0a7184ee200276c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 28 05:58:50 2008 -0500
+
+    Add script and language public getter API
+
+ src/hb-ot-layout-open-private.h |  40 ++++++++-----
+ src/hb-ot-layout.cc             | 127
+ +++++++++++++++++++++++++++++++++++++++-
+ src/hb-ot-layout.h              |  56 ++++++++++++++++++
+ src/main.cc                     |   2 +-
+ 4 files changed, 207 insertions(+), 18 deletions(-)
+
+commit 40a81314fa3eb7c701aea47b43f81bfad985f717
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 28 02:30:48 2008 -0500
+
+    Make main.cc compile again, which means finished getter API
+
+ src/hb-ot-layout-open-private.h | 117
+ +++++++++++++++++++++++++++++-----------
+ src/main.cc                     |  99 +++++++++++++++++++++++-----------
+ 2 files changed, 155 insertions(+), 61 deletions(-)
+
+commit e50c3978d37b2c0d6ddd4ced6a6196f6857cd596
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 28 00:16:49 2008 -0500
+
+    Rename HB_OT_Layout to hb_ot_layout_t
+
+ src/hb-ot-layout-private.h |  8 ++++----
+ src/hb-ot-layout.cc        | 34 +++++++++++++++++-----------------
+ src/hb-ot-layout.h         | 33 +++++++++++++++------------------
+ 3 files changed, 36 insertions(+), 39 deletions(-)
+
+commit dfa811965133bc4d1696fa5a0166e17ed4142c98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 28 00:12:21 2008 -0500
+
+    Rename hb_ot_layout_create() to hb_ot_layout_create_for_data()
+
+ src/hb-ot-layout.cc | 4 ++--
+ src/hb-ot-layout.h  | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 54e5aac5e2947d4e2864c6f2987e4d275da73100
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 27 21:19:51 2008 -0500
+
+    GDEF completely working now
+
+ src/hb-ot-layout-open-private.h | 11 ++++++++---
+ src/hb-ot-layout-private.h      | 16 +++++++++-------
+ src/hb-ot-layout.cc             | 19 +++++++++----------
+ src/hb-private.h                |  7 +++++++
+ src/main.cc                     | 12 ++++++------
+ 5 files changed, 39 insertions(+), 26 deletions(-)
+
+commit 6f425b11799aa20dab553085f05744191b7318e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 19:38:56 2008 -0500
+
+    [GDEF] Finish internal API
+
+ src/hb-ot-layout-private.h | 15 +++++++-
+ src/hb-ot-layout.cc        | 95
+ ++++++++++++++++++++++------------------------
+ src/hb-ot-layout.h         | 16 ++++----
+ 3 files changed, 66 insertions(+), 60 deletions(-)
+
+commit 590d55cbb9e21ef74dfd88eee51fd0a763958cd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 19:13:50 2008 -0500
+
+    [GDEF] Finish public API
+
+ src/hb-common.h                 |  11 ++++
+ src/hb-ot-layout-gdef-private.h |  28 +++++----
+ src/hb-ot-layout-open-private.h |  25 ++++----
+ src/hb-ot-layout-private.h      |  23 ++------
+ src/hb-ot-layout.cc             | 123
+ +++++++++++++++++++++++++++++++++++++---
+ src/hb-ot-layout.h              |  29 ++++++----
+ 6 files changed, 176 insertions(+), 63 deletions(-)
+
+commit aff831ed6787abe8e24a977e34d97ff2e0b7dc21
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 06:03:45 2008 -0500
+
+    Implement glyph properties
+
+ src/hb-ot-layout-gdef-private.h | 10 ++++-
+ src/hb-ot-layout-private.h      | 16 +++++++-
+ src/hb-ot-layout.cc             | 84
+ +++++++++++++++++++++++++++++++++++++----
+ src/hb-ot-layout.h              | 25 ++++++++----
+ 4 files changed, 117 insertions(+), 18 deletions(-)
+
+commit ead428d7a0bf4dc84340a99f3959e5cc58123e99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 03:54:09 2008 -0500
+
+    More public api
+
+ src/hb-ot-layout-open-private.h | 32 +++++++++++++++++++-------------
+ src/hb-ot-layout-private.h      |  9 ++++++---
+ src/hb-ot-layout.cc             | 21 ++++++++++++++-------
+ src/hb-ot-layout.h              |  2 --
+ 4 files changed, 39 insertions(+), 25 deletions(-)
+
+commit fd92a3dde32fd10df30c9eeb97641bc3c15b1e9b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 24 03:11:09 2008 -0500
+
+    Starting public interface
+
+ src/{Makefile => Makefile.ng}   |  0
+ src/hb-ot-layout-gdef-private.h | 17 ++++----
+ src/hb-ot-layout-gsub-private.h |  3 +-
+ src/hb-ot-layout-open-private.h | 92
+ +++++++++++++++++++++++++++++------------
+ src/hb-ot-layout-private.h      | 51 +++++++++++++++++++++++
+ src/hb-ot-layout.cc             | 67 ++++++++++++++++++++++++++++++
+ src/hb-ot-layout.h              | 35 ++++++++++++++--
+ src/main.cc                     |  1 +
+ 8 files changed, 225 insertions(+), 41 deletions(-)
+
+commit 7d6b95b000ec6cd8ca93113b2d81a049ad2f9bbe
+Author: Behdad Esfahbod <behdad@src.gnome.org>
+Date:   Thu Jan 24 04:42:24 2008 +0000
+
+    Remove unused macro
+
+ src/harfbuzz-impl.h | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 7586089c6fa8185cad8387869d3703c637e5cbb1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 23 18:02:28 2008 -0500
+
+    Minor
+
+ src/hb-ot-layout-gdef-private.h | 37 +++++++++++++++++++++++++------
+ src/hb-ot-layout-gsub-private.h | 13 +++++++++++
+ src/hb-ot-layout-open-private.h | 49
+ ++++++++++++++++++++++++++++++++++-------
+ src/hb-private.h                |  2 ++
+ 4 files changed, 86 insertions(+), 15 deletions(-)
+
+commit aefaafe5bc4fc6d37a412c135b1079c287be7045
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 23 17:25:29 2008 -0500
+
+    Minor renaming
+
+ src/hb-ot-layout-gdef-private.h | 10 +++++-----
+ src/hb-ot-layout-open-private.h | 16 +++++++---------
+ src/main.cc                     |  4 ++--
+ 3 files changed, 14 insertions(+), 16 deletions(-)
+
+commit a16ecbf0564a6e2576da22c12827f3c0719da549
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 23 17:01:55 2008 -0500
+
+    Initial gsub stub
+
+ src/hb-ot-layout-gdef-private.h |   4 +
+ src/hb-ot-layout-gsub-private.h | 453
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-open-private.h |   3 +
+ src/main.cc                     |   1 +
+ 4 files changed, 461 insertions(+)
+
+commit 64aef3a54999496fd1de4f5aa5b019e4c03b3836
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 23 16:14:38 2008 -0500
+
+    Add copyright notices.
+
+ src/hb-common.h                 | 26 ++++++++++++++++++++++++++
+ src/hb-ot-layout-gdef-private.h | 26 ++++++++++++++++++++++++++
+ src/hb-ot-layout-open-private.h | 26 ++++++++++++++++++++++++++
+ src/hb-ot-layout.h              | 26 ++++++++++++++++++++++++++
+ src/hb-private.h                | 26 ++++++++++++++++++++++++++
+ src/main.cc                     | 26 ++++++++++++++++++++++++++
+ 6 files changed, 156 insertions(+)
+
+commit 12360f7c159826ae72271b34486dee59d96aa8ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 23 15:50:38 2008 -0500
+
+    Minor cleanup, add LIKELY and UNLIKELY annotations
+
+ src/hb-ot-layout-gdef-private.h | 63
+ +++++++++++++++++++++++------------------
+ src/hb-ot-layout-open-private.h | 36 ++++++++---------------
+ src/hb-private.h                | 15 ++++++++++
+ 3 files changed, 63 insertions(+), 51 deletions(-)
+
+commit 8dd1c8b8d6797d899d0f5b0a8015886bf6520ca2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 23 05:00:30 2008 -0500
+
+    Clean up file names, add namespace
+
+ src/harfbuzz-common.h                                      | 14
+ --------------
+ src/harfbuzz-gdef.h                                        | 11
+ -----------
+ src/hb-common.h                                            | 14
+ ++++++++++++++
+ ...harfbuzz-gdef-private.h => hb-ot-layout-gdef-private.h} |  8 ++++----
+ ...harfbuzz-open-private.h => hb-ot-layout-open-private.h} | 10
+ +++++-----
+ src/{harfbuzz-open.h => hb-ot-layout.h}                    | 12
+ ++++++------
+ src/{harfbuzz-private.h => hb-private.h}                   |  6 +++---
+ src/main.cc                                                |  4 ++--
+ 8 files changed, 34 insertions(+), 45 deletions(-)
+
+commit 1f437e6f47fb6c15761021bd2078f31778f2179c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 23 04:36:40 2008 -0500
+
+    Make all code NULL-free and assert-free
+
+ src/harfbuzz-gdef-private.h | 125 ++++++++++---------
+ src/harfbuzz-open-private.h | 285
+ +++++++++++++++++++++++---------------------
+ src/main.cc                 |   8 +-
+ 3 files changed, 214 insertions(+), 204 deletions(-)
+
+commit 600e5eb80f553ea8eb862e6784133574c74ca513
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 23 02:01:37 2008 -0500
+
+    Define get_for_data() factories
+
+ src/harfbuzz-gdef-private.h |  3 +++
+ src/harfbuzz-open-private.h | 42
+ +++++++++++++++++++++++++++++-------------
+ src/main.cc                 | 10 ++++------
+ 3 files changed, 36 insertions(+), 19 deletions(-)
+
+commit b9d7688fb3d45894901484b74095c4f11cab6196
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 23 01:38:10 2008 -0500
+
+    Finish and test GDEF
+
+ src/harfbuzz-gdef-private.h | 72
+ ++++++++++++++++++++++++++++++++-------------
+ src/harfbuzz-open-private.h | 23 ++++++++-------
+ src/harfbuzz-open.h         |  4 +++
+ src/main.cc                 | 10 +++++++
+ 4 files changed, 77 insertions(+), 32 deletions(-)
+
+commit 303fe62824d4e99df554b6bfaacba05d068522fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 23 00:20:48 2008 -0500
+
+    Misc cleanup
+
+ src/Makefile                |  10 ++++-
+ src/harfbuzz-gdef-private.h |  65 +++++++++++++++++++++-------
+ src/harfbuzz-open-private.h | 102
+ ++++++++++++++++++++++++++++++++++++++++----
+ src/harfbuzz-private.h      |   6 +++
+ src/main.cc                 |  12 +++---
+ 5 files changed, 163 insertions(+), 32 deletions(-)
+
+commit 17843245fde4cc8cddc7da8ef30357d3d8778187
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Jan 16 20:39:29 2008 +0000
+
+    Remove COPYING.GPL and COPYING.FTL that are no longer there.
+
+    2008-01-16  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/Makefile.am: Remove COPYING.GPL and
+            COPYING.FTL that
+            are no longer there.
+
+ src/Makefile.am | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit a2a9a023f6472ba262f89e5327318996b8258d25
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Tue Jan 15 22:46:32 2008 +0000
+
+    HarfBuzz was relicensed to a more generous and simpler
+    license. Adapt. See
+
+    2008-01-15  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/*:
+            HarfBuzz was relicensed to a more generous and simpler
+            license.
+            Adapt.  See pango/opentype/COPYING for the new license
+            which is
+            LGPL-compatible.
+
+ src/COPYING                   |  39 +++--
+ src/COPYING.FTL               | 174 ---------------------
+ src/COPYING.GPL               | 340
+ ------------------------------------------
+ src/harfbuzz-buffer-private.h |  32 ++--
+ src/harfbuzz-buffer.c         |  27 +++-
+ src/harfbuzz-buffer.h         |  32 ++--
+ src/harfbuzz-dump-main.c      |  34 +++--
+ src/harfbuzz-dump.c           |  34 +++--
+ src/harfbuzz-dump.h           |  35 +++--
+ src/harfbuzz-gdef-private.h   |  29 +++-
+ src/harfbuzz-gdef.c           |  29 +++-
+ src/harfbuzz-gdef.h           |  29 +++-
+ src/harfbuzz-global.h         |  29 +++-
+ src/harfbuzz-gpos-private.h   |  29 +++-
+ src/harfbuzz-gpos.c           |  31 +++-
+ src/harfbuzz-gpos.h           |  29 +++-
+ src/harfbuzz-gsub-private.h   |  29 +++-
+ src/harfbuzz-gsub.c           |  31 +++-
+ src/harfbuzz-gsub.h           |  29 +++-
+ src/harfbuzz-impl.c           |  31 +++-
+ src/harfbuzz-impl.h           |  29 +++-
+ src/harfbuzz-open-private.h   |  29 +++-
+ src/harfbuzz-open.c           |  29 +++-
+ src/harfbuzz-open.h           |  29 +++-
+ src/harfbuzz-stream-private.h |  29 +++-
+ src/harfbuzz-stream.c         |  31 +++-
+ src/harfbuzz.c                |  28 +++-
+ src/harfbuzz.h                |  29 +++-
+ 28 files changed, 564 insertions(+), 741 deletions(-)
+
+commit 4ccedd22eaa6e47bd8bbf255627a8b55fbb44736
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Dec 5 03:41:29 2007 +0000
+
+    Bug 501575 – Compile errors Patch from Jens Granseuer
+
+    2007-12-04  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 501575 – Compile errors
+            Patch from Jens Granseuer
+
+            * pango/opentype/harfbuzz-stream.c (_hb_font_goto_table):
+            * pango/pango-utils.c (handle_alias_line):
+            Fix C99ism.
+
+ src/harfbuzz-stream.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit cd55cfa2b0a1fe35d5a4ad1c8feaa399d7fb7ab3
+Author: Behdad Esfahbod <behdad@src.gnome.org>
+Date:   Fri Nov 30 04:31:29 2007 +0000
+
+    Undo accidental change.
+
+ src/harfbuzz-impl.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 3f05da638c8d7b13e7f860aeda1a6321e5ebd92e
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Fri Nov 30 04:29:58 2007 +0000
+
+    Bug 485536 – underline_position can be zero
+
+    2007-11-29  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 485536 – underline_position can be zero
+
+            * pango/pango-utils.c (pango_cairo_quantize_line_geometry):
+            Document that returned position may be zero.
+
+            * pango/pangocairo-win32font.c
+            (pango_cairo_win32_font_create_metrics_for_context):
+            * pango/pangofc-font.c (get_face_metrics):
+            Handle case of underline_position==0 after rounding.
+
+ src/harfbuzz-impl.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit e58278fedb67cbaac4bf4d6dfc33209cb22eec08
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Sat Nov 24 01:40:13 2007 +0000
+
+    Remove unused macro.
+
+    2007-11-23  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-impl.c: Remove unused macro.
+
+ src/harfbuzz-impl.c | 18 ------------------
+ 1 file changed, 18 deletions(-)
+
+commit 3b047380aec4ccc707c4579327d54172c19820fd
+Author: Behdad Esfahbod <behdad@src.gnome.org>
+Date:   Sun Nov 18 22:34:08 2007 +0000
+
+    Minor
+
+ src/harfbuzz-dump-main.c |  4 +--
+ src/harfbuzz-stream.c    | 89
+ ++++++++++++++++++++++++------------------------
+ 2 files changed, 46 insertions(+), 47 deletions(-)
+
+commit 10d6a25a26bdbab4ece4edf0e34ffd3d22410ebe
+Author: Behdad Esfahbod <behdad@src.gnome.org>
+Date:   Wed Nov 7 10:04:11 2007 +0000
+
+    Remove dead code.
+
+ src/harfbuzz-gdef.c | 88
+ -----------------------------------------------------
+ src/harfbuzz-gpos.h |  4 +--
+ 2 files changed, 1 insertion(+), 91 deletions(-)
+
+commit 47d2c33e3d099fae79e199367de5011bc5c12273
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Nov 7 09:59:18 2007 +0000
+
+    And some more.
+
+    2007-11-07  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/*: And some more.
+
+ src/harfbuzz-buffer.h         |  8 ++---
+ src/harfbuzz-dump-main.c      | 22 ++++++------
+ src/harfbuzz-gdef.c           | 14 ++++----
+ src/harfbuzz-gdef.h           |  4 +--
+ src/harfbuzz-global.h         | 21 +++++------
+ src/harfbuzz-gpos.c           | 82
+ +++++++++++++++++++++----------------------
+ src/harfbuzz-gpos.h           | 12 +++----
+ src/harfbuzz-gsub.c           |  4 +--
+ src/harfbuzz-gsub.h           |  4 +--
+ src/harfbuzz-stream-private.h |  4 +--
+ src/harfbuzz-stream.c         | 16 ++++-----
+ 11 files changed, 95 insertions(+), 96 deletions(-)
+
+commit 78ef65ba08967fe1b5f97bcb27074bd635f4b898
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Nov 7 08:06:01 2007 +0000
+
+    Some more cleanup and merging.
+
+    2007-11-07  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/*: Some more cleanup and merging.
+
+ src/Makefile.am               |   6 +-
+ src/harfbuzz-buffer-private.h |  33 ++++++
+ src/harfbuzz-buffer.c         |   4 +-
+ src/harfbuzz-dump-main.c      |   3 +-
+ src/harfbuzz-gdef-private.h   |   9 +-
+ src/harfbuzz-gdef.c           |  39 +++++++
+ src/harfbuzz-global.h         |   2 +
+ src/harfbuzz-gpos-private.h   |   1 +
+ src/harfbuzz-gpos.c           |  32 +-----
+ src/harfbuzz-gsub-private.h   |   1 +
+ src/harfbuzz-gsub.c           |  33 +-----
+ src/harfbuzz-impl.c           | 216
+ ++------------------------------------
+ src/harfbuzz-impl.h           | 100 +-----------------
+ src/harfbuzz-open-private.h   |   4 +-
+ src/harfbuzz-stream-private.h |  70 +++++++++++++
+ src/harfbuzz-stream.c         | 234
+ ++++++++++++++++++++++++++++++++++++++++++
+ src/harfbuzz.c                |   1 +
+ src/harfbuzz.h                |   3 +-
+ 18 files changed, 419 insertions(+), 372 deletions(-)
+
+commit 5c9bd379950d914982bdb91d0f82b8036908db37
+Author: Behdad Esfahbod <behdad@src.gnome.org>
+Date:   Mon Oct 29 23:51:48 2007 +0000
+
+    Fix typo.
+
+ src/Makefile.am | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit ef1f481752fa6e478f649e826c96927c98f21981
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Oct 25 23:37:11 2007 +0000
+
+    Even more cleanup and more type renames.
+
+    2007-10-25  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/*: Even more cleanup and more type renames.
+
+ src/harfbuzz-buffer.h |  3 +--
+ src/harfbuzz-global.h |  6 ++++++
+ src/harfbuzz-impl.c   | 16 ++++++++--------
+ src/harfbuzz-impl.h   | 22 +++++++++++-----------
+ src/harfbuzz-open.h   |  3 ---
+ 5 files changed, 26 insertions(+), 24 deletions(-)
+
+commit 282c60a0eea0db784b0a094958bec35b5f3dc399
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Oct 25 23:22:17 2007 +0000
+
+    More cleanup, remove redundant error types.
+
+    2007-10-25  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/*: More cleanup, remove redundant error
+            types.
+
+ src/harfbuzz-dump-main.c |   4 +-
+ src/harfbuzz-dump.c      |  14 +++---
+ src/harfbuzz-gdef.c      |  25 +++++-----
+ src/harfbuzz-gdef.h      |   3 --
+ src/harfbuzz-global.h    |  31 ++++++------
+ src/harfbuzz-gpos.c      | 124
+ +++++++++++++++++++++++------------------------
+ src/harfbuzz-gpos.h      |   3 --
+ src/harfbuzz-gsub.c      |  86 ++++++++++++++++----------------
+ src/harfbuzz-gsub.h      |   3 --
+ src/harfbuzz-impl.c      |  18 +++----
+ src/harfbuzz-impl.h      |   2 +
+ src/harfbuzz-open.c      |  24 ++++-----
+ src/harfbuzz-open.h      |   6 +--
+ 13 files changed, 170 insertions(+), 173 deletions(-)
+
+commit 4280ec4df45ae86c10c3cd24ddb9c05e47223d39
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Oct 25 00:23:46 2007 +0000
+
+    Rename ftglue.c to harfbuzz-impl.c and more type renames and
+    moving code
+
+    2007-10-24  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/*: Rename ftglue.c to harfbuzz-impl.c
+            and more
+            type renames and moving code around.
+
+ src/Makefile.am                   |   3 +-
+ src/ftglue.h                      | 151
+ --------------------------------------
+ src/harfbuzz-dump-main.c          |  48 ++----------
+ src/harfbuzz-dump.c               |  30 ++++----
+ src/harfbuzz-gdef.c               |  18 ++---
+ src/harfbuzz-global.h             |  18 +++++
+ src/harfbuzz-gpos-private.h       |   2 +-
+ src/harfbuzz-gpos.c               |  90 +++++++++++------------
+ src/harfbuzz-gsub-private.h       |   2 +-
+ src/harfbuzz-gsub.c               |  64 ++++++++--------
+ src/{ftglue.c => harfbuzz-impl.c} |  64 ++++++++--------
+ src/harfbuzz-impl.h               | 114 ++++++++++++++++++++++++++--
+ src/harfbuzz-open-private.h       |  14 ++--
+ src/harfbuzz-open.c               |  32 ++++----
+ src/harfbuzz-open.h               |  16 ----
+ src/harfbuzz.c                    |   4 +-
+ 16 files changed, 289 insertions(+), 381 deletions(-)
+
+commit 5716ae278a82d318ddbfeba01d0785d4efbe1454
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Oct 24 22:44:47 2007 +0000
+
+    New header file harfbuzz-global.h. Rename FT_* int types to HB_*
+    types.
+
+    2007-10-24  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/*: New header file harfbuzz-global.h.  Rename
+            FT_* int types to HB_* types.
+
+ src/Makefile.am               |   1 +
+ src/ftglue.c                  |  30 +--
+ src/ftglue.h                  |  26 +-
+ src/harfbuzz-buffer-private.h |  26 +-
+ src/harfbuzz-buffer.c         |  40 ++--
+ src/harfbuzz-buffer.h         |  42 ++--
+ src/harfbuzz-dump-main.c      |  24 +-
+ src/harfbuzz-dump.c           |  14 +-
+ src/harfbuzz-dump.h           |   4 +-
+ src/harfbuzz-gdef-private.h   |  30 +--
+ src/harfbuzz-gdef.c           | 104 ++++----
+ src/harfbuzz-gdef.h           |  32 +--
+ src/harfbuzz-global.h         |  34 +++
+ src/harfbuzz-gpos-private.h   | 182 +++++++-------
+ src/harfbuzz-gpos.c           | 540
+ +++++++++++++++++++++---------------------
+ src/harfbuzz-gpos.h           |  52 ++--
+ src/harfbuzz-gsub-private.h   | 142 +++++------
+ src/harfbuzz-gsub.c           | 432 ++++++++++++++++-----------------
+ src/harfbuzz-gsub.h           |  50 ++--
+ src/harfbuzz-impl.h           |   6 +-
+ src/harfbuzz-open-private.h   |  26 +-
+ src/harfbuzz-open.c           | 146 ++++++------
+ src/harfbuzz-open.h           |  88 +++----
+ src/harfbuzz.h                |   1 +
+ 24 files changed, 1056 insertions(+), 1016 deletions(-)
+
+commit 2130d852c76cccb94350a4aea222359640ffa8a4
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Oct 24 21:35:03 2007 +0000
+
+    Add commented-out dummy struct for Extension lookups.
+
+    2007-10-24  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-gpos-private.h:
+            * pango/opentype/harfbuzz-gsub-private.h:
+            Add commented-out dummy struct for Extension lookups.
+
+ src/harfbuzz-gpos-private.h | 13 +++++++++++++
+ src/harfbuzz-gsub-private.h | 13 +++++++++++++
+ 2 files changed, 26 insertions(+)
+
+commit 13b2b963848ada169c2fe3d3669fbc1c337f7fe7
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Sun Oct 21 18:17:02 2007 +0000
+
+    Bug 488840 – harfbuzz: protect against ligid overflow
+
+    2007-10-21  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 488840 – harfbuzz: protect against ligid overflow
+
+            * pango/opentype/harfbuzz-buffer.c
+            (_hb_buffer_allocate_ligid):
+            Never return zero, even in case of overflow.
+
+            * pango/opentype/harfbuzz-impl.h: Define dummy HB_LIKELY() and
+            HB_UNLIKELY(), to be filled later.
+
+ src/harfbuzz-buffer.c | 6 +++++-
+ src/harfbuzz-impl.h   | 3 +++
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit 6b347138b597c41af24453f630336ba2fc033dc5
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Oct 11 08:30:50 2007 +0000
+
+    Mark internal symbols as HB_INTERNAL and define that to static in
+
+    2007-10-11  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/*: Mark internal symbols as HB_INTERNAL and
+            define that to static in harfbuzz.c.
+
+            * pango/opentype/harfbuzz-buffer-internal.h: New file.
+
+ src/Makefile.am               |   1 +
+ src/ftglue.c                  |  18 +++----
+ src/ftglue.h                  |  20 ++++----
+ src/harfbuzz-buffer-private.h |  60 +++++++++++++++++++++++
+ src/harfbuzz-buffer.c         | 108
+ +++++++++++++++++++++-------------------
+ src/harfbuzz-buffer.h         |  38 +--------------
+ src/harfbuzz-gdef-private.h   |  17 ++++---
+ src/harfbuzz-gdef.c           |  20 ++++----
+ src/harfbuzz-gpos-private.h   |  13 +++--
+ src/harfbuzz-gpos.c           |  16 +++---
+ src/harfbuzz-gsub-private.h   |  14 +++---
+ src/harfbuzz-gsub.c           |  20 ++++----
+ src/harfbuzz-impl.h           |  12 +++--
+ src/harfbuzz-open-private.h   |  81 +++++++++++++++++-------------
+ src/harfbuzz-open.c           | 111
+ ++++++++++++++++++++++++------------------
+ src/harfbuzz.c                |   1 +
+ 16 files changed, 315 insertions(+), 235 deletions(-)
+
+commit 7cdfb61deefd8f43edb5eb79d45d38dbbbef9051
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Oct 11 07:46:33 2007 +0000
+
+    Remove FTGLUE_API/APIDEF cruft.
+
+    2007-10-11  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/ftglue.[ch]: Remove FTGLUE_API/APIDEF cruft.
+
+ src/ftglue.c | 16 ++++++++--------
+ src/ftglue.h | 24 ++++++++----------------
+ 2 files changed, 16 insertions(+), 24 deletions(-)
+
+commit 61ddbafaaad31ccacde54cad7e60a84abffc0a9f
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Oct 11 07:45:26 2007 +0000
+
+    Build harfbuzz.c instead of individual source files, to let
+    compiler go
+
+    2007-10-11  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/Makefile.am: Build harfbuzz.c instead
+            of individual
+            source files, to let compiler go wild with optimizations!
+
+ src/Makefile.am | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit a219b3d003d6727c79dc51282d21e9ac48c44458
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Oct 11 07:34:08 2007 +0000
+
+    Same here.
+
+    2007-10-11  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz.c: Same here.
+
+ src/harfbuzz.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 6567e16e3b14c08659342bbcc9f2735e71f9114e
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Oct 11 07:33:19 2007 +0000
+
+    Don't include harfbuzz-dump.[ch] in libharfbuzz.a. Those are just
+    used by
+
+    2007-10-11  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/Makefile.am: Don't include harfbuzz-dump.[ch]
+            in
+            libharfbuzz.a.  Those are just used by the harfbuzz-dump tool.
+
+ src/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0b032549ba7581c879a0fc4e794b0e9a4723ae85
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Oct 11 07:24:47 2007 +0000
+
+    Some more cleanup.
+
+    2007-10-11  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-buffer.c: Some more cleanup.
+
+ src/harfbuzz-buffer.c | 11 ++---------
+ 1 file changed, 2 insertions(+), 9 deletions(-)
+
+commit 7a26864308bd1ca8d5f47d798411cac7239b7d38
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Oct 11 07:21:31 2007 +0000
+
+    Move some code around.
+
+    2007-10-11  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-buffer.c: Move some code around.
+
+ src/harfbuzz-buffer.c | 91
+ +++++++++++++++++++++++++++------------------------
+ 1 file changed, 48 insertions(+), 43 deletions(-)
+
+commit 7a5405c8261573a0f29d28fb533e800d698f6129
+Author: Behdad Esfahbod <behdad@src.gnome.org>
+Date:   Thu Oct 11 07:15:16 2007 +0000
+
+    Minor.
+
+ src/harfbuzz-buffer.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 986f4fd96892ebda550793941bb1daed862c4a34
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Oct 11 07:12:49 2007 +0000
+
+    Rename buffer->inplace to buffer->separate_out with the inverted
+    meaning,
+
+    2007-10-11  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-buffer.[ch]: Rename buffer->inplace
+            to
+            buffer->separate_out with the inverted meaning, such that
+            buffer
+            is initialization is memset(0).
+
+ src/harfbuzz-buffer.c | 34 +++++++++++++++++-----------------
+ src/harfbuzz-buffer.h |  2 +-
+ 2 files changed, 18 insertions(+), 18 deletions(-)
+
+commit 06003908ccf2473366816935dd1b144cde587be9
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Oct 11 07:05:09 2007 +0000
+
+    Allocate buffer->positions lazily.
+
+    2007-10-11  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/*: Allocate buffer->positions lazily.
+
+ src/harfbuzz-buffer.c | 25 +++++++++++++++++++++++--
+ src/harfbuzz-buffer.h |  3 +++
+ src/harfbuzz-gpos.c   | 13 ++++++++-----
+ src/harfbuzz-gsub.c   |  5 +++--
+ 4 files changed, 37 insertions(+), 9 deletions(-)
+
+commit fc3d6f575826704a0ae9ee9018323f6a3c422f4b
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Oct 11 06:52:07 2007 +0000
+
+    Bug 485621 – Get rid of freetype memory allocator in harfbuzz
+
+    2007-10-11  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 485621 – Get rid of freetype memory allocator in
+            harfbuzz
+
+            * pango/opentype/*: Remove all occurences of FT_Memory.  Use
+            malloc/realloc/free directly.
+
+            * pango/pango-ot*: Update to above.
+
+ src/ftglue.c                |  52 ++---
+ src/ftglue.h                |  28 ++-
+ src/harfbuzz-buffer.c       |  16 +-
+ src/harfbuzz-buffer.h       |   4 +-
+ src/harfbuzz-gdef.c         | 106 ++++------
+ src/harfbuzz-gdef.h         |   6 +-
+ src/harfbuzz-gpos-private.h |   1 -
+ src/harfbuzz-gpos.c         | 462
+ ++++++++++++++++++--------------------------
+ src/harfbuzz-gpos.h         |   2 -
+ src/harfbuzz-gsub-private.h |   1 -
+ src/harfbuzz-gsub.c         | 312 +++++++++++-------------------
+ src/harfbuzz-gsub.h         |   2 -
+ src/harfbuzz-open-private.h |  25 ++-
+ src/harfbuzz-open.c         | 127 ++++++------
+ 14 files changed, 441 insertions(+), 703 deletions(-)
+
+commit a8abb8b994c3cd89808e8f7128a0c04b23eb3ede
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Oct 11 00:07:58 2007 +0000
+
+    Bug 485559 – Boston Summit HarfBuzz optimizations
+
+    2007-10-10  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 485559 – Boston Summit HarfBuzz optimizations
+
+            * pango/opentype/*: HarfBuzz hacking to:
+
+              - Rename last remaining FT_Err stuff to HB_Err.
+
+              - Fix a couple invalid table paths to be permissive so
+                fonts work better.  Particularly GDEF table for Nafees
+                Nastaliq is loaded and works great now.
+
+              - Optimize harfbuzz buffer to not copy/swap for simple
+              one-to-one and "copy" GSUB operations.
+
+            * pango/pango-ot*: Update to FT_Err to HB_Err renaming.
+
+ src/ftglue.c                |  51 ++-
+ src/ftglue.h                |  21 +-
+ src/harfbuzz-buffer.c       | 190 +++++++--
+ src/harfbuzz-buffer.h       |  26 +-
+ src/harfbuzz-dump-main.c    |  14 +-
+ src/harfbuzz-dump.c         |  15 +-
+ src/harfbuzz-gdef-private.h |   4 +-
+ src/harfbuzz-gdef.c         | 149 +++----
+ src/harfbuzz-gdef.h         |  10 +-
+ src/harfbuzz-gpos-private.h |   2 +-
+ src/harfbuzz-gpos.c         | 810 ++++++++++++++++++--------------------
+ src/harfbuzz-gpos.h         |  30 +-
+ src/harfbuzz-gsub-private.h |   2 +-
+ src/harfbuzz-gsub.c         | 919
+ +++++++++++++++++++-------------------------
+ src/harfbuzz-gsub.h         |  24 +-
+ src/harfbuzz-impl.h         |  22 +-
+ src/harfbuzz-open-private.h |  20 +-
+ src/harfbuzz-open.c         | 238 ++++++------
+ src/harfbuzz-open.h         |  13 +-
+ 19 files changed, 1253 insertions(+), 1307 deletions(-)
+
+commit dd810b76bc554278d3a226cf89901d16992cf56d
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Aug 29 08:46:50 2007 +0000
+
+    Bug 302952 – The placement of a diacritic marks for an arabic
+    ligature
+
+    2007-08-29  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 302952 – The placement of a diacritic marks for an
+            arabic ligature
+            is not correct
+
+            * pango/opentype/harfbuzz-buffer.c (hb_buffer_allocate_ligid):
+            Don't
+            use zero as allocated ligature id.  Zero means no ligature id.
+
+ src/harfbuzz-buffer.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e90d19919434b90d79e67aaf199bddd991f8e5d8
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Tue Aug 21 08:03:26 2007 +0000
+
+    Bug 463430 – Gets stuck while "formatting message"
+
+    2007-08-21  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 463430 – Gets stuck while "formatting message"
+
+            * pango/opentype/harfbuzz-gpos.c (Lookup_PairPos1),
+            (Lookup_PairPos2), (Lookup_PairPos), (Do_ContextPos):
+            * pango/opentype/harfbuzz-gsub.c (Do_ContextSubst):
+            Change type of intermediate index variable from FT_UShort to
+            FT_ULong as it was overlowing with more than 65536 glyphs.
+
+ src/harfbuzz-gpos.c | 15 ++++++++++-----
+ src/harfbuzz-gsub.c |  2 +-
+ 2 files changed, 11 insertions(+), 6 deletions(-)
+
+commit 13b86ee398905f96f57df001309312f6dfdfea9a
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Tue Aug 21 01:38:07 2007 +0000
+
+    Don't ignore error return value of
+    hb_buffer_copy_output_glyph(). Patch
+
+    2007-08-20  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-gsub.c (GSUB_Do_String_Lookup):
+            Don't
+            ignore error return value of hb_buffer_copy_output_glyph().
+            Patch
+            sent to harfbuzz-list.
+
+ src/harfbuzz-gsub.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4c2556cb4c38a56c3a5087deb54aa6262ab3aff9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 6 11:29:21 2007 -0400
+
+    [gdef] Initial implementation
+
+ src/harfbuzz-gdef-private.h | 144
+ +++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 142 insertions(+), 2 deletions(-)
+
+commit 5b2e947fd2b7c5ea49b2bef1e0190d99a525058c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 6 02:03:26 2007 -0400
+
+    [open] small fixes, including not using unions for main structs
+
+ src/harfbuzz-open-private.h | 54
+ ++++++++++++++++++++++++---------------------
+ 1 file changed, 29 insertions(+), 25 deletions(-)
+
+commit 151df44346990728b5dd249db5740a9543ae33b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 5 17:22:07 2007 -0400
+
+    Improve stupid Makefile
+
+ src/Makefile | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 6c49bebc70a0118a803a5bc979f4436a82b48240
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Tue May 1 02:32:12 2007 +0000
+
+    Link freetype to harfbuzz-dump, for those systems that don't track
+
+    2007-04-30  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/Makefile.am: Link freetype to harfbuzz-dump,
+            for
+            those systems that don't track dependencies automatically.
+
+ src/Makefile.am | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 7341a116916c8470f1211f0cb3c65b189b42ec9e
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Tue Apr 3 22:45:29 2007 +0000
+
+    Copy fixes from harfbuzz stable branch. Includes a leak fix, a kerning
+
+    2007-04-03  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-gdef.c (_HB_GDEF_Check_Property):
+            * pango/opentype/harfbuzz-gpos.c (HB_Done_GPOS_Table),
+            (Lookup_PairPos):
+            * pango/opentype/harfbuzz-open.c (Get_Class1):
+            Copy fixes from harfbuzz stable branch.  Includes a leak fix,
+            a kerning fix, and an array out-of-bound access fix.
+
+ src/harfbuzz-gdef.c | 2 ++
+ src/harfbuzz-gpos.c | 8 ++++++++
+ src/harfbuzz-open.c | 2 +-
+ 3 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 999a6f05758c10a902354457ecbf6c943bfed514
+Author: Hans Breuer <hans@breuer.org>
+Date:   Sat Jan 13 21:31:41 2007 +0000
+
+    updated
+
+    2007-01-13  Hans Breuer  <hans@breuer.org>
+
+            * pango/makefile.msc pango/opentype/makefile.msc : updated
+
+ src/makefile.msc | 16 ++++++----------
+ 1 file changed, 6 insertions(+), 10 deletions(-)
+
+commit 3c038d40da4bfe5037cc4e9de22bad08fa408465
+Author: Behdad Esfahbod <behdad@src.gnome.org>
+Date:   Tue Jan 9 03:32:12 2007 +0000
+
+    Remove .cvsignore files (moved to svn:ignore prop)
+
+ src/.cvsignore | 7 -------
+ 1 file changed, 7 deletions(-)
+
+commit 5b3f7702a64fe0513d08a67bdb72704e46fd7cd4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 28 06:42:37 2006 -0500
+
+    Add stub GDEF files
+
+ src/harfbuzz-gdef-private.h |  8 ++++++++
+ src/harfbuzz-gdef.h         | 11 +++++++++++
+ src/harfbuzz-open-private.h |  3 +--
+ src/harfbuzz-private.h      |  6 ++++++
+ src/main.cc                 |  1 +
+ 5 files changed, 27 insertions(+), 2 deletions(-)
+
+commit b3395a7aa36ff1ba5a17f494fbf359ec317a7e69
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 28 06:31:18 2006 -0500
+
+    Don't shift down the mark attachment type
+
+ src/harfbuzz-open-private.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 193b66d52ae2cb5ced7969e15b7f56dc1978ca8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 28 06:12:18 2006 -0500
+
+    Remove stale comment
+
+ src/harfbuzz-open-private.h | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+commit 12c4568c680ea2b9b98a16a8b7402ca185c90ef6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 28 06:10:59 2006 -0500
+
+    Break and rename, in the layout of old HarfBuzz codebase
+
+ src/.gitignore                                  |   1 +
+ src/Makefile                                    |   2 +-
+ src/harfbuzz-common.h                           |  14 +++
+ src/{harfbuzz-ng.cc => harfbuzz-open-private.h} | 117
+ ++----------------------
+ src/harfbuzz-open.h                             |  13 +++
+ src/main.cc                                     |  98
+ ++++++++++++++++++++
+ 6 files changed, 133 insertions(+), 112 deletions(-)
+
+commit 3158d84b0dfe5032e7c56c03f2da97b8ab549d94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 27 20:08:07 2006 -0500
+
+    Oops. s/OpenTypeFontFaceFile/OpenTypeFontFile/g
+
+ src/harfbuzz-ng.cc | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit bf0f9dd61375c5afce8e6b1664d0df5f6c8b2494
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 27 20:06:42 2006 -0500
+
+    Use union for ClassDef
+
+ src/harfbuzz-ng.cc | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit c46196d09c4ea879bf45182e8a0d649d4c750c39
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 27 20:05:16 2006 -0500
+
+    Use union for Coverage
+
+ src/harfbuzz-ng.cc | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+commit 86f450243dbaa82f187cf2d36364e9a59c0e64c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 27 19:59:07 2006 -0500
+
+    Add GPOS stub
+
+ src/harfbuzz-ng.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 133466177e104ddcd2501a88735670540252167c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 27 19:58:32 2006 -0500
+
+    s/OpenTypeFont/OpenTypeFontFace/g
+
+ src/harfbuzz-ng.cc | 44 +++++++++++++++++++++++---------------------
+ 1 file changed, 23 insertions(+), 21 deletions(-)
+
+commit 71d62baab0429cdf56ba4019fd2a205f08188503
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 27 01:29:24 2006 -0500
+
+    GSUBGPOSHeader
+
+ src/harfbuzz-ng.cc | 103
+ ++++++++++++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 98 insertions(+), 5 deletions(-)
+
+commit eebabd8b2ec5296deba6b09d7755933da0a7d9dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 27 00:21:31 2006 -0500
+
+    Finished OpenType Common Table Formats
+
+ src/harfbuzz-ng.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2b7374519766825971f9f4ff5b1cb49b74cfcaf8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 26 20:55:37 2006 -0500
+
+    Device tables.
+
+ src/harfbuzz-ng.cc | 49 +++++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 45 insertions(+), 4 deletions(-)
+
+commit eb32e374f4d6de8d428d36144f6eef93514820d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 26 20:00:33 2006 -0500
+
+    ClassDef
+
+ src/harfbuzz-ng.cc | 121
+ ++++++++++++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 97 insertions(+), 24 deletions(-)
+
+commit 53502c6723dbf9cd3b6ba91b733678b3c7871715
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 26 19:29:08 2006 -0500
+
+    Rename CoverageFormat to Coverage
+
+ src/harfbuzz-ng.cc | 18 +++++++++++++-----
+ 1 file changed, 13 insertions(+), 5 deletions(-)
+
+commit 0d6db2abcbe98456569ccf7934ba0a8b37c7f6f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 26 18:53:55 2006 -0500
+
+    Define more structs using DEFINE_INT_TYPE.
+
+ src/harfbuzz-ng.cc | 39 +++++++++++++++++++--------------------
+ 1 file changed, 19 insertions(+), 20 deletions(-)
+
+commit 915931b74a30e8652fac5fec153d499485513f63
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 26 15:30:14 2006 -0500
+
+    s/DEFINE_NOT_INSTANTIABLE/DEFINE_NON_INSTANTIABLE/
+
+ src/harfbuzz-ng.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 0c0d55330ef4090f3e4864538e83a4344caaf3ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 26 15:29:38 2006 -0500
+
+    Coverage.
+
+ src/harfbuzz-ng.cc | 91
+ +++++++++++++++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 79 insertions(+), 12 deletions(-)
+
+commit 882e52f59196535495af8ca8069df32308ad52cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 25 10:28:31 2006 -0500
+
+    Rename to harfbuzz-ng.cc
+
+ src/Makefile                                | 2 +-
+ src/{hb-types-private.cc => harfbuzz-ng.cc} | 0
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit f8ba99f6f322800a915428ffc3b5eaf1be2e6c21
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 25 09:58:02 2006 -0500
+
+    LookupFlags
+
+ src/hb-types-private.cc | 52
+ ++++++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 47 insertions(+), 5 deletions(-)
+
+commit 25ad92c8a68bf72464601a644ed57b9213126a78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 25 09:35:06 2006 -0500
+
+    Implement Feature
+
+ src/hb-types-private.cc | 46
+ ++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 42 insertions(+), 4 deletions(-)
+
+commit befc022affd2386b3f46cd7d11e4262f6c8bce9f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 25 09:14:52 2006 -0500
+
+    LangSys
+
+ src/hb-types-private.cc | 51
+ ++++++++++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 44 insertions(+), 7 deletions(-)
+
+commit c81efca149b08832d5d96a944fb5f303f3d0ca42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 25 06:22:08 2006 -0500
+
+    Use CamelCaseTags.
+
+ src/hb-types-private.cc | 29 ++++++++++++++---------------
+ 1 file changed, 14 insertions(+), 15 deletions(-)
+
+commit 808dbe283c1ad66091f2cb67380888b7cf265c01
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 25 06:18:52 2006 -0500
+
+    Make types not instantiable
+
+ src/hb-types-private.cc | 104
+ ++++++++++++++++++++++++++----------------------
+ 1 file changed, 57 insertions(+), 47 deletions(-)
+
+commit b739c05ca4b7acfa45bd4b0812ecbb3747f726f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 25 05:39:20 2006 -0500
+
+    Add OpenTypeFontFile.
+
+ src/Makefile            |   2 +-
+ src/hb-types-private.cc | 113
+ +++++++++++++++++++++++++++++++++++++++++++++---
+ 2 files changed, 107 insertions(+), 8 deletions(-)
+
+commit 8596944b7421f982960e825019fc0263442520cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 23 17:49:25 2006 -0500
+
+    Add Makefile
+
+ src/Makefile | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit b6e62bc5db76ae342177b2b646c37f45eccad975
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 22 02:21:55 2006 -0500
+
+    After DEFINE_SCRIPT_ARRAY
+
+ src/hb-types-private.cc | 215
+ +++++++++++++++++++++++++++++++-----------------
+ 1 file changed, 140 insertions(+), 75 deletions(-)
+
+commit 01e4fcb032be601f272e62228881e2aabfb9d925
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 21 22:31:31 2006 -0500
+
+    Remove the annoying HB_ prefix.
+
+ src/hb-types-private.cc | 107
+ +++++++++++++++++++++++-------------------------
+ 1 file changed, 52 insertions(+), 55 deletions(-)
+
+commit 6b4ce01da121e12e1c78ad7eaedf469f35f3568d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 21 22:31:10 2006 -0500
+
+    Second version.  Complete redesign, based on C++ classes to ensure
+    endian
+    correctness.
+
+ src/hb-types-private.cc | 300
+ +++++++++++++++++++++++++++++++++---------------
+ 1 file changed, 205 insertions(+), 95 deletions(-)
+
+commit f78e70c301311ffcfb007c7fc4125d71cbcff1e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 21 22:30:38 2006 -0500
+
+    First version.
+
+ src/hb-types-private.cc | 116
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 116 insertions(+)
+
+commit f726b20e56e8b1106dfde0bf8d575c73e83957c4
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Tue Jul 25 01:02:27 2006 +0000
+
+    Bug 347073 – Allow empty GPOS table
+
+    2006-07-24  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 347073 – Allow empty GPOS table
+
+            * pango/opentype/harfbuzz-open.c (_HB_OPEN_Load_ScriptList):
+            Don't
+            err on empty GPOS/GSUB tables.
+
+ src/harfbuzz-open.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 52481a5c55d466f41654dcdc67245d0ca8cefbcf
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Jun 22 18:09:04 2006 +0000
+
+    Bug 345600 – cvs build error in pango/opentype/Makefile
+
+    2006-06-22  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 345600 – cvs build error in pango/opentype/Makefile
+
+            * pango/opentype/Makefile.am: Rename variable SOURCES to
+            MAINSOURCES.
+            Some automake versions seem to use it or something.
+
+ src/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ffb2d5c1e7af33644d0a4058befa4b8358c9a7bf
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed May 31 07:42:55 2006 +0000
+
+    Bug 341138 – Using TTC font, Gtk2 programs begin to eating big
+    memory
+
+    2006-05-31  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 341138 – Using TTC font, Gtk2 programs begin to eating
+            big memory
+            and have many cpu usage.
+            Patch from Yong Li.
+
+            * pango/opentype/ftglue.c (_hb_ftglue_face_goto_table):
+            TrueType table
+            offsets are absolute, not relative.
+
+ src/ftglue.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f8f7bd2451eeafb57f5c80c7b4e88a1e50b97c4f
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed May 31 07:23:02 2006 +0000
+
+    Bug 336153 – Mark to mark positioning (Lookup Type 6) isn't
+    correct when
+
+    2006-05-31  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 336153 – Mark to mark positioning (Lookup Type 6)
+            isn't correct
+            when using MarkAttchmentType
+            Patch from Tin Myo Htet.
+
+            * pango/opentype/harfbuzz-gpos.c (Lookup_MarkMarkPos):
+            Ignore marks
+            of non-matchin attachment type.
+
+ src/harfbuzz-gpos.c | 37 ++++++++++++++++++++++---------------
+ 1 file changed, 22 insertions(+), 15 deletions(-)
+
+commit d2a613187c1257371d62153b55c89336965e0754
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Apr 12 18:47:50 2006 +0000
+
+    Fix loop variables. (coverity found bug.)
+
+    2006-04-12  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-gpos.c: Fix loop
+            variables. (coverity
+            found bug.)
+
+ src/harfbuzz-gpos.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 14022e826f63c48b689f9037645c9a3a3302d9b6
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Tue Apr 11 08:31:44 2006 +0000
+
+    Bug 337924 – cleanups for issues reported by various compilers Patch
+
+    2006-04-11  Behdad Esfahbod  <behdad@gnome.org>
+
+            Bug 337924 – cleanups for issues reported by various
+            compilers
+            Patch from Kjartan Maraas.
+
+            * examples/viewer-x.c (update):
+            * modules/arabic/arabic-fc.c (fallback_shape),
+            (arabic_engine_shape):
+            * modules/basic/basic-fc.c (fallback_shape),
+            (basic_engine_shape):
+            * modules/basic/basic-x.c:
+            * modules/hangul/hangul-fc.c:
+            * modules/hebrew/hebrew-fc.c (hebrew_engine_shape):
+            * modules/indic/indic-fc.c:
+            * modules/khmer/khmer-fc.c:
+            * modules/syriac/syriac-fc.c:
+            * modules/thai/thai-fc.c:
+            * modules/tibetan/tibetan-fc.c:
+            * pango/break.c:
+            * pango/modules.c:
+            * pango/opentype/ftglue.c (_hb_ftglue_face_goto_table):
+            * pango/pango-attributes.c (pango_attr_list_filter):
+            * pango/pango-engine.c:
+            * pango/pango-fontset.c:
+            * pango/pango-layout.c (pango_layout_set_text),
+            (pango_layout_xy_to_index), (pango_layout_get_cursor_pos):
+            * pango/pango-markup.c (text_handler):
+            * pango/pango-utils.c (read_alias_file):
+            * pango/pangocairo-fcfont.c (G_DEFINE_TYPE_WITH_CODE):
+            * pango/pangocairo-fcfontmap.c (G_DEFINE_TYPE_WITH_CODE):
+            * pango/pangocairo-font.c
+            (_pango_cairo_font_get_hex_box_info):
+            * pango/pangox-fontmap.c (pango_x_make_matching_xlfd):
+            * tests/dump-boundaries.c (fail):
+            Remove unused variables.  Remove excess semicolon after
+            DEFINE_TYPE
+            macros.
+
+ src/ftglue.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 59aafd07806a2f0d4f399eff13aec74557f60522
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Mon Apr 10 10:33:17 2006 +0000
+
+    Fix minor bugs reported by the Coverity scan report.
+
+    2006-04-10  Behdad Esfahbod  <behdad@gnome.org>
+
+            Fix minor bugs reported by the Coverity scan report.
+
+            * pango/opentype/harfbuzz-gdef.c
+            (HB_GDEF_Build_ClassDefinition):
+            * pango/opentype/harfbuzz-gpos.c (HB_GPOS_Query_Scripts),
+            (HB_GPOS_Query_Languages), (HB_GPOS_Query_Features): Do
+            not access
+            structs before we check them for nullity.
+
+            * pango/pango-layout.c (pango_layout_index_to_line),
+            (pango_layout_index_to_line_and_extents),
+            (pango_layout_index_to_pos): Check for invalid iterators
+            outside the
+            loop, so we don't crash.
+
+            * pango/pango-layout.c (pango_layout_line_x_to_index): Set
+            char_trailing instead of trailing in one of too many paths.
+            Should
+            have been a typo.
+
+            * pango/pangox.c (get_font_metrics_from_subfonts): Check
+            for nullity
+            somewhere.
+
+ src/harfbuzz-gdef.c | 3 ++-
+ src/harfbuzz-gpos.c | 9 ++++++---
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+commit b31d6def96ff99e89ba42e09661992498bda460d
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Apr 6 18:23:49 2006 +0000
+
+    Update from HarfBuzz. Lars Knoll fixed all the warnings.
+
+    2006-04-06  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype: Update from HarfBuzz.  Lars Knoll fixed
+            all the
+            warnings.
+
+ src/harfbuzz-dump.c |  94 ++++++++++++++++++++++++++++---------------
+ src/harfbuzz-gpos.c |  80 ++++++++++++++++++++++--------------
+ src/harfbuzz-gsub.c | 114
+ +++++++++++++++++++++++++++++-----------------------
+ src/harfbuzz-impl.h |   4 ++
+ 4 files changed, 179 insertions(+), 113 deletions(-)
+
+commit ca57250bc9d9f92c88a2ea516e251b9cbfdebda0
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Mon Apr 3 20:13:17 2006 +0000
+
+    Make sure TTAG_GDEF and frineds are defined, needed for FreeType
+    <= 2.1.7
+
+    2006-04-03  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/harfbuzz-impl.h: Make sure TTAG_GDEF and
+            frineds are
+            defined, needed for FreeType <= 2.1.7 (pointed by Tim Janik).
+
+ src/harfbuzz-gdef.c |  3 ---
+ src/harfbuzz-gpos.c |  3 ---
+ src/harfbuzz-gsub.c |  3 ---
+ src/harfbuzz-impl.h | 11 +++++++++++
+ 4 files changed, 11 insertions(+), 9 deletions(-)
+
+commit f618288e00914b6606ec977d506c18e4abdd3ce4
+Author: Behdad Esfahbod <behdad@src.gnome.org>
+Date:   Fri Mar 31 13:19:29 2006 +0000
+
+    .
+
+ src/.cvsignore | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 5f1f943b9e6d753722ceadba7eb7ce1f14526ea5
+Author: Behdad Esfahbod <behdad@src.gnome.org>
+Date:   Fri Mar 31 13:18:23 2006 +0000
+
+    .
+
+ src/.cvsignore | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit bce3e0b0d4ee521767d80c5c21704337bf5ac716
+Author: Behdad Esfahbod <behdad@src.gnome.org>
+Date:   Fri Mar 31 12:45:40 2006 +0000
+
+    Define NULL.
+
+ src/harfbuzz-impl.h | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 9f8da38cd108590514b71756b752d98952a9221f
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Fri Mar 31 12:28:09 2006 +0000
+
+    Convert pango/opentype to the new project called HarfBuzz.
+
+    2006-03-31  Behdad Esfahbod  <behdad@gnome.org>
+
+            Convert pango/opentype to the new project called HarfBuzz.
+
+            * pango/opentype/*: Restructured.
+
+            * pango/pango-ot-*: Updated to use HarfBuzz symbol names.
+
+ src/COPYING                            |   15 +
+ src/{FTL.TXT => COPYING.FTL}           |    0
+ src/COPYING.GPL                        |  340 ++
+ src/FT-license.txt                     |   28 -
+ src/Makefile.am                        |   89 +-
+ src/README                             |   44 +-
+ src/ftglue.c                           |   88 +-
+ src/ftglue.h                           |   68 +-
+ src/ftxgdef.c                          | 1225 -------
+ src/ftxgdef.h                          |  224 --
+ src/ftxgpos.c                          | 6199
+ -------------------------------
+ src/ftxgpos.h                          |  838 -----
+ src/ftxgsub.c                          | 4533 -----------------------
+ src/ftxgsub.h                          |  594 ---
+ src/ftxopen.c                          | 1552 --------
+ src/ftxopen.h                          |  317 --
+ src/ftxopenf.h                         |  166 -
+ src/harfbuzz-buffer.c                  |  227 ++
+ src/harfbuzz-buffer.h                  |  106 +
+ src/{ottest.c => harfbuzz-dump-main.c} |   84 +-
+ src/{disasm.c => harfbuzz-dump.c}      |  186 +-
+ src/{disasm.h => harfbuzz-dump.h}      |   18 +-
+ src/harfbuzz-gdef-private.h            |  101 +
+ src/harfbuzz-gdef.c                    | 1228 +++++++
+ src/harfbuzz-gdef.h                    |  127 +
+ src/harfbuzz-gpos-private.h            |  683 ++++
+ src/harfbuzz-gpos.c                    | 6269
+ ++++++++++++++++++++++++++++++++
+ src/harfbuzz-gpos.h                    |  168 +
+ src/harfbuzz-gsub-private.h            |  448 +++
+ src/harfbuzz-gsub.c                    | 4581 +++++++++++++++++++++++
+ src/harfbuzz-gsub.h                    |  132 +
+ src/harfbuzz-impl.h                    |   64 +
+ src/harfbuzz-open-private.h            |   81 +
+ src/harfbuzz-open.c                    | 1426 ++++++++
+ src/harfbuzz-open.h                    |  285 ++
+ src/harfbuzz.c                         |   19 +
+ src/harfbuzz.h                         |   23 +
+ src/otlbuffer.c                        |  238 --
+ src/otlbuffer.h                        |  103 -
+ 39 files changed, 16582 insertions(+), 16335 deletions(-)
+
+commit dd2a8d4d490df1d310e7553ba6c7c8de661f28a1
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Sat Mar 25 23:52:30 2006 +0000
+
+    Don't err on Table_Missing.
+
+    2006-03-25  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/ottest.c: Don't err on Table_Missing.
+
+ src/ottest.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 434833b1b7b01d85a143f9ad4b04e7044dd72567
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Mon Mar 13 05:06:05 2006 +0000
+
+    === Released 1.12.0 ===
+
+    2006-03-13  Behdad Esfahbod  <behdad@gnome.org>
+
+            * === Released 1.12.0 ===
+
+            * configure.in: Version 1.12.0
+
+            * NEWS, README: Updated.
+
+ src/README | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8228828e1e4c8dd6f9435fb718ad4394bba95655
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Mon Jan 30 22:37:48 2006 +0000
+
+    Handle GSUB Lookup type 8, and ReverseChainContextualSubst table. (bug
+
+    2006-01-30  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/ftxgsub.c: Handle GSUB Lookup type 8,
+            and ReverseChainContextualSubst table.  (bug #149696,
+            patch from Aamir Wali)
+
+ src/ftxgsub.c  | 545
+ ++++++++++++++++++++++++++++++++++++++++++++++-----------
+ src/ftxgsub.h  |  47 +++--
+ src/ftxopen.c  |   7 +
+ src/ftxopenf.h |   5 +-
+ 4 files changed, 487 insertions(+), 117 deletions(-)
+
+commit e040f681963d51eaadcd53a456100fde1a7addb6
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Sat Jan 28 20:29:18 2006 +0000
+
+    Removed.
+
+    2006-01-28  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/pango-ot-*: Removed.
+
+            * pango/pango-ot-*: Added.
+
+            * pango/Makefile.am, pango/opentype/Makefile.am: Adjusted.
+
+ src/Makefile.am        |  30 +--
+ src/pango-ot-buffer.c  | 339 ------------------------
+ src/pango-ot-info.c    | 681
+ -------------------------------------------------
+ src/pango-ot-private.h | 105 --------
+ src/pango-ot-ruleset.c | 225 ----------------
+ 5 files changed, 13 insertions(+), 1367 deletions(-)
+
+commit f45689bc655eb723f11a2eb65a41303221b80397
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Jan 25 19:33:58 2006 +0000
+
+    If major.minor of required and available glib versions are the
+    same, add
+
+    2006-01-25  Behdad Esfahbod  <behdad@gnome.org>
+
+            * configure.in: If major.minor of required and available
+            glib versions
+            are the same, add -DG_DISABLE_DEPRECATED to GLIB_CFLAGS. (bug
+            #328617)
+
+            * */Makefile.am: Remove hardcoded -DG_DISABLE_DEPRECATED.
+
+ src/Makefile.am | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 6cc6c9a57c674787f278ea5b60705384fd72b4ad
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Sat Jan 14 07:00:13 2006 +0000
+
+    Make sure #include <config.h> is the first include in the file. (bug
+
+    2006-01-14  Behdad Esfahbod  <behdad@gnome.org>
+
+            * */*.c, */*/*.c: Make sure #include <config.h> is the
+            first include
+            in the file. (bug #158870, based on patch by Luis Menina)
+
+ src/disasm.c           | 2 ++
+ src/ftglue.c           | 1 +
+ src/ftxgdef.c          | 1 +
+ src/ftxgpos.c          | 2 ++
+ src/ftxgsub.c          | 2 ++
+ src/ftxopen.c          | 2 ++
+ src/otlbuffer.c        | 3 +++
+ src/ottest.c           | 1 +
+ src/pango-ot-buffer.c  | 2 ++
+ src/pango-ot-info.c    | 2 ++
+ src/pango-ot-ruleset.c | 2 ++
+ 11 files changed, 20 insertions(+)
+
+commit ca07fcf6ef61c09825e67ca7e2574a90e4f5a9a0
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Jan 5 16:14:49 2006 +0000
+
+    pango/Makefile.am, pango/fonts.c, pango/glyphstring.c,
+
+    2006-01-05  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/Makefile.am,
+            * pango/fonts.c,
+            * pango/glyphstring.c,
+            * pango/pango-attributes.c,
+            * pango/pango-color.c,
+            * pango/pango-impl-utils.h,
+            * pango/pango-item.c,
+            * pango/pango-layout.c,
+            * pango/pango-tabs.c,
+            * pango/pango-utils.c,
+            * pango/pango-utils.h,
+            * pango/pangoatsui-fontmap.c,
+            * pango/pangocairo-font.c,
+            * pango/pangocairo-fontmap.c,
+            * pango/pangofc-fontmap.c,
+            * pango/pangowin32-fontmap.c,
+            * pango/pangox-fontmap.c,
+            * pango/pangox.c,
+            * pango/opentype/pango-ot-info.c,
+            * pango/opentype/pango-ot-ruleset.c: Intern strings to avoid
+            unnecessary strdups in the type system. (bug #325832,
+            Matthias Clasen)
+
+ src/pango-ot-info.c    | 3 ++-
+ src/pango-ot-ruleset.c | 3 ++-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+commit 71524f1bc891bb4450507f769e5cc8f6f6cffa0c
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Tue Dec 27 09:55:48 2005 +0000
+
+    Use g_slice for PangoOTBuffer allocation. (bug #325026, Matthias
+    Clasen)
+
+    2005-12-27  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/pango-ot-buffer.c: Use g_slice for
+            PangoOTBuffer
+            allocation. (bug #325026, Matthias Clasen)
+
+ src/pango-ot-buffer.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b5baa43d3a972ebd3ef82ede14b54c185b723a71
+Author: Behdad Esfahbod <behdad@src.gnome.org>
+Date:   Fri Nov 25 09:22:02 2005 +0000
+
+    Tiny doc improvement.
+
+ src/pango-ot-info.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6f64314f7a031a5a5d6b7663c08b70c452961c89
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Nov 23 19:48:10 2005 +0000
+
+    Fix typo in docs.
+
+    2005-11-23  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentyp/pango-ot-buffer.c: Fix typo in docs.
+
+ src/pango-ot-buffer.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit f2bcf72296b57c8cd7d5a08228c3aef6c8f97d2d
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Nov 23 17:54:55 2005 +0000
+
+    Added "Since:" tags to all interfaces added after Pango 1.0. (#319116,
+
+    2005-11-23  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/fonts.c pango/pango-attributes.c pango/pango-context.c
+            pango/pango-glyph-item.c pango/pango-layout.c
+            pango/pango-script.c pango/pango-utils.c pango/pangofc-font.c
+            pango/pangoft2-fontmap.c pango/opentype/pango-ot-buffer.c
+            pango/opentype/pango-ot-ruleset.c: Added "Since:" tags to all
+            interfaces added after Pango 1.0. (#319116, Brian Cameron)
+
+ src/pango-ot-buffer.c  | 49
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/pango-ot-ruleset.c | 14 ++++++++++++++
+ 2 files changed, 63 insertions(+)
+
+commit 682db81c23d2116072d8550657c914afb7c26d2b
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Nov 23 15:19:48 2005 +0000
+
+    Protect against possible division by zeros (#316468, Steve Grubb)
+
+    2005-11-23  Behdad Esfahbod  <behdad@gnome.org>
+
+            Protect against possible division by zeros (#316468,
+            Steve Grubb)
+
+            * pango/pango-context.c (update_metrics_from_items),
+            pango/pango-fontset.c (pango_fontset_real_get_metrics):
+            If count is
+            zero, do not alter approximate_{char,digit}_width.
+
+            * pango/opentype/disasm.c: Err on invalid DeltaFormat.
+
+ src/disasm.c | 28 ++++++++++++++++++----------
+ 1 file changed, 18 insertions(+), 10 deletions(-)
+
+commit e6e15352d154e1350340f8045759e5f7b0d86dc7
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Nov 23 11:53:03 2005 +0000
+
+    Reworked basic shaper with OpenType support. (#101079, based on
+    patch from
+
+    2005-11-23  Behdad Esfahbod  <behdad@gnome.org>
+
+            * modules/basic/basic-fc.c: Reworked basic shaper with
+            OpenType
+            support. (#101079, based on patch from Denis Jacquerye and
+            Noah Levitt)
+
+            * modules/basic/basic-fc.c (basic_scripts): Added Unicode
+            4.1 addition
+            script PANGO_SCRIPT_GLAGOLITIC that is a "simple" script.
+
+            * modules/arabic/arabic-fc.c, modules/syriac/syriac-fc.c:
+            Replace
+            g_utf8_to_ucs4_fast() with g_utf8_strlen()!
+
+            * pango/opentype/pango-ot-ruleset.c
+            (pango_ot_ruleset_add_feature):
+            Remove reference in docs to pango_ot_ruleset_shape() that was
+            removed long ago.
+
+ src/pango-ot-ruleset.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 612b6cf60928b356f4bbb59bc9d64886574322c3
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Nov 17 06:28:11 2005 +0000
+
+    Part of #101079:
+
+    2005-11-17  Behdad Esfahbod  <behdad@gnome.org>
+
+            Part of #101079:
+
+            * pango/opentype/ftxopen.c (Load_Lookup): In extension
+            subtables,
+            offset is relative to the extension subtable, not the original
+            table. (Greg Aumann)
+
+            * pango/opentype/ftxgpos.c (Load_BaseArray): When reading
+            BaseAnchor,
+            skip offsets that are zero.  Works around bug in Doulos
+            SIL Regular.
+
+ src/ftxgpos.c | 6 ++++++
+ src/ftxopen.c | 6 ++++--
+ 2 files changed, 10 insertions(+), 2 deletions(-)
+
+commit 1b2c314b804da97b1d5e7adab64bdd4177702579
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Wed Nov 9 23:30:00 2005 +0000
+
+    Remove debug line that got in accidentally.
+
+    2005-11-09  Behdad Esfahbod  <behdad@gnome.org>
+
+            * pango/opentype/ftxgpos.c, pango/opentype/ftxopen.c:
+            Remove debug
+            line that got in accidentally.
+
+ src/ftxgpos.c | 1 -
+ src/ftxopen.c | 1 -
+ 2 files changed, 2 deletions(-)
+
+commit 9717127a5be037e26afe52332a8b07f13474557a
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Fri Nov 4 23:55:38 2005 +0000
+
+    Turn various gcc warnings off. Adding const, adding static, fully
+
+    2005-11-04  Behdad Esfahbod  <behdad@gnome.org>
+
+            * configure.in, examples/argcontext.c examples/cairoview.c,
+            examples/renderdemo.c, examples/renderdemo.h
+            examples/xftview.c,
+            modules/basic/basic-x.c, modules/hangul/hangul-fc.c,
+            modules/hebrew/hebrew-shaper.c,
+            modules/hebrew/hebrew-shaper.h,
+            modules/indic/indic-fc.c, modules/indic/mprefixups.c,
+            modules/syriac/syriac-fc.c, pango/break.c pango/fonts.c,
+            pango/modules.c, pango/pango-coverage.c pango/pango-engine.c,
+            pango/pango-engine.h, pango/pango-fontmap.c,
+            pango/pango-fontset.c, pango/pango-impl-utils.h,
+            pango/pango-layout.c, pango/pango-layout.h,
+            pango/pango-renderer.c, pango/pango-script.c,
+            pango/pango-utils.c, pango/pangocairo-fc.h,
+            pango/pangocairo-font.c, pango/pangocairo-fontmap.c,
+            pango/pangocairo-private.h, pango/pangofc-decoder.c,
+            pango/pangofc-font.c, pango/pangofc-fontmap.c
+            pango/pangoft2.c,
+            pango/pangox-fontcache.c, pango/pangox-fontmap.c
+            pango/pangox.c,
+            pango/pangoxft-font.c, pango/querymodules.c,
+            pango/opentype/ftglue.c, pango/opentype/ftxgpos.c,
+            pango/opentype/ftxopen.c, pango/opentype/pango-ot-buffer.c,
+            pango/opentype/pango-ot-info.c,
+            pango/opentype/pango-ot-ruleset.c, tests/dump-boundaries.c,
+            tests/testboundaries.c, tests/testcolor.c tests/testiter.c,
+            tests/testscript.c: Turn various gcc warnings off. Adding
+            const,
+            adding static, fully initializing structs, match signedness in
+            comparisons. (#317804)
+
+            * tests/testscript.c, tools/gen-script-for-lang.c:
+            (scripts_for_file): Pass error->message instead of error
+            to fail(),
+            which was wrong.
+            (compare_lang): Fix typo comparing a and a instead of a and b.
+
+ src/ftglue.c           | 2 +-
+ src/ftxgpos.c          | 4 ++++
+ src/ftxopen.c          | 1 +
+ src/pango-ot-buffer.c  | 4 ++--
+ src/pango-ot-info.c    | 5 +++--
+ src/pango-ot-ruleset.c | 5 +++--
+ 6 files changed, 14 insertions(+), 7 deletions(-)
+
+commit c0505f3bb28feeba95b201e6464fb2fdac90194a
+Author: Behdad Esfahbod <behdad@gnome.org>
+Date:   Thu Nov 3 20:13:40 2005 +0000
+
+    Patches from #170414. Reviewed by Matthias Clasen.
+
+    2005-11-03  Behdad Esfahbod  <behdad@gnome.org>
+
+            Patches from #170414.  Reviewed by Matthias Clasen.
+
+            * pango/opentype/ftxgpos.c, pango/opentype/ftxgsub.c: Use
+            call table
+            to dispatch different lookup types.
+
+            * pango/opentype/pango-ot-buffer.c,
+            pango/opentype/pango-ot-ruleset.c:
+            Small cleanup.
+
+ src/ftxgpos.c          | 143
+ ++++++++++++++++++++++++-------------------------
+ src/ftxgsub.c          | 115 +++++++++++++++++++++------------------
+ src/pango-ot-buffer.c  |   3 +-
+ src/pango-ot-ruleset.c |  75 +++++++++-----------------
+ 4 files changed, 159 insertions(+), 177 deletions(-)
+
+commit c6b22b9119ef54ea8d0d2f08b74fdeb024289d73
+Author: Behdad Esfahbod <pango@behdad.org>
+Date:   Mon Aug 29 10:06:40 2005 +0000
+
+    Generate valid XML output. Dump LookupFlag too.
+
+    2005-08-29  Behdad Esfahbod  <pango@behdad.org>
+
+            * pango/opentype/ottest.c, pango/opentype/disasm.c:
+            Generate valid
+            XML output.  Dump LookupFlag too.
+
+ src/disasm.c | 58
+ ++++++++++++++++++++++++++++++----------------------------
+ src/ottest.c | 23 ++++++++++++++---------
+ 2 files changed, 44 insertions(+), 37 deletions(-)
+
+commit 1e3747ca5d1a6f607f8e56fb94e3daaf6ad623cb
+Author: Behdad Esfahbod <pango@behdad.org>
+Date:   Mon Aug 15 04:16:04 2005 +0000
+
+    Replace perror with perror_. Remove FT_BEGIN_STMNT and FT_END_STMNT.
+
+    2005-08-15  Behdad Esfahbod  <pango@behdad.org>
+
+            * pango/opentype/ftglue.h: Replace perror with perror_.
+            Remove FT_BEGIN_STMNT and FT_END_STMNT. (#313477)
+
+ src/ftglue.h | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 3c60250875fa9d04ca96dea35eba23fc70690ff5
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Tue Jul 26 18:33:27 2005 +0000
+
+    Skip lookups with lookup index out of range. (Patch from Behdad
+    Esfahbod,
+
+    2005-07-26    Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c, pango/opentype/ftxgpos.c:
+            Skip lookups
+            with lookup index out of range. (Patch from Behdad Esfahbod,
+            #171170)
+
+ src/ftxgpos.c | 30 ++++++++++++++++++++++++------
+ src/ftxgsub.c | 30 ++++++++++++++++++++++++------
+ 2 files changed, 48 insertions(+), 12 deletions(-)
+
+commit 91a3fa2e4bcdde8ae022d1264c783f133cd7e00d
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Fri Jul 22 18:03:58 2005 +0000
+
+    Remove an unecessary set of block2.
+
+    2005-07-22  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftglue.c (ftglue_realloc): Remove
+            an unecessary set of block2.
+
+ src/ftglue.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit ff7034787d79dcd1bec58a4e02602039313da00e
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Fri Jul 22 17:56:37 2005 +0000
+
+    Patch from David Turner. Review and testing by Behdad Esfahbod
+
+    2005-07-22  Owen Taylor  <otaylor@redhat.com>
+
+            Patch from David Turner. Review and testing by Behdad Esfahbod
+
+            * pango/opentype/ftglue.[ch] Makefile.am: Glue layer that
+            provides
+            implementation of the internal functions that the opentype
+            code
+            expects in terms of publically exported FreeType API.
+
+            * pango/opentype/ftxgdef.c pango/opentype/ftxgpos.c
+            pango/opentype/ftxgsub.c pango/opentype/ftxopen.c
+            pango/opentype/otlbuffer.c pango/opentype/pango-ot-info.c
+            pango/opentype/pango-ot-ruleset.c: Remove includes of
+            internal headers. Small changes to work with ftglue.[ch]
+
+            * pango/opentype/fterrcompat.h: Remove: no longer needed.
+
+            * pango/opentype/ftxgpos.c: Use FT_IS_SFNT(face) rather
+            than poking at FT_MODULE_CLASS (face->driver)->module_name.
+
+            * pango/opentype/ftxopen.c (Free_FeatureList): Free
+            fl->ApplyOrder. (Found by Behdad)
+
+ src/Makefile.am        |   3 +-
+ src/fterrcompat.h      |  95 --------------
+ src/ftglue.c           | 350
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/ftglue.h           | 156 ++++++++++++++++++++++
+ src/ftxgdef.c          |   9 +-
+ src/ftxgpos.c          |   9 +-
+ src/ftxgsub.c          |  10 +-
+ src/ftxopen.c          |   8 +-
+ src/otlbuffer.c        |   4 +-
+ src/pango-ot-info.c    |   6 +-
+ src/pango-ot-ruleset.c |   2 -
+ 11 files changed, 520 insertions(+), 132 deletions(-)
+
+commit 43dbec6f3a345ba0e4a43766610ed59622bbe4a0
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Thu Jul 21 18:15:45 2005 +0000
+
+    Fix up places where there is missing or incomplete Copyright and
+    License
+
+    2005-07-21  Owen Taylor  <otaylor@redhat.com>
+
+            Fix up places where there is missing or incomplete
+            Copyright and License information (Reported by William N. Ray)
+
+            * pango/opentype/fterrcompat.h: Mark as FreeType/GPL licensed.
+
+            * pango/opentype/FT-license.txt: Make this the dual-licensing
+            description that covers the FreeType code (FreeType's
+            LICENSE.TXT) rather than the FTL.
+
+            * pango/opentype/FTL.TXT: Move the FTL (referenced from
+            FT-license.txt) to here.
+
+            * modules/basic/basic-common.h modules/hebrew/hebrew-shaper.h
+            modules/thai/thai-charprop.c modules/thai/thai-shaper.h
+            tools/gen-script-for-lang.c tests/testcolor.c:
+            Add LGPL header and copyright information.
+
+            * modules/indic/indic-ot.[ch]
+            modules/indic/indic-ot-class-tables.c
+            modules/thai/thai-ot.[ch]: Add LGPL header.
+
+            * modules/thai/thai-shaper.c modules/thai/thai-charprop.h:
+            Minor fixes to copyright information.
+
+            * modules/arabic/arabic-ot.c: Add Freetype license
+            boilerplate.
+
+ src/FT-license.txt | 179
+ +++++++----------------------------------------------
+ src/FTL.TXT        | 174
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/fterrcompat.h  |  10 ++-
+ 3 files changed, 204 insertions(+), 159 deletions(-)
+
+commit c55850d36d208c7aae8f6ed5c9e1e7927b988d6c
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Tue Jun 14 19:54:19 2005 +0000
+
+    Chain up from finalize. (#307547, Paolo Borelli)
+
+    2005-06-14  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/pango-ot-info.c (pango_ot_info_finalize)
+            pango/opentype/pango-ot-ruleset.c (pango_ot_ruleset_finalize):
+            Chain up from finalize. (#307547, Paolo Borelli)
+
+            * pango/opentype/pango-ot-info.c (pango_ot_info_finalizer):
+            make accidentally public function static.
+
+ src/pango-ot-info.c    | 4 +++-
+ src/pango-ot-ruleset.c | 2 ++
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 44ff46a364fb7981804eb45329c4999b415711f9
+Author: Tor Lillqvist <tml@novell.com>
+Date:   Tue Apr 12 01:27:21 2005 +0000
+
+    Rename LDADDS to libpango_ot_la_LIBADD to actually make libpango-ot.la
+
+    2005-04-12  Tor Lillqvist  <tml@novell.com>
+
+            * pango/opentype/Makefile.am: Rename LDADDS to
+            libpango_ot_la_LIBADD to actually make libpango-ot.la
+            link with
+            it.
+
+            * pango/pangowin32.def: Rename get_scale_factor to
+            get_metrics_factor here, too. (#300222, Ivan Wong)
+
+ src/Makefile.am | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 0c349a032e5a52a9d0dcc8204f761b7cb28bfa6b
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Thu Mar 3 19:38:02 2005 +0000
+
+    For all binary searches, handle the case where the number of items
+    is 0.
+
+    2005-03-03  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxopen.c (Coverage_Index1, Coverage_Index2,
+            Get_Class2): For all binary searches, handle the case where
+            the number of items is 0. (#162977, Nick Lamb)
+
+            * pango/opentype/ftxgdef.c (TT_GDEF_Build_ClassDefinition):
+            Handle the case where glyph_count == 0 properly. Fix a problem
+            with cleanups on memory allocation failure.
+            (Get_New_Count, Add_Glyph_Property): Avoid reading off the
+            end of the ClassRangeRecord array.
+
+ src/ftxgdef.c | 60
+ +++++++++++++++++++++++++++++++++++------------------------
+ src/ftxopen.c | 15 +++++++++++++++
+ 2 files changed, 51 insertions(+), 24 deletions(-)
+
+commit 03838daaa9d485bffcb7bc46453a9a4c32a1f32f
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Mon Nov 22 23:37:19 2004 +0000
+
+    Set G_LOG_DOMAIN.
+
+    Mon Nov 22 18:30:14 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/Makefile.am pango/Makefile.am
+            modules/*/Makefile.am: Set G_LOG_DOMAIN.
+
+ src/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 346d3b3cac253d2db41205151c185bf2fd9dda16
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Wed Sep 22 18:14:55 2004 +0000
+
+    Cleanups from 'sparse', #149922, Kjartan Maraas
+
+    Wed Sep 22 14:07:47 2004  Owen Taylor  <otaylor@redhat.com>
+
+            Cleanups from 'sparse', #149922, Kjartan Maraas
+
+            * pango/pango-utils.c (read_config): () => (void) in
+            definition.
+
+            * pango/pangofc-fontmap.c (pango_fc_font_map_list_families):
+            Initialize *n_families, not n_families.
+
+            * pango/pangofc-fontmap.c pango/pangoft2.c opentype/ftxgdef.c
+            opentype/ftxgpos.c opentype/ftxgsub.c: : Fix various 0/NULL
+            confusion.
+
+ src/ftxgdef.c | 2 +-
+ src/ftxgpos.c | 6 +++---
+ src/ftxgsub.c | 2 +-
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 8b654dfb5ad6137ee9c5a48f5abe04bf7d28d8cd
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Tue Sep 14 13:45:41 2004 +0000
+
+    === Released 1.6.0 ===
+
+    Mon Sep 13 17:38:58 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * === Released 1.6.0 ===
+
+            * configure.in: Update versions for 1.6.0
+
+            * NEWS: Update.
+
+            * README: Minor tweak.
+
+            * pango/fonts.c pango/pango-context.c pango/pango-types.h
+            pango/pango-utils.c pango/pangoft2.c pango/pango-layout.c
+            pango/opentype/pango-ot-buffer.c: Add a bunch of missing
+            Since: 1.6.
+
+ src/pango-ot-buffer.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit d41089a5b691967fdd622f47c8397a80af104396
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Fri Jul 30 21:23:04 2004 +0000
+
+    Finish extending properties flags from FT_UShort =>
+    FT_UInt. (OTLBuffer
+
+    Fri Jul 30 17:17:05 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgpos.[ch] pango/opentype/ftxgsub.[ch]
+            pango/opentype/ftxopen.[ch]: Finish extending properties
+            flags from FT_UShort => FT_UInt. (OTLBuffer was already
+            using an FT_UInt)
+
+ src/ftxgpos.c | 8 ++++----
+ src/ftxgpos.h | 2 +-
+ src/ftxgsub.c | 8 ++++----
+ src/ftxgsub.h | 2 +-
+ src/ftxopen.c | 2 +-
+ src/ftxopen.h | 2 +-
+ 6 files changed, 12 insertions(+), 12 deletions(-)
+
+commit f42d5eca291dcdfb27d7fbf88391d6d381b8e9c4
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Tue Jul 27 17:20:01 2004 +0000
+
+    Save the order in which features were added and use that when applying
+
+    Tue Jul 27 12:38:05 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxopen.[ch] pango/opentype/ftxgsub.c
+            pango/opentype/ftxpos.c: Save the order in which
+            features were added and use that when applying features.
+            (Patch from Soheil Hassas Yeganeh, #122330)
+
+ src/ftxgpos.c | 41 ++++++++++++++++++++++++-----------------
+ src/ftxgsub.c | 34 +++++++++++++++++++++-------------
+ src/ftxopen.c | 14 +++++++++++---
+ src/ftxopen.h |  2 ++
+ 4 files changed, 58 insertions(+), 33 deletions(-)
+
+commit ae2daa972d74c5ecfe1d2f0057ce12682ad30b00
+Author: Behdad Esfahbod <behdad@src.gnome.org>
+Date:   Tue Jul 27 13:12:19 2004 +0000
+
+    Remove the unused parameter from the IN_CURITEM() and IN_CURGLYPH
+    macros.
+
+
+            * pango/opentype/ftxgpos.c: Remove the unused parameter
+            from the IN_CURITEM() and IN_CURGLYPH macros.
+
+ src/ftxgpos.c | 68
+ +++++++++++++++++++++++++++++------------------------------
+ src/ftxgsub.c |  2 +-
+ 2 files changed, 35 insertions(+), 35 deletions(-)
+
+commit 7d5435ea8cb345c79029b8a12d1bddbed28b1997
+Author: Behdad Esfahbod <behdad@src.gnome.org>
+Date:   Tue Jul 27 10:43:58 2004 +0000
+
+    Fix bug to copy glyph from in_string, not out_string.
+
+
+            * pango/opentype/otlbuffer.c (otl_buffer_copy_output_glyph):
+            Fix bug to copy glyph from in_string, not out_string.
+
+ src/otlbuffer.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2ea2a55bdf7ef1caebcd0c5922b0f542ed8bb5bf
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Mon Jul 26 23:14:53 2004 +0000
+
+    Fix allocation and indexing in NewGlyphClasses array. (#130661,
+    Masatake
+
+    Mon Jul 26 19:11:46 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgdef.c: Fix allocation and indexing
+            in NewGlyphClasses array. (#130661, Masatake YAMATO)
+
+ src/ftxgdef.c | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 5d42695e5ed89f73fbc665792ebec82c29ae04ae
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Mon Jul 26 19:25:45 2004 +0000
+
+    Remove the unused parameter from the IN_CURITEM() and IN_CURGLYPH
+    macros.
+
+    Mon Jul 26 15:24:11 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c (ADD_Glyph): Remove the
+            unused parameter from the IN_CURITEM() and IN_CURGLYPH
+            macros.
+
+ src/ftxgsub.c | 56
+ ++++++++++++++++++++++++++++----------------------------
+ 1 file changed, 28 insertions(+), 28 deletions(-)
+
+commit a00c4ea5626526980139b122977e367b8434d24a
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Mon Jul 26 19:23:06 2004 +0000
+
+    Add missing macro to make the last change actually compile.
+
+    Mon Jul 26 15:21:23 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c: Add missing macro to make the
+            last change actually compile.
+
+ src/ftxgsub.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ed3e1f278d3ebfd224f0b57388502d4bb9fb1441
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Mon Jul 26 19:20:27 2004 +0000
+
+    Match backtrack context against the output glyphs not the input glyphs
+
+    Mon Jul 26 15:16:07 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c (Lookup_ChainContextSubst[123]):
+            Match backtrack context against the output glyphs not
+            the input glyphs (#145174, Aamir Wali)
+
+ src/ftxgsub.c | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit 78282cda004a88b2aadb2786dd3897884e22ed0b
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Mon Jul 26 18:59:02 2004 +0000
+
+    Make Check_Property() take a OTL_GlyphItem, add a gproperties field to
+
+    Mon Jul 26 14:49:22 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * ftxgdef.[ch] otlbuffer.[ch]: Make Check_Property() take a
+            OTL_GlyphItem, add a gproperties field to OTLGlyphItem,
+            and use that to cache the properties for a glyph.
+
+            * ftxgsub.c ftxgdef.c: Adapt to Check_Property() changes.
+
+            * otlbuffer.[ch] ftxgsub.c: Add otl_buffer_copy_output_glyph()
+            to use when we are copying an unmodified glyph from input
+            to output that preserves the cached properties.
+
+ src/ftxgdef.c   | 16 ++++++++++------
+ src/ftxgpos.c   | 52 +++++++++++++++++++++++++++-------------------------
+ src/ftxgsub.c   | 54
+ ++++++++++++++++++++++++++++--------------------------
+ src/ftxopenf.h  |  2 +-
+ src/otlbuffer.c | 21 +++++++++++++++++++--
+ src/otlbuffer.h |  6 ++++++
+ 6 files changed, 91 insertions(+), 60 deletions(-)
+
+commit 81b62af42313fb60db523374cd8c6901829f5c4e
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Mon Jul 19 21:13:23 2004 +0000
+
+    Add support for ChainContextSubstFormat3.
+
+    Mon Jul 19 17:09:11 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/disasm.c: Add support for
+            ChainContextSubstFormat3.
+
+ src/disasm.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+commit d4f773ef92fdbaa7e61e6577db5e9b2846a100a4
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Mon Jul 19 20:37:22 2004 +0000
+
+    Fix pervasive buffer overruns when skipping glyphs when matching
+    contexts.
+
+    Mon Jul 19 16:29:45 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c pango/opentype/ftxgpos.c:
+            Fix pervasive buffer overruns when skipping glyphs
+            when matching contexts. (#118592, Kailash C. Chowksey)
+
+ src/ftxgpos.c | 259 ++++++++++++++++++----------------------
+ src/ftxgsub.c | 376
+ ++++++++++++++++++++++++++--------------------------------
+ 2 files changed, 284 insertions(+), 351 deletions(-)
+
+commit 99848cfafee8e598ef533f254cdb99fbae4c9364
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Wed Jun 23 20:33:35 2004 +0000
+
+    #143693, Sayamindu Dasgupta
+
+    Wed Jun 23 16:13:53 2004  Owen Taylor  <otaylor@redhat.com>
+
+            #143693, Sayamindu Dasgupta
+
+            * pango/opentype/pango-ot-buffer.c
+            (pango_ot_buffer_set_zero_width_marks)
+            pango/opentype/pango-ot-private.h:
+            Allow setting for whether marks should be given zero width,
+            defaulting to FALSE.
+
+            * modules/arabic/arabic-fc.c (arabic_engine_shape): Turn
+            on zero-width-marks setting.
+
+ src/pango-ot-buffer.c  | 22 +++++++++++++++++++++-
+ src/pango-ot-private.h |  5 +++--
+ 2 files changed, 24 insertions(+), 3 deletions(-)
+
+commit 68d4cedb8726fa239f56d62060d8fee7e09cb8be
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Mon Jun 21 18:04:02 2004 +0000
+
+    Use the gcc-3.3 strict-aliasing compatible macros from fterrcompat.h
+
+    Mon Jun 21 13:55:17 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/otlbuffer.c: Use the gcc-3.3
+            strict-aliasing compatible macros from fterrcompat.h
+            (#140495, reported by Stanislav Brabec)
+
+ src/otlbuffer.c | 22 ++++++++++++++--------
+ 1 file changed, 14 insertions(+), 8 deletions(-)
+
+commit b327765176dff81047f942ac56a1d206344e6039
+Author: Theppitak Karoonboonyanan <tkaroonb@src.gnome.org>
+Date:   Fri May 28 16:41:36 2004 +0000
+
+    Negate y offset according to different conventions between
+
+            * pango/opentype/pango-ot-buffer.c (apply_gpos_ltr): Negate
+            y offset
+            according to different conventions between PangoGlyphString
+            and OTL
+            (#142544)
+
+ src/pango-ot-buffer.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 068763b547d791e28b892bcaee810f3d60a83018
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Thu May 27 21:55:50 2004 +0000
+
+    Revert error return changes from last commit.
+
+    Thu May 27 17:54:24 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/otlbuffer.c: Revert error return changes
+            from last commit.
+
+ src/otlbuffer.c | 16 ++++++----------
+ 1 file changed, 6 insertions(+), 10 deletions(-)
+
+commit ef07481025c5bbb9769b9f908d9dc78f44161bbb
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Thu May 27 21:03:42 2004 +0000
+
+    Free buffer->positions, clean up error returns that were returning
+
+    Thu May 27 16:57:30 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/otlbuffer.c: Free buffer->positions,
+            clean up error returns that were returning uninitialized
+            values. (#139239, Behdad Esfahbod)
+
+ src/otlbuffer.c | 21 +++++++++++++--------
+ 1 file changed, 13 insertions(+), 8 deletions(-)
+
+commit de568e7e6200c7a49bae1f78ac63858b8df01173
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Tue Mar 16 19:23:43 2004 +0000
+
+    === Released 1.4.0 ===
+
+    Tue Mar 16 11:24:46 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * === Released 1.4.0 ===
+
+            * configure.in: Version 1.4.0, interface ago 0. Require
+            glib-2.4.0.
+
+            * NEWS: Updates.
+
+            * README: Some updates; include details about the FreeType
+            license of the OpenType code.
+
+ src/FT-license.txt | 77
+ +++++++++++++++++++++++++++++-------------------------
+ 1 file changed, 42 insertions(+), 35 deletions(-)
+
+commit 8b3554b3afe7c125b1a53171b01ac87de9c486fe
+Author: Hans Breuer <hans@breuer.org>
+Date:   Wed Mar 3 22:35:19 2004 +0000
+
+    if PANGO_MODULE_PREFIX is defined include the basic backend shaper
+    (should
+
+    2004-03-03  Hans Breuer  <hans@breuer.org>
+
+            * pango/module-defs-win32.c.win32 : if PANGO_MODULE_PREFIX is
+            defined include the basic backend shaper (should have been
+            commited at 2003-12-12, too)
+
+            * pango/makefile.msc : generate correct type for PangoFontMask
+            (bug #135892, John Ehresman)
+            * pango/opentype/makefile.msc : updated
+
+            * pango/pango.def pango/pangoft2.def : more updatd externals
+
+ src/makefile.msc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit a7e096c5de3ec5319bf9333c9ace0732d97c52c3
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sun Feb 29 15:44:50 2004 +0000
+
+    Rework opentype interfaces and other changes to make GPOS work
+    for Arabic.
+
+    Sun Feb 29 09:25:13 2004  Owen Taylor  <otaylor@redhat.com>
+
+            Rework opentype interfaces and other changes to make GPOS
+            work for Arabic. (Most of #117282, #121060)
+
+            * pango/opentype/otlbuffer.[ch]: OTL_Buffer that
+            acts as a replacement for the separate GSUB and
+            GPOS string structures and hides many of the internal
+            details.
+
+            * pango/opentype/ftxgsub.[ch] pango/opentype/ftxgpos.[ch]:
+            Adapt to OTL_Buffer.
+
+            * pango/opentype/ftxgpos.c: Redo handling of cursive
+            chains so that it actually works.
+
+            * pango/pango-ot.h pango/opentype/pango-ot-buffer.c:
+            Pango wrapper around OTL_Buffer.
+
+            * pango/pango-ot.h pango/pango-ot-ruleset.c
+            pango/pango-ot-buffer.c:
+            Split pango_ot_ruleset_shape() into
+            pango_ot_ruleset_substitute(),
+            pango_ot_ruleset_position(), make them act on
+            PangoOTBuffer, add a separate pango_ot_buffer_output()
+            which does the default positioning and writes to a
+            PangoGlyphString.
+
+            * modules/arabic/arabic-fc.c modules/indic/indic-fc.c
+            modules/indic/mprefixups.[ch]: Adapt to new OpenType
+            interfaces; add GPOS features for Arabic.
+
+            * pango/opentype/pango-ot-info.c: Don't derive class
+            information
+            from Unicode properties for Arabic presentation forms,
+            let the shaping process derive the properties.
+
+ src/Makefile.am        |   3 +
+ src/ftxgdef.c          |   4 +-
+ src/ftxgpos.c          | 573 ++++++++++++++++-----------------------
+ src/ftxgpos.h          |  23 +-
+ src/ftxgsub.c          | 719
+ +++++++++++--------------------------------------
+ src/ftxgsub.h          |  40 +--
+ src/ftxopen.h          |   1 +
+ src/otlbuffer.c        | 213 +++++++++++++++
+ src/otlbuffer.h        |  97 +++++++
+ src/ottest.c           |   2 +
+ src/pango-ot-buffer.c  | 265 ++++++++++++++++++
+ src/pango-ot-info.c    |  27 +-
+ src/pango-ot-private.h |   8 +
+ src/pango-ot-ruleset.c | 148 +++-------
+ 14 files changed, 1039 insertions(+), 1084 deletions(-)
+
+commit d670ddf99192dd4999775a9215a818ae63fa3416
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sat Feb 21 14:53:12 2004 +0000
+
+    Sign convention for y offsets is opposite between PangoGlyphString
+    and FT
+
+    Sat Feb 21 09:49:23 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/pango-ot-ruleset.c (pango_ot_ruleset_shape):
+            Sign convention for y offsets is opposite between
+            PangoGlyphString and FT code. (#132591)
+
+ src/pango-ot-ruleset.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b9b3c131c2b57c12a77124a52512fb19a1255f8e
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Fri Feb 13 16:11:40 2004 +0000
+
+    Memory leak fixes from Masatake YAMATO, #130652
+
+    Fri Feb 13 10:54:18 2004  Owen Taylor  <otaylor@redhat.com>
+
+            Memory leak fixes from Masatake YAMATO, #130652
+
+            * pango/opentype/ftxgdef.c (TT_Done_GDEF_Table):
+            Free the gdef table as well as the contained data.
+
+            * pango/opentype/ftxgdef.c (TT_GDEF_Build_ClassDefinition):
+            Set gcd->loaded, so that the contents get freed later.
+
+ src/ftxgdef.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 926b8f322989298e43c8bac85f23e3525470a669
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Mon Jan 26 19:23:35 2004 +0000
+
+    Suport CFF fonts as well. (#131202, Manjunath Sripadarao)
+
+    Mon Jan 26 14:20:34 2004  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/pango-ot-info.c (is_truetype): Suport
+            CFF fonts as well. (#131202, Manjunath Sripadarao)
+
+ src/pango-ot-info.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 945e479a3a35769e5e7c792fdcf306892523a5f9
+Author: Hans Breuer <hans@breuer.org>
+Date:   Sat Dec 13 14:31:50 2003 +0000
+
+    moved pango_fc_* to the latter where they live on *nix too.
+
+    2003-12-13  Hans Breuer  <hans@breuer.org>
+
+            * pango/pango.def pangoft2.def : moved pango_fc_*
+            to the latter where they live on *nix too.
+
+            * pango/makefile.msc : make it build again (including
+            the Ft2 backend)
+
+            * pango/module-defs-fc.c.win32 : if PANGO_MODULE_PREFIX
+            is defined
+            include the basic backend shaper
+
+            * pango/pangowin32.c (pango_win32_render_layout) :
+            initialize iter before first usage to avoid immediate crashing
+
+            * pango/opentype/makefile.msc
+                pango/modules/makefile.msc : finally build with mscv, too.
+            [completely untested cause I'm not able to type, write or read
+            any of these languages]
+
+            * modules/modules.def : follow module function
+            renaming/changes
+
+            * modules/basic/basic-win32.c : register the right engine,
+            i.e.
+            make it compile
+
+ src/makefile.msc | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit ba0ccd5cfcb514cdc45373158343138b7b190f9d
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sat Nov 1 15:02:17 2003 +0000
+
+    Switch over to recommended Freetype system of include ft2build.h then
+
+    Sat Nov  1 09:32:15 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/pango-ot.h pango/pangofc-font.h
+            modules/indic/indic-ot.h
+            pango/pangoft2.c pango/opentype/pango-ot-info.c
+            pango/opentype/pango-ot-ruleset.c pango/opentype/ottest.c
+            pango/opentype/ftxopen.[ch] pango/opentype/ftxgdef.c
+            pango/opentype/ftxgsub.c pango/opentype/ftxgpos.c:
+            Switch over to recommended Freetype system of
+            include ft2build.h then #include FT_FREETYPE_H.
+            Fixes ftmodule.h problem with current Freetype CVS.
+            (#125548)
+
+ src/ftxgdef.c          | 14 +++++++-------
+ src/ftxgpos.c          | 17 ++++++++---------
+ src/ftxgsub.c          | 13 ++++++-------
+ src/ftxopen.c          | 10 +++++-----
+ src/ftxopen.h          |  3 ++-
+ src/ottest.c           |  1 -
+ src/pango-ot-info.c    |  4 ++--
+ src/pango-ot-private.h |  2 --
+ src/pango-ot-ruleset.c |  4 ++--
+ 9 files changed, 32 insertions(+), 36 deletions(-)
+
+commit 558171a7a3666999c679719ad0bfbdf7c6a52289
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Mon Sep 15 22:04:55 2003 +0000
+
+    Fix gcc-3.3 versions of macros to have the right return value.
+
+    Mon Sep 15 17:16:59 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/fterrcompat.h: Fix gcc-3.3 versions of
+            macros to have the right return value.
+
+ src/fterrcompat.h | 44 ++++++++++++++++++++++++++------------------
+ 1 file changed, 26 insertions(+), 18 deletions(-)
+
+commit c99259bf7e08ccdc4130d4983e8d186021ea8e1a
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Mon Aug 25 14:30:12 2003 +0000
+
+    pango/opentype/ftxgsub.c (Lookup_ChainContextSubst3) Fix problems
+    where
+
+    Mon Aug 25 10:17:21 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c (Lookup_ChainContextSubst3)
+            * pango/opentype/ftxgpos.c (Lookup_ChainContextPos3):
+            Fix problems where the coverage wasn't being checked
+            for the first input glyph. (#118639, Kailash C. Chowksey)
+
+ src/ftxgpos.c | 7 +++----
+ src/ftxgsub.c | 7 +++----
+ 2 files changed, 6 insertions(+), 8 deletions(-)
+
+commit bcf81bcc80c6235dfbc7eeaa34ed21ea329c7a3d
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Fri Aug 22 22:52:08 2003 +0000
+
+    Add some macro definitions for gcc-3.3 that suppress the bogus
+
+    Fri Aug 22 18:09:52 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/fterrcompat.h: Add some macro definitions
+            for gcc-3.3 that suppress the bogus strict-aliasing
+            warnings.
+
+            * pango/pango-utils.c (read_config_file): Use
+            g_hash_table_new_full() to simplify code and fix
+            gcc-3.3 warnings.
+
+            * pango/pangox-fontmap.c (pango_x_real_get_coverage_win)
+            * pango/querymodules.c (query_module): Suppress gcc-3.3
+            warnings.
+
+            * pango/modules.c (pango_find_map): Fix warning from
+            missing declaration of pango_module_get_type().
+
+            * pango/pango-context.c/pango-engine.c: Fix name confusion
+            for pango_get_fallback_shaper().
+
+ src/fterrcompat.h | 36 ++++++++++++++++++++++++++++++++++--
+ 1 file changed, 34 insertions(+), 2 deletions(-)
+
+commit 46d379596d7292a3b2e51f35fc8044b366d413a3
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Tue Jul 29 14:21:54 2003 +0000
+
+    Rewrite handling of IGNORE_SPECIAL_MARKS to be properly "ignore
+    marks of
+
+    Tue Jul 29 09:58:13 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgdef.c (Check_Property): Rewrite
+            handling of IGNORE_SPECIAL_MARKS to be properly
+            "ignore marks of attachment type different than
+            specified. (#118456, Kailash C. Chowksey)
+
+ src/ftxgdef.c | 37 ++++++++++++++++++++++++++++---------
+ 1 file changed, 28 insertions(+), 9 deletions(-)
+
+commit 8247acad79c1a4154e9337aed453eb3e4d23063d
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Mon Jul 28 22:28:37 2003 +0000
+
+    Revert back out the FreeType patch preventing ligatures of
+    not-originally
+
+    Sat Jul 26 09:41:22 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c (Lookup_LigatureSubst):
+            Revert back out the FreeType patch preventing
+            ligatures of not-originally adjacent glyphs;
+            it doesn't work for all scripts. (#118472,
+            Kailash C. Chowksey)
+
+ src/ftxgsub.c | 31 +++----------------------------
+ 1 file changed, 3 insertions(+), 28 deletions(-)
+
+commit 825e6d7e86cac310161648601b09291fa05d5ba5
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sun Jul 27 02:40:31 2003 +0000
+
+    Check for lookahead glyphs in the right place. (Patch from #116860)
+
+    Sat Jul 26 22:30:59 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c (Lookup_ChainContextSubst{1,2,3}):
+            Check for lookahead glyphs in the right place. (Patch
+            from #116860)
+
+            * pango/opentype/ftxgpos.c (Lookup_ChainContextPos{1,2,3}):
+            Same fix here.
+
+ src/ftxgpos.c | 6 +++---
+ src/ftxgsub.c | 6 +++---
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 03a0fe09c711b81c7eb4065fd4700b8cfd2c977a
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sun Jul 27 02:19:52 2003 +0000
+
+    Fix return value to only contain TTO_Err_Not_Covered if *no* lookups
+
+    Sat Jul 26 22:12:46 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c (Do_String_Lookup,
+            TT_GSUB_Apply_String): Fix return value to only
+            contain TTO_Err_Not_Covered if *no* lookups
+            matched. Fix memory leaks on error in Apply_String().
+
+ src/ftxgsub.c | 120
+ ++++++++++++++++++++++++++++++++++++----------------------
+ 1 file changed, 75 insertions(+), 45 deletions(-)
+
+commit e10ea2afd9a5868d4ec1ff3a2b99bcd64ce45816
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sun Jul 27 01:10:15 2003 +0000
+
+    Fix confusion between boolean and FT_Error return. (GSUB equivalent
+    of fix
+
+    Sat Jul 26 21:06:26 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c (Load_EmptyOrClassDefinition):
+            Fix confusion between boolean and FT_Error return.
+            (GSUB equivalent of fix for #108358)
+
+ src/ftxgsub.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit a7305ab2624cbc08160dc11587ba3dc4e17781c2
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sat Jul 26 15:02:13 2003 +0000
+
+    Move allocation afer initial checks, fixing memory leak.
+
+    Sat Jul 26 10:52:20 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgpos.c (Lookup_ContextPos2):
+            * pango/opentype/ftxgsub.c (Lookup_ContextSubst2): Move
+            allocation afer initial checks, fixing memory leak.
+
+            * pango/opentype/ftxgsub.c (Lookup_ChainContextSubst2):
+            Fix some more error return memory leaks that weren't
+            fixed in the Qt changes.
+
+ src/ftxgpos.c |  8 ++++----
+ src/ftxgsub.c | 12 ++++++------
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+commit f40b7c15e0bc4b71e706602c4e062f72d8f0fcdd
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sat Jul 26 14:50:23 2003 +0000
+
+    Fix various memory leaks from error returns that should have been
+    jumps to
+
+    Sat Jul 26 10:43:20 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c pango/opentype/ftxgpos.c:
+            Fix various memory leaks from error returns that should
+            have been jumps to cleanup blocks. (From Qt, Lars Knoll)
+
+ src/ftxgpos.c | 8 ++++----
+ src/ftxgsub.c | 4 ++--
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 256d21970733483833b9cf31d5e0fa7ae853e944
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sat Jul 26 14:35:29 2003 +0000
+
+    Fix additional places where TTO_Err_Not_Covered wasn't considered a
+
+    Sat Jul 26 10:30:24 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgpos.c: Fix additional places where
+            TTO_Err_Not_Covered wasn't considered a successful return
+            from Get_Class. (From Qt, Lars Knoll)
+
+ src/ftxgpos.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 374960681e2e36d0e4032623d8cb92a7910baf71
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sat Jul 26 13:50:23 2003 +0000
+
+    If applying a ligature lookup makes adjacent two glyphs that were not
+
+    Sat Jul 26 09:41:22 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c (Lookup_LigatureSubst):
+            If applying a ligature lookup makes adjacent two glyphs
+            that were not originally adjacent, avoid making
+            subsequent ligatures between those glyphs.
+            (From FreeType, Werner Lemberg, 2001-08-22, 2001-08-23)
+
+ src/ftxgsub.c | 31 ++++++++++++++++++++++++++++---
+ 1 file changed, 28 insertions(+), 3 deletions(-)
+
+commit b682482df77608d67eca8a050db5b36f44953c13
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sat Jul 26 13:20:52 2003 +0000
+
+    Fix some FreeType1 variable declarations that snuck in from the last
+
+    Sat Jul 26 09:16:57 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgpos.c pango/opentype/ftxopen.c:
+            Fix some FreeType1 variable declarations that snuck
+            in from the last commits (Christophe Fergeau,
+            118363)
+
+ src/ftxgpos.c | 6 +++---
+ src/ftxopen.c | 2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 06c12109de061c357f46dcec82c4bee7160afede
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sat Jul 26 03:45:44 2003 +0000
+
+    OpenType-1.4 update: backtrack information is stored with the
+    item closest
+
+    Fri Jul 25 23:38:07 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgpos.c pango/opentype/ftxgsub.c:
+            OpenType-1.4 update: backtrack information is stored with the
+            item closest to the input first (From FreeType,
+            Werner Lemberg, 2002-09-26)
+
+ src/ftxgpos.c | 26 ++++++++++++++++++--------
+ src/ftxgsub.c | 24 +++++++++++++++++-------
+ 2 files changed, 35 insertions(+), 15 deletions(-)
+
+commit 15a69e4a12739e7392f2a38d6f7bfdd96c0dc3ba
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sat Jul 26 03:14:23 2003 +0000
+
+    Update of GPOS and GSUB support to OpenType 1.3 (From FreeType, Werner
+
+    Fri Jul 25 23:07:06 2003  Owen Taylor  <otaylor@redhat.com>
+
+            Update of GPOS and GSUB support to OpenType 1.3
+            (From FreeType, Werner Lemberg, 2001-08-08)
+
+            * pango/opentype/ftxopen.h: Add RIGHT_TO_LEFT LookupFlag
+
+            * pango/opentype/ftxgpos.c (GPOS_Instance): Add 'first'
+            member to mark the beginning of a chain of cursive
+            connections.
+
+            * pango/opentype/ftxgpos.c (Do_String_Lookup): If the
+            RIGHT_TO_FLAG flag is set, shift cursive chain up so
+            last glyph is on the baseline.
+
+ src/ftxgpos.c | 25 ++++++++++++++++++++++++-
+ src/ftxopen.h |  8 ++++++--
+ 2 files changed, 30 insertions(+), 3 deletions(-)
+
+commit 6f74f18b77402f3adf5bfbae26e8f44de6543b4e
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sat Jul 26 03:03:40 2003 +0000
+
+    Add GPOS_LOOKUP_EXTENSION, GSUB_LOOKUP_EXTENSION, which allow lookup
+
+    Fri Jul 25 22:59:13 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftx{gpos,gsub}.h pango/opentype/ftxgdef.c:
+            Add GPOS_LOOKUP_EXTENSION, GSUB_LOOKUP_EXTENSION, which
+            allow lookup information to be stored at 32-bit offets
+            via a double indirection. (From FreeType, Werner Lemberg,
+            2001-08-08)
+
+ src/ftxgpos.h | 17 +++++++++--------
+ src/ftxgsub.h |  1 +
+ src/ftxopen.c | 19 +++++++++++++++++++
+ 3 files changed, 29 insertions(+), 8 deletions(-)
+
+commit 375781c4546b5cfc453b99551ddf715bb162ffb9
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sat Jul 26 02:44:19 2003 +0000
+
+    Fix a couple of places where TTO_Err_Not_Covered wasn't considered a
+
+    Fri Jul 25 22:25:48 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c (Lookup_ContextSubst2,
+            Lookup_ChainContextSubst2): Fix a couple of
+            places where TTO_Err_Not_Covered wasn't considered
+            a successful return from Get_Class -- it means
+            use class index 0. (From FreeType, Werner Lemberg,
+            2001-08-06)
+
+ src/ftxgsub.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 378e1889cd294cb77313ba7fdab3e52959bf2c40
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sat Jul 26 02:10:42 2003 +0000
+
+    Improvements to OpenType-dumping code, based on changes in Qt by Lars
+
+    Fri Jul 25 20:12:00 2003  Owen Taylor  <otaylor@redhat.com>
+
+            Improvements to OpenType-dumping code, based on
+            changes in Qt by Lars Knoll.
+
+            * pango/opentype/ottest.c: Tweak the debugging output,
+            suppress some warnings.
+
+            * pango/opentype/disasm.c: Add support for
+            GSUB Context/Chain GPOS MarkBase lookups, improve
+            output in various ways.
+
+ src/disasm.c | 242
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ src/ottest.c |  12 +--
+ 2 files changed, 241 insertions(+), 13 deletions(-)
+
+commit 07bad0e77c42b5f2535e3b018bf9074d2f4ecc7c
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Thu Jul 24 21:05:29 2003 +0000
+
+    Fix uses of g_assert() around statements with side effects. (#115498,
+
+    Thu Jul 24 17:04:21 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/pango-ot-ruleset.c (pango_ot_ruleset_shape):
+            Fix uses of g_assert() around statements with side effects.
+            (#115498, patch from David Cuthbert)
+
+ src/pango-ot-ruleset.c | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit f91deef2c9473da5c3cb5e120f2d4fbf0d638166
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Wed Apr 16 21:48:29 2003 +0000
+
+    More careful handling of face->charmap; if is NULL, try to set
+    a unicode
+
+    Wed Apr 16 03:46:42 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/pango-ot-info.c (synthesize_class_def):
+            More careful handling of face->charmap; if is NULL,
+            try to set a unicode charmap, if that doesn't succeed,
+            return. (Hopefully fixes #106550)
+
+ src/pango-ot-info.c | 26 ++++++++++++++++++++++++--
+ 1 file changed, 24 insertions(+), 2 deletions(-)
+
+commit 587b3940f3ce71e8e1c9950086923d4eb78d62db
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Wed Apr 16 03:58:17 2003 +0000
+
+    When loading in Load_Chain{Sub,Pos}ClassRule, the limit we have only
+
+    Tue Apr 15 11:49:39 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxg{sub/pos}.c: When loading
+            in Load_Chain{Sub,Pos}ClassRule, the limit we
+            have only applies to the input ClassDef table.
+            Fixes problem with Arial Unicode. Much help from
+            Noah Levitt in tracing this down.
+
+ src/ftxgpos.c | 7 ++++---
+ src/ftxgsub.c | 7 ++++---
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+commit 0d7567f8eaa1f8d0ec9cb89218ce3a1475d258ac
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Tue Apr 15 23:01:19 2003 +0000
+
+    Fix mispelled constant from last commit.
+
+    Tue Apr 15 06:57:02 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgpos.c: Fix mispelled constant
+            from last commit.
+
+ src/ftxgpos.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 73cd600798a9a7225b2ac8241ea371d48cf7baf3
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Tue Apr 15 22:15:41 2003 +0000
+
+    Fix confusion between boolean and FT_Error return. (#108358,
+    Noah Levitt)
+
+    Tue Apr 15 06:03:39 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgpos.c: Fix confusion between
+            boolean and FT_Error return. (#108358, Noah Levitt)
+
+            * pango/opentype/ftxopen.c (Get_Class1): index is
+            allowed to be NULL. (#108358, Noah Levitt)
+
+ src/ftxgpos.c | 5 +++--
+ src/ftxopen.c | 3 ++-
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit 462bd0be608c3d14e5b4c01099b02b3948a52369
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Tue Apr 15 21:05:53 2003 +0000
+
+    Fix infinite loop in the case where the charmap contains a character >
+
+    Tue Apr 15 05:00:39 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/pango-ot-info.c (synthesize_class_def):
+            Fix infinite loop in the case where the charmap contains
+            a character > 65535. (#106550, Morten Welinder.)
+
+ src/pango-ot-info.c | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 312e1c1cf9f2c1e2137b9aaa5181a541447923cb
+Author: James Henstridge <james@daa.com.au>
+Date:   Tue Mar 11 12:31:16 2003 +0000
+
+    make similar changes to the ones on glib head (call gtk-docize, etc).
+
+    2003-03-11  James Henstridge  <james@daa.com.au>
+
+        * autogen.sh: make similar changes to the ones on glib head (call
+        gtk-docize, etc).
+
+        * configure.in: move some calculations into M4 macros, rather than
+        calculating them when configure runs.
+        Use AC_HELP_STRING where appropriate.
+        Replace gtk-doc checks with a call to GTK_DOC_CHECK.
+        Replace AC_OUTPUT_COMMANDS() call with a number of calls to
+        AC_CONFIG_COMMANDS (once per created file).
+        Get rid of the "chmod +x pango-config" bit, because there is no
+        pango-config anymore.
+
+        * Makefile.am: get rid of custom distcheck rule, and set
+        DISTCHECK_CONFIGURE_FLAGS, which is equivalent.
+        Use += to select which .pc files to install.
+
+        * pango/Makefile.am: Add rules to rebuild module-defs* files, and
+        remove them on clean.
+        Reorder so that rules related to each individual library are next
+        to each other.
+        Use BUILT_SOURCES for built sources.
+
+        * pango/opentype/Makefile.am: don't use STRIP_BEGIN/STRIP_END.
+
+        * modules/*/Makefile.am: simplify module makefiles through use of
+        +=, and regularise them a bit (fixed a few bugs in the process).
+
+        * docs/Makefile.am: remove common rules, and instead include
+        gtk-doc.make.
+
+        * examples/Makefile.am: add pango.modules to CLEANFILES.
+
+        * tests/Makefile.am: remove temporary files on clean.
+
+ src/Makefile.am | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+commit 1aad15fd0c007c9075f2f7f4c4cacf576d726eea
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Mon Feb 17 22:04:29 2003 +0000
+
+    Add an --enable-debug configure argument defaulting to 'yes'
+    for unstable
+
+    Mon Feb 17 13:06:39 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * configure.in **/Makefile.am: Add an --enable-debug
+            configure argument defaulting to 'yes' for unstable
+            releases and 'minimum' for stable releases.
+            For minimum, -DG_DISABLE_CAST_CHECKS.
+
+            * pango/pangofc-fontmap.cI pango/pangoft2-fontmap.c
+            pango/pangoxft-fontmap.c: Add caching of fontsets
+            (#104495, initial patch and review by Soeren Sandmann)
+
+            * pango/pangofc-fontmap.cI pango/pangoft2-fontmap.c
+            pango/pangoxft-fontmap.c pango/pangoft2-private.h
+            pango/pangoxft-private.h: Remove cache of recently freed
+            fonts; not necessary now that we cache fontsets.
+
+            * pango/pangofc-fontmap.cI (pango_fc_pattern_set_free):
+            Rename from pango_fc_font_set_free to reflect
+            what it actually does.
+
+            * pango/pangofc-fontmap.cI pango/pangoft-fontmap.c
+            pango/pangoxft-fontmap.c: Combine clear-the-cache
+            functions; we didn't need separate clear-the-font-cache
+            and clear-the-pattern-cache functions.
+
+ src/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5febce1ffc956ea44526d50be7cf14c69c66cb34
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Wed Feb 12 22:12:55 2003 +0000
+
+    Up the FreeType version requirement to 2.0.9. (2.2.1 had a compilation
+
+    Wed Feb 12 16:59:23 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * configure.in pango/opentype/fterrcompat.h README:
+            Up the FreeType version requirement to 2.0.9.
+            (2.2.1 had a compilation failure with older versions,
+            this catches it more cleanly, and removes some unneeded
+            checks. #105302, problem reported by Will Partain.)
+
+ src/fterrcompat.h | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 54e85cc0cf3700d2c4af5396d79bd0e40df8f0da
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sat Jan 11 00:16:26 2003 +0000
+
+    Export TT_New_GDEF_Table to create an empty GDEF table.
+
+    Fri Jan 10 18:56:36 2003  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgdef.c: Export TT_New_GDEF_Table
+            to create an empty GDEF table.
+
+            * pango/opentype/pango-ot-info.c: If the font doesn't
+            have a class definition table, synthesize one using
+            the charmap and the unicode properties of characters
+            in the charmap. (Needed to make things work with various
+            old Arabic fonts, such as the KACST fonts)
+
+ src/ftxgdef.c       |  46 +++++++++++++++-------
+ src/ftxgdef.h       |   4 ++
+ src/pango-ot-info.c | 108
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 144 insertions(+), 14 deletions(-)
+
+commit db6bb4b034d4d8d546fc9bdc4ad28b16bb7f1bb7
+Author: Matthias Clasen <matthiasc@src.gnome.org>
+Date:   Thu Nov 28 23:53:18 2002 +0000
+
+    Add docs.
+
+            * docs/tmpl/xft-fonts.sgml:
+            * docs/tmpl/freetype-fonts.sgml: Add docs.
+
+            * pango/pangoxft-fontmap.c (pango_xft_substitute_changed):
+            * pango/pangoft2-fontmap.c
+            (pango_ft2_font_map_set_default_substitute):
+            Fix doc typos.
+
+ src/pango-ot-info.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 226d9b67db852eb29ad37ec8121b79f3ea6f0b73
+Author: Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+Date:   Tue Nov 26 13:37:10 2002 +0000
+
+    Do not add GLIB_CFLAGS to CFLAGS.
+
+
+    2002-11-26  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+            * configure.in: Do not add GLIB_CFLAGS to CFLAGS.
+
+            * docs/Makefile.am, examples/Makefile.am,
+            modules/arabic/Makefile.am, modules/basic/Makefile.am,
+            modules/hangul/Makefile.am, modules/hebrew/Makefile.am,
+            modules/indic/Makefile.am, modules/tamil/Makefile.am,
+            modules/thai/Makefile.am, pango/Makefile.am,
+            pango/mini-fribidi/Makefile.am, pango/opentype/Makefile.am:
+            Instead add $(GLIB_CFLAGS) directly to INCLUDES (GTKDOC_CFLAGS
+            for
+            docs/Makefile.am). Also some cosmetic line wrapping and
+            reindentation.
+
+ src/Makefile.am | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 80634a30b9abdf575320bc6fdacdba4e1ea3903d
+Author: Manish Singh <yosh@gimp.org>
+Date:   Mon Oct 14 22:50:48 2002 +0000
+
+    Get rid of unnecessary casts for g_object_{ref,unref}
+
+    Mon Oct 14 15:39:41 2002  Manish Singh  <yosh@gimp.org>
+
+            * pango/pango-context.c pango/pango-layout.c pango/pangoft2.c
+            pango/pangowin32-fontmap.c pango/pangowin32.c
+            pango/pangox-fontmap.c
+            pango/pangox.c pango/pangoxft-font.c pango/pangoxft-fontmap.c
+            pango/testfonts.c pango/opentype/pango-ot-ruleset.c:
+            Get rid of unnecessary casts for g_object_{ref,unref}
+
+ src/pango-ot-ruleset.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 741993e0b15b4df86d76fa8df5055bd764c42c71
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sun Sep 29 19:06:58 2002 +0000
+
+    ligatures can be also used in MarkBasePos lookups. (2001-03-17 Werner
+
+    Sun Sep 29 14:55:36 2002  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgpos.c: ligatures can be also used in
+            MarkBasePos lookups. (2001-03-17  Werner Lemberg)
+
+ src/ftxgpos.c | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+commit a35dc445e86ab433fe9f3937c95f2c1f18f58110
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Sun Sep 29 19:05:01 2002 +0000
+
+    Start of merges from freetype1 of OpenType fixes.
+
+    Sun Sep 29 14:51:25 2002  Owen Taylor  <otaylor@redhat.com>
+
+            Start of merges from freetype1 of OpenType fixes.
+
+            (2001-03-17  Werner Lemberg)
+
+            * pango/opentype/ftxgdef.c pango/opentype/ftxgpos.c
+            pango/opentype/ftxg\sub.c:
+            More fixes for special marks.
+
+ src/ftxgdef.c | 13 ++++++++-----
+ src/ftxgpos.c |  6 +++---
+ src/ftxgsub.c |  4 ++--
+ 3 files changed, 13 insertions(+), 10 deletions(-)
+
+commit 5c53f14f371b349da65dfa3a848b17ab89ce3ba8
+Author: Tor Lillqvist <tml@iki.fi>
+Date:   Mon Sep 23 21:45:31 2002 +0000
+
+    Remove. Not used. (A static library is built here. Exported entries
+    are in
+
+    2002-09-24  Tor Lillqvist  <tml@iki.fi>
+
+            * pango/opentype/pango-ot.def: Remove. Not used. (A static
+            library
+            is built here. Exported entries are in ../pangoft2.def.)
+
+            * pango/opentype/Makefile.am (EXTRA_DIST): Remove from
+            here, too.
+
+ src/Makefile.am  |  3 +--
+ src/pango-ot.def | 50 --------------------------------------------------
+ 2 files changed, 1 insertion(+), 52 deletions(-)
+
+commit 35e4593ccd9ea5ed78f1e6f32f04b3a13cee0145
+Author: Tor Lillqvist <tml@iki.fi>
+Date:   Mon Sep 23 21:19:30 2002 +0000
+
+    pango/makefile.mingw.in pango/mini-fribidi/makefile.mingw Remove. Not
+
+    2002-09-23  Tor Lillqvist  <tml@iki.fi>
+
+            * pango/makefile.mingw.in
+            * pango/mini-fribidi/makefile.mingw
+            * pango/opentype/makefile.mingw.in: Remove. Not maintained.
+
+            * pango/Makefile.am (EXTRA_DIST)
+            * pango/mini-fribidi/Makefile.am (EXTRA_DIST)
+            * pango/opentype/Makefile.am (EXTRA_DIST): Remove
+            makefile.mingw(.in) from here, too.
+
+            * configure.in (AC_OUTPUT): Don't try to output above removed
+            files.
+
+ src/Makefile.am       |  3 +--
+ src/makefile.mingw.in | 43 -------------------------------------------
+ 2 files changed, 1 insertion(+), 45 deletions(-)
+
+commit fb279cb0bf676bb1d225e6a296282523d839074d
+Author: Eric Mader <emader@src.gnome.org>
+Date:   Mon Sep 9 18:11:55 2002 +0000
+
+    Correctly handle back, new_advance.
+
+ src/pango-ot-ruleset.c | 25 ++++++++++++++++---------
+ 1 file changed, 16 insertions(+), 9 deletions(-)
+
+commit c880e814a50100577811a8a51bc06b4275c55a7e
+Author: Eric Mader <emader@src.gnome.org>
+Date:   Fri Sep 6 22:45:23 2002 +0000
+
+    Don't fail when reading an empty script.
+
+ src/ftxopen.c | 36 +++++++++++++++++++++++++-----------
+ src/ftxopen.h |  1 +
+ 2 files changed, 26 insertions(+), 11 deletions(-)
+
+commit 441e7d0292bf1a06396daac80fcbad23976a824d
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Wed Aug 7 17:01:52 2002 +0000
+
+    Offset to MarkAttachClassDef is offset to table, not offset to
+    offset to
+
+    Wed Aug  7 12:32:39 2002  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c (TT_Load_GSUB_Table):
+            Offset to MarkAttachClassDef is offset to table,
+            not offset to offset to table.
+
+            * pango/opentype/ftxopen.c (Get_Device): Handle
+            NULL device tables which we represent with
+            d->DeltaValue == NULL.
+
+ src/ftxgsub.c | 13 -------------
+ src/ftxopen.c |  2 +-
+ 2 files changed, 1 insertion(+), 14 deletions(-)
+
+commit 48a16fa8090b67b046b2bb686ff4f6f038a2b8e8
+Author: Owen Taylor <otaylor@src.gnome.org>
+Date:   Tue Jun 4 00:20:51 2002 +0000
+
+    on Jun  3 18:56:09 2002  Owen Taylor  <otaylor@redhat.com>
+
+            Xft2 and fontconfig conversion, based largely on a patch
+            from Keith Packard.
+
+            * configure.in acconfig.h: Add checks for fontconfig, switch
+            Xft checks to switch for Xft2 using pkg-config.
+
+            * pangoxft.pc.in pangoxft.pc.in
+            modules/{arabic,basic,hebrew,indic,tamil}/Makefile.am
+            pango/Makefile.am: Reflect new Xft/fontconfig dependencies.
+
+            * pango/pangoxft-private.h pango/pangoxft-fontmap.c
+            modules/arabic/arabic-xft.c modules/indic/indic-xft.c:
+            Switch over to using Xft2 and fontconfig.
+
+            * pango/pangoft2.c pango/pangoft2-fontmap.c
+            pango/pangoft2-private.h
+            pango/pango/Makefile.am: Remove usage of mini-xft in
+            favor of fontconfig.
+
+            * pango/pango-ot.h pango/opentype/pango-ot-info.c
+            pango/pangoxft.h
+            modules/arabic/arabic-{xft,ft2}.c modules/indic/indic-xft.c:
+            Attach OpenType information directly to the FT_Face
+            structure using FT_Generic.
+
+            * modules/tamil/Makefile.am modules/tamil/tamil-xft.c
+            configure.in: Remove this module, no longer needed.
+
+            * pango/pangoxft-font.c (pango_xft_real_render): Coalesce
+            calls to Xft rendering functions.
+
+ src/pango-ot-info.c | 29 +++++++++++++++++++++++------
+ 1 file changed, 23 insertions(+), 6 deletions(-)
+
+commit 9df9af0b3615dc6a52d784233a3410a9080d9369
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Fri May 10 18:44:47 2002 +0000
+
+    Fix acess outside of a loaded frame and some memory leaks on failure.
+
+    Fri May 10 14:41:27 2002  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgdef.c (TT_Load_GDEF_Table): Fix acess
+            outside of a loaded frame and some memory leaks
+            on failure.
+
+ src/ftxgdef.c | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+commit a63dbbbeeb91ebf4ded2fc788f5810a3bd1e14fe
+Author: Eric Mader <mader@jtcsv.com>
+Date:   Tue May 7 20:39:14 2002 +0000
+
+    Add modules modules/indic/indic-xft.c, indic-ot.c, indic-ot.h,
+
+    Mon May 06 15:07:39 2002 Eric Mader <mader@jtcsv.com>
+            * Add modules modules/indic/indic-xft.c, indic-ot.c,
+            indic-ot.h, indic-ot-class-tables.c
+
+            * pango/opentype/ftxgdef.c: Compute full offset for mark
+            attachment class table
+
+            * pango/opentype/ftxgpos.c: Only return TTO_Err_Not_Covered
+            if nothing matches
+
+            * pango/opentype/pango-ot-ruleset.c: enable GPOS processing
+
+ src/ftxgdef.c          | 10 ++++++++--
+ src/ftxgpos.c          | 33 ++++++++++++++-------------------
+ src/pango-ot-ruleset.c | 35 ++++++++++++++++++++++++++++++++++-
+ 3 files changed, 56 insertions(+), 22 deletions(-)
+
+commit cf00f8217c9dfcf50febbb06fad245d489a0abe6
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Tue Apr 23 20:20:29 2002 +0000
+
+    Add compatibility defines for changes in FreeType 2.1.0.
+
+    Tue Apr 23 16:15:07 2002  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/fterrcompat.h: Add compatibility
+            defines for changes in FreeType 2.1.0.
+
+ src/fterrcompat.h | 39 +++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 37 insertions(+), 2 deletions(-)
+
+commit 6b1b04e3736fdca774052ac3cfbe9f027548c29d
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Fri Mar 15 06:46:05 2002 +0000
+
+    In Load_ChainContextSubst2, handle the case where an empty class
+
+    Fri Mar 15 01:35:56 2002  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgsub.c pango/opentype/ftxopen.c
+            pango/opentype/ftxopenf.h: In Load_ChainContextSubst2,
+            handle the case where an empty class definition
+            is represented by an offset of 0.
+
+            * pango/opentype/ftxgpos.c: Same for Load_ChainContextPos2.
+
+            * pango/opentype/{ftxopen.c,ftxgpos.c,ftxgsub.c,ftgdef.c}:
+            Fix pervasive bug where on cleanups on failure of loading
+            an array element, all array elements were freed, not
+            just the ones that had been succesfully loaded.
+
+ src/ftxgdef.c  |  24 +++---
+ src/ftxgpos.c  | 259
+ ++++++++++++++++++++++++++++++++++++---------------------
+ src/ftxgsub.c  | 159 ++++++++++++++++++++---------------
+ src/ftxopen.c  |  53 ++++++++----
+ src/ftxopenf.h |   2 +
+ 5 files changed, 306 insertions(+), 191 deletions(-)
+
+commit 6050933f336f43453e35246525cfec362bd23acb
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Fri Mar 15 04:22:14 2002 +0000
+
+    Uncomment GPOS parts.
+
+    Thu Mar 14 23:05:18 2002  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxopen.c: Uncomment GPOS parts.
+
+            * pango/opentype/disasm.c: Start adding some GPOS
+            dumping.
+
+ src/disasm.c  | 146
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/ftxopen.c |  20 ++++----
+ 2 files changed, 154 insertions(+), 12 deletions(-)
+
+commit 973bd60a2526666f68138255b8536d1eaee3c2c2
+Author: Sebastian Wilhelmi <wilhelmi@src.gnome.org>
+Date:   Thu Dec 13 17:44:46 2001 +0000
+
+    Resuming aborted commit
+
+
+    Resuming aborted commit
+
+ src/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 6926ca94255e5d52d99d0d64d126165fc725432d
+Author: Matthias Clasen <matthiasc@src.gnome.org>
+Date:   Tue Oct 30 22:09:20 2001 +0000
+
+    Remove declarations of unimplemented functions
+
+            * docs/pango-sections.txt, pango/pango-ot.h: Remove
+            declarations
+            of unimplemented functions pango_ot_ruleset_set_glyph_loader
+            and
+            pango_ot_ruleset_set_alternate_func and the related typedefs
+            PangoOTGlyphLoader and PangoOTAlternateFunc.
+
+            * pango/opentype/pango-ot-info.c,
+            pango/opentype/pango-ot-ruleset.c: Documentation updates.
+
+ src/pango-ot-info.c    | 76
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/pango-ot-ruleset.c | 27 ++++++++++++++++++
+ 2 files changed, 103 insertions(+)
+
+commit 87a475c09f6b9b391bca37de47a303a62a397b83
+Author: Havoc Pennington <hp@redhat.com>
+Date:   Wed Sep 19 21:20:36 2001 +0000
+
+    header to abstract the difference between FreeType 2.0.3 and 2.0.4
+    error
+
+    2001-09-19  Havoc Pennington  <hp@redhat.com>
+
+            * pango/opentype/fterrcompat.h: header to abstract the
+            difference
+            between FreeType 2.0.3 and 2.0.4 error codes, based on the
+            configure check.
+
+            * configure.in: check for the tterrors.h header in FreeType
+            2.0.3,
+            and define HAVE_FREETYPE_2_0_3 if we have it
+
+ src/Makefile.am     |  1 +
+ src/fterrcompat.h   | 16 ++++++++++++++++
+ src/ftxgdef.c       |  3 ++-
+ src/ftxgpos.c       |  3 ++-
+ src/ftxgsub.c       |  3 ++-
+ src/ftxopen.c       |  3 ++-
+ src/pango-ot-info.c |  2 +-
+ 7 files changed, 26 insertions(+), 5 deletions(-)
+
+commit 9c37226efe2489b4cf9618ec98f581c998aaf9e4
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Tue Sep 18 20:05:20 2001 +0000
+
+    Up to 0.19.
+
+    Tue Sep 18 15:47:08 2001  Owen Taylor  <otaylor@redhat.com>
+
+            * configure.in (PANGO_MINOR_VERSION): Up to 0.19.
+
+            * pango/pango-font.h pango/pango-fontmap.[ch] pango/fonts.c
+            pango/pangoxft-fontmap.c pango/pangoft-fontmap.c
+            pango/pango-context.[ch]
+            pango/pangox-fontmap.c: Add new PangoFontFace and
+            PangoFontFamily
+            object types, and change the font listing API to list
+            faces and
+            families, instead of face names and font descriptions.
+
+            * pango/pango-font.h pango/fonts.c: Make PangoFontDescription
+            an opaque heap-allocated structure, add accessors and
+            convenience functions.
+
+            * pango/pango-font.h pango/pango-private.h: Make
+            PangoFontMetrics
+            heap allocated, protect the structure definition with
+            #ifdef PANGO_ENABLE_BACKEND, and add getters for the fields.
+
+            * pango/pango-attributes.[ch] ( pango_attr_iterator_get_font):
+            instead of providing a base font description and one to fill
+            in, provide a single font description to modify based on
+            the attributes.
+
+            * pango/pango-attributes.[ch]: Fix PangoAttrFontDesc to have
+            a PangoFontDescription by reference, not by value.
+
+            * pango/pango-utils.[ch]: make pango_parse_style() and friends
+            take pointers to individual enumerations instead of to a
+            PangoFontDescription structure.
+
+            * pango/*.c: Fix for the PangoFontDescription and
+            PangoFontMetrics
+            changes.
+
+            * pango/pango-{break,engine,indic,ot,xft}.h pango/Makefile.am
+            pango/opentype/Makefile.am: Protect portions with
+            PANGO_ENABLE_ENGINE to shrink the public API.
+
+            * modules/*/Makefile.am: -DPANGO_ENABLE_ENGINE.
+
+            * pango/{pangox.h,pangox-private.h} modules/basic/basic-x.c:
+            Move
+            pango_x_font_get_unknown_glyph() into public header since
+            it is
+            used from modules.
+
+            * pango/pango-{context,font,fontmap,modules.utils}.h
+            pango/Makefile.am:
+            Protect portions with PANGO_ENABLE_BACKEND to shrink the
+            public API.
+
+            * pango/*.h: Use G_BEGIN/END_DECLS
+
+            * examples/viewer-qt.[cc,h]: Fix for changes to font
+            listing API,
+            PangoFontDescription.
+
+            * pango/pango-indic.h modules/indic/*: Since we install this
+            header fix it up to Pango conventions, namespece
+            ZERO_WIDTH_JOINER, ZERO_WIDTH_NON_JOINER.
+
+            * docs/pango-sections.txt: Updated.
+
+ src/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 7dd0838863f65a8ff2e27d12679c9a289a76aec1
+Author: Darin Adler <darin@src.gnome.org>
+Date:   Thu Jul 12 16:34:40 2001 +0000
+
+    Remove stray semicolon.
+
+            * modules/arabic/arabic-x.c: (arabic_engine_shape): Remove
+            stray
+            semicolon.
+
+            * modules/arabic/arconv.h:
+            * modules/arabic/arconv.c: (shape), (doublelig),
+            (arabic_reshape):
+            Use long* instead of int* for parameter to match what's
+            passed in.
+
+            * modules/indic/bengali-x.c: Add missing <string.h> include.
+            (pango_indic_make_ligs): Use local variable that was added
+            but not
+            ever used.
+            (pango_indic_engine_shape): Remove unused locals.
+
+            * modules/indic/devanagari-x.c: Add missing <string.h>
+            include.
+            (pango_indic_engine_shape): Remove unused local.
+
+            * modules/indic/gujarati-x.c: Add missing <string.h> include.
+            (pango_indic_engine_shape): Remove unused local
+
+            * modules/tamil/tamil-x.c: (tamil_engine_shape): Initialize a
+            variable to quiet the compiler's unused warning.
+
+            * pango/.cvsignore: Ignore more generated files.
+
+            * pango/opentype/ftxgpos.c: (Get_Anchor): Add code to set
+            up the
+            ap variable. The old code would just use the uninitialized
+            value.
+
+            * pango/opentype/ftxopen.c: (Load_Coverage): Remove unused
+            local.
+
+            * pango/opentype/pango-ot-ruleset.c: (pango_ot_ruleset_shape):
+            Remove unused local.
+
+            * pango/pango-attributes.c: (pango_attr_list_get_type),
+            (pango_color_get_type): Add needed function type casts (just
+            warnings under gcc, but could be errors in other compilers).
+
+            * pango/pangoxft-font.c: (pango_xft_font_get_metrics),
+            (pango_xft_font_get_coverage), (pango_xft_get_shaper_map),
+            (pango_xft_font_find_shaper): Switch from lang char* to
+            PangoLanguage*. The code was still compiling, but would
+            not have
+            worked.
+
+ src/ftxgpos.c          | 2 ++
+ src/ftxopen.c          | 1 -
+ src/pango-ot-ruleset.c | 1 -
+ 3 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 68f8a64307441bd3b3d45971ac4dc93f63dedfe8
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Fri May 18 16:04:40 2001 +0000
+
+    Use ISO C99 varargs when available.
+
+    Fri May 18 11:30:57 2001  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/disasm.c: Use ISO C99 varargs when
+            available.
+
+    Thu May 17 11:16:23 2001  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/mapping.c: Fixup docs, remove some FIXMEs that are
+            no longer applicable.
+
+            * pango/pango-layout.c: Move by graphemes, not characters.
+
+            * pango/pango-layout.c (pango_layout_line_x_to_index):
+            Position at the closest grapheme boundary, not at character
+            boundaries.
+
+            * pango/pango-layout.c (pango_layout_line_index_to_x):
+            Return positions of grapheme boundaries, not character
+            boundaries.
+
+ src/Makefile.am | 2 ++
+ src/disasm.c    | 5 +++++
+ 2 files changed, 7 insertions(+)
+
+commit 89eb36ebc6591025c063cb98f0e1b3badde73e9e
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Tue Apr 24 15:47:22 2001 +0000
+
+    Remove excess call to DONE_Stream left over from conversion from FT1.
+
+    Tue Apr 24 11:45:55 2001  Owen Taylor  <otaylor@redhat.com>
+
+            * pango/opentype/ftxgdef.c (TT_Load_GDEF_Table): Remove
+            excess call to DONE_Stream left over from conversion
+            from FT1. (reported by Michael Jansson)
+
+ src/ftxgdef.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit c61a730aaebec751831f8423894de5f4b539d0ec
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Tue Apr 3 19:07:36 2001 +0000
+
+    Release 0.14
+
+    Tue Apr  3 15:05:19 2001  Owen Taylor  <otaylor@redhat.com>
+
+            * Release 0.14
+
+            * NEWS: updated.
+
+            * pango/pango/opentype/Makefile.am: make dist fixes.
+
+            * configure.in (PANGO_MINOR_VERSION): Up to 0.14
+
+ src/Makefile.am | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit 405b878923ed219617c6f643a9aec06175223d16
+Author: Tor Lillqvist <tml@iki.fi>
+Date:   Thu Dec 21 19:55:23 2000 +0000
+
+    Only a script engine here.
+
+    2000-12-21  Tor Lillqvist  <tml@iki.fi>
+
+            * modules/basic/basic-win32.c (script_engine_load): Only
+            a script
+            engine here.
+
+            * pango/makefile.mingw.in: Add the built
+            pango-enum-types.[ch].
+
+            * pango/pango.def
+            * pango/pangoft2.def: Update.
+
+            * pango/opentype/pango-ot.def
+            * pango/opentype/makefile.mingw.in: New files.
+
+            * pango/opentype/Makefile.am (EXTRA_DIST): Add them.
+
+            * configure.in (included_modules): Generate
+            pango/opentype/makefile.mingw.
+
+ src/Makefile.am       |  4 +++-
+ src/makefile.mingw.in | 43 +++++++++++++++++++++++++++++++++++++++++++
+ src/pango-ot.def      | 50
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 96 insertions(+), 1 deletion(-)
+
+commit 80a15829135065e16ce5b129c715d10d14b829ba
+Author: Owen Taylor <otaylor@redhat.com>
+Date:   Wed Dec 20 04:41:36 2000 +0000
+
+    Since Xft may only be available statically without shlib deps,
+    check for
+
+    Tue Dec 19 22:47:16 2000  Owen Taylor  <otaylor@redhat.com>
+
+            * configure.in pango-config.in pangoxft.pc.in
+            modules/basic/Makefile.am: Since Xft may only be available
+            statically without shlib deps, check for FreeType libs
+            explicitly
+            and include them when linking, otherwise things won't
+            work. Also,
+            define FREETYPE_CFLAGS from freetype-config --cflags.
+
+            * modules/basic/basic-xft.c pango/pangoxft-font{,map}.c: Fool
+            Xft into not converting glyph indices by loading the
+            face unencoded then calling FT_Set_Charmap ourselves.
+
+            * pango/Makefile.am pango/pango-ot.h pango/opentype/*
+            :Add start
+            of opentype handling - most of the actually meat of the
+            code here
+            is the OpenType layout code from FreeType 1 ported to
+            freetype2
+            and adapted slighlty for our purposes.  Also, includes a
+            incomplete OpenType-table-dumping code useful for figuring
+            out what is going on.
+
+            * pango/pangoxft.h pango/pangoxft-font.h: Add calls for
+            getting FT_Face and PangoOTInfo from PangoXftFont.
+
+            * modules/arabic/{Makefile.am,arabic-ot.[ch],arabic-xft.c}:
+            Initial support for rendering Arabic with OpenType fonts.
+
+ src/.cvsignore         |    8 +
+ src/FT-license.txt     |  158 ++
+ src/Makefile.am        |   39 +
+ src/README             |   36 +
+ src/disasm.c           |  317 +++
+ src/disasm.h           |   26 +
+ src/ftxgdef.c          | 1155 +++++++++
+ src/ftxgdef.h          |  220 ++
+ src/ftxgpos.c          | 6222
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ src/ftxgpos.h          |  858 +++++++
+ src/ftxgsub.c          | 4531 +++++++++++++++++++++++++++++++++++
+ src/ftxgsub.h          |  612 +++++
+ src/ftxopen.c          | 1467 ++++++++++++
+ src/ftxopen.h          |  308 +++
+ src/ftxopenf.h         |  161 ++
+ src/ottest.c           |  265 +++
+ src/pango-ot-info.c    |  438 ++++
+ src/pango-ot-private.h |   98 +
+ src/pango-ot-ruleset.c |  232 ++
+ 19 files changed, 17151 insertions(+)
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/INSTALL b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/INSTALL
new file mode 100644
index 0000000..8865734
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/INSTALL
@@ -0,0 +1,368 @@
+Installation Instructions
+*************************
+
+   Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
+Foundation, Inc.
+
+   Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.  This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+   Briefly, the shell command './configure && make && make install'
+should configure, build, and install this package.  The following
+more-detailed instructions are generic; see the 'README' file for
+instructions specific to this package.  Some packages provide this
+'INSTALL' file but do not implement all of the features documented
+below.  The lack of an optional feature in a given package is not
+necessarily a bug.  More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+   The 'configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a 'Makefile' in each directory of the package.
+It may also create one or more '.h' files containing system-dependent
+definitions.  Finally, it creates a shell script 'config.status' that
+you can run in the future to recreate the current configuration, and a
+file 'config.log' containing compiler output (useful mainly for
+debugging 'configure').
+
+   It can also use an optional file (typically called 'config.cache' and
+enabled with '--cache-file=config.cache' or simply '-C') that saves the
+results of its tests to speed up reconfiguring.  Caching is disabled by
+default to prevent problems with accidental use of stale cache files.
+
+   If you need to do unusual things to compile the package, please try
+to figure out how 'configure' could check whether to do them, and mail
+diffs or instructions to the address given in the 'README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point 'config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file 'configure.ac' (or 'configure.in') is used to create
+'configure' by a program called 'autoconf'.  You need 'configure.ac' if
+you want to change it or regenerate 'configure' using a newer version of
+'autoconf'.
+
+   The simplest way to compile this package is:
+
+  1. 'cd' to the directory containing the package's source code and type
+     './configure' to configure the package for your system.
+
+     Running 'configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
+
+  2. Type 'make' to compile the package.
+
+  3. Optionally, type 'make check' to run any self-tests that come with
+     the package, generally using the just-built uninstalled binaries.
+
+  4. Type 'make install' to install the programs and any data files and
+     documentation.  When installing into a prefix owned by root, it is
+     recommended that the package be configured and built as a regular
+     user, and only the 'make install' phase executed with root
+     privileges.
+
+  5. Optionally, type 'make installcheck' to repeat any self-tests, but
+     this time using the binaries in their final installed location.
+     This target does not install anything.  Running this target as a
+     regular user, particularly if the prior 'make install' required
+     root privileges, verifies that the installation completed
+     correctly.
+
+  6. You can remove the program binaries and object files from the
+     source code directory by typing 'make clean'.  To also remove the
+     files that 'configure' created (so you can compile the package for
+     a different kind of computer), type 'make distclean'.  There is
+     also a 'make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+  7. Often, you can also type 'make uninstall' to remove the installed
+     files again.  In practice, not all packages have tested that
+     uninstallation works correctly, even though it is required by the
+     GNU Coding Standards.
+
+  8. Some packages, particularly those that use Automake, provide 'make
+     distcheck', which can by used by developers to test that all other
+     targets like 'make install' and 'make uninstall' work correctly.
+     This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the 'configure' script does not know about.  Run './configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give 'configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here is
+an example:
+
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you can use GNU 'make'.  'cd' to the
+directory where you want the object files and executables to go and run
+the 'configure' script.  'configure' automatically checks for the source
+code in the directory that 'configure' is in and in '..'.  This is known
+as a "VPATH" build.
+
+   With a non-GNU 'make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use 'make distclean' before
+reconfiguring for another architecture.
+
+   On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple '-arch' options to the
+compiler but only a single '-arch' option to the preprocessor.  Like
+this:
+
+     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CPP="gcc -E" CXXCPP="g++ -E"
+
+   This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the 'lipo' tool if you have problems.
+
+Installation Names
+==================
+
+   By default, 'make install' installs the package's commands under
+'/usr/local/bin', include files under '/usr/local/include', etc.  You
+can specify an installation prefix other than '/usr/local' by giving
+'configure' the option '--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+pass the option '--exec-prefix=PREFIX' to 'configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like '--bindir=DIR' to specify different values for particular
+kinds of files.  Run 'configure --help' for a list of the directories
+you can set and what kinds of files go in them.  In general, the default
+for these options is expressed in terms of '${prefix}', so that
+specifying just '--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+   The most portable way to affect installation locations is to pass the
+correct locations to 'configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+'make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+   The first method involves providing an override variable for each
+affected directory.  For example, 'make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+'${prefix}'.  Any directories that were specified during 'configure',
+but not in terms of '${prefix}', must each be overridden at install time
+for the entire installation to be relocated.  The approach of makefile
+variable overrides for each directory variable is required by the GNU
+Coding Standards, and ideally causes no recompilation.  However, some
+platforms have known limitations with the semantics of shared libraries
+that end up requiring recompilation when using this method, particularly
+noticeable in packages that use GNU Libtool.
+
+   The second method involves providing the 'DESTDIR' variable.  For
+example, 'make install DESTDIR=/alternate/directory' will prepend
+'/alternate/directory' before all installation names.  The approach of
+'DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters.  On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of '${prefix}'
+at 'configure' time.
+
+Optional Features
+=================
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving 'configure' the
+option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'.
+
+   Some packages pay attention to '--enable-FEATURE' options to
+'configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to '--with-PACKAGE' options, where PACKAGE
+is something like 'gnu-as' or 'x' (for the X Window System).  The
+'README' should mention any '--enable-' and '--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, 'configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the 'configure' options '--x-includes=DIR' and
+'--x-libraries=DIR' to specify their locations.
+
+   Some packages offer the ability to configure how verbose the
+execution of 'make' will be.  For these packages, running './configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with 'make V=1'; while running './configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with 'make V=0'.
+
+Particular systems
+==================
+
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU CC
+is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+   HP-UX 'make' updates targets which have the same time stamps as their
+prerequisites, which makes it generally unusable when shipped generated
+files such as 'configure' are involved.  Use GNU 'make' instead.
+
+   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its '<wchar.h>' header file.  The option '-nodtk' can be used as a
+workaround.  If GNU CC is not installed, it is therefore recommended to
+try
+
+     ./configure CC="cc"
+
+and if that doesn't work, try
+
+     ./configure CC="cc -nodtk"
+
+   On Solaris, don't put '/usr/ucb' early in your 'PATH'.  This
+directory contains several dysfunctional programs; working variants of
+these programs are available in '/usr/bin'.  So, if you need '/usr/ucb'
+in your 'PATH', put it _after_ '/usr/bin'.
+
+   On Haiku, software installed for all users goes in '/boot/common',
+not '/usr/local'.  It is recommended to use the following options:
+
+     ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+   There may be some features 'configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, 'configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+'--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as 'sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS
+     KERNEL-OS
+
+   See the file 'config.sub' for the possible values of each field.  If
+'config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the option '--target=TYPE' to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with '--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for 'configure' scripts to share,
+you can create a site shell script called 'config.site' that gives
+default values for variables like 'CC', 'cache_file', and 'prefix'.
+'configure' looks for 'PREFIX/share/config.site' if it exists, then
+'PREFIX/etc/config.site' if it exists.  Or, you can set the
+'CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all 'configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to 'configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the 'configure' command line, using 'VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified 'gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an
+Autoconf limitation.  Until the limitation is lifted, you can use this
+workaround:
+
+     CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+'configure' Invocation
+======================
+
+   'configure' recognizes the following options to control how it
+operates.
+
+'--help'
+'-h'
+     Print a summary of all of the options to 'configure', and exit.
+
+'--help=short'
+'--help=recursive'
+     Print a summary of the options unique to this package's
+     'configure', and exit.  The 'short' variant lists options used only
+     in the top level, while the 'recursive' variant lists options also
+     present in any nested packages.
+
+'--version'
+'-V'
+     Print the version of Autoconf used to generate the 'configure'
+     script, and exit.
+
+'--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally 'config.cache'.  FILE defaults to '/dev/null' to
+     disable caching.
+
+'--config-cache'
+'-C'
+     Alias for '--cache-file=config.cache'.
+
+'--quiet'
+'--silent'
+'-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to '/dev/null' (any error
+     messages will still be shown).
+
+'--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     'configure' can determine that directory automatically.
+
+'--prefix=DIR'
+     Use DIR as the installation prefix.  *note Installation Names:: for
+     more details, including other options available for fine-tuning the
+     installation locations.
+
+'--no-create'
+'-n'
+     Run the configure checks, but stop before creating any output
+     files.
+
+'configure' also accepts some other, not widely useful, options.  Run
+'configure --help' for more details.
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/Makefile.am b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/Makefile.am
new file mode 100644
index 0000000..eb46cea
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/Makefile.am
@@ -0,0 +1,86 @@
+# Process this file with automake to produce Makefile.in
+
+NULL =
+
+ACLOCAL_AMFLAGS = -I m4
+
+SUBDIRS = src util test docs
+
+EXTRA_DIST = \
+	autogen.sh \
+	harfbuzz.doap \
+	README.python.md \
+	README.wine.md \
+	BUILD.md \
+	RELEASING.md \
+	CMakeLists.txt \
+	replace-enum-strings.cmake \
+	$(NULL)
+
+MAINTAINERCLEANFILES = \
+	$(GITIGNORE_MAINTAINERCLEANFILES_TOPLEVEL) \
+	$(GITIGNORE_MAINTAINERCLEANFILES_M4_LIBTOOL) \
+	$(GITIGNORE_MAINTAINERCLEANFILES_MAKEFILE_IN) \
+	$(srcdir)/INSTALL \
+	$(srcdir)/ChangeLog \
+	$(srcdir)/gtk-doc.make \
+	$(srcdir)/m4/gtk-doc.m4 \
+	$(NULL)
+
+
+#
+# ChangeLog generation
+#
+CHANGELOG_RANGE =
+ChangeLog: $(srcdir)/ChangeLog
+$(srcdir)/ChangeLog:
+	$(AM_V_GEN) if test -d "$(top_srcdir)/.git"; then \
+	  (GIT_DIR=$(top_srcdir)/.git \
+	   $(GIT) log $(CHANGELOG_RANGE) --stat) | fmt --split-only > $@.tmp \
+	  && mv -f $@.tmp "$(srcdir)/ChangeLog" \
+	  || ($(RM) $@.tmp; \
+	      echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \
+	      (test -f $@ || echo git-log is required to generate this file >> "$(srcdir)/$@")); \
+	else \
+	  test -f $@ || \
+	  (echo A git checkout and git-log is required to generate ChangeLog >&2 && \
+	  echo A git checkout and git-log is required to generate this file >> "$(srcdir)/$@"); \
+	fi
+.PHONY: ChangeLog $(srcdir)/ChangeLog
+
+
+#
+# Release engineering
+#
+
+DISTCHECK_CONFIGURE_FLAGS = \
+	--enable-gtk-doc \
+	--disable-doc-cross-references \
+	--with-gobject \
+	--enable-introspection \
+	$(NULL)
+
+# TODO: Copy infrastructure from cairo
+
+# TAR_OPTIONS is not set as env var for 'make dist'.  How to fix that?
+TAR_OPTIONS = --owner=0 --group=0
+
+dist-hook: dist-clear-sticky-bits
+# Clean up any sticky bits we may inherit from parent dir
+dist-clear-sticky-bits:
+	chmod -R a-s $(distdir)
+
+
+tar_file = $(PACKAGE_TARNAME)-$(VERSION).tar.bz2
+sha256_file = $(tar_file).sha256
+gpg_file = $(sha256_file).asc
+$(sha256_file): $(tar_file)
+	sha256sum $^ > $@
+$(gpg_file): $(sha256_file)
+	@echo "Please enter your GPG password to sign the checksum."
+	gpg --armor --sign $^
+
+release-files: $(tar_file) $(sha256_file) $(gpg_file)
+
+
+-include $(top_srcdir)/git.mk
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/Makefile.in b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/Makefile.in
new file mode 100644
index 0000000..6faf227
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/Makefile.in
@@ -0,0 +1,971 @@
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
+	$(top_srcdir)/m4/ax_code_coverage.m4 \
+	$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+	$(am__configure_deps) $(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	cscope distdir dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+	$(LISP)config.h.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in AUTHORS \
+	COPYING ChangeLog INSTALL NEWS README THANKS TODO ar-lib \
+	compile config.guess config.sub depcomp install-sh ltmain.sh \
+	missing
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+GZIP_ENV = --best
+DIST_ARCHIVES = $(distdir).tar.bz2
+DIST_TARGETS = dist-bzip2
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_CONFIG = @ICU_CONFIG@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL = 
+ACLOCAL_AMFLAGS = -I m4
+SUBDIRS = src util test docs
+EXTRA_DIST = \
+	autogen.sh \
+	harfbuzz.doap \
+	README.python.md \
+	README.wine.md \
+	BUILD.md \
+	RELEASING.md \
+	CMakeLists.txt \
+	replace-enum-strings.cmake \
+	$(NULL)
+
+MAINTAINERCLEANFILES = \
+	$(GITIGNORE_MAINTAINERCLEANFILES_TOPLEVEL) \
+	$(GITIGNORE_MAINTAINERCLEANFILES_M4_LIBTOOL) \
+	$(GITIGNORE_MAINTAINERCLEANFILES_MAKEFILE_IN) \
+	$(srcdir)/INSTALL \
+	$(srcdir)/ChangeLog \
+	$(srcdir)/gtk-doc.make \
+	$(srcdir)/m4/gtk-doc.m4 \
+	$(NULL)
+
+
+#
+# ChangeLog generation
+#
+CHANGELOG_RANGE = 
+
+#
+# Release engineering
+#
+DISTCHECK_CONFIGURE_FLAGS = \
+	--enable-gtk-doc \
+	--disable-doc-cross-references \
+	--with-gobject \
+	--enable-introspection \
+	$(NULL)
+
+
+# TODO: Copy infrastructure from cairo
+
+# TAR_OPTIONS is not set as env var for 'make dist'.  How to fix that?
+TAR_OPTIONS = --owner=0 --group=0
+tar_file = $(PACKAGE_TARNAME)-$(VERSION).tar.bz2
+sha256_file = $(tar_file).sha256
+gpg_file = $(sha256_file).asc
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh: Makefile
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnits'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnits \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnits Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+	@test -f $@ || rm -f stamp-h1
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in:  $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+	test ! -s cscope.files \
+	  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+	-rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+distdir: $(DISTFILES)
+	@case `sed 15q $(srcdir)/NEWS` in \
+	*"$(VERSION)"*) : ;; \
+	*) \
+	  echo "NEWS not updated; not releasing" 1>&2; \
+	  exit 1;; \
+	esac
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+	$(am__post_remove_distdir)
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(am__post_remove_distdir)
+
+dist-lzip: distdir
+	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+	$(am__post_remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+	$(am__post_remove_distdir)
+
+dist-tarZ: distdir
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__post_remove_distdir)
+
+dist-shar: distdir
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+	$(am__post_remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__post_remove_distdir)
+
+dist dist-all:
+	$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+	$(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lz*) \
+	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir)
+	chmod u+w $(distdir)
+	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build/sub \
+	  && ../../configure \
+	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	    --srcdir=../.. --prefix="$$dc_install_base" \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__post_remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@test -n '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: trying to run $@ with an empty' \
+	       '$$(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	$(am__cd) '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile config.h
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr \
+	distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) all install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+	am--refresh check check-am clean clean-cscope clean-generic \
+	clean-libtool cscope cscopelist-am ctags ctags-am dist \
+	dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \
+	dist-tarZ dist-xz dist-zip distcheck distclean \
+	distclean-generic distclean-hdr distclean-libtool \
+	distclean-tags distcleancheck distdir distuninstallcheck dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs installdirs-am \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+ChangeLog: $(srcdir)/ChangeLog
+$(srcdir)/ChangeLog:
+	$(AM_V_GEN) if test -d "$(top_srcdir)/.git"; then \
+	  (GIT_DIR=$(top_srcdir)/.git \
+	   $(GIT) log $(CHANGELOG_RANGE) --stat) | fmt --split-only > $@.tmp \
+	  && mv -f $@.tmp "$(srcdir)/ChangeLog" \
+	  || ($(RM) $@.tmp; \
+	      echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \
+	      (test -f $@ || echo git-log is required to generate this file >> "$(srcdir)/$@")); \
+	else \
+	  test -f $@ || \
+	  (echo A git checkout and git-log is required to generate ChangeLog >&2 && \
+	  echo A git checkout and git-log is required to generate this file >> "$(srcdir)/$@"); \
+	fi
+.PHONY: ChangeLog $(srcdir)/ChangeLog
+
+dist-hook: dist-clear-sticky-bits
+# Clean up any sticky bits we may inherit from parent dir
+dist-clear-sticky-bits:
+	chmod -R a-s $(distdir)
+$(sha256_file): $(tar_file)
+	sha256sum $^ > $@
+$(gpg_file): $(sha256_file)
+	@echo "Please enter your GPG password to sign the checksum."
+	gpg --armor --sign $^
+
+release-files: $(tar_file) $(sha256_file) $(gpg_file)
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/NEWS b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/NEWS
new file mode 100644
index 0000000..ef87dad
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/NEWS
@@ -0,0 +1,2221 @@
+Overview of changes leading to 2.3.1
+Wednesday, January 30, 2019
+====================================
+- AAT bug fixes.
+- Misc internal housekeeping cleanup.
+
+
+Overview of changes leading to 2.3.0
+Thursday, December 20, 2018
+====================================
+- Fix regression on big-endian architectures.  Ouch!
+- Misc bug and build fixes.
+- Fix subsetting of simple GSUB/GDEF.
+- Merge CFF / CFF2 support contributed by Adobe.  This mostly involves
+  the subsetter, but also get_glyph_extents on CFF fonts.
+
+New API in hb-aat.h:
++hb_aat_layout_has_substitution()
++hb_aat_layout_has_positioning()
++hb_aat_layout_has_tracking()
+
+
+Overview of changes leading to 2.2.0
+Thursday, November 29, 2018
+====================================
+- Misc shaping bug fixes.
+- Add font variations named-instance API.
+- Deprecate font variations axis enumeration API and add replacement.
+- AAT shaping improvements:
+  o Fixed 'kern' table Format 2 implementation.
+  o Implement 'feat' table API for feature detection.
+  o Blacklist 'GSUB' table of fonts from 'MUTF' foundry that also have 'morx'.
+
+New API:
++hb_aat_layout_feature_type_t
++hb_aat_layout_feature_selector_t
++hb_aat_layout_get_feature_types()
++hb_aat_layout_feature_type_get_name_id
++hb_aat_layout_feature_selector_info_t
++HB_AAT_LAYOUT_NO_SELECTOR_INDEX
++hb_aat_layout_feature_type_get_selector_infos()
++hb_ot_var_axis_flags_t
++hb_ot_var_axis_info_t
++hb_ot_var_get_axis_infos()
++hb_ot_var_find_axis_info()
++hb_ot_var_get_named_instance_count()
++hb_ot_var_named_instance_get_subfamily_name_id()
++hb_ot_var_named_instance_get_postscript_name_id()
++hb_ot_var_named_instance_get_design_coords()
+
+Deprecated API:
++HB_OT_VAR_NO_AXIS_INDEX
++hb_ot_var_axis_t
++hb_ot_var_get_axes()
++hb_ot_var_find_axis()
+
+
+Overview of changes leading to 2.1.3
+Friday, November 16, 2018
+====================================
+- Fix AAT 'mort' shaping, which was broken in 2.1.2
+
+
+Overview of changes leading to 2.1.2
+Friday, November 16, 2018
+====================================
+- Various internal changes.
+- AAT shaping improvements:
+  o Implement kern table Format 1 state-machine-based kerning.
+  o Implement cross-stream kerning (cursive positioning, etc).
+  o Ignore emptyish GSUB tables (zero scripts) if morx present.
+  o Don't apply GPOS if morx is being applied.  Matches Apple.
+
+
+-Overview of changes leading to 2.1.1
+Monday, November 5, 2018
+====================================
+- AAT improvements:
+  o Implement 'mort' table.
+  o Implement 'kern' subtables Format 1 and Format 3.
+
+
+Overview of changes leading to 2.1.0
+Tuesday, October 30, 2018
+====================================
+- AAT shaping improvements:
+  o Allow user controlling AAT features, for whole buffer only currently.
+  o Several 'morx' fixes.
+  o Implement tuple-kerns in 'kerx'; Fixes kerning with Apple default
+    San Francisco fonts.
+- Support for color fonts:
+  o COLR/CPAL API to fetch color layers.
+  o SVG table to fetch SVG documents.
+  o CBDT/sbix API to fetch PNG images.
+- New 'name' table API.
+- hb-ot-font now uses 'VORG' table to correctly position CFF glyphs
+  in vertical layout.
+- Various fuzzer-found bug fixes.
+
+Changed API:
+
+A type and a macro added in 2.0.0 were renamed:
+
+hb_name_id_t -> hb_ot_name_id_t
+HB_NAME_ID_INVALID -> HB_OT_NAME_ID_INVALID
+
+New API:
+
++hb_color_t
++HB_COLOR
++hb_color_get_alpha()
++hb_color_get_red()
++hb_color_get_green()
++hb_color_get_blue()
++hb_ot_color_has_palettes()
++hb_ot_color_palette_get_count()
++hb_ot_color_palette_get_name_id()
++hb_ot_color_palette_color_get_name_id()
++hb_ot_color_palette_flags_t
++hb_ot_color_palette_get_flags()
++hb_ot_color_palette_get_colors()
++hb_ot_color_has_layers()
++hb_ot_color_layer_t
++hb_ot_color_glyph_get_layers()
++hb_ot_color_has_svg()
++hb_ot_color_glyph_reference_svg()
++hb_ot_color_has_png()
++hb_ot_color_glyph_reference_png()
+
++hb_ot_name_id_t
++HB_OT_NAME_ID_INVALID
++HB_OT_NAME_ID_COPYRIGHT
++HB_OT_NAME_ID_FONT_FAMILY
++HB_OT_NAME_ID_FONT_SUBFAMILY
++HB_OT_NAME_ID_UNIQUE_ID
++HB_OT_NAME_ID_FULL_NAME
++HB_OT_NAME_ID_VERSION_STRING
++HB_OT_NAME_ID_POSTSCRIPT_NAME
++HB_OT_NAME_ID_TRADEMARK
++HB_OT_NAME_ID_MANUFACTURER
++HB_OT_NAME_ID_DESIGNER
++HB_OT_NAME_ID_DESCRIPTION
++HB_OT_NAME_ID_VENDOR_URL
++HB_OT_NAME_ID_DESIGNER_URL
++HB_OT_NAME_ID_LICENSE
++HB_OT_NAME_ID_LICENSE_URL
++HB_OT_NAME_ID_TYPOGRAPHIC_FAMILY
++HB_OT_NAME_ID_TYPOGRAPHIC_SUBFAMILY
++HB_OT_NAME_ID_MAC_FULL_NAME
++HB_OT_NAME_ID_SAMPLE_TEXT
++HB_OT_NAME_ID_CID_FINDFONT_NAME
++HB_OT_NAME_ID_WWS_FAMILY
++HB_OT_NAME_ID_WWS_SUBFAMILY
++HB_OT_NAME_ID_LIGHT_BACKGROUND
++HB_OT_NAME_ID_DARK_BACKGROUND
++HB_OT_NAME_ID_VARIATIONS_PS_PREFIX
++hb_ot_name_entry_t
++hb_ot_name_list_names()
++hb_ot_name_get_utf8()
++hb_ot_name_get_utf16()
++hb_ot_name_get_utf32()
+
+
+Overview of changes leading to 2.0.2
+Saturday, October 20, 2018
+====================================
+- Fix two minor memory access issues in AAT tables.
+
+
+Overview of changes leading to 2.0.1
+Friday, October 19, 2018
+====================================
+- Fix hb-version.h reported release version that went wrong (1.8.0)
+  with previous release.
+- Fix extrapolation in 'trak' table.
+- Fix hb-font infinite-recursion issue with some font funcs and
+  subclassed fonts.
+- Implement variation-kerning format in kerx table, although without
+  variation.
+- Fix return value of hb_map_is_empty().
+
+
+Overview of changes leading to 2.0.0
+Thursday, October 18, 2018
+====================================
+- Added AAT shaping support (morx/kerx/trak).
+  Automatically used if GSUB/GPOS are not available respectively.
+  Set HB_OPTIONS=aat env var to have morx/kerx preferred over
+  GSUB/GPOS.
+- Apply TrueType kern table internally, instead of relying on
+  hb_font_t callbacks.
+- Khmer shaper significantly rewritten to better match Uniscribe.
+- Indic3 tags ('dev3', etc) are passed to USE shaper.
+- .dfont Mac font containers implemented.
+- Script- and language-mapping revamped to better use BCP 47.
+- Misc USE and Indic fixes.
+- Misc everything fixes.
+- Too many things to list.  Biggest release since 0.9.1, with
+  over 500 commits in just over 5 weeks!  Didn't intend it to
+  be a big release.  Just happened to become.
+- hb-ft now locks underlying FT_Face during use.
+
+API changes:
+
+- Newly-created hb_font_t's now have our internal "hb-ot-font"
+  callbacks set on them, so they should work out of the box
+  without any callbacks set.  If callbacks are set, everything
+  is back to what it was before, the fallback callbacks are
+  null.  If you to get the internal implementation modified,
+  sub_font it.
+
+- New hb_font_funcs_set_nominal_glyphs_func() allows speeding
+  up character to glyph mapping.
+
+New API:
++HB_FEATURE_GLOBAL_START
++HB_FEATURE_GLOBAL_END
++hb_buffer_set_invisible_glyph()
++hb_buffer_get_invisible_glyph()
++hb_font_funcs_set_nominal_glyphs_func()
++hb_ot_layout_table_select_script()
++hb_ot_layout_script_select_language()
++hb_ot_layout_feature_get_name_ids()
++hb_ot_layout_feature_get_characters()
++hb_name_id_t
++HB_NAME_ID_INVALID
++HB_OT_MAX_TAGS_PER_SCRIPT
++hb_ot_tags_from_script_and_language()
++hb_ot_tags_to_script_and_language()
+
+Deprecated API:
+-hb_font_funcs_set_glyph_func()
+-hb_unicode_eastasian_width_func_t
+-hb_unicode_funcs_set_eastasian_width_func()
+-hb_unicode_eastasian_width()
+-hb_unicode_decompose_compatibility_func_t
+-HB_UNICODE_MAX_DECOMPOSITION_LEN
+-hb_unicode_funcs_set_decompose_compatibility_func()
+-hb_unicode_decompose_compatibility()
+-hb_font_funcs_set_glyph_h_kerning_func()
+-hb_font_funcs_set_glyph_v_kerning_func()
+-hb_font_get_glyph_h_kerning()
+-hb_font_get_glyph_v_kerning()
+-hb_font_get_glyph_kerning_for_direction()
+-hb_ot_layout_table_choose_script()
+-hb_ot_layout_script_find_language()
+-hb_ot_tags_from_script()
+-hb_ot_tag_from_language()
+
+
+Overview of changes leading to 1.9.0
+Monday, September 10, 2018
+====================================
+- Added 'cmap' API to hb_face_t.
+- Face-builder API.
+- hb-ot-font re-creation should be much leaner now, as the
+  font tables it uses are cached on hb_face_t now.
+- Internal source header file name changes:
+  hb-*-private.hh is renamed to hb-*.hh.
+
+New API:
++HB_UNICODE_MAX
++hb_face_collect_unicodes()
++hb_face_collect_variation_selectors()
++hb_face_collect_variation_unicodes()
++hb_face_builder_create()
++hb_face_builder_add_table()
+
+
+Overview of changes leading to 1.8.8
+Tuesday, August 14, 2018
+====================================
+- Fix hb-icu crash on architectures where compare_exchange_weak() can
+  fail falsely.  This bug was introduced in 1.8.4.
+  https://bugs.chromium.org/p/chromium/issues/detail?id=873568
+- More internal refactoring of atomic operations and singletons.
+- API changes:
+  The following functions do NOT reference their return value before
+  returning:
+  * hb_unicode_funcs_get_default()
+  * hb_glib_get_unicode_funcs()
+  * hb_icu_get_unicode_funcs()
+  This is consistent with their naming ("get", instead of "reference")
+  as well as how they are used in the wild (ie. no one calls destroy()
+  on their return value.)
+
+
+Overview of changes leading to 1.8.7
+Wednesday, August 8, 2018
+====================================
+- Fix assertion failure with GDEF-blacklisted fonts.
+
+
+Overview of changes leading to 1.8.6
+Tuesday, August 7, 2018
+====================================
+- Internal code shuffling.
+- New API to speed up getting advance widths for implementations
+  that have heavy overhead in get_h_advance callback:
++hb_font_funcs_set_glyph_h_advances_func
++hb_font_funcs_set_glyph_v_advances_func
++hb_font_get_glyph_advances_for_direction
++hb_font_get_glyph_h_advances
++hb_font_get_glyph_h_advances_func_t
++hb_font_get_glyph_v_advances
++hb_font_get_glyph_v_advances_func_t
+
+
+Overview of changes leading to 1.8.5
+Wednesday, August 1, 2018
+====================================
+- Major Khmer shaper improvements to better match Microsoft.
+- Indic bug fixes.
+- Internal improvements to atomic operations.
+
+
+Overview of changes leading to 1.8.4
+Tuesday, July 17, 2018
+====================================
+- Fix build on non-C++11.
+- Use C++-style GCC atomics and C++11 atomics.
+
+
+Overview of changes leading to 1.8.3
+Wednesday, July 11, 2018
+====================================
+- A couple of Indic / USE bug fixes.
+- Disable vectorization, as it was causing unaligned access bus error on
+  certain 32bit architectures.
+
+
+Overview of changes leading to 1.8.2
+Tuesday, July 3, 2018
+====================================
+- Fix infinite loop in Khmer shaper.
+- Improve hb_blob_create_from_file() for streams.
+
+
+Overview of changes leading to 1.8.1
+Tuesday, June 12, 2018
+====================================
+- Fix hb-version.h file generation; last two releases went out with wrong ones.
+- Add correctness bug in hb_set_t operations, introduced in 1.7.7.
+- Remove HB_SUBSET_BUILTIN build option.  Not necessary.
+
+
+Overview of changes leading to 1.8.0
+Tuesday, June 5, 2018
+====================================
+- Update to Unicode 11.0.0.
+
+
+Overview of changes leading to 1.7.7
+Tuesday, June 5, 2018
+====================================
+- Lots of internal changes, but not yet exposed externally.
+- All HarfBuzz objects are significantly smaller in size now.
+- Sinhala: Position repha on top of post-consonant, not base.
+  This better matches Windows 10 behavior, which was changed
+  from previous Windows versions.
+- New build options:
+  o New cpp macro HB_NO_ATEXIT
+  o New cpp macro HB_SUBSET_BUILTIN
+- Significant libharfbuzz-subset changes. API subject to change.
+- New API in libharfbuzz:
+
++hb_blob_create_from_file()
++hb_face_count()
+
+A hashmap implementation:
++hb-map.h
++HB_MAP_VALUE_INVALID
++hb_map_t
++hb_map_create()
++hb_map_get_empty()
++hb_map_reference()
++hb_map_destroy()
++hb_map_set_user_data()
++hb_map_get_user_data()
++hb_map_allocation_successful()
++hb_map_clear()
++hb_map_is_empty()
++hb_map_get_population()
++hb_map_set()
++hb_map_get()
++hb_map_del()
++hb_map_has()
+
+
+Overview of changes leading to 1.7.6
+Wednesday, March 7, 2018
+====================================
+
+- Fix to hb_set_t binary operations. Ouch.
+- New experimental harfbuzz-subset library. All of hb-subset.h
+  is experimental right now and API WILL change.
+
+- New API:
+hb_blob_copy_writable_or_fail()
+HB_OT_TAG_BASE
+hb_set_previous()
+hb_set_previous_range()
+
+
+Overview of changes leading to 1.7.5
+Tuesday, January 30, 2018
+====================================
+
+- Separate Khmer shaper from Indic.
+- First stab at AAT morx. Not hooked up.
+- Misc bug fixes.
+
+
+Overview of changes leading to 1.7.4
+Wednesday, December 20, 2017
+====================================
+
+- Fix collect_glyphs() regression caused by hb_set_t changes.
+
+
+Overview of changes leading to 1.7.3
+Monday, December 18, 2017
+====================================
+
+- hb_set_t performance tuning and optimizations.
+- Speed up collect_glyphs() and reject garbage data.
+- In hb_coretext_font_create() set font point-size (ptem).
+- Misc fixes.
+
+
+Overview of changes leading to 1.7.2
+Monday, December 4, 2017
+====================================
+
+- Optimize hb_set_add_range().
+- Misc fixes.
+- New API:
+hb_coretext_font_create()
+
+
+Overview of changes leading to 1.7.1
+Tuesday, November 14, 2017
+====================================
+
+- Fix atexit object destruction regression.
+- Fix minor integer-overflow.
+
+
+Overview of changes leading to 1.7.0
+Monday, November 13, 2017
+====================================
+
+- Minor Indic fixes.
+- Implement kerning and glyph names in hb-ot-font.
+- Various DSO optimization re .data and .bss sizes.
+- Make C++11 optional; build fixes.
+- Mark all other backends "unsafe-to-break".
+- Graphite fix.
+
+
+Overview of changes leading to 1.6.3
+Thursday, October 26th, 2017
+====================================
+
+- Fix hb_set_t some more.  Should be solid now.
+- Implement get_glyph_name() for hb-ot-font.
+- Misc fixes.
+
+
+Overview of changes leading to 1.6.2
+Monday, October 23nd, 2017
+====================================
+
+- Yesterday's release had a bad crasher; don't use it.  That's what
+  happens when one works on Sunday...
+  https://github.com/harfbuzz/harfbuzz/issues/578
+- Build fixes for FreeBSD and Chrome Android.
+
+
+Overview of changes leading to 1.6.1
+Sunday, October 22nd, 2017
+====================================
+
+- Don't skip over COMBINING GRAPHEME JOINER when ligating, etc.
+  To be refined: https://github.com/harfbuzz/harfbuzz/issues/554
+- Faster hb_set_t implementation.
+- Don't use deprecated ICU API.
+- Fix undefined-behavior in Myanmar shaper, introduced in 1.6.0
+- Deprecated API:
+  hb_set_invert()
+
+
+Overview of changes leading to 1.6.0
+Friday, October the 13th, 2017
+====================================
+
+- Update to Unicode 10.
+
+- Various Indic and Universal Shaping Engine fixes as a result of
+  HarfBuzz Hackfest with Jonathan Kew at Web Engines Hackfest at
+  the Igalia offices in A Coruña, Spain.  Thanks Igalia for having
+  us!
+
+- Implement Unicode Arabic Mark Ordering Algorithm UTR#53.
+
+- Implement optical sizing / tracking in CoreText backend, using
+  new API hb_font_set_ptem().
+
+- Allow notifying hb_font_t that underlying FT_Face changed sizing,
+  using new API hb_ft_font_changed().
+
+- More Graphite backend RTL fixes.
+
+- Fix caching of variable font shaping plans.
+
+- hb-view / hb-shape now accept following new arguments:
+
+  o --unicodes: takes a list of hex numbers that represent Unicode
+    codepoints.
+
+New API:
++hb_face_get_table_tags()
++hb_font_set_ptem()
++hb_font_get_ptem()
++hb_ft_font_changed()
+
+
+Overview of changes leading to 1.5.1
+Tuesday, September 5, 2017
+====================================
+
+- Fix "unsafe-to-break" in fallback shaping and other corner cases.
+  All our tests pass with --verify now, meaning unsafe-to-break API
+  works as expected.
+- Add --unicodes to hb-view / hb-shape.
+- [indic] Treat Consonant_With_Stacker as consonant.  This will need
+  further tweaking.
+- hb_buffer_diff() tweaks.
+
+
+Overview of changes leading to 1.5.0
+Wednesday, August 23, 2017
+====================================
+
+- Misc new API, for appending a buffer to another, and for comparing
+  contents of two buffers for types of differences.
+
+- New "unsafe-to-break" API.  Can be used to speed up reshaping
+  in line-breaking situations.  Essentially, after shaping, it returns
+  positions in the input string (some of the cluster boundaries) that
+  are "safe to break" in that if the text is segmented at that position
+  and two sides reshaped and concatenated, the shaping result is
+  exactly the same as shaping the text in one piece.
+
+  hb-view and hb-shape and hb-shape now take --verify, which verifies
+  the above property.
+
+  Some corner cases of the implementation are still not quite working.
+  Those will be fixed in subsequent releases.
+
+- New API:
+
+hb_buffer_append()
+
+hb_glyph_flags_t
+HB_GLYPH_FLAG_UNSAFE_TO_BREAK
+HB_GLYPH_FLAG_DEFINED
+hb_glyph_info_get_glyph_flags()
+
+HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS
+
+hb_buffer_diff_flags_t
+HB_BUFFER_DIFF_FLAG_EQUAL
+HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH
+HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH
+HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT
+HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT
+HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH
+HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH
+HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH
+HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH
+hb_buffer_diff
+
+
+Overview of changes leading to 1.4.8
+Tuesday, August 8, 2017
+====================================
+
+- Major fix to avar table handling.
+- Rename hb-shape --show-message to --trace.
+- Build fixes.
+
+
+Overview of changes leading to 1.4.7
+Tuesday, July 18, 2017
+====================================
+
+- Multiple Indic, Tibetan, and Cham fixes.
+- CoreText: Allow disabling kerning.
+- Adjust Arabic feature order again.
+- Misc build fixes.
+
+
+Overview of changes leading to 1.4.6
+Sunday, April 23, 2017
+====================================
+
+- Graphite2: Fix RTL positioning issue.
+- Backlist GDEF of more versions of Padauk and Tahoma.
+- New, experimental, cmake alternative build system.
+
+
+Overview of changes leading to 1.4.5
+Friday, March 10, 2017
+====================================
+
+- Revert "Fix Context lookup application when moving back after a glyph..."
+  This introduced memory access problems.  To be fixed properly soon.
+
+
+Overview of changes leading to 1.4.4
+Sunday, March 5, 2017
+====================================
+
+- Fix Context lookup application when moving back after a glyph deletion.
+- Fix buffer-overrun in Bengali.
+
+
+Overview of changes leading to 1.4.3
+Saturday, February 25, 2017
+====================================
+
+- Route Adlam script to Arabic shaper.
+- Misc fixes.
+- New API:
+  hb_font_set_face()
+- Deprecate API:
+  hb_graphite2_font_get_gr_font()
+
+
+Overview of changes leading to 1.4.2
+Monday, January 23, 2017
+====================================
+
+- Implement OpenType Font Variation tables avar/fvar/HVAR/VVAR.
+- hb-shape and hb-view now accept --variations.
+- New API:
+
+hb_variation_t
+hb_variation_from_string()
+hb_variation_to_string()
+
+hb_font_set_variations()
+hb_font_set_var_coords_design()
+hb_font_get_var_coords_normalized()
+
+hb-ot-var.h:
+hb_ot_var_axis_t
+hb_ot_var_has_data()
+hb_ot_var_get_axis_count()
+hb_ot_var_get_axes()
+hb_ot_var_find_axis()
+hb_ot_var_normalize_variations()
+hb_ot_var_normalize_coords()
+
+- MVAR to be implemented later.  Access to named instances to be
+  implemented later as well.
+
+- Misc fixes.
+
+
+Overview of changes leading to 1.4.1
+Thursday, January 5, 2017
+====================================
+
+- Always build and use UCDN for Unicode data by default.
+  Reduces dependence on version of Unicode data in glib,
+  specially in the Windows bundles we are shipping, which
+  have very old glib.
+
+
+Overview of changes leading to 1.4.0
+Thursday, January 5, 2017
+====================================
+
+- Merged "OpenType GX" branch which adds core of support for
+  OpenType 1.8 Font Variations.  To that extent, the relevant
+  new API is:
+
+New API:
+hb_font_set_var_coords_normalized()
+
+  with supporting API:
+
+New API:
+HB_OT_LAYOUT_NO_VARIATIONS_INDEX
+hb_ot_layout_table_find_feature_variations()
+hb_ot_layout_feature_with_variations_get_lookups()
+hb_shape_plan_create2()
+hb_shape_plan_create_cached2()
+
+  Currently variations in GSUB/GPOS/GDEF are fully supported,
+  and no other tables are supported.  In particular, fvar/avar
+  are NOT supported, hence the hb_font_set_var_coords_normalized()
+  taking normalized coordinates.  API to take design coordinates
+  will be added in the future.
+
+  HVAR/VVAR/MVAR support will also be added to hb-ot-font in the
+  future.
+
+- Fix regression in GDEF glyph class processing.
+- Add decompositions for Chakma, Limbu, and Balinese in USE shaper.
+- Misc fixes.
+
+
+Overview of changes leading to 1.3.4
+Monday, December 5, 2016
+====================================
+
+- Fix vertical glyph origin in hb-ot-font.
+- Implement CBDT/CBLC color font glyph extents in hb-ot-font.
+
+
+Overview of changes leading to 1.3.3
+Wednesday, September 28, 2016
+====================================
+
+- Implement parsing of OpenType MATH table.
+New API:
+HB_OT_TAG_MATH
+HB_OT_MATH_SCRIPT
+hb_ot_math_constant_t
+hb_ot_math_kern_t
+hb_ot_math_glyph_variant_t
+hb_ot_math_glyph_part_flags_t
+hb_ot_math_glyph_part_t
+hb_ot_math_has_data
+hb_ot_math_get_constant
+hb_ot_math_get_glyph_italics_correction
+hb_ot_math_get_glyph_top_accent_attachment
+hb_ot_math_get_glyph_kerning
+hb_ot_math_is_glyph_extended_shape
+hb_ot_math_get_glyph_variants
+hb_ot_math_get_min_connector_overlap
+hb_ot_math_get_glyph_assembly
+
+
+Overview of changes leading to 1.3.2
+Wednesday, September 27, 2016
+====================================
+
+- Fix build of hb-coretext on older OS X versions.
+
+
+Overview of changes leading to 1.3.1
+Wednesday, September 7, 2016
+====================================
+
+- Blacklist bad GDEF of more fonts (Padauk).
+- More CoreText backend crash fixes with OS X 10.9.5.
+- Misc fixes.
+
+
+Overview of changes leading to 1.3.0
+Thursday, July 21, 2016
+====================================
+
+- Update to Unicode 9.0.0
+- Move Javanese from Indic shaper to Universal Shaping Engine.
+- Allow MultipleSubst to delete a glyph (matching Windows engine).
+- Update Universal Shaping Engine to latest draft from Microsoft.
+- DirectWrite backend improvements.  Note: this backend is for testing ONLY.
+- CoreText backend improvements with unreachable fonts.
+- Implement symbol fonts (cmap 3.0.0) in hb-ft and hb-ot-font.
+- Blacklist bad GDEF of more fonts (Tahoma & others).
+- Misc fixes.
+
+
+Overview of changes leading to 1.2.7
+Monday, May 2, 2016
+====================================
+
+- Blacklist another version of Times New Roman (Bold) Italic from Windows 7.
+- Fix Mongolian Free Variation Selectors shaping with certain fonts.
+- Fix Tibetan shorthand contractions shaping.
+- Improved list of language tag mappings.
+- Unbreak build on Windows CE.
+- Make 'glyf' table loading lazy in hb-ot-font.
+
+
+Overview of changes leading to 1.2.6
+Friday, April 8, 2016
+====================================
+
+- Blacklist GDEF table of another set of Times New Roman (Bold) Italic.
+- DirectWrite backend improvements.  Note: DirectWrite backend is
+  exclusively for our internal testing and should NOT be used in any
+  production system whatsoever.
+
+
+Overview of changes leading to 1.2.5
+Monday, April 4, 2016
+====================================
+
+- Fix GDEF mark-filtering-set, which was broken in 1.2.3.
+
+
+Overview of changes leading to 1.2.4
+Thursday, March 17, 2016
+====================================
+
+- Synthesize GDEF glyph class for any glyph that does not have one in GDEF.
+  I really hope we don't discover broken fonts that shape badly with this
+  change.
+- Misc build and other minor fixes.
+- API changes:
+  - Added HB_NDEBUG.  It's fine for production systems to define this to
+    disable high-overhead debugging checks.  However, I also reduced the
+    overhead of those checks, so it's a non-issue right now.  You can
+    forget it.  Just not defining anything at all is fine.
+
+
+Overview of changes leading to 1.2.3
+Thursday, February 25, 2016
+====================================
+
+- Blacklist GDEF table of certain versions of Times New Roman (Bold) Italic,
+  due to bug in glyph class of ASCII double-quote character.  This should
+  address "regression" introduced in 1.2.0 when we switched mark zeroing
+  in most shapers from BY_UNICODE_LATE to BY_GDEF_LATE.
+  This fourth release in a week should finally stablize things...
+
+- hb-ot-font's get_glyph() implementation saw some optimizations.  Though,
+  might be really hard to measure in real-world situations.
+
+- Also, two rather small API changes:
+
+We now disable some time-consuming internal bookkeeping if built with NDEBUG
+defined.  This is a first time that we use NDEBUG to disable debug code.  If
+there exist production systems that do NOT want to enable NDEBUG, please let
+me know and I'll add HB_NDEBUG.
+
+Added get_nominal_glyph() and get_variation_glyph() instead of get_glyph()
+
+New API:
+- hb_font_get_nominal_glyph_func_t
+- hb_font_get_variation_glyph_func_t
+- hb_font_funcs_set_nominal_glyph_func()
+- hb_font_funcs_set_variation_glyph_func()
+- hb_font_get_nominal_glyph()
+- hb_font_get_variation_glyph()
+
+Deprecated API:
+- hb_font_get_glyph_func_t
+- hb_font_funcs_set_glyph_func()
+
+Clients that implement their own font-funcs are encouraged to replace
+their get_glyph() implementation with a get_nominal_glyph() and
+get_variation_glyph() pair.  The variation version can assume that
+variation_selector argument is not zero.  Old (deprecated) functions
+will continue working indefinitely using internal gymnastics; it is
+just more efficient to use the new functions.
+
+
+Overview of changes leading to 1.2.2
+Wednesday, February 24, 2016
+====================================
+
+- Fix regression with mark positioning with fonts that have
+  non-zero mark advances.  This was introduced in 1.2.0 while
+  trying to make mark and cursive attachments to work together.
+  I have partially reverted that, so this version is much more
+  like what we had before.  All clients who updated to 1.2.0
+  should update to this version.
+
+
+Overview of changes leading to 1.2.1
+Tuesday, February 23, 2016
+====================================
+
+- CoreText: Fix bug with wrong scale if font scale was changed later.
+  https://github.com/libass/libass/issues/212
+- CoreText: Drastically speed up font initialization.
+- CoreText: Fix tiny leak.
+- Group ZWJ/ZWNJ with previous syllable under cluster-level=0.
+  https://github.com/harfbuzz/harfbuzz/issues/217
+- Add test/shaping/README.md about how to add tests to the suite.
+
+
+Overview of changes leading to 1.2.0
+Friday, February 19, 2016
+====================================
+
+- Fix various issues (hangs mostly) in case of memory allocation failure.
+- Change mark zeroing types of most shapers from BY_UNICODE_LATE to
+  BY_GDEF_LATE.  This seems to be what Uniscribe does.
+- Change mark zeroing of USE shaper from NONE to BY_GDEF_EARLY.  That's
+  what Windows does.
+- Allow GPOS cursive connection on marks, and fix the interaction with
+  mark attachment.  This work resulted in some changes to how mark
+  attachments work.  See:
+  https://github.com/harfbuzz/harfbuzz/issues/211
+  https://github.com/harfbuzz/harfbuzz/commit/86c68c7a2c971efe8e35b1f1bd99401dc8b688d2
+- Graphite2 shaper: improved negative advance handling (eg. Nastaliq).
+- Add nmake-based build system for Windows.
+- Minor speedup.
+- Misc. improvements.
+
+
+Overview of changes leading to 1.1.3
+Monday, January 11, 2016
+====================================
+
+- Ported Indic shaper to Unicode 8.0 data.
+- Universal Shaping Engine fixes.
+- Speed up CoreText shaper when font fallback happens in CoreText.
+- Documentation improvements, thanks to Khaled Hosny.
+- Very rough directwrite shaper for testing, thanks to Ebrahim Byagowi.
+- Misc bug fixes.
+- New API:
+
+  * Font extents:
+      hb_font_extents_t
+      hb_font_get_font_extents_func_t
+      hb_font_get_font_h_extents_func_t
+      hb_font_get_font_v_extents_func_t
+      hb_font_funcs_set_font_h_extents_func
+      hb_font_funcs_set_font_v_extents_func
+      hb_font_get_h_extents
+      hb_font_get_v_extents
+      hb_font_get_extents_for_direction
+
+  * Buffer message (aka debug):
+      hb_buffer_message_func_t
+      hb_buffer_set_message_func()
+    Actual message protocol to be fleshed out later.
+
+
+Overview of changes leading to 1.1.2
+Wednesday, November 26, 2015
+====================================
+
+- Fix badly-broken fallback shaper that affected terminology.
+  https://github.com/harfbuzz/harfbuzz/issues/187
+- Fix y_scaling in Graphite shaper.
+- API changes:
+  * An unset glyph_h_origin() function in font-funcs now (sensibly)
+    implies horizontal origin at 0,0.  Ie, the nil callback returns
+    true instead of false.  As such, implementations that have a
+    glyph_h_origin() that simply returns true, can remove that function
+    with HarfBuzz >= 1.1.2.  This results in a tiny speedup.
+
+
+Overview of changes leading to 1.1.1
+Wednesday, November 24, 2015
+====================================
+
+- Build fixes, specially for hb-coretext.
+
+
+Overview of changes leading to 1.1.0
+Wednesday, November 18, 2015
+====================================
+
+- Implement 'stch' stretch feature for Syriac Abbreviation Mark.
+  https://github.com/harfbuzz/harfbuzz/issues/141
+- Disable use of decompose_compatibility() callback.
+- Implement "shaping" of various Unicode space characters, even
+  if the font does not support them.
+  https://github.com/harfbuzz/harfbuzz/issues/153
+- If font does not support U+2011 NO-BREAK HYPHEN, fallback to
+  U+2010 HYPHEN.
+- Changes resulting from libFuzzer continuous fuzzing:
+  * Reject font tables that need more than 8 edits,
+  * Bound buffer growth during shaping to 32x,
+  * Fix assertions and other issues at OOM / buffer max-growth.
+- Misc fixes and optimizations.
+- API changes:
+  * All fonts created with hb_font_create() now inherit from
+    (ie. have parent) hb_font_get_empty().
+
+
+Overview of changes leading to 1.0.6
+Thursday, October 15, 2015
+====================================
+
+- Reduce max nesting level in OT lookups from 8 to 6.
+  Should not affect any real font as far as I know.
+- Fix memory access issue in ot-font.
+- Revert default load-flags of fonts created using hb_ft_font_create()
+  back to FT_LOAD_DEFAULT|FT_LOAD_NO_HINTING.  This was changed in
+  last release (1.0.5), but caused major issues, so revert.
+  https://github.com/harfbuzz/harfbuzz/issues/143
+
+
+Overview of changes leading to 1.0.5
+Tuesday, October 13, 2015
+====================================
+
+- Fix multiple memory access bugs discovered using libFuzzer.
+  https://github.com/harfbuzz/harfbuzz/issues/139
+  Everyone should upgrade to this version as soon as possible.
+  We now have continuous fuzzing set up, to avoid issues like
+  these creeping in again.
+- Misc fixes.
+
+- New API:
+  * hb_font_set_parent().
+  * hb_ft_font_[sg]et_load_flags()
+    The default flags for fonts created using hb_ft_font_create()
+    has changed to default to FT_LOAD_DEFAULT now.  Previously it
+    was defaulting to FT_LOAD_DFEAULT|FT_LOAD_NO_HINTING.
+
+- API changes:
+  * Fonts now default to units-per-EM as their scale, instead of 0.
+  * hb_font_create_sub_font() does NOT make parent font immutable
+    anymore.  hb_font_make_immutable() does.
+
+
+Overview of changes leading to 1.0.4
+Wednesday, September 30, 2015
+====================================
+
+- Fix minor out-of-bounds read error.
+
+
+Overview of changes leading to 1.0.3
+Tuesday, September 1, 2015
+====================================
+
+- Start of user documentation, from Simon Cozens!
+- Implement glyph_extents() for TrueType fonts in hb-ot-font.
+- Improve GPOS cursive attachments with conflicting lookups.
+- More fixes for cluster-level = 1.
+- Uniscribe positioning fix.
+
+
+Overview of changes leading to 1.0.2
+Wednesday, August 19, 2015
+====================================
+
+- Fix shaping with cluster-level > 0.
+- Fix Uniscribe backend font-size scaling.
+- Declare dependencies in harfbuzz.pc.
+  FreeType is not declared though, to avoid bugs in pkg-config
+  0.26 with recursive dependencies.
+- Slightly improved debug infrastructure.  More to come later.
+- Misc build fixes.
+
+
+Overview of changes leading to 1.0.1
+Monday, July 27, 2015
+====================================
+
+- Fix out-of-bounds access in USE shaper.
+
+
+Overview of changes leading to 1.0.0
+Sunday, July 26, 2015
+====================================
+
+- Implement Universal Shaping Engine:
+  https://www.microsoft.com/typography/OpenTypeDev/USE/intro.htm
+  http://blogs.windows.com/bloggingwindows/2015/02/23/windows-shapes-the-worlds-languages/
+- Bump version to 1.0.0.  The soname was NOT bumped.
+
+
+Overview of changes leading to 0.9.42
+Thursday, July 26, 2015
+=====================================
+
+- New API to allow for retrieving finer-grained cluster
+  mappings if the client desires to handle them.  Default
+  behavior is unchanged.
+- Fix cluster merging when removing default-ignorables.
+- Update to Unicode 8.0
+- hb-graphite2 fixes.
+- Misc fixes.
+- Removed HB_NO_MERGE_CLUSTERS hack.
+- New API:
+  hb_buffer_cluster_level_t enum
+  hb_buffer_get_cluster_level()
+  hb_buffer_set_cluster_level()
+  hb-shape / hb-view --cluster-level
+
+
+Overview of changes leading to 0.9.41
+Thursday, June 18, 2015
+=====================================
+
+- Fix hb-coretext with trailing whitespace in right-to-left.
+- New API: hb_buffer_reverse_range().
+- Allow implementing atomic ops in config.h.
+- Fix hb_language_t in language bindings.
+- Misc fixes.
+
+
+Overview of changes leading to 0.9.40
+Friday, March 20, 2015
+=====================================
+
+- Another hb-coretext crasher fix.  Ouch!
+- Happy Norouz!
+
+
+Overview of changes leading to 0.9.39
+Wednesday, March 4, 2015
+=====================================
+
+- Critical hb-coretext fixes.
+- Optimizations and refactoring; no functional change
+  expected.
+- Misc build fixes.
+
+
+Overview of changes leading to 0.9.38
+Friday, January 23, 2015
+=====================================
+
+- Fix minor out-of-bounds access in Indic shaper.
+- Change New Tai Lue shaping engine from South-East Asian to default,
+  reflecting change in Unicode encoding model.
+- Add hb-shape --font-size.  Can take up to two numbers for separate
+  x / y size.
+- Fix CoreText and FreeType scale issues with negative scales.
+- Reject blobs larger than 2GB.  This might break some icu-le-hb clients
+  that need security fixes.  See:
+  http://www.icu-project.org/trac/ticket/11450
+- Avoid accessing font tables during face destruction, in casce rogue
+  clients released face data already.
+- Fix up gobject-introspection a bit.  Python bindings kinda working.
+  See README.python.
+- Misc fixes.
+- API additions:
+  hb_ft_face_create_referenced()
+  hb_ft_font_create_referenced()
+
+
+Overview of changes leading to 0.9.37
+Wednesday, December 17, 2014
+=====================================
+
+- Fix out-of-bounds access in Context lookup format 3.
+- Indic: Allow ZWJ/ZWNJ before syllable modifiers.
+
+
+Overview of changes leading to 0.9.36
+Thursday, November 20, 2014
+=====================================
+
+- First time that three months went by without a release since
+  0.9.2 was released on August 10, 2012!
+- Fix performance bug in hb_ot_collect_glyphs():
+  https://bugzilla.mozilla.org/show_bug.cgi?id=1090869
+- Add basic vertical-text support to hb-ot-font.
+- Misc build fixes.
+
+
+Overview of changes leading to 0.9.35
+Saturday, August 13, 2014
+=====================================
+
+- Fix major shape-plan caching bug when more than one shaper were
+  provided to hb_shape_full() (as exercised by XeTeX).
+  http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1246370.html
+- Fix Arabic fallback shaping regression.  This was broken in 0.9.32.
+- Major hb-coretext fixes.  That backend is complete now, including
+  respecing buffer direction and language, down to vertical writing.
+- Build fixes for Windows CE.  Should build fine now.
+- Misc fixes:
+  Use atexit() only if it's safe to call from shared library
+  https://bugs.freedesktop.org/show_bug.cgi?id=82246
+  Mandaic had errors in its Unicode Joining_Type
+  https://bugs.freedesktop.org/show_bug.cgi?id=82306
+- API changes:
+
+  * hb_buffer_clear_contents() does not reset buffer flags now.
+
+    After 763e5466c0a03a7c27020e1e2598e488612529a7, one doesn't
+    need to set flags for different pieces of text.  The flags now
+    are something the client sets up once, depending on how it
+    actually uses the buffer.  As such, don't clear it in
+    clear_contents().
+
+    I don't expect any changes to be needed to any existing client.
+
+
+Overview of changes leading to 0.9.34
+Saturday, August 2, 2014
+=====================================
+
+- hb_feature_from_string() now accepts CSS font-feature-settings format.
+- As a result, hb-shape / hb-view --features also accept CSS-style strings.
+  Eg, "'liga' off" is accepted now.
+- Add old-spec Myanmar shaper:
+  https://bugs.freedesktop.org/show_bug.cgi?id=81775
+- Don't apply 'calt' in Hangul shaper.
+- Fix mark advance zeroing for Hebrew shaper:
+  https://bugs.freedesktop.org/show_bug.cgi?id=76767
+- Implement Windows-1256 custom Arabic shaping.  Only built on Windows,
+  and requires help from get_glyph().  Used by Firefox.
+  https://bugzilla.mozilla.org/show_bug.cgi?id=1045139
+- Disable 'liga' in vertical text.
+- Build fixes.
+- API changes:
+
+  * Make HB_BUFFER_FLAG_BOT/EOT easier to use.
+
+    Previously, we expected users to provide BOT/EOT flags when the
+    text *segment* was at paragraph boundaries.  This meant that for
+    clients that provide full paragraph to HarfBuzz (eg. Pango), they
+    had code like this:
+
+      hb_buffer_set_flags (hb_buffer,
+                           (item_offset == 0 ? HB_BUFFER_FLAG_BOT : 0) |
+                           (item_offset + item_length == paragraph_length ?
+                            HB_BUFFER_FLAG_EOT : 0));
+
+      hb_buffer_add_utf8 (hb_buffer,
+                          paragraph_text, paragraph_length,
+                          item_offset, item_length);
+
+    After this change such clients can simply say:
+
+      hb_buffer_set_flags (hb_buffer,
+                           HB_BUFFER_FLAG_BOT | HB_BUFFER_FLAG_EOT);
+
+      hb_buffer_add_utf8 (hb_buffer,
+                          paragraph_text, paragraph_length,
+                          item_offset, item_length);
+
+    Ie, HarfBuzz itself checks whether the segment is at the beginning/end
+    of the paragraph.  Clients that only pass item-at-a-time to HarfBuzz
+    continue not setting any flags whatsoever.
+
+    Another way to put it is: if there's pre-context text in the buffer,
+    HarfBuzz ignores the BOT flag.  If there's post-context, it ignores
+    EOT flag.
+
+
+Overview of changes leading to 0.9.33
+Tuesday, July 22, 2014
+=====================================
+
+- Turn off ARabic 'cswh' feature that was accidentally turned on.
+- Add HB_TAG_MAX_SIGNED.
+- Make hb_face_make_immutable() really make face immutable!
+- Windows build fixes.
+
+
+Overview of changes leading to 0.9.32
+Thursday, July 17, 2014
+=====================================
+
+- Apply Arabic shaping features in spec order exactly.
+- Another fix for Mongolian free variation selectors.
+- For non-Arabic scripts in Arabic shaper apply 'rlig' and 'calt'
+  together.
+- Minor adjustment to U+FFFD logic.
+- Fix hb-coretext build.
+
+
+Overview of changes leading to 0.9.31
+Wednesday, July 16, 2014
+=====================================
+
+- Only accept valid UTF-8/16/32; we missed many cases before.
+- Better shaping of invalid UTF-8/16/32.  Falls back to
+  U+FFFD REPLACEMENT CHARACTER now.
+- With all changes in this release, the buffer will contain fully
+  valid Unicode after hb_buffer_add_utf8/16/32 no matter how
+  broken the input is.  This can be overridden though.  See below.
+- Fix Mongolian Variation Selectors for fonts without GDEF.
+- Fix minor invalid buffer access.
+- Accept zh-Hant and zh-Hans language tags.  hb_ot_tag_to_language()
+  now uses these instead of private tags.
+- Build fixes.
+- New API:
+  * hb_buffer_add_codepoints().  This does what hb_buffer_add_utf32()
+    used to do, ie. no validity check on the input at all.  add_utf32
+    now replaces invalid Unicode codepoints with the replacement
+    character (see below).
+  * hb_buffer_set_replacement_codepoint()
+  * hb_buffer_get_replacement_codepoint()
+    Previously, in hb_buffer_add_utf8 and hb_buffer_add_utf16, when
+    we detected broken input, we replaced that with (hb_codepoint_t)-1.
+    This has changed to use U+FFFD now, but can be changed using these
+    new API.
+
+
+Overview of changes leading to 0.9.30
+Wednesday, July 9, 2014
+=====================================
+
+- Update to Unicode 7.0.0:
+  * New scripts Manichaean and Psalter Pahlavi are shaped using
+    Arabic shaper.
+  * All the other new scripts to through the generic shaper for
+    now.
+- Minor Indic improvements.
+- Fix graphite2 backend cluster mapping [crasher!]
+- API changes:
+  * New HB_SCRIPT_* values for Unicode 7.0 scripts.
+  * New function hb_ot_layout_language_get_required_feature().
+- Build fixes.
+
+
+Overview of changes leading to 0.9.29
+Thursday, May 29, 2014
+=====================================
+
+- Implement cmap in hb-ot-font.h.  No variation-selectors yet.
+- Myanmar: Allow MedialYa+Asat.
+- Various Indic fixes:
+  * Support most characters in Extended Devanagary and Vedic
+    Unicode blocks.
+  * Allow digits and a some punctuation as consonant placeholders.
+- Build fixes.
+
+
+Overview of changes leading to 0.9.28
+Monday, April 28, 2014
+=====================================
+
+- Unbreak old-spec Indic shaping. (bug 76705)
+- Fix shaping of U+17DD and U+0FC6.
+- Add HB_NO_MERGE_CLUSTERS build option.  NOT to be enabled by default
+  for shipping libraries.  It's an option for further experimentation
+  right now.  When we are sure how to do it properly, we will add
+  public run-time API for the functionality.
+- Build fixes.
+
+
+Overview of changes leading to 0.9.27
+Tuesday, March 18, 2014
+=====================================
+
+- Don't use "register" storage class specifier
+- Wrap definition of free_langs() with HAVE_ATEXIT
+- Add coretext_aat shaper and hb_coretext_face_create() constructor
+- If HAVE_ICU_BUILTIN is defined, use hb-icu Unicode callbacks
+- Add Myanmar test case from OpenType Myanmar spec
+- Only do fallback Hebrew composition if no GPOS 'mark' available
+- Allow bootstrapping without gtk-doc
+- Use AM_MISSING_PROG for ragel and git
+- Typo in ucdn's Makefile.am
+- Improve MemoryBarrier() implementation
+
+
+Overview of changes leading to 0.9.26
+Thursday, January 30, 2014
+=====================================
+
+- Misc fixes.
+- Fix application of 'rtlm' feature.
+- Automatically apply frac/numr/dnom around U+2044 FRACTION SLASH.
+- New header: hb-ot-shape.h
+- Uniscribe: fix scratch-buffer accounting.
+- Reorder Tai Tham SAKOT to after tone-marks.
+- Add Hangul shaper.
+- New files:
+  hb-ot-shape-complex-hangul.cc
+  hb-ot-shape-complex-hebrew.cc
+  hb-ot-shape-complex-tibetan.cc
+- Disable 'cswh' feature in Arabic shaper.
+- Coretext: better handle surrogate pairs.
+- Add HB_TAG_MAX and _HB_SCRIPT_MAX_VALUE.
+
+
+Overview of changes leading to 0.9.25
+Wednesday, December 4, 2013
+=====================================
+
+- Myanmar shaper improvements.
+- Avoid font fallback in CoreText backend.
+- Additional OpenType language tag mappiongs.
+- More aggressive shape-plan caching.
+- Build with / require automake 1.13.
+- Build with libtool 2.4.2.418 alpha to support ppc64le.
+
+
+Overview of changes leading to 0.9.24
+Tuesday, November 13, 2013
+=====================================
+
+- Misc compiler warning fixes with clang.
+- No functional changes.
+
+
+Overview of changes leading to 0.9.23
+Monday, October 28, 2013
+=====================================
+
+- "Udupi HarfBuzz Hackfest", Paris, October 14..18 2013.
+- Fix (Chain)Context recursion with non-monotone lookup positions.
+- Misc Indic bug fixes.
+- New Javanese / Buginese shaping, similar to Windows 8.1.
+
+
+Overview of changes leading to 0.9.22
+Thursday, October 3, 2013
+=====================================
+
+- Fix use-after-end-of-scope in hb_language_from_string().
+- Fix hiding of default_ignorables if font doesn't have space glyph.
+- Protect against out-of-range lookup indices.
+
+- API Changes:
+
+  * Added hb_ot_layout_table_get_lookup_count()
+
+
+Overview of changes leading to 0.9.21
+Monday, September 16, 2013
+=====================================
+
+- Rename gobject-introspection library name from harfbuzz to HarfBuzz.
+- Remove (long disabled) hb-old and hb-icu-le test shapers.
+- Misc gtk-doc and gobject-introspection annotations.
+- Misc fixes.
+- API changes:
+
+  * Add HB_SET_VALUE_INVALID
+
+Overview of changes leading to 0.9.20
+Thursday, August 29, 2013
+=====================================
+
+General:
+- Misc substitute_closure() fixes.
+- Build fixes.
+
+Documentation:
+- gtk-doc boilerplate integrated.  Docs are built now, but
+  contain no contents.  By next release hopefully we have
+  some content in.  Enable using --enable-gtk-doc.
+
+GObject and Introspection:
+- Added harfbuzz-gobject library (hb-gobject.h) that has type
+  bindings for all HarfBuzz objects and enums.  Enable using
+  --with-gobject.
+- Added gobject-introspection boilerplate.  Nothing useful
+  right now.  Work in progress.  Gets enabled automatically if
+  --with-gobject is used.  Override with --disable-introspection.
+
+OpenType shaper:
+- Apply 'mark' in Myanmar shaper.
+- Don't apply 'dlig' by default.
+
+Uniscribe shaper:
+- Support user features.
+- Fix loading of fonts that are also installed on the system.
+- Fix shaping of Arabic Presentation Forms.
+- Fix build with wide chars.
+
+CoreText shaper:
+- Support user features.
+
+Source changes:
+- hb_face_t code moved to hb-face.h / hb-face.cc.
+- Added hb-deprecated.h.
+
+API changes:
+- Added HB_DISABLE_DEPRECATED.
+- Deprecated HB_SCRIPT_CANADIAN_ABORIGINAL; replaced by
+  HB_SCRIPT_CANADIAN_SYLLABICS.
+- Deprecated HB_BUFFER_FLAGS_DEFAULT; replaced by
+  HB_BUFFER_FLAG_DEFAULT.
+- Deprecated HB_BUFFER_SERIALIZE_FLAGS_DEFAULT; replaced by
+  HB_BUFFER_SERIALIZE_FLAG_DEFAULT.
+
+
+Overview of changes leading to 0.9.19
+Tuesday, July 16, 2013
+=====================================
+
+- Build fixes.
+- Better handling of multiple variation selectors in a row.
+- Pass on variation selector to GSUB if not consumed by cmap.
+- Fix undefined memory access.
+- Add Javanese config to Indic shaper.
+- Misc bug fixes.
+
+Overview of changes leading to 0.9.18
+Tuesday, May 28, 2013
+=====================================
+
+New build system:
+
+- All unneeded code is all disabled by default,
+
+- Uniscribe and CoreText shapers can be enabled with their --with options,
+
+- icu_le and old shapers cannot be enabled for now,
+
+- glib, freetype, and cairo will be detected automatically.
+  They can be force on/off'ed with their --with options,
+
+- icu and graphite2 are default off, can be enabled with their --with
+  options,
+
+Moreover, ICU support is now build into a separate library:
+libharfbuzz-icu.so, and a new harfbuzz-icu.pc is shipped for it.
+Distros can enable ICU now without every application on earth
+getting linked to via libharfbuzz.so.
+
+For distros I recommend that they make sure they are building --with-glib
+--with-freetype --with-cairo, --with-icu, and optionally --with-graphite2;
+And package harfbuzz and harfbuzz-icu separately.
+
+
+Overview of changes leading to 0.9.17
+Monday, May 20, 2013
+=====================================
+
+- Build fixes.
+- Fix bug in hb_set_get_min().
+- Fix regression with Arabic mark positioning / width-zeroing.
+
+Overview of changes leading to 0.9.16
+Friday, April 19, 2013
+=====================================
+
+- Major speedup in OpenType lookup processing.  With the Amiri
+  Arabic font, this release is over 3x faster than previous
+  release.  All scripts / languages should see this speedup.
+
+- New --num-iterations option for hb-shape / hb-view; useful for
+  profiling.
+
+Overview of changes leading to 0.9.15
+Friday, April 05, 2013
+=====================================
+
+- Build fixes.
+- Fix crasher in graphite2 shaper.
+- Fix Arabic mark width zeroing regression.
+- Don't compose Hangul jamo into Unicode syllables.
+
+
+Overview of changes leading to 0.9.14
+Thursday, March 21, 2013
+=====================================
+
+- Build fixes.
+- Fix time-consuming sanitize with malicious fonts.
+- Implement hb_buffer_deserialize_glyphs() for both json and text.
+- Do not ignore Hangul filler characters.
+- Indic fixes:
+  * Fix Malayalam pre-base reordering interaction with post-forms.
+  * Further adjust ZWJ handling.  Should fix known regressions from
+    0.9.13.
+
+
+Overview of changes leading to 0.9.13
+Thursday, February 25, 2013
+=====================================
+
+- Build fixes.
+- Ngapi HarfBuzz Hackfest in London (February 2013):
+  * Fixed all known Indic bugs,
+  * New Win8-style Myanmar shaper,
+  * New South-East Asian shaper for Tai Tham, Cham, and New Tai Lue,
+  * Smartly ignore Default_Ignorable characters (joiners, etc) wheb
+    matching GSUB/GPOS lookups,
+  * Fix 'Phags-Pa U+A872 shaping,
+  * Fix partial disabling of default-on features,
+  * Allow disabling of TrueType kerning.
+- Fix possible crasher with broken fonts with overlapping tables.
+- Removed generated files from git again.  So, one needs ragel to
+  bootstrap from the git tree.
+
+API changes:
+- hb_shape() and related APIs now abort if buffer direction is
+  HB_DIRECTION_INVALID.  Previously, hb_shape() was calling
+  hb_buffer_guess_segment_properties() on the buffer before
+  shaping.  The heuristics in that function are fragile.  If the
+  user really wants the old behvaior, they can call that function
+  right before calling hb_shape() to get the old behavior.
+- hb_blob_create_sub_blob() always creates sub-blob with
+  HB_MEMORY_MODE_READONLY.  See comments for the reason.
+
+
+Overview of changes leading to 0.9.12
+Thursday, January 18, 2013
+=====================================
+
+- Build fixes for Sun compiler.
+- Minor bug fix.
+
+Overview of changes leading to 0.9.11
+Thursday, January 10, 2013
+=====================================
+
+- Build fixes.
+- Fix GPOS mark attachment with null Anchor offsets.
+- [Indic] Fix old-spec reordering of viramas if sequence ends in one.
+- Fix multi-threaded shaper data creation crash.
+- Add atomic ops for Solaris.
+
+API changes:
+- Rename hb_buffer_clear() to hb_buffer_clear_contents().
+
+
+Overview of changes leading to 0.9.10
+Thursday, January 3, 2013
+=====================================
+
+- [Indic] Fixed rendering of Malayalam dot-reph
+- Updated OT language tags.
+- Updated graphite2 backend.
+- Improved hb_ot_layout_get_size_params() logic.
+- Improve hb-shape/hb-view help output.
+- Fixed hb-set.h implementation to not crash.
+- Fixed various issues with hb_ot_layout_collect_lookups().
+- Various build fixes.
+
+New API:
+
+hb_graphite2_face_get_gr_face()
+hb_graphite2_font_get_gr_font()
+hb_coretext_face_get_cg_font()
+
+Modified API:
+
+hb_ot_layout_get_size_params()
+
+
+Overview of changes leading to 0.9.9
+Wednesday, December 5, 2012
+====================================
+
+- Fix build on Windows.
+- Minor improvements.
+
+
+Overview of changes leading to 0.9.8
+Tuesday, December 4, 2012
+====================================
+
+
+- Actually implement hb_shape_plan_get_shaper ().
+- Make UCDB data tables const.
+- Lots of internal refactoring in OTLayout tables.
+- Flesh out hb_ot_layout_lookup_collect_glyphs().
+
+New API:
+
+hb_ot_layout_collect_lookups()
+hb_ot_layout_get_size_params()
+
+
+Overview of changes leading to 0.9.7
+Sunday, November 21, 2012
+====================================
+
+
+HarfBuzz "All-You-Can-Eat-Sushi" (aka Vancouver) Hackfest and follow-on fixes.
+
+- Fix Arabic contextual joining using pre-context text.
+- Fix Sinhala "split matra" mess.
+- Fix Khmer shaping with broken fonts.
+- Implement Thai "PUA" shaping for old fonts.
+- Do NOT route Kharoshthi script through the Indic shaper.
+- Disable fallback positioning for Indic and Thai shapers.
+- Misc fixes.
+
+
+hb-shape / hb-view changes:
+
+- Add --text-before and --text-after
+- Add --bot / --eot / --preserve-default-ignorables
+- hb-shape --output-format=json
+
+
+New API:
+
+hb_buffer_clear()
+
+hb_buffer_flags_t
+
+HB_BUFFER_FLAGS_DEFAULT
+HB_BUFFER_FLAG_BOT
+HB_BUFFER_FLAG_EOT
+HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES
+
+hb_buffer_set_flags()
+hb_buffer_get_flags()
+
+HB_BUFFER_SERIALIZE_FLAGS
+hb_buffer_serialize_glyphs()
+hb_buffer_deserialize_glyphs()
+hb_buffer_serialize_list_formats()
+
+hb_set_add_range()
+hb_set_del_range()
+hb_set_get_population()
+hb_set_next_range()
+
+hb_face_[sg]et_glyph_count()
+
+hb_segment_properties_t
+HB_SEGMENT_PROPERTIES_DEFAULT
+hb_segment_properties_equal()
+hb_segment_properties_hash()
+
+hb_buffer_set_segment_properties()
+hb_buffer_get_segment_properties()
+
+hb_ot_layout_glyph_class_t
+hb_ot_layout_get_glyph_class()
+hb_ot_layout_get_glyphs_in_class()
+
+hb_shape_plan_t
+hb_shape_plan_create()
+hb_shape_plan_create_cached()
+hb_shape_plan_get_empty()
+hb_shape_plan_reference()
+hb_shape_plan_destroy()
+hb_shape_plan_set_user_data()
+hb_shape_plan_get_user_data()
+hb_shape_plan_execute()
+hb_shape_plan_get_shaper()
+
+hb_ot_shape_plan_collect_lookups()
+
+
+API changes:
+
+- Remove "mask" parameter from hb_buffer_add().
+- Rename hb_ot_layout_would_substitute_lookup() and hb_ot_layout_substitute_closure_lookup().
+- hb-set.h API const correction.
+- Renamed hb_set_min/max() to hb_set_get_min/max().
+- Rename hb_ot_layout_feature_get_lookup_indexes() to hb_ot_layout_feature_get_lookups().
+- Rename hb_buffer_guess_properties() to hb_buffer_guess_segment_properties().
+
+
+
+Overview of changes leading to 0.9.6
+Sunday, November 13, 2012
+====================================
+
+- Don't clear pre-context text if no new context is provided.
+- Fix ReverseChainingSubstLookup, which was totally borked.
+- Adjust output format of hb-shape a bit.
+- Include config.h.in in-tree.  Makes it easier for alternate build systems.
+- Fix hb_buffer_set_length(buffer, 0) invalid memory allocation.
+- Use ICU LayoutEngine's C API instead of C++.  Avoids much headache.
+- Drop glyphs for all of Unicode Default_Ignorable characters.
+- Misc build fixes.
+
+Arabic shaper:
+- Enable 'dlig' and 'mset' features in Arabic shaper.
+- Implement 'Phags-pa shaping, improve Mongolian.
+
+Indic shaper:
+- Decompose Sinhala split matras the way old HarfBuzz / Pango did.
+- Initial support for Consonant Medials.
+- Start adding new-style Myanmar shaping.
+- Make reph and 'pref' logic introspect the font.
+- Route Meetei-Mayek through the Indic shaper.
+- Don't apply 'liga' in Indic shaper.
+- Improve Malayalam pre-base reordering Ra interaction with Chillus.
+
+
+
+Overview of changes leading to 0.9.5
+Sunday, October 14, 2012
+====================================
+
+- Synthetic-GSUB Arabic fallback shaping.
+
+- Misc Indic improvements.
+
+- Add build system support for pthread.
+
+- Imported UCDN for in-tree Unicode callbacks implementation.
+
+- Context-aware Arabic joining.
+
+- Misc other fixes.
+
+- New API:
+
+  hb_feature_to/from-string()
+  hb_buffer_[sg]et_content_type()
+
+
+
+Overview of changes leading to 0.9.4
+Tuesday, Sep 03, 2012
+====================================
+
+- Indic improvements with old-spec Malayalam.
+
+- Better fallback glyph positioning, specially with Thai / Lao marks.
+
+- Implement dotted-circle insertion.
+
+- Better Arabic fallback shaping / ligation.
+
+- Added ICU LayoutEngine backend for testing.  Call it by the 'icu_le' name.
+
+- Misc fixes.
+
+
+
+Overview of changes leading to 0.9.3
+Friday, Aug 18, 2012
+====================================
+
+- Fixed fallback mark positioning for left-to-right text.
+
+- Improve mark positioning for the remaining combining classes.
+
+- Unbreak Thai and fallback Arabic shaping.
+
+- Port Arabic shaper to shape-plan caching.
+
+- Use new ICU normalizer functions.
+
+
+
+Overview of changes leading to 0.9.2
+Friday, Aug 10, 2012
+====================================
+
+- Over a thousand commits!  This is the first major release of HarfBuzz.
+
+- HarfBuzz is feature-complete now!  It should be in par, or better, than
+  both Pango's shapers and old HarfBuzz / Qt shapers.
+
+- New Indic shaper, supporting main Indic scripts, Sinhala, and Khmer.
+
+- Improved Arabic shaper, with fallback Arabic shaping, supporting Arabic,
+  Sinhala, N'ko, Mongolian, and Mandaic.
+
+- New Thai / Lao shaper.
+
+- Tibetan / Hangul support in the generic shaper.
+
+- Synthetic GDEF support for fonts without a GDEF table.
+
+- Fallback mark positioning for fonts without a GPOS table.
+
+- Unicode normalization shaping heuristic during glyph mapping.
+
+- New experimental Graphite2 backend.
+
+- New Uniscribe backend (primarily for testing).
+
+- New CoreText backend (primarily for testing).
+
+- Major optimization and speedup.
+
+- Test suites and testing infrastructure (work in progress).
+
+- Greatly improved hb-view cmdline tool.
+
+- hb-shape cmdline tool.
+
+- Unicode 6.1 support.
+
+Summary of API changes:
+
+o Changed API:
+
+  - Users are expected to only include main header files now (ie. hb.h,
+    hb-glib.h, hb-ft.h, ...)
+
+  - All struct tag names had their initial underscore removed.
+    Ie. "struct _hb_buffer_t" is "struct hb_buffer_t" now.
+
+  - All set_user_data() functions now take a "replace" boolean parameter.
+
+  - hb_buffer_create() takes zero arguments now.
+    Use hb_buffer_pre_allocate() to pre-allocate.
+
+  - hb_buffer_add_utf*() now accept -1 for length parameteres,
+    meaning "nul-terminated".
+
+  - hb_direction_t enum values changed.
+
+  - All *_from_string() APIs now take a length parameter to allow for
+    non-nul-terminated strings. A -1 length means "nul-terminated".
+
+  - Typedef for hb_language_t changed.
+
+  - hb_get_table_func_t renamed to hb_reference_table_func_t.
+
+  - hb_ot_layout_table_choose_script()
+
+  - Various renames in hb-unicode.h.
+
+o New API:
+
+  - hb_buffer_guess_properties()
+    Automatically called by hb_shape().
+
+  - hb_buffer_normalize_glyphs()
+
+  - hb_tag_from_string()
+
+  - hb-coretext.h
+
+  - hb-uniscribe.h
+
+  - hb_face_reference_blob()
+  - hb_face_[sg]et_index()
+  - hb_face_set_upem()
+
+  - hb_font_get_glyph_name_func_t
+    hb_font_get_glyph_from_name_func_t
+    hb_font_funcs_set_glyph_name_func()
+    hb_font_funcs_set_glyph_from_name_func()
+    hb_font_get_glyph_name()
+    hb_font_get_glyph_from_name()
+    hb_font_glyph_to_string()
+    hb_font_glyph_from_string()
+
+  - hb_font_set_funcs_data()
+
+  - hb_ft_font_set_funcs()
+  - hb_ft_font_get_face()
+
+  - hb-gobject.h (work in progress)
+
+  - hb_ot_shape_glyphs_closure()
+    hb_ot_layout_substitute_closure_lookup()
+
+  - hb-set.h
+
+  - hb_shape_full()
+
+  - hb_unicode_combining_class_t
+
+  - hb_unicode_compose_func_t
+    hb_unicode_decompose_func_t
+    hb_unicode_decompose_compatibility_func_t
+    hb_unicode_funcs_set_compose_func()
+    hb_unicode_funcs_set_decompose_func()
+    hb_unicode_funcs_set_decompose_compatibility_func()
+    hb_unicode_compose()
+    hb_unicode_decompose()
+    hb_unicode_decompose_compatibility()
+
+o Removed API:
+
+  - hb_ft_get_font_funcs()
+
+  - hb_ot_layout_substitute_start()
+    hb_ot_layout_substitute_lookup()
+    hb_ot_layout_substitute_finish()
+    hb_ot_layout_position_start()
+    hb_ot_layout_position_lookup()
+    hb_ot_layout_position_finish()
+
+
+
+Overview of changes leading to 0.6.0
+Friday, May 27, 2011
+====================================
+
+- Vertical text support in GPOS
+- Almost all API entries have unit tests now, under test/
+- All thread-safety issues are fixed
+
+Summary of API changes follows.
+
+
+* Simple Types API:
+
+  o New API:
+    HB_LANGUAGE_INVALID
+    hb_language_get_default()
+    hb_direction_to_string()
+    hb_direction_from_string()
+    hb_script_get_horizontal_direction()
+    HB_UNTAG()
+
+  o Renamed API:
+    hb_category_t renamed to hb_unicode_general_category_t
+
+  o Changed API:
+    hb_language_t is a typed pointers now
+
+  o Removed API:
+    HB_TAG_STR()
+
+
+* Use ISO 15924 tags for hb_script_t:
+
+  o New API:
+    hb_script_from_iso15924_tag()
+    hb_script_to_iso15924_tag()
+    hb_script_from_string()
+
+  o Changed API:
+    HB_SCRIPT_* enum members changed value.
+
+
+* Buffer API streamlined:
+
+  o New API:
+    hb_buffer_reset()
+    hb_buffer_set_length()
+    hb_buffer_allocation_successful()
+
+  o Renamed API:
+    hb_buffer_ensure() renamed to hb_buffer_pre_allocate()
+    hb_buffer_add_glyph() renamed to hb_buffer_add()
+
+  o Removed API:
+    hb_buffer_clear()
+    hb_buffer_clear_positions()
+
+  o Changed API:
+    hb_buffer_get_glyph_infos() takes an out length parameter now
+    hb_buffer_get_glyph_positions() takes an out length parameter now
+
+
+* Blob API streamlined:
+
+  o New API:
+    hb_blob_get_data()
+    hb_blob_get_data_writable()
+
+  o Renamed API:
+    hb_blob_create_empty() renamed to hb_blob_get_empty()
+
+  o Removed API:
+    hb_blob_lock()
+    hb_blob_unlock()
+    hb_blob_is_writable()
+    hb_blob_try_writable()
+
+  o Changed API:
+    hb_blob_create() takes user_data before destroy now
+
+
+* Unicode functions API:
+
+  o Unicode function vectors can subclass other unicode function vectors now.
+    Unimplemented callbacks in the subclass automatically chainup to the parent.
+
+  o All hb_unicode_funcs_t callbacks take a user_data now.  Their setters
+    take a user_data and its respective destroy callback.
+
+  o New API:
+    hb_unicode_funcs_get_empty()
+    hb_unicode_funcs_get_default()
+    hb_unicode_funcs_get_parent()
+
+  o Changed API:
+    hb_unicode_funcs_create() now takes a parent_funcs.
+
+  o Removed func getter functions:
+    hb_unicode_funcs_get_mirroring_func()
+    hb_unicode_funcs_get_general_category_func()
+    hb_unicode_funcs_get_script_func()
+    hb_unicode_funcs_get_combining_class_func()
+    hb_unicode_funcs_get_eastasian_width_func()
+
+
+* Face API:
+
+  o Renamed API:
+    hb_face_get_table() renamed to hb_face_reference_table()
+    hb_face_create_for_data() renamed to hb_face_create()
+
+  o Changed API:
+    hb_face_create_for_tables() takes user_data before destroy now
+    hb_face_reference_table() returns empty blob instead of NULL
+    hb_get_table_func_t accepts the face as first parameter now
+
+* Font API:
+
+  o Fonts can subclass other fonts now.  Unimplemented callbacks in the
+    subclass automatically chainup to the parent.  When chaining up,
+    scale is adjusted if the parent font has a different scale.
+
+  o All hb_font_funcs_t callbacks take a user_data now.  Their setters
+    take a user_data and its respective destroy callback.
+
+  o New API:
+    hb_font_get_parent()
+    hb_font_funcs_get_empty()
+    hb_font_create_sub_font()
+
+  o Removed API:
+    hb_font_funcs_copy()
+    hb_font_unset_funcs()
+
+  o Removed func getter functions:
+    hb_font_funcs_get_glyph_func()
+    hb_font_funcs_get_glyph_advance_func()
+    hb_font_funcs_get_glyph_extents_func()
+    hb_font_funcs_get_contour_point_func()
+    hb_font_funcs_get_kerning_func()
+
+  o Changed API:
+    hb_font_create() takes a face and references it now
+    hb_font_set_funcs() takes user_data before destroy now
+    hb_font_set_scale() accepts signed integers now
+    hb_font_get_contour_point_func_t now takes glyph first, then point_index
+    hb_font_get_glyph_func_t returns a success boolean now
+
+
+* Changed object model:
+
+  o All object types have a _get_empty() now:
+    hb_blob_get_empty()
+    hb_buffer_get_empty()
+    hb_face_get_empty()
+    hb_font_get_empty()
+    hb_font_funcs_get_empty()
+    hb_unicode_funcs_get_empty()
+
+  o Added _set_user_data() and _get_user_data() for all object types:
+    hb_blob_get_user_data()
+    hb_blob_set_user_data()
+    hb_buffer_get_user_data()
+    hb_buffer_set_user_data()
+    hb_face_get_user_data()
+    hb_face_set_user_data()
+    hb_font_funcs_get_user_data()
+    hb_font_funcs_set_user_data()
+    hb_font_get_user_data()
+    hb_font_set_user_data()
+    hb_unicode_funcs_get_user_data()
+    hb_unicode_funcs_set_user_data()
+
+  o Removed the _get_reference_count() from all object types:
+    hb_blob_get_reference_count()
+    hb_buffer_get_reference_count()
+    hb_face_get_reference_count()
+    hb_font_funcs_get_reference_count()
+    hb_font_get_reference_count()
+    hb_unicode_funcs_get_reference_count()
+
+  o Added _make_immutable() and _is_immutable() for all object types except for buffer:
+    hb_blob_make_immutable()
+    hb_blob_is_immutable()
+    hb_face_make_immutable()
+    hb_face_is_immutable()
+
+
+* Changed API for vertical text support
+
+  o The following callbacks where removed:
+    hb_font_get_glyph_advance_func_t
+    hb_font_get_kerning_func_t
+
+  o The following new callbacks added instead:
+    hb_font_get_glyph_h_advance_func_t
+    hb_font_get_glyph_v_advance_func_t
+    hb_font_get_glyph_h_origin_func_t
+    hb_font_get_glyph_v_origin_func_t
+    hb_font_get_glyph_h_kerning_func_t
+    hb_font_get_glyph_v_kerning_func_t
+
+  o The following API removed as such:
+    hb_font_funcs_set_glyph_advance_func()
+    hb_font_funcs_set_kerning_func()
+    hb_font_get_glyph_advance()
+    hb_font_get_kerning()
+
+  o New API added instead:
+    hb_font_funcs_set_glyph_h_advance_func()
+    hb_font_funcs_set_glyph_v_advance_func()
+    hb_font_funcs_set_glyph_h_origin_func()
+    hb_font_funcs_set_glyph_v_origin_func()
+    hb_font_funcs_set_glyph_h_kerning_func()
+    hb_font_funcs_set_glyph_v_kerning_func()
+    hb_font_get_glyph_h_advance()
+    hb_font_get_glyph_v_advance()
+    hb_font_get_glyph_h_origin()
+    hb_font_get_glyph_v_origin()
+    hb_font_get_glyph_h_kerning()
+    hb_font_get_glyph_v_kerning()
+
+  o The following higher-leve API added for convenience:
+    hb_font_get_glyph_advance_for_direction()
+    hb_font_get_glyph_origin_for_direction()
+    hb_font_add_glyph_origin_for_direction()
+    hb_font_subtract_glyph_origin_for_direction()
+    hb_font_get_glyph_kerning_for_direction()
+    hb_font_get_glyph_extents_for_origin()
+    hb_font_get_glyph_contour_point_for_origin()
+
+
+* OpenType Layout API:
+
+  o New API:
+    hb_ot_layout_position_start()
+    hb_ot_layout_substitute_start()
+    hb_ot_layout_substitute_finish()
+
+
+* Glue code:
+
+  o New API:
+    hb_glib_script_to_script()
+    hb_glib_script_from_script()
+    hb_icu_script_to_script()
+    hb_icu_script_from_script()
+
+
+* Version API added:
+
+  o New API:
+    HB_VERSION_MAJOR
+    HB_VERSION_MINOR
+    HB_VERSION_MICRO
+    HB_VERSION_STRING
+    HB_VERSION_CHECK()
+    hb_version()
+    hb_version_string()
+    hb_version_check()
+
+
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/README b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/README
new file mode 100644
index 0000000..fd93be8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/README
@@ -0,0 +1,18 @@
+[![Travis Build Status](https://travis-ci.org/harfbuzz/harfbuzz.svg?branch=master)](https://travis-ci.org/harfbuzz/harfbuzz)
+[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/0t0flrxpstj9lb9w?svg=true&branch=master)](https://ci.appveyor.com/project/harfbuzz/harfbuzz)
+[![CircleCI Build Status](https://circleci.com/gh/harfbuzz/harfbuzz/tree/master.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz/tree/master)
+[![Coverity Code Health](https://img.shields.io/coverity/scan/5450.svg)](https://scan.coverity.com/projects/behdad-harfbuzz)
+[![Codacy Code Health](https://api.codacy.com/project/badge/Grade/f17f1708783c447488bc8dd317150eaa)](https://app.codacy.com/app/behdad/harfbuzz)
+[![Codecov Code Coverage](https://codecov.io/gh/harfbuzz/harfbuzz/branch/master/graph/badge.svg)](https://codecov.io/gh/harfbuzz/harfbuzz)
+[![Coverals Code Coverage](https://img.shields.io/coveralls/harfbuzz/harfbuzz.svg)](https://coveralls.io/r/harfbuzz/harfbuzz)
+[ABI Tracker](http://abi-laboratory.pro/tracker/timeline/harfbuzz/)
+
+This is HarfBuzz, a text shaping library.
+
+For bug reports, mailing list, and other information please visit:
+
+  http://harfbuzz.org/
+
+For license information, see the file COPYING.
+
+Documentation: https://harfbuzz.github.io
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/README.python.md b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/README.python.md
new file mode 100644
index 0000000..7cf091a
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/README.python.md
@@ -0,0 +1,36 @@
+To enable HarfBuzz bindings for Python among other languages, make sure
+you have latest version of gobject-introspection available.  On Ubuntu,
+you can install that this way:
+
+```bash
+sudo apt-get install libgirepository1.0-dev
+```
+
+And then run autogen.sh (if building from git), and then:
+
+```bash
+./configure --with-gobject --enable-introspection
+```
+
+Make sure that gobject-introspection is enabled then in the final report.
+
+Compile and install.
+
+Make sure you have the installation lib dir in LD_LIBRARY_PATH, as needed
+for the linker to find the library.
+
+Then make sure you also have GI_TYPELIB_PATH pointing to the resulting
+$prefix/lib/girepository-* directory.
+
+Make sure you have pygobject installed.  Then check that the following
+import works in your Python interpreter:
+
+```python
+from gi.repository import HarfBuzz
+```
+
+If it does, you are ready to call HarfBuzz from Python!  Congratulations.
+See src/sample.py.
+
+The Python API will change.  Let us know on the mailing list if you are
+using it, and send lots of feedback.
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/README.wine.md b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/README.wine.md
new file mode 100644
index 0000000..799eb63
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/README.wine.md
@@ -0,0 +1,40 @@
+For the development of HarfBuzz, the Microsoft shaping technology, Uniscribe,
+as a widely used and tested shaper is used as more-or-less OpenType reference
+implementation and that specially is important where OpenType specification
+is or wasn't that clear. For having access to Uniscribe on Linux/macOS these
+steps are recommended:
+
+1. Install Wine from your favorite package manager.
+
+2. And `mingw-w64` compiler.
+   With `brew` on macOS, you can have it like `brew install mingw-w64`
+
+3. Download and put [this](https://drive.google.com/open?id=0B3_fQkxDZZXXbWltRGd5bjVrUDQ)
+   on your `~/.local/i686-w64-mingw32`.
+
+4. Replace all the instances of `/home/behdad/.local/i586-mingw32msvc`
+   and `/home/behdad/.local/i686-w64-mingw32` with `<$HOME>/.local/i686-w64-mingw32`
+   on that folder. (`<$HOME>` replace it with `/home/XXX` or `/Users/XXX` on macOS)
+
+   Probably you shouldn't replace the ones are inside binaries.
+
+5. `NOCONFIGURE=1 ./autogen.sh && mkdir winbuild && cd winbuild`
+
+6. `../mingw32.sh --with-uniscribe && cd ..`
+
+7. `make -Cwinbuild`
+
+Now you can use hb-shape using `wine winbuild/util/hb-shape.exe` but if you like to
+to use the original Uniscribe,
+
+8. Bring a 32bit version of `usp10.dll` for yourself from `C:\Windows\SysWOW64\usp10.dll` of your
+   Windows installation (assuming you have a 64-bit installation, otherwise `C:\Windows\System32\usp10.dll`)
+   that it is not a DirectWrite proxy ([for more info](https://en.wikipedia.org/wiki/Uniscribe)).
+   Rule of thumb, your `usp10.dll` should have a size more than 500kb, otherwise
+   it is designed to work with DirectWrite which Wine can't work with its original one.
+
+   Put the dll on the folder you are going to run the next command,
+
+9. `WINEDLLOVERRIDES="usp10=n" wine winbuild/util/hb-shape.exe fontname.ttf -u 0061,0062,0063 --shaper=uniscribe`
+
+(`0061,0062,0063` means `abc`, use test/shaping/hb-unicode-decode to generate ones you need)
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/RELEASING.md b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/RELEASING.md
new file mode 100644
index 0000000..1fd8365
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/RELEASING.md
@@ -0,0 +1,113 @@
+HarfBuzz release walk-through checklist:
+
+1. Open gitk and review changes since last release.
+
+   * `git diff $(git describe | sed 's/-.*//').. src/*.h` prints all public API
+     changes.
+
+     Document them in NEWS.  All API and API semantic changes should be clearly
+     marked as API additions, API changes, or API deletions.  Document
+     deprecations.  Ensure all new API / deprecations are in listed correctly in
+     docs/harfbuzz-sections.txt.  If release added new API, add entry for new
+     API index at the end of docs/harfbuzz-docs.xml.
+
+     If there's a backward-incompatible API change (including deletions for API
+     used anywhere), that's a release blocker.  Do NOT release.
+
+2. Based on severity of changes, decide whether it's a minor or micro release
+   number bump,
+
+3. Search for REPLACEME on the repository and replace it with the chosen version
+   for the release.
+
+4. Make sure you have correct date and new version at the top of NEWS file,
+
+5. Bump version in configure.ac line 3,
+
+6. Do "make distcheck", if it passes, you get a tarball.
+   Otherwise, fix things and commit them separately before making release,
+   Note: Check src/hb-version.h and make sure the new version number is
+   there.  Sometimes, it does not get updated.  If that's the case,
+   "touch configure.ac" and rebuild.  Also check that there is no hb-version.h
+   in your build/src file. Typically it will fail the distcheck if there is.
+   That's what happened to 2.0.0 going out with 1.8.0 hb-version.h...  So, that's
+   a clue.
+
+7. "make release-files".  Enter your GPG password.  This creates a sha256 hash
+   and signs it.
+
+8. Now that you have release files, commit NEWS, configure.ac, and src/hb-version.h,
+   as well as any REPLACEME changes you made.  The commit message is simply the
+   release number.  Eg. "1.4.7"
+
+9. Tag the release and sign it: Eg. "git tag -s 1.4.7 -m 1.4.7".  Enter your
+   GPG password again.
+
+10. Build win32 bundle.
+
+   a. Put contents of [this](https://drive.google.com/open?id=0B3_fQkxDZZXXbWltRGd5bjVrUDQ) on your `~/.local/i686-w64-mingw32`,
+
+   b. Run `../mingw32.sh --with-uniscribe` script to configure harfbuzz with mingw
+   in a subdirector (eg. winbuild/),
+
+   c. make
+
+   d. Back in the parent directory, run `./UPDATE.sh`(available below) to build win32
+      bundle.
+
+11. Copy all artefacts to users.freedesktop.org and move them into
+    `/srv/www.freedesktop.org/www/software/harfbuzz/release` There should be four
+    files.  Eg.:
+ ```
+-rw-r--r--  1 behdad eng 1592693 Jul 18 11:25 harfbuzz-1.4.7.tar.bz2
+-rw-r--r--  1 behdad eng      89 Jul 18 11:34 harfbuzz-1.4.7.tar.bz2.sha256
+-rw-r--r--  1 behdad eng     339 Jul 18 11:34 harfbuzz-1.4.7.tar.bz2.sha256.asc
+-rw-r--r--  1 behdad eng 2895619 Jul 18 11:34 harfbuzz-1.4.7-win32.zip
+```
+
+12. While doing that, quickly double-check the size of the .tar.bz2 and .zip
+    files against their previous releases to make sure nothing bad happened.
+    They should be in the ballpark, perhaps slightly larger.  Sometimes they
+    do shrink, that's not by itself a stopper.
+
+13. Push the commit and tag out: "git push --follow-tags".  Make sure it's
+    pushed both to freedesktop repo and github.
+
+14. Go to GitHub release page [here](https://github.com/harfbuzz/harfbuzz/releases),
+    edit the tag, upload artefacts and NEWS entry and save.
+
+
+## UPDATE.sh
+```bash
+#!/bin/bash
+
+v=$1
+
+if test "x$v" = x; then
+	echo "usage: UPDATE.sh micro-version"
+	exit 1
+fi
+
+dir_prefix=harfbuzz-1.4.
+dir_suffix=-win32
+dir=$dir_prefix$v$dir_suffix
+dir_old=$dir_prefix$((v-1))$dir_suffix
+if test -d "$dir"; then
+	echo "New dir $dir exists; not overwriting"
+	exit 1
+fi
+if ! test -d "$dir_old"; then
+	echo "Old dir $dir_old does NOT exist; aborting"
+	exit 1
+fi
+set -ex
+cp -a "$dir_old" "$dir.tmp"
+rm -f "$dir.tmp"/GDX32.dll
+rm -f "$dir.tmp"/usp10.dll
+cp ../winbuild/src/.libs/libharfbuzz-0.dll{,.def} $dir.tmp/
+cp ../winbuild/util/.libs/hb-{shape,view}.exe $dir.tmp/
+i686-w64-mingw32-strip $dir.tmp/{hb-shape.exe,hb-view.exe,libharfbuzz-0.dll}
+mv $dir.tmp $dir
+zip -r $dir.zip $dir
+echo Bundle $dir.zip ready
+```
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/THANKS b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/THANKS
new file mode 100644
index 0000000..940cfde
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/THANKS
@@ -0,0 +1,7 @@
+Bradley Grainger
+Khaled Hosny
+Kenichi Ishibashi
+Ryan Lortie
+Jeff Muizelaar
+suzuki toshiya
+Philip Withnall
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/TODO b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/TODO
new file mode 100644
index 0000000..d8e4105
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/TODO
@@ -0,0 +1,28 @@
+API issues:
+===========
+
+- API to accept a list of languages?
+
+- Remove hb_ot_shape_glyphs_closure()?
+
+
+API additions
+=============
+
+- Language to/from script.
+
+- Add hb-cairo glue
+
+- Add sanitize API.
+
+- Add query / enumeration API for aalt-like features?
+
+- Add segmentation API
+
+- Add hb-fribidi glue?
+
+
+hb-view / hb-shape enhancements:
+===============================
+
+- Add --width, --height, --auto-size, --ink-box, --align, etc?
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/aclocal.m4 b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/aclocal.m4
new file mode 100644
index 0000000..ecde363
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/aclocal.m4
@@ -0,0 +1,1594 @@
+# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
+
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+dnl -*- mode: autoconf -*-
+dnl Copyright 2009 Johan Dahlin
+dnl
+dnl This file is free software; the author(s) gives unlimited
+dnl permission to copy and/or distribute it, with or without
+dnl modifications, as long as this notice is preserved.
+dnl
+
+# serial 1
+
+m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL],
+[
+    AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
+    AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first
+    AC_BEFORE([LT_INIT],[$0])dnl setup libtool first
+
+    dnl enable/disable introspection
+    m4_if([$2], [require],
+    [dnl
+        enable_introspection=yes
+    ],[dnl
+        AC_ARG_ENABLE(introspection,
+                  AS_HELP_STRING([--enable-introspection[=@<:@no/auto/yes@:>@]],
+                                 [Enable introspection for this build]),, 
+                                 [enable_introspection=auto])
+    ])dnl
+
+    AC_MSG_CHECKING([for gobject-introspection])
+
+    dnl presence/version checking
+    AS_CASE([$enable_introspection],
+    [no], [dnl
+        found_introspection="no (disabled, use --enable-introspection to enable)"
+    ],dnl
+    [yes],[dnl
+        PKG_CHECK_EXISTS([gobject-introspection-1.0],,
+                         AC_MSG_ERROR([gobject-introspection-1.0 is not installed]))
+        PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1],
+                         found_introspection=yes,
+                         AC_MSG_ERROR([You need to have gobject-introspection >= $1 installed to build AC_PACKAGE_NAME]))
+    ],dnl
+    [auto],[dnl
+        PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, found_introspection=no)
+	dnl Canonicalize enable_introspection
+	enable_introspection=$found_introspection
+    ],dnl
+    [dnl	
+        AC_MSG_ERROR([invalid argument passed to --enable-introspection, should be one of @<:@no/auto/yes@:>@])
+    ])dnl
+
+    AC_MSG_RESULT([$found_introspection])
+
+    INTROSPECTION_SCANNER=
+    INTROSPECTION_COMPILER=
+    INTROSPECTION_GENERATE=
+    INTROSPECTION_GIRDIR=
+    INTROSPECTION_TYPELIBDIR=
+    if test "x$found_introspection" = "xyes"; then
+       INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
+       INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
+       INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
+       INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
+       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
+       INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
+       INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
+       INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
+    fi
+    AC_SUBST(INTROSPECTION_SCANNER)
+    AC_SUBST(INTROSPECTION_COMPILER)
+    AC_SUBST(INTROSPECTION_GENERATE)
+    AC_SUBST(INTROSPECTION_GIRDIR)
+    AC_SUBST(INTROSPECTION_TYPELIBDIR)
+    AC_SUBST(INTROSPECTION_CFLAGS)
+    AC_SUBST(INTROSPECTION_LIBS)
+    AC_SUBST(INTROSPECTION_MAKEFILE)
+
+    AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes")
+])
+
+
+dnl Usage:
+dnl   GOBJECT_INTROSPECTION_CHECK([minimum-g-i-version])
+
+AC_DEFUN([GOBJECT_INTROSPECTION_CHECK],
+[
+  _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1])
+])
+
+dnl Usage:
+dnl   GOBJECT_INTROSPECTION_REQUIRE([minimum-g-i-version])
+
+
+AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE],
+[
+  _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require])
+])
+
+dnl pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-
+dnl serial 11 (pkg-config-0.29)
+dnl
+dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+dnl 02111-1307, USA.
+dnl
+dnl As a special exception to the GNU General Public License, if you
+dnl distribute this file as part of a program that contains a
+dnl configuration script generated by Autoconf, you may include it under
+dnl the same distribution terms that you use for the rest of that
+dnl program.
+
+dnl PKG_PREREQ(MIN-VERSION)
+dnl -----------------------
+dnl Since: 0.29
+dnl
+dnl Verify that the version of the pkg-config macros are at least
+dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
+dnl installed version of pkg-config, this checks the developer's version
+dnl of pkg.m4 when generating configure.
+dnl
+dnl To ensure that this macro is defined, also add:
+dnl m4_ifndef([PKG_PREREQ],
+dnl     [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
+dnl
+dnl See the "Since" comment for each macro you use to see what version
+dnl of the macros you require.
+m4_defun([PKG_PREREQ],
+[m4_define([PKG_MACROS_VERSION], [0.29])
+m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
+    [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
+])dnl PKG_PREREQ
+
+dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
+dnl ----------------------------------
+dnl Since: 0.16
+dnl
+dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
+dnl first found in the path. Checks that the version of pkg-config found
+dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
+dnl used since that's the first version where most current features of
+dnl pkg-config existed.
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
+m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
+AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
+AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=m4_default([$1], [0.9.0])
+	AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		AC_MSG_RESULT([yes])
+	else
+		AC_MSG_RESULT([no])
+		PKG_CONFIG=""
+	fi
+fi[]dnl
+])dnl PKG_PROG_PKG_CONFIG
+
+dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------------------------------
+dnl Since: 0.18
+dnl
+dnl Check to see whether a particular set of modules exists. Similar to
+dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
+dnl
+dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+dnl only at the first occurence in configure.ac, so if the first place
+dnl it's called might be skipped (such as if it is within an "if", you
+dnl have to call PKG_CHECK_EXISTS manually
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_default([$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+
+dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+dnl ---------------------------------------------
+dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
+dnl pkg_failed based on the result.
+m4_define([_PKG_CONFIG],
+[if test -n "$$1"; then
+    pkg_cv_[]$1="$$1"
+ elif test -n "$PKG_CONFIG"; then
+    PKG_CHECK_EXISTS([$3],
+                     [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes ],
+		     [pkg_failed=yes])
+ else
+    pkg_failed=untried
+fi[]dnl
+])dnl _PKG_CONFIG
+
+dnl _PKG_SHORT_ERRORS_SUPPORTED
+dnl ---------------------------
+dnl Internal check to see if pkg-config supports short errors.
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])dnl _PKG_SHORT_ERRORS_SUPPORTED
+
+
+dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl   [ACTION-IF-NOT-FOUND])
+dnl --------------------------------------------------------------
+dnl Since: 0.4.0
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
+dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+   	AC_MSG_RESULT([no])
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
+        else 
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+	m4_default([$4], [AC_MSG_ERROR(
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT])[]dnl
+        ])
+elif test $pkg_failed = untried; then
+     	AC_MSG_RESULT([no])
+	m4_default([$4], [AC_MSG_FAILURE(
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
+        ])
+else
+	$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+	$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+	$3
+fi[]dnl
+])dnl PKG_CHECK_MODULES
+
+
+dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl   [ACTION-IF-NOT-FOUND])
+dnl ---------------------------------------------------------------------
+dnl Since: 0.29
+dnl
+dnl Checks for existence of MODULES and gathers its build flags with
+dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
+dnl and VARIABLE-PREFIX_LIBS from --libs.
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
+dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
+dnl configure.ac.
+AC_DEFUN([PKG_CHECK_MODULES_STATIC],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+_save_PKG_CONFIG=$PKG_CONFIG
+PKG_CONFIG="$PKG_CONFIG --static"
+PKG_CHECK_MODULES($@)
+PKG_CONFIG=$_save_PKG_CONFIG[]dnl
+])dnl PKG_CHECK_MODULES_STATIC
+
+
+dnl PKG_INSTALLDIR([DIRECTORY])
+dnl -------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable pkgconfigdir as the location where a module
+dnl should install pkg-config .pc files. By default the directory is
+dnl $libdir/pkgconfig, but the default can be changed by passing
+dnl DIRECTORY. The user can override through the --with-pkgconfigdir
+dnl parameter.
+AC_DEFUN([PKG_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+    [pkg-config installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([pkgconfigdir],
+    [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
+    [with_pkgconfigdir=]pkg_default)
+AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_INSTALLDIR
+
+
+dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
+dnl --------------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable noarch_pkgconfigdir as the location where a
+dnl module should install arch-independent pkg-config .pc files. By
+dnl default the directory is $datadir/pkgconfig, but the default can be
+dnl changed by passing DIRECTORY. The user can override through the
+dnl --with-noarch-pkgconfigdir parameter.
+AC_DEFUN([PKG_NOARCH_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+    [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([noarch-pkgconfigdir],
+    [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
+    [with_noarch_pkgconfigdir=]pkg_default)
+AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_NOARCH_INSTALLDIR
+
+
+dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
+dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------
+dnl Since: 0.28
+dnl
+dnl Retrieves the value of the pkg-config variable for the given module.
+AC_DEFUN([PKG_CHECK_VAR],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
+
+_PKG_CONFIG([$1], [variable="][$3]["], [$2])
+AS_VAR_COPY([$1], [pkg_cv_][$1])
+
+AS_VAR_IF([$1], [""], [$5], [$4])dnl
+])dnl PKG_CHECK_VAR
+
+# Copyright (C) 2002-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.15'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.15.1], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.15.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# Copyright (C) 2011-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_AR([ACT-IF-FAIL])
+# -------------------------
+# Try to determine the archiver interface, and trigger the ar-lib wrapper
+# if it is needed.  If the detection of archiver interface fails, run
+# ACT-IF-FAIL (default is to abort configure with a proper error message).
+AC_DEFUN([AM_PROG_AR],
+[AC_BEFORE([$0], [LT_INIT])dnl
+AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl
+AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([ar-lib])dnl
+AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false])
+: ${AR=ar}
+
+AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface],
+  [AC_LANG_PUSH([C])
+   am_cv_ar_interface=ar
+   AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])],
+     [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([am_ar_try])
+      if test "$ac_status" -eq 0; then
+        am_cv_ar_interface=ar
+      else
+        am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD'
+        AC_TRY_EVAL([am_ar_try])
+        if test "$ac_status" -eq 0; then
+          am_cv_ar_interface=lib
+        else
+          am_cv_ar_interface=unknown
+        fi
+      fi
+      rm -f conftest.lib libconftest.a
+     ])
+   AC_LANG_POP([C])])
+
+case $am_cv_ar_interface in
+ar)
+  ;;
+lib)
+  # Microsoft lib, so override with the ar-lib wrapper script.
+  # FIXME: It is wrong to rewrite AR.
+  # But if we don't then we get into trouble of one sort or another.
+  # A longer-term fix would be to have automake use am__AR in this case,
+  # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something
+  # similar.
+  AR="$am_aux_dir/ar-lib $AR"
+  ;;
+unknown)
+  m4_default([$1],
+             [AC_MSG_ERROR([could not determine $AR interface])])
+  ;;
+esac
+AC_SUBST([AR])dnl
+])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
+      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
+      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
+      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                    [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+  [--enable-dependency-tracking],
+  [do not reject slow dependency extractors])
+AS_HELP_STRING(
+  [--disable-dependency-tracking],
+  [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named 'Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running 'make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "$am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each '.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+             [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+  [ok:ok],,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES([CC])],
+		  [m4_define([AC_PROG_CC],
+			     m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES([CXX])],
+		  [m4_define([AC_PROG_CXX],
+			     m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES([OBJC])],
+		  [m4_define([AC_PROG_OBJC],
+			     m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+		  [_AM_DEPENDENCIES([OBJCXX])],
+		  [m4_define([AC_PROG_OBJCXX],
+			     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+  fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+  [whether $CC understands -c and -o together],
+  [am_cv_prog_cc_c_o],
+  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$[*]" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$[*]" != "X $srcdir/configure conftest.file" \
+	&& test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment])
+     fi
+     if test "$[2]" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+  [AC_MSG_CHECKING([that generated files are newer than configure])
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+  [--enable-silent-rules],
+  [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+  [--disable-silent-rules],
+  [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+   [am_cv_make_support_nested_variables],
+   [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+  dnl Using '$V' instead of '$(V)' breaks IRIX make.
+  AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+  [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+  [m4_case([$1],
+    [ustar],
+     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+      if test $am_uid -le $am_max_uid; then
+         AC_MSG_RESULT([yes])
+      else
+         AC_MSG_RESULT([no])
+         _am_tools=none
+      fi
+      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+      if test $am_gid -le $am_max_gid; then
+         AC_MSG_RESULT([yes])
+      else
+        AC_MSG_RESULT([no])
+        _am_tools=none
+      fi],
+
+  [pax],
+    [],
+
+  [m4_fatal([Unknown tar format])])
+
+  AC_MSG_CHECKING([how to create a $1 tar archive])
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        AM_RUN_LOG([$_am_tar --version]) && break
+      done
+      am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x $1 -w "$$tardir"'
+      am__tar_='pax -L -x $1 -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+      am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+      am__untar='cpio -i -H $1 -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
+
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_$1}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      AM_RUN_LOG([$am__untar <conftest.tar])
+      AM_RUN_LOG([cat conftest.dir/file])
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
+  rm -rf conftest.dir
+
+  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+  AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/ax_check_link_flag.m4])
+m4_include([m4/ax_code_coverage.m4])
+m4_include([m4/ax_pthread.m4])
+m4_include([m4/gtk-doc.m4])
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/ar-lib b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/ar-lib
new file mode 100755
index 0000000..05094d3
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/ar-lib
@@ -0,0 +1,270 @@
+#! /bin/sh
+# Wrapper for Microsoft lib.exe
+
+me=ar-lib
+scriptversion=2012-03-01.08; # UTC
+
+# Copyright (C) 2010-2017 Free Software Foundation, Inc.
+# Written by Peter Rosin <peda@lysator.liu.se>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+
+# func_error message
+func_error ()
+{
+  echo "$me: $1" 1>&2
+  exit 1
+}
+
+file_conv=
+
+# func_file_conv build_file
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+	# lazily determine how to convert abs files
+	case `uname -s` in
+	  MINGW*)
+	    file_conv=mingw
+	    ;;
+	  CYGWIN*)
+	    file_conv=cygwin
+	    ;;
+	  *)
+	    file_conv=wine
+	    ;;
+	esac
+      fi
+      case $file_conv in
+	mingw)
+	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+	  ;;
+	cygwin)
+	  file=`cygpath -m "$file" || echo "$file"`
+	  ;;
+	wine)
+	  file=`winepath -w "$file" || echo "$file"`
+	  ;;
+      esac
+      ;;
+  esac
+}
+
+# func_at_file at_file operation archive
+# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE
+# for each of them.
+# When interpreting the content of the @FILE, do NOT use func_file_conv,
+# since the user would need to supply preconverted file names to
+# binutils ar, at least for MinGW.
+func_at_file ()
+{
+  operation=$2
+  archive=$3
+  at_file_contents=`cat "$1"`
+  eval set x "$at_file_contents"
+  shift
+
+  for member
+  do
+    $AR -NOLOGO $operation:"$member" "$archive" || exit $?
+  done
+}
+
+case $1 in
+  '')
+     func_error "no command.  Try '$0 --help' for more information."
+     ;;
+  -h | --h*)
+    cat <<EOF
+Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...]
+
+Members may be specified in a file named with @FILE.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "$me, version $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test $# -lt 3; then
+  func_error "you must specify a program, an action and an archive"
+fi
+
+AR=$1
+shift
+while :
+do
+  if test $# -lt 2; then
+    func_error "you must specify a program, an action and an archive"
+  fi
+  case $1 in
+    -lib | -LIB \
+    | -ltcg | -LTCG \
+    | -machine* | -MACHINE* \
+    | -subsystem* | -SUBSYSTEM* \
+    | -verbose | -VERBOSE \
+    | -wx* | -WX* )
+      AR="$AR $1"
+      shift
+      ;;
+    *)
+      action=$1
+      shift
+      break
+      ;;
+  esac
+done
+orig_archive=$1
+shift
+func_file_conv "$orig_archive"
+archive=$file
+
+# strip leading dash in $action
+action=${action#-}
+
+delete=
+extract=
+list=
+quick=
+replace=
+index=
+create=
+
+while test -n "$action"
+do
+  case $action in
+    d*) delete=yes  ;;
+    x*) extract=yes ;;
+    t*) list=yes    ;;
+    q*) quick=yes   ;;
+    r*) replace=yes ;;
+    s*) index=yes   ;;
+    S*)             ;; # the index is always updated implicitly
+    c*) create=yes  ;;
+    u*)             ;; # TODO: don't ignore the update modifier
+    v*)             ;; # TODO: don't ignore the verbose modifier
+    *)
+      func_error "unknown action specified"
+      ;;
+  esac
+  action=${action#?}
+done
+
+case $delete$extract$list$quick$replace,$index in
+  yes,* | ,yes)
+    ;;
+  yesyes*)
+    func_error "more than one action specified"
+    ;;
+  *)
+    func_error "no action specified"
+    ;;
+esac
+
+if test -n "$delete"; then
+  if test ! -f "$orig_archive"; then
+    func_error "archive not found"
+  fi
+  for member
+  do
+    case $1 in
+      @*)
+        func_at_file "${1#@}" -REMOVE "$archive"
+        ;;
+      *)
+        func_file_conv "$1"
+        $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $?
+        ;;
+    esac
+  done
+
+elif test -n "$extract"; then
+  if test ! -f "$orig_archive"; then
+    func_error "archive not found"
+  fi
+  if test $# -gt 0; then
+    for member
+    do
+      case $1 in
+        @*)
+          func_at_file "${1#@}" -EXTRACT "$archive"
+          ;;
+        *)
+          func_file_conv "$1"
+          $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $?
+          ;;
+      esac
+    done
+  else
+    $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
+    do
+      $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
+    done
+  fi
+
+elif test -n "$quick$replace"; then
+  if test ! -f "$orig_archive"; then
+    if test -z "$create"; then
+      echo "$me: creating $orig_archive"
+    fi
+    orig_archive=
+  else
+    orig_archive=$archive
+  fi
+
+  for member
+  do
+    case $1 in
+    @*)
+      func_file_conv "${1#@}"
+      set x "$@" "@$file"
+      ;;
+    *)
+      func_file_conv "$1"
+      set x "$@" "$file"
+      ;;
+    esac
+    shift
+    shift
+  done
+
+  if test -n "$orig_archive"; then
+    $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $?
+  else
+    $AR -NOLOGO -OUT:"$archive" "$@" || exit $?
+  fi
+
+elif test -n "$list"; then
+  if test ! -f "$orig_archive"; then
+    func_error "archive not found"
+  fi
+  $AR -NOLOGO -LIST "$archive" || exit $?
+fi
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/autogen.sh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/autogen.sh
new file mode 100755
index 0000000..fd5c198
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/autogen.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+test -n "$srcdir" || srcdir=`dirname "$0"`
+test -n "$srcdir" || srcdir=.
+
+olddir=`pwd`
+cd $srcdir
+
+#echo -n "checking for ragel... "
+#which ragel || {
+#	echo "You need to install ragel... See http://www.complang.org/ragel/"
+#	exit 1
+#}
+
+echo -n "checking for pkg-config... "
+which pkg-config || {
+	echo "*** No pkg-config found, please install it ***"
+	exit 1
+}
+
+echo -n "checking for libtoolize... "
+which glibtoolize || which libtoolize || {
+	echo "*** No libtoolize (libtool) found, please install it ***"
+	exit 1
+}
+echo -n "checking for gtkdocize... "
+if which gtkdocize ; then
+	gtkdocize --copy || exit 1
+else
+	echo "*** No gtkdocize (gtk-doc) found, skipping documentation ***"
+	echo "EXTRA_DIST = " > gtk-doc.make
+fi
+
+echo -n "checking for autoreconf... "
+which autoreconf || {
+	echo "*** No autoreconf (autoconf) found, please install it ***"
+	exit 1
+}
+
+echo "running autoreconf --force --install --verbose"
+autoreconf --force --install --verbose || exit $?
+
+cd $olddir
+test -n "$NOCONFIGURE" || {
+	echo "running configure $@"
+	"$srcdir/configure" "$@"
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/compile b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/compile
new file mode 100755
index 0000000..a85b723
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/compile
@@ -0,0 +1,347 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2012-10-14.11; # UTC
+
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""	$nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+	# lazily determine how to convert abs files
+	case `uname -s` in
+	  MINGW*)
+	    file_conv=mingw
+	    ;;
+	  CYGWIN*)
+	    file_conv=cygwin
+	    ;;
+	  *)
+	    file_conv=wine
+	    ;;
+	esac
+      fi
+      case $file_conv/,$2, in
+	*,$file_conv,*)
+	  ;;
+	mingw/*)
+	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+	  ;;
+	cygwin/*)
+	  file=`cygpath -m "$file" || echo "$file"`
+	  ;;
+	wine/*)
+	  file=`winepath -w "$file" || echo "$file"`
+	  ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+    if test -f "$dir/lib$lib.a"; then
+      found=yes
+      lib=$dir/lib$lib.a
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+	-o)
+	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
+	  eat=1
+	  case $2 in
+	    *.o | *.[oO][bB][jJ])
+	      func_file_conv "$2"
+	      set x "$@" -Fo"$file"
+	      shift
+	      ;;
+	    *)
+	      func_file_conv "$2"
+	      set x "$@" -Fe"$file"
+	      shift
+	      ;;
+	  esac
+	  ;;
+	-I)
+	  eat=1
+	  func_file_conv "$2" mingw
+	  set x "$@" -I"$file"
+	  shift
+	  ;;
+	-I*)
+	  func_file_conv "${1#-I}" mingw
+	  set x "$@" -I"$file"
+	  shift
+	  ;;
+	-l)
+	  eat=1
+	  func_cl_dashl "$2"
+	  set x "$@" "$lib"
+	  shift
+	  ;;
+	-l*)
+	  func_cl_dashl "${1#-l}"
+	  set x "$@" "$lib"
+	  shift
+	  ;;
+	-L)
+	  eat=1
+	  func_cl_dashL "$2"
+	  ;;
+	-L*)
+	  func_cl_dashL "${1#-L}"
+	  ;;
+	-static)
+	  shared=false
+	  ;;
+	-Wl,*)
+	  arg=${1#-Wl,}
+	  save_ifs="$IFS"; IFS=','
+	  for flag in $arg; do
+	    IFS="$save_ifs"
+	    linker_opts="$linker_opts $flag"
+	  done
+	  IFS="$save_ifs"
+	  ;;
+	-Xlinker)
+	  eat=1
+	  linker_opts="$linker_opts $2"
+	  ;;
+	-*)
+	  set x "$@" "$1"
+	  shift
+	  ;;
+	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+	  func_file_conv "$1"
+	  set x "$@" -Tp"$file"
+	  shift
+	  ;;
+	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+	  func_file_conv "$1" mingw
+	  set x "$@" "$file"
+	  shift
+	  ;;
+	*)
+	  set x "$@" "$1"
+	  shift
+	  ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+	# configure might choose to run compile as 'compile cc -o foo foo.c'.
+	# So we strip '-o arg' only if arg is an object.
+	eat=1
+	case $2 in
+	  *.o | *.obj)
+	    ofile=$2
+	    ;;
+	  *)
+	    set x "$@" -o "$2"
+	    shift
+	    ;;
+	esac
+	;;
+      *.c)
+	cfile=$1
+	set x "$@" "$1"
+	shift
+	;;
+      *)
+	set x "$@" "$1"
+	shift
+	;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no '-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # '.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/config.guess b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/config.guess
new file mode 100755
index 0000000..31e01ef
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/config.guess
@@ -0,0 +1,1463 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright 1992-2017 Free Software Foundation, Inc.
+
+timestamp='2017-11-07'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Options:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2017 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	LIBC=gnu
+
+	eval $set_cc_for_build
+	cat <<-EOF > $dummy.c
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#else
+	LIBC=gnu
+	#endif
+	EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+	;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || \
+	    echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently (or will in the future) and ABI.
+	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		os=netbsdelf
+		;;
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+		os=netbsd
+		;;
+	esac
+	# Determine ABI tags.
+	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}${abi}"
+	exit ;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:LibertyBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
+	exit ;;
+    *:MidnightBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-midnightbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:Sortix:*:*)
+	echo ${UNAME_MACHINE}-unknown-sortix
+	exit ;;
+    *:Redox:*:*)
+	echo ${UNAME_MACHINE}-unknown-redox
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE=alpha ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE=alpha ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE=alpha ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE=alphaev5 ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE=alphaev56 ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE=alphapca56 ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE=alphapca57 ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE=alphaev6 ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE=alphaev67 ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE=alphaev69 ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE=alphaev7 ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE=alphaev79 ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+	echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH=i386
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH=x86_64
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+	echo m68k-milan-mint${UNAME_RELEASE}
+	exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+	echo m68k-hades-mint${UNAME_RELEASE}
+	exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+	echo m68k-unknown-mint${UNAME_RELEASE}
+	exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[4567])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31?)            HP_ARCH=m68000 ;;
+	    9000/[34]??)         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "${sc_cpu_version}" in
+		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "${sc_kernel_bits}" in
+			  32) HP_ARCH=hppa2.0n ;;
+			  64) HP_ARCH=hppa2.0w ;;
+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
+			esac ;;
+		    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^		//' << EOF >$dummy.c
+
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
+
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
+EOF
+		    (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = hppa2.0w ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH=hppa2.0w
+	    else
+		HP_ARCH=hppa64
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+	exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+	exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+	exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+	exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case ${UNAME_PROCESSOR} in
+	    amd64)
+		UNAME_PROCESSOR=x86_64 ;;
+	    i386)
+		UNAME_PROCESSOR=i586 ;;
+	esac
+	echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW64*:*)
+	echo ${UNAME_MACHINE}-pc-mingw64
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    *:MSYS*:*)
+	echo ${UNAME_MACHINE}-pc-msys
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:*)
+	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	else
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+	    else
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+	    fi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    cris:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    crisv32:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    e2k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    frv:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    hexagon:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    i*86:Linux:*:*)
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    k1om:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+	;;
+    mips64el:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-${LIBC}
+	exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-${LIBC}
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-${LIBC}
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+	  *)    echo hppa-unknown-linux-${LIBC} ;;
+	esac
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-${LIBC}
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-${LIBC}
+	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-${LIBC}
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-${LIBC}
+	exit ;;
+    riscv32:Linux:*:* | riscv64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
+	exit ;;
+    sh64*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    tile*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
+	exit ;;
+    x86_64:Linux:*:*)
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+	exit ;;
+    xtensa*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+	# Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configure will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+	exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel@ccMail.Census.GOV>
+	echo i586-unisys-sysv4
+	exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+		echo mips-nec-sysv${UNAME_RELEASE}
+	else
+		echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+	exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    x86_64:Haiku:*:*)
+	echo x86_64-unknown-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-ACE:SUPER-UX:*:*)
+	echo sxace-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	eval $set_cc_for_build
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
+	fi
+	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		       (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		       grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
+		# On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+		if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+		       (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		       grep IS_PPC >/dev/null
+		then
+		    UNAME_PROCESSOR=powerpc
+		fi
+	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
+	fi
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = x86; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NEO-*:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-*:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSX-*:NONSTOP_KERNEL:*:*)
+	echo nsx-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = 386; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+	echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
+	exit ;;
+    amd64:Isilon\ OneFS:*:*)
+	echo x86_64-unknown-onefs
+	exit ;;
+esac
+
+echo "$0: unable to guess system type" >&2
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}" in
+    mips:Linux | mips64:Linux)
+	# If we got here on MIPS GNU/Linux, output extra information.
+	cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+	;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+and
+  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-functions 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/config.h.in b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/config.h.in
new file mode 100644
index 0000000..7faa9fd
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/config.h.in
@@ -0,0 +1,194 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* The normal alignment of `struct{char;}', in bytes. */
+#undef ALIGNOF_STRUCT_CHAR__
+
+/* Define to 1 if you have the `atexit' function. */
+#undef HAVE_ATEXIT
+
+/* Have cairo graphics library */
+#undef HAVE_CAIRO
+
+/* Have cairo-ft support in cairo graphics library */
+#undef HAVE_CAIRO_FT
+
+/* Have Core Text backend */
+#undef HAVE_CORETEXT
+
+/* Define to 1 if you have the declaration of `round', and to 0 if you don't.
+   */
+#undef HAVE_DECL_ROUND
+
+/* Have DirectWrite library */
+#undef HAVE_DIRECTWRITE
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <dwrite.h> header file. */
+#undef HAVE_DWRITE_H
+
+/* Have simple TrueType Layout backend */
+#undef HAVE_FALLBACK
+
+/* Have fontconfig library */
+#undef HAVE_FONTCONFIG
+
+/* Have FreeType 2 library */
+#undef HAVE_FREETYPE
+
+/* Define to 1 if you have the `FT_Done_MM_Var' function. */
+#undef HAVE_FT_DONE_MM_VAR
+
+/* Define to 1 if you have the `FT_Get_Var_Blend_Coordinates' function. */
+#undef HAVE_FT_GET_VAR_BLEND_COORDINATES
+
+/* Define to 1 if you have the `FT_Set_Var_Blend_Coordinates' function. */
+#undef HAVE_FT_SET_VAR_BLEND_COORDINATES
+
+/* Define to 1 if you have the `getpagesize' function. */
+#undef HAVE_GETPAGESIZE
+
+/* Have glib2 library */
+#undef HAVE_GLIB
+
+/* Have gobject2 library */
+#undef HAVE_GOBJECT
+
+/* Have Graphite2 library */
+#undef HAVE_GRAPHITE2
+
+/* Have ICU library */
+#undef HAVE_ICU
+
+/* Use hb-icu Unicode callbacks */
+#undef HAVE_ICU_BUILTIN
+
+/* Have Intel __sync_* atomic primitives */
+#undef HAVE_INTEL_ATOMIC_PRIMITIVES
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `isatty' function. */
+#undef HAVE_ISATTY
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mmap' function. */
+#undef HAVE_MMAP
+
+/* Define to 1 if you have the `mprotect' function. */
+#undef HAVE_MPROTECT
+
+/* Define to 1 if you have the `newlocale' function. */
+#undef HAVE_NEWLOCALE
+
+/* Define to 1 if you have the `posix_memalign' function. */
+#undef HAVE_POSIX_MEMALIGN
+
+/* Have POSIX threads */
+#undef HAVE_PTHREAD
+
+/* Have PTHREAD_PRIO_INHERIT. */
+#undef HAVE_PTHREAD_PRIO_INHERIT
+
+/* Define to 1 if you have the `round' function. */
+#undef HAVE_ROUND
+
+/* Define to 1 if you have the <sched.h> header file. */
+#undef HAVE_SCHED_H
+
+/* Have sched_yield */
+#undef HAVE_SCHED_YIELD
+
+/* Have Solaris __machine_*_barrier and atomic_* operations */
+#undef HAVE_SOLARIS_ATOMIC_OPS
+
+/* Define to 1 if you have the <stdbool.h> header file. */
+#undef HAVE_STDBOOL_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strtod_l' function. */
+#undef HAVE_STRTOD_L
+
+/* Define to 1 if you have the `sysconf' function. */
+#undef HAVE_SYSCONF
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#undef HAVE_SYS_MMAN_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Have UCDN Unicode functions */
+#undef HAVE_UCDN
+
+/* Have Uniscribe library */
+#undef HAVE_UNISCRIBE
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the <usp10.h> header file. */
+#undef HAVE_USP10_H
+
+/* Define to 1 if you have the <windows.h> header file. */
+#undef HAVE_WINDOWS_H
+
+/* Define to 1 if you have the <xlocale.h> header file. */
+#undef HAVE_XLOCALE_H
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#undef LT_OBJDIR
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+   your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/config.sub b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/config.sub
new file mode 100755
index 0000000..00f68b8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/config.sub
@@ -0,0 +1,1848 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright 1992-2017 Free Software Foundation, Inc.
+
+timestamp='2017-11-23'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2017 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
+  kopensolaris*-gnu* | cloudabi*-eabi* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray | -microblaze*)
+		os=
+		basic_machine=$1
+		;;
+	-bluegene*)
+		os=-cnk
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+	-chorusrdb)
+		os=-chorusrdb
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*178)
+		os=-lynxos178
+		;;
+	-lynx*5)
+		os=-lynxos5
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| aarch64 | aarch64_be \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arceb \
+	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+	| avr | avr32 \
+	| ba \
+	| be32 | be64 \
+	| bfin \
+	| c4x | c8051 | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| e2k | epiphany \
+	| fido | fr30 | frv | ft32 \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
+	| i370 | i860 | i960 | ia16 | ia64 \
+	| ip2k | iq2000 \
+	| k1om \
+	| le32 | le64 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipsr5900 | mipsr5900el \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nds32 | nds32le | nds32be \
+	| nios | nios2 | nios2eb | nios2el \
+	| ns16k | ns32k \
+	| open8 | or1k | or1knd | or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
+	| pru \
+	| pyramid \
+	| riscv32 | riscv64 \
+	| rl78 | rx \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| visium \
+	| wasm32 \
+	| x86 | xc16x | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	leon|leon[3-9])
+		basic_machine=sparc-$basic_machine
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| aarch64-* | aarch64_be-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| ba-* \
+	| be32-* | be64-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| c8051-* | clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| e2k-* | elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
+	| i*86-* | i860-* | i960-* | ia16-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| k1om-* \
+	| le32-* | le64-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| microblaze-* | microblazeel-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipsr5900-* | mipsr5900el-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nds32-* | nds32le-* | nds32be-* \
+	| nios-* | nios2-* | nios2eb-* | nios2el-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
+	| or1k*-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+	| pru-* \
+	| pyramid-* \
+	| riscv32-* | riscv64-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
+	| tahoe-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
+	| tron-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
+	| visium-* \
+	| wasm32-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	asmjs)
+		basic_machine=asmjs-unknown
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16 | cr16-*)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2*)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	e500v[12])
+		basic_machine=powerpc-unknown
+		os=$os"spe"
+		;;
+	e500v[12]-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=$os"spe"
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	leon-*|leon[3-9]-*)
+		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	microblaze*)
+		basic_machine=microblaze-xilinx
+		;;
+	mingw64)
+		basic_machine=x86_64-pc
+		os=-mingw64
+		;;
+	mingw32)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	msys)
+		basic_machine=i686-pc
+		os=-msys
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next)
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	nsx-tandem)
+		basic_machine=nsx-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc | ppcbe)	basic_machine=powerpc-unknown
+		;;
+	ppc-* | ppcbe-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos | rdos64)
+		basic_machine=x86_64-pc
+		os=-rdos
+		;;
+	rdos32)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tile*)
+		basic_machine=$basic_machine-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	wasm32)
+		basic_machine=wasm32-unknown
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	x64)
+		basic_machine=x86_64-pc
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	xscale-* | xscalee[bl]-*)
+		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+	# First match some system type aliases that might get confused
+	# with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-auroraux)
+		os=-auroraux
+		;;
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# Now accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST end in a * to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* | -plan9* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* | -cloudabi* | -sortix* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+	      | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+	-os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2)
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-pikeos*)
+		# Until real need of OS specific support for
+		# particular features comes up, bare metal
+		# configurations are quite functional.
+		case $basic_machine in
+		    arm*)
+			os=-eabi
+			;;
+		    *)
+			os=-elf
+			;;
+		esac
+		;;
+	-nacl*)
+		;;
+	-ios)
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	score-*)
+		os=-elf
+		;;
+	spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	c8051-*)
+		os=-elf
+		;;
+	hexagon-*)
+		os=-elf
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	pru-*)
+		os=-elf
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next)
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-cnk*|-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-functions 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/configure b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/configure
new file mode 100755
index 0000000..54a04a1
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/configure
@@ -0,0 +1,23843 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for HarfBuzz 2.3.1.
+#
+# Report bugs to <https://github.com/harfbuzz/harfbuzz/issues/new>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: https://github.com/harfbuzz/harfbuzz/issues/new about
+$0: your system, including any error possibly output before
+$0: this message. Then install a modern shell, or manually
+$0: run the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='HarfBuzz'
+PACKAGE_TARNAME='harfbuzz'
+PACKAGE_VERSION='2.3.1'
+PACKAGE_STRING='HarfBuzz 2.3.1'
+PACKAGE_BUGREPORT='https://github.com/harfbuzz/harfbuzz/issues/new'
+PACKAGE_URL='http://harfbuzz.org/'
+
+ac_unique_file="src/harfbuzz.pc.in"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+HAVE_CORETEXT_FALSE
+HAVE_CORETEXT_TRUE
+CORETEXT_LIBS
+CORETEXT_CFLAGS
+HAVE_DIRECTWRITE_FALSE
+HAVE_DIRECTWRITE_TRUE
+DIRECTWRITE_LIBS
+DIRECTWRITE_CXXFLAGS
+HAVE_UNISCRIBE_FALSE
+HAVE_UNISCRIBE_TRUE
+UNISCRIBE_LIBS
+UNISCRIBE_CFLAGS
+HAVE_FREETYPE_FALSE
+HAVE_FREETYPE_TRUE
+FREETYPE_LIBS
+FREETYPE_CFLAGS
+FREETYPE_DEPS
+HAVE_GRAPHITE2_FALSE
+HAVE_GRAPHITE2_TRUE
+GRAPHITE2_LIBS
+GRAPHITE2_CFLAGS
+GRAPHITE2_DEPS
+HAVE_UCDN_FALSE
+HAVE_UCDN_TRUE
+HAVE_ICU_BUILTIN_FALSE
+HAVE_ICU_BUILTIN_TRUE
+HAVE_ICU_FALSE
+HAVE_ICU_TRUE
+ICU_CONFIG
+ICU_LIBS
+ICU_CFLAGS
+HAVE_FONTCONFIG_FALSE
+HAVE_FONTCONFIG_TRUE
+FONTCONFIG_LIBS
+FONTCONFIG_CFLAGS
+HAVE_CAIRO_FT_FALSE
+HAVE_CAIRO_FT_TRUE
+CAIRO_FT_LIBS
+CAIRO_FT_CFLAGS
+HAVE_CAIRO_FALSE
+HAVE_CAIRO_TRUE
+CAIRO_LIBS
+CAIRO_CFLAGS
+HAVE_INTROSPECTION_FALSE
+HAVE_INTROSPECTION_TRUE
+INTROSPECTION_MAKEFILE
+INTROSPECTION_LIBS
+INTROSPECTION_CFLAGS
+INTROSPECTION_TYPELIBDIR
+INTROSPECTION_GIRDIR
+INTROSPECTION_GENERATE
+INTROSPECTION_COMPILER
+INTROSPECTION_SCANNER
+have_gobject
+HAVE_GOBJECT_FALSE
+HAVE_GOBJECT_TRUE
+GLIB_MKENUMS
+GOBJECT_LIBS
+GOBJECT_CFLAGS
+HAVE_GLIB_FALSE
+HAVE_GLIB_TRUE
+GLIB_LIBS
+GLIB_CFLAGS
+GLIB_DEPS
+HAVE_FALLBACK_FALSE
+HAVE_FALLBACK_TRUE
+HAVE_PTHREAD_FALSE
+HAVE_PTHREAD_TRUE
+PTHREAD_CFLAGS
+PTHREAD_LIBS
+PTHREAD_CC
+ax_pthread_config
+OS_WIN32_FALSE
+OS_WIN32_TRUE
+HAVE_GCC_FALSE
+HAVE_GCC_TRUE
+GTK_DOC_USE_REBASE_FALSE
+GTK_DOC_USE_REBASE_TRUE
+GTK_DOC_USE_LIBTOOL_FALSE
+GTK_DOC_USE_LIBTOOL_TRUE
+GTK_DOC_BUILD_PDF_FALSE
+GTK_DOC_BUILD_PDF_TRUE
+GTK_DOC_BUILD_HTML_FALSE
+GTK_DOC_BUILD_HTML_TRUE
+ENABLE_GTK_DOC_FALSE
+ENABLE_GTK_DOC_TRUE
+HAVE_GTK_DOC_FALSE
+HAVE_GTK_DOC_TRUE
+GTKDOC_DEPS_LIBS
+GTKDOC_DEPS_CFLAGS
+HTML_DIR
+GTKDOC_MKPDF
+GTKDOC_REBASE
+GTKDOC_CHECK_PATH
+GTKDOC_CHECK
+WITH_LIBSTDCXX_FALSE
+WITH_LIBSTDCXX_TRUE
+HB_LIBTOOL_VERSION_INFO
+HB_VERSION
+HB_VERSION_MICRO
+HB_VERSION_MINOR
+HB_VERSION_MAJOR
+GIT
+RAGEL
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+PKG_CONFIG
+CXXCPP
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+CPP
+LT_SYS_LIBRARY_PATH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+DLLTOOL
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+LIBTOOL
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+ac_ct_AR
+AR
+CODE_COVERAGE_RULES
+CODE_COVERAGE_LDFLAGS
+CODE_COVERAGE_LIBS
+CODE_COVERAGE_CXXFLAGS
+CODE_COVERAGE_CFLAGS
+CODE_COVERAGE_CPPFLAGS
+GENHTML
+LCOV
+GCOV
+CODE_COVERAGE_ENABLED
+CODE_COVERAGE_ENABLED_FALSE
+CODE_COVERAGE_ENABLED_TRUE
+SED
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+runstatedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+with_gcov
+enable_code_coverage
+enable_dependency_tracking
+enable_static
+enable_shared
+with_pic
+enable_fast_install
+with_aix_soname
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+enable_largefile
+with_libstdc__
+with_html_dir
+enable_gtk_doc
+enable_gtk_doc_html
+enable_gtk_doc_pdf
+with_glib
+with_gobject
+enable_introspection
+with_cairo
+with_fontconfig
+with_icu
+with_ucdn
+with_graphite2
+with_freetype
+with_uniscribe
+with_directwrite
+with_coretext
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+LT_SYS_LIBRARY_PATH
+CPP
+CXX
+CXXFLAGS
+CCC
+CXXCPP
+PKG_CONFIG
+PKG_CONFIG_PATH
+PKG_CONFIG_LIBDIR
+GTKDOC_DEPS_CFLAGS
+GTKDOC_DEPS_LIBS
+GLIB_CFLAGS
+GLIB_LIBS
+GOBJECT_CFLAGS
+GOBJECT_LIBS
+CAIRO_CFLAGS
+CAIRO_LIBS
+CAIRO_FT_CFLAGS
+CAIRO_FT_LIBS
+FONTCONFIG_CFLAGS
+FONTCONFIG_LIBS
+ICU_CFLAGS
+ICU_LIBS
+GRAPHITE2_CFLAGS
+GRAPHITE2_LIBS
+FREETYPE_CFLAGS
+FREETYPE_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir runstatedir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures HarfBuzz 2.3.1 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/harfbuzz]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of HarfBuzz 2.3.1:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-silent-rules   less verbose build output (undo: "make V=1")
+  --disable-silent-rules  verbose build output (undo: "make V=0")
+  --enable-code-coverage  Whether to enable code coverage support
+  --enable-dependency-tracking
+                          do not reject slow dependency extractors
+  --disable-dependency-tracking
+                          speeds up one-time build
+  --enable-static[=PKGS]  build static libraries [default=no]
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+  --disable-largefile     omit support for large files
+  --enable-gtk-doc        use gtk-doc to build documentation [[default=no]]
+  --enable-gtk-doc-html   build documentation in html format [[default=yes]]
+  --enable-gtk-doc-pdf    build documentation in pdf format [[default=no]]
+  --enable-introspection=[no/auto/yes]
+                          Enable introspection for this build
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-gcov=GCOV        use given GCOV for coverage (GCOV=gcov).
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-aix-soname=aix|svr4|both
+                          shared library versioning (aka "SONAME") variant to
+                          provide on AIX, [default=aix].
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
+                          compiler's sysroot if not specified).
+  --with-libstdc++=[yes/no]
+                          Allow linking with libstdc++ [default=no]
+  --with-html-dir=PATH    path to installed docs
+  --with-glib=[yes/no/auto]
+                          Use glib [default=auto]
+  --with-gobject=[yes/no/auto]
+                          Use gobject [default=no]
+  --with-cairo=[yes/no/auto]
+                          Use cairo [default=auto]
+  --with-fontconfig=[yes/no/auto]
+                          Use fontconfig [default=auto]
+  --with-icu=[yes/no/builtin/auto]
+                          Use ICU [default=auto]
+  --with-ucdn=[yes/no]    Use builtin UCDN library [default=yes]
+  --with-graphite2=[yes/no/auto]
+                          Use the graphite2 library [default=no]
+  --with-freetype=[yes/no/auto]
+                          Use the FreeType library [default=auto]
+  --with-uniscribe=[yes/no/auto]
+                          Use the Uniscribe library [default=no]
+  --with-directwrite=[yes/no/auto]
+                          Use the DirectWrite library (experimental)
+                          [default=no]
+  --with-coretext=[yes/no/auto]
+                          Use CoreText [default=no]
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  LT_SYS_LIBRARY_PATH
+              User-defined run-time library search path.
+  CPP         C preprocessor
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CXXCPP      C++ preprocessor
+  PKG_CONFIG  path to pkg-config utility
+  PKG_CONFIG_PATH
+              directories to add to pkg-config's search path
+  PKG_CONFIG_LIBDIR
+              path overriding pkg-config's built-in search path
+  GTKDOC_DEPS_CFLAGS
+              C compiler flags for GTKDOC_DEPS, overriding pkg-config
+  GTKDOC_DEPS_LIBS
+              linker flags for GTKDOC_DEPS, overriding pkg-config
+  GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config
+  GLIB_LIBS   linker flags for GLIB, overriding pkg-config
+  GOBJECT_CFLAGS
+              C compiler flags for GOBJECT, overriding pkg-config
+  GOBJECT_LIBS
+              linker flags for GOBJECT, overriding pkg-config
+  CAIRO_CFLAGS
+              C compiler flags for CAIRO, overriding pkg-config
+  CAIRO_LIBS  linker flags for CAIRO, overriding pkg-config
+  CAIRO_FT_CFLAGS
+              C compiler flags for CAIRO_FT, overriding pkg-config
+  CAIRO_FT_LIBS
+              linker flags for CAIRO_FT, overriding pkg-config
+  FONTCONFIG_CFLAGS
+              C compiler flags for FONTCONFIG, overriding pkg-config
+  FONTCONFIG_LIBS
+              linker flags for FONTCONFIG, overriding pkg-config
+  ICU_CFLAGS  C compiler flags for ICU, overriding pkg-config
+  ICU_LIBS    linker flags for ICU, overriding pkg-config
+  GRAPHITE2_CFLAGS
+              C compiler flags for GRAPHITE2, overriding pkg-config
+  GRAPHITE2_LIBS
+              linker flags for GRAPHITE2, overriding pkg-config
+  FREETYPE_CFLAGS
+              C compiler flags for FREETYPE, overriding pkg-config
+  FREETYPE_LIBS
+              linker flags for FREETYPE, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <https://github.com/harfbuzz/harfbuzz/issues/new>.
+HarfBuzz home page: <http://harfbuzz.org/>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+HarfBuzz configure 2.3.1
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  as_decl_name=`echo $2|sed 's/ *(.*//'`
+  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+  (void) $as_decl_use;
+#else
+  (void) $as_decl_name;
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## -------------------------------------------------------------- ##
+## Report this to https://github.com/harfbuzz/harfbuzz/issues/new ##
+## -------------------------------------------------------------- ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if test "$cross_compiling" = yes; then
+    # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid; break
+else
+  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=$ac_mid; break
+else
+  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid
+else
+  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+  else
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (($2) < 0)
+    {
+      long int i = longval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%ld", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%lu", i);
+    }
+  /* Do not output a trailing newline, as this causes \r\n confusion
+     on some platforms.  */
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+  ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+  fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+
+# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
+# ---------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_cxx_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## -------------------------------------------------------------- ##
+## Report this to https://github.com/harfbuzz/harfbuzz/issues/new ##
+## -------------------------------------------------------------- ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_header_mongrel
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=no"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+	 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+	    return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by HarfBuzz $as_me 2.3.1, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+am__api_version='1.15'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$*" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$*" != "X $srcdir/configure conftest.file" \
+	&& test "$*" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment" "$LINENO" 5
+     fi
+     if test "$2" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='harfbuzz'
+ VERSION='2.3.1'
+
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar plaintar pax cpio none'
+
+# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5
+$as_echo_n "checking whether UID '$am_uid' is supported by ustar format... " >&6; }
+      if test $am_uid -le $am_max_uid; then
+         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      else
+         { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+         _am_tools=none
+      fi
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5
+$as_echo_n "checking whether GID '$am_gid' is supported by ustar format... " >&6; }
+      if test $am_gid -le $am_max_gid; then
+         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+        _am_tools=none
+      fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5
+$as_echo_n "checking how to create a ustar tar archive... " >&6; }
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_ustar-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        { echo "$as_me:$LINENO: $_am_tar --version" >&5
+   ($_am_tar --version) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } && break
+      done
+      am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x ustar -w "$$tardir"'
+      am__tar_='pax -L -x ustar -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H ustar -L'
+      am__tar_='find "$tardir" -print | cpio -o -H ustar -L'
+      am__untar='cpio -i -H ustar -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
+
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_ustar}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5
+   (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      { echo "$as_me:$LINENO: $am__untar <conftest.tar" >&5
+   ($am__untar <conftest.tar) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+      { echo "$as_me:$LINENO: cat conftest.dir/file" >&5
+   (cat conftest.dir/file) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
+  rm -rf conftest.dir
+
+  if ${am_cv_prog_tar_ustar+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  am_cv_prog_tar_ustar=$_am_tool
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5
+$as_echo "$am_cv_prog_tar_ustar" >&6; }
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+  fi
+fi
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=0;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+
+
+
+	# allow to override gcov location
+
+# Check whether --with-gcov was given.
+if test "${with_gcov+set}" = set; then :
+  withval=$with_gcov; _AX_CODE_COVERAGE_GCOV_PROG_WITH=$with_gcov
+else
+  _AX_CODE_COVERAGE_GCOV_PROG_WITH=gcov
+fi
+
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with code coverage support" >&5
+$as_echo_n "checking whether to build with code coverage support... " >&6; }
+	# Check whether --enable-code-coverage was given.
+if test "${enable_code_coverage+set}" = set; then :
+  enableval=$enable_code_coverage;
+else
+  enable_code_coverage=no
+fi
+
+
+	 if test x$enable_code_coverage = xyes; then
+  CODE_COVERAGE_ENABLED_TRUE=
+  CODE_COVERAGE_ENABLED_FALSE='#'
+else
+  CODE_COVERAGE_ENABLED_TRUE='#'
+  CODE_COVERAGE_ENABLED_FALSE=
+fi
+
+	CODE_COVERAGE_ENABLED=$enable_code_coverage
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_code_coverage" >&5
+$as_echo "$enable_code_coverage" >&6; }
+
+	if  test "$enable_code_coverage" = "yes" ; then :
+
+		# check for gcov
+		if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH", so it can be a program name with args.
+set dummy ${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_GCOV+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$GCOV"; then
+  ac_cv_prog_GCOV="$GCOV" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_GCOV="${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+GCOV=$ac_cv_prog_GCOV
+if test -n "$GCOV"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCOV" >&5
+$as_echo "$GCOV" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_GCOV"; then
+  ac_ct_GCOV=$GCOV
+  # Extract the first word of "$_AX_CODE_COVERAGE_GCOV_PROG_WITH", so it can be a program name with args.
+set dummy $_AX_CODE_COVERAGE_GCOV_PROG_WITH; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_GCOV+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_GCOV"; then
+  ac_cv_prog_ac_ct_GCOV="$ac_ct_GCOV" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_GCOV="$_AX_CODE_COVERAGE_GCOV_PROG_WITH"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_GCOV=$ac_cv_prog_ac_ct_GCOV
+if test -n "$ac_ct_GCOV"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_GCOV" >&5
+$as_echo "$ac_ct_GCOV" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_GCOV" = x; then
+    GCOV=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    GCOV=$ac_ct_GCOV
+  fi
+else
+  GCOV="$ac_cv_prog_GCOV"
+fi
+
+		if test "X$GCOV" = "X:"; then :
+  as_fn_error $? "gcov is needed to do coverage" "$LINENO" 5
+fi
+
+
+				if  test "$GCC" = "no" ; then :
+
+			as_fn_error $? "not compiling with gcc, which is required for gcov code coverage" "$LINENO" 5
+
+fi
+
+		# Extract the first word of "lcov", so it can be a program name with args.
+set dummy lcov; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LCOV+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LCOV"; then
+  ac_cv_prog_LCOV="$LCOV" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LCOV="lcov"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LCOV=$ac_cv_prog_LCOV
+if test -n "$LCOV"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LCOV" >&5
+$as_echo "$LCOV" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+		# Extract the first word of "genhtml", so it can be a program name with args.
+set dummy genhtml; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_GENHTML+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$GENHTML"; then
+  ac_cv_prog_GENHTML="$GENHTML" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_GENHTML="genhtml"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+GENHTML=$ac_cv_prog_GENHTML
+if test -n "$GENHTML"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GENHTML" >&5
+$as_echo "$GENHTML" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+		if  test -z "$LCOV" ; then :
+
+			as_fn_error $? "To enable code coverage reporting you must have lcov installed" "$LINENO" 5
+
+fi
+
+		if  test -z "$GENHTML" ; then :
+
+			as_fn_error $? "Could not find genhtml from the lcov package" "$LINENO" 5
+
+fi
+
+						CODE_COVERAGE_CPPFLAGS="-DNDEBUG"
+		CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
+		CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
+		CODE_COVERAGE_LIBS="-lgcov"
+		CODE_COVERAGE_LDFLAGS="$CODE_COVERAGE_LIBS"
+
+
+
+
+
+
+
+		CODE_COVERAGE_RULES_CHECK='
+	-$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k check
+	$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) code-coverage-capture
+'
+		CODE_COVERAGE_RULES_CAPTURE='
+	$(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS)
+	$(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS)
+	-@rm -f $(CODE_COVERAGE_OUTPUT_FILE).tmp
+	$(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS)
+	@echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html"
+'
+		CODE_COVERAGE_RULES_CLEAN='
+clean: code-coverage-clean
+distclean: code-coverage-clean
+code-coverage-clean:
+	-$(LCOV) --directory $(top_builddir) -z
+	-rm -rf $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_FILE).tmp $(CODE_COVERAGE_OUTPUT_DIRECTORY)
+	-find . \( -name "*.gcda" -o -name "*.gcno" -o -name "*.gcov" \) -delete
+'
+
+else
+
+		CODE_COVERAGE_RULES_CHECK='
+	@echo "Need to reconfigure with --enable-code-coverage"
+'
+		CODE_COVERAGE_RULES_CAPTURE="$CODE_COVERAGE_RULES_CHECK"
+		CODE_COVERAGE_RULES_CLEAN=''
+
+fi
+
+CODE_COVERAGE_RULES='
+# Code coverage
+#
+# Optional:
+#  - CODE_COVERAGE_DIRECTORY: Top-level directory for code coverage reporting.
+#    Multiple directories may be specified, separated by whitespace.
+#    (Default: $(top_builddir))
+#  - CODE_COVERAGE_OUTPUT_FILE: Filename and path for the .info file generated
+#    by lcov for code coverage. (Default:
+#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info)
+#  - CODE_COVERAGE_OUTPUT_DIRECTORY: Directory for generated code coverage
+#    reports to be created. (Default:
+#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage)
+#  - CODE_COVERAGE_BRANCH_COVERAGE: Set to 1 to enforce branch coverage,
+#    set to 0 to disable it and leave empty to stay with the default.
+#    (Default: empty)
+#  - CODE_COVERAGE_LCOV_SHOPTS_DEFAULT: Extra options shared between both lcov
+#    instances. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
+#  - CODE_COVERAGE_LCOV_SHOPTS: Extra options to shared between both lcov
+#    instances. (Default: $CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
+#  - CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH: --gcov-tool pathtogcov
+#  - CODE_COVERAGE_LCOV_OPTIONS_DEFAULT: Extra options to pass to the
+#    collecting lcov instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
+#  - CODE_COVERAGE_LCOV_OPTIONS: Extra options to pass to the collecting lcov
+#    instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
+#  - CODE_COVERAGE_LCOV_RMOPTS_DEFAULT: Extra options to pass to the filtering
+#    lcov instance. (Default: empty)
+#  - CODE_COVERAGE_LCOV_RMOPTS: Extra options to pass to the filtering lcov
+#    instance. (Default: $CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
+#  - CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT: Extra options to pass to the
+#    genhtml instance. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
+#  - CODE_COVERAGE_GENHTML_OPTIONS: Extra options to pass to the genhtml
+#    instance. (Default: $CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
+#  - CODE_COVERAGE_IGNORE_PATTERN: Extra glob pattern of files to ignore
+#
+# The generated report will be titled using the $(PACKAGE_NAME) and
+# $(PACKAGE_VERSION). In order to add the current git hash to the title,
+# use the git-version-gen script, available online.
+
+# Optional variables
+CODE_COVERAGE_DIRECTORY ?= $(top_builddir)
+CODE_COVERAGE_OUTPUT_FILE ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info
+CODE_COVERAGE_OUTPUT_DIRECTORY ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage
+CODE_COVERAGE_BRANCH_COVERAGE ?=
+CODE_COVERAGE_LCOV_SHOPTS_DEFAULT ?= $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
+--rc lcov_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
+CODE_COVERAGE_LCOV_SHOPTS ?= $(CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
+CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH ?= --gcov-tool "$(GCOV)"
+CODE_COVERAGE_LCOV_OPTIONS_DEFAULT ?= $(CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
+CODE_COVERAGE_LCOV_OPTIONS ?= $(CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
+CODE_COVERAGE_LCOV_RMOPTS_DEFAULT ?=
+CODE_COVERAGE_LCOV_RMOPTS ?= $(CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
+CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT ?=\
+$(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
+--rc genhtml_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
+CODE_COVERAGE_GENHTML_OPTIONS ?= $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
+CODE_COVERAGE_IGNORE_PATTERN ?=
+
+GITIGNOREFILES ?=
+GITIGNOREFILES += $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_DIRECTORY)
+
+code_coverage_v_lcov_cap = $(code_coverage_v_lcov_cap_$(V))
+code_coverage_v_lcov_cap_ = $(code_coverage_v_lcov_cap_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_lcov_cap_0 = @echo "  LCOV   --capture"\
+ $(CODE_COVERAGE_OUTPUT_FILE);
+code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V))
+code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_lcov_ign_0 = @echo "  LCOV   --remove /tmp/*"\
+ $(CODE_COVERAGE_IGNORE_PATTERN);
+code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V))
+code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_genhtml_0 = @echo "  GEN   " $(CODE_COVERAGE_OUTPUT_DIRECTORY);
+code_coverage_quiet = $(code_coverage_quiet_$(V))
+code_coverage_quiet_ = $(code_coverage_quiet_$(AM_DEFAULT_VERBOSITY))
+code_coverage_quiet_0 = --quiet
+
+# sanitizes the test-name: replaces with underscores: dashes and dots
+code_coverage_sanitize = $(subst -,_,$(subst .,_,$(1)))
+
+# Use recursive makes in order to ignore errors during check
+check-code-coverage:'"$CODE_COVERAGE_RULES_CHECK"'
+
+# Capture code coverage data
+code-coverage-capture: code-coverage-capture-hook'"$CODE_COVERAGE_RULES_CAPTURE"'
+
+# Hook rule executed before code-coverage-capture, overridable by the user
+code-coverage-capture-hook:
+
+'"$CODE_COVERAGE_RULES_CLEAN"'
+
+A''M_DISTCHECK_CONFIGURE_FLAGS ?=
+A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-code-coverage
+
+.PHONY: check-code-coverage code-coverage-capture code-coverage-capture-hook code-coverage-clean
+'
+
+
+
+
+
+# Initialize libtool
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar lib "link -lib"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar lib "link -lib"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5
+$as_echo_n "checking the archiver ($AR) interface... " >&6; }
+if ${am_cv_ar_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+   am_cv_ar_interface=ar
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int some_variable = 0;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5
+  (eval $am_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test "$ac_status" -eq 0; then
+        am_cv_ar_interface=ar
+      else
+        am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5'
+        { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5
+  (eval $am_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+        if test "$ac_status" -eq 0; then
+          am_cv_ar_interface=lib
+        else
+          am_cv_ar_interface=unknown
+        fi
+      fi
+      rm -f conftest.lib libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5
+$as_echo "$am_cv_ar_interface" >&6; }
+
+case $am_cv_ar_interface in
+ar)
+  ;;
+lib)
+  # Microsoft lib, so override with the ar-lib wrapper script.
+  # FIXME: It is wrong to rewrite AR.
+  # But if we don't then we get into trouble of one sort or another.
+  # A longer-term fix would be to have automake use am__AR in this case,
+  # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something
+  # similar.
+  AR="$am_aux_dir/ar-lib $AR"
+  ;;
+unknown)
+  as_fn_error $? "could not determine $AR interface" "$LINENO" 5
+  ;;
+esac
+
+
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.6'
+macro_revision='2.4.6'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case $ECHO in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return, which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD=$ac_prog
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test yes = "$with_gnu_ld"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD=$ac_dir/$ac_prog
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test no != "$with_gnu_ld" && break
+	;;
+      *)
+	test yes != "$with_gnu_ld" && break
+	;;
+      esac
+    fi
+  done
+  IFS=$lt_save_ifs
+else
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM=$NM
+else
+  lt_nm_to_check=${ac_tool_prefix}nm
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS=$lt_save_ifs
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break 2
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break 2
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS=$lt_save_ifs
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols -headers"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring=ABCD
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test 17 != "$i" # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n "$lt_cv_sys_max_cmd_len"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test yes != "$GCC"; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test 0 -eq "$ac_status"; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	if test 0 -ne "$ac_status"; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test no = "$lt_cv_ar_at_file"; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  bitrig* | openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test ia64 = "$host_cpu"; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS=conftstm.$ac_objext
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test yes = "$pipe_works"; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+   if test yes = "$GCC"; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+$as_echo "$with_sysroot" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+$as_echo_n "checking for a working dd... " >&6; }
+if ${ac_cv_path_lt_DD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+  ac_path_lt_DD_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in dd; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+      $ac_path_lt_DD_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_lt_DD"; then
+    :
+  fi
+else
+  ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+$as_echo "$ac_cv_path_lt_DD" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+$as_echo_n "checking how to truncate binary pipes... " >&6; }
+if ${lt_cv_truncate_bin+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+$as_echo "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE=32
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE=64
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*linux*)
+	    LD="${LD-ld} -m elf32lppclinux"
+	    ;;
+	  powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  powerpcle-*linux*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS=$CFLAGS
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test yes != "$lt_cv_cc_needs_belf"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS=$SAVE_CFLAGS
+  fi
+  ;;
+*-*solaris*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*|x86_64-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD=${LD-ld}_sol2
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks=$enable_libtool_lock
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test yes != "$lt_cv_path_mainfest_tool"; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "$LT_MULTI_MODULE"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&5
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&5
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[012][,.]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+    fi
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+# Set options
+# Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_static=no
+fi
+
+
+
+
+
+
+
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for lt_pkg in $withval; do
+	IFS=$lt_save_ifs
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  pic_mode=default
+fi
+
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+  shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+  withval=$with_aix_soname; case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname
+else
+  if ${lt_cv_with_aix_soname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_with_aix_soname=aix
+fi
+
+    with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+$as_echo "$with_aix_soname" >&6; }
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test set != "${COLLECT_NAMES+set}"; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/${ac_tool_prefix}file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
+  ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
+  ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC=$CC
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test yes = "$GCC"; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+  if test yes = "$GCC"; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        lt_prog_compiler_wl='-Wl,-Wl,,'
+        lt_prog_compiler_pic='-PIC'
+        lt_prog_compiler_static='-Bstatic'
+        ;;
+      esac
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='$wl-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64, which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl='-Wl,-Wl,,'
+	lt_prog_compiler_pic='-PIC'
+	lt_prog_compiler_static='-Bstatic'
+	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fPIC'
+	  lt_prog_compiler_static='-static'
+	  ;;
+	*Portland\ Group*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fpic'
+	  lt_prog_compiler_static='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms that do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test yes != "$GCC"; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd* | bitrig*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test yes = "$with_gnu_ld"; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test yes = "$lt_use_gnu_ld_interface"; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='$wl'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+    export_dynamic_flag_spec='$wl--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test ia64 != "$host_cpu"; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='$wl--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+      export_dynamic_flag_spec='$wl-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test linux-dietlibc = "$host_os"; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test no = "$tmp_diet"
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  compiler_needs_object=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+        if test yes = "$supports_anon_versioning"; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	tcc*)
+	  export_dynamic_flag_spec='-rdynamic'
+	  ;;
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test yes = "$supports_anon_versioning"; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test no = "$ld_shlibs"; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test ia64 = "$host_cpu"; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	hardcode_direct=no
+	hardcode_direct_absolute=no
+	;;
+      esac
+
+      if test yes = "$GCC"; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
+	fi
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
+      else
+	# not using gcc
+	if test ia64 = "$host_cpu"; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
+	  else
+	    shared_flag='$wl-bM:SRE'
+	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
+	fi
+      fi
+
+      export_dynamic_flag_spec='$wl-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+      else
+	if test ia64 = "$host_cpu"; then
+	  hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+	 hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' $wl-bernotok'
+	  allow_undefined_flag=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec='$convenience'
+	  fi
+	  archive_cmds_need_lc=yes
+	  archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	  else
+	    # used by -dlpreopen to get the symbols
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	always_export_symbols=yes
+	file_list_spec='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+	enable_shared_with_static_runtimes=yes
+	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds='chmod 644 $oldlib'
+	postlink_cmds='lt_outputfile="@OUTPUT@"~
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag=$_lt_dar_allow_undefined
+  case $cc_basename in
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test yes = "$_lt_dar_can_shared"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test yes = "$GCC"; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='$wl-E'
+      ;;
+
+    hpux10*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='$wl-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test yes = "$lt_cv_prog_compiler__b"; then
+    archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+	  ;;
+	esac
+      fi
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='$wl-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS=$save_LDFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+	fi
+	link_all_deplibs=no
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	ld_shlibs=yes
+	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd* | bitrig*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+	  export_dynamic_flag_spec='$wl-E'
+	else
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    osf3*)
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='$wl'
+	  archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test yes = "$GCC"; then
+	  whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test sequent = "$host_vendor"; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='$wl-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We CANNOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='$wl-z,text'
+      allow_undefined_flag='$wl-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='$wl-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='$wl-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test sni = "$host_vendor"; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='$wl-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test no = "$ld_shlibs" && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test yes,yes = "$GCC,$enable_shared"; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl
+	  pic_flag=$lt_prog_compiler_pic
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag
+	  allow_undefined_flag=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc=no
+	  else
+	    lt_cv_archive_cmds_need_lc=yes
+	  fi
+	  allow_undefined_flag=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test yes = "$GCC"; then
+  case $host_os in
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary...
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo = "/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='$libname$release$shared_ext$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test ia64 = "$host_cpu"; then
+    # AIX 5 supports IA64
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='$libname$shared_ext'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec=$LIB
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+    fi
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test yes = "$lt_cv_prog_gnu_ld"; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec='-L$libdir'
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
+  else
+    need_version=yes
+  fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+os2*)
+  libname_spec='$name'
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test yes = "$with_gnu_ld"; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec; then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=sco
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test yes = "$with_gnu_ld"; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test yes = "$hardcode_automatic"; then
+
+  # We can hardcode non-existent directories.
+  if test no != "$hardcode_direct" &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+     test no != "$hardcode_minus_L"; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test relink = "$hardcode_action" ||
+   test yes = "$inherit_rpath"; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test yes != "$enable_dlopen"; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen=load_add_on
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen=LoadLibrary
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+    # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+
+    lt_cv_dlopen=dyld
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen=shl_load
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test no = "$lt_cv_dlopen"; then
+    enable_dlopen=no
+  else
+    enable_dlopen=yes
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS=$LDFLAGS
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS=$LIBS
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test yes = "$cross_compiling"; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test yes = "$lt_cv_dlopen_self"; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test yes = "$cross_compiling"; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP"; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report what library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test no = "$can_build_shared" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test yes = "$enable_shared" && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test yes = "$enable_shared" || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+# Check for programs
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5
+$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
+if ${ac_cv_prog_cc_c99+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
+
+// Check varargs macros.  These examples are taken from C99 6.10.3.5.
+#define debug(...) fprintf (stderr, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+  int x = 1234;
+  int y = 5678;
+  debug ("Flag");
+  debug ("X = %d\n", x);
+  showlist (The first, second, and third items.);
+  report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+  your preprocessor is broken;
+#endif
+#if BIG_OK
+#else
+  your preprocessor is broken;
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+  int datasize;
+  double data[];
+};
+
+struct named_init {
+  int number;
+  const wchar_t *name;
+  double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+  // See if C++-style comments work.
+  // Iterate through items via the restricted pointer.
+  // Also check for declarations in for loops.
+  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
+    continue;
+  return 0;
+}
+
+// Check varargs and va_copy.
+static void
+test_varargs (const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  va_list args_copy;
+  va_copy (args_copy, args);
+
+  const char *str;
+  int number;
+  float fnumber;
+
+  while (*format)
+    {
+      switch (*format++)
+	{
+	case 's': // string
+	  str = va_arg (args_copy, const char *);
+	  break;
+	case 'd': // int
+	  number = va_arg (args_copy, int);
+	  break;
+	case 'f': // float
+	  fnumber = va_arg (args_copy, double);
+	  break;
+	default:
+	  break;
+	}
+    }
+  va_end (args_copy);
+  va_end (args);
+}
+
+int
+main ()
+{
+
+  // Check bool.
+  _Bool success = false;
+
+  // Check restrict.
+  if (test_restrict ("String literal") == 0)
+    success = true;
+  char *restrict newvar = "Another string";
+
+  // Check varargs.
+  test_varargs ("s, d' f .", "string", 65, 34.234);
+  test_varargs_macros ();
+
+  // Check flexible array members.
+  struct incomplete_array *ia =
+    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+  ia->datasize = 10;
+  for (int i = 0; i < ia->datasize; ++i)
+    ia->data[i] = i * 1.234;
+
+  // Check named initializers.
+  struct named_init ni = {
+    .number = 34,
+    .name = L"Test wide string",
+    .average = 543.34343,
+  };
+
+  ni.number = 58;
+
+  int dynamic_array[ni.number];
+  dynamic_array[ni.number - 1] = 543;
+
+  // work around unused variable warnings
+  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
+	  || dynamic_array[ni.number - 1] != 543);
+
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c99" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c99"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c99" != xno; then :
+
+fi
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+
+
+func_stripname_cnf ()
+{
+  case $2 in
+  .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;;
+  esac
+} # func_stripname_cnf
+
+      if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+  if ${ac_cv_prog_CXXCPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+else
+  _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_caught_CXX_error"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  compiler_CXX=$CC
+  func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test yes = "$GXX"; then
+      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+    else
+      lt_prog_compiler_no_builtin_flag_CXX=
+    fi
+
+    if test yes = "$GXX"; then
+      # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return, which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD=$ac_prog
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test yes = "$with_gnu_ld"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD=$ac_dir/$ac_prog
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test no != "$with_gnu_ld" && break
+	;;
+      *)
+	test yes != "$with_gnu_ld" && break
+	;;
+      esac
+    fi
+  done
+  IFS=$lt_save_ifs
+else
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test yes = "$with_gnu_ld"; then
+        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+
+        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+        export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='$wl'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+        else
+          whole_archive_flag_spec_CXX=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+    ld_shlibs_CXX=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+      aix[4-9]*)
+        if test ia64 = "$host_cpu"; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
+          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	      # so we don't have lib.a shared libs to link our executables.
+	      # We have to force runtime linking in this case.
+	      aix_use_runtimelinking=yes
+	      LDFLAGS="$LDFLAGS -Wl,-brtl"
+	    fi
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        archive_cmds_CXX=''
+        hardcode_direct_CXX=yes
+        hardcode_direct_absolute_CXX=yes
+        hardcode_libdir_separator_CXX=':'
+        link_all_deplibs_CXX=yes
+        file_list_spec_CXX='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;	# no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          hardcode_direct_CXX=no
+          hardcode_direct_absolute_CXX=no
+          ;;
+        esac
+
+        if test yes = "$GXX"; then
+          case $host_os in aix4.[012]|aix4.[012].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    hardcode_direct_CXX=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    hardcode_minus_L_CXX=yes
+	    hardcode_libdir_flag_spec_CXX='-L$libdir'
+	    hardcode_libdir_separator_CXX=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag=$shared_flag' $wl-G'
+	  fi
+	  # Need to ensure runtime linking is disabled for the traditional
+	  # shared library, or the linker may eventually find shared libraries
+	  # /with/ Import File - we do not want to mix them.
+	  shared_flag_aix='-shared'
+	  shared_flag_svr4='-shared $wl-G'
+        else
+          # not using gcc
+          if test ia64 = "$host_cpu"; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test yes = "$aix_use_runtimelinking"; then
+	      shared_flag='$wl-G'
+	    else
+	      shared_flag='$wl-bM:SRE'
+	    fi
+	    shared_flag_aix='$wl-bM:SRE'
+	    shared_flag_svr4='$wl-G'
+          fi
+        fi
+
+        export_dynamic_flag_spec_CXX='$wl-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        always_export_symbols_CXX=yes
+	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          # The "-G" linker flag allows undefined symbols.
+          no_undefined_flag_CXX='-bernotok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+          hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+        else
+          if test ia64 = "$host_cpu"; then
+	    hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
+	    allow_undefined_flag_CXX="-z nodefs"
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+	    hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    no_undefined_flag_CXX=' $wl-bernotok'
+	    allow_undefined_flag_CXX=' $wl-berok'
+	    if test yes = "$with_gnu_ld"; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      whole_archive_flag_spec_CXX='$convenience'
+	    fi
+	    archive_cmds_need_lc_CXX=yes
+	    archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	    # -brtl affects multiple linker settings, -berok does not and is overridden later
+	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	    if test svr4 != "$with_aix_soname"; then
+	      # This is similar to how AIX traditionally builds its shared
+	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	    fi
+	    if test aix != "$with_aix_soname"; then
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	    else
+	      # used by -dlpreopen to get the symbols
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	    fi
+	    archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  allow_undefined_flag_CXX=unsupported
+	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX=' '
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=yes
+	  file_list_spec_CXX='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=.dll
+	  # FIXME: Setting linknames here is a bad hack.
+	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	  archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+	  enable_shared_with_static_runtimes_CXX=yes
+	  # Don't use ranlib
+	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
+	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX='-L$libdir'
+	  export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=no
+	  enable_shared_with_static_runtimes_CXX=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file, use it as
+	    # is; otherwise, prepend EXPORTS...
+	    archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    ld_shlibs_CXX=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_CXX=no
+  hardcode_direct_CXX=no
+  hardcode_automatic_CXX=yes
+  hardcode_shlibpath_var_CXX=unsupported
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec_CXX=''
+  fi
+  link_all_deplibs_CXX=yes
+  allow_undefined_flag_CXX=$_lt_dar_allow_undefined
+  case $cc_basename in
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test yes = "$_lt_dar_can_shared"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+       if test yes != "$lt_cv_apple_cc_single_mod"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+    fi
+
+  else
+  ld_shlibs_CXX=no
+  fi
+
+	;;
+
+      os2*)
+	hardcode_libdir_flag_spec_CXX='-L$libdir'
+	hardcode_minus_L_CXX=yes
+	allow_undefined_flag_CXX=unsupported
+	shrext_cmds=.dll
+	archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  prefix_cmds="$SED"~
+	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	    prefix_cmds="$prefix_cmds -e 1d";
+	  fi~
+	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+	enable_shared_with_static_runtimes_CXX=yes
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        ld_shlibs_CXX=no
+        ;;
+
+      freebsd-elf*)
+        archive_cmds_need_lc_CXX=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        ld_shlibs_CXX=yes
+        ;;
+
+      haiku*)
+        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+        link_all_deplibs_CXX=yes
+        ;;
+
+      hpux9*)
+        hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+        hardcode_libdir_separator_CXX=:
+        export_dynamic_flag_spec_CXX='$wl-E'
+        hardcode_direct_CXX=yes
+        hardcode_minus_L_CXX=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            ld_shlibs_CXX=no
+            ;;
+          aCC*)
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test yes = "$GXX"; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              ld_shlibs_CXX=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test no = "$with_gnu_ld"; then
+	  hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+	  hardcode_libdir_separator_CXX=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      export_dynamic_flag_spec_CXX='$wl-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct_CXX=no
+            hardcode_shlibpath_var_CXX=no
+            ;;
+          *)
+            hardcode_direct_CXX=yes
+            hardcode_direct_absolute_CXX=yes
+            hardcode_minus_L_CXX=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        case $host_cpu in
+	          hppa*64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[3-9]*)
+	hardcode_direct_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='$wl-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	      else
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
+	      fi
+	    fi
+	    link_all_deplibs_CXX=yes
+	    ;;
+        esac
+        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+        hardcode_libdir_separator_CXX=:
+        inherit_rpath_CXX=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    archive_cmds_need_lc_CXX=no
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+	      prelink_cmds_CXX='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      old_archive_cmds_CXX='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
+	      archive_cmds_CXX='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      archive_expsym_cmds_CXX='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    if test yes = "$supports_anon_versioning"; then
+	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      no_undefined_flag_CXX=' -zdefs'
+	      archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
+	      hardcode_libdir_flag_spec_CXX='-R$libdir'
+	      whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	      compiler_needs_object_CXX=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  hardcode_libdir_flag_spec_CXX='-R$libdir'
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        ld_shlibs_CXX=yes
+	;;
+
+      openbsd* | bitrig*)
+	if test -f /usr/libexec/ld.so; then
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	  hardcode_direct_absolute_CXX=yes
+	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+	    export_dynamic_flag_spec_CXX='$wl-E'
+	    whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+		;;
+	      *)
+	        allow_undefined_flag_CXX=' -expect_unresolved \*'
+	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
+	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+		;;
+	    esac
+
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+	      case $host in
+	        osf3*)
+	          archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+		  ;;
+	        *)
+	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+	      hardcode_libdir_separator_CXX=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            archive_cmds_need_lc_CXX=yes
+	    no_undefined_flag_CXX=' -zdefs'
+	    archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    hardcode_libdir_flag_spec_CXX='-R$libdir'
+	    hardcode_shlibpath_var_CXX=no
+	    case $host_os in
+	      solaris2.[0-5] | solaris2.[0-5].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands '-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    link_all_deplibs_CXX=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      no_undefined_flag_CXX=' $wl-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
+	        # platform.
+	        archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
+	      case $host_os in
+		solaris2.[0-5] | solaris2.[0-5].*) ;;
+		*)
+		  whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_CXX='$wl-z,text'
+      archive_cmds_need_lc_CXX=no
+      hardcode_shlibpath_var_CXX=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We CANNOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	no_undefined_flag_CXX='$wl-z,text'
+	allow_undefined_flag_CXX='$wl-z,nodefs'
+	archive_cmds_need_lc_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
+	hardcode_libdir_separator_CXX=':'
+	link_all_deplibs_CXX=yes
+	export_dynamic_flag_spec_CXX='$wl-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+              '"$old_archive_cmds_CXX"
+	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+              '"$reload_cmds_CXX"
+	    ;;
+	  *)
+	    archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+    esac
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+    test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+    GCC_CXX=$GXX
+    LD_CXX=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $prev$p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$compiler_lib_search_path_CXX"; then
+	     compiler_lib_search_path_CXX=$prev$p
+	   else
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$postdeps_CXX"; then
+	   postdeps_CXX=$prev$p
+	 else
+	   postdeps_CXX="${postdeps_CXX} $prev$p"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test no = "$pre_test_object_deps_done"; then
+	 if test -z "$predep_objects_CXX"; then
+	   predep_objects_CXX=$p
+	 else
+	   predep_objects_CXX="$predep_objects_CXX $p"
+	 fi
+       else
+	 if test -z "$postdep_objects_CXX"; then
+	   postdep_objects_CXX=$p
+	 else
+	   postdep_objects_CXX="$postdep_objects_CXX $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  predep_objects_CXX=
+  postdep_objects_CXX=
+  postdeps_CXX=
+  ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+  # C++ specific cases for pic, static, wl, etc.
+  if test yes = "$GXX"; then
+    lt_prog_compiler_wl_CXX='-Wl,'
+    lt_prog_compiler_static_CXX='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_CXX='-Bstatic'
+      fi
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_CXX='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static_CXX='$wl-static'
+	;;
+      esac
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_CXX='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      lt_prog_compiler_pic_CXX=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static_CXX=
+      ;;
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_CXX=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	lt_prog_compiler_pic_CXX='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_CXX='-fPIC -shared'
+      ;;
+    *)
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[4-9]*)
+	# All AIX code is PIC.
+	if test ia64 = "$host_cpu"; then
+	  # AIX 5 now supports IA64 processor
+	  lt_prog_compiler_static_CXX='-Bstatic'
+	else
+	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+	    if test ia64 != "$host_cpu"; then
+	      lt_prog_compiler_pic_CXX='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      lt_prog_compiler_pic_CXX='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64, which still supported -KPIC.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fpic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-qpic'
+	    lt_prog_compiler_static_CXX='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      lt_prog_compiler_pic_CXX='-KPIC'
+	      lt_prog_compiler_static_CXX='-Bstatic'
+	      lt_prog_compiler_wl_CXX='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    lt_prog_compiler_pic_CXX='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        lt_prog_compiler_pic_CXX='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    lt_prog_compiler_wl_CXX='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    lt_prog_compiler_pic_CXX='-pic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	lt_prog_compiler_can_build_shared_CXX=no
+	;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms that do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_CXX=
+    ;;
+  *)
+    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works_CXX=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_CXX=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
+    case $lt_prog_compiler_pic_CXX in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+     esac
+else
+    lt_prog_compiler_pic_CXX=
+     lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works_CXX=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_CXX=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_CXX=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
+    :
+else
+    lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  case $host_os in
+  aix[4-9]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+    else
+      export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    export_symbols_cmds_CXX=$ltdll_cmds
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs_CXX=no
+    ;;
+  *)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_CXX=yes
+
+  if test yes,yes = "$GCC,$enable_shared"; then
+    case $archive_cmds_CXX in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl_CXX
+	  pic_flag=$lt_prog_compiler_pic_CXX
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+	  allow_undefined_flag_CXX=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc_CXX=no
+	  else
+	    lt_cv_archive_cmds_need_lc_CXX=yes
+	  fi
+	  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='$libname$release$shared_ext$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test ia64 = "$host_cpu"; then
+    # AIX 5 supports IA64
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='$libname$shared_ext'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec=$LIB
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+    fi
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test yes = "$lt_cv_prog_gnu_ld"; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec_CXX='-L$libdir'
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
+  else
+    need_version=yes
+  fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+os2*)
+  libname_spec='$name'
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test yes = "$with_gnu_ld"; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec; then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=sco
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test yes = "$with_gnu_ld"; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+   test -n "$runpath_var_CXX" ||
+   test yes = "$hardcode_automatic_CXX"; then
+
+  # We can hardcode non-existent directories.
+  if test no != "$hardcode_direct_CXX" &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
+     test no != "$hardcode_minus_L_CXX"; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_CXX=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_CXX=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_CXX=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+$as_echo "$hardcode_action_CXX" >&6; }
+
+if test relink = "$hardcode_action_CXX" ||
+   test yes = "$inherit_rpath_CXX"; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test yes != "$_lt_caught_CXX_error"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+	 # IRIX 6.2 and later do not support large files by default,
+	 # so use the C compiler's -n32 option if that helps.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 CC="$CC -n32"
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
+
+
+fi
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=0.20
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	else
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		PKG_CONFIG=""
+	fi
+fi
+
+RAGEL=${RAGEL-"${am_missing_run}ragel"}
+
+
+GIT=${GIT-"${am_missing_run}git"}
+
+
+# Version
+
+
+
+
+HB_VERSION_MAJOR=2
+HB_VERSION_MINOR=3
+HB_VERSION_MICRO=1
+HB_VERSION=2.3.1
+
+
+
+
+
+# Libtool version
+
+
+
+
+HB_LIBTOOL_VERSION_INFO=20301:0:20301
+
+
+
+# Check whether --with-libstdc++ was given.
+if test "${with_libstdc__+set}" = set; then :
+  withval=$with_libstdc__; with_libstdcxx=$withval
+else
+  with_libstdcxx=no
+fi
+
+ if test "x$with_libstdcxx" = "xyes"; then
+  WITH_LIBSTDCXX_TRUE=
+  WITH_LIBSTDCXX_FALSE='#'
+else
+  WITH_LIBSTDCXX_TRUE='#'
+  WITH_LIBSTDCXX_FALSE=
+fi
+
+
+# Documentation
+have_gtk_doc=false
+
+
+
+
+  gtk_doc_requires="gtk-doc >= 1.15"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gtk-doc" >&5
+$as_echo_n "checking for gtk-doc... " >&6; }
+  if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$gtk_doc_requires\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$gtk_doc_requires") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  have_gtk_doc=yes
+else
+  have_gtk_doc=no
+fi
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_gtk_doc" >&5
+$as_echo "$have_gtk_doc" >&6; }
+
+  if test "$have_gtk_doc" = "no"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
+  You will not be able to create source packages with 'make dist'
+  because $gtk_doc_requires is not found." >&5
+$as_echo "$as_me: WARNING:
+  You will not be able to create source packages with 'make dist'
+  because $gtk_doc_requires is not found." >&2;}
+  fi
+
+            # Extract the first word of "gtkdoc-check", so it can be a program name with args.
+set dummy gtkdoc-check; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_GTKDOC_CHECK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$GTKDOC_CHECK"; then
+  ac_cv_prog_GTKDOC_CHECK="$GTKDOC_CHECK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_GTKDOC_CHECK="gtkdoc-check.test"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+GTKDOC_CHECK=$ac_cv_prog_GTKDOC_CHECK
+if test -n "$GTKDOC_CHECK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK" >&5
+$as_echo "$GTKDOC_CHECK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  # Extract the first word of "gtkdoc-check", so it can be a program name with args.
+set dummy gtkdoc-check; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GTKDOC_CHECK_PATH+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GTKDOC_CHECK_PATH in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GTKDOC_CHECK_PATH="$GTKDOC_CHECK_PATH" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GTKDOC_CHECK_PATH="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GTKDOC_CHECK_PATH=$ac_cv_path_GTKDOC_CHECK_PATH
+if test -n "$GTKDOC_CHECK_PATH"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK_PATH" >&5
+$as_echo "$GTKDOC_CHECK_PATH" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  for ac_prog in gtkdoc-rebase
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GTKDOC_REBASE+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GTKDOC_REBASE in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GTKDOC_REBASE="$GTKDOC_REBASE" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GTKDOC_REBASE="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GTKDOC_REBASE=$ac_cv_path_GTKDOC_REBASE
+if test -n "$GTKDOC_REBASE"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_REBASE" >&5
+$as_echo "$GTKDOC_REBASE" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$GTKDOC_REBASE" && break
+done
+test -n "$GTKDOC_REBASE" || GTKDOC_REBASE="true"
+
+  # Extract the first word of "gtkdoc-mkpdf", so it can be a program name with args.
+set dummy gtkdoc-mkpdf; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GTKDOC_MKPDF+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GTKDOC_MKPDF in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GTKDOC_MKPDF="$GTKDOC_MKPDF" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GTKDOC_MKPDF="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GTKDOC_MKPDF=$ac_cv_path_GTKDOC_MKPDF
+if test -n "$GTKDOC_MKPDF"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_MKPDF" >&5
+$as_echo "$GTKDOC_MKPDF" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+# Check whether --with-html-dir was given.
+if test "${with_html_dir+set}" = set; then :
+  withval=$with_html_dir;
+else
+  with_html_dir='${datadir}/gtk-doc/html'
+fi
+
+  HTML_DIR="$with_html_dir"
+
+
+    # Check whether --enable-gtk-doc was given.
+if test "${enable_gtk_doc+set}" = set; then :
+  enableval=$enable_gtk_doc;
+else
+  enable_gtk_doc=no
+fi
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build gtk-doc documentation" >&5
+$as_echo_n "checking whether to build gtk-doc documentation... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_doc" >&5
+$as_echo "$enable_gtk_doc" >&6; }
+
+  if test "x$enable_gtk_doc" = "xyes" && test "$have_gtk_doc" = "no"; then
+    as_fn_error $? "
+  You must have $gtk_doc_requires installed to build documentation for
+  $PACKAGE_NAME. Please install gtk-doc or disable building the
+  documentation by adding '--disable-gtk-doc' to '$0'." "$LINENO" 5
+  fi
+
+    if test "x$PACKAGE_NAME" != "xglib"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKDOC_DEPS" >&5
+$as_echo_n "checking for GTKDOC_DEPS... " >&6; }
+
+if test -n "$GTKDOC_DEPS_CFLAGS"; then
+    pkg_cv_GTKDOC_DEPS_CFLAGS="$GTKDOC_DEPS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GTKDOC_DEPS_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GTKDOC_DEPS_LIBS"; then
+    pkg_cv_GTKDOC_DEPS_LIBS="$GTKDOC_DEPS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GTKDOC_DEPS_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>&1`
+        else
+	        GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GTKDOC_DEPS_PKG_ERRORS" >&5
+
+	:
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	:
+else
+	GTKDOC_DEPS_CFLAGS=$pkg_cv_GTKDOC_DEPS_CFLAGS
+	GTKDOC_DEPS_LIBS=$pkg_cv_GTKDOC_DEPS_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+  fi
+
+    # Check whether --enable-gtk-doc-html was given.
+if test "${enable_gtk_doc_html+set}" = set; then :
+  enableval=$enable_gtk_doc_html;
+else
+  enable_gtk_doc_html=yes
+fi
+
+    # Check whether --enable-gtk-doc-pdf was given.
+if test "${enable_gtk_doc_pdf+set}" = set; then :
+  enableval=$enable_gtk_doc_pdf;
+else
+  enable_gtk_doc_pdf=no
+fi
+
+
+  if test -z "$GTKDOC_MKPDF"; then
+    enable_gtk_doc_pdf=no
+  fi
+
+  if test -z "$AM_DEFAULT_VERBOSITY"; then
+    AM_DEFAULT_VERBOSITY=1
+  fi
+
+
+   if test x$have_gtk_doc = xyes; then
+  HAVE_GTK_DOC_TRUE=
+  HAVE_GTK_DOC_FALSE='#'
+else
+  HAVE_GTK_DOC_TRUE='#'
+  HAVE_GTK_DOC_FALSE=
+fi
+
+   if test x$enable_gtk_doc = xyes; then
+  ENABLE_GTK_DOC_TRUE=
+  ENABLE_GTK_DOC_FALSE='#'
+else
+  ENABLE_GTK_DOC_TRUE='#'
+  ENABLE_GTK_DOC_FALSE=
+fi
+
+   if test x$enable_gtk_doc_html = xyes; then
+  GTK_DOC_BUILD_HTML_TRUE=
+  GTK_DOC_BUILD_HTML_FALSE='#'
+else
+  GTK_DOC_BUILD_HTML_TRUE='#'
+  GTK_DOC_BUILD_HTML_FALSE=
+fi
+
+   if test x$enable_gtk_doc_pdf = xyes; then
+  GTK_DOC_BUILD_PDF_TRUE=
+  GTK_DOC_BUILD_PDF_FALSE='#'
+else
+  GTK_DOC_BUILD_PDF_TRUE='#'
+  GTK_DOC_BUILD_PDF_FALSE=
+fi
+
+   if test -n "$LIBTOOL"; then
+  GTK_DOC_USE_LIBTOOL_TRUE=
+  GTK_DOC_USE_LIBTOOL_FALSE='#'
+else
+  GTK_DOC_USE_LIBTOOL_TRUE='#'
+  GTK_DOC_USE_LIBTOOL_FALSE=
+fi
+
+   if test -n "$GTKDOC_REBASE"; then
+  GTK_DOC_USE_REBASE_TRUE=
+  GTK_DOC_USE_REBASE_FALSE='#'
+else
+  GTK_DOC_USE_REBASE_TRUE='#'
+  GTK_DOC_USE_REBASE_FALSE=
+fi
+
+
+	if test "x$enable_gtk_doc" = xyes; then
+		have_gtk_doc=true
+	fi
+
+
+# Functions and headers
+for ac_func in atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l posix_memalign
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+save_libs="$LIBS"
+LIBS="$LIBS -lm"
+for ac_func in round
+do :
+  ac_fn_c_check_func "$LINENO" "round" "ac_cv_func_round"
+if test "x$ac_cv_func_round" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_ROUND 1
+_ACEOF
+
+else
+  ac_fn_c_check_decl "$LINENO" "round" "ac_cv_have_decl_round" "#include <math.h>
+"
+if test "x$ac_cv_have_decl_round" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ROUND $ac_have_decl
+_ACEOF
+
+fi
+done
+
+LIBS="$save_libs"
+
+for ac_header in unistd.h sys/mman.h xlocale.h stdbool.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+# Compiler flags
+
+# The cast to long int works around a bug in the HP C Compiler,
+# see AC_CHECK_SIZEOF for more information.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of struct{char;}" >&5
+$as_echo_n "checking alignment of struct{char;}... " >&6; }
+if ${ac_cv_alignof_struct_char__+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_struct_char__"        "$ac_includes_default
+#ifndef offsetof
+# define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0)
+#endif
+typedef struct { char x; struct{char;} y; } ac__type_alignof_;"; then :
+
+else
+  if test "$ac_cv_type_struct_char__" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute alignment of struct{char;}
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_alignof_struct_char__=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_struct_char__" >&5
+$as_echo "$ac_cv_alignof_struct_char__" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define ALIGNOF_STRUCT_CHAR__ $ac_cv_alignof_struct_char__
+_ACEOF
+
+
+if test "x$GCC" = "xyes"; then
+
+	# Make symbols link locally
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -Bsymbolic-functions" >&5
+$as_echo_n "checking whether the linker accepts -Bsymbolic-functions... " >&6; }
+if ${ax_cv_check_ldflags___Bsymbolic_functions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+  ax_check_save_flags=$LDFLAGS
+  LDFLAGS="$LDFLAGS  -Bsymbolic-functions"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ax_cv_check_ldflags___Bsymbolic_functions=yes
+else
+  ax_cv_check_ldflags___Bsymbolic_functions=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  LDFLAGS=$ax_check_save_flags
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___Bsymbolic_functions" >&5
+$as_echo "$ax_cv_check_ldflags___Bsymbolic_functions" >&6; }
+if test "x$ax_cv_check_ldflags___Bsymbolic_functions" = xyes; then :
+  LDFLAGS="$LDFLAGS -Bsymbolic-functions"
+else
+  :
+fi
+
+
+	# Make it possible to not link to libstdc++
+	# No threadsafe statics in C++ as we do it ourselves.
+	# We don't use these features, so it's safe to disable them
+	# even in the cases where we DO link to libstdc++.
+	# Put -fno-rtti before $CXXFLAGS such that users can re-enable it
+	# by overriding CXXFLAGS.
+	CXXFLAGS="-fno-rtti $CXXFLAGS -fno-exceptions -fno-threadsafe-statics"
+
+	case "$host" in
+		*-*-mingw*)
+		;;
+		*)
+			# Hide inline methods
+			CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden"
+		;;
+	esac
+
+	case "$host" in
+		arm-*-*)
+			if test "x$ac_cv_alignof_struct_char__" != x1; then
+				# Request byte alignment
+				CXXFLAGS="$CXXFLAGS -mstructure-size-boundary=8"
+			fi
+		;;
+	esac
+fi
+
+ if test "x$GCC" = "xyes"; then
+  HAVE_GCC_TRUE=
+  HAVE_GCC_FALSE='#'
+else
+  HAVE_GCC_TRUE='#'
+  HAVE_GCC_FALSE=
+fi
+
+
+hb_os_win32=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for native Win32" >&5
+$as_echo_n "checking for native Win32... " >&6; }
+case "$host" in
+  *-*-mingw*)
+    hb_os_win32=yes
+    ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hb_os_win32" >&5
+$as_echo "$hb_os_win32" >&6; }
+ if test "$hb_os_win32" = "yes"; then
+  OS_WIN32_TRUE=
+  OS_WIN32_FALSE='#'
+else
+  OS_WIN32_TRUE='#'
+  OS_WIN32_FALSE=
+fi
+
+
+have_pthread=false
+if test "$hb_os_win32" = no; then
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ax_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on Tru64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
+        ax_pthread_save_CC="$CC"
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        if test "x$PTHREAD_CC" != "x"; then :
+  CC="$PTHREAD_CC"
+fi
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5
+$as_echo_n "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; }
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_join ();
+int
+main ()
+{
+return pthread_join ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ax_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
+$as_echo "$ax_pthread_ok" >&6; }
+        if test "x$ax_pthread_ok" = "xno"; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        CC="$ax_pthread_save_CC"
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try.  Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
+#           (Note: HP C rejects this with "bad form for `-t' option")
+# -pthreads: Solaris/gcc (Note: HP C also rejects)
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads and
+#      -D_REENTRANT too), HP C (must be checked before -lpthread, which
+#      is present but should not be used directly; and before -mthreads,
+#      because the compiler interprets this as "-mt" + "-hreads")
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case $host_os in
+
+        freebsd*)
+
+        # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+        # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+
+        ax_pthread_flags="-kthread lthread $ax_pthread_flags"
+        ;;
+
+        hpux*)
+
+        # From the cc(1) man page: "[-mt] Sets various -D flags to enable
+        # multi-threading and also sets -lpthread."
+
+        ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
+        ;;
+
+        openedition*)
+
+        # IBM z/OS requires a feature-test macro to be defined in order to
+        # enable POSIX threads at all, so give the user a hint if this is
+        # not set. (We don't define these ourselves, as they can affect
+        # other portions of the system API in unpredictable ways.)
+
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#            if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
+             AX_PTHREAD_ZOS_MISSING
+#            endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5
+$as_echo "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;}
+fi
+rm -f conftest*
+
+        ;;
+
+        solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed. (N.B.: The stubs are missing
+        # pthread_cleanup_push, or rather a function called by this macro,
+        # so we could check for that, but who knows whether they'll stub
+        # that too in a future libc.)  So we'll check first for the
+        # standard Solaris way of linking pthreads (-mt -lpthread).
+
+        ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags"
+        ;;
+esac
+
+# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
+
+if test "x$GCC" = "xyes"; then :
+  ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"
+fi
+
+# The presence of a feature test macro requesting re-entrant function
+# definitions is, on some systems, a strong hint that pthreads support is
+# correctly enabled
+
+case $host_os in
+        darwin* | hpux* | linux* | osf* | solaris*)
+        ax_pthread_check_macro="_REENTRANT"
+        ;;
+
+        aix*)
+        ax_pthread_check_macro="_THREAD_SAFE"
+        ;;
+
+        *)
+        ax_pthread_check_macro="--"
+        ;;
+esac
+if test "x$ax_pthread_check_macro" = "x--"; then :
+  ax_pthread_check_cond=0
+else
+  ax_pthread_check_cond="!defined($ax_pthread_check_macro)"
+fi
+
+# Are we compiling with Clang?
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5
+$as_echo_n "checking whether $CC is Clang... " >&6; }
+if ${ax_cv_PTHREAD_CLANG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ax_cv_PTHREAD_CLANG=no
+     # Note that Autoconf sets GCC=yes for Clang as well as GCC
+     if test "x$GCC" = "xyes"; then
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
+#            if defined(__clang__) && defined(__llvm__)
+             AX_PTHREAD_CC_IS_CLANG
+#            endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1; then :
+  ax_cv_PTHREAD_CLANG=yes
+fi
+rm -f conftest*
+
+     fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5
+$as_echo "$ax_cv_PTHREAD_CLANG" >&6; }
+ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
+
+ax_pthread_clang_warning=no
+
+# Clang needs special handling, because older versions handle the -pthread
+# option in a rather... idiosyncratic way
+
+if test "x$ax_pthread_clang" = "xyes"; then
+
+        # Clang takes -pthread; it has never supported any other flag
+
+        # (Note 1: This will need to be revisited if a system that Clang
+        # supports has POSIX threads in a separate library.  This tends not
+        # to be the way of modern systems, but it's conceivable.)
+
+        # (Note 2: On some systems, notably Darwin, -pthread is not needed
+        # to get POSIX threads support; the API is always present and
+        # active.  We could reasonably leave PTHREAD_CFLAGS empty.  But
+        # -pthread does define _REENTRANT, and while the Darwin headers
+        # ignore this macro, third-party headers might not.)
+
+        PTHREAD_CFLAGS="-pthread"
+        PTHREAD_LIBS=
+
+        ax_pthread_ok=yes
+
+        # However, older versions of Clang make a point of warning the user
+        # that, in an invocation where only linking and no compilation is
+        # taking place, the -pthread option has no effect ("argument unused
+        # during compilation").  They expect -pthread to be passed in only
+        # when source code is being compiled.
+        #
+        # Problem is, this is at odds with the way Automake and most other
+        # C build frameworks function, which is that the same flags used in
+        # compilation (CFLAGS) are also used in linking.  Many systems
+        # supported by AX_PTHREAD require exactly this for POSIX threads
+        # support, and in fact it is often not straightforward to specify a
+        # flag that is used only in the compilation phase and not in
+        # linking.  Such a scenario is extremely rare in practice.
+        #
+        # Even though use of the -pthread flag in linking would only print
+        # a warning, this can be a nuisance for well-run software projects
+        # that build with -Werror.  So if the active version of Clang has
+        # this misfeature, we search for an option to squash it.
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5
+$as_echo_n "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; }
+if ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
+             # Create an alternate version of $ac_link that compiles and
+             # links in two steps (.c -> .o, .o -> exe) instead of one
+             # (.c -> exe), because the warning occurs only in the second
+             # step
+             ax_pthread_save_ac_link="$ac_link"
+             ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
+             ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
+             ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
+             ax_pthread_save_CFLAGS="$CFLAGS"
+             for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
+                if test "x$ax_pthread_try" = "xunknown"; then :
+  break
+fi
+                CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
+                ac_link="$ax_pthread_save_ac_link"
+                cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int main(void){return 0;}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_link="$ax_pthread_2step_ac_link"
+                     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int main(void){return 0;}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+             done
+             ac_link="$ax_pthread_save_ac_link"
+             CFLAGS="$ax_pthread_save_CFLAGS"
+             if test "x$ax_pthread_try" = "x"; then :
+  ax_pthread_try=no
+fi
+             ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5
+$as_echo "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; }
+
+        case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
+                no | unknown) ;;
+                *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
+        esac
+
+fi # $ax_pthread_clang = yes
+
+if test "x$ax_pthread_ok" = "xno"; then
+for ax_pthread_try_flag in $ax_pthread_flags; do
+
+        case $ax_pthread_try_flag in
+                none)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
+$as_echo_n "checking whether pthreads work without any flags... " >&6; }
+                ;;
+
+                -mt,pthread)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with -mt -lpthread" >&5
+$as_echo_n "checking whether pthreads work with -mt -lpthread... " >&6; }
+                PTHREAD_CFLAGS="-mt"
+                PTHREAD_LIBS="-lpthread"
+                ;;
+
+                -*)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5
+$as_echo_n "checking whether pthreads work with $ax_pthread_try_flag... " >&6; }
+                PTHREAD_CFLAGS="$ax_pthread_try_flag"
+                ;;
+
+                pthread-config)
+                # Extract the first word of "pthread-config", so it can be a program name with args.
+set dummy pthread-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ax_pthread_config+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ax_pthread_config"; then
+  ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ax_pthread_config="yes"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no"
+fi
+fi
+ax_pthread_config=$ac_cv_prog_ax_pthread_config
+if test -n "$ax_pthread_config"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5
+$as_echo "$ax_pthread_config" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+                if test "x$ax_pthread_config" = "xno"; then :
+  continue
+fi
+                PTHREAD_CFLAGS="`pthread-config --cflags`"
+                PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+                ;;
+
+                *)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5
+$as_echo_n "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; }
+                PTHREAD_LIBS="-l$ax_pthread_try_flag"
+                ;;
+        esac
+
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+#                       if $ax_pthread_check_cond
+#                        error "$ax_pthread_check_macro must be defined"
+#                       endif
+                        static void routine(void *a) { a = 0; }
+                        static void *start_routine(void *a) { return a; }
+int
+main ()
+{
+pthread_t th; pthread_attr_t attr;
+                        pthread_create(&th, 0, start_routine, 0);
+                        pthread_join(th, 0);
+                        pthread_attr_init(&attr);
+                        pthread_cleanup_push(routine, 0);
+                        pthread_cleanup_pop(0) /* ; */
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ax_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
+$as_echo "$ax_pthread_ok" >&6; }
+        if test "x$ax_pthread_ok" = "xyes"; then :
+  break
+fi
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$ax_pthread_ok" = "xyes"; then
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+
+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
+$as_echo_n "checking for joinable pthread attribute... " >&6; }
+if ${ax_cv_PTHREAD_JOINABLE_ATTR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ax_cv_PTHREAD_JOINABLE_ATTR=unknown
+             for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+                 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+int attr = $ax_pthread_attr; return attr /* ; */
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+             done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5
+$as_echo "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; }
+        if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
+               test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
+               test "x$ax_pthread_joinable_attr_defined" != "xyes"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR
+_ACEOF
+
+               ax_pthread_joinable_attr_defined=yes
+
+fi
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5
+$as_echo_n "checking whether more special flags are required for pthreads... " >&6; }
+if ${ax_cv_PTHREAD_SPECIAL_FLAGS+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ax_cv_PTHREAD_SPECIAL_FLAGS=no
+             case $host_os in
+             solaris*)
+             ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
+             ;;
+             esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5
+$as_echo "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; }
+        if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
+               test "x$ax_pthread_special_flags_added" != "xyes"; then :
+  PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
+               ax_pthread_special_flags_added=yes
+fi
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5
+$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; }
+if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+int i = PTHREAD_PRIO_INHERIT;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ax_cv_PTHREAD_PRIO_INHERIT=yes
+else
+  ax_cv_PTHREAD_PRIO_INHERIT=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5
+$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; }
+        if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
+               test "x$ax_pthread_prio_inherit_defined" != "xyes"; then :
+
+$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h
+
+               ax_pthread_prio_inherit_defined=yes
+
+fi
+
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+
+        # More AIX lossage: compile with *_r variant
+        if test "x$GCC" != "xyes"; then
+            case $host_os in
+                aix*)
+                case "x/$CC" in #(
+  x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) :
+    #handle absolute path differently from PATH based program lookup
+                     case "x$CC" in #(
+  x/*) :
+    if as_fn_executable_p ${CC}_r; then :
+  PTHREAD_CC="${CC}_r"
+fi ;; #(
+  *) :
+    for ac_prog in ${CC}_r
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PTHREAD_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$PTHREAD_CC"; then
+  ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_PTHREAD_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+PTHREAD_CC=$ac_cv_prog_PTHREAD_CC
+if test -n "$PTHREAD_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5
+$as_echo "$PTHREAD_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$PTHREAD_CC" && break
+done
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+ ;;
+esac ;; #(
+  *) :
+     ;;
+esac
+                ;;
+            esac
+        fi
+fi
+
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+
+
+
+
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test "x$ax_pthread_ok" = "xyes"; then
+        have_pthread=true
+        :
+else
+        ax_pthread_ok=no
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+fi
+if $have_pthread; then
+
+$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
+
+fi
+ if $have_pthread; then
+  HAVE_PTHREAD_TRUE=
+  HAVE_PTHREAD_FALSE='#'
+else
+  HAVE_PTHREAD_TRUE='#'
+  HAVE_PTHREAD_FALSE=
+fi
+
+
+
+have_fallback=true
+if $have_fallback; then
+
+$as_echo "#define HAVE_FALLBACK 1" >>confdefs.h
+
+fi
+ if $have_fallback; then
+  HAVE_FALLBACK_TRUE=
+  HAVE_FALLBACK_FALSE='#'
+else
+  HAVE_FALLBACK_TRUE='#'
+  HAVE_FALLBACK_FALSE=
+fi
+
+
+
+
+# Check whether --with-glib was given.
+if test "${with_glib+set}" = set; then :
+  withval=$with_glib;
+else
+  with_glib=auto
+fi
+
+have_glib=false
+GLIB_DEPS="glib-2.0 >= 2.19.1"
+
+if test "x$with_glib" = "xyes" -o "x$with_glib" = "xauto"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5
+$as_echo_n "checking for GLIB... " >&6; }
+
+if test -n "$GLIB_CFLAGS"; then
+    pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$GLIB_DEPS\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$GLIB_DEPS") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "$GLIB_DEPS" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GLIB_LIBS"; then
+    pkg_cv_GLIB_LIBS="$GLIB_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$GLIB_DEPS\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$GLIB_DEPS") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "$GLIB_DEPS" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$GLIB_DEPS" 2>&1`
+        else
+	        GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$GLIB_DEPS" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GLIB_PKG_ERRORS" >&5
+
+	:
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	:
+else
+	GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS
+	GLIB_LIBS=$pkg_cv_GLIB_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	have_glib=true
+fi
+fi
+if test "x$with_glib" = "xyes" -a "x$have_glib" != "xtrue"; then
+	as_fn_error $? "glib support requested but glib-2.0 not found" "$LINENO" 5
+fi
+if $have_glib; then
+
+$as_echo "#define HAVE_GLIB 1" >>confdefs.h
+
+fi
+ if $have_glib; then
+  HAVE_GLIB_TRUE=
+  HAVE_GLIB_FALSE='#'
+else
+  HAVE_GLIB_TRUE='#'
+  HAVE_GLIB_FALSE=
+fi
+
+
+
+
+# Check whether --with-gobject was given.
+if test "${with_gobject+set}" = set; then :
+  withval=$with_gobject;
+else
+  with_gobject=no
+fi
+
+have_gobject=false
+if test "x$with_gobject" = "xyes" -o "x$with_gobject" = "xauto"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GOBJECT" >&5
+$as_echo_n "checking for GOBJECT... " >&6; }
+
+if test -n "$GOBJECT_CFLAGS"; then
+    pkg_cv_GOBJECT_CFLAGS="$GOBJECT_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-2.0 glib-2.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-2.0 glib-2.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GOBJECT_CFLAGS=`$PKG_CONFIG --cflags "gobject-2.0 glib-2.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GOBJECT_LIBS"; then
+    pkg_cv_GOBJECT_LIBS="$GOBJECT_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-2.0 glib-2.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-2.0 glib-2.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GOBJECT_LIBS=`$PKG_CONFIG --libs "gobject-2.0 glib-2.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GOBJECT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gobject-2.0 glib-2.0" 2>&1`
+        else
+	        GOBJECT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gobject-2.0 glib-2.0" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GOBJECT_PKG_ERRORS" >&5
+
+	:
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	:
+else
+	GOBJECT_CFLAGS=$pkg_cv_GOBJECT_CFLAGS
+	GOBJECT_LIBS=$pkg_cv_GOBJECT_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	have_gobject=true
+fi
+fi
+if test "x$with_gobject" = "xyes" -a "x$have_gobject" != "xtrue"; then
+	as_fn_error $? "gobject support requested but gobject-2.0 / glib-2.0 not found" "$LINENO" 5
+fi
+if $have_gobject; then
+
+$as_echo "#define HAVE_GOBJECT 1" >>confdefs.h
+
+	GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
+
+fi
+ if $have_gobject; then
+  HAVE_GOBJECT_TRUE=
+  HAVE_GOBJECT_FALSE='#'
+else
+  HAVE_GOBJECT_TRUE='#'
+  HAVE_GOBJECT_FALSE=
+fi
+
+
+
+
+
+# Gobject-Introspection
+have_introspection=false
+
+	if $have_gobject; then
+
+
+
+                # Check whether --enable-introspection was given.
+if test "${enable_introspection+set}" = set; then :
+  enableval=$enable_introspection;
+else
+  enable_introspection=auto
+fi
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gobject-introspection" >&5
+$as_echo_n "checking for gobject-introspection... " >&6; }
+
+        case $enable_introspection in #(
+  no) :
+            found_introspection="no (disabled, use --enable-introspection to enable)"
+     ;; #(
+      yes) :
+            if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  :
+else
+  as_fn_error $? "gobject-introspection-1.0 is not installed" "$LINENO" 5
+fi
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 1.34.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 1.34.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  found_introspection=yes
+else
+  as_fn_error $? "You need to have gobject-introspection >= 1.34.0 installed to build HarfBuzz" "$LINENO" 5
+fi
+     ;; #(
+      auto) :
+            if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 1.34.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 1.34.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  found_introspection=yes
+else
+  found_introspection=no
+fi
+		enable_introspection=$found_introspection
+     ;; #(
+  *) :
+                as_fn_error $? "invalid argument passed to --enable-introspection, should be one of [no/auto/yes]" "$LINENO" 5
+     ;;
+esac
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $found_introspection" >&5
+$as_echo "$found_introspection" >&6; }
+
+    INTROSPECTION_SCANNER=
+    INTROSPECTION_COMPILER=
+    INTROSPECTION_GENERATE=
+    INTROSPECTION_GIRDIR=
+    INTROSPECTION_TYPELIBDIR=
+    if test "x$found_introspection" = "xyes"; then
+       INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
+       INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
+       INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
+       INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
+       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
+       INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
+       INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
+       INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
+    fi
+
+
+
+
+
+
+
+
+
+     if test "x$found_introspection" = "xyes"; then
+  HAVE_INTROSPECTION_TRUE=
+  HAVE_INTROSPECTION_FALSE='#'
+else
+  HAVE_INTROSPECTION_TRUE='#'
+  HAVE_INTROSPECTION_FALSE=
+fi
+
+
+
+		if test "x$found_introspection" = xyes; then
+			have_introspection=true
+		fi
+	else
+		 if false; then
+  HAVE_INTROSPECTION_TRUE=
+  HAVE_INTROSPECTION_FALSE='#'
+else
+  HAVE_INTROSPECTION_TRUE='#'
+  HAVE_INTROSPECTION_FALSE=
+fi
+
+	fi
+
+
+
+
+# Check whether --with-cairo was given.
+if test "${with_cairo+set}" = set; then :
+  withval=$with_cairo;
+else
+  with_cairo=auto
+fi
+
+have_cairo=false
+if test "x$with_cairo" = "xyes" -o "x$with_cairo" = "xauto"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO" >&5
+$as_echo_n "checking for CAIRO... " >&6; }
+
+if test -n "$CAIRO_CFLAGS"; then
+    pkg_cv_CAIRO_CFLAGS="$CAIRO_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= 1.8.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cairo >= 1.8.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CAIRO_CFLAGS=`$PKG_CONFIG --cflags "cairo >= 1.8.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$CAIRO_LIBS"; then
+    pkg_cv_CAIRO_LIBS="$CAIRO_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= 1.8.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cairo >= 1.8.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CAIRO_LIBS=`$PKG_CONFIG --libs "cairo >= 1.8.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        CAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cairo >= 1.8.0" 2>&1`
+        else
+	        CAIRO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cairo >= 1.8.0" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$CAIRO_PKG_ERRORS" >&5
+
+	:
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	:
+else
+	CAIRO_CFLAGS=$pkg_cv_CAIRO_CFLAGS
+	CAIRO_LIBS=$pkg_cv_CAIRO_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	have_cairo=true
+fi
+fi
+if test "x$with_cairo" = "xyes" -a "x$have_cairo" != "xtrue"; then
+	as_fn_error $? "cairo support requested but not found" "$LINENO" 5
+fi
+if $have_cairo; then
+
+$as_echo "#define HAVE_CAIRO 1" >>confdefs.h
+
+fi
+ if $have_cairo; then
+  HAVE_CAIRO_TRUE=
+  HAVE_CAIRO_FALSE='#'
+else
+  HAVE_CAIRO_TRUE='#'
+  HAVE_CAIRO_FALSE=
+fi
+
+
+have_cairo_ft=false
+if $have_cairo; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO_FT" >&5
+$as_echo_n "checking for CAIRO_FT... " >&6; }
+
+if test -n "$CAIRO_FT_CFLAGS"; then
+    pkg_cv_CAIRO_FT_CFLAGS="$CAIRO_FT_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo-ft\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cairo-ft") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CAIRO_FT_CFLAGS=`$PKG_CONFIG --cflags "cairo-ft" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$CAIRO_FT_LIBS"; then
+    pkg_cv_CAIRO_FT_LIBS="$CAIRO_FT_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo-ft\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cairo-ft") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CAIRO_FT_LIBS=`$PKG_CONFIG --libs "cairo-ft" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        CAIRO_FT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cairo-ft" 2>&1`
+        else
+	        CAIRO_FT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cairo-ft" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$CAIRO_FT_PKG_ERRORS" >&5
+
+	:
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	:
+else
+	CAIRO_FT_CFLAGS=$pkg_cv_CAIRO_FT_CFLAGS
+	CAIRO_FT_LIBS=$pkg_cv_CAIRO_FT_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	have_cairo_ft=true
+fi
+fi
+if $have_cairo_ft; then
+
+$as_echo "#define HAVE_CAIRO_FT 1" >>confdefs.h
+
+fi
+ if $have_cairo_ft; then
+  HAVE_CAIRO_FT_TRUE=
+  HAVE_CAIRO_FT_FALSE='#'
+else
+  HAVE_CAIRO_FT_TRUE='#'
+  HAVE_CAIRO_FT_FALSE=
+fi
+
+
+
+
+# Check whether --with-fontconfig was given.
+if test "${with_fontconfig+set}" = set; then :
+  withval=$with_fontconfig;
+else
+  with_fontconfig=auto
+fi
+
+have_fontconfig=false
+if test "x$with_fontconfig" = "xyes" -o "x$with_fontconfig" = "xauto"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FONTCONFIG" >&5
+$as_echo_n "checking for FONTCONFIG... " >&6; }
+
+if test -n "$FONTCONFIG_CFLAGS"; then
+    pkg_cv_FONTCONFIG_CFLAGS="$FONTCONFIG_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "fontconfig") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_FONTCONFIG_CFLAGS=`$PKG_CONFIG --cflags "fontconfig" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$FONTCONFIG_LIBS"; then
+    pkg_cv_FONTCONFIG_LIBS="$FONTCONFIG_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "fontconfig") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_FONTCONFIG_LIBS=`$PKG_CONFIG --libs "fontconfig" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fontconfig" 2>&1`
+        else
+	        FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fontconfig" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$FONTCONFIG_PKG_ERRORS" >&5
+
+	:
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	:
+else
+	FONTCONFIG_CFLAGS=$pkg_cv_FONTCONFIG_CFLAGS
+	FONTCONFIG_LIBS=$pkg_cv_FONTCONFIG_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	have_fontconfig=true
+fi
+fi
+if test "x$with_fontconfig" = "xyes" -a "x$have_fontconfig" != "xtrue"; then
+	as_fn_error $? "fontconfig support requested but not found" "$LINENO" 5
+fi
+if $have_fontconfig; then
+
+$as_echo "#define HAVE_FONTCONFIG 1" >>confdefs.h
+
+fi
+ if $have_fontconfig; then
+  HAVE_FONTCONFIG_TRUE=
+  HAVE_FONTCONFIG_FALSE='#'
+else
+  HAVE_FONTCONFIG_TRUE='#'
+  HAVE_FONTCONFIG_FALSE=
+fi
+
+
+
+
+# Check whether --with-icu was given.
+if test "${with_icu+set}" = set; then :
+  withval=$with_icu;
+else
+  with_icu=auto
+fi
+
+have_icu=false
+if test "x$with_icu" = "xyes" -o "x$with_icu" = "xbuiltin" -o "x$with_icu" = "xauto"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ICU" >&5
+$as_echo_n "checking for ICU... " >&6; }
+
+if test -n "$ICU_CFLAGS"; then
+    pkg_cv_ICU_CFLAGS="$ICU_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"icu-uc\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "icu-uc") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_ICU_CFLAGS=`$PKG_CONFIG --cflags "icu-uc" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$ICU_LIBS"; then
+    pkg_cv_ICU_LIBS="$ICU_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"icu-uc\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "icu-uc") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_ICU_LIBS=`$PKG_CONFIG --libs "icu-uc" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        ICU_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "icu-uc" 2>&1`
+        else
+	        ICU_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "icu-uc" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$ICU_PKG_ERRORS" >&5
+
+	:
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	:
+else
+	ICU_CFLAGS=$pkg_cv_ICU_CFLAGS
+	ICU_LIBS=$pkg_cv_ICU_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	have_icu=true
+fi
+
+		if test "$have_icu" != "true"; then
+		if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}icu-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}icu-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ICU_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ICU_CONFIG"; then
+  ac_cv_prog_ICU_CONFIG="$ICU_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ICU_CONFIG="${ac_tool_prefix}icu-config"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ICU_CONFIG=$ac_cv_prog_ICU_CONFIG
+if test -n "$ICU_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ICU_CONFIG" >&5
+$as_echo "$ICU_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_ICU_CONFIG"; then
+  ac_ct_ICU_CONFIG=$ICU_CONFIG
+  # Extract the first word of "icu-config", so it can be a program name with args.
+set dummy icu-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_ICU_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_ICU_CONFIG"; then
+  ac_cv_prog_ac_ct_ICU_CONFIG="$ac_ct_ICU_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_ICU_CONFIG="icu-config"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_ICU_CONFIG=$ac_cv_prog_ac_ct_ICU_CONFIG
+if test -n "$ac_ct_ICU_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_ICU_CONFIG" >&5
+$as_echo "$ac_ct_ICU_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_ICU_CONFIG" = x; then
+    ICU_CONFIG="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    ICU_CONFIG=$ac_ct_ICU_CONFIG
+  fi
+else
+  ICU_CONFIG="$ac_cv_prog_ICU_CONFIG"
+fi
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ICU by using icu-config fallback" >&5
+$as_echo_n "checking for ICU by using icu-config fallback... " >&6; }
+		if test "$ICU_CONFIG" != "no" && "$ICU_CONFIG" --version >/dev/null; then
+			have_icu=true
+			# We don't use --cflags as this gives us a lot of things that we don't
+			# necessarily want, like debugging and optimization flags
+			# See man (1) icu-config for more info.
+			ICU_CFLAGS=`$ICU_CONFIG --cppflags`
+			ICU_LIBS=`$ICU_CONFIG --ldflags-searchpath --ldflags-libsonly`
+
+
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		else
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		fi
+	fi
+fi
+if test \( "x$with_icu" = "xyes" -o "x$with_icu" = "xbuiltin" \) -a "x$have_icu" != "xtrue"; then
+	as_fn_error $? "icu support requested but icu-uc not found" "$LINENO" 5
+fi
+
+if $have_icu; then
+	CXXFLAGS="$CXXFLAGS `$PKG_CONFIG --variable=CXXFLAGS icu-uc`"
+
+$as_echo "#define HAVE_ICU 1" >>confdefs.h
+
+	if test "x$with_icu" = "xbuiltin"; then
+
+$as_echo "#define HAVE_ICU_BUILTIN 1" >>confdefs.h
+
+	fi
+fi
+ if $have_icu; then
+  HAVE_ICU_TRUE=
+  HAVE_ICU_FALSE='#'
+else
+  HAVE_ICU_TRUE='#'
+  HAVE_ICU_FALSE=
+fi
+
+ if $have_icu && test "x$with_icu" = "xbuiltin"; then
+  HAVE_ICU_BUILTIN_TRUE=
+  HAVE_ICU_BUILTIN_FALSE='#'
+else
+  HAVE_ICU_BUILTIN_TRUE='#'
+  HAVE_ICU_BUILTIN_FALSE=
+fi
+
+
+
+
+# Check whether --with-ucdn was given.
+if test "${with_ucdn+set}" = set; then :
+  withval=$with_ucdn;
+else
+  with_ucdn=yes
+fi
+
+have_ucdn=false
+if test "x$with_ucdn" = "xyes"; then
+	have_ucdn=true
+fi
+if $have_ucdn; then
+
+$as_echo "#define HAVE_UCDN 1" >>confdefs.h
+
+fi
+ if $have_ucdn; then
+  HAVE_UCDN_TRUE=
+  HAVE_UCDN_FALSE='#'
+else
+  HAVE_UCDN_TRUE='#'
+  HAVE_UCDN_FALSE=
+fi
+
+
+
+
+# Check whether --with-graphite2 was given.
+if test "${with_graphite2+set}" = set; then :
+  withval=$with_graphite2;
+else
+  with_graphite2=no
+fi
+
+have_graphite2=false
+GRAPHITE2_DEPS="graphite2 >= 1.2.0"
+
+if test "x$with_graphite2" = "xyes" -o "x$with_graphite2" = "xauto"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GRAPHITE2" >&5
+$as_echo_n "checking for GRAPHITE2... " >&6; }
+
+if test -n "$GRAPHITE2_CFLAGS"; then
+    pkg_cv_GRAPHITE2_CFLAGS="$GRAPHITE2_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$GRAPHITE2_DEPS\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$GRAPHITE2_DEPS") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GRAPHITE2_CFLAGS=`$PKG_CONFIG --cflags "$GRAPHITE2_DEPS" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GRAPHITE2_LIBS"; then
+    pkg_cv_GRAPHITE2_LIBS="$GRAPHITE2_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$GRAPHITE2_DEPS\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$GRAPHITE2_DEPS") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GRAPHITE2_LIBS=`$PKG_CONFIG --libs "$GRAPHITE2_DEPS" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GRAPHITE2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$GRAPHITE2_DEPS" 2>&1`
+        else
+	        GRAPHITE2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$GRAPHITE2_DEPS" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GRAPHITE2_PKG_ERRORS" >&5
+
+	:
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	:
+else
+	GRAPHITE2_CFLAGS=$pkg_cv_GRAPHITE2_CFLAGS
+	GRAPHITE2_LIBS=$pkg_cv_GRAPHITE2_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	have_graphite2=true
+fi
+	if test "x$have_graphite2" != "xtrue"; then
+                # If pkg-config is not available, graphite2 can still be there
+		ac_save_CFLAGS="$CFLAGS"
+		ac_save_CPPFLAGS="$CPPFLAGS"
+		CFLAGS="$CFLAGS $GRAPHITE2_CFLAGS"
+		CPPFLAGS="$CPPFLAGS $GRAPHITE2_CFLAGS"
+		ac_fn_c_check_header_mongrel "$LINENO" "graphite2/Segment.h" "ac_cv_header_graphite2_Segment_h" "$ac_includes_default"
+if test "x$ac_cv_header_graphite2_Segment_h" = xyes; then :
+  have_graphite2=true
+else
+  :
+fi
+
+
+		CPPFLAGS="$ac_save_CPPFLAGS"
+		CFLAGS="$ac_save_CFLAGS"
+	fi
+fi
+if test "x$with_graphite2" = "xyes" -a "x$have_graphite2" != "xtrue"; then
+	as_fn_error $? "graphite2 support requested but libgraphite2 not found" "$LINENO" 5
+fi
+if $have_graphite2; then
+
+$as_echo "#define HAVE_GRAPHITE2 1" >>confdefs.h
+
+fi
+ if $have_graphite2; then
+  HAVE_GRAPHITE2_TRUE=
+  HAVE_GRAPHITE2_FALSE='#'
+else
+  HAVE_GRAPHITE2_TRUE='#'
+  HAVE_GRAPHITE2_FALSE=
+fi
+
+
+
+
+# Check whether --with-freetype was given.
+if test "${with_freetype+set}" = set; then :
+  withval=$with_freetype;
+else
+  with_freetype=auto
+fi
+
+have_freetype=false
+FREETYPE_DEPS="freetype2 >= 12.0.6"
+
+if test "x$with_freetype" = "xyes" -o "x$with_freetype" = "xauto"; then
+	# See freetype/docs/VERSION.DLL; 12.0.6 means freetype-2.4.2
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FREETYPE" >&5
+$as_echo_n "checking for FREETYPE... " >&6; }
+
+if test -n "$FREETYPE_CFLAGS"; then
+    pkg_cv_FREETYPE_CFLAGS="$FREETYPE_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$FREETYPE_DEPS\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$FREETYPE_DEPS") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_FREETYPE_CFLAGS=`$PKG_CONFIG --cflags "$FREETYPE_DEPS" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$FREETYPE_LIBS"; then
+    pkg_cv_FREETYPE_LIBS="$FREETYPE_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$FREETYPE_DEPS\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$FREETYPE_DEPS") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_FREETYPE_LIBS=`$PKG_CONFIG --libs "$FREETYPE_DEPS" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        FREETYPE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$FREETYPE_DEPS" 2>&1`
+        else
+	        FREETYPE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$FREETYPE_DEPS" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$FREETYPE_PKG_ERRORS" >&5
+
+	:
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	:
+else
+	FREETYPE_CFLAGS=$pkg_cv_FREETYPE_CFLAGS
+	FREETYPE_LIBS=$pkg_cv_FREETYPE_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	have_freetype=true
+fi
+fi
+if test "x$with_freetype" = "xyes" -a "x$have_freetype" != "xtrue"; then
+	as_fn_error $? "FreeType support requested but libfreetype2 not found" "$LINENO" 5
+fi
+if $have_freetype; then
+
+$as_echo "#define HAVE_FREETYPE 1" >>confdefs.h
+
+	save_libs=$LIBS
+	LIBS="$LIBS $FREETYPE_LIBS"
+	for ac_func in FT_Get_Var_Blend_Coordinates FT_Set_Var_Blend_Coordinates FT_Done_MM_Var
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+	LIBS=$save_libs
+fi
+ if $have_freetype; then
+  HAVE_FREETYPE_TRUE=
+  HAVE_FREETYPE_FALSE='#'
+else
+  HAVE_FREETYPE_TRUE='#'
+  HAVE_FREETYPE_FALSE=
+fi
+
+
+
+
+# Check whether --with-uniscribe was given.
+if test "${with_uniscribe+set}" = set; then :
+  withval=$with_uniscribe;
+else
+  with_uniscribe=no
+fi
+
+have_uniscribe=false
+if test "x$with_uniscribe" = "xyes" -o "x$with_uniscribe" = "xauto"; then
+	for ac_header in usp10.h windows.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ have_uniscribe=true
+fi
+
+done
+
+fi
+if test "x$with_uniscribe" = "xyes" -a "x$have_uniscribe" != "xtrue"; then
+	as_fn_error $? "uniscribe support requested but not found" "$LINENO" 5
+fi
+if $have_uniscribe; then
+	UNISCRIBE_CFLAGS=
+	UNISCRIBE_LIBS="-lusp10 -lgdi32 -lrpcrt4"
+
+
+
+$as_echo "#define HAVE_UNISCRIBE 1" >>confdefs.h
+
+fi
+ if $have_uniscribe; then
+  HAVE_UNISCRIBE_TRUE=
+  HAVE_UNISCRIBE_FALSE='#'
+else
+  HAVE_UNISCRIBE_TRUE='#'
+  HAVE_UNISCRIBE_FALSE=
+fi
+
+
+
+
+# Check whether --with-directwrite was given.
+if test "${with_directwrite+set}" = set; then :
+  withval=$with_directwrite;
+else
+  with_directwrite=no
+fi
+
+have_directwrite=false
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+if test "x$with_directwrite" = "xyes" -o "x$with_directwrite" = "xauto"; then
+
+for ac_header in dwrite.h
+do :
+  ac_fn_cxx_check_header_mongrel "$LINENO" "dwrite.h" "ac_cv_header_dwrite_h" "$ac_includes_default"
+if test "x$ac_cv_header_dwrite_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DWRITE_H 1
+_ACEOF
+ have_directwrite=true
+fi
+
+done
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test "x$with_directwrite" = "xyes" -a "x$have_directwrite" != "xtrue"; then
+	as_fn_error $? "directwrite support requested but not found" "$LINENO" 5
+fi
+if $have_directwrite; then
+	DIRECTWRITE_CXXFLAGS=
+	DIRECTWRITE_LIBS="-ldwrite"
+
+
+
+$as_echo "#define HAVE_DIRECTWRITE 1" >>confdefs.h
+
+fi
+ if $have_directwrite; then
+  HAVE_DIRECTWRITE_TRUE=
+  HAVE_DIRECTWRITE_FALSE='#'
+else
+  HAVE_DIRECTWRITE_TRUE='#'
+  HAVE_DIRECTWRITE_FALSE=
+fi
+
+
+
+
+# Check whether --with-coretext was given.
+if test "${with_coretext+set}" = set; then :
+  withval=$with_coretext;
+else
+  with_coretext=no
+fi
+
+have_coretext=false
+if test "x$with_coretext" = "xyes" -o "x$with_coretext" = "xauto"; then
+	ac_fn_c_check_type "$LINENO" "CTFontRef" "ac_cv_type_CTFontRef" "#include <ApplicationServices/ApplicationServices.h>
+"
+if test "x$ac_cv_type_CTFontRef" = xyes; then :
+  have_coretext=true
+fi
+
+
+	if $have_coretext; then
+		CORETEXT_CFLAGS=
+		CORETEXT_LIBS="-framework ApplicationServices"
+
+
+	else
+		# On iOS CoreText and CoreGraphics are stand-alone frameworks
+		if test "x$have_coretext" != "xtrue"; then
+			# Check for a different symbol to avoid getting cached result.
+			ac_fn_c_check_type "$LINENO" "CTRunRef" "ac_cv_type_CTRunRef" "#include <CoreText/CoreText.h>
+"
+if test "x$ac_cv_type_CTRunRef" = xyes; then :
+  have_coretext=true
+fi
+
+		fi
+
+		if $have_coretext; then
+			CORETEXT_CFLAGS=
+			CORETEXT_LIBS="-framework CoreText -framework CoreGraphics -framework CoreFoundation"
+
+
+		fi
+	fi
+fi
+if test "x$with_coretext" = "xyes" -a "x$have_coretext" != "xtrue"; then
+	as_fn_error $? "CoreText support requested but libcoretext not found" "$LINENO" 5
+fi
+if $have_coretext; then
+
+$as_echo "#define HAVE_CORETEXT 1" >>confdefs.h
+
+fi
+ if $have_coretext; then
+  HAVE_CORETEXT_TRUE=
+  HAVE_CORETEXT_FALSE='#'
+else
+  HAVE_CORETEXT_TRUE='#'
+  HAVE_CORETEXT_FALSE=
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Intel atomic primitives" >&5
+$as_echo_n "checking for Intel atomic primitives... " >&6; }
+if ${hb_cv_have_intel_atomic_primitives+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+	hb_cv_have_intel_atomic_primitives=false
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+		void memory_barrier (void) { __sync_synchronize (); }
+		int atomic_add (int *i) { return __sync_fetch_and_add (i, 1); }
+		int mutex_trylock (int *m) { return __sync_lock_test_and_set (m, 1); }
+		void mutex_unlock (int *m) { __sync_lock_release (m); }
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  hb_cv_have_intel_atomic_primitives=true
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hb_cv_have_intel_atomic_primitives" >&5
+$as_echo "$hb_cv_have_intel_atomic_primitives" >&6; }
+if $hb_cv_have_intel_atomic_primitives; then
+
+$as_echo "#define HAVE_INTEL_ATOMIC_PRIMITIVES 1" >>confdefs.h
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Solaris atomic operations" >&5
+$as_echo_n "checking for Solaris atomic operations... " >&6; }
+if ${hb_cv_have_solaris_atomic_ops+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+	hb_cv_have_solaris_atomic_ops=false
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+		#include <atomic.h>
+		/* This requires Solaris Studio 12.2 or newer: */
+		#include <mbarrier.h>
+		void memory_barrier (void) { __machine_rw_barrier (); }
+		int atomic_add (volatile unsigned *i) { return atomic_add_int_nv (i, 1); }
+		void *atomic_ptr_cmpxchg (volatile void **target, void *cmp, void *newval) { return atomic_cas_ptr (target, cmp, newval); }
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  hb_cv_have_solaris_atomic_ops=true
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hb_cv_have_solaris_atomic_ops" >&5
+$as_echo "$hb_cv_have_solaris_atomic_ops" >&6; }
+if $hb_cv_have_solaris_atomic_ops; then
+
+$as_echo "#define HAVE_SOLARIS_ATOMIC_OPS 1" >>confdefs.h
+
+fi
+
+if test "$os_win32" = no && ! $have_pthread; then
+	for ac_header in sched.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "sched.h" "ac_cv_header_sched_h" "$ac_includes_default"
+if test "x$ac_cv_header_sched_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SCHED_H 1
+_ACEOF
+
+fi
+
+done
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sched_yield" >&5
+$as_echo_n "checking for library containing sched_yield... " >&6; }
+if ${ac_cv_search_sched_yield+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sched_yield ();
+int
+main ()
+{
+return sched_yield ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' rt; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_sched_yield=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_sched_yield+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_sched_yield+:} false; then :
+
+else
+  ac_cv_search_sched_yield=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sched_yield" >&5
+$as_echo "$ac_cv_search_sched_yield" >&6; }
+ac_res=$ac_cv_search_sched_yield
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+$as_echo "#define HAVE_SCHED_YIELD 1" >>confdefs.h
+
+fi
+
+fi
+
+
+ac_config_files="$ac_config_files Makefile src/Makefile src/harfbuzz-config.cmake src/hb-ucdn/Makefile util/Makefile test/Makefile test/api/Makefile test/fuzzing/Makefile test/shaping/Makefile test/shaping/data/Makefile test/shaping/data/aots/Makefile test/shaping/data/in-house/Makefile test/shaping/data/text-rendering-tests/Makefile test/subset/Makefile test/subset/data/Makefile docs/Makefile docs/version.xml"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${CODE_COVERAGE_ENABLED_TRUE}" && test -z "${CODE_COVERAGE_ENABLED_FALSE}"; then
+  as_fn_error $? "conditional \"CODE_COVERAGE_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_LIBSTDCXX_TRUE}" && test -z "${WITH_LIBSTDCXX_FALSE}"; then
+  as_fn_error $? "conditional \"WITH_LIBSTDCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_GTK_DOC_TRUE}" && test -z "${HAVE_GTK_DOC_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_GTK_DOC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_BUILD_HTML_TRUE}" && test -z "${GTK_DOC_BUILD_HTML_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_BUILD_HTML\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_BUILD_PDF_TRUE}" && test -z "${GTK_DOC_BUILD_PDF_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_BUILD_PDF\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_USE_REBASE_TRUE}" && test -z "${GTK_DOC_USE_REBASE_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_USE_REBASE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_GCC_TRUE}" && test -z "${HAVE_GCC_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_GCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${OS_WIN32_TRUE}" && test -z "${OS_WIN32_FALSE}"; then
+  as_fn_error $? "conditional \"OS_WIN32\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_PTHREAD_TRUE}" && test -z "${HAVE_PTHREAD_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PTHREAD\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_FALLBACK_TRUE}" && test -z "${HAVE_FALLBACK_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_FALLBACK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_GLIB_TRUE}" && test -z "${HAVE_GLIB_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_GLIB\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_GOBJECT_TRUE}" && test -z "${HAVE_GOBJECT_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_GOBJECT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_INTROSPECTION_TRUE}" && test -z "${HAVE_INTROSPECTION_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_INTROSPECTION\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_INTROSPECTION_TRUE}" && test -z "${HAVE_INTROSPECTION_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_INTROSPECTION\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_CAIRO_TRUE}" && test -z "${HAVE_CAIRO_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_CAIRO\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_CAIRO_FT_TRUE}" && test -z "${HAVE_CAIRO_FT_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_CAIRO_FT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_FONTCONFIG_TRUE}" && test -z "${HAVE_FONTCONFIG_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_FONTCONFIG\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_ICU_TRUE}" && test -z "${HAVE_ICU_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_ICU\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_ICU_BUILTIN_TRUE}" && test -z "${HAVE_ICU_BUILTIN_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_ICU_BUILTIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_UCDN_TRUE}" && test -z "${HAVE_UCDN_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_UCDN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_GRAPHITE2_TRUE}" && test -z "${HAVE_GRAPHITE2_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_GRAPHITE2\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_FREETYPE_TRUE}" && test -z "${HAVE_FREETYPE_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_FREETYPE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_UNISCRIBE_TRUE}" && test -z "${HAVE_UNISCRIBE_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_UNISCRIBE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_DIRECTWRITE_TRUE}" && test -z "${HAVE_DIRECTWRITE_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_DIRECTWRITE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_CORETEXT_TRUE}" && test -z "${HAVE_CORETEXT_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_CORETEXT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by HarfBuzz $as_me 2.3.1, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <https://github.com/harfbuzz/harfbuzz/issues/new>.
+HarfBuzz home page: <http://harfbuzz.org/>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+HarfBuzz config.status 2.3.1
+configured by $0, generated by GNU Autoconf 2.69,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+    "src/harfbuzz-config.cmake") CONFIG_FILES="$CONFIG_FILES src/harfbuzz-config.cmake" ;;
+    "src/hb-ucdn/Makefile") CONFIG_FILES="$CONFIG_FILES src/hb-ucdn/Makefile" ;;
+    "util/Makefile") CONFIG_FILES="$CONFIG_FILES util/Makefile" ;;
+    "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
+    "test/api/Makefile") CONFIG_FILES="$CONFIG_FILES test/api/Makefile" ;;
+    "test/fuzzing/Makefile") CONFIG_FILES="$CONFIG_FILES test/fuzzing/Makefile" ;;
+    "test/shaping/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/Makefile" ;;
+    "test/shaping/data/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/Makefile" ;;
+    "test/shaping/data/aots/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/aots/Makefile" ;;
+    "test/shaping/data/in-house/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/in-house/Makefile" ;;
+    "test/shaping/data/text-rendering-tests/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/text-rendering-tests/Makefile" ;;
+    "test/subset/Makefile") CONFIG_FILES="$CONFIG_FILES test/subset/Makefile" ;;
+    "test/subset/data/Makefile") CONFIG_FILES="$CONFIG_FILES test/subset/data/Makefile" ;;
+    "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;;
+    "docs/version.xml") CONFIG_FILES="$CONFIG_FILES docs/version.xml" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named 'Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running 'make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "$am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options that allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}"; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile=${ofile}T
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags='CXX '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}:
+
+Build configuration:
+
+Unicode callbacks (you want at least one):
+	Builtin (UCDN):		${have_ucdn}
+	Glib:			${have_glib}
+	ICU:			${have_icu}
+
+Font callbacks (the more the merrier):
+	FreeType:		${have_freetype}
+
+Tools used for command-line utilities:
+	Cairo:			${have_cairo}
+	Fontconfig:		${have_fontconfig}
+
+Additional shapers (the more the merrier):
+	Graphite2:		${have_graphite2}
+
+Platform shapers (not normally needed):
+	CoreText:		${have_coretext}
+	DirectWrite:		${have_directwrite}
+	Uniscribe:		${have_uniscribe}
+
+Other features:
+	Documentation:		${enable_gtk_doc}
+	GObject bindings:	${have_gobject}
+	Introspection:		${have_introspection}
+" >&5
+$as_echo "$as_me:
+
+Build configuration:
+
+Unicode callbacks (you want at least one):
+	Builtin (UCDN):		${have_ucdn}
+	Glib:			${have_glib}
+	ICU:			${have_icu}
+
+Font callbacks (the more the merrier):
+	FreeType:		${have_freetype}
+
+Tools used for command-line utilities:
+	Cairo:			${have_cairo}
+	Fontconfig:		${have_fontconfig}
+
+Additional shapers (the more the merrier):
+	Graphite2:		${have_graphite2}
+
+Platform shapers (not normally needed):
+	CoreText:		${have_coretext}
+	DirectWrite:		${have_directwrite}
+	Uniscribe:		${have_uniscribe}
+
+Other features:
+	Documentation:		${enable_gtk_doc}
+	GObject bindings:	${have_gobject}
+	Introspection:		${have_introspection}
+" >&6;}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/configure.ac b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/configure.ac
new file mode 100644
index 0000000..b7827a6
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/configure.ac
@@ -0,0 +1,546 @@
+AC_PREREQ([2.64])
+AC_INIT([HarfBuzz],
+        [2.3.1],
+        [https://github.com/harfbuzz/harfbuzz/issues/new],
+        [harfbuzz],
+        [http://harfbuzz.org/])
+
+AC_CONFIG_MACRO_DIR([m4])
+AC_CONFIG_SRCDIR([src/harfbuzz.pc.in])
+AC_CONFIG_HEADERS([config.h])
+
+AM_INIT_AUTOMAKE([1.13.0 gnits tar-ustar dist-bzip2 no-dist-gzip -Wall no-define color-tests -Wno-portability])
+AM_SILENT_RULES([yes])
+AX_CODE_COVERAGE
+
+# Initialize libtool
+m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
+LT_PREREQ([2.2])
+LT_INIT([disable-static])
+
+# Check for programs
+AC_PROG_CC
+AC_PROG_CC_C99
+AM_PROG_CC_C_O
+AC_PROG_CXX
+dnl AX_CXX_COMPILE_STDCXX(11, noext, optional)
+AC_SYS_LARGEFILE
+PKG_PROG_PKG_CONFIG([0.20])
+AM_MISSING_PROG([RAGEL], [ragel])
+AM_MISSING_PROG([GIT], [git])
+
+# Version
+m4_define(hb_version_triplet,m4_split(AC_PACKAGE_VERSION,[[.]]))
+m4_define(hb_version_major,m4_argn(1,hb_version_triplet))
+m4_define(hb_version_minor,m4_argn(2,hb_version_triplet))
+m4_define(hb_version_micro,m4_argn(3,hb_version_triplet))
+HB_VERSION_MAJOR=hb_version_major
+HB_VERSION_MINOR=hb_version_minor
+HB_VERSION_MICRO=hb_version_micro
+HB_VERSION=AC_PACKAGE_VERSION
+AC_SUBST(HB_VERSION_MAJOR)
+AC_SUBST(HB_VERSION_MINOR)
+AC_SUBST(HB_VERSION_MICRO)
+AC_SUBST(HB_VERSION)
+
+# Libtool version
+m4_define([hb_version_int],
+	  m4_eval(hb_version_major*10000 + hb_version_minor*100 + hb_version_micro))
+m4_if(m4_eval(hb_version_minor % 2), [1],
+      dnl for unstable releases
+      [m4_define([hb_libtool_revision], 0)],
+      dnl for stable releases
+      [m4_define([hb_libtool_revision], hb_version_micro)])
+m4_define([hb_libtool_age],
+	  m4_eval(hb_version_int - hb_libtool_revision))
+m4_define([hb_libtool_current],
+	  m4_eval(hb_libtool_age))
+HB_LIBTOOL_VERSION_INFO=hb_libtool_current:hb_libtool_revision:hb_libtool_age
+AC_SUBST(HB_LIBTOOL_VERSION_INFO)
+
+AC_ARG_WITH([libstdc++],
+	[AS_HELP_STRING([--with-libstdc++=@<:@yes/no@:>@],
+			[Allow linking with libstdc++ @<:@default=no@:>@])],
+	[with_libstdcxx=$withval],
+	[with_libstdcxx=no])
+AM_CONDITIONAL(WITH_LIBSTDCXX, [test "x$with_libstdcxx" = "xyes"])
+
+# Documentation
+have_gtk_doc=false
+m4_ifdef([GTK_DOC_CHECK], [
+GTK_DOC_CHECK([1.15],[--flavour no-tmpl])
+	if test "x$enable_gtk_doc" = xyes; then
+		have_gtk_doc=true
+	fi
+], [
+	AM_CONDITIONAL([ENABLE_GTK_DOC], false)
+])
+
+# Functions and headers
+AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l posix_memalign)
+
+save_libs="$LIBS"
+LIBS="$LIBS -lm"
+AC_CHECK_FUNCS([round], ,[AC_CHECK_DECLS([round], , ,[#include <math.h>])])
+LIBS="$save_libs"
+
+AC_CHECK_HEADERS(unistd.h sys/mman.h xlocale.h stdbool.h)
+
+# Compiler flags
+AC_CANONICAL_HOST
+AC_CHECK_ALIGNOF([struct{char;}])
+if test "x$GCC" = "xyes"; then
+
+	# Make symbols link locally
+	AX_CHECK_LINK_FLAG([[-Bsymbolic-functions]], [LDFLAGS="$LDFLAGS -Bsymbolic-functions"])
+
+	# Make it possible to not link to libstdc++
+	# No threadsafe statics in C++ as we do it ourselves.
+	# We don't use these features, so it's safe to disable them
+	# even in the cases where we DO link to libstdc++.
+	# Put -fno-rtti before $CXXFLAGS such that users can re-enable it
+	# by overriding CXXFLAGS.
+	CXXFLAGS="-fno-rtti $CXXFLAGS -fno-exceptions -fno-threadsafe-statics"
+
+	case "$host" in
+		*-*-mingw*)
+		;;
+		*)
+			# Hide inline methods
+			CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden"
+		;;
+	esac
+
+	case "$host" in
+		arm-*-*)
+			if test "x$ac_cv_alignof_struct_char__" != x1; then
+				# Request byte alignment
+				CXXFLAGS="$CXXFLAGS -mstructure-size-boundary=8"
+			fi
+		;;
+	esac
+fi
+
+AM_CONDITIONAL(HAVE_GCC, test "x$GCC" = "xyes")
+
+hb_os_win32=no
+AC_MSG_CHECKING([for native Win32])
+case "$host" in
+  *-*-mingw*)
+    hb_os_win32=yes
+    ;;
+esac
+AC_MSG_RESULT([$hb_os_win32])
+AM_CONDITIONAL(OS_WIN32, test "$hb_os_win32" = "yes")
+
+have_pthread=false
+if test "$hb_os_win32" = no; then
+	AX_PTHREAD([have_pthread=true])
+fi
+if $have_pthread; then
+	AC_DEFINE(HAVE_PTHREAD, 1, [Have POSIX threads])
+fi
+AM_CONDITIONAL(HAVE_PTHREAD, $have_pthread)
+
+dnl ==========================================================================
+
+have_fallback=true
+if $have_fallback; then
+	AC_DEFINE(HAVE_FALLBACK, 1, [Have simple TrueType Layout backend])
+fi
+AM_CONDITIONAL(HAVE_FALLBACK, $have_fallback)
+
+dnl ===========================================================================
+
+AC_ARG_WITH(glib,
+	[AS_HELP_STRING([--with-glib=@<:@yes/no/auto@:>@],
+			[Use glib @<:@default=auto@:>@])],,
+	[with_glib=auto])
+have_glib=false
+GLIB_DEPS="glib-2.0 >= 2.19.1"
+AC_SUBST(GLIB_DEPS)
+if test "x$with_glib" = "xyes" -o "x$with_glib" = "xauto"; then
+	PKG_CHECK_MODULES(GLIB, $GLIB_DEPS, have_glib=true, :)
+fi
+if test "x$with_glib" = "xyes" -a "x$have_glib" != "xtrue"; then
+	AC_MSG_ERROR([glib support requested but glib-2.0 not found])
+fi
+if $have_glib; then
+	AC_DEFINE(HAVE_GLIB, 1, [Have glib2 library])
+fi
+AM_CONDITIONAL(HAVE_GLIB, $have_glib)
+
+dnl ===========================================================================
+
+AC_ARG_WITH(gobject,
+	[AS_HELP_STRING([--with-gobject=@<:@yes/no/auto@:>@],
+			[Use gobject @<:@default=no@:>@])],,
+	[with_gobject=no])
+have_gobject=false
+if test "x$with_gobject" = "xyes" -o "x$with_gobject" = "xauto"; then
+	PKG_CHECK_MODULES(GOBJECT, gobject-2.0 glib-2.0, have_gobject=true, :)
+fi
+if test "x$with_gobject" = "xyes" -a "x$have_gobject" != "xtrue"; then
+	AC_MSG_ERROR([gobject support requested but gobject-2.0 / glib-2.0 not found])
+fi
+if $have_gobject; then
+	AC_DEFINE(HAVE_GOBJECT, 1, [Have gobject2 library])
+	GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
+	AC_SUBST(GLIB_MKENUMS)
+fi
+AM_CONDITIONAL(HAVE_GOBJECT, $have_gobject)
+AC_SUBST(have_gobject)
+
+dnl ===========================================================================
+
+
+dnl ===========================================================================
+# Gobject-Introspection
+have_introspection=false
+m4_ifdef([GOBJECT_INTROSPECTION_CHECK], [
+	if $have_gobject; then
+		GOBJECT_INTROSPECTION_CHECK([1.34.0])
+		if test "x$found_introspection" = xyes; then
+			have_introspection=true
+		fi
+	else
+		AM_CONDITIONAL([HAVE_INTROSPECTION], false)
+	fi
+], [
+	AM_CONDITIONAL([HAVE_INTROSPECTION], false)
+])
+
+dnl ==========================================================================
+
+AC_ARG_WITH(cairo,
+	[AS_HELP_STRING([--with-cairo=@<:@yes/no/auto@:>@],
+			[Use cairo @<:@default=auto@:>@])],,
+	[with_cairo=auto])
+have_cairo=false
+if test "x$with_cairo" = "xyes" -o "x$with_cairo" = "xauto"; then
+	PKG_CHECK_MODULES(CAIRO, cairo >= 1.8.0, have_cairo=true, :)
+fi
+if test "x$with_cairo" = "xyes" -a "x$have_cairo" != "xtrue"; then
+	AC_MSG_ERROR([cairo support requested but not found])
+fi
+if $have_cairo; then
+	AC_DEFINE(HAVE_CAIRO, 1, [Have cairo graphics library])
+fi
+AM_CONDITIONAL(HAVE_CAIRO, $have_cairo)
+
+have_cairo_ft=false
+if $have_cairo; then
+	PKG_CHECK_MODULES(CAIRO_FT, cairo-ft, have_cairo_ft=true, :)
+fi
+if $have_cairo_ft; then
+	AC_DEFINE(HAVE_CAIRO_FT, 1, [Have cairo-ft support in cairo graphics library])
+fi
+AM_CONDITIONAL(HAVE_CAIRO_FT, $have_cairo_ft)
+
+dnl ==========================================================================
+
+AC_ARG_WITH(fontconfig,
+	[AS_HELP_STRING([--with-fontconfig=@<:@yes/no/auto@:>@],
+			[Use fontconfig @<:@default=auto@:>@])],,
+	[with_fontconfig=auto])
+have_fontconfig=false
+if test "x$with_fontconfig" = "xyes" -o "x$with_fontconfig" = "xauto"; then
+	PKG_CHECK_MODULES(FONTCONFIG, fontconfig, have_fontconfig=true, :)
+fi
+if test "x$with_fontconfig" = "xyes" -a "x$have_fontconfig" != "xtrue"; then
+	AC_MSG_ERROR([fontconfig support requested but not found])
+fi
+if $have_fontconfig; then
+	AC_DEFINE(HAVE_FONTCONFIG, 1, [Have fontconfig library])
+fi
+AM_CONDITIONAL(HAVE_FONTCONFIG, $have_fontconfig)
+
+dnl ==========================================================================
+
+AC_ARG_WITH(icu,
+	[AS_HELP_STRING([--with-icu=@<:@yes/no/builtin/auto@:>@],
+			[Use ICU @<:@default=auto@:>@])],,
+	[with_icu=auto])
+have_icu=false
+if test "x$with_icu" = "xyes" -o "x$with_icu" = "xbuiltin" -o "x$with_icu" = "xauto"; then
+	PKG_CHECK_MODULES(ICU, icu-uc, have_icu=true, :)
+
+	dnl Fallback to icu-config if ICU pkg-config files could not be found
+	if test "$have_icu" != "true"; then
+		AC_CHECK_TOOL(ICU_CONFIG, icu-config, no)
+		AC_MSG_CHECKING([for ICU by using icu-config fallback])
+		if test "$ICU_CONFIG" != "no" && "$ICU_CONFIG" --version >/dev/null; then
+			have_icu=true
+			# We don't use --cflags as this gives us a lot of things that we don't
+			# necessarily want, like debugging and optimization flags
+			# See man (1) icu-config for more info.
+			ICU_CFLAGS=`$ICU_CONFIG --cppflags`
+			ICU_LIBS=`$ICU_CONFIG --ldflags-searchpath --ldflags-libsonly`
+			AC_SUBST(ICU_CFLAGS)
+			AC_SUBST(ICU_LIBS)
+			AC_MSG_RESULT([yes])
+		else
+			AC_MSG_RESULT([no])
+		fi
+	fi
+fi
+if test \( "x$with_icu" = "xyes" -o "x$with_icu" = "xbuiltin" \) -a "x$have_icu" != "xtrue"; then
+	AC_MSG_ERROR([icu support requested but icu-uc not found])
+fi
+
+if $have_icu; then
+	CXXFLAGS="$CXXFLAGS `$PKG_CONFIG --variable=CXXFLAGS icu-uc`"
+	AC_DEFINE(HAVE_ICU, 1, [Have ICU library])
+	if test "x$with_icu" = "xbuiltin"; then
+		AC_DEFINE(HAVE_ICU_BUILTIN, 1, [Use hb-icu Unicode callbacks])
+	fi
+fi
+AM_CONDITIONAL(HAVE_ICU, $have_icu)
+AM_CONDITIONAL(HAVE_ICU_BUILTIN, $have_icu && test "x$with_icu" = "xbuiltin")
+
+dnl ===========================================================================
+
+AC_ARG_WITH(ucdn,
+	[AS_HELP_STRING([--with-ucdn=@<:@yes/no@:>@],
+			[Use builtin UCDN library @<:@default=yes@:>@])],,
+	[with_ucdn=yes])
+have_ucdn=false
+if test "x$with_ucdn" = "xyes"; then
+	have_ucdn=true
+fi
+if $have_ucdn; then
+	AC_DEFINE(HAVE_UCDN, 1, [Have UCDN Unicode functions])
+fi
+AM_CONDITIONAL(HAVE_UCDN, $have_ucdn)
+
+dnl ==========================================================================
+
+AC_ARG_WITH(graphite2,
+	[AS_HELP_STRING([--with-graphite2=@<:@yes/no/auto@:>@],
+			[Use the graphite2 library @<:@default=no@:>@])],,
+	[with_graphite2=no])
+have_graphite2=false
+GRAPHITE2_DEPS="graphite2 >= 1.2.0"
+AC_SUBST(GRAPHITE2_DEPS)
+if test "x$with_graphite2" = "xyes" -o "x$with_graphite2" = "xauto"; then
+	PKG_CHECK_MODULES(GRAPHITE2, $GRAPHITE2_DEPS, have_graphite2=true, :)
+	if test "x$have_graphite2" != "xtrue"; then
+                # If pkg-config is not available, graphite2 can still be there
+		ac_save_CFLAGS="$CFLAGS"
+		ac_save_CPPFLAGS="$CPPFLAGS"
+		CFLAGS="$CFLAGS $GRAPHITE2_CFLAGS"
+		CPPFLAGS="$CPPFLAGS $GRAPHITE2_CFLAGS"
+		AC_CHECK_HEADER(graphite2/Segment.h, have_graphite2=true, :)
+		CPPFLAGS="$ac_save_CPPFLAGS"
+		CFLAGS="$ac_save_CFLAGS"
+	fi
+fi
+if test "x$with_graphite2" = "xyes" -a "x$have_graphite2" != "xtrue"; then
+	AC_MSG_ERROR([graphite2 support requested but libgraphite2 not found])
+fi
+if $have_graphite2; then
+	AC_DEFINE(HAVE_GRAPHITE2, 1, [Have Graphite2 library])
+fi
+AM_CONDITIONAL(HAVE_GRAPHITE2, $have_graphite2)
+
+dnl ==========================================================================
+
+AC_ARG_WITH(freetype,
+	[AS_HELP_STRING([--with-freetype=@<:@yes/no/auto@:>@],
+			[Use the FreeType library @<:@default=auto@:>@])],,
+	[with_freetype=auto])
+have_freetype=false
+FREETYPE_DEPS="freetype2 >= 12.0.6"
+AC_SUBST(FREETYPE_DEPS)
+if test "x$with_freetype" = "xyes" -o "x$with_freetype" = "xauto"; then
+	# See freetype/docs/VERSION.DLL; 12.0.6 means freetype-2.4.2
+	PKG_CHECK_MODULES(FREETYPE, $FREETYPE_DEPS, have_freetype=true, :)
+fi
+if test "x$with_freetype" = "xyes" -a "x$have_freetype" != "xtrue"; then
+	AC_MSG_ERROR([FreeType support requested but libfreetype2 not found])
+fi
+if $have_freetype; then
+	AC_DEFINE(HAVE_FREETYPE, 1, [Have FreeType 2 library])
+	save_libs=$LIBS
+	LIBS="$LIBS $FREETYPE_LIBS"
+	AC_CHECK_FUNCS(FT_Get_Var_Blend_Coordinates FT_Set_Var_Blend_Coordinates FT_Done_MM_Var)
+	LIBS=$save_libs
+fi
+AM_CONDITIONAL(HAVE_FREETYPE, $have_freetype)
+
+dnl ===========================================================================
+
+AC_ARG_WITH(uniscribe,
+	[AS_HELP_STRING([--with-uniscribe=@<:@yes/no/auto@:>@],
+			[Use the Uniscribe library @<:@default=no@:>@])],,
+	[with_uniscribe=no])
+have_uniscribe=false
+if test "x$with_uniscribe" = "xyes" -o "x$with_uniscribe" = "xauto"; then
+	AC_CHECK_HEADERS(usp10.h windows.h, have_uniscribe=true)
+fi
+if test "x$with_uniscribe" = "xyes" -a "x$have_uniscribe" != "xtrue"; then
+	AC_MSG_ERROR([uniscribe support requested but not found])
+fi
+if $have_uniscribe; then
+	UNISCRIBE_CFLAGS=
+	UNISCRIBE_LIBS="-lusp10 -lgdi32 -lrpcrt4"
+	AC_SUBST(UNISCRIBE_CFLAGS)
+	AC_SUBST(UNISCRIBE_LIBS)
+	AC_DEFINE(HAVE_UNISCRIBE, 1, [Have Uniscribe library])
+fi
+AM_CONDITIONAL(HAVE_UNISCRIBE, $have_uniscribe)
+
+dnl ===========================================================================
+
+AC_ARG_WITH(directwrite,
+	[AS_HELP_STRING([--with-directwrite=@<:@yes/no/auto@:>@],
+			[Use the DirectWrite library (experimental) @<:@default=no@:>@])],,
+	[with_directwrite=no])
+have_directwrite=false
+AC_LANG_PUSH([C++])
+if test "x$with_directwrite" = "xyes" -o "x$with_directwrite" = "xauto"; then
+	AC_CHECK_HEADERS(dwrite.h, have_directwrite=true)
+fi
+AC_LANG_POP([C++])
+if test "x$with_directwrite" = "xyes" -a "x$have_directwrite" != "xtrue"; then
+	AC_MSG_ERROR([directwrite support requested but not found])
+fi
+if $have_directwrite; then
+	DIRECTWRITE_CXXFLAGS=
+	DIRECTWRITE_LIBS="-ldwrite"
+	AC_SUBST(DIRECTWRITE_CXXFLAGS)
+	AC_SUBST(DIRECTWRITE_LIBS)
+	AC_DEFINE(HAVE_DIRECTWRITE, 1, [Have DirectWrite library])
+fi
+AM_CONDITIONAL(HAVE_DIRECTWRITE, $have_directwrite)
+
+dnl ===========================================================================
+
+AC_ARG_WITH(coretext,
+	[AS_HELP_STRING([--with-coretext=@<:@yes/no/auto@:>@],
+			[Use CoreText @<:@default=no@:>@])],,
+	[with_coretext=no])
+have_coretext=false
+if test "x$with_coretext" = "xyes" -o "x$with_coretext" = "xauto"; then
+	AC_CHECK_TYPE(CTFontRef, have_coretext=true,, [#include <ApplicationServices/ApplicationServices.h>])
+
+	if $have_coretext; then
+		CORETEXT_CFLAGS=
+		CORETEXT_LIBS="-framework ApplicationServices"
+		AC_SUBST(CORETEXT_CFLAGS)
+		AC_SUBST(CORETEXT_LIBS)
+	else
+		# On iOS CoreText and CoreGraphics are stand-alone frameworks
+		if test "x$have_coretext" != "xtrue"; then
+			# Check for a different symbol to avoid getting cached result.
+			AC_CHECK_TYPE(CTRunRef, have_coretext=true,, [#include <CoreText/CoreText.h>])
+		fi
+
+		if $have_coretext; then
+			CORETEXT_CFLAGS=
+			CORETEXT_LIBS="-framework CoreText -framework CoreGraphics -framework CoreFoundation"
+			AC_SUBST(CORETEXT_CFLAGS)
+			AC_SUBST(CORETEXT_LIBS)
+		fi
+	fi
+fi
+if test "x$with_coretext" = "xyes" -a "x$have_coretext" != "xtrue"; then
+	AC_MSG_ERROR([CoreText support requested but libcoretext not found])
+fi
+if $have_coretext; then
+	AC_DEFINE(HAVE_CORETEXT, 1, [Have Core Text backend])
+fi
+AM_CONDITIONAL(HAVE_CORETEXT, $have_coretext)
+
+dnl ===========================================================================
+
+AC_CACHE_CHECK([for Intel atomic primitives], hb_cv_have_intel_atomic_primitives, [
+	hb_cv_have_intel_atomic_primitives=false
+	AC_TRY_LINK([
+		void memory_barrier (void) { __sync_synchronize (); }
+		int atomic_add (int *i) { return __sync_fetch_and_add (i, 1); }
+		int mutex_trylock (int *m) { return __sync_lock_test_and_set (m, 1); }
+		void mutex_unlock (int *m) { __sync_lock_release (m); }
+		], [], hb_cv_have_intel_atomic_primitives=true
+	)
+])
+if $hb_cv_have_intel_atomic_primitives; then
+	AC_DEFINE(HAVE_INTEL_ATOMIC_PRIMITIVES, 1, [Have Intel __sync_* atomic primitives])
+fi
+
+dnl ===========================================================================
+
+AC_CACHE_CHECK([for Solaris atomic operations], hb_cv_have_solaris_atomic_ops, [
+	hb_cv_have_solaris_atomic_ops=false
+	AC_TRY_LINK([
+		#include <atomic.h>
+		/* This requires Solaris Studio 12.2 or newer: */
+		#include <mbarrier.h>
+		void memory_barrier (void) { __machine_rw_barrier (); }
+		int atomic_add (volatile unsigned *i) { return atomic_add_int_nv (i, 1); }
+		void *atomic_ptr_cmpxchg (volatile void **target, void *cmp, void *newval) { return atomic_cas_ptr (target, cmp, newval); }
+		], [], hb_cv_have_solaris_atomic_ops=true
+	)
+])
+if $hb_cv_have_solaris_atomic_ops; then
+	AC_DEFINE(HAVE_SOLARIS_ATOMIC_OPS, 1, [Have Solaris __machine_*_barrier and atomic_* operations])
+fi
+
+if test "$os_win32" = no && ! $have_pthread; then
+	AC_CHECK_HEADERS(sched.h)
+	AC_SEARCH_LIBS(sched_yield,rt,AC_DEFINE(HAVE_SCHED_YIELD, 1, [Have sched_yield]))
+fi
+
+dnl ===========================================================================
+
+AC_CONFIG_FILES([
+Makefile
+src/Makefile
+src/harfbuzz-config.cmake
+src/hb-ucdn/Makefile
+util/Makefile
+test/Makefile
+test/api/Makefile
+test/fuzzing/Makefile
+test/shaping/Makefile
+test/shaping/data/Makefile
+test/shaping/data/aots/Makefile
+test/shaping/data/in-house/Makefile
+test/shaping/data/text-rendering-tests/Makefile
+test/subset/Makefile
+test/subset/data/Makefile
+docs/Makefile
+docs/version.xml
+])
+
+AC_OUTPUT
+
+AC_MSG_NOTICE([
+
+Build configuration:
+
+Unicode callbacks (you want at least one):
+	Builtin (UCDN):		${have_ucdn}
+	Glib:			${have_glib}
+	ICU:			${have_icu}
+
+Font callbacks (the more the merrier):
+	FreeType:		${have_freetype}
+
+Tools used for command-line utilities:
+	Cairo:			${have_cairo}
+	Fontconfig:		${have_fontconfig}
+
+Additional shapers (the more the merrier):
+	Graphite2:		${have_graphite2}
+
+Platform shapers (not normally needed):
+	CoreText:		${have_coretext}
+	DirectWrite:		${have_directwrite}
+	Uniscribe:		${have_uniscribe}
+
+Other features:
+	Documentation:		${enable_gtk_doc}
+	GObject bindings:	${have_gobject}
+	Introspection:		${have_introspection}
+])
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/depcomp b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/depcomp
new file mode 100755
index 0000000..b39f98f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/depcomp
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2016-01-11.22; # UTC
+
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+    exit 1;
+    ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'.  Note that this directory component will
+# be either empty or ending with a '/' character.  This is deliberate.
+set_dir_from ()
+{
+  case $1 in
+    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+      *) dir=;;
+  esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+  echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+  # If the compiler actually managed to produce a dependency file,
+  # post-process it.
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependency.h'.
+    # Do two passes, one to just change these to
+    #   $object: dependency.h
+    # and one to simply output
+    #   dependency.h:
+    # which is needed to avoid the deleted-header problem.
+    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+    } > "$depfile"
+    rm -f "$tmpdepfile"
+  else
+    make_dummy_depfile
+  fi
+}
+
+# A tabulation character.
+tab='	'
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+  # This is just like dashmstdout with a different argument.
+  dashmflag=-xM
+  depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+  # This is just like msvisualcpp but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+  # This is just like msvc7 but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+  gccflag=-qmakedep=gcc,-MF
+  depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).  Also, it might not be
+##   supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The second -e expression handles DOS-style file names with drive
+  # letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like '#:fec' to the end of the
+    # dependency line.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+      | tr "$nl" ' ' >> "$depfile"
+    echo >> "$depfile"
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+      >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  set_dir_from "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  aix_post_process_depfile
+  ;;
+
+tcc)
+  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+  # FIXME: That version still under development at the moment of writing.
+  #        Make that this statement remains true also for stable, released
+  #        versions.
+  # It will wrap lines (doesn't matter whether long or short) with a
+  # trailing '\', as in:
+  #
+  #   foo.o : \
+  #    foo.c \
+  #    foo.h \
+  #
+  # It will put a trailing '\' even on the last line, and will use leading
+  # spaces rather than leading tabs (at least since its commit 0394caf7
+  # "Emit spaces for -MD").
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+  # We have to change lines of the first kind to '$object: \'.
+  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+  # And for each line of the second kind, we have to emit a 'dep.h:'
+  # dummy dependency, to avoid the deleted-header problem.
+  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file.  A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+  # Portland's C compiler understands '-MD'.
+  # Will always output deps to 'file.d' where file is the root name of the
+  # source file under compilation, even if file resides in a subdirectory.
+  # The object file name does not affect the name of the '.d' file.
+  # pgcc 10.2 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using '\' :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+  set_dir_from "$object"
+  # Use the source, not the object, to determine the base name, since
+  # that's sadly what pgcc will do too.
+  set_base_from "$source"
+  tmpdepfile=$base.d
+
+  # For projects that build the same source file twice into different object
+  # files, the pgcc approach of using the *source* file root name can cause
+  # problems in parallel builds.  Use a locking strategy to avoid stomping on
+  # the same $tmpdepfile.
+  lockdir=$base.d-lock
+  trap "
+    echo '$0: caught signal, cleaning up...' >&2
+    rmdir '$lockdir'
+    exit 1
+  " 1 2 13 15
+  numtries=100
+  i=$numtries
+  while test $i -gt 0; do
+    # mkdir is a portable test-and-set.
+    if mkdir "$lockdir" 2>/dev/null; then
+      # This process acquired the lock.
+      "$@" -MD
+      stat=$?
+      # Release the lock.
+      rmdir "$lockdir"
+      break
+    else
+      # If the lock is being held by a different process, wait
+      # until the winning process is done or we timeout.
+      while test -d "$lockdir" && test $i -gt 0; do
+        sleep 1
+        i=`expr $i - 1`
+      done
+    fi
+    i=`expr $i - 1`
+  done
+  trap - 1 2 13 15
+  if test $i -le 0; then
+    echo "$0: failed to acquire lock after $numtries attempts" >&2
+    echo "$0: check lockdir '$lockdir'" >&2
+    exit 1
+  fi
+
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  set_dir_from  "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
+    sed -ne '2,${
+               s/^ *//
+               s/ \\*$//
+               s/$/:/
+               p
+             }' "$tmpdepfile" >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+  # The Tru64 compiler uses -MD to generate dependencies as a side
+  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+  # dependencies in 'foo.d' instead, so we check for that too.
+  # Subdirectories are respected.
+  set_dir_from  "$object"
+  set_base_from "$object"
+
+  if test "$libtool" = yes; then
+    # Libtool generates 2 separate objects for the 2 libraries.  These
+    # two compilations output dependencies in $dir.libs/$base.o.d and
+    # in $dir$base.o.d.  We have to check for both files, because
+    # one of the two compilations can be disabled.  We should prefer
+    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+    # automatically cleaned when .libs/ is deleted, while ignoring
+    # the former would cause a distcleancheck panic.
+    tmpdepfile1=$dir$base.o.d          # libtool 1.5
+    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
+    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
+    "$@" -Wc,-MD
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    tmpdepfile3=$dir$base.d
+    "$@" -MD
+  fi
+
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  # Same post-processing that is required for AIX mode.
+  aix_post_process_depfile
+  ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/'"$tab"'/
+  G
+  p
+}' >> "$depfile"
+  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for ':'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+  "$@" $dashmflag |
+    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this sed invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process the last invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed '1,2d' "$tmpdepfile" \
+    | tr ' ' "$nl" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E \
+    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+    | sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+        set fnord "$@"
+        shift
+        shift
+        ;;
+    *)
+        set fnord "$@" "$arg"
+        shift
+        shift
+        ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/HarfBuzz.png b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/HarfBuzz.png
new file mode 100644
index 0000000..771d955
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/HarfBuzz.png
Binary files differ
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/HarfBuzz.svg b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/HarfBuzz.svg
new file mode 100644
index 0000000..4e2df25
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/HarfBuzz.svg
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   width="682.66669"
+   height="682.66669"
+   viewBox="0 0 682.66669 682.66669"
+   sodipodi:docname="harfbuzz2.svg"
+   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
+   inkscape:export-filename="harfbuzz2.png"
+   inkscape:export-xdpi="72"
+   inkscape:export-ydpi="72">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6">
+    <g
+       id="g50">
+      <symbol
+         id="glyph0-0"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path26"
+           d="M 32,0 V -192 H 224 V 0 Z M 48,-16 H 208 V -176 H 48 Z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-1"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path29"
+           d="m 52.5,-64.875 c -0.08594,2.25 -0.9375,6.335938 -2.5625,12.25 -1.625,5.917969 -3.75,12.375 -6.375,19.375 -2.625,7 -4.9375,12.292969 -6.9375,15.875 -2,3.585938 -4.1875,6.3125 -6.5625,8.1875 -2.375,1.875 -6.210938,3.585938 -11.5,5.125 -5.292969,1.542969 -9.542969,2.585938 -12.75,3.125 -3.210938,0.542969 -5.230469,0.8125 -6.0625,0.8125 -0.832031,-0.082031 -1.332031,-0.414062 -1.5,-1 -0.164062,-0.582031 0.085938,-1.332031 0.75,-2.25 0.9179688,-1.414062 3.226562,-3.269531 6.9375,-5.5625 3.707031,-2.289062 8.019531,-5.164062 12.9375,-8.625 4.914062,-3.457031 8.414062,-6.476562 10.5,-9.0625 2.082031,-2.582031 4.4375,-6.457031 7.0625,-11.625 2.625,-5.164062 5,-10.375 7.125,-15.625 2.125,-5.25 3.644531,-8.832031 4.5625,-10.75 0.914062,-1.914062 1.914062,-2.832031 3,-2.75 0.914062,0.167969 1.375,1 1.375,2.5 z M 41.75,-117.75 c 0,-1.83203 1.5625,-5.8125 4.6875,-11.9375 3.125,-6.125 5.144531,-9.1875 6.0625,-9.1875 1.832031,-0.75 4.5,0.64844 8,4.1875 3.5,3.54297 5.375,6.3125 5.625,8.3125 0,2.66797 -1.460938,6.5 -4.375,11.5 -2.917969,5 -5.042969,7.5 -6.375,7.5 -0.5,-0.25 -2.230469,-1.35156 -5.1875,-3.3125 -2.960938,-1.95703 -5.148438,-3.4375 -6.5625,-4.4375 -1.25,-0.83203 -1.875,-1.70703 -1.875,-2.625 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-2"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path32"
+           d="m 19.75,-47.125 c -0.167969,3.167969 -0.5,6.023438 -1,8.5625 -0.5,2.542969 -1.167969,4.710938 -2,6.5 -0.835938,1.792969 -1.898438,3.125 -3.1875,4 -1.292969,0.875 -2.855469,1.1875 -4.6875,0.9375 0.082031,-6.5 0.769531,-15.5625 2.0625,-27.1875 1.289062,-11.625 3.226562,-24.476562 5.8125,-38.5625 1.332031,-4.082031 4.039062,-11.28906 8.125,-21.625 0.414062,-1 0.851562,-1.41406 1.3125,-1.25 0.457031,0.16797 0.6875,0.58594 0.6875,1.25 -0.25,5.08594 -1.292969,14.792969 -3.125,29.125 -1.835938,14.335938 -2.960938,24.167969 -3.375,29.5 -0.417969,5.335938 -0.625,8.25 -0.625,8.75 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-3"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path35"
+           d="m -10.875,-27.25 c 1.667969,-7.164062 3.5625,-12.457031 5.6875,-15.875 2.125,-3.414062 3.855469,-5.289062 5.1875,-5.625 v 5.5 c 0,7 1.875,11.875 5.625,14.625 2.25,1.5 4.5,2 6.75,1.5 2.25,-0.5 3.976562,-1.664062 5.1875,-3.5 1.207031,-1.832031 2.226562,-3.976562 3.0625,-6.4375 0.832031,-2.457031 1.625,-3.6875 2.375,-3.6875 0.914062,0 1.289062,0.875 1.125,2.625 -0.08594,3 -1.023438,7.875 -2.8125,14.625 C 19.519531,-16.75 17.082031,-11.207031 14,-6.875 10.914062,-2.539062 7.164062,-0.25 2.75,0 c -4.5,-0.164062 -8,-2.707031 -10.5,-7.625 -2.25,-4.832031 -3.289062,-11.082031 -3.125,-18.75 z m 6.625,111.5 c 0,-1.835938 1.5625,-5.8125 4.6875,-11.9375 3.125,-6.125 5.144531,-9.1875 6.0625,-9.1875 1.832031,-0.75 4.5,0.644531 8,4.1875 3.5,3.539062 5.375,6.3125 5.625,8.3125 0,2.664062 -1.460938,6.5 -4.375,11.5 -2.917969,5 -5.042969,7.5 -6.375,7.5 C 8.875,94.375 7.144531,93.269531 4.1875,91.3125 1.226562,89.351562 -0.957031,87.875 -2.375,86.875 -3.625,86.039062 -4.25,85.164062 -4.25,84.25 Z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-4"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path38"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-5"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path41"
+           d="m 118.5,-33 c 15.33203,-3.914062 27.375,-8.289062 36.125,-13.125 7.5,-4.082031 11.25,-7.5 11.25,-10.25 0,-0.832031 -0.5625,-1.894531 -1.6875,-3.1875 -1.125,-1.289062 -1.9375,-1.9375 -2.4375,-1.9375 -0.83594,0 -2.02344,0.148438 -3.5625,0.4375 -1.54297,0.292969 -2.64844,0.4375 -3.3125,0.4375 -2.91797,0 -4.98047,-0.769531 -6.1875,-2.3125 -1.21094,-1.539062 -1.8125,-3.601562 -1.8125,-6.1875 0,-1.5 2.16406,-6.539062 6.5,-15.125 1.66406,-3.414062 3.0625,-5.8125 4.1875,-7.1875 1.125,-1.375 2.76953,-2.0625 4.9375,-2.0625 3.58203,0 6.91406,1.9375 10,5.8125 3.08203,3.875 4.625,8.855469 4.625,14.9375 0,6 -0.8125,11.4375 -2.4375,16.3125 -1.625,4.875 -4.14844,9.605469 -7.5625,14.1875 -3.41797,4.585938 -7.83594,9.042969 -13.25,13.375 -8.08594,6.085938 -17.625,11.230469 -28.625,15.4375 -11,4.210938 -23.83594,7.5 -38.5,9.875 C 72.082031,-1.1875 58.082031,0 44.75,0 37.082031,0 30.082031,-0.375 23.75,-1.125 17.414062,-1.875 12.582031,-3.289062 9.25,-5.375 3.082031,-8.789062 0.25,-14.5 0.75,-22.5 c 0.332031,-4.082031 0.832031,-8.4375 1.5,-13.0625 0.664062,-4.625 1.351562,-8.3125 2.0625,-11.0625 0.707031,-2.75 1.5625,-4.125 2.5625,-4.125 0.832031,0 1.332031,1.75 1.5,5.25 0.164062,3.5 0.6875,6.0625 1.5625,7.6875 0.875,1.625 2.207031,3 4,4.125 1.789062,1.125 4.6875,2.210938 8.6875,3.25 4,1.042969 8.6875,1.855469 14.0625,2.4375 5.375,0.585938 12.519531,0.875 21.4375,0.875 12.414062,0 23.019531,-0.4375 31.8125,-1.3125 C 98.726562,-29.3125 108.25,-30.832031 118.5,-33 Z m -38.75,-86.75 c 0,-1.83203 1.5625,-5.8125 4.6875,-11.9375 3.125,-6.125 5.144531,-9.1875 6.0625,-9.1875 1.832031,-0.75 4.5,0.64844 8,4.1875 3.5,3.54297 5.375,6.3125 5.625,8.3125 0,2.66797 -1.46094,6.5 -4.375,11.5 -2.917969,5 -5.042969,7.5 -6.375,7.5 -0.5,-0.25 -2.230469,-1.35156 -5.1875,-3.3125 -2.960938,-1.95703 -5.148438,-3.4375 -6.5625,-4.4375 -1.25,-0.83203 -1.875,-1.70703 -1.875,-2.625 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-6"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path44"
+           d="m 78,-56.875 c -1.335938,2.25 -2.25,3.875 -2.75,4.875 -1.417969,2.335938 -2.875,4.210938 -4.375,5.625 -1.75,1.75 -4.042969,3.292969 -6.875,4.625 -6.085938,2.917969 -10.460938,5.75 -13.125,8.5 -1.75,1.75 -3.792969,4.960938 -6.125,9.625 -4.25,8.585938 -8.417969,14.292969 -12.5,17.125 -4.085938,2.917969 -11.417969,5 -22,6.25 C 9.414062,-0.0820312 8.414062,0 7.25,0 H 4.375 c -1.5,0 -2.25,-0.164062 -2.25,-0.5 0,-1.914062 2.539062,-4.5 7.625,-7.75 4,-2.414062 7,-4.207031 9,-5.375 6,-3.414062 10.414062,-6.125 13.25,-8.125 4,-2.914062 6.625,-5.75 7.875,-8.5 4.164062,-8.5 7.625,-14.414062 10.375,-17.75 3.082031,-3.664062 6.625,-6.5 10.625,-8.5 C 67.289062,-60.082031 71,-62.207031 72,-62.875 l 10,2.375 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-7"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path47"
+           d="m 13,-17.625 c -1,1.75 -2.0625,3.480469 -3.1875,5.1875 C 8.6875,-10.726562 7.539062,-9.082031 6.375,-7.5 5.207031,-5.914062 4.0625,-4.476562 2.9375,-3.1875 1.8125,-1.894531 0.832031,-0.832031 0,0 c -0.5,-2.582031 -0.832031,-5.125 -1,-7.625 -0.164062,-2.5 0.167969,-5.039062 1,-7.625 1.25,-0.75 2.207031,-1.414062 2.875,-2 1.664062,-1.5 5.375,-6.582031 11.125,-15.25 -0.667969,-0.664062 -2.585938,-1.601562 -5.75,-2.8125 -3.167969,-1.207031 -6.167969,-1.894531 -9,-2.0625 -2.582031,-0.164062 -4.726562,0.3125 -6.4375,1.4375 -1.707031,1.125 -3.25,2.710938 -4.625,4.75 -1.375,2.042969 -2.5625,2.980469 -3.5625,2.8125 -0.332031,-0.164062 -0.375,-0.851562 -0.125,-2.0625 0.25,-1.207031 0.625,-2.394531 1.125,-3.5625 2.085938,-4.832031 4.480469,-8.4375 7.1875,-10.8125 2.710938,-2.375 5.9375,-3.5625 9.6875,-3.5625 2.75,0 6.164062,0.667969 10.25,2 2.582031,0.917969 4.789062,1.375 6.625,1.375 3.832031,0 7.625,-1.375 11.375,-4.125 0.832031,0 1.125,0.542969 0.875,1.625 -0.25,1.085938 -0.605469,2.355469 -1.0625,3.8125 -0.460938,1.460938 -0.773438,2.4375 -0.9375,2.9375 -0.835938,2.585938 -1.5,4.085938 -2,4.5 -0.5,0.417969 -1.960938,1.5 -4.375,3.25 -1.335938,1 -2.480469,2.148438 -3.4375,3.4375 -0.960938,1.292969 -1.9375,2.835938 -2.9375,4.625 -1,1.792969 -2.292969,4.230469 -3.875,7.3125 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+    </g>
+    <g
+       id="g184">
+      <symbol
+         id="glyph0-0-3"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path163"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-1-6"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path166"
+           d="m 79.625,-103.25 c -3.585938,22 -6.8125,38.417969 -9.6875,49.25 -2.875,10.835938 -5.480469,19.105469 -7.8125,24.8125 -2.335938,5.710938 -4.898438,10.0625 -7.6875,13.0625 -2.792969,3 -7.917969,5.855469 -15.375,8.5625 -7.460938,2.710938 -13.6875,4.605469 -18.6875,5.6875 -5,1.085938 -8.125,1.667969 -9.375,1.75 C 9.75,-0.207031 8.957031,-0.4375 8.625,-0.8125 8.289062,-1.1875 8.582031,-2.082031 9.5,-3.5 c 1.582031,-2.25 4.894531,-5.332031 9.9375,-9.25 5.039062,-3.914062 11,-8.789062 17.875,-14.625 6.875,-5.832031 12.019531,-10.976562 15.4375,-15.4375 3.414062,-4.457031 6.4375,-10.539062 9.0625,-18.25 C 64.4375,-68.769531 67,-76.832031 69.5,-85.25 c 2.5,-8.414062 4.3125,-14.125 5.4375,-17.125 1.125,-3 2.269531,-4.45703 3.4375,-4.375 1.332031,0.25 1.75,1.41797 1.25,3.5 z m 8.875,-68.625 c 0.664062,2.41797 0.644531,4.91797 -0.0625,7.5 -0.710938,2.58594 -2.023438,5.29297 -3.9375,8.125 -1.167969,1.91797 -2.398438,3.64844 -3.6875,5.1875 -1.292969,1.54297 -2.648438,3.02344 -4.0625,4.4375 -0.417969,0.5 -1.085938,1.125 -2,1.875 -0.917969,0.75 -1.875,1.46094 -2.875,2.125 -1,0.66797 -1.960938,1.14844 -2.875,1.4375 -0.917969,0.29297 -1.585938,0.1875 -2,-0.3125 -3,-2.41406 -5.960938,-4.875 -8.875,-7.375 -2.917969,-2.5 -6.125,-4.83203 -9.625,-7 -0.585938,-0.41406 -0.855469,-0.8125 -0.8125,-1.1875 0.03906,-0.375 0.269531,-0.9375 0.6875,-1.6875 l 20,-30.5 c 0.582031,-0.83203 1.164062,-1.22656 1.75,-1.1875 0.582031,0.043 1.207031,0.27344 1.875,0.6875 1.75,1 3.5,2.125 5.25,3.375 1.75,1.25 3.375,2.60547 4.875,4.0625 1.5,1.46094 2.8125,3.04297 3.9375,4.75 1.125,1.71094 1.9375,3.60547 2.4375,5.6875 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-2-7"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path169"
+           d="m 29.625,-70.625 c -0.667969,8.335938 -2.542969,15.417969 -5.625,21.25 -3.085938,5.835938 -6.585938,8.75 -10.5,8.75 0,-3.164062 1.019531,-13 3.0625,-29.5 2.039062,-16.5 3.582031,-28.3125 4.625,-35.4375 1.039062,-7.125 2.226562,-14.6875 3.5625,-22.6875 1.332031,-8 2.625,-14.45703 3.875,-19.375 1.414062,-4.08203 2.9375,-8.20703 4.5625,-12.375 1.625,-4.16406 3.3125,-8.28906 5.0625,-12.375 1.164062,-1.83203 1.914062,-1.53906 2.25,0.875 -2.085938,13.83594 -4,28.1875 -5.75,43.0625 -1.75,14.875 -2.9375,25.52344 -3.5625,31.9375 -0.625,6.417969 -0.9375,10.167969 -0.9375,11.25 -0.417969,6.835938 -0.625,11.710938 -0.625,14.625 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-3-5"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path172"
+           d="m -16.125,-40.625 c 1.25,-5.332031 2.625,-10 4.125,-14 1.5,-4 2.960938,-7.3125 4.375,-9.9375 1.417969,-2.625 2.792969,-4.644531 4.125,-6.0625 1.335938,-1.414062 2.5,-2.25 3.5,-2.5 v 8.25 c 0,10.5 2.789062,17.835938 8.375,22 3.414062,2.25 6.8125,3 10.1875,2.25 3.375,-0.75 5.957031,-2.5 7.75,-5.25 1.789062,-2.75 3.3125,-5.976562 4.5625,-9.6875 1.25,-3.707031 2.457031,-5.5625 3.625,-5.5625 1.332031,0 1.875,1.335938 1.625,4 -0.08594,4.5 -1.480469,11.8125 -4.1875,21.9375 -2.710938,10.125 -6.375,18.4375 -11,24.9375 -4.625,6.5 -10.230469,9.917969 -16.8125,10.25 -6.75,-0.25 -12,-4.039062 -15.75,-11.375 -3.414062,-7.25 -4.914062,-16.625 -4.5,-28.125 z M 28.5,82.125 c 0.664062,2.414062 0.644531,4.914062 -0.0625,7.5 -0.710938,2.582031 -2.023438,5.289062 -3.9375,8.125 -1.167969,1.914062 -2.398438,3.64453 -3.6875,5.1875 -1.292969,1.53906 -2.648438,3.01953 -4.0625,4.4375 -0.417969,0.5 -1.085938,1.125 -2,1.875 -0.917969,0.75 -1.875,1.45703 -2.875,2.125 -1,0.66406 -1.960938,1.14453 -2.875,1.4375 C 8.082031,113.10156 7.414062,113 7,112.5 c -3,-2.41797 -5.960938,-4.875 -8.875,-7.375 -2.914062,-2.5 -6.125,-4.83594 -9.625,-7 -0.582031,-0.417969 -0.851562,-0.8125 -0.8125,-1.1875 0.04297,-0.375 0.273438,-0.9375 0.6875,-1.6875 l 20,-30.5 c 0.582031,-0.835938 1.164062,-1.230469 1.75,-1.1875 0.582031,0.03906 1.207031,0.269531 1.875,0.6875 1.75,1 3.5,2.125 5.25,3.375 1.75,1.25 3.375,2.601562 4.875,4.0625 1.5,1.457031 2.8125,3.039062 3.9375,4.75 1.125,1.707031 1.9375,3.601562 2.4375,5.6875 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-4-3"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path175"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-5-5"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path178"
+           d="M 72.125,0.125 C 58.039062,0.0390625 47.164062,-0.582031 39.5,-1.75 26.164062,-3.832031 16.664062,-7.832031 11,-13.75 5.914062,-18.332031 3.375,-24.582031 3.375,-32.5 c 0,-3.082031 0.289062,-7.5 0.875,-13.25 0.582031,-5.75 1.375,-11.5 2.375,-17.25 0.414062,-2.414062 0.789062,-4.582031 1.125,-6.5 0.25,-1.332031 0.582031,-2.414062 1,-3.25 0.414062,-0.832031 0.875,-1.3125 1.375,-1.4375 0.5,-0.125 0.976562,0.210938 1.4375,1 0.457031,0.792969 0.894531,2.148438 1.3125,4.0625 0.332031,2.085938 0.789062,4.25 1.375,6.5 1.332031,5.417969 4.957031,9.460938 10.875,12.125 15,6.417969 37.914062,9.75 68.75,10 12.75,-0.164062 24.58203,-0.625 35.5,-1.375 11.16406,-0.832031 23.75,-2.789062 37.75,-5.875 14,-3.082031 25.14453,-6.457031 33.4375,-10.125 8.28906,-3.664062 15.35156,-7.625 21.1875,-11.875 4.58203,-3.332031 6.875,-6.539062 6.875,-9.625 0,-1.25 -1.1875,-2.726562 -3.5625,-4.4375 -2.375,-1.707031 -3.9375,-2.5625 -4.6875,-2.5625 -1.41797,0.667969 -3.08594,1.1875 -5,1.5625 -1.91797,0.375 -3.66797,0.480469 -5.25,0.3125 -4.41797,-0.5 -7.71094,-1.875 -9.875,-4.125 -2.16797,-2.25 -3.25,-5.289062 -3.25,-9.125 0,-2.41406 3.20703,-10 9.625,-22.75 2.58203,-5.16406 4.85156,-8.76953 6.8125,-10.8125 1.95703,-2.03906 4.64453,-3.0625 8.0625,-3.0625 5.41406,0 10.4375,2.91797 15.0625,8.75 4.625,5.83594 6.9375,13.29297 6.9375,22.375 0,9 -1.21094,16.792969 -3.625,23.375 -3,9 -7.08594,17.335938 -12.25,25 -6.5,9.25 -13.625,16.5625 -21.375,21.9375 -7.75,5.375 -15.58594,9.648438 -23.5,12.8125 -7.08594,3.5 -16.23047,6.773438 -27.4375,9.8125 -11.21094,3.042969 -24.8125,5.523438 -40.8125,7.4375 -15.835938,1.917969 -29.960938,2.9140625 -42.375,3 z m 82.375,-172 c 0.66406,2.41797 0.64453,4.91797 -0.0625,7.5 -0.71094,2.58594 -2.02344,5.29297 -3.9375,8.125 -1.16797,1.91797 -2.39844,3.64844 -3.6875,5.1875 -1.29297,1.54297 -2.64844,3.02344 -4.0625,4.4375 -0.41797,0.5 -1.08594,1.125 -2,1.875 -0.91797,0.75 -1.875,1.46094 -2.875,2.125 -1,0.66797 -1.96094,1.14844 -2.875,1.4375 -0.91797,0.29297 -1.58594,0.1875 -2,-0.3125 -3,-2.41406 -5.96094,-4.875 -8.875,-7.375 -2.91797,-2.5 -6.125,-4.83203 -9.625,-7 -0.58594,-0.41406 -0.85547,-0.8125 -0.8125,-1.1875 0.0391,-0.375 0.26953,-0.9375 0.6875,-1.6875 l 20,-30.5 c 0.58203,-0.83203 1.16406,-1.22656 1.75,-1.1875 0.58203,0.043 1.20703,0.27344 1.875,0.6875 1.75,1 3.5,2.125 5.25,3.375 1.75,1.25 3.375,2.60547 4.875,4.0625 1.5,1.46094 2.8125,3.04297 3.9375,4.75 1.125,1.71094 1.9375,3.60547 2.4375,5.6875 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-6-6"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path181"
+           d="m 115,-102.5 c -1.83594,3.25 -3.75,6.523438 -5.75,9.8125 -2,3.292969 -4.23047,6.398438 -6.6875,9.3125 -2.46094,2.917969 -5.167969,5.5625 -8.125,7.9375 -2.960938,2.375 -6.3125,4.273438 -10.0625,5.6875 -3.085938,1.25 -5.710938,2.648438 -7.875,4.1875 -2.167969,1.542969 -3.960938,3.1875 -5.375,4.9375 -2.167969,2.335938 -4.042969,5.5625 -5.625,9.6875 -1.585938,4.125 -3.230469,8.480469 -4.9375,13.0625 -1.710938,4.585938 -3.585938,9.0625 -5.625,13.4375 -2.042969,4.375 -4.605469,7.980469 -7.6875,10.8125 C 43,-9.125 36.707031,-6.082031 28.375,-4.5 L 5.5,-0.625 C 4.832031,-0.539062 4.019531,-0.476562 3.0625,-0.4375 2.101562,-0.394531 1.414062,-0.414062 1,-0.5 -0.914062,-1.082031 -1.5,-2.351562 -0.75,-4.3125 0,-6.269531 1.957031,-8.25 5.125,-10.25 c 6.414062,-4.25 11.539062,-7.6875 15.375,-10.3125 3.832031,-2.625 6.957031,-4.769531 9.375,-6.4375 2.414062,-1.664062 4.351562,-3.039062 5.8125,-4.125 1.457031,-1.082031 3.019531,-2.289062 4.6875,-3.625 6.75,-5.082031 11.414062,-10.414062 14,-16 1.5,-2.914062 2.875,-5.75 4.125,-8.5 1.25,-2.75 2.5625,-5.457031 3.9375,-8.125 1.375,-2.664062 2.851562,-5.3125 4.4375,-7.9375 1.582031,-2.625 3.414062,-5.269531 5.5,-7.9375 2.164062,-2.664062 5.082031,-5.269531 8.75,-7.8125 3.664062,-2.539062 8.082031,-5.0625 13.25,-7.5625 0.582031,-0.25 1.539062,-0.8125 2.875,-1.6875 1.332031,-0.875 2.95703,-2.26953 4.875,-4.1875 1.91406,-1.91406 4.10156,-4.51953 6.5625,-7.8125 2.45703,-3.28906 5.0625,-7.47656 7.8125,-12.5625 -1,-1 -3.875,-2.375 -8.625,-4.125 -4.75,-1.83203 -9.25,-2.875 -13.5,-3.125 -3.917969,-0.25 -7.148438,0.46094 -9.6875,2.125 -2.542969,1.66797 -4.855469,4.04297 -6.9375,7.125 -2.085938,3.08594 -3.875,4.5 -5.375,4.25 -0.5,-0.25 -0.585938,-1.28906 -0.25,-3.125 0.414062,-1.83203 1,-3.625 1.75,-5.375 3.164062,-7.25 6.75,-12.625 10.75,-16.125 4.082031,-3.58203 8.957031,-5.375 14.625,-5.375 4.08203,0 9.20703,1 15.375,3 3.83203,1.33594 7.125,2 9.875,2 5.75,0 11.45703,-2.03906 17.125,-6.125 1.25,0 1.6875,0.8125 1.3125,2.4375 -0.375,1.625 -0.9375,3.52344 -1.6875,5.6875 -0.66797,2.16797 -1.125,3.625 -1.375,4.375 -1.25,3.91797 -2.25,6.21094 -3,6.875 -0.75,0.58594 -2.91797,2.16797 -6.5,4.75 -2,1.5 -3.73047,3.23047 -5.1875,5.1875 -1.46094,1.96094 -2.9375,4.27344 -4.4375,6.9375 -1.5,2.66797 -3.41797,6.33594 -5.75,11 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+    </g>
+  </defs>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="2560"
+     inkscape:window-height="1471"
+     id="namedview4"
+     showgrid="false"
+     inkscape:zoom="0.59454973"
+     inkscape:cx="-165.7731"
+     inkscape:cy="361.75575"
+     inkscape:window-x="0"
+     inkscape:window-y="55"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2" />
+  <path
+     id="path871"
+     d="m 205.59223,196.11402 c -5.97657,36.66667 -11.35417,64.02995 -16.14583,82.08333 -4.79167,18.0599 -9.13412,31.84245 -13.02084,41.35417 -3.89323,9.51823 -8.16406,16.77083 -12.8125,21.77083 -4.65495,5 -13.19661,9.75912 -25.625,14.27083 -12.43489,4.51823 -22.8125,7.67579 -31.14583,9.47917 -8.333331,1.8099 -13.541664,2.77995 -15.624997,2.91667 -2.083334,-0.13672 -3.404949,-0.52084 -3.958334,-1.14584 -0.559896,-0.625 -0.07161,-2.11588 1.458334,-4.47916 2.636718,-3.75 8.157551,-8.88672 16.562497,-15.41667 8.39844,-6.52344 18.33333,-14.64844 29.79167,-24.375 11.45833,-9.72005 20.03255,-18.29427 25.72916,-25.72916 5.69011,-7.42839 10.72917,-17.56511 15.10417,-30.41667 4.375,-12.84505 8.64583,-26.28255 12.8125,-40.3125 4.16667,-14.02343 7.1875,-23.54166 9.0625,-28.54166 1.875,-5 3.78255,-7.42839 5.72916,-7.29167 2.22006,0.41667 2.91667,2.36328 2.08334,5.83333 z M 220.38389,81.739028 c 1.10677,4.02995 1.07422,8.196616 -0.10416,12.5 -1.1849,4.309899 -3.3724,8.821612 -6.5625,13.541662 -1.94662,3.19662 -3.9974,6.08074 -6.14584,8.64584 -2.15494,2.57161 -4.41406,5.03906 -6.77083,7.39583 -0.69661,0.83333 -1.8099,1.875 -3.33333,3.125 -1.52995,1.25 -3.125,2.4349 -4.79167,3.54167 -1.66666,1.11328 -3.26823,1.91406 -4.79166,2.39583 -1.52995,0.48828 -2.64323,0.3125 -3.33334,-0.52083 -5,-4.02344 -9.93489,-8.125 -14.79166,-12.29167 -4.86329,-4.16667 -10.20834,-8.05338 -16.04167,-11.66667 -0.97656,-0.6901 -1.42578,-1.35416 -1.35417,-1.97916 0.0651,-0.625 0.44922,-1.5625 1.14584,-2.8125 l 33.33333,-50.833334 c 0.97005,-1.386717 1.9401,-2.044267 2.91667,-1.979167 0.97005,0.07167 2.01171,0.455734 3.125,1.145834 2.91666,1.666666 5.83333,3.541666 8.74999,5.624999 2.91667,2.083334 5.625,4.34245 8.125,6.770833 2.5,2.4349 4.6875,5.071617 6.5625,7.916667 1.875,2.851566 3.22917,6.009116 4.0625,9.479166 z m 0,0"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
+     d="m 256.21722,250.48902 c -1.11328,13.89323 -4.23828,25.69662 -9.375,35.41667 -5.14323,9.72656 -10.97656,14.58333 -17.5,14.58333 0,-5.27344 1.69922,-21.66667 5.10417,-49.16667 3.39843,-27.49999 5.97005,-47.18749 7.70833,-59.06249 1.73177,-11.875 3.71094,-24.47917 5.9375,-37.8125 2.22005,-13.33333 4.375,-24.09505 6.45833,-32.29167 2.35677,-6.80338 4.89583,-13.67838 7.60417,-20.625 2.70833,-6.940096 5.52083,-13.815095 8.4375,-20.624995 1.9401,-3.053383 3.1901,-2.5651 3.75,1.458333 -3.47657,23.059902 -6.66667,46.979162 -9.58334,71.770832 -2.91666,24.79166 -4.89583,42.53906 -5.9375,53.22916 -1.04166,10.69662 -1.5625,16.94662 -1.5625,18.75 -0.69661,11.39323 -1.04166,19.51823 -1.04166,24.375 z m 0,0"
+     id="path875" />
+  <path
+     id="path945"
+     d="m 229.34222,300.48902 c 2.08333,-8.88672 4.375,-16.66667 6.875,-23.33333 2.5,-6.66667 4.9349,-12.1875 7.29167,-16.5625 2.36328,-4.375 4.65495,-7.74089 6.875,-10.10417 2.22656,-2.35677 4.16666,-3.75 5.83333,-4.16667 v 13.75 c 0,17.5 4.64844,29.72657 13.95833,36.66667 5.69011,3.75 11.35417,5 16.97917,3.75 5.625,-1.25 9.92838,-4.16667 12.91666,-8.75 2.98177,-4.58333 5.52084,-9.96094 7.60417,-16.14583 2.08333,-6.17839 4.09505,-9.27084 6.04167,-9.27084 2.22005,0 3.125,2.22657 2.70833,6.66667 -0.14323,7.5 -2.46745,19.6875 -6.97917,36.5625 -4.51823,16.875 -10.625,30.72916 -18.33333,41.5625 -7.70833,10.83333 -17.05078,16.52995 -28.02083,17.08333 -11.25,-0.41667 -20,-6.73177 -26.25,-18.95833 -5.6901,-12.08334 -8.1901,-27.70833 -7.5,-46.875 z"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
+     inkscape:connector-curvature="0" />
+  <path
+     id="path943"
+     d="m 286.78334,583.03989 c 1.10677,4.02343 1.07422,8.1901 -0.10416,12.5 -1.1849,4.30338 -3.3724,8.8151 -6.5625,13.54167 -1.94662,3.1901 -3.9974,6.07421 -6.14584,8.64583 -2.15495,2.5651 -4.41406,5.03255 -6.77083,7.39583 -0.69662,0.83334 -1.8099,1.875 -3.33333,3.125 -1.52995,1.25 -3.125,2.42839 -4.79167,3.54167 -1.66667,1.10677 -3.26823,1.90755 -4.79167,2.39583 -1.52994,0.48177 -2.64323,0.3125 -3.33333,-0.52083 -5,-4.02995 -9.9349,-8.125 -14.79167,-12.29167 -4.85677,-4.16666 -10.20833,-8.0599 -16.04166,-11.66666 -0.97005,-0.69662 -1.41927,-1.35417 -1.35417,-1.97917 0.0716,-0.625 0.45573,-1.5625 1.14583,-2.8125 l 33.33334,-50.83333 c 0.97005,-1.39323 1.9401,-2.05078 2.91666,-1.97917 0.97006,0.0652 2.01172,0.44922 3.125,1.14584 2.91667,1.66666 5.83334,3.54166 8.75,5.625 2.91667,2.08333 5.625,4.33593 8.125,6.77083 2.5,2.42838 4.6875,5.0651 6.5625,7.91667 1.875,2.84505 3.22917,6.00259 4.0625,9.47916 z"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
+     inkscape:connector-curvature="0" />
+  <path
+     id="path879"
+     d="M 303.71722,505.07234"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path925"
+     d="m 168.42167,500.82557 c -23.47656,-0.14323 -41.60156,-1.17838 -54.375,-3.125 -22.226562,-3.47005 -38.059894,-10.13671 -47.499997,-20 -8.476563,-7.63671 -12.708333,-18.05338 -12.708333,-31.24999 0,-5.13672 0.48177,-12.5 1.458333,-22.08334 0.970052,-9.58333 2.291667,-19.16666 3.958333,-28.75 0.690104,-4.02343 1.315104,-7.63671 1.875,-10.83333 0.416667,-2.22005 0.970052,-4.02344 1.666667,-5.41667 0.690103,-1.38671 1.458333,-2.1875 2.291666,-2.39583 0.833334,-0.20833 1.627604,0.35156 2.395834,1.66667 0.761718,1.32161 1.490885,3.58073 2.187499,6.77083 0.553385,3.47656 1.315104,7.08333 2.291667,10.83333 2.220052,9.02995 8.261718,15.76823 18.124999,20.20834 25.000002,10.69661 63.190102,16.25 114.583332,16.66666 21.25,-0.27343 40.97005,-1.04166 59.16666,-2.29166 18.60677,-1.38672 39.58333,-4.64844 62.91667,-9.79167 23.33333,-5.13672 41.90754,-10.76172 55.72916,-16.875 13.8151,-6.10677 25.58593,-12.70833 35.3125,-19.79167 7.63671,-5.55338 11.45833,-10.89843 11.45833,-16.04166 0,-2.08333 -1.97917,-4.54427 -5.9375,-7.39583 -3.95833,-2.84506 -6.5625,-4.27084 -7.8125,-4.27084 -2.36328,1.11328 -5.14323,1.97917 -8.33333,2.60417 -3.19662,0.625 -6.11328,0.80078 -8.75,0.52083 -7.36328,-0.83333 -12.85157,-3.125 -16.45833,-6.875 -3.61329,-3.75 -5.41667,-8.8151 -5.41667,-15.20833 0,-4.02343 5.34505,-16.66667 16.04167,-37.91667 4.30338,-8.60676 8.08593,-14.61588 11.35416,-18.02083 3.26172,-3.39843 7.74089,-5.10416 13.4375,-5.10416 9.02343,0 17.39583,4.86328 25.10417,14.58333 7.70833,9.72656 11.5625,22.15495 11.5625,37.29166 0,15 -2.01824,27.98828 -6.04167,38.95834 -5,14.99999 -11.8099,28.89322 -20.41667,41.66666 -10.83333,15.41667 -22.70833,27.60417 -35.62499,36.5625 -12.91667,8.95833 -25.97657,16.08073 -39.16667,21.35416 -11.8099,5.83334 -27.05078,11.28907 -45.72916,16.35417 -18.6849,5.07162 -41.35417,9.20573 -68.02083,12.39583 -26.39323,3.19662 -49.9349,4.85677 -70.625,5 z"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path923"
+     d="m 430.22191,133.16177 c 1.10676,4.02995 1.07421,8.19662 -0.10417,12.5 -1.1849,4.3099 -3.3724,8.82162 -6.5625,13.54167 -1.94661,3.19661 -3.9974,6.08073 -6.14583,8.64583 -2.15495,2.57162 -4.41407,5.03907 -6.77083,7.39583 -0.69662,0.83334 -1.8099,1.875 -3.33334,3.125 -1.52995,1.25 -3.125,2.4349 -4.79166,3.54167 -1.66667,1.11328 -3.26824,1.91407 -4.79167,2.39583 -1.52995,0.48829 -2.64323,0.3125 -3.33333,-0.52083 -5,-4.02343 -9.9349,-8.125 -14.79167,-12.29167 -4.86328,-4.16666 -10.20833,-8.05338 -16.04167,-11.66666 -0.97656,-0.6901 -1.42578,-1.35417 -1.35416,-1.97917 0.0652,-0.625 0.44921,-1.5625 1.14583,-2.8125 l 33.33333,-50.83333 c 0.97005,-1.38672 1.9401,-2.04427 2.91667,-1.97917 0.97005,0.0717 2.01172,0.45574 3.125,1.14584 2.91667,1.66666 5.83333,3.54166 8.75,5.625 2.91667,2.08333 5.625,4.34245 8.125,6.77083 2.5,2.4349 4.6875,5.07162 6.5625,7.91667 1.875,2.85156 3.22916,6.00911 4.0625,9.47916 z"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path883"
+     d="M 305.71333,214.15892"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663" />
+  <path
+     id="path887"
+     d="m 599.12998,319.78391 c -3.0599,5.41667 -6.25,10.8724 -9.58333,16.35417 -3.33334,5.48828 -7.05079,10.66406 -11.14584,15.52083 -4.10156,4.86328 -8.61328,9.27084 -13.54166,13.22917 -4.9349,3.95833 -10.52084,7.12239 -16.77084,9.47916 -5.14323,2.08334 -9.51823,4.41407 -13.125,6.97917 -3.61328,2.57162 -6.60156,5.3125 -8.95833,8.22917 -3.61328,3.89323 -6.73828,9.27083 -9.375,16.14583 -2.64323,6.875 -5.38411,14.13411 -8.22916,21.77083 -2.85157,7.64323 -5.97657,15.10417 -9.375,22.39583 -3.40495,7.29167 -7.67579,13.30079 -12.8125,18.02084 -7.08334,7.5 -17.57162,12.57161 -31.45834,15.20833 l -38.12499,6.45833 c -1.11329,0.14323 -2.46745,0.2474 -4.0625,0.3125 -1.60157,0.0716 -2.7474,0.0391 -3.4375,-0.10416 -3.19011,-0.97005 -4.16667,-3.08594 -2.91667,-6.35417 1.25,-3.26172 4.51172,-6.5625 9.79167,-9.89583 10.6901,-7.08334 19.23177,-12.8125 25.625,-17.1875 6.38671,-4.375 11.59505,-7.94922 15.62499,-10.72917 4.02344,-2.77343 7.25261,-5.0651 9.6875,-6.875 2.42839,-1.80338 5.03256,-3.8151 7.8125,-6.04166 11.25,-8.47006 19.02344,-17.35677 23.33334,-26.66667 2.5,-4.85677 4.79166,-9.58333 6.875,-14.16667 2.08333,-4.58333 4.27083,-9.09505 6.5625,-13.54166 2.29166,-4.44011 4.7526,-8.85417 7.39583,-13.22917 2.63672,-4.375 5.6901,-8.78255 9.16667,-13.22916 3.60677,-4.44011 8.47005,-8.78256 14.58333,-13.02084 6.10677,-4.23177 13.47005,-8.4375 22.08333,-12.60416 0.97005,-0.41667 2.5651,-1.35417 4.79167,-2.8125 2.22005,-1.45834 4.92838,-3.78255 8.125,-6.97917 3.1901,-3.1901 6.83593,-7.53255 10.9375,-13.02083 4.09505,-5.48177 8.4375,-12.46094 13.02083,-20.9375 -1.66667,-1.66667 -6.45833,-3.95833 -14.375,-6.875 -7.91667,-3.05338 -15.41667,-4.79167 -22.5,-5.20833 -6.52995,-0.41667 -11.91406,0.76823 -16.14583,3.54166 -4.23828,2.77995 -8.09245,6.73829 -11.5625,11.875 -3.47657,5.14323 -6.45833,7.5 -8.95833,7.08333 -0.83334,-0.41666 -0.97657,-2.14843 -0.41667,-5.20833 0.6901,-3.05338 1.66667,-6.04166 2.91667,-8.95833 5.27343,-12.08333 11.24999,-21.04167 17.91666,-26.875 6.80339,-5.97005 14.92839,-8.95833 24.375,-8.95833 6.80338,0 15.34505,1.66666 25.625,5 6.38672,2.22656 11.875,3.33333 16.45833,3.33333 9.58333,0 19.09505,-3.39843 28.54167,-10.20833 2.08333,0 2.8125,1.35416 2.1875,4.0625 -0.625,2.70833 -1.5625,5.8724 -2.8125,9.47916 -1.11329,3.61329 -1.875,6.04167 -2.29167,7.29167 -2.08333,6.52995 -3.75,10.35157 -5,11.45833 -1.25,0.97657 -4.86328,3.61329 -10.83333,7.91667 -3.33334,2.5 -6.21745,5.38411 -8.64584,8.64583 -2.43489,3.26823 -4.89583,7.1224 -7.39583,11.5625 -2.5,4.44662 -5.69661,10.5599 -9.58333,18.33333 z m 0,0"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
+     inkscape:connector-curvature="0" />
+  <use
+     style="fill:#000000;fill-opacity:1"
+     id="use62"
+     y="291"
+     x="119.25"
+     xlink:href="#glyph0-4"
+     width="100%"
+     height="100%"
+     transform="matrix(1.3333333,0,0,1.3333333,72.589732,-189.32751)" />
+  <use
+     style="fill:#000000;fill-opacity:1"
+     id="use196"
+     y="391"
+     x="168.375"
+     xlink:href="#glyph0-4-3"
+     width="100%"
+     height="100%"
+     transform="matrix(1.3333333,0,0,1.3333333,-861.41828,-631.73483)" />
+</svg>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/Makefile.am b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/Makefile.am
new file mode 100644
index 0000000..9b54b40
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/Makefile.am
@@ -0,0 +1,123 @@
+# Process this file with automake to produce Makefile.in
+
+# We require automake 1.6 at least.
+AUTOMAKE_OPTIONS = 1.6
+
+# This is a blank Makefile.am for using gtk-doc.
+# Copy this to your project's API docs directory and modify the variables to
+# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
+# of using the various options.
+
+# The name of the module, e.g. 'glib'.
+DOC_MODULE=harfbuzz
+
+# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
+#DOC_MODULE_VERSION=$(HB_VERSION_MAJOR)
+
+# The top-level SGML file. You can change this if you want to.
+DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.xml
+
+# Directories containing the source code.
+# gtk-doc will search all .c and .h files beneath these paths
+# for inline comments documenting functions and macros.
+# e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk
+DOC_SOURCE_DIR=$(top_srcdir)/src $(top_builddir)/src
+
+# Extra options to pass to gtkdoc-scangobj. Not normally needed.
+SCANGOBJ_OPTIONS=
+
+# Extra options to supply to gtkdoc-scan.
+# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
+SCAN_OPTIONS=--rebuild-types --deprecated-guards="HB_DISABLE_DEPRECATED" \
+	--ignore-decorators="HB_EXTERN"
+
+# Header files or dirs to ignore when scanning. Use base file/dir names
+# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
+IGNORE_HFILES=`cd $(top_srcdir)/src; find . -path './hb-*/*.h' | sed 's@^.*/@@'`
+if HAVE_GOBJECT
+else
+IGNORE_HFILES+=hb-gobject.h hb-gobject-enums.h hb-gobject-structs.h
+endif
+
+# Extra options to supply to gtkdoc-mkdb.
+# e.g. MKDB_OPTIONS=--xml-mode --output-format=xml
+MKDB_OPTIONS=--source-suffixes=h,cc --xml-mode --output-format=xml --ignore-files="$(IGNORE_HFILES)"
+
+# Extra options to supply to gtkdoc-mktmpl
+# e.g. MKTMPL_OPTIONS=--only-section-tmpl
+MKTMPL_OPTIONS=
+
+# Extra options to supply to gtkdoc-mkhtml
+MKHTML_OPTIONS=
+
+# Extra options to supply to gtkdoc-fixref. Not normally needed.
+# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
+FIXXREF_OPTIONS=
+
+# Used for dependencies. The docs will be rebuilt if any of these change.
+# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
+# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
+HFILE_GLOB=$(top_srcdir)/src/hb.h $(top_srcdir)/src/hb-*.h
+CFILE_GLOB=$(top_srcdir)/src/hb-*.cc
+
+# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
+# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
+
+# Images to copy into HTML directory.
+# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
+HTML_IMAGES=  \
+	HarfBuzz.png \
+	HarfBuzz.svg
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
+content_files=	\
+	usermanual-what-is-harfbuzz.xml \
+	usermanual-install-harfbuzz.xml \
+	usermanual-getting-started.xml \
+	usermanual-shaping-concepts.xml \
+	usermanual-buffers-language-script-and-direction.xml \
+	usermanual-fonts-and-faces.xml \
+	usermanual-clusters.xml \
+	usermanual-opentype-features.xml \
+	usermanual-glyph-information.xml \
+	version.xml
+
+# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
+# These files must be listed here *and* in content_files
+# e.g. expand_content_files=running.sgml
+expand_content_files=
+
+# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
+# Only needed if you are using gtkdoc-scangobj to dynamically query widget
+# signals and properties.
+# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
+# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
+GTKDOC_CFLAGS=
+GTKDOC_LIBS=$(top_builddir)/src/libharfbuzz.la
+if HAVE_GOBJECT
+GTKDOC_LIBS+=$(top_builddir)/src/libharfbuzz-gobject.la
+endif
+
+# This includes the standard gtk-doc make rules, copied by gtkdocize.
+include $(top_srcdir)/gtk-doc.make
+
+# Other files to distribute
+# e.g. EXTRA_DIST += version.xml.in
+EXTRA_DIST += version.xml.in
+
+# Files not to distribute
+# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
+# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
+#DISTCLEANFILES +=
+
+# Comment this out if you don't want 'make check' to test you doc status
+# and run some sanity checks
+if ENABLE_GTK_DOC
+TESTS_ENVIRONMENT = cd $(srcdir) && \
+  DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
+  SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir)
+#TESTS = $(GTKDOC_CHECK)
+endif
+
+-include $(top_srcdir)/git.mk
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/Makefile.in b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/Makefile.in
new file mode 100644
index 0000000..3e2825e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/Makefile.in
@@ -0,0 +1,917 @@
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+
+# -*- mode: makefile -*-
+
+####################################
+# Everything below here is generic #
+####################################
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@HAVE_GOBJECT_FALSE@am__append_1 = hb-gobject.h hb-gobject-enums.h hb-gobject-structs.h
+@HAVE_GOBJECT_TRUE@am__append_2 = $(top_builddir)/src/libharfbuzz-gobject.la
+subdir = docs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
+	$(top_srcdir)/m4/ax_code_coverage.m4 \
+	$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = version.xml
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/version.xml.in \
+	$(top_srcdir)/gtk-doc.make
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_CONFIG = @ICU_CONFIG@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# We require automake 1.6 at least.
+AUTOMAKE_OPTIONS = 1.6
+
+# This is a blank Makefile.am for using gtk-doc.
+# Copy this to your project's API docs directory and modify the variables to
+# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
+# of using the various options.
+
+# The name of the module, e.g. 'glib'.
+DOC_MODULE = harfbuzz
+
+# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
+#DOC_MODULE_VERSION=$(HB_VERSION_MAJOR)
+
+# The top-level SGML file. You can change this if you want to.
+DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.xml
+
+# Directories containing the source code.
+# gtk-doc will search all .c and .h files beneath these paths
+# for inline comments documenting functions and macros.
+# e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk
+DOC_SOURCE_DIR = $(top_srcdir)/src $(top_builddir)/src
+
+# Extra options to pass to gtkdoc-scangobj. Not normally needed.
+SCANGOBJ_OPTIONS = 
+
+# Extra options to supply to gtkdoc-scan.
+# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
+SCAN_OPTIONS = --rebuild-types --deprecated-guards="HB_DISABLE_DEPRECATED" \
+	--ignore-decorators="HB_EXTERN"
+
+
+# Header files or dirs to ignore when scanning. Use base file/dir names
+# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
+IGNORE_HFILES = `cd $(top_srcdir)/src; find . -path './hb-*/*.h' | sed \
+	's@^.*/@@'` $(am__append_1)
+
+# Extra options to supply to gtkdoc-mkdb.
+# e.g. MKDB_OPTIONS=--xml-mode --output-format=xml
+MKDB_OPTIONS = --source-suffixes=h,cc --xml-mode --output-format=xml --ignore-files="$(IGNORE_HFILES)"
+
+# Extra options to supply to gtkdoc-mktmpl
+# e.g. MKTMPL_OPTIONS=--only-section-tmpl
+MKTMPL_OPTIONS = 
+
+# Extra options to supply to gtkdoc-mkhtml
+MKHTML_OPTIONS = 
+
+# Extra options to supply to gtkdoc-fixref. Not normally needed.
+# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
+FIXXREF_OPTIONS = 
+
+# Used for dependencies. The docs will be rebuilt if any of these change.
+# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
+# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
+HFILE_GLOB = $(top_srcdir)/src/hb.h $(top_srcdir)/src/hb-*.h
+CFILE_GLOB = $(top_srcdir)/src/hb-*.cc
+
+# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
+# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
+
+# Images to copy into HTML directory.
+# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
+HTML_IMAGES = \
+	HarfBuzz.png \
+	HarfBuzz.svg
+
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
+content_files = \
+	usermanual-what-is-harfbuzz.xml \
+	usermanual-install-harfbuzz.xml \
+	usermanual-getting-started.xml \
+	usermanual-shaping-concepts.xml \
+	usermanual-buffers-language-script-and-direction.xml \
+	usermanual-fonts-and-faces.xml \
+	usermanual-clusters.xml \
+	usermanual-opentype-features.xml \
+	usermanual-glyph-information.xml \
+	version.xml
+
+
+# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
+# These files must be listed here *and* in content_files
+# e.g. expand_content_files=running.sgml
+expand_content_files = 
+
+# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
+# Only needed if you are using gtkdoc-scangobj to dynamically query widget
+# signals and properties.
+# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
+# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
+GTKDOC_CFLAGS = 
+GTKDOC_LIBS = $(top_builddir)/src/libharfbuzz.la $(am__append_2)
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = 
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute
+
+# We set GPATH here; this gives us semantics for GNU make
+# which are more like other make's VPATH, when it comes to
+# whether a source that is a target of one rule is then
+# searched for in VPATH/GPATH.
+#
+GPATH = $(srcdir)
+TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)
+SETUP_FILES = \
+	$(content_files)		\
+	$(expand_content_files)		\
+	$(DOC_MAIN_SGML_FILE)		\
+	$(DOC_MODULE)-sections.txt	\
+	$(DOC_MODULE)-overrides.txt
+
+
+# This includes the standard gtk-doc make rules, copied by gtkdocize.
+
+# Other files to distribute
+# e.g. EXTRA_DIST += version.xml.in
+EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) version.xml.in
+DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \
+	html-build.stamp pdf-build.stamp \
+	sgml.stamp html.stamp pdf.stamp
+
+SCANOBJ_FILES = \
+	$(DOC_MODULE).args 	 \
+	$(DOC_MODULE).hierarchy  \
+	$(DOC_MODULE).interfaces \
+	$(DOC_MODULE).prerequisites \
+	$(DOC_MODULE).signals
+
+REPORT_FILES = \
+	$(DOC_MODULE)-undocumented.txt \
+	$(DOC_MODULE)-undeclared.txt \
+	$(DOC_MODULE)-unused.txt
+
+CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test
+@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = 
+@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp
+@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = 
+@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp
+
+#### setup ####
+GTK_DOC_V_SETUP = $(GTK_DOC_V_SETUP_$(V))
+GTK_DOC_V_SETUP_ = $(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY))
+GTK_DOC_V_SETUP_0 = @echo "  DOC   Preparing build";
+
+#### scan ####
+GTK_DOC_V_SCAN = $(GTK_DOC_V_SCAN_$(V))
+GTK_DOC_V_SCAN_ = $(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY))
+GTK_DOC_V_SCAN_0 = @echo "  DOC   Scanning header files";
+GTK_DOC_V_INTROSPECT = $(GTK_DOC_V_INTROSPECT_$(V))
+GTK_DOC_V_INTROSPECT_ = $(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY))
+GTK_DOC_V_INTROSPECT_0 = @echo "  DOC   Introspecting gobjects";
+
+#### xml ####
+GTK_DOC_V_XML = $(GTK_DOC_V_XML_$(V))
+GTK_DOC_V_XML_ = $(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY))
+GTK_DOC_V_XML_0 = @echo "  DOC   Building XML";
+
+#### html ####
+GTK_DOC_V_HTML = $(GTK_DOC_V_HTML_$(V))
+GTK_DOC_V_HTML_ = $(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY))
+GTK_DOC_V_HTML_0 = @echo "  DOC   Building HTML";
+GTK_DOC_V_XREF = $(GTK_DOC_V_XREF_$(V))
+GTK_DOC_V_XREF_ = $(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY))
+GTK_DOC_V_XREF_0 = @echo "  DOC   Fixing cross-references";
+
+#### pdf ####
+GTK_DOC_V_PDF = $(GTK_DOC_V_PDF_$(V))
+GTK_DOC_V_PDF_ = $(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY))
+GTK_DOC_V_PDF_0 = @echo "  DOC   Building PDF";
+
+# Files not to distribute
+# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
+# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
+#DISTCLEANFILES +=
+
+# Comment this out if you don't want 'make check' to test you doc status
+# and run some sanity checks
+@ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = cd $(srcdir) && \
+@ENABLE_GTK_DOC_TRUE@  DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
+@ENABLE_GTK_DOC_TRUE@  SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits docs/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnits docs/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+$(top_srcdir)/gtk-doc.make $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+version.xml: $(top_builddir)/config.status $(srcdir)/version.xml.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+check-am: all-am
+check: check-am
+@ENABLE_GTK_DOC_FALSE@all-local:
+all-am: Makefile all-local
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-local
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic \
+	maintainer-clean-local
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am all-local check check-am clean clean-generic \
+	clean-libtool clean-local cscopelist-am ctags-am dist-hook \
+	distclean distclean-generic distclean-libtool distclean-local \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-data-local \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	maintainer-clean-local mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
+	uninstall-am uninstall-local
+
+.PRECIOUS: Makefile
+
+
+gtkdoc-check.test: Makefile
+	$(AM_V_GEN)echo "#!/bin/sh -e" > $@; \
+		echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \
+		chmod +x $@
+
+all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
+.PHONY: all-gtk-doc
+
+@ENABLE_GTK_DOC_TRUE@all-local: all-gtk-doc
+
+docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
+
+$(REPORT_FILES): sgml-build.stamp
+
+setup-build.stamp:
+	-$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+	    files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \
+	    if test "x$$files" != "x" ; then \
+	        for file in $$files ; do \
+	            destdir=`dirname $(abs_builddir)/$$file`; \
+	            test -d "$$destdir" || mkdir -p "$$destdir"; \
+	            test -f $(abs_srcdir)/$$file && \
+	                cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \
+	        done; \
+	    fi; \
+	fi
+	$(AM_V_at)touch setup-build.stamp
+
+scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
+	$(GTK_DOC_V_SCAN)_source_dir='' ; \
+	for i in $(DOC_SOURCE_DIR) ; do \
+	    _source_dir="$${_source_dir} --source-dir=$$i" ; \
+	done ; \
+	gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES)
+	$(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
+	    scanobj_options=""; \
+	    gtkdoc-scangobj 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+	    if test "$$?" = "0"; then \
+	        if test "x$(V)" = "x1"; then \
+	            scanobj_options="--verbose"; \
+	        fi; \
+	    fi; \
+	    CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \
+	    gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \
+	else \
+	    for i in $(SCANOBJ_FILES) ; do \
+	        test -f $$i || touch $$i ; \
+	    done \
+	fi
+	$(AM_V_at)touch scan-build.stamp
+
+$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
+	@true
+
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent
+	$(GTK_DOC_V_XML)_source_dir='' ; \
+	for i in $(DOC_SOURCE_DIR) ; do \
+	    _source_dir="$${_source_dir} --source-dir=$$i" ; \
+	done ; \
+	gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS)
+	$(AM_V_at)touch sgml-build.stamp
+
+sgml.stamp: sgml-build.stamp
+	@true
+
+xml/gtkdocentities.ent: Makefile
+	$(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \
+		echo "<!ENTITY package \"$(PACKAGE)\">"; \
+		echo "<!ENTITY package_bugreport \"$(PACKAGE_BUGREPORT)\">"; \
+		echo "<!ENTITY package_name \"$(PACKAGE_NAME)\">"; \
+		echo "<!ENTITY package_string \"$(PACKAGE_STRING)\">"; \
+		echo "<!ENTITY package_tarname \"$(PACKAGE_TARNAME)\">"; \
+		echo "<!ENTITY package_url \"$(PACKAGE_URL)\">"; \
+		echo "<!ENTITY package_version \"$(PACKAGE_VERSION)\">"; \
+	) > $@
+
+html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
+	$(GTK_DOC_V_HTML)rm -rf html && mkdir html && \
+	mkhtml_options=""; \
+	gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+	if test "$$?" = "0"; then \
+	  if test "x$(V)" = "x1"; then \
+	    mkhtml_options="$$mkhtml_options --verbose"; \
+	  fi; \
+	fi; \
+	gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-path"; \
+	if test "$$?" = "0"; then \
+	  mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
+	fi; \
+	cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
+	-@test "x$(HTML_IMAGES)" = "x" || \
+	for file in $(HTML_IMAGES) ; do \
+	  if test -f $(abs_srcdir)/$$file ; then \
+	    cp $(abs_srcdir)/$$file $(abs_builddir)/html; \
+	  fi; \
+	  if test -f $(abs_builddir)/$$file ; then \
+	    cp $(abs_builddir)/$$file $(abs_builddir)/html; \
+	  fi; \
+	  test -f $$file && cp $$file $(abs_builddir)/html; \
+	done;
+	$(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
+	$(AM_V_at)touch html-build.stamp
+
+pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
+	$(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \
+	mkpdf_options=""; \
+	gtkdoc-mkpdf 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+	if test "$$?" = "0"; then \
+	  if test "x$(V)" = "x1"; then \
+	    mkpdf_options="$$mkpdf_options --verbose"; \
+	  fi; \
+	fi; \
+	if test "x$(HTML_IMAGES)" != "x"; then \
+	  for img in $(HTML_IMAGES); do \
+	    part=`dirname $$img`; \
+	    echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \
+	    if test $$? != 0; then \
+	      mkpdf_options="$$mkpdf_options --imgdir=$$part"; \
+	    fi; \
+	  done; \
+	fi; \
+	gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS)
+	$(AM_V_at)touch pdf-build.stamp
+
+##############
+
+clean-local:
+	@rm -f *~ *.bak
+	@rm -rf .libs
+	@if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \
+	  rm -f $(DOC_MODULE).types; \
+	fi
+	@if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \
+	  rm -f $(DOC_MODULE)-sections.txt; \
+	fi
+
+distclean-local:
+	@rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
+	    $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
+	@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+	    rm -f $(SETUP_FILES) $(DOC_MODULE).types; \
+	fi
+
+maintainer-clean-local:
+	@rm -rf xml html
+
+install-data-local:
+	@installfiles=`echo $(builddir)/html/*`; \
+	if test "$$installfiles" = '$(builddir)/html/*'; \
+	then echo 1>&2 'Nothing to install' ; \
+	else \
+	  if test -n "$(DOC_MODULE_VERSION)"; then \
+	    installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
+	  else \
+	    installdir="$(DESTDIR)$(TARGET_DIR)"; \
+	  fi; \
+	  $(mkinstalldirs) $${installdir} ; \
+	  for i in $$installfiles; do \
+	    echo ' $(INSTALL_DATA) '$$i ; \
+	    $(INSTALL_DATA) $$i $${installdir}; \
+	  done; \
+	  if test -n "$(DOC_MODULE_VERSION)"; then \
+	    mv -f $${installdir}/$(DOC_MODULE).devhelp2 \
+	      $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \
+	  fi; \
+	  $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \
+	fi
+
+uninstall-local:
+	@if test -n "$(DOC_MODULE_VERSION)"; then \
+	  installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
+	else \
+	  installdir="$(DESTDIR)$(TARGET_DIR)"; \
+	fi; \
+	rm -rf $${installdir}
+
+#
+# Require gtk-doc when making dist
+#
+@HAVE_GTK_DOC_TRUE@dist-check-gtkdoc: docs
+@HAVE_GTK_DOC_FALSE@dist-check-gtkdoc:
+@HAVE_GTK_DOC_FALSE@	@echo "*** gtk-doc is needed to run 'make dist'.         ***"
+@HAVE_GTK_DOC_FALSE@	@echo "*** gtk-doc was not found when 'configure' ran.   ***"
+@HAVE_GTK_DOC_FALSE@	@echo "*** please install gtk-doc and rerun 'configure'. ***"
+@HAVE_GTK_DOC_FALSE@	@false
+
+dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local
+	@mkdir $(distdir)/html
+	@cp ./html/* $(distdir)/html
+	@-cp ./$(DOC_MODULE).pdf $(distdir)/
+	@-cp ./$(DOC_MODULE).types $(distdir)/
+	@-cp ./$(DOC_MODULE)-sections.txt $(distdir)/
+	@cd $(distdir) && rm -f $(DISTCLEANFILES)
+	@$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html
+
+.PHONY : dist-hook-local docs
+#TESTS = $(GTKDOC_CHECK)
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/harfbuzz-docs.xml b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/harfbuzz-docs.xml
new file mode 100644
index 0000000..2735338
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/harfbuzz-docs.xml
@@ -0,0 +1,176 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+  <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
+  <!ENTITY version SYSTEM "version.xml">
+]>
+<book id="index">
+  <bookinfo>
+    <title>HarfBuzz Manual</title>
+    <abstract>
+      <title>HarfBuzz</title>
+      <graphic fileref="HarfBuzz.png" format="PNG" align="center"/>
+      <para>
+        HarfBuzz is an <ulink url="http://www.microsoft.com/typography/otspec/">OpenType</ulink>
+        text shaping engine. Using the HarfBuzz library allows
+	programs to convert a sequence of Unicode input into
+	properly formatted and positioned glyph output&mdash;for any writing
+	system and language.
+      </para>
+
+      <para>
+	The canonical source-code tree is available at
+        <ulink
+	    url="https://github.com/harfbuzz/harfbuzz">github.com/harfbuzz/harfbuzz</ulink>
+        and is also available at
+        <ulink
+	    url="http://cgit.freedesktop.org/harfbuzz/">cgit.freedesktop.org/harfbuzz</ulink>.
+	See <xref linkend="download" endterm="download.title"/> for
+	release tarballs.
+      </para>
+    </abstract>
+  </bookinfo>
+
+  <part>
+    <title>User's manual</title>
+      <xi:include href="usermanual-what-is-harfbuzz.xml"/>
+      <xi:include href="usermanual-install-harfbuzz.xml"/>
+      <xi:include href="usermanual-getting-started.xml"/>
+      <xi:include href="usermanual-shaping-concepts.xml"/>
+      <xi:include href="usermanual-buffers-language-script-and-direction.xml"/>
+      <xi:include href="usermanual-fonts-and-faces.xml"/>
+      <xi:include href="usermanual-clusters.xml"/>
+      <xi:include href="usermanual-opentype-features.xml"/>
+      <xi:include href="usermanual-glyph-information.xml"/>
+  </part>
+
+  <part>
+    <partinfo>
+      <releaseinfo>
+        This document is for HarfBuzz &version;.
+        <!--The latest version of this documentation can be found on-line at
+        <ulink role="online-location" url="http://[SERVER]/libharfbuzz/index.html">http://[SERVER]/libharfbuzz/</ulink>.-->
+      </releaseinfo>
+    </partinfo>
+
+    <note>
+      <para>
+        The current HarfBuzz codebase is versioned 2.x.x and is stable
+	and under active maintenance. This is what is used in latest
+	versions of Firefox, GNOME, ChromeOS, Chrome, LibreOffice,
+	XeTeX, Android, and KDE, among other places. 
+      </para>
+      <para>
+        Prior to 2012, the original HarfBuzz codebase (which, these
+	days, is referred to as <emphasis>harfbuzz-old</emphasis>) was 
+        derived from code in <ulink
+	url="http://freetype.org/">FreeType</ulink>, <ulink
+	url="http://pango.org/">Pango</ulink>, and 
+        <ulink url="http://qt-project.org/">Qt</ulink>.
+        It is <emphasis>not</emphasis> actively developed or
+	maintained, and is extremely buggy. All users of harfbuzz-old
+	are encouraged to switch over to the new HarfBuzz as soon as possible.
+      </para>
+      <para>
+	To make this distinction clearer in discussions, the current
+	HarfBuzz codebase is sometimes referred to as
+	<emphasis>harfbuzz-ng</emphasis>.
+      </para>
+      <para>
+	For reference purposes, the harfbuzz-old source tree is archived 
+        <ulink
+	    url="http://cgit.freedesktop.org/harfbuzz.old/">here</ulink>. There
+	are no release tarballs of harfbuzz-old whatsoever.
+      </para>
+    </note>
+      
+    <title>Reference manual</title>
+      <chapter>
+        <title>Core API</title>
+        <xi:include href="xml/hb-blob.xml"/>
+        <xi:include href="xml/hb-buffer.xml"/>
+        <xi:include href="xml/hb-common.xml"/>
+        <xi:include href="xml/hb-deprecated.xml"/>
+        <xi:include href="xml/hb-face.xml"/>
+        <xi:include href="xml/hb-font.xml"/>
+        <xi:include href="xml/hb-map.xml"/>
+        <xi:include href="xml/hb-set.xml"/>
+        <xi:include href="xml/hb-shape-plan.xml"/>
+        <xi:include href="xml/hb-shape.xml"/>
+        <xi:include href="xml/hb-unicode.xml"/>
+        <xi:include href="xml/hb-version.xml"/>
+      </chapter>
+
+      <chapter>
+        <title>OpenType API</title>
+        <xi:include href="xml/hb-ot-color.xml"/>
+        <xi:include href="xml/hb-ot-font.xml"/>
+        <xi:include href="xml/hb-ot-layout.xml"/>
+        <xi:include href="xml/hb-ot-math.xml"/>
+        <xi:include href="xml/hb-ot-name.xml"/>
+        <xi:include href="xml/hb-ot-shape.xml"/>
+        <xi:include href="xml/hb-ot-var.xml"/>
+      </chapter>
+
+      <chapter>
+        <title>Apple Advanced Typography API</title>
+        <xi:include href="xml/hb-aat-layout.xml"/>
+      </chapter>
+
+      <chapter>
+        <title>Integration API</title>
+        <xi:include href="xml/hb-coretext.xml"/>
+        <xi:include href="xml/hb-ft.xml"/>
+        <xi:include href="xml/hb-glib.xml"/>
+        <xi:include href="xml/hb-gobject.xml"/>
+        <xi:include href="xml/hb-graphite2.xml"/>
+        <xi:include href="xml/hb-icu.xml"/>
+        <xi:include href="xml/hb-uniscribe.xml"/>
+      </chapter>
+
+      <!--chapter id="object-tree">
+        <title>Object Hierarchy</title>
+         <xi:include href="xml/tree_index.sgml"/>
+      </chapter-->
+
+      <index id="api-index-full"><title>API Index</title><xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include></index>
+      <index id="deprecated-api-index" role="deprecated"><title>Index of deprecated API</title><xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include></index>
+
+      <index id="api-index-2-1-0" role="2.1.0"><title>Index of new symbols in 2.1.0</title><xi:include href="xml/api-index-2.1.0.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-2-0-0" role="2.0.0"><title>Index of new symbols in 2.0.0</title><xi:include href="xml/api-index-2.0.0.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-9-0" role="1.9.0"><title>Index of new symbols in 1.9.0</title><xi:include href="xml/api-index-1.9.0.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-8-6" role="1.8.6"><title>Index of new symbols in 1.8.6</title><xi:include href="xml/api-index-1.8.6.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-8-5" role="1.8.5"><title>Index of new symbols in 1.8.5</title><xi:include href="xml/api-index-1.8.5.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-8-1" role="1.8.1"><title>Index of new symbols in 1.8.1</title><xi:include href="xml/api-index-1.8.1.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-8-0" role="1.8.0"><title>Index of new symbols in 1.8.0</title><xi:include href="xml/api-index-1.8.0.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-7-7" role="1.7.7"><title>Index of new symbols in 1.7.7</title><xi:include href="xml/api-index-1.7.7.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-7-5" role="1.7.5"><title>Index of new symbols in 1.7.5</title><xi:include href="xml/api-index-1.7.5.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-6-0" role="1.6.0"><title>Index of new symbols in 1.6.0</title><xi:include href="xml/api-index-1.6.0.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-5-0" role="1.5.0"><title>Index of new symbols in 1.5.0</title><xi:include href="xml/api-index-1.5.0.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-4-3" role="1.4.3"><title>Index of new symbols in 1.4.3</title><xi:include href="xml/api-index-1.4.3.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-4-2" role="1.4.2"><title>Index of new symbols in 1.4.2</title><xi:include href="xml/api-index-1.4.2.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-4-0" role="1.4.0"><title>Index of new symbols in 1.4.0</title><xi:include href="xml/api-index-1.4.0.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-3-3" role="1.3.3"><title>Index of new symbols in 1.3.3</title><xi:include href="xml/api-index-1.3.3.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-2-3" role="1.2.3"><title>Index of new symbols in 1.2.3</title><xi:include href="xml/api-index-1.2.3.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-1-3" role="1.1.3"><title>Index of new symbols in 1.1.3</title><xi:include href="xml/api-index-1.1.3.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-1-2" role="1.1.2"><title>Index of new symbols in 1.1.2</title><xi:include href="xml/api-index-1.1.2.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-0-5" role="1.0.5"><title>Index of new symbols in 1.0.5</title><xi:include href="xml/api-index-1.0.5.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-42" role="0.9.42"><title>Index of new symbols in 0.9.42</title><xi:include href="xml/api-index-0.9.42.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-41" role="0.9.41"><title>Index of new symbols in 0.9.41</title><xi:include href="xml/api-index-0.9.41.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-39" role="0.9.39"><title>Index of new symbols in 0.9.39</title><xi:include href="xml/api-index-0.9.39.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-38" role="0.9.38"><title>Index of new symbols in 0.9.38</title><xi:include href="xml/api-index-0.9.38.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-31" role="0.9.31"><title>Index of new symbols in 0.9.31</title><xi:include href="xml/api-index-0.9.31.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-30" role="0.9.30"><title>Index of new symbols in 0.9.30</title><xi:include href="xml/api-index-0.9.30.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-28" role="0.9.28"><title>Index of new symbols in 0.9.28</title><xi:include href="xml/api-index-0.9.28.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-22" role="0.9.22"><title>Index of new symbols in 0.9.22</title><xi:include href="xml/api-index-0.9.22.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-20" role="0.9.20"><title>Index of new symbols in 0.9.20</title><xi:include href="xml/api-index-0.9.20.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-11" role="0.9.11"><title>Index of new symbols in 0.9.11</title><xi:include href="xml/api-index-0.9.11.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-10" role="0.9.10"><title>Index of new symbols in 0.9.10</title><xi:include href="xml/api-index-0.9.10.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-8" role="0.9.8"><title>Index of new symbols in 0.9.8</title><xi:include href="xml/api-index-0.9.8.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-7" role="0.9.7"><title>Index of new symbols in 0.9.7</title><xi:include href="xml/api-index-0.9.7.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-5" role="0.9.5"><title>Index of new symbols in 0.9.5</title><xi:include href="xml/api-index-0.9.5.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-2" role="0.9.2"><title>Index of new symbols in 0.9.2</title><xi:include href="xml/api-index-0.9.2.xml"><xi:fallback /></xi:include></index>
+
+      <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
+  </part>
+</book>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/harfbuzz-overrides.txt b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/harfbuzz-overrides.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/harfbuzz-overrides.txt
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/harfbuzz-sections.txt b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/harfbuzz-sections.txt
new file mode 100644
index 0000000..fd7682e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/harfbuzz-sections.txt
@@ -0,0 +1,732 @@
+<SUBSECTION Private>
+HB_H_IN
+HB_OT_H_IN
+</SECTION>
+
+<SECTION>
+<FILE>hb-aat-layout</FILE>
+HB_AAT_LAYOUT_NO_SELECTOR_INDEX
+hb_aat_layout_feature_type_t
+hb_aat_layout_feature_selector_t
+hb_aat_layout_feature_selector_info_t
+hb_aat_layout_feature_type_get_name_id
+hb_aat_layout_feature_type_get_selector_infos
+hb_aat_layout_get_feature_types
+hb_aat_layout_has_positioning
+hb_aat_layout_has_substitution
+hb_aat_layout_has_tracking
+</SECTION>
+
+<SECTION>
+<FILE>hb-blob</FILE>
+hb_blob_create
+hb_blob_create_from_file
+hb_blob_create_sub_blob
+hb_blob_copy_writable_or_fail
+hb_blob_destroy
+hb_blob_get_data
+hb_blob_get_data_writable
+hb_blob_get_empty
+hb_blob_get_length
+hb_blob_get_user_data
+hb_blob_is_immutable
+hb_blob_make_immutable
+hb_blob_reference
+hb_blob_set_user_data
+hb_blob_t
+hb_memory_mode_t
+</SECTION>
+
+<SECTION>
+<FILE>hb-buffer</FILE>
+HB_SEGMENT_PROPERTIES_DEFAULT
+HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT
+hb_buffer_create
+hb_buffer_reference
+hb_buffer_get_empty
+hb_buffer_destroy
+hb_buffer_reset
+hb_buffer_clear_contents
+hb_buffer_pre_allocate
+hb_buffer_allocation_successful
+hb_buffer_add
+hb_buffer_add_codepoints
+hb_buffer_add_utf32
+hb_buffer_add_utf16
+hb_buffer_add_utf8
+hb_buffer_add_latin1
+hb_buffer_append
+hb_buffer_set_content_type
+hb_buffer_get_content_type
+hb_buffer_set_direction
+hb_buffer_get_direction
+hb_buffer_set_script
+hb_buffer_get_script
+hb_buffer_set_language
+hb_buffer_get_language
+hb_buffer_set_flags
+hb_buffer_get_flags
+hb_buffer_set_cluster_level
+hb_buffer_get_cluster_level
+hb_buffer_set_length
+hb_buffer_get_length
+hb_buffer_set_segment_properties
+hb_buffer_get_segment_properties
+hb_buffer_guess_segment_properties
+hb_buffer_set_unicode_funcs
+hb_buffer_get_unicode_funcs
+hb_buffer_set_user_data
+hb_buffer_get_user_data
+hb_buffer_get_glyph_infos
+hb_buffer_get_glyph_positions
+hb_buffer_get_invisible_glyph
+hb_buffer_set_invisible_glyph
+hb_buffer_set_replacement_codepoint
+hb_buffer_get_replacement_codepoint
+hb_buffer_normalize_glyphs
+hb_buffer_reverse
+hb_buffer_reverse_range
+hb_buffer_reverse_clusters
+hb_buffer_serialize_glyphs
+hb_buffer_deserialize_glyphs
+hb_buffer_serialize_format_from_string
+hb_buffer_serialize_format_to_string
+hb_buffer_serialize_list_formats
+hb_segment_properties_equal
+hb_segment_properties_hash
+hb_buffer_diff
+hb_buffer_set_message_func
+hb_buffer_t
+hb_glyph_info_get_glyph_flags
+hb_glyph_info_t
+hb_glyph_flags_t
+hb_glyph_position_t
+hb_buffer_content_type_t
+hb_buffer_flags_t
+hb_buffer_cluster_level_t
+hb_segment_properties_t
+hb_buffer_serialize_format_t
+hb_buffer_serialize_flags_t
+hb_buffer_diff_flags_t
+hb_buffer_message_func_t
+</SECTION>
+
+<SECTION>
+<FILE>hb-common</FILE>
+hb_tag_from_string
+hb_tag_to_string
+hb_direction_from_string
+hb_direction_to_string
+hb_script_from_iso15924_tag
+hb_script_from_string
+hb_script_to_iso15924_tag
+hb_script_get_horizontal_direction
+hb_language_from_string
+hb_language_to_string
+hb_language_get_default
+hb_bool_t
+hb_codepoint_t
+hb_destroy_func_t
+hb_direction_t
+hb_language_t
+hb_mask_t
+hb_position_t
+hb_tag_t
+hb_script_t
+hb_user_data_key_t
+hb_var_int_t
+HB_TAG
+HB_TAG_NONE
+HB_TAG_MAX
+HB_TAG_MAX_SIGNED
+HB_UNTAG
+HB_DIRECTION_REVERSE
+HB_DIRECTION_IS_BACKWARD
+HB_DIRECTION_IS_FORWARD
+HB_DIRECTION_IS_HORIZONTAL
+HB_DIRECTION_IS_VALID
+HB_DIRECTION_IS_VERTICAL
+HB_LANGUAGE_INVALID
+<SUBSECTION Private>
+HB_BEGIN_DECLS
+HB_END_DECLS
+int16_t
+int32_t
+int64_t
+int8_t
+uint16_t
+uint32_t
+uint64_t
+uint8_t
+<SUBSECTION Private>
+HB_EXTERN
+HB_DEPRECATED
+HB_DEPRECATED_FOR
+</SECTION>
+
+<SECTION>
+<FILE>hb-deprecated</FILE>
+HB_BUFFER_FLAGS_DEFAULT
+HB_BUFFER_SERIALIZE_FLAGS_DEFAULT
+HB_SCRIPT_CANADIAN_ABORIGINAL
+hb_font_funcs_set_glyph_func
+hb_font_get_glyph_func_t
+hb_ot_layout_table_choose_script
+hb_ot_layout_table_find_script
+hb_ot_tag_from_language
+hb_ot_tags_from_script
+HB_OT_VAR_NO_AXIS_INDEX
+hb_ot_var_axis_t
+hb_ot_var_find_axis
+hb_ot_var_get_axes
+hb_set_invert
+hb_unicode_eastasian_width_func_t
+hb_unicode_eastasian_width
+hb_unicode_funcs_set_eastasian_width_func
+HB_UNICODE_MAX_DECOMPOSITION_LEN
+hb_unicode_decompose_compatibility_func_t
+hb_unicode_decompose_compatibility
+hb_unicode_funcs_set_decompose_compatibility_func
+hb_font_funcs_set_glyph_h_kerning_func
+hb_font_funcs_set_glyph_v_kerning_func
+hb_font_get_glyph_h_kerning
+hb_font_get_glyph_h_kerning_func_t
+hb_font_get_glyph_kerning_for_direction
+hb_font_get_glyph_kerning_func_t
+hb_font_get_glyph_v_kerning
+hb_font_get_glyph_v_kerning_func_t
+</SECTION>
+
+<SECTION>
+<FILE>hb-coretext</FILE>
+HB_CORETEXT_TAG_KERX
+HB_CORETEXT_TAG_MORT
+HB_CORETEXT_TAG_MORX
+hb_coretext_face_create
+hb_coretext_font_create
+hb_coretext_face_get_cg_font
+hb_coretext_font_get_ct_font
+</SECTION>
+
+<SECTION>
+<FILE>hb-face</FILE>
+hb_face_count
+hb_face_t
+hb_face_create
+hb_face_create_for_tables
+hb_face_destroy
+hb_face_get_empty
+hb_face_get_table_tags
+hb_face_get_glyph_count
+hb_face_get_index
+hb_face_get_upem
+hb_face_get_user_data
+hb_face_is_immutable
+hb_face_make_immutable
+hb_face_reference
+hb_face_reference_blob
+hb_face_reference_table
+hb_face_set_glyph_count
+hb_face_set_index
+hb_face_set_upem
+hb_face_set_user_data
+hb_face_collect_unicodes
+hb_face_collect_variation_selectors
+hb_face_collect_variation_unicodes
+hb_face_builder_create
+hb_face_builder_add_table
+</SECTION>
+
+<SECTION>
+<FILE>hb-font</FILE>
+hb_font_add_glyph_origin_for_direction
+hb_font_create
+hb_font_create_sub_font
+hb_font_destroy
+hb_font_funcs_create
+hb_font_funcs_destroy
+hb_font_funcs_get_empty
+hb_font_funcs_get_user_data
+hb_font_funcs_is_immutable
+hb_font_funcs_make_immutable
+hb_font_funcs_reference
+hb_font_funcs_set_glyph_contour_point_func
+hb_font_funcs_set_glyph_extents_func
+hb_font_funcs_set_glyph_from_name_func
+hb_font_funcs_set_glyph_h_advance_func
+hb_font_funcs_set_glyph_h_advances_func
+hb_font_funcs_set_glyph_h_origin_func
+hb_font_funcs_set_glyph_name_func
+hb_font_funcs_set_glyph_v_advance_func
+hb_font_funcs_set_glyph_v_advances_func
+hb_font_funcs_set_glyph_v_origin_func
+hb_font_funcs_set_nominal_glyph_func
+hb_font_funcs_set_nominal_glyphs_func
+hb_font_funcs_set_user_data
+hb_font_funcs_set_variation_glyph_func
+hb_font_funcs_t
+hb_font_get_empty
+hb_font_get_face
+hb_font_get_glyph
+hb_font_get_glyph_advance_for_direction
+hb_font_get_glyph_advance_func_t
+hb_font_get_glyph_advances_for_direction
+hb_font_get_glyph_advances_func_t
+hb_font_get_glyph_contour_point
+hb_font_get_glyph_contour_point_for_origin
+hb_font_get_glyph_contour_point_func_t
+hb_font_get_glyph_extents
+hb_font_get_glyph_extents_for_origin
+hb_font_get_glyph_extents_func_t
+hb_font_get_glyph_from_name
+hb_font_get_glyph_from_name_func_t
+hb_font_get_glyph_h_advance
+hb_font_get_glyph_h_advance_func_t
+hb_font_get_glyph_h_advances
+hb_font_get_glyph_h_advances_func_t
+hb_font_get_glyph_h_origin
+hb_font_get_glyph_h_origin_func_t
+hb_font_get_glyph_name
+hb_font_get_glyph_name_func_t
+hb_font_get_glyph_origin_for_direction
+hb_font_get_glyph_origin_func_t
+hb_font_get_glyph_v_advance
+hb_font_get_glyph_v_advance_func_t
+hb_font_get_glyph_v_advances
+hb_font_get_glyph_v_advances_func_t
+hb_font_get_glyph_v_origin
+hb_font_get_glyph_v_origin_func_t
+hb_font_get_nominal_glyph
+hb_font_get_nominal_glyph_func_t
+hb_font_get_nominal_glyphs
+hb_font_get_nominal_glyphs_func_t
+hb_font_get_parent
+hb_font_get_ppem
+hb_font_get_ptem
+hb_font_get_scale
+hb_font_get_user_data
+hb_font_get_variation_glyph
+hb_font_get_variation_glyph_func_t
+hb_font_get_var_coords_normalized
+hb_font_glyph_from_string
+hb_font_glyph_to_string
+hb_font_is_immutable
+hb_font_make_immutable
+hb_font_reference
+hb_font_set_face
+hb_font_set_funcs
+hb_font_set_funcs_data
+hb_font_set_parent
+hb_font_set_ppem
+hb_font_set_ptem
+hb_font_set_scale
+hb_font_set_user_data
+hb_variation_t
+hb_variation_from_string
+hb_variation_to_string
+hb_font_set_variations
+hb_font_set_var_coords_design
+hb_font_set_var_coords_normalized
+hb_font_subtract_glyph_origin_for_direction
+hb_font_t
+hb_reference_table_func_t
+hb_font_funcs_set_font_h_extents_func
+hb_font_funcs_set_font_v_extents_func
+hb_font_get_extents_for_direction
+hb_font_get_font_extents_func_t
+hb_font_get_font_h_extents_func_t
+hb_font_get_font_v_extents_func_t
+hb_font_get_h_extents
+hb_font_get_v_extents
+</SECTION>
+
+<SECTION>
+<FILE>hb-ft</FILE>
+hb_ft_face_create
+hb_ft_face_create_cached
+hb_ft_face_create_referenced
+hb_ft_font_create
+hb_ft_font_create_referenced
+hb_ft_font_changed
+hb_ft_font_get_face
+hb_ft_font_set_load_flags
+hb_ft_font_get_load_flags
+hb_ft_font_set_funcs
+</SECTION>
+
+<SECTION>
+<FILE>hb-glib</FILE>
+hb_glib_get_unicode_funcs
+hb_glib_script_from_script
+hb_glib_script_to_script
+hb_glib_blob_create
+</SECTION>
+
+<SECTION>
+<FILE>hb-gobject</FILE>
+HB_GOBJECT_TYPE_BLOB
+HB_GOBJECT_TYPE_BUFFER
+HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE
+HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS
+HB_GOBJECT_TYPE_BUFFER_FLAGS
+HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS
+HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT
+HB_GOBJECT_TYPE_DIRECTION
+HB_GOBJECT_TYPE_FACE
+HB_GOBJECT_TYPE_FONT
+HB_GOBJECT_TYPE_FONT_FUNCS
+HB_GOBJECT_TYPE_GLYPH_FLAGS
+HB_GOBJECT_TYPE_MAP
+HB_GOBJECT_TYPE_MEMORY_MODE
+HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS
+HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS
+HB_GOBJECT_TYPE_OT_MATH_CONSTANT
+HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART
+HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS
+HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT
+HB_GOBJECT_TYPE_OT_MATH_KERN
+HB_GOBJECT_TYPE_SCRIPT
+HB_GOBJECT_TYPE_SHAPE_PLAN
+HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS
+HB_GOBJECT_TYPE_UNICODE_FUNCS
+HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY
+HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL
+HB_GOBJECT_TYPE_FEATURE
+HB_GOBJECT_TYPE_GLYPH_INFO
+HB_GOBJECT_TYPE_GLYPH_POSITION
+HB_GOBJECT_TYPE_SEGMENT_PROPERTIES
+HB_GOBJECT_TYPE_SET
+HB_GOBJECT_TYPE_USER_DATA_KEY
+hb_gobject_blob_get_type
+hb_gobject_buffer_content_type_get_type
+hb_gobject_buffer_diff_flags_get_type
+hb_gobject_buffer_flags_get_type
+hb_gobject_buffer_get_type
+hb_gobject_buffer_serialize_flags_get_type
+hb_gobject_buffer_serialize_format_get_type
+hb_gobject_direction_get_type
+hb_gobject_face_get_type
+hb_gobject_font_funcs_get_type
+hb_gobject_font_get_type
+hb_gobject_glyph_flags_get_type
+hb_gobject_map_get_type
+hb_gobject_memory_mode_get_type
+hb_gobject_ot_color_palette_flags_get_type
+hb_gobject_ot_layout_glyph_class_get_type
+hb_gobject_ot_math_constant_get_type
+hb_gobject_ot_math_glyph_part_get_type
+hb_gobject_ot_math_glyph_part_flags_get_type
+hb_gobject_ot_math_glyph_variant_get_type
+hb_gobject_ot_math_kern_get_type
+hb_gobject_script_get_type
+hb_gobject_shape_plan_get_type
+hb_gobject_unicode_combining_class_get_type
+hb_gobject_unicode_funcs_get_type
+hb_gobject_unicode_general_category_get_type
+hb_gobject_buffer_cluster_level_get_type
+hb_gobject_feature_get_type
+hb_gobject_glyph_info_get_type
+hb_gobject_glyph_position_get_type
+hb_gobject_segment_properties_get_type
+hb_gobject_set_get_type
+hb_gobject_user_data_key_get_type
+<SUBSECTION Private>
+HB_GOBJECT_H_IN
+</SECTION>
+
+<SECTION>
+<FILE>hb-graphite2</FILE>
+HB_GRAPHITE2_TAG_SILF
+hb_graphite2_face_get_gr_face
+hb_graphite2_font_get_gr_font
+</SECTION>
+
+<SECTION>
+<FILE>hb-icu</FILE>
+hb_icu_get_unicode_funcs
+hb_icu_script_from_script
+hb_icu_script_to_script
+</SECTION>
+
+<SECTION>
+<FILE>hb-map</FILE>
+HB_MAP_VALUE_INVALID
+hb_map_allocation_successful
+hb_map_clear
+hb_map_create
+hb_map_del
+hb_map_destroy
+hb_map_get
+hb_map_get_empty
+hb_map_get_population
+hb_map_get_user_data
+hb_map_has
+hb_map_is_empty
+hb_map_reference
+hb_map_set
+hb_map_set_user_data
+hb_map_t
+</SECTION>
+
+<SECTION>
+<FILE>hb-ot-color</FILE>
+hb_color_t
+HB_COLOR
+hb_color_get_alpha
+hb_color_get_blue
+hb_color_get_green
+hb_color_get_red
+hb_ot_color_glyph_get_layers
+hb_ot_color_glyph_reference_png
+hb_ot_color_glyph_reference_svg
+hb_ot_color_has_layers
+hb_ot_color_has_palettes
+hb_ot_color_has_png
+hb_ot_color_has_svg
+hb_ot_color_layer_t
+hb_ot_color_palette_color_get_name_id
+hb_ot_color_palette_flags_t
+hb_ot_color_palette_get_colors
+hb_ot_color_palette_get_count
+hb_ot_color_palette_get_flags
+hb_ot_color_palette_get_name_id
+</SECTION>
+
+<SECTION>
+<FILE>hb-ot-font</FILE>
+hb_ot_font_set_funcs
+</SECTION>
+
+<SECTION>
+<FILE>hb-ot-name</FILE>
+hb_ot_name_id_t
+HB_OT_NAME_ID_INVALID
+hb_ot_name_entry_t
+hb_ot_name_list_names
+hb_ot_name_get_utf16
+hb_ot_name_get_utf32
+hb_ot_name_get_utf8
+</SECTION>
+
+<SECTION>
+<FILE>hb-ot-layout</FILE>
+HB_OT_MAX_TAGS_PER_LANGUAGE
+HB_OT_MAX_TAGS_PER_SCRIPT
+HB_OT_TAG_DEFAULT_LANGUAGE
+HB_OT_TAG_DEFAULT_SCRIPT
+hb_ot_tag_to_language
+hb_ot_tag_to_script
+hb_ot_tags_from_script_and_language
+hb_ot_tags_to_script_and_language
+HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX
+HB_OT_LAYOUT_NO_FEATURE_INDEX
+HB_OT_LAYOUT_NO_SCRIPT_INDEX
+HB_OT_LAYOUT_NO_VARIATIONS_INDEX
+HB_OT_TAG_BASE
+HB_OT_TAG_GDEF
+HB_OT_TAG_GPOS
+HB_OT_TAG_GSUB
+HB_OT_TAG_JSTF
+hb_ot_layout_collect_lookups
+hb_ot_layout_collect_features
+hb_ot_layout_feature_get_characters
+hb_ot_layout_feature_get_lookups
+hb_ot_layout_feature_get_name_ids
+hb_ot_layout_feature_with_variations_get_lookups
+hb_ot_layout_get_attach_points
+hb_ot_layout_get_glyph_class
+hb_ot_layout_get_glyphs_in_class
+hb_ot_layout_get_ligature_carets
+hb_ot_layout_get_size_params
+hb_ot_layout_glyph_class_t
+hb_ot_layout_glyph_sequence_func_t
+hb_ot_layout_has_glyph_classes
+hb_ot_layout_has_positioning
+hb_ot_layout_has_substitution
+hb_ot_layout_language_find_feature
+hb_ot_layout_language_get_feature_indexes
+hb_ot_layout_language_get_feature_tags
+hb_ot_layout_language_get_required_feature
+hb_ot_layout_lookup_collect_glyphs
+hb_ot_layout_lookup_substitute_closure
+hb_ot_layout_lookups_substitute_closure
+hb_ot_layout_lookup_would_substitute
+hb_ot_layout_script_find_language
+hb_ot_layout_script_get_language_tags
+hb_ot_layout_script_select_language
+hb_ot_layout_table_find_feature_variations
+hb_ot_layout_table_get_feature_tags
+hb_ot_layout_table_get_script_tags
+hb_ot_layout_table_get_lookup_count
+hb_ot_layout_table_select_script
+hb_ot_shape_plan_collect_lookups
+hb_ot_layout_language_get_required_feature_index
+<SUBSECTION Private>
+Xhb_ot_layout_lookup_enumerate_sequences
+Xhb_ot_layout_lookup_position
+Xhb_ot_layout_lookup_substitute
+</SECTION>
+
+<SECTION>
+<FILE>hb-ot-math</FILE>
+HB_OT_TAG_MATH
+HB_OT_MATH_SCRIPT
+hb_ot_math_constant_t
+hb_ot_math_kern_t
+hb_ot_math_glyph_variant_t
+hb_ot_math_glyph_part_flags_t
+hb_ot_math_glyph_part_t
+hb_ot_math_has_data
+hb_ot_math_get_constant
+hb_ot_math_get_glyph_italics_correction
+hb_ot_math_get_glyph_top_accent_attachment
+hb_ot_math_get_glyph_kerning
+hb_ot_math_is_glyph_extended_shape
+hb_ot_math_get_glyph_variants
+hb_ot_math_get_min_connector_overlap
+hb_ot_math_get_glyph_assembly
+</SECTION>
+
+<SECTION>
+<FILE>hb-ot-shape</FILE>
+hb_ot_shape_glyphs_closure
+</SECTION>
+
+<SECTION>
+<FILE>hb-ot-var</FILE>
+HB_OT_TAG_VAR_AXIS_ITALIC
+HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE
+HB_OT_TAG_VAR_AXIS_SLANT
+HB_OT_TAG_VAR_AXIS_WEIGHT
+HB_OT_TAG_VAR_AXIS_WIDTH
+hb_ot_var_has_data
+hb_ot_var_axis_flags_t
+hb_ot_var_axis_info_t
+hb_ot_var_find_axis_info
+hb_ot_var_get_axis_count
+hb_ot_var_get_axis_infos
+hb_ot_var_get_named_instance_count
+hb_ot_var_named_instance_get_subfamily_name_id
+hb_ot_var_named_instance_get_postscript_name_id
+hb_ot_var_named_instance_get_design_coords
+hb_ot_var_normalize_variations
+hb_ot_var_normalize_coords
+</SECTION>
+
+<SECTION>
+<FILE>hb-set</FILE>
+HB_SET_VALUE_INVALID
+hb_set_add
+hb_set_add_range
+hb_set_allocation_successful
+hb_set_clear
+hb_set_create
+hb_set_del
+hb_set_del_range
+hb_set_destroy
+hb_set_get_empty
+hb_set_get_max
+hb_set_get_min
+hb_set_get_population
+hb_set_get_user_data
+hb_set_has
+hb_set_intersect
+hb_set_is_empty
+hb_set_is_equal
+hb_set_is_subset
+hb_set_next
+hb_set_next_range
+hb_set_previous
+hb_set_previous_range
+hb_set_reference
+hb_set_set
+hb_set_set_user_data
+hb_set_subtract
+hb_set_symmetric_difference
+hb_set_t
+hb_set_union
+</SECTION>
+
+<SECTION>
+<FILE>hb-shape</FILE>
+HB_FEATURE_GLOBAL_END
+HB_FEATURE_GLOBAL_START
+hb_feature_t
+hb_feature_from_string
+hb_feature_to_string
+hb_shape
+hb_shape_full
+hb_shape_list_shapers
+</SECTION>
+
+<SECTION>
+<FILE>hb-shape-plan</FILE>
+hb_shape_plan_create
+hb_shape_plan_create_cached
+hb_shape_plan_create2
+hb_shape_plan_create_cached2
+hb_shape_plan_destroy
+hb_shape_plan_execute
+hb_shape_plan_get_empty
+hb_shape_plan_get_shaper
+hb_shape_plan_get_user_data
+hb_shape_plan_reference
+hb_shape_plan_set_user_data
+hb_shape_plan_t
+</SECTION>
+
+<SECTION>
+<FILE>hb-unicode</FILE>
+HB_UNICODE_MAX
+hb_unicode_combining_class
+hb_unicode_combining_class_func_t
+hb_unicode_combining_class_t
+hb_unicode_compose
+hb_unicode_compose_func_t
+hb_unicode_decompose
+hb_unicode_decompose_func_t
+hb_unicode_funcs_create
+hb_unicode_funcs_destroy
+hb_unicode_funcs_get_default
+hb_unicode_funcs_get_empty
+hb_unicode_funcs_get_parent
+hb_unicode_funcs_get_user_data
+hb_unicode_funcs_is_immutable
+hb_unicode_funcs_make_immutable
+hb_unicode_funcs_reference
+hb_unicode_funcs_set_combining_class_func
+hb_unicode_funcs_set_compose_func
+hb_unicode_funcs_set_decompose_func
+hb_unicode_funcs_set_general_category_func
+hb_unicode_funcs_set_mirroring_func
+hb_unicode_funcs_set_script_func
+hb_unicode_funcs_set_user_data
+hb_unicode_funcs_t
+hb_unicode_general_category
+hb_unicode_general_category_func_t
+hb_unicode_general_category_t
+hb_unicode_mirroring
+hb_unicode_mirroring_func_t
+hb_unicode_script
+hb_unicode_script_func_t
+</SECTION>
+
+<SECTION>
+<FILE>hb-uniscribe</FILE>
+hb_uniscribe_font_get_hfont
+hb_uniscribe_font_get_logfontw
+<SUBSECTION Private>
+hb_directwrite_shape_experimental_width
+</SECTION>
+
+<SECTION>
+<FILE>hb-version</FILE>
+HB_VERSION_ATLEAST
+HB_VERSION_MAJOR
+HB_VERSION_MICRO
+HB_VERSION_MINOR
+HB_VERSION_STRING
+hb_version
+hb_version_atleast
+hb_version_string
+</SECTION>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/harfbuzz.types b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/harfbuzz.types
new file mode 100644
index 0000000..bd87111
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/harfbuzz.types
@@ -0,0 +1,36 @@
+hb_gobject_aat_layout_feature_selector_get_type
+hb_gobject_aat_layout_feature_type_get_type
+hb_gobject_blob_get_type
+hb_gobject_buffer_cluster_level_get_type
+hb_gobject_buffer_content_type_get_type
+hb_gobject_buffer_diff_flags_get_type
+hb_gobject_buffer_flags_get_type
+hb_gobject_buffer_get_type
+hb_gobject_buffer_serialize_flags_get_type
+hb_gobject_buffer_serialize_format_get_type
+hb_gobject_direction_get_type
+hb_gobject_face_get_type
+hb_gobject_feature_get_type
+hb_gobject_font_funcs_get_type
+hb_gobject_font_get_type
+hb_gobject_glyph_flags_get_type
+hb_gobject_glyph_info_get_type
+hb_gobject_glyph_position_get_type
+hb_gobject_map_get_type
+hb_gobject_memory_mode_get_type
+hb_gobject_ot_color_palette_flags_get_type
+hb_gobject_ot_layout_glyph_class_get_type
+hb_gobject_ot_math_constant_get_type
+hb_gobject_ot_math_glyph_part_flags_get_type
+hb_gobject_ot_math_glyph_part_get_type
+hb_gobject_ot_math_glyph_variant_get_type
+hb_gobject_ot_math_kern_get_type
+hb_gobject_ot_var_axis_flags_get_type
+hb_gobject_script_get_type
+hb_gobject_segment_properties_get_type
+hb_gobject_set_get_type
+hb_gobject_shape_plan_get_type
+hb_gobject_unicode_combining_class_get_type
+hb_gobject_unicode_funcs_get_type
+hb_gobject_unicode_general_category_get_type
+hb_gobject_user_data_key_get_type
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/HarfBuzz.png b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/HarfBuzz.png
new file mode 100644
index 0000000..771d955
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/HarfBuzz.png
Binary files differ
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/HarfBuzz.svg b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/HarfBuzz.svg
new file mode 100644
index 0000000..4e2df25
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/HarfBuzz.svg
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   width="682.66669"
+   height="682.66669"
+   viewBox="0 0 682.66669 682.66669"
+   sodipodi:docname="harfbuzz2.svg"
+   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
+   inkscape:export-filename="harfbuzz2.png"
+   inkscape:export-xdpi="72"
+   inkscape:export-ydpi="72">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6">
+    <g
+       id="g50">
+      <symbol
+         id="glyph0-0"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path26"
+           d="M 32,0 V -192 H 224 V 0 Z M 48,-16 H 208 V -176 H 48 Z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-1"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path29"
+           d="m 52.5,-64.875 c -0.08594,2.25 -0.9375,6.335938 -2.5625,12.25 -1.625,5.917969 -3.75,12.375 -6.375,19.375 -2.625,7 -4.9375,12.292969 -6.9375,15.875 -2,3.585938 -4.1875,6.3125 -6.5625,8.1875 -2.375,1.875 -6.210938,3.585938 -11.5,5.125 -5.292969,1.542969 -9.542969,2.585938 -12.75,3.125 -3.210938,0.542969 -5.230469,0.8125 -6.0625,0.8125 -0.832031,-0.082031 -1.332031,-0.414062 -1.5,-1 -0.164062,-0.582031 0.085938,-1.332031 0.75,-2.25 0.9179688,-1.414062 3.226562,-3.269531 6.9375,-5.5625 3.707031,-2.289062 8.019531,-5.164062 12.9375,-8.625 4.914062,-3.457031 8.414062,-6.476562 10.5,-9.0625 2.082031,-2.582031 4.4375,-6.457031 7.0625,-11.625 2.625,-5.164062 5,-10.375 7.125,-15.625 2.125,-5.25 3.644531,-8.832031 4.5625,-10.75 0.914062,-1.914062 1.914062,-2.832031 3,-2.75 0.914062,0.167969 1.375,1 1.375,2.5 z M 41.75,-117.75 c 0,-1.83203 1.5625,-5.8125 4.6875,-11.9375 3.125,-6.125 5.144531,-9.1875 6.0625,-9.1875 1.832031,-0.75 4.5,0.64844 8,4.1875 3.5,3.54297 5.375,6.3125 5.625,8.3125 0,2.66797 -1.460938,6.5 -4.375,11.5 -2.917969,5 -5.042969,7.5 -6.375,7.5 -0.5,-0.25 -2.230469,-1.35156 -5.1875,-3.3125 -2.960938,-1.95703 -5.148438,-3.4375 -6.5625,-4.4375 -1.25,-0.83203 -1.875,-1.70703 -1.875,-2.625 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-2"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path32"
+           d="m 19.75,-47.125 c -0.167969,3.167969 -0.5,6.023438 -1,8.5625 -0.5,2.542969 -1.167969,4.710938 -2,6.5 -0.835938,1.792969 -1.898438,3.125 -3.1875,4 -1.292969,0.875 -2.855469,1.1875 -4.6875,0.9375 0.082031,-6.5 0.769531,-15.5625 2.0625,-27.1875 1.289062,-11.625 3.226562,-24.476562 5.8125,-38.5625 1.332031,-4.082031 4.039062,-11.28906 8.125,-21.625 0.414062,-1 0.851562,-1.41406 1.3125,-1.25 0.457031,0.16797 0.6875,0.58594 0.6875,1.25 -0.25,5.08594 -1.292969,14.792969 -3.125,29.125 -1.835938,14.335938 -2.960938,24.167969 -3.375,29.5 -0.417969,5.335938 -0.625,8.25 -0.625,8.75 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-3"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path35"
+           d="m -10.875,-27.25 c 1.667969,-7.164062 3.5625,-12.457031 5.6875,-15.875 2.125,-3.414062 3.855469,-5.289062 5.1875,-5.625 v 5.5 c 0,7 1.875,11.875 5.625,14.625 2.25,1.5 4.5,2 6.75,1.5 2.25,-0.5 3.976562,-1.664062 5.1875,-3.5 1.207031,-1.832031 2.226562,-3.976562 3.0625,-6.4375 0.832031,-2.457031 1.625,-3.6875 2.375,-3.6875 0.914062,0 1.289062,0.875 1.125,2.625 -0.08594,3 -1.023438,7.875 -2.8125,14.625 C 19.519531,-16.75 17.082031,-11.207031 14,-6.875 10.914062,-2.539062 7.164062,-0.25 2.75,0 c -4.5,-0.164062 -8,-2.707031 -10.5,-7.625 -2.25,-4.832031 -3.289062,-11.082031 -3.125,-18.75 z m 6.625,111.5 c 0,-1.835938 1.5625,-5.8125 4.6875,-11.9375 3.125,-6.125 5.144531,-9.1875 6.0625,-9.1875 1.832031,-0.75 4.5,0.644531 8,4.1875 3.5,3.539062 5.375,6.3125 5.625,8.3125 0,2.664062 -1.460938,6.5 -4.375,11.5 -2.917969,5 -5.042969,7.5 -6.375,7.5 C 8.875,94.375 7.144531,93.269531 4.1875,91.3125 1.226562,89.351562 -0.957031,87.875 -2.375,86.875 -3.625,86.039062 -4.25,85.164062 -4.25,84.25 Z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-4"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path38"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-5"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path41"
+           d="m 118.5,-33 c 15.33203,-3.914062 27.375,-8.289062 36.125,-13.125 7.5,-4.082031 11.25,-7.5 11.25,-10.25 0,-0.832031 -0.5625,-1.894531 -1.6875,-3.1875 -1.125,-1.289062 -1.9375,-1.9375 -2.4375,-1.9375 -0.83594,0 -2.02344,0.148438 -3.5625,0.4375 -1.54297,0.292969 -2.64844,0.4375 -3.3125,0.4375 -2.91797,0 -4.98047,-0.769531 -6.1875,-2.3125 -1.21094,-1.539062 -1.8125,-3.601562 -1.8125,-6.1875 0,-1.5 2.16406,-6.539062 6.5,-15.125 1.66406,-3.414062 3.0625,-5.8125 4.1875,-7.1875 1.125,-1.375 2.76953,-2.0625 4.9375,-2.0625 3.58203,0 6.91406,1.9375 10,5.8125 3.08203,3.875 4.625,8.855469 4.625,14.9375 0,6 -0.8125,11.4375 -2.4375,16.3125 -1.625,4.875 -4.14844,9.605469 -7.5625,14.1875 -3.41797,4.585938 -7.83594,9.042969 -13.25,13.375 -8.08594,6.085938 -17.625,11.230469 -28.625,15.4375 -11,4.210938 -23.83594,7.5 -38.5,9.875 C 72.082031,-1.1875 58.082031,0 44.75,0 37.082031,0 30.082031,-0.375 23.75,-1.125 17.414062,-1.875 12.582031,-3.289062 9.25,-5.375 3.082031,-8.789062 0.25,-14.5 0.75,-22.5 c 0.332031,-4.082031 0.832031,-8.4375 1.5,-13.0625 0.664062,-4.625 1.351562,-8.3125 2.0625,-11.0625 0.707031,-2.75 1.5625,-4.125 2.5625,-4.125 0.832031,0 1.332031,1.75 1.5,5.25 0.164062,3.5 0.6875,6.0625 1.5625,7.6875 0.875,1.625 2.207031,3 4,4.125 1.789062,1.125 4.6875,2.210938 8.6875,3.25 4,1.042969 8.6875,1.855469 14.0625,2.4375 5.375,0.585938 12.519531,0.875 21.4375,0.875 12.414062,0 23.019531,-0.4375 31.8125,-1.3125 C 98.726562,-29.3125 108.25,-30.832031 118.5,-33 Z m -38.75,-86.75 c 0,-1.83203 1.5625,-5.8125 4.6875,-11.9375 3.125,-6.125 5.144531,-9.1875 6.0625,-9.1875 1.832031,-0.75 4.5,0.64844 8,4.1875 3.5,3.54297 5.375,6.3125 5.625,8.3125 0,2.66797 -1.46094,6.5 -4.375,11.5 -2.917969,5 -5.042969,7.5 -6.375,7.5 -0.5,-0.25 -2.230469,-1.35156 -5.1875,-3.3125 -2.960938,-1.95703 -5.148438,-3.4375 -6.5625,-4.4375 -1.25,-0.83203 -1.875,-1.70703 -1.875,-2.625 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-6"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path44"
+           d="m 78,-56.875 c -1.335938,2.25 -2.25,3.875 -2.75,4.875 -1.417969,2.335938 -2.875,4.210938 -4.375,5.625 -1.75,1.75 -4.042969,3.292969 -6.875,4.625 -6.085938,2.917969 -10.460938,5.75 -13.125,8.5 -1.75,1.75 -3.792969,4.960938 -6.125,9.625 -4.25,8.585938 -8.417969,14.292969 -12.5,17.125 -4.085938,2.917969 -11.417969,5 -22,6.25 C 9.414062,-0.0820312 8.414062,0 7.25,0 H 4.375 c -1.5,0 -2.25,-0.164062 -2.25,-0.5 0,-1.914062 2.539062,-4.5 7.625,-7.75 4,-2.414062 7,-4.207031 9,-5.375 6,-3.414062 10.414062,-6.125 13.25,-8.125 4,-2.914062 6.625,-5.75 7.875,-8.5 4.164062,-8.5 7.625,-14.414062 10.375,-17.75 3.082031,-3.664062 6.625,-6.5 10.625,-8.5 C 67.289062,-60.082031 71,-62.207031 72,-62.875 l 10,2.375 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-7"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path47"
+           d="m 13,-17.625 c -1,1.75 -2.0625,3.480469 -3.1875,5.1875 C 8.6875,-10.726562 7.539062,-9.082031 6.375,-7.5 5.207031,-5.914062 4.0625,-4.476562 2.9375,-3.1875 1.8125,-1.894531 0.832031,-0.832031 0,0 c -0.5,-2.582031 -0.832031,-5.125 -1,-7.625 -0.164062,-2.5 0.167969,-5.039062 1,-7.625 1.25,-0.75 2.207031,-1.414062 2.875,-2 1.664062,-1.5 5.375,-6.582031 11.125,-15.25 -0.667969,-0.664062 -2.585938,-1.601562 -5.75,-2.8125 -3.167969,-1.207031 -6.167969,-1.894531 -9,-2.0625 -2.582031,-0.164062 -4.726562,0.3125 -6.4375,1.4375 -1.707031,1.125 -3.25,2.710938 -4.625,4.75 -1.375,2.042969 -2.5625,2.980469 -3.5625,2.8125 -0.332031,-0.164062 -0.375,-0.851562 -0.125,-2.0625 0.25,-1.207031 0.625,-2.394531 1.125,-3.5625 2.085938,-4.832031 4.480469,-8.4375 7.1875,-10.8125 2.710938,-2.375 5.9375,-3.5625 9.6875,-3.5625 2.75,0 6.164062,0.667969 10.25,2 2.582031,0.917969 4.789062,1.375 6.625,1.375 3.832031,0 7.625,-1.375 11.375,-4.125 0.832031,0 1.125,0.542969 0.875,1.625 -0.25,1.085938 -0.605469,2.355469 -1.0625,3.8125 -0.460938,1.460938 -0.773438,2.4375 -0.9375,2.9375 -0.835938,2.585938 -1.5,4.085938 -2,4.5 -0.5,0.417969 -1.960938,1.5 -4.375,3.25 -1.335938,1 -2.480469,2.148438 -3.4375,3.4375 -0.960938,1.292969 -1.9375,2.835938 -2.9375,4.625 -1,1.792969 -2.292969,4.230469 -3.875,7.3125 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+    </g>
+    <g
+       id="g184">
+      <symbol
+         id="glyph0-0-3"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path163"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-1-6"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path166"
+           d="m 79.625,-103.25 c -3.585938,22 -6.8125,38.417969 -9.6875,49.25 -2.875,10.835938 -5.480469,19.105469 -7.8125,24.8125 -2.335938,5.710938 -4.898438,10.0625 -7.6875,13.0625 -2.792969,3 -7.917969,5.855469 -15.375,8.5625 -7.460938,2.710938 -13.6875,4.605469 -18.6875,5.6875 -5,1.085938 -8.125,1.667969 -9.375,1.75 C 9.75,-0.207031 8.957031,-0.4375 8.625,-0.8125 8.289062,-1.1875 8.582031,-2.082031 9.5,-3.5 c 1.582031,-2.25 4.894531,-5.332031 9.9375,-9.25 5.039062,-3.914062 11,-8.789062 17.875,-14.625 6.875,-5.832031 12.019531,-10.976562 15.4375,-15.4375 3.414062,-4.457031 6.4375,-10.539062 9.0625,-18.25 C 64.4375,-68.769531 67,-76.832031 69.5,-85.25 c 2.5,-8.414062 4.3125,-14.125 5.4375,-17.125 1.125,-3 2.269531,-4.45703 3.4375,-4.375 1.332031,0.25 1.75,1.41797 1.25,3.5 z m 8.875,-68.625 c 0.664062,2.41797 0.644531,4.91797 -0.0625,7.5 -0.710938,2.58594 -2.023438,5.29297 -3.9375,8.125 -1.167969,1.91797 -2.398438,3.64844 -3.6875,5.1875 -1.292969,1.54297 -2.648438,3.02344 -4.0625,4.4375 -0.417969,0.5 -1.085938,1.125 -2,1.875 -0.917969,0.75 -1.875,1.46094 -2.875,2.125 -1,0.66797 -1.960938,1.14844 -2.875,1.4375 -0.917969,0.29297 -1.585938,0.1875 -2,-0.3125 -3,-2.41406 -5.960938,-4.875 -8.875,-7.375 -2.917969,-2.5 -6.125,-4.83203 -9.625,-7 -0.585938,-0.41406 -0.855469,-0.8125 -0.8125,-1.1875 0.03906,-0.375 0.269531,-0.9375 0.6875,-1.6875 l 20,-30.5 c 0.582031,-0.83203 1.164062,-1.22656 1.75,-1.1875 0.582031,0.043 1.207031,0.27344 1.875,0.6875 1.75,1 3.5,2.125 5.25,3.375 1.75,1.25 3.375,2.60547 4.875,4.0625 1.5,1.46094 2.8125,3.04297 3.9375,4.75 1.125,1.71094 1.9375,3.60547 2.4375,5.6875 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-2-7"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path169"
+           d="m 29.625,-70.625 c -0.667969,8.335938 -2.542969,15.417969 -5.625,21.25 -3.085938,5.835938 -6.585938,8.75 -10.5,8.75 0,-3.164062 1.019531,-13 3.0625,-29.5 2.039062,-16.5 3.582031,-28.3125 4.625,-35.4375 1.039062,-7.125 2.226562,-14.6875 3.5625,-22.6875 1.332031,-8 2.625,-14.45703 3.875,-19.375 1.414062,-4.08203 2.9375,-8.20703 4.5625,-12.375 1.625,-4.16406 3.3125,-8.28906 5.0625,-12.375 1.164062,-1.83203 1.914062,-1.53906 2.25,0.875 -2.085938,13.83594 -4,28.1875 -5.75,43.0625 -1.75,14.875 -2.9375,25.52344 -3.5625,31.9375 -0.625,6.417969 -0.9375,10.167969 -0.9375,11.25 -0.417969,6.835938 -0.625,11.710938 -0.625,14.625 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-3-5"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path172"
+           d="m -16.125,-40.625 c 1.25,-5.332031 2.625,-10 4.125,-14 1.5,-4 2.960938,-7.3125 4.375,-9.9375 1.417969,-2.625 2.792969,-4.644531 4.125,-6.0625 1.335938,-1.414062 2.5,-2.25 3.5,-2.5 v 8.25 c 0,10.5 2.789062,17.835938 8.375,22 3.414062,2.25 6.8125,3 10.1875,2.25 3.375,-0.75 5.957031,-2.5 7.75,-5.25 1.789062,-2.75 3.3125,-5.976562 4.5625,-9.6875 1.25,-3.707031 2.457031,-5.5625 3.625,-5.5625 1.332031,0 1.875,1.335938 1.625,4 -0.08594,4.5 -1.480469,11.8125 -4.1875,21.9375 -2.710938,10.125 -6.375,18.4375 -11,24.9375 -4.625,6.5 -10.230469,9.917969 -16.8125,10.25 -6.75,-0.25 -12,-4.039062 -15.75,-11.375 -3.414062,-7.25 -4.914062,-16.625 -4.5,-28.125 z M 28.5,82.125 c 0.664062,2.414062 0.644531,4.914062 -0.0625,7.5 -0.710938,2.582031 -2.023438,5.289062 -3.9375,8.125 -1.167969,1.914062 -2.398438,3.64453 -3.6875,5.1875 -1.292969,1.53906 -2.648438,3.01953 -4.0625,4.4375 -0.417969,0.5 -1.085938,1.125 -2,1.875 -0.917969,0.75 -1.875,1.45703 -2.875,2.125 -1,0.66406 -1.960938,1.14453 -2.875,1.4375 C 8.082031,113.10156 7.414062,113 7,112.5 c -3,-2.41797 -5.960938,-4.875 -8.875,-7.375 -2.914062,-2.5 -6.125,-4.83594 -9.625,-7 -0.582031,-0.417969 -0.851562,-0.8125 -0.8125,-1.1875 0.04297,-0.375 0.273438,-0.9375 0.6875,-1.6875 l 20,-30.5 c 0.582031,-0.835938 1.164062,-1.230469 1.75,-1.1875 0.582031,0.03906 1.207031,0.269531 1.875,0.6875 1.75,1 3.5,2.125 5.25,3.375 1.75,1.25 3.375,2.601562 4.875,4.0625 1.5,1.457031 2.8125,3.039062 3.9375,4.75 1.125,1.707031 1.9375,3.601562 2.4375,5.6875 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-4-3"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path175"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-5-5"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path178"
+           d="M 72.125,0.125 C 58.039062,0.0390625 47.164062,-0.582031 39.5,-1.75 26.164062,-3.832031 16.664062,-7.832031 11,-13.75 5.914062,-18.332031 3.375,-24.582031 3.375,-32.5 c 0,-3.082031 0.289062,-7.5 0.875,-13.25 0.582031,-5.75 1.375,-11.5 2.375,-17.25 0.414062,-2.414062 0.789062,-4.582031 1.125,-6.5 0.25,-1.332031 0.582031,-2.414062 1,-3.25 0.414062,-0.832031 0.875,-1.3125 1.375,-1.4375 0.5,-0.125 0.976562,0.210938 1.4375,1 0.457031,0.792969 0.894531,2.148438 1.3125,4.0625 0.332031,2.085938 0.789062,4.25 1.375,6.5 1.332031,5.417969 4.957031,9.460938 10.875,12.125 15,6.417969 37.914062,9.75 68.75,10 12.75,-0.164062 24.58203,-0.625 35.5,-1.375 11.16406,-0.832031 23.75,-2.789062 37.75,-5.875 14,-3.082031 25.14453,-6.457031 33.4375,-10.125 8.28906,-3.664062 15.35156,-7.625 21.1875,-11.875 4.58203,-3.332031 6.875,-6.539062 6.875,-9.625 0,-1.25 -1.1875,-2.726562 -3.5625,-4.4375 -2.375,-1.707031 -3.9375,-2.5625 -4.6875,-2.5625 -1.41797,0.667969 -3.08594,1.1875 -5,1.5625 -1.91797,0.375 -3.66797,0.480469 -5.25,0.3125 -4.41797,-0.5 -7.71094,-1.875 -9.875,-4.125 -2.16797,-2.25 -3.25,-5.289062 -3.25,-9.125 0,-2.41406 3.20703,-10 9.625,-22.75 2.58203,-5.16406 4.85156,-8.76953 6.8125,-10.8125 1.95703,-2.03906 4.64453,-3.0625 8.0625,-3.0625 5.41406,0 10.4375,2.91797 15.0625,8.75 4.625,5.83594 6.9375,13.29297 6.9375,22.375 0,9 -1.21094,16.792969 -3.625,23.375 -3,9 -7.08594,17.335938 -12.25,25 -6.5,9.25 -13.625,16.5625 -21.375,21.9375 -7.75,5.375 -15.58594,9.648438 -23.5,12.8125 -7.08594,3.5 -16.23047,6.773438 -27.4375,9.8125 -11.21094,3.042969 -24.8125,5.523438 -40.8125,7.4375 -15.835938,1.917969 -29.960938,2.9140625 -42.375,3 z m 82.375,-172 c 0.66406,2.41797 0.64453,4.91797 -0.0625,7.5 -0.71094,2.58594 -2.02344,5.29297 -3.9375,8.125 -1.16797,1.91797 -2.39844,3.64844 -3.6875,5.1875 -1.29297,1.54297 -2.64844,3.02344 -4.0625,4.4375 -0.41797,0.5 -1.08594,1.125 -2,1.875 -0.91797,0.75 -1.875,1.46094 -2.875,2.125 -1,0.66797 -1.96094,1.14844 -2.875,1.4375 -0.91797,0.29297 -1.58594,0.1875 -2,-0.3125 -3,-2.41406 -5.96094,-4.875 -8.875,-7.375 -2.91797,-2.5 -6.125,-4.83203 -9.625,-7 -0.58594,-0.41406 -0.85547,-0.8125 -0.8125,-1.1875 0.0391,-0.375 0.26953,-0.9375 0.6875,-1.6875 l 20,-30.5 c 0.58203,-0.83203 1.16406,-1.22656 1.75,-1.1875 0.58203,0.043 1.20703,0.27344 1.875,0.6875 1.75,1 3.5,2.125 5.25,3.375 1.75,1.25 3.375,2.60547 4.875,4.0625 1.5,1.46094 2.8125,3.04297 3.9375,4.75 1.125,1.71094 1.9375,3.60547 2.4375,5.6875 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="glyph0-6-6"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path181"
+           d="m 115,-102.5 c -1.83594,3.25 -3.75,6.523438 -5.75,9.8125 -2,3.292969 -4.23047,6.398438 -6.6875,9.3125 -2.46094,2.917969 -5.167969,5.5625 -8.125,7.9375 -2.960938,2.375 -6.3125,4.273438 -10.0625,5.6875 -3.085938,1.25 -5.710938,2.648438 -7.875,4.1875 -2.167969,1.542969 -3.960938,3.1875 -5.375,4.9375 -2.167969,2.335938 -4.042969,5.5625 -5.625,9.6875 -1.585938,4.125 -3.230469,8.480469 -4.9375,13.0625 -1.710938,4.585938 -3.585938,9.0625 -5.625,13.4375 -2.042969,4.375 -4.605469,7.980469 -7.6875,10.8125 C 43,-9.125 36.707031,-6.082031 28.375,-4.5 L 5.5,-0.625 C 4.832031,-0.539062 4.019531,-0.476562 3.0625,-0.4375 2.101562,-0.394531 1.414062,-0.414062 1,-0.5 -0.914062,-1.082031 -1.5,-2.351562 -0.75,-4.3125 0,-6.269531 1.957031,-8.25 5.125,-10.25 c 6.414062,-4.25 11.539062,-7.6875 15.375,-10.3125 3.832031,-2.625 6.957031,-4.769531 9.375,-6.4375 2.414062,-1.664062 4.351562,-3.039062 5.8125,-4.125 1.457031,-1.082031 3.019531,-2.289062 4.6875,-3.625 6.75,-5.082031 11.414062,-10.414062 14,-16 1.5,-2.914062 2.875,-5.75 4.125,-8.5 1.25,-2.75 2.5625,-5.457031 3.9375,-8.125 1.375,-2.664062 2.851562,-5.3125 4.4375,-7.9375 1.582031,-2.625 3.414062,-5.269531 5.5,-7.9375 2.164062,-2.664062 5.082031,-5.269531 8.75,-7.8125 3.664062,-2.539062 8.082031,-5.0625 13.25,-7.5625 0.582031,-0.25 1.539062,-0.8125 2.875,-1.6875 1.332031,-0.875 2.95703,-2.26953 4.875,-4.1875 1.91406,-1.91406 4.10156,-4.51953 6.5625,-7.8125 2.45703,-3.28906 5.0625,-7.47656 7.8125,-12.5625 -1,-1 -3.875,-2.375 -8.625,-4.125 -4.75,-1.83203 -9.25,-2.875 -13.5,-3.125 -3.917969,-0.25 -7.148438,0.46094 -9.6875,2.125 -2.542969,1.66797 -4.855469,4.04297 -6.9375,7.125 -2.085938,3.08594 -3.875,4.5 -5.375,4.25 -0.5,-0.25 -0.585938,-1.28906 -0.25,-3.125 0.414062,-1.83203 1,-3.625 1.75,-5.375 3.164062,-7.25 6.75,-12.625 10.75,-16.125 4.082031,-3.58203 8.957031,-5.375 14.625,-5.375 4.08203,0 9.20703,1 15.375,3 3.83203,1.33594 7.125,2 9.875,2 5.75,0 11.45703,-2.03906 17.125,-6.125 1.25,0 1.6875,0.8125 1.3125,2.4375 -0.375,1.625 -0.9375,3.52344 -1.6875,5.6875 -0.66797,2.16797 -1.125,3.625 -1.375,4.375 -1.25,3.91797 -2.25,6.21094 -3,6.875 -0.75,0.58594 -2.91797,2.16797 -6.5,4.75 -2,1.5 -3.73047,3.23047 -5.1875,5.1875 -1.46094,1.96094 -2.9375,4.27344 -4.4375,6.9375 -1.5,2.66797 -3.41797,6.33594 -5.75,11 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+    </g>
+  </defs>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="2560"
+     inkscape:window-height="1471"
+     id="namedview4"
+     showgrid="false"
+     inkscape:zoom="0.59454973"
+     inkscape:cx="-165.7731"
+     inkscape:cy="361.75575"
+     inkscape:window-x="0"
+     inkscape:window-y="55"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2" />
+  <path
+     id="path871"
+     d="m 205.59223,196.11402 c -5.97657,36.66667 -11.35417,64.02995 -16.14583,82.08333 -4.79167,18.0599 -9.13412,31.84245 -13.02084,41.35417 -3.89323,9.51823 -8.16406,16.77083 -12.8125,21.77083 -4.65495,5 -13.19661,9.75912 -25.625,14.27083 -12.43489,4.51823 -22.8125,7.67579 -31.14583,9.47917 -8.333331,1.8099 -13.541664,2.77995 -15.624997,2.91667 -2.083334,-0.13672 -3.404949,-0.52084 -3.958334,-1.14584 -0.559896,-0.625 -0.07161,-2.11588 1.458334,-4.47916 2.636718,-3.75 8.157551,-8.88672 16.562497,-15.41667 8.39844,-6.52344 18.33333,-14.64844 29.79167,-24.375 11.45833,-9.72005 20.03255,-18.29427 25.72916,-25.72916 5.69011,-7.42839 10.72917,-17.56511 15.10417,-30.41667 4.375,-12.84505 8.64583,-26.28255 12.8125,-40.3125 4.16667,-14.02343 7.1875,-23.54166 9.0625,-28.54166 1.875,-5 3.78255,-7.42839 5.72916,-7.29167 2.22006,0.41667 2.91667,2.36328 2.08334,5.83333 z M 220.38389,81.739028 c 1.10677,4.02995 1.07422,8.196616 -0.10416,12.5 -1.1849,4.309899 -3.3724,8.821612 -6.5625,13.541662 -1.94662,3.19662 -3.9974,6.08074 -6.14584,8.64584 -2.15494,2.57161 -4.41406,5.03906 -6.77083,7.39583 -0.69661,0.83333 -1.8099,1.875 -3.33333,3.125 -1.52995,1.25 -3.125,2.4349 -4.79167,3.54167 -1.66666,1.11328 -3.26823,1.91406 -4.79166,2.39583 -1.52995,0.48828 -2.64323,0.3125 -3.33334,-0.52083 -5,-4.02344 -9.93489,-8.125 -14.79166,-12.29167 -4.86329,-4.16667 -10.20834,-8.05338 -16.04167,-11.66667 -0.97656,-0.6901 -1.42578,-1.35416 -1.35417,-1.97916 0.0651,-0.625 0.44922,-1.5625 1.14584,-2.8125 l 33.33333,-50.833334 c 0.97005,-1.386717 1.9401,-2.044267 2.91667,-1.979167 0.97005,0.07167 2.01171,0.455734 3.125,1.145834 2.91666,1.666666 5.83333,3.541666 8.74999,5.624999 2.91667,2.083334 5.625,4.34245 8.125,6.770833 2.5,2.4349 4.6875,5.071617 6.5625,7.916667 1.875,2.851566 3.22917,6.009116 4.0625,9.479166 z m 0,0"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
+     d="m 256.21722,250.48902 c -1.11328,13.89323 -4.23828,25.69662 -9.375,35.41667 -5.14323,9.72656 -10.97656,14.58333 -17.5,14.58333 0,-5.27344 1.69922,-21.66667 5.10417,-49.16667 3.39843,-27.49999 5.97005,-47.18749 7.70833,-59.06249 1.73177,-11.875 3.71094,-24.47917 5.9375,-37.8125 2.22005,-13.33333 4.375,-24.09505 6.45833,-32.29167 2.35677,-6.80338 4.89583,-13.67838 7.60417,-20.625 2.70833,-6.940096 5.52083,-13.815095 8.4375,-20.624995 1.9401,-3.053383 3.1901,-2.5651 3.75,1.458333 -3.47657,23.059902 -6.66667,46.979162 -9.58334,71.770832 -2.91666,24.79166 -4.89583,42.53906 -5.9375,53.22916 -1.04166,10.69662 -1.5625,16.94662 -1.5625,18.75 -0.69661,11.39323 -1.04166,19.51823 -1.04166,24.375 z m 0,0"
+     id="path875" />
+  <path
+     id="path945"
+     d="m 229.34222,300.48902 c 2.08333,-8.88672 4.375,-16.66667 6.875,-23.33333 2.5,-6.66667 4.9349,-12.1875 7.29167,-16.5625 2.36328,-4.375 4.65495,-7.74089 6.875,-10.10417 2.22656,-2.35677 4.16666,-3.75 5.83333,-4.16667 v 13.75 c 0,17.5 4.64844,29.72657 13.95833,36.66667 5.69011,3.75 11.35417,5 16.97917,3.75 5.625,-1.25 9.92838,-4.16667 12.91666,-8.75 2.98177,-4.58333 5.52084,-9.96094 7.60417,-16.14583 2.08333,-6.17839 4.09505,-9.27084 6.04167,-9.27084 2.22005,0 3.125,2.22657 2.70833,6.66667 -0.14323,7.5 -2.46745,19.6875 -6.97917,36.5625 -4.51823,16.875 -10.625,30.72916 -18.33333,41.5625 -7.70833,10.83333 -17.05078,16.52995 -28.02083,17.08333 -11.25,-0.41667 -20,-6.73177 -26.25,-18.95833 -5.6901,-12.08334 -8.1901,-27.70833 -7.5,-46.875 z"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
+     inkscape:connector-curvature="0" />
+  <path
+     id="path943"
+     d="m 286.78334,583.03989 c 1.10677,4.02343 1.07422,8.1901 -0.10416,12.5 -1.1849,4.30338 -3.3724,8.8151 -6.5625,13.54167 -1.94662,3.1901 -3.9974,6.07421 -6.14584,8.64583 -2.15495,2.5651 -4.41406,5.03255 -6.77083,7.39583 -0.69662,0.83334 -1.8099,1.875 -3.33333,3.125 -1.52995,1.25 -3.125,2.42839 -4.79167,3.54167 -1.66667,1.10677 -3.26823,1.90755 -4.79167,2.39583 -1.52994,0.48177 -2.64323,0.3125 -3.33333,-0.52083 -5,-4.02995 -9.9349,-8.125 -14.79167,-12.29167 -4.85677,-4.16666 -10.20833,-8.0599 -16.04166,-11.66666 -0.97005,-0.69662 -1.41927,-1.35417 -1.35417,-1.97917 0.0716,-0.625 0.45573,-1.5625 1.14583,-2.8125 l 33.33334,-50.83333 c 0.97005,-1.39323 1.9401,-2.05078 2.91666,-1.97917 0.97006,0.0652 2.01172,0.44922 3.125,1.14584 2.91667,1.66666 5.83334,3.54166 8.75,5.625 2.91667,2.08333 5.625,4.33593 8.125,6.77083 2.5,2.42838 4.6875,5.0651 6.5625,7.91667 1.875,2.84505 3.22917,6.00259 4.0625,9.47916 z"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
+     inkscape:connector-curvature="0" />
+  <path
+     id="path879"
+     d="M 303.71722,505.07234"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path925"
+     d="m 168.42167,500.82557 c -23.47656,-0.14323 -41.60156,-1.17838 -54.375,-3.125 -22.226562,-3.47005 -38.059894,-10.13671 -47.499997,-20 -8.476563,-7.63671 -12.708333,-18.05338 -12.708333,-31.24999 0,-5.13672 0.48177,-12.5 1.458333,-22.08334 0.970052,-9.58333 2.291667,-19.16666 3.958333,-28.75 0.690104,-4.02343 1.315104,-7.63671 1.875,-10.83333 0.416667,-2.22005 0.970052,-4.02344 1.666667,-5.41667 0.690103,-1.38671 1.458333,-2.1875 2.291666,-2.39583 0.833334,-0.20833 1.627604,0.35156 2.395834,1.66667 0.761718,1.32161 1.490885,3.58073 2.187499,6.77083 0.553385,3.47656 1.315104,7.08333 2.291667,10.83333 2.220052,9.02995 8.261718,15.76823 18.124999,20.20834 25.000002,10.69661 63.190102,16.25 114.583332,16.66666 21.25,-0.27343 40.97005,-1.04166 59.16666,-2.29166 18.60677,-1.38672 39.58333,-4.64844 62.91667,-9.79167 23.33333,-5.13672 41.90754,-10.76172 55.72916,-16.875 13.8151,-6.10677 25.58593,-12.70833 35.3125,-19.79167 7.63671,-5.55338 11.45833,-10.89843 11.45833,-16.04166 0,-2.08333 -1.97917,-4.54427 -5.9375,-7.39583 -3.95833,-2.84506 -6.5625,-4.27084 -7.8125,-4.27084 -2.36328,1.11328 -5.14323,1.97917 -8.33333,2.60417 -3.19662,0.625 -6.11328,0.80078 -8.75,0.52083 -7.36328,-0.83333 -12.85157,-3.125 -16.45833,-6.875 -3.61329,-3.75 -5.41667,-8.8151 -5.41667,-15.20833 0,-4.02343 5.34505,-16.66667 16.04167,-37.91667 4.30338,-8.60676 8.08593,-14.61588 11.35416,-18.02083 3.26172,-3.39843 7.74089,-5.10416 13.4375,-5.10416 9.02343,0 17.39583,4.86328 25.10417,14.58333 7.70833,9.72656 11.5625,22.15495 11.5625,37.29166 0,15 -2.01824,27.98828 -6.04167,38.95834 -5,14.99999 -11.8099,28.89322 -20.41667,41.66666 -10.83333,15.41667 -22.70833,27.60417 -35.62499,36.5625 -12.91667,8.95833 -25.97657,16.08073 -39.16667,21.35416 -11.8099,5.83334 -27.05078,11.28907 -45.72916,16.35417 -18.6849,5.07162 -41.35417,9.20573 -68.02083,12.39583 -26.39323,3.19662 -49.9349,4.85677 -70.625,5 z"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path923"
+     d="m 430.22191,133.16177 c 1.10676,4.02995 1.07421,8.19662 -0.10417,12.5 -1.1849,4.3099 -3.3724,8.82162 -6.5625,13.54167 -1.94661,3.19661 -3.9974,6.08073 -6.14583,8.64583 -2.15495,2.57162 -4.41407,5.03907 -6.77083,7.39583 -0.69662,0.83334 -1.8099,1.875 -3.33334,3.125 -1.52995,1.25 -3.125,2.4349 -4.79166,3.54167 -1.66667,1.11328 -3.26824,1.91407 -4.79167,2.39583 -1.52995,0.48829 -2.64323,0.3125 -3.33333,-0.52083 -5,-4.02343 -9.9349,-8.125 -14.79167,-12.29167 -4.86328,-4.16666 -10.20833,-8.05338 -16.04167,-11.66666 -0.97656,-0.6901 -1.42578,-1.35417 -1.35416,-1.97917 0.0652,-0.625 0.44921,-1.5625 1.14583,-2.8125 l 33.33333,-50.83333 c 0.97005,-1.38672 1.9401,-2.04427 2.91667,-1.97917 0.97005,0.0717 2.01172,0.45574 3.125,1.14584 2.91667,1.66666 5.83333,3.54166 8.75,5.625 2.91667,2.08333 5.625,4.34245 8.125,6.77083 2.5,2.4349 4.6875,5.07162 6.5625,7.91667 1.875,2.85156 3.22916,6.00911 4.0625,9.47916 z"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path883"
+     d="M 305.71333,214.15892"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663" />
+  <path
+     id="path887"
+     d="m 599.12998,319.78391 c -3.0599,5.41667 -6.25,10.8724 -9.58333,16.35417 -3.33334,5.48828 -7.05079,10.66406 -11.14584,15.52083 -4.10156,4.86328 -8.61328,9.27084 -13.54166,13.22917 -4.9349,3.95833 -10.52084,7.12239 -16.77084,9.47916 -5.14323,2.08334 -9.51823,4.41407 -13.125,6.97917 -3.61328,2.57162 -6.60156,5.3125 -8.95833,8.22917 -3.61328,3.89323 -6.73828,9.27083 -9.375,16.14583 -2.64323,6.875 -5.38411,14.13411 -8.22916,21.77083 -2.85157,7.64323 -5.97657,15.10417 -9.375,22.39583 -3.40495,7.29167 -7.67579,13.30079 -12.8125,18.02084 -7.08334,7.5 -17.57162,12.57161 -31.45834,15.20833 l -38.12499,6.45833 c -1.11329,0.14323 -2.46745,0.2474 -4.0625,0.3125 -1.60157,0.0716 -2.7474,0.0391 -3.4375,-0.10416 -3.19011,-0.97005 -4.16667,-3.08594 -2.91667,-6.35417 1.25,-3.26172 4.51172,-6.5625 9.79167,-9.89583 10.6901,-7.08334 19.23177,-12.8125 25.625,-17.1875 6.38671,-4.375 11.59505,-7.94922 15.62499,-10.72917 4.02344,-2.77343 7.25261,-5.0651 9.6875,-6.875 2.42839,-1.80338 5.03256,-3.8151 7.8125,-6.04166 11.25,-8.47006 19.02344,-17.35677 23.33334,-26.66667 2.5,-4.85677 4.79166,-9.58333 6.875,-14.16667 2.08333,-4.58333 4.27083,-9.09505 6.5625,-13.54166 2.29166,-4.44011 4.7526,-8.85417 7.39583,-13.22917 2.63672,-4.375 5.6901,-8.78255 9.16667,-13.22916 3.60677,-4.44011 8.47005,-8.78256 14.58333,-13.02084 6.10677,-4.23177 13.47005,-8.4375 22.08333,-12.60416 0.97005,-0.41667 2.5651,-1.35417 4.79167,-2.8125 2.22005,-1.45834 4.92838,-3.78255 8.125,-6.97917 3.1901,-3.1901 6.83593,-7.53255 10.9375,-13.02083 4.09505,-5.48177 8.4375,-12.46094 13.02083,-20.9375 -1.66667,-1.66667 -6.45833,-3.95833 -14.375,-6.875 -7.91667,-3.05338 -15.41667,-4.79167 -22.5,-5.20833 -6.52995,-0.41667 -11.91406,0.76823 -16.14583,3.54166 -4.23828,2.77995 -8.09245,6.73829 -11.5625,11.875 -3.47657,5.14323 -6.45833,7.5 -8.95833,7.08333 -0.83334,-0.41666 -0.97657,-2.14843 -0.41667,-5.20833 0.6901,-3.05338 1.66667,-6.04166 2.91667,-8.95833 5.27343,-12.08333 11.24999,-21.04167 17.91666,-26.875 6.80339,-5.97005 14.92839,-8.95833 24.375,-8.95833 6.80338,0 15.34505,1.66666 25.625,5 6.38672,2.22656 11.875,3.33333 16.45833,3.33333 9.58333,0 19.09505,-3.39843 28.54167,-10.20833 2.08333,0 2.8125,1.35416 2.1875,4.0625 -0.625,2.70833 -1.5625,5.8724 -2.8125,9.47916 -1.11329,3.61329 -1.875,6.04167 -2.29167,7.29167 -2.08333,6.52995 -3.75,10.35157 -5,11.45833 -1.25,0.97657 -4.86328,3.61329 -10.83333,7.91667 -3.33334,2.5 -6.21745,5.38411 -8.64584,8.64583 -2.43489,3.26823 -4.89583,7.1224 -7.39583,11.5625 -2.5,4.44662 -5.69661,10.5599 -9.58333,18.33333 z m 0,0"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
+     inkscape:connector-curvature="0" />
+  <use
+     style="fill:#000000;fill-opacity:1"
+     id="use62"
+     y="291"
+     x="119.25"
+     xlink:href="#glyph0-4"
+     width="100%"
+     height="100%"
+     transform="matrix(1.3333333,0,0,1.3333333,72.589732,-189.32751)" />
+  <use
+     style="fill:#000000;fill-opacity:1"
+     id="use196"
+     y="391"
+     x="168.375"
+     xlink:href="#glyph0-4-3"
+     width="100%"
+     height="100%"
+     transform="matrix(1.3333333,0,0,1.3333333,-861.41828,-631.73483)" />
+</svg>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/a-clustering-example-for-levels-0-and-1.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/a-clustering-example-for-levels-0-and-1.html
new file mode 100644
index 0000000..714859a
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/a-clustering-example-for-levels-0-and-1.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>A clustering example for levels 0 and 1: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="clusters.html" title="Clusters">
+<link rel="prev" href="working-with-harfbuzz-clusters.html" title="Working with HarfBuzz clusters">
+<link rel="next" href="reordering-in-levels-0-and-1.html" title="Reordering in levels 0 and 1">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="clusters.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="working-with-harfbuzz-clusters.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="reordering-in-levels-0-and-1.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="a-clustering-example-for-levels-0-and-1"></a>A clustering example for levels 0 and 1</h2></div></div></div>
+<p>
+      The basic shaping operations affect clusters in a predictable
+      manner when using level 0 or level 1: 
+    </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem"><p>
+	  When two or more clusters <span class="emphasis"><em>merge</em></span>, the
+	  resulting merged cluster takes as its cluster value the
+	  <span class="emphasis"><em>minimum</em></span> of the incoming cluster values.
+	</p></li>
+<li class="listitem"><p>
+	  When a cluster <span class="emphasis"><em>decomposes</em></span>, all of the
+	  resulting child clusters inherit as their cluster value the
+	  cluster value of the parent cluster.
+	</p></li>
+<li class="listitem"><p>
+	  When a character is <span class="emphasis"><em>reordered</em></span>, the
+	  reordered character and all clusters that the character
+	  moves past as part of the reordering are merged into one cluster.
+	</p></li>
+</ul></div>
+<p>
+      The functionality, guarantees, and benefits of level 0 and level
+      1 behavior can be seen with some examples. First, let us examine
+      what happens with cluster values when shaping involves cluster
+      merging with ligatures and decomposition.
+    </p>
+<p>
+      Let's say we start with the following character sequence (top row) and
+      initial cluster values (bottom row):
+    </p>
+<pre class="programlisting">
+      A,B,C,D,E
+      0,1,2,3,4
+    </pre>
+<p>
+      During shaping, HarfBuzz maps these characters to glyphs from
+      the font. For simplicity, let us assume that each character maps
+      to the corresponding, identical-looking glyph:
+    </p>
+<pre class="programlisting">
+      A,B,C,D,E
+      0,1,2,3,4
+    </pre>
+<p>
+      Now if, for example, <code class="literal">B</code> and <code class="literal">C</code>
+      form a ligature, then the clusters to which they belong
+      "merge". This merged cluster takes for its cluster
+      value the minimum of all the cluster values of the clusters that
+      went in to the ligature. In this case, we get:
+    </p>
+<pre class="programlisting">
+      A,BC,D,E
+      0,1 ,3,4
+    </pre>
+<p>
+      because 1 is the minimum of the set {1,2}, which were the
+      cluster values of <code class="literal">B</code> and
+      <code class="literal">C</code>. 
+    </p>
+<p>
+      Next, let us say that the <code class="literal">BC</code> ligature glyph
+      decomposes into three components, and <code class="literal">D</code> also
+      decomposes into two components. Whenever a cluster decomposes,
+      its components each inherit the cluster value of their parent: 
+    </p>
+<pre class="programlisting">
+      A,BC0,BC1,BC2,D0,D1,E
+      0,1  ,1  ,1  ,3 ,3 ,4
+    </pre>
+<p>
+      Next, if <code class="literal">BC2</code> and <code class="literal">D0</code> form a
+      ligature, then their clusters (cluster values 1 and 3) merge into
+      <code class="literal">min(1,3) = 1</code>:
+    </p>
+<pre class="programlisting">
+      A,BC0,BC1,BC2D0,D1,E
+      0,1  ,1  ,1    ,1 ,4
+    </pre>
+<p>
+      Note that the entirety of cluster 3 merges into cluster 1, not
+      just the <code class="literal">D0</code> glyph. This reflects the fact
+      that the cluster <span class="emphasis"><em>must</em></span> be treated as an
+      indivisible unit.
+    </p>
+<p>
+      At this point, cluster 1 means: the character sequence
+      <code class="literal">BCD</code> is represented by glyphs
+      <code class="literal">BC0,BC1,BC2D0,D1</code> and cannot be broken down any
+      further.
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/aat-shaping.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/aat-shaping.html
new file mode 100644
index 0000000..e1fff446
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/aat-shaping.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>AAT shaping: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="shaping-concepts.html" title="Shaping concepts">
+<link rel="prev" href="graphite-shaping.html" title="Graphite shaping">
+<link rel="next" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="shaping-concepts.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="graphite-shaping.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="buffers-language-script-and-direction.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="aat-shaping"></a>AAT shaping</h2></div></div></div>
+<p>
+      In contrast to OpenType shaping, AAT shaping does not specify a 
+      predefined set of shaping models or a set of supported scripts.
+    </p>
+<p>
+      Instead, each AAT font includes a complete set of rules that
+      implement the desired shaping model for the intended
+      script. These rules include finite-state machines to match glyph
+      sequences and the shaping operations to perform.
+    </p>
+<p>
+      Notably, AAT shaping rules are expressed for glyphs in the font,
+      not for Unicode codepoints. AAT shaping can perform the same
+      shaping operations used in OpenType shaping, as well as other
+      functions that have not been defined for OpenType shaping.
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/adding-text-to-the-buffer.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/adding-text-to-the-buffer.html
new file mode 100644
index 0000000..b1157fb
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/adding-text-to-the-buffer.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Adding text to the buffer: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
+<link rel="prev" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
+<link rel="next" href="setting-buffer-properties.html" title="Setting buffer properties">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="buffers-language-script-and-direction.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="buffers-language-script-and-direction.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="setting-buffer-properties.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="adding-text-to-the-buffer"></a>Adding text to the buffer</h2></div></div></div>
+<p>
+      Now we have a brand new HarfBuzz buffer. Let's start filling it
+      with text! From HarfBuzz's perspective, a buffer is just a stream
+      of Unicode codepoints, but your input string is probably in one of
+      the standard Unicode character encodings (UTF-8, UTF-16, UTF-32)
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/annotation-glossary.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/annotation-glossary.html
new file mode 100644
index 0000000..acf5467
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/annotation-glossary.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Annotation Glossary: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-2.html" title="Index of new symbols in 0.9.2">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_glossary"><a class="shortcut" href="#glsA">A</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#glsC">C</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#glsD">D</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#glsE">E</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#glsI">I</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#glsN">N</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#glsO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#glsS">S</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#glsT">T</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
+</tr></table>
+<div class="glossary">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="annotation-glossary"></a>Annotation Glossary</h2></div></div></div>
+<a name="glsA"></a><h3 class="title">A</h3>
+<dt><span class="glossterm"><a name="annotation-glossterm-allow-none"></a>allow-none</span></dt>
+<dd class="glossdef"><p>NULL is OK, both for passing and for returning.</p></dd>
+<dt><span class="glossterm"><a name="annotation-glossterm-array"></a>array</span></dt>
+<dd class="glossdef"><p>Parameter points to an array of items.</p></dd>
+<a name="glsC"></a><h3 class="title">C</h3>
+<dt><span class="glossterm"><a name="annotation-glossterm-closure"></a>closure</span></dt>
+<dd class="glossdef"><p>This parameter is a 'user_data', for callbacks; many bindings can pass NULL here.</p></dd>
+<a name="glsD"></a><h3 class="title">D</h3>
+<dt><span class="glossterm"><a name="annotation-glossterm-destroy"></a>destroy</span></dt>
+<dd class="glossdef"><p>This parameter is a 'destroy_data', for callbacks.</p></dd>
+<a name="glsE"></a><h3 class="title">E</h3>
+<dt><span class="glossterm"><a name="annotation-glossterm-element-type"></a>element-type</span></dt>
+<dd class="glossdef"><p>Generics and defining elements of containers and arrays.</p></dd>
+<a name="glsI"></a><h3 class="title">I</h3>
+<dt><span class="glossterm"><a name="annotation-glossterm-inout"></a>inout</span></dt>
+<dd class="glossdef"><p>Parameter for input and for returning results. Default is <acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>.</p></dd>
+<a name="glsN"></a><h3 class="title">N</h3>
+<dt><span class="glossterm"><a name="annotation-glossterm-nullable"></a>nullable</span></dt>
+<dd class="glossdef"><p>NULL may be passed as the value in, out, in-out; or as a return value.</p></dd>
+<a name="glsO"></a><h3 class="title">O</h3>
+<dt><span class="glossterm"><a name="annotation-glossterm-optional"></a>optional</span></dt>
+<dd class="glossdef"><p>NULL may be passed instead of a pointer to a location.</p></dd>
+<dt><span class="glossterm"><a name="annotation-glossterm-out"></a>out</span></dt>
+<dd class="glossdef"><p>Parameter for returning results. Default is <acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>.</p></dd>
+<dt><span class="glossterm"><a name="annotation-glossterm-out%20caller-allocates"></a>out caller-allocates</span></dt>
+<dd class="glossdef"><p>Out parameter, where caller must allocate storage.</p></dd>
+<a name="glsS"></a><h3 class="title">S</h3>
+<dt><span class="glossterm"><a name="annotation-glossterm-scope%20notified"></a>scope notified</span></dt>
+<dd class="glossdef"><p>The callback is valid until the GDestroyNotify argument is called.</p></dd>
+<dt><span class="glossterm"><a name="annotation-glossterm-skip"></a>skip</span></dt>
+<dd class="glossdef"><p>Exposed in C code, not necessarily available in other languages.</p></dd>
+<a name="glsT"></a><h3 class="title">T</h3>
+<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20full"></a>transfer full</span></dt>
+<dd class="glossdef"><p>Free data after the code is done.</p></dd>
+<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20none"></a>transfer none</span></dt>
+<dd class="glossdef"><p>Don't free data after the code is done.</p></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-10.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-10.html
new file mode 100644
index 0000000..b670ca5
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-10.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.10: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-11.html" title="Index of new symbols in 0.9.11">
+<link rel="next" href="api-index-0-9-8.html" title="Index of new symbols in 0.9.8">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-11.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-8.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-10"></a>Index of new symbols in 0.9.10</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-size-params" title="hb_ot_layout_get_size_params ()">hb_ot_layout_get_size_params</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-11.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-11.html
new file mode 100644
index 0000000..4f604c0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-11.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.11: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-20.html" title="Index of new symbols in 0.9.20">
+<link rel="next" href="api-index-0-9-10.html" title="Index of new symbols in 0.9.10">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-20.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-10.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-11"></a>Index of new symbols in 0.9.11</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-clear-contents" title="hb_buffer_clear_contents ()">hb_buffer_clear_contents</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-2.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-2.html
new file mode 100644
index 0000000..921e090
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-2.html
@@ -0,0 +1,757 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.2: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-5.html" title="Index of new symbols in 0.9.5">
+<link rel="next" href="annotation-glossary.html" title="Annotation Glossary">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxD">D</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxG">G</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxL">L</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxT">T</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxU">U</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxV">V</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-5.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="annotation-glossary.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-2"></a>Index of new symbols in 0.9.2</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create" title="hb_blob_create ()">hb_blob_create</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-sub-blob" title="hb_blob_create_sub_blob ()">hb_blob_create_sub_blob</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-destroy" title="hb_blob_destroy ()">hb_blob_destroy</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-data" title="hb_blob_get_data ()">hb_blob_get_data</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-data-writable" title="hb_blob_get_data_writable ()">hb_blob_get_data_writable</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-empty" title="hb_blob_get_empty ()">hb_blob_get_empty</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-length" title="hb_blob_get_length ()">hb_blob_get_length</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-user-data" title="hb_blob_get_user_data ()">hb_blob_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-is-immutable" title="hb_blob_is_immutable ()">hb_blob_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-make-immutable" title="hb_blob_make_immutable ()">hb_blob_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-reference" title="hb_blob_reference ()">hb_blob_reference</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-set-user-data" title="hb_blob_set_user_data ()">hb_blob_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-utf16" title="hb_buffer_add_utf16 ()">hb_buffer_add_utf16</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-utf32" title="hb_buffer_add_utf32 ()">hb_buffer_add_utf32</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-utf8" title="hb_buffer_add_utf8 ()">hb_buffer_add_utf8</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-allocation-successful" title="hb_buffer_allocation_successful ()">hb_buffer_allocation_successful</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-create" title="hb_buffer_create ()">hb_buffer_create</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-destroy" title="hb_buffer_destroy ()">hb_buffer_destroy</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-direction" title="hb_buffer_get_direction ()">hb_buffer_get_direction</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-empty" title="hb_buffer_get_empty ()">hb_buffer_get_empty</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-glyph-infos" title="hb_buffer_get_glyph_infos ()">hb_buffer_get_glyph_infos</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-glyph-positions" title="hb_buffer_get_glyph_positions ()">hb_buffer_get_glyph_positions</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-language" title="hb_buffer_get_language ()">hb_buffer_get_language</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-length" title="hb_buffer_get_length ()">hb_buffer_get_length</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-script" title="hb_buffer_get_script ()">hb_buffer_get_script</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-unicode-funcs" title="hb_buffer_get_unicode_funcs ()">hb_buffer_get_unicode_funcs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-user-data" title="hb_buffer_get_user_data ()">hb_buffer_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-normalize-glyphs" title="hb_buffer_normalize_glyphs ()">hb_buffer_normalize_glyphs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-pre-allocate" title="hb_buffer_pre_allocate ()">hb_buffer_pre_allocate</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reference" title="hb_buffer_reference ()">hb_buffer_reference</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reset" title="hb_buffer_reset ()">hb_buffer_reset</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reverse" title="hb_buffer_reverse ()">hb_buffer_reverse</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reverse-clusters" title="hb_buffer_reverse_clusters ()">hb_buffer_reverse_clusters</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t">hb_buffer_serialize_format_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-direction" title="hb_buffer_set_direction ()">hb_buffer_set_direction</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-language" title="hb_buffer_set_language ()">hb_buffer_set_language</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-length" title="hb_buffer_set_length ()">hb_buffer_set_length</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-script" title="hb_buffer_set_script ()">hb_buffer_set_script</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-unicode-funcs" title="hb_buffer_set_unicode_funcs ()">hb_buffer_set_unicode_funcs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-user-data" title="hb_buffer_set_user_data ()">hb_buffer_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-direction-from-string" title="hb_direction_from_string ()">hb_direction_from_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-direction-to-string" title="hb_direction_to_string ()">hb_direction_to_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-create" title="hb_face_create ()">hb_face_create</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-create-for-tables" title="hb_face_create_for_tables ()">hb_face_create_for_tables</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-destroy" title="hb_face_destroy ()">hb_face_destroy</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-empty" title="hb_face_get_empty ()">hb_face_get_empty</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-index" title="hb_face_get_index ()">hb_face_get_index</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-upem" title="hb_face_get_upem ()">hb_face_get_upem</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-user-data" title="hb_face_get_user_data ()">hb_face_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-is-immutable" title="hb_face_is_immutable ()">hb_face_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-make-immutable" title="hb_face_make_immutable ()">hb_face_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-reference" title="hb_face_reference ()">hb_face_reference</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-reference-blob" title="hb_face_reference_blob ()">hb_face_reference_blob</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-reference-table" title="hb_face_reference_table ()">hb_face_reference_table</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-index" title="hb_face_set_index ()">hb_face_set_index</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-upem" title="hb_face_set_upem ()">hb_face_set_upem</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-user-data" title="hb_face_set_user_data ()">hb_face_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-add-glyph-origin-for-direction" title="hb_font_add_glyph_origin_for_direction ()">hb_font_add_glyph_origin_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-create" title="hb_font_create ()">hb_font_create</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-create-sub-font" title="hb_font_create_sub_font ()">hb_font_create_sub_font</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-destroy" title="hb_font_destroy ()">hb_font_destroy</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-create" title="hb_font_funcs_create ()">hb_font_funcs_create</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-destroy" title="hb_font_funcs_destroy ()">hb_font_funcs_destroy</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-get-empty" title="hb_font_funcs_get_empty ()">hb_font_funcs_get_empty</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-get-user-data" title="hb_font_funcs_get_user_data ()">hb_font_funcs_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-is-immutable" title="hb_font_funcs_is_immutable ()">hb_font_funcs_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-make-immutable" title="hb_font_funcs_make_immutable ()">hb_font_funcs_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-reference" title="hb_font_funcs_reference ()">hb_font_funcs_reference</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-contour-point-func" title="hb_font_funcs_set_glyph_contour_point_func ()">hb_font_funcs_set_glyph_contour_point_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-extents-func" title="hb_font_funcs_set_glyph_extents_func ()">hb_font_funcs_set_glyph_extents_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-from-name-func" title="hb_font_funcs_set_glyph_from_name_func ()">hb_font_funcs_set_glyph_from_name_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-advance-func" title="hb_font_funcs_set_glyph_h_advance_func ()">hb_font_funcs_set_glyph_h_advance_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-h-kerning-func" title="hb_font_funcs_set_glyph_h_kerning_func ()">hb_font_funcs_set_glyph_h_kerning_func</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-origin-func" title="hb_font_funcs_set_glyph_h_origin_func ()">hb_font_funcs_set_glyph_h_origin_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-name-func" title="hb_font_funcs_set_glyph_name_func ()">hb_font_funcs_set_glyph_name_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-advance-func" title="hb_font_funcs_set_glyph_v_advance_func ()">hb_font_funcs_set_glyph_v_advance_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-v-kerning-func" title="hb_font_funcs_set_glyph_v_kerning_func ()">hb_font_funcs_set_glyph_v_kerning_func</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-origin-func" title="hb_font_funcs_set_glyph_v_origin_func ()">hb_font_funcs_set_glyph_v_origin_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-user-data" title="hb_font_funcs_set_user_data ()">hb_font_funcs_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-empty" title="hb_font_get_empty ()">hb_font_get_empty</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-face" title="hb_font_get_face ()">hb_font_get_face</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph" title="hb_font_get_glyph ()">hb_font_get_glyph</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-advance-for-direction" title="hb_font_get_glyph_advance_for_direction ()">hb_font_get_glyph_advance_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point" title="hb_font_get_glyph_contour_point ()">hb_font_get_glyph_contour_point</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point-for-origin" title="hb_font_get_glyph_contour_point_for_origin ()">hb_font_get_glyph_contour_point_for_origin</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-extents" title="hb_font_get_glyph_extents ()">hb_font_get_glyph_extents</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-extents-for-origin" title="hb_font_get_glyph_extents_for_origin ()">hb_font_get_glyph_extents_for_origin</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-from-name" title="hb_font_get_glyph_from_name ()">hb_font_get_glyph_from_name</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advance" title="hb_font_get_glyph_h_advance ()">hb_font_get_glyph_h_advance</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-h-kerning" title="hb_font_get_glyph_h_kerning ()">hb_font_get_glyph_h_kerning</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-origin" title="hb_font_get_glyph_h_origin ()">hb_font_get_glyph_h_origin</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-kerning-for-direction" title="hb_font_get_glyph_kerning_for_direction ()">hb_font_get_glyph_kerning_for_direction</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-name" title="hb_font_get_glyph_name ()">hb_font_get_glyph_name</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-origin-for-direction" title="hb_font_get_glyph_origin_for_direction ()">hb_font_get_glyph_origin_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advance" title="hb_font_get_glyph_v_advance ()">hb_font_get_glyph_v_advance</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning" title="hb_font_get_glyph_v_kerning ()">hb_font_get_glyph_v_kerning</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-origin" title="hb_font_get_glyph_v_origin ()">hb_font_get_glyph_v_origin</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-parent" title="hb_font_get_parent ()">hb_font_get_parent</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-ppem" title="hb_font_get_ppem ()">hb_font_get_ppem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-ptem" title="hb_font_get_ptem ()">hb_font_get_ptem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-scale" title="hb_font_get_scale ()">hb_font_get_scale</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-user-data" title="hb_font_get_user_data ()">hb_font_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-glyph-from-string" title="hb_font_glyph_from_string ()">hb_font_glyph_from_string</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-glyph-to-string" title="hb_font_glyph_to_string ()">hb_font_glyph_to_string</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-is-immutable" title="hb_font_is_immutable ()">hb_font_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-make-immutable" title="hb_font_make_immutable ()">hb_font_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-reference" title="hb_font_reference ()">hb_font_reference</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-funcs" title="hb_font_set_funcs ()">hb_font_set_funcs</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-funcs-data" title="hb_font_set_funcs_data ()">hb_font_set_funcs_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-ppem" title="hb_font_set_ppem ()">hb_font_set_ppem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-scale" title="hb_font_set_scale ()">hb_font_set_scale</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-user-data" title="hb_font_set_user_data ()">hb_font_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-subtract-glyph-origin-for-direction" title="hb_font_subtract_glyph_origin_for_direction ()">hb_font_subtract_glyph_origin_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create" title="hb_ft_face_create ()">hb_ft_face_create</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create-cached" title="hb_ft_face_create_cached ()">hb_ft_face_create_cached</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create" title="hb_ft_font_create ()">hb_ft_font_create</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<a name="idxG"></a><h3 class="title">G</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-blob-get-type" title="hb_gobject_blob_get_type ()">hb_gobject_blob_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-get-type" title="hb_gobject_buffer_get_type ()">hb_gobject_buffer_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-face-get-type" title="hb_gobject_face_get_type ()">hb_gobject_face_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-font-funcs-get-type" title="hb_gobject_font_funcs_get_type ()">hb_gobject_font_funcs_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-font-get-type" title="hb_gobject_font_get_type ()">hb_gobject_font_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-unicode-funcs-get-type" title="hb_gobject_unicode_funcs_get_type ()">hb_gobject_unicode_funcs_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<a name="idxL"></a><h3 class="title">L</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-language-from-string" title="hb_language_from_string ()">hb_language_from_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-language-get-default" title="hb_language_get_default ()">hb_language_get_default</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-language-to-string" title="hb_language_to_string ()">hb_language_to_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-shape.html#hb-ot-shape-glyphs-closure" title="hb_ot_shape_glyphs_closure ()">hb_ot_shape_glyphs_closure</a>, function in <a class="link" href="harfbuzz-hb-ot-shape.html" title="hb-ot-shape">hb-ot-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tag-to-language" title="hb_ot_tag_to_language ()">hb_ot_tag_to_language</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-script-from-iso15924-tag" title="hb_script_from_iso15924_tag ()">hb_script_from_iso15924_tag</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-script-from-string" title="hb_script_from_string ()">hb_script_from_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-script-get-horizontal-direction" title="hb_script_get_horizontal_direction ()">hb_script_get_horizontal_direction</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-script-to-iso15924-tag" title="hb_script_to_iso15924_tag ()">hb_script_to_iso15924_tag</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-add" title="hb_set_add ()">hb_set_add</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-allocation-successful" title="hb_set_allocation_successful ()">hb_set_allocation_successful</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-clear" title="hb_set_clear ()">hb_set_clear</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-create" title="hb_set_create ()">hb_set_create</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-del" title="hb_set_del ()">hb_set_del</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-destroy" title="hb_set_destroy ()">hb_set_destroy</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-empty" title="hb_set_get_empty ()">hb_set_get_empty</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-user-data" title="hb_set_get_user_data ()">hb_set_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-has" title="hb_set_has ()">hb_set_has</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-intersect" title="hb_set_intersect ()">hb_set_intersect</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-next" title="hb_set_next ()">hb_set_next</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-reference" title="hb_set_reference ()">hb_set_reference</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-set" title="hb_set_set ()">hb_set_set</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-set-user-data" title="hb_set_set_user_data ()">hb_set_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-subtract" title="hb_set_subtract ()">hb_set_subtract</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-symmetric-difference" title="hb_set_symmetric_difference ()">hb_set_symmetric_difference</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-union" title="hb_set_union ()">hb_set_union</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape ()">hb_shape</a>, function in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#hb-shape-full" title="hb_shape_full ()">hb_shape_full</a>, function in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#hb-shape-list-shapers" title="hb_shape_list_shapers ()">hb_shape_list_shapers</a>, function in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<a name="idxT"></a><h3 class="title">T</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-tag-from-string" title="hb_tag_from_string ()">hb_tag_from_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<a name="idxU"></a><h3 class="title">U</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class" title="hb_unicode_combining_class ()">hb_unicode_combining_class</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-compose" title="hb_unicode_compose ()">hb_unicode_compose</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-decompose" title="hb_unicode_decompose ()">hb_unicode_decompose</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-create" title="hb_unicode_funcs_create ()">hb_unicode_funcs_create</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-destroy" title="hb_unicode_funcs_destroy ()">hb_unicode_funcs_destroy</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-empty" title="hb_unicode_funcs_get_empty ()">hb_unicode_funcs_get_empty</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-parent" title="hb_unicode_funcs_get_parent ()">hb_unicode_funcs_get_parent</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-user-data" title="hb_unicode_funcs_get_user_data ()">hb_unicode_funcs_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-is-immutable" title="hb_unicode_funcs_is_immutable ()">hb_unicode_funcs_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-make-immutable" title="hb_unicode_funcs_make_immutable ()">hb_unicode_funcs_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-reference" title="hb_unicode_funcs_reference ()">hb_unicode_funcs_reference</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-combining-class-func" title="hb_unicode_funcs_set_combining_class_func ()">hb_unicode_funcs_set_combining_class_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-compose-func" title="hb_unicode_funcs_set_compose_func ()">hb_unicode_funcs_set_compose_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-decompose-func" title="hb_unicode_funcs_set_decompose_func ()">hb_unicode_funcs_set_decompose_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-general-category-func" title="hb_unicode_funcs_set_general_category_func ()">hb_unicode_funcs_set_general_category_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-mirroring-func" title="hb_unicode_funcs_set_mirroring_func ()">hb_unicode_funcs_set_mirroring_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-script-func" title="hb_unicode_funcs_set_script_func ()">hb_unicode_funcs_set_script_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-user-data" title="hb_unicode_funcs_set_user_data ()">hb_unicode_funcs_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category" title="hb_unicode_general_category ()">hb_unicode_general_category</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-mirroring" title="hb_unicode_mirroring ()">hb_unicode_mirroring</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-script" title="hb_unicode_script ()">hb_unicode_script</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<a name="idxV"></a><h3 class="title">V</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-version.html#hb-version" title="hb_version ()">hb_version</a>, function in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-version.html#hb-version-string" title="hb_version_string ()">hb_version_string</a>, function in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-20.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-20.html
new file mode 100644
index 0000000..290acb6
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-20.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.20: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-22.html" title="Index of new symbols in 0.9.22">
+<link rel="next" href="api-index-0-9-11.html" title="Index of new symbols in 0.9.11">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-22.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-11.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-20"></a>Index of new symbols in 0.9.20</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t">hb_buffer_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t">hb_buffer_serialize_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-22.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-22.html
new file mode 100644
index 0000000..7e56b79
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-22.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.22: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-28.html" title="Index of new symbols in 0.9.28">
+<link rel="next" href="api-index-0-9-20.html" title="Index of new symbols in 0.9.20">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-28.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-20.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-22"></a>Index of new symbols in 0.9.22</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-get-lookup-count" title="hb_ot_layout_table_get_lookup_count ()">hb_ot_layout_table_get_lookup_count</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-28.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-28.html
new file mode 100644
index 0000000..1fa3ea2
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-28.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.28: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-30.html" title="Index of new symbols in 0.9.30">
+<link rel="next" href="api-index-0-9-22.html" title="Index of new symbols in 0.9.22">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-30.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-22.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-28"></a>Index of new symbols in 0.9.28</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-font.html#hb-ot-font-set-funcs" title="hb_ot_font_set_funcs ()">hb_ot_font_set_funcs</a>, function in <a class="link" href="harfbuzz-hb-ot-font.html" title="hb-ot-font">hb-ot-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-30.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-30.html
new file mode 100644
index 0000000..863701e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-30.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.30: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-31.html" title="Index of new symbols in 0.9.31">
+<link rel="next" href="api-index-0-9-28.html" title="Index of new symbols in 0.9.28">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxV">V</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-31.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-28.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-30"></a>Index of new symbols in 0.9.30</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-required-feature" title="hb_ot_layout_language_get_required_feature ()">hb_ot_layout_language_get_required_feature</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<a name="idxV"></a><h3 class="title">V</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-version.html#hb-version-atleast" title="hb_version_atleast ()">hb_version_atleast</a>, function in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-31.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-31.html
new file mode 100644
index 0000000..7326017
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-31.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.31: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-38.html" title="Index of new symbols in 0.9.38">
+<link rel="next" href="api-index-0-9-30.html" title="Index of new symbols in 0.9.30">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-38.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-30.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-31"></a>Index of new symbols in 0.9.31</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-codepoints" title="hb_buffer_add_codepoints ()">hb_buffer_add_codepoints</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-replacement-codepoint" title="hb_buffer_get_replacement_codepoint ()">hb_buffer_get_replacement_codepoint</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-REPLACEMENT-CODEPOINT-DEFAULT:CAPS" title="HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT">HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT</a>, macro in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-codepoint" title="hb_buffer_set_replacement_codepoint ()">hb_buffer_set_replacement_codepoint</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-38.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-38.html
new file mode 100644
index 0000000..196a9ccc
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-38.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.38: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-39.html" title="Index of new symbols in 0.9.39">
+<link rel="next" href="api-index-0-9-31.html" title="Index of new symbols in 0.9.31">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxG">G</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-39.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-31.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-38"></a>Index of new symbols in 0.9.38</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create-referenced" title="hb_ft_face_create_referenced ()">hb_ft_face_create_referenced</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create-referenced" title="hb_ft_font_create_referenced ()">hb_ft_font_create_referenced</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<a name="idxG"></a><h3 class="title">G</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-glib.html#hb-glib-blob-create" title="hb_glib_blob_create ()">hb_glib_blob_create</a>, function in <a class="link" href="harfbuzz-hb-glib.html" title="hb-glib">hb-glib</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-39.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-39.html
new file mode 100644
index 0000000..91f6acc
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-39.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.39: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-41.html" title="Index of new symbols in 0.9.41">
+<link rel="next" href="api-index-0-9-38.html" title="Index of new symbols in 0.9.38">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-41.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-38.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-39"></a>Index of new symbols in 0.9.39</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-latin1" title="hb_buffer_add_latin1 ()">hb_buffer_add_latin1</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-41.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-41.html
new file mode 100644
index 0000000..b5913e9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-41.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.41: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-42.html" title="Index of new symbols in 0.9.42">
+<link rel="next" href="api-index-0-9-39.html" title="Index of new symbols in 0.9.39">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-42.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-39.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-41"></a>Index of new symbols in 0.9.41</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reverse-range" title="hb_buffer_reverse_range ()">hb_buffer_reverse_range</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-42.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-42.html
new file mode 100644
index 0000000..b048b2d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-42.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.42: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-0-5.html" title="Index of new symbols in 1.0.5">
+<link rel="next" href="api-index-0-9-41.html" title="Index of new symbols in 0.9.41">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-0-5.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-41.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-42"></a>Index of new symbols in 0.9.42</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-cluster-level-t" title="enum hb_buffer_cluster_level_t">hb_buffer_cluster_level_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-cluster-level" title="hb_buffer_get_cluster_level ()">hb_buffer_get_cluster_level</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-cluster-level" title="hb_buffer_set_cluster_level ()">hb_buffer_set_cluster_level</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-5.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-5.html
new file mode 100644
index 0000000..9054ab0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-5.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.5: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-7.html" title="Index of new symbols in 0.9.7">
+<link rel="next" href="api-index-0-9-2.html" title="Index of new symbols in 0.9.2">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxT">T</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-7.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-5"></a>Index of new symbols in 0.9.5</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-content-type" title="hb_buffer_get_content_type ()">hb_buffer_get_content_type</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-content-type" title="hb_buffer_set_content_type ()">hb_buffer_set_content_type</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#hb-feature-from-string" title="hb_feature_from_string ()">hb_feature_from_string</a>, function in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#hb-feature-to-string" title="hb_feature_to_string ()">hb_feature_to_string</a>, function in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<a name="idxT"></a><h3 class="title">T</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-tag-to-string" title="hb_tag_to_string ()">hb_tag_to_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-7.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-7.html
new file mode 100644
index 0000000..8ffe5dd
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-7.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.7: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-8.html" title="Index of new symbols in 0.9.8">
+<link rel="next" href="api-index-0-9-5.html" title="Index of new symbols in 0.9.5">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-8.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-5.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-7"></a>Index of new symbols in 0.9.7</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add" title="hb_buffer_add ()">hb_buffer_add</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-deserialize-glyphs" title="hb_buffer_deserialize_glyphs ()">hb_buffer_deserialize_glyphs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-flags" title="hb_buffer_get_flags ()">hb_buffer_get_flags</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-segment-properties" title="hb_buffer_get_segment_properties ()">hb_buffer_get_segment_properties</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-guess-segment-properties" title="hb_buffer_guess_segment_properties ()">hb_buffer_guess_segment_properties</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-from-string" title="hb_buffer_serialize_format_from_string ()">hb_buffer_serialize_format_from_string</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-to-string" title="hb_buffer_serialize_format_to_string ()">hb_buffer_serialize_format_to_string</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-glyphs" title="hb_buffer_serialize_glyphs ()">hb_buffer_serialize_glyphs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-list-formats" title="hb_buffer_serialize_list_formats ()">hb_buffer_serialize_list_formats</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-flags" title="hb_buffer_set_flags ()">hb_buffer_set_flags</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-segment-properties" title="hb_buffer_set_segment_properties ()">hb_buffer_set_segment_properties</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-glyph-count" title="hb_face_get_glyph_count ()">hb_face_get_glyph_count</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-glyph-count" title="hb_face_set_glyph_count ()">hb_face_set_glyph_count</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-lookups" title="hb_ot_layout_feature_get_lookups ()">hb_ot_layout_feature_get_lookups</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-glyphs-in-class" title="hb_ot_layout_get_glyphs_in_class ()">hb_ot_layout_get_glyphs_in_class</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-glyph-class" title="hb_ot_layout_get_glyph_class ()">hb_ot_layout_get_glyph_class</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-collect-glyphs" title="hb_ot_layout_lookup_collect_glyphs ()">hb_ot_layout_lookup_collect_glyphs</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-substitute-closure" title="hb_ot_layout_lookup_substitute_closure ()">hb_ot_layout_lookup_substitute_closure</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-would-substitute" title="hb_ot_layout_lookup_would_substitute ()">hb_ot_layout_lookup_would_substitute</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-shape-plan-collect-lookups" title="hb_ot_shape_plan_collect_lookups ()">hb_ot_shape_plan_collect_lookups</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-equal" title="hb_segment_properties_equal ()">hb_segment_properties_equal</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-hash" title="hb_segment_properties_hash ()">hb_segment_properties_hash</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-add-range" title="hb_set_add_range ()">hb_set_add_range</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-del-range" title="hb_set_del_range ()">hb_set_del_range</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-max" title="hb_set_get_max ()">hb_set_get_max</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-min" title="hb_set_get_min ()">hb_set_get_min</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-population" title="hb_set_get_population ()">hb_set_get_population</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-is-empty" title="hb_set_is_empty ()">hb_set_is_empty</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-is-equal" title="hb_set_is_equal ()">hb_set_is_equal</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-next-range" title="hb_set_next_range ()">hb_set_next_range</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create" title="hb_shape_plan_create ()">hb_shape_plan_create</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached" title="hb_shape_plan_create_cached ()">hb_shape_plan_create_cached</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-destroy" title="hb_shape_plan_destroy ()">hb_shape_plan_destroy</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-execute" title="hb_shape_plan_execute ()">hb_shape_plan_execute</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-empty" title="hb_shape_plan_get_empty ()">hb_shape_plan_get_empty</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-shaper" title="hb_shape_plan_get_shaper ()">hb_shape_plan_get_shaper</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-user-data" title="hb_shape_plan_get_user_data ()">hb_shape_plan_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-reference" title="hb_shape_plan_reference ()">hb_shape_plan_reference</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-set-user-data" title="hb_shape_plan_set_user_data ()">hb_shape_plan_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-8.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-8.html
new file mode 100644
index 0000000..c42dee8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-0-9-8.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.8: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-10.html" title="Index of new symbols in 0.9.10">
+<link rel="next" href="api-index-0-9-7.html" title="Index of new symbols in 0.9.7">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-10.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-7.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-8"></a>Index of new symbols in 0.9.8</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-lookups" title="hb_ot_layout_collect_lookups ()">hb_ot_layout_collect_lookups</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-0-5.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-0-5.html
new file mode 100644
index 0000000..47bc601
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-0-5.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.0.5: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-1-2.html" title="Index of new symbols in 1.1.2">
+<link rel="next" href="api-index-0-9-42.html" title="Index of new symbols in 0.9.42">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-1-2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-42.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-0-5"></a>Index of new symbols in 1.0.5</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-parent" title="hb_font_set_parent ()">hb_font_set_parent</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-get-load-flags" title="hb_ft_font_get_load_flags ()">hb_ft_font_get_load_flags</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-set-load-flags" title="hb_ft_font_set_load_flags ()">hb_ft_font_set_load_flags</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-1-2.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-1-2.html
new file mode 100644
index 0000000..5a774cc8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-1-2.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.1.2: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-1-3.html" title="Index of new symbols in 1.1.3">
+<link rel="next" href="api-index-1-0-5.html" title="Index of new symbols in 1.0.5">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-1-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-0-5.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-1-2"></a>Index of new symbols in 1.1.2</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-font-h-extents-func" title="hb_font_funcs_set_font_h_extents_func ()">hb_font_funcs_set_font_h_extents_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-font-v-extents-func" title="hb_font_funcs_set_font_v_extents_func ()">hb_font_funcs_set_font_v_extents_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-1-3.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-1-3.html
new file mode 100644
index 0000000..cc9d926
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-1-3.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.1.3: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-2-3.html" title="Index of new symbols in 1.2.3">
+<link rel="next" href="api-index-1-1-2.html" title="Index of new symbols in 1.1.2">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-2-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-1-2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-1-3"></a>Index of new symbols in 1.1.3</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-message-func" title="hb_buffer_set_message_func ()">hb_buffer_set_message_func</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-extents-for-direction" title="hb_font_get_extents_for_direction ()">hb_font_get_extents_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-h-extents" title="hb_font_get_h_extents ()">hb_font_get_h_extents</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-v-extents" title="hb_font_get_v_extents ()">hb_font_get_v_extents</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-2-3.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-2-3.html
new file mode 100644
index 0000000..36bf20c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-2-3.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.2.3: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-3-3.html" title="Index of new symbols in 1.3.3">
+<link rel="next" href="api-index-1-1-3.html" title="Index of new symbols in 1.1.3">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-3-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-1-3.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-2-3"></a>Index of new symbols in 1.2.3</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-nominal-glyph-func" title="hb_font_funcs_set_nominal_glyph_func ()">hb_font_funcs_set_nominal_glyph_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-variation-glyph-func" title="hb_font_funcs_set_variation_glyph_func ()">hb_font_funcs_set_variation_glyph_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-nominal-glyph" title="hb_font_get_nominal_glyph ()">hb_font_get_nominal_glyph</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-variation-glyph" title="hb_font_get_variation_glyph ()">hb_font_get_variation_glyph</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-3-3.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-3-3.html
new file mode 100644
index 0000000..f5687f59
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-3-3.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.3.3: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-4-0.html" title="Index of new symbols in 1.4.0">
+<link rel="next" href="api-index-1-2-3.html" title="Index of new symbols in 1.2.3">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-4-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-2-3.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-3-3"></a>Index of new symbols in 1.3.3</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-constant-t" title="enum hb_ot_math_constant_t">hb_ot_math_constant_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-constant" title="hb_ot_math_get_constant ()">hb_ot_math_get_constant</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-assembly" title="hb_ot_math_get_glyph_assembly ()">hb_ot_math_get_glyph_assembly</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-italics-correction" title="hb_ot_math_get_glyph_italics_correction ()">hb_ot_math_get_glyph_italics_correction</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-kerning" title="hb_ot_math_get_glyph_kerning ()">hb_ot_math_get_glyph_kerning</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-top-accent-attachment" title="hb_ot_math_get_glyph_top_accent_attachment ()">hb_ot_math_get_glyph_top_accent_attachment</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-variants" title="hb_ot_math_get_glyph_variants ()">hb_ot_math_get_glyph_variants</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-min-connector-overlap" title="hb_ot_math_get_min_connector_overlap ()">hb_ot_math_get_min_connector_overlap</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-flags-t" title="enum hb_ot_math_glyph_part_flags_t">hb_ot_math_glyph_part_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t-struct" title="hb_ot_math_glyph_part_t">hb_ot_math_glyph_part_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t-struct" title="hb_ot_math_glyph_variant_t">hb_ot_math_glyph_variant_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-has-data" title="hb_ot_math_has_data ()">hb_ot_math_has_data</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-is-glyph-extended-shape" title="hb_ot_math_is_glyph_extended_shape ()">hb_ot_math_is_glyph_extended_shape</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-t" title="enum hb_ot_math_kern_t">hb_ot_math_kern_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-4-0.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-4-0.html
new file mode 100644
index 0000000..c6bfe979
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-4-0.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.4.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-4-2.html" title="Index of new symbols in 1.4.2">
+<link rel="next" href="api-index-1-3-3.html" title="Index of new symbols in 1.3.3">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-4-2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-3-3.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-4-0"></a>Index of new symbols in 1.4.0</h2></div></div></div>
+<div xmlns:xlink="http://www.w3.org/1999/xlink" class="index"></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-4-2.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-4-2.html
new file mode 100644
index 0000000..e7fd690
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-4-2.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.4.2: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-4-3.html" title="Index of new symbols in 1.4.3">
+<link rel="next" href="api-index-1-4-0.html" title="Index of new symbols in 1.4.0">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxV">V</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-4-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-4-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-4-2"></a>Index of new symbols in 1.4.2</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-var-coords-normalized" title="hb_font_get_var_coords_normalized ()">hb_font_get_var_coords_normalized</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-variations" title="hb_font_set_variations ()">hb_font_set_variations</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-var-coords-design" title="hb_font_set_var_coords_design ()">hb_font_set_var_coords_design</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-var-coords-normalized" title="hb_font_set_var_coords_normalized ()">hb_font_set_var_coords_normalized</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-get-axis-count" title="hb_ot_var_get_axis_count ()">hb_ot_var_get_axis_count</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-has-data" title="hb_ot_var_has_data ()">hb_ot_var_has_data</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-normalize-coords" title="hb_ot_var_normalize_coords ()">hb_ot_var_normalize_coords</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-normalize-variations" title="hb_ot_var_normalize_variations ()">hb_ot_var_normalize_variations</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-OT-VAR-NO-AXIS-INDEX:CAPS" title="HB_OT_VAR_NO_AXIS_INDEX">HB_OT_VAR_NO_AXIS_INDEX</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<a name="idxV"></a><h3 class="title">V</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-variation-from-string" title="hb_variation_from_string ()">hb_variation_from_string</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-variation-t" title="hb_variation_t">hb_variation_t</a>, struct in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-variation-to-string" title="hb_variation_to_string ()">hb_variation_to_string</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-4-3.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-4-3.html
new file mode 100644
index 0000000..9b333ed
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-4-3.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.4.3: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-5-0.html" title="Index of new symbols in 1.5.0">
+<link rel="next" href="api-index-1-4-2.html" title="Index of new symbols in 1.4.2">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-5-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-4-2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-4-3"></a>Index of new symbols in 1.4.3</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-face" title="hb_font_set_face ()">hb_font_set_face</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-5-0.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-5-0.html
new file mode 100644
index 0000000..0321f7a
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-5-0.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.5.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-6-0.html" title="Index of new symbols in 1.6.0">
+<link rel="next" href="api-index-1-4-3.html" title="Index of new symbols in 1.4.3">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxG">G</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-6-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-4-3.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-5-0"></a>Index of new symbols in 1.5.0</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-append" title="hb_buffer_append ()">hb_buffer_append</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-diff" title="hb_buffer_diff ()">hb_buffer_diff</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<a name="idxG"></a><h3 class="title">G</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t">hb_glyph_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-get-glyph-flags" title="hb_glyph_info_get_glyph_flags ()">hb_glyph_info_get_glyph_flags</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-6-0.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-6-0.html
new file mode 100644
index 0000000..cf383a5
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-6-0.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.6.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-7-5.html" title="Index of new symbols in 1.7.5">
+<link rel="next" href="api-index-1-5-0.html" title="Index of new symbols in 1.5.0">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-7-5.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-5-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-6-0"></a>Index of new symbols in 1.6.0</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-table-tags" title="hb_face_get_table_tags ()">hb_face_get_table_tags</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-ptem" title="hb_font_set_ptem ()">hb_font_set_ptem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-7-5.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-7-5.html
new file mode 100644
index 0000000..3863eea
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-7-5.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.7.5: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-7-7.html" title="Index of new symbols in 1.7.7">
+<link rel="next" href="api-index-1-6-0.html" title="Index of new symbols in 1.6.0">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-7-7.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-6-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-7-5"></a>Index of new symbols in 1.7.5</h2></div></div></div>
+<a name="idx"></a>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-7-7.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-7-7.html
new file mode 100644
index 0000000..277561c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-7-7.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.7.7: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-8-0.html" title="Index of new symbols in 1.8.0">
+<link rel="next" href="api-index-1-7-5.html" title="Index of new symbols in 1.7.5">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxM">M</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-8-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-7-5.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-7-7"></a>Index of new symbols in 1.7.7</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-from-file" title="hb_blob_create_from_file ()">hb_blob_create_from_file</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-count" title="hb_face_count ()">hb_face_count</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<a name="idxM"></a><h3 class="title">M</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-allocation-successful" title="hb_map_allocation_successful ()">hb_map_allocation_successful</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-clear" title="hb_map_clear ()">hb_map_clear</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-create" title="hb_map_create ()">hb_map_create</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-del" title="hb_map_del ()">hb_map_del</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-destroy" title="hb_map_destroy ()">hb_map_destroy</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get" title="hb_map_get ()">hb_map_get</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get-empty" title="hb_map_get_empty ()">hb_map_get_empty</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get-population" title="hb_map_get_population ()">hb_map_get_population</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get-user-data" title="hb_map_get_user_data ()">hb_map_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-has" title="hb_map_has ()">hb_map_has</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-is-empty" title="hb_map_is_empty ()">hb_map_is_empty</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-reference" title="hb_map_reference ()">hb_map_reference</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-set" title="hb_map_set ()">hb_map_set</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-set-user-data" title="hb_map_set_user_data ()">hb_map_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-8-0.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-8-0.html
new file mode 100644
index 0000000..65476d8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-8-0.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.8.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-8-1.html" title="Index of new symbols in 1.8.1">
+<link rel="next" href="api-index-1-7-7.html" title="Index of new symbols in 1.7.7">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-8-1.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-7-7.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-8-0"></a>Index of new symbols in 1.8.0</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-copy-writable-or-fail" title="hb_blob_copy_writable_or_fail ()">hb_blob_copy_writable_or_fail</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-previous" title="hb_set_previous ()">hb_set_previous</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-previous-range" title="hb_set_previous_range ()">hb_set_previous_range</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-8-1.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-8-1.html
new file mode 100644
index 0000000..2db6d73
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-8-1.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.8.1: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-8-5.html" title="Index of new symbols in 1.8.5">
+<link rel="next" href="api-index-1-8-0.html" title="Index of new symbols in 1.8.0">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-8-5.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-8-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-8-1"></a>Index of new symbols in 1.8.1</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookups-substitute-closure" title="hb_ot_layout_lookups_substitute_closure ()">hb_ot_layout_lookups_substitute_closure</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-is-subset" title="hb_set_is_subset ()">hb_set_is_subset</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-8-5.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-8-5.html
new file mode 100644
index 0000000..4c31dfc
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-8-5.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.8.5: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-8-6.html" title="Index of new symbols in 1.8.6">
+<link rel="next" href="api-index-1-8-1.html" title="Index of new symbols in 1.8.1">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-8-6.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-8-1.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-8-5"></a>Index of new symbols in 1.8.5</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-features" title="hb_ot_layout_collect_features ()">hb_ot_layout_collect_features</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-8-6.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-8-6.html
new file mode 100644
index 0000000..b930c3f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-8-6.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.8.6: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-9-0.html" title="Index of new symbols in 1.9.0">
+<link rel="next" href="api-index-1-8-5.html" title="Index of new symbols in 1.8.5">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-9-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-8-5.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-8-6"></a>Index of new symbols in 1.8.6</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-advances-func" title="hb_font_funcs_set_glyph_h_advances_func ()">hb_font_funcs_set_glyph_h_advances_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-advances-func" title="hb_font_funcs_set_glyph_v_advances_func ()">hb_font_funcs_set_glyph_v_advances_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-advances-for-direction" title="hb_font_get_glyph_advances_for_direction ()">hb_font_get_glyph_advances_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advances" title="hb_font_get_glyph_h_advances ()">hb_font_get_glyph_h_advances</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advances" title="hb_font_get_glyph_v_advances ()">hb_font_get_glyph_v_advances</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-9-0.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-9-0.html
new file mode 100644
index 0000000..c04ee2e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-1-9-0.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.9.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-0-0.html" title="Index of new symbols in 2.0.0">
+<link rel="next" href="api-index-1-8-6.html" title="Index of new symbols in 1.8.6">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxU">U</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-0-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-8-6.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-9-0"></a>Index of new symbols in 1.9.0</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-builder-add-table" title="hb_face_builder_add_table ()">hb_face_builder_add_table</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-builder-create" title="hb_face_builder_create ()">hb_face_builder_create</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-collect-unicodes" title="hb_face_collect_unicodes ()">hb_face_collect_unicodes</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-collect-variation-selectors" title="hb_face_collect_variation_selectors ()">hb_face_collect_variation_selectors</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-collect-variation-unicodes" title="hb_face_collect_variation_unicodes ()">hb_face_collect_variation_unicodes</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<a name="idxU"></a><h3 class="title">U</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#HB-UNICODE-MAX:CAPS" title="HB_UNICODE_MAX">HB_UNICODE_MAX</a>, macro in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-2-0-0.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-2-0-0.html
new file mode 100644
index 0000000..bf4c644
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-2-0-0.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.0.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-1-0.html" title="Index of new symbols in 2.1.0">
+<link rel="next" href="api-index-1-9-0.html" title="Index of new symbols in 1.9.0">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-1-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-9-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-0-0"></a>Index of new symbols in 2.0.0</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-invisible-glyph" title="hb_buffer_get_invisible_glyph ()">hb_buffer_get_invisible_glyph</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-invisible-glyph" title="hb_buffer_set_invisible_glyph ()">hb_buffer_set_invisible_glyph</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#HB-FEATURE-GLOBAL-END:CAPS" title="HB_FEATURE_GLOBAL_END">HB_FEATURE_GLOBAL_END</a>, macro in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#HB-FEATURE-GLOBAL-START:CAPS" title="HB_FEATURE_GLOBAL_START">HB_FEATURE_GLOBAL_START</a>, macro in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-nominal-glyphs-func" title="hb_font_funcs_set_nominal_glyphs_func ()">hb_font_funcs_set_nominal_glyphs_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-characters" title="hb_ot_layout_feature_get_characters ()">hb_ot_layout_feature_get_characters</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-name-ids" title="hb_ot_layout_feature_get_name_ids ()">hb_ot_layout_feature_get_name_ids</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-script-select-language" title="hb_ot_layout_script_select_language ()">hb_ot_layout_script_select_language</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-select-script" title="hb_ot_layout_table_select_script ()">hb_ot_layout_table_select_script</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-MAX-TAGS-PER-LANGUAGE:CAPS" title="HB_OT_MAX_TAGS_PER_LANGUAGE">HB_OT_MAX_TAGS_PER_LANGUAGE</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-MAX-TAGS-PER-SCRIPT:CAPS" title="HB_OT_MAX_TAGS_PER_SCRIPT">HB_OT_MAX_TAGS_PER_SCRIPT</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t">hb_ot_name_id_t</a>, typedef in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tags-from-script-and-language" title="hb_ot_tags_from_script_and_language ()">hb_ot_tags_from_script_and_language</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tags-to-script-and-language" title="hb_ot_tags_to_script_and_language ()">hb_ot_tags_to_script_and_language</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-2-1-0.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-2-1-0.html
new file mode 100644
index 0000000..f1e19aa
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-2-1-0.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.1.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="deprecated-api-index.html" title="Index of deprecated API">
+<link rel="next" href="api-index-2-0-0.html" title="Index of new symbols in 2.0.0">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxC">C</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="deprecated-api-index.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-0-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-1-0"></a>Index of new symbols in 2.1.0</h2></div></div></div>
+<a name="idx"></a><a name="idxC"></a><h3 class="title">C</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-alpha" title="hb_color_get_alpha()">hb_color_get_alpha</a>, macro in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-blue" title="hb_color_get_blue()">hb_color_get_blue</a>, macro in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-green" title="hb_color_get_green()">hb_color_get_green</a>, macro in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-red" title="hb_color_get_red()">hb_color_get_red</a>, macro in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t">hb_color_t</a>, typedef in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-get-layers" title="hb_ot_color_glyph_get_layers ()">hb_ot_color_glyph_get_layers</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-reference-png" title="hb_ot_color_glyph_reference_png ()">hb_ot_color_glyph_reference_png</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-reference-svg" title="hb_ot_color_glyph_reference_svg ()">hb_ot_color_glyph_reference_svg</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-layers" title="hb_ot_color_has_layers ()">hb_ot_color_has_layers</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-palettes" title="hb_ot_color_has_palettes ()">hb_ot_color_has_palettes</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-png" title="hb_ot_color_has_png ()">hb_ot_color_has_png</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-svg" title="hb_ot_color_has_svg ()">hb_ot_color_has_svg</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-color-get-name-id" title="hb_ot_color_palette_color_get_name_id ()">hb_ot_color_palette_color_get_name_id</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-flags-t" title="enum hb_ot_color_palette_flags_t">hb_ot_color_palette_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-colors" title="hb_ot_color_palette_get_colors ()">hb_ot_color_palette_get_colors</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-count" title="hb_ot_color_palette_get_count ()">hb_ot_color_palette_get_count</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-flags" title="hb_ot_color_palette_get_flags ()">hb_ot_color_palette_get_flags</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-name-id" title="hb_ot_color_palette_get_name_id ()">hb_ot_color_palette_get_name_id</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf16" title="hb_ot_name_get_utf16 ()">hb_ot_name_get_utf16</a>, function in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf32" title="hb_ot_name_get_utf32 ()">hb_ot_name_get_utf32</a>, function in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf8" title="hb_ot_name_get_utf8 ()">hb_ot_name_get_utf8</a>, function in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-list-names" title="hb_ot_name_list_names ()">hb_ot_name_list_names</a>, function in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-full.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-full.html
new file mode 100644
index 0000000..5e0cb84
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/api-index-full.html
@@ -0,0 +1,2367 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>API Index: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="harfbuzz-hb-uniscribe.html" title="hb-uniscribe">
+<link rel="next" href="deprecated-api-index.html" title="Index of deprecated API">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxA">A</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxC">C</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxD">D</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxG">G</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxI">I</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxL">L</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxM">M</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxP">P</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxR">R</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxT">T</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxU">U</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxV">V</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-uniscribe.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="deprecated-api-index.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-full"></a>API Index</h2></div></div></div>
+<a name="idx"></a><a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-t" title="enum hb_aat_layout_feature_selector_t">hb_aat_layout_feature_selector_t</a>, enum in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-get-name-id" title="hb_aat_layout_feature_type_get_name_id ()">hb_aat_layout_feature_type_get_name_id</a>, function in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-get-selector-infos" title="hb_aat_layout_feature_type_get_selector_infos ()">hb_aat_layout_feature_type_get_selector_infos</a>, function in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-t" title="enum hb_aat_layout_feature_type_t">hb_aat_layout_feature_type_t</a>, enum in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-get-feature-types" title="hb_aat_layout_get_feature_types ()">hb_aat_layout_get_feature_types</a>, function in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-positioning" title="hb_aat_layout_has_positioning ()">hb_aat_layout_has_positioning</a>, function in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-substitution" title="hb_aat_layout_has_substitution ()">hb_aat_layout_has_substitution</a>, function in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-tracking" title="hb_aat_layout_has_tracking ()">hb_aat_layout_has_tracking</a>, function in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-NO-SELECTOR-INDEX:CAPS" title="HB_AAT_LAYOUT_NO_SELECTOR_INDEX">HB_AAT_LAYOUT_NO_SELECTOR_INDEX</a>, macro in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-copy-writable-or-fail" title="hb_blob_copy_writable_or_fail ()">hb_blob_copy_writable_or_fail</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create" title="hb_blob_create ()">hb_blob_create</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-from-file" title="hb_blob_create_from_file ()">hb_blob_create_from_file</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-sub-blob" title="hb_blob_create_sub_blob ()">hb_blob_create_sub_blob</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-destroy" title="hb_blob_destroy ()">hb_blob_destroy</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-data" title="hb_blob_get_data ()">hb_blob_get_data</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-data-writable" title="hb_blob_get_data_writable ()">hb_blob_get_data_writable</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-empty" title="hb_blob_get_empty ()">hb_blob_get_empty</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-length" title="hb_blob_get_length ()">hb_blob_get_length</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-user-data" title="hb_blob_get_user_data ()">hb_blob_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-is-immutable" title="hb_blob_is_immutable ()">hb_blob_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-make-immutable" title="hb_blob_make_immutable ()">hb_blob_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-reference" title="hb_blob_reference ()">hb_blob_reference</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-set-user-data" title="hb_blob_set_user_data ()">hb_blob_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t">hb_blob_t</a>, typedef in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t">hb_bool_t</a>, typedef in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add" title="hb_buffer_add ()">hb_buffer_add</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-codepoints" title="hb_buffer_add_codepoints ()">hb_buffer_add_codepoints</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-latin1" title="hb_buffer_add_latin1 ()">hb_buffer_add_latin1</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-utf16" title="hb_buffer_add_utf16 ()">hb_buffer_add_utf16</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-utf32" title="hb_buffer_add_utf32 ()">hb_buffer_add_utf32</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-utf8" title="hb_buffer_add_utf8 ()">hb_buffer_add_utf8</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-allocation-successful" title="hb_buffer_allocation_successful ()">hb_buffer_allocation_successful</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-append" title="hb_buffer_append ()">hb_buffer_append</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-clear-contents" title="hb_buffer_clear_contents ()">hb_buffer_clear_contents</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-cluster-level-t" title="enum hb_buffer_cluster_level_t">hb_buffer_cluster_level_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-content-type-t" title="enum hb_buffer_content_type_t">hb_buffer_content_type_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-create" title="hb_buffer_create ()">hb_buffer_create</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-deserialize-glyphs" title="hb_buffer_deserialize_glyphs ()">hb_buffer_deserialize_glyphs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-destroy" title="hb_buffer_destroy ()">hb_buffer_destroy</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-diff" title="hb_buffer_diff ()">hb_buffer_diff</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-diff-flags-t" title="enum hb_buffer_diff_flags_t">hb_buffer_diff_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-BUFFER-FLAGS-DEFAULT:CAPS" title="HB_BUFFER_FLAGS_DEFAULT">HB_BUFFER_FLAGS_DEFAULT</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t">hb_buffer_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-cluster-level" title="hb_buffer_get_cluster_level ()">hb_buffer_get_cluster_level</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-content-type" title="hb_buffer_get_content_type ()">hb_buffer_get_content_type</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-direction" title="hb_buffer_get_direction ()">hb_buffer_get_direction</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-empty" title="hb_buffer_get_empty ()">hb_buffer_get_empty</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-flags" title="hb_buffer_get_flags ()">hb_buffer_get_flags</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-glyph-infos" title="hb_buffer_get_glyph_infos ()">hb_buffer_get_glyph_infos</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-glyph-positions" title="hb_buffer_get_glyph_positions ()">hb_buffer_get_glyph_positions</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-invisible-glyph" title="hb_buffer_get_invisible_glyph ()">hb_buffer_get_invisible_glyph</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-language" title="hb_buffer_get_language ()">hb_buffer_get_language</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-length" title="hb_buffer_get_length ()">hb_buffer_get_length</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-replacement-codepoint" title="hb_buffer_get_replacement_codepoint ()">hb_buffer_get_replacement_codepoint</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-script" title="hb_buffer_get_script ()">hb_buffer_get_script</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-segment-properties" title="hb_buffer_get_segment_properties ()">hb_buffer_get_segment_properties</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-unicode-funcs" title="hb_buffer_get_unicode_funcs ()">hb_buffer_get_unicode_funcs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-user-data" title="hb_buffer_get_user_data ()">hb_buffer_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-guess-segment-properties" title="hb_buffer_guess_segment_properties ()">hb_buffer_guess_segment_properties</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-message-func-t" title="hb_buffer_message_func_t ()">hb_buffer_message_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-normalize-glyphs" title="hb_buffer_normalize_glyphs ()">hb_buffer_normalize_glyphs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-pre-allocate" title="hb_buffer_pre_allocate ()">hb_buffer_pre_allocate</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reference" title="hb_buffer_reference ()">hb_buffer_reference</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-REPLACEMENT-CODEPOINT-DEFAULT:CAPS" title="HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT">HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT</a>, macro in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reset" title="hb_buffer_reset ()">hb_buffer_reset</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reverse" title="hb_buffer_reverse ()">hb_buffer_reverse</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reverse-clusters" title="hb_buffer_reverse_clusters ()">hb_buffer_reverse_clusters</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reverse-range" title="hb_buffer_reverse_range ()">hb_buffer_reverse_range</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-BUFFER-SERIALIZE-FLAGS-DEFAULT:CAPS" title="HB_BUFFER_SERIALIZE_FLAGS_DEFAULT">HB_BUFFER_SERIALIZE_FLAGS_DEFAULT</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t">hb_buffer_serialize_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-from-string" title="hb_buffer_serialize_format_from_string ()">hb_buffer_serialize_format_from_string</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t">hb_buffer_serialize_format_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-to-string" title="hb_buffer_serialize_format_to_string ()">hb_buffer_serialize_format_to_string</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-glyphs" title="hb_buffer_serialize_glyphs ()">hb_buffer_serialize_glyphs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-list-formats" title="hb_buffer_serialize_list_formats ()">hb_buffer_serialize_list_formats</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-cluster-level" title="hb_buffer_set_cluster_level ()">hb_buffer_set_cluster_level</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-content-type" title="hb_buffer_set_content_type ()">hb_buffer_set_content_type</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-direction" title="hb_buffer_set_direction ()">hb_buffer_set_direction</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-flags" title="hb_buffer_set_flags ()">hb_buffer_set_flags</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-invisible-glyph" title="hb_buffer_set_invisible_glyph ()">hb_buffer_set_invisible_glyph</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-language" title="hb_buffer_set_language ()">hb_buffer_set_language</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-length" title="hb_buffer_set_length ()">hb_buffer_set_length</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-message-func" title="hb_buffer_set_message_func ()">hb_buffer_set_message_func</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-codepoint" title="hb_buffer_set_replacement_codepoint ()">hb_buffer_set_replacement_codepoint</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-script" title="hb_buffer_set_script ()">hb_buffer_set_script</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-segment-properties" title="hb_buffer_set_segment_properties ()">hb_buffer_set_segment_properties</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-unicode-funcs" title="hb_buffer_set_unicode_funcs ()">hb_buffer_set_unicode_funcs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-user-data" title="hb_buffer_set_user_data ()">hb_buffer_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t">hb_buffer_t</a>, typedef in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<a name="idxC"></a><h3 class="title">C</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t">hb_codepoint_t</a>, typedef in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#HB-COLOR:CAPS" title="HB_COLOR()">HB_COLOR</a>, macro in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-alpha" title="hb_color_get_alpha()">hb_color_get_alpha</a>, macro in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-blue" title="hb_color_get_blue()">hb_color_get_blue</a>, macro in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-green" title="hb_color_get_green()">hb_color_get_green</a>, macro in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-red" title="hb_color_get_red()">hb_color_get_red</a>, macro in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t">hb_color_t</a>, typedef in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-face-create" title="hb_coretext_face_create ()">hb_coretext_face_create</a>, function in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-face-get-cg-font" title="hb_coretext_face_get_cg_font ()">hb_coretext_face_get_cg_font</a>, function in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-font-create" title="hb_coretext_font_create ()">hb_coretext_font_create</a>, function in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-font-get-ct-font" title="hb_coretext_font_get_ct_font ()">hb_coretext_font_get_ct_font</a>, function in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-KERX:CAPS" title="HB_CORETEXT_TAG_KERX">HB_CORETEXT_TAG_KERX</a>, macro in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORT:CAPS" title="HB_CORETEXT_TAG_MORT">HB_CORETEXT_TAG_MORT</a>, macro in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORX:CAPS" title="HB_CORETEXT_TAG_MORX">HB_CORETEXT_TAG_MORX</a>, macro in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
+</dt>
+<dd></dd>
+<a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()">hb_destroy_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-direction-from-string" title="hb_direction_from_string ()">hb_direction_from_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-BACKWARD:CAPS" title="HB_DIRECTION_IS_BACKWARD()">HB_DIRECTION_IS_BACKWARD</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-FORWARD:CAPS" title="HB_DIRECTION_IS_FORWARD()">HB_DIRECTION_IS_FORWARD</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-HORIZONTAL:CAPS" title="HB_DIRECTION_IS_HORIZONTAL()">HB_DIRECTION_IS_HORIZONTAL</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-VALID:CAPS" title="HB_DIRECTION_IS_VALID()">HB_DIRECTION_IS_VALID</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-VERTICAL:CAPS" title="HB_DIRECTION_IS_VERTICAL()">HB_DIRECTION_IS_VERTICAL</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-REVERSE:CAPS" title="HB_DIRECTION_REVERSE()">HB_DIRECTION_REVERSE</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t">hb_direction_t</a>, enum in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-direction-to-string" title="hb_direction_to_string ()">hb_direction_to_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-builder-add-table" title="hb_face_builder_add_table ()">hb_face_builder_add_table</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-builder-create" title="hb_face_builder_create ()">hb_face_builder_create</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-collect-unicodes" title="hb_face_collect_unicodes ()">hb_face_collect_unicodes</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-collect-variation-selectors" title="hb_face_collect_variation_selectors ()">hb_face_collect_variation_selectors</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-collect-variation-unicodes" title="hb_face_collect_variation_unicodes ()">hb_face_collect_variation_unicodes</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-count" title="hb_face_count ()">hb_face_count</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-create" title="hb_face_create ()">hb_face_create</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-create-for-tables" title="hb_face_create_for_tables ()">hb_face_create_for_tables</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-destroy" title="hb_face_destroy ()">hb_face_destroy</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-empty" title="hb_face_get_empty ()">hb_face_get_empty</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-glyph-count" title="hb_face_get_glyph_count ()">hb_face_get_glyph_count</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-index" title="hb_face_get_index ()">hb_face_get_index</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-table-tags" title="hb_face_get_table_tags ()">hb_face_get_table_tags</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-upem" title="hb_face_get_upem ()">hb_face_get_upem</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-user-data" title="hb_face_get_user_data ()">hb_face_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-is-immutable" title="hb_face_is_immutable ()">hb_face_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-make-immutable" title="hb_face_make_immutable ()">hb_face_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-reference" title="hb_face_reference ()">hb_face_reference</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-reference-blob" title="hb_face_reference_blob ()">hb_face_reference_blob</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-reference-table" title="hb_face_reference_table ()">hb_face_reference_table</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-glyph-count" title="hb_face_set_glyph_count ()">hb_face_set_glyph_count</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-index" title="hb_face_set_index ()">hb_face_set_index</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-upem" title="hb_face_set_upem ()">hb_face_set_upem</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-user-data" title="hb_face_set_user_data ()">hb_face_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t">hb_face_t</a>, typedef in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#hb-feature-from-string" title="hb_feature_from_string ()">hb_feature_from_string</a>, function in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#HB-FEATURE-GLOBAL-END:CAPS" title="HB_FEATURE_GLOBAL_END">HB_FEATURE_GLOBAL_END</a>, macro in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#HB-FEATURE-GLOBAL-START:CAPS" title="HB_FEATURE_GLOBAL_START">HB_FEATURE_GLOBAL_START</a>, macro in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#hb-feature-t-struct" title="hb_feature_t">hb_feature_t</a>, struct in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#hb-feature-to-string" title="hb_feature_to_string ()">hb_feature_to_string</a>, function in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-add-glyph-origin-for-direction" title="hb_font_add_glyph_origin_for_direction ()">hb_font_add_glyph_origin_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-create" title="hb_font_create ()">hb_font_create</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-create-sub-font" title="hb_font_create_sub_font ()">hb_font_create_sub_font</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-destroy" title="hb_font_destroy ()">hb_font_destroy</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-create" title="hb_font_funcs_create ()">hb_font_funcs_create</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-destroy" title="hb_font_funcs_destroy ()">hb_font_funcs_destroy</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-get-empty" title="hb_font_funcs_get_empty ()">hb_font_funcs_get_empty</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-get-user-data" title="hb_font_funcs_get_user_data ()">hb_font_funcs_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-is-immutable" title="hb_font_funcs_is_immutable ()">hb_font_funcs_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-make-immutable" title="hb_font_funcs_make_immutable ()">hb_font_funcs_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-reference" title="hb_font_funcs_reference ()">hb_font_funcs_reference</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-font-h-extents-func" title="hb_font_funcs_set_font_h_extents_func ()">hb_font_funcs_set_font_h_extents_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-font-v-extents-func" title="hb_font_funcs_set_font_v_extents_func ()">hb_font_funcs_set_font_v_extents_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-contour-point-func" title="hb_font_funcs_set_glyph_contour_point_func ()">hb_font_funcs_set_glyph_contour_point_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-extents-func" title="hb_font_funcs_set_glyph_extents_func ()">hb_font_funcs_set_glyph_extents_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-from-name-func" title="hb_font_funcs_set_glyph_from_name_func ()">hb_font_funcs_set_glyph_from_name_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-advances-func" title="hb_font_funcs_set_glyph_h_advances_func ()">hb_font_funcs_set_glyph_h_advances_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-advance-func" title="hb_font_funcs_set_glyph_h_advance_func ()">hb_font_funcs_set_glyph_h_advance_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-h-kerning-func" title="hb_font_funcs_set_glyph_h_kerning_func ()">hb_font_funcs_set_glyph_h_kerning_func</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-origin-func" title="hb_font_funcs_set_glyph_h_origin_func ()">hb_font_funcs_set_glyph_h_origin_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-name-func" title="hb_font_funcs_set_glyph_name_func ()">hb_font_funcs_set_glyph_name_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-advances-func" title="hb_font_funcs_set_glyph_v_advances_func ()">hb_font_funcs_set_glyph_v_advances_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-advance-func" title="hb_font_funcs_set_glyph_v_advance_func ()">hb_font_funcs_set_glyph_v_advance_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-v-kerning-func" title="hb_font_funcs_set_glyph_v_kerning_func ()">hb_font_funcs_set_glyph_v_kerning_func</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-origin-func" title="hb_font_funcs_set_glyph_v_origin_func ()">hb_font_funcs_set_glyph_v_origin_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-nominal-glyphs-func" title="hb_font_funcs_set_nominal_glyphs_func ()">hb_font_funcs_set_nominal_glyphs_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-nominal-glyph-func" title="hb_font_funcs_set_nominal_glyph_func ()">hb_font_funcs_set_nominal_glyph_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-user-data" title="hb_font_funcs_set_user_data ()">hb_font_funcs_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-variation-glyph-func" title="hb_font_funcs_set_variation_glyph_func ()">hb_font_funcs_set_variation_glyph_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t">hb_font_funcs_t</a>, typedef in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-empty" title="hb_font_get_empty ()">hb_font_get_empty</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-extents-for-direction" title="hb_font_get_extents_for_direction ()">hb_font_get_extents_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-face" title="hb_font_get_face ()">hb_font_get_face</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-font-extents-func-t" title="hb_font_get_font_extents_func_t ()">hb_font_get_font_extents_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-font-h-extents-func-t" title="hb_font_get_font_h_extents_func_t">hb_font_get_font_h_extents_func_t</a>, typedef in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-font-v-extents-func-t" title="hb_font_get_font_v_extents_func_t">hb_font_get_font_v_extents_func_t</a>, typedef in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph" title="hb_font_get_glyph ()">hb_font_get_glyph</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-advances-for-direction" title="hb_font_get_glyph_advances_for_direction ()">hb_font_get_glyph_advances_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-advances-func-t" title="hb_font_get_glyph_advances_func_t ()">hb_font_get_glyph_advances_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-advance-for-direction" title="hb_font_get_glyph_advance_for_direction ()">hb_font_get_glyph_advance_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-advance-func-t" title="hb_font_get_glyph_advance_func_t ()">hb_font_get_glyph_advance_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point" title="hb_font_get_glyph_contour_point ()">hb_font_get_glyph_contour_point</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point-for-origin" title="hb_font_get_glyph_contour_point_for_origin ()">hb_font_get_glyph_contour_point_for_origin</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point-func-t" title="hb_font_get_glyph_contour_point_func_t ()">hb_font_get_glyph_contour_point_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-extents" title="hb_font_get_glyph_extents ()">hb_font_get_glyph_extents</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-extents-for-origin" title="hb_font_get_glyph_extents_for_origin ()">hb_font_get_glyph_extents_for_origin</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-extents-func-t" title="hb_font_get_glyph_extents_func_t ()">hb_font_get_glyph_extents_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-from-name" title="hb_font_get_glyph_from_name ()">hb_font_get_glyph_from_name</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-from-name-func-t" title="hb_font_get_glyph_from_name_func_t ()">hb_font_get_glyph_from_name_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-func-t" title="hb_font_get_glyph_func_t ()">hb_font_get_glyph_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advance" title="hb_font_get_glyph_h_advance ()">hb_font_get_glyph_h_advance</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advances" title="hb_font_get_glyph_h_advances ()">hb_font_get_glyph_h_advances</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advances-func-t" title="hb_font_get_glyph_h_advances_func_t">hb_font_get_glyph_h_advances_func_t</a>, typedef in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advance-func-t" title="hb_font_get_glyph_h_advance_func_t">hb_font_get_glyph_h_advance_func_t</a>, typedef in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-h-kerning" title="hb_font_get_glyph_h_kerning ()">hb_font_get_glyph_h_kerning</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-h-kerning-func-t" title="hb_font_get_glyph_h_kerning_func_t">hb_font_get_glyph_h_kerning_func_t</a>, typedef in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-origin" title="hb_font_get_glyph_h_origin ()">hb_font_get_glyph_h_origin</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-origin-func-t" title="hb_font_get_glyph_h_origin_func_t">hb_font_get_glyph_h_origin_func_t</a>, typedef in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-kerning-for-direction" title="hb_font_get_glyph_kerning_for_direction ()">hb_font_get_glyph_kerning_for_direction</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-kerning-func-t" title="hb_font_get_glyph_kerning_func_t ()">hb_font_get_glyph_kerning_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-name" title="hb_font_get_glyph_name ()">hb_font_get_glyph_name</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-name-func-t" title="hb_font_get_glyph_name_func_t ()">hb_font_get_glyph_name_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-origin-for-direction" title="hb_font_get_glyph_origin_for_direction ()">hb_font_get_glyph_origin_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-origin-func-t" title="hb_font_get_glyph_origin_func_t ()">hb_font_get_glyph_origin_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advance" title="hb_font_get_glyph_v_advance ()">hb_font_get_glyph_v_advance</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advances" title="hb_font_get_glyph_v_advances ()">hb_font_get_glyph_v_advances</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advances-func-t" title="hb_font_get_glyph_v_advances_func_t">hb_font_get_glyph_v_advances_func_t</a>, typedef in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advance-func-t" title="hb_font_get_glyph_v_advance_func_t">hb_font_get_glyph_v_advance_func_t</a>, typedef in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning" title="hb_font_get_glyph_v_kerning ()">hb_font_get_glyph_v_kerning</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning-func-t" title="hb_font_get_glyph_v_kerning_func_t">hb_font_get_glyph_v_kerning_func_t</a>, typedef in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-origin" title="hb_font_get_glyph_v_origin ()">hb_font_get_glyph_v_origin</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-origin-func-t" title="hb_font_get_glyph_v_origin_func_t">hb_font_get_glyph_v_origin_func_t</a>, typedef in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-h-extents" title="hb_font_get_h_extents ()">hb_font_get_h_extents</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-nominal-glyph" title="hb_font_get_nominal_glyph ()">hb_font_get_nominal_glyph</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-nominal-glyph-func-t" title="hb_font_get_nominal_glyph_func_t ()">hb_font_get_nominal_glyph_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-parent" title="hb_font_get_parent ()">hb_font_get_parent</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-ppem" title="hb_font_get_ppem ()">hb_font_get_ppem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-ptem" title="hb_font_get_ptem ()">hb_font_get_ptem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-scale" title="hb_font_get_scale ()">hb_font_get_scale</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-user-data" title="hb_font_get_user_data ()">hb_font_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-variation-glyph" title="hb_font_get_variation_glyph ()">hb_font_get_variation_glyph</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-variation-glyph-func-t" title="hb_font_get_variation_glyph_func_t ()">hb_font_get_variation_glyph_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-var-coords-normalized" title="hb_font_get_var_coords_normalized ()">hb_font_get_var_coords_normalized</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-v-extents" title="hb_font_get_v_extents ()">hb_font_get_v_extents</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-glyph-from-string" title="hb_font_glyph_from_string ()">hb_font_glyph_from_string</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-glyph-to-string" title="hb_font_glyph_to_string ()">hb_font_glyph_to_string</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-is-immutable" title="hb_font_is_immutable ()">hb_font_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-make-immutable" title="hb_font_make_immutable ()">hb_font_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-reference" title="hb_font_reference ()">hb_font_reference</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-face" title="hb_font_set_face ()">hb_font_set_face</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-funcs" title="hb_font_set_funcs ()">hb_font_set_funcs</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-funcs-data" title="hb_font_set_funcs_data ()">hb_font_set_funcs_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-parent" title="hb_font_set_parent ()">hb_font_set_parent</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-ppem" title="hb_font_set_ppem ()">hb_font_set_ppem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-ptem" title="hb_font_set_ptem ()">hb_font_set_ptem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-scale" title="hb_font_set_scale ()">hb_font_set_scale</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-user-data" title="hb_font_set_user_data ()">hb_font_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-variations" title="hb_font_set_variations ()">hb_font_set_variations</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-var-coords-design" title="hb_font_set_var_coords_design ()">hb_font_set_var_coords_design</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-var-coords-normalized" title="hb_font_set_var_coords_normalized ()">hb_font_set_var_coords_normalized</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-subtract-glyph-origin-for-direction" title="hb_font_subtract_glyph_origin_for_direction ()">hb_font_subtract_glyph_origin_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t">hb_font_t</a>, typedef in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create" title="hb_ft_face_create ()">hb_ft_face_create</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create-cached" title="hb_ft_face_create_cached ()">hb_ft_face_create_cached</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create-referenced" title="hb_ft_face_create_referenced ()">hb_ft_face_create_referenced</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-changed" title="hb_ft_font_changed ()">hb_ft_font_changed</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create" title="hb_ft_font_create ()">hb_ft_font_create</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create-referenced" title="hb_ft_font_create_referenced ()">hb_ft_font_create_referenced</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-get-face" title="hb_ft_font_get_face ()">hb_ft_font_get_face</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-get-load-flags" title="hb_ft_font_get_load_flags ()">hb_ft_font_get_load_flags</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-set-funcs" title="hb_ft_font_set_funcs ()">hb_ft_font_set_funcs</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-set-load-flags" title="hb_ft_font_set_load_flags ()">hb_ft_font_set_load_flags</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<a name="idxG"></a><h3 class="title">G</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-glib.html#hb-glib-blob-create" title="hb_glib_blob_create ()">hb_glib_blob_create</a>, function in <a class="link" href="harfbuzz-hb-glib.html" title="hb-glib">hb-glib</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-glib.html#hb-glib-get-unicode-funcs" title="hb_glib_get_unicode_funcs ()">hb_glib_get_unicode_funcs</a>, function in <a class="link" href="harfbuzz-hb-glib.html" title="hb-glib">hb-glib</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-glib.html#hb-glib-script-from-script" title="hb_glib_script_from_script ()">hb_glib_script_from_script</a>, function in <a class="link" href="harfbuzz-hb-glib.html" title="hb-glib">hb-glib</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-glib.html#hb-glib-script-to-script" title="hb_glib_script_to_script ()">hb_glib_script_to_script</a>, function in <a class="link" href="harfbuzz-hb-glib.html" title="hb-glib">hb-glib</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t">hb_glyph_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-get-glyph-flags" title="hb_glyph_info_get_glyph_flags ()">hb_glyph_info_get_glyph_flags</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct" title="hb_glyph_position_t">hb_glyph_position_t</a>, struct in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-blob-get-type" title="hb_gobject_blob_get_type ()">hb_gobject_blob_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-cluster-level-get-type" title="hb_gobject_buffer_cluster_level_get_type ()">hb_gobject_buffer_cluster_level_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-content-type-get-type" title="hb_gobject_buffer_content_type_get_type ()">hb_gobject_buffer_content_type_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-diff-flags-get-type" title="hb_gobject_buffer_diff_flags_get_type ()">hb_gobject_buffer_diff_flags_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-flags-get-type" title="hb_gobject_buffer_flags_get_type ()">hb_gobject_buffer_flags_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-get-type" title="hb_gobject_buffer_get_type ()">hb_gobject_buffer_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-serialize-flags-get-type" title="hb_gobject_buffer_serialize_flags_get_type ()">hb_gobject_buffer_serialize_flags_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-serialize-format-get-type" title="hb_gobject_buffer_serialize_format_get_type ()">hb_gobject_buffer_serialize_format_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-direction-get-type" title="hb_gobject_direction_get_type ()">hb_gobject_direction_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-face-get-type" title="hb_gobject_face_get_type ()">hb_gobject_face_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-feature-get-type" title="hb_gobject_feature_get_type ()">hb_gobject_feature_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-font-funcs-get-type" title="hb_gobject_font_funcs_get_type ()">hb_gobject_font_funcs_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-font-get-type" title="hb_gobject_font_get_type ()">hb_gobject_font_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-glyph-flags-get-type" title="hb_gobject_glyph_flags_get_type ()">hb_gobject_glyph_flags_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-glyph-info-get-type" title="hb_gobject_glyph_info_get_type ()">hb_gobject_glyph_info_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-glyph-position-get-type" title="hb_gobject_glyph_position_get_type ()">hb_gobject_glyph_position_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-map-get-type" title="hb_gobject_map_get_type ()">hb_gobject_map_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-memory-mode-get-type" title="hb_gobject_memory_mode_get_type ()">hb_gobject_memory_mode_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-color-palette-flags-get-type" title="hb_gobject_ot_color_palette_flags_get_type ()">hb_gobject_ot_color_palette_flags_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-layout-glyph-class-get-type" title="hb_gobject_ot_layout_glyph_class_get_type ()">hb_gobject_ot_layout_glyph_class_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-constant-get-type" title="hb_gobject_ot_math_constant_get_type ()">hb_gobject_ot_math_constant_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-part-flags-get-type" title="hb_gobject_ot_math_glyph_part_flags_get_type ()">hb_gobject_ot_math_glyph_part_flags_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-part-get-type" title="hb_gobject_ot_math_glyph_part_get_type ()">hb_gobject_ot_math_glyph_part_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-variant-get-type" title="hb_gobject_ot_math_glyph_variant_get_type ()">hb_gobject_ot_math_glyph_variant_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-kern-get-type" title="hb_gobject_ot_math_kern_get_type ()">hb_gobject_ot_math_kern_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-script-get-type" title="hb_gobject_script_get_type ()">hb_gobject_script_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-segment-properties-get-type" title="hb_gobject_segment_properties_get_type ()">hb_gobject_segment_properties_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-set-get-type" title="hb_gobject_set_get_type ()">hb_gobject_set_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-shape-plan-get-type" title="hb_gobject_shape_plan_get_type ()">hb_gobject_shape_plan_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BLOB:CAPS" title="HB_GOBJECT_TYPE_BLOB">HB_GOBJECT_TYPE_BLOB</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER:CAPS" title="HB_GOBJECT_TYPE_BUFFER">HB_GOBJECT_TYPE_BUFFER</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-CLUSTER-LEVEL:CAPS" title="HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL">HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-CONTENT-TYPE:CAPS" title="HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE">HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-DIFF-FLAGS:CAPS" title="HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS">HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-FLAGS:CAPS" title="HB_GOBJECT_TYPE_BUFFER_FLAGS">HB_GOBJECT_TYPE_BUFFER_FLAGS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FLAGS:CAPS" title="HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS">HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FORMAT:CAPS" title="HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT">HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-DIRECTION:CAPS" title="HB_GOBJECT_TYPE_DIRECTION">HB_GOBJECT_TYPE_DIRECTION</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FACE:CAPS" title="HB_GOBJECT_TYPE_FACE">HB_GOBJECT_TYPE_FACE</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FEATURE:CAPS" title="HB_GOBJECT_TYPE_FEATURE">HB_GOBJECT_TYPE_FEATURE</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FONT:CAPS" title="HB_GOBJECT_TYPE_FONT">HB_GOBJECT_TYPE_FONT</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FONT-FUNCS:CAPS" title="HB_GOBJECT_TYPE_FONT_FUNCS">HB_GOBJECT_TYPE_FONT_FUNCS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-FLAGS:CAPS" title="HB_GOBJECT_TYPE_GLYPH_FLAGS">HB_GOBJECT_TYPE_GLYPH_FLAGS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-INFO:CAPS" title="HB_GOBJECT_TYPE_GLYPH_INFO">HB_GOBJECT_TYPE_GLYPH_INFO</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-POSITION:CAPS" title="HB_GOBJECT_TYPE_GLYPH_POSITION">HB_GOBJECT_TYPE_GLYPH_POSITION</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-MAP:CAPS" title="HB_GOBJECT_TYPE_MAP">HB_GOBJECT_TYPE_MAP</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-MEMORY-MODE:CAPS" title="HB_GOBJECT_TYPE_MEMORY_MODE">HB_GOBJECT_TYPE_MEMORY_MODE</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-COLOR-PALETTE-FLAGS:CAPS" title="HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS">HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-LAYOUT-GLYPH-CLASS:CAPS" title="HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS">HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-CONSTANT:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_CONSTANT">HB_GOBJECT_TYPE_OT_MATH_CONSTANT</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART">HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART-FLAGS:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS">HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-VARIANT:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT">HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-KERN:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_KERN">HB_GOBJECT_TYPE_OT_MATH_KERN</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SCRIPT:CAPS" title="HB_GOBJECT_TYPE_SCRIPT">HB_GOBJECT_TYPE_SCRIPT</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SEGMENT-PROPERTIES:CAPS" title="HB_GOBJECT_TYPE_SEGMENT_PROPERTIES">HB_GOBJECT_TYPE_SEGMENT_PROPERTIES</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SET:CAPS" title="HB_GOBJECT_TYPE_SET">HB_GOBJECT_TYPE_SET</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SHAPE-PLAN:CAPS" title="HB_GOBJECT_TYPE_SHAPE_PLAN">HB_GOBJECT_TYPE_SHAPE_PLAN</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-COMBINING-CLASS:CAPS" title="HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS">HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-FUNCS:CAPS" title="HB_GOBJECT_TYPE_UNICODE_FUNCS">HB_GOBJECT_TYPE_UNICODE_FUNCS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-GENERAL-CATEGORY:CAPS" title="HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY">HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-USER-DATA-KEY:CAPS" title="HB_GOBJECT_TYPE_USER_DATA_KEY">HB_GOBJECT_TYPE_USER_DATA_KEY</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-unicode-combining-class-get-type" title="hb_gobject_unicode_combining_class_get_type ()">hb_gobject_unicode_combining_class_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-unicode-funcs-get-type" title="hb_gobject_unicode_funcs_get_type ()">hb_gobject_unicode_funcs_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-unicode-general-category-get-type" title="hb_gobject_unicode_general_category_get_type ()">hb_gobject_unicode_general_category_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-user-data-key-get-type" title="hb_gobject_user_data_key_get_type ()">hb_gobject_user_data_key_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-graphite2.html#hb-graphite2-face-get-gr-face" title="hb_graphite2_face_get_gr_face ()">hb_graphite2_face_get_gr_face</a>, function in <a class="link" href="harfbuzz-hb-graphite2.html" title="hb-graphite2">hb-graphite2</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-graphite2.html#HB-GRAPHITE2-TAG-SILF:CAPS" title="HB_GRAPHITE2_TAG_SILF">HB_GRAPHITE2_TAG_SILF</a>, macro in <a class="link" href="harfbuzz-hb-graphite2.html" title="hb-graphite2">hb-graphite2</a>
+</dt>
+<dd></dd>
+<a name="idxI"></a><h3 class="title">I</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-icu.html#hb-icu-get-unicode-funcs" title="hb_icu_get_unicode_funcs ()">hb_icu_get_unicode_funcs</a>, function in <a class="link" href="harfbuzz-hb-icu.html" title="hb-icu">hb-icu</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-icu.html#hb-icu-script-from-script" title="hb_icu_script_from_script ()">hb_icu_script_from_script</a>, function in <a class="link" href="harfbuzz-hb-icu.html" title="hb-icu">hb-icu</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-icu.html#hb-icu-script-to-script" title="hb_icu_script_to_script ()">hb_icu_script_to_script</a>, function in <a class="link" href="harfbuzz-hb-icu.html" title="hb-icu">hb-icu</a>
+</dt>
+<dd></dd>
+<a name="idxL"></a><h3 class="title">L</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-language-from-string" title="hb_language_from_string ()">hb_language_from_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-language-get-default" title="hb_language_get_default ()">hb_language_get_default</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS" title="HB_LANGUAGE_INVALID">HB_LANGUAGE_INVALID</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t">hb_language_t</a>, typedef in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-language-to-string" title="hb_language_to_string ()">hb_language_to_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<a name="idxM"></a><h3 class="title">M</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-allocation-successful" title="hb_map_allocation_successful ()">hb_map_allocation_successful</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-clear" title="hb_map_clear ()">hb_map_clear</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-create" title="hb_map_create ()">hb_map_create</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-del" title="hb_map_del ()">hb_map_del</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-destroy" title="hb_map_destroy ()">hb_map_destroy</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get" title="hb_map_get ()">hb_map_get</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get-empty" title="hb_map_get_empty ()">hb_map_get_empty</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get-population" title="hb_map_get_population ()">hb_map_get_population</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get-user-data" title="hb_map_get_user_data ()">hb_map_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-has" title="hb_map_has ()">hb_map_has</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-is-empty" title="hb_map_is_empty ()">hb_map_is_empty</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-reference" title="hb_map_reference ()">hb_map_reference</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-set" title="hb_map_set ()">hb_map_set</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-set-user-data" title="hb_map_set_user_data ()">hb_map_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-t">hb_map_t</a>, typedef in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#HB-MAP-VALUE-INVALID:CAPS" title="HB_MAP_VALUE_INVALID">HB_MAP_VALUE_INVALID</a>, macro in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-mask-t" title="hb_mask_t">hb_mask_t</a>, typedef in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-memory-mode-t" title="enum hb_memory_mode_t">hb_memory_mode_t</a>, enum in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-get-layers" title="hb_ot_color_glyph_get_layers ()">hb_ot_color_glyph_get_layers</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-reference-png" title="hb_ot_color_glyph_reference_png ()">hb_ot_color_glyph_reference_png</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-reference-svg" title="hb_ot_color_glyph_reference_svg ()">hb_ot_color_glyph_reference_svg</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-layers" title="hb_ot_color_has_layers ()">hb_ot_color_has_layers</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-palettes" title="hb_ot_color_has_palettes ()">hb_ot_color_has_palettes</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-png" title="hb_ot_color_has_png ()">hb_ot_color_has_png</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-svg" title="hb_ot_color_has_svg ()">hb_ot_color_has_svg</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-color-get-name-id" title="hb_ot_color_palette_color_get_name_id ()">hb_ot_color_palette_color_get_name_id</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-flags-t" title="enum hb_ot_color_palette_flags_t">hb_ot_color_palette_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-colors" title="hb_ot_color_palette_get_colors ()">hb_ot_color_palette_get_colors</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-count" title="hb_ot_color_palette_get_count ()">hb_ot_color_palette_get_count</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-flags" title="hb_ot_color_palette_get_flags ()">hb_ot_color_palette_get_flags</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-name-id" title="hb_ot_color_palette_get_name_id ()">hb_ot_color_palette_get_name_id</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-font.html#hb-ot-font-set-funcs" title="hb_ot_font_set_funcs ()">hb_ot_font_set_funcs</a>, function in <a class="link" href="harfbuzz-hb-ot-font.html" title="hb-ot-font">hb-ot-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-features" title="hb_ot_layout_collect_features ()">hb_ot_layout_collect_features</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-lookups" title="hb_ot_layout_collect_lookups ()">hb_ot_layout_collect_lookups</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-DEFAULT-LANGUAGE-INDEX:CAPS" title="HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX">HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-characters" title="hb_ot_layout_feature_get_characters ()">hb_ot_layout_feature_get_characters</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-lookups" title="hb_ot_layout_feature_get_lookups ()">hb_ot_layout_feature_get_lookups</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-name-ids" title="hb_ot_layout_feature_get_name_ids ()">hb_ot_layout_feature_get_name_ids</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-with-variations-get-lookups" title="hb_ot_layout_feature_with_variations_get_lookups ()">hb_ot_layout_feature_with_variations_get_lookups</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-attach-points" title="hb_ot_layout_get_attach_points ()">hb_ot_layout_get_attach_points</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-glyphs-in-class" title="hb_ot_layout_get_glyphs_in_class ()">hb_ot_layout_get_glyphs_in_class</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-glyph-class" title="hb_ot_layout_get_glyph_class ()">hb_ot_layout_get_glyph_class</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-ligature-carets" title="hb_ot_layout_get_ligature_carets ()">hb_ot_layout_get_ligature_carets</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-size-params" title="hb_ot_layout_get_size_params ()">hb_ot_layout_get_size_params</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-glyph-class-t" title="enum hb_ot_layout_glyph_class_t">hb_ot_layout_glyph_class_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-glyph-sequence-func-t" title="hb_ot_layout_glyph_sequence_func_t ()">hb_ot_layout_glyph_sequence_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-has-glyph-classes" title="hb_ot_layout_has_glyph_classes ()">hb_ot_layout_has_glyph_classes</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-has-positioning" title="hb_ot_layout_has_positioning ()">hb_ot_layout_has_positioning</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-has-substitution" title="hb_ot_layout_has_substitution ()">hb_ot_layout_has_substitution</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-find-feature" title="hb_ot_layout_language_find_feature ()">hb_ot_layout_language_find_feature</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-feature-indexes" title="hb_ot_layout_language_get_feature_indexes ()">hb_ot_layout_language_get_feature_indexes</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-feature-tags" title="hb_ot_layout_language_get_feature_tags ()">hb_ot_layout_language_get_feature_tags</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-required-feature" title="hb_ot_layout_language_get_required_feature ()">hb_ot_layout_language_get_required_feature</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-required-feature-index" title="hb_ot_layout_language_get_required_feature_index ()">hb_ot_layout_language_get_required_feature_index</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookups-substitute-closure" title="hb_ot_layout_lookups_substitute_closure ()">hb_ot_layout_lookups_substitute_closure</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-collect-glyphs" title="hb_ot_layout_lookup_collect_glyphs ()">hb_ot_layout_lookup_collect_glyphs</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-substitute-closure" title="hb_ot_layout_lookup_substitute_closure ()">hb_ot_layout_lookup_substitute_closure</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-would-substitute" title="hb_ot_layout_lookup_would_substitute ()">hb_ot_layout_lookup_would_substitute</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-NO-FEATURE-INDEX:CAPS" title="HB_OT_LAYOUT_NO_FEATURE_INDEX">HB_OT_LAYOUT_NO_FEATURE_INDEX</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-NO-SCRIPT-INDEX:CAPS" title="HB_OT_LAYOUT_NO_SCRIPT_INDEX">HB_OT_LAYOUT_NO_SCRIPT_INDEX</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-NO-VARIATIONS-INDEX:CAPS" title="HB_OT_LAYOUT_NO_VARIATIONS_INDEX">HB_OT_LAYOUT_NO_VARIATIONS_INDEX</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-script-get-language-tags" title="hb_ot_layout_script_get_language_tags ()">hb_ot_layout_script_get_language_tags</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-script-select-language" title="hb_ot_layout_script_select_language ()">hb_ot_layout_script_select_language</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-find-feature-variations" title="hb_ot_layout_table_find_feature_variations ()">hb_ot_layout_table_find_feature_variations</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-ot-layout-table-find-script" title="hb_ot_layout_table_find_script ()">hb_ot_layout_table_find_script</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-get-feature-tags" title="hb_ot_layout_table_get_feature_tags ()">hb_ot_layout_table_get_feature_tags</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-get-lookup-count" title="hb_ot_layout_table_get_lookup_count ()">hb_ot_layout_table_get_lookup_count</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-get-script-tags" title="hb_ot_layout_table_get_script_tags ()">hb_ot_layout_table_get_script_tags</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-select-script" title="hb_ot_layout_table_select_script ()">hb_ot_layout_table_select_script</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-constant-t" title="enum hb_ot_math_constant_t">hb_ot_math_constant_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-constant" title="hb_ot_math_get_constant ()">hb_ot_math_get_constant</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-assembly" title="hb_ot_math_get_glyph_assembly ()">hb_ot_math_get_glyph_assembly</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-italics-correction" title="hb_ot_math_get_glyph_italics_correction ()">hb_ot_math_get_glyph_italics_correction</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-kerning" title="hb_ot_math_get_glyph_kerning ()">hb_ot_math_get_glyph_kerning</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-top-accent-attachment" title="hb_ot_math_get_glyph_top_accent_attachment ()">hb_ot_math_get_glyph_top_accent_attachment</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-variants" title="hb_ot_math_get_glyph_variants ()">hb_ot_math_get_glyph_variants</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-min-connector-overlap" title="hb_ot_math_get_min_connector_overlap ()">hb_ot_math_get_min_connector_overlap</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-flags-t" title="enum hb_ot_math_glyph_part_flags_t">hb_ot_math_glyph_part_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t-struct" title="hb_ot_math_glyph_part_t">hb_ot_math_glyph_part_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t-struct" title="hb_ot_math_glyph_variant_t">hb_ot_math_glyph_variant_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-has-data" title="hb_ot_math_has_data ()">hb_ot_math_has_data</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-is-glyph-extended-shape" title="hb_ot_math_is_glyph_extended_shape ()">hb_ot_math_is_glyph_extended_shape</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-t" title="enum hb_ot_math_kern_t">hb_ot_math_kern_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#HB-OT-MATH-SCRIPT:CAPS" title="HB_OT_MATH_SCRIPT">HB_OT_MATH_SCRIPT</a>, macro in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-MAX-TAGS-PER-LANGUAGE:CAPS" title="HB_OT_MAX_TAGS_PER_LANGUAGE">HB_OT_MAX_TAGS_PER_LANGUAGE</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-MAX-TAGS-PER-SCRIPT:CAPS" title="HB_OT_MAX_TAGS_PER_SCRIPT">HB_OT_MAX_TAGS_PER_SCRIPT</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf16" title="hb_ot_name_get_utf16 ()">hb_ot_name_get_utf16</a>, function in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf32" title="hb_ot_name_get_utf32 ()">hb_ot_name_get_utf32</a>, function in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf8" title="hb_ot_name_get_utf8 ()">hb_ot_name_get_utf8</a>, function in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t">hb_ot_name_id_t</a>, typedef in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-list-names" title="hb_ot_name_list_names ()">hb_ot_name_list_names</a>, function in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-shape.html#hb-ot-shape-glyphs-closure" title="hb_ot_shape_glyphs_closure ()">hb_ot_shape_glyphs_closure</a>, function in <a class="link" href="harfbuzz-hb-ot-shape.html" title="hb-ot-shape">hb-ot-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-shape-plan-collect-lookups" title="hb_ot_shape_plan_collect_lookups ()">hb_ot_shape_plan_collect_lookups</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tags-from-script-and-language" title="hb_ot_tags_from_script_and_language ()">hb_ot_tags_from_script_and_language</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tags-to-script-and-language" title="hb_ot_tags_to_script_and_language ()">hb_ot_tags_to_script_and_language</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-BASE:CAPS" title="HB_OT_TAG_BASE">HB_OT_TAG_BASE</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-DEFAULT-LANGUAGE:CAPS" title="HB_OT_TAG_DEFAULT_LANGUAGE">HB_OT_TAG_DEFAULT_LANGUAGE</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-DEFAULT-SCRIPT:CAPS" title="HB_OT_TAG_DEFAULT_SCRIPT">HB_OT_TAG_DEFAULT_SCRIPT</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GDEF:CAPS" title="HB_OT_TAG_GDEF">HB_OT_TAG_GDEF</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS">HB_OT_TAG_GPOS</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB">HB_OT_TAG_GSUB</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-JSTF:CAPS" title="HB_OT_TAG_JSTF">HB_OT_TAG_JSTF</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#HB-OT-TAG-MATH:CAPS" title="HB_OT_TAG_MATH">HB_OT_TAG_MATH</a>, macro in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tag-to-language" title="hb_ot_tag_to_language ()">hb_ot_tag_to_language</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tag-to-script" title="hb_ot_tag_to_script ()">hb_ot_tag_to_script</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-ITALIC:CAPS" title="HB_OT_TAG_VAR_AXIS_ITALIC">HB_OT_TAG_VAR_AXIS_ITALIC</a>, macro in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-OPTICAL-SIZE:CAPS" title="HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE">HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE</a>, macro in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-SLANT:CAPS" title="HB_OT_TAG_VAR_AXIS_SLANT">HB_OT_TAG_VAR_AXIS_SLANT</a>, macro in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-WEIGHT:CAPS" title="HB_OT_TAG_VAR_AXIS_WEIGHT">HB_OT_TAG_VAR_AXIS_WEIGHT</a>, macro in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-WIDTH:CAPS" title="HB_OT_TAG_VAR_AXIS_WIDTH">HB_OT_TAG_VAR_AXIS_WIDTH</a>, macro in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-axis-flags-t" title="enum hb_ot_var_axis_flags_t">hb_ot_var_axis_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-find-axis-info" title="hb_ot_var_find_axis_info ()">hb_ot_var_find_axis_info</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-get-axis-count" title="hb_ot_var_get_axis_count ()">hb_ot_var_get_axis_count</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-get-axis-infos" title="hb_ot_var_get_axis_infos ()">hb_ot_var_get_axis_infos</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-get-named-instance-count" title="hb_ot_var_get_named_instance_count ()">hb_ot_var_get_named_instance_count</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-has-data" title="hb_ot_var_has_data ()">hb_ot_var_has_data</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-design-coords" title="hb_ot_var_named_instance_get_design_coords ()">hb_ot_var_named_instance_get_design_coords</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-postscript-name-id" title="hb_ot_var_named_instance_get_postscript_name_id ()">hb_ot_var_named_instance_get_postscript_name_id</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-subfamily-name-id" title="hb_ot_var_named_instance_get_subfamily_name_id ()">hb_ot_var_named_instance_get_subfamily_name_id</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-normalize-coords" title="hb_ot_var_normalize_coords ()">hb_ot_var_normalize_coords</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-normalize-variations" title="hb_ot_var_normalize_variations ()">hb_ot_var_normalize_variations</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-OT-VAR-NO-AXIS-INDEX:CAPS" title="HB_OT_VAR_NO_AXIS_INDEX">HB_OT_VAR_NO_AXIS_INDEX</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<a name="idxP"></a><h3 class="title">P</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t">hb_position_t</a>, typedef in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<a name="idxR"></a><h3 class="title">R</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-reference-table-func-t" title="hb_reference_table_func_t ()">hb_reference_table_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-SCRIPT-CANADIAN-ABORIGINAL:CAPS" title="HB_SCRIPT_CANADIAN_ABORIGINAL">HB_SCRIPT_CANADIAN_ABORIGINAL</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-script-from-iso15924-tag" title="hb_script_from_iso15924_tag ()">hb_script_from_iso15924_tag</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-script-from-string" title="hb_script_from_string ()">hb_script_from_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-script-get-horizontal-direction" title="hb_script_get_horizontal_direction ()">hb_script_get_horizontal_direction</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t">hb_script_t</a>, enum in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-script-to-iso15924-tag" title="hb_script_to_iso15924_tag ()">hb_script_to_iso15924_tag</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#HB-SEGMENT-PROPERTIES-DEFAULT:CAPS" title="HB_SEGMENT_PROPERTIES_DEFAULT">HB_SEGMENT_PROPERTIES_DEFAULT</a>, macro in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-equal" title="hb_segment_properties_equal ()">hb_segment_properties_equal</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-hash" title="hb_segment_properties_hash ()">hb_segment_properties_hash</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t-struct" title="hb_segment_properties_t">hb_segment_properties_t</a>, struct in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-add" title="hb_set_add ()">hb_set_add</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-add-range" title="hb_set_add_range ()">hb_set_add_range</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-allocation-successful" title="hb_set_allocation_successful ()">hb_set_allocation_successful</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-clear" title="hb_set_clear ()">hb_set_clear</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-create" title="hb_set_create ()">hb_set_create</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-del" title="hb_set_del ()">hb_set_del</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-del-range" title="hb_set_del_range ()">hb_set_del_range</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-destroy" title="hb_set_destroy ()">hb_set_destroy</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-empty" title="hb_set_get_empty ()">hb_set_get_empty</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-max" title="hb_set_get_max ()">hb_set_get_max</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-min" title="hb_set_get_min ()">hb_set_get_min</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-population" title="hb_set_get_population ()">hb_set_get_population</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-user-data" title="hb_set_get_user_data ()">hb_set_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-has" title="hb_set_has ()">hb_set_has</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-intersect" title="hb_set_intersect ()">hb_set_intersect</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-is-empty" title="hb_set_is_empty ()">hb_set_is_empty</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-is-equal" title="hb_set_is_equal ()">hb_set_is_equal</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-is-subset" title="hb_set_is_subset ()">hb_set_is_subset</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-next" title="hb_set_next ()">hb_set_next</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-next-range" title="hb_set_next_range ()">hb_set_next_range</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-previous" title="hb_set_previous ()">hb_set_previous</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-previous-range" title="hb_set_previous_range ()">hb_set_previous_range</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-reference" title="hb_set_reference ()">hb_set_reference</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-set" title="hb_set_set ()">hb_set_set</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-set-user-data" title="hb_set_set_user_data ()">hb_set_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-subtract" title="hb_set_subtract ()">hb_set_subtract</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-symmetric-difference" title="hb_set_symmetric_difference ()">hb_set_symmetric_difference</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-t">hb_set_t</a>, typedef in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-union" title="hb_set_union ()">hb_set_union</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID">HB_SET_VALUE_INVALID</a>, macro in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape ()">hb_shape</a>, function in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#hb-shape-full" title="hb_shape_full ()">hb_shape_full</a>, function in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#hb-shape-list-shapers" title="hb_shape_list_shapers ()">hb_shape_list_shapers</a>, function in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create" title="hb_shape_plan_create ()">hb_shape_plan_create</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create2" title="hb_shape_plan_create2 ()">hb_shape_plan_create2</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached" title="hb_shape_plan_create_cached ()">hb_shape_plan_create_cached</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached2" title="hb_shape_plan_create_cached2 ()">hb_shape_plan_create_cached2</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-destroy" title="hb_shape_plan_destroy ()">hb_shape_plan_destroy</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-execute" title="hb_shape_plan_execute ()">hb_shape_plan_execute</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-empty" title="hb_shape_plan_get_empty ()">hb_shape_plan_get_empty</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-shaper" title="hb_shape_plan_get_shaper ()">hb_shape_plan_get_shaper</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-user-data" title="hb_shape_plan_get_user_data ()">hb_shape_plan_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-reference" title="hb_shape_plan_reference ()">hb_shape_plan_reference</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-set-user-data" title="hb_shape_plan_set_user_data ()">hb_shape_plan_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t">hb_shape_plan_t</a>, typedef in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<a name="idxT"></a><h3 class="title">T</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-TAG:CAPS" title="HB_TAG()">HB_TAG</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-tag-from-string" title="hb_tag_from_string ()">hb_tag_from_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-TAG-MAX:CAPS" title="HB_TAG_MAX">HB_TAG_MAX</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-TAG-MAX-SIGNED:CAPS" title="HB_TAG_MAX_SIGNED">HB_TAG_MAX_SIGNED</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-TAG-NONE:CAPS" title="HB_TAG_NONE">HB_TAG_NONE</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t">hb_tag_t</a>, typedef in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-tag-to-string" title="hb_tag_to_string ()">hb_tag_to_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<a name="idxU"></a><h3 class="title">U</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class" title="hb_unicode_combining_class ()">hb_unicode_combining_class</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-func-t" title="hb_unicode_combining_class_func_t ()">hb_unicode_combining_class_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-t" title="enum hb_unicode_combining_class_t">hb_unicode_combining_class_t</a>, enum in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-compose" title="hb_unicode_compose ()">hb_unicode_compose</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-compose-func-t" title="hb_unicode_compose_func_t ()">hb_unicode_compose_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-decompose" title="hb_unicode_decompose ()">hb_unicode_decompose</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-decompose-func-t" title="hb_unicode_decompose_func_t ()">hb_unicode_decompose_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-create" title="hb_unicode_funcs_create ()">hb_unicode_funcs_create</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-destroy" title="hb_unicode_funcs_destroy ()">hb_unicode_funcs_destroy</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-default" title="hb_unicode_funcs_get_default ()">hb_unicode_funcs_get_default</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-empty" title="hb_unicode_funcs_get_empty ()">hb_unicode_funcs_get_empty</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-parent" title="hb_unicode_funcs_get_parent ()">hb_unicode_funcs_get_parent</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-user-data" title="hb_unicode_funcs_get_user_data ()">hb_unicode_funcs_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-is-immutable" title="hb_unicode_funcs_is_immutable ()">hb_unicode_funcs_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-make-immutable" title="hb_unicode_funcs_make_immutable ()">hb_unicode_funcs_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-reference" title="hb_unicode_funcs_reference ()">hb_unicode_funcs_reference</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-combining-class-func" title="hb_unicode_funcs_set_combining_class_func ()">hb_unicode_funcs_set_combining_class_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-compose-func" title="hb_unicode_funcs_set_compose_func ()">hb_unicode_funcs_set_compose_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-decompose-func" title="hb_unicode_funcs_set_decompose_func ()">hb_unicode_funcs_set_decompose_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-general-category-func" title="hb_unicode_funcs_set_general_category_func ()">hb_unicode_funcs_set_general_category_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-mirroring-func" title="hb_unicode_funcs_set_mirroring_func ()">hb_unicode_funcs_set_mirroring_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-script-func" title="hb_unicode_funcs_set_script_func ()">hb_unicode_funcs_set_script_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-user-data" title="hb_unicode_funcs_set_user_data ()">hb_unicode_funcs_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t">hb_unicode_funcs_t</a>, typedef in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category" title="hb_unicode_general_category ()">hb_unicode_general_category</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-func-t" title="hb_unicode_general_category_func_t ()">hb_unicode_general_category_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-t" title="enum hb_unicode_general_category_t">hb_unicode_general_category_t</a>, enum in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#HB-UNICODE-MAX:CAPS" title="HB_UNICODE_MAX">HB_UNICODE_MAX</a>, macro in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-UNICODE-MAX-DECOMPOSITION-LEN:CAPS" title="HB_UNICODE_MAX_DECOMPOSITION_LEN">HB_UNICODE_MAX_DECOMPOSITION_LEN</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-mirroring" title="hb_unicode_mirroring ()">hb_unicode_mirroring</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-mirroring-func-t" title="hb_unicode_mirroring_func_t ()">hb_unicode_mirroring_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-script" title="hb_unicode_script ()">hb_unicode_script</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-script-func-t" title="hb_unicode_script_func_t ()">hb_unicode_script_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-uniscribe.html#hb-uniscribe-font-get-hfont" title="hb_uniscribe_font_get_hfont ()">hb_uniscribe_font_get_hfont</a>, function in <a class="link" href="harfbuzz-hb-uniscribe.html" title="hb-uniscribe">hb-uniscribe</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-uniscribe.html#hb-uniscribe-font-get-logfontw" title="hb_uniscribe_font_get_logfontw ()">hb_uniscribe_font_get_logfontw</a>, function in <a class="link" href="harfbuzz-hb-uniscribe.html" title="hb-uniscribe">hb-uniscribe</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-UNTAG:CAPS" title="HB_UNTAG()">HB_UNTAG</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t-struct" title="hb_user_data_key_t">hb_user_data_key_t</a>, struct in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<a name="idxV"></a><h3 class="title">V</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-variation-from-string" title="hb_variation_from_string ()">hb_variation_from_string</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-variation-t" title="hb_variation_t">hb_variation_t</a>, struct in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-variation-to-string" title="hb_variation_to_string ()">hb_variation_to_string</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-var-int-t" title="hb_var_int_t">hb_var_int_t</a>, union in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-version.html#hb-version" title="hb_version ()">hb_version</a>, function in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-version.html#HB-VERSION-ATLEAST:CAPS" title="HB_VERSION_ATLEAST()">HB_VERSION_ATLEAST</a>, macro in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-version.html#hb-version-atleast" title="hb_version_atleast ()">hb_version_atleast</a>, function in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-version.html#HB-VERSION-MAJOR:CAPS" title="HB_VERSION_MAJOR">HB_VERSION_MAJOR</a>, macro in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-version.html#HB-VERSION-MICRO:CAPS" title="HB_VERSION_MICRO">HB_VERSION_MICRO</a>, macro in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-version.html#HB-VERSION-MINOR:CAPS" title="HB_VERSION_MINOR">HB_VERSION_MINOR</a>, macro in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-version.html#HB-VERSION-STRING:CAPS" title="HB_VERSION_STRING">HB_VERSION_STRING</a>, macro in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-version.html#hb-version-string" title="hb_version_string ()">hb_version_string</a>, function in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/buffers-language-script-and-direction.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/buffers-language-script-and-direction.html
new file mode 100644
index 0000000..d88dc05
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/buffers-language-script-and-direction.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Buffers, language, script and direction: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="prev" href="aat-shaping.html" title="AAT shaping">
+<link rel="next" href="adding-text-to-the-buffer.html" title="Adding text to the buffer">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="aat-shaping.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="adding-text-to-the-buffer.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="buffers-language-script-and-direction"></a>Buffers, language, script and direction</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt><span class="section"><a href="buffers-language-script-and-direction.html#creating-and-destroying-buffers">Creating and destroying buffers</a></span></dt>
+<dt><span class="section"><a href="adding-text-to-the-buffer.html">Adding text to the buffer</a></span></dt>
+<dt><span class="section"><a href="setting-buffer-properties.html">Setting buffer properties</a></span></dt>
+<dt><span class="section"><a href="what-about-the-other-scripts.html">What about the other scripts?</a></span></dt>
+<dt><span class="section"><a href="customizing-unicode-functions.html">Customizing Unicode functions</a></span></dt>
+</dl></div>
+<p>
+    The input to HarfBuzz is a series of Unicode characters, stored in a
+    buffer. In this chapter, we'll look at how to set up a buffer with
+    the text that we want and then customize the properties of the
+    buffer.
+  </p>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="creating-and-destroying-buffers"></a>Creating and destroying buffers</h2></div></div></div>
+<p>
+      As we saw in our <span class="emphasis"><em>Getting Started</em></span> example, a
+      buffer is created and 
+      initialized with <code class="literal">hb_buffer_create()</code>. This
+      produces a new, empty buffer object, instantiated with some
+      default values and ready to accept your Unicode strings.
+    </p>
+<p>
+      HarfBuzz manages the memory of objects (such as buffers) that it
+      creates, so you don't have to. When you have finished working on 
+      a buffer, you can call <code class="literal">hb_buffer_destroy()</code>:
+    </p>
+<pre class="programlisting">
+  hb_buffer_t *buffer = hb_buffer_create();
+  ...
+  hb_buffer_destroy(buffer);
+</pre>
+<p>
+      This will destroy the object and free its associated memory -
+      unless some other part of the program holds a reference to this
+      buffer. If you acquire a HarfBuzz buffer from another subsystem
+      and want to ensure that it is not garbage collected by someone
+      else destroying it, you should increase its reference count:
+    </p>
+<pre class="programlisting">
+void somefunc(hb_buffer_t *buffer) {
+  buffer = hb_buffer_reference(buffer);
+  ...
+</pre>
+<p>
+      And then decrease it once you're done with it:
+    </p>
+<pre class="programlisting">
+  hb_buffer_destroy(buffer);
+}
+</pre>
+<p>
+      To throw away all the data in your buffer and start from scratch,
+      call <code class="literal">hb_buffer_reset(buffer)</code>. If you want to
+      throw away the string in the buffer but keep the options, you can
+      instead call <code class="literal">hb_buffer_clear_contents(buffer)</code>.
+    </p>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/building.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/building.html
new file mode 100644
index 0000000..6454786
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/building.html
@@ -0,0 +1,418 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Building HarfBuzz: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="install-harfbuzz.html" title="Installing HarfBuzz">
+<link rel="prev" href="install-harfbuzz.html" title="Installing HarfBuzz">
+<link rel="next" href="getting-started.html" title="Getting started with HarfBuzz">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="install-harfbuzz.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="install-harfbuzz.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="getting-started.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="building"></a>Building HarfBuzz</h2></div></div></div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="building.linux"></a>Building on Linux</h3></div></div></div>
+<p>
+      <span class="emphasis"><em>(1)</em></span> To build HarfBuzz on Linux, you must first install the
+      development packages for FreeType, Cairo, and GLib. The exact
+      commands required for this step will vary depending on
+      the Linux distribution you use.
+    </p>
+<p>
+      For example, on an Ubuntu or Debian system, you would run:
+      </p>
+<pre class="programlisting">
+	<span class="command"><strong>sudo apt install</strong></span> <span class="package">gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev</span>
+      </pre>
+<p>
+      On Fedora, RHEL, CentOS, or other Red-Hat–based systems, you would run:
+      </p>
+<pre class="programlisting">
+	<span class="command"><strong>sudo yum install</strong></span> <span class="package">gcc gcc-c++ freetype-devel glib2-devel cairo-devel</span>
+      </pre>
+<p>
+
+    </p>
+<p>
+      <span class="emphasis"><em>(2)</em></span> The next step depends on whether you
+      are building from the source in a downloaded release tarball or
+      from the source directly from the git repository.
+    </p>
+<p>
+      <span class="emphasis"><em>(2)(a)</em></span> If you downloaded the HarfBuzz
+      source code in a tarball, you can now extract the source.
+    </p>
+<p>
+      From a shell in the top-level directory of the extracted source
+      code, you can run <span class="command"><strong>./configure</strong></span> followed by
+      <span class="command"><strong>make</strong></span> as with any other standard package.
+    </p>
+<p>
+      This should leave you with a shared
+      library in the <code class="filename">src/</code> directory, and a few
+      utility programs including <span class="command"><strong>hb-view</strong></span> and
+      <span class="command"><strong>hb-shape</strong></span> under the <code class="filename">util/</code>
+      directory.
+    </p>
+<p>
+      <span class="emphasis"><em>(2)(b)</em></span> If you are building from the source in the HarfBuzz git
+      repository, rather than installing from a downloaded tarball
+      release, then you must install two more auxiliary tools before you 
+      can build for the first time: <span class="package">pkg-config</span> and
+      <a class="ulink" href="http://www.complang.org/ragel/" target="_top">ragel</a>.
+    </p>
+<p>
+      On Ubuntu or Debian, run:
+      </p>
+<pre class="programlisting">
+	<span class="command"><strong>sudo apt-get install</strong></span> <span class="package">autoconf automake libtool pkg-config ragel gtk-doc-tools</span>
+      </pre>
+<p>
+      On Fedora, RHEL, CentOS, run:
+      </p>
+<pre class="programlisting">
+	<span class="command"><strong>sudo yum install</strong></span> <span class="package">autoconf automake libtool pkgconfig ragel gtk-doc</span>
+      </pre>
+<p>
+      
+    </p>
+<p>
+      With <span class="package">pkg-config</span> and <span class="package">ragel</span>
+      installed, you can now run <span class="command"><strong>./autogen.sh</strong></span>,
+      followed by <span class="command"><strong>./configure</strong></span> and
+      <span class="command"><strong>make</strong></span> to build HarfBuzz.
+    </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="building.windows"></a>Building on Windows</h3></div></div></div>
+<p>
+	On Windows, consider using Microsoft's free <a class="ulink" href="https://github.com/Microsoft/vcpkg" target="_top">vcpkg</a> utility
+	to build HarfBuzz, its dependencies, and other open-source
+	libraries. 
+      </p>
+<p>
+	If you need to build HarfBuzz from source, first put the
+	<span class="package">ragel</span> binary on your
+	<code class="literal">PATH</code>, then follow the appveyor CI cmake
+	<a class="ulink" href="https://github.com/harfbuzz/harfbuzz/blob/master/appveyor.yml" target="_top">build
+	instructions</a>. 
+      </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="building.macos"></a>Building on macOS</h3></div></div></div>
+<p>
+	There are two ways to build HarfBuzz on Mac systems: MacPorts
+	and Homebrew. The process is similar to the process used on a
+	Linux system.
+      </p>
+<p>
+	<span class="emphasis"><em>(1)</em></span> You must first install the
+	development packages for FreeType, Cairo, and GLib. If you are
+	using MacPorts, you should run:
+      </p>
+<pre class="programlisting">
+	<span class="command"><strong>sudo port install</strong></span> <span class="package">freetype glib2 cairo</span>
+      </pre>
+<p>
+      </p>
+<p>
+	If you are using Homebrew, you should run:
+	</p>
+<pre class="programlisting">	
+	  <span class="command"><strong>brew install</strong></span> <span class="package">freetype glib cairo</span>
+	</pre>
+<p>
+      </p>
+<p>
+	<span class="emphasis"><em>(2)</em></span> The next step depends on whether you are building from the
+	source in a downloaded release tarball or from the source directly
+	from the git repository.
+      </p>
+<p>
+	<span class="emphasis"><em>(2)(a)</em></span> If you are installing HarfBuzz
+	from a downloaded tarball release, extract the tarball and
+	open a Terminal in the extracted source-code directory. Run:
+	</p>
+<pre class="programlisting">
+	  <span class="command"><strong>./configure</strong></span>
+	</pre>
+<p>
+	followed by:
+	</p>
+<pre class="programlisting">	
+	  <span class="command"><strong>make</strong></span>
+	</pre>
+<p>
+	to build HarfBuzz.
+      </p>
+<p>
+	<span class="emphasis"><em>(2)(b)</em></span> Alternatively, if you are building
+	HarfBuzz from the source in the HarfBuzz git repository, then
+	you must install several built-time dependencies before
+	proceeding.
+      </p>
+<p>If you are
+	using MacPorts, you should run:
+      </p>
+<pre class="programlisting">
+	<span class="command"><strong>sudo port install</strong></span> <span class="package">autoconf automake libtool pkgconfig ragel gtk-doc</span> 
+      </pre>
+<p>
+      to install the build dependencies.
+      </p>
+<p>If you are using Homebrew, you should run:
+	</p>
+<pre class="programlisting">	
+	  <span class="command"><strong>brew install</strong></span> <span class="package">autoconf automake libtool pkgconfig ragel gtk-doc</span>
+	</pre>
+<p>
+      	Finally, you can run:
+	</p>
+<pre class="programlisting">
+	  <span class="command"><strong>./autogen.sh</strong></span>
+	</pre>
+<p>
+      </p>
+<p>
+	<span class="emphasis"><em>(3)</em></span> You can now build HarfBuzz (on either
+	a MacPorts or a Homebrew system) by running:
+	</p>
+<pre class="programlisting">
+	  <span class="command"><strong>./configure</strong></span>
+	</pre>
+<p>
+	followed by:
+	</p>
+<pre class="programlisting">
+	  <span class="command"><strong>make</strong></span>
+	</pre>
+<p>
+      </p>
+<p>
+	This should leave you with a shared
+	library in the <code class="filename">src/</code> directory, and a few
+	utility programs including <span class="command"><strong>hb-view</strong></span> and
+	<span class="command"><strong>hb-shape</strong></span> under the <code class="filename">util/</code>
+	directory.
+      </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="configuration"></a>Configuration options</h3></div></div></div>
+<p>
+	The instructions in the "Building HarfBuzz" section will build
+	the source code under its default configuration. If needed,
+	the following additional configuration options are available.
+      </p>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term"><span class="command"><strong>--with-libstdc++</strong></span></span></p></td>
+<td>
+<p>
+	      Allow linking with libstdc++. <span class="emphasis"><em>(Default = no)</em></span>
+	    </p>
+<p>
+	      This option enables or disables linking HarfBuzz to the
+	      system's libstdc++ library.
+	    </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="command"><strong>--with-glib</strong></span></span></p></td>
+<td>
+<p>
+	     Use <a class="ulink" href="https://developer.gnome.org/glib/" target="_top">GLib</a>. <span class="emphasis"><em>(Default = auto)</em></span>
+	    </p>
+<p>
+	      This option enables or disables usage of the GLib
+	      library.  The default setting is to check for the
+	      presence of GLib and, if it is found, build with
+	      GLib support. GLib is native to GNU/Linux systems but is
+	      available on other operating system as well.
+	    </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="command"><strong>--with-gobject</strong></span></span></p></td>
+<td>
+<p>
+	      Use <a class="ulink" href="https://developer.gnome.org/gobject/stable/" target="_top">GObject</a>. <span class="emphasis"><em>(Default = no)</em></span>
+	    </p>
+<p>
+	      This option enables or disables usage of the GObject
+	      library. The default setting is to check for the
+	      presence of GObject and, if it is found, build with
+	      GObject support. GObject is native to GNU/Linux systems but is
+	      available on other operating system as well.
+	    </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="command"><strong>--with-cairo</strong></span></span></p></td>
+<td>
+<p>
+	      Use <a class="ulink" href="https://cairographics.org/" target="_top">Cairo</a>. <span class="emphasis"><em>(Default = auto)</em></span>
+	    </p>
+<p>
+	      This option enables or disables usage of the Cairo
+	      graphics-rendering library. The default setting is to
+	      check for the presence of Cairo and, if it is found,
+	      build with Cairo support.
+	    </p>
+<p>
+	      Note: Cairo is used only by the HarfBuzz
+	      command-line utilities, and not by the HarfBuzz library.
+	    </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="command"><strong>--with-fontconfig</strong></span></span></p></td>
+<td>
+<p>
+	      Use <a class="ulink" href="https://www.freedesktop.org/wiki/Software/fontconfig/" target="_top">Fontconfig</a>. <span class="emphasis"><em>(Default = auto)</em></span>
+	    </p>
+<p>
+	      This option enables or disables usage of the Fontconfig
+	      library, which provides font-matching functions and
+	      provides access to font properties. The default setting
+	      is to check for the presence of Fontconfig and, if it is
+	      found, build with Fontconfig support.
+	    </p>
+<p>
+	      Note: Fontconfig is used only by the HarfBuzz
+	      command-line utilities, and not by the HarfBuzz library.
+	    </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="command"><strong>--with-icu</strong></span></span></p></td>
+<td>
+<p>
+	      Use the <a class="ulink" href="http://site.icu-project.org/home" target="_top">ICU</a> library. <span class="emphasis"><em>(Default = auto)</em></span>
+	    </p>
+<p>
+	      This option enables or disables usage of the
+	      <span class="emphasis"><em>International Components for
+	      Unicode</em></span> (ICU) library, which provides access
+	      to Unicode Character Database (UCD) properties as well
+	      as normalization and conversion functions. The default
+	      setting is to check for the presence of ICU and, if it
+	      is found, build with ICU support.
+	    </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="command"><strong>--with-ucdn</strong></span></span></p></td>
+<td>
+<p>
+	      Use HarfBuzz's <a class="ulink" href="https://github.com/harfbuzz/harfbuzz/tree/master/src/hb-ucdn" target="_top">built-in UCDN library</a>. <span class="emphasis"><em>(Default = auto)</em></span>
+	    </p>
+<p>
+	      The HarfBuzz source tree includes a <span class="emphasis"><em>Unicode
+	      Database and Normalization</em></span> (UCDN) library
+	      that provides access to basic character properties in
+	      the Unicode Character Database (UCD) as well as low-level
+	      normalization functions. HarfBuzz can be built without
+	      this UCDN support if the usage of a different UCDN
+	      library is desired.
+	    </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="command"><strong>--with-graphite2</strong></span></span></p></td>
+<td>
+<p>
+	      Use the <a class="ulink" href="http://graphite.sil.org/" target="_top">Graphite2</a> library. <span class="emphasis"><em>(Default = no)</em></span>
+	    </p>
+<p>
+	      This option enables or disables usage of the Graphite2
+	      library, which provides support for the Graphite shaping
+	      model. 
+	    </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="command"><strong>--with-freetype</strong></span></span></p></td>
+<td>
+<p>
+	      Use the <a class="ulink" href="https://www.freetype.org/" target="_top">FreeType</a> library. <span class="emphasis"><em>(Default = auto)</em></span>
+	    </p>
+<p>
+	      This option enables or disables usage of the FreeType
+	      font-rendering library. The default setting is to check for the
+	      presence of FreeType and, if it is found, build with
+	      FreeType support.
+	    </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="command"><strong>--with-uniscribe</strong></span></span></p></td>
+<td>
+<p>
+	      Use the <a class="ulink" href="https://docs.microsoft.com/en-us/windows/desktop/intl/uniscribe" target="_top">Uniscribe</a>
+	      library (experimental). <span class="emphasis"><em>(Default = no)</em></span>
+	    </p>
+<p>
+	      This option enables or disables usage of the Uniscribe
+	      font-rendering library. Uniscribe is available on
+	      Windows systems. Uniscribe support is used only for
+	      testing purposes and does not need to be enabled for
+	      HarfBuzz to run on Windows systems.
+	    </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="command"><strong>--with-directwrite</strong></span></span></p></td>
+<td>
+<p>
+	      Use the <a class="ulink" href="https://docs.microsoft.com/en-us/windows/desktop/directwrite/direct-write-portal" target="_top">DirectWrite</a> library (experimental). <span class="emphasis"><em>(Default = no)</em></span>
+	    </p>
+<p>
+	      This option enables or disables usage of the DirectWrite
+	      font-rendering library. DirectWrite is available on
+	      Windows systems. DirectWrite support is used only for
+	      testing purposes and does not need to be enabled for
+	      HarfBuzz to run on Windows systems.
+	    </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="command"><strong>--with-coretext</strong></span></span></p></td>
+<td>
+<p>
+	      Use the <a class="ulink" href="https://developer.apple.com/documentation/coretext" target="_top">CoreText</a> library. <span class="emphasis"><em>(Default = no)</em></span>
+	    </p>
+<p>
+	      This option enables or disables usage of the CoreText
+	      library. CoreText is available on macOS and iOS systems.
+	    </p>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch01s03.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch01s03.html
new file mode 100644
index 0000000..afce4d1
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch01s03.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>What does HarfBuzz do?: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
+<link rel="prev" href="why-do-i-need-a-shaping-engine.html" title="Why do I need a shaping engine?">
+<link rel="next" href="what-harfbuzz-doesnt-do.html" title="What HarfBuzz doesn't do">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="what-is-harfbuzz.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="why-do-i-need-a-shaping-engine.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="what-harfbuzz-doesnt-do.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="id-1.2.2.6"></a>What does HarfBuzz do?</h2></div></div></div>
+<p>
+      HarfBuzz provides text shaping through a cross-platform
+      C API that accepts sequences of Unicode codepoints as input. Currently,
+      the following OpenType shaping models are supported:
+    </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem"><p>
+	  Indic (covering Devanagari, Bengali, Gujarati,
+	  Gurmukhi, Kannada, Malayalam, Oriya, Tamil, Telugu, and
+	  Sinhala)
+	</p></li>
+<li class="listitem"><p>
+	  Arabic (covering Arabic, N'Ko, Syriac, and Mongolian)
+	</p></li>
+<li class="listitem"><p>
+	  Thai and Lao
+	</p></li>
+<li class="listitem"><p>
+	  Khmer
+	</p></li>
+<li class="listitem"><p>
+	  Myanmar
+	</p></li>
+<li class="listitem"><p>
+	  Tibetan
+	</p></li>
+<li class="listitem"><p>
+	  Hangul
+	</p></li>
+<li class="listitem"><p>
+	  Hebrew
+	</p></li>
+<li class="listitem"><p>
+	  The Universal Shaping Engine or <span class="emphasis"><em>USE</em></span>
+	  (covering complex scripts not covered by the above shaping
+	  models)
+	</p></li>
+<li class="listitem"><p>
+	  A default shaping model for non-complex scripts
+	  (covering Latin, Cyrillic, Greek, Armenian, Georgian, Tifinagh,
+	  and many others)
+	</p></li>
+<li class="listitem"><p>
+	  Emoji (including emoji modifier sequences, flag sequences,
+	  and ZWJ sequences)
+	</p></li>
+</ul></div>
+<p>
+      In addition to OpenType shaping, HarfBuzz supports the latest
+      version of Graphite shaping (the "Graphite 2" model) and AAT
+      shaping.
+    </p>
+<p>
+      HarfBuzz can read and understand TrueType fonts (.ttf), TrueType
+      collections (.ttc), and OpenType fonts (.otf, including those
+      fonts that contain TrueType-style outlines and those that
+      contain PostScript CFF or CFF2 outlines).
+    </p>
+<p>
+      HarfBuzz is designed and tested to run on top of the FreeType
+      font renderer. It can run on Linux, Android, Windows, macOS, and
+      iOS systems.
+    </p>
+<p>
+      In addition to its core shaping functionality, HarfBuzz provides
+      functions for accessing other font features, including optional
+      GSUB and GPOS OpenType features, as well as
+      all color-font formats (<code class="literal">CBDT</code>,
+      <code class="literal">sbix</code>, <code class="literal">COLR/CPAL</code>, and
+      <code class="literal">SVG-OT</code>) and OpenType variable fonts. HarfBuzz
+      also includes a font-subsetting feature. HarfBuzz can perform
+      some low-level math-shaping operations, although it does not
+      currently perform full shaping for mathematical typesetting.
+    </p>
+<p>
+      A suite of command-line utilities is also provided in the
+      source-code tree, designed to help users test and debug
+      HarfBuzz's features on real-world fonts and input.
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch03s02.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch03s02.html
new file mode 100644
index 0000000..e3f5af9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch03s02.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Terminology: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="getting-started.html" title="Getting started with HarfBuzz">
+<link rel="prev" href="getting-started.html" title="Getting started with HarfBuzz">
+<link rel="next" href="ch03s03.html" title="A simple shaping example">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="getting-started.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="getting-started.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="ch03s03.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="id-1.2.4.3"></a>Terminology</h2></div></div></div>
+<p>
+      
+    </p>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">script</span></p></td>
+<td>
+<p>
+	      In text shaping, a <span class="emphasis"><em>script</em></span> is a
+	      writing system: a set of symbols, rules, and conventions
+	      that is used to represent a language or multiple
+	      languages.
+	    </p>
+<p>
+	      In general computing lingo, the word "script" can also
+	      be used to mean an executable program (usually one
+	      written in a human-readable programming language). For
+	      the sake of clarity, HarfBuzz documents will always use
+	      more specific terminology when referring to this
+	      meaning, such as "Python script" or "shell script." In
+	      all other instances, "script" refers to a writing system.
+	    </p>
+<p>
+	      For developers using HarfBuzz, it is important to note
+	      the distinction between a script and a language. Most
+	      scripts are used to write a variety of different
+	      languages, and many languages may be written in more
+	      than one script.
+	    </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term">shaper</span></p></td>
+<td><p>
+	      In HarfBuzz, a <span class="emphasis"><em>shaper</em></span> is a
+	      handler for a specific script-shaping model. HarfBuzz
+	      implements separate shapers for Indic, Arabic, Thai and
+	      Lao, Khmer, Myanmar, Tibetan, Hangul, Hebrew, the
+	      Universal Shaping Engine (USE), and a default shaper for
+	      non-complex scripts. 
+	    </p></td>
+</tr>
+<tr>
+<td><p><span class="term">cluster</span></p></td>
+<td>
+<p>
+	      In text shaping, a <span class="emphasis"><em>cluster</em></span> is a
+	      sequence of codepoints that must be treated as an
+	      indivisible unit. Clusters can include code-point
+	      sequences that form a ligature or base-and-mark
+	      sequences. Tracking and preserving clusters is important
+	      when shaping operations might separate or reorder
+	      code points.
+	    </p>
+<p>
+	      HarfBuzz provides three cluster
+	      <span class="emphasis"><em>levels</em></span> that implement different
+	      approaches to the problem of preserving clusters during
+	      shaping operations.
+	    </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term">grapheme</span></p></td>
+<td>
+<p>
+	      In linguistics, a <span class="emphasis"><em>grapheme</em></span> is one
+	      of the indivisible units that make up a writing system or
+	      script. Often, graphemes are individual symbols (letters,
+	      numbers, punctuation marks, logograms, etc.) but,
+	      depending on the writing system, a particular grapheme
+	      might correspond to a sequence of several Unicode code
+	      points.
+	    </p>
+<p>
+	      In practice, HarfBuzz and other text-shaping engines
+	      are not generally concerned with graphemes. However, it
+	      is important for developers using HarfBuzz to recognize
+	      that there is a difference between graphemes and shaping
+	      clusters (see above). The two concepts may overlap
+	      frequently, but there is no guarantee that they will be
+	      identical.
+	    </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term">syllable</span></p></td>
+<td>
+<p>
+	      In linguistics, a <span class="emphasis"><em>syllable</em></span> is an 
+	      a sequence of sounds that makes up a building block of a
+	      particular language. Every language has its own set of
+	      rules describing what constitutes a valid syllable.
+	    </p>
+<p>
+	      For text-shaping purposes, the various definitions of
+	      "syllable" are important because script-specific shaping
+	      operations may be applied at the syllable level. For
+	      example, a reordering rule might specify that a vowel
+	      mark be reordered to the beginning of the syllable.
+	    </p>
+<p>
+	      Syllables will consist of one or more Unicode code
+	      points. The definition of a syllable for a particular
+	      writing system might correspond to how HarfBuzz
+	      identifies clusters (see above) for the same writing
+	      system. However, it is important for developers using
+	      HarfBuzz to recognize that there is a difference between
+	      syllables and shaping clusters. The two concepts may
+	      overlap frequently, but there is no guarantee that they
+	      will be identical.
+	    </p>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch03s03.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch03s03.html
new file mode 100644
index 0000000..1905b84
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch03s03.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>A simple shaping example: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="getting-started.html" title="Getting started with HarfBuzz">
+<link rel="prev" href="ch03s02.html" title="Terminology">
+<link rel="next" href="shaping-concepts.html" title="Shaping concepts">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="getting-started.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="ch03s02.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="shaping-concepts.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="id-1.2.4.4"></a>A simple shaping example</h2></div></div></div>
+<p>
+      Below is the simplest HarfBuzz shaping example possible.
+    </p>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>
+          Create a buffer and put your text in it.
+	</p></li></ol></div>
+<pre class="programlisting">
+      #include &lt;hb.h&gt;
+      hb_buffer_t *buf;
+      buf = hb_buffer_create();
+      hb_buffer_add_utf8(buf, text, -1, 0, -1);
+    </pre>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="2"><p>
+          Guess the script, language and direction of the buffer.
+	</p></li></ol></div>
+<pre class="programlisting">
+      hb_buffer_set_direction(buf, HB_DIRECTION_LTR);
+      hb_buffer_set_script(buf, HB_SCRIPT_LATIN);
+      hb_buffer_set_language(buf, hb_language_from_string("en", -1));
+    </pre>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="3"><p>
+          Create a face and a font, using FreeType for now.
+	</p></li></ol></div>
+<pre class="programlisting">
+      #include &lt;hb-ft.h&gt;
+      FT_New_Face(ft_library, font_path, index, &amp;face);
+      FT_Set_Char_Size(face, 0, 1000, 0, 0);
+      hb_font_t *font = hb_ft_font_create(face);
+    </pre>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="4"><p>
+          Shape!
+	</p></li></ol></div>
+<pre class="programlisting">
+      hb_shape(font, buf, NULL, 0);
+    </pre>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="5"><p>
+          Get the glyph and position information.
+	</p></li></ol></div>
+<pre class="programlisting">
+      hb_glyph_info_t *glyph_info    = hb_buffer_get_glyph_infos(buf, &amp;glyph_count);
+      hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &amp;glyph_count);
+    </pre>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="6"><p>
+          Iterate over each glyph.
+	</p></li></ol></div>
+<pre class="programlisting">
+      for (i = 0; i &lt; glyph_count; ++i) {
+      glyphid = glyph_info[i].codepoint;
+      x_offset = glyph_pos[i].x_offset / 64.0;
+      y_offset = glyph_pos[i].y_offset / 64.0;
+      x_advance = glyph_pos[i].x_advance / 64.0;
+      y_advance = glyph_pos[i].y_advance / 64.0;
+      draw_glyph(glyphid, cursor_x + x_offset, cursor_y + y_offset);
+      cursor_x += x_advance;
+      cursor_y += y_advance;
+      }
+    </pre>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="7"><p>
+          Tidy up.
+	</p></li></ol></div>
+<pre class="programlisting">
+      hb_buffer_destroy(buf);
+      hb_font_destroy(hb_ft_font);
+    </pre>
+<p>
+      This example shows enough to get us started using HarfBuzz. In
+      the sections that follow, we will use the remainder of
+      HarfBuzz's API to refine and extend the example and improve its
+      text-shaping capabilities.
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch09.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch09.html
new file mode 100644
index 0000000..1c709c4
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch09.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Core API: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="pt02.html" title="Part II. Reference manual">
+<link rel="next" href="harfbuzz-hb-blob.html" title="hb-blob">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="pt02.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-blob.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="id-1.3.4"></a>Core API</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-blob.html">hb-blob</a></span><span class="refpurpose"> — Binary data containers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-buffer.html">hb-buffer</a></span><span class="refpurpose"> — Input and output buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-common.html">hb-common</a></span><span class="refpurpose"> — Common data types</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-deprecated.html">hb-deprecated</a></span><span class="refpurpose"> — Deprecated API</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-face.html">hb-face</a></span><span class="refpurpose"> — Font face objects</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-font.html">hb-font</a></span><span class="refpurpose"> — Font objects</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-map.html">hb-map</a></span><span class="refpurpose"> — Object representing integer to integer mapping</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-set.html">hb-set</a></span><span class="refpurpose"> — Object representing a set of integers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-shape-plan.html">hb-shape-plan</a></span><span class="refpurpose"> — Object representing a shaping plan</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-shape.html">hb-shape</a></span><span class="refpurpose"> — Conversion of text strings into positioned glyphs</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-unicode.html">hb-unicode</a></span><span class="refpurpose"> — Unicode character property access</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-version.html">hb-version</a></span><span class="refpurpose"> — Information about the version of HarfBuzz in use</span>
+</dt>
+</dl></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch10.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch10.html
new file mode 100644
index 0000000..a80ab8c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch10.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>OpenType API: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="harfbuzz-hb-version.html" title="hb-version">
+<link rel="next" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-version.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-ot-color.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="id-1.3.5"></a>OpenType API</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-color.html">hb-ot-color</a></span><span class="refpurpose"> — OpenType Color Fonts</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-font.html">hb-ot-font</a></span><span class="refpurpose"> — OpenType font implementation</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-layout.html">hb-ot-layout</a></span><span class="refpurpose"> — OpenType Layout</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-math.html">hb-ot-math</a></span><span class="refpurpose"> — OpenType Math information</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-name.html">hb-ot-name</a></span><span class="refpurpose"> — OpenType font name information</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-shape.html">hb-ot-shape</a></span><span class="refpurpose"> — OpenType shaping support</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-var.html">hb-ot-var</a></span><span class="refpurpose"> — OpenType Font Variations</span>
+</dt>
+</dl></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch11.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch11.html
new file mode 100644
index 0000000..3c9039c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch11.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Apple Advanced Typography API: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">
+<link rel="next" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-ot-var.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-aat-layout.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="id-1.3.6"></a>Apple Advanced Typography API</h2></div></div></div>
+<div class="toc"><dl class="toc"><dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-aat-layout.html">hb-aat-layout</a></span><span class="refpurpose"> — Apple Advanced Typography Layout</span>
+</dt></dl></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch12.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch12.html
new file mode 100644
index 0000000..0c63823
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/ch12.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Integration API: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">
+<link rel="next" href="harfbuzz-hb-coretext.html" title="hb-coretext">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-aat-layout.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-coretext.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="id-1.3.7"></a>Integration API</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-coretext.html">hb-coretext</a></span><span class="refpurpose"> — CoreText integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ft.html">hb-ft</a></span><span class="refpurpose"> — FreeType integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-glib.html">hb-glib</a></span><span class="refpurpose"> — GLib integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-gobject.html">hb-gobject</a></span><span class="refpurpose"> — GObject integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-graphite2.html">hb-graphite2</a></span><span class="refpurpose"> — Graphite2 integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-icu.html">hb-icu</a></span><span class="refpurpose"> — ICU integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-uniscribe.html">hb-uniscribe</a></span><span class="refpurpose"> — Windows integration</span>
+</dt>
+</dl></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/clusters.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/clusters.html
new file mode 100644
index 0000000..9162099
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/clusters.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Clusters: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="prev" href="using-your-own-font-functions.html" title="Using your own font functions">
+<link rel="next" href="working-with-harfbuzz-clusters.html" title="Working with HarfBuzz clusters">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="using-your-own-font-functions.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="working-with-harfbuzz-clusters.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="clusters"></a>Clusters</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt><span class="section"><a href="clusters.html#clusters-and-shaping">Clusters and shaping</a></span></dt>
+<dt><span class="section"><a href="working-with-harfbuzz-clusters.html">Working with HarfBuzz clusters</a></span></dt>
+<dt><span class="section"><a href="a-clustering-example-for-levels-0-and-1.html">A clustering example for levels 0 and 1</a></span></dt>
+<dt><span class="section"><a href="reordering-in-levels-0-and-1.html">Reordering in levels 0 and 1</a></span></dt>
+<dt><span class="section"><a href="the-distinction-between-levels-0-and-1.html">The distinction between levels 0 and 1</a></span></dt>
+<dt><span class="section"><a href="level-2.html">Level 2</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="level-2.html#ligatures-with-combining-marks-in-level-2">Ligatures with combining marks in level 2</a></span></dt>
+<dt><span class="section"><a href="level-2.html#reordering-in-level-2">Reordering in level 2</a></span></dt>
+<dt><span class="section"><a href="level-2.html#other-considerations-in-level-2">Other considerations in level 2</a></span></dt>
+</dl></dd>
+</dl></div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="clusters-and-shaping"></a>Clusters and shaping</h2></div></div></div>
+<p>
+      In text shaping, a <span class="emphasis"><em>cluster</em></span> is a sequence of
+      characters that needs to be treated as a single, indivisible
+      unit. A single letter or symbol can be a cluster of its
+      own. Other clusters correspond to longer subsequences of the
+      input code points — such as a ligature or conjunct form
+      — and require the shaper to ensure that the cluster is not
+      broken during the shaping process.
+    </p>
+<p>
+      A cluster is distinct from a <span class="emphasis"><em>grapheme</em></span>,
+      which is the smallest unit of meaning in a writing system or
+      script.
+    </p>
+<p>
+      The definitions of the two terms are similar. However, clusters
+      are only relevant for script shaping and glyph layout. In
+      contrast, graphemes are a property of the underlying script, and
+      are of interest when client programs implement orthographic 
+      or linguistic functionality.
+    </p>
+<p>
+      For example, two individual letters are often two separate
+      graphemes. When two letters form a ligature, however, they
+      combine into a single glyph. They are then part of the same
+      cluster and are treated as a unit by the shaping engine —
+      even though the two original, underlying letters remain separate
+      graphemes.
+    </p>
+<p>
+      HarfBuzz is concerned with clusters, <span class="emphasis"><em>not</em></span>
+      with graphemes — although client programs using HarfBuzz
+      may still care about graphemes for other reasons from time to time.
+    </p>
+<p>
+      During the shaping process, there are several shaping operations
+      that may merge adjacent characters (for example, when two code
+      points form a ligature or a conjunct form and are replaced by a
+      single glyph) or split one character into several (for example,
+      when decomposing a code point through the
+      <code class="literal">ccmp</code> feature). Operations like these alter
+      clusters; HarfBuzz tracks the changes to ensure that no clusters
+      get lost or broken during shaping. 
+    </p>
+<p>
+      HarfBuzz records cluster information independently from how
+      shaping operations affect the individual glyphs returned in an
+      output buffer. Consequently, a client program using HarfBuzz can
+      utilize the cluster information to implement features such as:
+    </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem"><p>
+	  Correctly positioning the cursor within a shaped text run,
+	  even when characters have formed ligatures, composed or
+	  decomposed, reordered, or undergone other shaping operations.
+	</p></li>
+<li class="listitem"><p>
+	  Correctly highlighting a text selection that includes some,
+	  but not all, of the characters in a word. 
+	</p></li>
+<li class="listitem"><p>
+	  Applying text attributes (such as color or underlining) to
+	  part, but not all, of a word.
+	</p></li>
+<li class="listitem"><p>
+	  Generating output document formats (such as PDF) with
+	  embedded text that can be fully extracted.
+	</p></li>
+<li class="listitem"><p>
+	  Determining the mapping between input characters and output
+	  glyphs, such as which glyphs are ligatures.
+	</p></li>
+<li class="listitem"><p>
+	  Performing line-breaking, justification, and other
+	  line-level or paragraph-level operations that must be done
+	  after shaping is complete, but which require examining
+	  character-level properties.
+	</p></li>
+</ul></div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/complex-scripts.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/complex-scripts.html
new file mode 100644
index 0000000..4ee994b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/complex-scripts.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Complex scripts: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="shaping-concepts.html" title="Shaping concepts">
+<link rel="prev" href="shaping-concepts.html" title="Shaping concepts">
+<link rel="next" href="shaping-operations.html" title="Shaping operations">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="shaping-concepts.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="shaping-concepts.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="shaping-operations.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="complex-scripts"></a>Complex scripts</h2></div></div></div>
+<p>
+      In text-shaping terminology, scripts are generally classified as
+      either <span class="emphasis"><em>complex</em></span> or <span class="emphasis"><em>non-complex</em></span>.
+    </p>
+<p>
+      Complex scripts are those for which transforming the input
+      sequence into the final layout requires some combination of
+      operations—such as context-dependent substitutions,
+      context-dependent mark positioning, glyph-to-glyph joining,
+      glyph reordering, or glyph stacking.
+    </p>
+<p>
+      In some complex scripts, the shaping rules require that a text
+      run be divided into syllables before the operations can be
+      applied. Other complex scripts may apply shaping operations over
+      entire words or over the entire text run, with no subdivision
+      required.
+    </p>
+<p>
+      Non-complex scripts, by definition, do not require these
+      operations. However, correctly shaping a text run in a
+      non-complex script may still involve Unicode normalization,
+      ligature substitutions, mark positioning, kerning, and applying
+      other font features. The key difference is that a text run in a
+      non-complex script can be processed sequentially and in the same
+      order as the input sequence of Unicode codepoints, without
+      requiring an analysis stage.
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/customizing-unicode-functions.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/customizing-unicode-functions.html
new file mode 100644
index 0000000..090b871
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/customizing-unicode-functions.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Customizing Unicode functions: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
+<link rel="prev" href="what-about-the-other-scripts.html" title="What about the other scripts?">
+<link rel="next" href="fonts-and-faces.html" title="Fonts and faces">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="buffers-language-script-and-direction.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="what-about-the-other-scripts.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="fonts-and-faces.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="customizing-unicode-functions"></a>Customizing Unicode functions</h2></div></div></div>
+<p>
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/deprecated-api-index.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/deprecated-api-index.html
new file mode 100644
index 0000000..5162862
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/deprecated-api-index.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of deprecated API: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-full.html" title="API Index">
+<link rel="next" href="api-index-2-1-0.html" title="Index of new symbols in 2.1.0">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxU">U</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-full.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-1-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="deprecated-api-index"></a>Index of deprecated API</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-BUFFER-FLAGS-DEFAULT:CAPS" title="HB_BUFFER_FLAGS_DEFAULT">HB_BUFFER_FLAGS_DEFAULT</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-BUFFER-SERIALIZE-FLAGS-DEFAULT:CAPS" title="HB_BUFFER_SERIALIZE_FLAGS_DEFAULT">HB_BUFFER_SERIALIZE_FLAGS_DEFAULT</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-h-kerning-func" title="hb_font_funcs_set_glyph_h_kerning_func ()">hb_font_funcs_set_glyph_h_kerning_func</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-v-kerning-func" title="hb_font_funcs_set_glyph_v_kerning_func ()">hb_font_funcs_set_glyph_v_kerning_func</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-func-t" title="hb_font_get_glyph_func_t ()">hb_font_get_glyph_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-h-kerning" title="hb_font_get_glyph_h_kerning ()">hb_font_get_glyph_h_kerning</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-h-kerning-func-t" title="hb_font_get_glyph_h_kerning_func_t">hb_font_get_glyph_h_kerning_func_t</a>, typedef in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-kerning-for-direction" title="hb_font_get_glyph_kerning_for_direction ()">hb_font_get_glyph_kerning_for_direction</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-kerning-func-t" title="hb_font_get_glyph_kerning_func_t ()">hb_font_get_glyph_kerning_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning" title="hb_font_get_glyph_v_kerning ()">hb_font_get_glyph_v_kerning</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning-func-t" title="hb_font_get_glyph_v_kerning_func_t">hb_font_get_glyph_v_kerning_func_t</a>, typedef in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-OT-VAR-NO-AXIS-INDEX:CAPS" title="HB_OT_VAR_NO_AXIS_INDEX">HB_OT_VAR_NO_AXIS_INDEX</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-SCRIPT-CANADIAN-ABORIGINAL:CAPS" title="HB_SCRIPT_CANADIAN_ABORIGINAL">HB_SCRIPT_CANADIAN_ABORIGINAL</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<a name="idxU"></a><h3 class="title">U</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-UNICODE-MAX-DECOMPOSITION-LEN:CAPS" title="HB_UNICODE_MAX_DECOMPOSITION_LEN">HB_UNICODE_MAX_DECOMPOSITION_LEN</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/fonts-and-faces.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/fonts-and-faces.html
new file mode 100644
index 0000000..87dd7a6
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/fonts-and-faces.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Fonts and faces: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="prev" href="customizing-unicode-functions.html" title="Customizing Unicode functions">
+<link rel="next" href="using-harfbuzzs-native-opentype-implementation.html" title="Using HarfBuzz's native OpenType implementation">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="customizing-unicode-functions.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="using-harfbuzzs-native-opentype-implementation.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="fonts-and-faces"></a>Fonts and faces</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt><span class="section"><a href="fonts-and-faces.html#using-freetype">Using FreeType</a></span></dt>
+<dt><span class="section"><a href="using-harfbuzzs-native-opentype-implementation.html">Using HarfBuzz's native OpenType implementation</a></span></dt>
+<dt><span class="section"><a href="using-your-own-font-functions.html">Using your own font functions</a></span></dt>
+</dl></div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="using-freetype"></a>Using FreeType</h2></div></div></div>
+<p>
+    </p>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/getting-started.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/getting-started.html
new file mode 100644
index 0000000..3372136
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/getting-started.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Getting started with HarfBuzz: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="prev" href="building.html" title="Building HarfBuzz">
+<link rel="next" href="ch03s02.html" title="Terminology">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="building.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="ch03s02.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="getting-started"></a>Getting started with HarfBuzz</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt><span class="section"><a href="getting-started.html#id-1.2.4.2">An overview of the HarfBuzz shaping API</a></span></dt>
+<dt><span class="section"><a href="ch03s02.html">Terminology</a></span></dt>
+<dt><span class="section"><a href="ch03s03.html">A simple shaping example</a></span></dt>
+</dl></div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="id-1.2.4.2"></a>An overview of the HarfBuzz shaping API</h2></div></div></div>
+<p>
+      The core of the HarfBuzz shaping API is the function
+      <code class="function">hb_shape()</code>. This function takes a font, a
+      buffer containing a string of Unicode codepoints and
+      (optionally) a list of font features as its input. It replaces
+      the codepoints in the buffer with the corresponding glyphs from
+      the font, correctly ordered and positioned, and with any of the
+      optional font features applied.
+    </p>
+<p>
+      In addition to holding the pre-shaping input (the Unicode
+      codepoints that comprise the input string) and the post-shaping
+      output (the glyphs and positions), a HarfBuzz buffer has several
+      properties that affect shaping. The most important are the
+      text-flow direction (e.g., left-to-right, right-to-left,
+      top-to-bottom, or bottom-to-top), the script tag, and the
+      language tag.
+    </p>
+<p>
+      For input string buffers, flags are available to denote when the
+      buffer represents the beginning or end of a paragraph, to
+      indicate whether or not to visibly render Unicode <code class="literal">Default
+      Ignorable</code> codepoints, and to modify the cluster-merging
+      behavior for the buffer. For shaped output buffers, the
+      individual X and Y offsets and <code class="literal">advances</code>
+      (the logical dimensions) of each glyph are 
+      accessible. HarfBuzz also flags glyphs as
+      <code class="literal">UNSAFE_TO_BREAK</code> if breaking the string at
+      that glyph (e.g., in a line-breaking or hyphenation process)
+      would require re-shaping the text.
+    </p>
+<p>
+      HarfBuzz also provides methods to compare the contents of
+      buffers, join buffers, normalize buffer contents, and handle
+      invalid codepoints, as well as to determine the state of a
+      buffer (e.g., input codepoints or output glyphs). Buffer
+      lifecycles are managed and all buffers are reference-counted.
+    </p>
+<p>
+      Although the default <code class="function">hb_shape()</code> function is
+      sufficient for most use cases, a variant is also provide that
+      lets you specify which of HarfBuzz's shapers to use on a buffer. 
+    </p>
+<p>
+      HarfBuzz can read TrueType fonts, TrueType collections, OpenType
+      fonts, and OpenType collections. Functions are provided to query
+      font objects about metrics, Unicode coverage, available tables and
+      features, and variation selectors. Individual glyphs can also be
+      queried for metrics, variations, and glyph names. OpenType
+      variable fonts are supported, and HarfBuzz allows you to set
+      variation-axis coordinates on font objects.
+    </p>
+<p>
+      HarfBuzz provides glue code to integrate with various other
+      libraries, including FreeType, GObject, and CoreText. Support
+      for integrating with Uniscribe and DirectWrite is experimental
+      at present.
+    </p>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/graphite-shaping.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/graphite-shaping.html
new file mode 100644
index 0000000..5285e3f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/graphite-shaping.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Graphite shaping: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="shaping-concepts.html" title="Shaping concepts">
+<link rel="prev" href="opentype-shaping-models.html" title="OpenType shaping models">
+<link rel="next" href="aat-shaping.html" title="AAT shaping">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="shaping-concepts.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="opentype-shaping-models.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="aat-shaping.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="graphite-shaping"></a>Graphite shaping</h2></div></div></div>
+<p>
+      In contrast to OpenType shaping, Graphite shaping does not
+      specify a predefined set of shaping models or a set of supported
+      scripts.
+    </p>
+<p>
+      Instead, each Graphite font contains a complete set of rules that
+      implement the required shaping model for the intended
+      script. These rules include finite-state machines to match
+      sequences of codepoints to the shaping operations to perform.
+    </p>
+<p>
+      Graphite shaping can perform the same shaping operations used in
+      OpenType shaping, as well as other functions that have not been
+      defined for OpenType shaping.
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-aat-layout.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-aat-layout.html
new file mode 100644
index 0000000..01fbdfa
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-aat-layout.html
@@ -0,0 +1,1755 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-aat-layout: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch11.html" title="Apple Advanced Typography API">
+<link rel="prev" href="ch11.html" title="Apple Advanced Typography API">
+<link rel="next" href="ch12.html" title="Integration API">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-aat-layout.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-aat-layout.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch11.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="ch11.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="ch12.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-aat-layout"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-aat-layout.top_of_page"></a>hb-aat-layout</span></h2>
+<p>hb-aat-layout — Apple Advanced Typography Layout</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-aat-layout.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-get-name-id" title="hb_aat_layout_feature_type_get_name_id ()">hb_aat_layout_feature_type_get_name_id</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-get-selector-infos" title="hb_aat_layout_feature_type_get_selector_infos ()">hb_aat_layout_feature_type_get_selector_infos</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-get-feature-types" title="hb_aat_layout_get_feature_types ()">hb_aat_layout_get_feature_types</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-positioning" title="hb_aat_layout_has_positioning ()">hb_aat_layout_has_positioning</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-substitution" title="hb_aat_layout_has_substitution ()">hb_aat_layout_has_substitution</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-tracking" title="hb_aat_layout_has_tracking ()">hb_aat_layout_has_tracking</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-aat-layout.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-NO-SELECTOR-INDEX:CAPS" title="HB_AAT_LAYOUT_NO_SELECTOR_INDEX">HB_AAT_LAYOUT_NO_SELECTOR_INDEX</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-t" title="enum hb_aat_layout_feature_type_t">hb_aat_layout_feature_type_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-t" title="enum hb_aat_layout_feature_selector_t">hb_aat_layout_feature_selector_t</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-aat-layout.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
+    <span class="lineart">├──</span> hb_aat_layout_feature_selector_t
+    <span class="lineart">╰──</span> hb_aat_layout_feature_type_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-aat-layout.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-aat.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-aat-layout.description"></a><h2>Description</h2>
+<p>Functions for querying OpenType Layout features in the font face.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-aat-layout.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-aat-layout-feature-type-get-name-id"></a><h3>hb_aat_layout_feature_type_get_name_id ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
+hb_aat_layout_feature_type_get_name_id
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-t" title="enum hb_aat_layout_feature_type_t"><span class="type">hb_aat_layout_feature_type_t</span></a> feature_type</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-aat-layout-feature-type-get-name-id.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face object</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>feature_type</p></td>
+<td class="parameter_description"><p>feature id</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-aat-layout-feature-type-get-name-id.returns"></a><h4>Returns</h4>
+<p> Name ID index</p>
+</div>
+<p class="since">Since: 2.2.0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-aat-layout-feature-type-get-selector-infos"></a><h3>hb_aat_layout_feature_type_get_selector_infos ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_aat_layout_feature_type_get_selector_infos
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-t" title="enum hb_aat_layout_feature_type_t"><span class="type">hb_aat_layout_feature_type_t</span></a> feature_type</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *selector_count</code></em>,
+                                <em class="parameter"><code><span class="type">hb_aat_layout_feature_selector_info_t</span> *selectors</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *default_index</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-aat-layout-get-feature-types"></a><h3>hb_aat_layout_get_feature_types ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_aat_layout_get_feature_types (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                 <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                                 <em class="parameter"><code>unsigned <span class="type">int</span> *feature_count</code></em>,
+                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-t" title="enum hb_aat_layout_feature_type_t"><span class="type">hb_aat_layout_feature_type_t</span></a> *features</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-aat-layout-get-feature-types.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face object</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start_offset</p></td>
+<td class="parameter_description"><p>iteration's start offset</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>feature_count</p></td>
+<td class="parameter_description"><p> buffer size as input, filled size as output. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>features</p></td>
+<td class="parameter_description"><p> features buffer. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Out parameter, where caller must allocate storage."><span class="acronym">out caller-allocates</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=feature_count]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-aat-layout-get-feature-types.returns"></a><h4>Returns</h4>
+<p> Number of all available feature types.</p>
+</div>
+<p class="since">Since: 2.2.0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-aat-layout-has-positioning"></a><h3>hb_aat_layout_has_positioning ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_aat_layout_has_positioning (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-aat-layout-has-substitution"></a><h3>hb_aat_layout_has_substitution ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_aat_layout_has_substitution (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-aat-layout-has-tracking"></a><h3>hb_aat_layout_has_tracking ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_aat_layout_has_tracking (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-aat-layout.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="HB-AAT-LAYOUT-NO-SELECTOR-INDEX:CAPS"></a><h3>HB_AAT_LAYOUT_NO_SELECTOR_INDEX</h3>
+<pre class="programlisting">#define HB_AAT_LAYOUT_NO_SELECTOR_INDEX		0xFFFFu
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-aat-layout-feature-type-t"></a><h3>enum hb_aat_layout_feature_type_t</h3>
+<div class="refsect3">
+<a name="hb-aat-layout-feature-type-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-INVALID:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_INVALID</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-ALL-TYPOGRAPHIC:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CURISVE-CONNECTION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-LETTER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-VERTICAL-SUBSTITUTION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-LINGUISTIC-REARRANGEMENT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-NUMBER-SPACING:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-SMART-SWASH-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-DIACRITICS-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-VERTICAL-POSITION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-FRACTIONS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-OVERLAPPING-CHARACTERS-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-ORNAMENT-SETS-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-ALTERNATIVES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-DESIGN-COMPLEXITY-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-STYLE-OPTIONS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-NUMBER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-TEXT-SPACING:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-TRANSLITERATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-ANNOTATION-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-KANA-SPACING-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-SPACING-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-UNICODE-DECOMPOSITION-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-RUBY-KANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CJK-SYMBOL-ALTERNATIVES-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-ALTERNATIVES-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CJK-VERTICAL-ROMAN-PLACEMENT-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-ITALIC-CJK-ROMAN:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CASE-SENSITIVE-LAYOUT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-ALTERNATE-KANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CONTEXTUAL-ALTERNATIVES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-LOWER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-UPPER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-LANGUAGE-TAG-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CJK-ROMAN-SPACING-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-MAX-VALUE:CAPS"></a>_HB_AAT_LAYOUT_FEATURE_TYPE_MAX_VALUE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: 2.2.0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-aat-layout-feature-selector-t"></a><h3>enum hb_aat_layout_feature_selector_t</h3>
+<div class="refsect3">
+<a name="hb-aat-layout-feature-selector-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INVALID:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALL-TYPE-FEATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALL-TYPE-FEATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-REQUIRED-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-REQUIRED-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-COMMON-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-COMMON-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-RARE-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-RARE-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LOGOS-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LOGOS-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-REBUS-PICTURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-REBUS-PICTURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DIPHTHONG-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DIPHTHONG-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SQUARED-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SQUARED-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ABBREV-SQUARED-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ABBREV-SQUARED-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SYMBOL-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SYMBOL-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HISTORICAL-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HISTORICAL-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-UNCONNECTED:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_UNCONNECTED</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PARTIALLY-CONNECTED:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PARTIALLY_CONNECTED</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CURSIVE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CURSIVE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-UPPER-AND-LOWER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_AND_LOWER_CASE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALL-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_CAPS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALL-LOWER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_LOWER_CASE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SMALL-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INITIAL-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INITIAL-CAPS-AND-SMALL-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS_AND_SMALL_CAPS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SUBSTITUTE-VERTICAL-FORMS-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SUBSTITUTE-VERTICAL-FORMS-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LINGUISTIC-REARRANGEMENT-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LINGUISTIC-REARRANGEMENT-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-MONOSPACED-NUMBERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-NUMBERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-THIRD-WIDTH-NUMBERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_NUMBERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-QUARTER-WIDTH-NUMBERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_NUMBERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-WORD-INITIAL-SWASHES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-WORD-INITIAL-SWASHES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-WORD-FINAL-SWASHES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-WORD-FINAL-SWASHES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LINE-INITIAL-SWASHES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LINE-INITIAL-SWASHES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LINE-FINAL-SWASHES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LINE-FINAL-SWASHES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NON-FINAL-SWASHES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NON-FINAL-SWASHES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SHOW-DIACRITICS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SHOW_DIACRITICS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HIDE-DIACRITICS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HIDE_DIACRITICS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DECOMPOSE-DIACRITICS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DECOMPOSE_DIACRITICS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NORMAL-POSITION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SUPERIORS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INFERIORS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ORDINALS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SCIENTIFIC-INFERIORS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-FRACTIONS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-VERTICAL-FRACTIONS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DIAGONAL-FRACTIONS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PREVENT-OVERLAP-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PREVENT-OVERLAP-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHENS-TO-EM-DASH-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHENS-TO-EM-DASH-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHEN-TO-EN-DASH-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHEN-TO-EN-DASH-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SLASHED-ZERO-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SLASHED-ZERO-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-FORM-INTERROBANG-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-FORM-INTERROBANG-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SMART-QUOTES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SMART-QUOTES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PERIODS-TO-ELLIPSIS-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PERIODS-TO-ELLIPSIS-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHEN-TO-MINUS-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHEN-TO-MINUS-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ASTERISK-TO-MULTIPLY-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ASTERISK-TO-MULTIPLY-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SLASH-TO-DIVIDE-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SLASH-TO-DIVIDE-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INEQUALITY-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INEQUALITY-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-EXPONENTS-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-EXPONENTS-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-MATHEMATICAL-GREEK-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-MATHEMATICAL-GREEK-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-ORNAMENTS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ORNAMENTS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DINGBATS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DINGBATS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PI-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PI_CHARACTERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-FLEURONS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_FLEURONS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DECORATIVE-BORDERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DECORATIVE_BORDERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INTERNATIONAL-SYMBOLS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INTERNATIONAL_SYMBOLS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-MATH-SYMBOLS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_MATH_SYMBOLS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-ALTERNATES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ALTERNATES</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL1:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL1</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL2:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL2</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL3:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL3</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL4:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL4</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL5:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL5</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-STYLE-OPTIONS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DISPLAY-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DISPLAY_TEXT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ENGRAVED-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ENGRAVED_TEXT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ILLUMINATED-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ILLUMINATED_CAPS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TITLING-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TALL-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TALL_CAPS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SIMPLIFIED-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-JIS1978-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-JIS1983-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-JIS1990-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-ONE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_ONE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-TWO:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_TWO</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-THREE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_THREE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-FOUR:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FOUR</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-FIVE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FIVE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-EXPERT-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-JIS2004-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HOJO-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NLCCHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-NAMES-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LOWER-CASE-NUMBERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-UPPER-CASE-NUMBERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-MONOSPACED-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HALF-WIDTH-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-THIRD-WIDTH-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-QUARTER-WIDTH-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALT-PROPORTIONAL-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALT-HALF-WIDTH-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-TRANSLITERATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HANJA-TO-HANGUL:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HIRAGANA-TO-KATAKANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HIRAGANA_TO_KATAKANA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-KATAKANA-TO-HIRAGANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_KATAKANA_TO_HIRAGANA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-KANA-TO-ROMANIZATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_KANA_TO_ROMANIZATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ROMANIZATION-TO-HIRAGANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_HIRAGANA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ROMANIZATION-TO-KATAKANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_KATAKANA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HANJA-TO-HANGUL-ALT-ONE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_ONE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HANJA-TO-HANGUL-ALT-TWO:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_TWO</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HANJA-TO-HANGUL-ALT-THREE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_THREE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ANNOTATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-BOX-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_BOX_ANNOTATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ROUNDED-BOX-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ROUNDED_BOX_ANNOTATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CIRCLE-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CIRCLE_ANNOTATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INVERTED-CIRCLE-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_CIRCLE_ANNOTATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PARENTHESIS-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PARENTHESIS_ANNOTATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PERIOD-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIOD_ANNOTATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ROMAN-NUMERAL-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMAN_NUMERAL_ANNOTATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DIAMOND-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAMOND_ANNOTATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INVERTED-BOX-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_BOX_ANNOTATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INVERTED-ROUNDED-BOX-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_ROUNDED_BOX_ANNOTATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-FULL-WIDTH-KANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_KANA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-KANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_KANA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-FULL-WIDTH-IDEOGRAPHS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_IDEOGRAPHS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-IDEOGRAPHS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_IDEOGRAPHS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HALF-WIDTH-IDEOGRAPHS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_IDEOGRAPHS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CANONICAL-COMPOSITION-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CANONICAL-COMPOSITION-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-COMPATIBILITY-COMPOSITION-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-COMPATIBILITY-COMPOSITION-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRANSCODING-COMPOSITION-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRANSCODING-COMPOSITION-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-RUBY-KANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_RUBY_KANA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-RUBY-KANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-RUBY-KANA-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-RUBY-KANA-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-CJK-SYMBOL-ALTERNATIVES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_SYMBOL_ALTERNATIVES</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-ONE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_ONE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-TWO:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_TWO</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-THREE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_THREE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-FOUR:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FOUR</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-FIVE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FIVE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-IDEOGRAPHIC-ALTERNATIVES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_IDEOGRAPHIC_ALTERNATIVES</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-ONE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_ONE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-TWO:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_TWO</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-THREE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_THREE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-FOUR:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FOUR</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-FIVE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FIVE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-VERTICAL-ROMAN-CENTERED:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_CENTERED</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-VERTICAL-ROMAN-HBASELINE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_HBASELINE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-CJK-ITALIC-ROMAN:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_ITALIC_ROMAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-ITALIC-ROMAN:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-ITALIC-ROMAN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-ITALIC-ROMAN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CASE-SENSITIVE-LAYOUT-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CASE-SENSITIVE-LAYOUT-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CASE-SENSITIVE-SPACING-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CASE-SENSITIVE-SPACING-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALTERNATE-HORIZ-KANA-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALTERNATE-HORIZ-KANA-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALTERNATE-VERT-KANA-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALTERNATE-VERT-KANA-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-STYLISTIC-ALTERNATES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLISTIC_ALTERNATES</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-ONE-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-ONE-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWO-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWO-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-THREE-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-THREE-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FOUR-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FOUR-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FIVE-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FIVE-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SIX-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SIX-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SEVEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SEVEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-EIGHT-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-EIGHT-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-NINE-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-NINE-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-ELEVEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-ELEVEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWELVE-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWELVE-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-THIRTEEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-THIRTEEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FOURTEEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FOURTEEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FIFTEEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FIFTEEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SIXTEEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SIXTEEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SEVENTEEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SEVENTEEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-EIGHTEEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-EIGHTEEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-NINETEEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-NINETEEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWENTY-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWENTY-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-ALTERNATES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-ALTERNATES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SWASH-ALTERNATES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SWASH-ALTERNATES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-SWASH-ALTERNATES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-SWASH-ALTERNATES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DEFAULT-LOWER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LOWER-CASE-SMALL-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LOWER-CASE-PETITE-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DEFAULT-UPPER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-UPPER-CASE-SMALL-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-UPPER-CASE-PETITE-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HALF-WIDTH-CJK-ROMAN:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_CJK_ROMAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-CJK-ROMAN:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_CJK_ROMAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DEFAULT-CJK-ROMAN:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-FULL-WIDTH-CJK-ROMAN:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-MAX-VALUE:CAPS"></a>_HB_AAT_LAYOUT_FEATURE_SELECTOR_MAX_VALUE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: 2.2.0</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-blob.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-blob.html
new file mode 100644
index 0000000..9fa3967
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-blob.html
@@ -0,0 +1,726 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-blob: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch09.html" title="Core API">
+<link rel="prev" href="ch09.html" title="Core API">
+<link rel="next" href="harfbuzz-hb-buffer.html" title="hb-buffer">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-blob.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-blob.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch09.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="ch09.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-buffer.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-blob"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-blob.top_of_page"></a>hb-blob</span></h2>
+<p>hb-blob — Binary data containers</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-blob.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create" title="hb_blob_create ()">hb_blob_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-from-file" title="hb_blob_create_from_file ()">hb_blob_create_from_file</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-sub-blob" title="hb_blob_create_sub_blob ()">hb_blob_create_sub_blob</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-copy-writable-or-fail" title="hb_blob_copy_writable_or_fail ()">hb_blob_copy_writable_or_fail</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-destroy" title="hb_blob_destroy ()">hb_blob_destroy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <span class="returnvalue">char</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-data" title="hb_blob_get_data ()">hb_blob_get_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">char</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-data-writable" title="hb_blob_get_data_writable ()">hb_blob_get_data_writable</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-empty" title="hb_blob_get_empty ()">hb_blob_get_empty</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-length" title="hb_blob_get_length ()">hb_blob_get_length</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-user-data" title="hb_blob_get_user_data ()">hb_blob_get_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-is-immutable" title="hb_blob_is_immutable ()">hb_blob_is_immutable</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-make-immutable" title="hb_blob_make_immutable ()">hb_blob_make_immutable</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-reference" title="hb_blob_reference ()">hb_blob_reference</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-set-user-data" title="hb_blob_set_user_data ()">hb_blob_set_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="hb-blob-t"></a><div class="refsect1">
+<a name="harfbuzz-hb-blob.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t">hb_blob_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-blob.html#hb-memory-mode-t" title="enum hb_memory_mode_t">hb_memory_mode_t</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-blob.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
+    <span class="lineart">╰──</span> hb_blob_t
+    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
+    <span class="lineart">╰──</span> hb_memory_mode_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-blob.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-blob.description"></a><h2>Description</h2>
+<p>Blobs wrap a chunk of binary data to handle lifecycle management of data
+while it is passed between client and HarfBuzz.  Blobs are primarily used
+to create font faces, but also to access font face tables, as well as
+pass around other binary data.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-blob.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-blob-create"></a><h3>hb_blob_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+hb_blob_create (<em class="parameter"><code>const <span class="type">char</span> *data</code></em>,
+                <em class="parameter"><code>unsigned <span class="type">int</span> length</code></em>,
+                <em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-memory-mode-t" title="enum hb_memory_mode_t"><span class="type">hb_memory_mode_t</span></a> mode</code></em>,
+                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Creates a new "blob" object wrapping <em class="parameter"><code>data</code></em>
+.  The <em class="parameter"><code>mode</code></em>
+ parameter is used
+to negotiate ownership and lifecycle of <em class="parameter"><code>data</code></em>
+.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-blob-create.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>data</p></td>
+<td class="parameter_description"><p>Pointer to blob data.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>length</p></td>
+<td class="parameter_description"><p>Length of <em class="parameter"><code>data</code></em>
+in bytes.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>mode</p></td>
+<td class="parameter_description"><p>Memory mode for <em class="parameter"><code>data</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data parameter to pass to <em class="parameter"><code>destroy</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>Callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-blob-create.returns"></a><h4>Returns</h4>
+<p> New blob, or the empty blob if something failed or if <em class="parameter"><code>length</code></em>
+is
+zero.  Destroy with <a class="link" href="harfbuzz-hb-blob.html#hb-blob-destroy" title="hb_blob_destroy ()"><code class="function">hb_blob_destroy()</code></a>.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-blob-create-from-file"></a><h3>hb_blob_create_from_file ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+hb_blob_create_from_file (<em class="parameter"><code>const <span class="type">char</span> *file_name</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-blob-create-from-file.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>file_name</p></td>
+<td class="parameter_description"><p>font filename.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-blob-create-from-file.returns"></a><h4>Returns</h4>
+<p> A hb_blob_t pointer with the content of the file</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-blob-create-sub-blob"></a><h3>hb_blob_create_sub_blob ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+hb_blob_create_sub_blob (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *parent</code></em>,
+                         <em class="parameter"><code>unsigned <span class="type">int</span> offset</code></em>,
+                         <em class="parameter"><code>unsigned <span class="type">int</span> length</code></em>);</pre>
+<p>Returns a blob that represents a range of bytes in <em class="parameter"><code>parent</code></em>
+.  The new
+blob is always created with <a class="link" href="harfbuzz-hb-blob.html#HB-MEMORY-MODE-READONLY:CAPS"><code class="literal">HB_MEMORY_MODE_READONLY</code></a>, meaning that it
+will never modify data in the parent blob.  The parent data is not
+expected to be modified, and will result in undefined behavior if it
+is.</p>
+<p>Makes <em class="parameter"><code>parent</code></em>
+ immutable.</p>
+<div class="refsect3">
+<a name="hb-blob-create-sub-blob.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>parent</p></td>
+<td class="parameter_description"><p>Parent blob.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>offset</p></td>
+<td class="parameter_description"><p>Start offset of sub-blob within <em class="parameter"><code>parent</code></em>
+, in bytes.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>length</p></td>
+<td class="parameter_description"><p>Length of sub-blob.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-blob-create-sub-blob.returns"></a><h4>Returns</h4>
+<p> New blob, or the empty blob if something failed or if
+<em class="parameter"><code>length</code></em>
+is zero or <em class="parameter"><code>offset</code></em>
+is beyond the end of <em class="parameter"><code>parent</code></em>
+'s data.  Destroy
+with <a class="link" href="harfbuzz-hb-blob.html#hb-blob-destroy" title="hb_blob_destroy ()"><code class="function">hb_blob_destroy()</code></a>.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-blob-copy-writable-or-fail"></a><h3>hb_blob_copy_writable_or_fail ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+hb_blob_copy_writable_or_fail (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+<p>Makes a writable copy of <em class="parameter"><code>blob</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-blob-copy-writable-or-fail.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>blob</p></td>
+<td class="parameter_description"><p>A blob.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-blob-copy-writable-or-fail.returns"></a><h4>Returns</h4>
+<p> New blob, or nullptr if allocation failed.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-8-0.html#api-index-1.8.0">1.8.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-blob-destroy"></a><h3>hb_blob_destroy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_blob_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+<p>Decreases the reference count on <em class="parameter"><code>blob</code></em>
+, and if it reaches zero, destroys
+<em class="parameter"><code>blob</code></em>
+, freeing all memory, possibly calling the destroy-callback the blob
+was created for if it has not been called already.</p>
+<p>See TODO:link object types for more information.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-blob-destroy.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>blob</p></td>
+<td class="parameter_description"><p>a blob.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-blob-get-data"></a><h3>hb_blob_get_data ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *
+hb_blob_get_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>,
+                  <em class="parameter"><code>unsigned <span class="type">int</span> *length</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-blob-get-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>blob</p></td>
+<td class="parameter_description"><p>a blob.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>length</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-blob-get-data.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=length]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-blob-get-data-writable"></a><h3>hb_blob_get_data_writable ()</h3>
+<pre class="programlisting"><span class="returnvalue">char</span> *
+hb_blob_get_data_writable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>,
+                           <em class="parameter"><code>unsigned <span class="type">int</span> *length</code></em>);</pre>
+<p>Tries to make blob data writable (possibly copying it) and
+return pointer to data.</p>
+<p>Fails if blob has been made immutable, or if memory allocation
+fails.</p>
+<div class="refsect3">
+<a name="hb-blob-get-data-writable.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>blob</p></td>
+<td class="parameter_description"><p>a blob.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>length</p></td>
+<td class="parameter_description"><p> output length of the writable data. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-blob-get-data-writable.returns"></a><h4>Returns</h4>
+<p> Writable blob data,
+or <code class="literal">NULL</code> if failed. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=length]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-blob-get-empty"></a><h3>hb_blob_get_empty ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+hb_blob_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Returns the singleton empty blob.</p>
+<p>See TODO:link object types for more information.</p>
+<div class="refsect3">
+<a name="hb-blob-get-empty.returns"></a><h4>Returns</h4>
+<p> the empty blob. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-blob-get-length"></a><h3>hb_blob_get_length ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_blob_get_length (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-blob-get-length.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>blob</p></td>
+<td class="parameter_description"><p>a blob.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-blob-get-length.returns"></a><h4>Returns</h4>
+<p> the length of blob data in bytes.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-blob-get-user-data"></a><h3>hb_blob_get_user_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> *
+hb_blob_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-blob-get-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>blob</p></td>
+<td class="parameter_description"><p>a blob.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>key for data to get.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-blob-get-user-data.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-blob-is-immutable"></a><h3>hb_blob_is_immutable ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_blob_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-blob-is-immutable.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>blob</p></td>
+<td class="parameter_description"><p>a blob.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-blob-is-immutable.returns"></a><h4>Returns</h4>
+<p> TODO</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-blob-make-immutable"></a><h3>hb_blob_make_immutable ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_blob_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-blob-make-immutable.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>blob</p></td>
+<td class="parameter_description"><p>a blob.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-blob-reference"></a><h3>hb_blob_reference ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+hb_blob_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+<p>Increases the reference count on <em class="parameter"><code>blob</code></em>
+.</p>
+<p>See TODO:link object types for more information.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-blob-reference.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>blob</p></td>
+<td class="parameter_description"><p>a blob.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-blob-reference.returns"></a><h4>Returns</h4>
+<p> <em class="parameter"><code>blob</code></em>
+.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-blob-set-user-data"></a><h3>hb_blob_set_user_data ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_blob_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+                       <em class="parameter"><code><span class="type">void</span> *data</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-blob-set-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>blob</p></td>
+<td class="parameter_description"><p>a blob.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>key for data to set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>data</p></td>
+<td class="parameter_description"><p>data to set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>replace</p></td>
+<td class="parameter_description"><p>whether to replace an existing data with the same key.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-blob.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="hb-blob-t"></a><h3>hb_blob_t</h3>
+<pre class="programlisting">typedef struct hb_blob_t hb_blob_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-memory-mode-t"></a><h3>enum hb_memory_mode_t</h3>
+<div class="refsect3">
+<a name="hb-memory-mode-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-MEMORY-MODE-DUPLICATE:CAPS"></a>HB_MEMORY_MODE_DUPLICATE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-MEMORY-MODE-READONLY:CAPS"></a>HB_MEMORY_MODE_READONLY</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-MEMORY-MODE-WRITABLE:CAPS"></a>HB_MEMORY_MODE_WRITABLE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-MEMORY-MODE-READONLY-MAY-MAKE-WRITABLE:CAPS"></a>HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-buffer.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-buffer.html
new file mode 100644
index 0000000..b9f3695
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-buffer.html
@@ -0,0 +1,3045 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-buffer: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch09.html" title="Core API">
+<link rel="prev" href="harfbuzz-hb-blob.html" title="hb-blob">
+<link rel="next" href="harfbuzz-hb-common.html" title="hb-common">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-buffer.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-buffer.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch09.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-blob.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-common.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-buffer"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-buffer.top_of_page"></a>hb-buffer</span></h2>
+<p>hb-buffer — Input and output buffers</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-buffer.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="returnvalue">hb_buffer_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-create" title="hb_buffer_create ()">hb_buffer_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="returnvalue">hb_buffer_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reference" title="hb_buffer_reference ()">hb_buffer_reference</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="returnvalue">hb_buffer_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-empty" title="hb_buffer_get_empty ()">hb_buffer_get_empty</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-destroy" title="hb_buffer_destroy ()">hb_buffer_destroy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reset" title="hb_buffer_reset ()">hb_buffer_reset</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-clear-contents" title="hb_buffer_clear_contents ()">hb_buffer_clear_contents</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-pre-allocate" title="hb_buffer_pre_allocate ()">hb_buffer_pre_allocate</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-allocation-successful" title="hb_buffer_allocation_successful ()">hb_buffer_allocation_successful</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add" title="hb_buffer_add ()">hb_buffer_add</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-codepoints" title="hb_buffer_add_codepoints ()">hb_buffer_add_codepoints</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-utf32" title="hb_buffer_add_utf32 ()">hb_buffer_add_utf32</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-utf16" title="hb_buffer_add_utf16 ()">hb_buffer_add_utf16</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-utf8" title="hb_buffer_add_utf8 ()">hb_buffer_add_utf8</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-latin1" title="hb_buffer_add_latin1 ()">hb_buffer_add_latin1</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-append" title="hb_buffer_append ()">hb_buffer_append</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-content-type" title="hb_buffer_set_content_type ()">hb_buffer_set_content_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-content-type-t" title="enum hb_buffer_content_type_t"><span class="returnvalue">hb_buffer_content_type_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-content-type" title="hb_buffer_get_content_type ()">hb_buffer_get_content_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-direction" title="hb_buffer_set_direction ()">hb_buffer_set_direction</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="returnvalue">hb_direction_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-direction" title="hb_buffer_get_direction ()">hb_buffer_get_direction</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-script" title="hb_buffer_set_script ()">hb_buffer_set_script</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-script" title="hb_buffer_get_script ()">hb_buffer_get_script</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-language" title="hb_buffer_set_language ()">hb_buffer_set_language</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="returnvalue">hb_language_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-language" title="hb_buffer_get_language ()">hb_buffer_get_language</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-flags" title="hb_buffer_set_flags ()">hb_buffer_set_flags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t"><span class="returnvalue">hb_buffer_flags_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-flags" title="hb_buffer_get_flags ()">hb_buffer_get_flags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-cluster-level" title="hb_buffer_set_cluster_level ()">hb_buffer_set_cluster_level</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-cluster-level-t" title="enum hb_buffer_cluster_level_t"><span class="returnvalue">hb_buffer_cluster_level_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-cluster-level" title="hb_buffer_get_cluster_level ()">hb_buffer_get_cluster_level</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-length" title="hb_buffer_set_length ()">hb_buffer_set_length</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-length" title="hb_buffer_get_length ()">hb_buffer_get_length</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-segment-properties" title="hb_buffer_set_segment_properties ()">hb_buffer_set_segment_properties</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-segment-properties" title="hb_buffer_get_segment_properties ()">hb_buffer_get_segment_properties</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-guess-segment-properties" title="hb_buffer_guess_segment_properties ()">hb_buffer_guess_segment_properties</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-unicode-funcs" title="hb_buffer_set_unicode_funcs ()">hb_buffer_set_unicode_funcs</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-unicode-funcs" title="hb_buffer_get_unicode_funcs ()">hb_buffer_get_unicode_funcs</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-user-data" title="hb_buffer_set_user_data ()">hb_buffer_set_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-user-data" title="hb_buffer_get_user_data ()">hb_buffer_get_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">hb_glyph_info_t</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-glyph-infos" title="hb_buffer_get_glyph_infos ()">hb_buffer_get_glyph_infos</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t"><span class="returnvalue">hb_glyph_position_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-glyph-positions" title="hb_buffer_get_glyph_positions ()">hb_buffer_get_glyph_positions</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-invisible-glyph" title="hb_buffer_get_invisible_glyph ()">hb_buffer_get_invisible_glyph</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-invisible-glyph" title="hb_buffer_set_invisible_glyph ()">hb_buffer_set_invisible_glyph</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-codepoint" title="hb_buffer_set_replacement_codepoint ()">hb_buffer_set_replacement_codepoint</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-replacement-codepoint" title="hb_buffer_get_replacement_codepoint ()">hb_buffer_get_replacement_codepoint</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-normalize-glyphs" title="hb_buffer_normalize_glyphs ()">hb_buffer_normalize_glyphs</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reverse" title="hb_buffer_reverse ()">hb_buffer_reverse</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reverse-range" title="hb_buffer_reverse_range ()">hb_buffer_reverse_range</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reverse-clusters" title="hb_buffer_reverse_clusters ()">hb_buffer_reverse_clusters</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-glyphs" title="hb_buffer_serialize_glyphs ()">hb_buffer_serialize_glyphs</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-deserialize-glyphs" title="hb_buffer_deserialize_glyphs ()">hb_buffer_deserialize_glyphs</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="returnvalue">hb_buffer_serialize_format_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-from-string" title="hb_buffer_serialize_format_from_string ()">hb_buffer_serialize_format_from_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <span class="returnvalue">char</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-to-string" title="hb_buffer_serialize_format_to_string ()">hb_buffer_serialize_format_to_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <span class="returnvalue">char</span> **
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-list-formats" title="hb_buffer_serialize_list_formats ()">hb_buffer_serialize_list_formats</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-equal" title="hb_segment_properties_equal ()">hb_segment_properties_equal</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-hash" title="hb_segment_properties_hash ()">hb_segment_properties_hash</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-diff-flags-t" title="enum hb_buffer_diff_flags_t"><span class="returnvalue">hb_buffer_diff_flags_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-diff" title="hb_buffer_diff ()">hb_buffer_diff</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-message-func" title="hb_buffer_set_message_func ()">hb_buffer_set_message_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t"><span class="returnvalue">hb_glyph_flags_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-get-glyph-flags" title="hb_glyph_info_get_glyph_flags ()">hb_glyph_info_get_glyph_flags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-message-func-t" title="hb_buffer_message_func_t ()">*hb_buffer_message_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="hb-buffer-t"></a><a name="hb-glyph-position-t"></a><a name="hb-segment-properties-t"></a><div class="refsect1">
+<a name="harfbuzz-hb-buffer.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#HB-SEGMENT-PROPERTIES-DEFAULT:CAPS" title="HB_SEGMENT_PROPERTIES_DEFAULT">HB_SEGMENT_PROPERTIES_DEFAULT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-REPLACEMENT-CODEPOINT-DEFAULT:CAPS" title="HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT">HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t">hb_buffer_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t">hb_glyph_flags_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct" title="hb_glyph_position_t">hb_glyph_position_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-content-type-t" title="enum hb_buffer_content_type_t">hb_buffer_content_type_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t">hb_buffer_flags_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-cluster-level-t" title="enum hb_buffer_cluster_level_t">hb_buffer_cluster_level_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t-struct" title="hb_segment_properties_t">hb_segment_properties_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t">hb_buffer_serialize_format_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t">hb_buffer_serialize_flags_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-diff-flags-t" title="enum hb_buffer_diff_flags_t">hb_buffer_diff_flags_t</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-buffer.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
+    <span class="lineart">├──</span> hb_buffer_t
+    <span class="lineart">├──</span> hb_glyph_position_t
+    <span class="lineart">╰──</span> hb_segment_properties_t
+    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
+    <span class="lineart">├──</span> hb_buffer_cluster_level_t
+    <span class="lineart">├──</span> hb_buffer_content_type_t
+    <span class="lineart">╰──</span> hb_buffer_serialize_format_t
+    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GFlags</a>
+    <span class="lineart">├──</span> hb_buffer_diff_flags_t
+    <span class="lineart">├──</span> hb_buffer_flags_t
+    <span class="lineart">├──</span> hb_buffer_serialize_flags_t
+    <span class="lineart">╰──</span> hb_glyph_flags_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-buffer.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-buffer.description"></a><h2>Description</h2>
+<p>Buffers serve dual role in HarfBuzz; they hold the input characters that are
+passed to <a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape ()"><code class="function">hb_shape()</code></a>, and after shaping they hold the output glyphs.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-buffer.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-buffer-create"></a><h3>hb_buffer_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="returnvalue">hb_buffer_t</span></a> *
+hb_buffer_create (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Creates a new <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> with all properties to defaults.</p>
+<p><span class="annotation">[Xconstructor]</span></p>
+<div class="refsect3">
+<a name="hb-buffer-create.returns"></a><h4>Returns</h4>
+<p>A newly allocated <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> with a reference count of 1. The initial
+reference count should be released with <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-destroy" title="hb_buffer_destroy ()"><code class="function">hb_buffer_destroy()</code></a> when you are done
+using the <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>. This function never returns <code class="literal">NULL</code>. If memory cannot
+be allocated, a special <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> object will be returned on which
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-allocation-successful" title="hb_buffer_allocation_successful ()"><code class="function">hb_buffer_allocation_successful()</code></a> returns <code class="literal">false</code>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-reference"></a><h3>hb_buffer_reference ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="returnvalue">hb_buffer_t</span></a> *
+hb_buffer_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>Increases the reference count on <em class="parameter"><code>buffer</code></em>
+ by one. This prevents <em class="parameter"><code>buffer</code></em>
+ from
+being destroyed until a matching call to <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-destroy" title="hb_buffer_destroy ()"><code class="function">hb_buffer_destroy()</code></a> is made.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-buffer-reference.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-reference.returns"></a><h4>Returns</h4>
+<p>The referenced <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-empty"></a><h3>hb_buffer_get_empty ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="returnvalue">hb_buffer_t</span></a> *
+hb_buffer_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<div class="refsect3">
+<a name="hb-buffer-get-empty.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-destroy"></a><h3>hb_buffer_destroy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>Deallocate the <em class="parameter"><code>buffer</code></em>
+.
+Decreases the reference count on <em class="parameter"><code>buffer</code></em>
+ by one. If the result is zero, then
+<em class="parameter"><code>buffer</code></em>
+ and all associated resources are freed. See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reference" title="hb_buffer_reference ()"><code class="function">hb_buffer_reference()</code></a>.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-buffer-destroy.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-reset"></a><h3>hb_buffer_reset ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_reset (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>Resets the buffer to its initial status, as if it was just newly created
+with <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-create" title="hb_buffer_create ()"><code class="function">hb_buffer_create()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-reset.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-clear-contents"></a><h3>hb_buffer_clear_contents ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_clear_contents (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>Similar to <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reset" title="hb_buffer_reset ()"><code class="function">hb_buffer_reset()</code></a>, but does not clear the Unicode functions and
+the replacement code point.</p>
+<div class="refsect3">
+<a name="hb-buffer-clear-contents.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-11.html#api-index-0.9.11">0.9.11</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-pre-allocate"></a><h3>hb_buffer_pre_allocate ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_buffer_pre_allocate (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                        <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
+<p>Pre allocates memory for <em class="parameter"><code>buffer</code></em>
+ to fit at least <em class="parameter"><code>size</code></em>
+ number of items.</p>
+<div class="refsect3">
+<a name="hb-buffer-pre-allocate.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>size</p></td>
+<td class="parameter_description"><p>number of items to pre allocate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-pre-allocate.returns"></a><h4>Returns</h4>
+<p><code class="literal">true</code> if <em class="parameter"><code>buffer</code></em>
+memory allocation succeeded, <code class="literal">false</code> otherwise.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-allocation-successful"></a><h3>hb_buffer_allocation_successful ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_buffer_allocation_successful (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>Check if allocating memory for the buffer succeeded.</p>
+<div class="refsect3">
+<a name="hb-buffer-allocation-successful.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-allocation-successful.returns"></a><h4>Returns</h4>
+<p><code class="literal">true</code> if <em class="parameter"><code>buffer</code></em>
+memory allocation succeeded, <code class="literal">false</code> otherwise.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-add"></a><h3>hb_buffer_add ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_add (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> codepoint</code></em>,
+               <em class="parameter"><code>unsigned <span class="type">int</span> cluster</code></em>);</pre>
+<p>Appends a character with the Unicode value of <em class="parameter"><code>codepoint</code></em>
+ to <em class="parameter"><code>buffer</code></em>
+, and
+gives it the initial cluster value of <em class="parameter"><code>cluster</code></em>
+. Clusters can be any thing
+the client wants, they are usually used to refer to the index of the
+character in the input text stream and are output in
+<span class="type">hb_glyph_info_t.cluster</span> field.</p>
+<p>This function does not check the validity of <em class="parameter"><code>codepoint</code></em>
+, it is up to the
+caller to ensure it is a valid Unicode code point.</p>
+<div class="refsect3">
+<a name="hb-buffer-add.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>codepoint</p></td>
+<td class="parameter_description"><p>a Unicode code point.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>cluster</p></td>
+<td class="parameter_description"><p>the cluster value of <em class="parameter"><code>codepoint</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-add-codepoints"></a><h3>hb_buffer_add_codepoints ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_add_codepoints (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                          <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *text</code></em>,
+                          <em class="parameter"><code><span class="type">int</span> text_length</code></em>,
+                          <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
+                          <em class="parameter"><code><span class="type">int</span> item_length</code></em>);</pre>
+<p>Appends characters from <em class="parameter"><code>text</code></em>
+ array to <em class="parameter"><code>buffer</code></em>
+. The <em class="parameter"><code>item_offset</code></em>
+ is the
+position of the first character from <em class="parameter"><code>text</code></em>
+ that will be appended, and
+<em class="parameter"><code>item_length</code></em>
+ is the number of character. When shaping part of a larger text
+(e.g. a run of text from a paragraph), instead of passing just the substring
+corresponding to the run, it is preferable to pass the whole
+paragraph and specify the run start and length as <em class="parameter"><code>item_offset</code></em>
+ and
+<em class="parameter"><code>item_length</code></em>
+, respectively, to give HarfBuzz the full context to be able,
+for example, to do cross-run Arabic shaping or properly handle combining
+marks at stat of run.</p>
+<p>This function does not check the validity of <em class="parameter"><code>text</code></em>
+, it is up to the caller
+to ensure it contains a valid Unicode code points.</p>
+<div class="refsect3">
+<a name="hb-buffer-add-codepoints.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> to append characters to.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text</p></td>
+<td class="parameter_description"><p> an array of Unicode code points to append. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text_length</p></td>
+<td class="parameter_description"><p>the length of the <em class="parameter"><code>text</code></em>
+, or -1 if it is <code class="literal">NULL</code> terminated.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>item_offset</p></td>
+<td class="parameter_description"><p>the offset of the first code point to add to the <em class="parameter"><code>buffer</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>item_length</p></td>
+<td class="parameter_description"><p>the number of code points to add to the <em class="parameter"><code>buffer</code></em>
+, or -1 for the
+end of <em class="parameter"><code>text</code></em>
+(assuming it is <code class="literal">NULL</code> terminated).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-31.html#api-index-0.9.31">0.9.31</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-add-utf32"></a><h3>hb_buffer_add_utf32 ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_add_utf32 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                     <em class="parameter"><code>const <span class="type">uint32_t</span> *text</code></em>,
+                     <em class="parameter"><code><span class="type">int</span> text_length</code></em>,
+                     <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
+                     <em class="parameter"><code><span class="type">int</span> item_length</code></em>);</pre>
+<p>See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-codepoints" title="hb_buffer_add_codepoints ()"><code class="function">hb_buffer_add_codepoints()</code></a>.</p>
+<p>Replaces invalid UTF-32 characters with the <em class="parameter"><code>buffer</code></em>
+ replacement code point,
+see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-codepoint" title="hb_buffer_set_replacement_codepoint ()"><code class="function">hb_buffer_set_replacement_codepoint()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-add-utf32.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text</p></td>
+<td class="parameter_description"><p> an array of UTF-32 characters to append. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text_length</p></td>
+<td class="parameter_description"><p>the length of the <em class="parameter"><code>text</code></em>
+, or -1 if it is <code class="literal">NULL</code> terminated.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>item_offset</p></td>
+<td class="parameter_description"><p>the offset of the first character to add to the <em class="parameter"><code>buffer</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>item_length</p></td>
+<td class="parameter_description"><p>the number of characters to add to the <em class="parameter"><code>buffer</code></em>
+, or -1 for the
+end of <em class="parameter"><code>text</code></em>
+(assuming it is <code class="literal">NULL</code> terminated).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-add-utf16"></a><h3>hb_buffer_add_utf16 ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_add_utf16 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                     <em class="parameter"><code>const <span class="type">uint16_t</span> *text</code></em>,
+                     <em class="parameter"><code><span class="type">int</span> text_length</code></em>,
+                     <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
+                     <em class="parameter"><code><span class="type">int</span> item_length</code></em>);</pre>
+<p>See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-codepoints" title="hb_buffer_add_codepoints ()"><code class="function">hb_buffer_add_codepoints()</code></a>.</p>
+<p>Replaces invalid UTF-16 characters with the <em class="parameter"><code>buffer</code></em>
+ replacement code point,
+see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-codepoint" title="hb_buffer_set_replacement_codepoint ()"><code class="function">hb_buffer_set_replacement_codepoint()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-add-utf16.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text</p></td>
+<td class="parameter_description"><p> an array of UTF-16 characters to append. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text_length</p></td>
+<td class="parameter_description"><p>the length of the <em class="parameter"><code>text</code></em>
+, or -1 if it is <code class="literal">NULL</code> terminated.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>item_offset</p></td>
+<td class="parameter_description"><p>the offset of the first character to add to the <em class="parameter"><code>buffer</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>item_length</p></td>
+<td class="parameter_description"><p>the number of characters to add to the <em class="parameter"><code>buffer</code></em>
+, or -1 for the
+end of <em class="parameter"><code>text</code></em>
+(assuming it is <code class="literal">NULL</code> terminated).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-add-utf8"></a><h3>hb_buffer_add_utf8 ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_add_utf8 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                    <em class="parameter"><code>const <span class="type">char</span> *text</code></em>,
+                    <em class="parameter"><code><span class="type">int</span> text_length</code></em>,
+                    <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
+                    <em class="parameter"><code><span class="type">int</span> item_length</code></em>);</pre>
+<p>See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-codepoints" title="hb_buffer_add_codepoints ()"><code class="function">hb_buffer_add_codepoints()</code></a>.</p>
+<p>Replaces invalid UTF-8 characters with the <em class="parameter"><code>buffer</code></em>
+ replacement code point,
+see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-codepoint" title="hb_buffer_set_replacement_codepoint ()"><code class="function">hb_buffer_set_replacement_codepoint()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-add-utf8.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text</p></td>
+<td class="parameter_description"><p> an array of UTF-8
+characters to append. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text_length</p></td>
+<td class="parameter_description"><p>the length of the <em class="parameter"><code>text</code></em>
+, or -1 if it is <code class="literal">NULL</code> terminated.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>item_offset</p></td>
+<td class="parameter_description"><p>the offset of the first character to add to the <em class="parameter"><code>buffer</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>item_length</p></td>
+<td class="parameter_description"><p>the number of characters to add to the <em class="parameter"><code>buffer</code></em>
+, or -1 for the
+end of <em class="parameter"><code>text</code></em>
+(assuming it is <code class="literal">NULL</code> terminated).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-add-latin1"></a><h3>hb_buffer_add_latin1 ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_add_latin1 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                      <em class="parameter"><code>const <span class="type">uint8_t</span> *text</code></em>,
+                      <em class="parameter"><code><span class="type">int</span> text_length</code></em>,
+                      <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
+                      <em class="parameter"><code><span class="type">int</span> item_length</code></em>);</pre>
+<p>Similar to <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-codepoints" title="hb_buffer_add_codepoints ()"><code class="function">hb_buffer_add_codepoints()</code></a>, but allows only access to first 256
+Unicode code points that can fit in 8-bit strings.</p>
+<div class="note">Has nothing to do with non-Unicode Latin-1 encoding.</div>
+<div class="refsect3">
+<a name="hb-buffer-add-latin1.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text</p></td>
+<td class="parameter_description"><p> an array of UTF-8
+characters to append. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text_length</p></td>
+<td class="parameter_description"><p>the length of the <em class="parameter"><code>text</code></em>
+, or -1 if it is <code class="literal">NULL</code> terminated.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>item_offset</p></td>
+<td class="parameter_description"><p>the offset of the first character to add to the <em class="parameter"><code>buffer</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>item_length</p></td>
+<td class="parameter_description"><p>the number of characters to add to the <em class="parameter"><code>buffer</code></em>
+, or -1 for the
+end of <em class="parameter"><code>text</code></em>
+(assuming it is <code class="literal">NULL</code> terminated).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-39.html#api-index-0.9.39">0.9.39</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-append"></a><h3>hb_buffer_append ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_append (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *source</code></em>,
+                  <em class="parameter"><code>unsigned <span class="type">int</span> start</code></em>,
+                  <em class="parameter"><code>unsigned <span class="type">int</span> end</code></em>);</pre>
+<p>Append (part of) contents of another buffer to this buffer.</p>
+<div class="refsect3">
+<a name="hb-buffer-append.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>source</p></td>
+<td class="parameter_description"><p>source <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start</p></td>
+<td class="parameter_description"><p>start index into source buffer to copy.  Use 0 to copy from start of buffer.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>end</p></td>
+<td class="parameter_description"><p>end index into source buffer to copy.  Use (unsigned int) -1 to copy to end of buffer.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-5-0.html#api-index-1.5.0">1.5.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-set-content-type"></a><h3>hb_buffer_set_content_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_set_content_type (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-content-type-t" title="enum hb_buffer_content_type_t"><span class="type">hb_buffer_content_type_t</span></a> content_type</code></em>);</pre>
+<p>Sets the type of <em class="parameter"><code>buffer</code></em>
+ contents, buffers are either empty, contain
+characters (before shaping) or glyphs (the result of shaping).</p>
+<div class="refsect3">
+<a name="hb-buffer-set-content-type.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>content_type</p></td>
+<td class="parameter_description"><p>the type of buffer contents to set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-5.html#api-index-0.9.5">0.9.5</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-content-type"></a><h3>hb_buffer_get_content_type ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-content-type-t" title="enum hb_buffer_content_type_t"><span class="returnvalue">hb_buffer_content_type_t</span></a>
+hb_buffer_get_content_type (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-content-type" title="hb_buffer_set_content_type ()"><code class="function">hb_buffer_set_content_type()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-get-content-type.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-get-content-type.returns"></a><h4>Returns</h4>
+<p>The type of <em class="parameter"><code>buffer</code></em>
+contents.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-5.html#api-index-0.9.5">0.9.5</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-set-direction"></a><h3>hb_buffer_set_direction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_set_direction (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>);</pre>
+<p>Set the text flow direction of the buffer. No shaping can happen without
+setting <em class="parameter"><code>buffer</code></em>
+ direction, and it controls the visual direction for the
+output glyphs; for RTL direction the glyphs will be reversed. Many layout
+features depend on the proper setting of the direction, for example,
+reversing RTL text before shaping, then shaping with LTR direction is not
+the same as keeping the text in logical order and shaping with RTL
+direction.</p>
+<div class="refsect3">
+<a name="hb-buffer-set-direction.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>direction</p></td>
+<td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> of the <em class="parameter"><code>buffer</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-direction"></a><h3>hb_buffer_get_direction ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="returnvalue">hb_direction_t</span></a>
+hb_buffer_get_direction (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-direction" title="hb_buffer_set_direction ()"><code class="function">hb_buffer_set_direction()</code></a></p>
+<div class="refsect3">
+<a name="hb-buffer-get-direction.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-get-direction.returns"></a><h4>Returns</h4>
+<p>The direction of the <em class="parameter"><code>buffer</code></em>
+.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-set-script"></a><h3>hb_buffer_set_script ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_set_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>);</pre>
+<p>Sets the script of <em class="parameter"><code>buffer</code></em>
+ to <em class="parameter"><code>script</code></em>
+.</p>
+<p>Script is crucial for choosing the proper shaping behaviour for scripts that
+require it (e.g. Arabic) and the which OpenType features defined in the font
+to be applied.</p>
+<p>You can pass one of the predefined <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> values, or use
+<a class="link" href="harfbuzz-hb-common.html#hb-script-from-string" title="hb_script_from_string ()"><code class="function">hb_script_from_string()</code></a> or <a class="link" href="harfbuzz-hb-common.html#hb-script-from-iso15924-tag" title="hb_script_from_iso15924_tag ()"><code class="function">hb_script_from_iso15924_tag()</code></a> to get the
+corresponding script from an ISO 15924 script tag.</p>
+<div class="refsect3">
+<a name="hb-buffer-set-script.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>script</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> to set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-script"></a><h3>hb_buffer_get_script ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+hb_buffer_get_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-script" title="hb_buffer_set_script ()"><code class="function">hb_buffer_set_script()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-get-script.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-get-script.returns"></a><h4>Returns</h4>
+<p>The <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> of the <em class="parameter"><code>buffer</code></em>
+.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-set-language"></a><h3>hb_buffer_set_language ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_set_language (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> language</code></em>);</pre>
+<p>Sets the language of <em class="parameter"><code>buffer</code></em>
+ to <em class="parameter"><code>language</code></em>
+.</p>
+<p>Languages are crucial for selecting which OpenType feature to apply to the
+buffer which can result in applying language-specific behaviour. Languages
+are orthogonal to the scripts, and though they are related, they are
+different concepts and should not be confused with each other.</p>
+<p>Use <a class="link" href="harfbuzz-hb-common.html#hb-language-from-string" title="hb_language_from_string ()"><code class="function">hb_language_from_string()</code></a> to convert from BCP 47 language tags to
+<a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-set-language.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>language</p></td>
+<td class="parameter_description"><p>an hb_language_t to set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-language"></a><h3>hb_buffer_get_language ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="returnvalue">hb_language_t</span></a>
+hb_buffer_get_language (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-language" title="hb_buffer_set_language ()"><code class="function">hb_buffer_set_language()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-get-language.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-get-language.returns"></a><h4>Returns</h4>
+<p>The <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> of the buffer. Must not be freed by the caller. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-set-flags"></a><h3>hb_buffer_set_flags ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_set_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t"><span class="type">hb_buffer_flags_t</span></a> flags</code></em>);</pre>
+<p>Sets <em class="parameter"><code>buffer</code></em>
+ flags to <em class="parameter"><code>flags</code></em>
+. See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t"><span class="type">hb_buffer_flags_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-set-flags.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>flags</p></td>
+<td class="parameter_description"><p>the buffer flags to set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-flags"></a><h3>hb_buffer_get_flags ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t"><span class="returnvalue">hb_buffer_flags_t</span></a>
+hb_buffer_get_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-flags" title="hb_buffer_set_flags ()"><code class="function">hb_buffer_set_flags()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-get-flags.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-get-flags.returns"></a><h4>Returns</h4>
+<p>The <em class="parameter"><code>buffer</code></em>
+flags.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-set-cluster-level"></a><h3>hb_buffer_set_cluster_level ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_set_cluster_level (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-cluster-level-t" title="enum hb_buffer_cluster_level_t"><span class="type">hb_buffer_cluster_level_t</span></a> cluster_level</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-buffer-set-cluster-level.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-42.html#api-index-0.9.42">0.9.42</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-cluster-level"></a><h3>hb_buffer_get_cluster_level ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-cluster-level-t" title="enum hb_buffer_cluster_level_t"><span class="returnvalue">hb_buffer_cluster_level_t</span></a>
+hb_buffer_get_cluster_level (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-buffer-get-cluster-level.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-42.html#api-index-0.9.42">0.9.42</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-set-length"></a><h3>hb_buffer_set_length ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_buffer_set_length (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                      <em class="parameter"><code>unsigned <span class="type">int</span> length</code></em>);</pre>
+<p>Similar to <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-pre-allocate" title="hb_buffer_pre_allocate ()"><code class="function">hb_buffer_pre_allocate()</code></a>, but clears any new items added at the
+end.</p>
+<div class="refsect3">
+<a name="hb-buffer-set-length.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>length</p></td>
+<td class="parameter_description"><p>the new length of <em class="parameter"><code>buffer</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-set-length.returns"></a><h4>Returns</h4>
+<p><code class="literal">true</code> if <em class="parameter"><code>buffer</code></em>
+memory allocation succeeded, <code class="literal">false</code> otherwise.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-length"></a><h3>hb_buffer_get_length ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_buffer_get_length (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>Returns the number of items in the buffer.</p>
+<div class="refsect3">
+<a name="hb-buffer-get-length.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-get-length.returns"></a><h4>Returns</h4>
+<p>The <em class="parameter"><code>buffer</code></em>
+length.
+The value valid as long as buffer has not been modified.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-set-segment-properties"></a><h3>hb_buffer_set_segment_properties ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_set_segment_properties (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                                  <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>);</pre>
+<p>Sets the segment properties of the buffer, a shortcut for calling
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-direction" title="hb_buffer_set_direction ()"><code class="function">hb_buffer_set_direction()</code></a>, <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-script" title="hb_buffer_set_script ()"><code class="function">hb_buffer_set_script()</code></a> and
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-language" title="hb_buffer_set_language ()"><code class="function">hb_buffer_set_language()</code></a> individually.</p>
+<div class="refsect3">
+<a name="hb-buffer-set-segment-properties.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>props</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> to use.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-segment-properties"></a><h3>hb_buffer_get_segment_properties ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_get_segment_properties (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>);</pre>
+<p>Sets <em class="parameter"><code>props</code></em>
+ to the <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> of <em class="parameter"><code>buffer</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-buffer-get-segment-properties.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>props</p></td>
+<td class="parameter_description"><p> the output <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-guess-segment-properties"></a><h3>hb_buffer_guess_segment_properties ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_guess_segment_properties (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>Sets unset buffer segment properties based on buffer Unicode
+contents.  If buffer is not empty, it must have content type
+<a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-CONTENT-TYPE-UNICODE:CAPS"><code class="literal">HB_BUFFER_CONTENT_TYPE_UNICODE</code></a>.</p>
+<p>If buffer script is not set (ie. is <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-INVALID:CAPS"><code class="literal">HB_SCRIPT_INVALID</code></a>), it
+will be set to the Unicode script of the first character in
+the buffer that has a script other than <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-COMMON:CAPS"><code class="literal">HB_SCRIPT_COMMON</code></a>,
+<a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-INHERITED:CAPS"><code class="literal">HB_SCRIPT_INHERITED</code></a>, and <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-UNKNOWN:CAPS"><code class="literal">HB_SCRIPT_UNKNOWN</code></a>.</p>
+<p>Next, if buffer direction is not set (ie. is <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-INVALID:CAPS"><code class="literal">HB_DIRECTION_INVALID</code></a>),
+it will be set to the natural horizontal direction of the
+buffer script as returned by <a class="link" href="harfbuzz-hb-common.html#hb-script-get-horizontal-direction" title="hb_script_get_horizontal_direction ()"><code class="function">hb_script_get_horizontal_direction()</code></a>.
+If <a class="link" href="harfbuzz-hb-common.html#hb-script-get-horizontal-direction" title="hb_script_get_horizontal_direction ()"><code class="function">hb_script_get_horizontal_direction()</code></a> returns <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-INVALID:CAPS"><code class="literal">HB_DIRECTION_INVALID</code></a>,
+then <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-LTR:CAPS"><code class="literal">HB_DIRECTION_LTR</code></a> is used.</p>
+<p>Finally, if buffer language is not set (ie. is <a class="link" href="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS" title="HB_LANGUAGE_INVALID"><code class="literal">HB_LANGUAGE_INVALID</code></a>),
+it will be set to the process's default language as returned by
+<a class="link" href="harfbuzz-hb-common.html#hb-language-get-default" title="hb_language_get_default ()"><code class="function">hb_language_get_default()</code></a>.  This may change in the future by
+taking buffer script into consideration when choosing a language.
+Note that <a class="link" href="harfbuzz-hb-common.html#hb-language-get-default" title="hb_language_get_default ()"><code class="function">hb_language_get_default()</code></a> is NOT threadsafe the first time
+it is called.  See documentation for that function for details.</p>
+<div class="refsect3">
+<a name="hb-buffer-guess-segment-properties.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-set-unicode-funcs"></a><h3>hb_buffer_set_unicode_funcs ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_set_unicode_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *unicode_funcs</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-buffer-set-unicode-funcs.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-unicode-funcs"></a><h3>hb_buffer_get_unicode_funcs ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+hb_buffer_get_unicode_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-buffer-get-unicode-funcs.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-set-user-data"></a><h3>hb_buffer_set_user_data ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_buffer_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+                         <em class="parameter"><code><span class="type">void</span> *data</code></em>,
+                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
+                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-buffer-set-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-user-data"></a><h3>hb_buffer_get_user_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> *
+hb_buffer_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-buffer-get-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-glyph-infos"></a><h3>hb_buffer_get_glyph_infos ()</h3>
+<pre class="programlisting"><span class="returnvalue">hb_glyph_info_t</span> *
+hb_buffer_get_glyph_infos (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                           <em class="parameter"><code>unsigned <span class="type">int</span> *length</code></em>);</pre>
+<p>Returns <em class="parameter"><code>buffer</code></em>
+ glyph information array.  Returned pointer
+is valid as long as <em class="parameter"><code>buffer</code></em>
+ contents are not modified.</p>
+<div class="refsect3">
+<a name="hb-buffer-get-glyph-infos.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>length</p></td>
+<td class="parameter_description"><p> output array length. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-get-glyph-infos.returns"></a><h4>Returns</h4>
+<p>The <em class="parameter"><code>buffer</code></em>
+glyph information array.
+The value valid as long as buffer has not been modified. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=length]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-glyph-positions"></a><h3>hb_buffer_get_glyph_positions ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t"><span class="returnvalue">hb_glyph_position_t</span></a> *
+hb_buffer_get_glyph_positions (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                               <em class="parameter"><code>unsigned <span class="type">int</span> *length</code></em>);</pre>
+<p>Returns <em class="parameter"><code>buffer</code></em>
+ glyph position array.  Returned pointer
+is valid as long as <em class="parameter"><code>buffer</code></em>
+ contents are not modified.</p>
+<div class="refsect3">
+<a name="hb-buffer-get-glyph-positions.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>length</p></td>
+<td class="parameter_description"><p> output length. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-get-glyph-positions.returns"></a><h4>Returns</h4>
+<p>The <em class="parameter"><code>buffer</code></em>
+glyph position array.
+The value valid as long as buffer has not been modified. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=length]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-invisible-glyph"></a><h3>hb_buffer_get_invisible_glyph ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+hb_buffer_get_invisible_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-invisible-glyph" title="hb_buffer_set_invisible_glyph ()"><code class="function">hb_buffer_set_invisible_glyph()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-get-invisible-glyph.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-get-invisible-glyph.returns"></a><h4>Returns</h4>
+<p>The <em class="parameter"><code>buffer</code></em>
+invisible <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a>.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-set-invisible-glyph"></a><h3>hb_buffer_set_invisible_glyph ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_set_invisible_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> invisible</code></em>);</pre>
+<p>Sets the <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> that replaces invisible characters in
+the shaping result.  If set to zero (default), the glyph for the
+U+0020 SPACE character is used.  Otherwise, this value is used
+verbatim.</p>
+<div class="refsect3">
+<a name="hb-buffer-set-invisible-glyph.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>invisible</p></td>
+<td class="parameter_description"><p>the invisible <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-set-replacement-codepoint"></a><h3>hb_buffer_set_replacement_codepoint ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_set_replacement_codepoint (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> replacement</code></em>);</pre>
+<p>Sets the <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> that replaces invalid entries for a given encoding
+when adding text to <em class="parameter"><code>buffer</code></em>
+.</p>
+<p>Default is <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-REPLACEMENT-CODEPOINT-DEFAULT:CAPS" title="HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT"><code class="literal">HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-set-replacement-codepoint.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>replacement</p></td>
+<td class="parameter_description"><p>the replacement <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-31.html#api-index-0.9.31">0.9.31</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-get-replacement-codepoint"></a><h3>hb_buffer_get_replacement_codepoint ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+hb_buffer_get_replacement_codepoint (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-codepoint" title="hb_buffer_set_replacement_codepoint ()"><code class="function">hb_buffer_set_replacement_codepoint()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-get-replacement-codepoint.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-get-replacement-codepoint.returns"></a><h4>Returns</h4>
+<p>The <em class="parameter"><code>buffer</code></em>
+replacement <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a>.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-31.html#api-index-0.9.31">0.9.31</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-normalize-glyphs"></a><h3>hb_buffer_normalize_glyphs ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_normalize_glyphs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>Reorders a glyph buffer to have canonical in-cluster glyph order / position.
+The resulting clusters should behave identical to pre-reordering clusters.</p>
+<div class="note">This has nothing to do with Unicode normalization.</div>
+<div class="refsect3">
+<a name="hb-buffer-normalize-glyphs.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-reverse"></a><h3>hb_buffer_reverse ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_reverse (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>Reverses buffer contents.</p>
+<div class="refsect3">
+<a name="hb-buffer-reverse.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-reverse-range"></a><h3>hb_buffer_reverse_range ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_reverse_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                         <em class="parameter"><code>unsigned <span class="type">int</span> start</code></em>,
+                         <em class="parameter"><code>unsigned <span class="type">int</span> end</code></em>);</pre>
+<p>Reverses buffer contents between start to end.</p>
+<div class="refsect3">
+<a name="hb-buffer-reverse-range.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start</p></td>
+<td class="parameter_description"><p>start index.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>end</p></td>
+<td class="parameter_description"><p>end index.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-41.html#api-index-0.9.41">0.9.41</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-reverse-clusters"></a><h3>hb_buffer_reverse_clusters ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_reverse_clusters (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>Reverses buffer clusters.  That is, the buffer contents are
+reversed, then each cluster (consecutive items having the
+same cluster number) are reversed again.</p>
+<div class="refsect3">
+<a name="hb-buffer-reverse-clusters.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-serialize-glyphs"></a><h3>hb_buffer_serialize_glyphs ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_buffer_serialize_glyphs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                            <em class="parameter"><code>unsigned <span class="type">int</span> start</code></em>,
+                            <em class="parameter"><code>unsigned <span class="type">int</span> end</code></em>,
+                            <em class="parameter"><code><span class="type">char</span> *buf</code></em>,
+                            <em class="parameter"><code>unsigned <span class="type">int</span> buf_size</code></em>,
+                            <em class="parameter"><code>unsigned <span class="type">int</span> *buf_consumed</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> format</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t"><span class="type">hb_buffer_serialize_flags_t</span></a> flags</code></em>);</pre>
+<p>Serializes <em class="parameter"><code>buffer</code></em>
+ into a textual representation of its glyph content,
+useful for showing the contents of the buffer, for example during debugging.
+There are currently two supported serialization formats:</p>
+<div class="refsect3">
+<a name="id-1.3.4.3.11.48.5"></a><h4>text</h4>
+<p>A human-readable, plain text format.
+The serialized glyphs will look something like:</p>
+<p><code class="literal">
+[uni0651=0@518,0+0|uni0628=0+1897]
+</code></p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem"><p>The serialized glyphs are delimited with <code class="literal">[</code> and <code class="literal">]</code>.</p></li>
+<li class="listitem"><p>Glyphs are separated with <code class="literal">|</code></p></li>
+<li class="listitem">
+<p>Each glyph starts with glyph name, or glyph index if
+<a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-GLYPH-NAMES:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES</span></a> flag is set. Then,</p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; ">
+<li class="listitem"><p>If <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-CLUSTERS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS</span></a> is not set, <code class="literal">=</code> then <span class="type">hb_glyph_info_t.cluster</span>.</p></li>
+<li class="listitem">
+<p>If <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-POSITIONS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS</span></a> is not set, the <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t"><span class="type">hb_glyph_position_t</span></a> in the format:</p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: square; ">
+<li class="listitem"><p>If both <span class="type">hb_glyph_position_t.x_offset</span> and <span class="type">hb_glyph_position_t.y_offset</span> are not 0, <code class="literal">@x_offset,y_offset</code>. Then,</p></li>
+<li class="listitem"><p><code class="literal">+x_advance</code>, then <code class="literal">,y_advance</code> if <span class="type">hb_glyph_position_t.y_advance</span> is not 0. Then,</p></li>
+</ul></div>
+</li>
+<li class="listitem"><p>If <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-GLYPH-EXTENTS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS</span></a> is set, the
+<span class="type">hb_glyph_extents_t</span> in the format
+<code class="literal">&lt;x_bearing,y_bearing,width,height&gt;</code></p></li>
+</ul></div>
+</li>
+</ul></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.4.3.11.48.6"></a><h4>json</h4>
+<p>TODO.</p>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-serialize-glyphs.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> buffer.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start</p></td>
+<td class="parameter_description"><p>the first item in <em class="parameter"><code>buffer</code></em>
+to serialize.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>end</p></td>
+<td class="parameter_description"><p>the last item in <em class="parameter"><code>buffer</code></em>
+to serialize.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buf</p></td>
+<td class="parameter_description"><p> output string to
+write serialized buffer into. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=buf_size][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buf_size</p></td>
+<td class="parameter_description"><p>the size of <em class="parameter"><code>buf</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buf_consumed</p></td>
+<td class="parameter_description"><p> if not <code class="literal">NULL</code>, will be set to the number of byes written into <em class="parameter"><code>buf</code></em>
+. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p> the <a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> used to shape this buffer, needed to
+read glyph names and extents. If <code class="literal">NULL</code>, and empty font will be used. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> to use for formatting the output.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>flags</p></td>
+<td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t"><span class="type">hb_buffer_serialize_flags_t</span></a> that control what glyph properties
+to serialize.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-serialize-glyphs.returns"></a><h4>Returns</h4>
+<p>The number of serialized items.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-deserialize-glyphs"></a><h3>hb_buffer_deserialize_glyphs ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_buffer_deserialize_glyphs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                              <em class="parameter"><code>const <span class="type">char</span> *buf</code></em>,
+                              <em class="parameter"><code><span class="type">int</span> buf_len</code></em>,
+                              <em class="parameter"><code>const <span class="type">char</span> **end_ptr</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> format</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-buffer-deserialize-glyphs.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> buffer.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buf</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=buf_len]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>end_ptr</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-serialize-format-from-string"></a><h3>hb_buffer_serialize_format_from_string ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="returnvalue">hb_buffer_serialize_format_t</span></a>
+hb_buffer_serialize_format_from_string
+                               (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
+                                <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
+<p>Parses a string into an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a>. Does not check if
+<em class="parameter"><code>str</code></em>
+ is a valid buffer serialization format, use
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-list-formats" title="hb_buffer_serialize_list_formats ()"><code class="function">hb_buffer_serialize_list_formats()</code></a> to get the list of supported formats.</p>
+<div class="refsect3">
+<a name="hb-buffer-serialize-format-from-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>str</p></td>
+<td class="parameter_description"><p> a string to parse. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>len</p></td>
+<td class="parameter_description"><p>length of <em class="parameter"><code>str</code></em>
+, or -1 if string is <code class="literal">NULL</code> terminated</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-serialize-format-from-string.returns"></a><h4>Returns</h4>
+<p>The parsed <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a>.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-serialize-format-to-string"></a><h3>hb_buffer_serialize_format_to_string ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *
+hb_buffer_serialize_format_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> format</code></em>);</pre>
+<p>Converts <em class="parameter"><code>format</code></em>
+ to the string corresponding it, or <code class="literal">NULL</code> if it is not a valid
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-serialize-format-to-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> to convert.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-serialize-format-to-string.returns"></a><h4>Returns</h4>
+<p>A <code class="literal">NULL</code> terminated string corresponding to <em class="parameter"><code>format</code></em>
+. Should not be freed. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-serialize-list-formats"></a><h3>hb_buffer_serialize_list_formats ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> **
+hb_buffer_serialize_list_formats (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Returns a list of supported buffer serialization formats.</p>
+<div class="refsect3">
+<a name="hb-buffer-serialize-list-formats.returns"></a><h4>Returns</h4>
+<p>A string array of buffer serialization formats. Should not be freed. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-segment-properties-equal"></a><h3>hb_segment_properties_equal ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_segment_properties_equal (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *a</code></em>,
+                             <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *b</code></em>);</pre>
+<p>Checks the equality of two <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a>'s.</p>
+<div class="refsect3">
+<a name="hb-segment-properties-equal.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>a</p></td>
+<td class="parameter_description"><p>first <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> to compare.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>b</p></td>
+<td class="parameter_description"><p>second <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> to compare.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-segment-properties-equal.returns"></a><h4>Returns</h4>
+<p><code class="literal">true</code> if all properties of <em class="parameter"><code>a</code></em>
+equal those of <em class="parameter"><code>b</code></em>
+, false otherwise.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-segment-properties-hash"></a><h3>hb_segment_properties_hash ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *p</code></em>);</pre>
+<p>Creates a hash representing <em class="parameter"><code>p</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-segment-properties-hash.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>p</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> to hash.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-segment-properties-hash.returns"></a><h4>Returns</h4>
+<p>A hash of <em class="parameter"><code>p</code></em>
+.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-diff"></a><h3>hb_buffer_diff ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-diff-flags-t" title="enum hb_buffer_diff_flags_t"><span class="returnvalue">hb_buffer_diff_flags_t</span></a>
+hb_buffer_diff (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *reference</code></em>,
+                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> dottedcircle_glyph</code></em>,
+                <em class="parameter"><code>unsigned <span class="type">int</span> position_fuzz</code></em>);</pre>
+<p>If dottedcircle_glyph is (hb_codepoint_t) -1 then <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-DOTTED-CIRCLE-PRESENT:CAPS"><code class="literal">HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT</code></a>
+and <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-NOTDEF-PRESENT:CAPS"><code class="literal">HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT</code></a> are never returned.  This should be used by most
+callers if just comparing two buffers is needed.</p>
+<div class="refsect3">
+<a name="hb-buffer-diff.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>a buffer.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>reference</p></td>
+<td class="parameter_description"><p>other buffer to compare to.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>dottedcircle_glyph</p></td>
+<td class="parameter_description"><p>glyph id of U+25CC DOTTED CIRCLE, or (hb_codepont_t) -1.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>position_fuzz</p></td>
+<td class="parameter_description"><p>allowed absolute difference in position values.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-5-0.html#api-index-1.5.0">1.5.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-set-message-func"></a><h3>hb_buffer_set_message_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_set_message_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-message-func-t" title="hb_buffer_message_func_t ()"><span class="type">hb_buffer_message_func_t</span></a> func</code></em>,
+                            <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-buffer-set-message-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-1-3.html#api-index-1.1.3">1.1.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-glyph-info-get-glyph-flags"></a><h3>hb_glyph_info_get_glyph_flags ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t"><span class="returnvalue">hb_glyph_flags_t</span></a>
+hb_glyph_info_get_glyph_flags (<em class="parameter"><code>const <span class="type">hb_glyph_info_t</span> *info</code></em>);</pre>
+<p>Returns glyph flags encoded within a <span class="type">hb_glyph_info_t</span>.</p>
+<div class="refsect3">
+<a name="hb-glyph-info-get-glyph-flags.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <span class="type">hb_glyph_info_t</span>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-glyph-info-get-glyph-flags.returns"></a><h4>Returns</h4>
+<p>The <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t"><span class="type">hb_glyph_flags_t</span></a> encoded within <em class="parameter"><code>info</code></em>
+.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-5-0.html#api-index-1.5.0">1.5.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-message-func-t"></a><h3>hb_buffer_message_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+<span class="c_punctuation">(</span>*hb_buffer_message_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                             <em class="parameter"><code>const <span class="type">char</span> *message</code></em>,
+                             <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-buffer.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="HB-SEGMENT-PROPERTIES-DEFAULT:CAPS"></a><h3>HB_SEGMENT_PROPERTIES_DEFAULT</h3>
+<pre class="programlisting">#define             HB_SEGMENT_PROPERTIES_DEFAULT</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-BUFFER-REPLACEMENT-CODEPOINT-DEFAULT:CAPS"></a><h3>HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT</h3>
+<pre class="programlisting">#define HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT 0xFFFDu
+</pre>
+<p>The default code point for replacing invalid characters in a given encoding.
+Set to U+FFFD REPLACEMENT CHARACTER.</p>
+<p class="since">Since: <a class="link" href="api-index-0-9-31.html#api-index-0.9.31">0.9.31</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-t"></a><h3>hb_buffer_t</h3>
+<pre class="programlisting">typedef struct hb_buffer_t hb_buffer_t;
+</pre>
+<p>The main structure holding the input text and its properties before shaping,
+and output glyphs and their information after shaping.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-glyph-flags-t"></a><h3>enum hb_glyph_flags_t</h3>
+<div class="refsect3">
+<a name="hb-glyph-flags-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-GLYPH-FLAG-UNSAFE-TO-BREAK:CAPS"></a>HB_GLYPH_FLAG_UNSAFE_TO_BREAK</p></td>
+<td class="enum_member_description">
+<p>Indicates that if input text is broken at the
+				   beginning of the cluster this glyph is part of,
+				   then both sides need to be re-shaped, as the
+				   result might be different.  On the flip side,
+				   it means that when this flag is not present,
+				   then it's safe to break the glyph-run at the
+				   beginning of this cluster, and the two sides
+				   represent the exact same result one would get
+				   if breaking input text at the beginning of
+				   this cluster and shaping the two sides
+				   separately.  This can be used to optimize
+				   paragraph layout, by avoiding re-shaping
+				   of each line after line-breaking, or limiting
+				   the reshaping to a small piece around the
+				   breaking point only.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-GLYPH-FLAG-DEFINED:CAPS"></a>HB_GLYPH_FLAG_DEFINED</p></td>
+<td class="enum_member_description">
+<p>All the currently defined flags.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-5-0.html#api-index-1.5.0">1.5.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-glyph-position-t-struct"></a><h3>hb_glyph_position_t</h3>
+<pre class="programlisting">typedef struct {
+  hb_position_t  x_advance;
+  hb_position_t  y_advance;
+  hb_position_t  x_offset;
+  hb_position_t  y_offset;
+} hb_glyph_position_t;
+</pre>
+<p>The <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t"><span class="type">hb_glyph_position_t</span></a> is the structure that holds the positions of the
+glyph in both horizontal and vertical directions. All positions in
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t"><span class="type">hb_glyph_position_t</span></a> are relative to the current point.</p>
+<div class="refsect3">
+<a name="hb-glyph-position-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> <em class="structfield"><code><a name="hb-glyph-position-t-struct.x-advance"></a>x_advance</code></em>;</p></td>
+<td class="struct_member_description"><p>how much the line advances after drawing this glyph when setting
+text in horizontal direction.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> <em class="structfield"><code><a name="hb-glyph-position-t-struct.y-advance"></a>y_advance</code></em>;</p></td>
+<td class="struct_member_description"><p>how much the line advances after drawing this glyph when setting
+text in vertical direction.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> <em class="structfield"><code><a name="hb-glyph-position-t-struct.x-offset"></a>x_offset</code></em>;</p></td>
+<td class="struct_member_description"><p>how much the glyph moves on the X-axis before drawing it, this
+should not affect how much the line advances.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> <em class="structfield"><code><a name="hb-glyph-position-t-struct.y-offset"></a>y_offset</code></em>;</p></td>
+<td class="struct_member_description"><p>how much the glyph moves on the Y-axis before drawing it, this
+should not affect how much the line advances.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-content-type-t"></a><h3>enum hb_buffer_content_type_t</h3>
+<div class="refsect3">
+<a name="hb-buffer-content-type-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-CONTENT-TYPE-INVALID:CAPS"></a>HB_BUFFER_CONTENT_TYPE_INVALID</p></td>
+<td class="enum_member_description">
+<p>Initial value for new buffer.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-CONTENT-TYPE-UNICODE:CAPS"></a>HB_BUFFER_CONTENT_TYPE_UNICODE</p></td>
+<td class="enum_member_description">
+<p>The buffer contains input characters (before shaping).</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-CONTENT-TYPE-GLYPHS:CAPS"></a>HB_BUFFER_CONTENT_TYPE_GLYPHS</p></td>
+<td class="enum_member_description">
+<p>The buffer contains output glyphs (after shaping).</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-flags-t"></a><h3>enum hb_buffer_flags_t</h3>
+<div class="refsect3">
+<a name="hb-buffer-flags-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-FLAG-DEFAULT:CAPS"></a>HB_BUFFER_FLAG_DEFAULT</p></td>
+<td class="enum_member_description">
+<p>the default buffer flag.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-FLAG-BOT:CAPS"></a>HB_BUFFER_FLAG_BOT</p></td>
+<td class="enum_member_description">
+<p>flag indicating that special handling of the beginning
+                     of text paragraph can be applied to this buffer. Should usually
+                     be set, unless you are passing to the buffer only part
+                     of the text without the full context.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-FLAG-EOT:CAPS"></a>HB_BUFFER_FLAG_EOT</p></td>
+<td class="enum_member_description">
+<p>flag indicating that special handling of the end of text
+                     paragraph can be applied to this buffer, similar to
+                     <em class="parameter"><code>HB_BUFFER_FLAG_BOT</code></em>
+.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-FLAG-PRESERVE-DEFAULT-IGNORABLES:CAPS"></a>HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES</p></td>
+<td class="enum_member_description">
+<p>                     flag indication that character with Default_Ignorable
+                     Unicode property should use the corresponding glyph
+                     from the font, instead of hiding them (done by
+                     replacing them with the space glyph and zeroing the
+                     advance width.)  This flag takes precedence over
+                     <em class="parameter"><code>HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES</code></em>
+.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-FLAG-REMOVE-DEFAULT-IGNORABLES:CAPS"></a>HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES</p></td>
+<td class="enum_member_description">
+<p>                     flag indication that character with Default_Ignorable
+                     Unicode property should be removed from glyph string
+                     instead of hiding them (done by replacing them with the
+                     space glyph and zeroing the advance width.)
+                     <em class="parameter"><code>HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES</code></em>
+ takes
+                     precedence over this flag. Since: 1.8.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-20.html#api-index-0.9.20">0.9.20</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-cluster-level-t"></a><h3>enum hb_buffer_cluster_level_t</h3>
+<div class="refsect3">
+<a name="hb-buffer-cluster-level-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-CLUSTER-LEVEL-MONOTONE-GRAPHEMES:CAPS"></a>HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES</p></td>
+<td class="enum_member_description">
+<p>Return cluster values grouped by graphemes into
+  monotone order.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-CLUSTER-LEVEL-MONOTONE-CHARACTERS:CAPS"></a>HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS</p></td>
+<td class="enum_member_description">
+<p>Return cluster values grouped into monotone order.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-CLUSTER-LEVEL-CHARACTERS:CAPS"></a>HB_BUFFER_CLUSTER_LEVEL_CHARACTERS</p></td>
+<td class="enum_member_description">
+<p>Don't group cluster values.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-CLUSTER-LEVEL-DEFAULT:CAPS"></a>HB_BUFFER_CLUSTER_LEVEL_DEFAULT</p></td>
+<td class="enum_member_description">
+<p>Default cluster level,
+  equal to <em class="parameter"><code>HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES</code></em>
+.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-42.html#api-index-0.9.42">0.9.42</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-segment-properties-t-struct"></a><h3>hb_segment_properties_t</h3>
+<pre class="programlisting">typedef struct {
+  hb_direction_t  direction;
+  hb_script_t     script;
+  hb_language_t   language;
+} hb_segment_properties_t;
+</pre>
+<p>The structure that holds various text properties of an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>. Can be
+set and retrieved using <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-segment-properties" title="hb_buffer_set_segment_properties ()"><code class="function">hb_buffer_set_segment_properties()</code></a> and
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-segment-properties" title="hb_buffer_get_segment_properties ()"><code class="function">hb_buffer_get_segment_properties()</code></a>, respectively.</p>
+<div class="refsect3">
+<a name="hb-segment-properties-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> <em class="structfield"><code><a name="hb-segment-properties-t-struct.direction"></a>direction</code></em>;</p></td>
+<td class="struct_member_description"><p>the <a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> of the buffer, see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-direction" title="hb_buffer_set_direction ()"><code class="function">hb_buffer_set_direction()</code></a>.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> <em class="structfield"><code><a name="hb-segment-properties-t-struct.script"></a>script</code></em>;</p></td>
+<td class="struct_member_description"><p>the <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> of the buffer, see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-script" title="hb_buffer_set_script ()"><code class="function">hb_buffer_set_script()</code></a>.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> <em class="structfield"><code><a name="hb-segment-properties-t-struct.language"></a>language</code></em>;</p></td>
+<td class="struct_member_description"><p>the <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> of the buffer, see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-language" title="hb_buffer_set_language ()"><code class="function">hb_buffer_set_language()</code></a>.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-serialize-format-t"></a><h3>enum hb_buffer_serialize_format_t</h3>
+<p>The buffer serialization and de-serialization format used in
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-glyphs" title="hb_buffer_serialize_glyphs ()"><code class="function">hb_buffer_serialize_glyphs()</code></a> and <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-deserialize-glyphs" title="hb_buffer_deserialize_glyphs ()"><code class="function">hb_buffer_deserialize_glyphs()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-serialize-format-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-SERIALIZE-FORMAT-TEXT:CAPS"></a>HB_BUFFER_SERIALIZE_FORMAT_TEXT</p></td>
+<td class="enum_member_description">
+<p>a human-readable, plain text format.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-SERIALIZE-FORMAT-JSON:CAPS"></a>HB_BUFFER_SERIALIZE_FORMAT_JSON</p></td>
+<td class="enum_member_description">
+<p>a machine-readable JSON format.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-SERIALIZE-FORMAT-INVALID:CAPS"></a>HB_BUFFER_SERIALIZE_FORMAT_INVALID</p></td>
+<td class="enum_member_description">
+<p>invalid format.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-serialize-flags-t"></a><h3>enum hb_buffer_serialize_flags_t</h3>
+<p>Flags that control what glyph information are serialized in <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-glyphs" title="hb_buffer_serialize_glyphs ()"><code class="function">hb_buffer_serialize_glyphs()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-serialize-flags-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-SERIALIZE-FLAG-DEFAULT:CAPS"></a>HB_BUFFER_SERIALIZE_FLAG_DEFAULT</p></td>
+<td class="enum_member_description">
+<p>serialize glyph names, clusters and positions.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-SERIALIZE-FLAG-NO-CLUSTERS:CAPS"></a>HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS</p></td>
+<td class="enum_member_description">
+<p>do not serialize glyph cluster.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-SERIALIZE-FLAG-NO-POSITIONS:CAPS"></a>HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS</p></td>
+<td class="enum_member_description">
+<p>do not serialize glyph position information.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-SERIALIZE-FLAG-NO-GLYPH-NAMES:CAPS"></a>HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES</p></td>
+<td class="enum_member_description">
+<p>do no serialize glyph name.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-SERIALIZE-FLAG-GLYPH-EXTENTS:CAPS"></a>HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS</p></td>
+<td class="enum_member_description">
+<p>serialize glyph extents.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-SERIALIZE-FLAG-GLYPH-FLAGS:CAPS"></a>HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS</p></td>
+<td class="enum_member_description">
+<p>serialize glyph flags. Since: 1.5.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-SERIALIZE-FLAG-NO-ADVANCES:CAPS"></a>HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES</p></td>
+<td class="enum_member_description">
+<p>do not serialize glyph advances,
+ glyph offsets will reflect absolute glyph positions. Since: 1.8.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-20.html#api-index-0.9.20">0.9.20</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-diff-flags-t"></a><h3>enum hb_buffer_diff_flags_t</h3>
+<div class="refsect3">
+<a name="hb-buffer-diff-flags-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-EQUAL:CAPS"></a>HB_BUFFER_DIFF_FLAG_EQUAL</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-CONTENT-TYPE-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-LENGTH-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-NOTDEF-PRESENT:CAPS"></a>HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-DOTTED-CIRCLE-PRESENT:CAPS"></a>HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-CODEPOINT-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-CLUSTER-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-GLYPH-FLAGS-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-POSITION-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-common.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-common.html
new file mode 100644
index 0000000..7401836
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-common.html
@@ -0,0 +1,1504 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-common: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch09.html" title="Core API">
+<link rel="prev" href="harfbuzz-hb-buffer.html" title="hb-buffer">
+<link rel="next" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-common.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-common.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch09.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-buffer.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-deprecated.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-common"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-common.top_of_page"></a>hb-common</span></h2>
+<p>hb-common — Common data types</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-common.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="returnvalue">hb_tag_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#hb-tag-from-string" title="hb_tag_from_string ()">hb_tag_from_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#hb-tag-to-string" title="hb_tag_to_string ()">hb_tag_to_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="returnvalue">hb_direction_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#hb-direction-from-string" title="hb_direction_from_string ()">hb_direction_from_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <span class="returnvalue">char</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#hb-direction-to-string" title="hb_direction_to_string ()">hb_direction_to_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#hb-script-from-iso15924-tag" title="hb_script_from_iso15924_tag ()">hb_script_from_iso15924_tag</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#hb-script-from-string" title="hb_script_from_string ()">hb_script_from_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="returnvalue">hb_tag_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#hb-script-to-iso15924-tag" title="hb_script_to_iso15924_tag ()">hb_script_to_iso15924_tag</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="returnvalue">hb_direction_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#hb-script-get-horizontal-direction" title="hb_script_get_horizontal_direction ()">hb_script_get_horizontal_direction</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="returnvalue">hb_language_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#hb-language-from-string" title="hb_language_from_string ()">hb_language_from_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <span class="returnvalue">char</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#hb-language-to-string" title="hb_language_to_string ()">hb_language_to_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="returnvalue">hb_language_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#hb-language-get-default" title="hb_language_get_default ()">hb_language_get_default</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()">*hb_destroy_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#HB-TAG:CAPS" title="HB_TAG()">HB_TAG</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#HB-UNTAG:CAPS" title="HB_UNTAG()">HB_UNTAG</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-REVERSE:CAPS" title="HB_DIRECTION_REVERSE()">HB_DIRECTION_REVERSE</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-BACKWARD:CAPS" title="HB_DIRECTION_IS_BACKWARD()">HB_DIRECTION_IS_BACKWARD</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-FORWARD:CAPS" title="HB_DIRECTION_IS_FORWARD()">HB_DIRECTION_IS_FORWARD</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-HORIZONTAL:CAPS" title="HB_DIRECTION_IS_HORIZONTAL()">HB_DIRECTION_IS_HORIZONTAL</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-VALID:CAPS" title="HB_DIRECTION_IS_VALID()">HB_DIRECTION_IS_VALID</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-VERTICAL:CAPS" title="HB_DIRECTION_IS_VERTICAL()">HB_DIRECTION_IS_VERTICAL</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="hb-user-data-key-t"></a><div class="refsect1">
+<a name="harfbuzz-hb-common.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t">hb_bool_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t">hb_codepoint_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t">hb_direction_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t">hb_language_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-mask-t" title="hb_mask_t">hb_mask_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t">hb_position_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t">hb_tag_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t">hb_script_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t-struct" title="hb_user_data_key_t">hb_user_data_key_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-var-int-t" title="hb_var_int_t">hb_var_int_t</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#HB-TAG-NONE:CAPS" title="HB_TAG_NONE">HB_TAG_NONE</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#HB-TAG-MAX:CAPS" title="HB_TAG_MAX">HB_TAG_MAX</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#HB-TAG-MAX-SIGNED:CAPS" title="HB_TAG_MAX_SIGNED">HB_TAG_MAX_SIGNED</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS" title="HB_LANGUAGE_INVALID">HB_LANGUAGE_INVALID</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-common.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
+    <span class="lineart">╰──</span> hb_user_data_key_t
+    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
+    <span class="lineart">├──</span> hb_direction_t
+    <span class="lineart">╰──</span> hb_script_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-common.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-common.description"></a><h2>Description</h2>
+<p>Common data types used across HarfBuzz are defined here.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-common.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-tag-from-string"></a><h3>hb_tag_from_string ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="returnvalue">hb_tag_t</span></a>
+hb_tag_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
+                    <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-tag-from-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>str</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-tag-to-string"></a><h3>hb_tag_to_string ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_tag_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>,
+                  <em class="parameter"><code><span class="type">char</span> *buf</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-tag-to-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buf</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Out parameter, where caller must allocate storage."><span class="acronym">out caller-allocates</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> fixed-size=4][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-5.html#api-index-0.9.5">0.9.5</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-direction-from-string"></a><h3>hb_direction_from_string ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="returnvalue">hb_direction_t</span></a>
+hb_direction_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
+                          <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-direction-from-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>str</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-direction-to-string"></a><h3>hb_direction_to_string ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *
+hb_direction_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-direction-to-string.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-script-from-iso15924-tag"></a><h3>hb_script_from_iso15924_tag ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+hb_script_from_iso15924_tag (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>);</pre>
+<p>Converts an ISO 15924 script tag to a corresponding <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-script-from-iso15924-tag.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>tag</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> representing an ISO 15924 tag.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-script-from-iso15924-tag.returns"></a><h4>Returns</h4>
+<p>An <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> corresponding to the ISO 15924 tag.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-script-from-string"></a><h3>hb_script_from_string ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+hb_script_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
+                       <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
+<p>Converts a string <em class="parameter"><code>str</code></em>
+ representing an ISO 15924 script tag to a
+corresponding <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a>. Shorthand for <a class="link" href="harfbuzz-hb-common.html#hb-tag-from-string" title="hb_tag_from_string ()"><code class="function">hb_tag_from_string()</code></a> then
+<a class="link" href="harfbuzz-hb-common.html#hb-script-from-iso15924-tag" title="hb_script_from_iso15924_tag ()"><code class="function">hb_script_from_iso15924_tag()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-script-from-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>str</p></td>
+<td class="parameter_description"><p> a string representing an
+ISO 15924 tag. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>len</p></td>
+<td class="parameter_description"><p>length of the <em class="parameter"><code>str</code></em>
+, or -1 if it is <code class="literal">NULL</code>-terminated.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-script-from-string.returns"></a><h4>Returns</h4>
+<p>An <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> corresponding to the ISO 15924 tag.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-script-to-iso15924-tag"></a><h3>hb_script_to_iso15924_tag ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="returnvalue">hb_tag_t</span></a>
+hb_script_to_iso15924_tag (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>);</pre>
+<p>See <a class="link" href="harfbuzz-hb-common.html#hb-script-from-iso15924-tag" title="hb_script_from_iso15924_tag ()"><code class="function">hb_script_from_iso15924_tag()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-script-to-iso15924-tag.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>script</p></td>
+<td class="parameter_description"><p>an <span class="type">hb_script_</span> to convert.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-script-to-iso15924-tag.returns"></a><h4>Returns</h4>
+<p>An <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> representing an ISO 15924 script tag.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-script-get-horizontal-direction"></a><h3>hb_script_get_horizontal_direction ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="returnvalue">hb_direction_t</span></a>
+hb_script_get_horizontal_direction (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-language-from-string"></a><h3>hb_language_from_string ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="returnvalue">hb_language_t</span></a>
+hb_language_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
+                         <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
+<p>Converts <em class="parameter"><code>str</code></em>
+ representing a BCP 47 language tag to the corresponding
+<a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-language-from-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>str</p></td>
+<td class="parameter_description"><p> a string representing
+a BCP 47 language tag. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>len</p></td>
+<td class="parameter_description"><p>length of the <em class="parameter"><code>str</code></em>
+, or -1 if it is <code class="literal">NULL</code>-terminated.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-language-from-string.returns"></a><h4>Returns</h4>
+<p>The <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> corresponding to the BCP 47 language tag. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-language-to-string"></a><h3>hb_language_to_string ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *
+hb_language_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> language</code></em>);</pre>
+<p>See <a class="link" href="harfbuzz-hb-common.html#hb-language-from-string" title="hb_language_from_string ()"><code class="function">hb_language_from_string()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-language-to-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>language</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> to convert.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-language-to-string.returns"></a><h4>Returns</h4>
+<p>A <code class="literal">NULL</code>-terminated string representing the <em class="parameter"><code>language</code></em>
+. Must not be freed by
+the caller. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-language-get-default"></a><h3>hb_language_get_default ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="returnvalue">hb_language_t</span></a>
+hb_language_get_default (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Get default language from current locale.</p>
+<p>Note that the first time this function is called, it calls
+"setlocale (LC_CTYPE, nullptr)" to fetch current locale.  The underlying
+setlocale function is, in many implementations, NOT threadsafe.  To avoid
+problems, call this function once before multiple threads can call it.
+This function is only used from <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-guess-segment-properties" title="hb_buffer_guess_segment_properties ()"><code class="function">hb_buffer_guess_segment_properties()</code></a> by
+HarfBuzz itself.</p>
+<div class="refsect3">
+<a name="hb-language-get-default.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-destroy-func-t"></a><h3>hb_destroy_func_t ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+<span class="c_punctuation">(</span>*hb_destroy_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-TAG:CAPS"></a><h3>HB_TAG()</h3>
+<pre class="programlisting">#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&amp;0xFF)&lt;&lt;24)|(((uint32_t)(c2)&amp;0xFF)&lt;&lt;16)|(((uint32_t)(c3)&amp;0xFF)&lt;&lt;8)|((uint32_t)(c4)&amp;0xFF)))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-UNTAG:CAPS"></a><h3>HB_UNTAG()</h3>
+<pre class="programlisting">#define HB_UNTAG(tag)   (uint8_t)(((tag)&gt;&gt;24)&amp;0xFF), (uint8_t)(((tag)&gt;&gt;16)&amp;0xFF), (uint8_t)(((tag)&gt;&gt;8)&amp;0xFF), (uint8_t)((tag)&amp;0xFF)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-DIRECTION-REVERSE:CAPS"></a><h3>HB_DIRECTION_REVERSE()</h3>
+<pre class="programlisting">#define HB_DIRECTION_REVERSE(dir) ((hb_direction_t) (((unsigned int) (dir)) ^ 1))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-DIRECTION-IS-BACKWARD:CAPS"></a><h3>HB_DIRECTION_IS_BACKWARD()</h3>
+<pre class="programlisting">#define HB_DIRECTION_IS_BACKWARD(dir) ((((unsigned int) (dir)) &amp; ~2U) == 5)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-DIRECTION-IS-FORWARD:CAPS"></a><h3>HB_DIRECTION_IS_FORWARD()</h3>
+<pre class="programlisting">#define HB_DIRECTION_IS_FORWARD(dir) ((((unsigned int) (dir)) &amp; ~2U) == 4)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-DIRECTION-IS-HORIZONTAL:CAPS"></a><h3>HB_DIRECTION_IS_HORIZONTAL()</h3>
+<pre class="programlisting">#define HB_DIRECTION_IS_HORIZONTAL(dir) ((((unsigned int) (dir)) &amp; ~1U) == 4)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-DIRECTION-IS-VALID:CAPS"></a><h3>HB_DIRECTION_IS_VALID()</h3>
+<pre class="programlisting">#define HB_DIRECTION_IS_VALID(dir) ((((unsigned int) (dir)) &amp; ~3U) == 4)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-DIRECTION-IS-VERTICAL:CAPS"></a><h3>HB_DIRECTION_IS_VERTICAL()</h3>
+<pre class="programlisting">#define HB_DIRECTION_IS_VERTICAL(dir) ((((unsigned int) (dir)) &amp; ~1U) == 6)
+</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-common.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="hb-bool-t"></a><h3>hb_bool_t</h3>
+<pre class="programlisting">typedef int hb_bool_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-codepoint-t"></a><h3>hb_codepoint_t</h3>
+<pre class="programlisting">typedef uint32_t hb_codepoint_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-direction-t"></a><h3>enum hb_direction_t</h3>
+<div class="refsect3">
+<a name="hb-direction-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-DIRECTION-INVALID:CAPS"></a>HB_DIRECTION_INVALID</p></td>
+<td class="enum_member_description">
+<p>Initial, unset direction.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-DIRECTION-LTR:CAPS"></a>HB_DIRECTION_LTR</p></td>
+<td class="enum_member_description">
+<p>Text is set horizontally from left to right.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-DIRECTION-RTL:CAPS"></a>HB_DIRECTION_RTL</p></td>
+<td class="enum_member_description">
+<p>Text is set horizontally from right to left.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-DIRECTION-TTB:CAPS"></a>HB_DIRECTION_TTB</p></td>
+<td class="enum_member_description">
+<p>Text is set vertically from top to bottom.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-DIRECTION-BTT:CAPS"></a>HB_DIRECTION_BTT</p></td>
+<td class="enum_member_description">
+<p>Text is set vertically from bottom to top.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-language-t"></a><h3>hb_language_t</h3>
+<pre class="programlisting">typedef const struct hb_language_impl_t *hb_language_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-mask-t"></a><h3>hb_mask_t</h3>
+<pre class="programlisting">typedef uint32_t hb_mask_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-position-t"></a><h3>hb_position_t</h3>
+<pre class="programlisting">typedef int32_t hb_position_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-tag-t"></a><h3>hb_tag_t</h3>
+<pre class="programlisting">typedef uint32_t hb_tag_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-script-t"></a><h3>enum hb_script_t</h3>
+<div class="refsect3">
+<a name="hb-script-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-COMMON:CAPS"></a>HB_SCRIPT_COMMON</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-INHERITED:CAPS"></a>HB_SCRIPT_INHERITED</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-UNKNOWN:CAPS"></a>HB_SCRIPT_UNKNOWN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ARABIC:CAPS"></a>HB_SCRIPT_ARABIC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ARMENIAN:CAPS"></a>HB_SCRIPT_ARMENIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BENGALI:CAPS"></a>HB_SCRIPT_BENGALI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CYRILLIC:CAPS"></a>HB_SCRIPT_CYRILLIC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-DEVANAGARI:CAPS"></a>HB_SCRIPT_DEVANAGARI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GEORGIAN:CAPS"></a>HB_SCRIPT_GEORGIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GREEK:CAPS"></a>HB_SCRIPT_GREEK</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GUJARATI:CAPS"></a>HB_SCRIPT_GUJARATI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GURMUKHI:CAPS"></a>HB_SCRIPT_GURMUKHI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-HANGUL:CAPS"></a>HB_SCRIPT_HANGUL</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-HAN:CAPS"></a>HB_SCRIPT_HAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-HEBREW:CAPS"></a>HB_SCRIPT_HEBREW</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-HIRAGANA:CAPS"></a>HB_SCRIPT_HIRAGANA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KANNADA:CAPS"></a>HB_SCRIPT_KANNADA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KATAKANA:CAPS"></a>HB_SCRIPT_KATAKANA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LAO:CAPS"></a>HB_SCRIPT_LAO</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LATIN:CAPS"></a>HB_SCRIPT_LATIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MALAYALAM:CAPS"></a>HB_SCRIPT_MALAYALAM</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ORIYA:CAPS"></a>HB_SCRIPT_ORIYA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TAMIL:CAPS"></a>HB_SCRIPT_TAMIL</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TELUGU:CAPS"></a>HB_SCRIPT_TELUGU</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-THAI:CAPS"></a>HB_SCRIPT_THAI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TIBETAN:CAPS"></a>HB_SCRIPT_TIBETAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BOPOMOFO:CAPS"></a>HB_SCRIPT_BOPOMOFO</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BRAILLE:CAPS"></a>HB_SCRIPT_BRAILLE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CANADIAN-SYLLABICS:CAPS"></a>HB_SCRIPT_CANADIAN_SYLLABICS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CHEROKEE:CAPS"></a>HB_SCRIPT_CHEROKEE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ETHIOPIC:CAPS"></a>HB_SCRIPT_ETHIOPIC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KHMER:CAPS"></a>HB_SCRIPT_KHMER</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MONGOLIAN:CAPS"></a>HB_SCRIPT_MONGOLIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MYANMAR:CAPS"></a>HB_SCRIPT_MYANMAR</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OGHAM:CAPS"></a>HB_SCRIPT_OGHAM</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-RUNIC:CAPS"></a>HB_SCRIPT_RUNIC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SINHALA:CAPS"></a>HB_SCRIPT_SINHALA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SYRIAC:CAPS"></a>HB_SCRIPT_SYRIAC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-THAANA:CAPS"></a>HB_SCRIPT_THAANA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-YI:CAPS"></a>HB_SCRIPT_YI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-DESERET:CAPS"></a>HB_SCRIPT_DESERET</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GOTHIC:CAPS"></a>HB_SCRIPT_GOTHIC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-ITALIC:CAPS"></a>HB_SCRIPT_OLD_ITALIC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BUHID:CAPS"></a>HB_SCRIPT_BUHID</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-HANUNOO:CAPS"></a>HB_SCRIPT_HANUNOO</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TAGALOG:CAPS"></a>HB_SCRIPT_TAGALOG</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TAGBANWA:CAPS"></a>HB_SCRIPT_TAGBANWA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CYPRIOT:CAPS"></a>HB_SCRIPT_CYPRIOT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LIMBU:CAPS"></a>HB_SCRIPT_LIMBU</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LINEAR-B:CAPS"></a>HB_SCRIPT_LINEAR_B</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OSMANYA:CAPS"></a>HB_SCRIPT_OSMANYA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SHAVIAN:CAPS"></a>HB_SCRIPT_SHAVIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TAI-LE:CAPS"></a>HB_SCRIPT_TAI_LE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-UGARITIC:CAPS"></a>HB_SCRIPT_UGARITIC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BUGINESE:CAPS"></a>HB_SCRIPT_BUGINESE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-COPTIC:CAPS"></a>HB_SCRIPT_COPTIC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GLAGOLITIC:CAPS"></a>HB_SCRIPT_GLAGOLITIC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KHAROSHTHI:CAPS"></a>HB_SCRIPT_KHAROSHTHI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-NEW-TAI-LUE:CAPS"></a>HB_SCRIPT_NEW_TAI_LUE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-PERSIAN:CAPS"></a>HB_SCRIPT_OLD_PERSIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SYLOTI-NAGRI:CAPS"></a>HB_SCRIPT_SYLOTI_NAGRI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TIFINAGH:CAPS"></a>HB_SCRIPT_TIFINAGH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BALINESE:CAPS"></a>HB_SCRIPT_BALINESE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CUNEIFORM:CAPS"></a>HB_SCRIPT_CUNEIFORM</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-NKO:CAPS"></a>HB_SCRIPT_NKO</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-PHAGS-PA:CAPS"></a>HB_SCRIPT_PHAGS_PA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-PHOENICIAN:CAPS"></a>HB_SCRIPT_PHOENICIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CARIAN:CAPS"></a>HB_SCRIPT_CARIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CHAM:CAPS"></a>HB_SCRIPT_CHAM</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KAYAH-LI:CAPS"></a>HB_SCRIPT_KAYAH_LI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LEPCHA:CAPS"></a>HB_SCRIPT_LEPCHA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LYCIAN:CAPS"></a>HB_SCRIPT_LYCIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LYDIAN:CAPS"></a>HB_SCRIPT_LYDIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OL-CHIKI:CAPS"></a>HB_SCRIPT_OL_CHIKI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-REJANG:CAPS"></a>HB_SCRIPT_REJANG</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SAURASHTRA:CAPS"></a>HB_SCRIPT_SAURASHTRA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SUNDANESE:CAPS"></a>HB_SCRIPT_SUNDANESE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-VAI:CAPS"></a>HB_SCRIPT_VAI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-AVESTAN:CAPS"></a>HB_SCRIPT_AVESTAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BAMUM:CAPS"></a>HB_SCRIPT_BAMUM</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-EGYPTIAN-HIEROGLYPHS:CAPS"></a>HB_SCRIPT_EGYPTIAN_HIEROGLYPHS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-IMPERIAL-ARAMAIC:CAPS"></a>HB_SCRIPT_IMPERIAL_ARAMAIC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-INSCRIPTIONAL-PAHLAVI:CAPS"></a>HB_SCRIPT_INSCRIPTIONAL_PAHLAVI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-INSCRIPTIONAL-PARTHIAN:CAPS"></a>HB_SCRIPT_INSCRIPTIONAL_PARTHIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-JAVANESE:CAPS"></a>HB_SCRIPT_JAVANESE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KAITHI:CAPS"></a>HB_SCRIPT_KAITHI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LISU:CAPS"></a>HB_SCRIPT_LISU</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MEETEI-MAYEK:CAPS"></a>HB_SCRIPT_MEETEI_MAYEK</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-SOUTH-ARABIAN:CAPS"></a>HB_SCRIPT_OLD_SOUTH_ARABIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-TURKIC:CAPS"></a>HB_SCRIPT_OLD_TURKIC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SAMARITAN:CAPS"></a>HB_SCRIPT_SAMARITAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TAI-THAM:CAPS"></a>HB_SCRIPT_TAI_THAM</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TAI-VIET:CAPS"></a>HB_SCRIPT_TAI_VIET</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BATAK:CAPS"></a>HB_SCRIPT_BATAK</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BRAHMI:CAPS"></a>HB_SCRIPT_BRAHMI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MANDAIC:CAPS"></a>HB_SCRIPT_MANDAIC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CHAKMA:CAPS"></a>HB_SCRIPT_CHAKMA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MEROITIC-CURSIVE:CAPS"></a>HB_SCRIPT_MEROITIC_CURSIVE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MEROITIC-HIEROGLYPHS:CAPS"></a>HB_SCRIPT_MEROITIC_HIEROGLYPHS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MIAO:CAPS"></a>HB_SCRIPT_MIAO</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SHARADA:CAPS"></a>HB_SCRIPT_SHARADA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SORA-SOMPENG:CAPS"></a>HB_SCRIPT_SORA_SOMPENG</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TAKRI:CAPS"></a>HB_SCRIPT_TAKRI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BASSA-VAH:CAPS"></a>HB_SCRIPT_BASSA_VAH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CAUCASIAN-ALBANIAN:CAPS"></a>HB_SCRIPT_CAUCASIAN_ALBANIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-DUPLOYAN:CAPS"></a>HB_SCRIPT_DUPLOYAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ELBASAN:CAPS"></a>HB_SCRIPT_ELBASAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GRANTHA:CAPS"></a>HB_SCRIPT_GRANTHA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KHOJKI:CAPS"></a>HB_SCRIPT_KHOJKI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KHUDAWADI:CAPS"></a>HB_SCRIPT_KHUDAWADI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LINEAR-A:CAPS"></a>HB_SCRIPT_LINEAR_A</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MAHAJANI:CAPS"></a>HB_SCRIPT_MAHAJANI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MANICHAEAN:CAPS"></a>HB_SCRIPT_MANICHAEAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MENDE-KIKAKUI:CAPS"></a>HB_SCRIPT_MENDE_KIKAKUI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MODI:CAPS"></a>HB_SCRIPT_MODI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MRO:CAPS"></a>HB_SCRIPT_MRO</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-NABATAEAN:CAPS"></a>HB_SCRIPT_NABATAEAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-NORTH-ARABIAN:CAPS"></a>HB_SCRIPT_OLD_NORTH_ARABIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-PERMIC:CAPS"></a>HB_SCRIPT_OLD_PERMIC</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-PAHAWH-HMONG:CAPS"></a>HB_SCRIPT_PAHAWH_HMONG</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-PALMYRENE:CAPS"></a>HB_SCRIPT_PALMYRENE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-PAU-CIN-HAU:CAPS"></a>HB_SCRIPT_PAU_CIN_HAU</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-PSALTER-PAHLAVI:CAPS"></a>HB_SCRIPT_PSALTER_PAHLAVI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SIDDHAM:CAPS"></a>HB_SCRIPT_SIDDHAM</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TIRHUTA:CAPS"></a>HB_SCRIPT_TIRHUTA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-WARANG-CITI:CAPS"></a>HB_SCRIPT_WARANG_CITI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-AHOM:CAPS"></a>HB_SCRIPT_AHOM</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ANATOLIAN-HIEROGLYPHS:CAPS"></a>HB_SCRIPT_ANATOLIAN_HIEROGLYPHS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-HATRAN:CAPS"></a>HB_SCRIPT_HATRAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MULTANI:CAPS"></a>HB_SCRIPT_MULTANI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-HUNGARIAN:CAPS"></a>HB_SCRIPT_OLD_HUNGARIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SIGNWRITING:CAPS"></a>HB_SCRIPT_SIGNWRITING</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ADLAM:CAPS"></a>HB_SCRIPT_ADLAM</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BHAIKSUKI:CAPS"></a>HB_SCRIPT_BHAIKSUKI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MARCHEN:CAPS"></a>HB_SCRIPT_MARCHEN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OSAGE:CAPS"></a>HB_SCRIPT_OSAGE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TANGUT:CAPS"></a>HB_SCRIPT_TANGUT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-NEWA:CAPS"></a>HB_SCRIPT_NEWA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MASARAM-GONDI:CAPS"></a>HB_SCRIPT_MASARAM_GONDI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-NUSHU:CAPS"></a>HB_SCRIPT_NUSHU</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SOYOMBO:CAPS"></a>HB_SCRIPT_SOYOMBO</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ZANABAZAR-SQUARE:CAPS"></a>HB_SCRIPT_ZANABAZAR_SQUARE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-DOGRA:CAPS"></a>HB_SCRIPT_DOGRA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GUNJALA-GONDI:CAPS"></a>HB_SCRIPT_GUNJALA_GONDI</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-HANIFI-ROHINGYA:CAPS"></a>HB_SCRIPT_HANIFI_ROHINGYA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MAKASAR:CAPS"></a>HB_SCRIPT_MAKASAR</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MEDEFAIDRIN:CAPS"></a>HB_SCRIPT_MEDEFAIDRIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-SOGDIAN:CAPS"></a>HB_SCRIPT_OLD_SOGDIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SOGDIAN:CAPS"></a>HB_SCRIPT_SOGDIAN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-INVALID:CAPS"></a>HB_SCRIPT_INVALID</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MAX-VALUE:CAPS"></a>_HB_SCRIPT_MAX_VALUE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MAX-VALUE-SIGNED:CAPS"></a>_HB_SCRIPT_MAX_VALUE_SIGNED</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-user-data-key-t-struct"></a><h3>hb_user_data_key_t</h3>
+<pre class="programlisting">typedef struct {
+} hb_user_data_key_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-var-int-t"></a><h3>hb_var_int_t</h3>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-TAG-NONE:CAPS"></a><h3>HB_TAG_NONE</h3>
+<pre class="programlisting">#define HB_TAG_NONE HB_TAG(0,0,0,0)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-TAG-MAX:CAPS"></a><h3>HB_TAG_MAX</h3>
+<pre class="programlisting">#define HB_TAG_MAX HB_TAG(0xff,0xff,0xff,0xff)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-TAG-MAX-SIGNED:CAPS"></a><h3>HB_TAG_MAX_SIGNED</h3>
+<pre class="programlisting">#define HB_TAG_MAX_SIGNED HB_TAG(0x7f,0xff,0xff,0xff)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-LANGUAGE-INVALID:CAPS"></a><h3>HB_LANGUAGE_INVALID</h3>
+<pre class="programlisting">#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
+</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-coretext.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-coretext.html
new file mode 100644
index 0000000..fddeb85
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-coretext.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-coretext: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch12.html" title="Integration API">
+<link rel="prev" href="ch12.html" title="Integration API">
+<link rel="next" href="harfbuzz-hb-ft.html" title="hb-ft">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-coretext.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="ch12.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-ft.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-coretext"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-coretext.top_of_page"></a>hb-coretext</span></h2>
+<p>hb-coretext — CoreText integration</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-coretext.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-face-create" title="hb_coretext_face_create ()">hb_coretext_face_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-font-create" title="hb_coretext_font_create ()">hb_coretext_font_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">CGFontRef</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-face-get-cg-font" title="hb_coretext_face_get_cg_font ()">hb_coretext_face_get_cg_font</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">CTFontRef</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-font-get-ct-font" title="hb_coretext_font_get_ct_font ()">hb_coretext_font_get_ct_font</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-coretext.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-KERX:CAPS" title="HB_CORETEXT_TAG_KERX">HB_CORETEXT_TAG_KERX</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORT:CAPS" title="HB_CORETEXT_TAG_MORT">HB_CORETEXT_TAG_MORT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORX:CAPS" title="HB_CORETEXT_TAG_MORX">HB_CORETEXT_TAG_MORX</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-coretext.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-coretext.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-coretext.description"></a><h2>Description</h2>
+<p>Functions for using HarfBuzz with the CoreText fonts.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-coretext.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-coretext-face-create"></a><h3>hb_coretext_face_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+hb_coretext_face_create (<em class="parameter"><code><span class="type">CGFontRef</span> cg_font</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-coretext-font-create"></a><h3>hb_coretext_font_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+hb_coretext_font_create (<em class="parameter"><code><span class="type">CTFontRef</span> ct_font</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-coretext-face-get-cg-font"></a><h3>hb_coretext_face_get_cg_font ()</h3>
+<pre class="programlisting"><span class="returnvalue">CGFontRef</span>
+hb_coretext_face_get_cg_font (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-coretext-font-get-ct-font"></a><h3>hb_coretext_font_get_ct_font ()</h3>
+<pre class="programlisting"><span class="returnvalue">CTFontRef</span>
+hb_coretext_font_get_ct_font (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-coretext.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="HB-CORETEXT-TAG-KERX:CAPS"></a><h3>HB_CORETEXT_TAG_KERX</h3>
+<pre class="programlisting">#define HB_CORETEXT_TAG_KERX HB_TAG('k','e','r','x')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-CORETEXT-TAG-MORT:CAPS"></a><h3>HB_CORETEXT_TAG_MORT</h3>
+<pre class="programlisting">#define HB_CORETEXT_TAG_MORT HB_TAG('m','o','r','t')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-CORETEXT-TAG-MORX:CAPS"></a><h3>HB_CORETEXT_TAG_MORX</h3>
+<pre class="programlisting">#define HB_CORETEXT_TAG_MORX HB_TAG('m','o','r','x')
+</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-deprecated.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-deprecated.html
new file mode 100644
index 0000000..96ed0a1
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-deprecated.html
@@ -0,0 +1,408 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-deprecated: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch09.html" title="Core API">
+<link rel="prev" href="harfbuzz-hb-common.html" title="hb-common">
+<link rel="next" href="harfbuzz-hb-face.html" title="hb-face">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-deprecated.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch09.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-common.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-face.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-deprecated"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-deprecated.top_of_page"></a>hb-deprecated</span></h2>
+<p>hb-deprecated — Deprecated API</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-deprecated.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-func-t" title="hb_font_get_glyph_func_t ()">*hb_font_get_glyph_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-ot-layout-table-find-script" title="hb_ot_layout_table_find_script ()">hb_ot_layout_table_find_script</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-h-kerning-func" title="hb_font_funcs_set_glyph_h_kerning_func ()">hb_font_funcs_set_glyph_h_kerning_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-v-kerning-func" title="hb_font_funcs_set_glyph_v_kerning_func ()">hb_font_funcs_set_glyph_v_kerning_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-h-kerning" title="hb_font_get_glyph_h_kerning ()">hb_font_get_glyph_h_kerning</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-kerning-for-direction" title="hb_font_get_glyph_kerning_for_direction ()">hb_font_get_glyph_kerning_for_direction</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-kerning-func-t" title="hb_font_get_glyph_kerning_func_t ()">*hb_font_get_glyph_kerning_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning" title="hb_font_get_glyph_v_kerning ()">hb_font_get_glyph_v_kerning</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-deprecated.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-deprecated.html#HB-BUFFER-FLAGS-DEFAULT:CAPS" title="HB_BUFFER_FLAGS_DEFAULT">HB_BUFFER_FLAGS_DEFAULT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-deprecated.html#HB-BUFFER-SERIALIZE-FLAGS-DEFAULT:CAPS" title="HB_BUFFER_SERIALIZE_FLAGS_DEFAULT">HB_BUFFER_SERIALIZE_FLAGS_DEFAULT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-deprecated.html#HB-SCRIPT-CANADIAN-ABORIGINAL:CAPS" title="HB_SCRIPT_CANADIAN_ABORIGINAL">HB_SCRIPT_CANADIAN_ABORIGINAL</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-deprecated.html#HB-OT-VAR-NO-AXIS-INDEX:CAPS" title="HB_OT_VAR_NO_AXIS_INDEX">HB_OT_VAR_NO_AXIS_INDEX</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-deprecated.html#HB-UNICODE-MAX-DECOMPOSITION-LEN:CAPS" title="HB_UNICODE_MAX_DECOMPOSITION_LEN">HB_UNICODE_MAX_DECOMPOSITION_LEN</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-h-kerning-func-t" title="hb_font_get_glyph_h_kerning_func_t">hb_font_get_glyph_h_kerning_func_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning-func-t" title="hb_font_get_glyph_v_kerning_func_t">hb_font_get_glyph_v_kerning_func_t</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-deprecated.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-deprecated.description"></a><h2>Description</h2>
+<p>These API have been deprecated in favor of newer API, or because they
+were deemed unnecessary.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-deprecated.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-font-get-glyph-func-t"></a><h3>hb_font_get_glyph_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+<span class="c_punctuation">(</span>*hb_font_get_glyph_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                             <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> variation_selector</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>,
+                             <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<div class="warning"><p><code class="literal">hb_font_get_glyph_func_t</code> is deprecated and should not be used in newly-written code.</p></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-table-find-script"></a><h3>hb_ot_layout_table_find_script ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_layout_table_find_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> script_tag</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *script_index</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-glyph-h-kerning-func"></a><h3>hb_font_funcs_set_glyph_h_kerning_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_glyph_h_kerning_func
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-h-kerning-func-t" title="hb_font_get_glyph_h_kerning_func_t"><span class="type">hb_font_get_glyph_h_kerning_func_t</span></a> func</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="warning"><p><code class="literal">hb_font_funcs_set_glyph_h_kerning_func</code> has been deprecated since version 2.0.0 and should not be used in newly-written code.</p></div>
+<div class="refsect3">
+<a name="hb-font-funcs-set-glyph-h-kerning-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-glyph-v-kerning-func"></a><h3>hb_font_funcs_set_glyph_v_kerning_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_glyph_v_kerning_func
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning-func-t" title="hb_font_get_glyph_v_kerning_func_t"><span class="type">hb_font_get_glyph_v_kerning_func_t</span></a> func</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="warning"><p><code class="literal">hb_font_funcs_set_glyph_v_kerning_func</code> has been deprecated since version 2.0.0 and should not be used in newly-written code.</p></div>
+<div class="refsect3">
+<a name="hb-font-funcs-set-glyph-v-kerning-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-h-kerning"></a><h3>hb_font_get_glyph_h_kerning ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+hb_font_get_glyph_h_kerning (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> left_glyph</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> right_glyph</code></em>);</pre>
+<div class="warning"><p><code class="literal">hb_font_get_glyph_h_kerning</code> has been deprecated since version 2.0.0 and should not be used in newly-written code.</p></div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-h-kerning.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-kerning-for-direction"></a><h3>hb_font_get_glyph_kerning_for_direction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_get_glyph_kerning_for_direction
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> first_glyph</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> second_glyph</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<div class="warning"><p><code class="literal">hb_font_get_glyph_kerning_for_direction</code> has been deprecated since version 2.0.0 and should not be used in newly-written code.</p></div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-kerning-for-direction.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-kerning-func-t"></a><h3>hb_font_get_glyph_kerning_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+<span class="c_punctuation">(</span>*hb_font_get_glyph_kerning_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                     <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> first_glyph</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> second_glyph</code></em>,
+                                     <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<div class="warning"><p><code class="literal">hb_font_get_glyph_kerning_func_t</code> is deprecated and should not be used in newly-written code.</p></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-v-kerning"></a><h3>hb_font_get_glyph_v_kerning ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+hb_font_get_glyph_v_kerning (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> top_glyph</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> bottom_glyph</code></em>);</pre>
+<div class="warning"><p><code class="literal">hb_font_get_glyph_v_kerning</code> has been deprecated since version 2.0.0 and should not be used in newly-written code.</p></div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-v-kerning.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-deprecated.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="HB-BUFFER-FLAGS-DEFAULT:CAPS"></a><h3>HB_BUFFER_FLAGS_DEFAULT</h3>
+<pre class="programlisting">#define HB_BUFFER_FLAGS_DEFAULT			HB_BUFFER_FLAG_DEFAULT
+</pre>
+<div class="warning"><p><code class="literal">HB_BUFFER_FLAGS_DEFAULT</code> is deprecated and should not be used in newly-written code.</p></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-BUFFER-SERIALIZE-FLAGS-DEFAULT:CAPS"></a><h3>HB_BUFFER_SERIALIZE_FLAGS_DEFAULT</h3>
+<pre class="programlisting">#define HB_BUFFER_SERIALIZE_FLAGS_DEFAULT HB_BUFFER_SERIALIZE_FLAG_DEFAULT
+</pre>
+<div class="warning"><p><code class="literal">HB_BUFFER_SERIALIZE_FLAGS_DEFAULT</code> is deprecated and should not be used in newly-written code.</p></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-SCRIPT-CANADIAN-ABORIGINAL:CAPS"></a><h3>HB_SCRIPT_CANADIAN_ABORIGINAL</h3>
+<pre class="programlisting">#define HB_SCRIPT_CANADIAN_ABORIGINAL		HB_SCRIPT_CANADIAN_SYLLABICS
+</pre>
+<div class="warning"><p><code class="literal">HB_SCRIPT_CANADIAN_ABORIGINAL</code> is deprecated and should not be used in newly-written code.</p></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-VAR-NO-AXIS-INDEX:CAPS"></a><h3>HB_OT_VAR_NO_AXIS_INDEX</h3>
+<pre class="programlisting">#define HB_OT_VAR_NO_AXIS_INDEX		0xFFFFFFFFu
+</pre>
+<div class="warning"><p><code class="literal">HB_OT_VAR_NO_AXIS_INDEX</code> has been deprecated since version 2.2.0 and should not be used in newly-written code.</p></div>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-UNICODE-MAX-DECOMPOSITION-LEN:CAPS"></a><h3>HB_UNICODE_MAX_DECOMPOSITION_LEN</h3>
+<pre class="programlisting">#define HB_UNICODE_MAX_DECOMPOSITION_LEN (18+1) /* codepoints */
+</pre>
+<div class="warning"><p><code class="literal">HB_UNICODE_MAX_DECOMPOSITION_LEN</code> has been deprecated since version 2.0.0 and should not be used in newly-written code.</p></div>
+<p>See Unicode 6.1 for details on the maximum decomposition length.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-h-kerning-func-t"></a><h3>hb_font_get_glyph_h_kerning_func_t</h3>
+<pre class="programlisting">typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t;
+</pre>
+<div class="warning"><p><code class="literal">hb_font_get_glyph_h_kerning_func_t</code> is deprecated and should not be used in newly-written code.</p></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-v-kerning-func-t"></a><h3>hb_font_get_glyph_v_kerning_func_t</h3>
+<pre class="programlisting">typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t;
+</pre>
+<div class="warning"><p><code class="literal">hb_font_get_glyph_v_kerning_func_t</code> is deprecated and should not be used in newly-written code.</p></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-face.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-face.html
new file mode 100644
index 0000000..25c817e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-face.html
@@ -0,0 +1,867 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-face: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch09.html" title="Core API">
+<link rel="prev" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">
+<link rel="next" href="harfbuzz-hb-font.html" title="hb-font">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-face.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-face.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch09.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-deprecated.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-font.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-face"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-face.top_of_page"></a>hb-face</span></h2>
+<p>hb-face — Font face objects</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-face.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-count" title="hb_face_count ()">hb_face_count</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-create" title="hb_face_create ()">hb_face_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-create-for-tables" title="hb_face_create_for_tables ()">hb_face_create_for_tables</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-destroy" title="hb_face_destroy ()">hb_face_destroy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-empty" title="hb_face_get_empty ()">hb_face_get_empty</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-table-tags" title="hb_face_get_table_tags ()">hb_face_get_table_tags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-glyph-count" title="hb_face_get_glyph_count ()">hb_face_get_glyph_count</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-index" title="hb_face_get_index ()">hb_face_get_index</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-upem" title="hb_face_get_upem ()">hb_face_get_upem</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-user-data" title="hb_face_get_user_data ()">hb_face_get_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-is-immutable" title="hb_face_is_immutable ()">hb_face_is_immutable</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-make-immutable" title="hb_face_make_immutable ()">hb_face_make_immutable</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-reference" title="hb_face_reference ()">hb_face_reference</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-reference-blob" title="hb_face_reference_blob ()">hb_face_reference_blob</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-reference-table" title="hb_face_reference_table ()">hb_face_reference_table</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-glyph-count" title="hb_face_set_glyph_count ()">hb_face_set_glyph_count</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-index" title="hb_face_set_index ()">hb_face_set_index</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-upem" title="hb_face_set_upem ()">hb_face_set_upem</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-user-data" title="hb_face_set_user_data ()">hb_face_set_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-collect-unicodes" title="hb_face_collect_unicodes ()">hb_face_collect_unicodes</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-collect-variation-selectors" title="hb_face_collect_variation_selectors ()">hb_face_collect_variation_selectors</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-collect-variation-unicodes" title="hb_face_collect_variation_unicodes ()">hb_face_collect_variation_unicodes</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-builder-create" title="hb_face_builder_create ()">hb_face_builder_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-builder-add-table" title="hb_face_builder_add_table ()">hb_face_builder_add_table</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="hb-face-t"></a><div class="refsect1">
+<a name="harfbuzz-hb-face.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody><tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-face.html#hb-face-t">hb_face_t</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-face.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
+    <span class="lineart">╰──</span> hb_face_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-face.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-face.description"></a><h2>Description</h2>
+<p>Font face is objects represent a single face in a font family.
+More exactly, a font face represents a single face in a binary font file.
+Font faces are typically built from a binary blob and a face index.
+Font faces are used to create fonts.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-face.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-face-count"></a><h3>hb_face_count ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_face_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+<p>Get number of faces in a blob.</p>
+<div class="refsect3">
+<a name="hb-face-count.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>blob</p></td>
+<td class="parameter_description"><p>a blob.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-face-count.returns"></a><h4>Returns</h4>
+<p> Number of faces in <em class="parameter"><code>blob</code></em>
+</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-create"></a><h3>hb_face_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+hb_face_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>,
+                <em class="parameter"><code>unsigned <span class="type">int</span> index</code></em>);</pre>
+<p><span class="annotation">[Xconstructor]</span></p>
+<div class="refsect3">
+<a name="hb-face-create.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-create-for-tables"></a><h3>hb_face_create_for_tables ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+hb_face_create_for_tables (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-reference-table-func-t" title="hb_reference_table_func_t ()"><span class="type">hb_reference_table_func_t</span></a> reference_table_func</code></em>,
+                           <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                           <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-create-for-tables.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>reference_table_func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-face-create-for-tables.returns"></a><h4>Returns</h4>
+<p> (transfer full)</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-destroy"></a><h3>hb_face_destroy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_face_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-face-destroy.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-get-empty"></a><h3>hb_face_get_empty ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+hb_face_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-get-empty.returns"></a><h4>Returns</h4>
+<p> (transfer full)</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-get-table-tags"></a><h3>hb_face_get_table_tags ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_face_get_table_tags (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                        <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                        <em class="parameter"><code>unsigned <span class="type">int</span> *table_count</code></em>,
+                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *table_tags</code></em>);</pre>
+<p>Retrieves table tags for a face, if possible.</p>
+<div class="refsect3">
+<a name="hb-face-get-table-tags.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start_offset</p></td>
+<td class="parameter_description"><p>index of first tag to return.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>table_count</p></td>
+<td class="parameter_description"><p>input length of <em class="parameter"><code>table_tags</code></em>
+array, output number of items written.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>table_tags</p></td>
+<td class="parameter_description"><p>array to write tags into.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-face-get-table-tags.returns"></a><h4>Returns</h4>
+<p> total number of tables, or 0 if not possible to list.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-6-0.html#api-index-1.6.0">1.6.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-get-glyph-count"></a><h3>hb_face_get_glyph_count ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_face_get_glyph_count (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-get-glyph-count.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-get-index"></a><h3>hb_face_get_index ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_face_get_index (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-get-index.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-get-upem"></a><h3>hb_face_get_upem ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_face_get_upem (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-get-upem.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-get-user-data"></a><h3>hb_face_get_user_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> *
+hb_face_get_user_data (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-face-get-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-face-get-user-data.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-is-immutable"></a><h3>hb_face_is_immutable ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_face_is_immutable (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-is-immutable.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-make-immutable"></a><h3>hb_face_make_immutable ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_face_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-make-immutable.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-reference"></a><h3>hb_face_reference ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+hb_face_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-face-reference.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-reference-blob"></a><h3>hb_face_reference_blob ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+hb_face_reference_blob (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-reference-blob.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-face-reference-blob.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-reference-table"></a><h3>hb_face_reference_table ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+hb_face_reference_table (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-reference-table.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-face-reference-table.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-set-glyph-count"></a><h3>hb_face_set_glyph_count ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_face_set_glyph_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                         <em class="parameter"><code>unsigned <span class="type">int</span> glyph_count</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-set-glyph-count.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-set-index"></a><h3>hb_face_set_index ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_face_set_index (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                   <em class="parameter"><code>unsigned <span class="type">int</span> index</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-set-index.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-set-upem"></a><h3>hb_face_set_upem ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_face_set_upem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                  <em class="parameter"><code>unsigned <span class="type">int</span> upem</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-set-upem.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-set-user-data"></a><h3>hb_face_set_user_data ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_face_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+                       <em class="parameter"><code><span class="type">void</span> *data</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-face-set-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-collect-unicodes"></a><h3>hb_face_collect_unicodes ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_face_collect_unicodes (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *out</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-collect-unicodes.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>out</p></td>
+<td class="parameter_description"><p>set to add Unicode characters covered by <em class="parameter"><code>face</code></em>
+to.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-9-0.html#api-index-1.9.0">1.9.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-collect-variation-selectors"></a><h3>hb_face_collect_variation_selectors ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_face_collect_variation_selectors (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *out</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-collect-variation-selectors.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>out</p></td>
+<td class="parameter_description"><p>set to add Variation Selector characters covered by <em class="parameter"><code>face</code></em>
+to.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-9-0.html#api-index-1.9.0">1.9.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-collect-variation-unicodes"></a><h3>hb_face_collect_variation_unicodes ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_face_collect_variation_unicodes (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> variation_selector</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *out</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-face-collect-variation-unicodes.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>out</p></td>
+<td class="parameter_description"><p>set to add Unicode characters for <em class="parameter"><code>variation_selector</code></em>
+covered by <em class="parameter"><code>face</code></em>
+to.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-9-0.html#api-index-1.9.0">1.9.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-builder-create"></a><h3>hb_face_builder_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+hb_face_builder_create (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Creates a <a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> that can be used with <a class="link" href="harfbuzz-hb-face.html#hb-face-builder-add-table" title="hb_face_builder_add_table ()"><code class="function">hb_face_builder_add_table()</code></a>.
+After tables are added to the face, it can be compiled to a binary
+font file by calling <a class="link" href="harfbuzz-hb-face.html#hb-face-reference-blob" title="hb_face_reference_blob ()"><code class="function">hb_face_reference_blob()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-face-builder-create.returns"></a><h4>Returns</h4>
+<p> New face. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-9-0.html#api-index-1.9.0">1.9.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-face-builder-add-table"></a><h3>hb_face_builder_add_table ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_face_builder_add_table (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                           <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>,
+                           <em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+<p>Add table for <em class="parameter"><code>tag</code></em>
+ with data provided by <em class="parameter"><code>blob</code></em>
+ to the face.  <em class="parameter"><code>face</code></em>
+ must
+be created using <a class="link" href="harfbuzz-hb-face.html#hb-face-builder-create" title="hb_face_builder_create ()"><code class="function">hb_face_builder_create()</code></a>.</p>
+<p class="since">Since: <a class="link" href="api-index-1-9-0.html#api-index-1.9.0">1.9.0</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-face.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="hb-face-t"></a><h3>hb_face_t</h3>
+<pre class="programlisting">typedef struct hb_face_t hb_face_t;
+</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-font.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-font.html
new file mode 100644
index 0000000..10c7d9e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-font.html
@@ -0,0 +1,3113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-font: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch09.html" title="Core API">
+<link rel="prev" href="harfbuzz-hb-face.html" title="hb-face">
+<link rel="next" href="harfbuzz-hb-map.html" title="hb-map">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-font.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-font.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch09.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-face.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-map.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-font"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-font.top_of_page"></a>hb-font</span></h2>
+<p>hb-font — Font objects</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-font.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-add-glyph-origin-for-direction" title="hb_font_add_glyph_origin_for_direction ()">hb_font_add_glyph_origin_for_direction</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-create" title="hb_font_create ()">hb_font_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-create-sub-font" title="hb_font_create_sub_font ()">hb_font_create_sub_font</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-destroy" title="hb_font_destroy ()">hb_font_destroy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="returnvalue">hb_font_funcs_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-create" title="hb_font_funcs_create ()">hb_font_funcs_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-destroy" title="hb_font_funcs_destroy ()">hb_font_funcs_destroy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="returnvalue">hb_font_funcs_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-get-empty" title="hb_font_funcs_get_empty ()">hb_font_funcs_get_empty</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-get-user-data" title="hb_font_funcs_get_user_data ()">hb_font_funcs_get_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-is-immutable" title="hb_font_funcs_is_immutable ()">hb_font_funcs_is_immutable</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-make-immutable" title="hb_font_funcs_make_immutable ()">hb_font_funcs_make_immutable</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="returnvalue">hb_font_funcs_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-reference" title="hb_font_funcs_reference ()">hb_font_funcs_reference</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-contour-point-func" title="hb_font_funcs_set_glyph_contour_point_func ()">hb_font_funcs_set_glyph_contour_point_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-extents-func" title="hb_font_funcs_set_glyph_extents_func ()">hb_font_funcs_set_glyph_extents_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-from-name-func" title="hb_font_funcs_set_glyph_from_name_func ()">hb_font_funcs_set_glyph_from_name_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-advance-func" title="hb_font_funcs_set_glyph_h_advance_func ()">hb_font_funcs_set_glyph_h_advance_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-advances-func" title="hb_font_funcs_set_glyph_h_advances_func ()">hb_font_funcs_set_glyph_h_advances_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-origin-func" title="hb_font_funcs_set_glyph_h_origin_func ()">hb_font_funcs_set_glyph_h_origin_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-name-func" title="hb_font_funcs_set_glyph_name_func ()">hb_font_funcs_set_glyph_name_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-advance-func" title="hb_font_funcs_set_glyph_v_advance_func ()">hb_font_funcs_set_glyph_v_advance_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-advances-func" title="hb_font_funcs_set_glyph_v_advances_func ()">hb_font_funcs_set_glyph_v_advances_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-origin-func" title="hb_font_funcs_set_glyph_v_origin_func ()">hb_font_funcs_set_glyph_v_origin_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-nominal-glyph-func" title="hb_font_funcs_set_nominal_glyph_func ()">hb_font_funcs_set_nominal_glyph_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-nominal-glyphs-func" title="hb_font_funcs_set_nominal_glyphs_func ()">hb_font_funcs_set_nominal_glyphs_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-user-data" title="hb_font_funcs_set_user_data ()">hb_font_funcs_set_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-variation-glyph-func" title="hb_font_funcs_set_variation_glyph_func ()">hb_font_funcs_set_variation_glyph_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-empty" title="hb_font_get_empty ()">hb_font_get_empty</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-face" title="hb_font_get_face ()">hb_font_get_face</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph" title="hb_font_get_glyph ()">hb_font_get_glyph</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-advance-for-direction" title="hb_font_get_glyph_advance_for_direction ()">hb_font_get_glyph_advance_for_direction</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-advance-func-t" title="hb_font_get_glyph_advance_func_t ()">*hb_font_get_glyph_advance_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-advances-for-direction" title="hb_font_get_glyph_advances_for_direction ()">hb_font_get_glyph_advances_for_direction</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-advances-func-t" title="hb_font_get_glyph_advances_func_t ()">*hb_font_get_glyph_advances_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point" title="hb_font_get_glyph_contour_point ()">hb_font_get_glyph_contour_point</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point-for-origin" title="hb_font_get_glyph_contour_point_for_origin ()">hb_font_get_glyph_contour_point_for_origin</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point-func-t" title="hb_font_get_glyph_contour_point_func_t ()">*hb_font_get_glyph_contour_point_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-extents" title="hb_font_get_glyph_extents ()">hb_font_get_glyph_extents</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-extents-for-origin" title="hb_font_get_glyph_extents_for_origin ()">hb_font_get_glyph_extents_for_origin</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-extents-func-t" title="hb_font_get_glyph_extents_func_t ()">*hb_font_get_glyph_extents_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-from-name" title="hb_font_get_glyph_from_name ()">hb_font_get_glyph_from_name</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-from-name-func-t" title="hb_font_get_glyph_from_name_func_t ()">*hb_font_get_glyph_from_name_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advance" title="hb_font_get_glyph_h_advance ()">hb_font_get_glyph_h_advance</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advances" title="hb_font_get_glyph_h_advances ()">hb_font_get_glyph_h_advances</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-origin" title="hb_font_get_glyph_h_origin ()">hb_font_get_glyph_h_origin</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-name" title="hb_font_get_glyph_name ()">hb_font_get_glyph_name</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-name-func-t" title="hb_font_get_glyph_name_func_t ()">*hb_font_get_glyph_name_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-origin-for-direction" title="hb_font_get_glyph_origin_for_direction ()">hb_font_get_glyph_origin_for_direction</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-origin-func-t" title="hb_font_get_glyph_origin_func_t ()">*hb_font_get_glyph_origin_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advance" title="hb_font_get_glyph_v_advance ()">hb_font_get_glyph_v_advance</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advances" title="hb_font_get_glyph_v_advances ()">hb_font_get_glyph_v_advances</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-origin" title="hb_font_get_glyph_v_origin ()">hb_font_get_glyph_v_origin</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-nominal-glyph" title="hb_font_get_nominal_glyph ()">hb_font_get_nominal_glyph</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-font.html#hb-font-get-nominal-glyph-func-t" title="hb_font_get_nominal_glyph_func_t ()">*hb_font_get_nominal_glyph_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-parent" title="hb_font_get_parent ()">hb_font_get_parent</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-ppem" title="hb_font_get_ppem ()">hb_font_get_ppem</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">float</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-ptem" title="hb_font_get_ptem ()">hb_font_get_ptem</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-scale" title="hb_font_get_scale ()">hb_font_get_scale</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-user-data" title="hb_font_get_user_data ()">hb_font_get_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-variation-glyph" title="hb_font_get_variation_glyph ()">hb_font_get_variation_glyph</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-font.html#hb-font-get-variation-glyph-func-t" title="hb_font_get_variation_glyph_func_t ()">*hb_font_get_variation_glyph_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <span class="returnvalue">int</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-var-coords-normalized" title="hb_font_get_var_coords_normalized ()">hb_font_get_var_coords_normalized</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-glyph-from-string" title="hb_font_glyph_from_string ()">hb_font_glyph_from_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-glyph-to-string" title="hb_font_glyph_to_string ()">hb_font_glyph_to_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-is-immutable" title="hb_font_is_immutable ()">hb_font_is_immutable</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-make-immutable" title="hb_font_make_immutable ()">hb_font_make_immutable</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-reference" title="hb_font_reference ()">hb_font_reference</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-face" title="hb_font_set_face ()">hb_font_set_face</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-funcs" title="hb_font_set_funcs ()">hb_font_set_funcs</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-funcs-data" title="hb_font_set_funcs_data ()">hb_font_set_funcs_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-parent" title="hb_font_set_parent ()">hb_font_set_parent</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-ppem" title="hb_font_set_ppem ()">hb_font_set_ppem</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-ptem" title="hb_font_set_ptem ()">hb_font_set_ptem</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-scale" title="hb_font_set_scale ()">hb_font_set_scale</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-user-data" title="hb_font_set_user_data ()">hb_font_set_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-variation-from-string" title="hb_variation_from_string ()">hb_variation_from_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-variation-to-string" title="hb_variation_to_string ()">hb_variation_to_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-variations" title="hb_font_set_variations ()">hb_font_set_variations</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-var-coords-design" title="hb_font_set_var_coords_design ()">hb_font_set_var_coords_design</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-var-coords-normalized" title="hb_font_set_var_coords_normalized ()">hb_font_set_var_coords_normalized</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-subtract-glyph-origin-for-direction" title="hb_font_subtract_glyph_origin_for_direction ()">hb_font_subtract_glyph_origin_for_direction</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-font.html#hb-reference-table-func-t" title="hb_reference_table_func_t ()">*hb_reference_table_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-font-h-extents-func" title="hb_font_funcs_set_font_h_extents_func ()">hb_font_funcs_set_font_h_extents_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-font-v-extents-func" title="hb_font_funcs_set_font_v_extents_func ()">hb_font_funcs_set_font_v_extents_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-extents-for-direction" title="hb_font_get_extents_for_direction ()">hb_font_get_extents_for_direction</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-font.html#hb-font-get-font-extents-func-t" title="hb_font_get_font_extents_func_t ()">*hb_font_get_font_extents_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-h-extents" title="hb_font_get_h_extents ()">hb_font_get_h_extents</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-v-extents" title="hb_font_get_v_extents ()">hb_font_get_v_extents</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="hb-font-funcs-t"></a><a name="hb-font-t"></a><div class="refsect1">
+<a name="harfbuzz-hb-font.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t">hb_font_funcs_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advance-func-t" title="hb_font_get_glyph_h_advance_func_t">hb_font_get_glyph_h_advance_func_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advances-func-t" title="hb_font_get_glyph_h_advances_func_t">hb_font_get_glyph_h_advances_func_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-origin-func-t" title="hb_font_get_glyph_h_origin_func_t">hb_font_get_glyph_h_origin_func_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advance-func-t" title="hb_font_get_glyph_v_advance_func_t">hb_font_get_glyph_v_advance_func_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advances-func-t" title="hb_font_get_glyph_v_advances_func_t">hb_font_get_glyph_v_advances_func_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-origin-func-t" title="hb_font_get_glyph_v_origin_func_t">hb_font_get_glyph_v_origin_func_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-variation-t" title="hb_variation_t">hb_variation_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-t">hb_font_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-get-font-h-extents-func-t" title="hb_font_get_font_h_extents_func_t">hb_font_get_font_h_extents_func_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-get-font-v-extents-func-t" title="hb_font_get_font_v_extents_func_t">hb_font_get_font_v_extents_func_t</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-font.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
+    <span class="lineart">├──</span> hb_font_funcs_t
+    <span class="lineart">╰──</span> hb_font_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-font.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-font.description"></a><h2>Description</h2>
+<p>Font objects represent a font face at a certain size and other
+parameters (pixels per EM, points per EM, variation settings.)
+Fonts are created from font faces, and are used as input to
+<a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape ()"><code class="function">hb_shape()</code></a> among other things.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-font.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-font-add-glyph-origin-for-direction"></a><h3>hb_font_add_glyph_origin_for_direction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_add_glyph_origin_for_direction
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-add-glyph-origin-for-direction.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-create"></a><h3>hb_font_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+hb_font_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p><span class="annotation">[Xconstructor]</span></p>
+<div class="refsect3">
+<a name="hb-font-create.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-create.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-create-sub-font"></a><h3>hb_font_create_sub_font ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+hb_font_create_sub_font (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *parent</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-create-sub-font.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>parent</p></td>
+<td class="parameter_description"><p>parent font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-create-sub-font.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-destroy"></a><h3>hb_font_destroy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-font-destroy.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-create"></a><h3>hb_font_funcs_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="returnvalue">hb_font_funcs_t</span></a> *
+hb_font_funcs_create (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p><span class="annotation">[Xconstructor]</span></p>
+<div class="refsect3">
+<a name="hb-font-funcs-create.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-destroy"></a><h3>hb_font_funcs_destroy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-font-funcs-destroy.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-get-empty"></a><h3>hb_font_funcs_get_empty ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="returnvalue">hb_font_funcs_t</span></a> *
+hb_font_funcs_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-get-empty.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-get-user-data"></a><h3>hb_font_funcs_get_user_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> *
+hb_font_funcs_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-font-funcs-get-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-funcs-get-user-data.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-is-immutable"></a><h3>hb_font_funcs_is_immutable ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_funcs_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-is-immutable.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-make-immutable"></a><h3>hb_font_funcs_make_immutable ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-make-immutable.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-reference"></a><h3>hb_font_funcs_reference ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="returnvalue">hb_font_funcs_t</span></a> *
+hb_font_funcs_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-font-funcs-reference.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-glyph-contour-point-func"></a><h3>hb_font_funcs_set_glyph_contour_point_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_glyph_contour_point_func
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point-func-t" title="hb_font_get_glyph_contour_point_func_t ()"><span class="type">hb_font_get_glyph_contour_point_func_t</span></a> func</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-glyph-contour-point-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-glyph-extents-func"></a><h3>hb_font_funcs_set_glyph_extents_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_glyph_extents_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-extents-func-t" title="hb_font_get_glyph_extents_func_t ()"><span class="type">hb_font_get_glyph_extents_func_t</span></a> func</code></em>,
+                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-glyph-extents-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-glyph-from-name-func"></a><h3>hb_font_funcs_set_glyph_from_name_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_glyph_from_name_func
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-from-name-func-t" title="hb_font_get_glyph_from_name_func_t ()"><span class="type">hb_font_get_glyph_from_name_func_t</span></a> func</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-glyph-from-name-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-glyph-h-advance-func"></a><h3>hb_font_funcs_set_glyph_h_advance_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_glyph_h_advance_func
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advance-func-t" title="hb_font_get_glyph_h_advance_func_t"><span class="type">hb_font_get_glyph_h_advance_func_t</span></a> func</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-glyph-h-advance-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-glyph-h-advances-func"></a><h3>hb_font_funcs_set_glyph_h_advances_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_glyph_h_advances_func
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advances-func-t" title="hb_font_get_glyph_h_advances_func_t"><span class="type">hb_font_get_glyph_h_advances_func_t</span></a> func</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-glyph-h-advances-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-8-6.html#api-index-1.8.6">1.8.6</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-glyph-h-origin-func"></a><h3>hb_font_funcs_set_glyph_h_origin_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_glyph_h_origin_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-origin-func-t" title="hb_font_get_glyph_h_origin_func_t"><span class="type">hb_font_get_glyph_h_origin_func_t</span></a> func</code></em>,
+                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-glyph-h-origin-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-glyph-name-func"></a><h3>hb_font_funcs_set_glyph_name_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_glyph_name_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-name-func-t" title="hb_font_get_glyph_name_func_t ()"><span class="type">hb_font_get_glyph_name_func_t</span></a> func</code></em>,
+                                   <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-glyph-name-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-glyph-v-advance-func"></a><h3>hb_font_funcs_set_glyph_v_advance_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_glyph_v_advance_func
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advance-func-t" title="hb_font_get_glyph_v_advance_func_t"><span class="type">hb_font_get_glyph_v_advance_func_t</span></a> func</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-glyph-v-advance-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-glyph-v-advances-func"></a><h3>hb_font_funcs_set_glyph_v_advances_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_glyph_v_advances_func
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advances-func-t" title="hb_font_get_glyph_v_advances_func_t"><span class="type">hb_font_get_glyph_v_advances_func_t</span></a> func</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-glyph-v-advances-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-8-6.html#api-index-1.8.6">1.8.6</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-glyph-v-origin-func"></a><h3>hb_font_funcs_set_glyph_v_origin_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_glyph_v_origin_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-origin-func-t" title="hb_font_get_glyph_v_origin_func_t"><span class="type">hb_font_get_glyph_v_origin_func_t</span></a> func</code></em>,
+                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-glyph-v-origin-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-nominal-glyph-func"></a><h3>hb_font_funcs_set_nominal_glyph_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_nominal_glyph_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-nominal-glyph-func-t" title="hb_font_get_nominal_glyph_func_t ()"><span class="type">hb_font_get_nominal_glyph_func_t</span></a> func</code></em>,
+                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-nominal-glyph-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-2-3.html#api-index-1.2.3">1.2.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-nominal-glyphs-func"></a><h3>hb_font_funcs_set_nominal_glyphs_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_nominal_glyphs_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                       <em class="parameter"><code><span class="type">hb_font_get_nominal_glyphs_func_t</span> func</code></em>,
+                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-nominal-glyphs-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-user-data"></a><h3>hb_font_funcs_set_user_data ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_funcs_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+                             <em class="parameter"><code><span class="type">void</span> *data</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-font-funcs-set-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-variation-glyph-func"></a><h3>hb_font_funcs_set_variation_glyph_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_variation_glyph_func
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-variation-glyph-func-t" title="hb_font_get_variation_glyph_func_t ()"><span class="type">hb_font_get_variation_glyph_func_t</span></a> func</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-variation-glyph-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-2-3.html#api-index-1.2.3">1.2.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-empty"></a><h3>hb_font_get_empty ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+hb_font_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-empty.returns"></a><h4>Returns</h4>
+<p> (transfer full)</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-face"></a><h3>hb_font_get_face ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+hb_font_get_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-face.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-face.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph"></a><h3>hb_font_get_glyph ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_get_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
+                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> variation_selector</code></em>,
+                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-advance-for-direction"></a><h3>hb_font_get_glyph_advance_for_direction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_get_glyph_advance_for_direction
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-advance-for-direction.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-advance-func-t"></a><h3>hb_font_get_glyph_advance_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+<span class="c_punctuation">(</span>*hb_font_get_glyph_advance_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                     <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                     <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-advances-for-direction"></a><h3>hb_font_get_glyph_advances_for_direction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_get_glyph_advances_for_direction
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> count</code></em>,
+                                <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *first_glyph</code></em>,
+                                <em class="parameter"><code><span class="type">unsigned </span> glyph_stride</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *first_advance</code></em>,
+                                <em class="parameter"><code><span class="type">unsigned </span> advance_stride</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-advances-for-direction.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-8-6.html#api-index-1.8.6">1.8.6</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-advances-func-t"></a><h3>hb_font_get_glyph_advances_func_t ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+<span class="c_punctuation">(</span>*hb_font_get_glyph_advances_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                      <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
+                                      <em class="parameter"><code>unsigned <span class="type">int</span> count</code></em>,
+                                      <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *first_glyph</code></em>,
+                                      <em class="parameter"><code><span class="type">unsigned </span> glyph_stride</code></em>,
+                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *first_advance</code></em>,
+                                      <em class="parameter"><code><span class="type">unsigned </span> advance_stride</code></em>,
+                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-contour-point"></a><h3>hb_font_get_glyph_contour_point ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_get_glyph_contour_point (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                 <em class="parameter"><code>unsigned <span class="type">int</span> point_index</code></em>,
+                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
+                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-contour-point.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-contour-point-for-origin"></a><h3>hb_font_get_glyph_contour_point_for_origin ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_get_glyph_contour_point_for_origin
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> point_index</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-contour-point-for-origin.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-contour-point-func-t"></a><h3>hb_font_get_glyph_contour_point_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+<span class="c_punctuation">(</span>*hb_font_get_glyph_contour_point_func_t<span class="c_punctuation">)</span>
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> point_index</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-extents"></a><h3>hb_font_get_glyph_extents ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_get_glyph_extents (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                           <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                           <em class="parameter"><code><span class="type">hb_glyph_extents_t</span> *extents</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-extents.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>extents</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-extents-for-origin"></a><h3>hb_font_get_glyph_extents_for_origin ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_get_glyph_extents_for_origin (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
+                                      <em class="parameter"><code><span class="type">hb_glyph_extents_t</span> *extents</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-extents-for-origin.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>extents</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-extents-func-t"></a><h3>hb_font_get_glyph_extents_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+<span class="c_punctuation">(</span>*hb_font_get_glyph_extents_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                     <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                     <em class="parameter"><code><span class="type">hb_glyph_extents_t</span> *extents</code></em>,
+                                     <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-from-name"></a><h3>hb_font_get_glyph_from_name ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_get_glyph_from_name (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                             <em class="parameter"><code>const <span class="type">char</span> *name</code></em>,
+                             <em class="parameter"><code><span class="type">int</span> len</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-from-name.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>name</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-from-name-func-t"></a><h3>hb_font_get_glyph_from_name_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+<span class="c_punctuation">(</span>*hb_font_get_glyph_from_name_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                       <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
+                                       <em class="parameter"><code>const <span class="type">char</span> *name</code></em>,
+                                       <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-h-advance"></a><h3>hb_font_get_glyph_h_advance ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+hb_font_get_glyph_h_advance (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-h-advance.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-h-advances"></a><h3>hb_font_get_glyph_h_advances ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_get_glyph_h_advances (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                              <em class="parameter"><code>unsigned <span class="type">int</span> count</code></em>,
+                              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *first_glyph</code></em>,
+                              <em class="parameter"><code><span class="type">unsigned </span> glyph_stride</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *first_advance</code></em>,
+                              <em class="parameter"><code><span class="type">unsigned </span> advance_stride</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-h-advances.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-8-6.html#api-index-1.8.6">1.8.6</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-h-origin"></a><h3>hb_font_get_glyph_h_origin ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_get_glyph_h_origin (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-h-origin.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-name"></a><h3>hb_font_get_glyph_name ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_get_glyph_name (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                        <em class="parameter"><code><span class="type">char</span> *name</code></em>,
+                        <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-name.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>name</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-name-func-t"></a><h3>hb_font_get_glyph_name_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+<span class="c_punctuation">(</span>*hb_font_get_glyph_name_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                  <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
+                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                  <em class="parameter"><code><span class="type">char</span> *name</code></em>,
+                                  <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>,
+                                  <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-origin-for-direction"></a><h3>hb_font_get_glyph_origin_for_direction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_get_glyph_origin_for_direction
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-origin-for-direction.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-origin-func-t"></a><h3>hb_font_get_glyph_origin_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+<span class="c_punctuation">(</span>*hb_font_get_glyph_origin_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                    <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>,
+                                    <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-v-advance"></a><h3>hb_font_get_glyph_v_advance ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+hb_font_get_glyph_v_advance (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-v-advance.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-v-advances"></a><h3>hb_font_get_glyph_v_advances ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_get_glyph_v_advances (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                              <em class="parameter"><code>unsigned <span class="type">int</span> count</code></em>,
+                              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *first_glyph</code></em>,
+                              <em class="parameter"><code><span class="type">unsigned </span> glyph_stride</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *first_advance</code></em>,
+                              <em class="parameter"><code><span class="type">unsigned </span> advance_stride</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-v-advances.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-8-6.html#api-index-1.8.6">1.8.6</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-v-origin"></a><h3>hb_font_get_glyph_v_origin ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_get_glyph_v_origin (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-glyph-v-origin.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-nominal-glyph"></a><h3>hb_font_get_nominal_glyph ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_get_nominal_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                           <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
+                           <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-nominal-glyph.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-2-3.html#api-index-1.2.3">1.2.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-nominal-glyph-func-t"></a><h3>hb_font_get_nominal_glyph_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+<span class="c_punctuation">(</span>*hb_font_get_nominal_glyph_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                     <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>,
+                                     <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-parent"></a><h3>hb_font_get_parent ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+hb_font_get_parent (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-parent.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-parent.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-ppem"></a><h3>hb_font_get_ppem ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_get_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                  <em class="parameter"><code>unsigned <span class="type">int</span> *x_ppem</code></em>,
+                  <em class="parameter"><code>unsigned <span class="type">int</span> *y_ppem</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-ppem.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x_ppem</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y_ppem</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-ptem"></a><h3>hb_font_get_ptem ()</h3>
+<pre class="programlisting"><span class="returnvalue">float</span>
+hb_font_get_ptem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p>Gets the "point size" of the font.  A value of 0 means unset.</p>
+<div class="refsect3">
+<a name="hb-font-get-ptem.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-ptem.returns"></a><h4>Returns</h4>
+<p> Point size.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-scale"></a><h3>hb_font_get_scale ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_get_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                   <em class="parameter"><code><span class="type">int</span> *x_scale</code></em>,
+                   <em class="parameter"><code><span class="type">int</span> *y_scale</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-scale.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x_scale</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y_scale</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-user-data"></a><h3>hb_font_get_user_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> *
+hb_font_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-font-get-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-user-data.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-variation-glyph"></a><h3>hb_font_get_variation_glyph ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_get_variation_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> variation_selector</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-variation-glyph.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-2-3.html#api-index-1.2.3">1.2.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-variation-glyph-func-t"></a><h3>hb_font_get_variation_glyph_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+<span class="c_punctuation">(</span>*hb_font_get_variation_glyph_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                       <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> variation_selector</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>,
+                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-var-coords-normalized"></a><h3>hb_font_get_var_coords_normalized ()</h3>
+<pre class="programlisting">const <span class="returnvalue">int</span> *
+hb_font_get_var_coords_normalized (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                   <em class="parameter"><code>unsigned <span class="type">int</span> *length</code></em>);</pre>
+<p>Return value is valid as long as variation coordinates of the font
+are not modified.</p>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-glyph-from-string"></a><h3>hb_font_glyph_from_string ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_glyph_from_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                           <em class="parameter"><code>const <span class="type">char</span> *s</code></em>,
+                           <em class="parameter"><code><span class="type">int</span> len</code></em>,
+                           <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-glyph-from-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>s</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-glyph-to-string"></a><h3>hb_font_glyph_to_string ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_glyph_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                         <em class="parameter"><code><span class="type">char</span> *s</code></em>,
+                         <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-glyph-to-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>s</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-is-immutable"></a><h3>hb_font_is_immutable ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-is-immutable.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-make-immutable"></a><h3>hb_font_make_immutable ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-make-immutable.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-reference"></a><h3>hb_font_reference ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+hb_font_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-font-reference.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-reference.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-set-face"></a><h3>hb_font_set_face ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_set_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Sets font-face of <em class="parameter"><code>font</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-font-set-face.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>new face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-4-3.html#api-index-1.4.3">1.4.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-set-funcs"></a><h3>hb_font_set_funcs ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_set_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *klass</code></em>,
+                   <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
+                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-set-funcs.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>klass</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> font_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-set-funcs-data"></a><h3>hb_font_set_funcs_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_set_funcs_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                        <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
+                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-set-funcs-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-set-parent"></a><h3>hb_font_set_parent ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_set_parent (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *parent</code></em>);</pre>
+<p>Sets parent font of <em class="parameter"><code>font</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-font-set-parent.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>parent</p></td>
+<td class="parameter_description"><p>new parent.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-0-5.html#api-index-1.0.5">1.0.5</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-set-ppem"></a><h3>hb_font_set_ppem ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_set_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                  <em class="parameter"><code>unsigned <span class="type">int</span> x_ppem</code></em>,
+                  <em class="parameter"><code>unsigned <span class="type">int</span> y_ppem</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-set-ppem.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-set-ptem"></a><h3>hb_font_set_ptem ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_set_ptem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                  <em class="parameter"><code><span class="type">float</span> ptem</code></em>);</pre>
+<p>Sets "point size" of the font.  Set to 0 to unset.</p>
+<p>There are 72 points in an inch.</p>
+<div class="refsect3">
+<a name="hb-font-set-ptem.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>ptem</p></td>
+<td class="parameter_description"><p>font size in points.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-6-0.html#api-index-1.6.0">1.6.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-set-scale"></a><h3>hb_font_set_scale ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_set_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                   <em class="parameter"><code><span class="type">int</span> x_scale</code></em>,
+                   <em class="parameter"><code><span class="type">int</span> y_scale</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-set-scale.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-set-user-data"></a><h3>hb_font_set_user_data ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+                       <em class="parameter"><code><span class="type">void</span> *data</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-font-set-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-variation-from-string"></a><h3>hb_variation_from_string ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_variation_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
+                          <em class="parameter"><code><span class="type">int</span> len</code></em>,
+                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a> *variation</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-variation-to-string"></a><h3>hb_variation_to_string ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_variation_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a> *variation</code></em>,
+                        <em class="parameter"><code><span class="type">char</span> *buf</code></em>,
+                        <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-set-variations"></a><h3>hb_font_set_variations ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_set_variations (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                        <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-font.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a> *variations</code></em>,
+                        <em class="parameter"><code>unsigned <span class="type">int</span> variations_length</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-set-var-coords-design"></a><h3>hb_font_set_var_coords_design ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_set_var_coords_design (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                               <em class="parameter"><code>const <span class="type">float</span> *coords</code></em>,
+                               <em class="parameter"><code>unsigned <span class="type">int</span> coords_length</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-set-var-coords-normalized"></a><h3>hb_font_set_var_coords_normalized ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_set_var_coords_normalized (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                   <em class="parameter"><code>const <span class="type">int</span> *coords</code></em>,
+                                   <em class="parameter"><code>unsigned <span class="type">int</span> coords_length</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-subtract-glyph-origin-for-direction"></a><h3>hb_font_subtract_glyph_origin_for_direction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_subtract_glyph_origin_for_direction
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-subtract-glyph-origin-for-direction.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-reference-table-func-t"></a><h3>hb_reference_table_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<span class="c_punctuation">(</span>*hb_reference_table_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>,
+                              <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-font-h-extents-func"></a><h3>hb_font_funcs_set_font_h_extents_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_font_h_extents_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-font-h-extents-func-t" title="hb_font_get_font_h_extents_func_t"><span class="type">hb_font_get_font_h_extents_func_t</span></a> func</code></em>,
+                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-font-h-extents-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-1-2.html#api-index-1.1.2">1.1.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-funcs-set-font-v-extents-func"></a><h3>hb_font_funcs_set_font_v_extents_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_funcs_set_font_v_extents_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-font-v-extents-func-t" title="hb_font_get_font_v_extents_func_t"><span class="type">hb_font_get_font_v_extents_func_t</span></a> func</code></em>,
+                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-funcs-set-font-v-extents-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ffuncs</p></td>
+<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-1-2.html#api-index-1.1.2">1.1.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-extents-for-direction"></a><h3>hb_font_get_extents_for_direction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_get_extents_for_direction (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
+                                   <em class="parameter"><code><span class="type">hb_font_extents_t</span> *extents</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-extents-for-direction.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>extents</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-1-3.html#api-index-1.1.3">1.1.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-font-extents-func-t"></a><h3>hb_font_get_font_extents_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+<span class="c_punctuation">(</span>*hb_font_get_font_extents_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                    <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
+                                    <em class="parameter"><code><span class="type">hb_font_extents_t</span> *extents</code></em>,
+                                    <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-h-extents"></a><h3>hb_font_get_h_extents ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_get_h_extents (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                       <em class="parameter"><code><span class="type">hb_font_extents_t</span> *extents</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-h-extents.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>extents</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-1-3.html#api-index-1.1.3">1.1.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-v-extents"></a><h3>hb_font_get_v_extents ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_font_get_v_extents (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                       <em class="parameter"><code><span class="type">hb_font_extents_t</span> *extents</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-font-get-v-extents.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>extents</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-1-3.html#api-index-1.1.3">1.1.3</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-font.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="hb-font-funcs-t"></a><h3>hb_font_funcs_t</h3>
+<pre class="programlisting">typedef struct hb_font_funcs_t hb_font_funcs_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-h-advance-func-t"></a><h3>hb_font_get_glyph_h_advance_func_t</h3>
+<pre class="programlisting">typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_h_advance_func_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-h-advances-func-t"></a><h3>hb_font_get_glyph_h_advances_func_t</h3>
+<pre class="programlisting">typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_h_advances_func_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-h-origin-func-t"></a><h3>hb_font_get_glyph_h_origin_func_t</h3>
+<pre class="programlisting">typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_h_origin_func_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-v-advance-func-t"></a><h3>hb_font_get_glyph_v_advance_func_t</h3>
+<pre class="programlisting">typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_v_advance_func_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-v-advances-func-t"></a><h3>hb_font_get_glyph_v_advances_func_t</h3>
+<pre class="programlisting">typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_v_advances_func_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-glyph-v-origin-func-t"></a><h3>hb_font_get_glyph_v_origin_func_t</h3>
+<pre class="programlisting">typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_v_origin_func_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-variation-t"></a><h3>hb_variation_t</h3>
+<pre class="programlisting">typedef struct {
+  hb_tag_t tag;
+  float    value;
+} hb_variation_t;
+</pre>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-t"></a><h3>hb_font_t</h3>
+<pre class="programlisting">typedef struct hb_font_t hb_font_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-font-h-extents-func-t"></a><h3>hb_font_get_font_h_extents_func_t</h3>
+<pre class="programlisting">typedef hb_font_get_font_extents_func_t hb_font_get_font_h_extents_func_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-get-font-v-extents-func-t"></a><h3>hb_font_get_font_v_extents_func_t</h3>
+<pre class="programlisting">typedef hb_font_get_font_extents_func_t hb_font_get_font_v_extents_func_t;
+</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ft.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ft.html
new file mode 100644
index 0000000..79f3331
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ft.html
@@ -0,0 +1,269 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-ft: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch12.html" title="Integration API">
+<link rel="prev" href="harfbuzz-hb-coretext.html" title="hb-coretext">
+<link rel="next" href="harfbuzz-hb-glib.html" title="hb-glib">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-ft.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-coretext.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-glib.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-ft"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-ft.top_of_page"></a>hb-ft</span></h2>
+<p>hb-ft — FreeType integration</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ft.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create" title="hb_ft_face_create ()">hb_ft_face_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create-cached" title="hb_ft_face_create_cached ()">hb_ft_face_create_cached</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create-referenced" title="hb_ft_face_create_referenced ()">hb_ft_face_create_referenced</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create" title="hb_ft_font_create ()">hb_ft_font_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create-referenced" title="hb_ft_font_create_referenced ()">hb_ft_font_create_referenced</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-changed" title="hb_ft_font_changed ()">hb_ft_font_changed</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">FT_Face</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-get-face" title="hb_ft_font_get_face ()">hb_ft_font_get_face</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-set-load-flags" title="hb_ft_font_set_load_flags ()">hb_ft_font_set_load_flags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-get-load-flags" title="hb_ft_font_get_load_flags ()">hb_ft_font_get_load_flags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-set-funcs" title="hb_ft_font_set_funcs ()">hb_ft_font_set_funcs</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ft.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-ft.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ft.description"></a><h2>Description</h2>
+<p>Functions for using HarfBuzz with the FreeType library to provide face and
+font data.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ft.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-ft-face-create"></a><h3>hb_ft_face_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+hb_ft_face_create (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</code></em>,
+                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ft-face-create.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ft_face</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ft-face-create.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ft-face-create-cached"></a><h3>hb_ft_face_create_cached ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+hb_ft_face_create_cached (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ft-face-create-cached.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ft-face-create-referenced"></a><h3>hb_ft_face_create_referenced ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+hb_ft_face_create_referenced (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ft-face-create-referenced.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-38.html#api-index-0.9.38">0.9.38</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ft-font-create"></a><h3>hb_ft_font_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+hb_ft_font_create (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</code></em>,
+                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ft-font-create.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ft_face</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ft-font-create.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ft-font-create-referenced"></a><h3>hb_ft_font_create_referenced ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+hb_ft_font_create_referenced (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ft-font-create-referenced.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-38.html#api-index-0.9.38">0.9.38</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ft-font-changed"></a><h3>hb_ft_font_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ft_font_changed (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ft-font-get-face"></a><h3>hb_ft_font_get_face ()</h3>
+<pre class="programlisting"><span class="returnvalue">FT_Face</span>
+hb_ft_font_get_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ft-font-set-load-flags"></a><h3>hb_ft_font_set_load_flags ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ft_font_set_load_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                           <em class="parameter"><code><span class="type">int</span> load_flags</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-1-0-5.html#api-index-1.0.5">1.0.5</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ft-font-get-load-flags"></a><h3>hb_ft_font_get_load_flags ()</h3>
+<pre class="programlisting"><span class="returnvalue">int</span>
+hb_ft_font_get_load_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-1-0-5.html#api-index-1.0.5">1.0.5</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ft-font-set-funcs"></a><h3>hb_ft_font_set_funcs ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ft_font_set_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ft.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-glib.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-glib.html
new file mode 100644
index 0000000..b4f56a48
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-glib.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-glib: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch12.html" title="Integration API">
+<link rel="prev" href="harfbuzz-hb-ft.html" title="hb-ft">
+<link rel="next" href="harfbuzz-hb-gobject.html" title="hb-gobject">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-glib.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-ft.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-gobject.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-glib"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-glib.top_of_page"></a>hb-glib</span></h2>
+<p>hb-glib — GLib integration</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-glib.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-glib.html#hb-glib-get-unicode-funcs" title="hb_glib_get_unicode_funcs ()">hb_glib_get_unicode_funcs</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GUnicodeScript</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-glib.html#hb-glib-script-from-script" title="hb_glib_script_from_script ()">hb_glib_script_from_script</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-glib.html#hb-glib-script-to-script" title="hb_glib_script_to_script ()">hb_glib_script_to_script</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-glib.html#hb-glib-blob-create" title="hb_glib_blob_create ()">hb_glib_blob_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-glib.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-glib.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-glib.description"></a><h2>Description</h2>
+<p>Functions for using HarfBuzz with the GLib library to provide Unicode data.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-glib.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-glib-get-unicode-funcs"></a><h3>hb_glib_get_unicode_funcs ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+hb_glib_get_unicode_funcs (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-glib-script-from-script"></a><h3>hb_glib_script_from_script ()</h3>
+<pre class="programlisting"><span class="returnvalue">GUnicodeScript</span>
+hb_glib_script_from_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-glib-script-to-script"></a><h3>hb_glib_script_to_script ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+hb_glib_script_to_script (<em class="parameter"><code><span class="type">GUnicodeScript</span> script</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-glib-blob-create"></a><h3>hb_glib_blob_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+hb_glib_blob_create (<em class="parameter"><code><span class="type">GBytes</span> *gbytes</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-38.html#api-index-0.9.38">0.9.38</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-glib.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-gobject.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-gobject.html
new file mode 100644
index 0000000..9e1a2a1
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-gobject.html
@@ -0,0 +1,884 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-gobject: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch12.html" title="Integration API">
+<link rel="prev" href="harfbuzz-hb-glib.html" title="hb-glib">
+<link rel="next" href="harfbuzz-hb-graphite2.html" title="hb-graphite2">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-gobject.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-glib.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-graphite2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-gobject"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-gobject.top_of_page"></a>hb-gobject</span></h2>
+<p>hb-gobject — GObject integration</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-gobject.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-blob-get-type" title="hb_gobject_blob_get_type ()">hb_gobject_blob_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-content-type-get-type" title="hb_gobject_buffer_content_type_get_type ()">hb_gobject_buffer_content_type_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-diff-flags-get-type" title="hb_gobject_buffer_diff_flags_get_type ()">hb_gobject_buffer_diff_flags_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-flags-get-type" title="hb_gobject_buffer_flags_get_type ()">hb_gobject_buffer_flags_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-get-type" title="hb_gobject_buffer_get_type ()">hb_gobject_buffer_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-serialize-flags-get-type" title="hb_gobject_buffer_serialize_flags_get_type ()">hb_gobject_buffer_serialize_flags_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-serialize-format-get-type" title="hb_gobject_buffer_serialize_format_get_type ()">hb_gobject_buffer_serialize_format_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-direction-get-type" title="hb_gobject_direction_get_type ()">hb_gobject_direction_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-face-get-type" title="hb_gobject_face_get_type ()">hb_gobject_face_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-font-funcs-get-type" title="hb_gobject_font_funcs_get_type ()">hb_gobject_font_funcs_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-font-get-type" title="hb_gobject_font_get_type ()">hb_gobject_font_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-glyph-flags-get-type" title="hb_gobject_glyph_flags_get_type ()">hb_gobject_glyph_flags_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-map-get-type" title="hb_gobject_map_get_type ()">hb_gobject_map_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-memory-mode-get-type" title="hb_gobject_memory_mode_get_type ()">hb_gobject_memory_mode_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-color-palette-flags-get-type" title="hb_gobject_ot_color_palette_flags_get_type ()">hb_gobject_ot_color_palette_flags_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-layout-glyph-class-get-type" title="hb_gobject_ot_layout_glyph_class_get_type ()">hb_gobject_ot_layout_glyph_class_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-constant-get-type" title="hb_gobject_ot_math_constant_get_type ()">hb_gobject_ot_math_constant_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-part-get-type" title="hb_gobject_ot_math_glyph_part_get_type ()">hb_gobject_ot_math_glyph_part_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-part-flags-get-type" title="hb_gobject_ot_math_glyph_part_flags_get_type ()">hb_gobject_ot_math_glyph_part_flags_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-variant-get-type" title="hb_gobject_ot_math_glyph_variant_get_type ()">hb_gobject_ot_math_glyph_variant_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-kern-get-type" title="hb_gobject_ot_math_kern_get_type ()">hb_gobject_ot_math_kern_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-script-get-type" title="hb_gobject_script_get_type ()">hb_gobject_script_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-shape-plan-get-type" title="hb_gobject_shape_plan_get_type ()">hb_gobject_shape_plan_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-unicode-combining-class-get-type" title="hb_gobject_unicode_combining_class_get_type ()">hb_gobject_unicode_combining_class_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-unicode-funcs-get-type" title="hb_gobject_unicode_funcs_get_type ()">hb_gobject_unicode_funcs_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-unicode-general-category-get-type" title="hb_gobject_unicode_general_category_get_type ()">hb_gobject_unicode_general_category_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-cluster-level-get-type" title="hb_gobject_buffer_cluster_level_get_type ()">hb_gobject_buffer_cluster_level_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-feature-get-type" title="hb_gobject_feature_get_type ()">hb_gobject_feature_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-glyph-info-get-type" title="hb_gobject_glyph_info_get_type ()">hb_gobject_glyph_info_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-glyph-position-get-type" title="hb_gobject_glyph_position_get_type ()">hb_gobject_glyph_position_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-segment-properties-get-type" title="hb_gobject_segment_properties_get_type ()">hb_gobject_segment_properties_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-set-get-type" title="hb_gobject_set_get_type ()">hb_gobject_set_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GType</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-user-data-key-get-type" title="hb_gobject_user_data_key_get_type ()">hb_gobject_user_data_key_get_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-gobject.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BLOB:CAPS" title="HB_GOBJECT_TYPE_BLOB">HB_GOBJECT_TYPE_BLOB</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER:CAPS" title="HB_GOBJECT_TYPE_BUFFER">HB_GOBJECT_TYPE_BUFFER</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-CONTENT-TYPE:CAPS" title="HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE">HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-DIFF-FLAGS:CAPS" title="HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS">HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-FLAGS:CAPS" title="HB_GOBJECT_TYPE_BUFFER_FLAGS">HB_GOBJECT_TYPE_BUFFER_FLAGS</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FLAGS:CAPS" title="HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS">HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FORMAT:CAPS" title="HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT">HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-DIRECTION:CAPS" title="HB_GOBJECT_TYPE_DIRECTION">HB_GOBJECT_TYPE_DIRECTION</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FACE:CAPS" title="HB_GOBJECT_TYPE_FACE">HB_GOBJECT_TYPE_FACE</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FONT:CAPS" title="HB_GOBJECT_TYPE_FONT">HB_GOBJECT_TYPE_FONT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FONT-FUNCS:CAPS" title="HB_GOBJECT_TYPE_FONT_FUNCS">HB_GOBJECT_TYPE_FONT_FUNCS</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-FLAGS:CAPS" title="HB_GOBJECT_TYPE_GLYPH_FLAGS">HB_GOBJECT_TYPE_GLYPH_FLAGS</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-MAP:CAPS" title="HB_GOBJECT_TYPE_MAP">HB_GOBJECT_TYPE_MAP</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-MEMORY-MODE:CAPS" title="HB_GOBJECT_TYPE_MEMORY_MODE">HB_GOBJECT_TYPE_MEMORY_MODE</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-COLOR-PALETTE-FLAGS:CAPS" title="HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS">HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-LAYOUT-GLYPH-CLASS:CAPS" title="HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS">HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-CONSTANT:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_CONSTANT">HB_GOBJECT_TYPE_OT_MATH_CONSTANT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART">HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART-FLAGS:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS">HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-VARIANT:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT">HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-KERN:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_KERN">HB_GOBJECT_TYPE_OT_MATH_KERN</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SCRIPT:CAPS" title="HB_GOBJECT_TYPE_SCRIPT">HB_GOBJECT_TYPE_SCRIPT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SHAPE-PLAN:CAPS" title="HB_GOBJECT_TYPE_SHAPE_PLAN">HB_GOBJECT_TYPE_SHAPE_PLAN</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-COMBINING-CLASS:CAPS" title="HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS">HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-FUNCS:CAPS" title="HB_GOBJECT_TYPE_UNICODE_FUNCS">HB_GOBJECT_TYPE_UNICODE_FUNCS</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-GENERAL-CATEGORY:CAPS" title="HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY">HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-CLUSTER-LEVEL:CAPS" title="HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL">HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FEATURE:CAPS" title="HB_GOBJECT_TYPE_FEATURE">HB_GOBJECT_TYPE_FEATURE</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-INFO:CAPS" title="HB_GOBJECT_TYPE_GLYPH_INFO">HB_GOBJECT_TYPE_GLYPH_INFO</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-POSITION:CAPS" title="HB_GOBJECT_TYPE_GLYPH_POSITION">HB_GOBJECT_TYPE_GLYPH_POSITION</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SEGMENT-PROPERTIES:CAPS" title="HB_GOBJECT_TYPE_SEGMENT_PROPERTIES">HB_GOBJECT_TYPE_SEGMENT_PROPERTIES</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SET:CAPS" title="HB_GOBJECT_TYPE_SET">HB_GOBJECT_TYPE_SET</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-USER-DATA-KEY:CAPS" title="HB_GOBJECT_TYPE_USER_DATA_KEY">HB_GOBJECT_TYPE_USER_DATA_KEY</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-gobject.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-gobject.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-gobject.description"></a><h2>Description</h2>
+<p>Functions for using HarfBuzz with the GObject library to provide
+type data.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-gobject.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-gobject-blob-get-type"></a><h3>hb_gobject_blob_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_blob_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-buffer-content-type-get-type"></a><h3>hb_gobject_buffer_content_type_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_buffer_content_type_get_type
+                               ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-buffer-diff-flags-get-type"></a><h3>hb_gobject_buffer_diff_flags_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_buffer_diff_flags_get_type ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-buffer-flags-get-type"></a><h3>hb_gobject_buffer_flags_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_buffer_flags_get_type ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-buffer-get-type"></a><h3>hb_gobject_buffer_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_buffer_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-buffer-serialize-flags-get-type"></a><h3>hb_gobject_buffer_serialize_flags_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_buffer_serialize_flags_get_type
+                               ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-buffer-serialize-format-get-type"></a><h3>hb_gobject_buffer_serialize_format_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_buffer_serialize_format_get_type
+                               ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-direction-get-type"></a><h3>hb_gobject_direction_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_direction_get_type ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-face-get-type"></a><h3>hb_gobject_face_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_face_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-font-funcs-get-type"></a><h3>hb_gobject_font_funcs_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_font_funcs_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-font-get-type"></a><h3>hb_gobject_font_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_font_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-glyph-flags-get-type"></a><h3>hb_gobject_glyph_flags_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_glyph_flags_get_type ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-map-get-type"></a><h3>hb_gobject_map_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_map_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-memory-mode-get-type"></a><h3>hb_gobject_memory_mode_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_memory_mode_get_type ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-ot-color-palette-flags-get-type"></a><h3>hb_gobject_ot_color_palette_flags_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_ot_color_palette_flags_get_type
+                               ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-ot-layout-glyph-class-get-type"></a><h3>hb_gobject_ot_layout_glyph_class_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_ot_layout_glyph_class_get_type
+                               ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-ot-math-constant-get-type"></a><h3>hb_gobject_ot_math_constant_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_ot_math_constant_get_type ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-ot-math-glyph-part-get-type"></a><h3>hb_gobject_ot_math_glyph_part_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_ot_math_glyph_part_get_type
+                               (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-ot-math-glyph-part-flags-get-type"></a><h3>hb_gobject_ot_math_glyph_part_flags_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_ot_math_glyph_part_flags_get_type
+                               ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-ot-math-glyph-variant-get-type"></a><h3>hb_gobject_ot_math_glyph_variant_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_ot_math_glyph_variant_get_type
+                               (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-ot-math-kern-get-type"></a><h3>hb_gobject_ot_math_kern_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_ot_math_kern_get_type ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-script-get-type"></a><h3>hb_gobject_script_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_script_get_type ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-shape-plan-get-type"></a><h3>hb_gobject_shape_plan_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_shape_plan_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-unicode-combining-class-get-type"></a><h3>hb_gobject_unicode_combining_class_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_unicode_combining_class_get_type
+                               ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-unicode-funcs-get-type"></a><h3>hb_gobject_unicode_funcs_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_unicode_funcs_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-unicode-general-category-get-type"></a><h3>hb_gobject_unicode_general_category_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_unicode_general_category_get_type
+                               ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-buffer-cluster-level-get-type"></a><h3>hb_gobject_buffer_cluster_level_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_buffer_cluster_level_get_type
+                               ();</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-feature-get-type"></a><h3>hb_gobject_feature_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_feature_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-glyph-info-get-type"></a><h3>hb_gobject_glyph_info_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_glyph_info_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-glyph-position-get-type"></a><h3>hb_gobject_glyph_position_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_glyph_position_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-segment-properties-get-type"></a><h3>hb_gobject_segment_properties_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_segment_properties_get_type
+                               (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-set-get-type"></a><h3>hb_gobject_set_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_set_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-gobject-user-data-key-get-type"></a><h3>hb_gobject_user_data_key_get_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">GType</span>
+hb_gobject_user_data_key_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-gobject.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-BLOB:CAPS"></a><h3>HB_GOBJECT_TYPE_BLOB</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_BLOB (hb_gobject_blob_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-BUFFER:CAPS"></a><h3>HB_GOBJECT_TYPE_BUFFER</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_BUFFER (hb_gobject_buffer_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-BUFFER-CONTENT-TYPE:CAPS"></a><h3>HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE (hb_gobject_buffer_content_type_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-BUFFER-DIFF-FLAGS:CAPS"></a><h3>HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS (hb_gobject_buffer_diff_flags_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-BUFFER-FLAGS:CAPS"></a><h3>HB_GOBJECT_TYPE_BUFFER_FLAGS</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_BUFFER_FLAGS (hb_gobject_buffer_flags_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FLAGS:CAPS"></a><h3>HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS (hb_gobject_buffer_serialize_flags_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FORMAT:CAPS"></a><h3>HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT (hb_gobject_buffer_serialize_format_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-DIRECTION:CAPS"></a><h3>HB_GOBJECT_TYPE_DIRECTION</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_DIRECTION (hb_gobject_direction_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-FACE:CAPS"></a><h3>HB_GOBJECT_TYPE_FACE</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_FACE (hb_gobject_face_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-FONT:CAPS"></a><h3>HB_GOBJECT_TYPE_FONT</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_FONT (hb_gobject_font_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-FONT-FUNCS:CAPS"></a><h3>HB_GOBJECT_TYPE_FONT_FUNCS</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_FONT_FUNCS (hb_gobject_font_funcs_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-GLYPH-FLAGS:CAPS"></a><h3>HB_GOBJECT_TYPE_GLYPH_FLAGS</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_GLYPH_FLAGS (hb_gobject_glyph_flags_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-MAP:CAPS"></a><h3>HB_GOBJECT_TYPE_MAP</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_MAP (hb_gobject_map_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-MEMORY-MODE:CAPS"></a><h3>HB_GOBJECT_TYPE_MEMORY_MODE</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_MEMORY_MODE (hb_gobject_memory_mode_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-OT-COLOR-PALETTE-FLAGS:CAPS"></a><h3>HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS (hb_gobject_ot_color_palette_flags_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-OT-LAYOUT-GLYPH-CLASS:CAPS"></a><h3>HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS (hb_gobject_ot_layout_glyph_class_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-OT-MATH-CONSTANT:CAPS"></a><h3>HB_GOBJECT_TYPE_OT_MATH_CONSTANT</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_OT_MATH_CONSTANT (hb_gobject_ot_math_constant_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART:CAPS"></a><h3>HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART (hb_gobject_ot_math_glyph_part_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART-FLAGS:CAPS"></a><h3>HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS (hb_gobject_ot_math_glyph_part_flags_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-OT-MATH-GLYPH-VARIANT:CAPS"></a><h3>HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT (hb_gobject_ot_math_glyph_variant_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-OT-MATH-KERN:CAPS"></a><h3>HB_GOBJECT_TYPE_OT_MATH_KERN</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_OT_MATH_KERN (hb_gobject_ot_math_kern_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-SCRIPT:CAPS"></a><h3>HB_GOBJECT_TYPE_SCRIPT</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_SCRIPT (hb_gobject_script_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-SHAPE-PLAN:CAPS"></a><h3>HB_GOBJECT_TYPE_SHAPE_PLAN</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_SHAPE_PLAN (hb_gobject_shape_plan_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-UNICODE-COMBINING-CLASS:CAPS"></a><h3>HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS (hb_gobject_unicode_combining_class_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-UNICODE-FUNCS:CAPS"></a><h3>HB_GOBJECT_TYPE_UNICODE_FUNCS</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_UNICODE_FUNCS (hb_gobject_unicode_funcs_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-UNICODE-GENERAL-CATEGORY:CAPS"></a><h3>HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY (hb_gobject_unicode_general_category_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-BUFFER-CLUSTER-LEVEL:CAPS"></a><h3>HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL (hb_gobject_buffer_cluster_level_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-FEATURE:CAPS"></a><h3>HB_GOBJECT_TYPE_FEATURE</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_FEATURE (hb_gobject_feature_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-GLYPH-INFO:CAPS"></a><h3>HB_GOBJECT_TYPE_GLYPH_INFO</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_GLYPH_INFO (hb_gobject_glyph_info_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-GLYPH-POSITION:CAPS"></a><h3>HB_GOBJECT_TYPE_GLYPH_POSITION</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_GLYPH_POSITION (hb_gobject_glyph_position_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-SEGMENT-PROPERTIES:CAPS"></a><h3>HB_GOBJECT_TYPE_SEGMENT_PROPERTIES</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_SEGMENT_PROPERTIES (hb_gobject_segment_properties_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-SET:CAPS"></a><h3>HB_GOBJECT_TYPE_SET</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_SET (hb_gobject_set_get_type ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-GOBJECT-TYPE-USER-DATA-KEY:CAPS"></a><h3>HB_GOBJECT_TYPE_USER_DATA_KEY</h3>
+<pre class="programlisting">#define HB_GOBJECT_TYPE_USER_DATA_KEY (hb_gobject_user_data_key_get_type ())
+</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-graphite2.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-graphite2.html
new file mode 100644
index 0000000..2fdd621
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-graphite2.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-graphite2: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch12.html" title="Integration API">
+<link rel="prev" href="harfbuzz-hb-gobject.html" title="hb-gobject">
+<link rel="next" href="harfbuzz-hb-icu.html" title="hb-icu">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-graphite2.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-gobject.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-icu.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-graphite2"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-graphite2.top_of_page"></a>hb-graphite2</span></h2>
+<p>hb-graphite2 — Graphite2 integration</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-graphite2.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody><tr>
+<td class="function_type">
+<span class="returnvalue">gr_face</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-graphite2.html#hb-graphite2-face-get-gr-face" title="hb_graphite2_face_get_gr_face ()">hb_graphite2_face_get_gr_face</a> <span class="c_punctuation">()</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-graphite2.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody><tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-graphite2.html#HB-GRAPHITE2-TAG-SILF:CAPS" title="HB_GRAPHITE2_TAG_SILF">HB_GRAPHITE2_TAG_SILF</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-graphite2.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-graphite2.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-graphite2.description"></a><h2>Description</h2>
+<p>Functions for using HarfBuzz with the Graphite2 fonts.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-graphite2.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-graphite2-face-get-gr-face"></a><h3>hb_graphite2_face_get_gr_face ()</h3>
+<pre class="programlisting"><span class="returnvalue">gr_face</span> *
+hb_graphite2_face_get_gr_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-graphite2.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="HB-GRAPHITE2-TAG-SILF:CAPS"></a><h3>HB_GRAPHITE2_TAG_SILF</h3>
+<pre class="programlisting">#define HB_GRAPHITE2_TAG_SILF HB_TAG('S','i','l','f')
+</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-icu.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-icu.html
new file mode 100644
index 0000000..68fa6aa
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-icu.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-icu: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch12.html" title="Integration API">
+<link rel="prev" href="harfbuzz-hb-graphite2.html" title="hb-graphite2">
+<link rel="next" href="harfbuzz-hb-uniscribe.html" title="hb-uniscribe">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-icu.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-graphite2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-uniscribe.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-icu"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-icu.top_of_page"></a>hb-icu</span></h2>
+<p>hb-icu — ICU integration</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-icu.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-icu.html#hb-icu-get-unicode-funcs" title="hb_icu_get_unicode_funcs ()">hb_icu_get_unicode_funcs</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">UScriptCode</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-icu.html#hb-icu-script-from-script" title="hb_icu_script_from_script ()">hb_icu_script_from_script</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-icu.html#hb-icu-script-to-script" title="hb_icu_script_to_script ()">hb_icu_script_to_script</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-icu.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-icu.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-icu.description"></a><h2>Description</h2>
+<p>Functions for using HarfBuzz with the ICU library to provide Unicode data.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-icu.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-icu-get-unicode-funcs"></a><h3>hb_icu_get_unicode_funcs ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+hb_icu_get_unicode_funcs (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-icu-script-from-script"></a><h3>hb_icu_script_from_script ()</h3>
+<pre class="programlisting"><span class="returnvalue">UScriptCode</span>
+hb_icu_script_from_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-icu-script-to-script"></a><h3>hb_icu_script_to_script ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+hb_icu_script_to_script (<em class="parameter"><code><span class="type">UScriptCode</span> script</code></em>);</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-icu.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-map.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-map.html
new file mode 100644
index 0000000..d5f0e4b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-map.html
@@ -0,0 +1,526 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-map: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch09.html" title="Core API">
+<link rel="prev" href="harfbuzz-hb-font.html" title="hb-font">
+<link rel="next" href="harfbuzz-hb-set.html" title="hb-set">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-map.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-map.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch09.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-font.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-set.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-map"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-map.top_of_page"></a>hb-map</span></h2>
+<p>hb-map — Object representing integer to integer mapping</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-map.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-allocation-successful" title="hb_map_allocation_successful ()">hb_map_allocation_successful</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-clear" title="hb_map_clear ()">hb_map_clear</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="returnvalue">hb_map_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-create" title="hb_map_create ()">hb_map_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-del" title="hb_map_del ()">hb_map_del</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-destroy" title="hb_map_destroy ()">hb_map_destroy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get" title="hb_map_get ()">hb_map_get</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="returnvalue">hb_map_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get-empty" title="hb_map_get_empty ()">hb_map_get_empty</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get-population" title="hb_map_get_population ()">hb_map_get_population</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get-user-data" title="hb_map_get_user_data ()">hb_map_get_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-has" title="hb_map_has ()">hb_map_has</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-is-empty" title="hb_map_is_empty ()">hb_map_is_empty</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="returnvalue">hb_map_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-reference" title="hb_map_reference ()">hb_map_reference</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-set" title="hb_map_set ()">hb_map_set</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-map.html#hb-map-set-user-data" title="hb_map_set_user_data ()">hb_map_set_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="hb-map-t"></a><div class="refsect1">
+<a name="harfbuzz-hb-map.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-map.html#HB-MAP-VALUE-INVALID:CAPS" title="HB_MAP_VALUE_INVALID">HB_MAP_VALUE_INVALID</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-map.html#hb-map-t">hb_map_t</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-map.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
+    <span class="lineart">╰──</span> hb_map_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-map.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-map.description"></a><h2>Description</h2>
+<p>Map objects are integer-to-integer hash-maps.  Currently they are
+not used in the HarfBuzz public API, but are provided for client's
+use if desired.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-map.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-map-allocation-successful"></a><h3>hb_map_allocation_successful ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_map_allocation_successful (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-map-allocation-successful.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>map</p></td>
+<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-map-clear"></a><h3>hb_map_clear ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_map_clear (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-map-clear.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>map</p></td>
+<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-map-create"></a><h3>hb_map_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="returnvalue">hb_map_t</span></a> *
+hb_map_create (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p><span class="annotation">[Xconstructor]</span></p>
+<div class="refsect3">
+<a name="hb-map-create.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-map-del"></a><h3>hb_map_del ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_map_del (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>,
+            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> key</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-map-del.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>map</p></td>
+<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-map-destroy"></a><h3>hb_map_destroy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_map_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-map-destroy.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>map</p></td>
+<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-map-get"></a><h3>hb_map_get ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+hb_map_get (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>,
+            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> key</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-map-get.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>map</p></td>
+<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-map-get-empty"></a><h3>hb_map_get_empty ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="returnvalue">hb_map_t</span></a> *
+hb_map_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<div class="refsect3">
+<a name="hb-map-get-empty.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-map-get-population"></a><h3>hb_map_get_population ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_map_get_population (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-map-get-population.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>map</p></td>
+<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-map-get-user-data"></a><h3>hb_map_get_user_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> *
+hb_map_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-map-get-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>map</p></td>
+<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-map-get-user-data.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-map-has"></a><h3>hb_map_has ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_map_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>,
+            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> key</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-map-has.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>map</p></td>
+<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-map-is-empty"></a><h3>hb_map_is_empty ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_map_is_empty (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-map-is-empty.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>map</p></td>
+<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-map-reference"></a><h3>hb_map_reference ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="returnvalue">hb_map_t</span></a> *
+hb_map_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-map-reference.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>map</p></td>
+<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-map-reference.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-map-set"></a><h3>hb_map_set ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_map_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>,
+            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> key</code></em>,
+            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> value</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-map-set.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>map</p></td>
+<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-map-set-user-data"></a><h3>hb_map_set_user_data ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_map_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+                      <em class="parameter"><code><span class="type">void</span> *data</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-map-set-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>map</p></td>
+<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-map.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="HB-MAP-VALUE-INVALID:CAPS"></a><h3>HB_MAP_VALUE_INVALID</h3>
+<pre class="programlisting">#define HB_MAP_VALUE_INVALID ((hb_codepoint_t) -1)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-map-t"></a><h3>hb_map_t</h3>
+<pre class="programlisting">typedef struct hb_map_t hb_map_t;
+</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-color.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-color.html
new file mode 100644
index 0000000..c7bc7344
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-color.html
@@ -0,0 +1,723 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-ot-color: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch10.html" title="OpenType API">
+<link rel="prev" href="ch10.html" title="OpenType API">
+<link rel="next" href="harfbuzz-hb-ot-font.html" title="hb-ot-font">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-ot-color.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-ot-color.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch10.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="ch10.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-ot-font.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-ot-color"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-ot-color.top_of_page"></a>hb-ot-color</span></h2>
+<p>hb-ot-color — OpenType Color Fonts</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-color.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#HB-COLOR:CAPS" title="HB_COLOR()">HB_COLOR</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-alpha" title="hb_color_get_alpha()">hb_color_get_alpha</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-blue" title="hb_color_get_blue()">hb_color_get_blue</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-green" title="hb_color_get_green()">hb_color_get_green</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-red" title="hb_color_get_red()">hb_color_get_red</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-get-layers" title="hb_ot_color_glyph_get_layers ()">hb_ot_color_glyph_get_layers</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-reference-png" title="hb_ot_color_glyph_reference_png ()">hb_ot_color_glyph_reference_png</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-reference-svg" title="hb_ot_color_glyph_reference_svg ()">hb_ot_color_glyph_reference_svg</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-layers" title="hb_ot_color_has_layers ()">hb_ot_color_has_layers</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-palettes" title="hb_ot_color_has_palettes ()">hb_ot_color_has_palettes</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-png" title="hb_ot_color_has_png ()">hb_ot_color_has_png</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-svg" title="hb_ot_color_has_svg ()">hb_ot_color_has_svg</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-color-get-name-id" title="hb_ot_color_palette_color_get_name_id ()">hb_ot_color_palette_color_get_name_id</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-colors" title="hb_ot_color_palette_get_colors ()">hb_ot_color_palette_get_colors</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-count" title="hb_ot_color_palette_get_count ()">hb_ot_color_palette_get_count</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-flags-t" title="enum hb_ot_color_palette_flags_t"><span class="returnvalue">hb_ot_color_palette_flags_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-flags" title="hb_ot_color_palette_get_flags ()">hb_ot_color_palette_get_flags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-name-id" title="hb_ot_color_palette_get_name_id ()">hb_ot_color_palette_get_name_id</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-color.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t">hb_color_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-flags-t" title="enum hb_ot_color_palette_flags_t">hb_ot_color_palette_flags_t</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-color.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GFlags</a>
+    <span class="lineart">╰──</span> hb_ot_color_palette_flags_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-color.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-ot.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-color.description"></a><h2>Description</h2>
+<p>Functions for fetching color-font information from OpenType font faces.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-color.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="HB-COLOR:CAPS"></a><h3>HB_COLOR()</h3>
+<pre class="programlisting">#define HB_COLOR(b,g,r,a) ((hb_color_t) HB_TAG ((b),(g),(r),(a)))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-color-get-alpha"></a><h3>hb_color_get_alpha()</h3>
+<pre class="programlisting">#define hb_color_get_alpha(color) ((color) &amp; 0xFF)
+</pre>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-color-get-blue"></a><h3>hb_color_get_blue()</h3>
+<pre class="programlisting">#define hb_color_get_blue(color) (((color) &gt;&gt; 24) &amp; 0xFF)
+</pre>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-color-get-green"></a><h3>hb_color_get_green()</h3>
+<pre class="programlisting">#define hb_color_get_green(color) (((color) &gt;&gt; 16) &amp; 0xFF)
+</pre>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-color-get-red"></a><h3>hb_color_get_red()</h3>
+<pre class="programlisting">#define hb_color_get_red(color)		(((color) &gt;&gt; 8) &amp; 0xFF)
+</pre>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-color-glyph-get-layers"></a><h3>hb_ot_color_glyph_get_layers ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_color_glyph_get_layers (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                              <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                              <em class="parameter"><code>unsigned <span class="type">int</span> *count</code></em>,
+                              <em class="parameter"><code><span class="type">hb_ot_color_layer_t</span> *layers</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ot-color-glyph-get-layers.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>a layered color glyph id.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start_offset</p></td>
+<td class="parameter_description"><p>starting offset of layers.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>count</p></td>
+<td class="parameter_description"><p> gets number of layers available to be written on buffer
+and returns number of written layers. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>layers</p></td>
+<td class="parameter_description"><p> layers buffer to buffer. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=count][<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-color-glyph-get-layers.returns"></a><h4>Returns</h4>
+<p> Total number of layers a layered color glyph have.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-color-glyph-reference-png"></a><h3>hb_ot_color_glyph_reference_png ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+hb_ot_color_glyph_reference_png (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>);</pre>
+<p>Get PNG image for a glyph.</p>
+<div class="refsect3">
+<a name="hb-ot-color-glyph-reference-png.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font object, not face. upem should be set on
+that font object if one wants to get optimal png blob, otherwise
+return the biggest one</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>a glyph index.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-color-glyph-reference-png.returns"></a><h4>Returns</h4>
+<p> respective PNG blob of the glyph, if available. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-color-glyph-reference-svg"></a><h3>hb_ot_color_glyph_reference_svg ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+hb_ot_color_glyph_reference_svg (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>);</pre>
+<p>Get SVG document for a glyph. The blob may be either plain text or gzip-encoded.</p>
+<div class="refsect3">
+<a name="hb-ot-color-glyph-reference-svg.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>a svg glyph index.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-color-glyph-reference-svg.returns"></a><h4>Returns</h4>
+<p> respective svg blob of the glyph, if available. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-color-has-layers"></a><h3>hb_ot_color_has_layers ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_color_has_layers (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ot-color-has-layers.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-color-has-layers.returns"></a><h4>Returns</h4>
+<p> whether COLR table is available.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-color-has-palettes"></a><h3>hb_ot_color_has_palettes ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_color_has_palettes (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ot-color-has-palettes.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-color-has-palettes.returns"></a><h4>Returns</h4>
+<p> whether CPAL table is available.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-color-has-png"></a><h3>hb_ot_color_has_png ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_color_has_png (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Check whether <em class="parameter"><code>face</code></em>
+ has PNG glyph images (either CBDT or sbix tables).</p>
+<p>Returns true if available, false otherwise.</p>
+<div class="refsect3">
+<a name="hb-ot-color-has-png.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-color-has-svg"></a><h3>hb_ot_color_has_svg ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_color_has_svg (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Check whether <em class="parameter"><code>face</code></em>
+ has SVG glyph images.</p>
+<p>Returns true if available, false otherwise.</p>
+<div class="refsect3">
+<a name="hb-ot-color-has-svg.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-color-palette-color-get-name-id"></a><h3>hb_ot_color_palette_color_get_name_id ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
+hb_ot_color_palette_color_get_name_id (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                       <em class="parameter"><code>unsigned <span class="type">int</span> color_index</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ot-color-palette-color-get-name-id.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>color_index</p></td>
+<td class="parameter_description"><p>palette entry index.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-color-palette-color-get-name-id.returns"></a><h4>Returns</h4>
+<p> Name ID associated with a palette entry, e.g. eye color</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-color-palette-get-colors"></a><h3>hb_ot_color_palette_get_colors ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_color_palette_get_colors (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> palette_index</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *color_count</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t"><span class="type">hb_color_t</span></a> *colors</code></em>);</pre>
+<p>Retrieves the colors in a color palette.</p>
+<div class="refsect3">
+<a name="hb-ot-color-palette-get-colors.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>palette_index</p></td>
+<td class="parameter_description"><p>the index of the color palette whose colors
+are being requested.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start_offset</p></td>
+<td class="parameter_description"><p>the index of the first color being requested.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>color_count</p></td>
+<td class="parameter_description"><p> on input, how many colors
+can be maximally stored into the <em class="parameter"><code>colors</code></em>
+array;
+on output, how many colors were actually stored. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>colors</p></td>
+<td class="parameter_description"><p>               an array of <a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t"><span class="type">hb_color_t</span></a> records. After calling
+this function, <em class="parameter"><code>colors</code></em>
+will be filled with
+the palette colors. If <em class="parameter"><code>colors</code></em>
+is NULL, the function
+will just return the number of total colors
+without storing any actual colors; this can be used
+for allocating a buffer of suitable size before calling
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-colors" title="hb_ot_color_palette_get_colors ()"><code class="function">hb_ot_color_palette_get_colors()</code></a> a second time. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=color_count][<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-color-palette-get-colors.returns"></a><h4>Returns</h4>
+<p> the total number of colors in the palette.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-color-palette-get-count"></a><h3>hb_ot_color_palette_get_count ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_color_palette_get_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ot-color-palette-get-count.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-color-palette-get-count.returns"></a><h4>Returns</h4>
+<p> the number of color palettes in <em class="parameter"><code>face</code></em>
+, or zero if <em class="parameter"><code>face</code></em>
+has
+no colors.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-color-palette-get-flags"></a><h3>hb_ot_color_palette_get_flags ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-flags-t" title="enum hb_ot_color_palette_flags_t"><span class="returnvalue">hb_ot_color_palette_flags_t</span></a>
+hb_ot_color_palette_get_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                               <em class="parameter"><code>unsigned <span class="type">int</span> palette_index</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ot-color-palette-get-flags.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a font face</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>palette_index</p></td>
+<td class="parameter_description"><p>the index of the color palette whose flags are being requested</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-color-palette-get-flags.returns"></a><h4>Returns</h4>
+<p> the flags for the requested color palette.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-color-palette-get-name-id"></a><h3>hb_ot_color_palette_get_name_id ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
+hb_ot_color_palette_get_name_id (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                 <em class="parameter"><code>unsigned <span class="type">int</span> palette_index</code></em>);</pre>
+<p>Retrieves the name id of a color palette. For example, a color font can
+have themed palettes like "Spring", "Summer", "Fall", and "Winter".</p>
+<div class="refsect3">
+<a name="hb-ot-color-palette-get-name-id.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>palette_index</p></td>
+<td class="parameter_description"><p>the index of the color palette whose name is being requested.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-color-palette-get-name-id.returns"></a><h4>Returns</h4>
+<p> an identifier within <em class="parameter"><code>face</code></em>
+'s <code class="literal">name</code> table.
+If the requested palette has no name the result is <span class="type">HB_OT_NAME_ID_INVALID</span>.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-color.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="hb-color-t"></a><h3>hb_color_t</h3>
+<pre class="programlisting">typedef uint32_t hb_color_t;
+</pre>
+<p>Data type for holding color values.</p>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-color-palette-flags-t"></a><h3>enum hb_ot_color_palette_flags_t</h3>
+<div class="refsect3">
+<a name="hb-ot-color-palette-flags-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-COLOR-PALETTE-FLAG-DEFAULT:CAPS"></a>HB_OT_COLOR_PALETTE_FLAG_DEFAULT</p></td>
+<td class="enum_member_description">
+<p>default indicating that there is nothing special
+  to note about a color palette.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-COLOR-PALETTE-FLAG-USABLE-WITH-LIGHT-BACKGROUND:CAPS"></a>HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND</p></td>
+<td class="enum_member_description">
+<p>flag indicating that the color
+  palette is appropriate to use when displaying the font on a light background such as white.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-COLOR-PALETTE-FLAG-USABLE-WITH-DARK-BACKGROUND:CAPS"></a>HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND</p></td>
+<td class="enum_member_description">
+<p>flag indicating that the color
+  palette is appropriate to use when displaying the font on a dark background such as black.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-font.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-font.html
new file mode 100644
index 0000000..02c7686
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-font.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-ot-font: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch10.html" title="OpenType API">
+<link rel="prev" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">
+<link rel="next" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-ot-font.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch10.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-ot-color.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-ot-layout.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-ot-font"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-ot-font.top_of_page"></a>hb-ot-font</span></h2>
+<p>hb-ot-font — OpenType font implementation</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-font.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody><tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-font.html#hb-ot-font-set-funcs" title="hb_ot_font_set_funcs ()">hb_ot_font_set_funcs</a> <span class="c_punctuation">()</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-font.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-ot.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-font.description"></a><h2>Description</h2>
+<p>Functions for using OpenType fonts with <a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape ()"><code class="function">hb_shape()</code></a>.  Not that fonts returned
+by <a class="link" href="harfbuzz-hb-font.html#hb-font-create" title="hb_font_create ()"><code class="function">hb_font_create()</code></a> default to using these functions, so most clients would
+never need to call these functions directly.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-font.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-ot-font-set-funcs"></a><h3>hb_ot_font_set_funcs ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ot_font_set_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-28.html#api-index-0.9.28">0.9.28</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-font.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-layout.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-layout.html
new file mode 100644
index 0000000..ce6c420
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-layout.html
@@ -0,0 +1,1122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-ot-layout: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch10.html" title="OpenType API">
+<link rel="prev" href="harfbuzz-hb-ot-font.html" title="hb-ot-font">
+<link rel="next" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-ot-layout.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-ot-layout.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch10.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-ot-font.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-ot-math.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-ot-layout"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-ot-layout.top_of_page"></a>hb-ot-layout</span></h2>
+<p>hb-ot-layout — OpenType Layout</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-layout.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="returnvalue">hb_language_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tag-to-language" title="hb_ot_tag_to_language ()">hb_ot_tag_to_language</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tag-to-script" title="hb_ot_tag_to_script ()">hb_ot_tag_to_script</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tags-from-script-and-language" title="hb_ot_tags_from_script_and_language ()">hb_ot_tags_from_script_and_language</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tags-to-script-and-language" title="hb_ot_tags_to_script_and_language ()">hb_ot_tags_to_script_and_language</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-lookups" title="hb_ot_layout_collect_lookups ()">hb_ot_layout_collect_lookups</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-features" title="hb_ot_layout_collect_features ()">hb_ot_layout_collect_features</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-characters" title="hb_ot_layout_feature_get_characters ()">hb_ot_layout_feature_get_characters</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-lookups" title="hb_ot_layout_feature_get_lookups ()">hb_ot_layout_feature_get_lookups</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-name-ids" title="hb_ot_layout_feature_get_name_ids ()">hb_ot_layout_feature_get_name_ids</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-with-variations-get-lookups" title="hb_ot_layout_feature_with_variations_get_lookups ()">hb_ot_layout_feature_with_variations_get_lookups</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-attach-points" title="hb_ot_layout_get_attach_points ()">hb_ot_layout_get_attach_points</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-glyph-class-t" title="enum hb_ot_layout_glyph_class_t"><span class="returnvalue">hb_ot_layout_glyph_class_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-glyph-class" title="hb_ot_layout_get_glyph_class ()">hb_ot_layout_get_glyph_class</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-glyphs-in-class" title="hb_ot_layout_get_glyphs_in_class ()">hb_ot_layout_get_glyphs_in_class</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-ligature-carets" title="hb_ot_layout_get_ligature_carets ()">hb_ot_layout_get_ligature_carets</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-size-params" title="hb_ot_layout_get_size_params ()">hb_ot_layout_get_size_params</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-glyph-sequence-func-t" title="hb_ot_layout_glyph_sequence_func_t ()">*hb_ot_layout_glyph_sequence_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-has-glyph-classes" title="hb_ot_layout_has_glyph_classes ()">hb_ot_layout_has_glyph_classes</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-has-positioning" title="hb_ot_layout_has_positioning ()">hb_ot_layout_has_positioning</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-has-substitution" title="hb_ot_layout_has_substitution ()">hb_ot_layout_has_substitution</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-find-feature" title="hb_ot_layout_language_find_feature ()">hb_ot_layout_language_find_feature</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-feature-indexes" title="hb_ot_layout_language_get_feature_indexes ()">hb_ot_layout_language_get_feature_indexes</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-feature-tags" title="hb_ot_layout_language_get_feature_tags ()">hb_ot_layout_language_get_feature_tags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-required-feature" title="hb_ot_layout_language_get_required_feature ()">hb_ot_layout_language_get_required_feature</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-collect-glyphs" title="hb_ot_layout_lookup_collect_glyphs ()">hb_ot_layout_lookup_collect_glyphs</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-substitute-closure" title="hb_ot_layout_lookup_substitute_closure ()">hb_ot_layout_lookup_substitute_closure</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookups-substitute-closure" title="hb_ot_layout_lookups_substitute_closure ()">hb_ot_layout_lookups_substitute_closure</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-would-substitute" title="hb_ot_layout_lookup_would_substitute ()">hb_ot_layout_lookup_would_substitute</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-script-get-language-tags" title="hb_ot_layout_script_get_language_tags ()">hb_ot_layout_script_get_language_tags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-script-select-language" title="hb_ot_layout_script_select_language ()">hb_ot_layout_script_select_language</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-find-feature-variations" title="hb_ot_layout_table_find_feature_variations ()">hb_ot_layout_table_find_feature_variations</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-get-feature-tags" title="hb_ot_layout_table_get_feature_tags ()">hb_ot_layout_table_get_feature_tags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-get-script-tags" title="hb_ot_layout_table_get_script_tags ()">hb_ot_layout_table_get_script_tags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-get-lookup-count" title="hb_ot_layout_table_get_lookup_count ()">hb_ot_layout_table_get_lookup_count</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-select-script" title="hb_ot_layout_table_select_script ()">hb_ot_layout_table_select_script</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-shape-plan-collect-lookups" title="hb_ot_shape_plan_collect_lookups ()">hb_ot_shape_plan_collect_lookups</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-required-feature-index" title="hb_ot_layout_language_get_required_feature_index ()">hb_ot_layout_language_get_required_feature_index</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-layout.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-MAX-TAGS-PER-LANGUAGE:CAPS" title="HB_OT_MAX_TAGS_PER_LANGUAGE">HB_OT_MAX_TAGS_PER_LANGUAGE</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-MAX-TAGS-PER-SCRIPT:CAPS" title="HB_OT_MAX_TAGS_PER_SCRIPT">HB_OT_MAX_TAGS_PER_SCRIPT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-DEFAULT-LANGUAGE:CAPS" title="HB_OT_TAG_DEFAULT_LANGUAGE">HB_OT_TAG_DEFAULT_LANGUAGE</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-DEFAULT-SCRIPT:CAPS" title="HB_OT_TAG_DEFAULT_SCRIPT">HB_OT_TAG_DEFAULT_SCRIPT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-DEFAULT-LANGUAGE-INDEX:CAPS" title="HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX">HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-NO-FEATURE-INDEX:CAPS" title="HB_OT_LAYOUT_NO_FEATURE_INDEX">HB_OT_LAYOUT_NO_FEATURE_INDEX</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-NO-SCRIPT-INDEX:CAPS" title="HB_OT_LAYOUT_NO_SCRIPT_INDEX">HB_OT_LAYOUT_NO_SCRIPT_INDEX</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-NO-VARIATIONS-INDEX:CAPS" title="HB_OT_LAYOUT_NO_VARIATIONS_INDEX">HB_OT_LAYOUT_NO_VARIATIONS_INDEX</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-BASE:CAPS" title="HB_OT_TAG_BASE">HB_OT_TAG_BASE</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GDEF:CAPS" title="HB_OT_TAG_GDEF">HB_OT_TAG_GDEF</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS">HB_OT_TAG_GPOS</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB">HB_OT_TAG_GSUB</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-JSTF:CAPS" title="HB_OT_TAG_JSTF">HB_OT_TAG_JSTF</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-glyph-class-t" title="enum hb_ot_layout_glyph_class_t">hb_ot_layout_glyph_class_t</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-layout.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
+    <span class="lineart">╰──</span> hb_ot_layout_glyph_class_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-layout.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-ot.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-layout.description"></a><h2>Description</h2>
+<p>Functions for querying OpenType Layout features in the font face.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-layout.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-ot-tag-to-language"></a><h3>hb_ot_tag_to_language ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="returnvalue">hb_language_t</span></a>
+hb_ot_tag_to_language (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ot-tag-to-language.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-tag-to-script"></a><h3>hb_ot_tag_to_script ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+hb_ot_tag_to_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-tags-from-script-and-language"></a><h3>hb_ot_tags_from_script_and_language ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ot_tags_from_script_and_language (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> language</code></em>,
+                                     <em class="parameter"><code>unsigned <span class="type">int</span> *script_count</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *script_tags</code></em>,
+                                     <em class="parameter"><code>unsigned <span class="type">int</span> *language_count</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *language_tags</code></em>);</pre>
+<p>Converts an <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> and an <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> to script and language tags.</p>
+<div class="refsect3">
+<a name="hb-ot-tags-from-script-and-language.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>script</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> to convert.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>language</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> to convert.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>script_count</p></td>
+<td class="parameter_description"><p> maximum number of script tags to retrieve (IN)
+and actual number of script tags retrieved (OUT). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>script_tags</p></td>
+<td class="parameter_description"><p> array of size at least <em class="parameter"><code>script_count</code></em>
+to store the
+script tag results. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>language_count</p></td>
+<td class="parameter_description"><p> maximum number of language tags to retrieve
+(IN) and actual number of language tags retrieved (OUT). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>language_tags</p></td>
+<td class="parameter_description"><p> array of size at least <em class="parameter"><code>language_count</code></em>
+to store
+the language tag results. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-tags-to-script-and-language"></a><h3>hb_ot_tags_to_script_and_language ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ot_tags_to_script_and_language (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> script_tag</code></em>,
+                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> language_tag</code></em>,
+                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> *script</code></em>,
+                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> *language</code></em>);</pre>
+<p>Converts a script tag and a language tag to an <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> and an
+<a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-ot-tags-to-script-and-language.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>script_tag</p></td>
+<td class="parameter_description"><p>a script tag</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>language_tag</p></td>
+<td class="parameter_description"><p>a language tag</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>script</p></td>
+<td class="parameter_description"><p> the <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> corresponding to <em class="parameter"><code>script_tag</code></em>
+(OUT). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>language</p></td>
+<td class="parameter_description"><p> the <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> corresponding to <em class="parameter"><code>script_tag</code></em>
+and
+<em class="parameter"><code>language_tag</code></em>
+(OUT). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-collect-lookups"></a><h3>hb_ot_layout_collect_lookups ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ot_layout_collect_lookups (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *scripts</code></em>,
+                              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *languages</code></em>,
+                              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *features</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *lookup_indexes</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-8.html#api-index-0.9.8">0.9.8</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-collect-features"></a><h3>hb_ot_layout_collect_features ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ot_layout_collect_features (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                               <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *scripts</code></em>,
+                               <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *languages</code></em>,
+                               <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *features</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *feature_indexes</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-1-8-5.html#api-index-1.8.5">1.8.5</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-feature-get-characters"></a><h3>hb_ot_layout_feature_get_characters ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_layout_feature_get_characters (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                     <em class="parameter"><code>unsigned <span class="type">int</span> feature_index</code></em>,
+                                     <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                                     <em class="parameter"><code>unsigned <span class="type">int</span> *char_count</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *characters</code></em>);</pre>
+<p>Fetches characters listed by designer under feature parameters for "Character
+Variant" ("cvXX") features.</p>
+<div class="refsect3">
+<a name="hb-ot-layout-feature-get-characters.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>table_tag</p></td>
+<td class="parameter_description"><p>table tag to query, "GSUB" or "GPOS".</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>feature_index</p></td>
+<td class="parameter_description"><p>index of feature to query.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start_offset</p></td>
+<td class="parameter_description"><p>In case the resulting char_count was equal to its input value, there
+is a chance there were more characters on the tag so this API can be
+called with an offset till resulting char_count gets to a number
+lower than input buffer (or consider using just a bigger buffer for
+one shot copying).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>char_count</p></td>
+<td class="parameter_description"><p> The count of characters for which this feature
+provides glyph variants. (May be zero.). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>characters</p></td>
+<td class="parameter_description"><p> A buffer pointer. The Unicode codepoints
+of the characters for which this feature provides glyph variants. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Out parameter, where caller must allocate storage."><span class="acronym">out caller-allocates</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=char_count]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-layout-feature-get-characters.returns"></a><h4>Returns</h4>
+<p> Number of total sample characters in the cvXX feature.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-feature-get-lookups"></a><h3>hb_ot_layout_feature_get_lookups ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_layout_feature_get_lookups (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                  <em class="parameter"><code>unsigned <span class="type">int</span> feature_index</code></em>,
+                                  <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                                  <em class="parameter"><code>unsigned <span class="type">int</span> *lookup_count</code></em>,
+                                  <em class="parameter"><code>unsigned <span class="type">int</span> *lookup_indexes</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-feature-get-name-ids"></a><h3>hb_ot_layout_feature_get_name_ids ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_layout_feature_get_name_ids (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                   <em class="parameter"><code>unsigned <span class="type">int</span> feature_index</code></em>,
+                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> *label_id</code></em>,
+                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> *tooltip_id</code></em>,
+                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> *sample_id</code></em>,
+                                   <em class="parameter"><code>unsigned <span class="type">int</span> *num_named_parameters</code></em>,
+                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> *first_param_id</code></em>);</pre>
+<p>Fetches name indices from feature parameters for "Stylistic Set" ('ssXX') or
+"Character Variant" ('cvXX') features.</p>
+<div class="refsect3">
+<a name="hb-ot-layout-feature-get-name-ids.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>table_tag</p></td>
+<td class="parameter_description"><p>table tag to query, "GSUB" or "GPOS".</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>feature_index</p></td>
+<td class="parameter_description"><p>index of feature to query.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>label_id</p></td>
+<td class="parameter_description"><p> The ‘name’ table name ID that specifies a string
+for a user-interface label for this feature. (May be NULL.). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>tooltip_id</p></td>
+<td class="parameter_description"><p> The ‘name’ table name ID that specifies a string
+that an application can use for tooltip text for this
+feature. (May be NULL.). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>sample_id</p></td>
+<td class="parameter_description"><p> The ‘name’ table name ID that specifies sample text
+that illustrates the effect of this feature. (May be NULL.). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>num_named_parameters</p></td>
+<td class="parameter_description"><p>  Number of named parameters. (May be zero.). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_param_id</p></td>
+<td class="parameter_description"><p> The first ‘name’ table name ID used to specify
+strings for user-interface labels for the feature
+parameters. (Must be zero if numParameters is zero.). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-layout-feature-get-name-ids.returns"></a><h4>Returns</h4>
+<p> true if data found, false otherwise</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-feature-with-variations-get-lookups"></a><h3>hb_ot_layout_feature_with_variations_get_lookups ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_layout_feature_with_variations_get_lookups
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> feature_index</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> variations_index</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *lookup_count</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *lookup_indexes</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-get-attach-points"></a><h3>hb_ot_layout_get_attach_points ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_layout_get_attach_points (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *point_count</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *point_array</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-get-glyph-class"></a><h3>hb_ot_layout_get_glyph_class ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-glyph-class-t" title="enum hb_ot_layout_glyph_class_t"><span class="returnvalue">hb_ot_layout_glyph_class_t</span></a>
+hb_ot_layout_get_glyph_class (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-get-glyphs-in-class"></a><h3>hb_ot_layout_get_glyphs_in_class ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ot_layout_get_glyphs_in_class (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-glyph-class-t" title="enum hb_ot_layout_glyph_class_t"><span class="type">hb_ot_layout_glyph_class_t</span></a> klass</code></em>,
+                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-get-ligature-carets"></a><h3>hb_ot_layout_get_ligature_carets ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_layout_get_ligature_carets (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
+                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                  <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                                  <em class="parameter"><code>unsigned <span class="type">int</span> *caret_count</code></em>,
+                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *caret_array</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-get-size-params"></a><h3>hb_ot_layout_get_size_params ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_layout_get_size_params (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                              <em class="parameter"><code>unsigned <span class="type">int</span> *design_size</code></em>,
+                              <em class="parameter"><code>unsigned <span class="type">int</span> *subfamily_id</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> *subfamily_name_id</code></em>,
+                              <em class="parameter"><code>unsigned <span class="type">int</span> *range_start</code></em>,
+                              <em class="parameter"><code>unsigned <span class="type">int</span> *range_end</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-10.html#api-index-0.9.10">0.9.10</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-glyph-sequence-func-t"></a><h3>hb_ot_layout_glyph_sequence_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+<span class="c_punctuation">(</span>*hb_ot_layout_glyph_sequence_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                       <em class="parameter"><code>unsigned <span class="type">int</span> lookup_index</code></em>,
+                                       <em class="parameter"><code>const <span class="type">hb_ot_layout_glyph_sequence_t</span> *sequence</code></em>,
+                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-has-glyph-classes"></a><h3>hb_ot_layout_has_glyph_classes ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_layout_has_glyph_classes (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-has-positioning"></a><h3>hb_ot_layout_has_positioning ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_layout_has_positioning (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-has-substitution"></a><h3>hb_ot_layout_has_substitution ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_layout_has_substitution (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-language-find-feature"></a><h3>hb_ot_layout_language_find_feature ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_layout_language_find_feature (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                    <em class="parameter"><code>unsigned <span class="type">int</span> script_index</code></em>,
+                                    <em class="parameter"><code>unsigned <span class="type">int</span> language_index</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> feature_tag</code></em>,
+                                    <em class="parameter"><code>unsigned <span class="type">int</span> *feature_index</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-language-get-feature-indexes"></a><h3>hb_ot_layout_language_get_feature_indexes ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_layout_language_get_feature_indexes
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> script_index</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> language_index</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *feature_count</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *feature_indexes</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-language-get-feature-tags"></a><h3>hb_ot_layout_language_get_feature_tags ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_layout_language_get_feature_tags
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> script_index</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> language_index</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *feature_count</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *feature_tags</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-language-get-required-feature"></a><h3>hb_ot_layout_language_get_required_feature ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_layout_language_get_required_feature
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> script_index</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> language_index</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *feature_index</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *feature_tag</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-30.html#api-index-0.9.30">0.9.30</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-lookup-collect-glyphs"></a><h3>hb_ot_layout_lookup_collect_glyphs ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ot_layout_lookup_collect_glyphs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                    <em class="parameter"><code>unsigned <span class="type">int</span> lookup_index</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs_before</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs_input</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs_after</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs_output</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-lookup-substitute-closure"></a><h3>hb_ot_layout_lookup_substitute_closure ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ot_layout_lookup_substitute_closure
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> lookup_index</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-lookups-substitute-closure"></a><h3>hb_ot_layout_lookups_substitute_closure ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ot_layout_lookups_substitute_closure
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *lookups</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs</code></em>);</pre>
+<p>Compute the transitive closure of glyphs needed for all of the
+provided lookups.</p>
+<p class="since">Since: <a class="link" href="api-index-1-8-1.html#api-index-1.8.1">1.8.1</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-lookup-would-substitute"></a><h3>hb_ot_layout_lookup_would_substitute ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_layout_lookup_would_substitute (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                      <em class="parameter"><code>unsigned <span class="type">int</span> lookup_index</code></em>,
+                                      <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyphs</code></em>,
+                                      <em class="parameter"><code>unsigned <span class="type">int</span> glyphs_length</code></em>,
+                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> zero_context</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-script-get-language-tags"></a><h3>hb_ot_layout_script_get_language_tags ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_layout_script_get_language_tags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                       <em class="parameter"><code>unsigned <span class="type">int</span> script_index</code></em>,
+                                       <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                                       <em class="parameter"><code>unsigned <span class="type">int</span> *language_count</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *language_tags</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-script-select-language"></a><h3>hb_ot_layout_script_select_language ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_layout_script_select_language (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                     <em class="parameter"><code>unsigned <span class="type">int</span> script_index</code></em>,
+                                     <em class="parameter"><code>unsigned <span class="type">int</span> language_count</code></em>,
+                                     <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *language_tags</code></em>,
+                                     <em class="parameter"><code>unsigned <span class="type">int</span> *language_index</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-table-find-feature-variations"></a><h3>hb_ot_layout_table_find_feature_variations ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_layout_table_find_feature_variations
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                <em class="parameter"><code>const <span class="type">int</span> *coords</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> num_coords</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *variations_index</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-table-get-feature-tags"></a><h3>hb_ot_layout_table_get_feature_tags ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_layout_table_get_feature_tags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                     <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                                     <em class="parameter"><code>unsigned <span class="type">int</span> *feature_count</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *feature_tags</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-table-get-script-tags"></a><h3>hb_ot_layout_table_get_script_tags ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_layout_table_get_script_tags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                    <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                                    <em class="parameter"><code>unsigned <span class="type">int</span> *script_count</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *script_tags</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-table-get-lookup-count"></a><h3>hb_ot_layout_table_get_lookup_count ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_layout_table_get_lookup_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-22.html#api-index-0.9.22">0.9.22</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-table-select-script"></a><h3>hb_ot_layout_table_select_script ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_layout_table_select_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                  <em class="parameter"><code>unsigned <span class="type">int</span> script_count</code></em>,
+                                  <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *script_tags</code></em>,
+                                  <em class="parameter"><code>unsigned <span class="type">int</span> *script_index</code></em>,
+                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *chosen_script</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-shape-plan-collect-lookups"></a><h3>hb_ot_shape_plan_collect_lookups ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ot_shape_plan_collect_lookups (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>,
+                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *lookup_indexes</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-language-get-required-feature-index"></a><h3>hb_ot_layout_language_get_required_feature_index ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_layout_language_get_required_feature_index
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> script_index</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> language_index</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *feature_index</code></em>);</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-layout.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="HB-OT-MAX-TAGS-PER-LANGUAGE:CAPS"></a><h3>HB_OT_MAX_TAGS_PER_LANGUAGE</h3>
+<pre class="programlisting">#define HB_OT_MAX_TAGS_PER_LANGUAGE 3u
+</pre>
+<p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-MAX-TAGS-PER-SCRIPT:CAPS"></a><h3>HB_OT_MAX_TAGS_PER_SCRIPT</h3>
+<pre class="programlisting">#define HB_OT_MAX_TAGS_PER_SCRIPT 3u
+</pre>
+<p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-TAG-DEFAULT-LANGUAGE:CAPS"></a><h3>HB_OT_TAG_DEFAULT_LANGUAGE</h3>
+<pre class="programlisting">#define HB_OT_TAG_DEFAULT_LANGUAGE HB_TAG ('d', 'f', 'l', 't')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-TAG-DEFAULT-SCRIPT:CAPS"></a><h3>HB_OT_TAG_DEFAULT_SCRIPT</h3>
+<pre class="programlisting">#define HB_OT_TAG_DEFAULT_SCRIPT HB_TAG ('D', 'F', 'L', 'T')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-LAYOUT-DEFAULT-LANGUAGE-INDEX:CAPS"></a><h3>HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX</h3>
+<pre class="programlisting">#define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX 0xFFFFu
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-LAYOUT-NO-FEATURE-INDEX:CAPS"></a><h3>HB_OT_LAYOUT_NO_FEATURE_INDEX</h3>
+<pre class="programlisting">#define HB_OT_LAYOUT_NO_FEATURE_INDEX		0xFFFFu
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-LAYOUT-NO-SCRIPT-INDEX:CAPS"></a><h3>HB_OT_LAYOUT_NO_SCRIPT_INDEX</h3>
+<pre class="programlisting">#define HB_OT_LAYOUT_NO_SCRIPT_INDEX		0xFFFFu
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-LAYOUT-NO-VARIATIONS-INDEX:CAPS"></a><h3>HB_OT_LAYOUT_NO_VARIATIONS_INDEX</h3>
+<pre class="programlisting">#define HB_OT_LAYOUT_NO_VARIATIONS_INDEX 0xFFFFFFFFu
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-TAG-BASE:CAPS"></a><h3>HB_OT_TAG_BASE</h3>
+<pre class="programlisting">#define HB_OT_TAG_BASE HB_TAG('B','A','S','E')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-TAG-GDEF:CAPS"></a><h3>HB_OT_TAG_GDEF</h3>
+<pre class="programlisting">#define HB_OT_TAG_GDEF HB_TAG('G','D','E','F')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-TAG-GPOS:CAPS"></a><h3>HB_OT_TAG_GPOS</h3>
+<pre class="programlisting">#define HB_OT_TAG_GPOS HB_TAG('G','P','O','S')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-TAG-GSUB:CAPS"></a><h3>HB_OT_TAG_GSUB</h3>
+<pre class="programlisting">#define HB_OT_TAG_GSUB HB_TAG('G','S','U','B')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-TAG-JSTF:CAPS"></a><h3>HB_OT_TAG_JSTF</h3>
+<pre class="programlisting">#define HB_OT_TAG_JSTF HB_TAG('J','S','T','F')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-layout-glyph-class-t"></a><h3>enum hb_ot_layout_glyph_class_t</h3>
+<div class="refsect3">
+<a name="hb-ot-layout-glyph-class-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-LAYOUT-GLYPH-CLASS-UNCLASSIFIED:CAPS"></a>HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-LAYOUT-GLYPH-CLASS-BASE-GLYPH:CAPS"></a>HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-LAYOUT-GLYPH-CLASS-LIGATURE:CAPS"></a>HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-LAYOUT-GLYPH-CLASS-MARK:CAPS"></a>HB_OT_LAYOUT_GLYPH_CLASS_MARK</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-LAYOUT-GLYPH-CLASS-COMPONENT:CAPS"></a>HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-math.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-math.html
new file mode 100644
index 0000000..b803cef
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-math.html
@@ -0,0 +1,967 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-ot-math: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch10.html" title="OpenType API">
+<link rel="prev" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">
+<link rel="next" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-ot-math.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-ot-math.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch10.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-ot-layout.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-ot-name.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-ot-math"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-ot-math.top_of_page"></a>hb-ot-math</span></h2>
+<p>hb-ot-math — OpenType Math information</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-math.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-has-data" title="hb_ot_math_has_data ()">hb_ot_math_has_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-constant" title="hb_ot_math_get_constant ()">hb_ot_math_get_constant</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-italics-correction" title="hb_ot_math_get_glyph_italics_correction ()">hb_ot_math_get_glyph_italics_correction</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-top-accent-attachment" title="hb_ot_math_get_glyph_top_accent_attachment ()">hb_ot_math_get_glyph_top_accent_attachment</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-kerning" title="hb_ot_math_get_glyph_kerning ()">hb_ot_math_get_glyph_kerning</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-is-glyph-extended-shape" title="hb_ot_math_is_glyph_extended_shape ()">hb_ot_math_is_glyph_extended_shape</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-variants" title="hb_ot_math_get_glyph_variants ()">hb_ot_math_get_glyph_variants</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-min-connector-overlap" title="hb_ot_math_get_min_connector_overlap ()">hb_ot_math_get_min_connector_overlap</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-assembly" title="hb_ot_math_get_glyph_assembly ()">hb_ot_math_get_glyph_assembly</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="hb-ot-math-glyph-variant-t"></a><a name="hb-ot-math-glyph-part-t"></a><div class="refsect1">
+<a name="harfbuzz-hb-ot-math.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-math.html#HB-OT-TAG-MATH:CAPS" title="HB_OT_TAG_MATH">HB_OT_TAG_MATH</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-math.html#HB-OT-MATH-SCRIPT:CAPS" title="HB_OT_MATH_SCRIPT">HB_OT_MATH_SCRIPT</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-constant-t" title="enum hb_ot_math_constant_t">hb_ot_math_constant_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-t" title="enum hb_ot_math_kern_t">hb_ot_math_kern_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t-struct" title="hb_ot_math_glyph_variant_t">hb_ot_math_glyph_variant_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-flags-t" title="enum hb_ot_math_glyph_part_flags_t">hb_ot_math_glyph_part_flags_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t-struct" title="hb_ot_math_glyph_part_t">hb_ot_math_glyph_part_t</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-math.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
+    <span class="lineart">├──</span> hb_ot_math_glyph_part_t
+    <span class="lineart">╰──</span> hb_ot_math_glyph_variant_t
+    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
+    <span class="lineart">├──</span> hb_ot_math_constant_t
+    <span class="lineart">╰──</span> hb_ot_math_kern_t
+    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GFlags</a>
+    <span class="lineart">╰──</span> hb_ot_math_glyph_part_flags_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-math.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-ot.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-math.description"></a><h2>Description</h2>
+<p>Functions for fetching mathematics layout data from OpenType fonts.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-math.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-ot-math-has-data"></a><h3>hb_ot_math_has_data ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_math_has_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>This function allows to verify the presence of an OpenType MATH table on the
+face.</p>
+<div class="refsect3">
+<a name="hb-ot-math-has-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> to test</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-math-has-data.returns"></a><h4>Returns</h4>
+<p> true if face has a MATH table, false otherwise</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-math-get-constant"></a><h3>hb_ot_math_get_constant ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+hb_ot_math_get_constant (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-constant-t" title="enum hb_ot_math_constant_t"><span class="type">hb_ot_math_constant_t</span></a> constant</code></em>);</pre>
+<p>This function returns the requested math constants as a <a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a>.
+If the request constant is HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN,
+HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN or
+HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN then the return value is
+actually an integer between 0 and 100 representing that percentage.</p>
+<div class="refsect3">
+<a name="hb-ot-math-get-constant.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> from which to retrieve the value</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>constant</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-constant-t" title="enum hb_ot_math_constant_t"><span class="type">hb_ot_math_constant_t</span></a> the constant to retrieve</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-math-get-constant.returns"></a><h4>Returns</h4>
+<p> the requested constant or 0</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-math-get-glyph-italics-correction"></a><h3>hb_ot_math_get_glyph_italics_correction ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+hb_ot_math_get_glyph_italics_correction
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ot-math-get-glyph-italics-correction.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> from which to retrieve the value</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>glyph index from which to retrieve the value</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-math-get-glyph-italics-correction.returns"></a><h4>Returns</h4>
+<p> the italics correction of the glyph or 0</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-math-get-glyph-top-accent-attachment"></a><h3>hb_ot_math_get_glyph_top_accent_attachment ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+hb_ot_math_get_glyph_top_accent_attachment
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ot-math-get-glyph-top-accent-attachment.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> from which to retrieve the value</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>glyph index from which to retrieve the value</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-math-get-glyph-top-accent-attachment.returns"></a><h4>Returns</h4>
+<p> the top accent attachment of the glyph or 0</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-math-get-glyph-kerning"></a><h3>hb_ot_math_get_glyph_kerning ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+hb_ot_math_get_glyph_kerning (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-t" title="enum hb_ot_math_kern_t"><span class="type">hb_ot_math_kern_t</span></a> kern</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> correction_height</code></em>);</pre>
+<p>This function tries to retrieve the MathKern table for the specified font,
+glyph and <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-t" title="enum hb_ot_math_kern_t"><span class="type">hb_ot_math_kern_t</span></a>. Then it browses the list of heights from the
+MathKern table to find one value that is greater or equal to specified
+correction_height. If one is found the corresponding value from the list of
+kerns is returned and otherwise the last kern value is returned.</p>
+<div class="refsect3">
+<a name="hb-ot-math-get-glyph-kerning.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> from which to retrieve the value</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>glyph index from which to retrieve the value</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>kern</p></td>
+<td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-t" title="enum hb_ot_math_kern_t"><span class="type">hb_ot_math_kern_t</span></a> from which to retrieve the value</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>correction_height</p></td>
+<td class="parameter_description"><p>the correction height to use to determine the kerning.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-math-get-glyph-kerning.returns"></a><h4>Returns</h4>
+<p> requested kerning or 0</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-math-is-glyph-extended-shape"></a><h3>hb_ot_math_is_glyph_extended_shape ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_math_is_glyph_extended_shape (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-ot-math-is-glyph-extended-shape.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> to test</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>a glyph index to test</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-math-is-glyph-extended-shape.returns"></a><h4>Returns</h4>
+<p> true if the glyph is an extended shape, false otherwise</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-math-get-glyph-variants"></a><h3>hb_ot_math_get_glyph_variants ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_math_get_glyph_variants (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
+                               <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                               <em class="parameter"><code>unsigned <span class="type">int</span> *variants_count</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t"><span class="type">hb_ot_math_glyph_variant_t</span></a> *variants</code></em>);</pre>
+<p>This function tries to retrieve the MathGlyphConstruction for the specified
+font, glyph and direction. Note that only the value of
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-HORIZONTAL:CAPS" title="HB_DIRECTION_IS_HORIZONTAL()"><span class="type">HB_DIRECTION_IS_HORIZONTAL</span></a> is considered. It provides the corresponding list
+of size variants as an array of hb_ot_math_glyph_variant_t structs.</p>
+<div class="refsect3">
+<a name="hb-ot-math-get-glyph-variants.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> from which to retrieve the values</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>index of the glyph to stretch</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>direction</p></td>
+<td class="parameter_description"><p>direction of the stretching</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start_offset</p></td>
+<td class="parameter_description"><p>offset of the first variant to retrieve</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>variants_count</p></td>
+<td class="parameter_description"><p>maximum number of variants to retrieve after start_offset
+(IN) and actual number of variants retrieved (OUT)</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>variants</p></td>
+<td class="parameter_description"><p>array of size at least <em class="parameter"><code>variants_count</code></em>
+to store the result</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-math-get-glyph-variants.returns"></a><h4>Returns</h4>
+<p> the total number of size variants available or 0</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-math-get-min-connector-overlap"></a><h3>hb_ot_math_get_min_connector_overlap ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+hb_ot_math_get_min_connector_overlap (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>);</pre>
+<p>This function tries to retrieve the MathVariants table for the specified
+font and returns the minimum overlap of connecting glyphs to draw a glyph
+assembly in the specified direction. Note that only the value of
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-HORIZONTAL:CAPS" title="HB_DIRECTION_IS_HORIZONTAL()"><span class="type">HB_DIRECTION_IS_HORIZONTAL</span></a> is considered.</p>
+<div class="refsect3">
+<a name="hb-ot-math-get-min-connector-overlap.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> from which to retrieve the value</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>direction</p></td>
+<td class="parameter_description"><p>direction of the stretching</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-math-get-min-connector-overlap.returns"></a><h4>Returns</h4>
+<p> requested min connector overlap or 0</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-math-get-glyph-assembly"></a><h3>hb_ot_math_get_glyph_assembly ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_math_get_glyph_assembly (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
+                               <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                               <em class="parameter"><code>unsigned <span class="type">int</span> *parts_count</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t"><span class="type">hb_ot_math_glyph_part_t</span></a> *parts</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *italics_correction</code></em>);</pre>
+<p>This function tries to retrieve the GlyphAssembly for the specified font,
+glyph and direction. Note that only the value of <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-HORIZONTAL:CAPS" title="HB_DIRECTION_IS_HORIZONTAL()"><span class="type">HB_DIRECTION_IS_HORIZONTAL</span></a>
+is considered. It provides the information necessary to draw the glyph
+assembly as an array of <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t"><span class="type">hb_ot_math_glyph_part_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-ot-math-get-glyph-assembly.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> from which to retrieve the values</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>index of the glyph to stretch</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>direction</p></td>
+<td class="parameter_description"><p>direction of the stretching</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start_offset</p></td>
+<td class="parameter_description"><p>offset of the first glyph part to retrieve</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>parts_count</p></td>
+<td class="parameter_description"><p>maximum number of glyph parts to retrieve after start_offset
+(IN) and actual number of parts retrieved (OUT)</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>parts</p></td>
+<td class="parameter_description"><p>array of size at least <em class="parameter"><code>parts_count</code></em>
+to store the result</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>italics_correction</p></td>
+<td class="parameter_description"><p>italic correction of the glyph assembly</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-math-get-glyph-assembly.returns"></a><h4>Returns</h4>
+<p> the total number of parts in the glyph assembly</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-math.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="HB-OT-TAG-MATH:CAPS"></a><h3>HB_OT_TAG_MATH</h3>
+<pre class="programlisting">#define HB_OT_TAG_MATH HB_TAG('M','A','T','H')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-MATH-SCRIPT:CAPS"></a><h3>HB_OT_MATH_SCRIPT</h3>
+<pre class="programlisting">#define HB_OT_MATH_SCRIPT HB_TAG('m','a','t','h')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-math-constant-t"></a><h3>enum hb_ot_math_constant_t</h3>
+<div class="refsect3">
+<a name="hb-ot-math-constant-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SCRIPT-PERCENT-SCALE-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SCRIPT-SCRIPT-PERCENT-SCALE-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-DELIMITED-SUB-FORMULA-MIN-HEIGHT:CAPS"></a>HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-DISPLAY-OPERATOR-MIN-HEIGHT:CAPS"></a>HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-MATH-LEADING:CAPS"></a>HB_OT_MATH_CONSTANT_MATH_LEADING</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-AXIS-HEIGHT:CAPS"></a>HB_OT_MATH_CONSTANT_AXIS_HEIGHT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-ACCENT-BASE-HEIGHT:CAPS"></a>HB_OT_MATH_CONSTANT_ACCENT_BASE_HEIGHT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FLATTENED-ACCENT-BASE-HEIGHT:CAPS"></a>HB_OT_MATH_CONSTANT_FLATTENED_ACCENT_BASE_HEIGHT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUBSCRIPT-SHIFT-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_SUBSCRIPT_SHIFT_DOWN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUBSCRIPT-TOP-MAX:CAPS"></a>HB_OT_MATH_CONSTANT_SUBSCRIPT_TOP_MAX</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUBSCRIPT-BASELINE-DROP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_SUBSCRIPT_BASELINE_DROP_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUPERSCRIPT-SHIFT-UP:CAPS"></a>HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUPERSCRIPT-SHIFT-UP-CRAMPED:CAPS"></a>HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP_CRAMPED</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUPERSCRIPT-BOTTOM-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUPERSCRIPT-BASELINE-DROP-MAX:CAPS"></a>HB_OT_MATH_CONSTANT_SUPERSCRIPT_BASELINE_DROP_MAX</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUB-SUPERSCRIPT-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_SUB_SUPERSCRIPT_GAP_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUPERSCRIPT-BOTTOM-MAX-WITH-SUBSCRIPT:CAPS"></a>HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MAX_WITH_SUBSCRIPT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SPACE-AFTER-SCRIPT:CAPS"></a>HB_OT_MATH_CONSTANT_SPACE_AFTER_SCRIPT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-UPPER-LIMIT-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_UPPER_LIMIT_GAP_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-UPPER-LIMIT-BASELINE-RISE-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_UPPER_LIMIT_BASELINE_RISE_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-LOWER-LIMIT-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_LOWER_LIMIT_GAP_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-LOWER-LIMIT-BASELINE-DROP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_LOWER_LIMIT_BASELINE_DROP_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STACK-TOP-SHIFT-UP:CAPS"></a>HB_OT_MATH_CONSTANT_STACK_TOP_SHIFT_UP</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STACK-TOP-DISPLAY-STYLE-SHIFT-UP:CAPS"></a>HB_OT_MATH_CONSTANT_STACK_TOP_DISPLAY_STYLE_SHIFT_UP</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STACK-BOTTOM-SHIFT-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_STACK_BOTTOM_SHIFT_DOWN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STACK-BOTTOM-DISPLAY-STYLE-SHIFT-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_STACK_BOTTOM_DISPLAY_STYLE_SHIFT_DOWN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STACK-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_STACK_GAP_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STACK-DISPLAY-STYLE-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_STACK_DISPLAY_STYLE_GAP_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STRETCH-STACK-TOP-SHIFT-UP:CAPS"></a>HB_OT_MATH_CONSTANT_STRETCH_STACK_TOP_SHIFT_UP</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STRETCH-STACK-BOTTOM-SHIFT-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_STRETCH_STACK_BOTTOM_SHIFT_DOWN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STRETCH-STACK-GAP-ABOVE-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_ABOVE_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STRETCH-STACK-GAP-BELOW-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_BELOW_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-NUMERATOR-SHIFT-UP:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_SHIFT_UP</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-NUMERATOR-DISPLAY-STYLE-SHIFT-UP:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_DISPLAY_STYLE_SHIFT_UP</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-DENOMINATOR-SHIFT-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_SHIFT_DOWN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-DENOMINATOR-DISPLAY-STYLE-SHIFT-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_DISPLAY_STYLE_SHIFT_DOWN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-NUMERATOR-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_GAP_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-NUM-DISPLAY-STYLE-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_NUM_DISPLAY_STYLE_GAP_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-RULE-THICKNESS:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_RULE_THICKNESS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-DENOMINATOR-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_GAP_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-DENOM-DISPLAY-STYLE-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_DENOM_DISPLAY_STYLE_GAP_MIN</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SKEWED-FRACTION-HORIZONTAL-GAP:CAPS"></a>HB_OT_MATH_CONSTANT_SKEWED_FRACTION_HORIZONTAL_GAP</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SKEWED-FRACTION-VERTICAL-GAP:CAPS"></a>HB_OT_MATH_CONSTANT_SKEWED_FRACTION_VERTICAL_GAP</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-OVERBAR-VERTICAL-GAP:CAPS"></a>HB_OT_MATH_CONSTANT_OVERBAR_VERTICAL_GAP</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-OVERBAR-RULE-THICKNESS:CAPS"></a>HB_OT_MATH_CONSTANT_OVERBAR_RULE_THICKNESS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-OVERBAR-EXTRA-ASCENDER:CAPS"></a>HB_OT_MATH_CONSTANT_OVERBAR_EXTRA_ASCENDER</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-UNDERBAR-VERTICAL-GAP:CAPS"></a>HB_OT_MATH_CONSTANT_UNDERBAR_VERTICAL_GAP</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-UNDERBAR-RULE-THICKNESS:CAPS"></a>HB_OT_MATH_CONSTANT_UNDERBAR_RULE_THICKNESS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-UNDERBAR-EXTRA-DESCENDER:CAPS"></a>HB_OT_MATH_CONSTANT_UNDERBAR_EXTRA_DESCENDER</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-RADICAL-VERTICAL-GAP:CAPS"></a>HB_OT_MATH_CONSTANT_RADICAL_VERTICAL_GAP</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-RADICAL-DISPLAY-STYLE-VERTICAL-GAP:CAPS"></a>HB_OT_MATH_CONSTANT_RADICAL_DISPLAY_STYLE_VERTICAL_GAP</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-RADICAL-RULE-THICKNESS:CAPS"></a>HB_OT_MATH_CONSTANT_RADICAL_RULE_THICKNESS</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-RADICAL-EXTRA-ASCENDER:CAPS"></a>HB_OT_MATH_CONSTANT_RADICAL_EXTRA_ASCENDER</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-RADICAL-KERN-BEFORE-DEGREE:CAPS"></a>HB_OT_MATH_CONSTANT_RADICAL_KERN_BEFORE_DEGREE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-RADICAL-KERN-AFTER-DEGREE:CAPS"></a>HB_OT_MATH_CONSTANT_RADICAL_KERN_AFTER_DEGREE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-RADICAL-DEGREE-BOTTOM-RAISE-PERCENT:CAPS"></a>HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-math-kern-t"></a><h3>enum hb_ot_math_kern_t</h3>
+<div class="refsect3">
+<a name="hb-ot-math-kern-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-KERN-TOP-RIGHT:CAPS"></a>HB_OT_MATH_KERN_TOP_RIGHT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-KERN-TOP-LEFT:CAPS"></a>HB_OT_MATH_KERN_TOP_LEFT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-KERN-BOTTOM-RIGHT:CAPS"></a>HB_OT_MATH_KERN_BOTTOM_RIGHT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-MATH-KERN-BOTTOM-LEFT:CAPS"></a>HB_OT_MATH_KERN_BOTTOM_LEFT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-math-glyph-variant-t-struct"></a><h3>hb_ot_math_glyph_variant_t</h3>
+<pre class="programlisting">typedef struct {
+  hb_codepoint_t glyph;
+  hb_position_t advance;
+} hb_ot_math_glyph_variant_t;
+</pre>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-math-glyph-part-flags-t"></a><h3>enum hb_ot_math_glyph_part_flags_t</h3>
+<div class="refsect3">
+<a name="hb-ot-math-glyph-part-flags-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody><tr>
+<td class="enum_member_name"><p><a name="HB-MATH-GLYPH-PART-FLAG-EXTENDER:CAPS"></a>HB_MATH_GLYPH_PART_FLAG_EXTENDER</p></td>
+<td> </td>
+<td> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-math-glyph-part-t-struct"></a><h3>hb_ot_math_glyph_part_t</h3>
+<pre class="programlisting">typedef struct {
+  hb_codepoint_t glyph;
+  hb_position_t start_connector_length;
+  hb_position_t end_connector_length;
+  hb_position_t full_advance;
+  hb_ot_math_glyph_part_flags_t flags;
+} hb_ot_math_glyph_part_t;
+</pre>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-name.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-name.html
new file mode 100644
index 0000000..68e3a97
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-name.html
@@ -0,0 +1,327 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-ot-name: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch10.html" title="OpenType API">
+<link rel="prev" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">
+<link rel="next" href="harfbuzz-hb-ot-shape.html" title="hb-ot-shape">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-ot-name.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch10.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-ot-math.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-ot-shape.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-ot-name"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-ot-name.top_of_page"></a>hb-ot-name</span></h2>
+<p>hb-ot-name — OpenType font name information</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-name.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">const <span class="returnvalue">hb_ot_name_entry_t</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-list-names" title="hb_ot_name_list_names ()">hb_ot_name_list_names</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf16" title="hb_ot_name_get_utf16 ()">hb_ot_name_get_utf16</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf32" title="hb_ot_name_get_utf32 ()">hb_ot_name_get_utf32</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf8" title="hb_ot_name_get_utf8 ()">hb_ot_name_get_utf8</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-name.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody><tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t">hb_ot_name_id_t</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-name.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-ot.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-name.description"></a><h2>Description</h2>
+<p>Functions for fetching name strings from OpenType fonts.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-name.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-ot-name-list-names"></a><h3>hb_ot_name_list_names ()</h3>
+<pre class="programlisting">const <span class="returnvalue">hb_ot_name_entry_t</span> *
+hb_ot_name_list_names (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                       <em class="parameter"><code>unsigned <span class="type">int</span> *num_entries</code></em>);</pre>
+<p>Enumerates all available name IDs and language combinations. Returned
+array is owned by the <em class="parameter"><code>face</code></em>
+ and should not be modified.  It can be
+used as long as <em class="parameter"><code>face</code></em>
+ is alive.</p>
+<div class="refsect3">
+<a name="hb-ot-name-list-names.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>num_entries</p></td>
+<td class="parameter_description"><p> number of returned entries. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-name-list-names.returns"></a><h4>Returns</h4>
+<p> Array of available name entries. </p>
+<p><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_entries]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-name-get-utf16"></a><h3>hb_ot_name_get_utf16 ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_name_get_utf16 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> name_id</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> language</code></em>,
+                      <em class="parameter"><code>unsigned <span class="type">int</span> *text_size</code></em>,
+                      <em class="parameter"><code><span class="type">uint16_t</span> *text</code></em>);</pre>
+<p>Fetches a font name from the OpenType 'name' table.
+If <em class="parameter"><code>language</code></em>
+ is <a class="link" href="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS" title="HB_LANGUAGE_INVALID"><span class="type">HB_LANGUAGE_INVALID</span></a>, English ("en") is assumed.
+Returns string in UTF-16 encoding.</p>
+<div class="refsect3">
+<a name="hb-ot-name-get-utf16.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>name_id</p></td>
+<td class="parameter_description"><p>OpenType name identifier to fetch.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>language</p></td>
+<td class="parameter_description"><p>language to fetch the name for.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text_size</p></td>
+<td class="parameter_description"><p> input size of <em class="parameter"><code>text</code></em>
+buffer, and output size of
+text written to buffer. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text</p></td>
+<td class="parameter_description"><p> buffer to write fetched name into. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Out parameter, where caller must allocate storage."><span class="acronym">out caller-allocates</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_size]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-name-get-utf16.returns"></a><h4>Returns</h4>
+<p> full length of the requested string, or 0 if not found.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-name-get-utf32"></a><h3>hb_ot_name_get_utf32 ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_name_get_utf32 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> name_id</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> language</code></em>,
+                      <em class="parameter"><code>unsigned <span class="type">int</span> *text_size</code></em>,
+                      <em class="parameter"><code><span class="type">uint32_t</span> *text</code></em>);</pre>
+<p>Fetches a font name from the OpenType 'name' table.
+If <em class="parameter"><code>language</code></em>
+ is <a class="link" href="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS" title="HB_LANGUAGE_INVALID"><span class="type">HB_LANGUAGE_INVALID</span></a>, English ("en") is assumed.
+Returns string in UTF-32 encoding.</p>
+<div class="refsect3">
+<a name="hb-ot-name-get-utf32.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>name_id</p></td>
+<td class="parameter_description"><p>OpenType name identifier to fetch.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>language</p></td>
+<td class="parameter_description"><p>language to fetch the name for.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text_size</p></td>
+<td class="parameter_description"><p> input size of <em class="parameter"><code>text</code></em>
+buffer, and output size of
+text written to buffer. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text</p></td>
+<td class="parameter_description"><p> buffer to write fetched name into. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Out parameter, where caller must allocate storage."><span class="acronym">out caller-allocates</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_size]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-name-get-utf32.returns"></a><h4>Returns</h4>
+<p> full length of the requested string, or 0 if not found.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-name-get-utf8"></a><h3>hb_ot_name_get_utf8 ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_name_get_utf8 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> name_id</code></em>,
+                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> language</code></em>,
+                     <em class="parameter"><code>unsigned <span class="type">int</span> *text_size</code></em>,
+                     <em class="parameter"><code><span class="type">char</span> *text</code></em>);</pre>
+<p>Fetches a font name from the OpenType 'name' table.
+If <em class="parameter"><code>language</code></em>
+ is <a class="link" href="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS" title="HB_LANGUAGE_INVALID"><span class="type">HB_LANGUAGE_INVALID</span></a>, English ("en") is assumed.
+Returns string in UTF-8 encoding.</p>
+<div class="refsect3">
+<a name="hb-ot-name-get-utf8.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>font face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>name_id</p></td>
+<td class="parameter_description"><p>OpenType name identifier to fetch.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>language</p></td>
+<td class="parameter_description"><p>language to fetch the name for.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text_size</p></td>
+<td class="parameter_description"><p> input size of <em class="parameter"><code>text</code></em>
+buffer, and output size of
+text written to buffer. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>text</p></td>
+<td class="parameter_description"><p> buffer to write fetched name into. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Out parameter, where caller must allocate storage."><span class="acronym">out caller-allocates</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_size]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-name-get-utf8.returns"></a><h4>Returns</h4>
+<p> full length of the requested string, or 0 if not found.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-name.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="hb-ot-name-id-t"></a><h3>hb_ot_name_id_t</h3>
+<pre class="programlisting">typedef unsigned int hb_ot_name_id_t;
+</pre>
+<p>An integral type representing an OpenType 'name' table name identifier.
+There are predefined name IDs, as well as name IDs return from other
+API.  These can be used to fetch name strings from a font face.</p>
+<p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-shape.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-shape.html
new file mode 100644
index 0000000..30ed4410
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-shape.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-ot-shape: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch10.html" title="OpenType API">
+<link rel="prev" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">
+<link rel="next" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-ot-shape.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch10.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-ot-name.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-ot-var.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-ot-shape"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-ot-shape.top_of_page"></a>hb-ot-shape</span></h2>
+<p>hb-ot-shape — OpenType shaping support</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-shape.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody><tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-shape.html#hb-ot-shape-glyphs-closure" title="hb_ot_shape_glyphs_closure ()">hb_ot_shape_glyphs_closure</a> <span class="c_punctuation">()</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-shape.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-ot.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-shape.description"></a><h2>Description</h2>
+<p>Support functions for OpenType shaping related queries.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-shape.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-ot-shape-glyphs-closure"></a><h3>hb_ot_shape_glyphs_closure ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ot_shape_glyphs_closure (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                            <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *features</code></em>,
+                            <em class="parameter"><code>unsigned <span class="type">int</span> num_features</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-shape.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-var.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-var.html
new file mode 100644
index 0000000..b8e3fd3
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-ot-var.html
@@ -0,0 +1,345 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-ot-var: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch10.html" title="OpenType API">
+<link rel="prev" href="harfbuzz-hb-ot-shape.html" title="hb-ot-shape">
+<link rel="next" href="ch11.html" title="Apple Advanced Typography API">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-ot-var.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-ot-var.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch10.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-ot-shape.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="ch11.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-ot-var"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-ot-var.top_of_page"></a>hb-ot-var</span></h2>
+<p>hb-ot-var — OpenType Font Variations</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-var.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-has-data" title="hb_ot_var_has_data ()">hb_ot_var_has_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-find-axis-info" title="hb_ot_var_find_axis_info ()">hb_ot_var_find_axis_info</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-get-axis-count" title="hb_ot_var_get_axis_count ()">hb_ot_var_get_axis_count</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-get-axis-infos" title="hb_ot_var_get_axis_infos ()">hb_ot_var_get_axis_infos</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-get-named-instance-count" title="hb_ot_var_get_named_instance_count ()">hb_ot_var_get_named_instance_count</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-subfamily-name-id" title="hb_ot_var_named_instance_get_subfamily_name_id ()">hb_ot_var_named_instance_get_subfamily_name_id</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-postscript-name-id" title="hb_ot_var_named_instance_get_postscript_name_id ()">hb_ot_var_named_instance_get_postscript_name_id</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-design-coords" title="hb_ot_var_named_instance_get_design_coords ()">hb_ot_var_named_instance_get_design_coords</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-normalize-variations" title="hb_ot_var_normalize_variations ()">hb_ot_var_normalize_variations</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-normalize-coords" title="hb_ot_var_normalize_coords ()">hb_ot_var_normalize_coords</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-var.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-ITALIC:CAPS" title="HB_OT_TAG_VAR_AXIS_ITALIC">HB_OT_TAG_VAR_AXIS_ITALIC</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-OPTICAL-SIZE:CAPS" title="HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE">HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-SLANT:CAPS" title="HB_OT_TAG_VAR_AXIS_SLANT">HB_OT_TAG_VAR_AXIS_SLANT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-WEIGHT:CAPS" title="HB_OT_TAG_VAR_AXIS_WEIGHT">HB_OT_TAG_VAR_AXIS_WEIGHT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-WIDTH:CAPS" title="HB_OT_TAG_VAR_AXIS_WIDTH">HB_OT_TAG_VAR_AXIS_WIDTH</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-axis-flags-t" title="enum hb_ot_var_axis_flags_t">hb_ot_var_axis_flags_t</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-var.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GFlags</a>
+    <span class="lineart">╰──</span> hb_ot_var_axis_flags_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-var.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-ot.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-var.description"></a><h2>Description</h2>
+<p>Functions for fetching information about OpenType Variable Fonts.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-var.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-ot-var-has-data"></a><h3>hb_ot_var_has_data ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_var_has_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>This function allows to verify the presence of OpenType variation data on the face.</p>
+<div class="refsect3">
+<a name="hb-ot-var-has-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> to test</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-var-has-data.returns"></a><h4>Returns</h4>
+<p> true if face has a `fvar' table and false otherwise</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-var-find-axis-info"></a><h3>hb_ot_var_find_axis_info ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_var_find_axis_info (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> axis_tag</code></em>,
+                          <em class="parameter"><code><span class="type">hb_ot_var_axis_info_t</span> *axis_info</code></em>);</pre>
+<p class="since">Since: 2.2.0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-var-get-axis-count"></a><h3>hb_ot_var_get_axis_count ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_var_get_axis_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-var-get-axis-infos"></a><h3>hb_ot_var_get_axis_infos ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_var_get_axis_infos (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                          <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                          <em class="parameter"><code>unsigned <span class="type">int</span> *axes_count</code></em>,
+                          <em class="parameter"><code><span class="type">hb_ot_var_axis_info_t</span> *axes_array</code></em>);</pre>
+<p class="since">Since: 2.2.0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-var-get-named-instance-count"></a><h3>hb_ot_var_get_named_instance_count ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_var_get_named_instance_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-var-named-instance-get-subfamily-name-id"></a><h3>hb_ot_var_named_instance_get_subfamily_name_id ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
+hb_ot_var_named_instance_get_subfamily_name_id
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> instance_index</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-var-named-instance-get-postscript-name-id"></a><h3>hb_ot_var_named_instance_get_postscript_name_id ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
+hb_ot_var_named_instance_get_postscript_name_id
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> instance_index</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-var-named-instance-get-design-coords"></a><h3>hb_ot_var_named_instance_get_design_coords ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_var_named_instance_get_design_coords
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> instance_index</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> *coords_length</code></em>,
+                                <em class="parameter"><code><span class="type">float</span> *coords</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-var-normalize-variations"></a><h3>hb_ot_var_normalize_variations ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ot_var_normalize_variations (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-font.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a> *variations</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> variations_length</code></em>,
+                                <em class="parameter"><code><span class="type">int</span> *coords</code></em>,
+                                <em class="parameter"><code>unsigned <span class="type">int</span> coords_length</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-var-normalize-coords"></a><h3>hb_ot_var_normalize_coords ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_ot_var_normalize_coords (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                            <em class="parameter"><code>unsigned <span class="type">int</span> coords_length</code></em>,
+                            <em class="parameter"><code>const <span class="type">float</span> *design_coords</code></em>,
+                            <em class="parameter"><code><span class="type">int</span> *normalized_coords</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-var.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="HB-OT-TAG-VAR-AXIS-ITALIC:CAPS"></a><h3>HB_OT_TAG_VAR_AXIS_ITALIC</h3>
+<pre class="programlisting">#define HB_OT_TAG_VAR_AXIS_ITALIC HB_TAG('i','t','a','l')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-TAG-VAR-AXIS-OPTICAL-SIZE:CAPS"></a><h3>HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE</h3>
+<pre class="programlisting">#define HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE HB_TAG('o','p','s','z')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-TAG-VAR-AXIS-SLANT:CAPS"></a><h3>HB_OT_TAG_VAR_AXIS_SLANT</h3>
+<pre class="programlisting">#define HB_OT_TAG_VAR_AXIS_SLANT HB_TAG('s','l','n','t')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-TAG-VAR-AXIS-WEIGHT:CAPS"></a><h3>HB_OT_TAG_VAR_AXIS_WEIGHT</h3>
+<pre class="programlisting">#define HB_OT_TAG_VAR_AXIS_WEIGHT HB_TAG('w','g','h','t')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-TAG-VAR-AXIS-WIDTH:CAPS"></a><h3>HB_OT_TAG_VAR_AXIS_WIDTH</h3>
+<pre class="programlisting">#define HB_OT_TAG_VAR_AXIS_WIDTH HB_TAG('w','d','t','h')
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-var-axis-flags-t"></a><h3>enum hb_ot_var_axis_flags_t</h3>
+<div class="refsect3">
+<a name="hb-ot-var-axis-flags-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-VAR-AXIS-FLAG-HIDDEN:CAPS"></a>HB_OT_VAR_AXIS_FLAG_HIDDEN</p></td>
+<td class="enum_member_description">
+<p>The axis should not be exposed directly in user interfaces.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-VAR-AXIS-FLAG-MAX-VALUE:CAPS"></a>_HB_OT_VAR_AXIS_FLAG_MAX_VALUE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: 2.2.0</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-set.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-set.html
new file mode 100644
index 0000000..b07920d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-set.html
@@ -0,0 +1,1076 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-set: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch09.html" title="Core API">
+<link rel="prev" href="harfbuzz-hb-map.html" title="hb-map">
+<link rel="next" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-set.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-set.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch09.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-map.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-shape-plan.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-set"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-set.top_of_page"></a>hb-set</span></h2>
+<p>hb-set — Object representing a set of integers</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-set.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-add" title="hb_set_add ()">hb_set_add</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-add-range" title="hb_set_add_range ()">hb_set_add_range</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-allocation-successful" title="hb_set_allocation_successful ()">hb_set_allocation_successful</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-clear" title="hb_set_clear ()">hb_set_clear</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="returnvalue">hb_set_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-create" title="hb_set_create ()">hb_set_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-del" title="hb_set_del ()">hb_set_del</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-del-range" title="hb_set_del_range ()">hb_set_del_range</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-destroy" title="hb_set_destroy ()">hb_set_destroy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="returnvalue">hb_set_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-empty" title="hb_set_get_empty ()">hb_set_get_empty</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-max" title="hb_set_get_max ()">hb_set_get_max</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-min" title="hb_set_get_min ()">hb_set_get_min</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-population" title="hb_set_get_population ()">hb_set_get_population</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-user-data" title="hb_set_get_user_data ()">hb_set_get_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-has" title="hb_set_has ()">hb_set_has</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-intersect" title="hb_set_intersect ()">hb_set_intersect</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-is-empty" title="hb_set_is_empty ()">hb_set_is_empty</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-is-equal" title="hb_set_is_equal ()">hb_set_is_equal</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-is-subset" title="hb_set_is_subset ()">hb_set_is_subset</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-next" title="hb_set_next ()">hb_set_next</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-next-range" title="hb_set_next_range ()">hb_set_next_range</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-previous" title="hb_set_previous ()">hb_set_previous</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-previous-range" title="hb_set_previous_range ()">hb_set_previous_range</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="returnvalue">hb_set_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-reference" title="hb_set_reference ()">hb_set_reference</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-set" title="hb_set_set ()">hb_set_set</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-set-user-data" title="hb_set_set_user_data ()">hb_set_set_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-subtract" title="hb_set_subtract ()">hb_set_subtract</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-symmetric-difference" title="hb_set_symmetric_difference ()">hb_set_symmetric_difference</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-union" title="hb_set_union ()">hb_set_union</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="hb-set-t"></a><div class="refsect1">
+<a name="harfbuzz-hb-set.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID">HB_SET_VALUE_INVALID</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-set.html#hb-set-t">hb_set_t</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-set.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
+    <span class="lineart">╰──</span> hb_set_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-set.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-set.description"></a><h2>Description</h2>
+<p>Set objects represent a mathematical set of integer values.  They are
+used in non-shaping API to query certain set of characters or glyphs,
+or other integer values.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-set.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-set-add"></a><h3>hb_set_add ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_set_add (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> codepoint</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-add.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-add-range"></a><h3>hb_set_add_range ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_set_add_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> first</code></em>,
+                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> last</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-add-range.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-allocation-successful"></a><h3>hb_set_allocation_successful ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_set_allocation_successful (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-allocation-successful.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-clear"></a><h3>hb_set_clear ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_set_clear (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-clear.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-create"></a><h3>hb_set_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="returnvalue">hb_set_t</span></a> *
+hb_set_create (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p><span class="annotation">[Xconstructor]</span></p>
+<div class="refsect3">
+<a name="hb-set-create.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-del"></a><h3>hb_set_del ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_set_del (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> codepoint</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-del.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-del-range"></a><h3>hb_set_del_range ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_set_del_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> first</code></em>,
+                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> last</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-del-range.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-destroy"></a><h3>hb_set_destroy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_set_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-set-destroy.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-get-empty"></a><h3>hb_set_get_empty ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="returnvalue">hb_set_t</span></a> *
+hb_set_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-get-empty.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-get-max"></a><h3>hb_set_get_max ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+hb_set_get_max (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<p>Finds the maximum number in the set.</p>
+<div class="refsect3">
+<a name="hb-set-get-max.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-set-get-max.returns"></a><h4>Returns</h4>
+<p> minimum of the set, or <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> if set is empty.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-get-min"></a><h3>hb_set_get_min ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+hb_set_get_min (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<p>Finds the minimum number in the set.</p>
+<div class="refsect3">
+<a name="hb-set-get-min.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-set-get-min.returns"></a><h4>Returns</h4>
+<p> minimum of the set, or <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> if set is empty.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-get-population"></a><h3>hb_set_get_population ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_set_get_population (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<p>Returns the number of numbers in the set.</p>
+<div class="refsect3">
+<a name="hb-set-get-population.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-set-get-population.returns"></a><h4>Returns</h4>
+<p> set population.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-get-user-data"></a><h3>hb_set_get_user_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> *
+hb_set_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-set-get-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-set-get-user-data.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-has"></a><h3>hb_set_has ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_set_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> codepoint</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-has.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-intersect"></a><h3>hb_set_intersect ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_set_intersect (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+                  <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-intersect.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-is-empty"></a><h3>hb_set_is_empty ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_set_is_empty (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-is-empty.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-is-equal"></a><h3>hb_set_is_equal ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_set_is_equal (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+                 <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-is-equal.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>other</p></td>
+<td class="parameter_description"><p>other set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-set-is-equal.returns"></a><h4>Returns</h4>
+<p> <code class="literal">TRUE</code> if the two sets are equal, <code class="literal">FALSE</code> otherwise.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-is-subset"></a><h3>hb_set_is_subset ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_set_is_subset (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+                  <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *larger_set</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-is-subset.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>larger_set</p></td>
+<td class="parameter_description"><p>other set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-set-is-subset.returns"></a><h4>Returns</h4>
+<p> <code class="literal">TRUE</code> if the <em class="parameter"><code>set</code></em>
+is a subset of (or equal to) <em class="parameter"><code>larger_set</code></em>
+, <code class="literal">FALSE</code> otherwise.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-8-1.html#api-index-1.8.1">1.8.1</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-next"></a><h3>hb_set_next ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_set_next (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *codepoint</code></em>);</pre>
+<p>Gets the next number in <em class="parameter"><code>set</code></em>
+ that is greater than current value of <em class="parameter"><code>codepoint</code></em>
+.</p>
+<p>Set <em class="parameter"><code>codepoint</code></em>
+ to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> to get started.</p>
+<div class="refsect3">
+<a name="hb-set-next.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>codepoint</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-set-next.returns"></a><h4>Returns</h4>
+<p> whether there was a next value.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-next-range"></a><h3>hb_set_next_range ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_set_next_range (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *first</code></em>,
+                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *last</code></em>);</pre>
+<p>Gets the next consecutive range of numbers in <em class="parameter"><code>set</code></em>
+ that
+are greater than current value of <em class="parameter"><code>last</code></em>
+.</p>
+<p>Set <em class="parameter"><code>last</code></em>
+ to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> to get started.</p>
+<div class="refsect3">
+<a name="hb-set-next-range.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first</p></td>
+<td class="parameter_description"><p> output first codepoint in the range. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>last</p></td>
+<td class="parameter_description"><p> input current last and output last codepoint in the range. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-set-next-range.returns"></a><h4>Returns</h4>
+<p> whether there was a next range.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-previous"></a><h3>hb_set_previous ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_set_previous (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *codepoint</code></em>);</pre>
+<p>Gets the previous number in <em class="parameter"><code>set</code></em>
+ that is slower than current value of <em class="parameter"><code>codepoint</code></em>
+.</p>
+<p>Set <em class="parameter"><code>codepoint</code></em>
+ to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> to get started.</p>
+<div class="refsect3">
+<a name="hb-set-previous.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>codepoint</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-set-previous.returns"></a><h4>Returns</h4>
+<p> whether there was a previous value.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-8-0.html#api-index-1.8.0">1.8.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-previous-range"></a><h3>hb_set_previous_range ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_set_previous_range (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *first</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *last</code></em>);</pre>
+<p>Gets the previous consecutive range of numbers in <em class="parameter"><code>set</code></em>
+ that
+are greater than current value of <em class="parameter"><code>last</code></em>
+.</p>
+<p>Set <em class="parameter"><code>first</code></em>
+ to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> to get started.</p>
+<div class="refsect3">
+<a name="hb-set-previous-range.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first</p></td>
+<td class="parameter_description"><p> input current first and output first codepoint in the range. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>last</p></td>
+<td class="parameter_description"><p> output last codepoint in the range. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-set-previous-range.returns"></a><h4>Returns</h4>
+<p> whether there was a previous range.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-8-0.html#api-index-1.8.0">1.8.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-reference"></a><h3>hb_set_reference ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="returnvalue">hb_set_t</span></a> *
+hb_set_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-set-reference.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-set-reference.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-set"></a><h3>hb_set_set ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_set_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+            <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-set.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-set-user-data"></a><h3>hb_set_set_user_data ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_set_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+                      <em class="parameter"><code><span class="type">void</span> *data</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-set-set-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-subtract"></a><h3>hb_set_subtract ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_set_subtract (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+                 <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-subtract.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-symmetric-difference"></a><h3>hb_set_symmetric_difference ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_set_symmetric_difference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+                             <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-symmetric-difference.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-union"></a><h3>hb_set_union ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_set_union (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-set-union.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-set.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="HB-SET-VALUE-INVALID:CAPS"></a><h3>HB_SET_VALUE_INVALID</h3>
+<pre class="programlisting">#define HB_SET_VALUE_INVALID ((hb_codepoint_t) -1)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-t"></a><h3>hb_set_t</h3>
+<pre class="programlisting">typedef struct hb_set_t hb_set_t;
+</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-shape-plan.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-shape-plan.html
new file mode 100644
index 0000000..3986cab
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-shape-plan.html
@@ -0,0 +1,468 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-shape-plan: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch09.html" title="Core API">
+<link rel="prev" href="harfbuzz-hb-set.html" title="hb-set">
+<link rel="next" href="harfbuzz-hb-shape.html" title="hb-shape">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-shape-plan.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-shape-plan.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch09.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-set.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-shape.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-shape-plan"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-shape-plan.top_of_page"></a>hb-shape-plan</span></h2>
+<p>hb-shape-plan — Object representing a shaping plan</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-shape-plan.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create" title="hb_shape_plan_create ()">hb_shape_plan_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached" title="hb_shape_plan_create_cached ()">hb_shape_plan_create_cached</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create2" title="hb_shape_plan_create2 ()">hb_shape_plan_create2</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached2" title="hb_shape_plan_create_cached2 ()">hb_shape_plan_create_cached2</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-destroy" title="hb_shape_plan_destroy ()">hb_shape_plan_destroy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-execute" title="hb_shape_plan_execute ()">hb_shape_plan_execute</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-empty" title="hb_shape_plan_get_empty ()">hb_shape_plan_get_empty</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <span class="returnvalue">char</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-shaper" title="hb_shape_plan_get_shaper ()">hb_shape_plan_get_shaper</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-user-data" title="hb_shape_plan_get_user_data ()">hb_shape_plan_get_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-reference" title="hb_shape_plan_reference ()">hb_shape_plan_reference</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-set-user-data" title="hb_shape_plan_set_user_data ()">hb_shape_plan_set_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="hb-shape-plan-t"></a><div class="refsect1">
+<a name="harfbuzz-hb-shape-plan.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody><tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t">hb_shape_plan_t</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-shape-plan.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
+    <span class="lineart">╰──</span> hb_shape_plan_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-shape-plan.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-shape-plan.description"></a><h2>Description</h2>
+<p>Shape plans are not used for shaping directly, but can be access to query
+certain information about how shaping will perform given a set of input
+parameters (script, language, direction, features, etc.)
+Most client would not need to deal with shape plans directly.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-shape-plan.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-shape-plan-create"></a><h3>hb_shape_plan_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+hb_shape_plan_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                      <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>,
+                      <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *user_features</code></em>,
+                      <em class="parameter"><code>unsigned <span class="type">int</span> num_user_features</code></em>,
+                      <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
+<p><span class="annotation">[Xconstructor]</span></p>
+<div class="refsect3">
+<a name="hb-shape-plan-create.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>user_features</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_user_features]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>shaper_list</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-shape-plan-create.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-shape-plan-create-cached"></a><h3>hb_shape_plan_create_cached ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+hb_shape_plan_create_cached (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                             <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>,
+                             <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *user_features</code></em>,
+                             <em class="parameter"><code>unsigned <span class="type">int</span> num_user_features</code></em>,
+                             <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-shape-plan-create-cached.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>user_features</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_user_features]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>shaper_list</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-shape-plan-create-cached.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-shape-plan-create2"></a><h3>hb_shape_plan_create2 ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+hb_shape_plan_create2 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                       <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>,
+                       <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *user_features</code></em>,
+                       <em class="parameter"><code>unsigned <span class="type">int</span> num_user_features</code></em>,
+                       <em class="parameter"><code>const <span class="type">int</span> *coords</code></em>,
+                       <em class="parameter"><code>unsigned <span class="type">int</span> num_coords</code></em>,
+                       <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-shape-plan-create-cached2"></a><h3>hb_shape_plan_create_cached2 ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+hb_shape_plan_create_cached2 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>,
+                              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *user_features</code></em>,
+                              <em class="parameter"><code>unsigned <span class="type">int</span> num_user_features</code></em>,
+                              <em class="parameter"><code>const <span class="type">int</span> *coords</code></em>,
+                              <em class="parameter"><code>unsigned <span class="type">int</span> num_coords</code></em>,
+                              <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-shape-plan-destroy"></a><h3>hb_shape_plan_destroy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_shape_plan_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-shape-plan-destroy.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>shape_plan</p></td>
+<td class="parameter_description"><p>a shape plan.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-shape-plan-execute"></a><h3>hb_shape_plan_execute ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_shape_plan_execute (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                       <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *features</code></em>,
+                       <em class="parameter"><code>unsigned <span class="type">int</span> num_features</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-shape-plan-execute.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>shape_plan</p></td>
+<td class="parameter_description"><p>a shape plan.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>a buffer.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>features</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_features]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-shape-plan-get-empty"></a><h3>hb_shape_plan_get_empty ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+hb_shape_plan_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<div class="refsect3">
+<a name="hb-shape-plan-get-empty.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-shape-plan-get-shaper"></a><h3>hb_shape_plan_get_shaper ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *
+hb_shape_plan_get_shaper (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-shape-plan-get-shaper.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>shape_plan</p></td>
+<td class="parameter_description"><p>a shape plan.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-shape-plan-get-shaper.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-shape-plan-get-user-data"></a><h3>hb_shape_plan_get_user_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> *
+hb_shape_plan_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-shape-plan-get-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>shape_plan</p></td>
+<td class="parameter_description"><p>a shape plan.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-shape-plan-get-user-data.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-shape-plan-reference"></a><h3>hb_shape_plan_reference ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+hb_shape_plan_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-shape-plan-reference.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>shape_plan</p></td>
+<td class="parameter_description"><p>a shape plan.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-shape-plan-reference.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-shape-plan-set-user-data"></a><h3>hb_shape_plan_set_user_data ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_shape_plan_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+                             <em class="parameter"><code><span class="type">void</span> *data</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-shape-plan-set-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>shape_plan</p></td>
+<td class="parameter_description"><p>a shape plan.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-shape-plan.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="hb-shape-plan-t"></a><h3>hb_shape_plan_t</h3>
+<pre class="programlisting">typedef struct hb_shape_plan_t hb_shape_plan_t;
+</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-shape.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-shape.html
new file mode 100644
index 0000000..b26887c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-shape.html
@@ -0,0 +1,367 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-shape: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch09.html" title="Core API">
+<link rel="prev" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">
+<link rel="next" href="harfbuzz-hb-unicode.html" title="hb-unicode">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-shape.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-shape.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch09.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-shape-plan.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-unicode.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-shape"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-shape.top_of_page"></a>hb-shape</span></h2>
+<p>hb-shape — Conversion of text strings into positioned glyphs</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-shape.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape.html#hb-feature-from-string" title="hb_feature_from_string ()">hb_feature_from_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape.html#hb-feature-to-string" title="hb_feature_to_string ()">hb_feature_to_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape ()">hb_shape</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape.html#hb-shape-full" title="hb_shape_full ()">hb_shape_full</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <span class="returnvalue">char</span> **
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-shape.html#hb-shape-list-shapers" title="hb_shape_list_shapers ()">hb_shape_list_shapers</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="hb-feature-t"></a><div class="refsect1">
+<a name="harfbuzz-hb-shape.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-shape.html#HB-FEATURE-GLOBAL-END:CAPS" title="HB_FEATURE_GLOBAL_END">HB_FEATURE_GLOBAL_END</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-shape.html#HB-FEATURE-GLOBAL-START:CAPS" title="HB_FEATURE_GLOBAL_START">HB_FEATURE_GLOBAL_START</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-shape.html#hb-feature-t-struct" title="hb_feature_t">hb_feature_t</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-shape.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
+    <span class="lineart">╰──</span> hb_feature_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-shape.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-shape.description"></a><h2>Description</h2>
+<p>Shaping is the central operation of HarfBuzz. Shaping operates on buffers,
+which are sequences of Unicode characters that use the same font and have
+the same text direction, script, and language. After shaping the buffer
+contains the output glyphs and their positions.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-shape.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-feature-from-string"></a><h3>hb_feature_from_string ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_feature_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
+                        <em class="parameter"><code><span class="type">int</span> len</code></em>,
+                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *feature</code></em>);</pre>
+<p>Parses a string into a <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a>.</p>
+<p>TODO: document the syntax here.</p>
+<div class="refsect3">
+<a name="hb-feature-from-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>str</p></td>
+<td class="parameter_description"><p> a string to parse. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>len</p></td>
+<td class="parameter_description"><p>length of <em class="parameter"><code>str</code></em>
+, or -1 if string is <code class="literal">NULL</code> terminated</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>feature</p></td>
+<td class="parameter_description"><p> the <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> to initialize with the parsed values. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-feature-from-string.returns"></a><h4>Returns</h4>
+<p><code class="literal">true</code> if <em class="parameter"><code>str</code></em>
+is successfully parsed, <code class="literal">false</code> otherwise.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-5.html#api-index-0.9.5">0.9.5</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-feature-to-string"></a><h3>hb_feature_to_string ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_feature_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *feature</code></em>,
+                      <em class="parameter"><code><span class="type">char</span> *buf</code></em>,
+                      <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
+<p>Converts a <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> into a <code class="literal">NULL</code>-terminated string in the format
+understood by <a class="link" href="harfbuzz-hb-shape.html#hb-feature-from-string" title="hb_feature_from_string ()"><code class="function">hb_feature_from_string()</code></a>. The client in responsible for
+allocating big enough size for <em class="parameter"><code>buf</code></em>
+, 128 bytes is more than enough.</p>
+<div class="refsect3">
+<a name="hb-feature-to-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>feature</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> to convert</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buf</p></td>
+<td class="parameter_description"><p> output string. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size][<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>size</p></td>
+<td class="parameter_description"><p>the allocated size of <em class="parameter"><code>buf</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-5.html#api-index-0.9.5">0.9.5</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-shape"></a><h3>hb_shape ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_shape (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+          <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+          <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *features</code></em>,
+          <em class="parameter"><code>unsigned <span class="type">int</span> num_features</code></em>);</pre>
+<p>Shapes <em class="parameter"><code>buffer</code></em>
+ using <em class="parameter"><code>font</code></em>
+ turning its Unicode characters content to
+positioned glyphs. If <em class="parameter"><code>features</code></em>
+ is not <code class="literal">NULL</code>, it will be used to control the
+features applied during shaping.</p>
+<div class="refsect3">
+<a name="hb-shape.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> to use for shaping</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> to shape</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>features</p></td>
+<td class="parameter_description"><p> an array of user
+specified <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> or <code class="literal">NULL</code>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_features][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>num_features</p></td>
+<td class="parameter_description"><p>the length of <em class="parameter"><code>features</code></em>
+array</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-shape-full"></a><h3>hb_shape_full ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_shape_full (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+               <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+               <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *features</code></em>,
+               <em class="parameter"><code>unsigned <span class="type">int</span> num_features</code></em>,
+               <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
+<p>See <a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape ()"><code class="function">hb_shape()</code></a> for details. If <em class="parameter"><code>shaper_list</code></em>
+ is not <code class="literal">NULL</code>, the specified
+shapers will be used in the given order, otherwise the default shapers list
+will be used.</p>
+<div class="refsect3">
+<a name="hb-shape-full.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> to use for shaping</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> to shape</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>features</p></td>
+<td class="parameter_description"><p> an array of user
+specified <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> or <code class="literal">NULL</code>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_features][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>num_features</p></td>
+<td class="parameter_description"><p>the length of <em class="parameter"><code>features</code></em>
+array</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>shaper_list</p></td>
+<td class="parameter_description"><p> a <code class="literal">NULL</code>-terminated
+array of shapers to use or <code class="literal">NULL</code>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-shape-full.returns"></a><h4>Returns</h4>
+<p> false if all shapers failed, true otherwise</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-shape-list-shapers"></a><h3>hb_shape_list_shapers ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> **
+hb_shape_list_shapers (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Retrieves the list of shapers supported by HarfBuzz.</p>
+<div class="refsect3">
+<a name="hb-shape-list-shapers.returns"></a><h4>Returns</h4>
+<p> an array of
+constant strings. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-shape.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="HB-FEATURE-GLOBAL-END:CAPS"></a><h3>HB_FEATURE_GLOBAL_END</h3>
+<pre class="programlisting">#define HB_FEATURE_GLOBAL_END ((unsigned int) -1)
+</pre>
+<p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-FEATURE-GLOBAL-START:CAPS"></a><h3>HB_FEATURE_GLOBAL_START</h3>
+<pre class="programlisting">#define HB_FEATURE_GLOBAL_START 0
+</pre>
+<p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-feature-t-struct"></a><h3>hb_feature_t</h3>
+<pre class="programlisting">typedef struct {
+  hb_tag_t      tag;
+  uint32_t      value;
+  unsigned int  start;
+  unsigned int  end;
+} hb_feature_t;
+</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-unicode.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-unicode.html
new file mode 100644
index 0000000..97f93ab
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-unicode.html
@@ -0,0 +1,1373 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-unicode: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch09.html" title="Core API">
+<link rel="prev" href="harfbuzz-hb-shape.html" title="hb-shape">
+<link rel="next" href="harfbuzz-hb-version.html" title="hb-version">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-unicode.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-unicode.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch09.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-shape.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-version.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-unicode"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-unicode.top_of_page"></a>hb-unicode</span></h2>
+<p>hb-unicode — Unicode character property access</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-unicode.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-t" title="enum hb_unicode_combining_class_t"><span class="returnvalue">hb_unicode_combining_class_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class" title="hb_unicode_combining_class ()">hb_unicode_combining_class</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-t" title="enum hb_unicode_combining_class_t"><span class="returnvalue">hb_unicode_combining_class_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-func-t" title="hb_unicode_combining_class_func_t ()">*hb_unicode_combining_class_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-compose" title="hb_unicode_compose ()">hb_unicode_compose</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-compose-func-t" title="hb_unicode_compose_func_t ()">*hb_unicode_compose_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-decompose" title="hb_unicode_decompose ()">hb_unicode_decompose</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-decompose-func-t" title="hb_unicode_decompose_func_t ()">*hb_unicode_decompose_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-create" title="hb_unicode_funcs_create ()">hb_unicode_funcs_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-destroy" title="hb_unicode_funcs_destroy ()">hb_unicode_funcs_destroy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-default" title="hb_unicode_funcs_get_default ()">hb_unicode_funcs_get_default</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-empty" title="hb_unicode_funcs_get_empty ()">hb_unicode_funcs_get_empty</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-parent" title="hb_unicode_funcs_get_parent ()">hb_unicode_funcs_get_parent</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-user-data" title="hb_unicode_funcs_get_user_data ()">hb_unicode_funcs_get_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-is-immutable" title="hb_unicode_funcs_is_immutable ()">hb_unicode_funcs_is_immutable</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-make-immutable" title="hb_unicode_funcs_make_immutable ()">hb_unicode_funcs_make_immutable</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-reference" title="hb_unicode_funcs_reference ()">hb_unicode_funcs_reference</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-combining-class-func" title="hb_unicode_funcs_set_combining_class_func ()">hb_unicode_funcs_set_combining_class_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-compose-func" title="hb_unicode_funcs_set_compose_func ()">hb_unicode_funcs_set_compose_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-decompose-func" title="hb_unicode_funcs_set_decompose_func ()">hb_unicode_funcs_set_decompose_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-general-category-func" title="hb_unicode_funcs_set_general_category_func ()">hb_unicode_funcs_set_general_category_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-mirroring-func" title="hb_unicode_funcs_set_mirroring_func ()">hb_unicode_funcs_set_mirroring_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-script-func" title="hb_unicode_funcs_set_script_func ()">hb_unicode_funcs_set_script_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-user-data" title="hb_unicode_funcs_set_user_data ()">hb_unicode_funcs_set_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-t" title="enum hb_unicode_general_category_t"><span class="returnvalue">hb_unicode_general_category_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category" title="hb_unicode_general_category ()">hb_unicode_general_category</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-t" title="enum hb_unicode_general_category_t"><span class="returnvalue">hb_unicode_general_category_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-func-t" title="hb_unicode_general_category_func_t ()">*hb_unicode_general_category_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-mirroring" title="hb_unicode_mirroring ()">hb_unicode_mirroring</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-mirroring-func-t" title="hb_unicode_mirroring_func_t ()">*hb_unicode_mirroring_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-script" title="hb_unicode_script ()">hb_unicode_script</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-script-func-t" title="hb_unicode_script_func_t ()">*hb_unicode_script_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="hb-unicode-funcs-t"></a><div class="refsect1">
+<a name="harfbuzz-hb-unicode.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-unicode.html#HB-UNICODE-MAX:CAPS" title="HB_UNICODE_MAX">HB_UNICODE_MAX</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-t" title="enum hb_unicode_combining_class_t">hb_unicode_combining_class_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t">hb_unicode_funcs_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-t" title="enum hb_unicode_general_category_t">hb_unicode_general_category_t</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-unicode.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
+    <span class="lineart">╰──</span> hb_unicode_funcs_t
+    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
+    <span class="lineart">├──</span> hb_unicode_combining_class_t
+    <span class="lineart">╰──</span> hb_unicode_general_category_t
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-unicode.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-unicode.description"></a><h2>Description</h2>
+<p>Unicode functions are used to access Unicode character properties.
+Client can pass its own Unicode functions to HarfBuzz, or access
+the built-in Unicode functions that come with HarfBuzz.</p>
+<p>With the Unicode functions, one can query variour Unicode character
+properties, such as General Category, Script, Combining Class, etc.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-unicode.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-unicode-combining-class"></a><h3>hb_unicode_combining_class ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-t" title="enum hb_unicode_combining_class_t"><span class="returnvalue">hb_unicode_combining_class_t</span></a>
+hb_unicode_combining_class (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-combining-class-func-t"></a><h3>hb_unicode_combining_class_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-t" title="enum hb_unicode_combining_class_t"><span class="returnvalue">hb_unicode_combining_class_t</span></a>
+<span class="c_punctuation">(</span>*hb_unicode_combining_class_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
+                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-compose"></a><h3>hb_unicode_compose ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_unicode_compose (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> a</code></em>,
+                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> b</code></em>,
+                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *ab</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-unicode-compose.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>ab</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-compose-func-t"></a><h3>hb_unicode_compose_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+<span class="c_punctuation">(</span>*hb_unicode_compose_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> a</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> b</code></em>,
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *ab</code></em>,
+                              <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-decompose"></a><h3>hb_unicode_decompose ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_unicode_decompose (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> ab</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *a</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *b</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-unicode-decompose.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>a</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>b</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-decompose-func-t"></a><h3>hb_unicode_decompose_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+<span class="c_punctuation">(</span>*hb_unicode_decompose_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> ab</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *a</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *b</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-create"></a><h3>hb_unicode_funcs_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+hb_unicode_funcs_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *parent</code></em>);</pre>
+<p><span class="annotation">[Xconstructor]</span></p>
+<div class="refsect3">
+<a name="hb-unicode-funcs-create.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>parent</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-funcs-create.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-destroy"></a><h3>hb_unicode_funcs_destroy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_unicode_funcs_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-unicode-funcs-destroy.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-get-default"></a><h3>hb_unicode_funcs_get_default ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+hb_unicode_funcs_get_default (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-get-empty"></a><h3>hb_unicode_funcs_get_empty ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+hb_unicode_funcs_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<div class="refsect3">
+<a name="hb-unicode-funcs-get-empty.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-get-parent"></a><h3>hb_unicode_funcs_get_parent ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+hb_unicode_funcs_get_parent (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-unicode-funcs-get-parent.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-get-user-data"></a><h3>hb_unicode_funcs_get_user_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> *
+hb_unicode_funcs_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-unicode-funcs-get-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-funcs-get-user-data.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-is-immutable"></a><h3>hb_unicode_funcs_is_immutable ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_unicode_funcs_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-unicode-funcs-is-immutable.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-make-immutable"></a><h3>hb_unicode_funcs_make_immutable ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_unicode_funcs_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-unicode-funcs-make-immutable.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-reference"></a><h3>hb_unicode_funcs_reference ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+hb_unicode_funcs_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-unicode-funcs-reference.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-funcs-reference.returns"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-set-combining-class-func"></a><h3>hb_unicode_funcs_set_combining_class_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_unicode_funcs_set_combining_class_func
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-func-t" title="hb_unicode_combining_class_func_t ()"><span class="type">hb_unicode_combining_class_func_t</span></a> func</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-unicode-funcs-set-combining-class-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>a Unicode function structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-set-compose-func"></a><h3>hb_unicode_funcs_set_compose_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_unicode_funcs_set_compose_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-compose-func-t" title="hb_unicode_compose_func_t ()"><span class="type">hb_unicode_compose_func_t</span></a> func</code></em>,
+                                   <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-unicode-funcs-set-compose-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>a Unicode function structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-set-decompose-func"></a><h3>hb_unicode_funcs_set_decompose_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_unicode_funcs_set_decompose_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-decompose-func-t" title="hb_unicode_decompose_func_t ()"><span class="type">hb_unicode_decompose_func_t</span></a> func</code></em>,
+                                     <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-unicode-funcs-set-decompose-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>a Unicode function structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-set-general-category-func"></a><h3>hb_unicode_funcs_set_general_category_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_unicode_funcs_set_general_category_func
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-func-t" title="hb_unicode_general_category_func_t ()"><span class="type">hb_unicode_general_category_func_t</span></a> func</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-unicode-funcs-set-general-category-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>a Unicode function structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-set-mirroring-func"></a><h3>hb_unicode_funcs_set_mirroring_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_unicode_funcs_set_mirroring_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-mirroring-func-t" title="hb_unicode_mirroring_func_t ()"><span class="type">hb_unicode_mirroring_func_t</span></a> func</code></em>,
+                                     <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-unicode-funcs-set-mirroring-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>a Unicode function structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-set-script-func"></a><h3>hb_unicode_funcs_set_script_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_unicode_funcs_set_script_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-script-func-t" title="hb_unicode_script_func_t ()"><span class="type">hb_unicode_script_func_t</span></a> func</code></em>,
+                                  <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="refsect3">
+<a name="hb-unicode-funcs-set-script-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>a Unicode function structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-set-user-data"></a><h3>hb_unicode_funcs_set_user_data ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_unicode_funcs_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-unicode-funcs-set-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-general-category"></a><h3>hb_unicode_general_category ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-t" title="enum hb_unicode_general_category_t"><span class="returnvalue">hb_unicode_general_category_t</span></a>
+hb_unicode_general_category (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-general-category-func-t"></a><h3>hb_unicode_general_category_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-t" title="enum hb_unicode_general_category_t"><span class="returnvalue">hb_unicode_general_category_t</span></a>
+<span class="c_punctuation">(</span>*hb_unicode_general_category_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
+                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-mirroring"></a><h3>hb_unicode_mirroring ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+hb_unicode_mirroring (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-mirroring-func-t"></a><h3>hb_unicode_mirroring_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+<span class="c_punctuation">(</span>*hb_unicode_mirroring_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-script"></a><h3>hb_unicode_script ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-script-func-t"></a><h3>hb_unicode_script_func_t ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
+<span class="c_punctuation">(</span>*hb_unicode_script_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
+                             <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-unicode.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="HB-UNICODE-MAX:CAPS"></a><h3>HB_UNICODE_MAX</h3>
+<pre class="programlisting">#define HB_UNICODE_MAX 0x10FFFFu
+</pre>
+<p class="since">Since: <a class="link" href="api-index-1-9-0.html#api-index-1.9.0">1.9.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-combining-class-t"></a><h3>enum hb_unicode_combining_class_t</h3>
+<div class="refsect3">
+<a name="hb-unicode-combining-class-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-NOT-REORDERED:CAPS"></a>HB_UNICODE_COMBINING_CLASS_NOT_REORDERED</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-OVERLAY:CAPS"></a>HB_UNICODE_COMBINING_CLASS_OVERLAY</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-NUKTA:CAPS"></a>HB_UNICODE_COMBINING_CLASS_NUKTA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-KANA-VOICING:CAPS"></a>HB_UNICODE_COMBINING_CLASS_KANA_VOICING</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-VIRAMA:CAPS"></a>HB_UNICODE_COMBINING_CLASS_VIRAMA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC10:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC10</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC11:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC11</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC12:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC12</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC13:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC13</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC14:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC14</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC15:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC15</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC16:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC16</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC17:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC17</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC18:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC18</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC19:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC19</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC20:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC20</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC21:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC21</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC22:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC22</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC23:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC23</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC24:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC24</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC25:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC25</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC26:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC26</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC27:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC27</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC28:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC28</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC29:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC29</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC30:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC30</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC31:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC31</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC32:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC32</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC33:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC33</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC34:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC34</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC35:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC35</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC36:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC36</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC84:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC84</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC91:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC91</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC103:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC103</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC107:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC107</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC118:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC118</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC122:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC122</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC129:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC129</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC130:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC130</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC133:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC133</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-ATTACHED-BELOW-LEFT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-ATTACHED-BELOW:CAPS"></a>HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-ATTACHED-ABOVE:CAPS"></a>HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-ATTACHED-ABOVE-RIGHT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-BELOW-LEFT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_BELOW_LEFT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-BELOW:CAPS"></a>HB_UNICODE_COMBINING_CLASS_BELOW</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-BELOW-RIGHT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-LEFT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_LEFT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-RIGHT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_RIGHT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-ABOVE-LEFT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-ABOVE:CAPS"></a>HB_UNICODE_COMBINING_CLASS_ABOVE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-ABOVE-RIGHT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-DOUBLE-BELOW:CAPS"></a>HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-DOUBLE-ABOVE:CAPS"></a>HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-IOTA-SUBSCRIPT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-INVALID:CAPS"></a>HB_UNICODE_COMBINING_CLASS_INVALID</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-t"></a><h3>hb_unicode_funcs_t</h3>
+<pre class="programlisting">typedef struct hb_unicode_funcs_t hb_unicode_funcs_t;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-general-category-t"></a><h3>enum hb_unicode_general_category_t</h3>
+<div class="refsect3">
+<a name="hb-unicode-general-category-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-CONTROL:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_CONTROL</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-FORMAT:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_FORMAT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-UNASSIGNED:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-PRIVATE-USE:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-SURROGATE:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_SURROGATE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-LOWERCASE-LETTER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-MODIFIER-LETTER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-OTHER-LETTER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-TITLECASE-LETTER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-UPPERCASE-LETTER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-SPACING-MARK:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-ENCLOSING-MARK:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-NON-SPACING-MARK:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-DECIMAL-NUMBER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-LETTER-NUMBER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-OTHER-NUMBER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-CONNECT-PUNCTUATION:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-DASH-PUNCTUATION:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-CLOSE-PUNCTUATION:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-FINAL-PUNCTUATION:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-INITIAL-PUNCTUATION:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-OTHER-PUNCTUATION:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-OPEN-PUNCTUATION:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-CURRENCY-SYMBOL:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-MODIFIER-SYMBOL:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-MATH-SYMBOL:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-OTHER-SYMBOL:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-LINE-SEPARATOR:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-PARAGRAPH-SEPARATOR:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-SPACE-SEPARATOR:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-uniscribe.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-uniscribe.html
new file mode 100644
index 0000000..425ef7e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-uniscribe.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-uniscribe: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch12.html" title="Integration API">
+<link rel="prev" href="harfbuzz-hb-icu.html" title="hb-icu">
+<link rel="next" href="api-index-full.html" title="API Index">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-uniscribe.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-icu.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-full.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-uniscribe"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-uniscribe.top_of_page"></a>hb-uniscribe</span></h2>
+<p>hb-uniscribe — Windows integration</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-uniscribe.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<span class="returnvalue">HFONT</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-uniscribe.html#hb-uniscribe-font-get-hfont" title="hb_uniscribe_font_get_hfont ()">hb_uniscribe_font_get_hfont</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">LOGFONTW</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-uniscribe.html#hb-uniscribe-font-get-logfontw" title="hb_uniscribe_font_get_logfontw ()">hb_uniscribe_font_get_logfontw</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-uniscribe.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-uniscribe.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-uniscribe.description"></a><h2>Description</h2>
+<p>Functions for using HarfBuzz with the Windows fonts.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-uniscribe.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-uniscribe-font-get-hfont"></a><h3>hb_uniscribe_font_get_hfont ()</h3>
+<pre class="programlisting"><span class="returnvalue">HFONT</span>
+hb_uniscribe_font_get_hfont (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-uniscribe-font-get-logfontw"></a><h3>hb_uniscribe_font_get_logfontw ()</h3>
+<pre class="programlisting"><span class="returnvalue">LOGFONTW</span> *
+hb_uniscribe_font_get_logfontw (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-uniscribe.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-version.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-version.html
new file mode 100644
index 0000000..00569c9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz-hb-version.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-version: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="ch09.html" title="Core API">
+<link rel="prev" href="harfbuzz-hb-unicode.html" title="hb-unicode">
+<link rel="next" href="ch10.html" title="OpenType API">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-version.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="ch09.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-unicode.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="ch10.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-version"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-version.top_of_page"></a>hb-version</span></h2>
+<p>hb-version — Information about the version of HarfBuzz in use</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-version.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-version.html#HB-VERSION-ATLEAST:CAPS" title="HB_VERSION_ATLEAST()">HB_VERSION_ATLEAST</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-version.html#hb-version" title="hb_version ()">hb_version</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-version.html#hb-version-atleast" title="hb_version_atleast ()">hb_version_atleast</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <span class="returnvalue">char</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-version.html#hb-version-string" title="hb_version_string ()">hb_version_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-version.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-version.html#HB-VERSION-MAJOR:CAPS" title="HB_VERSION_MAJOR">HB_VERSION_MAJOR</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-version.html#HB-VERSION-MICRO:CAPS" title="HB_VERSION_MICRO">HB_VERSION_MICRO</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-version.html#HB-VERSION-MINOR:CAPS" title="HB_VERSION_MINOR">HB_VERSION_MINOR</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-version.html#HB-VERSION-STRING:CAPS" title="HB_VERSION_STRING">HB_VERSION_STRING</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-version.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-version.description"></a><h2>Description</h2>
+<p>These functions and macros allow accessing version of the HarfBuzz
+library used at compile- as well as run-time, and to direct code
+conditionally based on those versions, again, at compile- or run-time.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-version.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="HB-VERSION-ATLEAST:CAPS"></a><h3>HB_VERSION_ATLEAST()</h3>
+<pre class="programlisting">#define             HB_VERSION_ATLEAST(major,minor,micro)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-version"></a><h3>hb_version ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_version (<em class="parameter"><code>unsigned <span class="type">int</span> *major</code></em>,
+            <em class="parameter"><code>unsigned <span class="type">int</span> *minor</code></em>,
+            <em class="parameter"><code>unsigned <span class="type">int</span> *micro</code></em>);</pre>
+<p>Returns library version as three integer components.</p>
+<div class="refsect3">
+<a name="hb-version.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>major</p></td>
+<td class="parameter_description"><p> Library major version component. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>minor</p></td>
+<td class="parameter_description"><p> Library minor version component. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>micro</p></td>
+<td class="parameter_description"><p> Library micro version component. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-version-atleast"></a><h3>hb_version_atleast ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_version_atleast (<em class="parameter"><code>unsigned <span class="type">int</span> major</code></em>,
+                    <em class="parameter"><code>unsigned <span class="type">int</span> minor</code></em>,
+                    <em class="parameter"><code>unsigned <span class="type">int</span> micro</code></em>);</pre>
+<p class="since">Since: <a class="link" href="api-index-0-9-30.html#api-index-0.9.30">0.9.30</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-version-string"></a><h3>hb_version_string ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *
+hb_version_string (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Returns library version as a string with three components.</p>
+<div class="refsect3">
+<a name="hb-version-string.returns"></a><h4>Returns</h4>
+<p> library version string.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-version.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="HB-VERSION-MAJOR:CAPS"></a><h3>HB_VERSION_MAJOR</h3>
+<pre class="programlisting">#define HB_VERSION_MAJOR 2
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-VERSION-MICRO:CAPS"></a><h3>HB_VERSION_MICRO</h3>
+<pre class="programlisting">#define HB_VERSION_MICRO 1
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-VERSION-MINOR:CAPS"></a><h3>HB_VERSION_MINOR</h3>
+<pre class="programlisting">#define HB_VERSION_MINOR 3
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-VERSION-STRING:CAPS"></a><h3>HB_VERSION_STRING</h3>
+<pre class="programlisting">#define HB_VERSION_STRING "2.3.1"
+</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz.devhelp2 b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz.devhelp2
new file mode 100644
index 0000000..ccfc846
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/harfbuzz.devhelp2
@@ -0,0 +1,1368 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<book xmlns="http://www.devhelp.net/book" title="HarfBuzz Manual" link="index.html" author="" name="harfbuzz" version="2" language="c">
+  <chapters>
+    <sub name="User's manual" link="pt01.html">
+      <sub name="What is HarfBuzz?" link="what-is-harfbuzz.html">
+        <sub name="What is text shaping?" link="what-is-harfbuzz.html#what-is-text-shaping"/>
+        <sub name="Why do I need a shaping engine?" link="why-do-i-need-a-shaping-engine.html"/>
+        <sub name="What does HarfBuzz do?" link="ch01s03.html"/>
+        <sub name="What HarfBuzz doesn't do" link="what-harfbuzz-doesnt-do.html"/>
+        <sub name="Why is it called HarfBuzz?" link="why-is-it-called-harfbuzz.html"/>
+      </sub>
+      <sub name="Installing HarfBuzz" link="install-harfbuzz.html">
+        <sub name="Downloading HarfBuzz" link="install-harfbuzz.html#download"/>
+        <sub name="Building HarfBuzz" link="building.html">
+          <sub name="Building on Linux" link="building.html#building.linux"/>
+          <sub name="Building on Windows" link="building.html#building.windows"/>
+          <sub name="Building on macOS" link="building.html#building.macos"/>
+          <sub name="Configuration options" link="building.html#configuration"/>
+        </sub>
+      </sub>
+      <sub name="Getting started with HarfBuzz" link="getting-started.html">
+        <sub name="An overview of the HarfBuzz shaping API" link="getting-started.html#id-1.2.4.2"/>
+        <sub name="Terminology" link="ch03s02.html"/>
+        <sub name="A simple shaping example" link="ch03s03.html"/>
+      </sub>
+      <sub name="Shaping concepts" link="shaping-concepts.html">
+        <sub name="Text shaping" link="shaping-concepts.html#text-shaping-concepts"/>
+        <sub name="Complex scripts" link="complex-scripts.html"/>
+        <sub name="Shaping operations" link="shaping-operations.html"/>
+        <sub name="Unicode character categories" link="unicode-character-categories.html"/>
+        <sub name="Text runs" link="text-runs.html"/>
+        <sub name="OpenType shaping models" link="opentype-shaping-models.html"/>
+        <sub name="Graphite shaping" link="graphite-shaping.html"/>
+        <sub name="AAT shaping" link="aat-shaping.html"/>
+      </sub>
+      <sub name="Buffers, language, script and direction" link="buffers-language-script-and-direction.html">
+        <sub name="Creating and destroying buffers" link="buffers-language-script-and-direction.html#creating-and-destroying-buffers"/>
+        <sub name="Adding text to the buffer" link="adding-text-to-the-buffer.html"/>
+        <sub name="Setting buffer properties" link="setting-buffer-properties.html"/>
+        <sub name="What about the other scripts?" link="what-about-the-other-scripts.html"/>
+        <sub name="Customizing Unicode functions" link="customizing-unicode-functions.html"/>
+      </sub>
+      <sub name="Fonts and faces" link="fonts-and-faces.html">
+        <sub name="Using FreeType" link="fonts-and-faces.html#using-freetype"/>
+        <sub name="Using HarfBuzz's native OpenType implementation" link="using-harfbuzzs-native-opentype-implementation.html"/>
+        <sub name="Using your own font functions" link="using-your-own-font-functions.html"/>
+      </sub>
+      <sub name="Clusters" link="clusters.html">
+        <sub name="Clusters and shaping" link="clusters.html#clusters-and-shaping"/>
+        <sub name="Working with HarfBuzz clusters" link="working-with-harfbuzz-clusters.html"/>
+        <sub name="A clustering example for levels 0 and 1" link="a-clustering-example-for-levels-0-and-1.html"/>
+        <sub name="Reordering in levels 0 and 1" link="reordering-in-levels-0-and-1.html"/>
+        <sub name="The distinction between levels 0 and 1" link="the-distinction-between-levels-0-and-1.html"/>
+        <sub name="Level 2" link="level-2.html">
+          <sub name="Ligatures with combining marks in level 2" link="level-2.html#ligatures-with-combining-marks-in-level-2"/>
+          <sub name="Reordering in level 2" link="level-2.html#reordering-in-level-2"/>
+          <sub name="Other considerations in level 2" link="level-2.html#other-considerations-in-level-2"/>
+        </sub>
+      </sub>
+      <sub name="Shaping and shape plans" link="shaping-and-shape-plans.html">
+        <sub name="OpenType features" link="shaping-and-shape-plans.html#opentype-features"/>
+        <sub name="Plans and caching" link="plans-and-caching.html"/>
+      </sub>
+      <sub name="Glyph information" link="pt01.html#glyph-information"/>
+    </sub>
+    <sub name="Reference manual" link="pt02.html">
+      <sub name="Core API" link="ch09.html">
+        <sub name="hb-blob" link="harfbuzz-hb-blob.html"/>
+        <sub name="hb-buffer" link="harfbuzz-hb-buffer.html"/>
+        <sub name="hb-common" link="harfbuzz-hb-common.html"/>
+        <sub name="hb-deprecated" link="harfbuzz-hb-deprecated.html"/>
+        <sub name="hb-face" link="harfbuzz-hb-face.html"/>
+        <sub name="hb-font" link="harfbuzz-hb-font.html"/>
+        <sub name="hb-map" link="harfbuzz-hb-map.html"/>
+        <sub name="hb-set" link="harfbuzz-hb-set.html"/>
+        <sub name="hb-shape-plan" link="harfbuzz-hb-shape-plan.html"/>
+        <sub name="hb-shape" link="harfbuzz-hb-shape.html"/>
+        <sub name="hb-unicode" link="harfbuzz-hb-unicode.html"/>
+        <sub name="hb-version" link="harfbuzz-hb-version.html"/>
+      </sub>
+      <sub name="OpenType API" link="ch10.html">
+        <sub name="hb-ot-color" link="harfbuzz-hb-ot-color.html"/>
+        <sub name="hb-ot-font" link="harfbuzz-hb-ot-font.html"/>
+        <sub name="hb-ot-layout" link="harfbuzz-hb-ot-layout.html"/>
+        <sub name="hb-ot-math" link="harfbuzz-hb-ot-math.html"/>
+        <sub name="hb-ot-name" link="harfbuzz-hb-ot-name.html"/>
+        <sub name="hb-ot-shape" link="harfbuzz-hb-ot-shape.html"/>
+        <sub name="hb-ot-var" link="harfbuzz-hb-ot-var.html"/>
+      </sub>
+      <sub name="Apple Advanced Typography API" link="ch11.html">
+        <sub name="hb-aat-layout" link="harfbuzz-hb-aat-layout.html"/>
+      </sub>
+      <sub name="Integration API" link="ch12.html">
+        <sub name="hb-coretext" link="harfbuzz-hb-coretext.html"/>
+        <sub name="hb-ft" link="harfbuzz-hb-ft.html"/>
+        <sub name="hb-glib" link="harfbuzz-hb-glib.html"/>
+        <sub name="hb-gobject" link="harfbuzz-hb-gobject.html"/>
+        <sub name="hb-graphite2" link="harfbuzz-hb-graphite2.html"/>
+        <sub name="hb-icu" link="harfbuzz-hb-icu.html"/>
+        <sub name="hb-uniscribe" link="harfbuzz-hb-uniscribe.html"/>
+      </sub>
+      <sub name="API Index" link="api-index-full.html"/>
+      <sub name="Index of deprecated API" link="deprecated-api-index.html"/>
+      <sub name="Index of new symbols in 2.1.0" link="api-index-2-1-0.html"/>
+      <sub name="Index of new symbols in 2.0.0" link="api-index-2-0-0.html"/>
+      <sub name="Index of new symbols in 1.9.0" link="api-index-1-9-0.html"/>
+      <sub name="Index of new symbols in 1.8.6" link="api-index-1-8-6.html"/>
+      <sub name="Index of new symbols in 1.8.5" link="api-index-1-8-5.html"/>
+      <sub name="Index of new symbols in 1.8.1" link="api-index-1-8-1.html"/>
+      <sub name="Index of new symbols in 1.8.0" link="api-index-1-8-0.html"/>
+      <sub name="Index of new symbols in 1.7.7" link="api-index-1-7-7.html"/>
+      <sub name="Index of new symbols in 1.7.5" link="api-index-1-7-5.html"/>
+      <sub name="Index of new symbols in 1.6.0" link="api-index-1-6-0.html"/>
+      <sub name="Index of new symbols in 1.5.0" link="api-index-1-5-0.html"/>
+      <sub name="Index of new symbols in 1.4.3" link="api-index-1-4-3.html"/>
+      <sub name="Index of new symbols in 1.4.2" link="api-index-1-4-2.html"/>
+      <sub name="Index of new symbols in 1.4.0" link="api-index-1-4-0.html"/>
+      <sub name="Index of new symbols in 1.3.3" link="api-index-1-3-3.html"/>
+      <sub name="Index of new symbols in 1.2.3" link="api-index-1-2-3.html"/>
+      <sub name="Index of new symbols in 1.1.3" link="api-index-1-1-3.html"/>
+      <sub name="Index of new symbols in 1.1.2" link="api-index-1-1-2.html"/>
+      <sub name="Index of new symbols in 1.0.5" link="api-index-1-0-5.html"/>
+      <sub name="Index of new symbols in 0.9.42" link="api-index-0-9-42.html"/>
+      <sub name="Index of new symbols in 0.9.41" link="api-index-0-9-41.html"/>
+      <sub name="Index of new symbols in 0.9.39" link="api-index-0-9-39.html"/>
+      <sub name="Index of new symbols in 0.9.38" link="api-index-0-9-38.html"/>
+      <sub name="Index of new symbols in 0.9.31" link="api-index-0-9-31.html"/>
+      <sub name="Index of new symbols in 0.9.30" link="api-index-0-9-30.html"/>
+      <sub name="Index of new symbols in 0.9.28" link="api-index-0-9-28.html"/>
+      <sub name="Index of new symbols in 0.9.22" link="api-index-0-9-22.html"/>
+      <sub name="Index of new symbols in 0.9.20" link="api-index-0-9-20.html"/>
+      <sub name="Index of new symbols in 0.9.11" link="api-index-0-9-11.html"/>
+      <sub name="Index of new symbols in 0.9.10" link="api-index-0-9-10.html"/>
+      <sub name="Index of new symbols in 0.9.8" link="api-index-0-9-8.html"/>
+      <sub name="Index of new symbols in 0.9.7" link="api-index-0-9-7.html"/>
+      <sub name="Index of new symbols in 0.9.5" link="api-index-0-9-5.html"/>
+      <sub name="Index of new symbols in 0.9.2" link="api-index-0-9-2.html"/>
+      <sub name="Annotation Glossary" link="annotation-glossary.html"/>
+    </sub>
+  </chapters>
+  <functions>
+    <keyword type="function" name="hb_blob_create ()" link="harfbuzz-hb-blob.html#hb-blob-create" since="0.9.2"/>
+    <keyword type="function" name="hb_blob_create_from_file ()" link="harfbuzz-hb-blob.html#hb-blob-create-from-file" since="1.7.7"/>
+    <keyword type="function" name="hb_blob_create_sub_blob ()" link="harfbuzz-hb-blob.html#hb-blob-create-sub-blob" since="0.9.2"/>
+    <keyword type="function" name="hb_blob_copy_writable_or_fail ()" link="harfbuzz-hb-blob.html#hb-blob-copy-writable-or-fail" since="1.8.0"/>
+    <keyword type="function" name="hb_blob_destroy ()" link="harfbuzz-hb-blob.html#hb-blob-destroy" since="0.9.2"/>
+    <keyword type="function" name="hb_blob_get_data ()" link="harfbuzz-hb-blob.html#hb-blob-get-data" since="0.9.2"/>
+    <keyword type="function" name="hb_blob_get_data_writable ()" link="harfbuzz-hb-blob.html#hb-blob-get-data-writable" since="0.9.2"/>
+    <keyword type="function" name="hb_blob_get_empty ()" link="harfbuzz-hb-blob.html#hb-blob-get-empty" since="0.9.2"/>
+    <keyword type="function" name="hb_blob_get_length ()" link="harfbuzz-hb-blob.html#hb-blob-get-length" since="0.9.2"/>
+    <keyword type="function" name="hb_blob_get_user_data ()" link="harfbuzz-hb-blob.html#hb-blob-get-user-data" since="0.9.2"/>
+    <keyword type="function" name="hb_blob_is_immutable ()" link="harfbuzz-hb-blob.html#hb-blob-is-immutable" since="0.9.2"/>
+    <keyword type="function" name="hb_blob_make_immutable ()" link="harfbuzz-hb-blob.html#hb-blob-make-immutable" since="0.9.2"/>
+    <keyword type="function" name="hb_blob_reference ()" link="harfbuzz-hb-blob.html#hb-blob-reference" since="0.9.2"/>
+    <keyword type="function" name="hb_blob_set_user_data ()" link="harfbuzz-hb-blob.html#hb-blob-set-user-data" since="0.9.2"/>
+    <keyword type="typedef" name="hb_blob_t" link="harfbuzz-hb-blob.html#hb-blob-t"/>
+    <keyword type="enum" name="enum hb_memory_mode_t" link="harfbuzz-hb-blob.html#hb-memory-mode-t"/>
+    <keyword type="function" name="hb_buffer_create ()" link="harfbuzz-hb-buffer.html#hb-buffer-create" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_reference ()" link="harfbuzz-hb-buffer.html#hb-buffer-reference" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_get_empty ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-empty" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_destroy ()" link="harfbuzz-hb-buffer.html#hb-buffer-destroy" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_reset ()" link="harfbuzz-hb-buffer.html#hb-buffer-reset" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_clear_contents ()" link="harfbuzz-hb-buffer.html#hb-buffer-clear-contents" since="0.9.11"/>
+    <keyword type="function" name="hb_buffer_pre_allocate ()" link="harfbuzz-hb-buffer.html#hb-buffer-pre-allocate" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_allocation_successful ()" link="harfbuzz-hb-buffer.html#hb-buffer-allocation-successful" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_add ()" link="harfbuzz-hb-buffer.html#hb-buffer-add" since="0.9.7"/>
+    <keyword type="function" name="hb_buffer_add_codepoints ()" link="harfbuzz-hb-buffer.html#hb-buffer-add-codepoints" since="0.9.31"/>
+    <keyword type="function" name="hb_buffer_add_utf32 ()" link="harfbuzz-hb-buffer.html#hb-buffer-add-utf32" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_add_utf16 ()" link="harfbuzz-hb-buffer.html#hb-buffer-add-utf16" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_add_utf8 ()" link="harfbuzz-hb-buffer.html#hb-buffer-add-utf8" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_add_latin1 ()" link="harfbuzz-hb-buffer.html#hb-buffer-add-latin1" since="0.9.39"/>
+    <keyword type="function" name="hb_buffer_append ()" link="harfbuzz-hb-buffer.html#hb-buffer-append" since="1.5.0"/>
+    <keyword type="function" name="hb_buffer_set_content_type ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-content-type" since="0.9.5"/>
+    <keyword type="function" name="hb_buffer_get_content_type ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-content-type" since="0.9.5"/>
+    <keyword type="function" name="hb_buffer_set_direction ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-direction" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_get_direction ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-direction" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_set_script ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-script" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_get_script ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-script" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_set_language ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-language" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_get_language ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-language" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_set_flags ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-flags" since="0.9.7"/>
+    <keyword type="function" name="hb_buffer_get_flags ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-flags" since="0.9.7"/>
+    <keyword type="function" name="hb_buffer_set_cluster_level ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-cluster-level" since="0.9.42"/>
+    <keyword type="function" name="hb_buffer_get_cluster_level ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-cluster-level" since="0.9.42"/>
+    <keyword type="function" name="hb_buffer_set_length ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-length" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_get_length ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-length" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_set_segment_properties ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-segment-properties" since="0.9.7"/>
+    <keyword type="function" name="hb_buffer_get_segment_properties ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-segment-properties" since="0.9.7"/>
+    <keyword type="function" name="hb_buffer_guess_segment_properties ()" link="harfbuzz-hb-buffer.html#hb-buffer-guess-segment-properties" since="0.9.7"/>
+    <keyword type="function" name="hb_buffer_set_unicode_funcs ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-unicode-funcs" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_get_unicode_funcs ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-unicode-funcs" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_set_user_data ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-user-data" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_get_user_data ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-user-data" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_get_glyph_infos ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-glyph-infos" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_get_glyph_positions ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-glyph-positions" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_get_invisible_glyph ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-invisible-glyph" since="2.0.0"/>
+    <keyword type="function" name="hb_buffer_set_invisible_glyph ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-invisible-glyph" since="2.0.0"/>
+    <keyword type="function" name="hb_buffer_set_replacement_codepoint ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-codepoint" since="0.9.31"/>
+    <keyword type="function" name="hb_buffer_get_replacement_codepoint ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-replacement-codepoint" since="0.9.31"/>
+    <keyword type="function" name="hb_buffer_normalize_glyphs ()" link="harfbuzz-hb-buffer.html#hb-buffer-normalize-glyphs" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_reverse ()" link="harfbuzz-hb-buffer.html#hb-buffer-reverse" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_reverse_range ()" link="harfbuzz-hb-buffer.html#hb-buffer-reverse-range" since="0.9.41"/>
+    <keyword type="function" name="hb_buffer_reverse_clusters ()" link="harfbuzz-hb-buffer.html#hb-buffer-reverse-clusters" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_serialize_glyphs ()" link="harfbuzz-hb-buffer.html#hb-buffer-serialize-glyphs" since="0.9.7"/>
+    <keyword type="function" name="hb_buffer_deserialize_glyphs ()" link="harfbuzz-hb-buffer.html#hb-buffer-deserialize-glyphs" since="0.9.7"/>
+    <keyword type="function" name="hb_buffer_serialize_format_from_string ()" link="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-from-string" since="0.9.7"/>
+    <keyword type="function" name="hb_buffer_serialize_format_to_string ()" link="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-to-string" since="0.9.7"/>
+    <keyword type="function" name="hb_buffer_serialize_list_formats ()" link="harfbuzz-hb-buffer.html#hb-buffer-serialize-list-formats" since="0.9.7"/>
+    <keyword type="function" name="hb_segment_properties_equal ()" link="harfbuzz-hb-buffer.html#hb-segment-properties-equal" since="0.9.7"/>
+    <keyword type="function" name="hb_segment_properties_hash ()" link="harfbuzz-hb-buffer.html#hb-segment-properties-hash" since="0.9.7"/>
+    <keyword type="function" name="hb_buffer_diff ()" link="harfbuzz-hb-buffer.html#hb-buffer-diff" since="1.5.0"/>
+    <keyword type="function" name="hb_buffer_set_message_func ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-message-func" since="1.1.3"/>
+    <keyword type="function" name="hb_glyph_info_get_glyph_flags ()" link="harfbuzz-hb-buffer.html#hb-glyph-info-get-glyph-flags" since="1.5.0"/>
+    <keyword type="function" name="hb_buffer_message_func_t ()" link="harfbuzz-hb-buffer.html#hb-buffer-message-func-t"/>
+    <keyword type="macro" name="HB_SEGMENT_PROPERTIES_DEFAULT" link="harfbuzz-hb-buffer.html#HB-SEGMENT-PROPERTIES-DEFAULT:CAPS"/>
+    <keyword type="macro" name="HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT" link="harfbuzz-hb-buffer.html#HB-BUFFER-REPLACEMENT-CODEPOINT-DEFAULT:CAPS" since="0.9.31"/>
+    <keyword type="typedef" name="hb_buffer_t" link="harfbuzz-hb-buffer.html#hb-buffer-t"/>
+    <keyword type="enum" name="enum hb_glyph_flags_t" link="harfbuzz-hb-buffer.html#hb-glyph-flags-t" since="1.5.0"/>
+    <keyword type="struct" name="hb_glyph_position_t" link="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct"/>
+    <keyword type="enum" name="enum hb_buffer_content_type_t" link="harfbuzz-hb-buffer.html#hb-buffer-content-type-t"/>
+    <keyword type="enum" name="enum hb_buffer_flags_t" link="harfbuzz-hb-buffer.html#hb-buffer-flags-t" since="0.9.20"/>
+    <keyword type="enum" name="enum hb_buffer_cluster_level_t" link="harfbuzz-hb-buffer.html#hb-buffer-cluster-level-t" since="0.9.42"/>
+    <keyword type="struct" name="hb_segment_properties_t" link="harfbuzz-hb-buffer.html#hb-segment-properties-t-struct"/>
+    <keyword type="enum" name="enum hb_buffer_serialize_format_t" link="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" since="0.9.2"/>
+    <keyword type="enum" name="enum hb_buffer_serialize_flags_t" link="harfbuzz-hb-buffer.html#hb-buffer-serialize-flags-t" since="0.9.20"/>
+    <keyword type="enum" name="enum hb_buffer_diff_flags_t" link="harfbuzz-hb-buffer.html#hb-buffer-diff-flags-t"/>
+    <keyword type="function" name="hb_tag_from_string ()" link="harfbuzz-hb-common.html#hb-tag-from-string" since="0.9.2"/>
+    <keyword type="function" name="hb_tag_to_string ()" link="harfbuzz-hb-common.html#hb-tag-to-string" since="0.9.5"/>
+    <keyword type="function" name="hb_direction_from_string ()" link="harfbuzz-hb-common.html#hb-direction-from-string" since="0.9.2"/>
+    <keyword type="function" name="hb_direction_to_string ()" link="harfbuzz-hb-common.html#hb-direction-to-string" since="0.9.2"/>
+    <keyword type="function" name="hb_script_from_iso15924_tag ()" link="harfbuzz-hb-common.html#hb-script-from-iso15924-tag" since="0.9.2"/>
+    <keyword type="function" name="hb_script_from_string ()" link="harfbuzz-hb-common.html#hb-script-from-string" since="0.9.2"/>
+    <keyword type="function" name="hb_script_to_iso15924_tag ()" link="harfbuzz-hb-common.html#hb-script-to-iso15924-tag" since="0.9.2"/>
+    <keyword type="function" name="hb_script_get_horizontal_direction ()" link="harfbuzz-hb-common.html#hb-script-get-horizontal-direction" since="0.9.2"/>
+    <keyword type="function" name="hb_language_from_string ()" link="harfbuzz-hb-common.html#hb-language-from-string" since="0.9.2"/>
+    <keyword type="function" name="hb_language_to_string ()" link="harfbuzz-hb-common.html#hb-language-to-string" since="0.9.2"/>
+    <keyword type="function" name="hb_language_get_default ()" link="harfbuzz-hb-common.html#hb-language-get-default" since="0.9.2"/>
+    <keyword type="function" name="hb_destroy_func_t ()" link="harfbuzz-hb-common.html#hb-destroy-func-t"/>
+    <keyword type="macro" name="HB_TAG()" link="harfbuzz-hb-common.html#HB-TAG:CAPS"/>
+    <keyword type="macro" name="HB_UNTAG()" link="harfbuzz-hb-common.html#HB-UNTAG:CAPS"/>
+    <keyword type="macro" name="HB_DIRECTION_REVERSE()" link="harfbuzz-hb-common.html#HB-DIRECTION-REVERSE:CAPS"/>
+    <keyword type="macro" name="HB_DIRECTION_IS_BACKWARD()" link="harfbuzz-hb-common.html#HB-DIRECTION-IS-BACKWARD:CAPS"/>
+    <keyword type="macro" name="HB_DIRECTION_IS_FORWARD()" link="harfbuzz-hb-common.html#HB-DIRECTION-IS-FORWARD:CAPS"/>
+    <keyword type="macro" name="HB_DIRECTION_IS_HORIZONTAL()" link="harfbuzz-hb-common.html#HB-DIRECTION-IS-HORIZONTAL:CAPS"/>
+    <keyword type="macro" name="HB_DIRECTION_IS_VALID()" link="harfbuzz-hb-common.html#HB-DIRECTION-IS-VALID:CAPS"/>
+    <keyword type="macro" name="HB_DIRECTION_IS_VERTICAL()" link="harfbuzz-hb-common.html#HB-DIRECTION-IS-VERTICAL:CAPS"/>
+    <keyword type="typedef" name="hb_bool_t" link="harfbuzz-hb-common.html#hb-bool-t"/>
+    <keyword type="typedef" name="hb_codepoint_t" link="harfbuzz-hb-common.html#hb-codepoint-t"/>
+    <keyword type="enum" name="enum hb_direction_t" link="harfbuzz-hb-common.html#hb-direction-t"/>
+    <keyword type="typedef" name="hb_language_t" link="harfbuzz-hb-common.html#hb-language-t"/>
+    <keyword type="typedef" name="hb_mask_t" link="harfbuzz-hb-common.html#hb-mask-t"/>
+    <keyword type="typedef" name="hb_position_t" link="harfbuzz-hb-common.html#hb-position-t"/>
+    <keyword type="typedef" name="hb_tag_t" link="harfbuzz-hb-common.html#hb-tag-t"/>
+    <keyword type="enum" name="enum hb_script_t" link="harfbuzz-hb-common.html#hb-script-t"/>
+    <keyword type="struct" name="hb_user_data_key_t" link="harfbuzz-hb-common.html#hb-user-data-key-t-struct"/>
+    <keyword type="union" name="hb_var_int_t" link="harfbuzz-hb-common.html#hb-var-int-t"/>
+    <keyword type="macro" name="HB_TAG_NONE" link="harfbuzz-hb-common.html#HB-TAG-NONE:CAPS"/>
+    <keyword type="macro" name="HB_TAG_MAX" link="harfbuzz-hb-common.html#HB-TAG-MAX:CAPS"/>
+    <keyword type="macro" name="HB_TAG_MAX_SIGNED" link="harfbuzz-hb-common.html#HB-TAG-MAX-SIGNED:CAPS"/>
+    <keyword type="macro" name="HB_LANGUAGE_INVALID" link="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS"/>
+    <keyword type="function" name="hb_font_get_glyph_func_t ()" link="harfbuzz-hb-deprecated.html#hb-font-get-glyph-func-t" deprecated=""/>
+    <keyword type="function" name="hb_ot_layout_table_find_script ()" link="harfbuzz-hb-deprecated.html#hb-ot-layout-table-find-script"/>
+    <keyword type="function" name="hb_font_funcs_set_glyph_h_kerning_func ()" link="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-h-kerning-func" deprecated="2.0.0" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_set_glyph_v_kerning_func ()" link="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-v-kerning-func" deprecated="2.0.0" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_h_kerning ()" link="harfbuzz-hb-deprecated.html#hb-font-get-glyph-h-kerning" deprecated="2.0.0" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_kerning_for_direction ()" link="harfbuzz-hb-deprecated.html#hb-font-get-glyph-kerning-for-direction" deprecated="2.0.0" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_kerning_func_t ()" link="harfbuzz-hb-deprecated.html#hb-font-get-glyph-kerning-func-t" deprecated=""/>
+    <keyword type="function" name="hb_font_get_glyph_v_kerning ()" link="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning" deprecated="2.0.0" since="0.9.2"/>
+    <keyword type="macro" name="HB_BUFFER_FLAGS_DEFAULT" link="harfbuzz-hb-deprecated.html#HB-BUFFER-FLAGS-DEFAULT:CAPS" deprecated=""/>
+    <keyword type="macro" name="HB_BUFFER_SERIALIZE_FLAGS_DEFAULT" link="harfbuzz-hb-deprecated.html#HB-BUFFER-SERIALIZE-FLAGS-DEFAULT:CAPS" deprecated=""/>
+    <keyword type="macro" name="HB_SCRIPT_CANADIAN_ABORIGINAL" link="harfbuzz-hb-deprecated.html#HB-SCRIPT-CANADIAN-ABORIGINAL:CAPS" deprecated=""/>
+    <keyword type="macro" name="HB_OT_VAR_NO_AXIS_INDEX" link="harfbuzz-hb-deprecated.html#HB-OT-VAR-NO-AXIS-INDEX:CAPS" deprecated="2.2.0" since="1.4.2"/>
+    <keyword type="macro" name="HB_UNICODE_MAX_DECOMPOSITION_LEN" link="harfbuzz-hb-deprecated.html#HB-UNICODE-MAX-DECOMPOSITION-LEN:CAPS" deprecated="2.0.0"/>
+    <keyword type="typedef" name="hb_font_get_glyph_h_kerning_func_t" link="harfbuzz-hb-deprecated.html#hb-font-get-glyph-h-kerning-func-t" deprecated=""/>
+    <keyword type="typedef" name="hb_font_get_glyph_v_kerning_func_t" link="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning-func-t" deprecated=""/>
+    <keyword type="function" name="hb_face_count ()" link="harfbuzz-hb-face.html#hb-face-count" since="1.7.7"/>
+    <keyword type="function" name="hb_face_create ()" link="harfbuzz-hb-face.html#hb-face-create" since="0.9.2"/>
+    <keyword type="function" name="hb_face_create_for_tables ()" link="harfbuzz-hb-face.html#hb-face-create-for-tables" since="0.9.2"/>
+    <keyword type="function" name="hb_face_destroy ()" link="harfbuzz-hb-face.html#hb-face-destroy" since="0.9.2"/>
+    <keyword type="function" name="hb_face_get_empty ()" link="harfbuzz-hb-face.html#hb-face-get-empty" since="0.9.2"/>
+    <keyword type="function" name="hb_face_get_table_tags ()" link="harfbuzz-hb-face.html#hb-face-get-table-tags" since="1.6.0"/>
+    <keyword type="function" name="hb_face_get_glyph_count ()" link="harfbuzz-hb-face.html#hb-face-get-glyph-count" since="0.9.7"/>
+    <keyword type="function" name="hb_face_get_index ()" link="harfbuzz-hb-face.html#hb-face-get-index" since="0.9.2"/>
+    <keyword type="function" name="hb_face_get_upem ()" link="harfbuzz-hb-face.html#hb-face-get-upem" since="0.9.2"/>
+    <keyword type="function" name="hb_face_get_user_data ()" link="harfbuzz-hb-face.html#hb-face-get-user-data" since="0.9.2"/>
+    <keyword type="function" name="hb_face_is_immutable ()" link="harfbuzz-hb-face.html#hb-face-is-immutable" since="0.9.2"/>
+    <keyword type="function" name="hb_face_make_immutable ()" link="harfbuzz-hb-face.html#hb-face-make-immutable" since="0.9.2"/>
+    <keyword type="function" name="hb_face_reference ()" link="harfbuzz-hb-face.html#hb-face-reference" since="0.9.2"/>
+    <keyword type="function" name="hb_face_reference_blob ()" link="harfbuzz-hb-face.html#hb-face-reference-blob" since="0.9.2"/>
+    <keyword type="function" name="hb_face_reference_table ()" link="harfbuzz-hb-face.html#hb-face-reference-table" since="0.9.2"/>
+    <keyword type="function" name="hb_face_set_glyph_count ()" link="harfbuzz-hb-face.html#hb-face-set-glyph-count" since="0.9.7"/>
+    <keyword type="function" name="hb_face_set_index ()" link="harfbuzz-hb-face.html#hb-face-set-index" since="0.9.2"/>
+    <keyword type="function" name="hb_face_set_upem ()" link="harfbuzz-hb-face.html#hb-face-set-upem" since="0.9.2"/>
+    <keyword type="function" name="hb_face_set_user_data ()" link="harfbuzz-hb-face.html#hb-face-set-user-data" since="0.9.2"/>
+    <keyword type="function" name="hb_face_collect_unicodes ()" link="harfbuzz-hb-face.html#hb-face-collect-unicodes" since="1.9.0"/>
+    <keyword type="function" name="hb_face_collect_variation_selectors ()" link="harfbuzz-hb-face.html#hb-face-collect-variation-selectors" since="1.9.0"/>
+    <keyword type="function" name="hb_face_collect_variation_unicodes ()" link="harfbuzz-hb-face.html#hb-face-collect-variation-unicodes" since="1.9.0"/>
+    <keyword type="function" name="hb_face_builder_create ()" link="harfbuzz-hb-face.html#hb-face-builder-create" since="1.9.0"/>
+    <keyword type="function" name="hb_face_builder_add_table ()" link="harfbuzz-hb-face.html#hb-face-builder-add-table" since="1.9.0"/>
+    <keyword type="typedef" name="hb_face_t" link="harfbuzz-hb-face.html#hb-face-t"/>
+    <keyword type="function" name="hb_font_add_glyph_origin_for_direction ()" link="harfbuzz-hb-font.html#hb-font-add-glyph-origin-for-direction" since="0.9.2"/>
+    <keyword type="function" name="hb_font_create ()" link="harfbuzz-hb-font.html#hb-font-create" since="0.9.2"/>
+    <keyword type="function" name="hb_font_create_sub_font ()" link="harfbuzz-hb-font.html#hb-font-create-sub-font" since="0.9.2"/>
+    <keyword type="function" name="hb_font_destroy ()" link="harfbuzz-hb-font.html#hb-font-destroy" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_create ()" link="harfbuzz-hb-font.html#hb-font-funcs-create" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_destroy ()" link="harfbuzz-hb-font.html#hb-font-funcs-destroy" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_get_empty ()" link="harfbuzz-hb-font.html#hb-font-funcs-get-empty" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_get_user_data ()" link="harfbuzz-hb-font.html#hb-font-funcs-get-user-data" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_is_immutable ()" link="harfbuzz-hb-font.html#hb-font-funcs-is-immutable" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_make_immutable ()" link="harfbuzz-hb-font.html#hb-font-funcs-make-immutable" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_reference ()" link="harfbuzz-hb-font.html#hb-font-funcs-reference" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_set_glyph_contour_point_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-contour-point-func" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_set_glyph_extents_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-extents-func" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_set_glyph_from_name_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-from-name-func" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_set_glyph_h_advance_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-advance-func" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_set_glyph_h_advances_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-advances-func" since="1.8.6"/>
+    <keyword type="function" name="hb_font_funcs_set_glyph_h_origin_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-origin-func" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_set_glyph_name_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-name-func" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_set_glyph_v_advance_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-advance-func" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_set_glyph_v_advances_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-advances-func" since="1.8.6"/>
+    <keyword type="function" name="hb_font_funcs_set_glyph_v_origin_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-origin-func" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_set_nominal_glyph_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-nominal-glyph-func" since="1.2.3"/>
+    <keyword type="function" name="hb_font_funcs_set_nominal_glyphs_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-nominal-glyphs-func" since="2.0.0"/>
+    <keyword type="function" name="hb_font_funcs_set_user_data ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-user-data" since="0.9.2"/>
+    <keyword type="function" name="hb_font_funcs_set_variation_glyph_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-variation-glyph-func" since="1.2.3"/>
+    <keyword type="function" name="hb_font_get_empty ()" link="harfbuzz-hb-font.html#hb-font-get-empty" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_face ()" link="harfbuzz-hb-font.html#hb-font-get-face" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph ()" link="harfbuzz-hb-font.html#hb-font-get-glyph" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_advance_for_direction ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-advance-for-direction" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_advance_func_t ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-advance-func-t"/>
+    <keyword type="function" name="hb_font_get_glyph_advances_for_direction ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-advances-for-direction" since="1.8.6"/>
+    <keyword type="function" name="hb_font_get_glyph_advances_func_t ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-advances-func-t"/>
+    <keyword type="function" name="hb_font_get_glyph_contour_point ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_contour_point_for_origin ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point-for-origin" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_contour_point_func_t ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point-func-t"/>
+    <keyword type="function" name="hb_font_get_glyph_extents ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-extents" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_extents_for_origin ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-extents-for-origin" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_extents_func_t ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-extents-func-t"/>
+    <keyword type="function" name="hb_font_get_glyph_from_name ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-from-name" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_from_name_func_t ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-from-name-func-t"/>
+    <keyword type="function" name="hb_font_get_glyph_h_advance ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-h-advance" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_h_advances ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-h-advances" since="1.8.6"/>
+    <keyword type="function" name="hb_font_get_glyph_h_origin ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-h-origin" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_name ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-name" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_name_func_t ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-name-func-t"/>
+    <keyword type="function" name="hb_font_get_glyph_origin_for_direction ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-origin-for-direction" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_origin_func_t ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-origin-func-t"/>
+    <keyword type="function" name="hb_font_get_glyph_v_advance ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-v-advance" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_glyph_v_advances ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-v-advances" since="1.8.6"/>
+    <keyword type="function" name="hb_font_get_glyph_v_origin ()" link="harfbuzz-hb-font.html#hb-font-get-glyph-v-origin" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_nominal_glyph ()" link="harfbuzz-hb-font.html#hb-font-get-nominal-glyph" since="1.2.3"/>
+    <keyword type="function" name="hb_font_get_nominal_glyph_func_t ()" link="harfbuzz-hb-font.html#hb-font-get-nominal-glyph-func-t"/>
+    <keyword type="function" name="hb_font_get_parent ()" link="harfbuzz-hb-font.html#hb-font-get-parent" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_ppem ()" link="harfbuzz-hb-font.html#hb-font-get-ppem" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_ptem ()" link="harfbuzz-hb-font.html#hb-font-get-ptem" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_scale ()" link="harfbuzz-hb-font.html#hb-font-get-scale" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_user_data ()" link="harfbuzz-hb-font.html#hb-font-get-user-data" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_variation_glyph ()" link="harfbuzz-hb-font.html#hb-font-get-variation-glyph" since="1.2.3"/>
+    <keyword type="function" name="hb_font_get_variation_glyph_func_t ()" link="harfbuzz-hb-font.html#hb-font-get-variation-glyph-func-t"/>
+    <keyword type="function" name="hb_font_get_var_coords_normalized ()" link="harfbuzz-hb-font.html#hb-font-get-var-coords-normalized" since="1.4.2"/>
+    <keyword type="function" name="hb_font_glyph_from_string ()" link="harfbuzz-hb-font.html#hb-font-glyph-from-string" since="0.9.2"/>
+    <keyword type="function" name="hb_font_glyph_to_string ()" link="harfbuzz-hb-font.html#hb-font-glyph-to-string" since="0.9.2"/>
+    <keyword type="function" name="hb_font_is_immutable ()" link="harfbuzz-hb-font.html#hb-font-is-immutable" since="0.9.2"/>
+    <keyword type="function" name="hb_font_make_immutable ()" link="harfbuzz-hb-font.html#hb-font-make-immutable" since="0.9.2"/>
+    <keyword type="function" name="hb_font_reference ()" link="harfbuzz-hb-font.html#hb-font-reference" since="0.9.2"/>
+    <keyword type="function" name="hb_font_set_face ()" link="harfbuzz-hb-font.html#hb-font-set-face" since="1.4.3"/>
+    <keyword type="function" name="hb_font_set_funcs ()" link="harfbuzz-hb-font.html#hb-font-set-funcs" since="0.9.2"/>
+    <keyword type="function" name="hb_font_set_funcs_data ()" link="harfbuzz-hb-font.html#hb-font-set-funcs-data" since="0.9.2"/>
+    <keyword type="function" name="hb_font_set_parent ()" link="harfbuzz-hb-font.html#hb-font-set-parent" since="1.0.5"/>
+    <keyword type="function" name="hb_font_set_ppem ()" link="harfbuzz-hb-font.html#hb-font-set-ppem" since="0.9.2"/>
+    <keyword type="function" name="hb_font_set_ptem ()" link="harfbuzz-hb-font.html#hb-font-set-ptem" since="1.6.0"/>
+    <keyword type="function" name="hb_font_set_scale ()" link="harfbuzz-hb-font.html#hb-font-set-scale" since="0.9.2"/>
+    <keyword type="function" name="hb_font_set_user_data ()" link="harfbuzz-hb-font.html#hb-font-set-user-data" since="0.9.2"/>
+    <keyword type="function" name="hb_variation_from_string ()" link="harfbuzz-hb-font.html#hb-variation-from-string" since="1.4.2"/>
+    <keyword type="function" name="hb_variation_to_string ()" link="harfbuzz-hb-font.html#hb-variation-to-string" since="1.4.2"/>
+    <keyword type="function" name="hb_font_set_variations ()" link="harfbuzz-hb-font.html#hb-font-set-variations" since="1.4.2"/>
+    <keyword type="function" name="hb_font_set_var_coords_design ()" link="harfbuzz-hb-font.html#hb-font-set-var-coords-design" since="1.4.2"/>
+    <keyword type="function" name="hb_font_set_var_coords_normalized ()" link="harfbuzz-hb-font.html#hb-font-set-var-coords-normalized" since="1.4.2"/>
+    <keyword type="function" name="hb_font_subtract_glyph_origin_for_direction ()" link="harfbuzz-hb-font.html#hb-font-subtract-glyph-origin-for-direction" since="0.9.2"/>
+    <keyword type="function" name="hb_reference_table_func_t ()" link="harfbuzz-hb-font.html#hb-reference-table-func-t"/>
+    <keyword type="function" name="hb_font_funcs_set_font_h_extents_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-font-h-extents-func" since="1.1.2"/>
+    <keyword type="function" name="hb_font_funcs_set_font_v_extents_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-font-v-extents-func" since="1.1.2"/>
+    <keyword type="function" name="hb_font_get_extents_for_direction ()" link="harfbuzz-hb-font.html#hb-font-get-extents-for-direction" since="1.1.3"/>
+    <keyword type="function" name="hb_font_get_font_extents_func_t ()" link="harfbuzz-hb-font.html#hb-font-get-font-extents-func-t"/>
+    <keyword type="function" name="hb_font_get_h_extents ()" link="harfbuzz-hb-font.html#hb-font-get-h-extents" since="1.1.3"/>
+    <keyword type="function" name="hb_font_get_v_extents ()" link="harfbuzz-hb-font.html#hb-font-get-v-extents" since="1.1.3"/>
+    <keyword type="typedef" name="hb_font_funcs_t" link="harfbuzz-hb-font.html#hb-font-funcs-t"/>
+    <keyword type="typedef" name="hb_font_get_glyph_h_advance_func_t" link="harfbuzz-hb-font.html#hb-font-get-glyph-h-advance-func-t"/>
+    <keyword type="typedef" name="hb_font_get_glyph_h_advances_func_t" link="harfbuzz-hb-font.html#hb-font-get-glyph-h-advances-func-t"/>
+    <keyword type="typedef" name="hb_font_get_glyph_h_origin_func_t" link="harfbuzz-hb-font.html#hb-font-get-glyph-h-origin-func-t"/>
+    <keyword type="typedef" name="hb_font_get_glyph_v_advance_func_t" link="harfbuzz-hb-font.html#hb-font-get-glyph-v-advance-func-t"/>
+    <keyword type="typedef" name="hb_font_get_glyph_v_advances_func_t" link="harfbuzz-hb-font.html#hb-font-get-glyph-v-advances-func-t"/>
+    <keyword type="typedef" name="hb_font_get_glyph_v_origin_func_t" link="harfbuzz-hb-font.html#hb-font-get-glyph-v-origin-func-t"/>
+    <keyword type="struct" name="hb_variation_t" link="harfbuzz-hb-font.html#hb-variation-t" since="1.4.2"/>
+    <keyword type="typedef" name="hb_font_t" link="harfbuzz-hb-font.html#hb-font-t"/>
+    <keyword type="typedef" name="hb_font_get_font_h_extents_func_t" link="harfbuzz-hb-font.html#hb-font-get-font-h-extents-func-t"/>
+    <keyword type="typedef" name="hb_font_get_font_v_extents_func_t" link="harfbuzz-hb-font.html#hb-font-get-font-v-extents-func-t"/>
+    <keyword type="function" name="hb_map_allocation_successful ()" link="harfbuzz-hb-map.html#hb-map-allocation-successful" since="1.7.7"/>
+    <keyword type="function" name="hb_map_clear ()" link="harfbuzz-hb-map.html#hb-map-clear" since="1.7.7"/>
+    <keyword type="function" name="hb_map_create ()" link="harfbuzz-hb-map.html#hb-map-create" since="1.7.7"/>
+    <keyword type="function" name="hb_map_del ()" link="harfbuzz-hb-map.html#hb-map-del" since="1.7.7"/>
+    <keyword type="function" name="hb_map_destroy ()" link="harfbuzz-hb-map.html#hb-map-destroy" since="1.7.7"/>
+    <keyword type="function" name="hb_map_get ()" link="harfbuzz-hb-map.html#hb-map-get" since="1.7.7"/>
+    <keyword type="function" name="hb_map_get_empty ()" link="harfbuzz-hb-map.html#hb-map-get-empty" since="1.7.7"/>
+    <keyword type="function" name="hb_map_get_population ()" link="harfbuzz-hb-map.html#hb-map-get-population" since="1.7.7"/>
+    <keyword type="function" name="hb_map_get_user_data ()" link="harfbuzz-hb-map.html#hb-map-get-user-data" since="1.7.7"/>
+    <keyword type="function" name="hb_map_has ()" link="harfbuzz-hb-map.html#hb-map-has" since="1.7.7"/>
+    <keyword type="function" name="hb_map_is_empty ()" link="harfbuzz-hb-map.html#hb-map-is-empty" since="1.7.7"/>
+    <keyword type="function" name="hb_map_reference ()" link="harfbuzz-hb-map.html#hb-map-reference" since="1.7.7"/>
+    <keyword type="function" name="hb_map_set ()" link="harfbuzz-hb-map.html#hb-map-set" since="1.7.7"/>
+    <keyword type="function" name="hb_map_set_user_data ()" link="harfbuzz-hb-map.html#hb-map-set-user-data" since="1.7.7"/>
+    <keyword type="macro" name="HB_MAP_VALUE_INVALID" link="harfbuzz-hb-map.html#HB-MAP-VALUE-INVALID:CAPS"/>
+    <keyword type="typedef" name="hb_map_t" link="harfbuzz-hb-map.html#hb-map-t"/>
+    <keyword type="function" name="hb_set_add ()" link="harfbuzz-hb-set.html#hb-set-add" since="0.9.2"/>
+    <keyword type="function" name="hb_set_add_range ()" link="harfbuzz-hb-set.html#hb-set-add-range" since="0.9.7"/>
+    <keyword type="function" name="hb_set_allocation_successful ()" link="harfbuzz-hb-set.html#hb-set-allocation-successful" since="0.9.2"/>
+    <keyword type="function" name="hb_set_clear ()" link="harfbuzz-hb-set.html#hb-set-clear" since="0.9.2"/>
+    <keyword type="function" name="hb_set_create ()" link="harfbuzz-hb-set.html#hb-set-create" since="0.9.2"/>
+    <keyword type="function" name="hb_set_del ()" link="harfbuzz-hb-set.html#hb-set-del" since="0.9.2"/>
+    <keyword type="function" name="hb_set_del_range ()" link="harfbuzz-hb-set.html#hb-set-del-range" since="0.9.7"/>
+    <keyword type="function" name="hb_set_destroy ()" link="harfbuzz-hb-set.html#hb-set-destroy" since="0.9.2"/>
+    <keyword type="function" name="hb_set_get_empty ()" link="harfbuzz-hb-set.html#hb-set-get-empty" since="0.9.2"/>
+    <keyword type="function" name="hb_set_get_max ()" link="harfbuzz-hb-set.html#hb-set-get-max" since="0.9.7"/>
+    <keyword type="function" name="hb_set_get_min ()" link="harfbuzz-hb-set.html#hb-set-get-min" since="0.9.7"/>
+    <keyword type="function" name="hb_set_get_population ()" link="harfbuzz-hb-set.html#hb-set-get-population" since="0.9.7"/>
+    <keyword type="function" name="hb_set_get_user_data ()" link="harfbuzz-hb-set.html#hb-set-get-user-data" since="0.9.2"/>
+    <keyword type="function" name="hb_set_has ()" link="harfbuzz-hb-set.html#hb-set-has" since="0.9.2"/>
+    <keyword type="function" name="hb_set_intersect ()" link="harfbuzz-hb-set.html#hb-set-intersect" since="0.9.2"/>
+    <keyword type="function" name="hb_set_is_empty ()" link="harfbuzz-hb-set.html#hb-set-is-empty" since="0.9.7"/>
+    <keyword type="function" name="hb_set_is_equal ()" link="harfbuzz-hb-set.html#hb-set-is-equal" since="0.9.7"/>
+    <keyword type="function" name="hb_set_is_subset ()" link="harfbuzz-hb-set.html#hb-set-is-subset" since="1.8.1"/>
+    <keyword type="function" name="hb_set_next ()" link="harfbuzz-hb-set.html#hb-set-next" since="0.9.2"/>
+    <keyword type="function" name="hb_set_next_range ()" link="harfbuzz-hb-set.html#hb-set-next-range" since="0.9.7"/>
+    <keyword type="function" name="hb_set_previous ()" link="harfbuzz-hb-set.html#hb-set-previous" since="1.8.0"/>
+    <keyword type="function" name="hb_set_previous_range ()" link="harfbuzz-hb-set.html#hb-set-previous-range" since="1.8.0"/>
+    <keyword type="function" name="hb_set_reference ()" link="harfbuzz-hb-set.html#hb-set-reference" since="0.9.2"/>
+    <keyword type="function" name="hb_set_set ()" link="harfbuzz-hb-set.html#hb-set-set" since="0.9.2"/>
+    <keyword type="function" name="hb_set_set_user_data ()" link="harfbuzz-hb-set.html#hb-set-set-user-data" since="0.9.2"/>
+    <keyword type="function" name="hb_set_subtract ()" link="harfbuzz-hb-set.html#hb-set-subtract" since="0.9.2"/>
+    <keyword type="function" name="hb_set_symmetric_difference ()" link="harfbuzz-hb-set.html#hb-set-symmetric-difference" since="0.9.2"/>
+    <keyword type="function" name="hb_set_union ()" link="harfbuzz-hb-set.html#hb-set-union" since="0.9.2"/>
+    <keyword type="macro" name="HB_SET_VALUE_INVALID" link="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS"/>
+    <keyword type="typedef" name="hb_set_t" link="harfbuzz-hb-set.html#hb-set-t"/>
+    <keyword type="function" name="hb_shape_plan_create ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create" since="0.9.7"/>
+    <keyword type="function" name="hb_shape_plan_create_cached ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached" since="0.9.7"/>
+    <keyword type="function" name="hb_shape_plan_create2 ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create2"/>
+    <keyword type="function" name="hb_shape_plan_create_cached2 ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached2"/>
+    <keyword type="function" name="hb_shape_plan_destroy ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-destroy" since="0.9.7"/>
+    <keyword type="function" name="hb_shape_plan_execute ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-execute" since="0.9.7"/>
+    <keyword type="function" name="hb_shape_plan_get_empty ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-empty" since="0.9.7"/>
+    <keyword type="function" name="hb_shape_plan_get_shaper ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-shaper" since="0.9.7"/>
+    <keyword type="function" name="hb_shape_plan_get_user_data ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-user-data" since="0.9.7"/>
+    <keyword type="function" name="hb_shape_plan_reference ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-reference" since="0.9.7"/>
+    <keyword type="function" name="hb_shape_plan_set_user_data ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-set-user-data" since="0.9.7"/>
+    <keyword type="typedef" name="hb_shape_plan_t" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"/>
+    <keyword type="function" name="hb_feature_from_string ()" link="harfbuzz-hb-shape.html#hb-feature-from-string" since="0.9.5"/>
+    <keyword type="function" name="hb_feature_to_string ()" link="harfbuzz-hb-shape.html#hb-feature-to-string" since="0.9.5"/>
+    <keyword type="function" name="hb_shape ()" link="harfbuzz-hb-shape.html#hb-shape" since="0.9.2"/>
+    <keyword type="function" name="hb_shape_full ()" link="harfbuzz-hb-shape.html#hb-shape-full" since="0.9.2"/>
+    <keyword type="function" name="hb_shape_list_shapers ()" link="harfbuzz-hb-shape.html#hb-shape-list-shapers" since="0.9.2"/>
+    <keyword type="macro" name="HB_FEATURE_GLOBAL_END" link="harfbuzz-hb-shape.html#HB-FEATURE-GLOBAL-END:CAPS" since="2.0.0"/>
+    <keyword type="macro" name="HB_FEATURE_GLOBAL_START" link="harfbuzz-hb-shape.html#HB-FEATURE-GLOBAL-START:CAPS" since="2.0.0"/>
+    <keyword type="struct" name="hb_feature_t" link="harfbuzz-hb-shape.html#hb-feature-t-struct"/>
+    <keyword type="function" name="hb_unicode_combining_class ()" link="harfbuzz-hb-unicode.html#hb-unicode-combining-class" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_combining_class_func_t ()" link="harfbuzz-hb-unicode.html#hb-unicode-combining-class-func-t"/>
+    <keyword type="function" name="hb_unicode_compose ()" link="harfbuzz-hb-unicode.html#hb-unicode-compose" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_compose_func_t ()" link="harfbuzz-hb-unicode.html#hb-unicode-compose-func-t"/>
+    <keyword type="function" name="hb_unicode_decompose ()" link="harfbuzz-hb-unicode.html#hb-unicode-decompose" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_decompose_func_t ()" link="harfbuzz-hb-unicode.html#hb-unicode-decompose-func-t"/>
+    <keyword type="function" name="hb_unicode_funcs_create ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-create" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_destroy ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-destroy" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_get_default ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-default"/>
+    <keyword type="function" name="hb_unicode_funcs_get_empty ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-empty" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_get_parent ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-parent" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_get_user_data ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-user-data" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_is_immutable ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-is-immutable" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_make_immutable ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-make-immutable" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_reference ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-reference" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_set_combining_class_func ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-combining-class-func" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_set_compose_func ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-compose-func" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_set_decompose_func ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-decompose-func" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_set_general_category_func ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-general-category-func" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_set_mirroring_func ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-mirroring-func" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_set_script_func ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-script-func" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_set_user_data ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-user-data" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_general_category ()" link="harfbuzz-hb-unicode.html#hb-unicode-general-category" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_general_category_func_t ()" link="harfbuzz-hb-unicode.html#hb-unicode-general-category-func-t"/>
+    <keyword type="function" name="hb_unicode_mirroring ()" link="harfbuzz-hb-unicode.html#hb-unicode-mirroring" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_mirroring_func_t ()" link="harfbuzz-hb-unicode.html#hb-unicode-mirroring-func-t"/>
+    <keyword type="function" name="hb_unicode_script ()" link="harfbuzz-hb-unicode.html#hb-unicode-script" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_script_func_t ()" link="harfbuzz-hb-unicode.html#hb-unicode-script-func-t"/>
+    <keyword type="macro" name="HB_UNICODE_MAX" link="harfbuzz-hb-unicode.html#HB-UNICODE-MAX:CAPS" since="1.9.0"/>
+    <keyword type="enum" name="enum hb_unicode_combining_class_t" link="harfbuzz-hb-unicode.html#hb-unicode-combining-class-t"/>
+    <keyword type="typedef" name="hb_unicode_funcs_t" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"/>
+    <keyword type="enum" name="enum hb_unicode_general_category_t" link="harfbuzz-hb-unicode.html#hb-unicode-general-category-t"/>
+    <keyword type="macro" name="HB_VERSION_ATLEAST()" link="harfbuzz-hb-version.html#HB-VERSION-ATLEAST:CAPS"/>
+    <keyword type="function" name="hb_version ()" link="harfbuzz-hb-version.html#hb-version" since="0.9.2"/>
+    <keyword type="function" name="hb_version_atleast ()" link="harfbuzz-hb-version.html#hb-version-atleast" since="0.9.30"/>
+    <keyword type="function" name="hb_version_string ()" link="harfbuzz-hb-version.html#hb-version-string" since="0.9.2"/>
+    <keyword type="macro" name="HB_VERSION_MAJOR" link="harfbuzz-hb-version.html#HB-VERSION-MAJOR:CAPS"/>
+    <keyword type="macro" name="HB_VERSION_MICRO" link="harfbuzz-hb-version.html#HB-VERSION-MICRO:CAPS"/>
+    <keyword type="macro" name="HB_VERSION_MINOR" link="harfbuzz-hb-version.html#HB-VERSION-MINOR:CAPS"/>
+    <keyword type="macro" name="HB_VERSION_STRING" link="harfbuzz-hb-version.html#HB-VERSION-STRING:CAPS"/>
+    <keyword type="macro" name="HB_COLOR()" link="harfbuzz-hb-ot-color.html#HB-COLOR:CAPS"/>
+    <keyword type="macro" name="hb_color_get_alpha()" link="harfbuzz-hb-ot-color.html#hb-color-get-alpha" since="2.1.0"/>
+    <keyword type="macro" name="hb_color_get_blue()" link="harfbuzz-hb-ot-color.html#hb-color-get-blue" since="2.1.0"/>
+    <keyword type="macro" name="hb_color_get_green()" link="harfbuzz-hb-ot-color.html#hb-color-get-green" since="2.1.0"/>
+    <keyword type="macro" name="hb_color_get_red()" link="harfbuzz-hb-ot-color.html#hb-color-get-red" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_color_glyph_get_layers ()" link="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-get-layers" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_color_glyph_reference_png ()" link="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-reference-png" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_color_glyph_reference_svg ()" link="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-reference-svg" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_color_has_layers ()" link="harfbuzz-hb-ot-color.html#hb-ot-color-has-layers" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_color_has_palettes ()" link="harfbuzz-hb-ot-color.html#hb-ot-color-has-palettes" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_color_has_png ()" link="harfbuzz-hb-ot-color.html#hb-ot-color-has-png" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_color_has_svg ()" link="harfbuzz-hb-ot-color.html#hb-ot-color-has-svg" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_color_palette_color_get_name_id ()" link="harfbuzz-hb-ot-color.html#hb-ot-color-palette-color-get-name-id" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_color_palette_get_colors ()" link="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-colors" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_color_palette_get_count ()" link="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-count" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_color_palette_get_flags ()" link="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-flags" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_color_palette_get_name_id ()" link="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-name-id" since="2.1.0"/>
+    <keyword type="typedef" name="hb_color_t" link="harfbuzz-hb-ot-color.html#hb-color-t" since="2.1.0"/>
+    <keyword type="enum" name="enum hb_ot_color_palette_flags_t" link="harfbuzz-hb-ot-color.html#hb-ot-color-palette-flags-t" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_font_set_funcs ()" link="harfbuzz-hb-ot-font.html#hb-ot-font-set-funcs" since="0.9.28"/>
+    <keyword type="function" name="hb_ot_tag_to_language ()" link="harfbuzz-hb-ot-layout.html#hb-ot-tag-to-language" since="0.9.2"/>
+    <keyword type="function" name="hb_ot_tag_to_script ()" link="harfbuzz-hb-ot-layout.html#hb-ot-tag-to-script"/>
+    <keyword type="function" name="hb_ot_tags_from_script_and_language ()" link="harfbuzz-hb-ot-layout.html#hb-ot-tags-from-script-and-language" since="2.0.0"/>
+    <keyword type="function" name="hb_ot_tags_to_script_and_language ()" link="harfbuzz-hb-ot-layout.html#hb-ot-tags-to-script-and-language" since="2.0.0"/>
+    <keyword type="function" name="hb_ot_layout_collect_lookups ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-lookups" since="0.9.8"/>
+    <keyword type="function" name="hb_ot_layout_collect_features ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-features" since="1.8.5"/>
+    <keyword type="function" name="hb_ot_layout_feature_get_characters ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-characters" since="2.0.0"/>
+    <keyword type="function" name="hb_ot_layout_feature_get_lookups ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-lookups" since="0.9.7"/>
+    <keyword type="function" name="hb_ot_layout_feature_get_name_ids ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-name-ids" since="2.0.0"/>
+    <keyword type="function" name="hb_ot_layout_feature_with_variations_get_lookups ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-with-variations-get-lookups"/>
+    <keyword type="function" name="hb_ot_layout_get_attach_points ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-attach-points"/>
+    <keyword type="function" name="hb_ot_layout_get_glyph_class ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-glyph-class" since="0.9.7"/>
+    <keyword type="function" name="hb_ot_layout_get_glyphs_in_class ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-glyphs-in-class" since="0.9.7"/>
+    <keyword type="function" name="hb_ot_layout_get_ligature_carets ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-ligature-carets"/>
+    <keyword type="function" name="hb_ot_layout_get_size_params ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-size-params" since="0.9.10"/>
+    <keyword type="function" name="hb_ot_layout_glyph_sequence_func_t ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-glyph-sequence-func-t"/>
+    <keyword type="function" name="hb_ot_layout_has_glyph_classes ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-has-glyph-classes"/>
+    <keyword type="function" name="hb_ot_layout_has_positioning ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-has-positioning"/>
+    <keyword type="function" name="hb_ot_layout_has_substitution ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-has-substitution"/>
+    <keyword type="function" name="hb_ot_layout_language_find_feature ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-find-feature"/>
+    <keyword type="function" name="hb_ot_layout_language_get_feature_indexes ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-feature-indexes"/>
+    <keyword type="function" name="hb_ot_layout_language_get_feature_tags ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-feature-tags"/>
+    <keyword type="function" name="hb_ot_layout_language_get_required_feature ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-required-feature" since="0.9.30"/>
+    <keyword type="function" name="hb_ot_layout_lookup_collect_glyphs ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-collect-glyphs" since="0.9.7"/>
+    <keyword type="function" name="hb_ot_layout_lookup_substitute_closure ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-substitute-closure" since="0.9.7"/>
+    <keyword type="function" name="hb_ot_layout_lookups_substitute_closure ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookups-substitute-closure" since="1.8.1"/>
+    <keyword type="function" name="hb_ot_layout_lookup_would_substitute ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-would-substitute" since="0.9.7"/>
+    <keyword type="function" name="hb_ot_layout_script_get_language_tags ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-script-get-language-tags"/>
+    <keyword type="function" name="hb_ot_layout_script_select_language ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-script-select-language" since="2.0.0"/>
+    <keyword type="function" name="hb_ot_layout_table_find_feature_variations ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-find-feature-variations"/>
+    <keyword type="function" name="hb_ot_layout_table_get_feature_tags ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-get-feature-tags"/>
+    <keyword type="function" name="hb_ot_layout_table_get_script_tags ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-get-script-tags"/>
+    <keyword type="function" name="hb_ot_layout_table_get_lookup_count ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-get-lookup-count" since="0.9.22"/>
+    <keyword type="function" name="hb_ot_layout_table_select_script ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-select-script" since="2.0.0"/>
+    <keyword type="function" name="hb_ot_shape_plan_collect_lookups ()" link="harfbuzz-hb-ot-layout.html#hb-ot-shape-plan-collect-lookups" since="0.9.7"/>
+    <keyword type="function" name="hb_ot_layout_language_get_required_feature_index ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-required-feature-index"/>
+    <keyword type="macro" name="HB_OT_MAX_TAGS_PER_LANGUAGE" link="harfbuzz-hb-ot-layout.html#HB-OT-MAX-TAGS-PER-LANGUAGE:CAPS" since="2.0.0"/>
+    <keyword type="macro" name="HB_OT_MAX_TAGS_PER_SCRIPT" link="harfbuzz-hb-ot-layout.html#HB-OT-MAX-TAGS-PER-SCRIPT:CAPS" since="2.0.0"/>
+    <keyword type="macro" name="HB_OT_TAG_DEFAULT_LANGUAGE" link="harfbuzz-hb-ot-layout.html#HB-OT-TAG-DEFAULT-LANGUAGE:CAPS"/>
+    <keyword type="macro" name="HB_OT_TAG_DEFAULT_SCRIPT" link="harfbuzz-hb-ot-layout.html#HB-OT-TAG-DEFAULT-SCRIPT:CAPS"/>
+    <keyword type="macro" name="HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-DEFAULT-LANGUAGE-INDEX:CAPS"/>
+    <keyword type="macro" name="HB_OT_LAYOUT_NO_FEATURE_INDEX" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-NO-FEATURE-INDEX:CAPS"/>
+    <keyword type="macro" name="HB_OT_LAYOUT_NO_SCRIPT_INDEX" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-NO-SCRIPT-INDEX:CAPS"/>
+    <keyword type="macro" name="HB_OT_LAYOUT_NO_VARIATIONS_INDEX" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-NO-VARIATIONS-INDEX:CAPS"/>
+    <keyword type="macro" name="HB_OT_TAG_BASE" link="harfbuzz-hb-ot-layout.html#HB-OT-TAG-BASE:CAPS"/>
+    <keyword type="macro" name="HB_OT_TAG_GDEF" link="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GDEF:CAPS"/>
+    <keyword type="macro" name="HB_OT_TAG_GPOS" link="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS"/>
+    <keyword type="macro" name="HB_OT_TAG_GSUB" link="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS"/>
+    <keyword type="macro" name="HB_OT_TAG_JSTF" link="harfbuzz-hb-ot-layout.html#HB-OT-TAG-JSTF:CAPS"/>
+    <keyword type="enum" name="enum hb_ot_layout_glyph_class_t" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-glyph-class-t"/>
+    <keyword type="function" name="hb_ot_math_has_data ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-has-data" since="1.3.3"/>
+    <keyword type="function" name="hb_ot_math_get_constant ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-get-constant" since="1.3.3"/>
+    <keyword type="function" name="hb_ot_math_get_glyph_italics_correction ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-italics-correction" since="1.3.3"/>
+    <keyword type="function" name="hb_ot_math_get_glyph_top_accent_attachment ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-top-accent-attachment" since="1.3.3"/>
+    <keyword type="function" name="hb_ot_math_get_glyph_kerning ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-kerning" since="1.3.3"/>
+    <keyword type="function" name="hb_ot_math_is_glyph_extended_shape ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-is-glyph-extended-shape" since="1.3.3"/>
+    <keyword type="function" name="hb_ot_math_get_glyph_variants ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-variants" since="1.3.3"/>
+    <keyword type="function" name="hb_ot_math_get_min_connector_overlap ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-get-min-connector-overlap" since="1.3.3"/>
+    <keyword type="function" name="hb_ot_math_get_glyph_assembly ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-assembly" since="1.3.3"/>
+    <keyword type="macro" name="HB_OT_TAG_MATH" link="harfbuzz-hb-ot-math.html#HB-OT-TAG-MATH:CAPS"/>
+    <keyword type="macro" name="HB_OT_MATH_SCRIPT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-SCRIPT:CAPS"/>
+    <keyword type="enum" name="enum hb_ot_math_constant_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-constant-t" since="1.3.3"/>
+    <keyword type="enum" name="enum hb_ot_math_kern_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-kern-t" since="1.3.3"/>
+    <keyword type="struct" name="hb_ot_math_glyph_variant_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t-struct"/>
+    <keyword type="enum" name="enum hb_ot_math_glyph_part_flags_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-flags-t" since="1.3.3"/>
+    <keyword type="struct" name="hb_ot_math_glyph_part_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t-struct"/>
+    <keyword type="function" name="hb_ot_name_list_names ()" link="harfbuzz-hb-ot-name.html#hb-ot-name-list-names" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_name_get_utf16 ()" link="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf16" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_name_get_utf32 ()" link="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf32" since="2.1.0"/>
+    <keyword type="function" name="hb_ot_name_get_utf8 ()" link="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf8" since="2.1.0"/>
+    <keyword type="typedef" name="hb_ot_name_id_t" link="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" since="2.0.0"/>
+    <keyword type="function" name="hb_ot_shape_glyphs_closure ()" link="harfbuzz-hb-ot-shape.html#hb-ot-shape-glyphs-closure" since="0.9.2"/>
+    <keyword type="function" name="hb_ot_var_has_data ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-has-data" since="1.4.2"/>
+    <keyword type="function" name="hb_ot_var_find_axis_info ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-find-axis-info" since="2.2.0"/>
+    <keyword type="function" name="hb_ot_var_get_axis_count ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-get-axis-count" since="1.4.2"/>
+    <keyword type="function" name="hb_ot_var_get_axis_infos ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-get-axis-infos" since="2.2.0"/>
+    <keyword type="function" name="hb_ot_var_get_named_instance_count ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-get-named-instance-count"/>
+    <keyword type="function" name="hb_ot_var_named_instance_get_subfamily_name_id ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-subfamily-name-id"/>
+    <keyword type="function" name="hb_ot_var_named_instance_get_postscript_name_id ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-postscript-name-id"/>
+    <keyword type="function" name="hb_ot_var_named_instance_get_design_coords ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-design-coords"/>
+    <keyword type="function" name="hb_ot_var_normalize_variations ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-normalize-variations" since="1.4.2"/>
+    <keyword type="function" name="hb_ot_var_normalize_coords ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-normalize-coords" since="1.4.2"/>
+    <keyword type="macro" name="HB_OT_TAG_VAR_AXIS_ITALIC" link="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-ITALIC:CAPS"/>
+    <keyword type="macro" name="HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE" link="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-OPTICAL-SIZE:CAPS"/>
+    <keyword type="macro" name="HB_OT_TAG_VAR_AXIS_SLANT" link="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-SLANT:CAPS"/>
+    <keyword type="macro" name="HB_OT_TAG_VAR_AXIS_WEIGHT" link="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-WEIGHT:CAPS"/>
+    <keyword type="macro" name="HB_OT_TAG_VAR_AXIS_WIDTH" link="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-WIDTH:CAPS"/>
+    <keyword type="enum" name="enum hb_ot_var_axis_flags_t" link="harfbuzz-hb-ot-var.html#hb-ot-var-axis-flags-t" since="2.2.0"/>
+    <keyword type="function" name="hb_aat_layout_feature_type_get_name_id ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-get-name-id" since="2.2.0"/>
+    <keyword type="function" name="hb_aat_layout_feature_type_get_selector_infos ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-get-selector-infos"/>
+    <keyword type="function" name="hb_aat_layout_get_feature_types ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-get-feature-types" since="2.2.0"/>
+    <keyword type="function" name="hb_aat_layout_has_positioning ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-positioning"/>
+    <keyword type="function" name="hb_aat_layout_has_substitution ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-substitution"/>
+    <keyword type="function" name="hb_aat_layout_has_tracking ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-tracking"/>
+    <keyword type="macro" name="HB_AAT_LAYOUT_NO_SELECTOR_INDEX" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-NO-SELECTOR-INDEX:CAPS"/>
+    <keyword type="enum" name="enum hb_aat_layout_feature_type_t" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-t" since="2.2.0"/>
+    <keyword type="enum" name="enum hb_aat_layout_feature_selector_t" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-t" since="2.2.0"/>
+    <keyword type="function" name="hb_coretext_face_create ()" link="harfbuzz-hb-coretext.html#hb-coretext-face-create"/>
+    <keyword type="function" name="hb_coretext_font_create ()" link="harfbuzz-hb-coretext.html#hb-coretext-font-create"/>
+    <keyword type="function" name="hb_coretext_face_get_cg_font ()" link="harfbuzz-hb-coretext.html#hb-coretext-face-get-cg-font"/>
+    <keyword type="function" name="hb_coretext_font_get_ct_font ()" link="harfbuzz-hb-coretext.html#hb-coretext-font-get-ct-font"/>
+    <keyword type="macro" name="HB_CORETEXT_TAG_KERX" link="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-KERX:CAPS"/>
+    <keyword type="macro" name="HB_CORETEXT_TAG_MORT" link="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORT:CAPS"/>
+    <keyword type="macro" name="HB_CORETEXT_TAG_MORX" link="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORX:CAPS"/>
+    <keyword type="function" name="hb_ft_face_create ()" link="harfbuzz-hb-ft.html#hb-ft-face-create" since="0.9.2"/>
+    <keyword type="function" name="hb_ft_face_create_cached ()" link="harfbuzz-hb-ft.html#hb-ft-face-create-cached" since="0.9.2"/>
+    <keyword type="function" name="hb_ft_face_create_referenced ()" link="harfbuzz-hb-ft.html#hb-ft-face-create-referenced" since="0.9.38"/>
+    <keyword type="function" name="hb_ft_font_create ()" link="harfbuzz-hb-ft.html#hb-ft-font-create" since="0.9.2"/>
+    <keyword type="function" name="hb_ft_font_create_referenced ()" link="harfbuzz-hb-ft.html#hb-ft-font-create-referenced" since="0.9.38"/>
+    <keyword type="function" name="hb_ft_font_changed ()" link="harfbuzz-hb-ft.html#hb-ft-font-changed"/>
+    <keyword type="function" name="hb_ft_font_get_face ()" link="harfbuzz-hb-ft.html#hb-ft-font-get-face"/>
+    <keyword type="function" name="hb_ft_font_set_load_flags ()" link="harfbuzz-hb-ft.html#hb-ft-font-set-load-flags" since="1.0.5"/>
+    <keyword type="function" name="hb_ft_font_get_load_flags ()" link="harfbuzz-hb-ft.html#hb-ft-font-get-load-flags" since="1.0.5"/>
+    <keyword type="function" name="hb_ft_font_set_funcs ()" link="harfbuzz-hb-ft.html#hb-ft-font-set-funcs"/>
+    <keyword type="function" name="hb_glib_get_unicode_funcs ()" link="harfbuzz-hb-glib.html#hb-glib-get-unicode-funcs"/>
+    <keyword type="function" name="hb_glib_script_from_script ()" link="harfbuzz-hb-glib.html#hb-glib-script-from-script"/>
+    <keyword type="function" name="hb_glib_script_to_script ()" link="harfbuzz-hb-glib.html#hb-glib-script-to-script"/>
+    <keyword type="function" name="hb_glib_blob_create ()" link="harfbuzz-hb-glib.html#hb-glib-blob-create" since="0.9.38"/>
+    <keyword type="function" name="hb_gobject_blob_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-blob-get-type" since="0.9.2"/>
+    <keyword type="function" name="hb_gobject_buffer_content_type_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-buffer-content-type-get-type"/>
+    <keyword type="function" name="hb_gobject_buffer_diff_flags_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-buffer-diff-flags-get-type"/>
+    <keyword type="function" name="hb_gobject_buffer_flags_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-buffer-flags-get-type"/>
+    <keyword type="function" name="hb_gobject_buffer_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-buffer-get-type" since="0.9.2"/>
+    <keyword type="function" name="hb_gobject_buffer_serialize_flags_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-buffer-serialize-flags-get-type"/>
+    <keyword type="function" name="hb_gobject_buffer_serialize_format_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-buffer-serialize-format-get-type"/>
+    <keyword type="function" name="hb_gobject_direction_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-direction-get-type"/>
+    <keyword type="function" name="hb_gobject_face_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-face-get-type" since="0.9.2"/>
+    <keyword type="function" name="hb_gobject_font_funcs_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-font-funcs-get-type" since="0.9.2"/>
+    <keyword type="function" name="hb_gobject_font_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-font-get-type" since="0.9.2"/>
+    <keyword type="function" name="hb_gobject_glyph_flags_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-glyph-flags-get-type"/>
+    <keyword type="function" name="hb_gobject_map_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-map-get-type"/>
+    <keyword type="function" name="hb_gobject_memory_mode_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-memory-mode-get-type"/>
+    <keyword type="function" name="hb_gobject_ot_color_palette_flags_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-ot-color-palette-flags-get-type"/>
+    <keyword type="function" name="hb_gobject_ot_layout_glyph_class_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-ot-layout-glyph-class-get-type"/>
+    <keyword type="function" name="hb_gobject_ot_math_constant_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-ot-math-constant-get-type"/>
+    <keyword type="function" name="hb_gobject_ot_math_glyph_part_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-part-get-type"/>
+    <keyword type="function" name="hb_gobject_ot_math_glyph_part_flags_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-part-flags-get-type"/>
+    <keyword type="function" name="hb_gobject_ot_math_glyph_variant_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-variant-get-type"/>
+    <keyword type="function" name="hb_gobject_ot_math_kern_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-ot-math-kern-get-type"/>
+    <keyword type="function" name="hb_gobject_script_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-script-get-type"/>
+    <keyword type="function" name="hb_gobject_shape_plan_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-shape-plan-get-type"/>
+    <keyword type="function" name="hb_gobject_unicode_combining_class_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-unicode-combining-class-get-type"/>
+    <keyword type="function" name="hb_gobject_unicode_funcs_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-unicode-funcs-get-type" since="0.9.2"/>
+    <keyword type="function" name="hb_gobject_unicode_general_category_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-unicode-general-category-get-type"/>
+    <keyword type="function" name="hb_gobject_buffer_cluster_level_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-buffer-cluster-level-get-type"/>
+    <keyword type="function" name="hb_gobject_feature_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-feature-get-type"/>
+    <keyword type="function" name="hb_gobject_glyph_info_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-glyph-info-get-type"/>
+    <keyword type="function" name="hb_gobject_glyph_position_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-glyph-position-get-type"/>
+    <keyword type="function" name="hb_gobject_segment_properties_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-segment-properties-get-type"/>
+    <keyword type="function" name="hb_gobject_set_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-set-get-type"/>
+    <keyword type="function" name="hb_gobject_user_data_key_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-user-data-key-get-type"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_BLOB" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BLOB:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_BUFFER" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-CONTENT-TYPE:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-DIFF-FLAGS:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_BUFFER_FLAGS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-FLAGS:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FLAGS:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FORMAT:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_DIRECTION" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-DIRECTION:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_FACE" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FACE:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_FONT" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FONT:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_FONT_FUNCS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FONT-FUNCS:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_GLYPH_FLAGS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-FLAGS:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_MAP" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-MAP:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_MEMORY_MODE" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-MEMORY-MODE:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-COLOR-PALETTE-FLAGS:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-LAYOUT-GLYPH-CLASS:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_OT_MATH_CONSTANT" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-CONSTANT:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART-FLAGS:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-VARIANT:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_OT_MATH_KERN" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-KERN:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_SCRIPT" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SCRIPT:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_SHAPE_PLAN" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SHAPE-PLAN:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-COMBINING-CLASS:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_UNICODE_FUNCS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-FUNCS:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-GENERAL-CATEGORY:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-CLUSTER-LEVEL:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_FEATURE" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FEATURE:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_GLYPH_INFO" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-INFO:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_GLYPH_POSITION" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-POSITION:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_SEGMENT_PROPERTIES" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SEGMENT-PROPERTIES:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_SET" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SET:CAPS"/>
+    <keyword type="macro" name="HB_GOBJECT_TYPE_USER_DATA_KEY" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-USER-DATA-KEY:CAPS"/>
+    <keyword type="function" name="hb_graphite2_face_get_gr_face ()" link="harfbuzz-hb-graphite2.html#hb-graphite2-face-get-gr-face"/>
+    <keyword type="macro" name="HB_GRAPHITE2_TAG_SILF" link="harfbuzz-hb-graphite2.html#HB-GRAPHITE2-TAG-SILF:CAPS"/>
+    <keyword type="function" name="hb_icu_get_unicode_funcs ()" link="harfbuzz-hb-icu.html#hb-icu-get-unicode-funcs"/>
+    <keyword type="function" name="hb_icu_script_from_script ()" link="harfbuzz-hb-icu.html#hb-icu-script-from-script"/>
+    <keyword type="function" name="hb_icu_script_to_script ()" link="harfbuzz-hb-icu.html#hb-icu-script-to-script"/>
+    <keyword type="function" name="hb_uniscribe_font_get_hfont ()" link="harfbuzz-hb-uniscribe.html#hb-uniscribe-font-get-hfont"/>
+    <keyword type="function" name="hb_uniscribe_font_get_logfontw ()" link="harfbuzz-hb-uniscribe.html#hb-uniscribe-font-get-logfontw"/>
+    <keyword type="constant" name="HB_MEMORY_MODE_DUPLICATE" link="harfbuzz-hb-blob.html#HB-MEMORY-MODE-DUPLICATE:CAPS"/>
+    <keyword type="constant" name="HB_MEMORY_MODE_READONLY" link="harfbuzz-hb-blob.html#HB-MEMORY-MODE-READONLY:CAPS"/>
+    <keyword type="constant" name="HB_MEMORY_MODE_WRITABLE" link="harfbuzz-hb-blob.html#HB-MEMORY-MODE-WRITABLE:CAPS"/>
+    <keyword type="constant" name="HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE" link="harfbuzz-hb-blob.html#HB-MEMORY-MODE-READONLY-MAY-MAKE-WRITABLE:CAPS"/>
+    <keyword type="constant" name="HB_GLYPH_FLAG_UNSAFE_TO_BREAK" link="harfbuzz-hb-buffer.html#HB-GLYPH-FLAG-UNSAFE-TO-BREAK:CAPS"/>
+    <keyword type="constant" name="HB_GLYPH_FLAG_DEFINED" link="harfbuzz-hb-buffer.html#HB-GLYPH-FLAG-DEFINED:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_CONTENT_TYPE_INVALID" link="harfbuzz-hb-buffer.html#HB-BUFFER-CONTENT-TYPE-INVALID:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_CONTENT_TYPE_UNICODE" link="harfbuzz-hb-buffer.html#HB-BUFFER-CONTENT-TYPE-UNICODE:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_CONTENT_TYPE_GLYPHS" link="harfbuzz-hb-buffer.html#HB-BUFFER-CONTENT-TYPE-GLYPHS:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_FLAG_DEFAULT" link="harfbuzz-hb-buffer.html#HB-BUFFER-FLAG-DEFAULT:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_FLAG_BOT" link="harfbuzz-hb-buffer.html#HB-BUFFER-FLAG-BOT:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_FLAG_EOT" link="harfbuzz-hb-buffer.html#HB-BUFFER-FLAG-EOT:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES" link="harfbuzz-hb-buffer.html#HB-BUFFER-FLAG-PRESERVE-DEFAULT-IGNORABLES:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES" link="harfbuzz-hb-buffer.html#HB-BUFFER-FLAG-REMOVE-DEFAULT-IGNORABLES:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES" link="harfbuzz-hb-buffer.html#HB-BUFFER-CLUSTER-LEVEL-MONOTONE-GRAPHEMES:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS" link="harfbuzz-hb-buffer.html#HB-BUFFER-CLUSTER-LEVEL-MONOTONE-CHARACTERS:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_CLUSTER_LEVEL_CHARACTERS" link="harfbuzz-hb-buffer.html#HB-BUFFER-CLUSTER-LEVEL-CHARACTERS:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_CLUSTER_LEVEL_DEFAULT" link="harfbuzz-hb-buffer.html#HB-BUFFER-CLUSTER-LEVEL-DEFAULT:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_SERIALIZE_FORMAT_TEXT" link="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FORMAT-TEXT:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_SERIALIZE_FORMAT_JSON" link="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FORMAT-JSON:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_SERIALIZE_FORMAT_INVALID" link="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FORMAT-INVALID:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_DEFAULT" link="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-DEFAULT:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS" link="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-CLUSTERS:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS" link="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-POSITIONS:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES" link="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-GLYPH-NAMES:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS" link="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-GLYPH-EXTENTS:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS" link="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-GLYPH-FLAGS:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES" link="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-ADVANCES:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_EQUAL" link="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-EQUAL:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH" link="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-CONTENT-TYPE-MISMATCH:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH" link="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-LENGTH-MISMATCH:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT" link="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-NOTDEF-PRESENT:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT" link="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-DOTTED-CIRCLE-PRESENT:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH" link="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-CODEPOINT-MISMATCH:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH" link="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-CLUSTER-MISMATCH:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH" link="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-GLYPH-FLAGS-MISMATCH:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH" link="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-POSITION-MISMATCH:CAPS"/>
+    <keyword type="constant" name="HB_DIRECTION_INVALID" link="harfbuzz-hb-common.html#HB-DIRECTION-INVALID:CAPS"/>
+    <keyword type="constant" name="HB_DIRECTION_LTR" link="harfbuzz-hb-common.html#HB-DIRECTION-LTR:CAPS"/>
+    <keyword type="constant" name="HB_DIRECTION_RTL" link="harfbuzz-hb-common.html#HB-DIRECTION-RTL:CAPS"/>
+    <keyword type="constant" name="HB_DIRECTION_TTB" link="harfbuzz-hb-common.html#HB-DIRECTION-TTB:CAPS"/>
+    <keyword type="constant" name="HB_DIRECTION_BTT" link="harfbuzz-hb-common.html#HB-DIRECTION-BTT:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_COMMON" link="harfbuzz-hb-common.html#HB-SCRIPT-COMMON:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_INHERITED" link="harfbuzz-hb-common.html#HB-SCRIPT-INHERITED:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_UNKNOWN" link="harfbuzz-hb-common.html#HB-SCRIPT-UNKNOWN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ARABIC" link="harfbuzz-hb-common.html#HB-SCRIPT-ARABIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ARMENIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-ARMENIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BENGALI" link="harfbuzz-hb-common.html#HB-SCRIPT-BENGALI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CYRILLIC" link="harfbuzz-hb-common.html#HB-SCRIPT-CYRILLIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_DEVANAGARI" link="harfbuzz-hb-common.html#HB-SCRIPT-DEVANAGARI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GEORGIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-GEORGIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GREEK" link="harfbuzz-hb-common.html#HB-SCRIPT-GREEK:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GUJARATI" link="harfbuzz-hb-common.html#HB-SCRIPT-GUJARATI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GURMUKHI" link="harfbuzz-hb-common.html#HB-SCRIPT-GURMUKHI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_HANGUL" link="harfbuzz-hb-common.html#HB-SCRIPT-HANGUL:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_HAN" link="harfbuzz-hb-common.html#HB-SCRIPT-HAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_HEBREW" link="harfbuzz-hb-common.html#HB-SCRIPT-HEBREW:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_HIRAGANA" link="harfbuzz-hb-common.html#HB-SCRIPT-HIRAGANA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KANNADA" link="harfbuzz-hb-common.html#HB-SCRIPT-KANNADA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KATAKANA" link="harfbuzz-hb-common.html#HB-SCRIPT-KATAKANA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LAO" link="harfbuzz-hb-common.html#HB-SCRIPT-LAO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LATIN" link="harfbuzz-hb-common.html#HB-SCRIPT-LATIN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MALAYALAM" link="harfbuzz-hb-common.html#HB-SCRIPT-MALAYALAM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ORIYA" link="harfbuzz-hb-common.html#HB-SCRIPT-ORIYA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TAMIL" link="harfbuzz-hb-common.html#HB-SCRIPT-TAMIL:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TELUGU" link="harfbuzz-hb-common.html#HB-SCRIPT-TELUGU:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_THAI" link="harfbuzz-hb-common.html#HB-SCRIPT-THAI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TIBETAN" link="harfbuzz-hb-common.html#HB-SCRIPT-TIBETAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BOPOMOFO" link="harfbuzz-hb-common.html#HB-SCRIPT-BOPOMOFO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BRAILLE" link="harfbuzz-hb-common.html#HB-SCRIPT-BRAILLE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CANADIAN_SYLLABICS" link="harfbuzz-hb-common.html#HB-SCRIPT-CANADIAN-SYLLABICS:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CHEROKEE" link="harfbuzz-hb-common.html#HB-SCRIPT-CHEROKEE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ETHIOPIC" link="harfbuzz-hb-common.html#HB-SCRIPT-ETHIOPIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KHMER" link="harfbuzz-hb-common.html#HB-SCRIPT-KHMER:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MONGOLIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-MONGOLIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MYANMAR" link="harfbuzz-hb-common.html#HB-SCRIPT-MYANMAR:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OGHAM" link="harfbuzz-hb-common.html#HB-SCRIPT-OGHAM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_RUNIC" link="harfbuzz-hb-common.html#HB-SCRIPT-RUNIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SINHALA" link="harfbuzz-hb-common.html#HB-SCRIPT-SINHALA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SYRIAC" link="harfbuzz-hb-common.html#HB-SCRIPT-SYRIAC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_THAANA" link="harfbuzz-hb-common.html#HB-SCRIPT-THAANA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_YI" link="harfbuzz-hb-common.html#HB-SCRIPT-YI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_DESERET" link="harfbuzz-hb-common.html#HB-SCRIPT-DESERET:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GOTHIC" link="harfbuzz-hb-common.html#HB-SCRIPT-GOTHIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_ITALIC" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-ITALIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BUHID" link="harfbuzz-hb-common.html#HB-SCRIPT-BUHID:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_HANUNOO" link="harfbuzz-hb-common.html#HB-SCRIPT-HANUNOO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TAGALOG" link="harfbuzz-hb-common.html#HB-SCRIPT-TAGALOG:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TAGBANWA" link="harfbuzz-hb-common.html#HB-SCRIPT-TAGBANWA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CYPRIOT" link="harfbuzz-hb-common.html#HB-SCRIPT-CYPRIOT:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LIMBU" link="harfbuzz-hb-common.html#HB-SCRIPT-LIMBU:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LINEAR_B" link="harfbuzz-hb-common.html#HB-SCRIPT-LINEAR-B:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OSMANYA" link="harfbuzz-hb-common.html#HB-SCRIPT-OSMANYA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SHAVIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-SHAVIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TAI_LE" link="harfbuzz-hb-common.html#HB-SCRIPT-TAI-LE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_UGARITIC" link="harfbuzz-hb-common.html#HB-SCRIPT-UGARITIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BUGINESE" link="harfbuzz-hb-common.html#HB-SCRIPT-BUGINESE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_COPTIC" link="harfbuzz-hb-common.html#HB-SCRIPT-COPTIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GLAGOLITIC" link="harfbuzz-hb-common.html#HB-SCRIPT-GLAGOLITIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KHAROSHTHI" link="harfbuzz-hb-common.html#HB-SCRIPT-KHAROSHTHI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_NEW_TAI_LUE" link="harfbuzz-hb-common.html#HB-SCRIPT-NEW-TAI-LUE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_PERSIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-PERSIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SYLOTI_NAGRI" link="harfbuzz-hb-common.html#HB-SCRIPT-SYLOTI-NAGRI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TIFINAGH" link="harfbuzz-hb-common.html#HB-SCRIPT-TIFINAGH:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BALINESE" link="harfbuzz-hb-common.html#HB-SCRIPT-BALINESE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CUNEIFORM" link="harfbuzz-hb-common.html#HB-SCRIPT-CUNEIFORM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_NKO" link="harfbuzz-hb-common.html#HB-SCRIPT-NKO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_PHAGS_PA" link="harfbuzz-hb-common.html#HB-SCRIPT-PHAGS-PA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_PHOENICIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-PHOENICIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CARIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-CARIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CHAM" link="harfbuzz-hb-common.html#HB-SCRIPT-CHAM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KAYAH_LI" link="harfbuzz-hb-common.html#HB-SCRIPT-KAYAH-LI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LEPCHA" link="harfbuzz-hb-common.html#HB-SCRIPT-LEPCHA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LYCIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-LYCIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LYDIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-LYDIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OL_CHIKI" link="harfbuzz-hb-common.html#HB-SCRIPT-OL-CHIKI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_REJANG" link="harfbuzz-hb-common.html#HB-SCRIPT-REJANG:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SAURASHTRA" link="harfbuzz-hb-common.html#HB-SCRIPT-SAURASHTRA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SUNDANESE" link="harfbuzz-hb-common.html#HB-SCRIPT-SUNDANESE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_VAI" link="harfbuzz-hb-common.html#HB-SCRIPT-VAI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_AVESTAN" link="harfbuzz-hb-common.html#HB-SCRIPT-AVESTAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BAMUM" link="harfbuzz-hb-common.html#HB-SCRIPT-BAMUM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_EGYPTIAN_HIEROGLYPHS" link="harfbuzz-hb-common.html#HB-SCRIPT-EGYPTIAN-HIEROGLYPHS:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_IMPERIAL_ARAMAIC" link="harfbuzz-hb-common.html#HB-SCRIPT-IMPERIAL-ARAMAIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_INSCRIPTIONAL_PAHLAVI" link="harfbuzz-hb-common.html#HB-SCRIPT-INSCRIPTIONAL-PAHLAVI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_INSCRIPTIONAL_PARTHIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-INSCRIPTIONAL-PARTHIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_JAVANESE" link="harfbuzz-hb-common.html#HB-SCRIPT-JAVANESE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KAITHI" link="harfbuzz-hb-common.html#HB-SCRIPT-KAITHI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LISU" link="harfbuzz-hb-common.html#HB-SCRIPT-LISU:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MEETEI_MAYEK" link="harfbuzz-hb-common.html#HB-SCRIPT-MEETEI-MAYEK:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_SOUTH_ARABIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-SOUTH-ARABIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_TURKIC" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-TURKIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SAMARITAN" link="harfbuzz-hb-common.html#HB-SCRIPT-SAMARITAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TAI_THAM" link="harfbuzz-hb-common.html#HB-SCRIPT-TAI-THAM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TAI_VIET" link="harfbuzz-hb-common.html#HB-SCRIPT-TAI-VIET:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BATAK" link="harfbuzz-hb-common.html#HB-SCRIPT-BATAK:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BRAHMI" link="harfbuzz-hb-common.html#HB-SCRIPT-BRAHMI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MANDAIC" link="harfbuzz-hb-common.html#HB-SCRIPT-MANDAIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CHAKMA" link="harfbuzz-hb-common.html#HB-SCRIPT-CHAKMA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MEROITIC_CURSIVE" link="harfbuzz-hb-common.html#HB-SCRIPT-MEROITIC-CURSIVE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MEROITIC_HIEROGLYPHS" link="harfbuzz-hb-common.html#HB-SCRIPT-MEROITIC-HIEROGLYPHS:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MIAO" link="harfbuzz-hb-common.html#HB-SCRIPT-MIAO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SHARADA" link="harfbuzz-hb-common.html#HB-SCRIPT-SHARADA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SORA_SOMPENG" link="harfbuzz-hb-common.html#HB-SCRIPT-SORA-SOMPENG:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TAKRI" link="harfbuzz-hb-common.html#HB-SCRIPT-TAKRI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BASSA_VAH" link="harfbuzz-hb-common.html#HB-SCRIPT-BASSA-VAH:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CAUCASIAN_ALBANIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-CAUCASIAN-ALBANIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_DUPLOYAN" link="harfbuzz-hb-common.html#HB-SCRIPT-DUPLOYAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ELBASAN" link="harfbuzz-hb-common.html#HB-SCRIPT-ELBASAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GRANTHA" link="harfbuzz-hb-common.html#HB-SCRIPT-GRANTHA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KHOJKI" link="harfbuzz-hb-common.html#HB-SCRIPT-KHOJKI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KHUDAWADI" link="harfbuzz-hb-common.html#HB-SCRIPT-KHUDAWADI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LINEAR_A" link="harfbuzz-hb-common.html#HB-SCRIPT-LINEAR-A:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MAHAJANI" link="harfbuzz-hb-common.html#HB-SCRIPT-MAHAJANI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MANICHAEAN" link="harfbuzz-hb-common.html#HB-SCRIPT-MANICHAEAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MENDE_KIKAKUI" link="harfbuzz-hb-common.html#HB-SCRIPT-MENDE-KIKAKUI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MODI" link="harfbuzz-hb-common.html#HB-SCRIPT-MODI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MRO" link="harfbuzz-hb-common.html#HB-SCRIPT-MRO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_NABATAEAN" link="harfbuzz-hb-common.html#HB-SCRIPT-NABATAEAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_NORTH_ARABIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-NORTH-ARABIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_PERMIC" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-PERMIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_PAHAWH_HMONG" link="harfbuzz-hb-common.html#HB-SCRIPT-PAHAWH-HMONG:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_PALMYRENE" link="harfbuzz-hb-common.html#HB-SCRIPT-PALMYRENE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_PAU_CIN_HAU" link="harfbuzz-hb-common.html#HB-SCRIPT-PAU-CIN-HAU:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_PSALTER_PAHLAVI" link="harfbuzz-hb-common.html#HB-SCRIPT-PSALTER-PAHLAVI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SIDDHAM" link="harfbuzz-hb-common.html#HB-SCRIPT-SIDDHAM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TIRHUTA" link="harfbuzz-hb-common.html#HB-SCRIPT-TIRHUTA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_WARANG_CITI" link="harfbuzz-hb-common.html#HB-SCRIPT-WARANG-CITI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_AHOM" link="harfbuzz-hb-common.html#HB-SCRIPT-AHOM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ANATOLIAN_HIEROGLYPHS" link="harfbuzz-hb-common.html#HB-SCRIPT-ANATOLIAN-HIEROGLYPHS:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_HATRAN" link="harfbuzz-hb-common.html#HB-SCRIPT-HATRAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MULTANI" link="harfbuzz-hb-common.html#HB-SCRIPT-MULTANI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_HUNGARIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-HUNGARIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SIGNWRITING" link="harfbuzz-hb-common.html#HB-SCRIPT-SIGNWRITING:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ADLAM" link="harfbuzz-hb-common.html#HB-SCRIPT-ADLAM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BHAIKSUKI" link="harfbuzz-hb-common.html#HB-SCRIPT-BHAIKSUKI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MARCHEN" link="harfbuzz-hb-common.html#HB-SCRIPT-MARCHEN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OSAGE" link="harfbuzz-hb-common.html#HB-SCRIPT-OSAGE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TANGUT" link="harfbuzz-hb-common.html#HB-SCRIPT-TANGUT:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_NEWA" link="harfbuzz-hb-common.html#HB-SCRIPT-NEWA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MASARAM_GONDI" link="harfbuzz-hb-common.html#HB-SCRIPT-MASARAM-GONDI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_NUSHU" link="harfbuzz-hb-common.html#HB-SCRIPT-NUSHU:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SOYOMBO" link="harfbuzz-hb-common.html#HB-SCRIPT-SOYOMBO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ZANABAZAR_SQUARE" link="harfbuzz-hb-common.html#HB-SCRIPT-ZANABAZAR-SQUARE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_DOGRA" link="harfbuzz-hb-common.html#HB-SCRIPT-DOGRA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GUNJALA_GONDI" link="harfbuzz-hb-common.html#HB-SCRIPT-GUNJALA-GONDI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_HANIFI_ROHINGYA" link="harfbuzz-hb-common.html#HB-SCRIPT-HANIFI-ROHINGYA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MAKASAR" link="harfbuzz-hb-common.html#HB-SCRIPT-MAKASAR:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MEDEFAIDRIN" link="harfbuzz-hb-common.html#HB-SCRIPT-MEDEFAIDRIN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_SOGDIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-SOGDIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SOGDIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-SOGDIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_INVALID" link="harfbuzz-hb-common.html#HB-SCRIPT-INVALID:CAPS"/>
+    <keyword type="constant" name="_HB_SCRIPT_MAX_VALUE" link="harfbuzz-hb-common.html#HB-SCRIPT-MAX-VALUE:CAPS"/>
+    <keyword type="constant" name="_HB_SCRIPT_MAX_VALUE_SIGNED" link="harfbuzz-hb-common.html#HB-SCRIPT-MAX-VALUE-SIGNED:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_NOT_REORDERED" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-NOT-REORDERED:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_OVERLAY" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-OVERLAY:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_NUKTA" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-NUKTA:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_KANA_VOICING" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-KANA-VOICING:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_VIRAMA" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-VIRAMA:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC10" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC10:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC11" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC11:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC12" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC12:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC13" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC13:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC14" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC14:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC15" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC15:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC16" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC16:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC17" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC17:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC18" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC18:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC19" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC19:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC20" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC20:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC21" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC21:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC22" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC22:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC23" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC23:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC24" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC24:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC25" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC25:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC26" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC26:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC27" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC27:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC28" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC28:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC29" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC29:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC30" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC30:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC31" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC31:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC32" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC32:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC33" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC33:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC34" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC34:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC35" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC35:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC36" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC36:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC84" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC84:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC91" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC91:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC103" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC103:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC107" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC107:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC118" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC118:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC122" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC122:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC129" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC129:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC130" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC130:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_CCC133" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-CCC133:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-ATTACHED-BELOW-LEFT:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-ATTACHED-BELOW:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-ATTACHED-ABOVE:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-ATTACHED-ABOVE-RIGHT:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_BELOW_LEFT" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-BELOW-LEFT:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_BELOW" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-BELOW:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-BELOW-RIGHT:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_LEFT" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-LEFT:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_RIGHT" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-RIGHT:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-ABOVE-LEFT:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_ABOVE" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-ABOVE:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-ABOVE-RIGHT:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-DOUBLE-BELOW:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-DOUBLE-ABOVE:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-IOTA-SUBSCRIPT:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_INVALID" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-INVALID:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_CONTROL" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-CONTROL:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_FORMAT" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-FORMAT:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-UNASSIGNED:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-PRIVATE-USE:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_SURROGATE" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-SURROGATE:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-LOWERCASE-LETTER:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-MODIFIER-LETTER:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-OTHER-LETTER:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-TITLECASE-LETTER:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-UPPERCASE-LETTER:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-SPACING-MARK:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-ENCLOSING-MARK:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-NON-SPACING-MARK:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-DECIMAL-NUMBER:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-LETTER-NUMBER:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-OTHER-NUMBER:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-CONNECT-PUNCTUATION:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-DASH-PUNCTUATION:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-CLOSE-PUNCTUATION:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-FINAL-PUNCTUATION:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-INITIAL-PUNCTUATION:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-OTHER-PUNCTUATION:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-OPEN-PUNCTUATION:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-CURRENCY-SYMBOL:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-MODIFIER-SYMBOL:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-MATH-SYMBOL:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-OTHER-SYMBOL:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-LINE-SEPARATOR:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-PARAGRAPH-SEPARATOR:CAPS"/>
+    <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-SPACE-SEPARATOR:CAPS"/>
+    <keyword type="constant" name="HB_OT_COLOR_PALETTE_FLAG_DEFAULT" link="harfbuzz-hb-ot-color.html#HB-OT-COLOR-PALETTE-FLAG-DEFAULT:CAPS"/>
+    <keyword type="constant" name="HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND" link="harfbuzz-hb-ot-color.html#HB-OT-COLOR-PALETTE-FLAG-USABLE-WITH-LIGHT-BACKGROUND:CAPS"/>
+    <keyword type="constant" name="HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND" link="harfbuzz-hb-ot-color.html#HB-OT-COLOR-PALETTE-FLAG-USABLE-WITH-DARK-BACKGROUND:CAPS"/>
+    <keyword type="constant" name="HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-GLYPH-CLASS-UNCLASSIFIED:CAPS"/>
+    <keyword type="constant" name="HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-GLYPH-CLASS-BASE-GLYPH:CAPS"/>
+    <keyword type="constant" name="HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-GLYPH-CLASS-LIGATURE:CAPS"/>
+    <keyword type="constant" name="HB_OT_LAYOUT_GLYPH_CLASS_MARK" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-GLYPH-CLASS-MARK:CAPS"/>
+    <keyword type="constant" name="HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-GLYPH-CLASS-COMPONENT:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-SCRIPT-PERCENT-SCALE-DOWN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-SCRIPT-SCRIPT-PERCENT-SCALE-DOWN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-DELIMITED-SUB-FORMULA-MIN-HEIGHT:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-DISPLAY-OPERATOR-MIN-HEIGHT:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_MATH_LEADING" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-MATH-LEADING:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_AXIS_HEIGHT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-AXIS-HEIGHT:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_ACCENT_BASE_HEIGHT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-ACCENT-BASE-HEIGHT:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_FLATTENED_ACCENT_BASE_HEIGHT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-FLATTENED-ACCENT-BASE-HEIGHT:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_SUBSCRIPT_SHIFT_DOWN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-SUBSCRIPT-SHIFT-DOWN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_SUBSCRIPT_TOP_MAX" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-SUBSCRIPT-TOP-MAX:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_SUBSCRIPT_BASELINE_DROP_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-SUBSCRIPT-BASELINE-DROP-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-SUPERSCRIPT-SHIFT-UP:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP_CRAMPED" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-SUPERSCRIPT-SHIFT-UP-CRAMPED:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-SUPERSCRIPT-BOTTOM-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_SUPERSCRIPT_BASELINE_DROP_MAX" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-SUPERSCRIPT-BASELINE-DROP-MAX:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_SUB_SUPERSCRIPT_GAP_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-SUB-SUPERSCRIPT-GAP-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MAX_WITH_SUBSCRIPT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-SUPERSCRIPT-BOTTOM-MAX-WITH-SUBSCRIPT:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_SPACE_AFTER_SCRIPT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-SPACE-AFTER-SCRIPT:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_UPPER_LIMIT_GAP_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-UPPER-LIMIT-GAP-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_UPPER_LIMIT_BASELINE_RISE_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-UPPER-LIMIT-BASELINE-RISE-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_LOWER_LIMIT_GAP_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-LOWER-LIMIT-GAP-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_LOWER_LIMIT_BASELINE_DROP_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-LOWER-LIMIT-BASELINE-DROP-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_STACK_TOP_SHIFT_UP" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-STACK-TOP-SHIFT-UP:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_STACK_TOP_DISPLAY_STYLE_SHIFT_UP" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-STACK-TOP-DISPLAY-STYLE-SHIFT-UP:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_STACK_BOTTOM_SHIFT_DOWN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-STACK-BOTTOM-SHIFT-DOWN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_STACK_BOTTOM_DISPLAY_STYLE_SHIFT_DOWN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-STACK-BOTTOM-DISPLAY-STYLE-SHIFT-DOWN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_STACK_GAP_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-STACK-GAP-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_STACK_DISPLAY_STYLE_GAP_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-STACK-DISPLAY-STYLE-GAP-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_STRETCH_STACK_TOP_SHIFT_UP" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-STRETCH-STACK-TOP-SHIFT-UP:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_STRETCH_STACK_BOTTOM_SHIFT_DOWN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-STRETCH-STACK-BOTTOM-SHIFT-DOWN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_ABOVE_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-STRETCH-STACK-GAP-ABOVE-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_BELOW_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-STRETCH-STACK-GAP-BELOW-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_SHIFT_UP" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-FRACTION-NUMERATOR-SHIFT-UP:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_DISPLAY_STYLE_SHIFT_UP" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-FRACTION-NUMERATOR-DISPLAY-STYLE-SHIFT-UP:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_SHIFT_DOWN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-FRACTION-DENOMINATOR-SHIFT-DOWN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_DISPLAY_STYLE_SHIFT_DOWN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-FRACTION-DENOMINATOR-DISPLAY-STYLE-SHIFT-DOWN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_GAP_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-FRACTION-NUMERATOR-GAP-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_FRACTION_NUM_DISPLAY_STYLE_GAP_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-FRACTION-NUM-DISPLAY-STYLE-GAP-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_FRACTION_RULE_THICKNESS" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-FRACTION-RULE-THICKNESS:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_GAP_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-FRACTION-DENOMINATOR-GAP-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_FRACTION_DENOM_DISPLAY_STYLE_GAP_MIN" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-FRACTION-DENOM-DISPLAY-STYLE-GAP-MIN:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_SKEWED_FRACTION_HORIZONTAL_GAP" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-SKEWED-FRACTION-HORIZONTAL-GAP:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_SKEWED_FRACTION_VERTICAL_GAP" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-SKEWED-FRACTION-VERTICAL-GAP:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_OVERBAR_VERTICAL_GAP" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-OVERBAR-VERTICAL-GAP:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_OVERBAR_RULE_THICKNESS" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-OVERBAR-RULE-THICKNESS:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_OVERBAR_EXTRA_ASCENDER" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-OVERBAR-EXTRA-ASCENDER:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_UNDERBAR_VERTICAL_GAP" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-UNDERBAR-VERTICAL-GAP:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_UNDERBAR_RULE_THICKNESS" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-UNDERBAR-RULE-THICKNESS:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_UNDERBAR_EXTRA_DESCENDER" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-UNDERBAR-EXTRA-DESCENDER:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_RADICAL_VERTICAL_GAP" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-RADICAL-VERTICAL-GAP:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_RADICAL_DISPLAY_STYLE_VERTICAL_GAP" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-RADICAL-DISPLAY-STYLE-VERTICAL-GAP:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_RADICAL_RULE_THICKNESS" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-RADICAL-RULE-THICKNESS:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_RADICAL_EXTRA_ASCENDER" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-RADICAL-EXTRA-ASCENDER:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_RADICAL_KERN_BEFORE_DEGREE" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-RADICAL-KERN-BEFORE-DEGREE:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_RADICAL_KERN_AFTER_DEGREE" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-RADICAL-KERN-AFTER-DEGREE:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-CONSTANT-RADICAL-DEGREE-BOTTOM-RAISE-PERCENT:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_KERN_TOP_RIGHT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-KERN-TOP-RIGHT:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_KERN_TOP_LEFT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-KERN-TOP-LEFT:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_KERN_BOTTOM_RIGHT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-KERN-BOTTOM-RIGHT:CAPS"/>
+    <keyword type="constant" name="HB_OT_MATH_KERN_BOTTOM_LEFT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-KERN-BOTTOM-LEFT:CAPS"/>
+    <keyword type="constant" name="HB_MATH_GLYPH_PART_FLAG_EXTENDER" link="harfbuzz-hb-ot-math.html#HB-MATH-GLYPH-PART-FLAG-EXTENDER:CAPS"/>
+    <keyword type="constant" name="HB_OT_VAR_AXIS_FLAG_HIDDEN" link="harfbuzz-hb-ot-var.html#HB-OT-VAR-AXIS-FLAG-HIDDEN:CAPS"/>
+    <keyword type="constant" name="_HB_OT_VAR_AXIS_FLAG_MAX_VALUE" link="harfbuzz-hb-ot-var.html#HB-OT-VAR-AXIS-FLAG-MAX-VALUE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_INVALID" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-INVALID:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ALL-TYPOGRAPHIC:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CURISVE-CONNECTION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LETTER-CASE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-VERTICAL-SUBSTITUTION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LINGUISTIC-REARRANGEMENT:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-NUMBER-SPACING:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-SMART-SWASH-TYPE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-DIACRITICS-TYPE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-VERTICAL-POSITION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-FRACTIONS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-OVERLAPPING-CHARACTERS-TYPE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ORNAMENT-SETS-TYPE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-ALTERNATIVES:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-DESIGN-COMPLEXITY-TYPE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLE-OPTIONS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-NUMBER-CASE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TEXT-SPACING:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TRANSLITERATION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ANNOTATION-TYPE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-KANA-SPACING-TYPE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-SPACING-TYPE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-UNICODE-DECOMPOSITION-TYPE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-RUBY-KANA:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-SYMBOL-ALTERNATIVES-TYPE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-ALTERNATIVES-TYPE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-VERTICAL-ROMAN-PLACEMENT-TYPE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ITALIC-CJK-ROMAN:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CASE-SENSITIVE-LAYOUT:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ALTERNATE-KANA:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CONTEXTUAL-ALTERNATIVES:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LOWER-CASE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-UPPER-CASE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LANGUAGE-TAG-TYPE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-ROMAN-SPACING-TYPE:CAPS"/>
+    <keyword type="constant" name="_HB_AAT_LAYOUT_FEATURE_TYPE_MAX_VALUE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MAX-VALUE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-INVALID:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ALL-TYPE-FEATURES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ALL-TYPE-FEATURES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-REQUIRED-LIGATURES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-REQUIRED-LIGATURES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-COMMON-LIGATURES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-COMMON-LIGATURES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-RARE-LIGATURES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-RARE-LIGATURES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-LOGOS-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-LOGOS-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-REBUS-PICTURES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-REBUS-PICTURES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DIPHTHONG-LIGATURES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DIPHTHONG-LIGATURES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SQUARED-LIGATURES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SQUARED-LIGATURES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ABBREV-SQUARED-LIGATURES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ABBREV-SQUARED-LIGATURES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SYMBOL-LIGATURES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SYMBOL-LIGATURES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-LIGATURES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-LIGATURES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HISTORICAL-LIGATURES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HISTORICAL-LIGATURES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_UNCONNECTED" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-UNCONNECTED:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_PARTIALLY_CONNECTED" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-PARTIALLY-CONNECTED:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CURSIVE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CURSIVE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_AND_LOWER_CASE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-UPPER-AND-LOWER-CASE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_CAPS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ALL-CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_LOWER_CASE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ALL-LOWER-CASE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SMALL-CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-INITIAL-CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS_AND_SMALL_CAPS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-INITIAL-CAPS-AND-SMALL-CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SUBSTITUTE-VERTICAL-FORMS-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SUBSTITUTE-VERTICAL-FORMS-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-LINGUISTIC-REARRANGEMENT-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-LINGUISTIC-REARRANGEMENT-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-MONOSPACED-NUMBERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-NUMBERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_NUMBERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-THIRD-WIDTH-NUMBERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_NUMBERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-QUARTER-WIDTH-NUMBERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-WORD-INITIAL-SWASHES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-WORD-INITIAL-SWASHES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-WORD-FINAL-SWASHES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-WORD-FINAL-SWASHES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-LINE-INITIAL-SWASHES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-LINE-INITIAL-SWASHES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-LINE-FINAL-SWASHES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-LINE-FINAL-SWASHES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NON-FINAL-SWASHES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NON-FINAL-SWASHES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SHOW_DIACRITICS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SHOW-DIACRITICS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HIDE_DIACRITICS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HIDE-DIACRITICS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DECOMPOSE_DIACRITICS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DECOMPOSE-DIACRITICS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NORMAL-POSITION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SUPERIORS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-INFERIORS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ORDINALS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SCIENTIFIC-INFERIORS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-FRACTIONS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-VERTICAL-FRACTIONS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DIAGONAL-FRACTIONS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-PREVENT-OVERLAP-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-PREVENT-OVERLAP-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHENS-TO-EM-DASH-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHENS-TO-EM-DASH-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHEN-TO-EN-DASH-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHEN-TO-EN-DASH-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SLASHED-ZERO-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SLASHED-ZERO-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-FORM-INTERROBANG-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-FORM-INTERROBANG-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SMART-QUOTES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SMART-QUOTES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-PERIODS-TO-ELLIPSIS-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-PERIODS-TO-ELLIPSIS-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHEN-TO-MINUS-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHEN-TO-MINUS-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ASTERISK-TO-MULTIPLY-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ASTERISK-TO-MULTIPLY-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SLASH-TO-DIVIDE-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SLASH-TO-DIVIDE-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-INEQUALITY-LIGATURES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-INEQUALITY-LIGATURES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-EXPONENTS-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-EXPONENTS-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-MATHEMATICAL-GREEK-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-MATHEMATICAL-GREEK-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ORNAMENTS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-ORNAMENTS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DINGBATS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DINGBATS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_PI_CHARACTERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-PI-CHARACTERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_FLEURONS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-FLEURONS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DECORATIVE_BORDERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DECORATIVE-BORDERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_INTERNATIONAL_SYMBOLS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-INTERNATIONAL-SYMBOLS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_MATH_SYMBOLS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-MATH-SYMBOLS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ALTERNATES" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-ALTERNATES:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL1" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL1:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL2" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL2:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL3" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL3:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL4" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL4:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL5" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL5:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-STYLE-OPTIONS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DISPLAY_TEXT" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DISPLAY-TEXT:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ENGRAVED_TEXT" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ENGRAVED-TEXT:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ILLUMINATED_CAPS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ILLUMINATED-CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-TITLING-CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_TALL_CAPS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-TALL-CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-CHARACTERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SIMPLIFIED-CHARACTERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-JIS1978-CHARACTERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-JIS1983-CHARACTERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-JIS1990-CHARACTERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_ONE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-ONE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_TWO" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-TWO:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_THREE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-THREE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FOUR" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-FOUR:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FIVE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-FIVE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-EXPERT-CHARACTERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-JIS2004-CHARACTERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HOJO-CHARACTERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NLCCHARACTERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-NAMES-CHARACTERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-LOWER-CASE-NUMBERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-UPPER-CASE-NUMBERS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-TEXT:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-MONOSPACED-TEXT:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HALF-WIDTH-TEXT:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-THIRD-WIDTH-TEXT:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-QUARTER-WIDTH-TEXT:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ALT-PROPORTIONAL-TEXT:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ALT-HALF-WIDTH-TEXT:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-TRANSLITERATION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HANJA-TO-HANGUL:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HIRAGANA_TO_KATAKANA" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HIRAGANA-TO-KATAKANA:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_KATAKANA_TO_HIRAGANA" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-KATAKANA-TO-HIRAGANA:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_KANA_TO_ROMANIZATION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-KANA-TO-ROMANIZATION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_HIRAGANA" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ROMANIZATION-TO-HIRAGANA:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_KATAKANA" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ROMANIZATION-TO-KATAKANA:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_ONE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HANJA-TO-HANGUL-ALT-ONE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_TWO" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HANJA-TO-HANGUL-ALT-TWO:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_THREE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HANJA-TO-HANGUL-ALT-THREE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ANNOTATION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-ANNOTATION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_BOX_ANNOTATION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-BOX-ANNOTATION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ROUNDED_BOX_ANNOTATION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ROUNDED-BOX-ANNOTATION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CIRCLE_ANNOTATION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CIRCLE-ANNOTATION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_CIRCLE_ANNOTATION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-INVERTED-CIRCLE-ANNOTATION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_PARENTHESIS_ANNOTATION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-PARENTHESIS-ANNOTATION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIOD_ANNOTATION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-PERIOD-ANNOTATION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMAN_NUMERAL_ANNOTATION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ROMAN-NUMERAL-ANNOTATION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAMOND_ANNOTATION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DIAMOND-ANNOTATION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_BOX_ANNOTATION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-INVERTED-BOX-ANNOTATION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_ROUNDED_BOX_ANNOTATION" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-INVERTED-ROUNDED-BOX-ANNOTATION:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_KANA" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-FULL-WIDTH-KANA:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_KANA" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-KANA:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_IDEOGRAPHS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-FULL-WIDTH-IDEOGRAPHS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_IDEOGRAPHS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-IDEOGRAPHS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_IDEOGRAPHS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HALF-WIDTH-IDEOGRAPHS:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CANONICAL-COMPOSITION-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CANONICAL-COMPOSITION-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-COMPATIBILITY-COMPOSITION-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-COMPATIBILITY-COMPOSITION-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-TRANSCODING-COMPOSITION-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-TRANSCODING-COMPOSITION-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_RUBY_KANA" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-RUBY-KANA:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-RUBY-KANA:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-RUBY-KANA-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-RUBY-KANA-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_SYMBOL_ALTERNATIVES" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-CJK-SYMBOL-ALTERNATIVES:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_ONE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-ONE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_TWO" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-TWO:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_THREE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-THREE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FOUR" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-FOUR:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FIVE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-FIVE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_IDEOGRAPHIC_ALTERNATIVES" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-IDEOGRAPHIC-ALTERNATIVES:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_ONE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-ONE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_TWO" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-TWO:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_THREE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-THREE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FOUR" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-FOUR:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FIVE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-FIVE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_CENTERED" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-VERTICAL-ROMAN-CENTERED:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_HBASELINE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-VERTICAL-ROMAN-HBASELINE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_ITALIC_ROMAN" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-CJK-ITALIC-ROMAN:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-ITALIC-ROMAN:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-ITALIC-ROMAN-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-ITALIC-ROMAN-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CASE-SENSITIVE-LAYOUT-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CASE-SENSITIVE-LAYOUT-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CASE-SENSITIVE-SPACING-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CASE-SENSITIVE-SPACING-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ALTERNATE-HORIZ-KANA-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ALTERNATE-HORIZ-KANA-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ALTERNATE-VERT-KANA-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ALTERNATE-VERT-KANA-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLISTIC_ALTERNATES" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-STYLISTIC-ALTERNATES:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-ONE-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-ONE-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWO-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWO-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-THREE-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-THREE-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FOUR-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FOUR-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FIVE-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FIVE-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SIX-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SIX-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SEVEN-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SEVEN-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-EIGHT-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-EIGHT-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-NINE-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-NINE-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TEN-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TEN-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-ELEVEN-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-ELEVEN-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWELVE-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWELVE-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-THIRTEEN-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-THIRTEEN-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FOURTEEN-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FOURTEEN-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FIFTEEN-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FIFTEEN-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SIXTEEN-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SIXTEEN-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SEVENTEEN-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SEVENTEEN-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-EIGHTEEN-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-EIGHTEEN-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-NINETEEN-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-NINETEEN-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWENTY-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWENTY-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-ALTERNATES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-ALTERNATES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SWASH-ALTERNATES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-SWASH-ALTERNATES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-SWASH-ALTERNATES-ON:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-SWASH-ALTERNATES-OFF:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DEFAULT-LOWER-CASE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-LOWER-CASE-SMALL-CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-LOWER-CASE-PETITE-CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DEFAULT-UPPER-CASE:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-UPPER-CASE-SMALL-CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-UPPER-CASE-PETITE-CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_CJK_ROMAN" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-HALF-WIDTH-CJK-ROMAN:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_CJK_ROMAN" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-CJK-ROMAN:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DEFAULT-CJK-ROMAN:CAPS"/>
+    <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-FULL-WIDTH-CJK-ROMAN:CAPS"/>
+    <keyword type="constant" name="_HB_AAT_LAYOUT_FEATURE_SELECTOR_MAX_VALUE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-MAX-VALUE:CAPS"/>
+    <keyword type="member" name="hb-glyph-position-t-struct.x-advance" link="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct.x-advance"/>
+    <keyword type="member" name="hb-glyph-position-t-struct.y-advance" link="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct.y-advance"/>
+    <keyword type="member" name="hb-glyph-position-t-struct.x-offset" link="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct.x-offset"/>
+    <keyword type="member" name="hb-glyph-position-t-struct.y-offset" link="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct.y-offset"/>
+    <keyword type="member" name="hb-segment-properties-t-struct.direction" link="harfbuzz-hb-buffer.html#hb-segment-properties-t-struct.direction"/>
+    <keyword type="member" name="hb-segment-properties-t-struct.script" link="harfbuzz-hb-buffer.html#hb-segment-properties-t-struct.script"/>
+    <keyword type="member" name="hb-segment-properties-t-struct.language" link="harfbuzz-hb-buffer.html#hb-segment-properties-t-struct.language"/>
+  </functions>
+</book>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/home.png b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/home.png
new file mode 100644
index 0000000..c989d466
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/home.png
Binary files differ
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/index.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/index.html
new file mode 100644
index 0000000..7d9e404
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/index.html
@@ -0,0 +1,249 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>HarfBuzz Manual: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<meta name="description" content="HarfBuzz  HarfBuzz is an OpenType text shaping engine. Using the HarfBuzz library allows programs to convert a sequence of Unicode input into properly formatted and positioned glyph output—for any writing system and language. The canonical source-code tree is available at github.com/harfbuzz/harfbuzz and is also available at cgit.freedesktop.org/harfbuzz. See for release tarballs.">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="next" href="pt01.html" title="Part I. User's manual">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="book">
+<div class="titlepage">
+<div>
+<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">HarfBuzz Manual</p></th></tr></table></div>
+<div><div class="abstract">
+<p class="title"><b>HarfBuzz</b></p>
+<div align="center"><img src="HarfBuzz.png" align="middle"></div>
+<p>
+        HarfBuzz is an <a class="ulink" href="http://www.microsoft.com/typography/otspec/" target="_top">OpenType</a>
+        text shaping engine. Using the HarfBuzz library allows
+	programs to convert a sequence of Unicode input into
+	properly formatted and positioned glyph output—for any writing
+	system and language.
+      </p>
+<p>
+	The canonical source-code tree is available at
+        <a class="ulink" href="https://github.com/harfbuzz/harfbuzz" target="_top">github.com/harfbuzz/harfbuzz</a>
+        and is also available at
+        <a class="ulink" href="http://cgit.freedesktop.org/harfbuzz/" target="_top">cgit.freedesktop.org/harfbuzz</a>.
+	See <a class="xref" href="install-harfbuzz.html#download" title="Downloading HarfBuzz">Downloading HarfBuzz</a> for
+	release tarballs.
+      </p>
+</div></div>
+</div>
+<hr>
+</div>
+<div class="toc"><dl class="toc">
+<dt><span class="part"><a href="pt01.html">I. User's manual</a></span></dt>
+<dd><dl>
+<dt><span class="chapter"><a href="what-is-harfbuzz.html">What is HarfBuzz?</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="what-is-harfbuzz.html#what-is-text-shaping">What is text shaping?</a></span></dt>
+<dt><span class="section"><a href="why-do-i-need-a-shaping-engine.html">Why do I need a shaping engine?</a></span></dt>
+<dt><span class="section"><a href="ch01s03.html">What does HarfBuzz do?</a></span></dt>
+<dt><span class="section"><a href="what-harfbuzz-doesnt-do.html">What HarfBuzz doesn't do</a></span></dt>
+<dt><span class="section"><a href="why-is-it-called-harfbuzz.html">Why is it called HarfBuzz?</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="install-harfbuzz.html">Installing HarfBuzz</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="install-harfbuzz.html#download">Downloading HarfBuzz</a></span></dt>
+<dt><span class="section"><a href="building.html">Building HarfBuzz</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="building.html#building.linux">Building on Linux</a></span></dt>
+<dt><span class="section"><a href="building.html#building.windows">Building on Windows</a></span></dt>
+<dt><span class="section"><a href="building.html#building.macos">Building on macOS</a></span></dt>
+<dt><span class="section"><a href="building.html#configuration">Configuration options</a></span></dt>
+</dl></dd>
+</dl></dd>
+<dt><span class="chapter"><a href="getting-started.html">Getting started with HarfBuzz</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="getting-started.html#id-1.2.4.2">An overview of the HarfBuzz shaping API</a></span></dt>
+<dt><span class="section"><a href="ch03s02.html">Terminology</a></span></dt>
+<dt><span class="section"><a href="ch03s03.html">A simple shaping example</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="shaping-concepts.html">Shaping concepts</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="shaping-concepts.html#text-shaping-concepts">Text shaping</a></span></dt>
+<dt><span class="section"><a href="complex-scripts.html">Complex scripts</a></span></dt>
+<dt><span class="section"><a href="shaping-operations.html">Shaping operations</a></span></dt>
+<dt><span class="section"><a href="unicode-character-categories.html">Unicode character categories</a></span></dt>
+<dt><span class="section"><a href="text-runs.html">Text runs</a></span></dt>
+<dt><span class="section"><a href="opentype-shaping-models.html">OpenType shaping models</a></span></dt>
+<dt><span class="section"><a href="graphite-shaping.html">Graphite shaping</a></span></dt>
+<dt><span class="section"><a href="aat-shaping.html">AAT shaping</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="buffers-language-script-and-direction.html">Buffers, language, script and direction</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="buffers-language-script-and-direction.html#creating-and-destroying-buffers">Creating and destroying buffers</a></span></dt>
+<dt><span class="section"><a href="adding-text-to-the-buffer.html">Adding text to the buffer</a></span></dt>
+<dt><span class="section"><a href="setting-buffer-properties.html">Setting buffer properties</a></span></dt>
+<dt><span class="section"><a href="what-about-the-other-scripts.html">What about the other scripts?</a></span></dt>
+<dt><span class="section"><a href="customizing-unicode-functions.html">Customizing Unicode functions</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="fonts-and-faces.html">Fonts and faces</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="fonts-and-faces.html#using-freetype">Using FreeType</a></span></dt>
+<dt><span class="section"><a href="using-harfbuzzs-native-opentype-implementation.html">Using HarfBuzz's native OpenType implementation</a></span></dt>
+<dt><span class="section"><a href="using-your-own-font-functions.html">Using your own font functions</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="clusters.html">Clusters</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="clusters.html#clusters-and-shaping">Clusters and shaping</a></span></dt>
+<dt><span class="section"><a href="working-with-harfbuzz-clusters.html">Working with HarfBuzz clusters</a></span></dt>
+<dt><span class="section"><a href="a-clustering-example-for-levels-0-and-1.html">A clustering example for levels 0 and 1</a></span></dt>
+<dt><span class="section"><a href="reordering-in-levels-0-and-1.html">Reordering in levels 0 and 1</a></span></dt>
+<dt><span class="section"><a href="the-distinction-between-levels-0-and-1.html">The distinction between levels 0 and 1</a></span></dt>
+<dt><span class="section"><a href="level-2.html">Level 2</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="level-2.html#ligatures-with-combining-marks-in-level-2">Ligatures with combining marks in level 2</a></span></dt>
+<dt><span class="section"><a href="level-2.html#reordering-in-level-2">Reordering in level 2</a></span></dt>
+<dt><span class="section"><a href="level-2.html#other-considerations-in-level-2">Other considerations in level 2</a></span></dt>
+</dl></dd>
+</dl></dd>
+<dt><span class="chapter"><a href="shaping-and-shape-plans.html">Shaping and shape plans</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="shaping-and-shape-plans.html#opentype-features">OpenType features</a></span></dt>
+<dt><span class="section"><a href="plans-and-caching.html">Plans and caching</a></span></dt>
+</dl></dd>
+</dl></dd>
+<dt><span class="part"><a href="pt02.html">II. Reference manual</a></span></dt>
+<dd><dl>
+<dt><span class="chapter"><a href="ch09.html">Core API</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-blob.html">hb-blob</a></span><span class="refpurpose"> — Binary data containers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-buffer.html">hb-buffer</a></span><span class="refpurpose"> — Input and output buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-common.html">hb-common</a></span><span class="refpurpose"> — Common data types</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-deprecated.html">hb-deprecated</a></span><span class="refpurpose"> — Deprecated API</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-face.html">hb-face</a></span><span class="refpurpose"> — Font face objects</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-font.html">hb-font</a></span><span class="refpurpose"> — Font objects</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-map.html">hb-map</a></span><span class="refpurpose"> — Object representing integer to integer mapping</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-set.html">hb-set</a></span><span class="refpurpose"> — Object representing a set of integers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-shape-plan.html">hb-shape-plan</a></span><span class="refpurpose"> — Object representing a shaping plan</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-shape.html">hb-shape</a></span><span class="refpurpose"> — Conversion of text strings into positioned glyphs</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-unicode.html">hb-unicode</a></span><span class="refpurpose"> — Unicode character property access</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-version.html">hb-version</a></span><span class="refpurpose"> — Information about the version of HarfBuzz in use</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="ch10.html">OpenType API</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-color.html">hb-ot-color</a></span><span class="refpurpose"> — OpenType Color Fonts</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-font.html">hb-ot-font</a></span><span class="refpurpose"> — OpenType font implementation</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-layout.html">hb-ot-layout</a></span><span class="refpurpose"> — OpenType Layout</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-math.html">hb-ot-math</a></span><span class="refpurpose"> — OpenType Math information</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-name.html">hb-ot-name</a></span><span class="refpurpose"> — OpenType font name information</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-shape.html">hb-ot-shape</a></span><span class="refpurpose"> — OpenType shaping support</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-var.html">hb-ot-var</a></span><span class="refpurpose"> — OpenType Font Variations</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="ch11.html">Apple Advanced Typography API</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-aat-layout.html">hb-aat-layout</a></span><span class="refpurpose"> — Apple Advanced Typography Layout</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="ch12.html">Integration API</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-coretext.html">hb-coretext</a></span><span class="refpurpose"> — CoreText integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ft.html">hb-ft</a></span><span class="refpurpose"> — FreeType integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-glib.html">hb-glib</a></span><span class="refpurpose"> — GLib integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-gobject.html">hb-gobject</a></span><span class="refpurpose"> — GObject integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-graphite2.html">hb-graphite2</a></span><span class="refpurpose"> — Graphite2 integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-icu.html">hb-icu</a></span><span class="refpurpose"> — ICU integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-uniscribe.html">hb-uniscribe</a></span><span class="refpurpose"> — Windows integration</span>
+</dt>
+</dl></dd>
+<dt><span class="index"><a href="api-index-full.html">API Index</a></span></dt>
+<dt><span class="index"><a href="deprecated-api-index.html">Index of deprecated API</a></span></dt>
+<dt><span class="index"><a href="api-index-2-1-0.html">Index of new symbols in 2.1.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-0-0.html">Index of new symbols in 2.0.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-9-0.html">Index of new symbols in 1.9.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-6.html">Index of new symbols in 1.8.6</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-5.html">Index of new symbols in 1.8.5</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-1.html">Index of new symbols in 1.8.1</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-0.html">Index of new symbols in 1.8.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-7-7.html">Index of new symbols in 1.7.7</a></span></dt>
+<dt><span class="index"><a href="api-index-1-7-5.html">Index of new symbols in 1.7.5</a></span></dt>
+<dt><span class="index"><a href="api-index-1-6-0.html">Index of new symbols in 1.6.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-5-0.html">Index of new symbols in 1.5.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-3.html">Index of new symbols in 1.4.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-2.html">Index of new symbols in 1.4.2</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-0.html">Index of new symbols in 1.4.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-3-3.html">Index of new symbols in 1.3.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-2-3.html">Index of new symbols in 1.2.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-1-3.html">Index of new symbols in 1.1.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-1-2.html">Index of new symbols in 1.1.2</a></span></dt>
+<dt><span class="index"><a href="api-index-1-0-5.html">Index of new symbols in 1.0.5</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-42.html">Index of new symbols in 0.9.42</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-41.html">Index of new symbols in 0.9.41</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-39.html">Index of new symbols in 0.9.39</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-38.html">Index of new symbols in 0.9.38</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-31.html">Index of new symbols in 0.9.31</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-30.html">Index of new symbols in 0.9.30</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-28.html">Index of new symbols in 0.9.28</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-22.html">Index of new symbols in 0.9.22</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-20.html">Index of new symbols in 0.9.20</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-11.html">Index of new symbols in 0.9.11</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-10.html">Index of new symbols in 0.9.10</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-8.html">Index of new symbols in 0.9.8</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-7.html">Index of new symbols in 0.9.7</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-5.html">Index of new symbols in 0.9.5</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-2.html">Index of new symbols in 0.9.2</a></span></dt>
+<dt><span class="glossary"><a href="annotation-glossary.html">Annotation Glossary</a></span></dt>
+</dl></dd>
+</dl></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/install-harfbuzz.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/install-harfbuzz.html
new file mode 100644
index 0000000..940cf1a
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/install-harfbuzz.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Installing HarfBuzz: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="prev" href="why-is-it-called-harfbuzz.html" title="Why is it called HarfBuzz?">
+<link rel="next" href="building.html" title="Building HarfBuzz">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="why-is-it-called-harfbuzz.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="building.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="install-harfbuzz"></a>Installing HarfBuzz</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt><span class="section"><a href="install-harfbuzz.html#download">Downloading HarfBuzz</a></span></dt>
+<dt><span class="section"><a href="building.html">Building HarfBuzz</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="building.html#building.linux">Building on Linux</a></span></dt>
+<dt><span class="section"><a href="building.html#building.windows">Building on Windows</a></span></dt>
+<dt><span class="section"><a href="building.html#building.macos">Building on macOS</a></span></dt>
+<dt><span class="section"><a href="building.html#configuration">Configuration options</a></span></dt>
+</dl></dd>
+</dl></div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="download"></a>Downloading HarfBuzz</h2></div></div></div>
+<p>
+      The HarfBuzz source code is hosted at <a class="ulink" href="https://github.com/harfbuzz/harfbuzz" target="_top">github.com/harfbuzz/harfbuzz</a>. The
+      same source tree is also available at the
+      <a class="ulink" href="http://cgit.freedesktop.org/harfbuzz/" target="_top">Freedesktop.org</a>
+      site.
+    </p>
+<p>
+      Tarball releases and Win32 binary bundles (which include the
+      libharfbuzz DLL, hb-view.exe, hb-shape.exe, and all
+      dependencies) of HarfBuzz can be downloaded from <a class="ulink" href="https://github.com/harfbuzz/harfbuzz" target="_top">github.com/harfbuzz/harfbuzz/releases</a>
+      or from 
+      <a class="ulink" href="http://www.freedesktop.org/software/harfbuzz/release/" target="_top">Freedesktop.org</a>.
+    </p>
+<p>
+      Release notes are posted with each new release to provide an
+      overview of the changes. The project <a class="ulink" href="https://github.com/harfbuzz/harfbuzz/issues" target="_top">tracks bug
+      reports and other issues</a> on GitHub. Discussion and
+      questions are welcome on the <a class="ulink" href="http://freedesktop.org/mailman/listinfo/harfbuzz/" target="_top">HarfBuzz
+      mailing list</a>.
+    </p>
+<p>
+      The API included in the <code class="filename">hb.h</code> file will not change in a
+      compatibility-breaking way in any release. However, other,
+      peripheral headers are more likely to go through minor
+      modifications. We will do our best to never change APIs in an
+      incompatible way. We will <span class="emphasis"><em>never</em></span> break the ABI. 
+    </p>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/left-insensitive.png b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/left-insensitive.png
new file mode 100644
index 0000000..b1148fb
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/left-insensitive.png
Binary files differ
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/left.png b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/left.png
new file mode 100644
index 0000000..c164913
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/left.png
Binary files differ
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/level-2.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/level-2.html
new file mode 100644
index 0000000..3e67349
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/level-2.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Level 2: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="clusters.html" title="Clusters">
+<link rel="prev" href="the-distinction-between-levels-0-and-1.html" title="The distinction between levels 0 and 1">
+<link rel="next" href="shaping-and-shape-plans.html" title="Shaping and shape plans">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="clusters.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="the-distinction-between-levels-0-and-1.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="shaping-and-shape-plans.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="level-2"></a>Level 2</h2></div></div></div>
+<p>
+      HarfBuzz's level 2 cluster behavior uses a significantly
+      different model than that of level 0 and level 1.
+    </p>
+<p>
+      The level 2 behavior is easy to describe, but it may be
+      difficult to understand in practical terms. In brief, level 2 
+      performs no merging of clusters whatsoever.
+    </p>
+<p>
+      This means that there is no initial base-and-mark merging step
+      (as is done in level 0), and it means that reordering moves and
+      ligature substitutions do not trigger a cluster merge.
+    </p>
+<p>
+      Only one shaping operation directly affects clusters when using
+      level 2:
+    </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>
+	  When a cluster <span class="emphasis"><em>decomposes</em></span>, all of the
+	  resulting child clusters inherit as their cluster value the
+	  cluster value of the parent cluster.
+	</p></li></ul></div>
+<p>
+      When glyphs do form a ligature (or when some other feature
+      substitutes multiple glyphs with one glyph) the cluster value
+      of the first glyph is retained as the cluster value for the
+      resulting ligature.
+    </p>
+<p>
+      This occurrence sounds similar to a cluster merge, but it is
+      different. In particular, no subsequent characters —
+      including marks and modifiers — are affected. They retain
+      their previous cluster values. 
+    </p>
+<p>
+      Level 2 cluster behavior is ultimately less complex than level 0
+      or level 1, but there are several cases for which processing
+      cluster values produced at level 2 may be tricky. 
+    </p>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="ligatures-with-combining-marks-in-level-2"></a>Ligatures with combining marks in level 2</h3></div></div></div>
+<p>
+	The first example of how HarfBuzz's level 2 cluster behavior
+	can be tricky is when the text to be shaped includes combining
+	marks attached to ligatures.
+      </p>
+<p>
+	Let us start with an input sequence with the following
+	characters (top row) and initial cluster values (bottom row):
+      </p>
+<pre class="programlisting">
+	A,acute,B,breve,C,circumflex
+	0,1    ,2,3    ,4,5
+      </pre>
+<p>
+	If the sequence <code class="literal">A,B,C</code> forms a ligature,
+	then these are the cluster values HarfBuzz will return under
+	the various cluster levels:
+      </p>
+<p>
+	Level 0:
+      </p>
+<pre class="programlisting">
+	ABC,acute,breve,circumflex
+	0  ,0    ,0    ,0
+      </pre>
+<p>
+	Level 1:
+      </p>
+<pre class="programlisting">
+	ABC,acute,breve,circumflex
+	0  ,0    ,0    ,5
+      </pre>
+<p>
+	Level 2:
+      </p>
+<pre class="programlisting">
+	ABC,acute,breve,circumflex
+	0  ,1    ,3    ,5
+      </pre>
+<p>
+	Making sense of the level 2 result is the hardest for a client
+	program, because there is nothing in the cluster values that
+	indicates that <code class="literal">B</code> and <code class="literal">C</code>
+	formed a ligature with <code class="literal">A</code>.
+      </p>
+<p>
+	In contrast, the "merged" cluster values of the mark glyphs
+	that are seen in the level 0 and level 1 output are evidence
+	that a ligature substitution took place. 
+      </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="reordering-in-level-2"></a>Reordering in level 2</h3></div></div></div>
+<p>
+	Another example of how HarfBuzz's level 2 cluster behavior
+	can be tricky is when glyphs reorder. Consider an input sequence
+	with the following characters (top row) and initial cluster
+	values (bottom row):
+      </p>
+<pre class="programlisting">
+	A,B,C,D,E
+	0,1,2,3,4
+      </pre>
+<p>
+	Now imagine <code class="literal">D</code> moves before
+	<code class="literal">B</code> in a reordering operation. The cluster
+	values will then be:
+      </p>
+<pre class="programlisting">
+	A,D,B,C,E
+	0,3,1,2,4
+      </pre>
+<p>
+	Next, if <code class="literal">D</code> forms a ligature with
+	<code class="literal">B</code>, the output is:
+      </p>
+<pre class="programlisting">
+	A,DB,C,E
+	0,3 ,2,4
+      </pre>
+<p>
+	However, in a different scenario, in which the shaping rules
+	of the script instead caused <code class="literal">A</code> and
+	<code class="literal">B</code> to form a ligature
+	<span class="emphasis"><em>before</em></span> the <code class="literal">D</code> reordered, the
+	result would be:
+      </p>
+<pre class="programlisting">
+	AB,D,C,E
+	0 ,3,2,4   
+      </pre>
+<p>
+	There is no way for a client program to differentiate between
+	these two scenarios based on the cluster values
+	alone. Consequently, client programs that use level 2 might
+	need to undertake additional work in order to manage cursor
+	positioning, text attributes, or other desired features.
+      </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="other-considerations-in-level-2"></a>Other considerations in level 2</h3></div></div></div>
+<p>
+	There may be other problems encountered with ligatures under
+	level 2, such as if the direction of the text is forced to
+	opposite of its natural direction (for example, Arabic text
+	that is forced into left-to-right directionality). But,
+	generally speaking, these other scenarios are minor corner
+	cases that are too obscure for most client programs to need to
+	worry about.
+      </p>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/opentype-shaping-models.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/opentype-shaping-models.html
new file mode 100644
index 0000000..46b9e2b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/opentype-shaping-models.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>OpenType shaping models: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="shaping-concepts.html" title="Shaping concepts">
+<link rel="prev" href="text-runs.html" title="Text runs">
+<link rel="next" href="graphite-shaping.html" title="Graphite shaping">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="shaping-concepts.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="text-runs.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="graphite-shaping.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="opentype-shaping-models"></a>OpenType shaping models</h2></div></div></div>
+<p>
+      OpenType provides shaping models for the following scripts:
+    </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem"><p>
+	  The <span class="emphasis"><em>default</em></span> shaping model handles all
+	  non-complex scripts, and may also be used as a fallback for
+	  handling unrecognized scripts.
+	</p></li>
+<li class="listitem">
+<p>
+	  The <span class="emphasis"><em>Indic</em></span> shaping model handles the Indic
+	  scripts Bengali, Devanagari, Gujarati, Gurmukhi, Kannada,
+	  Malayalam, Oriya, Tamil, Telugu, and Sinhala.
+	</p>
+<p>
+	  The Indic shaping model was revised significantly in
+	  2005. To denote the change, a new set of <span class="emphasis"><em>script
+	  tags</em></span> was assigned for Bengali, Devanagari,
+	  Gujarati, Gurmukhi, Kannada, Malayalam, Oriya, Tamil, and
+	  Telugu. For the sake of clarity, the term "Indic2" is
+	  sometimes used to refer to the current, revised shaping
+	  model.
+	</p>
+</li>
+<li class="listitem"><p>
+	  The <span class="emphasis"><em>Arabic</em></span> shaping model supports
+	  Arabic, Mongolian, N'Ko, Syriac, and several other connected
+	  or cursive scripts.
+	</p></li>
+<li class="listitem"><p>
+	  The <span class="emphasis"><em>Thai/Lao</em></span> shaping model supports
+	  the Thai and Lao scripts.
+	</p></li>
+<li class="listitem"><p>
+	  The <span class="emphasis"><em>Khmer</em></span> shaping model supports the
+	  Khmer script.
+	</p></li>
+<li class="listitem"><p>
+	  The <span class="emphasis"><em>Myanmar</em></span> shaping model supports the
+	  Myanmar (or Burmese) script.
+	</p></li>
+<li class="listitem"><p>
+	  The <span class="emphasis"><em>Tibetan</em></span> shaping model supports the
+	  Tibetan script.
+	</p></li>
+<li class="listitem"><p>
+	  The <span class="emphasis"><em>Hangul</em></span> shaping model supports the
+	  Hangul script.
+	</p></li>
+<li class="listitem"><p>
+	  The <span class="emphasis"><em>Hebrew</em></span> shaping model supports the
+	  Hebrew script.
+	</p></li>
+<li class="listitem"><p>
+	  The <span class="emphasis"><em>Universal Shaping Engine</em></span> (USE)
+	  shaping model supports complex scripts not covered by one of
+	  the above, script-specific shaping models, including
+	  Javanese, Balinese, Buginese, Batak, Chakma, Lepcha, Modi,
+	  Phags-pa, Tagalog, Siddham, Sundanese, Tai Le, Tai Tham, Tai
+	  Viet, and many others. 
+	</p></li>
+<li class="listitem"><p>
+	  Text runs that do not fall under one of the above shaping
+	  models may still require processing by a shaping engine. Of
+	  particular note is <span class="emphasis"><em>Emoji</em></span> shaping, which
+	  may involve variation-selector sequences and glyph
+	  substitution. Emoji shaping is handled by the default
+	  shaping model.
+	</p></li>
+</ul></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/plans-and-caching.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/plans-and-caching.html
new file mode 100644
index 0000000..5d81872
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/plans-and-caching.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Plans and caching: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="shaping-and-shape-plans.html" title="Shaping and shape plans">
+<link rel="prev" href="shaping-and-shape-plans.html" title="Shaping and shape plans">
+<link rel="next" href="pt02.html" title="Part II. Reference manual">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="shaping-and-shape-plans.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="shaping-and-shape-plans.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="pt02.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="plans-and-caching"></a>Plans and caching</h2></div></div></div>
+<p>
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/pt01.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/pt01.html
new file mode 100644
index 0000000..2aee80e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/pt01.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Part I. User's manual: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="index.html" title="HarfBuzz Manual">
+<link rel="prev" href="index.html" title="HarfBuzz Manual">
+<link rel="next" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="index.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="what-is-harfbuzz.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="part">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="id-1.2"></a>Part I. User's manual</h1></div></div></div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl class="toc">
+<dt><span class="chapter"><a href="what-is-harfbuzz.html">What is HarfBuzz?</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="what-is-harfbuzz.html#what-is-text-shaping">What is text shaping?</a></span></dt>
+<dt><span class="section"><a href="why-do-i-need-a-shaping-engine.html">Why do I need a shaping engine?</a></span></dt>
+<dt><span class="section"><a href="ch01s03.html">What does HarfBuzz do?</a></span></dt>
+<dt><span class="section"><a href="what-harfbuzz-doesnt-do.html">What HarfBuzz doesn't do</a></span></dt>
+<dt><span class="section"><a href="why-is-it-called-harfbuzz.html">Why is it called HarfBuzz?</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="install-harfbuzz.html">Installing HarfBuzz</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="install-harfbuzz.html#download">Downloading HarfBuzz</a></span></dt>
+<dt><span class="section"><a href="building.html">Building HarfBuzz</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="building.html#building.linux">Building on Linux</a></span></dt>
+<dt><span class="section"><a href="building.html#building.windows">Building on Windows</a></span></dt>
+<dt><span class="section"><a href="building.html#building.macos">Building on macOS</a></span></dt>
+<dt><span class="section"><a href="building.html#configuration">Configuration options</a></span></dt>
+</dl></dd>
+</dl></dd>
+<dt><span class="chapter"><a href="getting-started.html">Getting started with HarfBuzz</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="getting-started.html#id-1.2.4.2">An overview of the HarfBuzz shaping API</a></span></dt>
+<dt><span class="section"><a href="ch03s02.html">Terminology</a></span></dt>
+<dt><span class="section"><a href="ch03s03.html">A simple shaping example</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="shaping-concepts.html">Shaping concepts</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="shaping-concepts.html#text-shaping-concepts">Text shaping</a></span></dt>
+<dt><span class="section"><a href="complex-scripts.html">Complex scripts</a></span></dt>
+<dt><span class="section"><a href="shaping-operations.html">Shaping operations</a></span></dt>
+<dt><span class="section"><a href="unicode-character-categories.html">Unicode character categories</a></span></dt>
+<dt><span class="section"><a href="text-runs.html">Text runs</a></span></dt>
+<dt><span class="section"><a href="opentype-shaping-models.html">OpenType shaping models</a></span></dt>
+<dt><span class="section"><a href="graphite-shaping.html">Graphite shaping</a></span></dt>
+<dt><span class="section"><a href="aat-shaping.html">AAT shaping</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="buffers-language-script-and-direction.html">Buffers, language, script and direction</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="buffers-language-script-and-direction.html#creating-and-destroying-buffers">Creating and destroying buffers</a></span></dt>
+<dt><span class="section"><a href="adding-text-to-the-buffer.html">Adding text to the buffer</a></span></dt>
+<dt><span class="section"><a href="setting-buffer-properties.html">Setting buffer properties</a></span></dt>
+<dt><span class="section"><a href="what-about-the-other-scripts.html">What about the other scripts?</a></span></dt>
+<dt><span class="section"><a href="customizing-unicode-functions.html">Customizing Unicode functions</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="fonts-and-faces.html">Fonts and faces</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="fonts-and-faces.html#using-freetype">Using FreeType</a></span></dt>
+<dt><span class="section"><a href="using-harfbuzzs-native-opentype-implementation.html">Using HarfBuzz's native OpenType implementation</a></span></dt>
+<dt><span class="section"><a href="using-your-own-font-functions.html">Using your own font functions</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="clusters.html">Clusters</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="clusters.html#clusters-and-shaping">Clusters and shaping</a></span></dt>
+<dt><span class="section"><a href="working-with-harfbuzz-clusters.html">Working with HarfBuzz clusters</a></span></dt>
+<dt><span class="section"><a href="a-clustering-example-for-levels-0-and-1.html">A clustering example for levels 0 and 1</a></span></dt>
+<dt><span class="section"><a href="reordering-in-levels-0-and-1.html">Reordering in levels 0 and 1</a></span></dt>
+<dt><span class="section"><a href="the-distinction-between-levels-0-and-1.html">The distinction between levels 0 and 1</a></span></dt>
+<dt><span class="section"><a href="level-2.html">Level 2</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="level-2.html#ligatures-with-combining-marks-in-level-2">Ligatures with combining marks in level 2</a></span></dt>
+<dt><span class="section"><a href="level-2.html#reordering-in-level-2">Reordering in level 2</a></span></dt>
+<dt><span class="section"><a href="level-2.html#other-considerations-in-level-2">Other considerations in level 2</a></span></dt>
+</dl></dd>
+</dl></dd>
+<dt><span class="chapter"><a href="shaping-and-shape-plans.html">Shaping and shape plans</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="shaping-and-shape-plans.html#opentype-features">OpenType features</a></span></dt>
+<dt><span class="section"><a href="plans-and-caching.html">Plans and caching</a></span></dt>
+</dl></dd>
+</dl>
+</div>
+<div class="sect1">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="glyph-information"></a>Glyph information</h2></div></div></div>
+<div class="sect2">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="names-and-numbers"></a>Names and numbers</h3></div></div></div>
+<p>
+    </p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/pt02.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/pt02.html
new file mode 100644
index 0000000..2dd2ac9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/pt02.html
@@ -0,0 +1,196 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Part II. Reference manual: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="index.html" title="HarfBuzz Manual">
+<link rel="prev" href="plans-and-caching.html" title="Plans and caching">
+<link rel="next" href="ch09.html" title="Core API">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="plans-and-caching.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="ch09.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="part">
+<div class="titlepage"><div>
+<div><h1 class="title">
+<a name="id-1.3"></a>Part II. Reference manual</h1></div>
+<div><p class="releaseinfo">
+        This document is for HarfBuzz 2.3.1
+.
+        
+      </p></div>
+</div></div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl class="toc">
+<dt><span class="chapter"><a href="ch09.html">Core API</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-blob.html">hb-blob</a></span><span class="refpurpose"> — Binary data containers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-buffer.html">hb-buffer</a></span><span class="refpurpose"> — Input and output buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-common.html">hb-common</a></span><span class="refpurpose"> — Common data types</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-deprecated.html">hb-deprecated</a></span><span class="refpurpose"> — Deprecated API</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-face.html">hb-face</a></span><span class="refpurpose"> — Font face objects</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-font.html">hb-font</a></span><span class="refpurpose"> — Font objects</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-map.html">hb-map</a></span><span class="refpurpose"> — Object representing integer to integer mapping</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-set.html">hb-set</a></span><span class="refpurpose"> — Object representing a set of integers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-shape-plan.html">hb-shape-plan</a></span><span class="refpurpose"> — Object representing a shaping plan</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-shape.html">hb-shape</a></span><span class="refpurpose"> — Conversion of text strings into positioned glyphs</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-unicode.html">hb-unicode</a></span><span class="refpurpose"> — Unicode character property access</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-version.html">hb-version</a></span><span class="refpurpose"> — Information about the version of HarfBuzz in use</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="ch10.html">OpenType API</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-color.html">hb-ot-color</a></span><span class="refpurpose"> — OpenType Color Fonts</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-font.html">hb-ot-font</a></span><span class="refpurpose"> — OpenType font implementation</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-layout.html">hb-ot-layout</a></span><span class="refpurpose"> — OpenType Layout</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-math.html">hb-ot-math</a></span><span class="refpurpose"> — OpenType Math information</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-name.html">hb-ot-name</a></span><span class="refpurpose"> — OpenType font name information</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-shape.html">hb-ot-shape</a></span><span class="refpurpose"> — OpenType shaping support</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-var.html">hb-ot-var</a></span><span class="refpurpose"> — OpenType Font Variations</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="ch11.html">Apple Advanced Typography API</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-aat-layout.html">hb-aat-layout</a></span><span class="refpurpose"> — Apple Advanced Typography Layout</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="ch12.html">Integration API</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-coretext.html">hb-coretext</a></span><span class="refpurpose"> — CoreText integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ft.html">hb-ft</a></span><span class="refpurpose"> — FreeType integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-glib.html">hb-glib</a></span><span class="refpurpose"> — GLib integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-gobject.html">hb-gobject</a></span><span class="refpurpose"> — GObject integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-graphite2.html">hb-graphite2</a></span><span class="refpurpose"> — Graphite2 integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-icu.html">hb-icu</a></span><span class="refpurpose"> — ICU integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-uniscribe.html">hb-uniscribe</a></span><span class="refpurpose"> — Windows integration</span>
+</dt>
+</dl></dd>
+<dt><span class="index"><a href="api-index-full.html">API Index</a></span></dt>
+<dt><span class="index"><a href="deprecated-api-index.html">Index of deprecated API</a></span></dt>
+<dt><span class="index"><a href="api-index-2-1-0.html">Index of new symbols in 2.1.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-0-0.html">Index of new symbols in 2.0.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-9-0.html">Index of new symbols in 1.9.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-6.html">Index of new symbols in 1.8.6</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-5.html">Index of new symbols in 1.8.5</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-1.html">Index of new symbols in 1.8.1</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-0.html">Index of new symbols in 1.8.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-7-7.html">Index of new symbols in 1.7.7</a></span></dt>
+<dt><span class="index"><a href="api-index-1-7-5.html">Index of new symbols in 1.7.5</a></span></dt>
+<dt><span class="index"><a href="api-index-1-6-0.html">Index of new symbols in 1.6.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-5-0.html">Index of new symbols in 1.5.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-3.html">Index of new symbols in 1.4.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-2.html">Index of new symbols in 1.4.2</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-0.html">Index of new symbols in 1.4.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-3-3.html">Index of new symbols in 1.3.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-2-3.html">Index of new symbols in 1.2.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-1-3.html">Index of new symbols in 1.1.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-1-2.html">Index of new symbols in 1.1.2</a></span></dt>
+<dt><span class="index"><a href="api-index-1-0-5.html">Index of new symbols in 1.0.5</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-42.html">Index of new symbols in 0.9.42</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-41.html">Index of new symbols in 0.9.41</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-39.html">Index of new symbols in 0.9.39</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-38.html">Index of new symbols in 0.9.38</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-31.html">Index of new symbols in 0.9.31</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-30.html">Index of new symbols in 0.9.30</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-28.html">Index of new symbols in 0.9.28</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-22.html">Index of new symbols in 0.9.22</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-20.html">Index of new symbols in 0.9.20</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-11.html">Index of new symbols in 0.9.11</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-10.html">Index of new symbols in 0.9.10</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-8.html">Index of new symbols in 0.9.8</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-7.html">Index of new symbols in 0.9.7</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-5.html">Index of new symbols in 0.9.5</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-2.html">Index of new symbols in 0.9.2</a></span></dt>
+<dt><span class="glossary"><a href="annotation-glossary.html">Annotation Glossary</a></span></dt>
+</dl>
+</div>
+<div class="note">
+<p>
+        The current HarfBuzz codebase is versioned 2.x.x and is stable
+	and under active maintenance. This is what is used in latest
+	versions of Firefox, GNOME, ChromeOS, Chrome, LibreOffice,
+	XeTeX, Android, and KDE, among other places. 
+      </p>
+<p>
+        Prior to 2012, the original HarfBuzz codebase (which, these
+	days, is referred to as <span class="emphasis"><em>harfbuzz-old</em></span>) was 
+        derived from code in <a class="ulink" href="http://freetype.org/" target="_top">FreeType</a>, <a class="ulink" href="http://pango.org/" target="_top">Pango</a>, and 
+        <a class="ulink" href="http://qt-project.org/" target="_top">Qt</a>.
+        It is <span class="emphasis"><em>not</em></span> actively developed or
+	maintained, and is extremely buggy. All users of harfbuzz-old
+	are encouraged to switch over to the new HarfBuzz as soon as possible.
+      </p>
+<p>
+	To make this distinction clearer in discussions, the current
+	HarfBuzz codebase is sometimes referred to as
+	<span class="emphasis"><em>harfbuzz-ng</em></span>.
+      </p>
+<p>
+	For reference purposes, the harfbuzz-old source tree is archived 
+        <a class="ulink" href="http://cgit.freedesktop.org/harfbuzz.old/" target="_top">here</a>. There
+	are no release tarballs of harfbuzz-old whatsoever.
+      </p>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/reordering-in-levels-0-and-1.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/reordering-in-levels-0-and-1.html
new file mode 100644
index 0000000..2a390b7
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/reordering-in-levels-0-and-1.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Reordering in levels 0 and 1: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="clusters.html" title="Clusters">
+<link rel="prev" href="a-clustering-example-for-levels-0-and-1.html" title="A clustering example for levels 0 and 1">
+<link rel="next" href="the-distinction-between-levels-0-and-1.html" title="The distinction between levels 0 and 1">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="clusters.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="a-clustering-example-for-levels-0-and-1.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="the-distinction-between-levels-0-and-1.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="reordering-in-levels-0-and-1"></a>Reordering in levels 0 and 1</h2></div></div></div>
+<p>
+      Another common operation in the more complex shapers is glyph
+      reordering. In order to maintain a monotonic cluster sequence
+      when glyph reordering takes place, HarfBuzz merges the clusters
+      of everything in the reordering sequence.
+    </p>
+<p>
+      For example, let us again start with the character sequence (top
+      row) and initial cluster values (bottom row):
+    </p>
+<pre class="programlisting">
+      A,B,C,D,E
+      0,1,2,3,4
+    </pre>
+<p>
+      If <code class="literal">D</code> is reordered to the position immediately
+      before <code class="literal">B</code>, then HarfBuzz merges the
+      <code class="literal">B</code>, <code class="literal">C</code>, and
+      <code class="literal">D</code> clusters — all the clusters between
+      the final position of the reordered glyph and its original
+      position. This means that we get:
+    </p>
+<pre class="programlisting">
+      A,D,B,C,E
+      0,1,1,1,4
+    </pre>
+<p>
+      as the final cluster sequence.
+    </p>
+<p>
+      Merging this many clusters is not ideal, but it is the only
+      sensible way for HarfBuzz to maintain the guarantee that the
+      sequence of cluster values remains monotonic and to retain the
+      true relationship between glyphs and characters.
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/right-insensitive.png b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/right-insensitive.png
new file mode 100644
index 0000000..c1efa27
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/right-insensitive.png
Binary files differ
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/right.png b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/right.png
new file mode 100644
index 0000000..83361a6
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/right.png
Binary files differ
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/setting-buffer-properties.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/setting-buffer-properties.html
new file mode 100644
index 0000000..266dfd7
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/setting-buffer-properties.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Setting buffer properties: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
+<link rel="prev" href="adding-text-to-the-buffer.html" title="Adding text to the buffer">
+<link rel="next" href="what-about-the-other-scripts.html" title="What about the other scripts?">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="buffers-language-script-and-direction.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="adding-text-to-the-buffer.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="what-about-the-other-scripts.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="setting-buffer-properties"></a>Setting buffer properties</h2></div></div></div>
+<p>
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/shaping-and-shape-plans.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/shaping-and-shape-plans.html
new file mode 100644
index 0000000..4aacb0f7
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/shaping-and-shape-plans.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Shaping and shape plans: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="prev" href="level-2.html" title="Level 2">
+<link rel="next" href="plans-and-caching.html" title="Plans and caching">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="level-2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="plans-and-caching.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="shaping-and-shape-plans"></a>Shaping and shape plans</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt><span class="section"><a href="shaping-and-shape-plans.html#opentype-features">OpenType features</a></span></dt>
+<dt><span class="section"><a href="plans-and-caching.html">Plans and caching</a></span></dt>
+</dl></div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="opentype-features"></a>OpenType features</h2></div></div></div>
+<p>
+    </p>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/shaping-concepts.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/shaping-concepts.html
new file mode 100644
index 0000000..bfa6a41
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/shaping-concepts.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Shaping concepts: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="prev" href="ch03s03.html" title="A simple shaping example">
+<link rel="next" href="complex-scripts.html" title="Complex scripts">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="ch03s03.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="complex-scripts.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="shaping-concepts"></a>Shaping concepts</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt><span class="section"><a href="shaping-concepts.html#text-shaping-concepts">Text shaping</a></span></dt>
+<dt><span class="section"><a href="complex-scripts.html">Complex scripts</a></span></dt>
+<dt><span class="section"><a href="shaping-operations.html">Shaping operations</a></span></dt>
+<dt><span class="section"><a href="unicode-character-categories.html">Unicode character categories</a></span></dt>
+<dt><span class="section"><a href="text-runs.html">Text runs</a></span></dt>
+<dt><span class="section"><a href="opentype-shaping-models.html">OpenType shaping models</a></span></dt>
+<dt><span class="section"><a href="graphite-shaping.html">Graphite shaping</a></span></dt>
+<dt><span class="section"><a href="aat-shaping.html">AAT shaping</a></span></dt>
+</dl></div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="text-shaping-concepts"></a>Text shaping</h2></div></div></div>
+<p>
+      Text shaping is the process of transforming a sequence of Unicode
+      codepoints that represent individual characters (letters,
+      diacritics, tone marks, numbers, symbols, etc.) into the
+      orthographically and linguistically correct two-dimensional layout
+      of glyph shapes taken from a specified font.
+    </p>
+<p>
+      For some writing systems (or <span class="emphasis"><em>scripts</em></span>) and
+      languages, the process is simple, requiring the shaper to do
+      little more than advance the horizontal position forward by the
+      correct amount for each successive glyph.
+    </p>
+<p>
+      But, for <span class="emphasis"><em>complex scripts</em></span>, any combination of
+      several shaping operations may be required, and the rules for how
+      and when they are applied vary from script to script. HarfBuzz and
+      other shaping engines implement these rules.
+    </p>
+<p>
+      The exact rules and necessary operations for a particular script
+      constitute a shaping <span class="emphasis"><em>model</em></span>. OpenType
+      specifies a set of shaping models that covers all of
+      Unicode. Other shaping models are available, however, including
+      Graphite and Apple Advanced Typography (AAT). 
+    </p>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/shaping-operations.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/shaping-operations.html
new file mode 100644
index 0000000..9e6ff5e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/shaping-operations.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Shaping operations: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="shaping-concepts.html" title="Shaping concepts">
+<link rel="prev" href="complex-scripts.html" title="Complex scripts">
+<link rel="next" href="unicode-character-categories.html" title="Unicode character categories">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="shaping-concepts.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="complex-scripts.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="unicode-character-categories.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="shaping-operations"></a>Shaping operations</h2></div></div></div>
+<p>
+      Shaping a complex-script text run involves transforming the
+      input sequence of Unicode codepoints with some combination of
+      operations that is specified in the shaping model for the
+      script.
+    </p>
+<p>
+      The specific conditions that trigger a given operation for a
+      text run varies from script to script, as do the order that the
+      operations are performed in and which codepoints are
+      affected. However, the same general set of shaping operations is
+      common to all of the complex-script shaping models. 
+    </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+<p>
+	  A <span class="emphasis"><em>reordering</em></span> operation moves a glyph
+	  from its original ("logical") position in the sequence to
+	  some other ("visual") position.
+	</p>
+<p>
+	  The shaping model for a given complex script might involve
+	  more than one reordering step.
+	</p>
+</li>
+<li class="listitem"><p>
+	  A <span class="emphasis"><em>joining</em></span> operation replaces a glyph
+	  with an alternate form that is designed to connect with one
+	  or more of the adjacent glyphs in the sequence.
+	</p></li>
+<li class="listitem">
+<p>
+	  A contextual <span class="emphasis"><em>substitution</em></span> operation
+	  replaces either a single glyph or a subsequence of several
+	  glyphs with an alternate glyph. This substitution is
+	  performed when the original glyph or subsequence of glyphs
+	  occurs in a specified position with respect to the
+	  surrounding sequence. For example, one substitution might be
+	  performed only when the target glyph is the first glyph in
+	  the sequence, while another substitution is performed only
+	  when a different target glyph occurs immediately after a
+	  particular string pattern.
+	</p>
+<p>
+	  The shaping model for a given complex script might involve
+	  multiple contextual-substitution operations, each applying
+	  to different target glyphs and patterns, and which are
+	  performed in separate steps.
+	</p>
+</li>
+<li class="listitem">
+<p>
+	  A contextual <span class="emphasis"><em>positioning</em></span> operation
+	  moves the horizontal and/or vertical position of a
+	  glyph. This positioning move is performed when the glyph
+	  occurs in a specified position with respect to the
+	  surrounding sequence.
+	</p>
+<p>
+	  Many contextual positioning operations are used to place
+	  <span class="emphasis"><em>mark</em></span> glyphs (such as diacritics, vowel
+	  signs, and tone markers) with respect to
+	  <span class="emphasis"><em>base</em></span> glyphs. However, some complex
+	  scripts may use contextual positioning operations to
+	  correctly place base glyphs as well, such as
+	  when the script uses <span class="emphasis"><em>stacking</em></span> characters.
+	</p>
+</li>
+</ul></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/style.css b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/style.css
new file mode 100644
index 0000000..3675420
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/style.css
@@ -0,0 +1,479 @@
+body
+{
+  font-family: cantarell, sans-serif;
+}
+.synopsis, .classsynopsis
+{
+  /* tango:aluminium 1/2 */
+  background: #eeeeec;
+  background: rgba(238, 238, 236, 0.5);
+  border: solid 1px rgb(238, 238, 236);
+  padding: 0.5em;
+}
+.programlisting
+{
+  /* tango:sky blue 0/1 */
+  /* fallback for no rgba support */
+  background: #e6f3ff;
+  border: solid 1px #729fcf;
+  background: rgba(114, 159, 207, 0.1);
+  border: solid 1px rgba(114, 159, 207, 0.2);
+  padding: 0.5em;
+}
+.variablelist
+{
+  padding: 4px;
+  margin-left: 3em;
+}
+.variablelist td:first-child
+{
+  vertical-align: top;
+}
+
+div.gallery-float
+{
+  float: left;
+  padding: 10px;
+}
+div.gallery-float img
+{
+  border-style: none;
+}
+div.gallery-spacer
+{
+  clear: both;
+}
+
+a, a:visited
+{
+  text-decoration: none;
+  /* tango:sky blue 2 */
+  color: #3465a4;
+}
+a:hover
+{
+  text-decoration: underline;
+  /* tango:sky blue 1 */
+  color: #729fcf;
+}
+
+div.informaltable table
+{
+  border-collapse: separate;
+  border-spacing: 1em 0.3em;
+  border: none;
+}
+
+div.informaltable table td, div.informaltable table th
+{
+  vertical-align: top;
+}
+
+.function_type,
+.variable_type,
+.property_type,
+.signal_type,
+.parameter_name,
+.struct_member_name,
+.union_member_name,
+.define_keyword,
+.datatype_keyword,
+.typedef_keyword
+{
+  text-align: right;
+}
+
+/* dim non-primary columns */
+.c_punctuation,
+.function_type,
+.variable_type,
+.property_type,
+.signal_type,
+.define_keyword,
+.datatype_keyword,
+.typedef_keyword,
+.property_flags,
+.signal_flags,
+.parameter_annotations,
+.enum_member_annotations,
+.struct_member_annotations,
+.union_member_annotations
+{
+  color: #888a85;
+}
+
+.function_type a,
+.function_type a:visited,
+.function_type a:hover,
+.property_type a,
+.property_type a:visited,
+.property_type a:hover,
+.signal_type a,
+.signal_type a:visited,
+.signal_type a:hover,
+.signal_flags a,
+.signal_flags a:visited,
+.signal_flags a:hover
+{
+ color: #729fcf;
+}
+
+td p
+{
+  margin: 0.25em;
+}
+
+div.table table
+{
+  border-collapse: collapse;
+  border-spacing: 0px;
+  /* tango:aluminium 3 */
+  border: solid 1px #babdb6;
+}
+
+div.table table td, div.table table th
+{
+  /* tango:aluminium 3 */
+  border: solid 1px #babdb6;
+  padding: 3px;
+  vertical-align: top;
+}
+
+div.table table th
+{
+  /* tango:aluminium 2 */
+  background-color: #d3d7cf;
+}
+
+h4
+{
+  color: #555753;
+  margin-top: 1em;
+  margin-bottom: 1em;
+}
+
+hr
+{
+  /* tango:aluminium 1 */
+  color: #d3d7cf;
+  background: #d3d7cf;
+  border: none 0px;
+  height: 1px;
+  clear: both;
+  margin: 2.0em 0em 2.0em 0em;
+}
+
+dl.toc dt
+{
+  padding-bottom: 0.25em;
+}
+
+dl.toc > dt
+{
+  padding-top: 0.25em;
+  padding-bottom: 0.25em;
+  font-weight: bold;
+}
+
+dl.toc > dl
+{
+  padding-bottom: 0.5em;
+}
+
+.parameter
+{
+  font-style: normal;
+}
+
+.footer
+{
+  padding-top: 3.5em;
+  /* tango:aluminium 3 */
+  color: #babdb6;
+  text-align: center;
+  font-size: 80%;
+}
+
+.informalfigure,
+.figure
+{
+  margin: 1em;
+}
+
+.informalexample,
+.example
+{
+  margin-top: 1em;
+  margin-bottom: 1em;
+}
+
+.warning
+{
+  /* tango:orange 0/1 */
+  background: #ffeed9;
+  background: rgba(252, 175, 62, 0.1);
+  border-color: #ffb04f;
+  border-color: rgba(252, 175, 62, 0.2);
+}
+.note
+{
+  /* tango:chameleon 0/0.5 */
+  background: #d8ffb2;
+  background: rgba(138, 226, 52, 0.1);
+  border-color: #abf562;
+  border-color: rgba(138, 226, 52, 0.2);
+}
+div.blockquote
+{
+  border-color: #eeeeec;
+}
+.note, .warning, div.blockquote
+{
+  padding: 0.5em;
+  border-width: 1px;
+  border-style: solid;
+  margin: 2em;
+}
+.note p, .warning p
+{
+  margin: 0;
+}
+
+div.warning h3.title,
+div.note h3.title
+{
+  display: none;
+}
+
+p + div.section
+{
+  margin-top: 1em;
+}
+
+div.refnamediv,
+div.refsynopsisdiv,
+div.refsect1,
+div.refsect2,
+div.toc,
+div.section
+{
+  margin-bottom: 1em;
+}
+
+/* blob links */
+h2 .extralinks, h3 .extralinks
+{
+  float: right;
+  /* tango:aluminium 3 */
+  color: #babdb6;
+  font-size: 80%;
+  font-weight: normal;
+}
+
+.lineart
+{
+  color: #d3d7cf;
+  font-weight: normal;
+}
+
+.annotation
+{
+  /* tango:aluminium 5 */
+  color: #555753;
+  font-weight: normal;
+}
+
+.structfield
+{
+  font-style: normal;
+  font-weight: normal;
+}
+
+acronym,abbr 
+{
+  border-bottom: 1px dotted gray;
+}
+
+/* code listings */
+
+.listing_code .programlisting .normal,
+.listing_code .programlisting .normal a,
+.listing_code .programlisting .number,
+.listing_code .programlisting .cbracket,
+.listing_code .programlisting .symbol     { color: #555753; }
+.listing_code .programlisting .comment,
+.listing_code .programlisting .linenum    { color: #babdb6; } /* tango: aluminium 3 */
+.listing_code .programlisting .function,
+.listing_code .programlisting .function a,
+.listing_code .programlisting .preproc    { color: #204a87; } /* tango: sky blue 3  */
+.listing_code .programlisting .string     { color: #ad7fa8; } /* tango: plum */
+.listing_code .programlisting .keyword,
+.listing_code .programlisting .usertype,
+.listing_code .programlisting .type,
+.listing_code .programlisting .type a     { color: #4e9a06; } /* tango: chameleon 3  */
+
+.listing_frame {
+  /* tango:sky blue 1 */
+  border: solid 1px #729fcf;
+  border: solid 1px rgba(114, 159, 207, 0.2);
+  padding: 0px;
+}
+
+.listing_lines, .listing_code {
+  margin-top: 0px;
+  margin-bottom: 0px;
+  padding: 0.5em;
+}
+.listing_lines {
+  /* tango:sky blue 0.5 */
+  background: #a6c5e3;
+  background: rgba(114, 159, 207, 0.2);
+  /* tango:aluminium 6 */
+  color: #2e3436;
+}
+.listing_code {
+  /* tango:sky blue 0 */
+  background: #e6f3ff;
+  background: rgba(114, 159, 207, 0.1);
+}
+.listing_code .programlisting {
+  /* override from previous */
+  border: none 0px;
+  padding: 0px;
+  background: none;
+}
+.listing_lines pre, .listing_code pre {
+  margin: 0px;
+}
+
+@media screen {
+  /* these have a <sup> as a first child, but since there are no parent selectors
+   * we can't use that. */
+  a.footnote
+  {
+    position: relative;
+    top: 0em ! important;
+  }
+  /* this is needed so that the local anchors are displayed below the naviagtion */
+  div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name]
+  {
+    display: inline-block;
+    position: relative;
+    top:-5em;
+  }
+  /* this seems to be a bug in the xsl style sheets when generating indexes */
+  div.index div.index
+  {
+    top: 0em;
+  }
+  /* make space for the fixed navigation bar and add space at the bottom so that
+   * link targets appear somewhat close to top
+   */
+  body
+  {
+    padding-top: 2.5em;
+    padding-bottom: 500px;
+    max-width: 60em;
+  }
+  p
+  {
+    max-width: 60em;
+  }
+  /* style and size the navigation bar */
+  table.navigation#top
+  {
+    position: fixed;
+    background: #e2e2e2;
+    border-bottom: solid 1px #babdb6;
+    border-spacing: 5px;
+    margin-top: 0;
+    margin-bottom: 0;
+    top: 0;
+    left: 0;
+    z-index: 10;
+  }
+  table.navigation#top td
+  {
+    padding-left: 6px;
+    padding-right: 6px;
+  }
+  .navigation a, .navigation a:visited
+  {
+    /* tango:sky blue 3 */
+    color: #204a87;
+  }
+  .navigation a:hover
+  {
+    /* tango:sky blue 2 */
+    color: #3465a4;
+  }
+  td.shortcuts
+  {
+    /* tango:sky blue 2 */
+    color: #3465a4;
+    font-size: 80%;
+    white-space: nowrap;
+  }
+  td.shortcuts .dim
+  {
+    color: #babdb6;
+  }
+  .navigation .title
+  {
+    font-size: 80%;
+    max-width: none;
+    margin: 0px;
+    font-weight: normal;
+  }
+}
+@media screen and (min-width: 60em) {
+  /* screen larger than 60em */
+  body { margin: auto; }
+}
+@media screen and (max-width: 60em) {
+  /* screen less than 60em */
+  #nav_hierarchy { display: none; }
+  #nav_interfaces { display: none; }
+  #nav_prerequisites { display: none; }
+  #nav_derived_interfaces { display: none; }
+  #nav_implementations { display: none; }
+  #nav_child_properties { display: none; }
+  #nav_style_properties { display: none; }
+  #nav_index { display: none; }
+  #nav_glossary { display: none; }
+  .gallery_image { display: none; }
+  .property_flags { display: none; }
+  .signal_flags { display: none; }
+  .parameter_annotations { display: none; }
+  .enum_member_annotations { display: none; }
+  .struct_member_annotations { display: none; }
+  .union_member_annotations { display: none; }
+  /* now that a column is hidden, optimize space */
+  col.parameters_name { width: auto; }
+  col.parameters_description { width: auto; }
+  col.struct_members_name { width: auto; }
+  col.struct_members_description { width: auto; }
+  col.enum_members_name { width: auto; }
+  col.enum_members_description { width: auto; }
+  col.union_members_name { width: auto; }
+  col.union_members_description { width: auto; }
+  .listing_lines { display: none; }
+}
+@media print {
+  table.navigation {
+    visibility: collapse;
+    display: none;
+  }
+  div.titlepage table.navigation {
+    visibility: visible;
+    display: table;
+    background: #e2e2e2;
+    border: solid 1px #babdb6;
+    margin-top: 0;
+    margin-bottom: 0;
+    top: 0;
+    left: 0;
+    height: 3em;
+  }
+}
+
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/text-runs.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/text-runs.html
new file mode 100644
index 0000000..26804d3
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/text-runs.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Text runs: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="shaping-concepts.html" title="Shaping concepts">
+<link rel="prev" href="unicode-character-categories.html" title="Unicode character categories">
+<link rel="next" href="opentype-shaping-models.html" title="OpenType shaping models">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="shaping-concepts.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="unicode-character-categories.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="opentype-shaping-models.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="text-runs"></a>Text runs</h2></div></div></div>
+<p>
+      Real-world text usually contains codepoints from a mixture of
+      different Unicode scripts (including punctuation, numbers, symbols,
+      white-space characters, and other codepoints that do not belong
+      to any script). Real-world text may also be marked up with
+      formatting that changes font properties (including the font,
+      font style, and font size).
+    </p>
+<p>
+      For shaping purposes, all real-world text streams must be first
+      segmented into runs that have a uniform set of properties. 
+    </p>
+<p>
+      In particular, shaping models always assume that every codepoint
+      in a text run has the same <span class="emphasis"><em>direction</em></span>,
+      <span class="emphasis"><em>script</em></span> tag, and
+      <span class="emphasis"><em>language</em></span> tag.
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/the-distinction-between-levels-0-and-1.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/the-distinction-between-levels-0-and-1.html
new file mode 100644
index 0000000..cbb7afe
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/the-distinction-between-levels-0-and-1.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>The distinction between levels 0 and 1: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="clusters.html" title="Clusters">
+<link rel="prev" href="reordering-in-levels-0-and-1.html" title="Reordering in levels 0 and 1">
+<link rel="next" href="level-2.html" title="Level 2">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="clusters.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="reordering-in-levels-0-and-1.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="level-2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="the-distinction-between-levels-0-and-1"></a>The distinction between levels 0 and 1</h2></div></div></div>
+<p>
+      The preceding examples demonstrate the main effects of using
+      cluster levels 0 and 1. The only difference between the two
+      levels is this: in level 0, at the very beginning of the shaping
+      process, HarfBuzz merges the cluster of each base character
+      with the clusters of all Unicode marks (combining or not) and
+      modifiers that follow it.
+    </p>
+<p>
+      For example, let us start with the following character sequence
+      (top row) and accompanying initial cluster values (bottom row):
+    </p>
+<pre class="programlisting">
+      A,acute,B
+      0,1    ,2
+    </pre>
+<p>
+      The <code class="literal">acute</code> is a Unicode mark. If HarfBuzz is
+      using cluster level 0 on this sequence, then the
+      <code class="literal">A</code> and <code class="literal">acute</code> clusters will
+      merge, and the result will become:
+    </p>
+<pre class="programlisting">
+      A,acute,B
+      0,0    ,2
+    </pre>
+<p>
+      This merger is performed before any other script-shaping
+      steps.
+    </p>
+<p>
+      This initial cluster merging is the default behavior of the
+      Windows shaping engine, and the old HarfBuzz codebase copied
+      that behavior to maintain compatibility. Consequently, it has
+      remained the default behavior in the new HarfBuzz codebase.
+    </p>
+<p>
+      But this initial cluster-merging behavior makes it impossible
+      client programs to implement some features (such as to
+      color diacritic marks differently from their base
+      characters). That is why, in level 1, HarfBuzz does not perform
+      the initial merging step.
+    </p>
+<p>
+      For client programs that rely on HarfBuzz cluster values to
+      perform cursor positioning, level 0 is more convenient. But
+      relying on cluster boundaries for cursor positioning is wrong: cursor
+      positions should be determined based on Unicode grapheme
+      boundaries, not on shaping-cluster boundaries. As such, using
+      level 1 clustering behavior is recommended. 
+    </p>
+<p>
+      One final facet of levels 0 and 1 is worth noting. HarfBuzz
+      currently does not allow any
+      <span class="emphasis"><em>multiple-substitution</em></span> GSUB lookups to 
+      replace a glyph with zero glyphs (in other words, to delete a
+      glyph).
+    </p>
+<p>
+      But, in some other situations, glyphs can be deleted. In
+      those cases, if the glyph being deleted is the last glyph of its
+      cluster, HarfBuzz makes sure to merge the deleted glyph's
+      cluster with a neighboring cluster.
+    </p>
+<p>
+      This is done primarily to make sure that the starting cluster of the
+      text always has the cluster index pointing to the start of the text
+      for the run; more than one client program currently relies on this
+      guarantee.
+    </p>
+<p>
+      Incidentally, Apple's CoreText does something different to
+      maintain the same promise: it inserts a glyph with id 65535 at
+      the beginning of the glyph string if the glyph corresponding to
+      the first character in the run was deleted. HarfBuzz might do
+      something similar in the future.
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/unicode-character-categories.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/unicode-character-categories.html
new file mode 100644
index 0000000..2b97961
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/unicode-character-categories.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Unicode character categories: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="shaping-concepts.html" title="Shaping concepts">
+<link rel="prev" href="shaping-operations.html" title="Shaping operations">
+<link rel="next" href="text-runs.html" title="Text runs">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="shaping-concepts.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="shaping-operations.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="text-runs.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="unicode-character-categories"></a>Unicode character categories</h2></div></div></div>
+<p>
+      Shaping models are typically specified with respect to how
+      scripts are defined in the Unicode standard.
+    </p>
+<p>
+      Every codepoint in the Unicode Character Database (UCD) is
+      assigned a <span class="emphasis"><em>Unicode General Category</em></span> (UGC),
+      which provides the most fundamental information about the
+      codepoint: whether the codepoint represents a
+      <span class="emphasis"><em>Letter</em></span>, a <span class="emphasis"><em>Mark</em></span>, a
+      <span class="emphasis"><em>Number</em></span>, <span class="emphasis"><em>Punctuation</em></span>, a
+      <span class="emphasis"><em>Symbol</em></span>, a <span class="emphasis"><em>Separator</em></span>,
+      or something else (<span class="emphasis"><em>Other</em></span>).
+    </p>
+<p>
+      These UGC properties are "Major" categories. Each codepoint is
+      further assigned to a "minor" category within its Major
+      category, such as "Letter, uppercase" (<code class="literal">Lu</code>) or
+      "Letter, modifier" (<code class="literal">Lm</code>).
+    </p>
+<p>
+      Shaping models are concerned primarily with Letter and Mark
+      codepoints. The minor categories of Mark codepoints are
+      particularly important for shaping. Marks can be nonspacing
+      (<code class="literal">Mn</code>), spacing combining
+      (<code class="literal">Mc</code>), or enclosing (<code class="literal">Me</code>).
+    </p>
+<p>
+      In addition to the UGC property, codepoints in the Indic and
+      Southeast Asian scripts are also assigned
+      <span class="emphasis"><em>Unicode Indic Syllabic Category</em></span> (UISC) and
+      <span class="emphasis"><em>Unicode Indic Positional Category</em></span> (UIPC)
+      properties that provide more detailed information needed for
+      shaping.
+    </p>
+<p>
+      The UISC property sub-categorizes Letters and Marks according to
+      common script-shaping behaviors. For example, UISC distinguishes
+      between consonant letters, vowel letters, and vowel marks. The
+      UIPC property sub-categorizes Mark codepoints by the relative visual
+      position that they occupy (above, below, right, left, or in
+      multiple positions).
+    </p>
+<p>
+      Some complex scripts require that the text run be split into
+      syllables. What constitutes a valid syllable in these
+      scripts is specified in regular expressions, formed from the
+      Letter and Mark codepoints, that take the UISC and UIPC
+      properties into account.
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/up-insensitive.png b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/up-insensitive.png
new file mode 100644
index 0000000..13e1a4f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/up-insensitive.png
Binary files differ
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/up.png b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/up.png
new file mode 100644
index 0000000..67a9054
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/up.png
Binary files differ
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/using-harfbuzzs-native-opentype-implementation.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/using-harfbuzzs-native-opentype-implementation.html
new file mode 100644
index 0000000..71cda2c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/using-harfbuzzs-native-opentype-implementation.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Using HarfBuzz's native OpenType implementation: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="fonts-and-faces.html" title="Fonts and faces">
+<link rel="prev" href="fonts-and-faces.html" title="Fonts and faces">
+<link rel="next" href="using-your-own-font-functions.html" title="Using your own font functions">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="fonts-and-faces.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="fonts-and-faces.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="using-your-own-font-functions.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="using-harfbuzzs-native-opentype-implementation"></a>Using HarfBuzz's native OpenType implementation</h2></div></div></div>
+<p>
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/using-your-own-font-functions.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/using-your-own-font-functions.html
new file mode 100644
index 0000000..400e3e0cb
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/using-your-own-font-functions.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Using your own font functions: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="fonts-and-faces.html" title="Fonts and faces">
+<link rel="prev" href="using-harfbuzzs-native-opentype-implementation.html" title="Using HarfBuzz's native OpenType implementation">
+<link rel="next" href="clusters.html" title="Clusters">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="fonts-and-faces.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="using-harfbuzzs-native-opentype-implementation.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="clusters.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="using-your-own-font-functions"></a>Using your own font functions</h2></div></div></div>
+<p>
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/what-about-the-other-scripts.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/what-about-the-other-scripts.html
new file mode 100644
index 0000000..5b0ebed
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/what-about-the-other-scripts.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>What about the other scripts?: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
+<link rel="prev" href="setting-buffer-properties.html" title="Setting buffer properties">
+<link rel="next" href="customizing-unicode-functions.html" title="Customizing Unicode functions">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="buffers-language-script-and-direction.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="setting-buffer-properties.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="customizing-unicode-functions.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="what-about-the-other-scripts"></a>What about the other scripts?</h2></div></div></div>
+<p>
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/what-harfbuzz-doesnt-do.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/what-harfbuzz-doesnt-do.html
new file mode 100644
index 0000000..33309a1
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/what-harfbuzz-doesnt-do.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>What HarfBuzz doesn't do: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
+<link rel="prev" href="ch01s03.html" title="What does HarfBuzz do?">
+<link rel="next" href="why-is-it-called-harfbuzz.html" title="Why is it called HarfBuzz?">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="what-is-harfbuzz.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="ch01s03.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="why-is-it-called-harfbuzz.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="what-harfbuzz-doesnt-do"></a>What HarfBuzz doesn't do</h2></div></div></div>
+<p>
+      HarfBuzz will take a Unicode string, shape it, and give you the
+      information required to lay it out correctly on a single
+      horizontal (or vertical) line using the font provided. That is the
+      extent of HarfBuzz's responsibility.
+    </p>
+<p>
+      It is important to note that if you are implementing a complete
+      text-layout engine you may have other responsibilities that
+      HarfBuzz will <span class="emphasis"><em>not</em></span> help you with. For example:
+    </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+<p>
+          HarfBuzz won't help you with bidirectionality. If you want to
+          lay out text that includes a mix of Hebrew and English, you
+	  will need to ensure that each buffer provided to HarfBuzz
+	  has all of its characters in the same order and that the
+	  directionality of the buffer is set correctly. This may mean
+	  segmenting the text before it is placed into HarfBuzz buffers. In
+          other words, the user will hit the keys in the following
+          sequence:
+        </p>
+<pre class="programlisting">
+	  A B C [space] ג ב א [space] D E F
+        </pre>
+<p>
+          but will expect to see in the output:
+        </p>
+<pre class="programlisting">
+	  ABC אבג DEF
+        </pre>
+<p>
+          This reordering is called <span class="emphasis"><em>bidi processing</em></span>
+          ("bidi" is short for bidirectional), and there's an
+          algorithm as an annex to the Unicode Standard which tells you how
+          to process a string of mixed directionality.
+          Before sending your string to HarfBuzz, you may need to apply the
+          bidi algorithm to it. Libraries such as <a class="ulink" href="http://icu-project.org/" target="_top">ICU</a> and <a class="ulink" href="http://fribidi.org/" target="_top">fribidi</a> can do this for you.
+        </p>
+</li>
+<li class="listitem">
+<p>
+          HarfBuzz won't help you with text that contains different font
+          properties. For instance, if you have the string "a
+          <span class="emphasis"><em>huge</em></span> breakfast", and you expect
+          "huge" to be italic, then you will need to send three
+          strings to HarfBuzz: <code class="literal">a</code>, in your Roman font;
+          <code class="literal">huge</code> using your italic font; and
+          <code class="literal">breakfast</code> using your Roman font again.
+	</p>
+<p>
+          Similarly, if you change the font, font size, script,
+	  language, or direction within your string, then you will
+	  need to shape each run independently and output them
+	  independently. HarfBuzz expects to shape a run of characters
+	  that all share the same properties.
+        </p>
+</li>
+<li class="listitem">
+<p>
+          HarfBuzz won't help you with line breaking, hyphenation, or
+          justification. As mentioned above, HarfBuzz lays out the string
+          along a <span class="emphasis"><em>single line</em></span> of, notionally,
+          infinite length. If you want to find out where the potential
+          word, sentence and line break points are in your text, you
+          could use the ICU library's break iterator functions.
+        </p>
+<p>
+          HarfBuzz can tell you how wide a shaped piece of text is, which is
+          useful input to a justification algorithm, but it knows nothing
+          about paragraphs, lines or line lengths. Nor will it adjust the
+          space between words to fit them proportionally into a line.
+        </p>
+</li>
+</ul></div>
+<p>
+      As a layout-engine implementor, HarfBuzz will help you with the
+      interface between your text and your font, and that's something
+      that you'll need—what you then do with the glyphs that your font
+      returns is up to you. 
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/what-is-harfbuzz.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/what-is-harfbuzz.html
new file mode 100644
index 0000000..a3eb0a2
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/what-is-harfbuzz.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>What is HarfBuzz?: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="prev" href="pt01.html" title="Part I. User's manual">
+<link rel="next" href="why-do-i-need-a-shaping-engine.html" title="Why do I need a shaping engine?">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="pt01.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="why-do-i-need-a-shaping-engine.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="what-is-harfbuzz"></a>What is HarfBuzz?</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt><span class="section"><a href="what-is-harfbuzz.html#what-is-text-shaping">What is text shaping?</a></span></dt>
+<dt><span class="section"><a href="why-do-i-need-a-shaping-engine.html">Why do I need a shaping engine?</a></span></dt>
+<dt><span class="section"><a href="ch01s03.html">What does HarfBuzz do?</a></span></dt>
+<dt><span class="section"><a href="what-harfbuzz-doesnt-do.html">What HarfBuzz doesn't do</a></span></dt>
+<dt><span class="section"><a href="why-is-it-called-harfbuzz.html">Why is it called HarfBuzz?</a></span></dt>
+</dl></div>
+<p>
+    HarfBuzz is a <span class="emphasis"><em>text-shaping engine</em></span>. If you
+    give HarfBuzz a font and a string containing a sequence of Unicode
+    codepoints, HarfBuzz selects and positions the corresponding
+    glyphs from the font, applying all of the necessary layout rules
+    and font features. HarfBuzz then returns the string to you in the
+    form that is correctly arranged for the language and writing
+    system. 
+  </p>
+<p>
+    HarfBuzz can properly shape all of the world's major writing
+    systems. It runs on all major operating systems and software
+    platforms and it supports the major font formats in use
+    today.
+  </p>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="what-is-text-shaping"></a>What is text shaping?</h2></div></div></div>
+<p>
+      Text shaping is the process of translating a string of character
+      codes (such as Unicode codepoints) into a properly arranged
+      sequence of glyphs that can be rendered onto a screen or into
+      final output form for inclusion in a document.
+    </p>
+<p>
+      The shaping process is dependent on the input string, the active
+      font, the script (or writing system) that the string is in, and
+      the language that the string is in.
+    </p>
+<p>
+      Modern software systems generally only deal with strings in the
+      Unicode encoding scheme (although legacy systems and documents may
+      involve other encodings).
+    </p>
+<p>
+      There are several font formats that a program might
+      encounter, each of which has a set of standard text-shaping
+      rules.
+    </p>
+<p>The dominant format is <a class="ulink" href="http://www.microsoft.com/typography/otspec/" target="_top">OpenType</a>. The
+    OpenType specification defines a series of <a class="ulink" href="https://github.com/n8willis/opentype-shaping-documents" target="_top">shaping models</a> for
+    various scripts from around the world. These shaping models depend on
+    the font incorporating certain features as
+    <span class="emphasis"><em>lookups</em></span> in its <code class="literal">GSUB</code> 
+    and <code class="literal">GPOS</code> tables.
+    </p>
+<p>
+      Alternatively, OpenType fonts can include shaping features for
+      the <a class="ulink" href="https://graphite.sil.org/" target="_top">Graphite</a> shaping model.
+    </p>
+<p>
+      TrueType fonts can also include OpenType shaping
+      features. Alternatively, TrueType fonts can also include <a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html" target="_top">Apple
+      Advanced Typography</a> (AAT) tables to implement shaping
+      support. AAT fonts are generally only found on macOS and iOS systems.
+    </p>
+<p>
+      Text strings will usually be tagged with a script and language
+      tag that provide the context needed to perform text shaping
+      correctly.  The necessary <a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/scripttags" target="_top">script</a> 
+      and <a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/languagetags" target="_top">language</a>
+      tags are defined by OpenType.
+    </p>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/why-do-i-need-a-shaping-engine.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/why-do-i-need-a-shaping-engine.html
new file mode 100644
index 0000000..1c2350b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/why-do-i-need-a-shaping-engine.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Why do I need a shaping engine?: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
+<link rel="prev" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
+<link rel="next" href="ch01s03.html" title="What does HarfBuzz do?">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="what-is-harfbuzz.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="what-is-harfbuzz.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="ch01s03.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="why-do-i-need-a-shaping-engine"></a>Why do I need a shaping engine?</h2></div></div></div>
+<p>
+      Text shaping is an integral part of preparing text for
+      display. Before a Unicode sequence can be rendered, the
+      codepoints in the sequence must be mapped to the corresponding
+      glyphs provided in the font, and those glyphs must be positioned
+      correctly relative to each other. For many of the scripts
+      supported in Unicode, these steps involve script-specific layout
+      rules, including complex joining, reordering, and positioning
+      behavior. Implementing these rules is the job of the shaping engine.
+    </p>
+<p>
+      Text shaping is a fairly low-level operation. HarfBuzz is
+      used directly by text-handling libraries like <a class="ulink" href="https://www.pango.org/" target="_top">Pango</a>, as well as by the layout
+      engines in Firefox, LibreOffice, and Chromium. Unless you are
+      <span class="emphasis"><em>writing</em></span> one of these layout engines
+      yourself, you will probably not need to use HarfBuzz: normally,
+      a layout engine, toolkit, or other library will turn text into
+      glyphs for you.
+    </p>
+<p>
+      However, if you <span class="emphasis"><em>are</em></span> writing a layout engine
+      or graphics library yourself, then you will need to perform text
+      shaping, and this is where HarfBuzz can help you.
+    </p>
+<p>
+      Here are some specific scenarios where a text-shaping engine
+      like HarfBuzz helps you:
+    </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+<p>
+          OpenType fonts contain a set of glyphs (that is, shapes
+	  to represent the letters, numbers, punctuation marks, and
+	  all other symbols), which are indexed by a <code class="literal">glyph ID</code>.
+	</p>
+<p>
+          A particular glyph ID within the font does not necessarily
+	  correlate to a predictable Unicode codepoint. For instance,
+	  some fonts have the letter "a" as glyph ID 1, but
+	  many others do not. In order to retrieve the right glyph
+	  from the font to display "a", you need to consult
+	  the table inside the font (the <code class="literal">cmap</code>
+	  table) that maps Unicode codepoints to glyph IDs. In other
+	  words, <span class="emphasis"><em>text shaping turns codepoints into glyph
+	  IDs</em></span>.
+        </p>
+</li>
+<li class="listitem">
+<p>
+          Many OpenType fonts contain ligatures: combinations of
+          characters that are rendered as a single unit. For instance,
+	  it is common for the "f, i" letter
+	  sequence to appear in print as the single ligature glyph
+	  "fi".
+	</p>
+<p>
+	  Whether you should render an "f, i" sequence
+	  as <code class="literal">fi</code> or as "fi" does not
+          depend on the input text. Instead, it depends on the whether
+	  or not the font includes an "fi" glyph and on the
+	  level of ligature application you wish to perform. The font
+	  and the amount of ligature application used are under your
+	  control. In other words, <span class="emphasis"><em>text shaping involves
+	  querying the font's ligature tables and determining what
+	  substitutions should be made</em></span>. 
+        </p>
+</li>
+<li class="listitem">
+<p>
+          While ligatures like "fi" are optional typographic
+          refinements, some languages <span class="emphasis"><em>require</em></span> certain
+          substitutions to be made in order to display text correctly.
+        </p>
+<p>
+	  For example, in Tamil, when the letter "TTA" (ட)
+	  letter is followed by "U" (உ), the pair
+	  must be replaced by the single glyph "டு". The
+	  sequence of Unicode characters "டஉ" needs to be
+	  substituted with a single "டு" glyph from the
+	  font.
+	</p>
+<p>
+	  But "டு" does not have a Unicode codepoint. To
+	  find this glyph, you need to consult the table inside 
+	  the font (the <code class="literal">GSUB</code> table) that contains
+	  substitution information. In other words, <span class="emphasis"><em>text shaping 
+	  chooses the correct glyph for a sequence of characters
+	  provided</em></span>.
+        </p>
+</li>
+<li class="listitem">
+<p>
+          Similarly, each Arabic character has four different variants
+	  corresponding to the different positions it might appear in
+	  within a sequence. Inside a font, there will be separate
+	  glyphs for the initial, medial, final, and isolated forms of
+	  each letter, each at a different glyph ID.
+	</p>
+<p>
+	  Unicode only assigns one codepoint per character, so a
+	  Unicode string will not tell you which glyph variant to use
+	  for each character. To decide, you need to analyze the whole
+	  string and determine the appropriate glyph for each character
+	  based on its position. In other words, <span class="emphasis"><em>text
+	  shaping chooses the correct form of the letter by its
+	  position and returns the correct glyph from the font</em></span>.
+        </p>
+</li>
+<li class="listitem">
+<p>
+          Other languages involve marks and accents that need to be
+          rendered in specific positions relative a base character. For
+          instance, the Moldovan language includes the Cyrillic letter
+          "zhe" (ж) with a breve accent, like so: "ӂ".
+	</p>
+<p>
+	  Some fonts will provide this character as a single
+	  zhe-with-breve glyph, but other fonts will not and, instead,
+	  will expect the rendering engine to form the character by 
+          superimposing the separate "ж" and "˘"
+	  glyphs.
+	</p>
+<p>
+	  But exactly where you should draw the breve depends on the
+	  height and width of the preceding zhe glyph. To find the
+	  right position, you need to consult the table inside
+	  the font (the <code class="literal">GPOS</code> table) that contains
+	  positioning information.
+          In other words, <span class="emphasis"><em>text shaping tells you whether you
+	  have a precomposed glyph within your font or if you need to
+	  compose a glyph yourself out of combining marks—and,
+	  if so, where to position those marks.</em></span>
+        </p>
+</li>
+</ul></div>
+<p>
+      If tasks like these are something that you need to do, then you
+      need a text shaping engine. You could use Uniscribe if you are
+      writing Windows software; you could use CoreText on macOS; or
+      you could use HarfBuzz.
+    </p>
+<div class="note"><p>
+	In the rest of this manual, the text will assume that the reader
+	is that implementor of a text-layout engine.
+      </p></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/why-is-it-called-harfbuzz.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/why-is-it-called-harfbuzz.html
new file mode 100644
index 0000000..dbc62c1
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/why-is-it-called-harfbuzz.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Why is it called HarfBuzz?: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
+<link rel="prev" href="what-harfbuzz-doesnt-do.html" title="What HarfBuzz doesn't do">
+<link rel="next" href="install-harfbuzz.html" title="Installing HarfBuzz">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="what-is-harfbuzz.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="what-harfbuzz-doesnt-do.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="install-harfbuzz.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="why-is-it-called-harfbuzz"></a>Why is it called HarfBuzz?</h2></div></div></div>
+<p>
+      HarfBuzz began its life as text-shaping code within the FreeType
+      project (and you will see references to the FreeType authors
+      within the source code copyright declarations), but was then
+      extracted out to its own project. This project is maintained by
+      Behdad Esfahbod, who named it HarfBuzz. Originally, it was a
+      shaping engine for OpenType fonts—"HarfBuzz" is
+      the Persian for "open type".
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/working-with-harfbuzz-clusters.html b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/working-with-harfbuzz-clusters.html
new file mode 100644
index 0000000..8d40cd0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/html/working-with-harfbuzz-clusters.html
@@ -0,0 +1,227 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Working with HarfBuzz clusters: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="clusters.html" title="Clusters">
+<link rel="prev" href="clusters.html" title="Clusters">
+<link rel="next" href="a-clustering-example-for-levels-0-and-1.html" title="A clustering example for levels 0 and 1">
+<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="clusters.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="clusters.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="a-clustering-example-for-levels-0-and-1.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="working-with-harfbuzz-clusters"></a>Working with HarfBuzz clusters</h2></div></div></div>
+<p>
+      When you add text to a HarfBuzz buffer, each code point must be
+      assigned a <span class="emphasis"><em>cluster value</em></span>.
+    </p>
+<p>
+      This cluster value is an arbitrary number; HarfBuzz uses it only
+      to distinguish between clusters. Many client programs will use
+      the index of each code point in the input text stream as the
+      cluster value. This is for the sake of convenience; the actual
+      value does not matter.
+    </p>
+<p>
+      Some of the shaping operations performed by HarfBuzz —
+      such as reordering, composition, decomposition, and substitution
+      — may alter the cluster values of some characters. The
+      final cluster values in the buffer at the end of the shaping
+      process will indicate to client programs which subsequences of
+      glyphs represent a cluster and, therefore, must not be
+      separated.
+    </p>
+<p>
+      In addition, client programs can query the final cluster values
+      to discern other potentially important information about the
+      glyphs in the output buffer (such as whether or not a ligature
+      was formed).
+    </p>
+<p>
+      For example, if the initial sequence of cluster values was:
+    </p>
+<pre class="programlisting">
+      0,1,2,3,4
+    </pre>
+<p>
+      and the final sequence of cluster values is:
+    </p>
+<pre class="programlisting">
+      0,0,3,3
+    </pre>
+<p>
+      then there are two clusters in the output buffer: the first
+      cluster includes the first two glyphs, and the second cluster
+      includes the third and fourth glyphs. It is also evident that a
+      ligature or conjunct has been formed, because there are fewer
+      glyphs in the output buffer (four) than there were code points
+      in the input buffer (five).
+    </p>
+<p>
+      Although client programs using HarfBuzz are free to assign
+      initial cluster values in any manner they choose to, HarfBuzz
+      does offer some useful guarantees if the cluster values are
+      assigned in a monotonic (either non-decreasing or non-increasing)
+      order.
+    </p>
+<p>
+      For left-to-right scripts (LTR) and top-to-bottom scripts (TTB),
+      HarfBuzz will preserve the monotonic property: client programs
+      are guaranteed that monotonically increasing initial clulster
+      values will be returned as monotonically increasing final
+      cluster values.
+    </p>
+<p>
+      For right-to-left scripts (RTL) and bottom-to-top scripts (BTT),
+      the directionality of the buffer itself is reversed for final
+      output as a matter of design. Therefore, HarfBuzz inverts the
+      monotonic property: client programs are guaranteed that
+      monotonically increasing initial clulster values will be
+      returned as monotonically <span class="emphasis"><em>decreasing</em></span> final
+      cluster values.
+    </p>
+<p>
+      Client programs can adjust how HarfBuzz handles clusters during
+      shaping by setting the
+      <code class="literal">cluster_level</code> of the
+      buffer. HarfBuzz offers three <span class="emphasis"><em>levels</em></span> of
+      clustering support for this property:
+    </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+<p><span class="emphasis"><em>Level 0</em></span> is the default and
+	reproduces the behavior of the old HarfBuzz library.
+	</p>
+<p>
+	  The distinguishing feature of level 0 behavior is that, at
+	  the beginning of processing the buffer, all code points that
+	  are categorized as <span class="emphasis"><em>marks</em></span>,
+	  <span class="emphasis"><em>modifier symbols</em></span>, or
+	  <span class="emphasis"><em>Emoji extended pictographic</em></span> modifiers,
+	  as well as the <span class="emphasis"><em>Zero Width Joiner</em></span> and
+	  <span class="emphasis"><em>Zero Width Non-Joiner</em></span> code points, are
+	  assigned the cluster value of the closest preceding code
+	  point from <span class="emphasis"><em>different</em></span> category. 
+	</p>
+<p>
+	  In essence, whenever a base character is followed by a mark
+	  character or a sequence of mark characters, those marks are
+	  reassigned to the same initial cluster value as the base
+	  character. This reassignment is referred to as
+	  "merging" the affected clusters. This behavior is based on
+	  the Grapheme Cluster Boundary specification in <a class="ulink" href="https://www.unicode.org/reports/tr29/#Regex_Definitions" target="_top">Unicode
+	  Technical Report 29</a>.
+	</p>
+<p>
+	  Client programs can specify level 0 behavior for a buffer by
+	  setting its <code class="literal">cluster_level</code> to
+	  <code class="literal">HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES</code>. 
+	</p>
+</li>
+<li class="listitem">
+<p>
+	  <span class="emphasis"><em>Level 1</em></span> tweaks the old behavior
+	  slightly to produce better results. Therefore, level 1
+	  clustering is recommended for code that is not required to
+	  implement backward compatibility with the old HarfBuzz.
+	</p>
+<p>
+	  Level 1 differs from level 0 by not merging the 
+	  clusters of marks and other modifier code points with the
+	  preceding "base" code point's cluster. By preserving the
+	  separate cluster values of these marks and modifier code
+	  points, script shapers can perform additional operations
+	  that might lead to improved results (for example, reordering
+	  a sequence of marks).
+	</p>
+<p>
+	  Client programs can specify level 1 behavior for a buffer by
+	  setting its <code class="literal">cluster_level</code> to
+	  <code class="literal">HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS</code>. 
+	</p>
+</li>
+<li class="listitem">
+<p>
+	  <span class="emphasis"><em>Level 2</em></span> differs significantly in how it
+	  treats cluster values. In level 2, HarfBuzz never merges
+	  clusters.
+	</p>
+<p>
+	  This difference can be seen most clearly when HarfBuzz processes
+	  ligature substitutions and glyph decompositions. In level 0 
+	  and level 1, ligatures and glyph decomposition both involve
+	  merging clusters; in level 2, neither of these operations
+	  triggers a merge.
+	</p>
+<p>
+	  Client programs can specify level 2 behavior for a buffer by
+	  setting its <code class="literal">cluster_level</code> to
+	  <code class="literal">HB_BUFFER_CLUSTER_LEVEL_CHARACTERS</code>. 
+	</p>
+</li>
+</ul></div>
+<p>
+      As mentioned earlier, client programs using HarfBuzz often
+      assign initial cluster values in a buffer by reusing the indices
+      of the code points in the input text. This gives a sequence of
+      cluster values that is monotonically increasing (for example,
+      0,1,2,3,4). 
+    </p>
+<p>
+      It is not <span class="emphasis"><em>required</em></span> that the cluster values
+      in a buffer be monotonically increasing. However, if the initial
+      cluster values in a buffer are monotonic and the buffer is
+      configured to use cluster level 0 or 1, then HarfBuzz
+      guarantees that the final cluster values in the shaped buffer
+      will also be monotonic. No such guarantee is made for cluster
+      level 2.
+    </p>
+<p>
+      In levels 0 and 1, HarfBuzz implements the following conceptual
+      model for cluster values:
+    </p>
+<div class="itemizedlist"><ul class="itemizedlist compact" style="list-style-type: disc; ">
+<li class="listitem"><p>
+          If the sequence of input cluster values is monotonic, the
+	  sequence of cluster values will remain monotonic.
+	</p></li>
+<li class="listitem"><p>
+          Each cluster value represents a single cluster.
+	</p></li>
+<li class="listitem"><p>
+          Each cluster contains one or more glyphs and one or more
+          characters.
+	</p></li>
+</ul></div>
+<p>
+      In practice, this model offers several benefits. Assuming that
+      the initial cluster values were monotonically increasing
+      and distinct before shaping began, then, in the final output:
+    </p>
+<div class="itemizedlist"><ul class="itemizedlist compact" style="list-style-type: disc; ">
+<li class="listitem"><p>
+	  All adjacent glyphs having the same final cluster
+	  value belong to the same cluster.
+	</p></li>
+<li class="listitem"><p>
+          Each character belongs to the cluster that has the highest
+	  cluster value <span class="emphasis"><em>not larger than</em></span> its
+	  initial cluster value.
+	</p></li>
+</ul></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-buffers-language-script-and-direction.xml b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-buffers-language-script-and-direction.xml
new file mode 100644
index 0000000..1c6b5da
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-buffers-language-script-and-direction.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+  <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
+  <!ENTITY version SYSTEM "version.xml">
+]>
+<chapter id="buffers-language-script-and-direction">
+  <title>Buffers, language, script and direction</title>
+  <para>
+    The input to HarfBuzz is a series of Unicode characters, stored in a
+    buffer. In this chapter, we'll look at how to set up a buffer with
+    the text that we want and then customize the properties of the
+    buffer.
+  </para>
+  <section id="creating-and-destroying-buffers">
+    <title>Creating and destroying buffers</title>
+    <para>
+      As we saw in our <emphasis>Getting Started</emphasis> example, a
+      buffer is created and 
+      initialized with <literal>hb_buffer_create()</literal>. This
+      produces a new, empty buffer object, instantiated with some
+      default values and ready to accept your Unicode strings.
+    </para>
+    <para>
+      HarfBuzz manages the memory of objects (such as buffers) that it
+      creates, so you don't have to. When you have finished working on 
+      a buffer, you can call <literal>hb_buffer_destroy()</literal>:
+    </para>
+    <programlisting language="C">
+  hb_buffer_t *buffer = hb_buffer_create();
+  ...
+  hb_buffer_destroy(buffer);
+</programlisting>
+    <para>
+      This will destroy the object and free its associated memory -
+      unless some other part of the program holds a reference to this
+      buffer. If you acquire a HarfBuzz buffer from another subsystem
+      and want to ensure that it is not garbage collected by someone
+      else destroying it, you should increase its reference count:
+    </para>
+    <programlisting language="C">
+void somefunc(hb_buffer_t *buffer) {
+  buffer = hb_buffer_reference(buffer);
+  ...
+</programlisting>
+    <para>
+      And then decrease it once you're done with it:
+    </para>
+    <programlisting language="C">
+  hb_buffer_destroy(buffer);
+}
+</programlisting>
+    <para>
+      To throw away all the data in your buffer and start from scratch,
+      call <literal>hb_buffer_reset(buffer)</literal>. If you want to
+      throw away the string in the buffer but keep the options, you can
+      instead call <literal>hb_buffer_clear_contents(buffer)</literal>.
+    </para>
+  </section>
+  <section id="adding-text-to-the-buffer">
+    <title>Adding text to the buffer</title>
+    <para>
+      Now we have a brand new HarfBuzz buffer. Let's start filling it
+      with text! From HarfBuzz's perspective, a buffer is just a stream
+      of Unicode codepoints, but your input string is probably in one of
+      the standard Unicode character encodings (UTF-8, UTF-16, UTF-32)
+    </para>
+  </section>
+  <section id="setting-buffer-properties">
+    <title>Setting buffer properties</title>
+    <para>
+    </para>
+  </section>
+  <section id="what-about-the-other-scripts">
+    <title>What about the other scripts?</title>
+    <para>
+    </para>
+  </section>
+  <section id="customizing-unicode-functions">
+    <title>Customizing Unicode functions</title>
+    <para>
+    </para>
+  </section>
+</chapter>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-clusters.xml b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-clusters.xml
new file mode 100644
index 0000000..228cc56
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-clusters.xml
@@ -0,0 +1,695 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+  <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
+  <!ENTITY version SYSTEM "version.xml">
+]>
+<chapter id="clusters">
+  <title>Clusters</title>
+  <section id="clusters-and-shaping">
+    <title>Clusters and shaping</title>
+    <para>
+      In text shaping, a <emphasis>cluster</emphasis> is a sequence of
+      characters that needs to be treated as a single, indivisible
+      unit. A single letter or symbol can be a cluster of its
+      own. Other clusters correspond to longer subsequences of the
+      input code points &mdash; such as a ligature or conjunct form
+      &mdash; and require the shaper to ensure that the cluster is not
+      broken during the shaping process.
+    </para>
+    <para>
+      A cluster is distinct from a <emphasis>grapheme</emphasis>,
+      which is the smallest unit of meaning in a writing system or
+      script.
+    </para>
+    <para>
+      The definitions of the two terms are similar. However, clusters
+      are only relevant for script shaping and glyph layout. In
+      contrast, graphemes are a property of the underlying script, and
+      are of interest when client programs implement orthographic 
+      or linguistic functionality.
+    </para>
+    <para>
+      For example, two individual letters are often two separate
+      graphemes. When two letters form a ligature, however, they
+      combine into a single glyph. They are then part of the same
+      cluster and are treated as a unit by the shaping engine &mdash;
+      even though the two original, underlying letters remain separate
+      graphemes.
+    </para>
+    <para>
+      HarfBuzz is concerned with clusters, <emphasis>not</emphasis>
+      with graphemes &mdash; although client programs using HarfBuzz
+      may still care about graphemes for other reasons from time to time.
+    </para>
+    <para>
+      During the shaping process, there are several shaping operations
+      that may merge adjacent characters (for example, when two code
+      points form a ligature or a conjunct form and are replaced by a
+      single glyph) or split one character into several (for example,
+      when decomposing a code point through the
+      <literal>ccmp</literal> feature). Operations like these alter
+      clusters; HarfBuzz tracks the changes to ensure that no clusters
+      get lost or broken during shaping. 
+    </para>
+    <para>
+      HarfBuzz records cluster information independently from how
+      shaping operations affect the individual glyphs returned in an
+      output buffer. Consequently, a client program using HarfBuzz can
+      utilize the cluster information to implement features such as:
+    </para>
+    <itemizedlist>
+      <listitem>
+	<para>
+	  Correctly positioning the cursor within a shaped text run,
+	  even when characters have formed ligatures, composed or
+	  decomposed, reordered, or undergone other shaping operations.
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	  Correctly highlighting a text selection that includes some,
+	  but not all, of the characters in a word. 
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	  Applying text attributes (such as color or underlining) to
+	  part, but not all, of a word.
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	  Generating output document formats (such as PDF) with
+	  embedded text that can be fully extracted.
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	  Determining the mapping between input characters and output
+	  glyphs, such as which glyphs are ligatures.
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	  Performing line-breaking, justification, and other
+	  line-level or paragraph-level operations that must be done
+	  after shaping is complete, but which require examining
+	  character-level properties.
+	</para>
+      </listitem>
+    </itemizedlist>
+  </section>
+  <section id="working-with-harfbuzz-clusters">
+    <title>Working with HarfBuzz clusters</title>
+    <para>
+      When you add text to a HarfBuzz buffer, each code point must be
+      assigned a <emphasis>cluster value</emphasis>.
+    </para>
+    <para>
+      This cluster value is an arbitrary number; HarfBuzz uses it only
+      to distinguish between clusters. Many client programs will use
+      the index of each code point in the input text stream as the
+      cluster value. This is for the sake of convenience; the actual
+      value does not matter.
+    </para>
+    <para>
+      Some of the shaping operations performed by HarfBuzz &mdash;
+      such as reordering, composition, decomposition, and substitution
+      &mdash; may alter the cluster values of some characters. The
+      final cluster values in the buffer at the end of the shaping
+      process will indicate to client programs which subsequences of
+      glyphs represent a cluster and, therefore, must not be
+      separated.
+    </para>
+    <para>
+      In addition, client programs can query the final cluster values
+      to discern other potentially important information about the
+      glyphs in the output buffer (such as whether or not a ligature
+      was formed).
+    </para>
+    <para>
+      For example, if the initial sequence of cluster values was:
+    </para>
+    <programlisting>
+      0,1,2,3,4
+    </programlisting>
+    <para>
+      and the final sequence of cluster values is:
+    </para>
+    <programlisting>
+      0,0,3,3
+    </programlisting>
+    <para>
+      then there are two clusters in the output buffer: the first
+      cluster includes the first two glyphs, and the second cluster
+      includes the third and fourth glyphs. It is also evident that a
+      ligature or conjunct has been formed, because there are fewer
+      glyphs in the output buffer (four) than there were code points
+      in the input buffer (five).
+    </para>
+    <para>
+      Although client programs using HarfBuzz are free to assign
+      initial cluster values in any manner they choose to, HarfBuzz
+      does offer some useful guarantees if the cluster values are
+      assigned in a monotonic (either non-decreasing or non-increasing)
+      order.
+    </para>
+    <para>
+      For left-to-right scripts (LTR) and top-to-bottom scripts (TTB),
+      HarfBuzz will preserve the monotonic property: client programs
+      are guaranteed that monotonically increasing initial clulster
+      values will be returned as monotonically increasing final
+      cluster values.
+    </para>
+    <para>
+      For right-to-left scripts (RTL) and bottom-to-top scripts (BTT),
+      the directionality of the buffer itself is reversed for final
+      output as a matter of design. Therefore, HarfBuzz inverts the
+      monotonic property: client programs are guaranteed that
+      monotonically increasing initial clulster values will be
+      returned as monotonically <emphasis>decreasing</emphasis> final
+      cluster values.
+    </para>
+    <para>
+      Client programs can adjust how HarfBuzz handles clusters during
+      shaping by setting the
+      <literal>cluster_level</literal> of the
+      buffer. HarfBuzz offers three <emphasis>levels</emphasis> of
+      clustering support for this property:
+    </para>
+    <itemizedlist>
+      <listitem>
+	<para><emphasis>Level 0</emphasis> is the default and
+	reproduces the behavior of the old HarfBuzz library.
+	</para>
+	<para>
+	  The distinguishing feature of level 0 behavior is that, at
+	  the beginning of processing the buffer, all code points that
+	  are categorized as <emphasis>marks</emphasis>,
+	  <emphasis>modifier symbols</emphasis>, or
+	  <emphasis>Emoji extended pictographic</emphasis> modifiers,
+	  as well as the <emphasis>Zero Width Joiner</emphasis> and
+	  <emphasis>Zero Width Non-Joiner</emphasis> code points, are
+	  assigned the cluster value of the closest preceding code
+	  point from <emphasis>different</emphasis> category. 
+	</para>
+	<para>
+	  In essence, whenever a base character is followed by a mark
+	  character or a sequence of mark characters, those marks are
+	  reassigned to the same initial cluster value as the base
+	  character. This reassignment is referred to as
+	  "merging" the affected clusters. This behavior is based on
+	  the Grapheme Cluster Boundary specification in <ulink
+	  url="https://www.unicode.org/reports/tr29/#Regex_Definitions">Unicode
+	  Technical Report 29</ulink>.
+	</para>
+	<para>
+	  Client programs can specify level 0 behavior for a buffer by
+	  setting its <literal>cluster_level</literal> to
+	  <literal>HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES</literal>. 
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	  <emphasis>Level 1</emphasis> tweaks the old behavior
+	  slightly to produce better results. Therefore, level 1
+	  clustering is recommended for code that is not required to
+	  implement backward compatibility with the old HarfBuzz.
+	</para>
+	<para>
+	  Level 1 differs from level 0 by not merging the 
+	  clusters of marks and other modifier code points with the
+	  preceding "base" code point's cluster. By preserving the
+	  separate cluster values of these marks and modifier code
+	  points, script shapers can perform additional operations
+	  that might lead to improved results (for example, reordering
+	  a sequence of marks).
+	</para>
+	<para>
+	  Client programs can specify level 1 behavior for a buffer by
+	  setting its <literal>cluster_level</literal> to
+	  <literal>HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS</literal>. 
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	  <emphasis>Level 2</emphasis> differs significantly in how it
+	  treats cluster values. In level 2, HarfBuzz never merges
+	  clusters.
+	</para>
+	<para>
+	  This difference can be seen most clearly when HarfBuzz processes
+	  ligature substitutions and glyph decompositions. In level 0 
+	  and level 1, ligatures and glyph decomposition both involve
+	  merging clusters; in level 2, neither of these operations
+	  triggers a merge.
+	</para>
+	<para>
+	  Client programs can specify level 2 behavior for a buffer by
+	  setting its <literal>cluster_level</literal> to
+	  <literal>HB_BUFFER_CLUSTER_LEVEL_CHARACTERS</literal>. 
+	</para>
+      </listitem>
+    </itemizedlist>
+    <para>
+      As mentioned earlier, client programs using HarfBuzz often
+      assign initial cluster values in a buffer by reusing the indices
+      of the code points in the input text. This gives a sequence of
+      cluster values that is monotonically increasing (for example,
+      0,1,2,3,4). 
+    </para>
+    <para>
+      It is not <emphasis>required</emphasis> that the cluster values
+      in a buffer be monotonically increasing. However, if the initial
+      cluster values in a buffer are monotonic and the buffer is
+      configured to use cluster level 0 or 1, then HarfBuzz
+      guarantees that the final cluster values in the shaped buffer
+      will also be monotonic. No such guarantee is made for cluster
+      level 2.
+    </para>
+    <para>
+      In levels 0 and 1, HarfBuzz implements the following conceptual
+      model for cluster values:
+    </para>
+    <itemizedlist spacing="compact">
+      <listitem>
+	<para>
+          If the sequence of input cluster values is monotonic, the
+	  sequence of cluster values will remain monotonic.
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+          Each cluster value represents a single cluster.
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+          Each cluster contains one or more glyphs and one or more
+          characters.
+	</para>
+      </listitem>
+    </itemizedlist>
+    <para>
+      In practice, this model offers several benefits. Assuming that
+      the initial cluster values were monotonically increasing
+      and distinct before shaping began, then, in the final output:
+    </para>
+    <itemizedlist spacing="compact">
+      <listitem>
+	<para>
+	  All adjacent glyphs having the same final cluster
+	  value belong to the same cluster.
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+          Each character belongs to the cluster that has the highest
+	  cluster value <emphasis>not larger than</emphasis> its
+	  initial cluster value.
+	</para>
+      </listitem>
+    </itemizedlist>
+  </section>
+  
+  <section id="a-clustering-example-for-levels-0-and-1">
+    <title>A clustering example for levels 0 and 1</title>
+    <para>
+      The basic shaping operations affect clusters in a predictable
+      manner when using level 0 or level 1: 
+    </para>
+    <itemizedlist>
+      <listitem>
+	<para>
+	  When two or more clusters <emphasis>merge</emphasis>, the
+	  resulting merged cluster takes as its cluster value the
+	  <emphasis>minimum</emphasis> of the incoming cluster values.
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	  When a cluster <emphasis>decomposes</emphasis>, all of the
+	  resulting child clusters inherit as their cluster value the
+	  cluster value of the parent cluster.
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	  When a character is <emphasis>reordered</emphasis>, the
+	  reordered character and all clusters that the character
+	  moves past as part of the reordering are merged into one cluster.
+	</para>
+      </listitem>
+    </itemizedlist>
+    <para>
+      The functionality, guarantees, and benefits of level 0 and level
+      1 behavior can be seen with some examples. First, let us examine
+      what happens with cluster values when shaping involves cluster
+      merging with ligatures and decomposition.
+    </para>
+
+    <para>
+      Let's say we start with the following character sequence (top row) and
+      initial cluster values (bottom row):
+    </para>
+    <programlisting>
+      A,B,C,D,E
+      0,1,2,3,4
+    </programlisting>
+    <para>
+      During shaping, HarfBuzz maps these characters to glyphs from
+      the font. For simplicity, let us assume that each character maps
+      to the corresponding, identical-looking glyph:
+    </para>
+    <programlisting>
+      A,B,C,D,E
+      0,1,2,3,4
+    </programlisting>
+    <para>
+      Now if, for example, <literal>B</literal> and <literal>C</literal>
+      form a ligature, then the clusters to which they belong
+      &quot;merge&quot;. This merged cluster takes for its cluster
+      value the minimum of all the cluster values of the clusters that
+      went in to the ligature. In this case, we get:
+    </para>
+    <programlisting>
+      A,BC,D,E
+      0,1 ,3,4
+    </programlisting>
+    <para>
+      because 1 is the minimum of the set {1,2}, which were the
+      cluster values of <literal>B</literal> and
+      <literal>C</literal>. 
+    </para>
+    <para>
+      Next, let us say that the <literal>BC</literal> ligature glyph
+      decomposes into three components, and <literal>D</literal> also
+      decomposes into two components. Whenever a cluster decomposes,
+      its components each inherit the cluster value of their parent: 
+    </para>
+    <programlisting>
+      A,BC0,BC1,BC2,D0,D1,E
+      0,1  ,1  ,1  ,3 ,3 ,4
+    </programlisting>
+    <para>
+      Next, if <literal>BC2</literal> and <literal>D0</literal> form a
+      ligature, then their clusters (cluster values 1 and 3) merge into
+      <literal>min(1,3) = 1</literal>:
+    </para>
+    <programlisting>
+      A,BC0,BC1,BC2D0,D1,E
+      0,1  ,1  ,1    ,1 ,4
+    </programlisting>
+    <para>
+      Note that the entirety of cluster 3 merges into cluster 1, not
+      just the <literal>D0</literal> glyph. This reflects the fact
+      that the cluster <emphasis>must</emphasis> be treated as an
+      indivisible unit.
+    </para>
+    <para>
+      At this point, cluster 1 means: the character sequence
+      <literal>BCD</literal> is represented by glyphs
+      <literal>BC0,BC1,BC2D0,D1</literal> and cannot be broken down any
+      further.
+    </para>
+  </section>
+  <section id="reordering-in-levels-0-and-1">
+    <title>Reordering in levels 0 and 1</title>
+    <para>
+      Another common operation in the more complex shapers is glyph
+      reordering. In order to maintain a monotonic cluster sequence
+      when glyph reordering takes place, HarfBuzz merges the clusters
+      of everything in the reordering sequence.
+    </para>
+    <para>
+      For example, let us again start with the character sequence (top
+      row) and initial cluster values (bottom row):
+    </para>
+    <programlisting>
+      A,B,C,D,E
+      0,1,2,3,4
+    </programlisting>
+    <para>
+      If <literal>D</literal> is reordered to the position immediately
+      before <literal>B</literal>, then HarfBuzz merges the
+      <literal>B</literal>, <literal>C</literal>, and
+      <literal>D</literal> clusters &mdash; all the clusters between
+      the final position of the reordered glyph and its original
+      position. This means that we get:
+    </para>
+    <programlisting>
+      A,D,B,C,E
+      0,1,1,1,4
+    </programlisting>
+    <para>
+      as the final cluster sequence.
+    </para>
+    <para>
+      Merging this many clusters is not ideal, but it is the only
+      sensible way for HarfBuzz to maintain the guarantee that the
+      sequence of cluster values remains monotonic and to retain the
+      true relationship between glyphs and characters.
+    </para>
+  </section>
+  <section id="the-distinction-between-levels-0-and-1">
+    <title>The distinction between levels 0 and 1</title>
+    <para>
+      The preceding examples demonstrate the main effects of using
+      cluster levels 0 and 1. The only difference between the two
+      levels is this: in level 0, at the very beginning of the shaping
+      process, HarfBuzz merges the cluster of each base character
+      with the clusters of all Unicode marks (combining or not) and
+      modifiers that follow it.
+    </para>
+    <para>
+      For example, let us start with the following character sequence
+      (top row) and accompanying initial cluster values (bottom row):
+    </para>
+    <programlisting>
+      A,acute,B
+      0,1    ,2
+    </programlisting>
+    <para>
+      The <literal>acute</literal> is a Unicode mark. If HarfBuzz is
+      using cluster level 0 on this sequence, then the
+      <literal>A</literal> and <literal>acute</literal> clusters will
+      merge, and the result will become:
+    </para>
+    <programlisting>
+      A,acute,B
+      0,0    ,2
+    </programlisting>
+    <para>
+      This merger is performed before any other script-shaping
+      steps.
+    </para>
+    <para>
+      This initial cluster merging is the default behavior of the
+      Windows shaping engine, and the old HarfBuzz codebase copied
+      that behavior to maintain compatibility. Consequently, it has
+      remained the default behavior in the new HarfBuzz codebase.
+    </para>
+    <para>
+      But this initial cluster-merging behavior makes it impossible
+      client programs to implement some features (such as to
+      color diacritic marks differently from their base
+      characters). That is why, in level 1, HarfBuzz does not perform
+      the initial merging step.
+    </para>
+    <para>
+      For client programs that rely on HarfBuzz cluster values to
+      perform cursor positioning, level 0 is more convenient. But
+      relying on cluster boundaries for cursor positioning is wrong: cursor
+      positions should be determined based on Unicode grapheme
+      boundaries, not on shaping-cluster boundaries. As such, using
+      level 1 clustering behavior is recommended. 
+    </para>
+    <para>
+      One final facet of levels 0 and 1 is worth noting. HarfBuzz
+      currently does not allow any
+      <emphasis>multiple-substitution</emphasis> GSUB lookups to 
+      replace a glyph with zero glyphs (in other words, to delete a
+      glyph).
+    </para>
+    <para>
+      But, in some other situations, glyphs can be deleted. In
+      those cases, if the glyph being deleted is the last glyph of its
+      cluster, HarfBuzz makes sure to merge the deleted glyph's
+      cluster with a neighboring cluster.
+    </para>
+    <para>
+      This is done primarily to make sure that the starting cluster of the
+      text always has the cluster index pointing to the start of the text
+      for the run; more than one client program currently relies on this
+      guarantee.
+    </para>
+    <para>
+      Incidentally, Apple's CoreText does something different to
+      maintain the same promise: it inserts a glyph with id 65535 at
+      the beginning of the glyph string if the glyph corresponding to
+      the first character in the run was deleted. HarfBuzz might do
+      something similar in the future.
+    </para>
+  </section>
+  <section id="level-2">
+    <title>Level 2</title>
+    <para>
+      HarfBuzz's level 2 cluster behavior uses a significantly
+      different model than that of level 0 and level 1.
+    </para>
+    <para>
+      The level 2 behavior is easy to describe, but it may be
+      difficult to understand in practical terms. In brief, level 2 
+      performs no merging of clusters whatsoever.
+    </para>
+    <para>
+      This means that there is no initial base-and-mark merging step
+      (as is done in level 0), and it means that reordering moves and
+      ligature substitutions do not trigger a cluster merge.
+    </para>
+    <para>
+      Only one shaping operation directly affects clusters when using
+      level 2:
+    </para>
+    <itemizedlist>
+      <listitem>
+	<para>
+	  When a cluster <emphasis>decomposes</emphasis>, all of the
+	  resulting child clusters inherit as their cluster value the
+	  cluster value of the parent cluster.
+	</para>
+      </listitem>
+    </itemizedlist>
+    <para>
+      When glyphs do form a ligature (or when some other feature
+      substitutes multiple glyphs with one glyph) the cluster value
+      of the first glyph is retained as the cluster value for the
+      resulting ligature.
+    </para>
+    <para>
+      This occurrence sounds similar to a cluster merge, but it is
+      different. In particular, no subsequent characters &mdash;
+      including marks and modifiers &mdash; are affected. They retain
+      their previous cluster values. 
+    </para>
+    <para>
+      Level 2 cluster behavior is ultimately less complex than level 0
+      or level 1, but there are several cases for which processing
+      cluster values produced at level 2 may be tricky. 
+    </para>
+    <section id="ligatures-with-combining-marks-in-level-2">
+      <title>Ligatures with combining marks in level 2</title>
+      <para>
+	The first example of how HarfBuzz's level 2 cluster behavior
+	can be tricky is when the text to be shaped includes combining
+	marks attached to ligatures.
+      </para>
+      <para>
+	Let us start with an input sequence with the following
+	characters (top row) and initial cluster values (bottom row):
+      </para>
+      <programlisting>
+	A,acute,B,breve,C,circumflex
+	0,1    ,2,3    ,4,5
+      </programlisting>
+      <para>
+	If the sequence <literal>A,B,C</literal> forms a ligature,
+	then these are the cluster values HarfBuzz will return under
+	the various cluster levels:
+      </para>
+      <para>
+	Level 0:
+      </para>
+      <programlisting>
+	ABC,acute,breve,circumflex
+	0  ,0    ,0    ,0
+      </programlisting>
+      <para>
+	Level 1:
+      </para>
+      <programlisting>
+	ABC,acute,breve,circumflex
+	0  ,0    ,0    ,5
+      </programlisting>
+      <para>
+	Level 2:
+      </para>
+      <programlisting>
+	ABC,acute,breve,circumflex
+	0  ,1    ,3    ,5
+      </programlisting>
+      <para>
+	Making sense of the level 2 result is the hardest for a client
+	program, because there is nothing in the cluster values that
+	indicates that <literal>B</literal> and <literal>C</literal>
+	formed a ligature with <literal>A</literal>.
+      </para>
+      <para>
+	In contrast, the "merged" cluster values of the mark glyphs
+	that are seen in the level 0 and level 1 output are evidence
+	that a ligature substitution took place. 
+      </para>
+    </section>
+    <section id="reordering-in-level-2">
+      <title>Reordering in level 2</title>
+      <para>
+	Another example of how HarfBuzz's level 2 cluster behavior
+	can be tricky is when glyphs reorder. Consider an input sequence
+	with the following characters (top row) and initial cluster
+	values (bottom row):
+      </para>
+      <programlisting>
+	A,B,C,D,E
+	0,1,2,3,4
+      </programlisting>
+      <para>
+	Now imagine <literal>D</literal> moves before
+	<literal>B</literal> in a reordering operation. The cluster
+	values will then be:
+      </para>
+      <programlisting>
+	A,D,B,C,E
+	0,3,1,2,4
+      </programlisting>
+      <para>
+	Next, if <literal>D</literal> forms a ligature with
+	<literal>B</literal>, the output is:
+      </para>
+      <programlisting>
+	A,DB,C,E
+	0,3 ,2,4
+      </programlisting>
+      <para>
+	However, in a different scenario, in which the shaping rules
+	of the script instead caused <literal>A</literal> and
+	<literal>B</literal> to form a ligature
+	<emphasis>before</emphasis> the <literal>D</literal> reordered, the
+	result would be:
+      </para>
+      <programlisting>
+	AB,D,C,E
+	0 ,3,2,4   
+      </programlisting>
+      <para>
+	There is no way for a client program to differentiate between
+	these two scenarios based on the cluster values
+	alone. Consequently, client programs that use level 2 might
+	need to undertake additional work in order to manage cursor
+	positioning, text attributes, or other desired features.
+      </para>
+    </section>
+    <section id="other-considerations-in-level-2">
+      <title>Other considerations in level 2</title>
+      <para>
+	There may be other problems encountered with ligatures under
+	level 2, such as if the direction of the text is forced to
+	opposite of its natural direction (for example, Arabic text
+	that is forced into left-to-right directionality). But,
+	generally speaking, these other scenarios are minor corner
+	cases that are too obscure for most client programs to need to
+	worry about.
+      </para>
+    </section>
+  </section>
+</chapter>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-fonts-and-faces.xml b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-fonts-and-faces.xml
new file mode 100644
index 0000000..5536004
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-fonts-and-faces.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+  <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
+  <!ENTITY version SYSTEM "version.xml">
+]>
+<chapter id="fonts-and-faces">
+  <title>Fonts and faces</title>
+  <section id="using-freetype">
+    <title>Using FreeType</title>
+    <para>
+    </para>
+  </section>
+  <section id="using-harfbuzzs-native-opentype-implementation">
+    <title>Using HarfBuzz's native OpenType implementation</title>
+    <para>
+    </para>
+  </section>
+  <section id="using-your-own-font-functions">
+    <title>Using your own font functions</title>
+    <para>
+    </para>
+  </section>
+</chapter>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-getting-started.xml b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-getting-started.xml
new file mode 100644
index 0000000..cc867e0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-getting-started.xml
@@ -0,0 +1,307 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+  <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
+  <!ENTITY version SYSTEM "version.xml">
+]>
+<chapter id="getting-started">
+  <title>Getting started with HarfBuzz</title>
+  <section>
+    <title>An overview of the HarfBuzz shaping API</title>
+    <para>
+      The core of the HarfBuzz shaping API is the function
+      <function>hb_shape()</function>. This function takes a font, a
+      buffer containing a string of Unicode codepoints and
+      (optionally) a list of font features as its input. It replaces
+      the codepoints in the buffer with the corresponding glyphs from
+      the font, correctly ordered and positioned, and with any of the
+      optional font features applied.
+    </para>
+    <para>
+      In addition to holding the pre-shaping input (the Unicode
+      codepoints that comprise the input string) and the post-shaping
+      output (the glyphs and positions), a HarfBuzz buffer has several
+      properties that affect shaping. The most important are the
+      text-flow direction (e.g., left-to-right, right-to-left,
+      top-to-bottom, or bottom-to-top), the script tag, and the
+      language tag.
+    </para>
+
+    <para>
+      For input string buffers, flags are available to denote when the
+      buffer represents the beginning or end of a paragraph, to
+      indicate whether or not to visibly render Unicode <literal>Default
+      Ignorable</literal> codepoints, and to modify the cluster-merging
+      behavior for the buffer. For shaped output buffers, the
+      individual X and Y offsets and <literal>advances</literal>
+      (the logical dimensions) of each glyph are 
+      accessible. HarfBuzz also flags glyphs as
+      <literal>UNSAFE_TO_BREAK</literal> if breaking the string at
+      that glyph (e.g., in a line-breaking or hyphenation process)
+      would require re-shaping the text.
+    </para>
+    
+    <para>
+      HarfBuzz also provides methods to compare the contents of
+      buffers, join buffers, normalize buffer contents, and handle
+      invalid codepoints, as well as to determine the state of a
+      buffer (e.g., input codepoints or output glyphs). Buffer
+      lifecycles are managed and all buffers are reference-counted.
+    </para>
+
+    <para>
+      Although the default <function>hb_shape()</function> function is
+      sufficient for most use cases, a variant is also provide that
+      lets you specify which of HarfBuzz's shapers to use on a buffer. 
+    </para>
+
+    <para>
+      HarfBuzz can read TrueType fonts, TrueType collections, OpenType
+      fonts, and OpenType collections. Functions are provided to query
+      font objects about metrics, Unicode coverage, available tables and
+      features, and variation selectors. Individual glyphs can also be
+      queried for metrics, variations, and glyph names. OpenType
+      variable fonts are supported, and HarfBuzz allows you to set
+      variation-axis coordinates on font objects.
+    </para>
+    
+    <para>
+      HarfBuzz provides glue code to integrate with various other
+      libraries, including FreeType, GObject, and CoreText. Support
+      for integrating with Uniscribe and DirectWrite is experimental
+      at present.
+    </para>
+  </section>
+
+  <section>
+    <title>Terminology</title>
+    <para>
+      
+    </para>
+      <variablelist>
+	<?dbfo list-presentation="blocks"?> 
+	<varlistentry>
+	  <term>script</term>
+	  <listitem>
+	    <para>
+	      In text shaping, a <emphasis>script</emphasis> is a
+	      writing system: a set of symbols, rules, and conventions
+	      that is used to represent a language or multiple
+	      languages.
+	    </para>
+	    <para>
+	      In general computing lingo, the word "script" can also
+	      be used to mean an executable program (usually one
+	      written in a human-readable programming language). For
+	      the sake of clarity, HarfBuzz documents will always use
+	      more specific terminology when referring to this
+	      meaning, such as "Python script" or "shell script." In
+	      all other instances, "script" refers to a writing system.
+	    </para>
+	    <para>
+	      For developers using HarfBuzz, it is important to note
+	      the distinction between a script and a language. Most
+	      scripts are used to write a variety of different
+	      languages, and many languages may be written in more
+	      than one script.
+	    </para>
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term>shaper</term>
+	  <listitem>
+	    <para>
+	      In HarfBuzz, a <emphasis>shaper</emphasis> is a
+	      handler for a specific script-shaping model. HarfBuzz
+	      implements separate shapers for Indic, Arabic, Thai and
+	      Lao, Khmer, Myanmar, Tibetan, Hangul, Hebrew, the
+	      Universal Shaping Engine (USE), and a default shaper for
+	      non-complex scripts. 
+	    </para>
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term>cluster</term>
+	  <listitem>
+	    <para>
+	      In text shaping, a <emphasis>cluster</emphasis> is a
+	      sequence of codepoints that must be treated as an
+	      indivisible unit. Clusters can include code-point
+	      sequences that form a ligature or base-and-mark
+	      sequences. Tracking and preserving clusters is important
+	      when shaping operations might separate or reorder
+	      code points.
+	    </para>
+	    <para>
+	      HarfBuzz provides three cluster
+	      <emphasis>levels</emphasis> that implement different
+	      approaches to the problem of preserving clusters during
+	      shaping operations.
+	    </para>
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term>grapheme</term>
+	  <listitem>
+	    <para>
+	      In linguistics, a <emphasis>grapheme</emphasis> is one
+	      of the indivisible units that make up a writing system or
+	      script. Often, graphemes are individual symbols (letters,
+	      numbers, punctuation marks, logograms, etc.) but,
+	      depending on the writing system, a particular grapheme
+	      might correspond to a sequence of several Unicode code
+	      points.
+	    </para>
+	    <para>
+	      In practice, HarfBuzz and other text-shaping engines
+	      are not generally concerned with graphemes. However, it
+	      is important for developers using HarfBuzz to recognize
+	      that there is a difference between graphemes and shaping
+	      clusters (see above). The two concepts may overlap
+	      frequently, but there is no guarantee that they will be
+	      identical.
+	    </para>
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term>syllable</term>
+	  <listitem>
+	    <para>
+	      In linguistics, a <emphasis>syllable</emphasis> is an 
+	      a sequence of sounds that makes up a building block of a
+	      particular language. Every language has its own set of
+	      rules describing what constitutes a valid syllable.
+	    </para>
+	    <para>
+	      For text-shaping purposes, the various definitions of
+	      "syllable" are important because script-specific shaping
+	      operations may be applied at the syllable level. For
+	      example, a reordering rule might specify that a vowel
+	      mark be reordered to the beginning of the syllable.
+	    </para>
+	    <para>
+	      Syllables will consist of one or more Unicode code
+	      points. The definition of a syllable for a particular
+	      writing system might correspond to how HarfBuzz
+	      identifies clusters (see above) for the same writing
+	      system. However, it is important for developers using
+	      HarfBuzz to recognize that there is a difference between
+	      syllables and shaping clusters. The two concepts may
+	      overlap frequently, but there is no guarantee that they
+	      will be identical.
+	    </para>
+	  </listitem>
+	</varlistentry>
+      </variablelist>
+    
+  </section>
+
+
+  <section>
+    <title>A simple shaping example</title>
+
+    <para>
+      Below is the simplest HarfBuzz shaping example possible.
+    </para>
+    <orderedlist numeration="arabic">
+      <listitem>
+	<para>
+          Create a buffer and put your text in it.
+	</para>
+      </listitem>
+    </orderedlist>
+    <programlisting language="C">
+      #include &lt;hb.h&gt;
+      hb_buffer_t *buf;
+      buf = hb_buffer_create();
+      hb_buffer_add_utf8(buf, text, -1, 0, -1);
+    </programlisting>
+    <orderedlist numeration="arabic">
+      <listitem override="2">
+	<para>
+          Guess the script, language and direction of the buffer.
+	</para>
+      </listitem>
+    </orderedlist>
+    <programlisting language="C">
+      hb_buffer_set_direction(buf, HB_DIRECTION_LTR);
+      hb_buffer_set_script(buf, HB_SCRIPT_LATIN);
+      hb_buffer_set_language(buf, hb_language_from_string("en", -1));
+    </programlisting>
+    <orderedlist numeration="arabic">
+      <listitem override="3">
+	<para>
+          Create a face and a font, using FreeType for now.
+	</para>
+      </listitem>
+    </orderedlist>
+    <programlisting language="C">
+      #include &lt;hb-ft.h&gt;
+      FT_New_Face(ft_library, font_path, index, &amp;face);
+      FT_Set_Char_Size(face, 0, 1000, 0, 0);
+      hb_font_t *font = hb_ft_font_create(face);
+    </programlisting>
+    <orderedlist numeration="arabic">
+      <listitem override="4">
+	<para>
+          Shape!
+	</para>
+      </listitem>
+    </orderedlist>
+    <programlisting>
+      hb_shape(font, buf, NULL, 0);
+    </programlisting>
+    <orderedlist numeration="arabic">
+      <listitem override="5">
+	<para>
+          Get the glyph and position information.
+	</para>
+      </listitem>
+    </orderedlist>
+    <programlisting language="C">
+      hb_glyph_info_t *glyph_info    = hb_buffer_get_glyph_infos(buf, &amp;glyph_count);
+      hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &amp;glyph_count);
+    </programlisting>
+    <orderedlist numeration="arabic">
+      <listitem override="6">
+	<para>
+          Iterate over each glyph.
+	</para>
+      </listitem>
+    </orderedlist>
+    <programlisting language="C">
+      for (i = 0; i &lt; glyph_count; ++i) {
+      glyphid = glyph_info[i].codepoint;
+      x_offset = glyph_pos[i].x_offset / 64.0;
+      y_offset = glyph_pos[i].y_offset / 64.0;
+      x_advance = glyph_pos[i].x_advance / 64.0;
+      y_advance = glyph_pos[i].y_advance / 64.0;
+      draw_glyph(glyphid, cursor_x + x_offset, cursor_y + y_offset);
+      cursor_x += x_advance;
+      cursor_y += y_advance;
+      }
+    </programlisting>
+    <orderedlist numeration="arabic">
+      <listitem override="7">
+	<para>
+          Tidy up.
+	</para>
+      </listitem>
+    </orderedlist>
+    <programlisting language="C">
+      hb_buffer_destroy(buf);
+      hb_font_destroy(hb_ft_font);
+    </programlisting>
+    
+    <para>
+      This example shows enough to get us started using HarfBuzz. In
+      the sections that follow, we will use the remainder of
+      HarfBuzz's API to refine and extend the example and improve its
+      text-shaping capabilities.
+    </para>
+  </section>
+</chapter>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-glyph-information.xml b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-glyph-information.xml
new file mode 100644
index 0000000..78f06c7
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-glyph-information.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+  <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
+  <!ENTITY version SYSTEM "version.xml">
+]>
+<sect1 id="glyph-information">
+  <title>Glyph information</title>
+  <sect2 id="names-and-numbers">
+    <title>Names and numbers</title>
+    <para>
+    </para>
+  </sect2>
+</sect1>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-install-harfbuzz.xml b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-install-harfbuzz.xml
new file mode 100644
index 0000000..a885d00
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-install-harfbuzz.xml
@@ -0,0 +1,430 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+  <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
+  <!ENTITY version SYSTEM "version.xml">
+]>
+<chapter id="install-harfbuzz">
+  <title>Installing HarfBuzz</title>
+  
+  <section id="download">
+    <title id="download.title">Downloading HarfBuzz</title>
+    <para>
+      The HarfBuzz source code is hosted at <ulink
+      url="https://github.com/harfbuzz/harfbuzz">github.com/harfbuzz/harfbuzz</ulink>. The
+      same source tree is also available at the
+      <ulink
+	  url="http://cgit.freedesktop.org/harfbuzz/">Freedesktop.org</ulink>
+      site.
+    </para>
+    <para>
+      Tarball releases and Win32 binary bundles (which include the
+      libharfbuzz DLL, hb-view.exe, hb-shape.exe, and all
+      dependencies) of HarfBuzz can be downloaded from <ulink
+      url="https://github.com/harfbuzz/harfbuzz">github.com/harfbuzz/harfbuzz/releases</ulink>
+      or from 
+      <ulink url="http://www.freedesktop.org/software/harfbuzz/release/">Freedesktop.org</ulink>.
+    </para>
+    <para>
+      Release notes are posted with each new release to provide an
+      overview of the changes. The project <ulink url="https://github.com/harfbuzz/harfbuzz/issues">tracks bug
+      reports and other issues</ulink> on GitHub. Discussion and
+      questions are welcome on the <ulink
+      url="http://freedesktop.org/mailman/listinfo/harfbuzz/">HarfBuzz
+      mailing list</ulink>.
+    </para>
+    <para>
+      The API included in the <filename
+      class='headerfile'>hb.h</filename> file will not change in a
+      compatibility-breaking way in any release. However, other,
+      peripheral headers are more likely to go through minor
+      modifications. We will do our best to never change APIs in an
+      incompatible way. We will <emphasis>never</emphasis> break the ABI. 
+    </para>
+  </section>
+  
+  <section id="building">
+    <title>Building HarfBuzz</title>
+
+    <section id="building.linux">
+      <title>Building on Linux</title>
+    <para>
+      <emphasis>(1)</emphasis> To build HarfBuzz on Linux, you must first install the
+      development packages for FreeType, Cairo, and GLib. The exact
+      commands required for this step will vary depending on
+      the Linux distribution you use.
+    </para>
+    <para>
+      For example, on an Ubuntu or Debian system, you would run:
+      <programlisting>
+	<command>sudo apt install</command> <package>gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev</package>
+      </programlisting>
+      On Fedora, RHEL, CentOS, or other Red-Hat&ndash;based systems, you would run:
+      <programlisting>
+	<command>sudo yum install</command> <package>gcc gcc-c++ freetype-devel glib2-devel cairo-devel</package>
+      </programlisting>
+
+    </para>
+    
+    <para>
+      <emphasis>(2)</emphasis> The next step depends on whether you
+      are building from the source in a downloaded release tarball or
+      from the source directly from the git repository.
+    </para>
+    <para>
+      <emphasis>(2)(a)</emphasis> If you downloaded the HarfBuzz
+      source code in a tarball, you can now extract the source.
+    </para>
+    <para>
+      From a shell in the top-level directory of the extracted source
+      code, you can run <command>./configure</command> followed by
+      <command>make</command> as with any other standard package.
+    </para>
+    <para>
+      This should leave you with a shared
+      library in the <filename>src/</filename> directory, and a few
+      utility programs including <command>hb-view</command> and
+      <command>hb-shape</command> under the <filename>util/</filename>
+      directory.
+    </para>
+    <para>
+      <emphasis>(2)(b)</emphasis> If you are building from the source in the HarfBuzz git
+      repository, rather than installing from a downloaded tarball
+      release, then you must install two more auxiliary tools before you 
+      can build for the first time: <package>pkg-config</package> and
+      <ulink url="http://www.complang.org/ragel/">ragel</ulink>.
+    </para>
+    <para>
+      On Ubuntu or Debian, run:
+      <programlisting>
+	<command>sudo apt-get install</command> <package>autoconf automake libtool pkg-config ragel gtk-doc-tools</package>
+      </programlisting>
+      On Fedora, RHEL, CentOS, run:
+      <programlisting>
+	<command>sudo yum install</command> <package>autoconf automake libtool pkgconfig ragel gtk-doc</package>
+      </programlisting>
+      
+    </para>
+    <para>
+      With <package>pkg-config</package> and <package>ragel</package>
+      installed, you can now run <command>./autogen.sh</command>,
+      followed by <command>./configure</command> and
+      <command>make</command> to build HarfBuzz.
+    </para>
+    </section>
+
+    
+    <section id="building.windows">
+      <title>Building on Windows</title>
+
+      <para>
+	On Windows, consider using Microsoft's free <ulink
+	url="https://github.com/Microsoft/vcpkg">vcpkg</ulink> utility
+	to build HarfBuzz, its dependencies, and other open-source
+	libraries. 
+      </para>
+      <para>
+	If you need to build HarfBuzz from source, first put the
+	<package>ragel</package> binary on your
+	<literal>PATH</literal>, then follow the appveyor CI cmake
+	<ulink
+	    url="https://github.com/harfbuzz/harfbuzz/blob/master/appveyor.yml">build
+	instructions</ulink>. 
+      </para>
+    </section>
+
+    
+    <section id="building.macos">
+      <title>Building on macOS</title>
+
+      <para>
+	There are two ways to build HarfBuzz on Mac systems: MacPorts
+	and Homebrew. The process is similar to the process used on a
+	Linux system.
+      </para>
+      <para>
+	<emphasis>(1)</emphasis> You must first install the
+	development packages for FreeType, Cairo, and GLib. If you are
+	using MacPorts, you should run:
+      <programlisting>
+	<command>sudo port install</command> <package>freetype glib2 cairo</package>
+      </programlisting>
+      </para>
+      <para>
+	If you are using Homebrew, you should run:
+	<programlisting>	
+	  <command>brew install</command> <package>freetype glib cairo</package>
+	</programlisting>
+      </para>
+      <para>
+	<emphasis>(2)</emphasis> The next step depends on whether you are building from the
+	source in a downloaded release tarball or from the source directly
+	from the git repository.
+      </para>
+      <para>
+	<emphasis>(2)(a)</emphasis> If you are installing HarfBuzz
+	from a downloaded tarball release, extract the tarball and
+	open a Terminal in the extracted source-code directory. Run:
+	<programlisting>
+	  <command>./configure</command>
+	</programlisting>
+	followed by:
+	<programlisting>	
+	  <command>make</command>
+	</programlisting>
+	to build HarfBuzz.
+      </para>
+      <para>
+	<emphasis>(2)(b)</emphasis> Alternatively, if you are building
+	HarfBuzz from the source in the HarfBuzz git repository, then
+	you must install several built-time dependencies before
+	proceeding.
+      </para>
+      <para>If you are
+	using MacPorts, you should run:
+      <programlisting>
+	<command>sudo port install</command> <package>autoconf automake libtool pkgconfig ragel gtk-doc</package> 
+      </programlisting>
+      to install the build dependencies.
+      </para>
+      <para>If you are using Homebrew, you should run:
+	<programlisting>	
+	  <command>brew install</command> <package>autoconf automake libtool pkgconfig ragel gtk-doc</package>
+	</programlisting>
+      	Finally, you can run:
+	<programlisting>
+	  <command>./autogen.sh</command>
+	</programlisting>
+      </para>
+      <para>
+	<emphasis>(3)</emphasis> You can now build HarfBuzz (on either
+	a MacPorts or a Homebrew system) by running:
+	<programlisting>
+	  <command>./configure</command>
+	</programlisting>
+	followed by:
+	<programlisting>
+	  <command>make</command>
+	</programlisting>
+      </para>
+      <para>
+	This should leave you with a shared
+	library in the <filename>src/</filename> directory, and a few
+	utility programs including <command>hb-view</command> and
+	<command>hb-shape</command> under the <filename>util/</filename>
+	directory.
+      </para>      
+	
+    </section>
+
+    <section id="configuration">
+      <title>Configuration options</title>
+
+      <para>
+	The instructions in the "Building HarfBuzz" section will build
+	the source code under its default configuration. If needed,
+	the following additional configuration options are available.
+      </para>
+
+      <variablelist>
+	<?dbfo list-presentation="blocks"?> 
+	<varlistentry>
+	  <term><command>--with-libstdc++</command></term>
+	  <listitem>
+	    <para>
+	      Allow linking with libstdc++. <emphasis>(Default = no)</emphasis>
+	    </para>
+	    <para>
+	      This option enables or disables linking HarfBuzz to the
+	      system's libstdc++ library.
+	    </para>
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term><command>--with-glib</command></term>
+	  <listitem>
+	    <para>
+	     Use <ulink url="https://developer.gnome.org/glib/">GLib</ulink>. <emphasis>(Default = auto)</emphasis>
+	    </para>	    
+	    <para>
+	      This option enables or disables usage of the GLib
+	      library.  The default setting is to check for the
+	      presence of GLib and, if it is found, build with
+	      GLib support. GLib is native to GNU/Linux systems but is
+	      available on other operating system as well.
+	    </para>
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term><command>--with-gobject</command></term>
+	  <listitem>
+	    <para>
+	      Use <ulink url="https://developer.gnome.org/gobject/stable/">GObject</ulink>. <emphasis>(Default = no)</emphasis>
+	    </para>	   
+	    <para>
+	      This option enables or disables usage of the GObject
+	      library. The default setting is to check for the
+	      presence of GObject and, if it is found, build with
+	      GObject support. GObject is native to GNU/Linux systems but is
+	      available on other operating system as well.
+	    </para> 
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term><command>--with-cairo</command></term>
+	  <listitem>
+	    <para>
+	      Use <ulink url="https://cairographics.org/">Cairo</ulink>. <emphasis>(Default = auto)</emphasis>
+	    </para>	   
+	    <para>
+	      This option enables or disables usage of the Cairo
+	      graphics-rendering library. The default setting is to
+	      check for the presence of Cairo and, if it is found,
+	      build with Cairo support.
+	    </para>
+	    <para>
+	      Note: Cairo is used only by the HarfBuzz
+	      command-line utilities, and not by the HarfBuzz library.
+	    </para>
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term><command>--with-fontconfig</command></term>
+	  <listitem>
+	    <para>
+	      Use <ulink url="https://www.freedesktop.org/wiki/Software/fontconfig/">Fontconfig</ulink>. <emphasis>(Default = auto)</emphasis>
+	    </para>	    
+	    <para>
+	      This option enables or disables usage of the Fontconfig
+	      library, which provides font-matching functions and
+	      provides access to font properties. The default setting
+	      is to check for the presence of Fontconfig and, if it is
+	      found, build with Fontconfig support.
+	    </para>
+	    <para>
+	      Note: Fontconfig is used only by the HarfBuzz
+	      command-line utilities, and not by the HarfBuzz library.
+	    </para>
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term><command>--with-icu</command></term>
+	  <listitem>
+	    <para>
+	      Use the <ulink url="http://site.icu-project.org/home">ICU</ulink> library. <emphasis>(Default = auto)</emphasis>
+	    </para>	    
+	    <para>
+	      This option enables or disables usage of the
+	      <emphasis>International Components for
+	      Unicode</emphasis> (ICU) library, which provides access
+	      to Unicode Character Database (UCD) properties as well
+	      as normalization and conversion functions. The default
+	      setting is to check for the presence of ICU and, if it
+	      is found, build with ICU support.
+	    </para>
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term><command>--with-ucdn</command></term>
+	  <listitem>
+	    <para>
+	      Use HarfBuzz's <ulink url="https://github.com/harfbuzz/harfbuzz/tree/master/src/hb-ucdn">built-in UCDN library</ulink>. <emphasis>(Default = auto)</emphasis>
+	    </para>	    
+	    <para>
+	      The HarfBuzz source tree includes a <emphasis>Unicode
+	      Database and Normalization</emphasis> (UCDN) library
+	      that provides access to basic character properties in
+	      the Unicode Character Database (UCD) as well as low-level
+	      normalization functions. HarfBuzz can be built without
+	      this UCDN support if the usage of a different UCDN
+	      library is desired.
+	    </para>
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term><command>--with-graphite2</command></term>
+	  <listitem>
+	    <para>
+	      Use the <ulink url="http://graphite.sil.org/">Graphite2</ulink> library. <emphasis>(Default = no)</emphasis>
+	    </para>	    
+	    <para>
+	      This option enables or disables usage of the Graphite2
+	      library, which provides support for the Graphite shaping
+	      model. 
+	    </para>
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term><command>--with-freetype</command></term>
+	  <listitem>
+	    <para>
+	      Use the <ulink url="https://www.freetype.org/">FreeType</ulink> library. <emphasis>(Default = auto)</emphasis>
+	    </para>	    
+	    <para>
+	      This option enables or disables usage of the FreeType
+	      font-rendering library. The default setting is to check for the
+	      presence of FreeType and, if it is found, build with
+	      FreeType support.
+	    </para>
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term><command>--with-uniscribe</command></term>
+	  <listitem>
+	    <para>
+	      Use the <ulink
+	      url="https://docs.microsoft.com/en-us/windows/desktop/intl/uniscribe">Uniscribe</ulink>
+	      library (experimental). <emphasis>(Default = no)</emphasis>
+	    </para>	    
+	    <para>
+	      This option enables or disables usage of the Uniscribe
+	      font-rendering library. Uniscribe is available on
+	      Windows systems. Uniscribe support is used only for
+	      testing purposes and does not need to be enabled for
+	      HarfBuzz to run on Windows systems.
+	    </para>
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term><command>--with-directwrite</command></term>
+	  <listitem>
+	    <para>
+	      Use the <ulink url="https://docs.microsoft.com/en-us/windows/desktop/directwrite/direct-write-portal">DirectWrite</ulink> library (experimental). <emphasis>(Default = no)</emphasis>
+	    </para>	    
+	    <para>
+	      This option enables or disables usage of the DirectWrite
+	      font-rendering library. DirectWrite is available on
+	      Windows systems. DirectWrite support is used only for
+	      testing purposes and does not need to be enabled for
+	      HarfBuzz to run on Windows systems.
+	    </para>
+	  </listitem>
+	</varlistentry>
+	
+	<varlistentry>
+	  <term><command>--with-coretext</command></term>
+	  <listitem>
+	    <para>
+	      Use the <ulink url="https://developer.apple.com/documentation/coretext">CoreText</ulink> library. <emphasis>(Default = no)</emphasis>
+	    </para>	    
+	    <para>
+	      This option enables or disables usage of the CoreText
+	      library. CoreText is available on macOS and iOS systems.
+	    </para>
+	  </listitem>
+	</varlistentry>	
+      </variablelist>
+    </section>
+    
+  </section>
+</chapter>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-opentype-features.xml b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-opentype-features.xml
new file mode 100644
index 0000000..51ff55a
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-opentype-features.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+  <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
+  <!ENTITY version SYSTEM "version.xml">
+]>
+<chapter id="shaping-and-shape-plans">
+  <title>Shaping and shape plans</title>
+  <section id="opentype-features">
+    <title>OpenType features</title>
+    <para>
+    </para>
+  </section>
+  <section id="plans-and-caching">
+    <title>Plans and caching</title>
+    <para>
+    </para>
+  </section>
+</chapter>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-shaping-concepts.xml b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-shaping-concepts.xml
new file mode 100644
index 0000000..db4e309
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-shaping-concepts.xml
@@ -0,0 +1,375 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+  <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
+  <!ENTITY version SYSTEM "version.xml">
+]>
+<chapter id="shaping-concepts">
+  <title>Shaping concepts</title>
+  <section id="text-shaping-concepts">
+    <title>Text shaping</title>
+    <para>
+      Text shaping is the process of transforming a sequence of Unicode
+      codepoints that represent individual characters (letters,
+      diacritics, tone marks, numbers, symbols, etc.) into the
+      orthographically and linguistically correct two-dimensional layout
+      of glyph shapes taken from a specified font.
+    </para>
+    <para>
+      For some writing systems (or <emphasis>scripts</emphasis>) and
+      languages, the process is simple, requiring the shaper to do
+      little more than advance the horizontal position forward by the
+      correct amount for each successive glyph.
+    </para>
+    <para>
+      But, for <emphasis>complex scripts</emphasis>, any combination of
+      several shaping operations may be required, and the rules for how
+      and when they are applied vary from script to script. HarfBuzz and
+      other shaping engines implement these rules.
+    </para>
+    <para>
+      The exact rules and necessary operations for a particular script
+      constitute a shaping <emphasis>model</emphasis>. OpenType
+      specifies a set of shaping models that covers all of
+      Unicode. Other shaping models are available, however, including
+      Graphite and Apple Advanced Typography (AAT). 
+    </para>
+  </section>
+  
+  <section id="complex-scripts">
+    <title>Complex scripts</title>
+    <para>
+      In text-shaping terminology, scripts are generally classified as
+      either <emphasis>complex</emphasis> or <emphasis>non-complex</emphasis>.
+    </para>
+    <para>
+      Complex scripts are those for which transforming the input
+      sequence into the final layout requires some combination of
+      operations&mdash;such as context-dependent substitutions,
+      context-dependent mark positioning, glyph-to-glyph joining,
+      glyph reordering, or glyph stacking.
+    </para>
+    <para>
+      In some complex scripts, the shaping rules require that a text
+      run be divided into syllables before the operations can be
+      applied. Other complex scripts may apply shaping operations over
+      entire words or over the entire text run, with no subdivision
+      required.
+    </para>
+    <para>
+      Non-complex scripts, by definition, do not require these
+      operations. However, correctly shaping a text run in a
+      non-complex script may still involve Unicode normalization,
+      ligature substitutions, mark positioning, kerning, and applying
+      other font features. The key difference is that a text run in a
+      non-complex script can be processed sequentially and in the same
+      order as the input sequence of Unicode codepoints, without
+      requiring an analysis stage.
+    </para>
+  </section>
+  
+  <section id="shaping-operations">
+    <title>Shaping operations</title>
+    <para>
+      Shaping a complex-script text run involves transforming the
+      input sequence of Unicode codepoints with some combination of
+      operations that is specified in the shaping model for the
+      script.
+    </para>
+    <para>
+      The specific conditions that trigger a given operation for a
+      text run varies from script to script, as do the order that the
+      operations are performed in and which codepoints are
+      affected. However, the same general set of shaping operations is
+      common to all of the complex-script shaping models. 
+    </para>
+    
+    <itemizedlist>
+      <listitem>
+	<para>
+	  A <emphasis>reordering</emphasis> operation moves a glyph
+	  from its original ("logical") position in the sequence to
+	  some other ("visual") position.
+	</para>
+	<para>
+	  The shaping model for a given complex script might involve
+	  more than one reordering step.
+	</para>
+      </listitem>
+      
+      <listitem>
+	<para>
+	  A <emphasis>joining</emphasis> operation replaces a glyph
+	  with an alternate form that is designed to connect with one
+	  or more of the adjacent glyphs in the sequence.
+	</para>
+      </listitem>
+      
+      <listitem>
+	<para>
+	  A contextual <emphasis>substitution</emphasis> operation
+	  replaces either a single glyph or a subsequence of several
+	  glyphs with an alternate glyph. This substitution is
+	  performed when the original glyph or subsequence of glyphs
+	  occurs in a specified position with respect to the
+	  surrounding sequence. For example, one substitution might be
+	  performed only when the target glyph is the first glyph in
+	  the sequence, while another substitution is performed only
+	  when a different target glyph occurs immediately after a
+	  particular string pattern.
+	</para>
+	<para>
+	  The shaping model for a given complex script might involve
+	  multiple contextual-substitution operations, each applying
+	  to different target glyphs and patterns, and which are
+	  performed in separate steps.
+	</para>
+      </listitem>
+      
+      <listitem>
+	<para>
+	  A contextual <emphasis>positioning</emphasis> operation
+	  moves the horizontal and/or vertical position of a
+	  glyph. This positioning move is performed when the glyph
+	  occurs in a specified position with respect to the
+	  surrounding sequence.
+	</para>
+	<para>
+	  Many contextual positioning operations are used to place
+	  <emphasis>mark</emphasis> glyphs (such as diacritics, vowel
+	  signs, and tone markers) with respect to
+	  <emphasis>base</emphasis> glyphs. However, some complex
+	  scripts may use contextual positioning operations to
+	  correctly place base glyphs as well, such as
+	  when the script uses <emphasis>stacking</emphasis> characters.
+	</para>
+      </listitem>
+      
+    </itemizedlist>
+  </section>
+  
+  <section id="unicode-character-categories">
+    <title>Unicode character categories</title>
+    <para>
+      Shaping models are typically specified with respect to how
+      scripts are defined in the Unicode standard.
+    </para>
+    <para>
+      Every codepoint in the Unicode Character Database (UCD) is
+      assigned a <emphasis>Unicode General Category</emphasis> (UGC),
+      which provides the most fundamental information about the
+      codepoint: whether the codepoint represents a
+      <emphasis>Letter</emphasis>, a <emphasis>Mark</emphasis>, a
+      <emphasis>Number</emphasis>, <emphasis>Punctuation</emphasis>, a
+      <emphasis>Symbol</emphasis>, a <emphasis>Separator</emphasis>,
+      or something else (<emphasis>Other</emphasis>).
+    </para>
+    <para>
+      These UGC properties are "Major" categories. Each codepoint is
+      further assigned to a "minor" category within its Major
+      category, such as "Letter, uppercase" (<literal>Lu</literal>) or
+      "Letter, modifier" (<literal>Lm</literal>).
+    </para>
+    <para>
+      Shaping models are concerned primarily with Letter and Mark
+      codepoints. The minor categories of Mark codepoints are
+      particularly important for shaping. Marks can be nonspacing
+      (<literal>Mn</literal>), spacing combining
+      (<literal>Mc</literal>), or enclosing (<literal>Me</literal>).
+    </para>
+    <para>
+      In addition to the UGC property, codepoints in the Indic and
+      Southeast Asian scripts are also assigned
+      <emphasis>Unicode Indic Syllabic Category</emphasis> (UISC) and
+      <emphasis>Unicode Indic Positional Category</emphasis> (UIPC)
+      properties that provide more detailed information needed for
+      shaping.
+    </para>
+    <para>
+      The UISC property sub-categorizes Letters and Marks according to
+      common script-shaping behaviors. For example, UISC distinguishes
+      between consonant letters, vowel letters, and vowel marks. The
+      UIPC property sub-categorizes Mark codepoints by the relative visual
+      position that they occupy (above, below, right, left, or in
+      multiple positions).
+    </para>
+    <para>
+      Some complex scripts require that the text run be split into
+      syllables. What constitutes a valid syllable in these
+      scripts is specified in regular expressions, formed from the
+      Letter and Mark codepoints, that take the UISC and UIPC
+      properties into account.
+    </para>
+
+  </section>
+  
+  <section id="text-runs">
+    <title>Text runs</title>
+    <para>
+      Real-world text usually contains codepoints from a mixture of
+      different Unicode scripts (including punctuation, numbers, symbols,
+      white-space characters, and other codepoints that do not belong
+      to any script). Real-world text may also be marked up with
+      formatting that changes font properties (including the font,
+      font style, and font size).
+    </para>
+    <para>
+      For shaping purposes, all real-world text streams must be first
+      segmented into runs that have a uniform set of properties. 
+    </para>
+    <para>
+      In particular, shaping models always assume that every codepoint
+      in a text run has the same <emphasis>direction</emphasis>,
+      <emphasis>script</emphasis> tag, and
+      <emphasis>language</emphasis> tag.
+    </para>
+  </section>
+  
+  <section id="opentype-shaping-models">
+    <title>OpenType shaping models</title>
+    <para>
+      OpenType provides shaping models for the following scripts:
+    </para>
+
+    <itemizedlist>
+      <listitem>
+	<para>
+	  The <emphasis>default</emphasis> shaping model handles all
+	  non-complex scripts, and may also be used as a fallback for
+	  handling unrecognized scripts.
+	</para>
+      </listitem>
+
+      <listitem>
+	<para>
+	  The <emphasis>Indic</emphasis> shaping model handles the Indic
+	  scripts Bengali, Devanagari, Gujarati, Gurmukhi, Kannada,
+	  Malayalam, Oriya, Tamil, Telugu, and Sinhala.
+	</para>
+	<para>
+	  The Indic shaping model was revised significantly in
+	  2005. To denote the change, a new set of <emphasis>script
+	  tags</emphasis> was assigned for Bengali, Devanagari,
+	  Gujarati, Gurmukhi, Kannada, Malayalam, Oriya, Tamil, and
+	  Telugu. For the sake of clarity, the term "Indic2" is
+	  sometimes used to refer to the current, revised shaping
+	  model.
+	</para>
+      </listitem>
+
+      <listitem>
+	<para>
+	  The <emphasis>Arabic</emphasis> shaping model supports
+	  Arabic, Mongolian, N'Ko, Syriac, and several other connected
+	  or cursive scripts.
+	</para>
+      </listitem>
+
+      <listitem>
+	<para>
+	  The <emphasis>Thai/Lao</emphasis> shaping model supports
+	  the Thai and Lao scripts.
+	</para>
+      </listitem>
+
+      <listitem>
+	<para>
+	  The <emphasis>Khmer</emphasis> shaping model supports the
+	  Khmer script.
+	</para>
+      </listitem>
+
+      <listitem>
+	<para>
+	  The <emphasis>Myanmar</emphasis> shaping model supports the
+	  Myanmar (or Burmese) script.
+	</para>
+      </listitem>
+
+      <listitem>
+	<para>
+	  The <emphasis>Tibetan</emphasis> shaping model supports the
+	  Tibetan script.
+	</para>
+      </listitem>
+
+      <listitem>
+	<para>
+	  The <emphasis>Hangul</emphasis> shaping model supports the
+	  Hangul script.
+	</para>
+      </listitem>
+
+      <listitem>
+	<para>
+	  The <emphasis>Hebrew</emphasis> shaping model supports the
+	  Hebrew script.
+	</para>
+      </listitem>
+
+      <listitem>
+	<para>
+	  The <emphasis>Universal Shaping Engine</emphasis> (USE)
+	  shaping model supports complex scripts not covered by one of
+	  the above, script-specific shaping models, including
+	  Javanese, Balinese, Buginese, Batak, Chakma, Lepcha, Modi,
+	  Phags-pa, Tagalog, Siddham, Sundanese, Tai Le, Tai Tham, Tai
+	  Viet, and many others. 
+	</para>
+      </listitem>
+
+      <listitem>
+	<para>
+	  Text runs that do not fall under one of the above shaping
+	  models may still require processing by a shaping engine. Of
+	  particular note is <emphasis>Emoji</emphasis> shaping, which
+	  may involve variation-selector sequences and glyph
+	  substitution. Emoji shaping is handled by the default
+	  shaping model.
+	</para>
+      </listitem>
+
+    </itemizedlist>
+    
+  </section>
+  
+  <section id="graphite-shaping">
+    <title>Graphite shaping</title>
+    <para>
+      In contrast to OpenType shaping, Graphite shaping does not
+      specify a predefined set of shaping models or a set of supported
+      scripts.
+    </para>
+    <para>
+      Instead, each Graphite font contains a complete set of rules that
+      implement the required shaping model for the intended
+      script. These rules include finite-state machines to match
+      sequences of codepoints to the shaping operations to perform.
+    </para>
+    <para>
+      Graphite shaping can perform the same shaping operations used in
+      OpenType shaping, as well as other functions that have not been
+      defined for OpenType shaping.
+    </para>
+  </section>
+  
+  <section id="aat-shaping">
+    <title>AAT shaping</title>
+    <para>
+      In contrast to OpenType shaping, AAT shaping does not specify a 
+      predefined set of shaping models or a set of supported scripts.
+    </para>
+    <para>
+      Instead, each AAT font includes a complete set of rules that
+      implement the desired shaping model for the intended
+      script. These rules include finite-state machines to match glyph
+      sequences and the shaping operations to perform.
+    </para>
+    <para>
+      Notably, AAT shaping rules are expressed for glyphs in the font,
+      not for Unicode codepoints. AAT shaping can perform the same
+      shaping operations used in OpenType shaping, as well as other
+      functions that have not been defined for OpenType shaping.
+    </para>
+  </section>
+</chapter>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-what-is-harfbuzz.xml b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-what-is-harfbuzz.xml
new file mode 100644
index 0000000..ed053f9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/usermanual-what-is-harfbuzz.xml
@@ -0,0 +1,442 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+  <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
+  <!ENTITY version SYSTEM "version.xml">
+]>
+<chapter id="what-is-harfbuzz">
+  <title>What is HarfBuzz?</title>
+  <para>
+    HarfBuzz is a <emphasis>text-shaping engine</emphasis>. If you
+    give HarfBuzz a font and a string containing a sequence of Unicode
+    codepoints, HarfBuzz selects and positions the corresponding
+    glyphs from the font, applying all of the necessary layout rules
+    and font features. HarfBuzz then returns the string to you in the
+    form that is correctly arranged for the language and writing
+    system. 
+  </para>
+  <para>
+    HarfBuzz can properly shape all of the world's major writing
+    systems. It runs on all major operating systems and software
+    platforms and it supports the major font formats in use
+    today.
+  </para>
+  <section id="what-is-text-shaping">
+    <title>What is text shaping?</title>
+    <para>
+      Text shaping is the process of translating a string of character
+      codes (such as Unicode codepoints) into a properly arranged
+      sequence of glyphs that can be rendered onto a screen or into
+      final output form for inclusion in a document.
+    </para>
+    <para>
+      The shaping process is dependent on the input string, the active
+      font, the script (or writing system) that the string is in, and
+      the language that the string is in.
+    </para>
+    <para>
+      Modern software systems generally only deal with strings in the
+      Unicode encoding scheme (although legacy systems and documents may
+      involve other encodings).
+    </para>
+    <para>
+      There are several font formats that a program might
+      encounter, each of which has a set of standard text-shaping
+      rules.
+    </para>
+    <para>The dominant format is <ulink
+      url="http://www.microsoft.com/typography/otspec/">OpenType</ulink>. The
+    OpenType specification defines a series of <ulink url="https://github.com/n8willis/opentype-shaping-documents">shaping models</ulink> for
+    various scripts from around the world. These shaping models depend on
+    the font incorporating certain features as
+    <emphasis>lookups</emphasis> in its <literal>GSUB</literal> 
+    and <literal>GPOS</literal> tables.
+    </para>
+    <para>
+      Alternatively, OpenType fonts can include shaping features for
+      the <ulink url="https://graphite.sil.org/">Graphite</ulink> shaping model.
+    </para>
+    <para>
+      TrueType fonts can also include OpenType shaping
+      features. Alternatively, TrueType fonts can also include <ulink url="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html">Apple
+      Advanced Typography</ulink> (AAT) tables to implement shaping
+      support. AAT fonts are generally only found on macOS and iOS systems.
+    </para>
+    <para>
+      Text strings will usually be tagged with a script and language
+      tag that provide the context needed to perform text shaping
+      correctly.  The necessary <ulink
+      url="https://docs.microsoft.com/en-us/typography/opentype/spec/scripttags">script</ulink> 
+      and <ulink
+      url="https://docs.microsoft.com/en-us/typography/opentype/spec/languagetags">language</ulink>
+      tags are defined by OpenType.
+    </para>
+  </section>
+  
+  <section id="why-do-i-need-a-shaping-engine">
+    <title>Why do I need a shaping engine?</title>
+    <para>
+      Text shaping is an integral part of preparing text for
+      display. Before a Unicode sequence can be rendered, the
+      codepoints in the sequence must be mapped to the corresponding
+      glyphs provided in the font, and those glyphs must be positioned
+      correctly relative to each other. For many of the scripts
+      supported in Unicode, these steps involve script-specific layout
+      rules, including complex joining, reordering, and positioning
+      behavior. Implementing these rules is the job of the shaping engine.
+    </para>
+    <para>
+      Text shaping is a fairly low-level operation. HarfBuzz is
+      used directly by text-handling libraries like <ulink
+      url="https://www.pango.org/">Pango</ulink>, as well as by the layout
+      engines in Firefox, LibreOffice, and Chromium. Unless you are
+      <emphasis>writing</emphasis> one of these layout engines
+      yourself, you will probably not need to use HarfBuzz: normally,
+      a layout engine, toolkit, or other library will turn text into
+      glyphs for you.
+    </para>
+    <para>
+      However, if you <emphasis>are</emphasis> writing a layout engine
+      or graphics library yourself, then you will need to perform text
+      shaping, and this is where HarfBuzz can help you.
+    </para>
+    <para>
+      Here are some specific scenarios where a text-shaping engine
+      like HarfBuzz helps you:
+    </para>
+    <itemizedlist>
+      <listitem>
+        <para>
+          OpenType fonts contain a set of glyphs (that is, shapes
+	  to represent the letters, numbers, punctuation marks, and
+	  all other symbols), which are indexed by a <literal>glyph ID</literal>.
+	</para>
+	<para>
+          A particular glyph ID within the font does not necessarily
+	  correlate to a predictable Unicode codepoint. For instance,
+	  some fonts have the letter &quot;a&quot; as glyph ID 1, but
+	  many others do not. In order to retrieve the right glyph
+	  from the font to display &quot;a&quot;, you need to consult
+	  the table inside the font (the <literal>cmap</literal>
+	  table) that maps Unicode codepoints to glyph IDs. In other
+	  words, <emphasis>text shaping turns codepoints into glyph
+	  IDs</emphasis>.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Many OpenType fonts contain ligatures: combinations of
+          characters that are rendered as a single unit. For instance,
+	  it is common for the &quot;f, i&quot; letter
+	  sequence to appear in print as the single ligature glyph
+	  &quot;fi&quot;.
+	</para>
+	<para>
+	  Whether you should render an &quot;f, i&quot; sequence
+	  as <literal>fi</literal> or as &quot;fi&quot; does not
+          depend on the input text. Instead, it depends on the whether
+	  or not the font includes an &quot;fi&quot; glyph and on the
+	  level of ligature application you wish to perform. The font
+	  and the amount of ligature application used are under your
+	  control. In other words, <emphasis>text shaping involves
+	  querying the font's ligature tables and determining what
+	  substitutions should be made</emphasis>. 
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          While ligatures like &quot;fi&quot; are optional typographic
+          refinements, some languages <emphasis>require</emphasis> certain
+          substitutions to be made in order to display text correctly.
+        </para>
+	<para>
+	  For example, in Tamil, when the letter &quot;TTA&quot; (ட)
+	  letter is followed by &quot;U&quot; (உ), the pair
+	  must be replaced by the single glyph &quot;டு&quot;. The
+	  sequence of Unicode characters &quot;டஉ&quot; needs to be
+	  substituted with a single &quot;டு&quot; glyph from the
+	  font.
+	</para>
+	<para>
+	  But &quot;டு&quot; does not have a Unicode codepoint. To
+	  find this glyph, you need to consult the table inside 
+	  the font (the <literal>GSUB</literal> table) that contains
+	  substitution information. In other words, <emphasis>text shaping 
+	  chooses the correct glyph for a sequence of characters
+	  provided</emphasis>.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Similarly, each Arabic character has four different variants
+	  corresponding to the different positions it might appear in
+	  within a sequence. Inside a font, there will be separate
+	  glyphs for the initial, medial, final, and isolated forms of
+	  each letter, each at a different glyph ID.
+	</para>
+	<para>
+	  Unicode only assigns one codepoint per character, so a
+	  Unicode string will not tell you which glyph variant to use
+	  for each character. To decide, you need to analyze the whole
+	  string and determine the appropriate glyph for each character
+	  based on its position. In other words, <emphasis>text
+	  shaping chooses the correct form of the letter by its
+	  position and returns the correct glyph from the font</emphasis>.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Other languages involve marks and accents that need to be
+          rendered in specific positions relative a base character. For
+          instance, the Moldovan language includes the Cyrillic letter
+          &quot;zhe&quot; (ж) with a breve accent, like so: &quot;ӂ&quot;.
+	</para>
+	<para>
+	  Some fonts will provide this character as a single
+	  zhe-with-breve glyph, but other fonts will not and, instead,
+	  will expect the rendering engine to form the character by 
+          superimposing the separate &quot;ж&quot; and &quot;˘&quot;
+	  glyphs.
+	</para>
+	<para>
+	  But exactly where you should draw the breve depends on the
+	  height and width of the preceding zhe glyph. To find the
+	  right position, you need to consult the table inside
+	  the font (the <literal>GPOS</literal> table) that contains
+	  positioning information.
+          In other words, <emphasis>text shaping tells you whether you
+	  have a precomposed glyph within your font or if you need to
+	  compose a glyph yourself out of combining marks&mdash;and,
+	  if so, where to position those marks.</emphasis>
+        </para>
+      </listitem>
+    </itemizedlist>
+    <para>
+      If tasks like these are something that you need to do, then you
+      need a text shaping engine. You could use Uniscribe if you are
+      writing Windows software; you could use CoreText on macOS; or
+      you could use HarfBuzz.
+    </para>
+    <note>
+      <para>
+	In the rest of this manual, the text will assume that the reader
+	is that implementor of a text-layout engine.
+      </para>
+    </note>
+  </section>
+  
+
+  <section>
+    <title>What does HarfBuzz do?</title>
+    <para>
+      HarfBuzz provides text shaping through a cross-platform
+      C API that accepts sequences of Unicode codepoints as input. Currently,
+      the following OpenType shaping models are supported:
+    </para>
+    <itemizedlist>
+      <listitem>
+	<para>
+	  Indic (covering Devanagari, Bengali, Gujarati,
+	  Gurmukhi, Kannada, Malayalam, Oriya, Tamil, Telugu, and
+	  Sinhala)
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	  Arabic (covering Arabic, N'Ko, Syriac, and Mongolian)
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	  Thai and Lao
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	  Khmer
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	  Myanmar
+	</para>
+      </listitem>
+      
+      <listitem>
+	<para>
+	  Tibetan
+	</para>
+      </listitem>
+      
+      <listitem>
+	<para>
+	  Hangul
+	</para>
+      </listitem>
+      
+      <listitem>
+	<para>
+	  Hebrew
+	</para>
+      </listitem>      
+      <listitem>
+	<para>
+	  The Universal Shaping Engine or <emphasis>USE</emphasis>
+	  (covering complex scripts not covered by the above shaping
+	  models)
+	</para>
+      </listitem>      
+      <listitem>
+	<para>
+	  A default shaping model for non-complex scripts
+	  (covering Latin, Cyrillic, Greek, Armenian, Georgian, Tifinagh,
+	  and many others)
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	  Emoji (including emoji modifier sequences, flag sequences,
+	  and ZWJ sequences)
+	</para>
+      </listitem>
+    </itemizedlist>
+
+    <para>
+      In addition to OpenType shaping, HarfBuzz supports the latest
+      version of Graphite shaping (the "Graphite 2" model) and AAT
+      shaping.
+    </para>
+    
+    <para>
+      HarfBuzz can read and understand TrueType fonts (.ttf), TrueType
+      collections (.ttc), and OpenType fonts (.otf, including those
+      fonts that contain TrueType-style outlines and those that
+      contain PostScript CFF or CFF2 outlines).
+    </para>
+
+    <para>
+      HarfBuzz is designed and tested to run on top of the FreeType
+      font renderer. It can run on Linux, Android, Windows, macOS, and
+      iOS systems.
+    </para>
+    
+    <para>
+      In addition to its core shaping functionality, HarfBuzz provides
+      functions for accessing other font features, including optional
+      GSUB and GPOS OpenType features, as well as
+      all color-font formats (<literal>CBDT</literal>,
+      <literal>sbix</literal>, <literal>COLR/CPAL</literal>, and
+      <literal>SVG-OT</literal>) and OpenType variable fonts. HarfBuzz
+      also includes a font-subsetting feature. HarfBuzz can perform
+      some low-level math-shaping operations, although it does not
+      currently perform full shaping for mathematical typesetting.
+    </para>
+    
+    <para>
+      A suite of command-line utilities is also provided in the
+      source-code tree, designed to help users test and debug
+      HarfBuzz's features on real-world fonts and input.
+    </para>
+  </section>
+
+  <section id="what-harfbuzz-doesnt-do">
+    <title>What HarfBuzz doesn't do</title>
+    <para>
+      HarfBuzz will take a Unicode string, shape it, and give you the
+      information required to lay it out correctly on a single
+      horizontal (or vertical) line using the font provided. That is the
+      extent of HarfBuzz's responsibility.
+    </para>
+    <para>
+      It is important to note that if you are implementing a complete
+      text-layout engine you may have other responsibilities that
+      HarfBuzz will <emphasis>not</emphasis> help you with. For example:
+    </para>
+    <itemizedlist>
+      <listitem>
+        <para>
+          HarfBuzz won't help you with bidirectionality. If you want to
+          lay out text that includes a mix of Hebrew and English, you
+	  will need to ensure that each buffer provided to HarfBuzz
+	  has all of its characters in the same order and that the
+	  directionality of the buffer is set correctly. This may mean
+	  segmenting the text before it is placed into HarfBuzz buffers. In
+          other words, the user will hit the keys in the following
+          sequence:
+        </para>
+        <programlisting>
+	  A B C [space] ג ב א [space] D E F
+        </programlisting>
+        <para>
+          but will expect to see in the output:
+        </para>
+        <programlisting>
+	  ABC אבג DEF
+        </programlisting>
+        <para>
+          This reordering is called <emphasis>bidi processing</emphasis>
+          (&quot;bidi&quot; is short for bidirectional), and there's an
+          algorithm as an annex to the Unicode Standard which tells you how
+          to process a string of mixed directionality.
+          Before sending your string to HarfBuzz, you may need to apply the
+          bidi algorithm to it. Libraries such as <ulink
+	  url="http://icu-project.org/">ICU</ulink> and <ulink
+	  url="http://fribidi.org/">fribidi</ulink> can do this for you.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          HarfBuzz won't help you with text that contains different font
+          properties. For instance, if you have the string &quot;a
+          <emphasis>huge</emphasis> breakfast&quot;, and you expect
+          &quot;huge&quot; to be italic, then you will need to send three
+          strings to HarfBuzz: <literal>a</literal>, in your Roman font;
+          <literal>huge</literal> using your italic font; and
+          <literal>breakfast</literal> using your Roman font again.
+	</para>
+	<para>
+          Similarly, if you change the font, font size, script,
+	  language, or direction within your string, then you will
+	  need to shape each run independently and output them
+	  independently. HarfBuzz expects to shape a run of characters
+	  that all share the same properties.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          HarfBuzz won't help you with line breaking, hyphenation, or
+          justification. As mentioned above, HarfBuzz lays out the string
+          along a <emphasis>single line</emphasis> of, notionally,
+          infinite length. If you want to find out where the potential
+          word, sentence and line break points are in your text, you
+          could use the ICU library's break iterator functions.
+        </para>
+        <para>
+          HarfBuzz can tell you how wide a shaped piece of text is, which is
+          useful input to a justification algorithm, but it knows nothing
+          about paragraphs, lines or line lengths. Nor will it adjust the
+          space between words to fit them proportionally into a line.
+        </para>
+      </listitem>
+    </itemizedlist>
+    <para>
+      As a layout-engine implementor, HarfBuzz will help you with the
+      interface between your text and your font, and that's something
+      that you'll need&mdash;what you then do with the glyphs that your font
+      returns is up to you. 
+    </para>
+  </section>
+    
+  <section id="why-is-it-called-harfbuzz">
+    <title>Why is it called HarfBuzz?</title>
+    <para>
+      HarfBuzz began its life as text-shaping code within the FreeType
+      project (and you will see references to the FreeType authors
+      within the source code copyright declarations), but was then
+      extracted out to its own project. This project is maintained by
+      Behdad Esfahbod, who named it HarfBuzz. Originally, it was a
+      shaping engine for OpenType fonts&mdash;&quot;HarfBuzz&quot; is
+      the Persian for &quot;open type&quot;.
+    </para>
+  </section>
+</chapter>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/version.xml b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/version.xml
new file mode 100644
index 0000000..2bf1c1c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/version.xml
@@ -0,0 +1 @@
+2.3.1
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/version.xml.in b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/version.xml.in
new file mode 100644
index 0000000..de213c2
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/docs/version.xml.in
@@ -0,0 +1 @@
+@HB_VERSION@
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/gtk-doc.make b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/gtk-doc.make
new file mode 100644
index 0000000..2454c28
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/gtk-doc.make
@@ -0,0 +1,305 @@
+# -*- mode: makefile -*-
+
+####################################
+# Everything below here is generic #
+####################################
+
+if GTK_DOC_USE_LIBTOOL
+GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+GTKDOC_RUN = $(LIBTOOL) --mode=execute
+else
+GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+GTKDOC_RUN =
+endif
+
+# We set GPATH here; this gives us semantics for GNU make
+# which are more like other make's VPATH, when it comes to
+# whether a source that is a target of one rule is then
+# searched for in VPATH/GPATH.
+#
+GPATH = $(srcdir)
+
+TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
+
+SETUP_FILES = \
+	$(content_files)		\
+	$(expand_content_files)		\
+	$(DOC_MAIN_SGML_FILE)		\
+	$(DOC_MODULE)-sections.txt	\
+	$(DOC_MODULE)-overrides.txt
+
+EXTRA_DIST = 				\
+	$(HTML_IMAGES)			\
+	$(SETUP_FILES)
+
+DOC_STAMPS=setup-build.stamp scan-build.stamp sgml-build.stamp \
+	html-build.stamp pdf-build.stamp \
+	sgml.stamp html.stamp pdf.stamp
+
+SCANOBJ_FILES = 		 \
+	$(DOC_MODULE).args 	 \
+	$(DOC_MODULE).hierarchy  \
+	$(DOC_MODULE).interfaces \
+	$(DOC_MODULE).prerequisites \
+	$(DOC_MODULE).signals
+
+REPORT_FILES = \
+	$(DOC_MODULE)-undocumented.txt \
+	$(DOC_MODULE)-undeclared.txt \
+	$(DOC_MODULE)-unused.txt
+
+gtkdoc-check.test: Makefile
+	$(AM_V_GEN)echo "#!/bin/sh -e" > $@; \
+		echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \
+		chmod +x $@
+
+CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test
+
+if GTK_DOC_BUILD_HTML
+HTML_BUILD_STAMP=html-build.stamp
+else
+HTML_BUILD_STAMP=
+endif
+if GTK_DOC_BUILD_PDF
+PDF_BUILD_STAMP=pdf-build.stamp
+else
+PDF_BUILD_STAMP=
+endif
+
+all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
+.PHONY: all-gtk-doc
+
+if ENABLE_GTK_DOC
+all-local: all-gtk-doc
+endif
+
+docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
+
+$(REPORT_FILES): sgml-build.stamp
+
+#### setup ####
+
+GTK_DOC_V_SETUP=$(GTK_DOC_V_SETUP_$(V))
+GTK_DOC_V_SETUP_=$(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY))
+GTK_DOC_V_SETUP_0=@echo "  DOC   Preparing build";
+
+setup-build.stamp:
+	-$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+	    files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \
+	    if test "x$$files" != "x" ; then \
+	        for file in $$files ; do \
+	            destdir=`dirname $(abs_builddir)/$$file`; \
+	            test -d "$$destdir" || mkdir -p "$$destdir"; \
+	            test -f $(abs_srcdir)/$$file && \
+	                cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \
+	        done; \
+	    fi; \
+	fi
+	$(AM_V_at)touch setup-build.stamp
+
+
+#### scan ####
+
+GTK_DOC_V_SCAN=$(GTK_DOC_V_SCAN_$(V))
+GTK_DOC_V_SCAN_=$(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY))
+GTK_DOC_V_SCAN_0=@echo "  DOC   Scanning header files";
+
+GTK_DOC_V_INTROSPECT=$(GTK_DOC_V_INTROSPECT_$(V))
+GTK_DOC_V_INTROSPECT_=$(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY))
+GTK_DOC_V_INTROSPECT_0=@echo "  DOC   Introspecting gobjects";
+
+scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
+	$(GTK_DOC_V_SCAN)_source_dir='' ; \
+	for i in $(DOC_SOURCE_DIR) ; do \
+	    _source_dir="$${_source_dir} --source-dir=$$i" ; \
+	done ; \
+	gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES)
+	$(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
+	    scanobj_options=""; \
+	    gtkdoc-scangobj 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+	    if test "$$?" = "0"; then \
+	        if test "x$(V)" = "x1"; then \
+	            scanobj_options="--verbose"; \
+	        fi; \
+	    fi; \
+	    CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \
+	    gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \
+	else \
+	    for i in $(SCANOBJ_FILES) ; do \
+	        test -f $$i || touch $$i ; \
+	    done \
+	fi
+	$(AM_V_at)touch scan-build.stamp
+
+$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
+	@true
+
+#### xml ####
+
+GTK_DOC_V_XML=$(GTK_DOC_V_XML_$(V))
+GTK_DOC_V_XML_=$(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY))
+GTK_DOC_V_XML_0=@echo "  DOC   Building XML";
+
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent
+	$(GTK_DOC_V_XML)_source_dir='' ; \
+	for i in $(DOC_SOURCE_DIR) ; do \
+	    _source_dir="$${_source_dir} --source-dir=$$i" ; \
+	done ; \
+	gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS)
+	$(AM_V_at)touch sgml-build.stamp
+
+sgml.stamp: sgml-build.stamp
+	@true
+
+xml/gtkdocentities.ent: Makefile
+	$(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \
+		echo "<!ENTITY package \"$(PACKAGE)\">"; \
+		echo "<!ENTITY package_bugreport \"$(PACKAGE_BUGREPORT)\">"; \
+		echo "<!ENTITY package_name \"$(PACKAGE_NAME)\">"; \
+		echo "<!ENTITY package_string \"$(PACKAGE_STRING)\">"; \
+		echo "<!ENTITY package_tarname \"$(PACKAGE_TARNAME)\">"; \
+		echo "<!ENTITY package_url \"$(PACKAGE_URL)\">"; \
+		echo "<!ENTITY package_version \"$(PACKAGE_VERSION)\">"; \
+	) > $@
+
+#### html ####
+
+GTK_DOC_V_HTML=$(GTK_DOC_V_HTML_$(V))
+GTK_DOC_V_HTML_=$(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY))
+GTK_DOC_V_HTML_0=@echo "  DOC   Building HTML";
+
+GTK_DOC_V_XREF=$(GTK_DOC_V_XREF_$(V))
+GTK_DOC_V_XREF_=$(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY))
+GTK_DOC_V_XREF_0=@echo "  DOC   Fixing cross-references";
+
+html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
+	$(GTK_DOC_V_HTML)rm -rf html && mkdir html && \
+	mkhtml_options=""; \
+	gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+	if test "$$?" = "0"; then \
+	  if test "x$(V)" = "x1"; then \
+	    mkhtml_options="$$mkhtml_options --verbose"; \
+	  fi; \
+	fi; \
+	gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-path"; \
+	if test "$$?" = "0"; then \
+	  mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
+	fi; \
+	cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
+	-@test "x$(HTML_IMAGES)" = "x" || \
+	for file in $(HTML_IMAGES) ; do \
+	  if test -f $(abs_srcdir)/$$file ; then \
+	    cp $(abs_srcdir)/$$file $(abs_builddir)/html; \
+	  fi; \
+	  if test -f $(abs_builddir)/$$file ; then \
+	    cp $(abs_builddir)/$$file $(abs_builddir)/html; \
+	  fi; \
+	  test -f $$file && cp $$file $(abs_builddir)/html; \
+	done;
+	$(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
+	$(AM_V_at)touch html-build.stamp
+
+#### pdf ####
+
+GTK_DOC_V_PDF=$(GTK_DOC_V_PDF_$(V))
+GTK_DOC_V_PDF_=$(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY))
+GTK_DOC_V_PDF_0=@echo "  DOC   Building PDF";
+
+pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
+	$(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \
+	mkpdf_options=""; \
+	gtkdoc-mkpdf 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+	if test "$$?" = "0"; then \
+	  if test "x$(V)" = "x1"; then \
+	    mkpdf_options="$$mkpdf_options --verbose"; \
+	  fi; \
+	fi; \
+	if test "x$(HTML_IMAGES)" != "x"; then \
+	  for img in $(HTML_IMAGES); do \
+	    part=`dirname $$img`; \
+	    echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \
+	    if test $$? != 0; then \
+	      mkpdf_options="$$mkpdf_options --imgdir=$$part"; \
+	    fi; \
+	  done; \
+	fi; \
+	gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS)
+	$(AM_V_at)touch pdf-build.stamp
+
+##############
+
+clean-local:
+	@rm -f *~ *.bak
+	@rm -rf .libs
+	@if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \
+	  rm -f $(DOC_MODULE).types; \
+	fi
+	@if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \
+	  rm -f $(DOC_MODULE)-sections.txt; \
+	fi
+
+distclean-local:
+	@rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
+	    $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
+	@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+	    rm -f $(SETUP_FILES) $(DOC_MODULE).types; \
+	fi
+
+maintainer-clean-local:
+	@rm -rf xml html
+
+install-data-local:
+	@installfiles=`echo $(builddir)/html/*`; \
+	if test "$$installfiles" = '$(builddir)/html/*'; \
+	then echo 1>&2 'Nothing to install' ; \
+	else \
+	  if test -n "$(DOC_MODULE_VERSION)"; then \
+	    installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
+	  else \
+	    installdir="$(DESTDIR)$(TARGET_DIR)"; \
+	  fi; \
+	  $(mkinstalldirs) $${installdir} ; \
+	  for i in $$installfiles; do \
+	    echo ' $(INSTALL_DATA) '$$i ; \
+	    $(INSTALL_DATA) $$i $${installdir}; \
+	  done; \
+	  if test -n "$(DOC_MODULE_VERSION)"; then \
+	    mv -f $${installdir}/$(DOC_MODULE).devhelp2 \
+	      $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \
+	  fi; \
+	  $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \
+	fi
+
+uninstall-local:
+	@if test -n "$(DOC_MODULE_VERSION)"; then \
+	  installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
+	else \
+	  installdir="$(DESTDIR)$(TARGET_DIR)"; \
+	fi; \
+	rm -rf $${installdir}
+
+#
+# Require gtk-doc when making dist
+#
+if HAVE_GTK_DOC
+dist-check-gtkdoc: docs
+else
+dist-check-gtkdoc:
+	@echo "*** gtk-doc is needed to run 'make dist'.         ***"
+	@echo "*** gtk-doc was not found when 'configure' ran.   ***"
+	@echo "*** please install gtk-doc and rerun 'configure'. ***"
+	@false
+endif
+
+dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local
+	@mkdir $(distdir)/html
+	@cp ./html/* $(distdir)/html
+	@-cp ./$(DOC_MODULE).pdf $(distdir)/
+	@-cp ./$(DOC_MODULE).types $(distdir)/
+	@-cp ./$(DOC_MODULE)-sections.txt $(distdir)/
+	@cd $(distdir) && rm -f $(DISTCLEANFILES)
+	@$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html
+
+.PHONY : dist-hook-local docs
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/harfbuzz.doap b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/harfbuzz.doap
new file mode 100644
index 0000000..0769969
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/harfbuzz.doap
@@ -0,0 +1,24 @@
+<Project xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+         xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+         xmlns:foaf="http://xmlns.com/foaf/0.1/"
+         xmlns="http://usefulinc.com/ns/doap#">
+
+  <name xml:lang="en">harfbuzz</name>
+  <shortdesc xml:lang="en">Text shaping library</shortdesc>
+
+  <homepage
+  rdf:resource="http://harfbuzz.org/" />
+  <mailing-list
+  rdf:resource="http://lists.freedesktop.org/mailman/listinfo/harfbuzz" />
+  <!--download-page
+  rdf:resource=""/-->
+  <bug-database
+  rdf:resource="https://github.com/harfbuzz/harfbuzz/issues" />
+
+  <maintainer>
+    <foaf:Person>
+      <foaf:name>Behdad Esfahbod</foaf:name>
+      <foaf:mbox rdf:resource="mailto:harfbuzz@behdad.org" />
+    </foaf:Person>
+  </maintainer>
+</Project>
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/install-sh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/install-sh
new file mode 100755
index 0000000..59990a1
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/install-sh
@@ -0,0 +1,508 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2014-09-12.12; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+tab='	'
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
+
+    -o) chowncmd="$chownprog $2"
+        shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
+
+    -T) is_target_a_directory=never;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --) shift
+        break;;
+
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for 'test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call 'install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+        u_plus_rw=
+      else
+        u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+        u_plus_rw=
+      else
+        u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for 'test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      dstdir=`dirname "$dst"`
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+        # Create intermediate dirs using mode 755 as modified by the umask.
+        # This is like FreeBSD 'install' as of 1997-10-28.
+        umask=`umask`
+        case $stripcmd.$umask in
+          # Optimize common cases.
+          *[2367][2367]) mkdir_umask=$umask;;
+          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+          *[0-7])
+            mkdir_umask=`expr $umask + 22 \
+              - $umask % 100 % 40 + $umask % 20 \
+              - $umask % 10 % 4 + $umask % 2
+            `;;
+          *) mkdir_umask=$umask,go-w;;
+        esac
+
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+        case $umask in
+          *[123567][0-7][0-7])
+            # POSIX mkdir -p sets u+wx bits regardless of umask, which
+            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+            ;;
+          *)
+            # $RANDOM is not portable (e.g. dash);  use it when possible to
+            # lower collision chance
+            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            # As "mkdir -p" follows symlinks and we work in /tmp possibly;  so
+            # create the $tmpdir first (and fail if unsuccessful) to make sure
+            # that nobody tries to guess the $tmpdir name.
+            if (umask $mkdir_umask &&
+                $mkdirprog $mkdir_mode "$tmpdir" &&
+                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+            then
+              if test -z "$dir_arg" || {
+                   # Check for POSIX incompatibilities with -m.
+                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                   # other-writable bit of parent directory when it shouldn't.
+                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                   test_tmpdir="$tmpdir/a"
+                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+                   case $ls_ld_tmpdir in
+                     d????-?r-*) different_mode=700;;
+                     d????-?--*) different_mode=755;;
+                     *) false;;
+                   esac &&
+                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                   }
+                 }
+              then posix_mkdir=:
+              fi
+              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+            else
+              # Remove any dirs left behind by ancient mkdir implementations.
+              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+            fi
+            trap '' 0;;
+        esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
+      esac
+
+      oIFS=$IFS
+      IFS=/
+      set -f
+      set fnord $dstdir
+      shift
+      set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask=$mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
+       set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       set +f &&
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/ltmain.sh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/ltmain.sh
new file mode 100644
index 0000000..a736cf9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/ltmain.sh
@@ -0,0 +1,11156 @@
+#! /bin/sh
+## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
+##               by inline-source v2014-01-03.01
+
+# libtool (GNU libtool) 2.4.6
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION="2.4.6 Debian-2.4.6-2"
+package_revision=2.4.6
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Run './libtool --help' for help with using this script from the
+# command line.
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# After configure completes, it has a better idea of some of the
+# shell tools we need than the defaults used by the functions shared
+# with bootstrap, so set those here where they can still be over-
+# ridden by the user, but otherwise take precedence.
+
+: ${AUTOCONF="autoconf"}
+: ${AUTOMAKE="automake"}
+
+
+## -------------------------- ##
+## Source external libraries. ##
+## -------------------------- ##
+
+# Much of our low-level functionality needs to be sourced from external
+# libraries, which are installed to $pkgauxdir.
+
+# Set a version string for this script.
+scriptversion=2015-01-20.17; # UTC
+
+# General shell script boiler plate, and helper functions.
+# Written by Gary V. Vaughan, 2004
+
+# Copyright (C) 2004-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# As a special exception to the GNU General Public License, if you distribute
+# this file as part of a program or library that is built using GNU Libtool,
+# you may include this file under the same distribution terms that you use
+# for the rest of that program.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Evaluate this file near the top of your script to gain access to
+# the functions and variables defined here:
+#
+#   . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh
+#
+# If you need to override any of the default environment variable
+# settings, do that before evaluating this file.
+
+
+## -------------------- ##
+## Shell normalisation. ##
+## -------------------- ##
+
+# Some shells need a little help to be as Bourne compatible as possible.
+# Before doing anything else, make sure all that help has been provided!
+
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac
+fi
+
+# NLS nuisances: We save the old values in case they are required later.
+_G_user_locale=
+_G_safe_locale=
+for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test set = \"\${$_G_var+set}\"; then
+          save_$_G_var=\$$_G_var
+          $_G_var=C
+	  export $_G_var
+	  _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\"
+	  _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
+	fi"
+done
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Make sure IFS has a sensible default
+sp=' '
+nl='
+'
+IFS="$sp	$nl"
+
+# There are apparently some retarded systems that use ';' as a PATH separator!
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+
+## ------------------------- ##
+## Locate command utilities. ##
+## ------------------------- ##
+
+
+# func_executable_p FILE
+# ----------------------
+# Check that FILE is an executable regular file.
+func_executable_p ()
+{
+    test -f "$1" && test -x "$1"
+}
+
+
+# func_path_progs PROGS_LIST CHECK_FUNC [PATH]
+# --------------------------------------------
+# Search for either a program that responds to --version with output
+# containing "GNU", or else returned by CHECK_FUNC otherwise, by
+# trying all the directories in PATH with each of the elements of
+# PROGS_LIST.
+#
+# CHECK_FUNC should accept the path to a candidate program, and
+# set $func_check_prog_result if it truncates its output less than
+# $_G_path_prog_max characters.
+func_path_progs ()
+{
+    _G_progs_list=$1
+    _G_check_func=$2
+    _G_PATH=${3-"$PATH"}
+
+    _G_path_prog_max=0
+    _G_path_prog_found=false
+    _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:}
+    for _G_dir in $_G_PATH; do
+      IFS=$_G_save_IFS
+      test -z "$_G_dir" && _G_dir=.
+      for _G_prog_name in $_G_progs_list; do
+        for _exeext in '' .EXE; do
+          _G_path_prog=$_G_dir/$_G_prog_name$_exeext
+          func_executable_p "$_G_path_prog" || continue
+          case `"$_G_path_prog" --version 2>&1` in
+            *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;;
+            *)     $_G_check_func $_G_path_prog
+		   func_path_progs_result=$func_check_prog_result
+		   ;;
+          esac
+          $_G_path_prog_found && break 3
+        done
+      done
+    done
+    IFS=$_G_save_IFS
+    test -z "$func_path_progs_result" && {
+      echo "no acceptable sed could be found in \$PATH" >&2
+      exit 1
+    }
+}
+
+
+# We want to be able to use the functions in this file before configure
+# has figured out where the best binaries are kept, which means we have
+# to search for them ourselves - except when the results are already set
+# where we skip the searches.
+
+# Unless the user overrides by setting SED, search the path for either GNU
+# sed, or the sed that truncates its output the least.
+test -z "$SED" && {
+  _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+  for _G_i in 1 2 3 4 5 6 7; do
+    _G_sed_script=$_G_sed_script$nl$_G_sed_script
+  done
+  echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed
+  _G_sed_script=
+
+  func_check_prog_sed ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo '' >> conftest.nl
+      "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
+  rm -f conftest.sed
+  SED=$func_path_progs_result
+}
+
+
+# Unless the user overrides by setting GREP, search the path for either GNU
+# grep, or the grep that truncates its output the least.
+test -z "$GREP" && {
+  func_check_prog_grep ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    _G_path_prog_max=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo 'GREP' >> conftest.nl
+      "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
+  GREP=$func_path_progs_result
+}
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# All uppercase variable names are used for environment variables.  These
+# variables can be overridden by the user before calling a script that
+# uses them if a suitable command of that name is not already available
+# in the command search PATH.
+
+: ${CP="cp -f"}
+: ${ECHO="printf %s\n"}
+: ${EGREP="$GREP -E"}
+: ${FGREP="$GREP -F"}
+: ${LN_S="ln -s"}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+
+
+## -------------------- ##
+## Useful sed snippets. ##
+## -------------------- ##
+
+sed_dirname='s|/[^/]*$||'
+sed_basename='s|^.*/||'
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
+
+# Same as above, but do not quote variable references.
+sed_double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g'
+
+# Sed substitution that converts a w32 file name or path
+# that contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-'\' parameter expansions in output of sed_double_quote_subst that
+# were '\'-ed in input to the same.  If an odd number of '\' preceded a
+# '$' in input to sed_double_quote_subst, that '$' was protected from
+# expansion.  Since each input '\' is now two '\'s, look for any number
+# of runs of four '\'s followed by two '\'s and then a '$'.  '\' that '$'.
+_G_bs='\\'
+_G_bs2='\\\\'
+_G_bs4='\\\\\\\\'
+_G_dollar='\$'
+sed_double_backslash="\
+  s/$_G_bs4/&\\
+/g
+  s/^$_G_bs2$_G_dollar/$_G_bs&/
+  s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
+  s/\n//g"
+
+
+## ----------------- ##
+## Global variables. ##
+## ----------------- ##
+
+# Except for the global variables explicitly listed below, the following
+# functions in the '^func_' namespace, and the '^require_' namespace
+# variables initialised in the 'Resource management' section, sourcing
+# this file will not pollute your global namespace with anything
+# else. There's no portable way to scope variables in Bourne shell
+# though, so actually running these functions will sometimes place
+# results into a variable named after the function, and often use
+# temporary variables in the '^_G_' namespace. If you are careful to
+# avoid using those namespaces casually in your sourcing script, things
+# should continue to work as you expect. And, of course, you can freely
+# overwrite any of the functions or variables defined here before
+# calling anything to customize them.
+
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+# Allow overriding, eg assuming that you follow the convention of
+# putting '$debug_cmd' at the start of all your functions, you can get
+# bash to show function call trace with:
+#
+#    debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
+debug_cmd=${debug_cmd-":"}
+exit_cmd=:
+
+# By convention, finish your script with:
+#
+#    exit $exit_status
+#
+# so that you can set exit_status to non-zero if you want to indicate
+# something went wrong during execution without actually bailing out at
+# the point of failure.
+exit_status=$EXIT_SUCCESS
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath=$0
+
+# The name of this program.
+progname=`$ECHO "$progpath" |$SED "$sed_basename"`
+
+# Make sure we have an absolute progpath for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=`$ECHO "$progpath" |$SED "$sed_dirname"`
+     progdir=`cd "$progdir" && pwd`
+     progpath=$progdir/$progname
+     ;;
+  *)
+     _G_IFS=$IFS
+     IFS=${PATH_SEPARATOR-:}
+     for progdir in $PATH; do
+       IFS=$_G_IFS
+       test -x "$progdir/$progname" && break
+     done
+     IFS=$_G_IFS
+     test -n "$progdir" || progdir=`pwd`
+     progpath=$progdir/$progname
+     ;;
+esac
+
+
+## ----------------- ##
+## Standard options. ##
+## ----------------- ##
+
+# The following options affect the operation of the functions defined
+# below, and should be set appropriately depending on run-time para-
+# meters passed on the command line.
+
+opt_dry_run=false
+opt_quiet=false
+opt_verbose=false
+
+# Categories 'all' and 'none' are always available.  Append any others
+# you will pass as the first argument to func_warning from your own
+# code.
+warning_categories=
+
+# By default, display warnings according to 'opt_warning_types'.  Set
+# 'warning_func'  to ':' to elide all warnings, or func_fatal_error to
+# treat the next displayed warning as a fatal error.
+warning_func=func_warn_and_continue
+
+# Set to 'all' to display all warnings, 'none' to suppress all
+# warnings, or a space delimited list of some subset of
+# 'warning_categories' to display only the listed warnings.
+opt_warning_types=all
+
+
+## -------------------- ##
+## Resource management. ##
+## -------------------- ##
+
+# This section contains definitions for functions that each ensure a
+# particular resource (a file, or a non-empty configuration variable for
+# example) is available, and if appropriate to extract default values
+# from pertinent package files. Call them using their associated
+# 'require_*' variable to ensure that they are executed, at most, once.
+#
+# It's entirely deliberate that calling these functions can set
+# variables that don't obey the namespace limitations obeyed by the rest
+# of this file, in order that that they be as useful as possible to
+# callers.
+
+
+# require_term_colors
+# -------------------
+# Allow display of bold text on terminals that support it.
+require_term_colors=func_require_term_colors
+func_require_term_colors ()
+{
+    $debug_cmd
+
+    test -t 1 && {
+      # COLORTERM and USE_ANSI_COLORS environment variables take
+      # precedence, because most terminfo databases neglect to describe
+      # whether color sequences are supported.
+      test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"}
+
+      if test 1 = "$USE_ANSI_COLORS"; then
+        # Standard ANSI escape sequences
+        tc_reset=''
+        tc_bold='';   tc_standout=''
+        tc_red='';   tc_green=''
+        tc_blue='';  tc_cyan=''
+      else
+        # Otherwise trust the terminfo database after all.
+        test -n "`tput sgr0 2>/dev/null`" && {
+          tc_reset=`tput sgr0`
+          test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold`
+          tc_standout=$tc_bold
+          test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso`
+          test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1`
+          test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2`
+          test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4`
+          test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5`
+        }
+      fi
+    }
+
+    require_term_colors=:
+}
+
+
+## ----------------- ##
+## Function library. ##
+## ----------------- ##
+
+# This section contains a variety of useful functions to call in your
+# scripts. Take note of the portable wrappers for features provided by
+# some modern shells, which will fall back to slower equivalents on
+# less featureful shells.
+
+
+# func_append VAR VALUE
+# ---------------------
+# Append VALUE onto the existing contents of VAR.
+
+  # We should try to minimise forks, especially on Windows where they are
+  # unreasonably slow, so skip the feature probes when bash or zsh are
+  # being used:
+  if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then
+    : ${_G_HAVE_ARITH_OP="yes"}
+    : ${_G_HAVE_XSI_OPS="yes"}
+    # The += operator was introduced in bash 3.1
+    case $BASH_VERSION in
+      [12].* | 3.0 | 3.0*) ;;
+      *)
+        : ${_G_HAVE_PLUSEQ_OP="yes"}
+        ;;
+    esac
+  fi
+
+  # _G_HAVE_PLUSEQ_OP
+  # Can be empty, in which case the shell is probed, "yes" if += is
+  # useable or anything else if it does not work.
+  test -z "$_G_HAVE_PLUSEQ_OP" \
+    && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
+    && _G_HAVE_PLUSEQ_OP=yes
+
+if test yes = "$_G_HAVE_PLUSEQ_OP"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_append ()
+  {
+    $debug_cmd
+
+    eval "$1+=\$2"
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_append ()
+  {
+    $debug_cmd
+
+    eval "$1=\$$1\$2"
+  }
+fi
+
+
+# func_append_quoted VAR VALUE
+# ----------------------------
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+if test yes = "$_G_HAVE_PLUSEQ_OP"; then
+  eval 'func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1+=\\ \$func_quote_for_eval_result"
+  }'
+else
+  func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1=\$$1\\ \$func_quote_for_eval_result"
+  }
+fi
+
+
+# func_append_uniq VAR VALUE
+# --------------------------
+# Append unique VALUE onto the existing contents of VAR, assuming
+# entries are delimited by the first character of VALUE.  For example:
+#
+#   func_append_uniq options " --another-option option-argument"
+#
+# will only append to $options if " --another-option option-argument "
+# is not already present somewhere in $options already (note spaces at
+# each end implied by leading space in second argument).
+func_append_uniq ()
+{
+    $debug_cmd
+
+    eval _G_current_value='`$ECHO $'$1'`'
+    _G_delim=`expr "$2" : '\(.\)'`
+
+    case $_G_delim$_G_current_value$_G_delim in
+      *"$2$_G_delim"*) ;;
+      *) func_append "$@" ;;
+    esac
+}
+
+
+# func_arith TERM...
+# ------------------
+# Set func_arith_result to the result of evaluating TERMs.
+  test -z "$_G_HAVE_ARITH_OP" \
+    && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \
+    && _G_HAVE_ARITH_OP=yes
+
+if test yes = "$_G_HAVE_ARITH_OP"; then
+  eval 'func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=$(( $* ))
+  }'
+else
+  func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=`expr "$@"`
+  }
+fi
+
+
+# func_basename FILE
+# ------------------
+# Set func_basename_result to FILE with everything up to and including
+# the last / stripped.
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  # If this shell supports suffix pattern removal, then use it to avoid
+  # forking. Hide the definitions single quotes in case the shell chokes
+  # on unsupported syntax...
+  _b='func_basename_result=${1##*/}'
+  _d='case $1 in
+        */*) func_dirname_result=${1%/*}$2 ;;
+        *  ) func_dirname_result=$3        ;;
+      esac'
+
+else
+  # ...otherwise fall back to using sed.
+  _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`'
+  _d='func_dirname_result=`$ECHO "$1"  |$SED "$sed_dirname"`
+      if test "X$func_dirname_result" = "X$1"; then
+        func_dirname_result=$3
+      else
+        func_append func_dirname_result "$2"
+      fi'
+fi
+
+eval 'func_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+}'
+
+
+# func_dirname FILE APPEND NONDIR_REPLACEMENT
+# -------------------------------------------
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+eval 'func_dirname ()
+{
+    $debug_cmd
+
+    '"$_d"'
+}'
+
+
+# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT
+# --------------------------------------------------------
+# Perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# For efficiency, we do not delegate to the functions above but instead
+# duplicate the functionality here.
+eval 'func_dirname_and_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+    '"$_d"'
+}'
+
+
+# func_echo ARG...
+# ----------------
+# Echo program name prefixed message.
+func_echo ()
+{
+    $debug_cmd
+
+    _G_message=$*
+
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
+
+
+# func_echo_all ARG...
+# --------------------
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+
+# func_echo_infix_1 INFIX ARG...
+# ------------------------------
+# Echo program name, followed by INFIX on the first line, with any
+# additional lines not showing INFIX.
+func_echo_infix_1 ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    _G_infix=$1; shift
+    _G_indent=$_G_infix
+    _G_prefix="$progname: $_G_infix: "
+    _G_message=$*
+
+    # Strip color escape sequences before counting printable length
+    for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan"
+    do
+      test -n "$_G_tc" && {
+        _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"`
+        _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"`
+      }
+    done
+    _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`"  " ## exclude from sc_prohibit_nested_quotes
+
+    func_echo_infix_1_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_infix_1_IFS
+      $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2
+      _G_prefix=$_G_indent
+    done
+    IFS=$func_echo_infix_1_IFS
+}
+
+
+# func_error ARG...
+# -----------------
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "  $tc_standout${tc_red}error$tc_reset" "$*" >&2
+}
+
+
+# func_fatal_error ARG...
+# -----------------------
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    $debug_cmd
+
+    func_error "$*"
+    exit $EXIT_FAILURE
+}
+
+
+# func_grep EXPRESSION FILENAME
+# -----------------------------
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $debug_cmd
+
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_len STRING
+# ---------------
+# Set func_len_result to the length of STRING. STRING may not
+# start with a hyphen.
+  test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=${#1}
+  }'
+else
+  func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+  }
+fi
+
+
+# func_mkdir_p DIRECTORY-PATH
+# ---------------------------
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    $debug_cmd
+
+    _G_directory_path=$1
+    _G_dir_list=
+
+    if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then
+
+      # Protect directory names starting with '-'
+      case $_G_directory_path in
+        -*) _G_directory_path=./$_G_directory_path ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$_G_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        _G_dir_list=$_G_directory_path:$_G_dir_list
+
+        # If the last portion added has no slash in it, the list is done
+        case $_G_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"`
+      done
+      _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'`
+
+      func_mkdir_p_IFS=$IFS; IFS=:
+      for _G_dir in $_G_dir_list; do
+	IFS=$func_mkdir_p_IFS
+        # mkdir can fail with a 'File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$_G_dir" 2>/dev/null || :
+      done
+      IFS=$func_mkdir_p_IFS
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$_G_directory_path" || \
+        func_fatal_error "Failed to create '$1'"
+    fi
+}
+
+
+# func_mktempdir [BASENAME]
+# -------------------------
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, BASENAME is the basename for that directory.
+func_mktempdir ()
+{
+    $debug_cmd
+
+    _G_template=${TMPDIR-/tmp}/${1-$progname}
+
+    if test : = "$opt_dry_run"; then
+      # Return a directory name, but don't create it in dry-run mode
+      _G_tmpdir=$_G_template-$$
+    else
+
+      # If mktemp works, use that first and foremost
+      _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$_G_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        _G_tmpdir=$_G_template-${RANDOM-0}$$
+
+        func_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$_G_tmpdir"
+        umask $func_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$_G_tmpdir" || \
+        func_fatal_error "cannot create temporary directory '$_G_tmpdir'"
+    fi
+
+    $ECHO "$_G_tmpdir"
+}
+
+
+# func_normal_abspath PATH
+# ------------------------
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+func_normal_abspath ()
+{
+    $debug_cmd
+
+    # These SED scripts presuppose an absolute path with a trailing slash.
+    _G_pathcar='s|^/\([^/]*\).*$|\1|'
+    _G_pathcdr='s|^/[^/]*||'
+    _G_removedotparts=':dotsl
+		s|/\./|/|g
+		t dotsl
+		s|/\.$|/|'
+    _G_collapseslashes='s|/\{1,\}|/|g'
+    _G_finalslash='s|/*$|/|'
+
+    # Start from root dir and reassemble the path.
+    func_normal_abspath_result=
+    func_normal_abspath_tpath=$1
+    func_normal_abspath_altnamespace=
+    case $func_normal_abspath_tpath in
+      "")
+        # Empty path, that just means $cwd.
+        func_stripname '' '/' "`pwd`"
+        func_normal_abspath_result=$func_stripname_result
+        return
+        ;;
+      # The next three entries are used to spot a run of precisely
+      # two leading slashes without using negated character classes;
+      # we take advantage of case's first-match behaviour.
+      ///*)
+        # Unusual form of absolute path, do nothing.
+        ;;
+      //*)
+        # Not necessarily an ordinary path; POSIX reserves leading '//'
+        # and for example Cygwin uses it to access remote file shares
+        # over CIFS/SMB, so we conserve a leading double slash if found.
+        func_normal_abspath_altnamespace=/
+        ;;
+      /*)
+        # Absolute path, do nothing.
+        ;;
+      *)
+        # Relative path, prepend $cwd.
+        func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+        ;;
+    esac
+
+    # Cancel out all the simple stuff to save iterations.  We also want
+    # the path to end with a slash for ease of parsing, so make sure
+    # there is one (and only one) here.
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"`
+    while :; do
+      # Processed it all yet?
+      if test / = "$func_normal_abspath_tpath"; then
+        # If we ascended to the root using ".." the result may be empty now.
+        if test -z "$func_normal_abspath_result"; then
+          func_normal_abspath_result=/
+        fi
+        break
+      fi
+      func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcar"`
+      func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcdr"`
+      # Figure out what to do with it
+      case $func_normal_abspath_tcomponent in
+        "")
+          # Trailing empty path component, ignore it.
+          ;;
+        ..)
+          # Parent dir; strip last assembled component from result.
+          func_dirname "$func_normal_abspath_result"
+          func_normal_abspath_result=$func_dirname_result
+          ;;
+        *)
+          # Actual path component, append it.
+          func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent"
+          ;;
+      esac
+    done
+    # Restore leading double-slash if one was found on entry.
+    func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+
+# func_notquiet ARG...
+# --------------------
+# Echo program name prefixed message only when not in quiet mode.
+func_notquiet ()
+{
+    $debug_cmd
+
+    $opt_quiet || func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+
+# func_relative_path SRCDIR DSTDIR
+# --------------------------------
+# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR.
+func_relative_path ()
+{
+    $debug_cmd
+
+    func_relative_path_result=
+    func_normal_abspath "$1"
+    func_relative_path_tlibdir=$func_normal_abspath_result
+    func_normal_abspath "$2"
+    func_relative_path_tbindir=$func_normal_abspath_result
+
+    # Ascend the tree starting from libdir
+    while :; do
+      # check if we have found a prefix of bindir
+      case $func_relative_path_tbindir in
+        $func_relative_path_tlibdir)
+          # found an exact match
+          func_relative_path_tcancelled=
+          break
+          ;;
+        $func_relative_path_tlibdir*)
+          # found a matching prefix
+          func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+          func_relative_path_tcancelled=$func_stripname_result
+          if test -z "$func_relative_path_result"; then
+            func_relative_path_result=.
+          fi
+          break
+          ;;
+        *)
+          func_dirname $func_relative_path_tlibdir
+          func_relative_path_tlibdir=$func_dirname_result
+          if test -z "$func_relative_path_tlibdir"; then
+            # Have to descend all the way to the root!
+            func_relative_path_result=../$func_relative_path_result
+            func_relative_path_tcancelled=$func_relative_path_tbindir
+            break
+          fi
+          func_relative_path_result=../$func_relative_path_result
+          ;;
+      esac
+    done
+
+    # Now calculate path; take care to avoid doubling-up slashes.
+    func_stripname '' '/' "$func_relative_path_result"
+    func_relative_path_result=$func_stripname_result
+    func_stripname '/' '/' "$func_relative_path_tcancelled"
+    if test -n "$func_stripname_result"; then
+      func_append func_relative_path_result "/$func_stripname_result"
+    fi
+
+    # Normalisation. If bindir is libdir, return '.' else relative path.
+    if test -n "$func_relative_path_result"; then
+      func_stripname './' '' "$func_relative_path_result"
+      func_relative_path_result=$func_stripname_result
+    fi
+
+    test -n "$func_relative_path_result" || func_relative_path_result=.
+
+    :
+}
+
+
+# func_quote_for_eval ARG...
+# --------------------------
+# Aesthetically quote ARGs to be evaled later.
+# This function returns two values:
+#   i) func_quote_for_eval_result
+#      double-quoted, suitable for a subsequent eval
+#  ii) func_quote_for_eval_unquoted_result
+#      has all characters that are still active within double
+#      quotes backslashified.
+func_quote_for_eval ()
+{
+    $debug_cmd
+
+    func_quote_for_eval_unquoted_result=
+    func_quote_for_eval_result=
+    while test 0 -lt $#; do
+      case $1 in
+        *[\\\`\"\$]*)
+	  _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
+        *)
+          _G_unquoted_arg=$1 ;;
+      esac
+      if test -n "$func_quote_for_eval_unquoted_result"; then
+	func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
+      else
+        func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
+      fi
+
+      case $_G_unquoted_arg in
+        # Double-quote args containing shell metacharacters to delay
+        # word splitting, command substitution and variable expansion
+        # for a subsequent eval.
+        # Many Bourne shells cannot handle close brackets correctly
+        # in scan sets, so we specify it separately.
+        *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+          _G_quoted_arg=\"$_G_unquoted_arg\"
+          ;;
+        *)
+          _G_quoted_arg=$_G_unquoted_arg
+	  ;;
+      esac
+
+      if test -n "$func_quote_for_eval_result"; then
+	func_append func_quote_for_eval_result " $_G_quoted_arg"
+      else
+        func_append func_quote_for_eval_result "$_G_quoted_arg"
+      fi
+      shift
+    done
+}
+
+
+# func_quote_for_expand ARG
+# -------------------------
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    $debug_cmd
+
+    case $1 in
+      *[\\\`\"]*)
+	_G_arg=`$ECHO "$1" | $SED \
+	    -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        _G_arg=$1 ;;
+    esac
+
+    case $_G_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        _G_arg=\"$_G_arg\"
+        ;;
+    esac
+
+    func_quote_for_expand_result=$_G_arg
+}
+
+
+# func_stripname PREFIX SUFFIX NAME
+# ---------------------------------
+# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_stripname ()
+  {
+    $debug_cmd
+
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary variable first.
+    func_stripname_result=$3
+    func_stripname_result=${func_stripname_result#"$1"}
+    func_stripname_result=${func_stripname_result%"$2"}
+  }'
+else
+  func_stripname ()
+  {
+    $debug_cmd
+
+    case $2 in
+      .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;;
+      *)  func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;;
+    esac
+  }
+fi
+
+
+# func_show_eval CMD [FAIL_EXP]
+# -----------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    func_quote_for_expand "$_G_cmd"
+    eval "func_notquiet $func_quote_for_expand_result"
+
+    $opt_dry_run || {
+      eval "$_G_cmd"
+      _G_status=$?
+      if test 0 -ne "$_G_status"; then
+	eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_show_eval_locale CMD [FAIL_EXP]
+# ------------------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    $opt_quiet || {
+      func_quote_for_expand "$_G_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    $opt_dry_run || {
+      eval "$_G_user_locale
+	    $_G_cmd"
+      _G_status=$?
+      eval "$_G_safe_locale"
+      if test 0 -ne "$_G_status"; then
+	eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_tr_sh
+# ----------
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+    $debug_cmd
+
+    case $1 in
+    [0-9]* | *[!a-zA-Z0-9_]*)
+      func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'`
+      ;;
+    * )
+      func_tr_sh_result=$1
+      ;;
+    esac
+}
+
+
+# func_verbose ARG...
+# -------------------
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $debug_cmd
+
+    $opt_verbose && func_echo "$*"
+
+    :
+}
+
+
+# func_warn_and_continue ARG...
+# -----------------------------
+# Echo program name prefixed warning message to standard error.
+func_warn_and_continue ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2
+}
+
+
+# func_warning CATEGORY ARG...
+# ----------------------------
+# Echo program name prefixed warning message to standard error. Warning
+# messages can be filtered according to CATEGORY, where this function
+# elides messages where CATEGORY is not listed in the global variable
+# 'opt_warning_types'.
+func_warning ()
+{
+    $debug_cmd
+
+    # CATEGORY must be in the warning_categories list!
+    case " $warning_categories " in
+      *" $1 "*) ;;
+      *) func_internal_error "invalid warning category '$1'" ;;
+    esac
+
+    _G_category=$1
+    shift
+
+    case " $opt_warning_types " in
+      *" $_G_category "*) $warning_func ${1+"$@"} ;;
+    esac
+}
+
+
+# func_sort_ver VER1 VER2
+# -----------------------
+# 'sort -V' is not generally available.
+# Note this deviates from the version comparison in automake
+# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
+# but this should suffice as we won't be specifying old
+# version formats or redundant trailing .0 in bootstrap.conf.
+# If we did want full compatibility then we should probably
+# use m4_version_compare from autoconf.
+func_sort_ver ()
+{
+    $debug_cmd
+
+    printf '%s\n%s\n' "$1" "$2" \
+      | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n
+}
+
+# func_lt_ver PREV CURR
+# ---------------------
+# Return true if PREV and CURR are in the correct order according to
+# func_sort_ver, otherwise false.  Use it like this:
+#
+#  func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..."
+func_lt_ver ()
+{
+    $debug_cmd
+
+    test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q`
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+#! /bin/sh
+
+# Set a version string for this script.
+scriptversion=2014-01-07.03; # UTC
+
+# A portable, pluggable option parser for Bourne shell.
+# Written by Gary V. Vaughan, 2010
+
+# Copyright (C) 2010-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# This file is a library for parsing options in your shell scripts along
+# with assorted other useful supporting features that you can make use
+# of too.
+#
+# For the simplest scripts you might need only:
+#
+#   #!/bin/sh
+#   . relative/path/to/funclib.sh
+#   . relative/path/to/options-parser
+#   scriptversion=1.0
+#   func_options ${1+"$@"}
+#   eval set dummy "$func_options_result"; shift
+#   ...rest of your script...
+#
+# In order for the '--version' option to work, you will need to have a
+# suitably formatted comment like the one at the top of this file
+# starting with '# Written by ' and ending with '# warranty; '.
+#
+# For '-h' and '--help' to work, you will also need a one line
+# description of your script's purpose in a comment directly above the
+# '# Written by ' line, like the one at the top of this file.
+#
+# The default options also support '--debug', which will turn on shell
+# execution tracing (see the comment above debug_cmd below for another
+# use), and '--verbose' and the func_verbose function to allow your script
+# to display verbose messages only when your user has specified
+# '--verbose'.
+#
+# After sourcing this file, you can plug processing for additional
+# options by amending the variables from the 'Configuration' section
+# below, and following the instructions in the 'Option parsing'
+# section further down.
+
+## -------------- ##
+## Configuration. ##
+## -------------- ##
+
+# You should override these variables in your script after sourcing this
+# file so that they reflect the customisations you have added to the
+# option parser.
+
+# The usage line for option parsing errors and the start of '-h' and
+# '--help' output messages. You can embed shell variables for delayed
+# expansion at the time the message is displayed, but you will need to
+# quote other shell meta-characters carefully to prevent them being
+# expanded when the contents are evaled.
+usage='$progpath [OPTION]...'
+
+# Short help message in response to '-h' and '--help'.  Add to this or
+# override it after sourcing this library to reflect the full set of
+# options your script accepts.
+usage_message="\
+       --debug        enable verbose shell tracing
+   -W, --warnings=CATEGORY
+                      report the warnings falling in CATEGORY [all]
+   -v, --verbose      verbosely report processing
+       --version      print version information and exit
+   -h, --help         print short or long help message and exit
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+long_help_message="
+Warning categories include:
+       'all'          show all warnings
+       'none'         turn off all the warnings
+       'error'        warnings are treated as fatal errors"
+
+# Help message printed before fatal option parsing errors.
+fatal_help="Try '\$progname --help' for more information."
+
+
+
+## ------------------------- ##
+## Hook function management. ##
+## ------------------------- ##
+
+# This section contains functions for adding, removing, and running hooks
+# to the main code.  A hook is just a named list of of function, that can
+# be run in order later on.
+
+# func_hookable FUNC_NAME
+# -----------------------
+# Declare that FUNC_NAME will run hooks added with
+# 'func_add_hook FUNC_NAME ...'.
+func_hookable ()
+{
+    $debug_cmd
+
+    func_append hookable_fns " $1"
+}
+
+
+# func_add_hook FUNC_NAME HOOK_FUNC
+# ---------------------------------
+# Request that FUNC_NAME call HOOK_FUNC before it returns.  FUNC_NAME must
+# first have been declared "hookable" by a call to 'func_hookable'.
+func_add_hook ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not accept hook functions." ;;
+    esac
+
+    eval func_append ${1}_hooks '" $2"'
+}
+
+
+# func_remove_hook FUNC_NAME HOOK_FUNC
+# ------------------------------------
+# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
+func_remove_hook ()
+{
+    $debug_cmd
+
+    eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`'
+}
+
+
+# func_run_hooks FUNC_NAME [ARG]...
+# ---------------------------------
+# Run all hook functions registered to FUNC_NAME.
+# It is assumed that the list of hook functions contains nothing more
+# than a whitespace-delimited list of legal shell function names, and
+# no effort is wasted trying to catch shell meta-characters or preserve
+# whitespace.
+func_run_hooks ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not support hook funcions.n" ;;
+    esac
+
+    eval _G_hook_fns=\$$1_hooks; shift
+
+    for _G_hook in $_G_hook_fns; do
+      eval $_G_hook '"$@"'
+
+      # store returned options list back into positional
+      # parameters for next 'cmd' execution.
+      eval _G_hook_result=\$${_G_hook}_result
+      eval set dummy "$_G_hook_result"; shift
+    done
+
+    func_quote_for_eval ${1+"$@"}
+    func_run_hooks_result=$func_quote_for_eval_result
+}
+
+
+
+## --------------- ##
+## Option parsing. ##
+## --------------- ##
+
+# In order to add your own option parsing hooks, you must accept the
+# full positional parameter list in your hook function, remove any
+# options that you action, and then pass back the remaining unprocessed
+# options in '<hooked_function_name>_result', escaped suitably for
+# 'eval'.  Like this:
+#
+#    my_options_prep ()
+#    {
+#        $debug_cmd
+#
+#        # Extend the existing usage message.
+#        usage_message=$usage_message'
+#      -s, --silent       don'\''t print informational messages
+#    '
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_options_prep_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_options_prep my_options_prep
+#
+#
+#    my_silent_option ()
+#    {
+#        $debug_cmd
+#
+#        # Note that for efficiency, we parse as many options as we can
+#        # recognise in a loop before passing the remainder back to the
+#        # caller on the first unrecognised argument we encounter.
+#        while test $# -gt 0; do
+#          opt=$1; shift
+#          case $opt in
+#            --silent|-s) opt_silent=: ;;
+#            # Separate non-argument short options:
+#            -s*)         func_split_short_opt "$_G_opt"
+#                         set dummy "$func_split_short_opt_name" \
+#                             "-$func_split_short_opt_arg" ${1+"$@"}
+#                         shift
+#                         ;;
+#            *)            set dummy "$_G_opt" "$*"; shift; break ;;
+#          esac
+#        done
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_silent_option_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_parse_options my_silent_option
+#
+#
+#    my_option_validation ()
+#    {
+#        $debug_cmd
+#
+#        $opt_silent && $opt_verbose && func_fatal_help "\
+#    '--silent' and '--verbose' options are mutually exclusive."
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_option_validation_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_validate_options my_option_validation
+#
+# You'll alse need to manually amend $usage_message to reflect the extra
+# options you parse.  It's preferable to append if you can, so that
+# multiple option parsing hooks can be added safely.
+
+
+# func_options [ARG]...
+# ---------------------
+# All the functions called inside func_options are hookable. See the
+# individual implementations for details.
+func_hookable func_options
+func_options ()
+{
+    $debug_cmd
+
+    func_options_prep ${1+"$@"}
+    eval func_parse_options \
+        ${func_options_prep_result+"$func_options_prep_result"}
+    eval func_validate_options \
+        ${func_parse_options_result+"$func_parse_options_result"}
+
+    eval func_run_hooks func_options \
+        ${func_validate_options_result+"$func_validate_options_result"}
+
+    # save modified positional parameters for caller
+    func_options_result=$func_run_hooks_result
+}
+
+
+# func_options_prep [ARG]...
+# --------------------------
+# All initialisations required before starting the option parse loop.
+# Note that when calling hook functions, we pass through the list of
+# positional parameters.  If a hook function modifies that list, and
+# needs to propogate that back to rest of this script, then the complete
+# modified list must be put in 'func_run_hooks_result' before
+# returning.
+func_hookable func_options_prep
+func_options_prep ()
+{
+    $debug_cmd
+
+    # Option defaults:
+    opt_verbose=false
+    opt_warning_types=
+
+    func_run_hooks func_options_prep ${1+"$@"}
+
+    # save modified positional parameters for caller
+    func_options_prep_result=$func_run_hooks_result
+}
+
+
+# func_parse_options [ARG]...
+# ---------------------------
+# The main option parsing loop.
+func_hookable func_parse_options
+func_parse_options ()
+{
+    $debug_cmd
+
+    func_parse_options_result=
+
+    # this just eases exit handling
+    while test $# -gt 0; do
+      # Defer to hook functions for initial option parsing, so they
+      # get priority in the event of reusing an option name.
+      func_run_hooks func_parse_options ${1+"$@"}
+
+      # Adjust func_parse_options positional parameters to match
+      eval set dummy "$func_run_hooks_result"; shift
+
+      # Break out of the loop if we already parsed every option.
+      test $# -gt 0 || break
+
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --debug|-x)   debug_cmd='set -x'
+                      func_echo "enabling shell trace mode"
+                      $debug_cmd
+                      ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                      set dummy --warnings none ${1+"$@"}
+                      shift
+		      ;;
+
+        --warnings|--warning|-W)
+                      test $# = 0 && func_missing_arg $_G_opt && break
+                      case " $warning_categories $1" in
+                        *" $1 "*)
+                          # trailing space prevents matching last $1 above
+                          func_append_uniq opt_warning_types " $1"
+                          ;;
+                        *all)
+                          opt_warning_types=$warning_categories
+                          ;;
+                        *none)
+                          opt_warning_types=none
+                          warning_func=:
+                          ;;
+                        *error)
+                          opt_warning_types=$warning_categories
+                          warning_func=func_fatal_error
+                          ;;
+                        *)
+                          func_fatal_error \
+                             "unsupported warning category: '$1'"
+                          ;;
+                      esac
+                      shift
+                      ;;
+
+        --verbose|-v) opt_verbose=: ;;
+        --version)    func_version ;;
+        -\?|-h)       func_usage ;;
+        --help)       func_help ;;
+
+	# Separate optargs to long options (plugins may need this):
+	--*=*)        func_split_equals "$_G_opt"
+	              set dummy "$func_split_equals_lhs" \
+                          "$func_split_equals_rhs" ${1+"$@"}
+                      shift
+                      ;;
+
+       # Separate optargs to short options:
+        -W*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        # Separate non-argument short options:
+        -\?*|-h*|-v*|-x*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "-$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        --)           break ;;
+        -*)           func_fatal_help "unrecognised option: '$_G_opt'" ;;
+        *)            set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+      esac
+    done
+
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    func_parse_options_result=$func_quote_for_eval_result
+}
+
+
+# func_validate_options [ARG]...
+# ------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+func_hookable func_validate_options
+func_validate_options ()
+{
+    $debug_cmd
+
+    # Display all warnings if -W was not given.
+    test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
+
+    func_run_hooks func_validate_options ${1+"$@"}
+
+    # Bail if the options were screwed!
+    $exit_cmd $EXIT_FAILURE
+
+    # save modified positional parameters for caller
+    func_validate_options_result=$func_run_hooks_result
+}
+
+
+
+## ----------------- ##
+## Helper functions. ##
+## ----------------- ##
+
+# This section contains the helper functions used by the rest of the
+# hookable option parser framework in ascii-betical order.
+
+
+# func_fatal_help ARG...
+# ----------------------
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    $debug_cmd
+
+    eval \$ECHO \""Usage: $usage"\"
+    eval \$ECHO \""$fatal_help"\"
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+
+# func_help
+# ---------
+# Echo long help message to standard output and exit.
+func_help ()
+{
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message"
+    exit 0
+}
+
+
+# func_missing_arg ARGNAME
+# ------------------------
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    $debug_cmd
+
+    func_error "Missing argument for '$1'."
+    exit_cmd=exit
+}
+
+
+# func_split_equals STRING
+# ------------------------
+# Set func_split_equals_lhs and func_split_equals_rhs shell variables after
+# splitting STRING at the '=' sign.
+test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=${1%%=*}
+      func_split_equals_rhs=${1#*=}
+      test "x$func_split_equals_lhs" = "x$1" \
+        && func_split_equals_rhs=
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
+      func_split_equals_rhs=
+      test "x$func_split_equals_lhs" = "x$1" \
+        || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
+  }
+fi #func_split_equals
+
+
+# func_split_short_opt SHORTOPT
+# -----------------------------
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_arg=${1#??}
+      func_split_short_opt_name=${1%"$func_split_short_opt_arg"}
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
+      func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
+  }
+fi #func_split_short_opt
+
+
+# func_usage
+# ----------
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "Run '$progname --help |${PAGER-more}' for full usage"
+    exit 0
+}
+
+
+# func_usage_message
+# ------------------
+# Echo short help message to standard output.
+func_usage_message ()
+{
+    $debug_cmd
+
+    eval \$ECHO \""Usage: $usage"\"
+    echo
+    $SED -n 's|^# ||
+        /^Written by/{
+          x;p;x
+        }
+	h
+	/^Written by/q' < "$progpath"
+    echo
+    eval \$ECHO \""$usage_message"\"
+}
+
+
+# func_version
+# ------------
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $debug_cmd
+
+    printf '%s\n' "$progname $scriptversion"
+    $SED -n '
+        /(C)/!b go
+        :more
+        /\./!{
+          N
+          s|\n# | |
+          b more
+        }
+        :go
+        /^# Written by /,/# warranty; / {
+          s|^# ||
+          s|^# *$||
+          s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+          p
+        }
+        /^# Written by / {
+          s|^# ||
+          p
+        }
+        /^warranty; /q' < "$progpath"
+
+    exit $?
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+
+# Set a version string.
+scriptversion='(GNU libtool) 2.4.6'
+
+
+# func_echo ARG...
+# ----------------
+# Libtool also displays the current mode in messages, so override
+# funclib.sh func_echo with this custom definition.
+func_echo ()
+{
+    $debug_cmd
+
+    _G_message=$*
+
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
+
+
+# func_warning ARG...
+# -------------------
+# Libtool warnings are not categorized, so override funclib.sh
+# func_warning with this simpler definition.
+func_warning ()
+{
+    $debug_cmd
+
+    $warning_func ${1+"$@"}
+}
+
+
+## ---------------- ##
+## Options parsing. ##
+## ---------------- ##
+
+# Hook in the functions to make sure our own options are parsed during
+# the option parsing loop.
+
+usage='$progpath [OPTION]... [MODE-ARG]...'
+
+# Short help message in response to '-h'.
+usage_message="Options:
+       --config             show all configuration variables
+       --debug              enable verbose shell tracing
+   -n, --dry-run            display commands without modifying any files
+       --features           display basic configuration information and exit
+       --mode=MODE          use operation mode MODE
+       --no-warnings        equivalent to '-Wnone'
+       --preserve-dup-deps  don't remove duplicate dependency libraries
+       --quiet, --silent    don't print informational messages
+       --tag=TAG            use configuration variables from tag TAG
+   -v, --verbose            print more informational messages than default
+       --version            print version information
+   -W, --warnings=CATEGORY  report the warnings falling in CATEGORY [all]
+   -h, --help, --help-all   print short, long, or detailed help message
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+func_help ()
+{
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message
+
+MODE must be one of the following:
+
+       clean           remove files from the build directory
+       compile         compile a source file into a libtool object
+       execute         automatically set library path, then run a program
+       finish          complete the installation of libtool libraries
+       install         install libraries or executables
+       link            create a library or an executable
+       uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  When passed as first option,
+'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that.
+Try '$progname --help --mode=MODE' for a more detailed description of MODE.
+
+When reporting a bug, please describe a test case to reproduce it and
+include the following information:
+
+       host-triplet:   $host
+       shell:          $SHELL
+       compiler:       $LTCC
+       compiler flags: $LTCFLAGS
+       linker:         $LD (gnu? $with_gnu_ld)
+       version:        $progname $scriptversion Debian-2.4.6-2
+       automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
+       autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`
+
+Report bugs to <bug-libtool@gnu.org>.
+GNU libtool home page: <http://www.gnu.org/s/libtool/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>."
+    exit 0
+}
+
+
+# func_lo2o OBJECT-NAME
+# ---------------------
+# Transform OBJECT-NAME from a '.lo' suffix to the platform specific
+# object suffix.
+
+lo2o=s/\\.lo\$/.$objext/
+o2lo=s/\\.$objext\$/.lo/
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_lo2o ()
+  {
+    case $1 in
+      *.lo) func_lo2o_result=${1%.lo}.$objext ;;
+      *   ) func_lo2o_result=$1               ;;
+    esac
+  }'
+
+  # func_xform LIBOBJ-OR-SOURCE
+  # ---------------------------
+  # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise)
+  # suffix to a '.lo' libtool-object suffix.
+  eval 'func_xform ()
+  {
+    func_xform_result=${1%.*}.lo
+  }'
+else
+  # ...otherwise fall back to using sed.
+  func_lo2o ()
+  {
+    func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"`
+  }
+
+  func_xform ()
+  {
+    func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'`
+  }
+fi
+
+
+# func_fatal_configuration ARG...
+# -------------------------------
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func__fatal_error ${1+"$@"} \
+      "See the $PACKAGE documentation for more information." \
+      "Fatal configuration error."
+}
+
+
+# func_config
+# -----------
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+
+# func_features
+# -------------
+# Display the features supported by this script.
+func_features ()
+{
+    echo "host: $host"
+    if test yes = "$build_libtool_libs"; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test yes = "$build_old_libs"; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+
+    exit $?
+}
+
+
+# func_enable_tag TAGNAME
+# -----------------------
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+    # Global variable:
+    tagname=$1
+
+    re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+    re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+    sed_extractcf=/$re_begincf/,/$re_endcf/p
+
+    # Validate tagname.
+    case $tagname in
+      *[!-_A-Za-z0-9,/]*)
+        func_fatal_error "invalid tag name: $tagname"
+        ;;
+    esac
+
+    # Don't test for the "default" C tag, as we know it's
+    # there but not specially marked.
+    case $tagname in
+        CC) ;;
+    *)
+        if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	  taglist="$taglist $tagname"
+
+	  # Evaluate the configuration.  Be careful to quote the path
+	  # and the sed script, to avoid splitting on whitespace, but
+	  # also don't use non-portable quotes within backquotes within
+	  # quotes we have to do it in 2 steps:
+	  extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	  eval "$extractedcf"
+        else
+	  func_error "ignoring unknown tag $tagname"
+        fi
+        ;;
+    esac
+}
+
+
+# func_check_version_match
+# ------------------------
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+    if test "$package_revision" != "$macro_revision"; then
+      if test "$VERSION" != "$macro_version"; then
+        if test -z "$macro_version"; then
+          cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+        else
+          cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+        fi
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+      fi
+
+      exit $EXIT_MISMATCH
+    fi
+}
+
+
+# libtool_options_prep [ARG]...
+# -----------------------------
+# Preparation for options parsed by libtool.
+libtool_options_prep ()
+{
+    $debug_mode
+
+    # Option defaults:
+    opt_config=false
+    opt_dlopen=
+    opt_dry_run=false
+    opt_help=false
+    opt_mode=
+    opt_preserve_dup_deps=false
+    opt_quiet=false
+
+    nonopt=
+    preserve_args=
+
+    # Shorthand for --mode=foo, only valid as the first argument
+    case $1 in
+    clean|clea|cle|cl)
+      shift; set dummy --mode clean ${1+"$@"}; shift
+      ;;
+    compile|compil|compi|comp|com|co|c)
+      shift; set dummy --mode compile ${1+"$@"}; shift
+      ;;
+    execute|execut|execu|exec|exe|ex|e)
+      shift; set dummy --mode execute ${1+"$@"}; shift
+      ;;
+    finish|finis|fini|fin|fi|f)
+      shift; set dummy --mode finish ${1+"$@"}; shift
+      ;;
+    install|instal|insta|inst|ins|in|i)
+      shift; set dummy --mode install ${1+"$@"}; shift
+      ;;
+    link|lin|li|l)
+      shift; set dummy --mode link ${1+"$@"}; shift
+      ;;
+    uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+      shift; set dummy --mode uninstall ${1+"$@"}; shift
+      ;;
+    esac
+
+    # Pass back the list of options.
+    func_quote_for_eval ${1+"$@"}
+    libtool_options_prep_result=$func_quote_for_eval_result
+}
+func_add_hook func_options_prep libtool_options_prep
+
+
+# libtool_parse_options [ARG]...
+# ---------------------------------
+# Provide handling for libtool specific options.
+libtool_parse_options ()
+{
+    $debug_cmd
+
+    # Perform our own loop to consume as many options as possible in
+    # each iteration.
+    while test $# -gt 0; do
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --dry-run|--dryrun|-n)
+                        opt_dry_run=:
+                        ;;
+
+        --config)       func_config ;;
+
+        --dlopen|-dlopen)
+                        opt_dlopen="${opt_dlopen+$opt_dlopen
+}$1"
+                        shift
+                        ;;
+
+        --preserve-dup-deps)
+                        opt_preserve_dup_deps=: ;;
+
+        --features)     func_features ;;
+
+        --finish)       set dummy --mode finish ${1+"$@"}; shift ;;
+
+        --help)         opt_help=: ;;
+
+        --help-all)     opt_help=': help-all' ;;
+
+        --mode)         test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_mode=$1
+                        case $1 in
+                          # Valid mode arguments:
+                          clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+                          # Catch anything else as an error
+                          *) func_error "invalid argument for $_G_opt"
+                             exit_cmd=exit
+                             break
+                             ;;
+                        esac
+                        shift
+                        ;;
+
+        --no-silent|--no-quiet)
+                        opt_quiet=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                        opt_warning=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-verbose)
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --silent|--quiet)
+                        opt_quiet=:
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --tag)          test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_tag=$1
+                        func_append preserve_args " $_G_opt $1"
+                        func_enable_tag "$1"
+                        shift
+                        ;;
+
+        --verbose|-v)   opt_quiet=false
+                        opt_verbose=:
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+	# An option not handled by this hook function:
+        *)		set dummy "$_G_opt" ${1+"$@"};	shift; break  ;;
+      esac
+    done
+
+
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    libtool_parse_options_result=$func_quote_for_eval_result
+}
+func_add_hook func_parse_options libtool_parse_options
+
+
+
+# libtool_validate_options [ARG]...
+# ---------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+libtool_validate_options ()
+{
+    # save first non-option argument
+    if test 0 -lt $#; then
+      nonopt=$1
+      shift
+    fi
+
+    # preserve --debug
+    test : = "$debug_cmd" || func_append preserve_args " --debug"
+
+    case $host in
+      # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
+      # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
+      *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
+        # don't eliminate duplications in $postdeps and $predeps
+        opt_duplicate_compiler_generated_deps=:
+        ;;
+      *)
+        opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+        ;;
+    esac
+
+    $opt_help || {
+      # Sanity checks first:
+      func_check_version_match
+
+      test yes != "$build_libtool_libs" \
+        && test yes != "$build_old_libs" \
+        && func_fatal_configuration "not configured to build any kind of library"
+
+      # Darwin sucks
+      eval std_shrext=\"$shrext_cmds\"
+
+      # Only execute mode is allowed to have -dlopen flags.
+      if test -n "$opt_dlopen" && test execute != "$opt_mode"; then
+        func_error "unrecognized option '-dlopen'"
+        $ECHO "$help" 1>&2
+        exit $EXIT_FAILURE
+      fi
+
+      # Change the help message to a mode-specific one.
+      generic_help=$help
+      help="Try '$progname --help --mode=$opt_mode' for more information."
+    }
+
+    # Pass back the unparsed argument list
+    func_quote_for_eval ${1+"$@"}
+    libtool_validate_options_result=$func_quote_for_eval_result
+}
+func_add_hook func_validate_options libtool_validate_options
+
+
+# Process options as early as possible so that --help and --version
+# can return quickly.
+func_options ${1+"$@"}
+eval set dummy "$func_options_result"; shift
+
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+magic='%%%MAGIC variable%%%'
+magic_exe='%%%MAGIC EXE variable%%%'
+
+# Global variables.
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# func_generated_by_libtool
+# True iff stdin has been generated by Libtool. This function is only
+# a basic sanity check; it will hardly flush out determined imposters.
+func_generated_by_libtool_p ()
+{
+  $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_p file
+# True iff FILE is a libtool '.la' library or '.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool '.la' library or '.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if 'file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case $lalib_p_line in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test yes = "$lalib_p"
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    test -f "$1" &&
+      $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_dirname_and_basename "$1" "" "."
+    func_stripname '' '.exe' "$func_basename_result"
+    func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $debug_cmd
+
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$sp$nl
+      eval cmd=\"$cmd\"
+      IFS=$save_ifs
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# 'FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $debug_cmd
+
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot.  Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+  func_resolve_sysroot_result=$1
+  case $func_resolve_sysroot_result in
+  =*)
+    func_stripname '=' '' "$func_resolve_sysroot_result"
+    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+    ;;
+  esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+  case $lt_sysroot:$1 in
+  ?*:"$lt_sysroot"*)
+    func_stripname "$lt_sysroot" '' "$1"
+    func_replace_sysroot_result='='$func_stripname_result
+    ;;
+  *)
+    # Including no sysroot.
+    func_replace_sysroot_result=$1
+    ;;
+  esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $debug_cmd
+
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	func_append_quoted CC_quoted "$arg"
+      done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_append_quoted CC_quoted "$arg"
+	    done
+	    CC_expanded=`func_echo_all $CC`
+	    CC_quoted_expanded=`func_echo_all $CC_quoted`
+	    case "$@ " in
+	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with '--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=$1
+    if test yes = "$build_libtool_libs"; then
+      write_lobj=\'$2\'
+    else
+      write_lobj=none
+    fi
+
+    if test yes = "$build_old_libs"; then
+      write_oldobj=\'$3\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "$write_libobj"
+    }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+  $debug_cmd
+
+  func_convert_core_file_wine_to_w32_result=$1
+  if test -n "$1"; then
+    # Unfortunately, winepath does not exit with a non-zero error code, so we
+    # are forced to check the contents of stdout. On the other hand, if the
+    # command is not found, the shell will set an exit code of 127 and print
+    # *an error message* to stdout. So we must check for both error code of
+    # zero AND non-empty stdout, which explains the odd construction:
+    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+    if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then
+      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+        $SED -e "$sed_naive_backslashify"`
+    else
+      func_convert_core_file_wine_to_w32_result=
+    fi
+  fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+  $debug_cmd
+
+  # unfortunately, winepath doesn't convert paths, only file names
+  func_convert_core_path_wine_to_w32_result=
+  if test -n "$1"; then
+    oldIFS=$IFS
+    IFS=:
+    for func_convert_core_path_wine_to_w32_f in $1; do
+      IFS=$oldIFS
+      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+      if test -n "$func_convert_core_file_wine_to_w32_result"; then
+        if test -z "$func_convert_core_path_wine_to_w32_result"; then
+          func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result
+        else
+          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+        fi
+      fi
+    done
+    IFS=$oldIFS
+  fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+  $debug_cmd
+
+  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+    if test "$?" -ne 0; then
+      # on failure, ensure result is empty
+      func_cygpath_result=
+    fi
+  else
+    func_cygpath_result=
+    func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'"
+  fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format.  Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+  $debug_cmd
+
+  # awkward: cmd appends spaces to result
+  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+    $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+  $debug_cmd
+
+  if test -z "$2" && test -n "$1"; then
+    func_error "Could not determine host file name corresponding to"
+    func_error "  '$1'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback:
+    func_to_host_file_result=$1
+  fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+  $debug_cmd
+
+  if test -z "$4" && test -n "$3"; then
+    func_error "Could not determine the host path corresponding to"
+    func_error "  '$3'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback.  This is a deliberately simplistic "conversion" and
+    # should not be "improved".  See libtool.info.
+    if test "x$1" != "x$2"; then
+      lt_replace_pathsep_chars="s|$1|$2|g"
+      func_to_host_path_result=`echo "$3" |
+        $SED -e "$lt_replace_pathsep_chars"`
+    else
+      func_to_host_path_result=$3
+    fi
+  fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+  $debug_cmd
+
+  case $4 in
+  $1 ) func_to_host_path_result=$3$func_to_host_path_result
+    ;;
+  esac
+  case $4 in
+  $2 ) func_append func_to_host_path_result "$3"
+    ;;
+  esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via '$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+  $debug_cmd
+
+  $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result.  If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+  $debug_cmd
+
+  case ,$2, in
+    *,"$to_tool_file_cmd",*)
+      func_to_tool_file_result=$1
+      ;;
+    *)
+      $to_tool_file_cmd "$1"
+      func_to_tool_file_result=$func_to_host_file_result
+      ;;
+  esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+  func_to_host_file_result=$1
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_to_host_file_result=$func_convert_core_msys_to_w32_result
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+    # LT_CYGPATH in this case.
+    func_to_host_file_result=`cygpath -m "$1"`
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format.  Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    func_convert_core_file_wine_to_w32 "$1"
+    func_to_host_file_result=$func_convert_core_file_wine_to_w32_result
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result=$func_cygpath_result
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+    func_convert_core_file_wine_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result=$func_cygpath_result
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via '$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format.  If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+#   file name conversion function    : func_convert_file_X_to_Y ()
+#   path conversion function         : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same.  If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+  $debug_cmd
+
+  if test -z "$to_host_path_cmd"; then
+    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+    to_host_path_cmd=func_convert_path_$func_stripname_result
+  fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+  $debug_cmd
+
+  func_init_to_host_path_cmd
+  $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+  func_to_host_path_result=$1
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from ARG.  MSYS
+    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+    # and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result=$func_convert_core_msys_to_w32_result
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format.  Requires a wine environment and
+# a working winepath.  Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result=$func_convert_core_path_wine_to_w32_result
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result=$func_cygpath_result
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from
+    # ARG. msys behavior is inconsistent here, cygpath turns them
+    # into '.;' and ';.', and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result=$func_cygpath_result
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_dll_def_p FILE
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with _LT_DLL_DEF_P in libtool.m4
+func_dll_def_p ()
+{
+  $debug_cmd
+
+  func_dll_def_p_tmp=`$SED -n \
+    -e 's/^[	 ]*//' \
+    -e '/^\(;.*\)*$/d' \
+    -e 's/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p' \
+    -e q \
+    "$1"`
+  test DEF = "$func_dll_def_p_tmp"
+}
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $debug_cmd
+
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile=$nonopt  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg=$arg
+	arg_mode=normal
+	;;
+
+      target )
+	libobj=$arg
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify '-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          func_append pie_flag " $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  func_append later " $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs=$IFS; IFS=,
+	  for arg in $args; do
+	    IFS=$save_ifs
+	    func_append_quoted lastarg "$arg"
+	  done
+	  IFS=$save_ifs
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  func_append base_compile " $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg=$srcfile
+	  srcfile=$arg
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_append_quoted base_compile "$lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with '-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj=$func_basename_result
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from '$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test yes = "$build_libtool_libs" \
+	  || func_fatal_configuration "cannot build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name '$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname=$func_basename_result
+    xdir=$func_dirname_result
+    lobj=$xdir$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test yes = "$build_old_libs"; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test no = "$compiler_c_o"; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext
+      lockfile=$output_obj.lock
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test yes = "$need_locks"; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test warn = "$need_locks"; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support '-c' and '-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      func_append removelist " $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    func_append removelist " $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+    srcfile=$func_to_tool_file_result
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test yes = "$build_libtool_libs"; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test no != "$pic_mode"; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	func_append command " -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test warn = "$need_locks" &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support '-c' and '-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test yes = "$suppress_opt"; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test yes = "$build_old_libs"; then
+      if test yes != "$pic_mode"; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test yes = "$compiler_c_o"; then
+	func_append command " -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      func_append command "$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test warn = "$need_locks" &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support '-c' and '-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test no != "$need_locks"; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+  test compile = "$opt_mode" && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $opt_mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to build PIC objects only
+  -prefer-non-pic   try to build non-PIC objects only
+  -shared           do not build a '.o' file suitable for static linking
+  -static           only build a '.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a 'standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix '.c' with the
+library object suffix, '.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to '-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the '--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the 'install' or 'cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
+  -dlopen FILE      '-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  use a list of object files found in FILE to specify objects
+  -os2dllname NAME  force a short DLL name on OS/2 (no effect on other OSes)
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with '-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in '.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in '.la', then a libtool library is created,
+only library objects ('.lo' files) may be specified, and '-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created
+using 'ar' and 'ranlib', or on Windows using 'lib'.
+
+If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode '$opt_mode'"
+        ;;
+    esac
+
+    echo
+    $ECHO "Try '$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test : = "$opt_help"; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	func_mode_help
+      done
+    } | $SED -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	echo
+	func_mode_help
+      done
+    } |
+    $SED '1d
+      /^When reporting/,/^Report/{
+	H
+	d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $debug_cmd
+
+    # The first argument is the command name.
+    cmd=$nonopt
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $opt_dlopen; do
+      test -f "$file" \
+	|| func_fatal_help "'$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "'$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "'$file' was not linked with '-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir=$func_dirname_result
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  func_append dir "/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir=$func_dirname_result
+	;;
+
+      *)
+	func_warning "'-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir=$absdir
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic=$magic
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -* | *.la | *.lo ) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file=$progdir/$program
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file=$progdir/$program
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_append_quoted args "$file"
+    done
+
+    if $opt_dry_run; then
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    else
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd=\$cmd$args
+    fi
+}
+
+test execute = "$opt_mode" && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $debug_cmd
+
+    libs=
+    libdirs=
+    admincmds=
+
+    for opt in "$nonopt" ${1+"$@"}
+    do
+      if test -d "$opt"; then
+	func_append libdirs " $opt"
+
+      elif test -f "$opt"; then
+	if func_lalib_unsafe_p "$opt"; then
+	  func_append libs " $opt"
+	else
+	  func_warning "'$opt' is not a valid libtool archive"
+	fi
+
+      else
+	func_fatal_error "invalid argument '$opt'"
+      fi
+    done
+
+    if test -n "$libs"; then
+      if test -n "$lt_sysroot"; then
+        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+      else
+        sysroot_cmd=
+      fi
+
+      # Remove sysroot references
+      if $opt_dry_run; then
+        for lib in $libs; do
+          echo "removing references to $lt_sysroot and '=' prefixes from $lib"
+        done
+      else
+        tmpdir=`func_mktempdir`
+        for lib in $libs; do
+	  $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	    > $tmpdir/tmp-la
+	  mv -f $tmpdir/tmp-la $lib
+	done
+        ${RM}r "$tmpdir"
+      fi
+    fi
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || func_append admincmds "
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_quiet && exit $EXIT_SUCCESS
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      echo "----------------------------------------------------------------------"
+      echo "Libraries have been installed in:"
+      for libdir in $libdirs; do
+	$ECHO "   $libdir"
+      done
+      echo
+      echo "If you ever happen to want to link against installed libraries"
+      echo "in a given directory, LIBDIR, you must either use libtool, and"
+      echo "specify the full pathname of the library, or use the '-LLIBDIR'"
+      echo "flag during linking and do at least one of the following:"
+      if test -n "$shlibpath_var"; then
+	echo "   - add LIBDIR to the '$shlibpath_var' environment variable"
+	echo "     during execution"
+      fi
+      if test -n "$runpath_var"; then
+	echo "   - add LIBDIR to the '$runpath_var' environment variable"
+	echo "     during linking"
+      fi
+      if test -n "$hardcode_libdir_flag_spec"; then
+	libdir=LIBDIR
+	eval flag=\"$hardcode_libdir_flag_spec\"
+
+	$ECHO "   - use the '$flag' linker flag"
+      fi
+      if test -n "$admincmds"; then
+	$ECHO "   - have your system administrator run these commands:$admincmds"
+      fi
+      if test -f /etc/ld.so.conf; then
+	echo "   - have your system administrator add LIBDIR to '/etc/ld.so.conf'"
+      fi
+      echo
+
+      echo "See any operating system documentation about shared libraries for"
+      case $host in
+	solaris2.[6789]|solaris2.1[0-9])
+	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	  echo "pages."
+	  ;;
+	*)
+	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
+	  ;;
+      esac
+      echo "----------------------------------------------------------------------"
+    fi
+    exit $EXIT_SUCCESS
+}
+
+test finish = "$opt_mode" && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $debug_cmd
+
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" ||
+       # Allow the use of GNU shtool's install command.
+       case $nonopt in *shtool*) :;; *) false;; esac
+    then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    func_append install_prog "$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=false
+    stripme=
+    no_mode=:
+    for arg
+    do
+      arg2=
+      if test -n "$dest"; then
+	func_append files " $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=: ;;
+      -f)
+	if $install_cp; then :; else
+	  prev=$arg
+	fi
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  if test X-m = "X$prev" && test -n "$install_override_mode"; then
+	    arg2=$install_override_mode
+	    no_mode=false
+	  fi
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      func_append install_prog " $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+	func_quote_for_eval "$arg2"
+      fi
+      func_append install_shared_prog " $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the '$prev' option requires an argument"
+
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+	func_quote_for_eval "$install_override_mode"
+	func_append install_shared_prog " -m $func_quote_for_eval_result"
+      fi
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=:
+    if $isdir; then
+      destdir=$dest
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir=$func_dirname_result
+      destname=$func_basename_result
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "'$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "'$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic=$magic
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	func_append staticlibs " $file"
+	;;
+
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "'$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append current_libdirs " $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append future_libdirs " $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir=$func_dirname_result
+	func_append dir "$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking '$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname=$1
+	  shift
+
+	  srcname=$realname
+	  test -n "$relink_command" && srcname=${realname}T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme=$stripme
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=
+	      ;;
+	    esac
+	    ;;
+	  os2*)
+	    case $realname in
+	    *_dll.a)
+	      tstripme=
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try 'ln -sf' first, because the 'ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib=$destdir/$realname
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name=$func_basename_result
+	instname=$dir/${name}i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && func_append staticlibs " $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile=$destdir/$destname
+	else
+	  func_basename "$file"
+	  destfile=$func_basename_result
+	  destfile=$destdir/$destfile
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest=$destfile
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to '$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test yes = "$build_old_libs"; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile=$destdir/$destname
+	else
+	  func_basename "$file"
+	  destfile=$func_basename_result
+	  destfile=$destdir/$destfile
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=.exe
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script '$wrapper'"
+
+	  finalize=:
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'`
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "'$lib' has not been installed in '$libdir'"
+	      finalize=false
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test no = "$fast_install" && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if $finalize; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file=$func_basename_result
+	        outputname=$tmpdir/$file
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_quiet || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink '$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file=$outputname
+	      else
+	        func_warning "cannot relink '$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name=$func_basename_result
+
+      # Set up the ranlib parameters.
+      oldlib=$destdir/$name
+      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+      tool_oldlib=$func_to_tool_file_result
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run '$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test install = "$opt_mode" && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $debug_cmd
+
+    my_outputname=$1
+    my_originator=$2
+    my_pic_p=${3-false}
+    my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms=${my_outputname}S.c
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist=$output_objdir/$my_outputname.nm
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test yes = "$dlself"; then
+	  func_verbose "generating symbol list for '$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+	    func_verbose "extracting global C symbols from '$func_to_tool_file_result'"
+	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols=$output_objdir/$outputname.exp
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin* | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from '$dlprefile'"
+	  func_basename "$dlprefile"
+	  name=$func_basename_result
+          case $host in
+	    *cygwin* | *mingw* | *cegcc* )
+	      # if an import library, we need to obtain dlname
+	      if func_win32_import_lib_p "$dlprefile"; then
+	        func_tr_sh "$dlprefile"
+	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
+	        dlprefile_dlbasename=
+	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+	          # Use subshell, to avoid clobbering current variable values
+	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+	          if test -n "$dlprefile_dlname"; then
+	            func_basename "$dlprefile_dlname"
+	            dlprefile_dlbasename=$func_basename_result
+	          else
+	            # no lafile. user explicitly requested -dlpreopen <import library>.
+	            $sharedlib_from_linklib_cmd "$dlprefile"
+	            dlprefile_dlbasename=$sharedlib_from_linklib_result
+	          fi
+	        fi
+	        $opt_dry_run || {
+	          if test -n "$dlprefile_dlbasename"; then
+	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+	          else
+	            func_warning "Could not compute DLL name from $name"
+	            eval '$ECHO ": $name " >> "$nlist"'
+	          fi
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+	        }
+	      else # not an import lib
+	        $opt_dry_run || {
+	          eval '$ECHO ": $name " >> "$nlist"'
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	        }
+	      fi
+	    ;;
+	    *)
+	      $opt_dry_run || {
+	        eval '$ECHO ": $name " >> "$nlist"'
+	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	      }
+	    ;;
+          esac
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  func_show_eval '$RM "${nlist}I"'
+	  if test -n "$global_symbol_to_import"; then
+	    eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I'
+	  fi
+
+	  echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];\
+"
+
+	  if test -s "$nlist"I; then
+	    echo >> "$output_objdir/$my_dlsyms" "\
+static void lt_syminit(void)
+{
+  LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols;
+  for (; symbol->name; ++symbol)
+    {"
+	    $SED 's/.*/      if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms"
+	    echo >> "$output_objdir/$my_dlsyms" "\
+    }
+}"
+	  fi
+	  echo >> "$output_objdir/$my_dlsyms" "\
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{ {\"$my_originator\", (void *) 0},"
+
+	  if test -s "$nlist"I; then
+	    echo >> "$output_objdir/$my_dlsyms" "\
+  {\"@INIT@\", (void *) &lt_syminit},"
+	  fi
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  echo >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    $my_pic_p && pic_flag_for_symtable=" $pic_flag"
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) func_append symtab_cflags " $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj=$output_objdir/${my_outputname}S.$objext
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for '$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+  $debug_cmd
+
+  win32_libid_type=unknown
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      case $nm_interface in
+      "MS dumpbin")
+	if func_cygming_ms_implib_p "$1" ||
+	   func_cygming_gnu_implib_p "$1"
+	then
+	  win32_nmres=import
+	else
+	  win32_nmres=
+	fi
+	;;
+      *)
+	func_to_tool_file "$1" func_convert_file_msys_to_w32
+	win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	  $SED -n -e '
+	    1,100{
+		/ I /{
+		    s|.*|import|
+		    p
+		    q
+		}
+	    }'`
+	;;
+      esac
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+  $debug_cmd
+
+  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+  $debug_cmd
+
+  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+    $SED '/^Contents of section '"$match_literal"':/{
+      # Place marker at beginning of archive member dllname section
+      s/.*/====MARK====/
+      p
+      d
+    }
+    # These lines can sometimes be longer than 43 characters, but
+    # are always uninteresting
+    /:[	 ]*file format pe[i]\{,1\}-/d
+    /^In archive [^:]*:/d
+    # Ensure marker is printed
+    /^====MARK====/p
+    # Remove all lines with less than 43 characters
+    /^.\{43\}/!d
+    # From remaining lines, remove first 43 characters
+    s/^.\{43\}//' |
+    $SED -n '
+      # Join marker and all lines until next marker into a single line
+      /^====MARK====/ b para
+      H
+      $ b para
+      b
+      :para
+      x
+      s/\n//g
+      # Remove the marker
+      s/^====MARK====//
+      # Remove trailing dots and whitespace
+      s/[\. \t]*$//
+      # Print
+      /./p' |
+    # we now have a list, one entry per line, of the stringified
+    # contents of the appropriate section of all members of the
+    # archive that possess that section. Heuristic: eliminate
+    # all those that have a first or second character that is
+    # a '.' (that is, objdump's representation of an unprintable
+    # character.) This should work for all archives with less than
+    # 0x302f exports -- but will fail for DLLs whose name actually
+    # begins with a literal '.' or a single character followed by
+    # a '.'.
+    #
+    # Of those that remain, print the first one.
+    $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+  $debug_cmd
+
+  if func_cygming_gnu_implib_p "$1"; then
+    # binutils import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+  elif func_cygming_ms_implib_p "$1"; then
+    # ms-generated import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+  else
+    # unknown
+    sharedlib_from_linklib_result=
+  fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $debug_cmd
+
+    f_ex_an_ar_dir=$1; shift
+    f_ex_an_ar_oldlib=$1
+    if test yes = "$lock_old_archive_extraction"; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+		   'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test yes = "$lock_old_archive_extraction"; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $debug_cmd
+
+    my_gentop=$1; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=
+    my_xlib=
+    my_xabs=
+    my_xdir=
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib=$func_basename_result
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir=$my_gentop/$my_xlib_u
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  func_basename "$darwin_archive"
+	  darwin_base_archive=$func_basename_result
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches; do
+	      func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive"
+	      cd "unfat-$$/$darwin_base_archive-$darwin_arch"
+	      func_extract_an_archive "`pwd`" "$darwin_base_archive"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+    done
+
+    func_extract_archives_result=$my_oldobjs
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory where it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=${1-no}
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ that is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options that match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=\$0
+  shift
+  for lt_opt
+  do
+    case \"\$lt_opt\" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+        cat \"\$lt_dump_D/\$lt_dump_F\"
+        exit 0
+      ;;
+    --lt-*)
+        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n \"\$lt_option_debug\"; then
+    echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+  case $host in
+  # Backslashes separate directories on plain windows
+  *-*-mingw | *-*-os2* | *-cegcc*)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+    ;;
+
+  *)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+    ;;
+  esac
+  $ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  case \" \$* \" in
+  *\\ --lt-*)
+    for lt_wr_arg
+    do
+      case \$lt_wr_arg in
+      --lt-*) ;;
+      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+      esac
+      shift
+    done ;;
+  esac
+  func_exec_program_core \${1+\"\$@\"}
+}
+
+  # Parse options
+  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test yes = "$fast_install"; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	\$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# fixup the dll searchpath if we need to.
+	#
+	# Fix the DLL searchpath if we need to.  Do this before prepending
+	# to shlibpath, because on Windows, both are PATH and uninstalled
+	# libraries must come first.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	# Export our shlibpath_var if we have one.
+	if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+      func_exec_program \${1+\"\$@\"}
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+*/
+EOF
+	    cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
+/* declarations of non-ANSI functions */
+#if defined __MINGW32__
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined __CYGWIN__
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined other_platform || defined ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined _MSC_VER
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+#elif defined __MINGW32__
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined __CYGWIN__
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined other platforms ... */
+#endif
+
+#if defined PATH_MAX
+# define LT_PATHMAX PATH_MAX
+#elif defined MAXPATHLEN
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \
+  defined __OS2__
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free (stale); stale = 0; } \
+} while (0)
+
+#if defined LT_DEBUGWRAPPER
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+	    cat <<EOF
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
+# define externally_visible volatile
+#else
+# define externally_visible __attribute__((externally_visible)) volatile
+#endif
+externally_visible const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_path "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_path "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test yes = "$fast_install"; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  int rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  newargz = XMALLOC (char *, (size_t) argc + 1);
+
+  /* very simple arg parsing; don't want to rely on getopt
+   * also, copy all non cwrapper options to newargz, except
+   * argz[0], which is handled differently
+   */
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (STREQ (argv[i], dumpscript_opt))
+	{
+EOF
+	    case $host in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  lt_dump_script (stdout);
+	  return 0;
+	}
+      if (STREQ (argv[i], debug_opt))
+	{
+          lt_debug = 1;
+          continue;
+	}
+      if (STREQ (argv[i], ltwrapper_option_prefix))
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal (__FILE__, __LINE__,
+		    "unrecognized %s option: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+EOF
+	    cat <<EOF
+  /* The GNU banner must be the first non-error debug message */
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n");
+EOF
+	    cat <<"EOF"
+  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (before symlink chase) at: %s\n",
+		  tmp_pathspec);
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (after symlink chase) at: %s\n",
+		  actual_cwrapper_path);
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(main) libtool target name: %s\n",
+		  target_name);
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
+     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+     because on Windows, both *_VARNAMEs are PATH but uninstalled
+     libraries must come first. */
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+		  nonnull (lt_argv_zero));
+  for (i = 0; i < newargc; i++)
+    {
+      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+		      i, nonnull (newargz[i]));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
+  rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      lt_debugprintf (__FILE__, __LINE__,
+		      "(main) failed to launch target \"%s\": %s\n",
+		      lt_argv_zero, nonnull (strerror (errno)));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  size_t tmp_len;
+  char *concat_name;
+
+  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+                  nonempty (wrapper));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = (size_t) (q - p);
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+                              nonnull (strerror (errno)));
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+              nonnull (strerror (errno)));
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      lt_debugprintf (__FILE__, __LINE__,
+		      "checking path component for symlinks: %s\n",
+		      tmp_pathspec);
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  lt_fatal (__FILE__, __LINE__,
+		    "error accessing file \"%s\": %s",
+		    tmp_pathspec, nonnull (strerror (errno)));
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal (__FILE__, __LINE__,
+		"could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (STREQ (str, pat))
+	*str = '\0';
+    }
+  return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  if (lt_debug)
+    {
+      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+      va_start (args, fmt);
+      (void) vfprintf (stderr, fmt, args);
+      va_end (args);
+    }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+	       int line, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+  va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+  return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+  return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_setenv) setting '%s' to '%s'\n",
+                  nonnull (name), nonnull (value));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    size_t len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      size_t orig_value_len = strlen (orig_value);
+      size_t add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      size_t len = strlen (new_value);
+      while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[--len] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+EOF
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+	new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+	{
+	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+	  size_t length;
+	  unsigned int backslashes;
+	  const char *s;
+	  char *quoted_string;
+	  char *p;
+
+	  length = 0;
+	  backslashes = 0;
+	  if (quote_around)
+	    length++;
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		length += backslashes + 1;
+	      length++;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    length += backslashes + 1;
+
+	  quoted_string = XMALLOC (char, length + 1);
+
+	  p = quoted_string;
+	  backslashes = 0;
+	  if (quote_around)
+	    *p++ = '"';
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		{
+		  unsigned int j;
+		  for (j = backslashes + 1; j > 0; j--)
+		    *p++ = '\\';
+		}
+	      *p++ = c;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    {
+	      unsigned int j;
+	      for (j = backslashes; j > 0; j--)
+		*p++ = '\\';
+	      *p++ = '"';
+	    }
+	  *p = '\0';
+
+	  new_argv[i] = quoted_string;
+	}
+      else
+	new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+		;;
+	    esac
+
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+	    func_emit_wrapper yes |
+	      $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/  fputs ("\1", f);/p
+g
+D'
+            cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $debug_cmd
+
+    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
+# func_suncc_cstd_abi
+# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!!
+# Several compiler flags select an ABI that is incompatible with the
+# Cstd library. Avoid specifying it if any are in CXXFLAGS.
+func_suncc_cstd_abi ()
+{
+    $debug_cmd
+
+    case " $compile_command " in
+    *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*)
+      suncc_use_cstd_abi=no
+      ;;
+    *)
+      suncc_use_cstd_abi=yes
+      ;;
+    esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $debug_cmd
+
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # what system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll that has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    bindir=
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    os2dllname=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=false
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module=$wl-single_module
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test yes != "$build_libtool_libs" \
+	  && func_fatal_configuration "cannot build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg=$1
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	bindir)
+	  bindir=$arg
+	  prev=
+	  continue
+	  ;;
+	dlfiles|dlprefiles)
+	  $preload || {
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=:
+	  }
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test no = "$dlself"; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test dlprefiles = "$prev"; then
+	      dlself=yes
+	    elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test dlfiles = "$prev"; then
+	      func_append dlfiles " $arg"
+	    else
+	      func_append dlprefiles " $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols=$arg
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file '$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex=$arg
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) func_append deplibs " $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir=$arg
+	  prev=
+	  continue
+	  ;;
+	mllvm)
+	  # Clang does not use LLVM to link, so we can simply discard any
+	  # '-mllvm $arg' options when doing the link step.
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      func_append moreargs " $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test none = "$pic_object" &&
+		   test none = "$non_pic_object"; then
+		  func_fatal_error "cannot find name of object for '$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir=$func_dirname_result
+
+		if test none != "$pic_object"; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object=$xdir$pic_object
+
+		  if test dlfiles = "$prev"; then
+		    if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
+		      func_append dlfiles " $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test dlprefiles = "$prev"; then
+		    # Preload the old-style object.
+		    func_append dlprefiles " $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg=$pic_object
+		fi
+
+		# Non-PIC object.
+		if test none != "$non_pic_object"; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object=$xdir$non_pic_object
+
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test none = "$pic_object"; then
+		    arg=$non_pic_object
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object=$pic_object
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir=$func_dirname_result
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "'$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file '$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	os2dllname)
+	  os2dllname=$arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex=$arg
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release=-$arg
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test rpath = "$prev"; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) func_append rpath " $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) func_append xrpath " $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds=$arg
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  func_append weak_libs " $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg=$arg
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "'-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -bindir)
+	prev=bindir
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test X-export-symbols = "X$arg"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname "-L" '' "$arg"
+	if test -z "$func_stripname_result"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between '-L' and '$1'"
+	  else
+	    func_fatal_error "need path for '-L' option"
+	  fi
+	fi
+	func_resolve_sysroot "$func_stripname_result"
+	dir=$func_resolve_sysroot_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of '$dir'"
+	  dir=$absdir
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "* | *" $arg "*)
+	  # Will only happen for absolute or sysroot arguments
+	  ;;
+	*)
+	  # Preserve sysroot, but never include relative directories
+	  case $dir in
+	    [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+	    *) func_append deplibs " -L$dir" ;;
+	  esac
+	  func_append lib_search_path " $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) func_append dllsearchpath ":$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test X-lc = "X$arg" || test X-lm = "X$arg"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test X-lc = "X$arg" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test X-lc = "X$arg" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    func_append deplibs " System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test X-lc = "X$arg" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test X-lc = "X$arg" && continue
+	    ;;
+	  esac
+	elif test X-lc_r = "X$arg"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	func_append deplibs " $arg"
+	continue
+	;;
+
+      -mllvm)
+	prev=mllvm
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot|--sysroot)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) func_append new_inherited_linker_flags " $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module=$wl-multi_module
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "'-no-install' is ignored for $host"
+	  func_warning "assuming '-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -os2dllname)
+	prev=os2dllname
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	=*)
+	  func_stripname '=' '' "$dir"
+	  dir=$lt_sysroot$func_stripname_result
+	  ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) func_append xrpath " $dir" ;;
+	esac
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs=$IFS; IFS=,
+	for flag in $args; do
+	  IFS=$save_ifs
+          func_quote_for_eval "$flag"
+	  func_append arg " $func_quote_for_eval_result"
+	  func_append compiler_flags " $func_quote_for_eval_result"
+	done
+	IFS=$save_ifs
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs=$IFS; IFS=,
+	for flag in $args; do
+	  IFS=$save_ifs
+          func_quote_for_eval "$flag"
+	  func_append arg " $wl$func_quote_for_eval_result"
+	  func_append compiler_flags " $wl$func_quote_for_eval_result"
+	  func_append linker_flags " $func_quote_for_eval_result"
+	done
+	IFS=$save_ifs
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg=$func_quote_for_eval_result
+	;;
+
+      # Flags to be passed through unchanged, with rationale:
+      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
+      # -r[0-9][0-9]*        specify processor for the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+      # +DA*, +DD*           enable 64-bit mode for the HP compiler
+      # -q*                  compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+      # -F/path              path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # -fstack-protector*   stack protector flags for GCC
+      # @file                GCC response files
+      # -tp=*                Portland pgcc target processor selection
+      # --sysroot=*          for sysroot support
+      # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      # -specs=*             GCC specs files
+      # -stdlib=*            select c++ std lib with clang
+      # -fsanitize=*         Clang/GCC memory and address sanitizer
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+      -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
+      -specs=*|-fsanitize=*)
+        func_quote_for_eval "$arg"
+	arg=$func_quote_for_eval_result
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        func_append compiler_flags " $arg"
+        continue
+        ;;
+
+      -Z*)
+        if test os2 = "`expr $host : '.*\(os2\)'`"; then
+          # OS/2 uses -Zxxx to specify OS/2-specific options
+	  compiler_flags="$compiler_flags $arg"
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  case $arg in
+	  -Zlinker | -Zstack)
+	    prev=xcompiler
+	    ;;
+	  esac
+	  continue
+        else
+	  # Otherwise treat like 'Some other compiler flag' below
+	  func_quote_for_eval "$arg"
+	  arg=$func_quote_for_eval_result
+        fi
+	;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg=$func_quote_for_eval_result
+	;;
+
+      *.$objext)
+	# A standard object.
+	func_append objs " $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test none = "$pic_object" &&
+	     test none = "$non_pic_object"; then
+	    func_fatal_error "cannot find name of object for '$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir=$func_dirname_result
+
+	  test none = "$pic_object" || {
+	    # Prepend the subdirectory the object is found in.
+	    pic_object=$xdir$pic_object
+
+	    if test dlfiles = "$prev"; then
+	      if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
+		func_append dlfiles " $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test dlprefiles = "$prev"; then
+	      # Preload the old-style object.
+	      func_append dlprefiles " $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg=$pic_object
+	  }
+
+	  # Non-PIC object.
+	  if test none != "$non_pic_object"; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object=$xdir$non_pic_object
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test none = "$pic_object"; then
+	      arg=$non_pic_object
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object=$pic_object
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir=$func_dirname_result
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "'$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	func_append deplibs " $arg"
+	func_append old_deplibs " $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	func_resolve_sysroot "$arg"
+	if test dlfiles = "$prev"; then
+	  # This library was specified with -dlopen.
+	  func_append dlfiles " $func_resolve_sysroot_result"
+	  prev=
+	elif test dlprefiles = "$prev"; then
+	  # The library was specified with -dlpreopen.
+	  func_append dlprefiles " $func_resolve_sysroot_result"
+	  prev=
+	else
+	  func_append deplibs " $func_resolve_sysroot_result"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg=$func_quote_for_eval_result
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the '$prevarg' option requires an argument"
+
+    if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname=$func_basename_result
+    libobjs_save=$libobjs
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    # Definition is injected by LT_CONFIG during libtool generation.
+    func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH"
+
+    func_dirname "$output" "/" ""
+    output_objdir=$func_dirname_result$objdir
+    func_to_tool_file "$output_objdir/"
+    tool_output_objdir=$func_to_tool_file_result
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_preserve_dup_deps; then
+	case "$libs " in
+	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	esac
+      fi
+      func_append libs " $deplib"
+    done
+
+    if test lib = "$linkmode"; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
+	  esac
+	  func_append pre_post_deps " $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can '-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=false
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test lib,link = "$linkmode,$pass"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs=$tmp_deplibs
+      fi
+
+      if test lib,link = "$linkmode,$pass" ||
+	 test prog,scan = "$linkmode,$pass"; then
+	libs=$deplibs
+	deplibs=
+      fi
+      if test prog = "$linkmode"; then
+	case $pass in
+	dlopen) libs=$dlfiles ;;
+	dlpreopen) libs=$dlprefiles ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
+	esac
+      fi
+      if test lib,dlpreopen = "$linkmode,$pass"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  func_resolve_sysroot "$lib"
+	  case $lib in
+	  *.la)	func_source "$func_resolve_sysroot_result" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+	    func_basename "$deplib"
+            deplib_base=$func_basename_result
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) func_append deplibs " $deplib" ;;
+	    esac
+	  done
+	done
+	libs=$dlprefiles
+      fi
+      if test dlopen = "$pass"; then
+	# Collect dlpreopened libraries
+	save_deplibs=$deplibs
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=false
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	  if test prog,link = "$linkmode,$pass"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    func_append compiler_flags " $deplib"
+	    if test lib = "$linkmode"; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test lib != "$linkmode" && test prog != "$linkmode"; then
+	    func_warning "'-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test lib = "$linkmode"; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib=$searchdir/lib$name$search_ext
+	      if test -f "$lib"; then
+		if test .la = "$search_ext"; then
+		  found=:
+		else
+		  found=false
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if $found; then
+	    # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll=$l
+		  done
+		  if test "X$ll" = "X$old_library"; then # only static version available
+		    found=false
+		    func_dirname "$lib" "" "."
+		    ladir=$func_dirname_result
+		    lib=$ladir/$old_library
+		    if test prog,link = "$linkmode,$pass"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  else
+	    # deplib doesn't seem to be a libtool library
+	    if test prog,link = "$linkmode,$pass"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test prog,link = "$linkmode,$pass"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test lib = "$linkmode"; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test conv = "$pass" && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  prog)
+	    if test conv = "$pass"; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test scan = "$pass"; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  *)
+	    func_warning "'-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test link = "$pass"; then
+	    func_stripname '-R' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    dir=$func_resolve_sysroot_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) func_append xrpath " $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la)
+	  func_resolve_sysroot "$deplib"
+	  lib=$func_resolve_sysroot_result
+	  ;;
+	*.$libext)
+	  if test conv = "$pass"; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=false
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=:
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=:
+		;;
+	      esac
+	      if $valid_a_lib; then
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      else
+		echo
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because the file extensions .$libext of this argument makes me believe"
+		echo "*** that it is just a static archive that I should not use here."
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test link != "$pass"; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test conv = "$pass"; then
+	    deplibs="$deplib $deplibs"
+	  elif test prog = "$linkmode"; then
+	    if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      func_append newdlprefiles " $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      func_append newdlfiles " $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=:
+	  continue
+	  ;;
+	esac # case $deplib
+
+	$found || test -f "$lib" \
+	  || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'"
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "'$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir=$func_dirname_result
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test lib,link = "$linkmode,$pass" ||
+	   test prog,scan = "$linkmode,$pass" ||
+	   { test prog != "$linkmode" && test lib != "$linkmode"; }; then
+	  test -n "$dlopen" && func_append dlfiles " $dlopen"
+	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+	fi
+
+	if test conv = "$pass"; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for '$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    func_append convenience " $ladir/$objdir/$old_library"
+	    func_append old_convenience " $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+	      if $opt_preserve_dup_deps; then
+		case "$tmp_libs " in
+		*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+		esac
+	      fi
+	      func_append tmp_libs " $deplib"
+	    done
+	  elif test prog != "$linkmode" && test lib != "$linkmode"; then
+	    func_fatal_error "'$lib' is not a convenience library"
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	if test -n "$old_library" &&
+	   { test yes = "$prefer_static_libs" ||
+	     test built,no = "$prefer_static_libs,$installed"; }; then
+	  linklib=$old_library
+	else
+	  for l in $old_library $library_names; do
+	    linklib=$l
+	  done
+	fi
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for '$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test dlopen = "$pass"; then
+	  test -z "$libdir" \
+	    && func_fatal_error "cannot -dlopen a convenience library: '$lib'"
+	  if test -z "$dlname" ||
+	     test yes != "$dlopen_support" ||
+	     test no = "$build_libtool_libs"
+	  then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    func_append dlprefiles " $lib $dependency_libs"
+	  else
+	    func_append newdlfiles " $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of '$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir=$ladir
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname=$func_basename_result
+
+	# Find the relevant object directory and library name.
+	if test yes = "$installed"; then
+	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library '$lib' was moved."
+	    dir=$ladir
+	    absdir=$abs_ladir
+	    libdir=$abs_ladir
+	  else
+	    dir=$lt_sysroot$libdir
+	    absdir=$lt_sysroot$libdir
+	  fi
+	  test yes = "$hardcode_automatic" && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir=$ladir
+	    absdir=$abs_ladir
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  else
+	    dir=$ladir/$objdir
+	    absdir=$abs_ladir/$objdir
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test dlpreopen = "$pass"; then
+	  if test -z "$libdir" && test prog = "$linkmode"; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'"
+	  fi
+	  case $host in
+	    # special handling for platforms with PE-DLLs.
+	    *cygwin* | *mingw* | *cegcc* )
+	      # Linker will automatically link against shared library if both
+	      # static and shared are present.  Therefore, ensure we extract
+	      # symbols from the import library if a shared library is present
+	      # (otherwise, the dlopen module name will be incorrect).  We do
+	      # this by putting the import library name into $newdlprefiles.
+	      # We recover the dlopen module name by 'saving' the la file
+	      # name in a special purpose variable, and (later) extracting the
+	      # dlname from the la file.
+	      if test -n "$dlname"; then
+	        func_tr_sh "$dir/$linklib"
+	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+	        func_append newdlprefiles " $dir/$linklib"
+	      else
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      fi
+	    ;;
+	    * )
+	      # Prefer using a static library (so that no silly _DYNAMIC symbols
+	      # are required to link).
+	      if test -n "$old_library"; then
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      # Otherwise, use the dlname, so that lt_dlopen finds it.
+	      elif test -n "$dlname"; then
+	        func_append newdlprefiles " $dir/$dlname"
+	      else
+	        func_append newdlprefiles " $dir/$linklib"
+	      fi
+	    ;;
+	  esac
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test lib = "$linkmode"; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test prog,link = "$linkmode,$pass"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test prog = "$linkmode" && test link != "$pass"; then
+	  func_append newlib_search_path " $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=false
+	  if test no != "$link_all_deplibs" || test -z "$library_names" ||
+	     test no = "$build_libtool_libs"; then
+	    linkalldeplibs=:
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         func_resolve_sysroot "$func_stripname_result"
+	         func_append newlib_search_path " $func_resolve_sysroot_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if $linkalldeplibs; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_preserve_dup_deps; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test prog,link = "$linkmode,$pass"; then
+	  if test -n "$library_names" &&
+	     { { test no = "$prefer_static_libs" ||
+	         test built,yes = "$prefer_static_libs,$installed"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then
+	      # Make sure the rpath contains only unique directories.
+	      case $temp_rpath: in
+	      *"$absdir:"*) ;;
+	      *) func_append temp_rpath "$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if $alldeplibs &&
+	     { test pass_all = "$deplibs_check_method" ||
+	       { test yes = "$build_libtool_libs" &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test built = "$use_static_libs" && test yes = "$installed"; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test no = "$use_static_libs" || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc* | *os2*)
+	      # No point in relinking DLLs because paths are not encoded
+	      func_append notinst_deplibs " $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test no = "$installed"; then
+	      func_append notinst_deplibs " $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule=$dlpremoduletest
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then
+	    echo
+	    if test prog = "$linkmode"; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test lib = "$linkmode" &&
+	     test yes = "$hardcode_into_libs"; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname=$1
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname=$dlname
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc* | *os2*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix=-$major
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname=$realname
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot=$soname
+	    func_basename "$soroot"
+	    soname=$func_basename_result
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from '$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for '$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test prog = "$linkmode" || test relink != "$opt_mode"; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test no = "$hardcode_direct"; then
+		add=$dir/$linklib
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;
+		  *-*-sysv4*uw2*) add_dir=-L$dir ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir=-L$dir ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we cannot
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library"; then
+			  echo
+			  echo "*** And there doesn't seem to be a static archive available"
+			  echo "*** The link will probably fail, sorry"
+			else
+			  add=$dir/$old_library
+			fi
+		      elif test -n "$old_library"; then
+			add=$dir/$old_library
+		      fi
+		    fi
+		esac
+	      elif test no = "$hardcode_minus_L"; then
+		case $host in
+		*-*-sunos*) add_shlibpath=$dir ;;
+		esac
+		add_dir=-L$dir
+		add=-l$name
+	      elif test no = "$hardcode_shlibpath_var"; then
+		add_shlibpath=$dir
+		add=-l$name
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test yes = "$hardcode_direct" &&
+	         test no = "$hardcode_direct_absolute"; then
+		add=$dir/$linklib
+	      elif test yes = "$hardcode_minus_L"; then
+		add_dir=-L$absdir
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      func_append add_dir " -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add=-l$name
+	      elif test yes = "$hardcode_shlibpath_var"; then
+		add_shlibpath=$dir
+		add=-l$name
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test yes != "$lib_linked"; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test prog = "$linkmode"; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test yes != "$hardcode_direct" &&
+		 test yes != "$hardcode_minus_L" &&
+		 test yes = "$hardcode_shlibpath_var"; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) func_append finalize_shlibpath "$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test prog = "$linkmode" || test relink = "$opt_mode"; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test yes = "$hardcode_direct" &&
+	       test no = "$hardcode_direct_absolute"; then
+	      add=$libdir/$linklib
+	    elif test yes = "$hardcode_minus_L"; then
+	      add_dir=-L$libdir
+	      add=-l$name
+	    elif test yes = "$hardcode_shlibpath_var"; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) func_append finalize_shlibpath "$libdir:" ;;
+	      esac
+	      add=-l$name
+	    elif test yes = "$hardcode_automatic"; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib"; then
+		add=$inst_prefix_dir$libdir/$linklib
+	      else
+		add=$libdir/$linklib
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir=-L$libdir
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    func_append add_dir " -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add=-l$name
+	    fi
+
+	    if test prog = "$linkmode"; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test prog = "$linkmode"; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test unsupported != "$hardcode_direct"; then
+	    test -n "$old_library" && linklib=$old_library
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test yes = "$build_libtool_libs"; then
+	  # Not a shared library
+	  if test pass_all != "$deplibs_check_method"; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    echo
+	    $ECHO "*** Warning: This system cannot link to static lib archive $lib."
+	    echo "*** I have the capability to make that library automatically link in when"
+	    echo "*** you link to this library.  But I can only do this if you have a"
+	    echo "*** shared version of the library, which you do not appear to have."
+	    if test yes = "$module"; then
+	      echo "*** But as you try to build a module library, libtool will still create "
+	      echo "*** a static module, that should work as long as the dlopening application"
+	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		echo
+		echo "*** However, this would only work if libtool was able to extract symbol"
+		echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
+		echo "*** not find such a program.  So, this module is probably useless."
+		echo "*** 'nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test no = "$build_old_libs"; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test lib = "$linkmode"; then
+	  if test -n "$dependency_libs" &&
+	     { test yes != "$hardcode_into_libs" ||
+	       test yes = "$build_old_libs" ||
+	       test yes = "$link_static"; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) func_append xrpath " $temp_xrpath";;
+		   esac;;
+	      *) func_append temp_deplibs " $libdir";;
+	      esac
+	    done
+	    dependency_libs=$temp_deplibs
+	  fi
+
+	  func_append newlib_search_path " $absdir"
+	  # Link against this library
+	  test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    case $deplib in
+              -L*) func_stripname '-L' '' "$deplib"
+                   func_resolve_sysroot "$func_stripname_result";;
+              *) func_resolve_sysroot "$deplib" ;;
+            esac
+	    if $opt_preserve_dup_deps; then
+	      case "$tmp_libs " in
+	      *" $func_resolve_sysroot_result "*)
+                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $func_resolve_sysroot_result"
+	  done
+
+	  if test no != "$link_all_deplibs"; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path=$deplib ;;
+	      *.la)
+	        func_resolve_sysroot "$deplib"
+	        deplib=$func_resolve_sysroot_result
+	        func_dirname "$deplib" "" "."
+		dir=$func_dirname_result
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of '$dir'"
+		    absdir=$dir
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names"; then
+		    for tmp in $deplibrary_names; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl"; then
+		      depdepl=$absdir/$objdir/$depdepl
+		      darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`$OTOOL64 -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl"
+		      func_append linker_flags " -dylib_file $darwin_install_name:$depdepl"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path=-L$absdir/$objdir
+		  ;;
+		esac
+		else
+		  eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "'$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "'$deplib' seems to be moved"
+
+		  path=-L$absdir
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test link = "$pass"; then
+	if test prog = "$linkmode"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs=$newdependency_libs
+      if test dlpreopen = "$pass"; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test dlopen != "$pass"; then
+	test conv = "$pass" || {
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) func_append lib_search_path " $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	}
+
+	if test prog,link = "$linkmode,$pass"; then
+	  vars="compile_deplibs finalize_deplibs"
+	else
+	  vars=deplibs
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) func_append tmp_libs " $deplib" ;;
+	      esac
+	      ;;
+	    *) func_append tmp_libs " $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+
+      # Add Sun CC postdeps if required:
+      test CXX = "$tagname" && {
+        case $host_os in
+        linux*)
+          case `$CC -V 2>&1 | sed 5q` in
+          *Sun\ C*) # Sun C++ 5.9
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+
+        solaris*)
+          func_cc_basename "$CC"
+          case $func_cc_basename_result in
+          CC* | sunCC*)
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+        esac
+      }
+
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=
+	  ;;
+	esac
+	if test -n "$i"; then
+	  func_append tmp_libs " $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test prog = "$linkmode"; then
+      dlfiles=$newdlfiles
+    fi
+    if test prog = "$linkmode" || test lib = "$linkmode"; then
+      dlprefiles=$newdlprefiles
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+	func_warning "'-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "'-l' and '-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "'-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "'-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "'-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "'-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "'-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs=$output
+      func_append objs "$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form 'libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test no = "$module" \
+	  && func_fatal_help "libtool library '$output' must begin with 'lib'"
+
+	if test no != "$need_lib_prefix"; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test pass_all != "$deplibs_check_method"; then
+	  func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs"
+	else
+	  echo
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  func_append libobjs " $objs"
+	fi
+      fi
+
+      test no = "$dlself" \
+	|| func_warning "'-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test 1 -lt "$#" \
+	&& func_warning "ignoring multiple '-rpath's for a libtool library"
+
+      install_libdir=$1
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test yes = "$build_libtool_libs"; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a '.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "'-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "'-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs=$IFS; IFS=:
+	set dummy $vinfo 0 0 0
+	shift
+	IFS=$save_ifs
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to '-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major=$1
+	  number_minor=$2
+	  number_revision=$3
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # that has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  # correct linux to gnu/linux during the next big refactor
+	  darwin|freebsd-elf|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age=$number_minor
+	    revision=$number_revision
+	    ;;
+	  freebsd-aout|qnx|sunos)
+	    current=$number_major
+	    revision=$number_minor
+	    age=0
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age=$number_minor
+	    revision=$number_minor
+	    lt_irix_increment=no
+	    ;;
+	  *)
+	    func_fatal_configuration "$modename: unknown library version type '$version_type'"
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current=$1
+	  revision=$2
+	  age=$3
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT '$current' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION '$revision' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE '$age' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE '$age' is greater than the current interface number '$current'"
+	  func_fatal_error "'$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=$major.$age.$revision
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+          # On Darwin other compilers
+          case $CC in
+              nagfor*)
+                  verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+                  ;;
+              *)
+                  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+                  ;;
+          esac
+	  ;;
+
+	freebsd-aout)
+	  major=.$current
+	  versuffix=.$current.$revision
+	  ;;
+
+	freebsd-elf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=$major.$age.$revision
+	  ;;
+
+	irix | nonstopux)
+	  if test no = "$lt_irix_increment"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring=$verstring_prefix$major.$revision
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test 0 -ne "$loop"; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring=$verstring_prefix$major.$iface:$verstring
+	  done
+
+	  # Before this point, $major must not contain '.'.
+	  major=.$major
+	  versuffix=$major.$revision
+	  ;;
+
+	linux) # correct to gnu/linux during the next big refactor
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=$major.$age.$revision
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=.$current.$age.$revision
+	  verstring=$current.$age.$revision
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test 0 -ne "$loop"; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring=$verstring:$iface.0
+	  done
+
+	  # Make executables depend on our current version.
+	  func_append verstring ":$current.0"
+	  ;;
+
+	qnx)
+	  major=.$current
+	  versuffix=.$current
+	  ;;
+
+	sco)
+	  major=.$current
+	  versuffix=.$current
+	  ;;
+
+	sunos)
+	  major=.$current
+	  versuffix=.$current.$revision
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 file systems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix=-$major
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type '$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring=0.0
+	    ;;
+	  esac
+	  if test no = "$need_version"; then
+	    versuffix=
+	  else
+	    versuffix=.0.0
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test yes,no = "$avoid_version,$need_version"; then
+	  major=
+	  versuffix=
+	  verstring=
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test yes = "$allow_undefined"; then
+	  if test unsupported = "$allow_undefined_flag"; then
+	    if test yes = "$build_old_libs"; then
+	      func_warning "undefined symbols not allowed in $host shared libraries; building static only"
+	      build_libtool_libs=no
+	    else
+	      func_fatal_error "can't build $host shared library unless -no-undefined is specified"
+	    fi
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag=$no_undefined_flag
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" :
+      func_append libobjs " $symfileobj"
+      test " " = "$libobjs" && libobjs=
+
+      if test relink != "$opt_mode"; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*)
+	       if test -n "$precious_files_regex"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       func_append removelist " $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then
+	func_append oldlibs " $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  func_replace_sysroot "$libdir"
+	  func_append temp_xrpath " -R$func_replace_sysroot_result"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+	if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles=$dlfiles
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) func_append dlfiles " $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles=$dlprefiles
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) func_append dlprefiles " $lib" ;;
+	esac
+      done
+
+      if test yes = "$build_libtool_libs"; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    func_append deplibs " System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test yes = "$build_libtool_need_lc"; then
+	      func_append deplibs " -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=
+	versuffix=
+	major=
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    func_append newdeplibs " $i"
+		    i=
+		    ;;
+		  esac
+		fi
+		if test -n "$i"; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
+		    func_append newdeplibs " $i"
+		  else
+		    droppeddeps=yes
+		    echo
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    echo "*** I have the capability to make that library automatically link in when"
+		    echo "*** you link to this library.  But I can only do this if you have a"
+		    echo "*** shared version of the library, which I believe you do not have"
+		    echo "*** because a test_compile did reveal that the linker did not use it for"
+		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      func_append newdeplibs " $i"
+		      i=
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i"; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
+		      func_append newdeplibs " $i"
+		    else
+		      droppeddeps=yes
+		      echo
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      echo "*** I have the capability to make that library automatically link in when"
+		      echo "*** you link to this library.  But I can only do this if you have a"
+		      echo "*** shared version of the library, which you do not appear to have"
+		      echo "*** because a test_compile did reveal that the linker did not use this one"
+		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  echo
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  echo "*** make it link in!  You will probably need to install it or some"
+		  echo "*** library that it depends on before this library will be fully"
+		  echo "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib"; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		if test -n "$file_magic_glob"; then
+		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+		else
+		  libnameglob=$libname
+		fi
+		test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  if test yes = "$want_nocaseglob"; then
+		    shopt -s nocaseglob
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		    $nocaseglob
+		  else
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		  fi
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib=$potent_lib
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | $SED 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;;
+			*) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			func_append newdeplibs " $a_deplib"
+			a_deplib=
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib"; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib"; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib"; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib=$potent_lib # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      func_append newdeplibs " $a_deplib"
+		      a_deplib=
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib"; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib"; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=
+	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+	  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+	    for i in $predeps $postdeps; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"`
+	    done
+	  fi
+	  case $tmp_deplibs in
+	  *[!\	\ ]*)
+	    echo
+	    if test none = "$deplibs_check_method"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	    ;;
+	  esac
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test yes = "$droppeddeps"; then
+	  if test yes = "$module"; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** 'nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test no = "$build_old_libs"; then
+	      oldlibs=$output_objdir/$libname.$libext
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+
+	    if test no = "$allow_undefined"; then
+	      echo
+	      echo "*** Since this library must not contain undefined symbols,"
+	      echo "*** because either the platform does not support them or"
+	      echo "*** it was explicitly requested with -no-undefined,"
+	      echo "*** libtool will only create a static version of it."
+	      if test no = "$build_old_libs"; then
+		oldlibs=$output_objdir/$libname.$libext
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      deplibs=$new_libs
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test yes = "$build_libtool_libs"; then
+	# Remove $wl instances when linking with ld.
+	# FIXME: should test the right _cmds variable.
+	case $archive_cmds in
+	  *\$LD\ *) wl= ;;
+        esac
+	if test yes = "$hardcode_into_libs"; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath=$finalize_rpath
+	  test relink = "$opt_mode" || rpath=$compile_rpath$rpath
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		func_replace_sysroot "$libdir"
+		libdir=$func_replace_sysroot_result
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs=$libdir
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		func_append dep_rpath " $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append perm_rpath " $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir=$hardcode_libdirs
+	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      func_append rpath "$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath=$finalize_shlibpath
+	test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname=$1
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname=$realname
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib=$output_objdir/$realname
+	linknames=
+	for link
+	do
+	  func_append linknames " $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols=$output_objdir/$libname.uexp
+	  func_append delfiles " $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    func_dll_def_p "$export_symbols" || {
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols=$export_symbols
+	      export_symbols=
+	      always_export_symbols=yes
+	    }
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for '$libname.la'"
+	    export_symbols=$output_objdir/$libname.exp
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs=$IFS; IFS='~'
+	    for cmd1 in $cmds; do
+	      IFS=$save_ifs
+	      # Take the normal branch if the nm_file_list_spec branch
+	      # doesn't work or if tool conversion is not needed.
+	      case $nm_file_list_spec~$to_tool_file_cmd in
+		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+		  try_normal_branch=yes
+		  eval cmd=\"$cmd1\"
+		  func_len " $cmd"
+		  len=$func_len_result
+		  ;;
+		*)
+		  try_normal_branch=no
+		  ;;
+	      esac
+	      if test yes = "$try_normal_branch" \
+		 && { test "$len" -lt "$max_cmd_len" \
+		      || test "$max_cmd_len" -le -1; }
+	      then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      elif test -n "$nm_file_list_spec"; then
+		func_basename "$output"
+		output_la=$func_basename_result
+		save_libobjs=$libobjs
+		save_output=$output
+		output=$output_objdir/$output_la.nm
+		func_to_tool_file "$output"
+		libobjs=$nm_file_list_spec$func_to_tool_file_result
+		func_append delfiles " $output"
+		func_verbose "creating $NM input file list: $output"
+		for obj in $save_libobjs; do
+		  func_to_tool_file "$obj"
+		  $ECHO "$func_to_tool_file_result"
+		done > "$output"
+		eval cmd=\"$cmd1\"
+		func_show_eval "$cmd" 'exit $?'
+		output=$save_output
+		libobjs=$save_libobjs
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS=$save_ifs
+	    if test -n "$export_symbols_regex" && test : != "$skipped_export"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols=$export_symbols
+	  test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
+	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	fi
+
+	if test : != "$skipped_export" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands, which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    func_append tmp_deplibs " $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs=$tmp_deplibs
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test yes = "$compiler_needs_object" &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop=$output_objdir/${outputname}x
+	    func_append generated " $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    func_append libobjs " $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  func_append linker_flags " $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test relink = "$opt_mode"; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test yes = "$module" && test -n "$module_cmds"; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test : != "$skipped_export" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  func_basename "$output"
+	  output_la=$func_basename_result
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
+	    output=$output_objdir/$output_la.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    echo 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    echo ')' >> $output
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$func_to_tool_file_result
+	  elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
+	    output=$output_objdir/$output_la.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test yes = "$compiler_needs_object"; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-$k.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test -z "$objlist" ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test 1 -eq "$k"; then
+		    # The first file doesn't have a previous command to add.
+		    reload_objs=$objlist
+		    eval concat_cmds=\"$reload_cmds\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    reload_objs="$objlist $last_robj"
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-$k.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-$k.$objext
+		  objlist=" $obj"
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      reload_objs="$objlist $last_robj"
+	      eval concat_cmds=\"\$concat_cmds$reload_cmds\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	      func_append delfiles " $output"
+
+	    else
+	      output=
+	    fi
+
+	    ${skipped_export-false} && {
+	      func_verbose "generating symbol list for '$libname.la'"
+	      export_symbols=$output_objdir/$libname.exp
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    }
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs=$IFS; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS=$save_ifs
+	      $opt_quiet || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test relink = "$opt_mode"; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS=$save_ifs
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          ${skipped_export-false} && {
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols=$export_symbols
+	      test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
+	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands, which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  }
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test yes = "$module" && test -n "$module_cmds"; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop=$output_objdir/${outputname}x
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append libobjs " $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs=$IFS; IFS='~'
+	for cmd in $cmds; do
+	  IFS=$sp$nl
+	  eval cmd=\"$cmd\"
+	  IFS=$save_ifs
+	  $opt_quiet || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test relink = "$opt_mode"; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS=$save_ifs
+
+	# Restore the uninstalled library and exit
+	if test relink = "$opt_mode"; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test yes = "$module" || test yes = "$export_dynamic"; then
+	  # On all known operating systems, these are identical.
+	  dlname=$soname
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+	func_warning "'-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "'-l' and '-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "'-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "'-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "'-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "'-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object '$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj=$output
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # if reload_cmds runs $LD directly, get rid of -Wl from
+      # whole_archive_flag_spec and hope we can get by with turning comma
+      # into space.
+      case $reload_cmds in
+        *\$LD[\ \$]*) wl= ;;
+      esac
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	  reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags
+	else
+	  gentop=$output_objdir/${obj}x
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # If we're not building shared, we need to use non_pic_objs
+      test yes = "$build_libtool_libs" || libobjs=$non_pic_objects
+
+      # Create the old-style object.
+      reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs
+
+      output=$obj
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      test yes = "$build_libtool_libs" || {
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      }
+
+      if test -n "$pic_flag" || test default != "$pic_mode"; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output=$libobj
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "'-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "'-release' is ignored for programs"
+
+      $preload \
+	&& test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \
+	&& func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test CXX = "$tagname"; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      func_append compile_command " $wl-bind_at_load"
+	      func_append finalize_command " $wl-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      compile_deplibs=$new_libs
+
+
+      func_append compile_command " $compile_deplibs"
+      func_append finalize_command " $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs=$libdir
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append perm_rpath " $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) func_append dllsearchpath ":$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir=$hardcode_libdirs
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath=$rpath
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs=$libdir
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_perm_rpath " $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir=$hardcode_libdirs
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath=$rpath
+
+      if test -n "$libobjs" && test yes = "$build_old_libs"; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" false
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=:
+      case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=false
+        ;;
+      *cygwin* | *mingw* )
+        test yes = "$build_libtool_libs" || wrappers_required=false
+        ;;
+      *)
+        if test no = "$need_relink" || test yes != "$build_libtool_libs"; then
+          wrappers_required=false
+        fi
+        ;;
+      esac
+      $wrappers_required || {
+	# Replace the output file specification.
+	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	link_command=$compile_command$compile_rpath
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.$objext"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.$objext"'
+	fi
+
+	exit $exit_status
+      }
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test yes = "$no_install"; then
+	# We don't need to create a wrapper script.
+	link_command=$compile_var$compile_command$compile_rpath
+	# Replace the output file specification.
+	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      case $hardcode_action,$fast_install in
+        relink,*)
+	  # Fast installation is not supported
+	  link_command=$compile_var$compile_command$compile_rpath
+	  relink_command=$finalize_var$finalize_command$finalize_rpath
+
+	  func_warning "this platform does not like uninstalled shared libraries"
+	  func_warning "'$output' will be relinked during installation"
+	  ;;
+        *,yes)
+	  link_command=$finalize_var$compile_command$finalize_rpath
+	  relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+          ;;
+	*,no)
+	  link_command=$compile_var$compile_command$compile_rpath
+	  relink_command=$finalize_var$finalize_command$finalize_rpath
+          ;;
+	*,needless)
+	  link_command=$finalize_var$compile_command$finalize_rpath
+	  relink_command=
+          ;;
+      esac
+
+      # Replace the output file specification.
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      if test -n "$postlink_cmds"; then
+	func_to_tool_file "$output_objdir/$outputname"
+	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	func_execute_cmds "$postlink_cmds" 'exit $?'
+      fi
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource=$output_path/$objdir/lt-$output_name.c
+	    cwrapper=$output_path/$output_name.exe
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host"; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      case $build_libtool_libs in
+        convenience)
+	  oldobjs="$libobjs_save $symfileobj"
+	  addlibs=$convenience
+	  build_libtool_libs=no
+	  ;;
+	module)
+	  oldobjs=$libobjs_save
+	  addlibs=$old_convenience
+	  build_libtool_libs=no
+          ;;
+	*)
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  $preload && test -f "$symfileobj" \
+	    && func_append oldobjs " $symfileobj"
+	  addlibs=$old_convenience
+	  ;;
+      esac
+
+      if test -n "$addlibs"; then
+	gentop=$output_objdir/${outputname}x
+	func_append generated " $gentop"
+
+	func_extract_archives $gentop $addlibs
+	func_append oldobjs " $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop=$output_objdir/${outputname}x
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append oldobjs " $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  echo "copying selected object files to avoid basename conflicts..."
+	  gentop=$output_objdir/${outputname}x
+	  func_append generated " $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase=$func_basename_result
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      func_append oldobjs " $gentop/$newobj"
+	      ;;
+	    *) func_append oldobjs " $obj" ;;
+	    esac
+	  done
+	fi
+	func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+	tool_oldlib=$func_to_tool_file_result
+	eval cmds=\"$old_archive_cmds\"
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	elif test -n "$archiver_list_spec"; then
+	  func_verbose "using command file archive linking..."
+	  for obj in $oldobjs
+	  do
+	    func_to_tool_file "$obj"
+	    $ECHO "$func_to_tool_file_result"
+	  done > $output_objdir/$libname.libcmd
+	  func_to_tool_file "$output_objdir/$libname.libcmd"
+	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj"; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test -z "$oldobjs"; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test yes = "$build_old_libs" && old_library=$libname.$libext
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      if test yes = "$hardcode_automatic"; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test yes = "$installed"; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output=$output_objdir/${outputname}i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name=$func_basename_result
+		func_resolve_sysroot "$deplib"
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+		test -z "$libdir" && \
+		  func_fatal_error "'$deplib' is not a valid libtool archive"
+		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      -L*)
+		func_stripname -L '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -L$func_replace_sysroot_result"
+		;;
+	      -R*)
+		func_stripname -R '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -R$func_replace_sysroot_result"
+		;;
+	      *) func_append newdependency_libs " $deplib" ;;
+	      esac
+	    done
+	    dependency_libs=$newdependency_libs
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name=$func_basename_result
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "'$lib' is not a valid libtool archive"
+		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      *) func_append newdlfiles " $lib" ;;
+	      esac
+	    done
+	    dlfiles=$newdlfiles
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name=$func_basename_result
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "'$lib' is not a valid libtool archive"
+		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles=$newdlprefiles
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlfiles " $abs"
+	    done
+	    dlfiles=$newdlfiles
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlprefiles " $abs"
+	    done
+	    dlprefiles=$newdlprefiles
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  # In fact, it would be nice if we could use this code for all target
+	  # systems that can't hard-code library paths into their executables
+	  # and that have no shared library path variable independent of PATH,
+	  # but it turns out we can't easily determine that from inspecting
+	  # libtool variables, so we have to hard-code the OSs to which it
+	  # applies here; at the moment, that means platforms that use the PE
+	  # object format with DLL files.  See the long comment at the top of
+	  # tests/bindir.at for full details.
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+	      # If a -bindir argument was supplied, place the dll there.
+	      if test -n "$bindir"; then
+		func_relative_path "$install_libdir" "$bindir"
+		tdlname=$func_relative_path_result/$dlname
+	      else
+		# Otherwise fall back on heuristic.
+		tdlname=../bin/$dlname
+	      fi
+	      ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that cannot go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test no,yes = "$installed,$need_relink"; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+if test link = "$opt_mode" || test relink = "$opt_mode"; then
+  func_mode_link ${1+"$@"}
+fi
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $debug_cmd
+
+    RM=$nonopt
+    files=
+    rmforce=false
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic=$magic
+
+    for arg
+    do
+      case $arg in
+      -f) func_append RM " $arg"; rmforce=: ;;
+      -*) func_append RM " $arg" ;;
+      *) func_append files " $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir=$func_dirname_result
+      if test . = "$dir"; then
+	odir=$objdir
+      else
+	odir=$dir/$objdir
+      fi
+      func_basename "$file"
+      name=$func_basename_result
+      test uninstall = "$opt_mode" && odir=$dir
+
+      # Remember odir for removal later, being careful to avoid duplicates
+      if test clean = "$opt_mode"; then
+	case " $rmdirs " in
+	  *" $odir "*) ;;
+	  *) func_append rmdirs " $odir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif $rmforce; then
+	continue
+      fi
+
+      rmfiles=$file
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    func_append rmfiles " $odir/$n"
+	  done
+	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
+
+	  case $opt_mode in
+	  clean)
+	    case " $library_names " in
+	    *" $dlname "*) ;;
+	    *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" && test none != "$pic_object"; then
+	    func_append rmfiles " $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" && test none != "$non_pic_object"; then
+	    func_append rmfiles " $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test clean = "$opt_mode"; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    func_append rmfiles " $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      func_append rmfiles " $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    func_append rmfiles " $odir/$name $odir/${name}S.$objext"
+	    if test yes = "$fast_install" && test -n "$relink_command"; then
+	      func_append rmfiles " $odir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name"; then
+	      func_append rmfiles " $odir/lt-$noexename.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+
+    # Try to remove the $objdir's in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then
+  func_mode_uninstall ${1+"$@"}
+fi
+
+test -z "$opt_mode" && {
+  help=$generic_help
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode '$opt_mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# where we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ax_check_link_flag.m4 b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ax_check_link_flag.m4
new file mode 100644
index 0000000..819409a
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ax_check_link_flag.m4
@@ -0,0 +1,74 @@
+# ===========================================================================
+#    https://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
+#
+# DESCRIPTION
+#
+#   Check whether the given FLAG works with the linker or gives an error.
+#   (Warnings, however, are ignored)
+#
+#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
+#   success/failure.
+#
+#   If EXTRA-FLAGS is defined, it is added to the linker's default flags
+#   when the check is done.  The check is thus made with the flags: "LDFLAGS
+#   EXTRA-FLAGS FLAG".  This can for example be used to force the linker to
+#   issue an error when a bad flag is given.
+#
+#   INPUT gives an alternative input source to AC_LINK_IFELSE.
+#
+#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
+#   macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 5
+
+AC_DEFUN([AX_CHECK_LINK_FLAG],
+[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
+AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl
+AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [
+  ax_check_save_flags=$LDFLAGS
+  LDFLAGS="$LDFLAGS $4 $1"
+  AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
+    [AS_VAR_SET(CACHEVAR,[yes])],
+    [AS_VAR_SET(CACHEVAR,[no])])
+  LDFLAGS=$ax_check_save_flags])
+AS_VAR_IF(CACHEVAR,yes,
+  [m4_default([$2], :)],
+  [m4_default([$3], :)])
+AS_VAR_POPDEF([CACHEVAR])dnl
+])dnl AX_CHECK_LINK_FLAGS
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ax_code_coverage.m4 b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ax_code_coverage.m4
new file mode 100644
index 0000000..6484f03
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ax_code_coverage.m4
@@ -0,0 +1,264 @@
+# ===========================================================================
+#     https://www.gnu.org/software/autoconf-archive/ax_code_coverage.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CODE_COVERAGE()
+#
+# DESCRIPTION
+#
+#   Defines CODE_COVERAGE_CPPFLAGS, CODE_COVERAGE_CFLAGS,
+#   CODE_COVERAGE_CXXFLAGS and CODE_COVERAGE_LIBS which should be included
+#   in the CPPFLAGS, CFLAGS CXXFLAGS and LIBS/LIBADD variables of every
+#   build target (program or library) which should be built with code
+#   coverage support. Also defines CODE_COVERAGE_RULES which should be
+#   substituted in your Makefile; and $enable_code_coverage which can be
+#   used in subsequent configure output. CODE_COVERAGE_ENABLED is defined
+#   and substituted, and corresponds to the value of the
+#   --enable-code-coverage option, which defaults to being disabled.
+#
+#   Test also for gcov program and create GCOV variable that could be
+#   substituted.
+#
+#   Note that all optimization flags in CFLAGS must be disabled when code
+#   coverage is enabled.
+#
+#   Usage example:
+#
+#   configure.ac:
+#
+#     AX_CODE_COVERAGE
+#
+#   Makefile.am:
+#
+#     @CODE_COVERAGE_RULES@
+#     my_program_LIBS = ... $(CODE_COVERAGE_LIBS) ...
+#     my_program_CPPFLAGS = ... $(CODE_COVERAGE_CPPFLAGS) ...
+#     my_program_CFLAGS = ... $(CODE_COVERAGE_CFLAGS) ...
+#     my_program_CXXFLAGS = ... $(CODE_COVERAGE_CXXFLAGS) ...
+#
+#   This results in a "check-code-coverage" rule being added to any
+#   Makefile.am which includes "@CODE_COVERAGE_RULES@" (assuming the module
+#   has been configured with --enable-code-coverage). Running `make
+#   check-code-coverage` in that directory will run the module's test suite
+#   (`make check`) and build a code coverage report detailing the code which
+#   was touched, then print the URI for the report.
+#
+#   In earlier versions of this macro, CODE_COVERAGE_LDFLAGS was defined
+#   instead of CODE_COVERAGE_LIBS. They are both still defined, but use of
+#   CODE_COVERAGE_LIBS is preferred for clarity; CODE_COVERAGE_LDFLAGS is
+#   deprecated. They have the same value.
+#
+#   This code was derived from Makefile.decl in GLib, originally licenced
+#   under LGPLv2.1+.
+#
+# LICENSE
+#
+#   Copyright (c) 2012, 2016 Philip Withnall
+#   Copyright (c) 2012 Xan Lopez
+#   Copyright (c) 2012 Christian Persch
+#   Copyright (c) 2012 Paolo Borelli
+#   Copyright (c) 2012 Dan Winship
+#   Copyright (c) 2015 Bastien ROUCARIES
+#
+#   This library is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Lesser General Public License as published by
+#   the Free Software Foundation; either version 2.1 of the License, or (at
+#   your option) any later version.
+#
+#   This library is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
+#   General Public License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public License
+#   along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+#serial 25
+
+AC_DEFUN([AX_CODE_COVERAGE],[
+	dnl Check for --enable-code-coverage
+	AC_REQUIRE([AC_PROG_SED])
+
+	# allow to override gcov location
+	AC_ARG_WITH([gcov],
+	  [AS_HELP_STRING([--with-gcov[=GCOV]], [use given GCOV for coverage (GCOV=gcov).])],
+	  [_AX_CODE_COVERAGE_GCOV_PROG_WITH=$with_gcov],
+	  [_AX_CODE_COVERAGE_GCOV_PROG_WITH=gcov])
+
+	AC_MSG_CHECKING([whether to build with code coverage support])
+	AC_ARG_ENABLE([code-coverage],
+	  AS_HELP_STRING([--enable-code-coverage],
+	  [Whether to enable code coverage support]),,
+	  enable_code_coverage=no)
+
+	AM_CONDITIONAL([CODE_COVERAGE_ENABLED], [test x$enable_code_coverage = xyes])
+	AC_SUBST([CODE_COVERAGE_ENABLED], [$enable_code_coverage])
+	AC_MSG_RESULT($enable_code_coverage)
+
+	AS_IF([ test "$enable_code_coverage" = "yes" ], [
+		# check for gcov
+		AC_CHECK_TOOL([GCOV],
+		  [$_AX_CODE_COVERAGE_GCOV_PROG_WITH],
+		  [:])
+		AS_IF([test "X$GCOV" = "X:"],
+		  [AC_MSG_ERROR([gcov is needed to do coverage])])
+		AC_SUBST([GCOV])
+
+		dnl Check if gcc is being used
+		AS_IF([ test "$GCC" = "no" ], [
+			AC_MSG_ERROR([not compiling with gcc, which is required for gcov code coverage])
+		])
+
+		AC_CHECK_PROG([LCOV], [lcov], [lcov])
+		AC_CHECK_PROG([GENHTML], [genhtml], [genhtml])
+
+		AS_IF([ test -z "$LCOV" ], [
+			AC_MSG_ERROR([To enable code coverage reporting you must have lcov installed])
+		])
+
+		AS_IF([ test -z "$GENHTML" ], [
+			AC_MSG_ERROR([Could not find genhtml from the lcov package])
+		])
+
+		dnl Build the code coverage flags
+		dnl Define CODE_COVERAGE_LDFLAGS for backwards compatibility
+		CODE_COVERAGE_CPPFLAGS="-DNDEBUG"
+		CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
+		CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
+		CODE_COVERAGE_LIBS="-lgcov"
+		CODE_COVERAGE_LDFLAGS="$CODE_COVERAGE_LIBS"
+
+		AC_SUBST([CODE_COVERAGE_CPPFLAGS])
+		AC_SUBST([CODE_COVERAGE_CFLAGS])
+		AC_SUBST([CODE_COVERAGE_CXXFLAGS])
+		AC_SUBST([CODE_COVERAGE_LIBS])
+		AC_SUBST([CODE_COVERAGE_LDFLAGS])
+
+		[CODE_COVERAGE_RULES_CHECK='
+	-$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k check
+	$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) code-coverage-capture
+']
+		[CODE_COVERAGE_RULES_CAPTURE='
+	$(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS)
+	$(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS)
+	-@rm -f $(CODE_COVERAGE_OUTPUT_FILE).tmp
+	$(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS)
+	@echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html"
+']
+		[CODE_COVERAGE_RULES_CLEAN='
+clean: code-coverage-clean
+distclean: code-coverage-clean
+code-coverage-clean:
+	-$(LCOV) --directory $(top_builddir) -z
+	-rm -rf $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_FILE).tmp $(CODE_COVERAGE_OUTPUT_DIRECTORY)
+	-find . \( -name "*.gcda" -o -name "*.gcno" -o -name "*.gcov" \) -delete
+']
+	], [
+		[CODE_COVERAGE_RULES_CHECK='
+	@echo "Need to reconfigure with --enable-code-coverage"
+']
+		CODE_COVERAGE_RULES_CAPTURE="$CODE_COVERAGE_RULES_CHECK"
+		CODE_COVERAGE_RULES_CLEAN=''
+	])
+
+[CODE_COVERAGE_RULES='
+# Code coverage
+#
+# Optional:
+#  - CODE_COVERAGE_DIRECTORY: Top-level directory for code coverage reporting.
+#    Multiple directories may be specified, separated by whitespace.
+#    (Default: $(top_builddir))
+#  - CODE_COVERAGE_OUTPUT_FILE: Filename and path for the .info file generated
+#    by lcov for code coverage. (Default:
+#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info)
+#  - CODE_COVERAGE_OUTPUT_DIRECTORY: Directory for generated code coverage
+#    reports to be created. (Default:
+#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage)
+#  - CODE_COVERAGE_BRANCH_COVERAGE: Set to 1 to enforce branch coverage,
+#    set to 0 to disable it and leave empty to stay with the default.
+#    (Default: empty)
+#  - CODE_COVERAGE_LCOV_SHOPTS_DEFAULT: Extra options shared between both lcov
+#    instances. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
+#  - CODE_COVERAGE_LCOV_SHOPTS: Extra options to shared between both lcov
+#    instances. (Default: $CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
+#  - CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH: --gcov-tool pathtogcov
+#  - CODE_COVERAGE_LCOV_OPTIONS_DEFAULT: Extra options to pass to the
+#    collecting lcov instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
+#  - CODE_COVERAGE_LCOV_OPTIONS: Extra options to pass to the collecting lcov
+#    instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
+#  - CODE_COVERAGE_LCOV_RMOPTS_DEFAULT: Extra options to pass to the filtering
+#    lcov instance. (Default: empty)
+#  - CODE_COVERAGE_LCOV_RMOPTS: Extra options to pass to the filtering lcov
+#    instance. (Default: $CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
+#  - CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT: Extra options to pass to the
+#    genhtml instance. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
+#  - CODE_COVERAGE_GENHTML_OPTIONS: Extra options to pass to the genhtml
+#    instance. (Default: $CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
+#  - CODE_COVERAGE_IGNORE_PATTERN: Extra glob pattern of files to ignore
+#
+# The generated report will be titled using the $(PACKAGE_NAME) and
+# $(PACKAGE_VERSION). In order to add the current git hash to the title,
+# use the git-version-gen script, available online.
+
+# Optional variables
+CODE_COVERAGE_DIRECTORY ?= $(top_builddir)
+CODE_COVERAGE_OUTPUT_FILE ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info
+CODE_COVERAGE_OUTPUT_DIRECTORY ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage
+CODE_COVERAGE_BRANCH_COVERAGE ?=
+CODE_COVERAGE_LCOV_SHOPTS_DEFAULT ?= $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
+--rc lcov_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
+CODE_COVERAGE_LCOV_SHOPTS ?= $(CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
+CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH ?= --gcov-tool "$(GCOV)"
+CODE_COVERAGE_LCOV_OPTIONS_DEFAULT ?= $(CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
+CODE_COVERAGE_LCOV_OPTIONS ?= $(CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
+CODE_COVERAGE_LCOV_RMOPTS_DEFAULT ?=
+CODE_COVERAGE_LCOV_RMOPTS ?= $(CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
+CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT ?=\
+$(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
+--rc genhtml_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
+CODE_COVERAGE_GENHTML_OPTIONS ?= $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
+CODE_COVERAGE_IGNORE_PATTERN ?=
+
+GITIGNOREFILES ?=
+GITIGNOREFILES += $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_DIRECTORY)
+
+code_coverage_v_lcov_cap = $(code_coverage_v_lcov_cap_$(V))
+code_coverage_v_lcov_cap_ = $(code_coverage_v_lcov_cap_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_lcov_cap_0 = @echo "  LCOV   --capture"\
+ $(CODE_COVERAGE_OUTPUT_FILE);
+code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V))
+code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_lcov_ign_0 = @echo "  LCOV   --remove /tmp/*"\
+ $(CODE_COVERAGE_IGNORE_PATTERN);
+code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V))
+code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_genhtml_0 = @echo "  GEN   " $(CODE_COVERAGE_OUTPUT_DIRECTORY);
+code_coverage_quiet = $(code_coverage_quiet_$(V))
+code_coverage_quiet_ = $(code_coverage_quiet_$(AM_DEFAULT_VERBOSITY))
+code_coverage_quiet_0 = --quiet
+
+# sanitizes the test-name: replaces with underscores: dashes and dots
+code_coverage_sanitize = $(subst -,_,$(subst .,_,$(1)))
+
+# Use recursive makes in order to ignore errors during check
+check-code-coverage:'"$CODE_COVERAGE_RULES_CHECK"'
+
+# Capture code coverage data
+code-coverage-capture: code-coverage-capture-hook'"$CODE_COVERAGE_RULES_CAPTURE"'
+
+# Hook rule executed before code-coverage-capture, overridable by the user
+code-coverage-capture-hook:
+
+'"$CODE_COVERAGE_RULES_CLEAN"'
+
+A''M_DISTCHECK_CONFIGURE_FLAGS ?=
+A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-code-coverage
+
+.PHONY: check-code-coverage code-coverage-capture code-coverage-capture-hook code-coverage-clean
+']
+
+	AC_SUBST([CODE_COVERAGE_RULES])
+	m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([CODE_COVERAGE_RULES])])
+])
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ax_pthread.m4 b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ax_pthread.m4
new file mode 100644
index 0000000..5fbf9fe
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ax_pthread.m4
@@ -0,0 +1,485 @@
+# ===========================================================================
+#        https://www.gnu.org/software/autoconf-archive/ax_pthread.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+#
+# DESCRIPTION
+#
+#   This macro figures out how to build C programs using POSIX threads. It
+#   sets the PTHREAD_LIBS output variable to the threads library and linker
+#   flags, and the PTHREAD_CFLAGS output variable to any special C compiler
+#   flags that are needed. (The user can also force certain compiler
+#   flags/libs to be tested by setting these environment variables.)
+#
+#   Also sets PTHREAD_CC to any special C compiler that is needed for
+#   multi-threaded programs (defaults to the value of CC otherwise). (This
+#   is necessary on AIX to use the special cc_r compiler alias.)
+#
+#   NOTE: You are assumed to not only compile your program with these flags,
+#   but also to link with them as well. For example, you might link with
+#   $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+#
+#   If you are only building threaded programs, you may wish to use these
+#   variables in your default LIBS, CFLAGS, and CC:
+#
+#     LIBS="$PTHREAD_LIBS $LIBS"
+#     CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+#     CC="$PTHREAD_CC"
+#
+#   In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
+#   has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
+#   that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+#
+#   Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
+#   PTHREAD_PRIO_INHERIT symbol is defined when compiling with
+#   PTHREAD_CFLAGS.
+#
+#   ACTION-IF-FOUND is a list of shell commands to run if a threads library
+#   is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
+#   is not found. If ACTION-IF-FOUND is not specified, the default action
+#   will define HAVE_PTHREAD.
+#
+#   Please let the authors know if this macro fails on any platform, or if
+#   you have any other suggestions or comments. This macro was based on work
+#   by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
+#   from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
+#   Alejandro Forero Cuervo to the autoconf macro repository. We are also
+#   grateful for the helpful feedback of numerous users.
+#
+#   Updated for Autoconf 2.68 by Daniel Richard G.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+#   Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 24
+
+AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
+AC_DEFUN([AX_PTHREAD], [
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_PROG_SED])
+AC_LANG_PUSH([C])
+ax_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on Tru64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
+        ax_pthread_save_CC="$CC"
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
+        AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
+        AC_MSG_RESULT([$ax_pthread_ok])
+        if test "x$ax_pthread_ok" = "xno"; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        CC="$ax_pthread_save_CC"
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try.  Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
+#           (Note: HP C rejects this with "bad form for `-t' option")
+# -pthreads: Solaris/gcc (Note: HP C also rejects)
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads and
+#      -D_REENTRANT too), HP C (must be checked before -lpthread, which
+#      is present but should not be used directly; and before -mthreads,
+#      because the compiler interprets this as "-mt" + "-hreads")
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case $host_os in
+
+        freebsd*)
+
+        # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+        # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+
+        ax_pthread_flags="-kthread lthread $ax_pthread_flags"
+        ;;
+
+        hpux*)
+
+        # From the cc(1) man page: "[-mt] Sets various -D flags to enable
+        # multi-threading and also sets -lpthread."
+
+        ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
+        ;;
+
+        openedition*)
+
+        # IBM z/OS requires a feature-test macro to be defined in order to
+        # enable POSIX threads at all, so give the user a hint if this is
+        # not set. (We don't define these ourselves, as they can affect
+        # other portions of the system API in unpredictable ways.)
+
+        AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
+            [
+#            if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
+             AX_PTHREAD_ZOS_MISSING
+#            endif
+            ],
+            [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
+        ;;
+
+        solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed. (N.B.: The stubs are missing
+        # pthread_cleanup_push, or rather a function called by this macro,
+        # so we could check for that, but who knows whether they'll stub
+        # that too in a future libc.)  So we'll check first for the
+        # standard Solaris way of linking pthreads (-mt -lpthread).
+
+        ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags"
+        ;;
+esac
+
+# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
+
+AS_IF([test "x$GCC" = "xyes"],
+      [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"])
+
+# The presence of a feature test macro requesting re-entrant function
+# definitions is, on some systems, a strong hint that pthreads support is
+# correctly enabled
+
+case $host_os in
+        darwin* | hpux* | linux* | osf* | solaris*)
+        ax_pthread_check_macro="_REENTRANT"
+        ;;
+
+        aix*)
+        ax_pthread_check_macro="_THREAD_SAFE"
+        ;;
+
+        *)
+        ax_pthread_check_macro="--"
+        ;;
+esac
+AS_IF([test "x$ax_pthread_check_macro" = "x--"],
+      [ax_pthread_check_cond=0],
+      [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
+
+# Are we compiling with Clang?
+
+AC_CACHE_CHECK([whether $CC is Clang],
+    [ax_cv_PTHREAD_CLANG],
+    [ax_cv_PTHREAD_CLANG=no
+     # Note that Autoconf sets GCC=yes for Clang as well as GCC
+     if test "x$GCC" = "xyes"; then
+        AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
+            [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
+#            if defined(__clang__) && defined(__llvm__)
+             AX_PTHREAD_CC_IS_CLANG
+#            endif
+            ],
+            [ax_cv_PTHREAD_CLANG=yes])
+     fi
+    ])
+ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
+
+ax_pthread_clang_warning=no
+
+# Clang needs special handling, because older versions handle the -pthread
+# option in a rather... idiosyncratic way
+
+if test "x$ax_pthread_clang" = "xyes"; then
+
+        # Clang takes -pthread; it has never supported any other flag
+
+        # (Note 1: This will need to be revisited if a system that Clang
+        # supports has POSIX threads in a separate library.  This tends not
+        # to be the way of modern systems, but it's conceivable.)
+
+        # (Note 2: On some systems, notably Darwin, -pthread is not needed
+        # to get POSIX threads support; the API is always present and
+        # active.  We could reasonably leave PTHREAD_CFLAGS empty.  But
+        # -pthread does define _REENTRANT, and while the Darwin headers
+        # ignore this macro, third-party headers might not.)
+
+        PTHREAD_CFLAGS="-pthread"
+        PTHREAD_LIBS=
+
+        ax_pthread_ok=yes
+
+        # However, older versions of Clang make a point of warning the user
+        # that, in an invocation where only linking and no compilation is
+        # taking place, the -pthread option has no effect ("argument unused
+        # during compilation").  They expect -pthread to be passed in only
+        # when source code is being compiled.
+        #
+        # Problem is, this is at odds with the way Automake and most other
+        # C build frameworks function, which is that the same flags used in
+        # compilation (CFLAGS) are also used in linking.  Many systems
+        # supported by AX_PTHREAD require exactly this for POSIX threads
+        # support, and in fact it is often not straightforward to specify a
+        # flag that is used only in the compilation phase and not in
+        # linking.  Such a scenario is extremely rare in practice.
+        #
+        # Even though use of the -pthread flag in linking would only print
+        # a warning, this can be a nuisance for well-run software projects
+        # that build with -Werror.  So if the active version of Clang has
+        # this misfeature, we search for an option to squash it.
+
+        AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
+            [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
+            [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
+             # Create an alternate version of $ac_link that compiles and
+             # links in two steps (.c -> .o, .o -> exe) instead of one
+             # (.c -> exe), because the warning occurs only in the second
+             # step
+             ax_pthread_save_ac_link="$ac_link"
+             ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
+             ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
+             ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
+             ax_pthread_save_CFLAGS="$CFLAGS"
+             for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
+                AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
+                CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
+                ac_link="$ax_pthread_save_ac_link"
+                AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
+                    [ac_link="$ax_pthread_2step_ac_link"
+                     AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
+                         [break])
+                    ])
+             done
+             ac_link="$ax_pthread_save_ac_link"
+             CFLAGS="$ax_pthread_save_CFLAGS"
+             AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
+             ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
+            ])
+
+        case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
+                no | unknown) ;;
+                *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
+        esac
+
+fi # $ax_pthread_clang = yes
+
+if test "x$ax_pthread_ok" = "xno"; then
+for ax_pthread_try_flag in $ax_pthread_flags; do
+
+        case $ax_pthread_try_flag in
+                none)
+                AC_MSG_CHECKING([whether pthreads work without any flags])
+                ;;
+
+                -mt,pthread)
+                AC_MSG_CHECKING([whether pthreads work with -mt -lpthread])
+                PTHREAD_CFLAGS="-mt"
+                PTHREAD_LIBS="-lpthread"
+                ;;
+
+                -*)
+                AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
+                PTHREAD_CFLAGS="$ax_pthread_try_flag"
+                ;;
+
+                pthread-config)
+                AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
+                AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
+                PTHREAD_CFLAGS="`pthread-config --cflags`"
+                PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+                ;;
+
+                *)
+                AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
+                PTHREAD_LIBS="-l$ax_pthread_try_flag"
+                ;;
+        esac
+
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+
+        AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
+#                       if $ax_pthread_check_cond
+#                        error "$ax_pthread_check_macro must be defined"
+#                       endif
+                        static void routine(void *a) { a = 0; }
+                        static void *start_routine(void *a) { return a; }],
+                       [pthread_t th; pthread_attr_t attr;
+                        pthread_create(&th, 0, start_routine, 0);
+                        pthread_join(th, 0);
+                        pthread_attr_init(&attr);
+                        pthread_cleanup_push(routine, 0);
+                        pthread_cleanup_pop(0) /* ; */])],
+            [ax_pthread_ok=yes],
+            [])
+
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+
+        AC_MSG_RESULT([$ax_pthread_ok])
+        AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$ax_pthread_ok" = "xyes"; then
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+
+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+        AC_CACHE_CHECK([for joinable pthread attribute],
+            [ax_cv_PTHREAD_JOINABLE_ATTR],
+            [ax_cv_PTHREAD_JOINABLE_ATTR=unknown
+             for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+                 AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
+                                                 [int attr = $ax_pthread_attr; return attr /* ; */])],
+                                [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
+                                [])
+             done
+            ])
+        AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
+               test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
+               test "x$ax_pthread_joinable_attr_defined" != "xyes"],
+              [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
+                                  [$ax_cv_PTHREAD_JOINABLE_ATTR],
+                                  [Define to necessary symbol if this constant
+                                   uses a non-standard name on your system.])
+               ax_pthread_joinable_attr_defined=yes
+              ])
+
+        AC_CACHE_CHECK([whether more special flags are required for pthreads],
+            [ax_cv_PTHREAD_SPECIAL_FLAGS],
+            [ax_cv_PTHREAD_SPECIAL_FLAGS=no
+             case $host_os in
+             solaris*)
+             ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
+             ;;
+             esac
+            ])
+        AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
+               test "x$ax_pthread_special_flags_added" != "xyes"],
+              [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
+               ax_pthread_special_flags_added=yes])
+
+        AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
+            [ax_cv_PTHREAD_PRIO_INHERIT],
+            [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
+                                             [[int i = PTHREAD_PRIO_INHERIT;]])],
+                            [ax_cv_PTHREAD_PRIO_INHERIT=yes],
+                            [ax_cv_PTHREAD_PRIO_INHERIT=no])
+            ])
+        AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
+               test "x$ax_pthread_prio_inherit_defined" != "xyes"],
+              [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
+               ax_pthread_prio_inherit_defined=yes
+              ])
+
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+
+        # More AIX lossage: compile with *_r variant
+        if test "x$GCC" != "xyes"; then
+            case $host_os in
+                aix*)
+                AS_CASE(["x/$CC"],
+                    [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
+                    [#handle absolute path differently from PATH based program lookup
+                     AS_CASE(["x$CC"],
+                         [x/*],
+                         [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
+                         [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
+                ;;
+            esac
+        fi
+fi
+
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+
+AC_SUBST([PTHREAD_LIBS])
+AC_SUBST([PTHREAD_CFLAGS])
+AC_SUBST([PTHREAD_CC])
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test "x$ax_pthread_ok" = "xyes"; then
+        ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
+        :
+else
+        ax_pthread_ok=no
+        $2
+fi
+AC_LANG_POP
+])dnl AX_PTHREAD
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/gtk-doc.m4 b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/gtk-doc.m4
new file mode 100644
index 0000000..3675543
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/gtk-doc.m4
@@ -0,0 +1,88 @@
+dnl -*- mode: autoconf -*-
+
+# serial 2
+
+dnl Usage:
+dnl   GTK_DOC_CHECK([minimum-gtk-doc-version])
+AC_DEFUN([GTK_DOC_CHECK],
+[
+  AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+  AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
+  AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first
+
+  ifelse([$1],[],[gtk_doc_requires="gtk-doc"],[gtk_doc_requires="gtk-doc >= $1"])
+  AC_MSG_CHECKING([for gtk-doc])
+  PKG_CHECK_EXISTS([$gtk_doc_requires],[have_gtk_doc=yes],[have_gtk_doc=no])
+  AC_MSG_RESULT($have_gtk_doc)
+
+  if test "$have_gtk_doc" = "no"; then
+      AC_MSG_WARN([
+  You will not be able to create source packages with 'make dist'
+  because $gtk_doc_requires is not found.])
+  fi
+
+  dnl check for tools we added during development
+  dnl Use AC_CHECK_PROG to avoid the check target using an absolute path that
+  dnl may not be writable by the user. Currently, automake requires that the
+  dnl test name must end in '.test'.
+  dnl https://bugzilla.gnome.org/show_bug.cgi?id=701638
+  AC_CHECK_PROG([GTKDOC_CHECK],[gtkdoc-check],[gtkdoc-check.test])
+  AC_PATH_PROG([GTKDOC_CHECK_PATH],[gtkdoc-check])
+  AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true])
+  AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf])
+
+  dnl for overriding the documentation installation directory
+  AC_ARG_WITH([html-dir],
+    AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),,
+    [with_html_dir='${datadir}/gtk-doc/html'])
+  HTML_DIR="$with_html_dir"
+  AC_SUBST([HTML_DIR])
+
+  dnl enable/disable documentation building
+  AC_ARG_ENABLE([gtk-doc],
+    AS_HELP_STRING([--enable-gtk-doc],
+                   [use gtk-doc to build documentation [[default=no]]]),,
+    [enable_gtk_doc=no])
+
+  AC_MSG_CHECKING([whether to build gtk-doc documentation])
+  AC_MSG_RESULT($enable_gtk_doc)
+
+  if test "x$enable_gtk_doc" = "xyes" && test "$have_gtk_doc" = "no"; then
+    AC_MSG_ERROR([
+  You must have $gtk_doc_requires installed to build documentation for
+  $PACKAGE_NAME. Please install gtk-doc or disable building the
+  documentation by adding '--disable-gtk-doc' to '[$]0'.])
+  fi
+
+  dnl don't check for glib if we build glib
+  if test "x$PACKAGE_NAME" != "xglib"; then
+    dnl don't fail if someone does not have glib
+    PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0,,[:])
+  fi
+
+  dnl enable/disable output formats
+  AC_ARG_ENABLE([gtk-doc-html],
+    AS_HELP_STRING([--enable-gtk-doc-html],
+                   [build documentation in html format [[default=yes]]]),,
+    [enable_gtk_doc_html=yes])
+    AC_ARG_ENABLE([gtk-doc-pdf],
+      AS_HELP_STRING([--enable-gtk-doc-pdf],
+                     [build documentation in pdf format [[default=no]]]),,
+      [enable_gtk_doc_pdf=no])
+
+  if test -z "$GTKDOC_MKPDF"; then
+    enable_gtk_doc_pdf=no
+  fi
+
+  if test -z "$AM_DEFAULT_VERBOSITY"; then
+    AM_DEFAULT_VERBOSITY=1
+  fi
+  AC_SUBST([AM_DEFAULT_VERBOSITY])
+
+  AM_CONDITIONAL([HAVE_GTK_DOC], [test x$have_gtk_doc = xyes])
+  AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes])
+  AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes])
+  AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes])
+  AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"])
+  AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"])
+])
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/libtool.m4 b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/libtool.m4
new file mode 100644
index 0000000..ee80844
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/libtool.m4
@@ -0,0 +1,8387 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+])
+
+# serial 58 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_PREPARE_CC_BASENAME
+# -----------------------
+m4_defun([_LT_PREPARE_CC_BASENAME], [
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in @S|@*""; do
+      case $cc_temp in
+        compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+        distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+])# _LT_PREPARE_CC_BASENAME
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME,
+# but that macro is also expanded into generated libtool script, which
+# arranges for $SED and $ECHO to be set by different means.
+m4_defun([_LT_CC_BASENAME],
+[m4_require([_LT_PREPARE_CC_BASENAME])dnl
+AC_REQUIRE([_LT_DECL_SED])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+func_cc_basename $1
+cc_basename=$func_cc_basename_result
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+m4_require([_LT_CMD_TRUNCATE])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test set != "${COLLECT_NAMES+set}"; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from 'configure', and 'config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# 'config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain=$ac_aux_dir/ltmain.sh
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the 'libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to 'config.status' so that its
+# declaration there will have the same value as in 'configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags='_LT_TAGS'dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into 'config.status', and then the shell code to quote escape them in
+# for loops in 'config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# '#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test 0 = "$lt_write_fail" && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+'$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test 0 != $[#]
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try '$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try '$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test yes = "$silent" &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options that allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}"; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile=${ofile}T
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_PREPARE_MUNGE_PATH_LIST
+_LT_PREPARE_CC_BASENAME
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Go],			[_LT_LANG(GO)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "$LT_MULTI_MODULE"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS=$save_LDFLAGS
+    ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]][[,.]]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+    fi
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test yes = "$lt_cv_ld_force_load"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined
+  case $cc_basename in
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test yes = "$_lt_dar_can_shared"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+    m4_if([$1], [CXX],
+[   if test yes != "$lt_cv_apple_cc_single_mod"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script that will find a shell with a builtin
+# printf (that we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+case $ECHO in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
+  [Search for dependent libraries within DIR (or the compiler's sysroot
+   if not specified).])],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+   if test yes = "$GCC"; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([$with_sysroot])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and where our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE=32
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE=64
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*linux*)
+	    LD="${LD-ld} -m elf32lppclinux"
+	    ;;
+	  powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  powerpcle-*linux*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS=$CFLAGS
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test yes != "$lt_cv_cc_needs_belf"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS=$SAVE_CFLAGS
+  fi
+  ;;
+*-*solaris*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*|x86_64-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD=${LD-ld}_sol2
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks=$enable_libtool_lock
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test 0 -eq "$ac_status"; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	AC_TRY_EVAL([lt_ar_try])
+	if test 0 -ne "$ac_status"; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test no = "$lt_cv_ar_at_file"; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  bitrig* | openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test yes = "[$]$2"; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+])
+
+if test yes = "[$]$2"; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring=ABCD
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test 17 != "$i" # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n "$lt_cv_sys_max_cmd_len"; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test yes = "$cross_compiling"; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test yes != "$enable_dlopen"; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen=load_add_on
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen=LoadLibrary
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+    # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[
+    lt_cv_dlopen=dyld
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen=shl_load],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen=dlopen],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test no = "$lt_cv_dlopen"; then
+    enable_dlopen=no
+  else
+    enable_dlopen=yes
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS=$LDFLAGS
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS=$LIBS
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test yes = "$lt_cv_dlopen_self"; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links=nottested
+if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test no = "$hard_links"; then
+    AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/",
+  [Define to the sub-directory where libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then
+
+  # We can hardcode non-existent directories.
+  if test no != "$_LT_TAGVAR(hardcode_direct, $1)" &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" &&
+     test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test relink = "$_LT_TAGVAR(hardcode_action, $1)" ||
+   test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP"; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_PREPARE_MUNGE_PATH_LIST
+# ---------------------------
+# Make sure func_munge_path_list() is defined correctly.
+m4_defun([_LT_PREPARE_MUNGE_PATH_LIST],
+[[# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x@S|@2 in
+    x)
+        ;;
+    *:)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+        ;;
+    x:*)
+        eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+        ;;
+    *)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+]])# _LT_PREPARE_PATH_LIST
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test yes = "$GCC"; then
+  case $host_os in
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary...
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo = "/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+AC_ARG_VAR([LT_SYS_LIBRARY_PATH],
+[User-defined run-time library search path.])
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='$libname$release$shared_ext$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test ia64 = "$host_cpu"; then
+    # AIX 5 supports IA64
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a[(]lib.so.V[)]'
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='$libname$shared_ext'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec=$LIB
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[23]].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+    fi
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test yes = "$lt_cv_prog_gnu_ld"; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+	 [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
+  else
+    need_version=yes
+  fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+os2*)
+  libname_spec='$name'
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test yes = "$with_gnu_ld"; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec; then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=sco
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test yes = "$with_gnu_ld"; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2],
+    [Detected run-time system search path for libraries])
+_LT_DECL([], [configure_time_lt_sys_library_path], [2],
+    [Explicit LT_SYS_LIBRARY_PATH set during ./configure time])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program that can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$1"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
+  ;;
+esac])
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program that can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test no = "$withval" || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test yes = "$GCC"; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return, which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD=$ac_prog
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test yes = "$with_gnu_ld"; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD=$ac_dir/$ac_prog
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test no != "$with_gnu_ld" && break
+	;;
+      *)
+	test yes != "$with_gnu_ld" && break
+	;;
+      esac
+    fi
+  done
+  IFS=$lt_save_ifs
+else
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi])
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test yes != "$GCC"; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_PATH_DD
+# -----------
+# find a working dd
+m4_defun([_LT_PATH_DD],
+[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd],
+[if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi])
+rm -f conftest.i conftest2.i conftest.out])
+])# _LT_PATH_DD
+
+
+# _LT_CMD_TRUNCATE
+# ----------------
+# find command to truncate a binary pipe
+m4_defun([_LT_CMD_TRUNCATE],
+[m4_require([_LT_PATH_DD])
+AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"])
+_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1],
+  [Command to truncate a binary pipe])
+])# _LT_CMD_TRUNCATE
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM=$NM
+else
+  lt_nm_to_check=${ac_tool_prefix}nm
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS=$lt_save_ifs
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break 2
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break 2
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS=$lt_save_ifs
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols -headers"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test yes != "$lt_cv_path_mainfest_tool"; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# _LT_DLL_DEF_P([FILE])
+# ---------------------
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with func_dll_def_p in the libtool script
+AC_DEFUN([_LT_DLL_DEF_P],
+[dnl
+  test DEF = "`$SED -n dnl
+    -e '\''s/^[[	 ]]*//'\'' dnl Strip leading whitespace
+    -e '\''/^\(;.*\)*$/d'\'' dnl      Delete empty lines and comments
+    -e '\''s/^\(EXPORTS\|LIBRARY\)\([[	 ]].*\)*$/DEF/p'\'' dnl
+    -e q dnl                          Only consider the first "real" line
+    $1`" dnl
+])# _LT_DLL_DEF_P
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw)
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM=-lm)
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test yes = "$GCC"; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test ia64 = "$host_cpu"; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t@_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t@_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS=conftstm.$ac_objext
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test yes = "$pipe_works"; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1],
+    [Transform the output of nm into a list of symbols to manually relocate])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([nm_interface], [lt_cv_nm_interface], [1],
+    [The name lister interface])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test yes = "$GXX"; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test ia64 = "$host_cpu"; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	m4_if([$1], [GCJ], [],
+	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+	    if test ia64 != "$host_cpu"; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64, which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test yes = "$GCC"; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      esac
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64, which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+        *Intel*\ [[CF]]*Compiler*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	  ;;
+	*Portland\ Group*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms that do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test yes != "$GCC"; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd* | bitrig*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test yes = "$with_gnu_ld"; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test yes = "$lt_use_gnu_ld_interface"; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='$wl'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test ia64 != "$host_cpu"; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test linux-dietlibc = "$host_os"; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test no = "$tmp_diet"
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
+	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+        if test yes = "$supports_anon_versioning"; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	tcc*)
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic'
+	  ;;
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test yes = "$supports_anon_versioning"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test ia64 = "$host_cpu"; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+	;;
+      esac
+
+      if test yes = "$GCC"; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
+	fi
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
+      else
+	# not using gcc
+	if test ia64 = "$host_cpu"; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
+	  else
+	    shared_flag='$wl-bM:SRE'
+	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+      else
+	if test ia64 = "$host_cpu"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX([$1])
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  fi
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	  else
+	    # used by -dlpreopen to get the symbols
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	_LT_TAGVAR(always_export_symbols, $1)=yes
+	_LT_TAGVAR(file_list_spec, $1)='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	# FIXME: Should let the user specify the lib program.
+	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+      ;;
+
+    hpux10*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	m4_if($1, [], [
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  _LT_LINKER_OPTION([if $CC understands -b],
+	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  ;;
+	esac
+      fi
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+	  [lt_cv_irix_exported_symbol],
+	  [save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+	   AC_LINK_IFELSE(
+	     [AC_LANG_SOURCE(
+	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+			      [C++], [[int foo (void) { return 0; }]],
+			      [Fortran 77], [[
+      subroutine foo
+      end]],
+			      [Fortran], [[
+      subroutine foo
+      end]])])],
+	      [lt_cv_irix_exported_symbol=yes],
+	      [lt_cv_irix_exported_symbol=no])
+           LDFLAGS=$save_LDFLAGS])
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd* | bitrig*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	else
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    osf3*)
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='$wl'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test yes = "$GCC"; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test sequent = "$host_vendor"; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We CANNOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test sni = "$host_vendor"; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test yes,yes = "$GCC,$enable_shared"; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+	[$RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+	  _LT_TAGVAR(allow_undefined_flag, $1)=
+	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+	  then
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	  else
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  fi
+	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+	])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting $shlibpath_var if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC=$CC
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report what library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test no = "$can_build_shared" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test yes = "$enable_shared" && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test yes = "$enable_shared" || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC=$lt_save_CC
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_caught_CXX_error"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test yes = "$GXX"; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test yes = "$GXX"; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test yes = "$with_gnu_ld"; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='$wl'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test ia64 = "$host_cpu"; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	      # so we don't have lib.a shared libs to link our executables.
+	      # We have to force runtime linking in this case.
+	      aix_use_runtimelinking=yes
+	      LDFLAGS="$LDFLAGS -Wl,-brtl"
+	    fi
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;	# no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          _LT_TAGVAR(hardcode_direct, $1)=no
+          _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+          ;;
+        esac
+
+        if test yes = "$GXX"; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag=$shared_flag' $wl-G'
+	  fi
+	  # Need to ensure runtime linking is disabled for the traditional
+	  # shared library, or the linker may eventually find shared libraries
+	  # /with/ Import File - we do not want to mix them.
+	  shared_flag_aix='-shared'
+	  shared_flag_svr4='-shared $wl-G'
+        else
+          # not using gcc
+          if test ia64 = "$host_cpu"; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test yes = "$aix_use_runtimelinking"; then
+	      shared_flag='$wl-G'
+	    else
+	      shared_flag='$wl-bM:SRE'
+	    fi
+	    shared_flag_aix='$wl-bM:SRE'
+	    shared_flag_svr4='$wl-G'
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          # The "-G" linker flag allows undefined symbols.
+          _LT_TAGVAR(no_undefined_flag, $1)='-bernotok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+        else
+          if test ia64 = "$host_cpu"; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX([$1])
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	    if test yes = "$with_gnu_ld"; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    fi
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	    # -brtl affects multiple linker settings, -berok does not and is overridden later
+	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	    if test svr4 != "$with_aix_soname"; then
+	      # This is similar to how AIX traditionally builds its shared
+	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	    fi
+	    if test aix != "$with_aix_soname"; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	    else
+	      # used by -dlpreopen to get the symbols
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	    fi
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=yes
+	  _LT_TAGVAR(file_list_spec, $1)='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=.dll
+	  # FIXME: Setting linknames here is a bad hack.
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	  # Don't use ranlib
+	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=no
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file, use it as
+	    # is; otherwise, prepend EXPORTS...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      os2*)
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	shrext_cmds=.dll
+	_LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  prefix_cmds="$SED"~
+	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	    prefix_cmds="$prefix_cmds -e 1d";
+	  fi~
+	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test yes = "$GXX"; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test no = "$with_gnu_ld"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    if test yes = "$supports_anon_versioning"; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd* | bitrig*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands '-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We CANNOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+              '"$_LT_TAGVAR(old_archive_cmds, $1)"
+	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+              '"$_LT_TAGVAR(reload_cmds, $1)"
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)=$GXX
+    _LT_TAGVAR(LD, $1)=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test yes != "$_lt_caught_CXX_error"
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case @S|@2 in
+  .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $prev$p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)=$prev$p
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test no = "$pre_test_object_deps_done"; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)=$p
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)=$p
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test no = "$F77"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_disable_F77"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test no = "$can_build_shared" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test yes = "$enable_shared" && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test yes = "$enable_shared" || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)=$G77
+    _LT_TAGVAR(LD, $1)=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_F77"
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test no = "$FC"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_disable_FC"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test no = "$can_build_shared" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test yes = "$enable_shared" && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test yes = "$enable_shared" || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu
+    _LT_TAGVAR(LD, $1)=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_FC"
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)=$LD
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)=$LD
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code=$lt_simple_compile_test_code
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f "$lt_ac_sed" && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test 10 -lt "$lt_ac_count" && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test "$lt_ac_count" -gt "$lt_ac_max"; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine what file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ltoptions.m4 b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ltoptions.m4
new file mode 100644
index 0000000..94b0829
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ltoptions.m4
@@ -0,0 +1,437 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
+#   Foundation, Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 8 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option '$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl 'shared' nor 'disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+		   [_LT_ENABLE_FAST_INSTALL])
+  _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],
+		   [_LT_WITH_AIX_SONAME([aix])])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the 'shared' and
+# 'disable-shared' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the 'static' and
+# 'disable-static' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the 'fast-install'
+# and 'disable-fast-install' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_AIX_SONAME([DEFAULT])
+# ----------------------------------
+# implement the --with-aix-soname flag, and support the `aix-soname=aix'
+# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT
+# is either `aix', `both' or `svr4'.  If omitted, it defaults to `aix'.
+m4_define([_LT_WITH_AIX_SONAME],
+[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl
+shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[[5-9]]*,yes)
+  AC_MSG_CHECKING([which variant of shared library versioning to provide])
+  AC_ARG_WITH([aix-soname],
+    [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
+      [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],
+    [case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      AC_MSG_ERROR([Unknown argument to --with-aix-soname])
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname],
+    [AC_CACHE_VAL([lt_cv_with_aix_soname],
+      [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)
+    with_aix_soname=$lt_cv_with_aix_soname])
+  AC_MSG_RESULT([$with_aix_soname])
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+_LT_DECL([], [shared_archive_member_spec], [0],
+    [Shared archive member basename, for filename based shared library versioning on AIX])dnl
+])# _LT_WITH_AIX_SONAME
+
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the 'pic-only' and 'no-pic'
+# LT_INIT options.
+# MODE is either 'yes' or 'no'.  If omitted, it defaults to 'both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for lt_pkg in $withval; do
+	IFS=$lt_save_ifs
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [pic_mode=m4_default([$1], [default])])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ltsugar.m4 b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ltsugar.m4
new file mode 100644
index 0000000..48bc934
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ltsugar.m4
@@ -0,0 +1,124 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
+# Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59, which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ltversion.m4 b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ltversion.m4
new file mode 100644
index 0000000..fa04b52
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 4179 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.6])
+m4_define([LT_PACKAGE_REVISION], [2.4.6])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.6'
+macro_revision='2.4.6'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/lt~obsolete.m4 b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/lt~obsolete.m4
new file mode 100644
index 0000000..c6b26f8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/m4/lt~obsolete.m4
@@ -0,0 +1,99 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
+#   Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN),
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/missing b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/missing
new file mode 100755
index 0000000..f62bbae
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2013-10-28.13; # UTC
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try '$0 --help' for more information"
+  exit 1
+fi
+
+case $1 in
+
+  --is-lightweight)
+    # Used by our autoconf macros to check whether the available missing
+    # script is modern enough.
+    exit 0
+    ;;
+
+  --run)
+    # Back-compat with the calling convention used by older automake.
+    shift
+    ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
+  bison     yacc      flex         lex       help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: unknown '$1' option"
+    echo 1>&2 "Try '$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch.  This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+  msg="probably too old"
+elif test $st -eq 127; then
+  # Program was missing.
+  msg="missing on your system"
+else
+  # Program was found and executed, but failed.  Give up.
+  exit $st
+fi
+
+perl_URL=http://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=http://www.gnu.org/software
+
+program_details ()
+{
+  case $1 in
+    aclocal|automake)
+      echo "The '$1' program is part of the GNU Automake package:"
+      echo "<$gnu_software_URL/automake>"
+      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/autoconf>"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+    autoconf|autom4te|autoheader)
+      echo "The '$1' program is part of the GNU Autoconf package:"
+      echo "<$gnu_software_URL/autoconf/>"
+      echo "It also requires GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+  esac
+}
+
+give_advice ()
+{
+  # Normalize program name to check for.
+  normalized_program=`echo "$1" | sed '
+    s/^gnu-//; t
+    s/^gnu//; t
+    s/^g//; t'`
+
+  printf '%s\n' "'$1' is $msg."
+
+  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+  case $normalized_program in
+    autoconf*)
+      echo "You should only need it if you modified 'configure.ac',"
+      echo "or m4 files included by it."
+      program_details 'autoconf'
+      ;;
+    autoheader*)
+      echo "You should only need it if you modified 'acconfig.h' or"
+      echo "$configure_deps."
+      program_details 'autoheader'
+      ;;
+    automake*)
+      echo "You should only need it if you modified 'Makefile.am' or"
+      echo "$configure_deps."
+      program_details 'automake'
+      ;;
+    aclocal*)
+      echo "You should only need it if you modified 'acinclude.m4' or"
+      echo "$configure_deps."
+      program_details 'aclocal'
+      ;;
+   autom4te*)
+      echo "You might have modified some maintainer files that require"
+      echo "the 'autom4te' program to be rebuilt."
+      program_details 'autom4te'
+      ;;
+    bison*|yacc*)
+      echo "You should only need it if you modified a '.y' file."
+      echo "You may want to install the GNU Bison package:"
+      echo "<$gnu_software_URL/bison/>"
+      ;;
+    lex*|flex*)
+      echo "You should only need it if you modified a '.l' file."
+      echo "You may want to install the Fast Lexical Analyzer package:"
+      echo "<$flex_URL>"
+      ;;
+    help2man*)
+      echo "You should only need it if you modified a dependency" \
+           "of a man page."
+      echo "You may want to install the GNU Help2man package:"
+      echo "<$gnu_software_URL/help2man/>"
+    ;;
+    makeinfo*)
+      echo "You should only need it if you modified a '.texi' file, or"
+      echo "any other file indirectly affecting the aspect of the manual."
+      echo "You might want to install the Texinfo package:"
+      echo "<$gnu_software_URL/texinfo/>"
+      echo "The spurious makeinfo call might also be the consequence of"
+      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+      echo "want to install GNU make:"
+      echo "<$gnu_software_URL/make/>"
+      ;;
+    *)
+      echo "You might have modified some files without having the proper"
+      echo "tools for further handling them.  Check the 'README' file, it"
+      echo "often tells you about the needed prerequisites for installing"
+      echo "this package.  You may also peek at any GNU archive site, in"
+      echo "case some other package contains this missing '$1' program."
+      ;;
+  esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+                       -e '2,$s/^/         /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/replace-enum-strings.cmake b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/replace-enum-strings.cmake
new file mode 100644
index 0000000..42fdbff
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/replace-enum-strings.cmake
@@ -0,0 +1,21 @@
+# CMake script to replace items

+# in sources generated by glib-mkenums

+

+FILE(READ ${ENUM_INPUT_SRC} enum_in)

+

+STRING(REPLACE

+  "_t_get_type"

+  "_get_type"

+  enum_out_tmp

+  "${enum_in}"

+  )

+

+STRING(REPLACE

+  "_T ("

+  " ("

+  enum_out

+  "${enum_out_tmp}"

+  )

+

+FILE(WRITE ${ENUM_OUTPUT_SRC} "${enum_out}")

+FILE(REMOVE ${ENUM_INPUT_SRC})
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/Makefile.am b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/Makefile.am
new file mode 100644
index 0000000..4a130e1
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/Makefile.am
@@ -0,0 +1,456 @@
+# Process this file with automake to produce Makefile.in
+
+NULL =
+SUBDIRS =
+DIST_SUBDIRS =
+BUILT_SOURCES =
+EXTRA_DIST =
+CLEANFILES =
+DISTCLEANFILES =
+MAINTAINERCLEANFILES =
+DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
+TESTS =
+check_PROGRAMS =
+
+# Convenience targets:
+lib: $(BUILT_SOURCES) libharfbuzz.la
+libs: $(BUILT_SOURCES) $(lib_LTLIBRARIES)
+
+lib_LTLIBRARIES = libharfbuzz.la
+
+include Makefile.sources
+
+HBCFLAGS =
+HBLIBS =
+HBNONPCLIBS =
+HBDEPS =
+HBSOURCES =  $(HB_BASE_sources)
+HBSOURCES += $(HB_BASE_RAGEL_GENERATED_sources)
+HBHEADERS = $(HB_BASE_headers)
+
+if HAVE_FALLBACK
+HBSOURCES += $(HB_FALLBACK_sources)
+endif
+
+if HAVE_PTHREAD
+HBCFLAGS += $(PTHREAD_CFLAGS)
+HBNONPCLIBS += $(PTHREAD_LIBS)
+endif
+
+if HAVE_GLIB
+HBCFLAGS += $(GLIB_CFLAGS)
+HBLIBS   += $(GLIB_LIBS)
+HBDEPS   += $(GLIB_DEPS)
+HBSOURCES += $(HB_GLIB_sources)
+HBHEADERS += $(HB_GLIB_headers)
+endif
+
+if HAVE_FREETYPE
+HBCFLAGS += $(FREETYPE_CFLAGS)
+HBLIBS   += $(FREETYPE_LIBS)
+# XXX
+# The following creates a recursive dependency on FreeType if FreeType is
+# built with HarfBuzz support enabled.  Newer pkg-config handles that just
+# fine but pkg-config 0.26 as shipped in Ubuntu 14.04 crashes.  Remove
+# in a year or two, or otherwise work around it...
+#HBDEPS   += $(FREETYPE_DEPS)
+HBSOURCES += $(HB_FT_sources)
+HBHEADERS += $(HB_FT_headers)
+endif
+
+if HAVE_GRAPHITE2
+HBCFLAGS += $(GRAPHITE2_CFLAGS)
+HBLIBS   += $(GRAPHITE2_LIBS)
+HBDEPS   += $(GRAPHITE2_DEPS)
+HBSOURCES += $(HB_GRAPHITE2_sources)
+HBHEADERS += $(HB_GRAPHITE2_headers)
+endif
+
+if HAVE_UNISCRIBE
+HBCFLAGS += $(UNISCRIBE_CFLAGS)
+HBNONPCLIBS += $(UNISCRIBE_LIBS)
+HBSOURCES += $(HB_UNISCRIBE_sources)
+HBHEADERS += $(HB_UNISCRIBE_headers)
+endif
+
+if HAVE_DIRECTWRITE
+HBCFLAGS += $(DIRECTWRITE_CXXFLAGS)
+HBNONPCLIBS += $(DIRECTWRITE_LIBS)
+HBSOURCES += $(HB_DIRECTWRITE_sources)
+HBHEADERS += $(HB_DIRECTWRITE_headers)
+endif
+
+if HAVE_CORETEXT
+HBCFLAGS += $(CORETEXT_CFLAGS)
+HBNONPCLIBS += $(CORETEXT_LIBS)
+HBSOURCES += $(HB_CORETEXT_sources)
+HBHEADERS += $(HB_CORETEXT_headers)
+endif
+
+if HAVE_UCDN
+SUBDIRS += hb-ucdn
+HBCFLAGS += -I$(srcdir)/hb-ucdn
+HBLIBS   += hb-ucdn/libhb-ucdn.la
+HBSOURCES += $(HB_UCDN_sources)
+hb-ucdn/libhb-ucdn.la: ucdn
+ucdn:
+	@$(MAKE) $(AM_MAKEFLAGS) -C hb-ucdn
+endif
+DIST_SUBDIRS += hb-ucdn
+
+
+BUILT_SOURCES += \
+	hb-version.h
+
+$(srcdir)/hb-version.h: hb-version.h.in $(top_srcdir)/configure.ac
+	$(AM_V_GEN) $(SED) \
+		-e 's/[@]HB_VERSION_MAJOR@/$(HB_VERSION_MAJOR)/' \
+		-e 's/[@]HB_VERSION_MINOR@/$(HB_VERSION_MINOR)/' \
+		-e 's/[@]HB_VERSION_MICRO@/$(HB_VERSION_MICRO)/' \
+		-e 's/[@]HB_VERSION@/$(HB_VERSION)/' \
+		"$<" > "$@" || ($(RM) "$@"; false)
+
+# Put the library together
+
+HBLIBS += $(HBNONPCLIBS)
+
+if OS_WIN32
+export_symbols = -export-symbols harfbuzz.def
+harfbuzz_def_dependency = harfbuzz.def
+export_symbols_subset = -export-symbols harfbuzz-subset.def
+harfbuzz_subset_def_dependency = harfbuzz-subset.def
+export_symbols_icu = -export-symbols harfbuzz-icu.def
+harfbuzz_icu_def_dependency = harfbuzz-icu.def
+export_symbols_gobject = -export-symbols harfbuzz-gobject.def
+harfbuzz_gobject_def_dependency = harfbuzz-gobject.def
+chosen_linker = $(CXXLINK)
+else
+if WITH_LIBSTDCXX
+chosen_linker = $(CXXLINK)
+else
+if HAVE_GCC
+# Use a C linker for GCC, not C++; Don't link to libstdc++
+chosen_linker = $(LINK)
+else
+chosen_linker = $(CXXLINK)
+endif
+endif
+endif
+
+@CODE_COVERAGE_RULES@
+
+base_link_flags = $(AM_LDFLAGS) -lm -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined
+libharfbuzz_la_LINK = $(chosen_linker) $(libharfbuzz_la_LDFLAGS)
+libharfbuzz_la_SOURCES = $(HBSOURCES) $(HBHEADERS)
+libharfbuzz_la_CPPFLAGS = $(HBCFLAGS) $(CODE_COVERAGE_CFLAGS)
+libharfbuzz_la_LDFLAGS = $(base_link_flags) $(export_symbols) $(CODE_COVERAGE_LDFLAGS)
+libharfbuzz_la_LIBADD = $(HBLIBS)
+EXTRA_libharfbuzz_la_DEPENDENCIES = $(harfbuzz_def_dependency)
+pkginclude_HEADERS = $(HBHEADERS)
+nodist_pkginclude_HEADERS =
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = harfbuzz.pc
+cmakedir = $(libdir)/cmake/harfbuzz
+cmake_DATA = harfbuzz-config.cmake
+EXTRA_DIST += hb-version.h.in harfbuzz.pc.in harfbuzz-config.cmake.in
+
+lib_LTLIBRARIES += libharfbuzz-subset.la
+libharfbuzz_subset_la_SOURCES = $(HB_SUBSET_sources)
+libharfbuzz_subset_la_CPPFLAGS = $(HBCFLAGS) $(CODE_COVERAGE_CFLAGS)
+libharfbuzz_subset_la_LDFLAGS = $(base_link_flags) $(export_symbols_subset) $(CODE_COVERAGE_LDFLAGS)
+libharfbuzz_subset_la_LIBADD = libharfbuzz.la
+EXTRA_libharfbuzz_subset_la_DEPENDENCIES = $(harfbuzz_subset_def_dependency)
+pkginclude_HEADERS += $(HB_SUBSET_headers)
+pkgconfig_DATA += harfbuzz-subset.pc
+EXTRA_DIST += harfbuzz-subset.pc.in
+
+if HAVE_ICU
+if HAVE_ICU_BUILTIN
+HBCFLAGS += $(ICU_CFLAGS)
+HBLIBS += $(ICU_LIBS)
+HBSOURCES += $(HB_ICU_sources)
+HBHEADERS += $(HB_ICU_headers)
+else
+lib_LTLIBRARIES += libharfbuzz-icu.la
+libharfbuzz_icu_la_SOURCES = $(HB_ICU_sources)
+libharfbuzz_icu_la_CPPFLAGS = $(HBCFLAGS) $(ICU_CFLAGS) $(CODE_COVERAGE_CFLAGS)
+libharfbuzz_icu_la_LDFLAGS = $(base_link_flags) $(export_symbols_icu) $(CODE_COVERAGE_LDFLAGS)
+libharfbuzz_icu_la_LIBADD = $(ICU_LIBS) libharfbuzz.la
+EXTRA_libharfbuzz_icu_la_DEPENDENCIES = $(harfbuzz_icu_def_dependency)
+pkginclude_HEADERS += $(HB_ICU_headers)
+pkgconfig_DATA += harfbuzz-icu.pc
+endif
+endif
+EXTRA_DIST += harfbuzz-icu.pc.in
+
+if HAVE_GOBJECT
+lib_LTLIBRARIES += libharfbuzz-gobject.la
+libharfbuzz_gobject_la_LINK = $(chosen_linker) $(libharfbuzz_gobject_la_LDFLAGS)
+libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_DIST_sources)
+nodist_libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_NODIST_sources)
+libharfbuzz_gobject_la_CPPFLAGS = $(HBCFLAGS) $(GOBJECT_CFLAGS) $(CODE_COVERAGE_CFLAGS)
+libharfbuzz_gobject_la_LDFLAGS = $(base_link_flags) $(CODE_COVERAGE_LDFLAGS)
+libharfbuzz_gobject_la_LIBADD = $(GOBJECT_LIBS) libharfbuzz.la
+EXTRA_libharfbuzz_gobject_la_DEPENDENCIES = $(harfbuzz_gobject_def_dependency)
+pkginclude_HEADERS += $(HB_GOBJECT_DIST_headers)
+nodist_pkginclude_HEADERS += $(HB_GOBJECT_NODIST_headers)
+pkgconfig_DATA += harfbuzz-gobject.pc
+
+BUILT_SOURCES += \
+	$(HB_GOBJECT_ENUM_sources) \
+	$(HB_GOBJECT_ENUM_headers) \
+	$(NULL)
+DISTCLEANFILES += \
+	$(HB_GOBJECT_ENUM_sources) \
+	$(HB_GOBJECT_ENUM_headers) \
+	$(NULL)
+hb-gobject-enums.%: hb-gobject-enums.%.tmpl $(HBHEADERS)
+	$(AM_V_GEN) PYTHONIOENCODING=UTF-8 $(GLIB_MKENUMS) \
+		--identifier-prefix hb_ --symbol-prefix hb_gobject \
+		--template $^ | \
+	sed 's/_t_get_type/_get_type/g; s/_T (/ (/g' > "$@" \
+	|| ($(RM) "$@"; false)
+endif
+EXTRA_DIST += \
+	harfbuzz-gobject.pc.in \
+	hb-gobject-enums.cc.tmpl \
+	hb-gobject-enums.h.tmpl \
+	$(NULL)
+
+
+%.pc: %.pc.in $(top_builddir)/config.status
+	$(AM_V_GEN) \
+	$(SED)	-e 's@%prefix%@$(prefix)@g' \
+		-e 's@%exec_prefix%@$(exec_prefix)@g' \
+		-e 's@%libdir%@$(libdir)@g' \
+		-e 's@%includedir%@$(includedir)@g' \
+		-e 's@%libs_private%@$(HBNONPCLIBS)@g' \
+		-e 's@%requires_private%@$(HBDEPS)@g' \
+		-e 's@%VERSION%@$(VERSION)@g' \
+	"$<" > "$@" \
+	|| ($(RM) "$@"; false)
+
+CLEANFILES += $(pkgconfig_DATA)
+
+
+DEF_FILES = harfbuzz.def harfbuzz-subset.def harfbuzz-icu.def harfbuzz-deprecated-symbols.txt
+if HAVE_GOBJECT
+DEF_FILES += harfbuzz-gobject.def
+endif
+check: $(DEF_FILES) # For check-symbols.sh
+CLEANFILES += $(DEF_FILES)
+harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
+	$(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
+harfbuzz-subset.def: $(HB_SUBSET_headers)
+	$(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
+harfbuzz-icu.def: $(HB_ICU_headers)
+	$(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
+harfbuzz-gobject.def: $(HB_GOBJECT_headers)
+	$(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
+harfbuzz-deprecated-symbols.txt: $(srcdir)/hb-deprecated.h
+	$(AM_V_GEN) PLAIN_LIST=1 $(srcdir)/gen-def.py "$@" $^
+
+
+GENERATORS = \
+	gen-arabic-table.py \
+	gen-def.py \
+	gen-emoji-table.py \
+	gen-indic-table.py \
+	gen-os2-unicode-ranges.py \
+	gen-tag-table.py \
+	gen-use-table.py \
+	gen-vowel-constraints.py \
+	$(NULL)
+EXTRA_DIST += $(GENERATORS)
+
+unicode-tables: arabic-table indic-table tag-table use-table emoji-table
+
+arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
+	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-arabic-table.hh \
+	|| ($(RM) $(srcdir)/hb-ot-shape-complex-arabic-table.hh; false)
+
+indic-table: gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt
+	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-indic-table.cc \
+	|| ($(RM) $(srcdir)/hb-ot-shape-complex-indic-table.cc; false)
+
+tag-table: gen-tag-table.py languagetags language-subtag-registry
+	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-tag-table.hh \
+	|| ($(RM) $(srcdir)/hb-ot-tag-table.hh; false)
+
+use-table: gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt
+	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-use-table.cc \
+	|| ($(RM) $(srcdir)/hb-ot-shape-complex-use-table.cc; false)
+
+vowel-constraints: gen-vowel-constraints.py HBIndicVowelConstraints.txt Scripts.txt
+	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc \
+	|| ($(RM) $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc; false)
+
+emoji-table: gen-emoji-table.py emoji-data.txt
+	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-unicode-emoji-table.hh \
+	|| ($(RM) $(srcdir)/hb-unicode-emoji-table.hh; false)
+
+built-sources: $(BUILT_SOURCES)
+
+.PHONY: unicode-tables arabic-table indic-table tag-table use-table vowel-constraints emoji-table built-sources
+
+RAGEL_GENERATED = \
+	$(patsubst %,$(srcdir)/%,$(HB_BASE_RAGEL_GENERATED_sources)) \
+	$(NULL)
+BUILT_SOURCES += $(RAGEL_GENERATED)
+EXTRA_DIST += \
+	$(HB_BASE_RAGEL_sources) \
+	$(NULL)
+# We decided to add ragel-generated files to git...
+#MAINTAINERCLEANFILES += $(RAGEL_GENERATED)
+$(srcdir)/%.hh: $(srcdir)/%.rl
+	$(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -F1 -o "$*.hh" "$*.rl") \
+	|| ($(RM) "$@"; false)
+
+noinst_PROGRAMS = \
+	main \
+	test \
+	test-buffer-serialize \
+	test-name-table \
+	test-size-params \
+	test-would-substitute \
+	$(NULL)
+bin_PROGRAMS =
+
+main_SOURCES = main.cc
+main_CPPFLAGS = $(HBCFLAGS)
+main_LDADD = libharfbuzz.la $(HBLIBS)
+
+test_SOURCES = test.cc
+test_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS)
+test_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS)
+
+test_buffer_serialize_SOURCES = test-buffer-serialize.cc
+test_buffer_serialize_CPPFLAGS = $(HBCFLAGS)
+test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS)
+
+test_name_table_SOURCES = test-name-table.cc
+test_name_table_CPPFLAGS = $(HBCFLAGS)
+test_name_table_LDADD = libharfbuzz.la $(HBLIBS)
+
+test_size_params_SOURCES = test-size-params.cc
+test_size_params_CPPFLAGS = $(HBCFLAGS)
+test_size_params_LDADD = libharfbuzz.la $(HBLIBS)
+
+test_would_substitute_SOURCES = test-would-substitute.cc
+test_would_substitute_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS)
+test_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS)
+
+if HAVE_FREETYPE
+if HAVE_CAIRO_FT
+noinst_PROGRAMS += test-ot-color
+test_ot_color_SOURCES = test-ot-color.cc
+test_ot_color_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) $(CAIRO_FT_CFLAGS)
+test_ot_color_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) $(CAIRO_LIBS) $(CAIRO_FT_LIBS)
+endif # HAVE_CAIRO_FT
+endif # HAVE_FREETYPE
+
+dist_check_SCRIPTS = \
+	check-c-linkage-decls.sh \
+	check-externs.sh \
+	check-header-guards.sh \
+	check-includes.sh \
+	check-static-inits.sh \
+	check-symbols.sh \
+	$(NULL)
+TESTS += $(dist_check_SCRIPTS)
+
+if !WITH_LIBSTDCXX
+dist_check_SCRIPTS += \
+	check-libstdc++.sh \
+	$(NULL)
+endif
+
+check_PROGRAMS += \
+	dump-indic-data \
+	dump-khmer-data \
+	dump-myanmar-data \
+	dump-use-data \
+	$(NULL)
+dump_indic_data_SOURCES = dump-indic-data.cc hb-ot-shape-complex-indic-table.cc
+dump_indic_data_CPPFLAGS = $(HBCFLAGS)
+dump_indic_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_khmer_data_SOURCES = dump-khmer-data.cc hb-ot-shape-complex-indic-table.cc
+dump_khmer_data_CPPFLAGS = $(HBCFLAGS)
+dump_khmer_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_myanmar_data_SOURCES = dump-myanmar-data.cc hb-ot-shape-complex-indic-table.cc
+dump_myanmar_data_CPPFLAGS = $(HBCFLAGS)
+dump_myanmar_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc
+dump_use_data_CPPFLAGS = $(HBCFLAGS)
+dump_use_data_LDADD = libharfbuzz.la $(HBLIBS)
+
+COMPILED_TESTS = test-iter test-ot-tag test-unicode-ranges
+COMPILED_TESTS_CPPFLAGS = $(HBCFLAGS) -DMAIN -UNDEBUG
+COMPILED_TESTS_LDADD = libharfbuzz.la $(HBLIBS)
+check_PROGRAMS += $(COMPILED_TESTS)
+TESTS += $(COMPILED_TESTS)
+
+test_iter_SOURCES = test-iter.cc hb-static.cc
+test_iter_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_iter_LDADD = $(COMPILED_TESTS_LDADD)
+
+test_ot_tag_SOURCES = hb-ot-tag.cc
+test_ot_tag_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_ot_tag_LDADD = $(COMPILED_TESTS_LDADD)
+
+test_unicode_ranges_SOURCES = test-unicode-ranges.cc
+test_unicode_ranges_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_unicode_ranges_LDADD = $(COMPILED_TESTS_LDADD)
+
+TESTS_ENVIRONMENT = \
+	srcdir="$(srcdir)" \
+	MAKE="$(MAKE) $(AM_MAKEFLAGS)" \
+	HBSOURCES="$(HBSOURCES)" \
+	HBHEADERS="$(HBHEADERS)" \
+	$(NULL)
+
+if HAVE_INTROSPECTION
+
+-include $(INTROSPECTION_MAKEFILE)
+INTROSPECTION_GIRS = HarfBuzz-0.0.gir # What does the 0 mean anyway?!
+INTROSPECTION_SCANNER_ARGS = -I$(srcdir) -n hb --identifier-prefix=hb_ --warn-all
+INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
+INTROSPECTION_SCANNER_ENV = CC="$(CC)"
+
+HarfBuzz-0.0.gir: libharfbuzz.la libharfbuzz-gobject.la
+HarfBuzz_0_0_gir_INCLUDES = GObject-2.0
+HarfBuzz_0_0_gir_CFLAGS = \
+	$(INCLUDES) \
+	$(HBCFLAGS) \
+	-DHB_H \
+	-DHB_H_IN \
+	-DHB_OT_H \
+	-DHB_OT_H_IN \
+	-DHB_AAT_H \
+	-DHB_AAT_H_IN \
+	-DHB_GOBJECT_H \
+	-DHB_GOBJECT_H_IN \
+	-DHB_EXTERN= \
+	$(NULL)
+HarfBuzz_0_0_gir_LIBS = \
+	libharfbuzz.la \
+	libharfbuzz-gobject.la \
+	$(NULL)
+HarfBuzz_0_0_gir_FILES = \
+	$(HBHEADERS) \
+	$(HBSOURCES) \
+	$(HB_GOBJECT_sources) \
+	$(HB_GOBJECT_headers) \
+	$(NULL)
+
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(INTROSPECTION_GIRS)
+
+typelibdir = $(libdir)/girepository-1.0
+typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
+
+CLEANFILES += $(gir_DATA) $(typelib_DATA)
+
+endif
+
+-include $(top_srcdir)/git.mk
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/Makefile.in b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/Makefile.in
new file mode 100644
index 0000000..beba71c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/Makefile.in
@@ -0,0 +1,3278 @@
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+
+# Base and default-included sources and headers
+
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = $(am__EXEEXT_5) $(am__EXEEXT_2)
+check_PROGRAMS = dump-indic-data$(EXEEXT) dump-khmer-data$(EXEEXT) \
+	dump-myanmar-data$(EXEEXT) dump-use-data$(EXEEXT) \
+	$(am__EXEEXT_1) $(am__EXEEXT_2)
+@HAVE_FALLBACK_TRUE@am__append_1 = $(HB_FALLBACK_sources)
+@HAVE_PTHREAD_TRUE@am__append_2 = $(PTHREAD_CFLAGS)
+@HAVE_PTHREAD_TRUE@am__append_3 = $(PTHREAD_LIBS)
+@HAVE_GLIB_TRUE@am__append_4 = $(GLIB_CFLAGS)
+@HAVE_GLIB_TRUE@am__append_5 = $(GLIB_LIBS)
+@HAVE_GLIB_TRUE@am__append_6 = $(GLIB_DEPS)
+@HAVE_GLIB_TRUE@am__append_7 = $(HB_GLIB_sources)
+@HAVE_GLIB_TRUE@am__append_8 = $(HB_GLIB_headers)
+@HAVE_FREETYPE_TRUE@am__append_9 = $(FREETYPE_CFLAGS)
+@HAVE_FREETYPE_TRUE@am__append_10 = $(FREETYPE_LIBS)
+# XXX
+# The following creates a recursive dependency on FreeType if FreeType is
+# built with HarfBuzz support enabled.  Newer pkg-config handles that just
+# fine but pkg-config 0.26 as shipped in Ubuntu 14.04 crashes.  Remove
+# in a year or two, or otherwise work around it...
+#HBDEPS   += $(FREETYPE_DEPS)
+@HAVE_FREETYPE_TRUE@am__append_11 = $(HB_FT_sources)
+@HAVE_FREETYPE_TRUE@am__append_12 = $(HB_FT_headers)
+@HAVE_GRAPHITE2_TRUE@am__append_13 = $(GRAPHITE2_CFLAGS)
+@HAVE_GRAPHITE2_TRUE@am__append_14 = $(GRAPHITE2_LIBS)
+@HAVE_GRAPHITE2_TRUE@am__append_15 = $(GRAPHITE2_DEPS)
+@HAVE_GRAPHITE2_TRUE@am__append_16 = $(HB_GRAPHITE2_sources)
+@HAVE_GRAPHITE2_TRUE@am__append_17 = $(HB_GRAPHITE2_headers)
+@HAVE_UNISCRIBE_TRUE@am__append_18 = $(UNISCRIBE_CFLAGS)
+@HAVE_UNISCRIBE_TRUE@am__append_19 = $(UNISCRIBE_LIBS)
+@HAVE_UNISCRIBE_TRUE@am__append_20 = $(HB_UNISCRIBE_sources)
+@HAVE_UNISCRIBE_TRUE@am__append_21 = $(HB_UNISCRIBE_headers)
+@HAVE_DIRECTWRITE_TRUE@am__append_22 = $(DIRECTWRITE_CXXFLAGS)
+@HAVE_DIRECTWRITE_TRUE@am__append_23 = $(DIRECTWRITE_LIBS)
+@HAVE_DIRECTWRITE_TRUE@am__append_24 = $(HB_DIRECTWRITE_sources)
+@HAVE_DIRECTWRITE_TRUE@am__append_25 = $(HB_DIRECTWRITE_headers)
+@HAVE_CORETEXT_TRUE@am__append_26 = $(CORETEXT_CFLAGS)
+@HAVE_CORETEXT_TRUE@am__append_27 = $(CORETEXT_LIBS)
+@HAVE_CORETEXT_TRUE@am__append_28 = $(HB_CORETEXT_sources)
+@HAVE_CORETEXT_TRUE@am__append_29 = $(HB_CORETEXT_headers)
+@HAVE_UCDN_TRUE@am__append_30 = hb-ucdn
+@HAVE_UCDN_TRUE@am__append_31 = -I$(srcdir)/hb-ucdn
+@HAVE_UCDN_TRUE@am__append_32 = hb-ucdn/libhb-ucdn.la
+@HAVE_UCDN_TRUE@am__append_33 = $(HB_UCDN_sources)
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_34 = $(ICU_CFLAGS)
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_35 = $(ICU_LIBS)
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_36 = $(HB_ICU_sources)
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_37 = $(HB_ICU_headers)
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_38 = libharfbuzz-icu.la
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_39 = $(HB_ICU_headers)
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_40 = harfbuzz-icu.pc
+@HAVE_GOBJECT_TRUE@am__append_41 = libharfbuzz-gobject.la
+@HAVE_GOBJECT_TRUE@am__append_42 = $(HB_GOBJECT_DIST_headers)
+@HAVE_GOBJECT_TRUE@am__append_43 = $(HB_GOBJECT_NODIST_headers)
+@HAVE_GOBJECT_TRUE@am__append_44 = harfbuzz-gobject.pc
+@HAVE_GOBJECT_TRUE@am__append_45 = \
+@HAVE_GOBJECT_TRUE@	$(HB_GOBJECT_ENUM_sources) \
+@HAVE_GOBJECT_TRUE@	$(HB_GOBJECT_ENUM_headers) \
+@HAVE_GOBJECT_TRUE@	$(NULL)
+
+@HAVE_GOBJECT_TRUE@am__append_46 = \
+@HAVE_GOBJECT_TRUE@	$(HB_GOBJECT_ENUM_sources) \
+@HAVE_GOBJECT_TRUE@	$(HB_GOBJECT_ENUM_headers) \
+@HAVE_GOBJECT_TRUE@	$(NULL)
+
+@HAVE_GOBJECT_TRUE@am__append_47 = harfbuzz-gobject.def
+noinst_PROGRAMS = main$(EXEEXT) test$(EXEEXT) \
+	test-buffer-serialize$(EXEEXT) test-name-table$(EXEEXT) \
+	test-size-params$(EXEEXT) test-would-substitute$(EXEEXT) \
+	$(am__EXEEXT_1) $(am__EXEEXT_3)
+bin_PROGRAMS =
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@am__append_48 = test-ot-color
+@WITH_LIBSTDCXX_FALSE@am__append_49 = \
+@WITH_LIBSTDCXX_FALSE@	check-libstdc++.sh \
+@WITH_LIBSTDCXX_FALSE@	$(NULL)
+
+@HAVE_INTROSPECTION_TRUE@am__append_50 = $(gir_DATA) $(typelib_DATA)
+subdir = src
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
+	$(top_srcdir)/m4/ax_code_coverage.m4 \
+	$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__dist_check_SCRIPTS_DIST) \
+	$(am__pkginclude_HEADERS_DIST) $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = harfbuzz-config.cmake
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(cmakedir)" "$(DESTDIR)$(girdir)" \
+	"$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(typelibdir)" \
+	"$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgincludedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+@HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_DEPENDENCIES =  \
+@HAVE_GOBJECT_TRUE@	$(am__DEPENDENCIES_1) libharfbuzz.la
+am__libharfbuzz_gobject_la_SOURCES_DIST = hb-gobject-structs.cc
+am__objects_1 = libharfbuzz_gobject_la-hb-gobject-structs.lo
+@HAVE_GOBJECT_TRUE@am_libharfbuzz_gobject_la_OBJECTS =  \
+@HAVE_GOBJECT_TRUE@	$(am__objects_1)
+am__objects_2 = libharfbuzz_gobject_la-hb-gobject-enums.lo
+am__objects_3 = $(am__objects_2)
+@HAVE_GOBJECT_TRUE@nodist_libharfbuzz_gobject_la_OBJECTS =  \
+@HAVE_GOBJECT_TRUE@	$(am__objects_3)
+libharfbuzz_gobject_la_OBJECTS = $(am_libharfbuzz_gobject_la_OBJECTS) \
+	$(nodist_libharfbuzz_gobject_la_OBJECTS)
+@HAVE_GOBJECT_TRUE@am_libharfbuzz_gobject_la_rpath = -rpath $(libdir)
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_DEPENDENCIES =  \
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@	$(am__DEPENDENCIES_1) \
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@	libharfbuzz.la
+am__libharfbuzz_icu_la_SOURCES_DIST = hb-icu.cc
+am__objects_4 = libharfbuzz_icu_la-hb-icu.lo
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am_libharfbuzz_icu_la_OBJECTS =  \
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@	$(am__objects_4)
+libharfbuzz_icu_la_OBJECTS = $(am_libharfbuzz_icu_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libharfbuzz_icu_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(AM_CXXFLAGS) $(CXXFLAGS) $(libharfbuzz_icu_la_LDFLAGS) \
+	$(LDFLAGS) -o $@
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am_libharfbuzz_icu_la_rpath =  \
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@	-rpath $(libdir)
+libharfbuzz_subset_la_DEPENDENCIES = libharfbuzz.la
+am__objects_5 =
+am__objects_6 = libharfbuzz_subset_la-hb-ot-cff1-table.lo \
+	libharfbuzz_subset_la-hb-ot-cff2-table.lo \
+	libharfbuzz_subset_la-hb-static.lo \
+	libharfbuzz_subset_la-hb-subset-cff-common.lo \
+	libharfbuzz_subset_la-hb-subset-cff1.lo \
+	libharfbuzz_subset_la-hb-subset-cff2.lo \
+	libharfbuzz_subset_la-hb-subset-glyf.lo \
+	libharfbuzz_subset_la-hb-subset-input.lo \
+	libharfbuzz_subset_la-hb-subset-plan.lo \
+	libharfbuzz_subset_la-hb-subset.lo $(am__objects_5)
+am_libharfbuzz_subset_la_OBJECTS = $(am__objects_6)
+libharfbuzz_subset_la_OBJECTS = $(am_libharfbuzz_subset_la_OBJECTS)
+libharfbuzz_subset_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(AM_CXXFLAGS) $(CXXFLAGS) $(libharfbuzz_subset_la_LDFLAGS) \
+	$(LDFLAGS) -o $@
+@HAVE_GLIB_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
+@HAVE_FREETYPE_TRUE@am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1)
+@HAVE_GRAPHITE2_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1)
+@HAVE_PTHREAD_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1)
+@HAVE_UNISCRIBE_TRUE@am__DEPENDENCIES_6 = $(am__DEPENDENCIES_1)
+@HAVE_DIRECTWRITE_TRUE@am__DEPENDENCIES_7 = $(am__DEPENDENCIES_1)
+@HAVE_CORETEXT_TRUE@am__DEPENDENCIES_8 = $(am__DEPENDENCIES_1)
+am__DEPENDENCIES_9 = $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_6) \
+	$(am__DEPENDENCIES_7) $(am__DEPENDENCIES_8)
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__DEPENDENCIES_10 =  \
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@	$(am__DEPENDENCIES_1)
+am__DEPENDENCIES_11 = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3) \
+	$(am__DEPENDENCIES_4) $(am__append_32) $(am__DEPENDENCIES_9) \
+	$(am__DEPENDENCIES_10)
+libharfbuzz_la_DEPENDENCIES = $(am__DEPENDENCIES_11)
+am__libharfbuzz_la_SOURCES_DIST = hb-aat-fdsc-table.hh \
+	hb-aat-layout-ankr-table.hh hb-aat-layout-bsln-table.hh \
+	hb-aat-layout-common.hh hb-aat-layout-feat-table.hh \
+	hb-aat-layout-just-table.hh hb-aat-layout-kerx-table.hh \
+	hb-aat-layout-lcar-table.hh hb-aat-layout-morx-table.hh \
+	hb-aat-layout-trak-table.hh hb-aat-layout.cc hb-aat-layout.hh \
+	hb-aat-ltag-table.hh hb-aat-map.cc hb-aat-map.hh hb-array.hh \
+	hb-atomic.hh hb-blob.cc hb-blob.hh hb-buffer-serialize.cc \
+	hb-buffer.cc hb-buffer.hh hb-cache.hh hb-cff-interp-common.hh \
+	hb-cff-interp-cs-common.hh hb-cff-interp-dict-common.hh \
+	hb-cff1-interp-cs.hh hb-cff2-interp-cs.hh hb-common.cc \
+	hb-debug.hh hb-dsalgs.hh hb-face.cc hb-face.hh hb-font.cc \
+	hb-font.hh hb-iter.hh hb-kern.hh hb-machinery.hh hb-map.cc \
+	hb-map.hh hb-mutex.hh hb-null.hh hb-object.hh hb-open-file.hh \
+	hb-open-type.hh hb-ot-cff-common.hh hb-ot-cff1-table.cc \
+	hb-ot-cff1-table.hh hb-ot-cff2-table.cc hb-ot-cff2-table.hh \
+	hb-ot-cmap-table.hh hb-ot-color-cbdt-table.hh \
+	hb-ot-color-colr-table.hh hb-ot-color-cpal-table.hh \
+	hb-ot-color-sbix-table.hh hb-ot-color-svg-table.hh \
+	hb-ot-color.cc hb-ot-face.cc hb-ot-face.hh hb-ot-font.cc \
+	hb-ot-gasp-table.hh hb-ot-glyf-table.hh hb-ot-hdmx-table.hh \
+	hb-ot-head-table.hh hb-ot-hhea-table.hh hb-ot-hmtx-table.hh \
+	hb-ot-kern-table.hh hb-ot-layout-base-table.hh \
+	hb-ot-layout-common.hh hb-ot-layout-gdef-table.hh \
+	hb-ot-layout-gpos-table.hh hb-ot-layout-gsub-table.hh \
+	hb-ot-layout-gsubgpos.hh hb-ot-layout-jstf-table.hh \
+	hb-ot-layout.cc hb-ot-layout.hh hb-ot-map.cc hb-ot-map.hh \
+	hb-ot-math-table.hh hb-ot-math.cc hb-ot-maxp-table.hh \
+	hb-ot-name-language.cc hb-ot-name-language.hh \
+	hb-ot-name-table.hh hb-ot-name.cc hb-ot-os2-table.hh \
+	hb-ot-os2-unicode-ranges.hh hb-ot-post-macroman.hh \
+	hb-ot-post-table.hh hb-ot-shape-complex-arabic-fallback.hh \
+	hb-ot-shape-complex-arabic-table.hh \
+	hb-ot-shape-complex-arabic-win1256.hh \
+	hb-ot-shape-complex-arabic.cc hb-ot-shape-complex-arabic.hh \
+	hb-ot-shape-complex-default.cc hb-ot-shape-complex-hangul.cc \
+	hb-ot-shape-complex-hebrew.cc \
+	hb-ot-shape-complex-indic-table.cc \
+	hb-ot-shape-complex-indic.cc hb-ot-shape-complex-indic.hh \
+	hb-ot-shape-complex-khmer.cc hb-ot-shape-complex-khmer.hh \
+	hb-ot-shape-complex-myanmar.cc hb-ot-shape-complex-myanmar.hh \
+	hb-ot-shape-complex-thai.cc hb-ot-shape-complex-use-table.cc \
+	hb-ot-shape-complex-use.cc hb-ot-shape-complex-use.hh \
+	hb-ot-shape-complex-vowel-constraints.cc \
+	hb-ot-shape-complex-vowel-constraints.hh \
+	hb-ot-shape-complex.hh hb-ot-shape-fallback.cc \
+	hb-ot-shape-fallback.hh hb-ot-shape-normalize.cc \
+	hb-ot-shape-normalize.hh hb-ot-shape.cc hb-ot-shape.hh \
+	hb-ot-stat-table.hh hb-ot-tag-table.hh hb-ot-tag.cc \
+	hb-ot-var-avar-table.hh hb-ot-var-fvar-table.hh \
+	hb-ot-var-hvar-table.hh hb-ot-var-mvar-table.hh hb-ot-var.cc \
+	hb-ot-vorg-table.hh hb-set-digest.hh hb-set.cc hb-set.hh \
+	hb-shape-plan.cc hb-shape-plan.hh hb-shape.cc \
+	hb-shaper-impl.hh hb-shaper-list.hh hb-shaper.cc hb-shaper.hh \
+	hb-static.cc hb-string-array.hh hb-unicode-emoji-table.hh \
+	hb-unicode.cc hb-unicode.hh hb-utf.hh hb-vector.hh \
+	hb-warning.cc hb.hh hb-buffer-deserialize-json.hh \
+	hb-buffer-deserialize-text.hh \
+	hb-ot-shape-complex-indic-machine.hh \
+	hb-ot-shape-complex-khmer-machine.hh \
+	hb-ot-shape-complex-myanmar-machine.hh \
+	hb-ot-shape-complex-use-machine.hh hb-fallback-shape.cc \
+	hb-glib.cc hb-ft.cc hb-graphite2.cc hb-uniscribe.cc \
+	hb-directwrite.cc hb-coretext.cc hb-ucdn.cc hb-icu.cc \
+	hb-aat-layout.h hb-aat.h hb-blob.h hb-buffer.h hb-common.h \
+	hb-deprecated.h hb-face.h hb-font.h hb-map.h hb-ot-color.h \
+	hb-ot-deprecated.h hb-ot-font.h hb-ot-layout.h hb-ot-math.h \
+	hb-ot-name.h hb-ot-shape.h hb-ot-var.h hb-ot.h hb-set.h \
+	hb-shape-plan.h hb-shape.h hb-unicode.h hb-version.h hb.h \
+	hb-glib.h hb-ft.h hb-graphite2.h hb-uniscribe.h \
+	hb-directwrite.h hb-coretext.h hb-icu.h
+am__objects_7 = libharfbuzz_la-hb-aat-layout.lo \
+	libharfbuzz_la-hb-aat-map.lo libharfbuzz_la-hb-blob.lo \
+	libharfbuzz_la-hb-buffer-serialize.lo \
+	libharfbuzz_la-hb-buffer.lo libharfbuzz_la-hb-common.lo \
+	libharfbuzz_la-hb-face.lo libharfbuzz_la-hb-font.lo \
+	libharfbuzz_la-hb-map.lo libharfbuzz_la-hb-ot-cff1-table.lo \
+	libharfbuzz_la-hb-ot-cff2-table.lo \
+	libharfbuzz_la-hb-ot-color.lo libharfbuzz_la-hb-ot-face.lo \
+	libharfbuzz_la-hb-ot-font.lo libharfbuzz_la-hb-ot-layout.lo \
+	libharfbuzz_la-hb-ot-map.lo libharfbuzz_la-hb-ot-math.lo \
+	libharfbuzz_la-hb-ot-name-language.lo \
+	libharfbuzz_la-hb-ot-name.lo \
+	libharfbuzz_la-hb-ot-shape-complex-arabic.lo \
+	libharfbuzz_la-hb-ot-shape-complex-default.lo \
+	libharfbuzz_la-hb-ot-shape-complex-hangul.lo \
+	libharfbuzz_la-hb-ot-shape-complex-hebrew.lo \
+	libharfbuzz_la-hb-ot-shape-complex-indic-table.lo \
+	libharfbuzz_la-hb-ot-shape-complex-indic.lo \
+	libharfbuzz_la-hb-ot-shape-complex-khmer.lo \
+	libharfbuzz_la-hb-ot-shape-complex-myanmar.lo \
+	libharfbuzz_la-hb-ot-shape-complex-thai.lo \
+	libharfbuzz_la-hb-ot-shape-complex-use-table.lo \
+	libharfbuzz_la-hb-ot-shape-complex-use.lo \
+	libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.lo \
+	libharfbuzz_la-hb-ot-shape-fallback.lo \
+	libharfbuzz_la-hb-ot-shape-normalize.lo \
+	libharfbuzz_la-hb-ot-shape.lo libharfbuzz_la-hb-ot-tag.lo \
+	libharfbuzz_la-hb-ot-var.lo libharfbuzz_la-hb-set.lo \
+	libharfbuzz_la-hb-shape-plan.lo libharfbuzz_la-hb-shape.lo \
+	libharfbuzz_la-hb-shaper.lo libharfbuzz_la-hb-static.lo \
+	libharfbuzz_la-hb-unicode.lo libharfbuzz_la-hb-warning.lo \
+	$(am__objects_5)
+am__objects_8 = $(am__objects_5)
+am__objects_9 = libharfbuzz_la-hb-fallback-shape.lo $(am__objects_5)
+@HAVE_FALLBACK_TRUE@am__objects_10 = $(am__objects_9)
+am__objects_11 = libharfbuzz_la-hb-glib.lo
+@HAVE_GLIB_TRUE@am__objects_12 = $(am__objects_11)
+am__objects_13 = libharfbuzz_la-hb-ft.lo
+@HAVE_FREETYPE_TRUE@am__objects_14 = $(am__objects_13)
+am__objects_15 = libharfbuzz_la-hb-graphite2.lo
+@HAVE_GRAPHITE2_TRUE@am__objects_16 = $(am__objects_15)
+am__objects_17 = libharfbuzz_la-hb-uniscribe.lo
+@HAVE_UNISCRIBE_TRUE@am__objects_18 = $(am__objects_17)
+am__objects_19 = libharfbuzz_la-hb-directwrite.lo
+@HAVE_DIRECTWRITE_TRUE@am__objects_20 = $(am__objects_19)
+am__objects_21 = libharfbuzz_la-hb-coretext.lo
+@HAVE_CORETEXT_TRUE@am__objects_22 = $(am__objects_21)
+am__objects_23 = libharfbuzz_la-hb-ucdn.lo
+@HAVE_UCDN_TRUE@am__objects_24 = $(am__objects_23)
+am__objects_25 = libharfbuzz_la-hb-icu.lo
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__objects_26 =  \
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@	$(am__objects_25)
+am__objects_27 = $(am__objects_7) $(am__objects_8) $(am__objects_10) \
+	$(am__objects_12) $(am__objects_14) $(am__objects_16) \
+	$(am__objects_18) $(am__objects_20) $(am__objects_22) \
+	$(am__objects_24) $(am__objects_26)
+@HAVE_GLIB_TRUE@am__objects_28 = $(am__objects_5)
+@HAVE_FREETYPE_TRUE@am__objects_29 = $(am__objects_5)
+@HAVE_GRAPHITE2_TRUE@am__objects_30 = $(am__objects_5)
+@HAVE_UNISCRIBE_TRUE@am__objects_31 = $(am__objects_5)
+@HAVE_DIRECTWRITE_TRUE@am__objects_32 = $(am__objects_5)
+@HAVE_CORETEXT_TRUE@am__objects_33 = $(am__objects_5)
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__objects_34 =  \
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@	$(am__objects_5)
+am__objects_35 = $(am__objects_8) $(am__objects_28) $(am__objects_29) \
+	$(am__objects_30) $(am__objects_31) $(am__objects_32) \
+	$(am__objects_33) $(am__objects_34)
+am_libharfbuzz_la_OBJECTS = $(am__objects_27) $(am__objects_35)
+libharfbuzz_la_OBJECTS = $(am_libharfbuzz_la_OBJECTS)
+am__EXEEXT_1 =
+am__EXEEXT_2 = test-iter$(EXEEXT) test-ot-tag$(EXEEXT) \
+	test-unicode-ranges$(EXEEXT)
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@am__EXEEXT_3 = test-ot-color$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+am_dump_indic_data_OBJECTS =  \
+	dump_indic_data-dump-indic-data.$(OBJEXT) \
+	dump_indic_data-hb-ot-shape-complex-indic-table.$(OBJEXT)
+dump_indic_data_OBJECTS = $(am_dump_indic_data_OBJECTS)
+dump_indic_data_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
+am_dump_khmer_data_OBJECTS =  \
+	dump_khmer_data-dump-khmer-data.$(OBJEXT) \
+	dump_khmer_data-hb-ot-shape-complex-indic-table.$(OBJEXT)
+dump_khmer_data_OBJECTS = $(am_dump_khmer_data_OBJECTS)
+dump_khmer_data_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
+am_dump_myanmar_data_OBJECTS =  \
+	dump_myanmar_data-dump-myanmar-data.$(OBJEXT) \
+	dump_myanmar_data-hb-ot-shape-complex-indic-table.$(OBJEXT)
+dump_myanmar_data_OBJECTS = $(am_dump_myanmar_data_OBJECTS)
+dump_myanmar_data_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
+am_dump_use_data_OBJECTS = dump_use_data-dump-use-data.$(OBJEXT) \
+	dump_use_data-hb-ot-shape-complex-use-table.$(OBJEXT)
+dump_use_data_OBJECTS = $(am_dump_use_data_OBJECTS)
+dump_use_data_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
+am_main_OBJECTS = main-main.$(OBJEXT)
+main_OBJECTS = $(am_main_OBJECTS)
+main_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
+am_test_OBJECTS = test-test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11) \
+	$(am__DEPENDENCIES_1)
+am_test_buffer_serialize_OBJECTS =  \
+	test_buffer_serialize-test-buffer-serialize.$(OBJEXT)
+test_buffer_serialize_OBJECTS = $(am_test_buffer_serialize_OBJECTS)
+test_buffer_serialize_DEPENDENCIES = libharfbuzz.la \
+	$(am__DEPENDENCIES_11)
+am_test_iter_OBJECTS = test_iter-test-iter.$(OBJEXT) \
+	test_iter-hb-static.$(OBJEXT)
+test_iter_OBJECTS = $(am_test_iter_OBJECTS)
+am__DEPENDENCIES_12 = libharfbuzz.la $(am__DEPENDENCIES_11)
+test_iter_DEPENDENCIES = $(am__DEPENDENCIES_12)
+am_test_name_table_OBJECTS =  \
+	test_name_table-test-name-table.$(OBJEXT)
+test_name_table_OBJECTS = $(am_test_name_table_OBJECTS)
+test_name_table_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
+am__test_ot_color_SOURCES_DIST = test-ot-color.cc
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@am_test_ot_color_OBJECTS = test_ot_color-test-ot-color.$(OBJEXT)
+test_ot_color_OBJECTS = $(am_test_ot_color_OBJECTS)
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@test_ot_color_DEPENDENCIES =  \
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@	libharfbuzz.la \
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@	$(am__DEPENDENCIES_11) \
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@	$(am__DEPENDENCIES_1) \
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@	$(am__DEPENDENCIES_1) \
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@	$(am__DEPENDENCIES_1)
+am_test_ot_tag_OBJECTS = test_ot_tag-hb-ot-tag.$(OBJEXT)
+test_ot_tag_OBJECTS = $(am_test_ot_tag_OBJECTS)
+test_ot_tag_DEPENDENCIES = $(am__DEPENDENCIES_12)
+am_test_size_params_OBJECTS =  \
+	test_size_params-test-size-params.$(OBJEXT)
+test_size_params_OBJECTS = $(am_test_size_params_OBJECTS)
+test_size_params_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
+am_test_unicode_ranges_OBJECTS =  \
+	test_unicode_ranges-test-unicode-ranges.$(OBJEXT)
+test_unicode_ranges_OBJECTS = $(am_test_unicode_ranges_OBJECTS)
+test_unicode_ranges_DEPENDENCIES = $(am__DEPENDENCIES_12)
+am_test_would_substitute_OBJECTS =  \
+	test_would_substitute-test-would-substitute.$(OBJEXT)
+test_would_substitute_OBJECTS = $(am_test_would_substitute_OBJECTS)
+test_would_substitute_DEPENDENCIES = libharfbuzz.la \
+	$(am__DEPENDENCIES_11) $(am__DEPENDENCIES_1)
+am__dist_check_SCRIPTS_DIST = check-c-linkage-decls.sh \
+	check-externs.sh check-header-guards.sh check-includes.sh \
+	check-static-inits.sh check-symbols.sh check-libstdc++.sh
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libharfbuzz_gobject_la_SOURCES) \
+	$(nodist_libharfbuzz_gobject_la_SOURCES) \
+	$(libharfbuzz_icu_la_SOURCES) $(libharfbuzz_subset_la_SOURCES) \
+	$(libharfbuzz_la_SOURCES) $(dump_indic_data_SOURCES) \
+	$(dump_khmer_data_SOURCES) $(dump_myanmar_data_SOURCES) \
+	$(dump_use_data_SOURCES) $(main_SOURCES) $(test_SOURCES) \
+	$(test_buffer_serialize_SOURCES) $(test_iter_SOURCES) \
+	$(test_name_table_SOURCES) $(test_ot_color_SOURCES) \
+	$(test_ot_tag_SOURCES) $(test_size_params_SOURCES) \
+	$(test_unicode_ranges_SOURCES) \
+	$(test_would_substitute_SOURCES)
+DIST_SOURCES = $(am__libharfbuzz_gobject_la_SOURCES_DIST) \
+	$(am__libharfbuzz_icu_la_SOURCES_DIST) \
+	$(libharfbuzz_subset_la_SOURCES) \
+	$(am__libharfbuzz_la_SOURCES_DIST) $(dump_indic_data_SOURCES) \
+	$(dump_khmer_data_SOURCES) $(dump_myanmar_data_SOURCES) \
+	$(dump_use_data_SOURCES) $(main_SOURCES) $(test_SOURCES) \
+	$(test_buffer_serialize_SOURCES) $(test_iter_SOURCES) \
+	$(test_name_table_SOURCES) $(am__test_ot_color_SOURCES_DIST) \
+	$(test_ot_tag_SOURCES) $(test_size_params_SOURCES) \
+	$(test_unicode_ranges_SOURCES) \
+	$(test_would_substitute_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DATA = $(cmake_DATA) $(gir_DATA) $(pkgconfig_DATA) $(typelib_DATA)
+am__pkginclude_HEADERS_DIST = hb-aat-layout.h hb-aat.h hb-blob.h \
+	hb-buffer.h hb-common.h hb-deprecated.h hb-face.h hb-font.h \
+	hb-map.h hb-ot-color.h hb-ot-deprecated.h hb-ot-font.h \
+	hb-ot-layout.h hb-ot-math.h hb-ot-name.h hb-ot-shape.h \
+	hb-ot-var.h hb-ot.h hb-set.h hb-shape-plan.h hb-shape.h \
+	hb-unicode.h hb-version.h hb.h hb-glib.h hb-ft.h \
+	hb-graphite2.h hb-uniscribe.h hb-directwrite.h hb-coretext.h \
+	hb-icu.h hb-subset.h hb-gobject.h hb-gobject-structs.h
+HEADERS = $(nodist_pkginclude_HEADERS) $(pkginclude_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	check recheck distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+@WITH_LIBSTDCXX_FALSE@am__EXEEXT_4 = check-libstdc++.sh \
+@WITH_LIBSTDCXX_FALSE@	$(am__EXEEXT_1)
+am__EXEEXT_5 = check-c-linkage-decls.sh check-externs.sh \
+	check-header-guards.sh check-includes.sh check-static-inits.sh \
+	check-symbols.sh $(am__EXEEXT_1) $(am__EXEEXT_4)
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
+	$(srcdir)/harfbuzz-config.cmake.in $(top_srcdir)/depcomp \
+	$(top_srcdir)/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_CONFIG = @ICU_CONFIG@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL = 
+SUBDIRS = $(am__append_30)
+DIST_SUBDIRS = hb-ucdn
+BUILT_SOURCES = hb-version.h $(am__append_45) $(RAGEL_GENERATED)
+EXTRA_DIST = hb-version.h.in harfbuzz.pc.in harfbuzz-config.cmake.in \
+	harfbuzz-subset.pc.in harfbuzz-icu.pc.in \
+	harfbuzz-gobject.pc.in hb-gobject-enums.cc.tmpl \
+	hb-gobject-enums.h.tmpl $(NULL) $(GENERATORS) \
+	$(HB_BASE_RAGEL_sources) $(NULL)
+CLEANFILES = $(pkgconfig_DATA) $(DEF_FILES) $(am__append_50)
+DISTCLEANFILES = $(am__append_46)
+MAINTAINERCLEANFILES = 
+DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
+lib_LTLIBRARIES = libharfbuzz.la libharfbuzz-subset.la \
+	$(am__append_38) $(am__append_41)
+HB_BASE_sources = \
+	hb-aat-fdsc-table.hh \
+	hb-aat-layout-ankr-table.hh \
+	hb-aat-layout-bsln-table.hh \
+	hb-aat-layout-common.hh \
+	hb-aat-layout-feat-table.hh \
+	hb-aat-layout-just-table.hh \
+	hb-aat-layout-kerx-table.hh \
+	hb-aat-layout-lcar-table.hh \
+	hb-aat-layout-morx-table.hh \
+	hb-aat-layout-trak-table.hh \
+	hb-aat-layout.cc \
+	hb-aat-layout.hh \
+	hb-aat-ltag-table.hh \
+	hb-aat-map.cc \
+	hb-aat-map.hh \
+	hb-array.hh \
+	hb-atomic.hh \
+	hb-blob.cc \
+	hb-blob.hh \
+	hb-buffer-serialize.cc \
+	hb-buffer.cc \
+	hb-buffer.hh \
+	hb-cache.hh \
+	hb-cff-interp-common.hh \
+	hb-cff-interp-cs-common.hh \
+	hb-cff-interp-dict-common.hh \
+	hb-cff1-interp-cs.hh \
+	hb-cff2-interp-cs.hh \
+	hb-common.cc \
+	hb-debug.hh \
+	hb-dsalgs.hh \
+	hb-face.cc \
+	hb-face.hh \
+	hb-font.cc \
+	hb-font.hh \
+	hb-iter.hh \
+	hb-kern.hh \
+	hb-machinery.hh \
+	hb-map.cc \
+	hb-map.hh \
+	hb-mutex.hh \
+	hb-null.hh \
+	hb-object.hh \
+	hb-open-file.hh \
+	hb-open-type.hh \
+	hb-ot-cff-common.hh \
+	hb-ot-cff1-table.cc \
+	hb-ot-cff1-table.hh \
+	hb-ot-cff2-table.cc \
+	hb-ot-cff2-table.hh \
+	hb-ot-cmap-table.hh \
+	hb-ot-color-cbdt-table.hh \
+	hb-ot-color-colr-table.hh \
+	hb-ot-color-cpal-table.hh \
+	hb-ot-color-sbix-table.hh \
+	hb-ot-color-svg-table.hh \
+	hb-ot-color.cc \
+	hb-ot-face.cc \
+	hb-ot-face.hh \
+	hb-ot-font.cc \
+	hb-ot-gasp-table.hh \
+	hb-ot-glyf-table.hh \
+	hb-ot-hdmx-table.hh \
+	hb-ot-head-table.hh \
+	hb-ot-hhea-table.hh \
+	hb-ot-hmtx-table.hh \
+	hb-ot-kern-table.hh \
+	hb-ot-layout-base-table.hh \
+	hb-ot-layout-common.hh \
+	hb-ot-layout-gdef-table.hh \
+	hb-ot-layout-gpos-table.hh \
+	hb-ot-layout-gsub-table.hh \
+	hb-ot-layout-gsubgpos.hh \
+	hb-ot-layout-jstf-table.hh \
+	hb-ot-layout.cc \
+	hb-ot-layout.hh \
+	hb-ot-map.cc \
+	hb-ot-map.hh \
+	hb-ot-math-table.hh \
+	hb-ot-math.cc \
+	hb-ot-maxp-table.hh \
+	hb-ot-name-language.cc \
+	hb-ot-name-language.hh \
+	hb-ot-name-table.hh \
+	hb-ot-name.cc \
+	hb-ot-os2-table.hh \
+	hb-ot-os2-unicode-ranges.hh \
+	hb-ot-post-macroman.hh \
+	hb-ot-post-table.hh \
+	hb-ot-shape-complex-arabic-fallback.hh \
+	hb-ot-shape-complex-arabic-table.hh \
+	hb-ot-shape-complex-arabic-win1256.hh \
+	hb-ot-shape-complex-arabic.cc \
+	hb-ot-shape-complex-arabic.hh \
+	hb-ot-shape-complex-default.cc \
+	hb-ot-shape-complex-hangul.cc \
+	hb-ot-shape-complex-hebrew.cc \
+	hb-ot-shape-complex-indic-table.cc \
+	hb-ot-shape-complex-indic.cc \
+	hb-ot-shape-complex-indic.hh \
+	hb-ot-shape-complex-khmer.cc \
+	hb-ot-shape-complex-khmer.hh \
+	hb-ot-shape-complex-myanmar.cc \
+	hb-ot-shape-complex-myanmar.hh \
+	hb-ot-shape-complex-thai.cc \
+	hb-ot-shape-complex-use-table.cc \
+	hb-ot-shape-complex-use.cc \
+	hb-ot-shape-complex-use.hh \
+	hb-ot-shape-complex-vowel-constraints.cc \
+	hb-ot-shape-complex-vowel-constraints.hh \
+	hb-ot-shape-complex.hh \
+	hb-ot-shape-fallback.cc \
+	hb-ot-shape-fallback.hh \
+	hb-ot-shape-normalize.cc \
+	hb-ot-shape-normalize.hh \
+	hb-ot-shape.cc \
+	hb-ot-shape.hh \
+	hb-ot-stat-table.hh \
+	hb-ot-tag-table.hh \
+	hb-ot-tag.cc \
+	hb-ot-var-avar-table.hh \
+	hb-ot-var-fvar-table.hh \
+	hb-ot-var-hvar-table.hh \
+	hb-ot-var-mvar-table.hh \
+	hb-ot-var.cc \
+	hb-ot-vorg-table.hh \
+	hb-set-digest.hh \
+	hb-set.cc \
+	hb-set.hh \
+	hb-shape-plan.cc \
+	hb-shape-plan.hh \
+	hb-shape.cc \
+	hb-shaper-impl.hh \
+	hb-shaper-list.hh \
+	hb-shaper.cc \
+	hb-shaper.hh \
+	hb-static.cc \
+	hb-string-array.hh \
+	hb-unicode-emoji-table.hh \
+	hb-unicode.cc \
+	hb-unicode.hh \
+	hb-utf.hh \
+	hb-vector.hh \
+	hb-warning.cc \
+	hb.hh \
+	$(NULL)
+
+HB_BASE_RAGEL_GENERATED_sources = \
+	hb-buffer-deserialize-json.hh \
+	hb-buffer-deserialize-text.hh \
+	hb-ot-shape-complex-indic-machine.hh \
+	hb-ot-shape-complex-khmer-machine.hh \
+	hb-ot-shape-complex-myanmar-machine.hh \
+	hb-ot-shape-complex-use-machine.hh \
+	$(NULL)
+
+HB_BASE_RAGEL_sources = \
+	hb-buffer-deserialize-json.rl \
+	hb-buffer-deserialize-text.rl \
+	hb-ot-shape-complex-indic-machine.rl \
+	hb-ot-shape-complex-khmer-machine.rl \
+	hb-ot-shape-complex-myanmar-machine.rl \
+	hb-ot-shape-complex-use-machine.rl \
+	$(NULL)
+
+HB_BASE_headers = \
+	hb-aat-layout.h \
+	hb-aat.h \
+	hb-blob.h \
+	hb-buffer.h \
+	hb-common.h \
+	hb-deprecated.h \
+	hb-face.h \
+	hb-font.h \
+	hb-map.h \
+	hb-ot-color.h \
+	hb-ot-deprecated.h \
+	hb-ot-font.h \
+	hb-ot-layout.h \
+	hb-ot-math.h \
+	hb-ot-name.h \
+	hb-ot-shape.h \
+	hb-ot-var.h \
+	hb-ot.h \
+	hb-set.h \
+	hb-shape-plan.h \
+	hb-shape.h \
+	hb-unicode.h \
+	hb-version.h \
+	hb.h \
+	$(NULL)
+
+HB_FALLBACK_sources = \
+	hb-fallback-shape.cc	\
+	$(NULL)
+
+
+# Optional Sources and Headers with external deps
+HB_FT_sources = hb-ft.cc
+HB_FT_headers = hb-ft.h
+HB_GLIB_sources = hb-glib.cc
+HB_GLIB_headers = hb-glib.h
+HB_GRAPHITE2_sources = hb-graphite2.cc
+HB_GRAPHITE2_headers = hb-graphite2.h
+
+# System-dependent sources and headers
+HB_CORETEXT_sources = hb-coretext.cc
+HB_CORETEXT_headers = hb-coretext.h
+HB_DIRECTWRITE_sources = hb-directwrite.cc
+HB_DIRECTWRITE_headers = hb-directwrite.h
+HB_UNISCRIBE_sources = hb-uniscribe.cc
+HB_UNISCRIBE_headers = hb-uniscribe.h
+
+# Additional supplemental sources
+HB_UCDN_sources = hb-ucdn.cc
+
+# Sources for libharfbuzz-gobject and libharfbuzz-icu
+HB_ICU_sources = hb-icu.cc
+HB_ICU_headers = hb-icu.h
+
+# Sources for libharfbuzz-subset
+HB_SUBSET_sources = \
+	hb-ot-cff1-table.cc \
+	hb-ot-cff2-table.cc \
+	hb-static.cc \
+	hb-subset-cff-common.cc \
+	hb-subset-cff-common.hh \
+	hb-subset-cff1.cc \
+	hb-subset-cff1.hh \
+	hb-subset-cff2.cc \
+	hb-subset-cff2.hh \
+	hb-subset-glyf.cc \
+	hb-subset-glyf.hh \
+	hb-subset-glyf.hh \
+	hb-subset-input.cc \
+	hb-subset-input.hh \
+	hb-subset-plan.cc \
+	hb-subset-plan.hh \
+	hb-subset-plan.hh \
+	hb-subset.cc \
+	hb-subset.hh \
+	hb-subset.hh \
+	$(NULL)
+
+HB_SUBSET_headers = \
+	hb-subset.h \
+	$(NULL)
+
+HB_GOBJECT_DIST_sources = hb-gobject-structs.cc
+HB_GOBJECT_DIST_headers = hb-gobject.h hb-gobject-structs.h
+HB_GOBJECT_ENUM_sources = hb-gobject-enums.cc
+HB_GOBJECT_ENUM_headers = hb-gobject-enums.h
+HB_GOBJECT_NODIST_sources = $(HB_GOBJECT_ENUM_sources)
+HB_GOBJECT_NODIST_headers = $(HB_GOBJECT_ENUM_headers)
+HB_GOBJECT_sources = $(HB_GOBJECT_DIST_sources) $(HB_GOBJECT_NODIST_sources)
+HB_GOBJECT_headers = $(HB_GOBJECT_DIST_headers) $(HB_GOBJECT_NODIST_headers)
+HBCFLAGS = $(am__append_2) $(am__append_4) $(am__append_9) \
+	$(am__append_13) $(am__append_18) $(am__append_22) \
+	$(am__append_26) $(am__append_31) $(am__append_34)
+
+# Put the library together
+HBLIBS = $(am__append_5) $(am__append_10) $(am__append_14) \
+	$(am__append_32) $(HBNONPCLIBS) $(am__append_35)
+HBNONPCLIBS = $(am__append_3) $(am__append_19) $(am__append_23) \
+	$(am__append_27)
+HBDEPS = $(am__append_6) $(am__append_15)
+HBSOURCES = $(HB_BASE_sources) $(HB_BASE_RAGEL_GENERATED_sources) \
+	$(am__append_1) $(am__append_7) $(am__append_11) \
+	$(am__append_16) $(am__append_20) $(am__append_24) \
+	$(am__append_28) $(am__append_33) $(am__append_36)
+HBHEADERS = $(HB_BASE_headers) $(am__append_8) $(am__append_12) \
+	$(am__append_17) $(am__append_21) $(am__append_25) \
+	$(am__append_29) $(am__append_37)
+@OS_WIN32_TRUE@export_symbols = -export-symbols harfbuzz.def
+@OS_WIN32_TRUE@harfbuzz_def_dependency = harfbuzz.def
+@OS_WIN32_TRUE@export_symbols_subset = -export-symbols harfbuzz-subset.def
+@OS_WIN32_TRUE@harfbuzz_subset_def_dependency = harfbuzz-subset.def
+@OS_WIN32_TRUE@export_symbols_icu = -export-symbols harfbuzz-icu.def
+@OS_WIN32_TRUE@harfbuzz_icu_def_dependency = harfbuzz-icu.def
+@OS_WIN32_TRUE@export_symbols_gobject = -export-symbols harfbuzz-gobject.def
+@OS_WIN32_TRUE@harfbuzz_gobject_def_dependency = harfbuzz-gobject.def
+@HAVE_GCC_FALSE@@OS_WIN32_FALSE@@WITH_LIBSTDCXX_FALSE@chosen_linker = $(CXXLINK)
+# Use a C linker for GCC, not C++; Don't link to libstdc++
+@HAVE_GCC_TRUE@@OS_WIN32_FALSE@@WITH_LIBSTDCXX_FALSE@chosen_linker = $(LINK)
+@OS_WIN32_FALSE@@WITH_LIBSTDCXX_TRUE@chosen_linker = $(CXXLINK)
+@OS_WIN32_TRUE@chosen_linker = $(CXXLINK)
+base_link_flags = $(AM_LDFLAGS) -lm -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined
+libharfbuzz_la_LINK = $(chosen_linker) $(libharfbuzz_la_LDFLAGS)
+libharfbuzz_la_SOURCES = $(HBSOURCES) $(HBHEADERS)
+libharfbuzz_la_CPPFLAGS = $(HBCFLAGS) $(CODE_COVERAGE_CFLAGS)
+libharfbuzz_la_LDFLAGS = $(base_link_flags) $(export_symbols) $(CODE_COVERAGE_LDFLAGS)
+libharfbuzz_la_LIBADD = $(HBLIBS)
+EXTRA_libharfbuzz_la_DEPENDENCIES = $(harfbuzz_def_dependency)
+pkginclude_HEADERS = $(HBHEADERS) $(HB_SUBSET_headers) \
+	$(am__append_39) $(am__append_42)
+nodist_pkginclude_HEADERS = $(am__append_43)
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = harfbuzz.pc harfbuzz-subset.pc $(am__append_40) \
+	$(am__append_44)
+cmakedir = $(libdir)/cmake/harfbuzz
+cmake_DATA = harfbuzz-config.cmake
+libharfbuzz_subset_la_SOURCES = $(HB_SUBSET_sources)
+libharfbuzz_subset_la_CPPFLAGS = $(HBCFLAGS) $(CODE_COVERAGE_CFLAGS)
+libharfbuzz_subset_la_LDFLAGS = $(base_link_flags) $(export_symbols_subset) $(CODE_COVERAGE_LDFLAGS)
+libharfbuzz_subset_la_LIBADD = libharfbuzz.la
+EXTRA_libharfbuzz_subset_la_DEPENDENCIES = $(harfbuzz_subset_def_dependency)
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_SOURCES = $(HB_ICU_sources)
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_CPPFLAGS = $(HBCFLAGS) $(ICU_CFLAGS) $(CODE_COVERAGE_CFLAGS)
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_LDFLAGS = $(base_link_flags) $(export_symbols_icu) $(CODE_COVERAGE_LDFLAGS)
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_LIBADD = $(ICU_LIBS) libharfbuzz.la
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@EXTRA_libharfbuzz_icu_la_DEPENDENCIES = $(harfbuzz_icu_def_dependency)
+@HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_LINK = $(chosen_linker) $(libharfbuzz_gobject_la_LDFLAGS)
+@HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_DIST_sources)
+@HAVE_GOBJECT_TRUE@nodist_libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_NODIST_sources)
+@HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_CPPFLAGS = $(HBCFLAGS) $(GOBJECT_CFLAGS) $(CODE_COVERAGE_CFLAGS)
+@HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_LDFLAGS = $(base_link_flags) $(CODE_COVERAGE_LDFLAGS)
+@HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_LIBADD = $(GOBJECT_LIBS) libharfbuzz.la
+@HAVE_GOBJECT_TRUE@EXTRA_libharfbuzz_gobject_la_DEPENDENCIES = $(harfbuzz_gobject_def_dependency)
+DEF_FILES = harfbuzz.def harfbuzz-subset.def harfbuzz-icu.def \
+	harfbuzz-deprecated-symbols.txt $(am__append_47)
+GENERATORS = \
+	gen-arabic-table.py \
+	gen-def.py \
+	gen-emoji-table.py \
+	gen-indic-table.py \
+	gen-os2-unicode-ranges.py \
+	gen-tag-table.py \
+	gen-use-table.py \
+	gen-vowel-constraints.py \
+	$(NULL)
+
+RAGEL_GENERATED = \
+	$(patsubst %,$(srcdir)/%,$(HB_BASE_RAGEL_GENERATED_sources)) \
+	$(NULL)
+
+main_SOURCES = main.cc
+main_CPPFLAGS = $(HBCFLAGS)
+main_LDADD = libharfbuzz.la $(HBLIBS)
+test_SOURCES = test.cc
+test_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS)
+test_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS)
+test_buffer_serialize_SOURCES = test-buffer-serialize.cc
+test_buffer_serialize_CPPFLAGS = $(HBCFLAGS)
+test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS)
+test_name_table_SOURCES = test-name-table.cc
+test_name_table_CPPFLAGS = $(HBCFLAGS)
+test_name_table_LDADD = libharfbuzz.la $(HBLIBS)
+test_size_params_SOURCES = test-size-params.cc
+test_size_params_CPPFLAGS = $(HBCFLAGS)
+test_size_params_LDADD = libharfbuzz.la $(HBLIBS)
+test_would_substitute_SOURCES = test-would-substitute.cc
+test_would_substitute_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS)
+test_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS)
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@test_ot_color_SOURCES = test-ot-color.cc
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@test_ot_color_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) $(CAIRO_FT_CFLAGS)
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@test_ot_color_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) $(CAIRO_LIBS) $(CAIRO_FT_LIBS)
+dist_check_SCRIPTS = check-c-linkage-decls.sh check-externs.sh \
+	check-header-guards.sh check-includes.sh check-static-inits.sh \
+	check-symbols.sh $(NULL) $(am__append_49)
+dump_indic_data_SOURCES = dump-indic-data.cc hb-ot-shape-complex-indic-table.cc
+dump_indic_data_CPPFLAGS = $(HBCFLAGS)
+dump_indic_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_khmer_data_SOURCES = dump-khmer-data.cc hb-ot-shape-complex-indic-table.cc
+dump_khmer_data_CPPFLAGS = $(HBCFLAGS)
+dump_khmer_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_myanmar_data_SOURCES = dump-myanmar-data.cc hb-ot-shape-complex-indic-table.cc
+dump_myanmar_data_CPPFLAGS = $(HBCFLAGS)
+dump_myanmar_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc
+dump_use_data_CPPFLAGS = $(HBCFLAGS)
+dump_use_data_LDADD = libharfbuzz.la $(HBLIBS)
+COMPILED_TESTS = test-iter test-ot-tag test-unicode-ranges
+COMPILED_TESTS_CPPFLAGS = $(HBCFLAGS) -DMAIN -UNDEBUG
+COMPILED_TESTS_LDADD = libharfbuzz.la $(HBLIBS)
+test_iter_SOURCES = test-iter.cc hb-static.cc
+test_iter_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_iter_LDADD = $(COMPILED_TESTS_LDADD)
+test_ot_tag_SOURCES = hb-ot-tag.cc
+test_ot_tag_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_ot_tag_LDADD = $(COMPILED_TESTS_LDADD)
+test_unicode_ranges_SOURCES = test-unicode-ranges.cc
+test_unicode_ranges_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_unicode_ranges_LDADD = $(COMPILED_TESTS_LDADD)
+TESTS_ENVIRONMENT = \
+	srcdir="$(srcdir)" \
+	MAKE="$(MAKE) $(AM_MAKEFLAGS)" \
+	HBSOURCES="$(HBSOURCES)" \
+	HBHEADERS="$(HBHEADERS)" \
+	$(NULL)
+
+@HAVE_INTROSPECTION_TRUE@INTROSPECTION_GIRS = HarfBuzz-0.0.gir # What does the 0 mean anyway?!
+@HAVE_INTROSPECTION_TRUE@INTROSPECTION_SCANNER_ARGS = -I$(srcdir) -n hb --identifier-prefix=hb_ --warn-all
+@HAVE_INTROSPECTION_TRUE@INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
+@HAVE_INTROSPECTION_TRUE@INTROSPECTION_SCANNER_ENV = CC="$(CC)"
+@HAVE_INTROSPECTION_TRUE@HarfBuzz_0_0_gir_INCLUDES = GObject-2.0
+@HAVE_INTROSPECTION_TRUE@HarfBuzz_0_0_gir_CFLAGS = \
+@HAVE_INTROSPECTION_TRUE@	$(INCLUDES) \
+@HAVE_INTROSPECTION_TRUE@	$(HBCFLAGS) \
+@HAVE_INTROSPECTION_TRUE@	-DHB_H \
+@HAVE_INTROSPECTION_TRUE@	-DHB_H_IN \
+@HAVE_INTROSPECTION_TRUE@	-DHB_OT_H \
+@HAVE_INTROSPECTION_TRUE@	-DHB_OT_H_IN \
+@HAVE_INTROSPECTION_TRUE@	-DHB_AAT_H \
+@HAVE_INTROSPECTION_TRUE@	-DHB_AAT_H_IN \
+@HAVE_INTROSPECTION_TRUE@	-DHB_GOBJECT_H \
+@HAVE_INTROSPECTION_TRUE@	-DHB_GOBJECT_H_IN \
+@HAVE_INTROSPECTION_TRUE@	-DHB_EXTERN= \
+@HAVE_INTROSPECTION_TRUE@	$(NULL)
+
+@HAVE_INTROSPECTION_TRUE@HarfBuzz_0_0_gir_LIBS = \
+@HAVE_INTROSPECTION_TRUE@	libharfbuzz.la \
+@HAVE_INTROSPECTION_TRUE@	libharfbuzz-gobject.la \
+@HAVE_INTROSPECTION_TRUE@	$(NULL)
+
+@HAVE_INTROSPECTION_TRUE@HarfBuzz_0_0_gir_FILES = \
+@HAVE_INTROSPECTION_TRUE@	$(HBHEADERS) \
+@HAVE_INTROSPECTION_TRUE@	$(HBSOURCES) \
+@HAVE_INTROSPECTION_TRUE@	$(HB_GOBJECT_sources) \
+@HAVE_INTROSPECTION_TRUE@	$(HB_GOBJECT_headers) \
+@HAVE_INTROSPECTION_TRUE@	$(NULL)
+
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(INTROSPECTION_GIRS)
+@HAVE_INTROSPECTION_TRUE@typelibdir = $(libdir)/girepository-1.0
+@HAVE_INTROSPECTION_TRUE@typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits src/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnits src/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+$(srcdir)/Makefile.sources $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+harfbuzz-config.cmake: $(top_builddir)/config.status $(srcdir)/harfbuzz-config.cmake.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	}
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libharfbuzz-gobject.la: $(libharfbuzz_gobject_la_OBJECTS) $(libharfbuzz_gobject_la_DEPENDENCIES) $(EXTRA_libharfbuzz_gobject_la_DEPENDENCIES) 
+	$(AM_V_GEN)$(libharfbuzz_gobject_la_LINK) $(am_libharfbuzz_gobject_la_rpath) $(libharfbuzz_gobject_la_OBJECTS) $(libharfbuzz_gobject_la_LIBADD) $(LIBS)
+
+libharfbuzz-icu.la: $(libharfbuzz_icu_la_OBJECTS) $(libharfbuzz_icu_la_DEPENDENCIES) $(EXTRA_libharfbuzz_icu_la_DEPENDENCIES) 
+	$(AM_V_CXXLD)$(libharfbuzz_icu_la_LINK) $(am_libharfbuzz_icu_la_rpath) $(libharfbuzz_icu_la_OBJECTS) $(libharfbuzz_icu_la_LIBADD) $(LIBS)
+
+libharfbuzz-subset.la: $(libharfbuzz_subset_la_OBJECTS) $(libharfbuzz_subset_la_DEPENDENCIES) $(EXTRA_libharfbuzz_subset_la_DEPENDENCIES) 
+	$(AM_V_CXXLD)$(libharfbuzz_subset_la_LINK) -rpath $(libdir) $(libharfbuzz_subset_la_OBJECTS) $(libharfbuzz_subset_la_LIBADD) $(LIBS)
+
+libharfbuzz.la: $(libharfbuzz_la_OBJECTS) $(libharfbuzz_la_DEPENDENCIES) $(EXTRA_libharfbuzz_la_DEPENDENCIES) 
+	$(AM_V_GEN)$(libharfbuzz_la_LINK) -rpath $(libdir) $(libharfbuzz_la_OBJECTS) $(libharfbuzz_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+installcheck-binPROGRAMS: $(bin_PROGRAMS)
+	bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \
+	  case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \
+	   *" $$p "* | *" $(srcdir)/$$p "*) continue;; \
+	  esac; \
+	  f=`echo "$$p" | \
+	     sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  for opt in --help --version; do \
+	    if "$(DESTDIR)$(bindir)/$$f" $$opt >c$${pid}_.out \
+	         2>c$${pid}_.err </dev/null \
+		 && test -n "`cat c$${pid}_.out`" \
+		 && test -z "`cat c$${pid}_.err`"; then :; \
+	    else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \
+	  done; \
+	done; rm -f c$${pid}_.???; exit $$bad
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+dump-indic-data$(EXEEXT): $(dump_indic_data_OBJECTS) $(dump_indic_data_DEPENDENCIES) $(EXTRA_dump_indic_data_DEPENDENCIES) 
+	@rm -f dump-indic-data$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(dump_indic_data_OBJECTS) $(dump_indic_data_LDADD) $(LIBS)
+
+dump-khmer-data$(EXEEXT): $(dump_khmer_data_OBJECTS) $(dump_khmer_data_DEPENDENCIES) $(EXTRA_dump_khmer_data_DEPENDENCIES) 
+	@rm -f dump-khmer-data$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(dump_khmer_data_OBJECTS) $(dump_khmer_data_LDADD) $(LIBS)
+
+dump-myanmar-data$(EXEEXT): $(dump_myanmar_data_OBJECTS) $(dump_myanmar_data_DEPENDENCIES) $(EXTRA_dump_myanmar_data_DEPENDENCIES) 
+	@rm -f dump-myanmar-data$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(dump_myanmar_data_OBJECTS) $(dump_myanmar_data_LDADD) $(LIBS)
+
+dump-use-data$(EXEEXT): $(dump_use_data_OBJECTS) $(dump_use_data_DEPENDENCIES) $(EXTRA_dump_use_data_DEPENDENCIES) 
+	@rm -f dump-use-data$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(dump_use_data_OBJECTS) $(dump_use_data_LDADD) $(LIBS)
+
+main$(EXEEXT): $(main_OBJECTS) $(main_DEPENDENCIES) $(EXTRA_main_DEPENDENCIES) 
+	@rm -f main$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(main_OBJECTS) $(main_LDADD) $(LIBS)
+
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) 
+	@rm -f test$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+test-buffer-serialize$(EXEEXT): $(test_buffer_serialize_OBJECTS) $(test_buffer_serialize_DEPENDENCIES) $(EXTRA_test_buffer_serialize_DEPENDENCIES) 
+	@rm -f test-buffer-serialize$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(test_buffer_serialize_OBJECTS) $(test_buffer_serialize_LDADD) $(LIBS)
+
+test-iter$(EXEEXT): $(test_iter_OBJECTS) $(test_iter_DEPENDENCIES) $(EXTRA_test_iter_DEPENDENCIES) 
+	@rm -f test-iter$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(test_iter_OBJECTS) $(test_iter_LDADD) $(LIBS)
+
+test-name-table$(EXEEXT): $(test_name_table_OBJECTS) $(test_name_table_DEPENDENCIES) $(EXTRA_test_name_table_DEPENDENCIES) 
+	@rm -f test-name-table$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(test_name_table_OBJECTS) $(test_name_table_LDADD) $(LIBS)
+
+test-ot-color$(EXEEXT): $(test_ot_color_OBJECTS) $(test_ot_color_DEPENDENCIES) $(EXTRA_test_ot_color_DEPENDENCIES) 
+	@rm -f test-ot-color$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(test_ot_color_OBJECTS) $(test_ot_color_LDADD) $(LIBS)
+
+test-ot-tag$(EXEEXT): $(test_ot_tag_OBJECTS) $(test_ot_tag_DEPENDENCIES) $(EXTRA_test_ot_tag_DEPENDENCIES) 
+	@rm -f test-ot-tag$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(test_ot_tag_OBJECTS) $(test_ot_tag_LDADD) $(LIBS)
+
+test-size-params$(EXEEXT): $(test_size_params_OBJECTS) $(test_size_params_DEPENDENCIES) $(EXTRA_test_size_params_DEPENDENCIES) 
+	@rm -f test-size-params$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(test_size_params_OBJECTS) $(test_size_params_LDADD) $(LIBS)
+
+test-unicode-ranges$(EXEEXT): $(test_unicode_ranges_OBJECTS) $(test_unicode_ranges_DEPENDENCIES) $(EXTRA_test_unicode_ranges_DEPENDENCIES) 
+	@rm -f test-unicode-ranges$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(test_unicode_ranges_OBJECTS) $(test_unicode_ranges_LDADD) $(LIBS)
+
+test-would-substitute$(EXEEXT): $(test_would_substitute_OBJECTS) $(test_would_substitute_DEPENDENCIES) $(EXTRA_test_would_substitute_DEPENDENCIES) 
+	@rm -f test-would-substitute$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(test_would_substitute_OBJECTS) $(test_would_substitute_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_indic_data-dump-indic-data.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_khmer_data-dump-khmer-data.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_use_data-dump-use-data.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_icu_la-hb-icu.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-aat-layout.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-aat-map.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-blob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-buffer-serialize.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-buffer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-common.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-coretext.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-directwrite.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-face.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-fallback-shape.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-font.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ft.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-glib.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-graphite2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-icu.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-map.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-cff1-table.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-cff2-table.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-color.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-face.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-font.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-layout.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-map.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-math.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-name-language.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-name.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-arabic.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-default.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-hangul.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-hebrew.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic-table.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-thai.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-normalize.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-tag.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-var.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-set.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-shape-plan.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-shape.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-shaper.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-static.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ucdn.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-unicode.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-uniscribe.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-warning.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff1-table.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff2-table.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-static.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff-common.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff1.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-glyf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-input.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-plan.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_buffer_serialize-test-buffer-serialize.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_iter-hb-static.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_iter-test-iter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_name_table-test-name-table.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ot_color-test-ot-color.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ot_tag-hb-ot-tag.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_size_params-test-size-params.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_would_substitute-test-would-substitute.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+libharfbuzz_gobject_la-hb-gobject-structs.lo: hb-gobject-structs.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_gobject_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_gobject_la-hb-gobject-structs.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Tpo -c -o libharfbuzz_gobject_la-hb-gobject-structs.lo `test -f 'hb-gobject-structs.cc' || echo '$(srcdir)/'`hb-gobject-structs.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Tpo $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-gobject-structs.cc' object='libharfbuzz_gobject_la-hb-gobject-structs.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_gobject_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_gobject_la-hb-gobject-structs.lo `test -f 'hb-gobject-structs.cc' || echo '$(srcdir)/'`hb-gobject-structs.cc
+
+libharfbuzz_gobject_la-hb-gobject-enums.lo: hb-gobject-enums.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_gobject_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_gobject_la-hb-gobject-enums.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Tpo -c -o libharfbuzz_gobject_la-hb-gobject-enums.lo `test -f 'hb-gobject-enums.cc' || echo '$(srcdir)/'`hb-gobject-enums.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Tpo $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-gobject-enums.cc' object='libharfbuzz_gobject_la-hb-gobject-enums.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_gobject_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_gobject_la-hb-gobject-enums.lo `test -f 'hb-gobject-enums.cc' || echo '$(srcdir)/'`hb-gobject-enums.cc
+
+libharfbuzz_icu_la-hb-icu.lo: hb-icu.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_icu_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_icu_la-hb-icu.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_icu_la-hb-icu.Tpo -c -o libharfbuzz_icu_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_icu_la-hb-icu.Tpo $(DEPDIR)/libharfbuzz_icu_la-hb-icu.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-icu.cc' object='libharfbuzz_icu_la-hb-icu.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_icu_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_icu_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc
+
+libharfbuzz_subset_la-hb-ot-cff1-table.lo: hb-ot-cff1-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-ot-cff1-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff1-table.Tpo -c -o libharfbuzz_subset_la-hb-ot-cff1-table.lo `test -f 'hb-ot-cff1-table.cc' || echo '$(srcdir)/'`hb-ot-cff1-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff1-table.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff1-table.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-cff1-table.cc' object='libharfbuzz_subset_la-hb-ot-cff1-table.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-ot-cff1-table.lo `test -f 'hb-ot-cff1-table.cc' || echo '$(srcdir)/'`hb-ot-cff1-table.cc
+
+libharfbuzz_subset_la-hb-ot-cff2-table.lo: hb-ot-cff2-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-ot-cff2-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff2-table.Tpo -c -o libharfbuzz_subset_la-hb-ot-cff2-table.lo `test -f 'hb-ot-cff2-table.cc' || echo '$(srcdir)/'`hb-ot-cff2-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff2-table.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff2-table.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-cff2-table.cc' object='libharfbuzz_subset_la-hb-ot-cff2-table.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-ot-cff2-table.lo `test -f 'hb-ot-cff2-table.cc' || echo '$(srcdir)/'`hb-ot-cff2-table.cc
+
+libharfbuzz_subset_la-hb-static.lo: hb-static.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-static.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-static.Tpo -c -o libharfbuzz_subset_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-static.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-static.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-static.cc' object='libharfbuzz_subset_la-hb-static.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+
+libharfbuzz_subset_la-hb-subset-cff-common.lo: hb-subset-cff-common.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset-cff-common.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff-common.Tpo -c -o libharfbuzz_subset_la-hb-subset-cff-common.lo `test -f 'hb-subset-cff-common.cc' || echo '$(srcdir)/'`hb-subset-cff-common.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff-common.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff-common.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-subset-cff-common.cc' object='libharfbuzz_subset_la-hb-subset-cff-common.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset-cff-common.lo `test -f 'hb-subset-cff-common.cc' || echo '$(srcdir)/'`hb-subset-cff-common.cc
+
+libharfbuzz_subset_la-hb-subset-cff1.lo: hb-subset-cff1.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset-cff1.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff1.Tpo -c -o libharfbuzz_subset_la-hb-subset-cff1.lo `test -f 'hb-subset-cff1.cc' || echo '$(srcdir)/'`hb-subset-cff1.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff1.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff1.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-subset-cff1.cc' object='libharfbuzz_subset_la-hb-subset-cff1.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset-cff1.lo `test -f 'hb-subset-cff1.cc' || echo '$(srcdir)/'`hb-subset-cff1.cc
+
+libharfbuzz_subset_la-hb-subset-cff2.lo: hb-subset-cff2.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset-cff2.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff2.Tpo -c -o libharfbuzz_subset_la-hb-subset-cff2.lo `test -f 'hb-subset-cff2.cc' || echo '$(srcdir)/'`hb-subset-cff2.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff2.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff2.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-subset-cff2.cc' object='libharfbuzz_subset_la-hb-subset-cff2.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset-cff2.lo `test -f 'hb-subset-cff2.cc' || echo '$(srcdir)/'`hb-subset-cff2.cc
+
+libharfbuzz_subset_la-hb-subset-glyf.lo: hb-subset-glyf.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset-glyf.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset-glyf.Tpo -c -o libharfbuzz_subset_la-hb-subset-glyf.lo `test -f 'hb-subset-glyf.cc' || echo '$(srcdir)/'`hb-subset-glyf.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset-glyf.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset-glyf.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-subset-glyf.cc' object='libharfbuzz_subset_la-hb-subset-glyf.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset-glyf.lo `test -f 'hb-subset-glyf.cc' || echo '$(srcdir)/'`hb-subset-glyf.cc
+
+libharfbuzz_subset_la-hb-subset-input.lo: hb-subset-input.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset-input.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset-input.Tpo -c -o libharfbuzz_subset_la-hb-subset-input.lo `test -f 'hb-subset-input.cc' || echo '$(srcdir)/'`hb-subset-input.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset-input.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset-input.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-subset-input.cc' object='libharfbuzz_subset_la-hb-subset-input.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset-input.lo `test -f 'hb-subset-input.cc' || echo '$(srcdir)/'`hb-subset-input.cc
+
+libharfbuzz_subset_la-hb-subset-plan.lo: hb-subset-plan.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset-plan.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset-plan.Tpo -c -o libharfbuzz_subset_la-hb-subset-plan.lo `test -f 'hb-subset-plan.cc' || echo '$(srcdir)/'`hb-subset-plan.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset-plan.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset-plan.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-subset-plan.cc' object='libharfbuzz_subset_la-hb-subset-plan.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset-plan.lo `test -f 'hb-subset-plan.cc' || echo '$(srcdir)/'`hb-subset-plan.cc
+
+libharfbuzz_subset_la-hb-subset.lo: hb-subset.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset.Tpo -c -o libharfbuzz_subset_la-hb-subset.lo `test -f 'hb-subset.cc' || echo '$(srcdir)/'`hb-subset.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-subset.cc' object='libharfbuzz_subset_la-hb-subset.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset.lo `test -f 'hb-subset.cc' || echo '$(srcdir)/'`hb-subset.cc
+
+libharfbuzz_la-hb-aat-layout.lo: hb-aat-layout.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-aat-layout.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-aat-layout.Tpo -c -o libharfbuzz_la-hb-aat-layout.lo `test -f 'hb-aat-layout.cc' || echo '$(srcdir)/'`hb-aat-layout.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-aat-layout.Tpo $(DEPDIR)/libharfbuzz_la-hb-aat-layout.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-aat-layout.cc' object='libharfbuzz_la-hb-aat-layout.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-aat-layout.lo `test -f 'hb-aat-layout.cc' || echo '$(srcdir)/'`hb-aat-layout.cc
+
+libharfbuzz_la-hb-aat-map.lo: hb-aat-map.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-aat-map.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-aat-map.Tpo -c -o libharfbuzz_la-hb-aat-map.lo `test -f 'hb-aat-map.cc' || echo '$(srcdir)/'`hb-aat-map.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-aat-map.Tpo $(DEPDIR)/libharfbuzz_la-hb-aat-map.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-aat-map.cc' object='libharfbuzz_la-hb-aat-map.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-aat-map.lo `test -f 'hb-aat-map.cc' || echo '$(srcdir)/'`hb-aat-map.cc
+
+libharfbuzz_la-hb-blob.lo: hb-blob.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-blob.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-blob.Tpo -c -o libharfbuzz_la-hb-blob.lo `test -f 'hb-blob.cc' || echo '$(srcdir)/'`hb-blob.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-blob.Tpo $(DEPDIR)/libharfbuzz_la-hb-blob.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-blob.cc' object='libharfbuzz_la-hb-blob.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-blob.lo `test -f 'hb-blob.cc' || echo '$(srcdir)/'`hb-blob.cc
+
+libharfbuzz_la-hb-buffer-serialize.lo: hb-buffer-serialize.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-buffer-serialize.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-buffer-serialize.Tpo -c -o libharfbuzz_la-hb-buffer-serialize.lo `test -f 'hb-buffer-serialize.cc' || echo '$(srcdir)/'`hb-buffer-serialize.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-buffer-serialize.Tpo $(DEPDIR)/libharfbuzz_la-hb-buffer-serialize.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-buffer-serialize.cc' object='libharfbuzz_la-hb-buffer-serialize.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-buffer-serialize.lo `test -f 'hb-buffer-serialize.cc' || echo '$(srcdir)/'`hb-buffer-serialize.cc
+
+libharfbuzz_la-hb-buffer.lo: hb-buffer.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-buffer.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-buffer.Tpo -c -o libharfbuzz_la-hb-buffer.lo `test -f 'hb-buffer.cc' || echo '$(srcdir)/'`hb-buffer.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-buffer.Tpo $(DEPDIR)/libharfbuzz_la-hb-buffer.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-buffer.cc' object='libharfbuzz_la-hb-buffer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-buffer.lo `test -f 'hb-buffer.cc' || echo '$(srcdir)/'`hb-buffer.cc
+
+libharfbuzz_la-hb-common.lo: hb-common.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-common.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-common.Tpo -c -o libharfbuzz_la-hb-common.lo `test -f 'hb-common.cc' || echo '$(srcdir)/'`hb-common.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-common.Tpo $(DEPDIR)/libharfbuzz_la-hb-common.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-common.cc' object='libharfbuzz_la-hb-common.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-common.lo `test -f 'hb-common.cc' || echo '$(srcdir)/'`hb-common.cc
+
+libharfbuzz_la-hb-face.lo: hb-face.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-face.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-face.Tpo -c -o libharfbuzz_la-hb-face.lo `test -f 'hb-face.cc' || echo '$(srcdir)/'`hb-face.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-face.Tpo $(DEPDIR)/libharfbuzz_la-hb-face.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-face.cc' object='libharfbuzz_la-hb-face.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-face.lo `test -f 'hb-face.cc' || echo '$(srcdir)/'`hb-face.cc
+
+libharfbuzz_la-hb-font.lo: hb-font.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-font.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-font.Tpo -c -o libharfbuzz_la-hb-font.lo `test -f 'hb-font.cc' || echo '$(srcdir)/'`hb-font.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-font.Tpo $(DEPDIR)/libharfbuzz_la-hb-font.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-font.cc' object='libharfbuzz_la-hb-font.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-font.lo `test -f 'hb-font.cc' || echo '$(srcdir)/'`hb-font.cc
+
+libharfbuzz_la-hb-map.lo: hb-map.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-map.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-map.Tpo -c -o libharfbuzz_la-hb-map.lo `test -f 'hb-map.cc' || echo '$(srcdir)/'`hb-map.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-map.Tpo $(DEPDIR)/libharfbuzz_la-hb-map.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-map.cc' object='libharfbuzz_la-hb-map.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-map.lo `test -f 'hb-map.cc' || echo '$(srcdir)/'`hb-map.cc
+
+libharfbuzz_la-hb-ot-cff1-table.lo: hb-ot-cff1-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-cff1-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-cff1-table.Tpo -c -o libharfbuzz_la-hb-ot-cff1-table.lo `test -f 'hb-ot-cff1-table.cc' || echo '$(srcdir)/'`hb-ot-cff1-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-cff1-table.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-cff1-table.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-cff1-table.cc' object='libharfbuzz_la-hb-ot-cff1-table.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-cff1-table.lo `test -f 'hb-ot-cff1-table.cc' || echo '$(srcdir)/'`hb-ot-cff1-table.cc
+
+libharfbuzz_la-hb-ot-cff2-table.lo: hb-ot-cff2-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-cff2-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-cff2-table.Tpo -c -o libharfbuzz_la-hb-ot-cff2-table.lo `test -f 'hb-ot-cff2-table.cc' || echo '$(srcdir)/'`hb-ot-cff2-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-cff2-table.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-cff2-table.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-cff2-table.cc' object='libharfbuzz_la-hb-ot-cff2-table.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-cff2-table.lo `test -f 'hb-ot-cff2-table.cc' || echo '$(srcdir)/'`hb-ot-cff2-table.cc
+
+libharfbuzz_la-hb-ot-color.lo: hb-ot-color.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-color.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-color.Tpo -c -o libharfbuzz_la-hb-ot-color.lo `test -f 'hb-ot-color.cc' || echo '$(srcdir)/'`hb-ot-color.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-color.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-color.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-color.cc' object='libharfbuzz_la-hb-ot-color.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-color.lo `test -f 'hb-ot-color.cc' || echo '$(srcdir)/'`hb-ot-color.cc
+
+libharfbuzz_la-hb-ot-face.lo: hb-ot-face.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-face.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-face.Tpo -c -o libharfbuzz_la-hb-ot-face.lo `test -f 'hb-ot-face.cc' || echo '$(srcdir)/'`hb-ot-face.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-face.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-face.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-face.cc' object='libharfbuzz_la-hb-ot-face.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-face.lo `test -f 'hb-ot-face.cc' || echo '$(srcdir)/'`hb-ot-face.cc
+
+libharfbuzz_la-hb-ot-font.lo: hb-ot-font.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-font.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-font.Tpo -c -o libharfbuzz_la-hb-ot-font.lo `test -f 'hb-ot-font.cc' || echo '$(srcdir)/'`hb-ot-font.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-font.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-font.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-font.cc' object='libharfbuzz_la-hb-ot-font.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-font.lo `test -f 'hb-ot-font.cc' || echo '$(srcdir)/'`hb-ot-font.cc
+
+libharfbuzz_la-hb-ot-layout.lo: hb-ot-layout.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-layout.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-layout.Tpo -c -o libharfbuzz_la-hb-ot-layout.lo `test -f 'hb-ot-layout.cc' || echo '$(srcdir)/'`hb-ot-layout.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-layout.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-layout.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-layout.cc' object='libharfbuzz_la-hb-ot-layout.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-layout.lo `test -f 'hb-ot-layout.cc' || echo '$(srcdir)/'`hb-ot-layout.cc
+
+libharfbuzz_la-hb-ot-map.lo: hb-ot-map.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-map.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-map.Tpo -c -o libharfbuzz_la-hb-ot-map.lo `test -f 'hb-ot-map.cc' || echo '$(srcdir)/'`hb-ot-map.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-map.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-map.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-map.cc' object='libharfbuzz_la-hb-ot-map.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-map.lo `test -f 'hb-ot-map.cc' || echo '$(srcdir)/'`hb-ot-map.cc
+
+libharfbuzz_la-hb-ot-math.lo: hb-ot-math.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-math.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-math.Tpo -c -o libharfbuzz_la-hb-ot-math.lo `test -f 'hb-ot-math.cc' || echo '$(srcdir)/'`hb-ot-math.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-math.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-math.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-math.cc' object='libharfbuzz_la-hb-ot-math.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-math.lo `test -f 'hb-ot-math.cc' || echo '$(srcdir)/'`hb-ot-math.cc
+
+libharfbuzz_la-hb-ot-name-language.lo: hb-ot-name-language.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-name-language.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-name-language.Tpo -c -o libharfbuzz_la-hb-ot-name-language.lo `test -f 'hb-ot-name-language.cc' || echo '$(srcdir)/'`hb-ot-name-language.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-name-language.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-name-language.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-name-language.cc' object='libharfbuzz_la-hb-ot-name-language.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-name-language.lo `test -f 'hb-ot-name-language.cc' || echo '$(srcdir)/'`hb-ot-name-language.cc
+
+libharfbuzz_la-hb-ot-name.lo: hb-ot-name.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-name.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-name.Tpo -c -o libharfbuzz_la-hb-ot-name.lo `test -f 'hb-ot-name.cc' || echo '$(srcdir)/'`hb-ot-name.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-name.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-name.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-name.cc' object='libharfbuzz_la-hb-ot-name.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-name.lo `test -f 'hb-ot-name.cc' || echo '$(srcdir)/'`hb-ot-name.cc
+
+libharfbuzz_la-hb-ot-shape-complex-arabic.lo: hb-ot-shape-complex-arabic.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-arabic.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-arabic.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-arabic.lo `test -f 'hb-ot-shape-complex-arabic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-arabic.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-arabic.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-arabic.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-arabic.cc' object='libharfbuzz_la-hb-ot-shape-complex-arabic.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-arabic.lo `test -f 'hb-ot-shape-complex-arabic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-arabic.cc
+
+libharfbuzz_la-hb-ot-shape-complex-default.lo: hb-ot-shape-complex-default.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-default.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-default.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-default.lo `test -f 'hb-ot-shape-complex-default.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-default.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-default.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-default.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-default.cc' object='libharfbuzz_la-hb-ot-shape-complex-default.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-default.lo `test -f 'hb-ot-shape-complex-default.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-default.cc
+
+libharfbuzz_la-hb-ot-shape-complex-hangul.lo: hb-ot-shape-complex-hangul.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-hangul.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-hangul.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-hangul.lo `test -f 'hb-ot-shape-complex-hangul.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-hangul.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-hangul.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-hangul.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-hangul.cc' object='libharfbuzz_la-hb-ot-shape-complex-hangul.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-hangul.lo `test -f 'hb-ot-shape-complex-hangul.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-hangul.cc
+
+libharfbuzz_la-hb-ot-shape-complex-hebrew.lo: hb-ot-shape-complex-hebrew.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-hebrew.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-hebrew.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-hebrew.lo `test -f 'hb-ot-shape-complex-hebrew.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-hebrew.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-hebrew.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-hebrew.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-hebrew.cc' object='libharfbuzz_la-hb-ot-shape-complex-hebrew.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-hebrew.lo `test -f 'hb-ot-shape-complex-hebrew.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-hebrew.cc
+
+libharfbuzz_la-hb-ot-shape-complex-indic-table.lo: hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-indic-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic-table.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-indic-table.lo `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic-table.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='libharfbuzz_la-hb-ot-shape-complex-indic-table.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-indic-table.lo `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
+
+libharfbuzz_la-hb-ot-shape-complex-indic.lo: hb-ot-shape-complex-indic.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-indic.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-indic.lo `test -f 'hb-ot-shape-complex-indic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-indic.cc' object='libharfbuzz_la-hb-ot-shape-complex-indic.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-indic.lo `test -f 'hb-ot-shape-complex-indic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic.cc
+
+libharfbuzz_la-hb-ot-shape-complex-khmer.lo: hb-ot-shape-complex-khmer.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-khmer.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-khmer.lo `test -f 'hb-ot-shape-complex-khmer.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-khmer.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-khmer.cc' object='libharfbuzz_la-hb-ot-shape-complex-khmer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-khmer.lo `test -f 'hb-ot-shape-complex-khmer.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-khmer.cc
+
+libharfbuzz_la-hb-ot-shape-complex-myanmar.lo: hb-ot-shape-complex-myanmar.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-myanmar.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-myanmar.lo `test -f 'hb-ot-shape-complex-myanmar.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-myanmar.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-myanmar.cc' object='libharfbuzz_la-hb-ot-shape-complex-myanmar.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-myanmar.lo `test -f 'hb-ot-shape-complex-myanmar.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-myanmar.cc
+
+libharfbuzz_la-hb-ot-shape-complex-thai.lo: hb-ot-shape-complex-thai.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-thai.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-thai.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-thai.lo `test -f 'hb-ot-shape-complex-thai.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-thai.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-thai.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-thai.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-thai.cc' object='libharfbuzz_la-hb-ot-shape-complex-thai.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-thai.lo `test -f 'hb-ot-shape-complex-thai.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-thai.cc
+
+libharfbuzz_la-hb-ot-shape-complex-use-table.lo: hb-ot-shape-complex-use-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-use-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-use-table.lo `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-use-table.cc' object='libharfbuzz_la-hb-ot-shape-complex-use-table.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-use-table.lo `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc
+
+libharfbuzz_la-hb-ot-shape-complex-use.lo: hb-ot-shape-complex-use.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-use.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-use.lo `test -f 'hb-ot-shape-complex-use.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-use.cc' object='libharfbuzz_la-hb-ot-shape-complex-use.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-use.lo `test -f 'hb-ot-shape-complex-use.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use.cc
+
+libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.lo: hb-ot-shape-complex-vowel-constraints.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.lo `test -f 'hb-ot-shape-complex-vowel-constraints.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-vowel-constraints.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-vowel-constraints.cc' object='libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.lo `test -f 'hb-ot-shape-complex-vowel-constraints.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-vowel-constraints.cc
+
+libharfbuzz_la-hb-ot-shape-fallback.lo: hb-ot-shape-fallback.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-fallback.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Tpo -c -o libharfbuzz_la-hb-ot-shape-fallback.lo `test -f 'hb-ot-shape-fallback.cc' || echo '$(srcdir)/'`hb-ot-shape-fallback.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-fallback.cc' object='libharfbuzz_la-hb-ot-shape-fallback.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-fallback.lo `test -f 'hb-ot-shape-fallback.cc' || echo '$(srcdir)/'`hb-ot-shape-fallback.cc
+
+libharfbuzz_la-hb-ot-shape-normalize.lo: hb-ot-shape-normalize.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-normalize.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-normalize.Tpo -c -o libharfbuzz_la-hb-ot-shape-normalize.lo `test -f 'hb-ot-shape-normalize.cc' || echo '$(srcdir)/'`hb-ot-shape-normalize.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-normalize.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-normalize.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-normalize.cc' object='libharfbuzz_la-hb-ot-shape-normalize.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-normalize.lo `test -f 'hb-ot-shape-normalize.cc' || echo '$(srcdir)/'`hb-ot-shape-normalize.cc
+
+libharfbuzz_la-hb-ot-shape.lo: hb-ot-shape.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape.Tpo -c -o libharfbuzz_la-hb-ot-shape.lo `test -f 'hb-ot-shape.cc' || echo '$(srcdir)/'`hb-ot-shape.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape.cc' object='libharfbuzz_la-hb-ot-shape.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape.lo `test -f 'hb-ot-shape.cc' || echo '$(srcdir)/'`hb-ot-shape.cc
+
+libharfbuzz_la-hb-ot-tag.lo: hb-ot-tag.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-tag.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-tag.Tpo -c -o libharfbuzz_la-hb-ot-tag.lo `test -f 'hb-ot-tag.cc' || echo '$(srcdir)/'`hb-ot-tag.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-tag.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-tag.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-tag.cc' object='libharfbuzz_la-hb-ot-tag.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-tag.lo `test -f 'hb-ot-tag.cc' || echo '$(srcdir)/'`hb-ot-tag.cc
+
+libharfbuzz_la-hb-ot-var.lo: hb-ot-var.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-var.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-var.Tpo -c -o libharfbuzz_la-hb-ot-var.lo `test -f 'hb-ot-var.cc' || echo '$(srcdir)/'`hb-ot-var.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-var.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-var.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-var.cc' object='libharfbuzz_la-hb-ot-var.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-var.lo `test -f 'hb-ot-var.cc' || echo '$(srcdir)/'`hb-ot-var.cc
+
+libharfbuzz_la-hb-set.lo: hb-set.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-set.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-set.Tpo -c -o libharfbuzz_la-hb-set.lo `test -f 'hb-set.cc' || echo '$(srcdir)/'`hb-set.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-set.Tpo $(DEPDIR)/libharfbuzz_la-hb-set.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-set.cc' object='libharfbuzz_la-hb-set.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-set.lo `test -f 'hb-set.cc' || echo '$(srcdir)/'`hb-set.cc
+
+libharfbuzz_la-hb-shape-plan.lo: hb-shape-plan.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-shape-plan.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-shape-plan.Tpo -c -o libharfbuzz_la-hb-shape-plan.lo `test -f 'hb-shape-plan.cc' || echo '$(srcdir)/'`hb-shape-plan.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-shape-plan.Tpo $(DEPDIR)/libharfbuzz_la-hb-shape-plan.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-shape-plan.cc' object='libharfbuzz_la-hb-shape-plan.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-shape-plan.lo `test -f 'hb-shape-plan.cc' || echo '$(srcdir)/'`hb-shape-plan.cc
+
+libharfbuzz_la-hb-shape.lo: hb-shape.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-shape.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-shape.Tpo -c -o libharfbuzz_la-hb-shape.lo `test -f 'hb-shape.cc' || echo '$(srcdir)/'`hb-shape.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-shape.Tpo $(DEPDIR)/libharfbuzz_la-hb-shape.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-shape.cc' object='libharfbuzz_la-hb-shape.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-shape.lo `test -f 'hb-shape.cc' || echo '$(srcdir)/'`hb-shape.cc
+
+libharfbuzz_la-hb-shaper.lo: hb-shaper.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-shaper.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-shaper.Tpo -c -o libharfbuzz_la-hb-shaper.lo `test -f 'hb-shaper.cc' || echo '$(srcdir)/'`hb-shaper.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-shaper.Tpo $(DEPDIR)/libharfbuzz_la-hb-shaper.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-shaper.cc' object='libharfbuzz_la-hb-shaper.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-shaper.lo `test -f 'hb-shaper.cc' || echo '$(srcdir)/'`hb-shaper.cc
+
+libharfbuzz_la-hb-static.lo: hb-static.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-static.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-static.Tpo -c -o libharfbuzz_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-static.Tpo $(DEPDIR)/libharfbuzz_la-hb-static.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-static.cc' object='libharfbuzz_la-hb-static.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+
+libharfbuzz_la-hb-unicode.lo: hb-unicode.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-unicode.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-unicode.Tpo -c -o libharfbuzz_la-hb-unicode.lo `test -f 'hb-unicode.cc' || echo '$(srcdir)/'`hb-unicode.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-unicode.Tpo $(DEPDIR)/libharfbuzz_la-hb-unicode.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-unicode.cc' object='libharfbuzz_la-hb-unicode.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-unicode.lo `test -f 'hb-unicode.cc' || echo '$(srcdir)/'`hb-unicode.cc
+
+libharfbuzz_la-hb-warning.lo: hb-warning.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-warning.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-warning.Tpo -c -o libharfbuzz_la-hb-warning.lo `test -f 'hb-warning.cc' || echo '$(srcdir)/'`hb-warning.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-warning.Tpo $(DEPDIR)/libharfbuzz_la-hb-warning.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-warning.cc' object='libharfbuzz_la-hb-warning.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-warning.lo `test -f 'hb-warning.cc' || echo '$(srcdir)/'`hb-warning.cc
+
+libharfbuzz_la-hb-fallback-shape.lo: hb-fallback-shape.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-fallback-shape.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-fallback-shape.Tpo -c -o libharfbuzz_la-hb-fallback-shape.lo `test -f 'hb-fallback-shape.cc' || echo '$(srcdir)/'`hb-fallback-shape.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-fallback-shape.Tpo $(DEPDIR)/libharfbuzz_la-hb-fallback-shape.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-fallback-shape.cc' object='libharfbuzz_la-hb-fallback-shape.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-fallback-shape.lo `test -f 'hb-fallback-shape.cc' || echo '$(srcdir)/'`hb-fallback-shape.cc
+
+libharfbuzz_la-hb-glib.lo: hb-glib.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-glib.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-glib.Tpo -c -o libharfbuzz_la-hb-glib.lo `test -f 'hb-glib.cc' || echo '$(srcdir)/'`hb-glib.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-glib.Tpo $(DEPDIR)/libharfbuzz_la-hb-glib.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-glib.cc' object='libharfbuzz_la-hb-glib.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-glib.lo `test -f 'hb-glib.cc' || echo '$(srcdir)/'`hb-glib.cc
+
+libharfbuzz_la-hb-ft.lo: hb-ft.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ft.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ft.Tpo -c -o libharfbuzz_la-hb-ft.lo `test -f 'hb-ft.cc' || echo '$(srcdir)/'`hb-ft.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ft.Tpo $(DEPDIR)/libharfbuzz_la-hb-ft.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ft.cc' object='libharfbuzz_la-hb-ft.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ft.lo `test -f 'hb-ft.cc' || echo '$(srcdir)/'`hb-ft.cc
+
+libharfbuzz_la-hb-graphite2.lo: hb-graphite2.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-graphite2.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-graphite2.Tpo -c -o libharfbuzz_la-hb-graphite2.lo `test -f 'hb-graphite2.cc' || echo '$(srcdir)/'`hb-graphite2.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-graphite2.Tpo $(DEPDIR)/libharfbuzz_la-hb-graphite2.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-graphite2.cc' object='libharfbuzz_la-hb-graphite2.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-graphite2.lo `test -f 'hb-graphite2.cc' || echo '$(srcdir)/'`hb-graphite2.cc
+
+libharfbuzz_la-hb-uniscribe.lo: hb-uniscribe.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-uniscribe.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-uniscribe.Tpo -c -o libharfbuzz_la-hb-uniscribe.lo `test -f 'hb-uniscribe.cc' || echo '$(srcdir)/'`hb-uniscribe.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-uniscribe.Tpo $(DEPDIR)/libharfbuzz_la-hb-uniscribe.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-uniscribe.cc' object='libharfbuzz_la-hb-uniscribe.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-uniscribe.lo `test -f 'hb-uniscribe.cc' || echo '$(srcdir)/'`hb-uniscribe.cc
+
+libharfbuzz_la-hb-directwrite.lo: hb-directwrite.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-directwrite.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-directwrite.Tpo -c -o libharfbuzz_la-hb-directwrite.lo `test -f 'hb-directwrite.cc' || echo '$(srcdir)/'`hb-directwrite.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-directwrite.Tpo $(DEPDIR)/libharfbuzz_la-hb-directwrite.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-directwrite.cc' object='libharfbuzz_la-hb-directwrite.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-directwrite.lo `test -f 'hb-directwrite.cc' || echo '$(srcdir)/'`hb-directwrite.cc
+
+libharfbuzz_la-hb-coretext.lo: hb-coretext.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-coretext.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-coretext.Tpo -c -o libharfbuzz_la-hb-coretext.lo `test -f 'hb-coretext.cc' || echo '$(srcdir)/'`hb-coretext.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-coretext.Tpo $(DEPDIR)/libharfbuzz_la-hb-coretext.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-coretext.cc' object='libharfbuzz_la-hb-coretext.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-coretext.lo `test -f 'hb-coretext.cc' || echo '$(srcdir)/'`hb-coretext.cc
+
+libharfbuzz_la-hb-ucdn.lo: hb-ucdn.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ucdn.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ucdn.Tpo -c -o libharfbuzz_la-hb-ucdn.lo `test -f 'hb-ucdn.cc' || echo '$(srcdir)/'`hb-ucdn.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ucdn.Tpo $(DEPDIR)/libharfbuzz_la-hb-ucdn.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ucdn.cc' object='libharfbuzz_la-hb-ucdn.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ucdn.lo `test -f 'hb-ucdn.cc' || echo '$(srcdir)/'`hb-ucdn.cc
+
+libharfbuzz_la-hb-icu.lo: hb-icu.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-icu.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-icu.Tpo -c -o libharfbuzz_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-icu.Tpo $(DEPDIR)/libharfbuzz_la-hb-icu.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-icu.cc' object='libharfbuzz_la-hb-icu.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc
+
+dump_indic_data-dump-indic-data.o: dump-indic-data.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_indic_data-dump-indic-data.o -MD -MP -MF $(DEPDIR)/dump_indic_data-dump-indic-data.Tpo -c -o dump_indic_data-dump-indic-data.o `test -f 'dump-indic-data.cc' || echo '$(srcdir)/'`dump-indic-data.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_indic_data-dump-indic-data.Tpo $(DEPDIR)/dump_indic_data-dump-indic-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dump-indic-data.cc' object='dump_indic_data-dump-indic-data.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_indic_data-dump-indic-data.o `test -f 'dump-indic-data.cc' || echo '$(srcdir)/'`dump-indic-data.cc
+
+dump_indic_data-dump-indic-data.obj: dump-indic-data.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_indic_data-dump-indic-data.obj -MD -MP -MF $(DEPDIR)/dump_indic_data-dump-indic-data.Tpo -c -o dump_indic_data-dump-indic-data.obj `if test -f 'dump-indic-data.cc'; then $(CYGPATH_W) 'dump-indic-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-indic-data.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_indic_data-dump-indic-data.Tpo $(DEPDIR)/dump_indic_data-dump-indic-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dump-indic-data.cc' object='dump_indic_data-dump-indic-data.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_indic_data-dump-indic-data.obj `if test -f 'dump-indic-data.cc'; then $(CYGPATH_W) 'dump-indic-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-indic-data.cc'; fi`
+
+dump_indic_data-hb-ot-shape-complex-indic-table.o: hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_indic_data-hb-ot-shape-complex-indic-table.o -MD -MP -MF $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_indic_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_indic_data-hb-ot-shape-complex-indic-table.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_indic_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
+
+dump_indic_data-hb-ot-shape-complex-indic-table.obj: hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_indic_data-hb-ot-shape-complex-indic-table.obj -MD -MP -MF $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_indic_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_indic_data-hb-ot-shape-complex-indic-table.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_indic_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
+
+dump_khmer_data-dump-khmer-data.o: dump-khmer-data.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_khmer_data-dump-khmer-data.o -MD -MP -MF $(DEPDIR)/dump_khmer_data-dump-khmer-data.Tpo -c -o dump_khmer_data-dump-khmer-data.o `test -f 'dump-khmer-data.cc' || echo '$(srcdir)/'`dump-khmer-data.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_khmer_data-dump-khmer-data.Tpo $(DEPDIR)/dump_khmer_data-dump-khmer-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dump-khmer-data.cc' object='dump_khmer_data-dump-khmer-data.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_khmer_data-dump-khmer-data.o `test -f 'dump-khmer-data.cc' || echo '$(srcdir)/'`dump-khmer-data.cc
+
+dump_khmer_data-dump-khmer-data.obj: dump-khmer-data.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_khmer_data-dump-khmer-data.obj -MD -MP -MF $(DEPDIR)/dump_khmer_data-dump-khmer-data.Tpo -c -o dump_khmer_data-dump-khmer-data.obj `if test -f 'dump-khmer-data.cc'; then $(CYGPATH_W) 'dump-khmer-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-khmer-data.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_khmer_data-dump-khmer-data.Tpo $(DEPDIR)/dump_khmer_data-dump-khmer-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dump-khmer-data.cc' object='dump_khmer_data-dump-khmer-data.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_khmer_data-dump-khmer-data.obj `if test -f 'dump-khmer-data.cc'; then $(CYGPATH_W) 'dump-khmer-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-khmer-data.cc'; fi`
+
+dump_khmer_data-hb-ot-shape-complex-indic-table.o: hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_khmer_data-hb-ot-shape-complex-indic-table.o -MD -MP -MF $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_khmer_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_khmer_data-hb-ot-shape-complex-indic-table.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_khmer_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
+
+dump_khmer_data-hb-ot-shape-complex-indic-table.obj: hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_khmer_data-hb-ot-shape-complex-indic-table.obj -MD -MP -MF $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_khmer_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_khmer_data-hb-ot-shape-complex-indic-table.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_khmer_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
+
+dump_myanmar_data-dump-myanmar-data.o: dump-myanmar-data.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_myanmar_data-dump-myanmar-data.o -MD -MP -MF $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Tpo -c -o dump_myanmar_data-dump-myanmar-data.o `test -f 'dump-myanmar-data.cc' || echo '$(srcdir)/'`dump-myanmar-data.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Tpo $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dump-myanmar-data.cc' object='dump_myanmar_data-dump-myanmar-data.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_myanmar_data-dump-myanmar-data.o `test -f 'dump-myanmar-data.cc' || echo '$(srcdir)/'`dump-myanmar-data.cc
+
+dump_myanmar_data-dump-myanmar-data.obj: dump-myanmar-data.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_myanmar_data-dump-myanmar-data.obj -MD -MP -MF $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Tpo -c -o dump_myanmar_data-dump-myanmar-data.obj `if test -f 'dump-myanmar-data.cc'; then $(CYGPATH_W) 'dump-myanmar-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-myanmar-data.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Tpo $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dump-myanmar-data.cc' object='dump_myanmar_data-dump-myanmar-data.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_myanmar_data-dump-myanmar-data.obj `if test -f 'dump-myanmar-data.cc'; then $(CYGPATH_W) 'dump-myanmar-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-myanmar-data.cc'; fi`
+
+dump_myanmar_data-hb-ot-shape-complex-indic-table.o: hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_myanmar_data-hb-ot-shape-complex-indic-table.o -MD -MP -MF $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_myanmar_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_myanmar_data-hb-ot-shape-complex-indic-table.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_myanmar_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
+
+dump_myanmar_data-hb-ot-shape-complex-indic-table.obj: hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_myanmar_data-hb-ot-shape-complex-indic-table.obj -MD -MP -MF $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_myanmar_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_myanmar_data-hb-ot-shape-complex-indic-table.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_myanmar_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
+
+dump_use_data-dump-use-data.o: dump-use-data.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_use_data-dump-use-data.o -MD -MP -MF $(DEPDIR)/dump_use_data-dump-use-data.Tpo -c -o dump_use_data-dump-use-data.o `test -f 'dump-use-data.cc' || echo '$(srcdir)/'`dump-use-data.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_use_data-dump-use-data.Tpo $(DEPDIR)/dump_use_data-dump-use-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dump-use-data.cc' object='dump_use_data-dump-use-data.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_use_data-dump-use-data.o `test -f 'dump-use-data.cc' || echo '$(srcdir)/'`dump-use-data.cc
+
+dump_use_data-dump-use-data.obj: dump-use-data.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_use_data-dump-use-data.obj -MD -MP -MF $(DEPDIR)/dump_use_data-dump-use-data.Tpo -c -o dump_use_data-dump-use-data.obj `if test -f 'dump-use-data.cc'; then $(CYGPATH_W) 'dump-use-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-use-data.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_use_data-dump-use-data.Tpo $(DEPDIR)/dump_use_data-dump-use-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dump-use-data.cc' object='dump_use_data-dump-use-data.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_use_data-dump-use-data.obj `if test -f 'dump-use-data.cc'; then $(CYGPATH_W) 'dump-use-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-use-data.cc'; fi`
+
+dump_use_data-hb-ot-shape-complex-use-table.o: hb-ot-shape-complex-use-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_use_data-hb-ot-shape-complex-use-table.o -MD -MP -MF $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Tpo -c -o dump_use_data-hb-ot-shape-complex-use-table.o `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Tpo $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-use-table.cc' object='dump_use_data-hb-ot-shape-complex-use-table.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_use_data-hb-ot-shape-complex-use-table.o `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc
+
+dump_use_data-hb-ot-shape-complex-use-table.obj: hb-ot-shape-complex-use-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_use_data-hb-ot-shape-complex-use-table.obj -MD -MP -MF $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Tpo -c -o dump_use_data-hb-ot-shape-complex-use-table.obj `if test -f 'hb-ot-shape-complex-use-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-use-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-use-table.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Tpo $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-shape-complex-use-table.cc' object='dump_use_data-hb-ot-shape-complex-use-table.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_use_data-hb-ot-shape-complex-use-table.obj `if test -f 'hb-ot-shape-complex-use-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-use-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-use-table.cc'; fi`
+
+main-main.o: main.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(main_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT main-main.o -MD -MP -MF $(DEPDIR)/main-main.Tpo -c -o main-main.o `test -f 'main.cc' || echo '$(srcdir)/'`main.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/main-main.Tpo $(DEPDIR)/main-main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='main.cc' object='main-main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(main_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o main-main.o `test -f 'main.cc' || echo '$(srcdir)/'`main.cc
+
+main-main.obj: main.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(main_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT main-main.obj -MD -MP -MF $(DEPDIR)/main-main.Tpo -c -o main-main.obj `if test -f 'main.cc'; then $(CYGPATH_W) 'main.cc'; else $(CYGPATH_W) '$(srcdir)/main.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/main-main.Tpo $(DEPDIR)/main-main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='main.cc' object='main-main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(main_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o main-main.obj `if test -f 'main.cc'; then $(CYGPATH_W) 'main.cc'; else $(CYGPATH_W) '$(srcdir)/main.cc'; fi`
+
+test-test.o: test.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test-test.o -MD -MP -MF $(DEPDIR)/test-test.Tpo -c -o test-test.o `test -f 'test.cc' || echo '$(srcdir)/'`test.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test-test.Tpo $(DEPDIR)/test-test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test.cc' object='test-test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test-test.o `test -f 'test.cc' || echo '$(srcdir)/'`test.cc
+
+test-test.obj: test.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test-test.obj -MD -MP -MF $(DEPDIR)/test-test.Tpo -c -o test-test.obj `if test -f 'test.cc'; then $(CYGPATH_W) 'test.cc'; else $(CYGPATH_W) '$(srcdir)/test.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test-test.Tpo $(DEPDIR)/test-test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test.cc' object='test-test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test-test.obj `if test -f 'test.cc'; then $(CYGPATH_W) 'test.cc'; else $(CYGPATH_W) '$(srcdir)/test.cc'; fi`
+
+test_buffer_serialize-test-buffer-serialize.o: test-buffer-serialize.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_buffer_serialize_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_buffer_serialize-test-buffer-serialize.o -MD -MP -MF $(DEPDIR)/test_buffer_serialize-test-buffer-serialize.Tpo -c -o test_buffer_serialize-test-buffer-serialize.o `test -f 'test-buffer-serialize.cc' || echo '$(srcdir)/'`test-buffer-serialize.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_buffer_serialize-test-buffer-serialize.Tpo $(DEPDIR)/test_buffer_serialize-test-buffer-serialize.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test-buffer-serialize.cc' object='test_buffer_serialize-test-buffer-serialize.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_buffer_serialize_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_buffer_serialize-test-buffer-serialize.o `test -f 'test-buffer-serialize.cc' || echo '$(srcdir)/'`test-buffer-serialize.cc
+
+test_buffer_serialize-test-buffer-serialize.obj: test-buffer-serialize.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_buffer_serialize_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_buffer_serialize-test-buffer-serialize.obj -MD -MP -MF $(DEPDIR)/test_buffer_serialize-test-buffer-serialize.Tpo -c -o test_buffer_serialize-test-buffer-serialize.obj `if test -f 'test-buffer-serialize.cc'; then $(CYGPATH_W) 'test-buffer-serialize.cc'; else $(CYGPATH_W) '$(srcdir)/test-buffer-serialize.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_buffer_serialize-test-buffer-serialize.Tpo $(DEPDIR)/test_buffer_serialize-test-buffer-serialize.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test-buffer-serialize.cc' object='test_buffer_serialize-test-buffer-serialize.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_buffer_serialize_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_buffer_serialize-test-buffer-serialize.obj `if test -f 'test-buffer-serialize.cc'; then $(CYGPATH_W) 'test-buffer-serialize.cc'; else $(CYGPATH_W) '$(srcdir)/test-buffer-serialize.cc'; fi`
+
+test_iter-test-iter.o: test-iter.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_iter-test-iter.o -MD -MP -MF $(DEPDIR)/test_iter-test-iter.Tpo -c -o test_iter-test-iter.o `test -f 'test-iter.cc' || echo '$(srcdir)/'`test-iter.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_iter-test-iter.Tpo $(DEPDIR)/test_iter-test-iter.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test-iter.cc' object='test_iter-test-iter.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_iter-test-iter.o `test -f 'test-iter.cc' || echo '$(srcdir)/'`test-iter.cc
+
+test_iter-test-iter.obj: test-iter.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_iter-test-iter.obj -MD -MP -MF $(DEPDIR)/test_iter-test-iter.Tpo -c -o test_iter-test-iter.obj `if test -f 'test-iter.cc'; then $(CYGPATH_W) 'test-iter.cc'; else $(CYGPATH_W) '$(srcdir)/test-iter.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_iter-test-iter.Tpo $(DEPDIR)/test_iter-test-iter.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test-iter.cc' object='test_iter-test-iter.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_iter-test-iter.obj `if test -f 'test-iter.cc'; then $(CYGPATH_W) 'test-iter.cc'; else $(CYGPATH_W) '$(srcdir)/test-iter.cc'; fi`
+
+test_iter-hb-static.o: hb-static.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_iter-hb-static.o -MD -MP -MF $(DEPDIR)/test_iter-hb-static.Tpo -c -o test_iter-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_iter-hb-static.Tpo $(DEPDIR)/test_iter-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-static.cc' object='test_iter-hb-static.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_iter-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+
+test_iter-hb-static.obj: hb-static.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_iter-hb-static.obj -MD -MP -MF $(DEPDIR)/test_iter-hb-static.Tpo -c -o test_iter-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_iter-hb-static.Tpo $(DEPDIR)/test_iter-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-static.cc' object='test_iter-hb-static.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_iter-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+
+test_name_table-test-name-table.o: test-name-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_name_table_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_name_table-test-name-table.o -MD -MP -MF $(DEPDIR)/test_name_table-test-name-table.Tpo -c -o test_name_table-test-name-table.o `test -f 'test-name-table.cc' || echo '$(srcdir)/'`test-name-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_name_table-test-name-table.Tpo $(DEPDIR)/test_name_table-test-name-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test-name-table.cc' object='test_name_table-test-name-table.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_name_table_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_name_table-test-name-table.o `test -f 'test-name-table.cc' || echo '$(srcdir)/'`test-name-table.cc
+
+test_name_table-test-name-table.obj: test-name-table.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_name_table_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_name_table-test-name-table.obj -MD -MP -MF $(DEPDIR)/test_name_table-test-name-table.Tpo -c -o test_name_table-test-name-table.obj `if test -f 'test-name-table.cc'; then $(CYGPATH_W) 'test-name-table.cc'; else $(CYGPATH_W) '$(srcdir)/test-name-table.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_name_table-test-name-table.Tpo $(DEPDIR)/test_name_table-test-name-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test-name-table.cc' object='test_name_table-test-name-table.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_name_table_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_name_table-test-name-table.obj `if test -f 'test-name-table.cc'; then $(CYGPATH_W) 'test-name-table.cc'; else $(CYGPATH_W) '$(srcdir)/test-name-table.cc'; fi`
+
+test_ot_color-test-ot-color.o: test-ot-color.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_ot_color-test-ot-color.o -MD -MP -MF $(DEPDIR)/test_ot_color-test-ot-color.Tpo -c -o test_ot_color-test-ot-color.o `test -f 'test-ot-color.cc' || echo '$(srcdir)/'`test-ot-color.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_ot_color-test-ot-color.Tpo $(DEPDIR)/test_ot_color-test-ot-color.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test-ot-color.cc' object='test_ot_color-test-ot-color.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_ot_color-test-ot-color.o `test -f 'test-ot-color.cc' || echo '$(srcdir)/'`test-ot-color.cc
+
+test_ot_color-test-ot-color.obj: test-ot-color.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_ot_color-test-ot-color.obj -MD -MP -MF $(DEPDIR)/test_ot_color-test-ot-color.Tpo -c -o test_ot_color-test-ot-color.obj `if test -f 'test-ot-color.cc'; then $(CYGPATH_W) 'test-ot-color.cc'; else $(CYGPATH_W) '$(srcdir)/test-ot-color.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_ot_color-test-ot-color.Tpo $(DEPDIR)/test_ot_color-test-ot-color.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test-ot-color.cc' object='test_ot_color-test-ot-color.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_ot_color-test-ot-color.obj `if test -f 'test-ot-color.cc'; then $(CYGPATH_W) 'test-ot-color.cc'; else $(CYGPATH_W) '$(srcdir)/test-ot-color.cc'; fi`
+
+test_ot_tag-hb-ot-tag.o: hb-ot-tag.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_tag_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_ot_tag-hb-ot-tag.o -MD -MP -MF $(DEPDIR)/test_ot_tag-hb-ot-tag.Tpo -c -o test_ot_tag-hb-ot-tag.o `test -f 'hb-ot-tag.cc' || echo '$(srcdir)/'`hb-ot-tag.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_ot_tag-hb-ot-tag.Tpo $(DEPDIR)/test_ot_tag-hb-ot-tag.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-tag.cc' object='test_ot_tag-hb-ot-tag.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_tag_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_ot_tag-hb-ot-tag.o `test -f 'hb-ot-tag.cc' || echo '$(srcdir)/'`hb-ot-tag.cc
+
+test_ot_tag-hb-ot-tag.obj: hb-ot-tag.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_tag_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_ot_tag-hb-ot-tag.obj -MD -MP -MF $(DEPDIR)/test_ot_tag-hb-ot-tag.Tpo -c -o test_ot_tag-hb-ot-tag.obj `if test -f 'hb-ot-tag.cc'; then $(CYGPATH_W) 'hb-ot-tag.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-tag.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_ot_tag-hb-ot-tag.Tpo $(DEPDIR)/test_ot_tag-hb-ot-tag.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='hb-ot-tag.cc' object='test_ot_tag-hb-ot-tag.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_tag_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_ot_tag-hb-ot-tag.obj `if test -f 'hb-ot-tag.cc'; then $(CYGPATH_W) 'hb-ot-tag.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-tag.cc'; fi`
+
+test_size_params-test-size-params.o: test-size-params.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_size_params_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_size_params-test-size-params.o -MD -MP -MF $(DEPDIR)/test_size_params-test-size-params.Tpo -c -o test_size_params-test-size-params.o `test -f 'test-size-params.cc' || echo '$(srcdir)/'`test-size-params.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_size_params-test-size-params.Tpo $(DEPDIR)/test_size_params-test-size-params.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test-size-params.cc' object='test_size_params-test-size-params.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_size_params_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_size_params-test-size-params.o `test -f 'test-size-params.cc' || echo '$(srcdir)/'`test-size-params.cc
+
+test_size_params-test-size-params.obj: test-size-params.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_size_params_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_size_params-test-size-params.obj -MD -MP -MF $(DEPDIR)/test_size_params-test-size-params.Tpo -c -o test_size_params-test-size-params.obj `if test -f 'test-size-params.cc'; then $(CYGPATH_W) 'test-size-params.cc'; else $(CYGPATH_W) '$(srcdir)/test-size-params.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_size_params-test-size-params.Tpo $(DEPDIR)/test_size_params-test-size-params.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test-size-params.cc' object='test_size_params-test-size-params.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_size_params_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_size_params-test-size-params.obj `if test -f 'test-size-params.cc'; then $(CYGPATH_W) 'test-size-params.cc'; else $(CYGPATH_W) '$(srcdir)/test-size-params.cc'; fi`
+
+test_unicode_ranges-test-unicode-ranges.o: test-unicode-ranges.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_unicode_ranges_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_unicode_ranges-test-unicode-ranges.o -MD -MP -MF $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Tpo -c -o test_unicode_ranges-test-unicode-ranges.o `test -f 'test-unicode-ranges.cc' || echo '$(srcdir)/'`test-unicode-ranges.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Tpo $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test-unicode-ranges.cc' object='test_unicode_ranges-test-unicode-ranges.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_unicode_ranges_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_unicode_ranges-test-unicode-ranges.o `test -f 'test-unicode-ranges.cc' || echo '$(srcdir)/'`test-unicode-ranges.cc
+
+test_unicode_ranges-test-unicode-ranges.obj: test-unicode-ranges.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_unicode_ranges_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_unicode_ranges-test-unicode-ranges.obj -MD -MP -MF $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Tpo -c -o test_unicode_ranges-test-unicode-ranges.obj `if test -f 'test-unicode-ranges.cc'; then $(CYGPATH_W) 'test-unicode-ranges.cc'; else $(CYGPATH_W) '$(srcdir)/test-unicode-ranges.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Tpo $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test-unicode-ranges.cc' object='test_unicode_ranges-test-unicode-ranges.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_unicode_ranges_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_unicode_ranges-test-unicode-ranges.obj `if test -f 'test-unicode-ranges.cc'; then $(CYGPATH_W) 'test-unicode-ranges.cc'; else $(CYGPATH_W) '$(srcdir)/test-unicode-ranges.cc'; fi`
+
+test_would_substitute-test-would-substitute.o: test-would-substitute.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_would_substitute_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_would_substitute-test-would-substitute.o -MD -MP -MF $(DEPDIR)/test_would_substitute-test-would-substitute.Tpo -c -o test_would_substitute-test-would-substitute.o `test -f 'test-would-substitute.cc' || echo '$(srcdir)/'`test-would-substitute.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_would_substitute-test-would-substitute.Tpo $(DEPDIR)/test_would_substitute-test-would-substitute.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test-would-substitute.cc' object='test_would_substitute-test-would-substitute.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_would_substitute_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_would_substitute-test-would-substitute.o `test -f 'test-would-substitute.cc' || echo '$(srcdir)/'`test-would-substitute.cc
+
+test_would_substitute-test-would-substitute.obj: test-would-substitute.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_would_substitute_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_would_substitute-test-would-substitute.obj -MD -MP -MF $(DEPDIR)/test_would_substitute-test-would-substitute.Tpo -c -o test_would_substitute-test-would-substitute.obj `if test -f 'test-would-substitute.cc'; then $(CYGPATH_W) 'test-would-substitute.cc'; else $(CYGPATH_W) '$(srcdir)/test-would-substitute.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_would_substitute-test-would-substitute.Tpo $(DEPDIR)/test_would_substitute-test-would-substitute.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test-would-substitute.cc' object='test_would_substitute-test-would-substitute.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_would_substitute_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_would_substitute-test-would-substitute.obj `if test -f 'test-would-substitute.cc'; then $(CYGPATH_W) 'test-would-substitute.cc'; else $(CYGPATH_W) '$(srcdir)/test-would-substitute.cc'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-cmakeDATA: $(cmake_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(cmake_DATA)'; test -n "$(cmakedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(cmakedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(cmakedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(cmakedir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(cmakedir)" || exit $$?; \
+	done
+
+uninstall-cmakeDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(cmake_DATA)'; test -n "$(cmakedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(cmakedir)'; $(am__uninstall_files_from_dir)
+install-girDATA: $(gir_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(girdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(girdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(girdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+	done
+
+uninstall-girDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(girdir)'; $(am__uninstall_files_from_dir)
+install-pkgconfigDATA: $(pkgconfig_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
+	done
+
+uninstall-pkgconfigDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
+install-typelibDATA: $(typelib_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(typelib_DATA)'; test -n "$(typelibdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(typelibdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(typelibdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(typelibdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibdir)" || exit $$?; \
+	done
+
+uninstall-typelibDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(typelib_DATA)'; test -n "$(typelibdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(typelibdir)'; $(am__uninstall_files_from_dir)
+install-nodist_pkgincludeHEADERS: $(nodist_pkginclude_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(nodist_pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
+	done
+
+uninstall-nodist_pkgincludeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(nodist_pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
+	done
+
+uninstall-pkgincludeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	elif test -n "$$redo_logs"; then \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS) $(dist_check_SCRIPTS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+check-c-linkage-decls.sh.log: check-c-linkage-decls.sh
+	@p='check-c-linkage-decls.sh'; \
+	b='check-c-linkage-decls.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+check-externs.sh.log: check-externs.sh
+	@p='check-externs.sh'; \
+	b='check-externs.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+check-header-guards.sh.log: check-header-guards.sh
+	@p='check-header-guards.sh'; \
+	b='check-header-guards.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+check-includes.sh.log: check-includes.sh
+	@p='check-includes.sh'; \
+	b='check-includes.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+check-static-inits.sh.log: check-static-inits.sh
+	@p='check-static-inits.sh'; \
+	b='check-static-inits.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+check-symbols.sh.log: check-symbols.sh
+	@p='check-symbols.sh'; \
+	b='check-symbols.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+check-libstdc++.sh.log: check-libstdc++.sh
+	@p='check-libstdc++.sh'; \
+	b='check-libstdc++.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+test-iter.log: test-iter$(EXEEXT)
+	@p='test-iter$(EXEEXT)'; \
+	b='test-iter'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+test-ot-tag.log: test-ot-tag$(EXEEXT)
+	@p='test-ot-tag$(EXEEXT)'; \
+	b='test-ot-tag'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+test-unicode-ranges.log: test-unicode-ranges$(EXEEXT)
+	@p='test-unicode-ranges$(EXEEXT)'; \
+	b='test-unicode-ranges'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@	@p='$<'; \
+@am__EXEEXT_TRUE@	$(am__set_b); \
+@am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \
+	  $(dist_check_SCRIPTS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS)
+install-binPROGRAMS: install-libLTLIBRARIES
+
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(cmakedir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgincludedir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+	clean-libLTLIBRARIES clean-libtool clean-noinstPROGRAMS \
+	mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-cmakeDATA install-girDATA \
+	install-nodist_pkgincludeHEADERS install-pkgconfigDATA \
+	install-pkgincludeHEADERS install-typelibDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am: installcheck-binPROGRAMS
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-cmakeDATA \
+	uninstall-girDATA uninstall-libLTLIBRARIES \
+	uninstall-nodist_pkgincludeHEADERS uninstall-pkgconfigDATA \
+	uninstall-pkgincludeHEADERS uninstall-typelibDATA
+
+.MAKE: $(am__recursive_targets) all check check-am install install-am \
+	install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-TESTS check-am clean clean-binPROGRAMS \
+	clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-cmakeDATA install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-girDATA \
+	install-html install-html-am install-info install-info-am \
+	install-libLTLIBRARIES install-man \
+	install-nodist_pkgincludeHEADERS install-pdf install-pdf-am \
+	install-pkgconfigDATA install-pkgincludeHEADERS install-ps \
+	install-ps-am install-strip install-typelibDATA installcheck \
+	installcheck-am installcheck-binPROGRAMS installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
+	uninstall uninstall-am uninstall-binPROGRAMS \
+	uninstall-cmakeDATA uninstall-girDATA uninstall-libLTLIBRARIES \
+	uninstall-nodist_pkgincludeHEADERS uninstall-pkgconfigDATA \
+	uninstall-pkgincludeHEADERS uninstall-typelibDATA
+
+.PRECIOUS: Makefile
+
+
+# Convenience targets:
+lib: $(BUILT_SOURCES) libharfbuzz.la
+libs: $(BUILT_SOURCES) $(lib_LTLIBRARIES)
+@HAVE_UCDN_TRUE@hb-ucdn/libhb-ucdn.la: ucdn
+@HAVE_UCDN_TRUE@ucdn:
+@HAVE_UCDN_TRUE@	@$(MAKE) $(AM_MAKEFLAGS) -C hb-ucdn
+
+$(srcdir)/hb-version.h: hb-version.h.in $(top_srcdir)/configure.ac
+	$(AM_V_GEN) $(SED) \
+		-e 's/[@]HB_VERSION_MAJOR@/$(HB_VERSION_MAJOR)/' \
+		-e 's/[@]HB_VERSION_MINOR@/$(HB_VERSION_MINOR)/' \
+		-e 's/[@]HB_VERSION_MICRO@/$(HB_VERSION_MICRO)/' \
+		-e 's/[@]HB_VERSION@/$(HB_VERSION)/' \
+		"$<" > "$@" || ($(RM) "$@"; false)
+
+@CODE_COVERAGE_RULES@
+@HAVE_GOBJECT_TRUE@hb-gobject-enums.%: hb-gobject-enums.%.tmpl $(HBHEADERS)
+@HAVE_GOBJECT_TRUE@	$(AM_V_GEN) PYTHONIOENCODING=UTF-8 $(GLIB_MKENUMS) \
+@HAVE_GOBJECT_TRUE@		--identifier-prefix hb_ --symbol-prefix hb_gobject \
+@HAVE_GOBJECT_TRUE@		--template $^ | \
+@HAVE_GOBJECT_TRUE@	sed 's/_t_get_type/_get_type/g; s/_T (/ (/g' > "$@" \
+@HAVE_GOBJECT_TRUE@	|| ($(RM) "$@"; false)
+
+%.pc: %.pc.in $(top_builddir)/config.status
+	$(AM_V_GEN) \
+	$(SED)	-e 's@%prefix%@$(prefix)@g' \
+		-e 's@%exec_prefix%@$(exec_prefix)@g' \
+		-e 's@%libdir%@$(libdir)@g' \
+		-e 's@%includedir%@$(includedir)@g' \
+		-e 's@%libs_private%@$(HBNONPCLIBS)@g' \
+		-e 's@%requires_private%@$(HBDEPS)@g' \
+		-e 's@%VERSION%@$(VERSION)@g' \
+	"$<" > "$@" \
+	|| ($(RM) "$@"; false)
+check: $(DEF_FILES) # For check-symbols.sh
+harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
+	$(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
+harfbuzz-subset.def: $(HB_SUBSET_headers)
+	$(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
+harfbuzz-icu.def: $(HB_ICU_headers)
+	$(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
+harfbuzz-gobject.def: $(HB_GOBJECT_headers)
+	$(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
+harfbuzz-deprecated-symbols.txt: $(srcdir)/hb-deprecated.h
+	$(AM_V_GEN) PLAIN_LIST=1 $(srcdir)/gen-def.py "$@" $^
+
+unicode-tables: arabic-table indic-table tag-table use-table emoji-table
+
+arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
+	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-arabic-table.hh \
+	|| ($(RM) $(srcdir)/hb-ot-shape-complex-arabic-table.hh; false)
+
+indic-table: gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt
+	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-indic-table.cc \
+	|| ($(RM) $(srcdir)/hb-ot-shape-complex-indic-table.cc; false)
+
+tag-table: gen-tag-table.py languagetags language-subtag-registry
+	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-tag-table.hh \
+	|| ($(RM) $(srcdir)/hb-ot-tag-table.hh; false)
+
+use-table: gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt
+	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-use-table.cc \
+	|| ($(RM) $(srcdir)/hb-ot-shape-complex-use-table.cc; false)
+
+vowel-constraints: gen-vowel-constraints.py HBIndicVowelConstraints.txt Scripts.txt
+	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc \
+	|| ($(RM) $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc; false)
+
+emoji-table: gen-emoji-table.py emoji-data.txt
+	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-unicode-emoji-table.hh \
+	|| ($(RM) $(srcdir)/hb-unicode-emoji-table.hh; false)
+
+built-sources: $(BUILT_SOURCES)
+
+.PHONY: unicode-tables arabic-table indic-table tag-table use-table vowel-constraints emoji-table built-sources
+# We decided to add ragel-generated files to git...
+#MAINTAINERCLEANFILES += $(RAGEL_GENERATED)
+$(srcdir)/%.hh: $(srcdir)/%.rl
+	$(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -F1 -o "$*.hh" "$*.rl") \
+	|| ($(RM) "$@"; false)
+
+@HAVE_INTROSPECTION_TRUE@-include $(INTROSPECTION_MAKEFILE)
+
+@HAVE_INTROSPECTION_TRUE@HarfBuzz-0.0.gir: libharfbuzz.la libharfbuzz-gobject.la
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/Makefile.sources b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/Makefile.sources
new file mode 100644
index 0000000..0da4abe
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/Makefile.sources
@@ -0,0 +1,263 @@
+# Base and default-included sources and headers
+
+HB_BASE_sources = \
+	hb-aat-fdsc-table.hh \
+	hb-aat-layout-ankr-table.hh \
+	hb-aat-layout-bsln-table.hh \
+	hb-aat-layout-common.hh \
+	hb-aat-layout-feat-table.hh \
+	hb-aat-layout-just-table.hh \
+	hb-aat-layout-kerx-table.hh \
+	hb-aat-layout-lcar-table.hh \
+	hb-aat-layout-morx-table.hh \
+	hb-aat-layout-trak-table.hh \
+	hb-aat-layout.cc \
+	hb-aat-layout.hh \
+	hb-aat-ltag-table.hh \
+	hb-aat-map.cc \
+	hb-aat-map.hh \
+	hb-array.hh \
+	hb-atomic.hh \
+	hb-blob.cc \
+	hb-blob.hh \
+	hb-buffer-serialize.cc \
+	hb-buffer.cc \
+	hb-buffer.hh \
+	hb-cache.hh \
+	hb-cff-interp-common.hh \
+	hb-cff-interp-cs-common.hh \
+	hb-cff-interp-dict-common.hh \
+	hb-cff1-interp-cs.hh \
+	hb-cff2-interp-cs.hh \
+	hb-common.cc \
+	hb-debug.hh \
+	hb-dsalgs.hh \
+	hb-face.cc \
+	hb-face.hh \
+	hb-font.cc \
+	hb-font.hh \
+	hb-iter.hh \
+	hb-kern.hh \
+	hb-machinery.hh \
+	hb-map.cc \
+	hb-map.hh \
+	hb-mutex.hh \
+	hb-null.hh \
+	hb-object.hh \
+	hb-open-file.hh \
+	hb-open-type.hh \
+	hb-ot-cff-common.hh \
+	hb-ot-cff1-table.cc \
+	hb-ot-cff1-table.hh \
+	hb-ot-cff2-table.cc \
+	hb-ot-cff2-table.hh \
+	hb-ot-cmap-table.hh \
+	hb-ot-color-cbdt-table.hh \
+	hb-ot-color-colr-table.hh \
+	hb-ot-color-cpal-table.hh \
+	hb-ot-color-sbix-table.hh \
+	hb-ot-color-svg-table.hh \
+	hb-ot-color.cc \
+	hb-ot-face.cc \
+	hb-ot-face.hh \
+	hb-ot-font.cc \
+	hb-ot-gasp-table.hh \
+	hb-ot-glyf-table.hh \
+	hb-ot-hdmx-table.hh \
+	hb-ot-head-table.hh \
+	hb-ot-hhea-table.hh \
+	hb-ot-hmtx-table.hh \
+	hb-ot-kern-table.hh \
+	hb-ot-layout-base-table.hh \
+	hb-ot-layout-common.hh \
+	hb-ot-layout-gdef-table.hh \
+	hb-ot-layout-gpos-table.hh \
+	hb-ot-layout-gsub-table.hh \
+	hb-ot-layout-gsubgpos.hh \
+	hb-ot-layout-jstf-table.hh \
+	hb-ot-layout.cc \
+	hb-ot-layout.hh \
+	hb-ot-map.cc \
+	hb-ot-map.hh \
+	hb-ot-math-table.hh \
+	hb-ot-math.cc \
+	hb-ot-maxp-table.hh \
+	hb-ot-name-language.cc \
+	hb-ot-name-language.hh \
+	hb-ot-name-table.hh \
+	hb-ot-name.cc \
+	hb-ot-os2-table.hh \
+	hb-ot-os2-unicode-ranges.hh \
+	hb-ot-post-macroman.hh \
+	hb-ot-post-table.hh \
+	hb-ot-shape-complex-arabic-fallback.hh \
+	hb-ot-shape-complex-arabic-table.hh \
+	hb-ot-shape-complex-arabic-win1256.hh \
+	hb-ot-shape-complex-arabic.cc \
+	hb-ot-shape-complex-arabic.hh \
+	hb-ot-shape-complex-default.cc \
+	hb-ot-shape-complex-hangul.cc \
+	hb-ot-shape-complex-hebrew.cc \
+	hb-ot-shape-complex-indic-table.cc \
+	hb-ot-shape-complex-indic.cc \
+	hb-ot-shape-complex-indic.hh \
+	hb-ot-shape-complex-khmer.cc \
+	hb-ot-shape-complex-khmer.hh \
+	hb-ot-shape-complex-myanmar.cc \
+	hb-ot-shape-complex-myanmar.hh \
+	hb-ot-shape-complex-thai.cc \
+	hb-ot-shape-complex-use-table.cc \
+	hb-ot-shape-complex-use.cc \
+	hb-ot-shape-complex-use.hh \
+	hb-ot-shape-complex-vowel-constraints.cc \
+	hb-ot-shape-complex-vowel-constraints.hh \
+	hb-ot-shape-complex.hh \
+	hb-ot-shape-fallback.cc \
+	hb-ot-shape-fallback.hh \
+	hb-ot-shape-normalize.cc \
+	hb-ot-shape-normalize.hh \
+	hb-ot-shape.cc \
+	hb-ot-shape.hh \
+	hb-ot-stat-table.hh \
+	hb-ot-tag-table.hh \
+	hb-ot-tag.cc \
+	hb-ot-var-avar-table.hh \
+	hb-ot-var-fvar-table.hh \
+	hb-ot-var-hvar-table.hh \
+	hb-ot-var-mvar-table.hh \
+	hb-ot-var.cc \
+	hb-ot-vorg-table.hh \
+	hb-set-digest.hh \
+	hb-set.cc \
+	hb-set.hh \
+	hb-shape-plan.cc \
+	hb-shape-plan.hh \
+	hb-shape.cc \
+	hb-shaper-impl.hh \
+	hb-shaper-list.hh \
+	hb-shaper.cc \
+	hb-shaper.hh \
+	hb-static.cc \
+	hb-string-array.hh \
+	hb-unicode-emoji-table.hh \
+	hb-unicode.cc \
+	hb-unicode.hh \
+	hb-utf.hh \
+	hb-vector.hh \
+	hb-warning.cc \
+	hb.hh \
+	$(NULL)
+
+HB_BASE_RAGEL_GENERATED_sources = \
+	hb-buffer-deserialize-json.hh \
+	hb-buffer-deserialize-text.hh \
+	hb-ot-shape-complex-indic-machine.hh \
+	hb-ot-shape-complex-khmer-machine.hh \
+	hb-ot-shape-complex-myanmar-machine.hh \
+	hb-ot-shape-complex-use-machine.hh \
+	$(NULL)
+HB_BASE_RAGEL_sources = \
+	hb-buffer-deserialize-json.rl \
+	hb-buffer-deserialize-text.rl \
+	hb-ot-shape-complex-indic-machine.rl \
+	hb-ot-shape-complex-khmer-machine.rl \
+	hb-ot-shape-complex-myanmar-machine.rl \
+	hb-ot-shape-complex-use-machine.rl \
+	$(NULL)
+
+HB_BASE_headers = \
+	hb-aat-layout.h \
+	hb-aat.h \
+	hb-blob.h \
+	hb-buffer.h \
+	hb-common.h \
+	hb-deprecated.h \
+	hb-face.h \
+	hb-font.h \
+	hb-map.h \
+	hb-ot-color.h \
+	hb-ot-deprecated.h \
+	hb-ot-font.h \
+	hb-ot-layout.h \
+	hb-ot-math.h \
+	hb-ot-name.h \
+	hb-ot-shape.h \
+	hb-ot-var.h \
+	hb-ot.h \
+	hb-set.h \
+	hb-shape-plan.h \
+	hb-shape.h \
+	hb-unicode.h \
+	hb-version.h \
+	hb.h \
+	$(NULL)
+
+HB_FALLBACK_sources = \
+	hb-fallback-shape.cc	\
+	$(NULL)
+
+# Optional Sources and Headers with external deps
+
+HB_FT_sources = hb-ft.cc
+HB_FT_headers = hb-ft.h
+
+HB_GLIB_sources = hb-glib.cc
+HB_GLIB_headers = hb-glib.h
+
+HB_GRAPHITE2_sources = hb-graphite2.cc
+HB_GRAPHITE2_headers = hb-graphite2.h
+
+# System-dependent sources and headers
+
+HB_CORETEXT_sources = hb-coretext.cc
+HB_CORETEXT_headers = hb-coretext.h
+
+HB_DIRECTWRITE_sources = hb-directwrite.cc
+HB_DIRECTWRITE_headers = hb-directwrite.h
+
+HB_UNISCRIBE_sources = hb-uniscribe.cc
+HB_UNISCRIBE_headers = hb-uniscribe.h
+
+# Additional supplemental sources
+HB_UCDN_sources  = hb-ucdn.cc
+
+# Sources for libharfbuzz-gobject and libharfbuzz-icu
+HB_ICU_sources = hb-icu.cc
+HB_ICU_headers = hb-icu.h
+
+# Sources for libharfbuzz-subset
+HB_SUBSET_sources = \
+	hb-ot-cff1-table.cc \
+	hb-ot-cff2-table.cc \
+	hb-static.cc \
+	hb-subset-cff-common.cc \
+	hb-subset-cff-common.hh \
+	hb-subset-cff1.cc \
+	hb-subset-cff1.hh \
+	hb-subset-cff2.cc \
+	hb-subset-cff2.hh \
+	hb-subset-glyf.cc \
+	hb-subset-glyf.hh \
+	hb-subset-glyf.hh \
+	hb-subset-input.cc \
+	hb-subset-input.hh \
+	hb-subset-plan.cc \
+	hb-subset-plan.hh \
+	hb-subset-plan.hh \
+	hb-subset.cc \
+	hb-subset.hh \
+	hb-subset.hh \
+	$(NULL)
+
+HB_SUBSET_headers = \
+	hb-subset.h \
+	$(NULL)
+
+HB_GOBJECT_DIST_sources = hb-gobject-structs.cc
+HB_GOBJECT_DIST_headers = hb-gobject.h hb-gobject-structs.h
+HB_GOBJECT_ENUM_sources = hb-gobject-enums.cc
+HB_GOBJECT_ENUM_headers = hb-gobject-enums.h
+HB_GOBJECT_NODIST_sources = $(HB_GOBJECT_ENUM_sources)
+HB_GOBJECT_NODIST_headers = $(HB_GOBJECT_ENUM_headers)
+HB_GOBJECT_sources = $(HB_GOBJECT_DIST_sources) $(HB_GOBJECT_NODIST_sources)
+HB_GOBJECT_headers = $(HB_GOBJECT_DIST_headers) $(HB_GOBJECT_NODIST_headers)
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-c-linkage-decls.sh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-c-linkage-decls.sh
new file mode 100755
index 0000000..8234abc
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-c-linkage-decls.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+LC_ALL=C
+export LC_ALL
+
+test -z "$srcdir" && srcdir=.
+stat=0
+
+test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'`
+test "x$HBSOURCES" = x && HBSOURCES=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.cc'`
+
+for x in $HBHEADERS; do
+	test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x"
+	if ! grep -q HB_BEGIN_DECLS "$x" || ! grep -q HB_END_DECLS "$x"; then
+		echo "Ouch, file $x does not have HB_BEGIN_DECLS / HB_END_DECLS, but it should"
+		stat=1
+	fi
+done
+for x in $HBSOURCES; do
+	test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x"
+	if grep -q HB_BEGIN_DECLS "$x" || grep -q HB_END_DECLS "$x"; then
+		echo "Ouch, file $x has HB_BEGIN_DECLS / HB_END_DECLS, but it shouldn't"
+		stat=1
+	fi
+done
+
+exit $stat
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-externs.sh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-externs.sh
new file mode 100755
index 0000000..a6de375
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-externs.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+LC_ALL=C
+export LC_ALL
+
+test -z "$srcdir" && srcdir=.
+stat=0
+
+test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'`
+test "x$EGREP" = x && EGREP='grep -E'
+
+
+echo 'Checking that all public symbols are exported with HB_EXTERN'
+
+for x in $HBHEADERS; do
+	test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x"
+	$EGREP -B1 -n '^hb_' /dev/null "$x" |
+	$EGREP -v '(^--|:hb_|-HB_EXTERN )' -A1
+done |
+grep . >&2 && stat=1
+
+exit $stat
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-header-guards.sh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-header-guards.sh
new file mode 100755
index 0000000..b67640f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-header-guards.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+LC_ALL=C
+export LC_ALL
+
+test -z "$srcdir" && srcdir=.
+stat=0
+
+test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h' ! -name 'hb-gobject-structs.h'`
+test "x$HBSOURCES" = x && HBSOURCES=`cd "$srcdir"; find . -maxdepth 1 -name 'hb-*.cc' -or -name 'hb-*.hh'`
+
+for x in $HBHEADERS $HBSOURCES; do
+	test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x"
+	echo "$x" | grep -q '[^h]$' && continue;
+	xx=`echo "$x" | sed 's@.*/@@'`
+	tag=`echo "$xx" | tr 'a-z.-' 'A-Z_'`
+	lines=`grep -w "$tag" "$x" | wc -l | sed 's/[ 	]*//g'`
+	if test "x$lines" != x3; then
+		echo "Ouch, header file $x does not have correct preprocessor guards"
+		stat=1
+	fi
+done
+
+exit $stat
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-includes.sh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-includes.sh
new file mode 100755
index 0000000..f938f70
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-includes.sh
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+LC_ALL=C
+export LC_ALL
+
+test -z "$srcdir" && srcdir=.
+stat=0
+
+test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'`
+test "x$HBSOURCES" = x && HBSOURCES=`cd "$srcdir"; find . -maxdepth 1 -name 'hb-*.cc' -or -name 'hb-*.hh'`
+
+
+echo 'Checking that public header files #include "hb-common.h" or "hb.h" first (or none)'
+
+for x in $HBHEADERS; do
+	test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x"
+	grep '#.*\<include\>' "$x" /dev/null | head -n 1
+done |
+grep -v '"hb-common[.]h"' |
+grep -v '"hb[.]h"' |
+grep -v 'hb-common[.]h:' |
+grep -v 'hb[.]h:' |
+grep . >&2 && stat=1
+
+
+echo 'Checking that source files #include a private header first (or none)'
+
+for x in $HBSOURCES; do
+	test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x"
+	grep '#.*\<include\>' "$x" /dev/null | head -n 1
+done |
+grep -v '"hb-.*[.]hh"' |
+grep -v 'hb[.]hh' |
+grep . >&2 && stat=1
+
+
+echo 'Checking that there is no #include <hb-*.h>'
+for x in $HBHEADERS $HBSOURCES; do
+	test -f "$srcdir/$x" && x="$srcdir/$x"
+	grep '#.*\<include\>.*<.*hb' "$x" /dev/null >&2 && stat=1
+done
+
+
+exit $stat
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-libstdc++.sh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-libstdc++.sh
new file mode 100755
index 0000000..ce0bdab
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-libstdc++.sh
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+LC_ALL=C
+export LC_ALL
+
+test -z "$srcdir" && srcdir=.
+test -z "$libs" && libs=.libs
+stat=0
+
+
+if which ldd 2>/dev/null >/dev/null; then
+	LDD=ldd
+else
+	# macOS specific tool
+	if which otool 2>/dev/null >/dev/null; then
+		LDD="otool -L"
+	else
+		echo "check-libstdc++.sh: 'ldd' not found; skipping test"
+		exit 77
+	fi
+fi
+
+tested=false
+# harfbuzz-icu links to libstdc++ because icu does.
+# harfbuzz-subset uses libstdc++.
+for soname in harfbuzz harfbuzz-gobject; do
+	for suffix in so dylib; do
+		so=$libs/lib$soname.$suffix
+		if ! test -f "$so"; then continue; fi
+
+		echo "Checking that we are not linking to libstdc++ or libc++ in $so"
+		if $LDD $so | grep 'libstdc[+][+]\|libc[+][+]'; then
+			echo "Ouch, linked to libstdc++ or libc++"
+			stat=1
+		fi
+		tested=true
+	done
+done
+if ! $tested; then
+	echo "check-libstdc++.sh: libharfbuzz shared library not found; skipping test"
+	exit 77
+fi
+
+exit $stat
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-static-inits.sh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-static-inits.sh
new file mode 100755
index 0000000..def25c7
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-static-inits.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+LC_ALL=C
+export LC_ALL
+
+test -z "$srcdir" && srcdir=.
+test -z "$libs" && libs=.libs
+stat=0
+
+if which objdump 2>/dev/null >/dev/null; then
+	:
+else
+	echo "check-static-inits.sh: 'objdump' not found; skipping test"
+	exit 77
+fi
+
+OBJS=$libs/*.o
+if test "x`echo $OBJS`" = "x$OBJS" 2>/dev/null >/dev/null; then
+	echo "check-static-inits.sh: object files not found; skipping test"
+	exit 77
+fi
+
+echo "Checking that no object file has static initializers"
+for obj in $OBJS; do
+	if objdump -t "$obj" | grep '[.][cd]tors' | grep -v '\<00*\>'; then
+		echo "Ouch, $obj has static initializers/finalizers"
+		stat=1
+	fi
+done
+
+echo "Checking that no object file has lazy static C++ constructors/destructors or other such stuff"
+for obj in $OBJS; do
+	if objdump -t "$obj" | grep -q '__cxa_' && ! objdump -t "$obj" | grep -q __ubsan_handle; then
+		objdump -t "$obj" | grep '__cxa_'
+		echo "Ouch, $obj has lazy static C++ constructors/destructors or other such stuff"
+		stat=1
+	fi
+done
+
+exit $stat
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-symbols.sh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-symbols.sh
new file mode 100755
index 0000000..cea8684
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/check-symbols.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+LC_ALL=C
+export LC_ALL
+
+test -z "$srcdir" && srcdir=.
+test -z "$libs" && libs=.libs
+stat=0
+
+IGNORED_SYMBOLS='_fini\|_init\|_fdata\|_ftext\|_fbss\|__bss_start\|__bss_start__\|__bss_end__\|_edata\|_end\|_bss_end__\|__end__\|__gcov_flush\|llvm_.*'
+
+if which nm 2>/dev/null >/dev/null; then
+	:
+else
+	echo "check-symbols.sh: 'nm' not found; skipping test"
+	exit 77
+fi
+
+tested=false
+for soname in harfbuzz harfbuzz-subset harfbuzz-icu harfbuzz-gobject; do
+	for suffix in so dylib; do
+		so=$libs/lib$soname.$suffix
+		if ! test -f "$so"; then continue; fi
+
+		# On macOS, C symbols are prefixed with _
+		symprefix=
+		if test $suffix = dylib; then symprefix=_; fi
+
+		EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRST] .' | grep -v " $symprefix\\($IGNORED_SYMBOLS\\>\\)" | cut -d' ' -f3 | c++filt`"
+
+		prefix=$symprefix`basename "$so" | sed 's/libharfbuzz/hb/; s/-/_/g; s/[.].*//'`
+
+		echo "Checking that $so does not expose internal symbols"
+		if echo "$EXPORTED_SYMBOLS" | grep -v "^${prefix}\(_\|$\)"; then
+			echo "Ouch, internal symbols exposed"
+			stat=1
+		fi
+
+		def=$soname.def
+		if ! test -f "$def"; then
+			echo "'$def' not found; skipping"
+		else
+			echo "Checking that $so has the same symbol list as $def"
+			{
+				echo EXPORTS
+				echo "$EXPORTED_SYMBOLS" | sed -e "s/^${symprefix}hb/hb/g"
+				# cheat: copy the last line from the def file!
+				tail -n1 "$def"
+			} | c++filt | diff "$def" - >&2 || stat=1
+		fi
+
+		tested=true
+	done
+done
+if ! $tested; then
+	echo "check-symbols.sh: no shared libraries found; skipping test"
+	exit 77
+fi
+
+exit $stat
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/dump-indic-data.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/dump-indic-data.cc
new file mode 100644
index 0000000..8ddc9d5
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/dump-indic-data.cc
@@ -0,0 +1,43 @@
+/*
+ * Copyright © 2018  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
+ */
+
+#include "hb-ot-shape-complex-indic.hh"
+
+int
+main ()
+{
+  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
+  {
+    hb_glyph_info_t info;
+    info.codepoint = u;
+    set_indic_properties (info);
+    if (info.indic_category() != INDIC_SYLLABIC_CATEGORY_OTHER ||
+	info.indic_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE)
+      printf("U+%04X	%u	%u\n", u,
+	     info.indic_category(),
+	     info.indic_position());
+  }
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/dump-khmer-data.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/dump-khmer-data.cc
new file mode 100644
index 0000000..cffbb92
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/dump-khmer-data.cc
@@ -0,0 +1,41 @@
+/*
+ * Copyright © 2018  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
+ */
+
+#include "hb-ot-shape-complex-khmer.hh"
+
+int
+main ()
+{
+  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
+  {
+    hb_glyph_info_t info;
+    info.codepoint = u;
+    set_khmer_properties (info);
+    if (info.khmer_category() != INDIC_SYLLABIC_CATEGORY_OTHER)
+      printf("U+%04X	%u\n", u,
+	     info.khmer_category());
+  }
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/dump-myanmar-data.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/dump-myanmar-data.cc
new file mode 100644
index 0000000..c1a303f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/dump-myanmar-data.cc
@@ -0,0 +1,43 @@
+/*
+ * Copyright © 2018  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
+ */
+
+#include "hb-ot-shape-complex-myanmar.hh"
+
+int
+main ()
+{
+  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
+  {
+    hb_glyph_info_t info;
+    info.codepoint = u;
+    set_myanmar_properties (info);
+    if (info.myanmar_category() != INDIC_SYLLABIC_CATEGORY_OTHER ||
+	info.myanmar_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE)
+      printf("U+%04X	%u	%u\n", u,
+	     info.myanmar_category(),
+	     info.myanmar_position());
+  }
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/dump-use-data.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/dump-use-data.cc
new file mode 100644
index 0000000..d639426
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/dump-use-data.cc
@@ -0,0 +1,38 @@
+/*
+ * Copyright © 2018  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
+ */
+
+#include "hb-ot-shape-complex-use.hh"
+
+int
+main ()
+{
+  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
+  {
+    unsigned int category = hb_use_get_category (u);
+    if (category != USE_O)
+      printf("U+%04X	%u\n", u, category);
+  }
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-arabic-table.py b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-arabic-table.py
new file mode 100755
index 0000000..ccecb40
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-arabic-table.py
@@ -0,0 +1,267 @@
+#!/usr/bin/env python
+
+from __future__ import print_function, division, absolute_import
+
+import io, os.path, sys
+
+if len (sys.argv) != 4:
+	print ("usage: ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt", file=sys.stderr)
+	sys.exit (1)
+
+files = [io.open (x, encoding='utf-8') for x in sys.argv[1:]]
+
+headers = [[files[0].readline (), files[0].readline ()], [files[2].readline (), files[2].readline ()]]
+headers.append (["UnicodeData.txt does not have a header."])
+while files[0].readline ().find ('##################') < 0:
+	pass
+
+blocks = {}
+def read_blocks(f):
+	global blocks
+	for line in f:
+
+		j = line.find ('#')
+		if j >= 0:
+			line = line[:j]
+
+		fields = [x.strip () for x in line.split (';')]
+		if len (fields) == 1:
+			continue
+
+		uu = fields[0].split ('..')
+		start = int (uu[0], 16)
+		if len (uu) == 1:
+			end = start
+		else:
+			end = int (uu[1], 16)
+
+		t = fields[1]
+
+		for u in range (start, end + 1):
+			blocks[u] = t
+
+def print_joining_table(f):
+
+	values = {}
+	for line in f:
+
+		if line[0] == '#':
+			continue
+
+		fields = [x.strip () for x in line.split (';')]
+		if len (fields) == 1:
+			continue
+
+		u = int (fields[0], 16)
+
+		if fields[3] in ["ALAPH", "DALATH RISH"]:
+			value = "JOINING_GROUP_" + fields[3].replace(' ', '_')
+		else:
+			value = "JOINING_TYPE_" + fields[2]
+		values[u] = value
+
+	short_value = {}
+	for value in set([v for v in values.values()] + ['JOINING_TYPE_X']):
+		short = ''.join(x[0] for x in value.split('_')[2:])
+		assert short not in short_value.values()
+		short_value[value] = short
+
+	print ()
+	for value,short in short_value.items():
+		print ("#define %s	%s" % (short, value))
+
+	uu = sorted(values.keys())
+	num = len(values)
+	all_blocks = set([blocks[u] for u in uu])
+
+	last = -100000
+	ranges = []
+	for u in uu:
+		if u - last <= 1+16*5:
+			ranges[-1][-1] = u
+		else:
+			ranges.append([u,u])
+		last = u
+
+	print ()
+	print ("static const uint8_t joining_table[] =")
+	print ("{")
+	last_block = None
+	offset = 0
+	for start,end in ranges:
+
+		print ()
+		print ("#define joining_offset_0x%04xu %d" % (start, offset))
+
+		for u in range(start, end+1):
+
+			block = blocks.get(u, last_block)
+			value = values.get(u, "JOINING_TYPE_X")
+
+			if block != last_block or u == start:
+				if u != start:
+					print ()
+				if block in all_blocks:
+					print ("\n  /* %s */" % block)
+				else:
+					print ("\n  /* FILLER */")
+				last_block = block
+				if u % 32 != 0:
+					print ()
+					print ("  /* %04X */" % (u//32*32), "  " * (u % 32), end="")
+
+			if u % 32 == 0:
+				print ()
+				print ("  /* %04X */ " % u, end="")
+			print ("%s," % short_value[value], end="")
+		print ()
+
+		offset += end - start + 1
+	print ()
+	occupancy = num * 100. / offset
+	print ("}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy))
+	print ()
+
+	page_bits = 12;
+	print ()
+	print ("static unsigned int")
+	print ("joining_type (hb_codepoint_t u)")
+	print ("{")
+	print ("  switch (u >> %d)" % page_bits)
+	print ("  {")
+	pages = set([u>>page_bits for u in [s for s,e in ranges]+[e for s,e in ranges]])
+	for p in sorted(pages):
+		print ("    case 0x%0Xu:" % p)
+		for (start,end) in ranges:
+			if p not in [start>>page_bits, end>>page_bits]: continue
+			offset = "joining_offset_0x%04xu" % start
+			print ("      if (hb_in_range<hb_codepoint_t> (u, 0x%04Xu, 0x%04Xu)) return joining_table[u - 0x%04Xu + %s];" % (start, end, start, offset))
+		print ("      break;")
+		print ("")
+	print ("    default:")
+	print ("      break;")
+	print ("  }")
+	print ("  return X;")
+	print ("}")
+	print ()
+	for value,short in short_value.items():
+		print ("#undef %s" % (short))
+	print ()
+
+def print_shaping_table(f):
+
+	shapes = {}
+	ligatures = {}
+	names = {}
+	for line in f:
+
+		fields = [x.strip () for x in line.split (';')]
+		if fields[5][0:1] != '<':
+			continue
+
+		items = fields[5].split (' ')
+		shape, items = items[0][1:-1], tuple (int (x, 16) for x in items[1:])
+
+		if not shape in ['initial', 'medial', 'isolated', 'final']:
+			continue
+
+		c = int (fields[0], 16)
+		if len (items) != 1:
+			# We only care about lam-alef ligatures
+			if len (items) != 2 or items[0] != 0x0644 or items[1] not in [0x0622, 0x0623, 0x0625, 0x0627]:
+				continue
+
+			# Save ligature
+			names[c] = fields[1]
+			if items not in ligatures:
+				ligatures[items] = {}
+			ligatures[items][shape] = c
+			pass
+		else:
+			# Save shape
+			if items[0] not in names:
+				names[items[0]] = fields[1]
+			else:
+				names[items[0]] = os.path.commonprefix ([names[items[0]], fields[1]]).strip ()
+			if items[0] not in shapes:
+				shapes[items[0]] = {}
+			shapes[items[0]][shape] = c
+
+	print ()
+	print ("static const uint16_t shaping_table[][4] =")
+	print ("{")
+
+	keys = shapes.keys ()
+	min_u, max_u = min (keys), max (keys)
+	for u in range (min_u, max_u + 1):
+		s = [shapes[u][shape] if u in shapes and shape in shapes[u] else 0
+		     for shape in  ['initial', 'medial', 'final', 'isolated']]
+		value = ', '.join ("0x%04Xu" % c for c in s)
+		print ("  {%s}, /* U+%04X %s */" % (value, u, names[u] if u in names else ""))
+
+	print ("};")
+	print ()
+	print ("#define SHAPING_TABLE_FIRST	0x%04Xu" % min_u)
+	print ("#define SHAPING_TABLE_LAST	0x%04Xu" % max_u)
+	print ()
+
+	ligas = {}
+	for pair in ligatures.keys ():
+		for shape in ligatures[pair]:
+			c = ligatures[pair][shape]
+			if shape == 'isolated':
+				liga = (shapes[pair[0]]['initial'], shapes[pair[1]]['final'])
+			elif shape == 'final':
+				liga = (shapes[pair[0]]['medial'], shapes[pair[1]]['final'])
+			else:
+				raise Exception ("Unexpected shape", shape)
+			if liga[0] not in ligas:
+				ligas[liga[0]] = []
+			ligas[liga[0]].append ((liga[1], c))
+	max_i = max (len (ligas[l]) for l in ligas)
+	print ()
+	print ("static const struct ligature_set_t {")
+	print (" uint16_t first;")
+	print (" struct ligature_pairs_t {")
+	print ("   uint16_t second;")
+	print ("   uint16_t ligature;")
+	print (" } ligatures[%d];" % max_i)
+	print ("} ligature_table[] =")
+	print ("{")
+	for first in sorted (ligas.keys ()):
+
+		print ("  { 0x%04Xu, {" % (first))
+		for liga in ligas[first]:
+			print ("    { 0x%04Xu, 0x%04Xu }, /* %s */" % (liga[0], liga[1], names[liga[1]]))
+		print ("  }},")
+
+	print ("};")
+	print ()
+
+
+
+print ("/* == Start of generated table == */")
+print ("/*")
+print (" * The following table is generated by running:")
+print (" *")
+print (" *   ./gen-arabic-table.py ArabicShaping.txt UnicodeData.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 ()
+print ("#ifndef HB_OT_SHAPE_COMPLEX_ARABIC_TABLE_HH")
+print ("#define HB_OT_SHAPE_COMPLEX_ARABIC_TABLE_HH")
+print ()
+
+read_blocks (files[2])
+print_joining_table (files[0])
+print_shaping_table (files[1])
+
+print ()
+print ("#endif /* HB_OT_SHAPE_COMPLEX_ARABIC_TABLE_HH */")
+print ()
+print ("/* == End of generated table == */")
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-def.py b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-def.py
new file mode 100755
index 0000000..9111c69
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-def.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+from __future__ import print_function, division, absolute_import
+
+import io, os, re, sys
+
+if len (sys.argv) < 3:
+	sys.exit("usage: gen-def.py harfbuzz.def hb.h [hb-blob.h hb-buffer.h ...]")
+
+output_file = sys.argv[1]
+header_paths = sys.argv[2:]
+
+headers_content = []
+for h in header_paths:
+	if h.endswith (".h"):
+		with io.open (h, encoding='utf-8') as f: headers_content.append (f.read ())
+
+symbols = "\n".join (sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re.M)))
+
+result = symbols if os.environ.get('PLAIN_LIST', '') else """EXPORTS
+%s
+LIBRARY lib%s-0.dll""" % (symbols, output_file.replace ('.def', ''))
+
+with open (output_file, "w") as f: f.write (result)
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-emoji-table.py b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-emoji-table.py
new file mode 100755
index 0000000..9afe747
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-emoji-table.py
@@ -0,0 +1,67 @@
+#!/usr/bin/python
+
+from __future__ import print_function, division, absolute_import
+import sys
+import os.path
+from collections import OrderedDict
+
+if len (sys.argv) != 2:
+	print("usage: ./gen-emoji-table.py emoji-data.txt", file=sys.stderr)
+	sys.exit (1)
+
+f = open(sys.argv[1])
+header = [f.readline () for _ in range(10)]
+
+ranges = OrderedDict()
+for line in f.readlines():
+	line = line.strip()
+	if not line or line[0] == '#':
+		continue
+	rang, typ = [s.strip() for s in line.split('#')[0].split(';')[:2]]
+
+	rang = [int(s, 16) for s in rang.split('..')]
+	if len(rang) > 1:
+		start, end = rang
+	else:
+		start = end = rang[0]
+
+	if typ not in ranges:
+		ranges[typ] = []
+	if ranges[typ] and ranges[typ][-1][1] == start - 1:
+		ranges[typ][-1] = (ranges[typ][-1][0], end)
+	else:
+		ranges[typ].append((start, end))
+
+
+
+print ("/* == Start of generated table == */")
+print ("/*")
+print (" * The following tables are generated by running:")
+print (" *")
+print (" *   ./gen-emoji-table.py emoji-data.txt")
+print (" *")
+print (" * on file with this header:")
+print (" *")
+for l in header:
+	print (" * %s" % (l.strip()))
+print (" */")
+print ()
+print ("#ifndef HB_UNICODE_EMOJI_TABLE_HH")
+print ("#define HB_UNICODE_EMOJI_TABLE_HH")
+print ()
+print ('#include "hb-unicode.hh"')
+print ()
+
+for typ,s in ranges.items():
+	if typ != "Extended_Pictographic": continue
+	print()
+	print("static const struct hb_unicode_range_t _hb_unicode_emoji_%s_table[] =" % typ)
+	print("{")
+	for pair in sorted(s):
+		print("  {0x%04X, 0x%04X}," % pair)
+	print("};")
+
+print ()
+print ("#endif /* HB_UNICODE_EMOJI_TABLE_HH */")
+print ()
+print ("/* == End of generated table == */")
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-indic-table.py b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-indic-table.py
new file mode 100755
index 0000000..6532ee7
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-indic-table.py
@@ -0,0 +1,262 @@
+#!/usr/bin/env python
+
+from __future__ import print_function, division, absolute_import
+
+import io, sys
+
+if len (sys.argv) != 4:
+	print ("usage: ./gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt", file=sys.stderr)
+	sys.exit (1)
+
+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 = [io.open (x, encoding='utf-8') 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):
+	for line in f:
+
+		j = line.find ('#')
+		if j >= 0:
+			line = line[:j]
+
+		fields = [x.strip () for x in line.split (';')]
+		if len (fields) == 1:
+			continue
+
+		uu = fields[0].split ('..')
+		start = int (uu[0], 16)
+		if len (uu) == 1:
+			end = start
+		else:
+			end = int (uu[1], 16)
+
+		t = fields[1]
+
+		for u in range (start, end + 1):
+			data[i][u] = t
+		values[i][t] = values[i].get (t, 0) + end - start + 1
+
+# Merge data into one dict:
+defaults = ('Other', 'Not_Applicable', 'No_Block')
+for i,v in enumerate (defaults):
+	values[i][v] = values[i].get (v, 0) + 1
+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 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 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 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 ()
+print ('#include "hb-ot-shape-complex-indic.hh"')
+print ()
+
+# Shorten values
+short = [{
+	"Bindu":		'Bi',
+	"Cantillation_Mark":	'Ca',
+	"Joiner":		'ZWJ',
+	"Non_Joiner":		'ZWNJ',
+	"Number":		'Nd',
+	"Visarga":		'Vs',
+	"Vowel":		'Vo',
+	"Vowel_Dependent":	'M',
+	"Consonant_Prefixed":	'CPrf',
+	"Other":		'x',
+},{
+	"Not_Applicable":	'x',
+}]
+all_shorts = [{},{}]
+
+# Add some of the values, to make them more readable, and to avoid duplicates
+
+
+for i in range (2):
+	for v,s in short[i].items ():
+		all_shorts[i][s] = v
+
+what = ["INDIC_SYLLABIC_CATEGORY", "INDIC_MATRA_CATEGORY"]
+what_short = ["ISC", "IMC"]
+print ('#pragma GCC diagnostic push')
+print ('#pragma GCC diagnostic ignored "-Wunused-macros"')
+for i in range (2):
+	print ()
+	vv = sorted (values[i].keys ())
+	for v in vv:
+		v_no_and = v.replace ('_And_', '_')
+		if v in short[i]:
+			s = short[i][v]
+		else:
+			s = ''.join ([c for c in v_no_and if ord ('A') <= ord (c) <= ord ('Z')])
+			if s in all_shorts[i]:
+				raise Exception ("Duplicate short value alias", v, all_shorts[i][s])
+			all_shorts[i][s] = v
+			short[i][v] = s
+		print ("#define %s_%s	%s_%s	%s/* %3d chars; %s */" %
+			(what_short[i], s, what[i], v.upper (),
+			'	'* ((48-1 - len (what[i]) - 1 - len (v)) // 8),
+			values[i][v], v))
+print ('#pragma GCC diagnostic pop')
+print ()
+print ("#define _(S,M) INDIC_COMBINE_CATEGORIES (ISC_##S, IMC_##M)")
+print ()
+print ()
+
+total = 0
+used = 0
+last_block = None
+def print_block (block, start, end, data):
+	global total, used, last_block
+	if block and block != last_block:
+		print ()
+		print ()
+		print ("  /* %s */" % block)
+	num = 0
+	assert start % 8 == 0
+	assert (end+1) % 8 == 0
+	for u in range (start, end+1):
+		if u % 8 == 0:
+			print ()
+			print ("  /* %04X */" % u, end="")
+		if u in data:
+			num += 1
+		d = data.get (u, defaults)
+		print ("%9s" % ("_(%s,%s)," % (short[0][d[0]], short[1][d[1]])), end="")
+
+	total += end - start + 1
+	used += num
+	if block:
+		last_block = block
+
+uu = sorted (data.keys ())
+
+last = -100000
+num = 0
+offset = 0
+starts = []
+ends = []
+print ("static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {")
+for u in uu:
+	if u <= last:
+		continue
+	block = data[u][2]
+
+	start = u//8*8
+	end = start+1
+	while end in uu and block == data[end][2]:
+		end += 1
+	end = (end-1)//8*8 + 7
+
+	if start != last + 1:
+		if start - last <= 1+16*3:
+			print_block (None, last+1, start-1, data)
+			last = start-1
+		else:
+			if last >= 0:
+				ends.append (last + 1)
+				offset += ends[-1] - starts[-1]
+			print ()
+			print ()
+			print ("#define indic_offset_0x%04xu %d" % (start, offset))
+			starts.append (start)
+
+	print_block (block, start, end, data)
+	last = end
+ends.append (last + 1)
+offset += ends[-1] - starts[-1]
+print ()
+print ()
+occupancy = used * 100. / total
+page_bits = 12
+print ("}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy))
+print ()
+print ("INDIC_TABLE_ELEMENT_TYPE")
+print ("hb_indic_get_categories (hb_codepoint_t u)")
+print ("{")
+print ("  switch (u >> %d)" % page_bits)
+print ("  {")
+pages = set ([u>>page_bits for u in starts+ends+list (singles.keys ())])
+for p in sorted(pages):
+	print ("    case 0x%0Xu:" % p)
+	for u,d in singles.items ():
+		if p != u>>page_bits: continue
+		print ("      if (unlikely (u == 0x%04Xu)) return _(%s,%s);" % (u, short[0][d[0]], short[1][d[1]]))
+	for (start,end) in zip (starts, ends):
+		if p not in [start>>page_bits, end>>page_bits]: continue
+		offset = "indic_offset_0x%04xu" % start
+		print ("      if (hb_in_range<hb_codepoint_t> (u, 0x%04Xu, 0x%04Xu)) return indic_table[u - 0x%04Xu + %s];" % (start, end-1, start, offset))
+	print ("      break;")
+	print ("")
+print ("    default:")
+print ("      break;")
+print ("  }")
+print ("  return _(x,x);")
+print ("}")
+print ()
+print ("#undef _")
+for i in range (2):
+	print
+	vv = sorted (values[i].keys ())
+	for v in vv:
+		print ("#undef %s_%s" %
+			(what_short[i], short[i][v]))
+print ()
+print ("/* == End of generated table == */")
+
+# Maintain at least 30% occupancy in the table */
+if occupancy < 30:
+	raise Exception ("Table too sparse, please investigate: ", occupancy)
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-os2-unicode-ranges.py b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-os2-unicode-ranges.py
new file mode 100644
index 0000000..8cf5985
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-os2-unicode-ranges.py
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+
+# Generates the code for a sorted unicode range array as used in hb-ot-os2-unicode-ranges.hh
+# Input is a tab seperated list of unicode ranges from the otspec
+# (https://docs.microsoft.com/en-us/typography/opentype/spec/os2#ulunicoderange1).
+
+from __future__ import print_function, division, absolute_import
+
+import io
+import re
+import sys
+
+try:
+  reload(sys)
+  sys.setdefaultencoding('utf-8')
+except NameError:
+  pass  # Python 3
+
+print ("""static OS2Range _hb_os2_unicode_ranges[] =
+{""")
+
+args = sys.argv[1:]
+input_file = args[0]
+
+with io.open(input_file, mode="r", encoding="utf-8") as f:
+
+  all_ranges = [];
+  current_bit = 0
+  while True:
+    line = f.readline().strip()
+    if not line:
+      break
+    fields = re.split(r'\t+', line)
+    if len(fields) == 3:
+      current_bit = fields[0]
+      fields = fields[1:]
+    elif len(fields) > 3:
+      raise Exception("bad input :(.")
+
+    name = fields[0]
+    ranges = re.split("-", fields[1])
+    if len(ranges) != 2:
+      raise Exception("bad input :(.")
+
+    v = tuple((int(ranges[0], 16), int(ranges[1], 16), int(current_bit), name))
+    all_ranges.append(v)
+
+all_ranges = sorted(all_ranges, key=lambda t: t[0])
+
+for ranges in all_ranges:
+  start = ("0x%X" % ranges[0]).rjust(8)
+  end = ("0x%X" % ranges[1]).rjust(8)
+  bit = ("%s" % ranges[2]).rjust(3)
+
+  print ("  {%s, %s, %s}, // %s" % (start, end, bit, ranges[3]))
+
+print ("""};""")
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-tag-table.py b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-tag-table.py
new file mode 100755
index 0000000..1300462
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-tag-table.py
@@ -0,0 +1,1126 @@
+#!/usr/bin/python
+
+"""Generator of the mapping from OpenType tags to BCP 47 tags and vice
+versa.
+
+It creates a ``const LangTag[]``, matching the tags from the OpenType
+languages system tag list to the language subtags of the BCP 47 language
+subtag registry, with some manual adjustments. The mappings are
+supplemented with macrolanguages' sublanguages and retired codes'
+replacements, according to BCP 47 and some manual additions where BCP 47
+omits a retired code entirely.
+
+Also generated is a function, ``hb_ot_ambiguous_tag_to_language``,
+intended for use by ``hb_ot_tag_to_language``. It maps OpenType tags
+back to BCP 47 tags. Ambiguous OpenType tags (those that correspond to
+multiple BCP 47 tags) are listed here, except when the alphabetically
+first BCP 47 tag happens to be the chosen disambiguated tag. In that
+case, the fallback behavior will choose the right tag anyway.
+"""
+
+from __future__ import absolute_import, division, print_function, unicode_literals
+
+import collections
+try:
+	from HTMLParser import HTMLParser
+	def write (s):
+		print (s.encode ('utf-8'), end='')
+except ImportError:
+	from html.parser import HTMLParser
+	def write (s):
+		sys.stdout.flush ()
+		sys.stdout.buffer.write (s.encode ('utf-8'))
+import io
+import itertools
+import re
+import sys
+import unicodedata
+
+if len (sys.argv) != 3:
+	print ('usage: ./gen-tag-table.py languagetags language-subtag-registry', file=sys.stderr)
+	sys.exit (1)
+
+try:
+	from html import unescape
+	def html_unescape (parser, entity):
+		return unescape (entity)
+except ImportError:
+	def html_unescape (parser, entity):
+		return parser.unescape (entity)
+
+def expect (condition, message=None):
+	if not condition:
+		if message is None:
+			raise AssertionError
+		raise AssertionError (message)
+
+# from http://www-01.sil.org/iso639-3/iso-639-3.tab
+ISO_639_3_TO_1 = {
+	'aar': 'aa',
+	'abk': 'ab',
+	'afr': 'af',
+	'aka': 'ak',
+	'amh': 'am',
+	'ara': 'ar',
+	'arg': 'an',
+	'asm': 'as',
+	'ava': 'av',
+	'ave': 'ae',
+	'aym': 'ay',
+	'aze': 'az',
+	'bak': 'ba',
+	'bam': 'bm',
+	'bel': 'be',
+	'ben': 'bn',
+	'bis': 'bi',
+	'bod': 'bo',
+	'bos': 'bs',
+	'bre': 'br',
+	'bul': 'bg',
+	'cat': 'ca',
+	'ces': 'cs',
+	'cha': 'ch',
+	'che': 'ce',
+	'chu': 'cu',
+	'chv': 'cv',
+	'cor': 'kw',
+	'cos': 'co',
+	'cre': 'cr',
+	'cym': 'cy',
+	'dan': 'da',
+	'deu': 'de',
+	'div': 'dv',
+	'dzo': 'dz',
+	'ell': 'el',
+	'eng': 'en',
+	'epo': 'eo',
+	'est': 'et',
+	'eus': 'eu',
+	'ewe': 'ee',
+	'fao': 'fo',
+	'fas': 'fa',
+	'fij': 'fj',
+	'fin': 'fi',
+	'fra': 'fr',
+	'fry': 'fy',
+	'ful': 'ff',
+	'gla': 'gd',
+	'gle': 'ga',
+	'glg': 'gl',
+	'glv': 'gv',
+	'grn': 'gn',
+	'guj': 'gu',
+	'hat': 'ht',
+	'hau': 'ha',
+	'hbs': 'sh',
+	'heb': 'he',
+	'her': 'hz',
+	'hin': 'hi',
+	'hmo': 'ho',
+	'hrv': 'hr',
+	'hun': 'hu',
+	'hye': 'hy',
+	'ibo': 'ig',
+	'ido': 'io',
+	'iii': 'ii',
+	'iku': 'iu',
+	'ile': 'ie',
+	'ina': 'ia',
+	'ind': 'id',
+	'ipk': 'ik',
+	'isl': 'is',
+	'ita': 'it',
+	'jav': 'jv',
+	'jpn': 'ja',
+	'kal': 'kl',
+	'kan': 'kn',
+	'kas': 'ks',
+	'kat': 'ka',
+	'kau': 'kr',
+	'kaz': 'kk',
+	'khm': 'km',
+	'kik': 'ki',
+	'kin': 'rw',
+	'kir': 'ky',
+	'kom': 'kv',
+	'kon': 'kg',
+	'kor': 'ko',
+	'kua': 'kj',
+	'kur': 'ku',
+	'lao': 'lo',
+	'lat': 'la',
+	'lav': 'lv',
+	'lim': 'li',
+	'lin': 'ln',
+	'lit': 'lt',
+	'ltz': 'lb',
+	'lub': 'lu',
+	'lug': 'lg',
+	'mah': 'mh',
+	'mal': 'ml',
+	'mar': 'mr',
+	'mkd': 'mk',
+	'mlg': 'mg',
+	'mlt': 'mt',
+	'mol': 'mo',
+	'mon': 'mn',
+	'mri': 'mi',
+	'msa': 'ms',
+	'mya': 'my',
+	'nau': 'na',
+	'nav': 'nv',
+	'nbl': 'nr',
+	'nde': 'nd',
+	'ndo': 'ng',
+	'nep': 'ne',
+	'nld': 'nl',
+	'nno': 'nn',
+	'nob': 'nb',
+	'nor': 'no',
+	'nya': 'ny',
+	'oci': 'oc',
+	'oji': 'oj',
+	'ori': 'or',
+	'orm': 'om',
+	'oss': 'os',
+	'pan': 'pa',
+	'pli': 'pi',
+	'pol': 'pl',
+	'por': 'pt',
+	'pus': 'ps',
+	'que': 'qu',
+	'roh': 'rm',
+	'ron': 'ro',
+	'run': 'rn',
+	'rus': 'ru',
+	'sag': 'sg',
+	'san': 'sa',
+	'sin': 'si',
+	'slk': 'sk',
+	'slv': 'sl',
+	'sme': 'se',
+	'smo': 'sm',
+	'sna': 'sn',
+	'snd': 'sd',
+	'som': 'so',
+	'sot': 'st',
+	'spa': 'es',
+	'sqi': 'sq',
+	'srd': 'sc',
+	'srp': 'sr',
+	'ssw': 'ss',
+	'sun': 'su',
+	'swa': 'sw',
+	'swe': 'sv',
+	'tah': 'ty',
+	'tam': 'ta',
+	'tat': 'tt',
+	'tel': 'te',
+	'tgk': 'tg',
+	'tgl': 'tl',
+	'tha': 'th',
+	'tir': 'ti',
+	'ton': 'to',
+	'tsn': 'tn',
+	'tso': 'ts',
+	'tuk': 'tk',
+	'tur': 'tr',
+	'twi': 'tw',
+	'uig': 'ug',
+	'ukr': 'uk',
+	'urd': 'ur',
+	'uzb': 'uz',
+	'ven': 've',
+	'vie': 'vi',
+	'vol': 'vo',
+	'wln': 'wa',
+	'wol': 'wo',
+	'xho': 'xh',
+	'yid': 'yi',
+	'yor': 'yo',
+	'zha': 'za',
+	'zho': 'zh',
+	'zul': 'zu',
+}
+
+class LanguageTag (object):
+	"""A BCP 47 language tag.
+
+	Attributes:
+		subtags (List[str]): The list of subtags in this tag.
+		grandfathered (bool): Whether this tag is grandfathered. If
+			``true``, the entire lowercased tag is the ``language``
+			and the other subtag fields are empty.
+		language (str): The language subtag.
+		script (str): The script subtag.
+		region (str): The region subtag.
+		variant (str): The variant subtag.
+
+	Args:
+		tag (str): A BCP 47 language tag.
+
+	"""
+	def __init__ (self, tag):
+		global bcp_47
+		self.subtags = tag.lower ().split ('-')
+		self.grandfathered = tag.lower () in bcp_47.grandfathered
+		if self.grandfathered:
+			self.language = tag.lower ()
+			self.script = ''
+			self.region = ''
+			self.variant = ''
+		else:
+			self.language = self.subtags[0]
+			self.script = self._find_first (lambda s: len (s) == 4 and s[0] > '9', self.subtags)
+			self.region = self._find_first (lambda s: len (s) == 2 and s[0] > '9' or len (s) == 3 and s[0] <= '9', self.subtags[1:])
+			self.variant = self._find_first (lambda s: len (s) > 4 or len (s) == 4 and s[0] <= '9', self.subtags)
+
+	def __str__(self):
+		return '-'.join(self.subtags)
+
+	def __repr__ (self):
+		return 'LanguageTag(%r)' % str(self)
+
+	@staticmethod
+	def _find_first (function, sequence):
+		try:
+			return next (iter (filter (function, sequence)))
+		except StopIteration:
+			return None
+
+	def is_complex (self):
+		"""Return whether this tag is too complex to represent as a
+		``LangTag`` in the generated code.
+
+		Complex tags need to be handled in
+		``hb_ot_tags_from_complex_language``.
+
+		Returns:
+			Whether this tag is complex.
+		"""
+		return not (len (self.subtags) == 1
+			or self.grandfathered
+			and len (self.subtags[1]) != 3
+			and ot.from_bcp_47[self.subtags[0]] == ot.from_bcp_47[self.language])
+
+	def get_group (self):
+		"""Return the group into which this tag should be categorized in
+		``hb_ot_tags_from_complex_language``.
+
+		The group is the first letter of the tag, or ``'und'`` if this tag
+		should not be matched in a ``switch`` statement in the generated
+		code.
+
+		Returns:
+			This tag's group.
+		"""
+		return ('und'
+			if (self.language == 'und'
+				or self.variant in bcp_47.prefixes and len (bcp_47.prefixes[self.variant]) == 1)
+			else self.language[0])
+
+class OpenTypeRegistryParser (HTMLParser):
+	"""A parser for the OpenType language system tag registry.
+
+	Attributes:
+		header (str): The "last updated" line of the registry.
+		names (Mapping[str, str]): A map of language system tags to the
+			names they are given in the registry.
+		ranks (DefaultDict[str, int]): A map of language system tags to
+			numbers. If a single BCP 47 tag corresponds to multiple
+			OpenType tags, the tags are ordered in increasing order by
+			rank. The rank is based on the number of BCP 47 tags
+			associated with a tag, though it may be manually modified.
+		to_bcp_47 (DefaultDict[str, AbstractSet[str]]): A map of
+			OpenType language system tags to sets of BCP 47 tags.
+		from_bcp_47 (DefaultDict[str, AbstractSet[str]]): ``to_bcp_47``
+			inverted. Its values start as unsorted sets;
+			``sort_languages`` converts them to sorted lists.
+
+	"""
+	def __init__ (self):
+		HTMLParser.__init__ (self)
+		self.header = ''
+		self.names = {}
+		self.ranks = collections.defaultdict (int)
+		self.to_bcp_47 = collections.defaultdict (set)
+		self.from_bcp_47 = collections.defaultdict (set)
+		# Whether the parser is in a <td> element
+		self._td = False
+		# The text of the <td> elements of the current <tr> element.
+		self._current_tr = []
+
+	def handle_starttag (self, tag, attrs):
+		if tag == 'meta':
+			for attr, value in attrs:
+				if attr == 'name' and value == 'updated_at':
+					self.header = self.get_starttag_text ()
+					break
+		elif tag == 'td':
+			self._td = True
+			self._current_tr.append ('')
+		elif tag == 'tr':
+			self._current_tr = []
+
+	def handle_endtag (self, tag):
+		if tag == 'td':
+			self._td = False
+		elif tag == 'tr' and self._current_tr:
+			expect (2 <= len (self._current_tr) <= 3)
+			name = self._current_tr[0].strip ()
+			tag = self._current_tr[1].strip ("\t\n\v\f\r '")
+			rank = 0
+			if len (tag) > 4:
+				expect (tag.endswith (' (deprecated)'), 'ill-formed OpenType tag: %s' % tag)
+				name += ' (deprecated)'
+				tag = tag.split (' ')[0]
+				rank = 1
+			self.names[tag] = re.sub (' languages$', '', name)
+			if not self._current_tr[2]:
+				return
+			iso_codes = self._current_tr[2].strip ()
+			self.to_bcp_47[tag].update (ISO_639_3_TO_1.get (code, code) for code in iso_codes.replace (' ', '').split (','))
+			rank += 2 * len (self.to_bcp_47[tag])
+			self.ranks[tag] = rank
+
+	def handle_data (self, data):
+		if self._td:
+			self._current_tr[-1] += data
+
+	def handle_charref (self, name):
+		self.handle_data (html_unescape (self, '&#%s;' % name))
+
+	def handle_entityref (self, name):
+		self.handle_data (html_unescape (self, '&%s;' % name))
+
+	def parse (self, filename):
+		"""Parse the OpenType language system tag registry.
+
+		Args:
+			filename (str): The file name of the registry.
+		"""
+		with io.open (filename, encoding='utf-8') as f:
+			self.feed (f.read ())
+		expect (self.header)
+		for tag, iso_codes in self.to_bcp_47.items ():
+			for iso_code in iso_codes:
+				self.from_bcp_47[iso_code].add (tag)
+
+	def add_language (self, bcp_47_tag, ot_tag):
+		"""Add a language as if it were in the registry.
+
+		Args:
+			bcp_47_tag (str): A BCP 47 tag. If the tag is more than just
+				a language subtag, and if the language subtag is a
+				macrolanguage, then new languages are added corresponding
+				to the macrolanguages' individual languages with the
+				remainder of the tag appended.
+			ot_tag (str): An OpenType language system tag.
+		"""
+		global bcp_47
+		self.to_bcp_47[ot_tag].add (bcp_47_tag)
+		self.from_bcp_47[bcp_47_tag].add (ot_tag)
+		if bcp_47_tag.lower () not in bcp_47.grandfathered:
+			try:
+				[macrolanguage, suffix] = bcp_47_tag.split ('-', 1)
+				if macrolanguage in bcp_47.macrolanguages:
+					s = set ()
+					for language in bcp_47.macrolanguages[macrolanguage]:
+						if language.lower () not in bcp_47.grandfathered:
+							s.add ('%s-%s' % (language, suffix))
+					bcp_47.macrolanguages['%s-%s' % (macrolanguage, suffix)] = s
+			except ValueError:
+				pass
+
+	@staticmethod
+	def _remove_language (tag_1, dict_1, dict_2):
+		for tag_2 in dict_1.pop (tag_1):
+			dict_2[tag_2].remove (tag_1)
+			if not dict_2[tag_2]:
+				del dict_2[tag_2]
+
+	def remove_language_ot (self, ot_tag):
+		"""Remove an OpenType tag from the registry.
+
+		Args:
+			ot_tag (str): An OpenType tag.
+		"""
+		self._remove_language (ot_tag, self.to_bcp_47, self.from_bcp_47)
+
+	def remove_language_bcp_47 (self, bcp_47_tag):
+		"""Remove a BCP 47 tag from the registry.
+
+		Args:
+			bcp_47_tag (str): A BCP 47 tag.
+		"""
+		self._remove_language (bcp_47_tag, self.from_bcp_47, self.to_bcp_47)
+
+	def inherit_from_macrolanguages (self):
+		"""Copy mappings from macrolanguages to individual languages.
+
+		If a BCP 47 tag for an individual mapping has no OpenType
+		mapping but its macrolanguage does, the mapping is copied to
+		the individual language. For example, als (Tosk Albanian) has no
+		explicit mapping, so it inherits from sq (Albanian) the mapping
+		to SQI.
+
+		If a BCP 47 tag for a macrolanguage has no OpenType mapping but
+		all of its individual languages do and they all map to the same
+		tags, the mapping is copied to the macrolanguage.
+		"""
+		global bcp_47
+		original_ot_from_bcp_47 = dict (self.from_bcp_47)
+		for macrolanguage, languages in dict (bcp_47.macrolanguages).items ():
+			ot_macrolanguages = set (original_ot_from_bcp_47.get (macrolanguage, set ()))
+			if ot_macrolanguages:
+				for ot_macrolanguage in ot_macrolanguages:
+					for language in languages:
+						# Remove the following condition if e.g. nn should map to NYN,NOR
+						# instead of just NYN.
+						if language not in original_ot_from_bcp_47:
+							self.add_language (language, ot_macrolanguage)
+							self.ranks[ot_macrolanguage] += 1
+			else:
+				for language in languages:
+					if language in original_ot_from_bcp_47:
+						if ot_macrolanguages:
+							ml = original_ot_from_bcp_47[language]
+							if ml:
+								ot_macrolanguages &= ml
+							else:
+								pass
+						else:
+							ot_macrolanguages |= original_ot_from_bcp_47[language]
+					else:
+						ot_macrolanguages.clear ()
+					if not ot_macrolanguages:
+						break
+				for ot_macrolanguage in ot_macrolanguages:
+					self.add_language (macrolanguage, ot_macrolanguage)
+
+	def sort_languages (self):
+		"""Sort the values of ``from_bcp_47`` in ascending rank order."""
+		for language, tags in self.from_bcp_47.items ():
+			self.from_bcp_47[language] = sorted (tags,
+					key=lambda t: (self.ranks[t] + rank_delta (language, t), t))
+
+ot = OpenTypeRegistryParser ()
+
+class BCP47Parser (object):
+	"""A parser for the BCP 47 subtag registry.
+
+	Attributes:
+		header (str): The "File-Date" line of the registry.
+		names (Mapping[str, str]): A map of subtags to the names they
+			are given in the registry. Each value is a
+			``'\\n'``-separated list of names.
+		scopes (Mapping[str, str]): A map of language subtags to strings
+			suffixed to language names, including suffixes to explain
+			language scopes.
+		macrolanguages (DefaultDict[str, AbstractSet[str]]): A map of
+			language subtags to the sets of language subtags which
+			inherit from them. See
+			``OpenTypeRegistryParser.inherit_from_macrolanguages``.
+		prefixes (DefaultDict[str, AbstractSet[str]]): A map of variant
+			subtags to their prefixes.
+		grandfathered (AbstractSet[str]): The set of grandfathered tags,
+			normalized to lowercase.
+
+	"""
+	def __init__ (self):
+		self.header = ''
+		self.names = {}
+		self.scopes = {}
+		self.macrolanguages = collections.defaultdict (set)
+		self.prefixes = collections.defaultdict (set)
+		self.grandfathered = set ()
+
+	def parse (self, filename):
+		"""Parse the BCP 47 subtag registry.
+
+		Args:
+			filename (str): The file name of the registry.
+		"""
+		with io.open (filename, encoding='utf-8') as f:
+			subtag_type = None
+			subtag = None
+			deprecated = False
+			has_preferred_value = False
+			line_buffer = ''
+			for line in itertools.chain (f, ['']):
+				line = line.rstrip ()
+				if line.startswith (' '):
+					line_buffer += line[1:]
+					continue
+				line, line_buffer = line_buffer, line
+				if line.startswith ('Type: '):
+					subtag_type = line.split (' ')[1]
+					deprecated = False
+					has_preferred_value = False
+				elif line.startswith ('Subtag: ') or line.startswith ('Tag: '):
+					subtag = line.split (' ')[1]
+					if subtag_type == 'grandfathered':
+						self.grandfathered.add (subtag.lower ())
+				elif line.startswith ('Description: '):
+					description = line.split (' ', 1)[1].replace (' (individual language)', '')
+					description = re.sub (' (\((individual |macro)language\)|languages)$', '',
+							description)
+					if subtag in self.names:
+						self.names[subtag] += '\n' + description
+					else:
+						self.names[subtag] = description
+				elif subtag_type == 'language' or subtag_type == 'grandfathered':
+					if line.startswith ('Scope: '):
+						scope = line.split (' ')[1]
+						if scope == 'macrolanguage':
+							scope = ' [macrolanguage]'
+						elif scope == 'collection':
+							scope = ' [family]'
+						else:
+							continue
+						self.scopes[subtag] = scope
+					elif line.startswith ('Deprecated: '):
+						self.scopes[subtag] = ' (retired code)' + self.scopes.get (subtag, '')
+						deprecated = True
+					elif deprecated and line.startswith ('Comments: see '):
+						# If a subtag is split into multiple replacement subtags,
+						# it essentially represents a macrolanguage.
+						for language in line.replace (',', '').split (' ')[2:]:
+							self._add_macrolanguage (subtag, language)
+					elif line.startswith ('Preferred-Value: '):
+						# If a subtag is deprecated in favor of a single replacement subtag,
+						# it is either a dialect or synonym of the preferred subtag. Either
+						# way, it is close enough to the truth to consider the replacement
+						# the macrolanguage of the deprecated language.
+						has_preferred_value = True
+						macrolanguage = line.split (' ')[1]
+						self._add_macrolanguage (macrolanguage, subtag)
+					elif not has_preferred_value and line.startswith ('Macrolanguage: '):
+						self._add_macrolanguage (line.split (' ')[1], subtag)
+				elif subtag_type == 'variant':
+					if line.startswith ('Prefix: '):
+						self.prefixes[subtag].add (line.split (' ')[1])
+				elif line.startswith ('File-Date: '):
+					self.header = line
+		expect (self.header)
+
+	def _add_macrolanguage (self, macrolanguage, language):
+		global ot
+		if language not in ot.from_bcp_47:
+			for l in self.macrolanguages.get (language, set ()):
+				self._add_macrolanguage (macrolanguage, l)
+		if macrolanguage not in ot.from_bcp_47:
+			for ls in list (self.macrolanguages.values ()):
+				if macrolanguage in ls:
+					ls.add (language)
+					return
+		self.macrolanguages[macrolanguage].add (language)
+
+	def remove_extra_macrolanguages (self):
+		"""Make every language have at most one macrolanguage."""
+		inverted = collections.defaultdict (list)
+		for macrolanguage, languages in self.macrolanguages.items ():
+			for language in languages:
+				inverted[language].append (macrolanguage)
+		for language, macrolanguages in inverted.items ():
+			if len (macrolanguages) > 1:
+				macrolanguages.sort (key=lambda ml: len (self.macrolanguages[ml]))
+				biggest_macrolanguage = macrolanguages.pop ()
+				for macrolanguage in macrolanguages:
+					self._add_macrolanguage (biggest_macrolanguage, macrolanguage)
+
+	def get_name (self, lt):
+		"""Return the names of the subtags in a language tag.
+
+		Args:
+			lt (LanguageTag): A BCP 47 language tag.
+
+		Returns:
+			The name form of ``lt``.
+		"""
+		name = self.names[lt.language].split ('\n')[0]
+		if lt.script:
+			name += '; ' + self.names[lt.script.title ()].split ('\n')[0]
+		if lt.region:
+			name += '; ' + self.names[lt.region.upper ()].split ('\n')[0]
+		if lt.variant:
+			name += '; ' + self.names[lt.variant].split ('\n')[0]
+		return name
+
+bcp_47 = BCP47Parser ()
+
+ot.parse (sys.argv[1])
+bcp_47.parse (sys.argv[2])
+
+ot.add_language ('ary', 'MOR')
+
+ot.add_language ('ath', 'ATH')
+
+ot.add_language ('bai', 'BML')
+
+ot.ranks['BAL'] = ot.ranks['KAR'] + 1
+
+ot.add_language ('ber', 'BBR')
+
+ot.remove_language_ot ('PGR')
+ot.add_language ('el-polyton', 'PGR')
+
+bcp_47.macrolanguages['et'] = {'ekk'}
+
+bcp_47.names['flm'] = 'Falam Chin'
+bcp_47.scopes['flm'] = ' (retired code)'
+bcp_47.macrolanguages['flm'] = {'cfm'}
+
+ot.ranks['FNE'] = ot.ranks['TNE'] + 1
+
+ot.add_language ('und-fonipa', 'IPPH')
+
+ot.add_language ('und-fonnapa', 'APPH')
+
+ot.remove_language_ot ('IRT')
+ot.add_language ('ga-Latg', 'IRT')
+
+ot.remove_language_ot ('KGE')
+ot.add_language ('und-Geok', 'KGE')
+
+ot.add_language ('guk', 'GUK')
+ot.names['GUK'] = 'Gumuz (SIL fonts)'
+ot.ranks['GUK'] = ot.ranks['GMZ'] + 1
+
+bcp_47.macrolanguages['id'] = {'in'}
+
+bcp_47.macrolanguages['ijo'] = {'ijc'}
+
+ot.add_language ('kht', 'KHN')
+ot.names['KHN'] = ot.names['KHT'] + ' (Microsoft fonts)'
+ot.names['KHT'] = ot.names['KHT'] + ' (OpenType spec and SIL fonts)'
+ot.ranks['KHN'] = ot.ranks['KHT']
+ot.ranks['KHT'] += 1
+
+ot.ranks['LCR'] = ot.ranks['MCR'] + 1
+
+ot.names['MAL'] = 'Malayalam Traditional'
+ot.ranks['MLR'] += 1
+
+bcp_47.names['mhv'] = 'Arakanese'
+bcp_47.scopes['mhv'] = ' (retired code)'
+
+ot.add_language ('no', 'NOR')
+
+ot.add_language ('oc-provenc', 'PRO')
+
+ot.add_language ('qu', 'QUZ')
+ot.add_language ('qub', 'QWH')
+ot.add_language ('qud', 'QVI')
+ot.add_language ('qug', 'QVI')
+ot.add_language ('qup', 'QVI')
+ot.add_language ('qur', 'QWH')
+ot.add_language ('qus', 'QUH')
+ot.add_language ('quw', 'QVI')
+ot.add_language ('qux', 'QWH')
+ot.add_language ('qva', 'QWH')
+ot.add_language ('qvh', 'QWH')
+ot.add_language ('qvj', 'QVI')
+ot.add_language ('qvl', 'QWH')
+ot.add_language ('qvm', 'QWH')
+ot.add_language ('qvn', 'QWH')
+ot.add_language ('qvo', 'QVI')
+ot.add_language ('qvp', 'QWH')
+ot.add_language ('qvw', 'QWH')
+ot.add_language ('qvz', 'QVI')
+ot.add_language ('qwa', 'QWH')
+ot.add_language ('qws', 'QWH')
+ot.add_language ('qxa', 'QWH')
+ot.add_language ('qxc', 'QWH')
+ot.add_language ('qxh', 'QWH')
+ot.add_language ('qxl', 'QVI')
+ot.add_language ('qxn', 'QWH')
+ot.add_language ('qxo', 'QWH')
+ot.add_language ('qxr', 'QVI')
+ot.add_language ('qxt', 'QWH')
+ot.add_language ('qxw', 'QWH')
+
+bcp_47.macrolanguages['ro'].remove ('mo')
+bcp_47.macrolanguages['ro-MD'].add ('mo')
+
+ot.add_language ('sgw', 'SGW')
+ot.names['SGW'] = ot.names['CHG'] + ' (SIL fonts)'
+ot.ranks['SGW'] = ot.ranks['CHG'] + 1
+
+ot.remove_language_ot ('SYRE')
+ot.remove_language_ot ('SYRJ')
+ot.remove_language_ot ('SYRN')
+ot.add_language ('und-Syre', 'SYRE')
+ot.add_language ('und-Syrj', 'SYRJ')
+ot.add_language ('und-Syrn', 'SYRN')
+
+bcp_47.names['xst'] = u"Silt'e"
+bcp_47.scopes['xst'] = ' (retired code)'
+bcp_47.macrolanguages['xst'] = {'stv', 'wle'}
+
+ot.add_language ('xwo', 'TOD')
+
+ot.remove_language_ot ('ZHH')
+ot.remove_language_ot ('ZHP')
+ot.remove_language_ot ('ZHT')
+bcp_47.macrolanguages['zh'].remove ('lzh')
+bcp_47.macrolanguages['zh'].remove ('yue')
+ot.add_language ('zh-Hant-MO', 'ZHH')
+ot.add_language ('zh-Hant-HK', 'ZHH')
+ot.add_language ('zh-Hans', 'ZHS')
+ot.add_language ('zh-Hant', 'ZHT')
+ot.add_language ('zh-HK', 'ZHH')
+ot.add_language ('zh-MO', 'ZHH')
+ot.add_language ('zh-TW', 'ZHT')
+ot.add_language ('lzh', 'ZHT')
+ot.add_language ('lzh-Hans', 'ZHS')
+ot.add_language ('yue', 'ZHH')
+ot.add_language ('yue-Hans', 'ZHS')
+
+bcp_47.macrolanguages['zom'] = {'yos'}
+
+def rank_delta (bcp_47, ot):
+	"""Return a delta to apply to a BCP 47 tag's rank.
+
+	Most OpenType tags have a constant rank, but a few have ranks that
+	depend on the BCP 47 tag.
+
+	Args:
+		bcp_47 (str): A BCP 47 tag.
+		ot (str): An OpenType tag to.
+
+	Returns:
+		A number to add to ``ot``'s rank when sorting ``bcp_47``'s
+		OpenType equivalents.
+	"""
+	if bcp_47 == 'ak' and ot == 'AKA':
+		return -1
+	if bcp_47 == 'tw' and ot == 'TWI':
+		return -1
+	return 0
+
+disambiguation = {
+	'ALT': 'alt',
+	'ARK': 'rki',
+	'BHI': 'bhb',
+	'BLN': 'bjt',
+	'BTI': 'beb',
+	'CCHN': 'cco',
+	'CMR': 'swb',
+	'CPP': 'crp',
+	'CRR': 'crx',
+	'DUJ': 'dwu',
+	'ECR': 'crj',
+	'HAL': 'cfm',
+	'HND': 'hnd',
+	'KIS': 'kqs',
+	'LRC': 'bqi',
+	'NDB': 'nd',
+	'NIS': 'njz',
+	'PLG': 'pce',
+	'PRO': 'pro',
+	'QIN': 'bgr',
+	'QUH': 'quh',
+	'QVI': 'qvi',
+	'QWH': 'qwh',
+	'SIG': 'stv',
+	'TNE': 'yrk',
+	'ZHH': 'zh-HK',
+	'ZHS': 'zh-Hans',
+	'ZHT': 'zh-Hant',
+}
+
+ot.inherit_from_macrolanguages ()
+bcp_47.remove_extra_macrolanguages ()
+ot.inherit_from_macrolanguages ()
+ot.sort_languages ()
+
+print ('/* == Start of generated table == */')
+print ('/*')
+print (' * The following table is generated by running:')
+print (' *')
+print (' *   %s languagetags language-subtag-registry' % sys.argv[0])
+print (' *')
+print (' * on files with these headers:')
+print (' *')
+print (' * %s' % ot.header.strip ())
+print (' * %s' % bcp_47.header)
+print (' */')
+print ()
+print ('#ifndef HB_OT_TAG_TABLE_HH')
+print ('#define HB_OT_TAG_TABLE_HH')
+print ()
+print ('static const LangTag ot_languages[] = {')
+
+def hb_tag (tag):
+	"""Convert a tag to ``HB_TAG`` form.
+
+	Args:
+		tag (str): An OpenType tag.
+
+	Returns:
+		A snippet of C++ representing ``tag``.
+	"""
+	return u"HB_TAG('%s','%s','%s','%s')" % tuple (('%-4s' % tag)[:4])
+
+def get_variant_set (name):
+	"""Return a set of variant language names from a name.
+
+	Args:
+		name (str): A list of language names from the BCP 47 registry,
+			joined on ``'\\n'``.
+
+	Returns:
+		A set of normalized language names.
+	"""
+	return set (unicodedata.normalize ('NFD', n.replace ('\u2019', u"'"))
+			.encode ('ASCII', 'ignore')
+			.strip ()
+			for n in re.split ('[\n(),]', name) if n)
+
+def language_name_intersection (a, b):
+	"""Return the names in common between two language names.
+
+	Args:
+		a (str): A list of language names from the BCP 47 registry,
+			joined on ``'\\n'``.
+		b (str): A list of language names from the BCP 47 registry,
+			joined on ``'\\n'``.
+
+	Returns:
+		The normalized language names shared by ``a`` and ``b``.
+	"""
+	return get_variant_set (a).intersection (get_variant_set (b))
+
+def get_matching_language_name (intersection, candidates):
+	return next (iter (c for c in candidates if not intersection.isdisjoint (get_variant_set (c))))
+
+maximum_tags = 0
+for language, tags in sorted (ot.from_bcp_47.items ()):
+	if language == '' or '-' in language:
+		continue
+	print ('  {\"%s\",\t{' % language, end='')
+	maximum_tags = max (maximum_tags, len (tags))
+	tag_count = len (tags)
+	for i, tag in enumerate (tags, start=1):
+		if i > 1:
+			print ('\t\t ', end='')
+		print (hb_tag (tag), end='')
+		if i == tag_count:
+			print ('}}', end='')
+		print (',\t/* ', end='')
+		bcp_47_name = bcp_47.names.get (language, '')
+		bcp_47_name_candidates = bcp_47_name.split ('\n')
+		intersection = language_name_intersection (bcp_47_name, ot.names[tag])
+		scope = bcp_47.scopes.get (language, '')
+		if not intersection:
+			write ('%s%s -> %s' % (bcp_47_name_candidates[0], scope, ot.names[tag]))
+		else:
+			name = get_matching_language_name (intersection, bcp_47_name_candidates)
+			bcp_47.names[language] = name
+			write ('%s%s' % (name if len (name) > len (ot.names[tag]) else ot.names[tag], scope))
+		print (' */')
+
+print ('};')
+print ()
+print ('static_assert (HB_OT_MAX_TAGS_PER_LANGUAGE == %iu, "");' % maximum_tags)
+print ()
+
+print ('/**')
+print (' * hb_ot_tags_from_complex_language:')
+print (' * @lang_str: a BCP 47 language tag to convert.')
+print (' * @limit: a pointer to the end of the substring of @lang_str to consider for')
+print (' * conversion.')
+print (' * @count: maximum number of language tags to retrieve (IN) and actual number of')
+print (' * language tags retrieved (OUT). If no tags are retrieved, it is not modified.')
+print (' * @tags: array of size at least @language_count to store the language tag')
+print (' * results')
+print (' *')
+print (' * Converts a multi-subtag BCP 47 language tag to language tags.')
+print (' *')
+print (' * Return value: Whether any language systems were retrieved.')
+print (' **/')
+print ('static bool')
+print ('hb_ot_tags_from_complex_language (const char   *lang_str,')
+print ('\t\t\t\t  const char   *limit,')
+print ('\t\t\t\t  unsigned int *count /* IN/OUT */,')
+print ('\t\t\t\t  hb_tag_t     *tags /* OUT */)')
+print ('{')
+
+def print_subtag_matches (subtag, new_line):
+	if subtag:
+		if new_line:
+			print ()
+			print ('\t&& ', end='')
+		print ('subtag_matches (lang_str, limit, "-%s")' % subtag, end='')
+
+complex_tags = collections.defaultdict (list)
+for initial, group in itertools.groupby ((lt_tags for lt_tags in [
+			(LanguageTag (language), tags)
+			for language, tags in sorted (ot.from_bcp_47.items (),
+				key=lambda i: (-len (i[0]), i[0]))
+		] if lt_tags[0].is_complex ()),
+		key=lambda lt_tags: lt_tags[0].get_group ()):
+	complex_tags[initial] += group
+
+for initial, items in sorted (complex_tags.items ()):
+	if initial != 'und':
+		continue
+	for lt, tags in items:
+		if lt.variant in bcp_47.prefixes:
+			expect (next (iter (bcp_47.prefixes[lt.variant])) == lt.language,
+					'%s is not a valid prefix of %s' % (lt.language, lt.variant))
+		print ('  if (', end='')
+		print_subtag_matches (lt.script, False)
+		print_subtag_matches (lt.region, False)
+		print_subtag_matches (lt.variant, False)
+		print (')')
+		print ('  {')
+		write ('    /* %s */' % bcp_47.get_name (lt))
+		print ()
+		if len (tags) == 1:
+			write ('    tags[0] = %s;  /* %s */' % (hb_tag (tags[0]), ot.names[tags[0]]))
+			print ()
+			print ('    *count = 1;')
+		else:
+			print ('    hb_tag_t possible_tags[] = {')
+			for tag in tags:
+				write ('      %s,  /* %s */' % (hb_tag (tag), ot.names[tag]))
+				print ()
+			print ('    };')
+			print ('    for (i = 0; i < %s && i < *count; i++)' % len (tags))
+			print ('      tags[i] = possible_tags[i];')
+			print ('    *count = i;')
+		print ('    return true;')
+		print ('  }')
+
+print ('  switch (lang_str[0])')
+print ('  {')
+for initial, items in sorted (complex_tags.items ()):
+	if initial == 'und':
+		continue
+	print ("  case '%s':" % initial)
+	for lt, tags in items:
+		print ('    if (', end='')
+		if lt.grandfathered:
+			print ('0 == strcmp (&lang_str[1], "%s")' % lt.language[1:], end='')
+		else:
+			string_literal = lt.language[1:] + '-'
+			if lt.script:
+				string_literal += lt.script
+				lt.script = None
+				if lt.region:
+					string_literal += '-' + lt.region
+					lt.region = None
+			if string_literal[-1] == '-':
+				print ('0 == strncmp (&lang_str[1], "%s", %i)' % (string_literal, len (string_literal)), end='')
+			else:
+				print ('lang_matches (&lang_str[1], "%s")' % string_literal, end='')
+		print_subtag_matches (lt.script, True)
+		print_subtag_matches (lt.region, True)
+		print_subtag_matches (lt.variant, True)
+		print (')')
+		print ('    {')
+		write ('      /* %s */' % bcp_47.get_name (lt))
+		print ()
+		if len (tags) == 1:
+			write ('      tags[0] = %s;  /* %s */' % (hb_tag (tags[0]), ot.names[tags[0]]))
+			print ()
+			print ('      *count = 1;')
+		else:
+			print ('      unsigned int i;')
+			print ('      hb_tag_t possible_tags[] = {')
+			for tag in tags:
+				write ('\t%s,  /* %s */' % (hb_tag (tag), ot.names[tag]))
+				print ()
+			print ('      };')
+			print ('      for (i = 0; i < %s && i < *count; i++)' % len (tags))
+			print ('\ttags[i] = possible_tags[i];')
+			print ('      *count = i;')
+		print ('      return true;')
+		print ('    }')
+	print ('    break;')
+
+print ('  }')
+print ('  return false;')
+print ('}')
+print ()
+print ('/**')
+print (' * hb_ot_ambiguous_tag_to_language')
+print (' * @tag: A language tag.')
+print (' *')
+print (' * Converts @tag to a BCP 47 language tag if it is ambiguous (it corresponds to')
+print (' * many language tags) and the best tag is not the alphabetically first, or if')
+print (' * the best tag consists of multiple subtags.')
+print (' *')
+print (' * Return value: The #hb_language_t corresponding to the BCP 47 language tag,')
+print (' * or #HB_LANGUAGE_INVALID if @tag is not ambiguous.')
+print (' **/')
+print ('static hb_language_t')
+print ('hb_ot_ambiguous_tag_to_language (hb_tag_t tag)')
+print ('{')
+print ('  switch (tag)')
+print ('  {')
+
+def verify_disambiguation_dict ():
+	"""Verify and normalize ``disambiguation``.
+
+	``disambiguation`` is a map of ambiguous OpenType language system
+	tags to the particular BCP 47 tags they correspond to. This function
+	checks that all its keys really are ambiguous and that each key's
+	value is valid for that key. It checks that no ambiguous tag is
+	missing, except when it can figure out which BCP 47 tag is the best
+	by itself.
+
+	It modifies ``disambiguation`` to remove keys whose values are the
+	same as those that the fallback would return anyway, and to add
+	ambiguous keys whose disambiguations it determined automatically.
+
+	Raises:
+		AssertionError: Verification failed.
+	"""
+	global bcp_47
+	global disambiguation
+	global ot
+	for ot_tag, bcp_47_tags in ot.to_bcp_47.items ():
+		primary_tags = list (t for t in bcp_47_tags if t not in bcp_47.grandfathered and ot.from_bcp_47.get (t)[0] == ot_tag)
+		if len (primary_tags) == 1:
+			expect (ot_tag not in disambiguation, 'unnecessary disambiguation for OT tag: %s' % ot_tag)
+			if '-' in primary_tags[0]:
+				disambiguation[ot_tag] = primary_tags[0]
+		elif len (primary_tags) == 0:
+			expect (ot_tag not in disambiguation, 'There is no possible valid disambiguation for %s' % ot_tag)
+		else:
+			macrolanguages = list (t for t in primary_tags if bcp_47.scopes.get (t) == ' [macrolanguage]')
+			if len (macrolanguages) != 1:
+				macrolanguages = list (t for t in primary_tags if bcp_47.scopes.get (t) == ' [family]')
+			if len (macrolanguages) != 1:
+				macrolanguages = list (t for t in primary_tags if 'retired code' not in bcp_47.scopes.get (t, ''))
+			if len (macrolanguages) != 1:
+				expect (ot_tag in disambiguation, 'ambiguous OT tag: %s %s' % (ot_tag, str (macrolanguages)))
+				expect (disambiguation[ot_tag] in bcp_47_tags,
+						'%s is not a valid disambiguation for %s' % (disambiguation[ot_tag], ot_tag))
+			elif ot_tag not in disambiguation:
+				disambiguation[ot_tag] = macrolanguages[0]
+			if disambiguation[ot_tag] == sorted (primary_tags)[0] and '-' not in disambiguation[ot_tag]:
+				del disambiguation[ot_tag]
+	for ot_tag in disambiguation.keys ():
+		expect (ot_tag in ot.to_bcp_47, 'unknown OT tag: %s' % ot_tag)
+
+verify_disambiguation_dict ()
+for ot_tag, bcp_47_tag in sorted (disambiguation.items ()):
+	write ('  case %s:  /* %s */' % (hb_tag (ot_tag), ot.names[ot_tag]))
+	print ()
+	write ('    return hb_language_from_string (\"%s\", -1);  /* %s */' % (bcp_47_tag, bcp_47.get_name (LanguageTag (bcp_47_tag))))
+	print ()
+
+print ('  default:')
+print ('    return HB_LANGUAGE_INVALID;')
+print ('  }')
+print ('}')
+
+print ()
+print ('#endif /* HB_OT_TAG_TABLE_HH */')
+print ()
+print ('/* == End of generated table == */')
+
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-use-table.py b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-use-table.py
new file mode 100755
index 0000000..be204b6
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-use-table.py
@@ -0,0 +1,538 @@
+#!/usr/bin/env python
+# flake8: noqa
+
+from __future__ import print_function, division, absolute_import
+
+import io
+import sys
+
+if len (sys.argv) != 5:
+	print ("usage: ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt", file=sys.stderr)
+	sys.exit (1)
+
+BLACKLISTED_BLOCKS = ["Thai", "Lao"]
+
+files = [io.open (x, encoding='utf-8') for x in sys.argv[1:]]
+
+headers = [[f.readline () for i in range (2)] for j,f in enumerate(files) if j != 2]
+headers.append (["UnicodeData.txt does not have a header."])
+
+data = [{} for f in files]
+values = [{} for f in files]
+for i, f in enumerate (files):
+	for line in f:
+
+		j = line.find ('#')
+		if j >= 0:
+			line = line[:j]
+
+		fields = [x.strip () for x in line.split (';')]
+		if len (fields) == 1:
+			continue
+
+		uu = fields[0].split ('..')
+		start = int (uu[0], 16)
+		if len (uu) == 1:
+			end = start
+		else:
+			end = int (uu[1], 16)
+
+		t = fields[1 if i != 2 else 2]
+
+		for u in range (start, end + 1):
+			data[i][u] = t
+		values[i][t] = values[i].get (t, 0) + end - start + 1
+
+defaults = ('Other', 'Not_Applicable', 'Cn', 'No_Block')
+
+# TODO Characters that are not in Unicode Indic files, but used in USE
+data[0][0x034F] = defaults[0]
+data[0][0x2060] = defaults[0]
+data[0][0x20F0] = defaults[0]
+# TODO https://github.com/roozbehp/unicode-data/issues/9
+data[0][0x11C44] = 'Consonant_Placeholder'
+data[0][0x11C45] = 'Consonant_Placeholder'
+# TODO https://github.com/harfbuzz/harfbuzz/pull/1399
+data[0][0x111C8] = 'Consonant_Placeholder'
+for u in range (0xFE00, 0xFE0F + 1):
+	data[0][u] = defaults[0]
+
+# Merge data into one dict:
+for i,v in enumerate (defaults):
+	values[i][v] = values[i].get (v, 0) + 1
+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[3] not in BLACKLISTED_BLOCKS}
+data = combined
+del combined
+num = len (data)
+
+
+property_names = [
+	# General_Category
+	'Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', 'Mc',
+	'Me', 'Mn', 'Nd', 'Nl', 'No', 'Pc', 'Pd', 'Pe', 'Pf', 'Pi', 'Po',
+	'Ps', 'Sc', 'Sk', 'Sm', 'So', 'Zl', 'Zp', 'Zs',
+	# Indic_Syllabic_Category
+	'Other',
+	'Bindu',
+	'Visarga',
+	'Avagraha',
+	'Nukta',
+	'Virama',
+	'Pure_Killer',
+	'Invisible_Stacker',
+	'Vowel_Independent',
+	'Vowel_Dependent',
+	'Vowel',
+	'Consonant_Placeholder',
+	'Consonant',
+	'Consonant_Dead',
+	'Consonant_With_Stacker',
+	'Consonant_Prefixed',
+	'Consonant_Preceding_Repha',
+	'Consonant_Succeeding_Repha',
+	'Consonant_Subjoined',
+	'Consonant_Medial',
+	'Consonant_Final',
+	'Consonant_Head_Letter',
+	'Consonant_Initial_Postfixed',
+	'Modifying_Letter',
+	'Tone_Letter',
+	'Tone_Mark',
+	'Gemination_Mark',
+	'Cantillation_Mark',
+	'Register_Shifter',
+	'Syllable_Modifier',
+	'Consonant_Killer',
+	'Non_Joiner',
+	'Joiner',
+	'Number_Joiner',
+	'Number',
+	'Brahmi_Joining_Number',
+	# Indic_Positional_Category
+	'Not_Applicable',
+	'Right',
+	'Left',
+	'Visual_Order_Left',
+	'Left_And_Right',
+	'Top',
+	'Bottom',
+	'Top_And_Bottom',
+	'Top_And_Right',
+	'Top_And_Left',
+	'Top_And_Left_And_Right',
+	'Bottom_And_Left',
+	'Bottom_And_Right',
+	'Top_And_Bottom_And_Right',
+	'Overstruck',
+]
+
+try:
+	basestring
+except NameError:
+	basestring = str
+
+class PropertyValue(object):
+	def __init__(self, name_):
+		self.name = name_
+	def __str__(self):
+		return self.name
+	def __eq__(self, other):
+		return self.name == (other if isinstance(other, basestring) else other.name)
+	def __ne__(self, other):
+		return not (self == other)
+	def __hash__(self):
+		return hash(str(self))
+
+property_values = {}
+
+for name in property_names:
+	value = PropertyValue(name)
+	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-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_IND(U, UISC, UGC):
+	#SPEC-DRAFT return (UISC in [Consonant_Dead, Modifying_Letter] or UGC == Po)
+	return (UISC in [Consonant_Dead, Modifying_Letter] or
+		(UGC == Po and not U in [0x104B, 0x104E, 0x2022, 0x111C8, 0x11A3F, 0x11A45, 0x11C44, 0x11C45]) 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-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):
+	# Consonant_Initial_Postfixed is new in Unicode 11; not in the spec.
+	return ((UISC == Consonant_Final and UGC != Lo) or
+		UISC == Consonant_Initial_Postfixed or
+		UISC == Consonant_Succeeding_Repha)
+def is_CONS_FINAL_MOD(U, UISC, UGC):
+	#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-DRAFT return UISC == Consonant_Subjoined
+	return UISC == Consonant_Subjoined and UGC != Lo
+def is_CONS_WITH_STACKER(U, UISC, UGC):
+	return UISC == Consonant_With_Stacker
+def is_HALANT(U, UISC, UGC):
+	return UISC in [Virama, Invisible_Stacker] and not is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UGC)
+def is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UGC):
+	# https://github.com/harfbuzz/harfbuzz/issues/1102
+	# https://github.com/harfbuzz/harfbuzz/issues/1379
+	return U in [0x11046, 0x1134D]
+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):
+	return UISC == Joiner
+def is_Word_Joiner(U, UISC, UGC):
+	return U == 0x2060
+def is_OTHER(U, UISC, UGC):
+	#SPEC-OUTDATED return UGC == Zs # or any other SCRIPT_COMMON characters
+	return (UISC == Other
+		and not is_SYM_MOD(U, UISC, UGC)
+		and not is_CGJ(U, UISC, UGC)
+		and not is_Word_Joiner(U, UISC, UGC)
+		and not is_VARIATION_SELECTOR(U, UISC, UGC)
+	)
+def is_Reserved(U, UISC, UGC):
+	return UGC == 'Cn'
+def is_REPHA(U, UISC, UGC):
+	return UISC in [Consonant_Preceding_Repha, Consonant_Prefixed]
+def is_SYM(U, UISC, UGC):
+	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):
+	# https://github.com/roozbehp/unicode-data/issues/6
+	return (UISC == Pure_Killer or
+		(UGC != Lo and UISC in [Vowel, Vowel_Dependent] and U not in [0xAA29]))
+def is_VOWEL_MOD(U, UISC, UGC):
+	# https://github.com/roozbehp/unicode-data/issues/6
+	return (UISC in [Tone_Mark, Cantillation_Mark, Register_Shifter, Visarga] or
+		(UGC != Lo and (UISC == Bindu or U in [0xAA29])))
+
+use_mapping = {
+	'B':	is_BASE,
+	'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,
+	'SUB':	is_CONS_SUB,
+	'CS':	is_CONS_WITH_STACKER,
+	'H':	is_HALANT,
+	'HVM':	is_HALANT_OR_VOWEL_MODIFIER,
+	'HN':	is_HALANT_NUM,
+	'ZWNJ':	is_ZWNJ,
+	'ZWJ':	is_ZWJ,
+	'WJ':	is_Word_Joiner,
+	'O':	is_OTHER,
+	'Rsv':	is_Reserved,
+	'R':	is_REPHA,
+	'S':	is_SYM,
+	'SM':	is_SYM_MOD,
+	'VS':	is_VARIATION_SELECTOR,
+	'V':	is_VOWEL,
+	'VM':	is_VOWEL_MOD,
+}
+
+use_positions = {
+	'F': {
+		'Abv': [Top],
+		'Blw': [Bottom],
+		'Pst': [Right],
+	},
+	'M': {
+		'Abv': [Top],
+		'Blw': [Bottom, Bottom_And_Left],
+		'Pst': [Right],
+		'Pre': [Left],
+	},
+	'CM': {
+		'Abv': [Top],
+		'Blw': [Bottom],
+	},
+	'V': {
+		'Abv': [Top, Top_And_Bottom, Top_And_Bottom_And_Right, Top_And_Right],
+		'Blw': [Bottom, Overstruck, Bottom_And_Right],
+		'Pst': [Right, Top_And_Left, Top_And_Left_And_Right, Left_And_Right],
+		'Pre': [Left],
+	},
+	'VM': {
+		'Abv': [Top],
+		'Blw': [Bottom, Overstruck],
+		'Pst': [Right],
+		'Pre': [Left],
+	},
+	'SM': {
+		'Abv': [Top],
+		'Blw': [Bottom],
+	},
+	'H': None,
+	'HVM': None,
+	'B': None,
+	'FM': None,
+	'SUB': None,
+}
+
+def map_to_use(data):
+	out = {}
+	items = use_mapping.items()
+	for U,(UISC,UIPC,UGC,UBlock) in data.items():
+
+		# Resolve Indic_Syllabic_Category
+
+		# TODO: These don't have UISC assigned in Unicode 8.0, but have UIPC
+		if U == 0x17DD: UISC = Vowel_Dependent
+		if 0x1CE2 <= U <= 0x1CE8: UISC = Cantillation_Mark
+
+		# Tibetan:
+		# TODO: These don't have UISC assigned in Unicode 11.0, but have UIPC
+		if 0x0F18 <= U <= 0x0F19 or 0x0F3E <= U <= 0x0F3F: UISC = Vowel_Dependent
+		if 0x0F86 <= U <= 0x0F87: UISC = Tone_Mark
+		# Overrides to allow NFC order matching syllable
+		# https://github.com/harfbuzz/harfbuzz/issues/1012
+		if UBlock == 'Tibetan' and is_VOWEL (U, UISC, UGC):
+			if UIPC == Top:
+				UIPC = Bottom
+
+		# TODO: https://github.com/harfbuzz/harfbuzz/pull/982
+		# also  https://github.com/harfbuzz/harfbuzz/issues/1012
+		if UBlock == 'Chakma' and is_VOWEL (U, UISC, UGC):
+			if UIPC == Top:
+				UIPC = Bottom
+			elif UIPC == Bottom:
+				UIPC = Top
+
+		# TODO: https://github.com/harfbuzz/harfbuzz/pull/627
+		if 0x1BF2 <= U <= 0x1BF3: UISC = Nukta; UIPC = Bottom
+
+		# TODO: U+1CED should only be allowed after some of
+		# the nasalization marks, maybe only for U+1CE9..U+1CF1.
+		if U == 0x1CED: UISC = Tone_Mark
+
+		# TODO: https://github.com/harfbuzz/harfbuzz/issues/525
+		if U == 0x1A7F: UISC = Consonant_Final; UIPC = Bottom
+
+		# TODO: https://github.com/harfbuzz/harfbuzz/pull/609
+		if U == 0x20F0: UISC = Cantillation_Mark; UIPC = Top
+
+		# TODO: https://github.com/harfbuzz/harfbuzz/pull/626
+		if U == 0xA8B4: UISC = Consonant_Medial
+
+		# TODO: https://github.com/harfbuzz/harfbuzz/issues/1105
+		if U == 0x11134: UISC = Gemination_Mark
+
+		# TODO: https://github.com/harfbuzz/harfbuzz/pull/1399
+		if U == 0x111C9: UISC = Consonant_Final
+
+		values = [k for k,v in items if v(U,UISC,UGC)]
+		assert len(values) == 1, "%s %s %s %s" % (hex(U), UISC, UGC, values)
+		USE = values[0]
+
+		# Resolve Indic_Positional_Category
+
+		# TODO: Not in Unicode 8.0 yet, but in spec.
+		if U == 0x1B6C: UIPC = Bottom
+
+		# TODO: These should die, but have UIPC in Unicode 8.0
+		if U in [0x953, 0x954]: UIPC = Not_Applicable
+
+		# TODO: In USE's override list but not in Unicode 11.0
+		if U == 0x103C: UIPC = Left
+
+		# TODO: These are not in USE's override list that we have, nor are they in Unicode 11.0
+		if 0xA926 <= U <= 0xA92A: UIPC = Top
+		if U == 0x111CA: UIPC = Bottom
+		if U == 0x11300: UIPC = Top
+		# TODO: https://github.com/harfbuzz/harfbuzz/pull/1037
+		if U == 0x11302: UIPC = Top
+		if U == 0x1133C: UIPC = Bottom
+		if U == 0x1171E: UIPC = Left # Correct?!
+		if 0x1CF2 <= U <= 0x1CF3: UIPC = Right
+		if 0x1CF8 <= U <= 0x1CF9: UIPC = Top
+		# https://github.com/roozbehp/unicode-data/issues/8
+		if U == 0x0A51: UIPC = Bottom
+
+		assert (UIPC in [Not_Applicable, Visual_Order_Left] or
+			USE in use_positions), "%s %s %s %s %s" % (hex(U), UIPC, USE, UISC, UGC)
+
+		pos_mapping = use_positions.get(USE, None)
+		if pos_mapping:
+			values = [k for k,v in pos_mapping.items() if v and UIPC in v]
+			assert len(values) == 1, "%s %s %s %s %s %s" % (hex(U), UIPC, USE, UISC, UGC, values)
+			USE = USE + values[0]
+
+		out[U] = (USE, UBlock)
+	return out
+
+defaults = ('O', 'No_Block')
+data = map_to_use(data)
+
+print ("/* == Start of generated table == */")
+print ("/*")
+print (" * The following table is generated by running:")
+print (" *")
+print (" *   ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.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 ()
+print ('#include "hb-ot-shape-complex-use.hh"')
+print ()
+
+total = 0
+used = 0
+last_block = None
+def print_block (block, start, end, data):
+	global total, used, last_block
+	if block and block != last_block:
+		print ()
+		print ()
+		print ("  /* %s */" % block)
+		if start % 16:
+			print (' ' * (20 + (start % 16 * 6)), end='')
+	num = 0
+	assert start % 8 == 0
+	assert (end+1) % 8 == 0
+	for u in range (start, end+1):
+		if u % 16 == 0:
+			print ()
+			print ("  /* %04X */" % u, end='')
+		if u in data:
+			num += 1
+		d = data.get (u, defaults)
+		print ("%6s," % d[0], end='')
+
+	total += end - start + 1
+	used += num
+	if block:
+		last_block = block
+
+uu = sorted (data.keys ())
+
+last = -100000
+num = 0
+offset = 0
+starts = []
+ends = []
+print ('#pragma GCC diagnostic push')
+print ('#pragma GCC diagnostic ignored "-Wunused-macros"')
+for k,v in sorted(use_mapping.items()):
+	if k in use_positions and use_positions[k]: continue
+	print ("#define %s	USE_%s	/* %s */" % (k, k, v.__name__[3:]))
+for k,v in sorted(use_positions.items()):
+	if not v: continue
+	for suf in v.keys():
+		tag = k + suf
+		print ("#define %s	USE_%s" % (tag, tag))
+print ('#pragma GCC diagnostic pop')
+print ("")
+print ("static const USE_TABLE_ELEMENT_TYPE use_table[] = {")
+for u in uu:
+	if u <= last:
+		continue
+	block = data[u][1]
+
+	start = u//8*8
+	end = start+1
+	while end in uu and block == data[end][1]:
+		end += 1
+	end = (end-1)//8*8 + 7
+
+	if start != last + 1:
+		if start - last <= 1+16*3:
+			print_block (None, last+1, start-1, data)
+			last = start-1
+		else:
+			if last >= 0:
+				ends.append (last + 1)
+				offset += ends[-1] - starts[-1]
+			print ()
+			print ()
+			print ("#define use_offset_0x%04xu %d" % (start, offset))
+			starts.append (start)
+
+	print_block (block, start, end, data)
+	last = end
+ends.append (last + 1)
+offset += ends[-1] - starts[-1]
+print ()
+print ()
+occupancy = used * 100. / total
+page_bits = 12
+print ("}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy))
+print ()
+print ("USE_TABLE_ELEMENT_TYPE")
+print ("hb_use_get_category (hb_codepoint_t u)")
+print ("{")
+print ("  switch (u >> %d)" % page_bits)
+print ("  {")
+pages = set([u>>page_bits for u in starts+ends])
+for p in sorted(pages):
+	print ("    case 0x%0Xu:" % p)
+	for (start,end) in zip (starts, ends):
+		if p not in [start>>page_bits, end>>page_bits]: continue
+		offset = "use_offset_0x%04xu" % start
+		print ("      if (hb_in_range<hb_codepoint_t> (u, 0x%04Xu, 0x%04Xu)) return use_table[u - 0x%04Xu + %s];" % (start, end-1, start, offset))
+	print ("      break;")
+	print ("")
+print ("    default:")
+print ("      break;")
+print ("  }")
+print ("  return USE_O;")
+print ("}")
+print ()
+for k in sorted(use_mapping.keys()):
+	if k in use_positions and use_positions[k]: continue
+	print ("#undef %s" % k)
+for k,v in sorted(use_positions.items()):
+	if not v: continue
+	for suf in v.keys():
+		tag = k + suf
+		print ("#undef %s" % tag)
+print ()
+print ("/* == End of generated table == */")
+
+# Maintain at least 50% occupancy in the table */
+if occupancy < 50:
+	raise Exception ("Table too sparse, please investigate: ", occupancy)
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-vowel-constraints.py b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-vowel-constraints.py
new file mode 100755
index 0000000..b7f6be2
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/gen-vowel-constraints.py
@@ -0,0 +1,219 @@
+#!/usr/bin/python
+
+"""Generator of the function to prohibit certain vowel sequences.
+
+It creates ``_hb_preprocess_text_vowel_constraints``, which inserts dotted
+circles into sequences prohibited by the USE script development spec.
+This function should be used as the ``preprocess_text`` of an
+``hb_ot_complex_shaper_t``.
+"""
+
+from __future__ import absolute_import, division, print_function, unicode_literals
+
+import collections
+try:
+	from HTMLParser import HTMLParser
+	def write (s):
+		print (s.encode ('utf-8'), end='')
+except ImportError:
+	from html.parser import HTMLParser
+	def write (s):
+		sys.stdout.flush ()
+		sys.stdout.buffer.write (s.encode ('utf-8'))
+import itertools
+import io
+import sys
+
+if len (sys.argv) != 3:
+	print ('usage: ./gen-vowel-constraints.py HBIndicVowelConstraints.txt Scripts.txt', file=sys.stderr)
+	sys.exit (1)
+
+with io.open (sys.argv[2], encoding='utf-8') as f:
+	scripts_header = [f.readline () for i in range (2)]
+	scripts = {}
+	script_order = {}
+	for line in f:
+		j = line.find ('#')
+		if j >= 0:
+			line = line[:j]
+		fields = [x.strip () for x in line.split (';')]
+		if len (fields) == 1:
+			continue
+		uu = fields[0].split ('..')
+		start = int (uu[0], 16)
+		if len (uu) == 1:
+			end = start
+		else:
+			end = int (uu[1], 16)
+		script = fields[1]
+		for u in range (start, end + 1):
+			scripts[u] = script
+		if script not in script_order:
+			script_order[script] = start
+
+class ConstraintSet (object):
+	"""A set of prohibited code point sequences.
+
+	Args:
+		constraint (List[int]): A prohibited code point sequence.
+
+	"""
+	def __init__ (self, constraint):
+		# Either a list or a dictionary. As a list of code points, it
+		# represents a prohibited code point sequence. As a dictionary,
+		# it represents a set of prohibited sequences, where each item
+		# represents the set of prohibited sequences starting with the
+		# key (a code point) concatenated with any of the values
+		# (ConstraintSets).
+		self._c = constraint
+
+	def add (self, constraint):
+		"""Add a constraint to this set."""
+		if not constraint:
+			return
+		first = constraint[0]
+		rest = constraint[1:]
+		if isinstance (self._c, list):
+			if constraint == self._c[:len (constraint)]:
+				self._c = constraint
+			elif self._c != constraint[:len (self._c)]:
+				self._c = {self._c[0]: ConstraintSet (self._c[1:])}
+		if isinstance (self._c, dict):
+			if first in self._c:
+				self._c[first].add (rest)
+			else:
+				self._c[first] = ConstraintSet (rest)
+
+	def _indent (self, depth):
+		return ('  ' * depth).replace ('        ', '\t')
+
+	def __str__ (self, index=0, depth=4):
+		s = []
+		indent = self._indent (depth)
+		if isinstance (self._c, list):
+			if len (self._c) == 0:
+				s.append ('{}matched = true;\n'.format (indent))
+			elif len (self._c) == 1:
+				s.append ('{}matched = 0x{:04X}u == buffer->cur ({}).codepoint;\n'.format (indent, next (iter (self._c)), index or ''))
+			else:
+				s.append ('{}if (0x{:04X}u == buffer->cur ({}).codepoint &&\n'.format (indent, self._c[0], index))
+				s.append ('{}buffer->idx + {} < count &&\n'.format (self._indent (depth + 2), len (self._c)))
+				for i, cp in enumerate (self._c[1:], start=1):
+					s.append ('{}0x{:04X}u == buffer->cur ({}).codepoint{}\n'.format (
+						self._indent (depth + 2), cp, index + i, ')' if i == len (self._c) - 1 else ' &&'))
+				s.append ('{}{{\n'.format (indent))
+				for i in range (len (self._c)):
+					s.append ('{}buffer->next_glyph ();\n'.format (self._indent (depth + 1)))
+				s.append ('{}_output_dotted_circle (buffer);\n'.format (self._indent (depth + 1)))
+				s.append ('{}}}\n'.format (indent))
+		else:
+			s.append ('{}switch (buffer->cur ({}).codepoint)\n'.format(indent, index or ''))
+			s.append ('{}{{\n'.format (indent))
+			cases = collections.defaultdict (set)
+			for first, rest in sorted (self._c.items ()):
+				cases[rest.__str__ (index + 1, depth + 2)].add (first)
+			for body, labels in sorted (cases.items (), key=lambda b_ls: sorted (b_ls[1])[0]):
+				for i, cp in enumerate (sorted (labels)):
+					if i % 4 == 0:
+						s.append (self._indent (depth + 1))
+					else:
+						s.append (' ')
+					s.append ('case 0x{:04X}u:{}'.format (cp, '\n' if i % 4 == 3 else ''))
+				if len (labels) % 4 != 0:
+					s.append ('\n')
+				s.append (body)
+				s.append ('{}break;\n'.format (self._indent (depth + 2)))
+			s.append ('{}}}\n'.format (indent))
+		return ''.join (s)
+
+constraints = {}
+with io.open (sys.argv[1], encoding='utf-8') as f:
+	constraints_header = [f.readline ().strip () for i in range (2)]
+	for line in f:
+		j = line.find ('#')
+		if j >= 0:
+			line = line[:j]
+		constraint = [int (cp, 16) for cp in line.split (';')[0].split ()]
+		if not constraint: continue
+		assert 2 <= len (constraint), 'Prohibited sequence is too short: {}'.format (constraint)
+		script = scripts[constraint[0]]
+		if script in constraints:
+			constraints[script].add (constraint)
+		else:
+			constraints[script] = ConstraintSet (constraint)
+		assert constraints, 'No constraints found'
+
+print ('/* == Start of generated functions == */')
+print ('/*')
+print (' * The following functions are generated by running:')
+print (' *')
+print (' *   %s use Scripts.txt' % sys.argv[0])
+print (' *')
+print (' * on files with these headers:')
+print (' *')
+for line in constraints_header:
+	print (' * %s' % line.strip ())
+print (' *')
+for line in scripts_header:
+	print (' * %s' % line.strip ())
+print (' */')
+print ()
+print ('#include "hb-ot-shape-complex-vowel-constraints.hh"')
+print ()
+print ('static void')
+print ('_output_dotted_circle (hb_buffer_t *buffer)')
+print ('{')
+print ('  hb_glyph_info_t &dottedcircle = buffer->output_glyph (0x25CCu);')
+print ('  _hb_glyph_info_reset_continuation (&dottedcircle);')
+print ('}')
+print ()
+print ('static void')
+print ('_output_with_dotted_circle (hb_buffer_t *buffer)')
+print ('{')
+print ('  _output_dotted_circle (buffer);')
+print ('  buffer->next_glyph ();')
+print ('}')
+print ()
+
+print ('void')
+print ('_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,')
+print ('\t\t\t\t       hb_buffer_t              *buffer,')
+print ('\t\t\t\t       hb_font_t                *font HB_UNUSED)')
+print ('{')
+print ('  /* UGLY UGLY UGLY business of adding dotted-circle in the middle of')
+print ('   * vowel-sequences that look like another vowel.  Data for each script')
+print ('   * collected from the USE script development spec.')
+print ('   *')
+print ('   * https://github.com/harfbuzz/harfbuzz/issues/1019')
+print ('   */')
+print ('  bool processed = false;')
+print ('  buffer->clear_output ();')
+print ('  unsigned int count = buffer->len;')
+print ('  switch ((unsigned) buffer->props.script)')
+print ('  {')
+
+for script, constraints in sorted (constraints.items (), key=lambda s_c: script_order[s_c[0]]):
+	print ('    case HB_SCRIPT_{}:'.format (script.upper ()))
+	print ('      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)')
+	print ('      {')
+	print ('\tbool matched = false;')
+	write (str (constraints))
+	print ('\tbuffer->next_glyph ();')
+	print ('\tif (matched) _output_with_dotted_circle (buffer);')
+	print ('      }')
+	print ('      processed = true;')
+	print ('      break;')
+	print ()
+
+print ('    default:')
+print ('      break;')
+print ('  }')
+print ('  if (processed)')
+print ('  {')
+print ('    if (buffer->idx < count)')
+print ('      buffer->next_glyph ();')
+print ('  }')
+print ('}')
+
+print ()
+print ('/* == End of generated functions == */')
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz-config.cmake.in b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz-config.cmake.in
new file mode 100644
index 0000000..304410d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz-config.cmake.in
@@ -0,0 +1,86 @@
+# Set these variables so that the `${prefix}/lib` expands to something we can
+# remove.
+set(_harfbuzz_remove_string "REMOVE_ME")
+set(exec_prefix "${_harfbuzz_remove_string}")
+set(prefix "${_harfbuzz_remove_string}")
+
+# Compute the installation prefix by stripping components from our current
+# location.
+get_filename_component(_harfbuzz_prefix "${CMAKE_CURRENT_LIST_DIR}" DIRECTORY)
+get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY)
+set(_harfbuzz_libdir "@libdir@")
+string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_libdir "${_harfbuzz_libdir}")
+set(_harfbuzz_libdir_iter "${_harfbuzz_libdir}")
+while (_harfbuzz_libdir_iter)
+  set(_harfbuzz_libdir_prev_iter "${_harfbuzz_libdir_iter}")
+  get_filename_component(_harfbuzz_libdir_iter "${_harfbuzz_libdir_iter}" DIRECTORY)
+  if (_harfbuzz_libdir_prev_iter STREQUAL _harfbuzz_libdir_iter)
+    break()
+  endif ()
+  get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY)
+endwhile ()
+unset(_harfbuzz_libdir_iter)
+
+# Get the include subdir.
+set(_harfbuzz_includedir "@includedir@")
+string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_includedir "${_harfbuzz_includedir}")
+
+# Extract version information from libtool.
+set(_harfbuzz_version_info "@HB_LIBTOOL_VERSION_INFO@")
+string(REPLACE ":" ";" _harfbuzz_version_info "${_harfbuzz_version_info}")
+list(GET _harfbuzz_version_info 0
+  _harfbuzz_current)
+list(GET _harfbuzz_version_info 1
+  _harfbuzz_revision)
+list(GET _harfbuzz_version_info 2
+  _harfbuzz_age)
+unset(_harfbuzz_version_info)
+
+if (APPLE)
+  set(_harfbuzz_lib_suffix ".0${CMAKE_SHARED_LIBRARY_SUFFIX}")
+elseif (UNIX)
+  set(_harfbuzz_lib_suffix "${CMAKE_SHARED_LIBRARY_SUFFIX}.0.${_harfbuzz_current}.${_harfbuzz_revision}")
+else ()
+  # Unsupported.
+  set(harfbuzz_FOUND 0)
+endif ()
+
+# Add the libraries.
+add_library(harfbuzz::harfbuzz SHARED IMPORTED)
+set_target_properties(harfbuzz::harfbuzz PROPERTIES
+  INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+  IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz${_harfbuzz_lib_suffix}")
+
+add_library(harfbuzz::icu SHARED IMPORTED)
+set_target_properties(harfbuzz::icu PROPERTIES
+  INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+  INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
+  IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-icu${_harfbuzz_lib_suffix}")
+
+add_library(harfbuzz::subset SHARED IMPORTED)
+set_target_properties(harfbuzz::subset PROPERTIES
+  INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+  INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
+  IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-subset${_harfbuzz_lib_suffix}")
+
+# Only add the gobject library if it was built.
+set(_harfbuzz_have_gobject "@have_gobject@")
+if (_harfbuzz_have_gobject)
+  add_library(harfbuzz::gobject SHARED IMPORTED)
+  set_target_properties(harfbuzz::gobject PROPERTIES
+    INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+    INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
+    IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-gobject${_harfbuzz_lib_suffix}")
+endif ()
+
+# Clean out variables we used in our scope.
+unset(_harfbuzz_lib_suffix)
+unset(_harfbuzz_current)
+unset(_harfbuzz_revision)
+unset(_harfbuzz_age)
+unset(_harfbuzz_includedir)
+unset(_harfbuzz_libdir)
+unset(_harfbuzz_prefix)
+unset(exec_prefix)
+unset(prefix)
+unset(_harfbuzz_remove_string)
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz-gobject.pc.in b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz-gobject.pc.in
new file mode 100644
index 0000000..7008360
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz-gobject.pc.in
@@ -0,0 +1,12 @@
+prefix=%prefix%
+exec_prefix=%exec_prefix%
+libdir=%libdir%
+includedir=%includedir%
+
+Name: harfbuzz
+Description: HarfBuzz text shaping library GObject integration
+Version: %VERSION%
+
+Requires: harfbuzz gobject-2.0 glib-2.0
+Libs: -L${libdir} -lharfbuzz-gobject
+Cflags: -I${includedir}/harfbuzz
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz-icu.pc.in b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz-icu.pc.in
new file mode 100644
index 0000000..949869a
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz-icu.pc.in
@@ -0,0 +1,13 @@
+prefix=%prefix%
+exec_prefix=%exec_prefix%
+libdir=%libdir%
+includedir=%includedir%
+
+Name: harfbuzz
+Description: HarfBuzz text shaping library ICU integration
+Version: %VERSION%
+
+Requires: harfbuzz
+Requires.private: icu-uc
+Libs: -L${libdir} -lharfbuzz-icu
+Cflags: -I${includedir}/harfbuzz
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz-subset.pc.in b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz-subset.pc.in
new file mode 100644
index 0000000..5da64b3
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz-subset.pc.in
@@ -0,0 +1,12 @@
+prefix=%prefix%
+exec_prefix=%exec_prefix%
+libdir=%libdir%
+includedir=%includedir%
+
+Name: harfbuzz
+Description: HarfBuzz font subsetter
+Version: %VERSION%
+
+Requires: harfbuzz
+Libs: -L${libdir} -lharfbuzz-subset
+Cflags: -I${includedir}/harfbuzz
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz.pc.in b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz.pc.in
new file mode 100644
index 0000000..661251c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/harfbuzz.pc.in
@@ -0,0 +1,13 @@
+prefix=%prefix%
+exec_prefix=%exec_prefix%
+libdir=%libdir%
+includedir=%includedir%
+
+Name: harfbuzz
+Description: HarfBuzz text shaping library
+Version: %VERSION%
+
+Libs: -L${libdir} -lharfbuzz
+Libs.private: -lm %libs_private%
+Requires.private: %requires_private%
+Cflags: -I${includedir}/harfbuzz
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-fdsc-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-fdsc-table.hh
new file mode 100644
index 0000000..1188e35
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-fdsc-table.hh
@@ -0,0 +1,126 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_AAT_FDSC_TABLE_HH
+#define HB_AAT_FDSC_TABLE_HH
+
+#include "hb-aat-layout-common.hh"
+#include "hb-open-type.hh"
+
+/*
+ * fdsc -- Font descriptors
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6fdsc.html
+ */
+#define HB_AAT_TAG_fdsc HB_TAG('f','d','s','c')
+
+
+namespace AAT {
+
+
+struct FontDescriptor
+{
+  bool has_data () const { return tag; }
+
+  int cmp (hb_tag_t a) const { return tag.cmp (a); }
+
+  float get_value () const { return u.value.to_float (); }
+
+  enum non_alphabetic_value_t {
+    Alphabetic		= 0,
+    Dingbats		= 1,
+    PiCharacters	= 2,
+    Fleurons		= 3,
+    DecorativeBorders	= 4,
+    InternationalSymbols= 5,
+    MathSymbols		= 6
+  };
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  Tag		tag;		/* The 4-byte table tag name. */
+  union {
+  Fixed		value;		/* The value for the descriptor tag. */
+  HBUINT32	nalfType;	/* If the tag is `nalf`, see non_alphabetic_value_t */
+  } u;
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct fdsc
+{
+  static constexpr hb_tag_t tableTag = HB_AAT_TAG_fdsc;
+
+  enum {
+    Weight	 = HB_TAG ('w','g','h','t'),
+				/* Percent weight relative to regular weight.
+				 * (defaul value: 1.0) */
+    Width 	 = HB_TAG ('w','d','t','h'),
+				/* Percent width relative to regular width.
+				 * (default value: 1.0) */
+    Slant 	 = HB_TAG ('s','l','n','t'),
+				/* Angle of slant in degrees, where positive
+				 * is clockwise from straight up.
+				 * (default value: 0.0) */
+    OpticalSize  = HB_TAG ('o','p','s','z'),
+				/* Point size the font was designed for.
+				 * (default value: 12.0) */
+    NonAlphabetic= HB_TAG ('n','a','l','f')
+				/* These values are treated as integers,
+				 * not fixed32s. 0 means alphabetic, and greater
+				 * integers mean the font is non-alphabetic (e.g. symbols).
+				 * (default value: 0) */
+  };
+
+  const FontDescriptor &get_descriptor (hb_tag_t style) const
+  { return descriptors.lsearch (style); }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  descriptors.sanitize (c));
+  }
+
+  protected:
+  Fixed		version;	/* Version number of the font descriptors
+				 * table (0x00010000 for the current version). */
+  LArrayOf<FontDescriptor>
+		descriptors;	/* List of tagged-coordinate pairs style descriptors
+				 * that will be included to characterize this font.
+				 * Each descriptor consists of a <tag, value> pair.
+				 * These pairs are located in the gxFontDescriptor
+				 * array that follows. */
+  public:
+  DEFINE_SIZE_ARRAY (8, descriptors);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_FDSC_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-ankr-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-ankr-table.hh
new file mode 100644
index 0000000..236e4aa
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-ankr-table.hh
@@ -0,0 +1,97 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_AAT_LAYOUT_ANKR_TABLE_HH
+#define HB_AAT_LAYOUT_ANKR_TABLE_HH
+
+#include "hb-aat-layout-common.hh"
+
+/*
+ * ankr -- Anchor Point
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6ankr.html
+ */
+#define HB_AAT_TAG_ankr HB_TAG('a','n','k','r')
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+struct Anchor
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  FWORD		xCoordinate;
+  FWORD		yCoordinate;
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+typedef LArrayOf<Anchor> GlyphAnchors;
+
+struct ankr
+{
+  static constexpr hb_tag_t tableTag = HB_AAT_TAG_ankr;
+
+  const Anchor &get_anchor (hb_codepoint_t glyph_id,
+			    unsigned int i,
+			    unsigned int num_glyphs) const
+  {
+    const NNOffsetTo<GlyphAnchors> *offset = (this+lookupTable).get_value (glyph_id, num_glyphs);
+    if (!offset)
+      return Null(Anchor);
+    const GlyphAnchors &anchors = &(this+anchorData) + *offset;
+    return anchors[i];
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  version == 0 &&
+			  lookupTable.sanitize (c, this, &(this+anchorData))));
+  }
+
+  protected:
+  HBUINT16	version; 	/* Version number (set to zero) */
+  HBUINT16	flags;		/* Flags (currently unused; set to zero) */
+  LOffsetTo<Lookup<NNOffsetTo<GlyphAnchors> > >
+		lookupTable;	/* Offset to the table's lookup table */
+  LNNOffsetTo<HBUINT8>
+		anchorData;	/* Offset to the glyph data table */
+
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_ANKR_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-bsln-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-bsln-table.hh
new file mode 100644
index 0000000..9139d281
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-bsln-table.hh
@@ -0,0 +1,158 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_AAT_LAYOUT_BSLN_TABLE_HH
+#define HB_AAT_LAYOUT_BSLN_TABLE_HH
+
+#include "hb-aat-layout-common.hh"
+
+/*
+ * bsln -- Baseline
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bsln.html
+ */
+#define HB_AAT_TAG_bsln HB_TAG('b','s','l','n')
+
+
+namespace AAT {
+
+
+struct BaselineTableFormat0Part
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  // Roman, Ideographic centered, Ideographic low, Hanging and Math
+  // are the default defined ones, but any other maybe accessed also.
+  HBINT16	deltas[32];	/* These are the FUnit distance deltas from
+				 * the font's natural baseline to the other
+				 * baselines used in the font. */
+  public:
+  DEFINE_SIZE_STATIC (64);
+};
+
+struct BaselineTableFormat1Part
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  lookupTable.sanitize (c)));
+  }
+
+  protected:
+  HBINT16	deltas[32];	/* ditto */
+  Lookup<HBUINT16>
+		lookupTable;	/* Lookup table that maps glyphs to their
+				 * baseline values. */
+  public:
+  DEFINE_SIZE_MIN (66);
+};
+
+struct BaselineTableFormat2Part
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  GlyphID	stdGlyph;	/* The specific glyph index number in this
+				 * font that is used to set the baseline values.
+				 * This is the standard glyph.
+				 * This glyph must contain a set of control points
+				 * (whose numbers are contained in the ctlPoints field)
+				 * that are used to determine baseline distances. */
+  HBUINT16	ctlPoints[32];	/* Set of control point numbers,
+				 * associated with the standard glyph.
+				 * A value of 0xFFFF means there is no corresponding
+				 * control point in the standard glyph. */
+  public:
+  DEFINE_SIZE_STATIC (66);
+};
+
+struct BaselineTableFormat3Part
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && lookupTable.sanitize (c));
+  }
+
+  protected:
+  GlyphID	stdGlyph;	/* ditto */
+  HBUINT16	ctlPoints[32];	/* ditto */
+  Lookup<HBUINT16>
+		lookupTable;	/* Lookup table that maps glyphs to their
+				 * baseline values. */
+  public:
+  DEFINE_SIZE_MIN (68);
+};
+
+struct bsln
+{
+  static constexpr hb_tag_t tableTag = HB_AAT_TAG_bsln;
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!(c->check_struct (this) && defaultBaseline < 32)))
+      return_trace (false);
+
+    switch (format)
+    {
+    case 0: return_trace (parts.format0.sanitize (c));
+    case 1: return_trace (parts.format1.sanitize (c));
+    case 2: return_trace (parts.format2.sanitize (c));
+    case 3: return_trace (parts.format3.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  protected:
+  FixedVersion<>version;	/* Version number of the Baseline table. */
+  HBUINT16	format;		/* Format of the baseline table. Only one baseline
+				 * format may be selected for the font. */
+  HBUINT16	defaultBaseline;/* Default baseline value for all glyphs.
+				 * This value can be from 0 through 31. */
+  union {
+  // Distance-Based Formats
+  BaselineTableFormat0Part	format0;
+  BaselineTableFormat1Part	format1;
+  // Control Point-based Formats
+  BaselineTableFormat2Part	format2;
+  BaselineTableFormat3Part	format3;
+  } parts;
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_BSLN_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-common.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-common.hh
new file mode 100644
index 0000000..27ade28
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-common.hh
@@ -0,0 +1,845 @@
+/*
+ * Copyright © 2017  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_AAT_LAYOUT_COMMON_HH
+#define HB_AAT_LAYOUT_COMMON_HH
+
+#include "hb-aat-layout.hh"
+#include "hb-open-type.hh"
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+/*
+ * Lookup Table
+ */
+
+template <typename T> struct Lookup;
+
+template <typename T>
+struct LookupFormat0
+{
+  friend struct Lookup<T>;
+
+  private:
+  const T* get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+  {
+    if (unlikely (glyph_id >= num_glyphs)) return nullptr;
+    return &arrayZ[glyph_id];
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (arrayZ.sanitize (c, c->get_num_glyphs ()));
+  }
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (arrayZ.sanitize (c, c->get_num_glyphs (), base));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 0 */
+  UnsizedArrayOf<T>
+		arrayZ;		/* Array of lookup values, indexed by glyph index. */
+  public:
+  DEFINE_SIZE_UNBOUNDED (2);
+};
+
+
+template <typename T>
+struct LookupSegmentSingle
+{
+  static constexpr unsigned TerminationWordCount = 2u;
+
+  int cmp (hb_codepoint_t g) const
+  { return g < first ? -1 : g <= last ? 0 : +1 ; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && value.sanitize (c));
+  }
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && value.sanitize (c, base));
+  }
+
+  GlyphID	last;		/* Last GlyphID in this segment */
+  GlyphID	first;		/* First GlyphID in this segment */
+  T		value;		/* The lookup value (only one) */
+  public:
+  DEFINE_SIZE_STATIC (4 + T::static_size);
+};
+
+template <typename T>
+struct LookupFormat2
+{
+  friend struct Lookup<T>;
+
+  private:
+  const T* get_value (hb_codepoint_t glyph_id) const
+  {
+    const LookupSegmentSingle<T> *v = segments.bsearch (glyph_id);
+    return v ? &v->value : nullptr;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (segments.sanitize (c));
+  }
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (segments.sanitize (c, base));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 2 */
+  VarSizedBinSearchArrayOf<LookupSegmentSingle<T> >
+		segments;	/* The actual segments. These must already be sorted,
+				 * according to the first word in each one (the last
+				 * glyph in each segment). */
+  public:
+  DEFINE_SIZE_ARRAY (8, segments);
+};
+
+template <typename T>
+struct LookupSegmentArray
+{
+  static constexpr unsigned TerminationWordCount = 2u;
+
+  const T* get_value (hb_codepoint_t glyph_id, const void *base) const
+  {
+    return first <= glyph_id && glyph_id <= last ? &(base+valuesZ)[glyph_id - first] : nullptr;
+  }
+
+  int cmp (hb_codepoint_t g) const
+  { return g < first ? -1 : g <= last ? 0 : +1; }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  first <= last &&
+		  valuesZ.sanitize (c, base, last - first + 1));
+  }
+  template <typename T2>
+  bool sanitize (hb_sanitize_context_t *c, const void *base, T2 user_data) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  first <= last &&
+		  valuesZ.sanitize (c, base, last - first + 1, user_data));
+  }
+
+  GlyphID	last;		/* Last GlyphID in this segment */
+  GlyphID	first;		/* First GlyphID in this segment */
+  NNOffsetTo<UnsizedArrayOf<T> >
+		valuesZ;	/* A 16-bit offset from the start of
+				 * the table to the data. */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+template <typename T>
+struct LookupFormat4
+{
+  friend struct Lookup<T>;
+
+  private:
+  const T* get_value (hb_codepoint_t glyph_id) const
+  {
+    const LookupSegmentArray<T> *v = segments.bsearch (glyph_id);
+    return v ? v->get_value (glyph_id, this) : nullptr;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (segments.sanitize (c, this));
+  }
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (segments.sanitize (c, this, base));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 4 */
+  VarSizedBinSearchArrayOf<LookupSegmentArray<T> >
+		segments;	/* The actual segments. These must already be sorted,
+				 * according to the first word in each one (the last
+				 * glyph in each segment). */
+  public:
+  DEFINE_SIZE_ARRAY (8, segments);
+};
+
+template <typename T>
+struct LookupSingle
+{
+  static constexpr unsigned TerminationWordCount = 1u;
+
+  int cmp (hb_codepoint_t g) const { return glyph.cmp (g); }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && value.sanitize (c));
+  }
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && value.sanitize (c, base));
+  }
+
+  GlyphID	glyph;		/* Last GlyphID */
+  T		value;		/* The lookup value (only one) */
+  public:
+  DEFINE_SIZE_STATIC (2 + T::static_size);
+};
+
+template <typename T>
+struct LookupFormat6
+{
+  friend struct Lookup<T>;
+
+  private:
+  const T* get_value (hb_codepoint_t glyph_id) const
+  {
+    const LookupSingle<T> *v = entries.bsearch (glyph_id);
+    return v ? &v->value : nullptr;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (entries.sanitize (c));
+  }
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (entries.sanitize (c, base));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 6 */
+  VarSizedBinSearchArrayOf<LookupSingle<T> >
+		entries;	/* The actual entries, sorted by glyph index. */
+  public:
+  DEFINE_SIZE_ARRAY (8, entries);
+};
+
+template <typename T>
+struct LookupFormat8
+{
+  friend struct Lookup<T>;
+
+  private:
+  const T* get_value (hb_codepoint_t glyph_id) const
+  {
+    return firstGlyph <= glyph_id && glyph_id - firstGlyph < glyphCount ?
+	   &valueArrayZ[glyph_id - firstGlyph] : nullptr;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && valueArrayZ.sanitize (c, glyphCount));
+  }
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && valueArrayZ.sanitize (c, glyphCount, base));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 8 */
+  GlyphID	firstGlyph;	/* First glyph index included in the trimmed array. */
+  HBUINT16	glyphCount;	/* Total number of glyphs (equivalent to the last
+				 * glyph minus the value of firstGlyph plus 1). */
+  UnsizedArrayOf<T>
+		valueArrayZ;	/* The lookup values (indexed by the glyph index
+				 * minus the value of firstGlyph). */
+  public:
+  DEFINE_SIZE_ARRAY (6, valueArrayZ);
+};
+
+template <typename T>
+struct LookupFormat10
+{
+  friend struct Lookup<T>;
+
+  private:
+  const typename T::type get_value_or_null (hb_codepoint_t glyph_id) const
+  {
+    if (!(firstGlyph <= glyph_id && glyph_id - firstGlyph < glyphCount))
+      return Null(T);
+
+    const HBUINT8 *p = &valueArrayZ[(glyph_id - firstGlyph) * valueSize];
+
+    unsigned int v = 0;
+    unsigned int count = valueSize;
+    for (unsigned int i = 0; i < count; i++)
+      v = (v << 8) | *p++;
+
+    return v;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  valueSize <= 4 &&
+		  valueArrayZ.sanitize (c, glyphCount * valueSize));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 8 */
+  HBUINT16	valueSize;	/* Byte size of each value. */
+  GlyphID	firstGlyph;	/* First glyph index included in the trimmed array. */
+  HBUINT16	glyphCount;	/* Total number of glyphs (equivalent to the last
+				 * glyph minus the value of firstGlyph plus 1). */
+  UnsizedArrayOf<HBUINT8>
+		valueArrayZ;	/* The lookup values (indexed by the glyph index
+				 * minus the value of firstGlyph). */
+  public:
+  DEFINE_SIZE_ARRAY (8, valueArrayZ);
+};
+
+template <typename T>
+struct Lookup
+{
+  const T* get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+  {
+    switch (u.format) {
+    case 0: return u.format0.get_value (glyph_id, num_glyphs);
+    case 2: return u.format2.get_value (glyph_id);
+    case 4: return u.format4.get_value (glyph_id);
+    case 6: return u.format6.get_value (glyph_id);
+    case 8: return u.format8.get_value (glyph_id);
+    default:return nullptr;
+    }
+  }
+
+  const typename T::type get_value_or_null (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+  {
+    switch (u.format) {
+      /* Format 10 cannot return a pointer. */
+      case 10: return u.format10.get_value_or_null (glyph_id);
+      default:
+      const T *v = get_value (glyph_id, num_glyphs);
+      return v ? *v : Null(T);
+    }
+  }
+
+  typename T::type get_class (hb_codepoint_t glyph_id,
+			      unsigned int num_glyphs,
+			      unsigned int outOfRange) const
+  {
+    const T *v = get_value (glyph_id, num_glyphs);
+    return v ? *v : outOfRange;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format) {
+    case 0: return_trace (u.format0.sanitize (c));
+    case 2: return_trace (u.format2.sanitize (c));
+    case 4: return_trace (u.format4.sanitize (c));
+    case 6: return_trace (u.format6.sanitize (c));
+    case 8: return_trace (u.format8.sanitize (c));
+    case 10: return_trace (u.format10.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format) {
+    case 0: return_trace (u.format0.sanitize (c, base));
+    case 2: return_trace (u.format2.sanitize (c, base));
+    case 4: return_trace (u.format4.sanitize (c, base));
+    case 6: return_trace (u.format6.sanitize (c, base));
+    case 8: return_trace (u.format8.sanitize (c, base));
+    case 10: return_trace (false); /* We don't support format10 here currently. */
+    default:return_trace (true);
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  LookupFormat0<T>	format0;
+  LookupFormat2<T>	format2;
+  LookupFormat4<T>	format4;
+  LookupFormat6<T>	format6;
+  LookupFormat8<T>	format8;
+  LookupFormat10<T>	format10;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+/* Lookup 0 has unbounded size (dependant on num_glyphs).  So we need to defined
+ * special NULL objects for Lookup<> objects, but since it's template our macros
+ * don't work.  So we have to hand-code them here.  UGLY. */
+} /* Close namespace. */
+/* Ugly hand-coded null objects for template Lookup<> :(. */
+extern HB_INTERNAL const unsigned char _hb_Null_AAT_Lookup[2];
+template <>
+/*static*/ inline const AAT::Lookup<OT::HBUINT16>& Null<AAT::Lookup<OT::HBUINT16> > ()
+{ return *reinterpret_cast<const AAT::Lookup<OT::HBUINT16> *> (_hb_Null_AAT_Lookup); }
+template <>
+/*static*/ inline const AAT::Lookup<OT::HBUINT32>& Null<AAT::Lookup<OT::HBUINT32> > ()
+{ return *reinterpret_cast<const AAT::Lookup<OT::HBUINT32> *> (_hb_Null_AAT_Lookup); }
+template <>
+/*static*/ inline const AAT::Lookup<OT::Offset<OT::HBUINT16, false> >& Null<AAT::Lookup<OT::Offset<OT::HBUINT16, false> > > ()
+{ return *reinterpret_cast<const AAT::Lookup<OT::Offset<OT::HBUINT16, false> > *> (_hb_Null_AAT_Lookup); }
+namespace AAT {
+
+enum { DELETED_GLYPH = 0xFFFF };
+
+/*
+ * (Extended) State Table
+ */
+
+template <typename T>
+struct Entry
+{
+  bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    /* Note, we don't recurse-sanitize data because we don't access it.
+     * That said, in our DEFINE_SIZE_STATIC we access T::static_size,
+     * which ensures that data has a simple sanitize(). To be determined
+     * if I need to remove that as well.
+     *
+     * HOWEVER! Because we are a template, our DEFINE_SIZE_STATIC
+     * assertion wouldn't be checked, hence the line below. */
+    static_assert (T::static_size, "");
+
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT16	newState;	/* Byte offset from beginning of state table
+				 * to the new state. Really?!?! Or just state
+				 * number?  The latter in morx for sure. */
+  HBUINT16	flags;		/* Table specific. */
+  T		data;		/* Optional offsets to per-glyph tables. */
+  public:
+  DEFINE_SIZE_STATIC (4 + T::static_size);
+};
+
+template <>
+struct Entry<void>
+{
+  bool sanitize (hb_sanitize_context_t *c, unsigned int count /*XXX Unused?*/) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT16	newState;	/* Byte offset from beginning of state table to the new state. */
+  HBUINT16	flags;		/* Table specific. */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+template <typename Types, typename Extra>
+struct StateTable
+{
+  typedef typename Types::HBUINT HBUINT;
+  typedef typename Types::HBUSHORT HBUSHORT;
+  typedef typename Types::ClassTypeNarrow ClassType;
+
+  enum State
+  {
+    STATE_START_OF_TEXT = 0,
+    STATE_START_OF_LINE = 1,
+  };
+  enum Class
+  {
+    CLASS_END_OF_TEXT = 0,
+    CLASS_OUT_OF_BOUNDS = 1,
+    CLASS_DELETED_GLYPH = 2,
+    CLASS_END_OF_LINE = 3,
+  };
+
+  int new_state (unsigned int newState) const
+  { return Types::extended ? newState : ((int) newState - (int) stateArrayTable) / (int) nClasses; }
+
+  unsigned int get_class (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+  {
+    if (unlikely (glyph_id == DELETED_GLYPH)) return CLASS_DELETED_GLYPH;
+    return (this+classTable).get_class (glyph_id, num_glyphs, 1);
+  }
+
+  const Entry<Extra> *get_entries () const
+  { return (this+entryTable).arrayZ; }
+
+  const Entry<Extra> &get_entry (int state, unsigned int klass) const
+  {
+    if (unlikely (klass >= nClasses))
+      klass = StateTable<Types, Entry<Extra> >::CLASS_OUT_OF_BOUNDS;
+
+    const HBUSHORT *states = (this+stateArrayTable).arrayZ;
+    const Entry<Extra> *entries = (this+entryTable).arrayZ;
+
+    unsigned int entry = states[state * nClasses + klass];
+    DEBUG_MSG (APPLY, nullptr, "e%u", entry);
+
+    return entries[entry];
+  }
+
+  bool sanitize (hb_sanitize_context_t *c,
+		 unsigned int *num_entries_out = nullptr) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!(c->check_struct (this) &&
+		    nClasses >= 4 /* Ensure pre-defined classes fit.  */ &&
+		    classTable.sanitize (c, this)))) return_trace (false);
+
+    const HBUSHORT *states = (this+stateArrayTable).arrayZ;
+    const Entry<Extra> *entries = (this+entryTable).arrayZ;
+
+    unsigned int num_classes = nClasses;
+    if (unlikely (hb_unsigned_mul_overflows (num_classes, states[0].static_size)))
+      return_trace (false);
+    unsigned int row_stride = num_classes * states[0].static_size;
+
+    /* Apple 'kern' table has this peculiarity:
+     *
+     * "Because the stateTableOffset in the state table header is (strictly
+     * speaking) redundant, some 'kern' tables use it to record an initial
+     * state where that should not be StartOfText. To determine if this is
+     * done, calculate what the stateTableOffset should be. If it's different
+     * from the actual stateTableOffset, use it as the initial state."
+     *
+     * We implement this by calling the initial state zero, but allow *negative*
+     * states if the start state indeed was not the first state.  Since the code
+     * is shared, this will also apply to 'mort' table.  The 'kerx' / 'morx'
+     * tables are not affected since those address states by index, not offset.
+     */
+
+    int min_state = 0;
+    int max_state = 0;
+    unsigned int num_entries = 0;
+
+    int state_pos = 0;
+    int state_neg = 0;
+    unsigned int entry = 0;
+    while (min_state < state_neg || state_pos <= max_state)
+    {
+      if (min_state < state_neg)
+      {
+	/* Negative states. */
+	if (unlikely (hb_unsigned_mul_overflows (min_state, num_classes)))
+	  return_trace (false);
+	if (unlikely (!c->check_range (&states[min_state * num_classes],
+				       -min_state,
+				       row_stride)))
+	  return_trace (false);
+	if ((c->max_ops -= state_neg - min_state) <= 0)
+	  return_trace (false);
+	{ /* Sweep new states. */
+	  const HBUSHORT *stop = &states[min_state * num_classes];
+	  if (unlikely (stop > states))
+	    return_trace (false);
+	  for (const HBUSHORT *p = states; stop < p; p--)
+	    num_entries = MAX<unsigned int> (num_entries, *(p - 1) + 1);
+	  state_neg = min_state;
+	}
+      }
+
+      if (state_pos <= max_state)
+      {
+	/* Positive states. */
+	if (unlikely (!c->check_range (states,
+				       max_state + 1,
+				       row_stride)))
+	  return_trace (false);
+	if ((c->max_ops -= max_state - state_pos + 1) <= 0)
+	  return_trace (false);
+	{ /* Sweep new states. */
+	  if (unlikely (hb_unsigned_mul_overflows ((max_state + 1), num_classes)))
+	    return_trace (false);
+	  const HBUSHORT *stop = &states[(max_state + 1) * num_classes];
+	  if (unlikely (stop < states))
+	    return_trace (false);
+	  for (const HBUSHORT *p = &states[state_pos * num_classes]; p < stop; p++)
+	    num_entries = MAX<unsigned int> (num_entries, *p + 1);
+	  state_pos = max_state + 1;
+	}
+      }
+
+      if (unlikely (!c->check_array (entries, num_entries)))
+	return_trace (false);
+      if ((c->max_ops -= num_entries - entry) <= 0)
+	return_trace (false);
+      { /* Sweep new entries. */
+	const Entry<Extra> *stop = &entries[num_entries];
+	for (const Entry<Extra> *p = &entries[entry]; p < stop; p++)
+	{
+	  int newState = new_state (p->newState);
+	  min_state = MIN (min_state, newState);
+	  max_state = MAX (max_state, newState);
+	}
+	entry = num_entries;
+      }
+    }
+
+    if (num_entries_out)
+      *num_entries_out = num_entries;
+
+    return_trace (true);
+  }
+
+  protected:
+  HBUINT	nClasses;	/* Number of classes, which is the number of indices
+				 * in a single line in the state array. */
+  NNOffsetTo<ClassType, HBUINT>
+		classTable;	/* Offset to the class table. */
+  NNOffsetTo<UnsizedArrayOf<HBUSHORT>, HBUINT>
+		stateArrayTable;/* Offset to the state array. */
+  NNOffsetTo<UnsizedArrayOf<Entry<Extra> >, HBUINT>
+		entryTable;	/* Offset to the entry array. */
+
+  public:
+  DEFINE_SIZE_STATIC (4 * sizeof (HBUINT));
+};
+
+template <typename HBUCHAR>
+struct ClassTable
+{
+  unsigned int get_class (hb_codepoint_t glyph_id, unsigned int outOfRange) const
+  {
+    unsigned int i = glyph_id - firstGlyph;
+    return i >= classArray.len ? outOfRange : classArray.arrayZ[i];
+  }
+  unsigned int get_class (hb_codepoint_t glyph_id,
+			  unsigned int num_glyphs HB_UNUSED,
+			  unsigned int outOfRange) const
+  {
+    return get_class (glyph_id, outOfRange);
+  }
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && classArray.sanitize (c));
+  }
+  protected:
+  GlyphID		firstGlyph;	/* First glyph index included in the trimmed array. */
+  ArrayOf<HBUCHAR>	classArray;	/* The class codes (indexed by glyph index minus
+					 * firstGlyph). */
+  public:
+  DEFINE_SIZE_ARRAY (4, classArray);
+};
+
+struct ObsoleteTypes
+{
+  static constexpr bool extended = false;
+  typedef HBUINT16 HBUINT;
+  typedef HBUINT8 HBUSHORT;
+  typedef ClassTable<HBUINT8> ClassTypeNarrow;
+  typedef ClassTable<HBUINT16> ClassTypeWide;
+
+  template <typename T>
+  static unsigned int offsetToIndex (unsigned int offset,
+				     const void *base,
+				     const T *array)
+  {
+    return (offset - ((const char *) array - (const char *) base)) / sizeof (T);
+  }
+  template <typename T>
+  static unsigned int byteOffsetToIndex (unsigned int offset,
+					 const void *base,
+					 const T *array)
+  {
+    return offsetToIndex (offset, base, array);
+  }
+  template <typename T>
+  static unsigned int wordOffsetToIndex (unsigned int offset,
+					 const void *base,
+					 const T *array)
+  {
+    return offsetToIndex (2 * offset, base, array);
+  }
+};
+struct ExtendedTypes
+{
+  static constexpr bool extended = true;
+  typedef HBUINT32 HBUINT;
+  typedef HBUINT16 HBUSHORT;
+  typedef Lookup<HBUINT16> ClassTypeNarrow;
+  typedef Lookup<HBUINT16> ClassTypeWide;
+
+  template <typename T>
+  static unsigned int offsetToIndex (unsigned int offset,
+				     const void *base HB_UNUSED,
+				     const T *array HB_UNUSED)
+  {
+    return offset;
+  }
+  template <typename T>
+  static unsigned int byteOffsetToIndex (unsigned int offset,
+					 const void *base HB_UNUSED,
+					 const T *array HB_UNUSED)
+  {
+    return offset / 2;
+  }
+  template <typename T>
+  static unsigned int wordOffsetToIndex (unsigned int offset,
+					 const void *base HB_UNUSED,
+					 const T *array HB_UNUSED)
+  {
+    return offset;
+  }
+};
+
+template <typename Types, typename EntryData>
+struct StateTableDriver
+{
+  StateTableDriver (const StateTable<Types, EntryData> &machine_,
+		    hb_buffer_t *buffer_,
+		    hb_face_t *face_) :
+	      machine (machine_),
+	      buffer (buffer_),
+	      num_glyphs (face_->get_num_glyphs ()) {}
+
+  template <typename context_t>
+  void drive (context_t *c)
+  {
+    if (!c->in_place)
+      buffer->clear_output ();
+
+    int state = StateTable<Types, EntryData>::STATE_START_OF_TEXT;
+    for (buffer->idx = 0; buffer->successful;)
+    {
+      unsigned int klass = buffer->idx < buffer->len ?
+			   machine.get_class (buffer->info[buffer->idx].codepoint, num_glyphs) :
+			   (unsigned) StateTable<Types, EntryData>::CLASS_END_OF_TEXT;
+      DEBUG_MSG (APPLY, nullptr, "c%u at %u", klass, buffer->idx);
+      const Entry<EntryData> &entry = machine.get_entry (state, klass);
+
+      /* Unsafe-to-break before this if not in state 0, as things might
+       * go differently if we start from state 0 here.
+       *
+       * Ugh.  The indexing here is ugly... */
+      if (state && buffer->backtrack_len () && buffer->idx < buffer->len)
+      {
+	/* If there's no action and we're just epsilon-transitioning to state 0,
+	 * safe to break. */
+	if (c->is_actionable (this, entry) ||
+	    !(entry.newState == StateTable<Types, EntryData>::STATE_START_OF_TEXT &&
+	      entry.flags == context_t::DontAdvance))
+	  buffer->unsafe_to_break_from_outbuffer (buffer->backtrack_len () - 1, buffer->idx + 1);
+      }
+
+      /* Unsafe-to-break if end-of-text would kick in here. */
+      if (buffer->idx + 2 <= buffer->len)
+      {
+	const Entry<EntryData> &end_entry = machine.get_entry (state, StateTable<Types, EntryData>::CLASS_END_OF_TEXT);
+	if (c->is_actionable (this, end_entry))
+	  buffer->unsafe_to_break (buffer->idx, buffer->idx + 2);
+      }
+
+      c->transition (this, entry);
+
+      state = machine.new_state (entry.newState);
+      DEBUG_MSG (APPLY, nullptr, "s%d", state);
+
+      if (buffer->idx == buffer->len)
+	break;
+
+      if (!(entry.flags & context_t::DontAdvance) || buffer->max_ops-- <= 0)
+	buffer->next_glyph ();
+    }
+
+    if (!c->in_place)
+    {
+      for (; buffer->successful && buffer->idx < buffer->len;)
+	buffer->next_glyph ();
+      buffer->swap_buffers ();
+    }
+  }
+
+  public:
+  const StateTable<Types, EntryData> &machine;
+  hb_buffer_t *buffer;
+  unsigned int num_glyphs;
+};
+
+
+struct ankr;
+
+struct hb_aat_apply_context_t :
+       hb_dispatch_context_t<hb_aat_apply_context_t, bool, HB_DEBUG_APPLY>
+{
+  const char *get_name () { return "APPLY"; }
+  template <typename T>
+  return_t dispatch (const T &obj) { return obj.apply (this); }
+  static return_t default_return_value () { return false; }
+  bool stop_sublookup_iteration (return_t r) const { return r; }
+
+  const hb_ot_shape_plan_t *plan;
+  hb_font_t *font;
+  hb_face_t *face;
+  hb_buffer_t *buffer;
+  hb_sanitize_context_t sanitizer;
+  const ankr *ankr_table;
+
+  /* Unused. For debug tracing only. */
+  unsigned int lookup_index;
+  unsigned int debug_depth;
+
+  HB_INTERNAL hb_aat_apply_context_t (const hb_ot_shape_plan_t *plan_,
+				      hb_font_t *font_,
+				      hb_buffer_t *buffer_,
+				      hb_blob_t *blob = const_cast<hb_blob_t *> (&Null(hb_blob_t)));
+
+  HB_INTERNAL ~hb_aat_apply_context_t ();
+
+  HB_INTERNAL void set_ankr_table (const AAT::ankr *ankr_table_);
+
+  void set_lookup_index (unsigned int i) { lookup_index = i; }
+};
+
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_COMMON_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-feat-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-feat-table.hh
new file mode 100644
index 0000000..ab23ee0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-feat-table.hh
@@ -0,0 +1,217 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_AAT_LAYOUT_FEAT_TABLE_HH
+#define HB_AAT_LAYOUT_FEAT_TABLE_HH
+
+#include "hb-aat-layout-common.hh"
+
+/*
+ * feat -- Feature Name
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6feat.html
+ */
+#define HB_AAT_TAG_feat HB_TAG('f','e','a','t')
+
+
+namespace AAT {
+
+
+struct SettingName
+{
+  friend struct FeatureName;
+
+  int cmp (hb_aat_layout_feature_selector_t key) const
+  { return (int) key - (int) setting; }
+
+  hb_aat_layout_feature_selector_t get_selector () const
+  { return (hb_aat_layout_feature_selector_t) (unsigned) setting; }
+
+  void get_info (hb_aat_layout_feature_selector_info_t *s,
+			hb_aat_layout_feature_selector_t default_selector) const
+  {
+    s->name_id = nameIndex;
+
+    s->enable = (hb_aat_layout_feature_selector_t) (unsigned int) setting;
+    s->disable = default_selector == HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID ?
+		 (hb_aat_layout_feature_selector_t) (s->enable + 1) :
+		 default_selector;
+
+    s->reserved = 0;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  HBUINT16	setting;	/* The setting. */
+  NameID	nameIndex;	/* The name table index for the setting's name. */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+DECLARE_NULL_NAMESPACE_BYTES (AAT, SettingName);
+
+struct feat;
+
+struct FeatureName
+{
+  int cmp (hb_aat_layout_feature_type_t key) const
+  { return (int) key - (int) feature; }
+
+  enum {
+    Exclusive	= 0x8000,	/* If set, the feature settings are mutually exclusive. */
+    NotDefault	= 0x4000,	/* If clear, then the setting with an index of 0 in
+				 * the setting name array for this feature should
+				 * be taken as the default for the feature
+				 * (if one is required). If set, then bits 0-15 of this
+				 * featureFlags field contain the index of the setting
+				 * which is to be taken as the default. */
+    IndexMask	= 0x00FF	/* If bits 30 and 31 are set, then these sixteen bits
+				 * indicate the index of the setting in the setting name
+				 * array for this feature which should be taken
+				 * as the default. */
+  };
+
+  unsigned int get_selector_infos (unsigned int                           start_offset,
+				   unsigned int                          *selectors_count, /* IN/OUT.  May be NULL. */
+				   hb_aat_layout_feature_selector_info_t *selectors,       /* OUT.     May be NULL. */
+				   unsigned int                          *pdefault_index,  /* OUT.     May be NULL. */
+				   const void *base) const
+  {
+    hb_array_t< const SettingName> settings_table = (base+settingTableZ).as_array (nSettings);
+
+    static_assert (Index::NOT_FOUND_INDEX == HB_AAT_LAYOUT_NO_SELECTOR_INDEX, "");
+
+    hb_aat_layout_feature_selector_t default_selector = HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID;
+    unsigned int default_index = Index::NOT_FOUND_INDEX;
+    if (featureFlags & Exclusive)
+    {
+      default_index = (featureFlags & NotDefault) ? featureFlags & IndexMask : 0;
+      default_selector = settings_table[default_index].get_selector ();
+    }
+    if (pdefault_index)
+      *pdefault_index = default_index;
+
+    if (selectors_count)
+    {
+      hb_array_t<const SettingName> arr = settings_table.sub_array (start_offset, selectors_count);
+      for (unsigned int i = 0; i < arr.length; i++)
+        settings_table[start_offset + i].get_info (&selectors[i], default_selector);
+    }
+    return settings_table.length;
+  }
+
+  hb_aat_layout_feature_type_t get_feature_type () const
+  { return (hb_aat_layout_feature_type_t) (unsigned int) feature; }
+
+  hb_ot_name_id_t get_feature_name_id () const { return nameIndex; }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  (base+settingTableZ).sanitize (c, nSettings)));
+  }
+
+  protected:
+  HBUINT16	feature;	/* Feature type. */
+  HBUINT16	nSettings;	/* The number of records in the setting name array. */
+  LOffsetTo<UnsizedArrayOf<SettingName>, false>
+		settingTableZ;	/* Offset in bytes from the beginning of this table to
+				 * this feature's setting name array. The actual type of
+				 * record this offset refers to will depend on the
+				 * exclusivity value, as described below. */
+  HBUINT16	featureFlags;	/* Single-bit flags associated with the feature type. */
+  HBINT16	nameIndex;	/* The name table index for the feature's name.
+				 * This index has values greater than 255 and
+				 * less than 32768. */
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+struct feat
+{
+  static constexpr hb_tag_t tableTag = HB_AAT_TAG_feat;
+
+  bool has_data () const { return version.to_int (); }
+
+  unsigned int get_feature_types (unsigned int                  start_offset,
+				  unsigned int                 *count,
+				  hb_aat_layout_feature_type_t *features) const
+  {
+    unsigned int feature_count = featureNameCount;
+    if (count && *count)
+    {
+      unsigned int len = MIN (feature_count - start_offset, *count);
+      for (unsigned int i = 0; i < len; i++)
+	features[i] = namesZ[i + start_offset].get_feature_type ();
+      *count = len;
+    }
+    return featureNameCount;
+  }
+
+  const FeatureName& get_feature (hb_aat_layout_feature_type_t feature_type) const
+  {
+    return namesZ.bsearch (featureNameCount, feature_type);
+  }
+
+  hb_ot_name_id_t get_feature_name_id (hb_aat_layout_feature_type_t feature) const
+  { return get_feature (feature).get_feature_name_id (); }
+
+  unsigned int get_selector_infos (hb_aat_layout_feature_type_t           feature_type,
+				   unsigned int                           start_offset,
+				   unsigned int                          *selectors_count, /* IN/OUT.  May be NULL. */
+				   hb_aat_layout_feature_selector_info_t *selectors,       /* OUT.     May be NULL. */
+				   unsigned int                          *default_index    /* OUT.     May be NULL. */) const
+  {
+    return get_feature (feature_type).get_selector_infos (start_offset, selectors_count, selectors,
+							  default_index, this);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  version.major == 1 &&
+			  namesZ.sanitize (c, featureNameCount, this)));
+  }
+
+  protected:
+  FixedVersion<>version;	/* Version number of the feature name table
+				 * (0x00010000 for the current version). */
+  HBUINT16	featureNameCount;
+				/* The number of entries in the feature name array. */
+  HBUINT16	reserved1;	/* Reserved (set to zero). */
+  HBUINT32	reserved2;	/* Reserved (set to zero). */
+  SortedUnsizedArrayOf<FeatureName>
+		namesZ;		/* The feature name array. */
+  public:
+  DEFINE_SIZE_STATIC (24);
+};
+
+} /* namespace AAT */
+
+#endif /* HB_AAT_LAYOUT_FEAT_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-just-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-just-table.hh
new file mode 100644
index 0000000..d53f8f1
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-just-table.hh
@@ -0,0 +1,417 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_AAT_LAYOUT_JUST_TABLE_HH
+#define HB_AAT_LAYOUT_JUST_TABLE_HH
+
+#include "hb-aat-layout-common.hh"
+#include "hb-ot-layout.hh"
+#include "hb-open-type.hh"
+
+#include "hb-aat-layout-morx-table.hh"
+
+/*
+ * just -- Justification
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6just.html
+ */
+#define HB_AAT_TAG_just HB_TAG('j','u','s','t')
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+struct ActionSubrecordHeader
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  HBUINT16 	actionClass; 	/* The JustClass value associated with this
+				 * ActionSubrecord. */
+  HBUINT16 	actionType; 	/* The type of postcompensation action. */
+  HBUINT16 	actionLength;	/* Length of this ActionSubrecord record, which
+				 * must be a multiple of 4. */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct DecompositionAction
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  ActionSubrecordHeader
+		header;
+  Fixed		lowerLimit; 	/* If the distance factor is less than this value,
+				 * then the ligature is decomposed. */
+  Fixed		upperLimit; 	/* If the distance factor is greater than this value,
+				 * then the ligature is decomposed. */
+  HBUINT16 	order;		/* Numerical order in which this ligature will
+				 * be decomposed; you may want infrequent ligatures
+				 * to decompose before more frequent ones. The ligatures
+				 * on the line of text will decompose in increasing
+				 * value of this field. */
+  ArrayOf<HBUINT16>
+		decomposedglyphs;
+				/* Number of 16-bit glyph indexes that follow;
+				 * the ligature will be decomposed into these glyphs.
+				 *
+				 * Array of decomposed glyphs. */
+  public:
+  DEFINE_SIZE_ARRAY (18, decomposedglyphs);
+};
+
+struct UnconditionalAddGlyphAction
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  ActionSubrecordHeader
+		header;
+  GlyphID	addGlyph;	/* Glyph that should be added if the distance factor
+				 * is growing. */
+
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct ConditionalAddGlyphAction
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  ActionSubrecordHeader
+		header;
+  Fixed 	substThreshold; /* Distance growth factor (in ems) at which
+				 * this glyph is replaced and the growth factor
+				 * recalculated. */
+  GlyphID 	addGlyph; 	/* Glyph to be added as kashida. If this value is
+				 * 0xFFFF, no extra glyph will be added. Note that
+				 * generally when a glyph is added, justification
+				 * will need to be redone. */
+  GlyphID 	substGlyph; 	/* Glyph to be substituted for this glyph if the
+				 * growth factor equals or exceeds the value of
+				 * substThreshold. */
+  public:
+  DEFINE_SIZE_STATIC (14);
+};
+
+struct DuctileGlyphAction
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  ActionSubrecordHeader
+		header;
+  HBUINT32 	variationAxis;	/* The 4-byte tag identifying the ductile axis.
+				 * This would normally be 0x64756374 ('duct'),
+				 * but you may use any axis the font contains. */
+  Fixed 	minimumLimit; 	/* The lowest value for the ductility axis tha
+				 * still yields an acceptable appearance. Normally
+				 * this will be 1.0. */
+  Fixed 	noStretchValue; /* This is the default value that corresponds to
+				 * no change in appearance. Normally, this will
+				 * be 1.0. */
+  Fixed 	maximumLimit; 	/* The highest value for the ductility axis that
+				 * still yields an acceptable appearance. */
+  public:
+  DEFINE_SIZE_STATIC (22);
+};
+
+struct RepeatedAddGlyphAction
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  ActionSubrecordHeader
+		header;
+  HBUINT16 	flags;		/* Currently unused; set to 0. */
+  GlyphID 	glyph;		/* Glyph that should be added if the distance factor
+				 * is growing. */
+  public:
+  DEFINE_SIZE_STATIC (10);
+};
+
+struct ActionSubrecord
+{
+  unsigned int get_length () const { return u.header.actionLength; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!c->check_struct (this)))
+      return_trace (false);
+
+    switch (u.header.actionType)
+    {
+    case 0:  return_trace (u.decompositionAction.sanitize (c));
+    case 1:  return_trace (u.unconditionalAddGlyphAction.sanitize (c));
+    case 2:  return_trace (u.conditionalAddGlyphAction.sanitize (c));
+    // case 3: return_trace (u.stretchGlyphAction.sanitize (c));
+    case 4:  return_trace (u.decompositionAction.sanitize (c));
+    case 5:  return_trace (u.decompositionAction.sanitize (c));
+    default: return_trace (true);
+    }
+  }
+
+  protected:
+  union	{
+  ActionSubrecordHeader		header;
+  DecompositionAction		decompositionAction;
+  UnconditionalAddGlyphAction	unconditionalAddGlyphAction;
+  ConditionalAddGlyphAction	conditionalAddGlyphAction;
+  /* StretchGlyphAction stretchGlyphAction; -- Not supported by CoreText */
+  DuctileGlyphAction		ductileGlyphAction;
+  RepeatedAddGlyphAction	repeatedAddGlyphAction;
+  } u;				/* Data. The format of this data depends on
+				 * the value of the actionType field. */
+  public:
+  DEFINE_SIZE_UNION (6, header);
+};
+
+struct PostcompensationActionChain
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!c->check_struct (this)))
+      return_trace (false);
+
+    unsigned int offset = min_size;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      const ActionSubrecord& subrecord = StructAtOffset<ActionSubrecord> (this, offset);
+      if (unlikely (!subrecord.sanitize (c))) return_trace (false);
+      offset += subrecord.get_length ();
+    }
+
+    return_trace (true);
+  }
+
+  protected:
+  HBUINT32	count;
+
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct JustWidthDeltaEntry
+{
+  enum Flags
+  {
+    Reserved1		=0xE000,/* Reserved. You should set these bits to zero. */
+    UnlimiteGap		=0x1000,/* The glyph can take unlimited gap. When this
+				 * glyph participates in the justification process,
+				 * it and any other glyphs on the line having this
+				 * bit set absorb all the remaining gap. */
+    Reserved2		=0x0FF0,/* Reserved. You should set these bits to zero. */
+    Priority		=0x000F /* The justification priority of the glyph. */
+  };
+
+  enum Priority
+  {
+    Kashida		= 0,	/* Kashida priority. This is the highest priority
+				 * during justification. */
+    Whitespace		= 1,	/* Whitespace priority. Any whitespace glyphs (as
+				 * identified in the glyph properties table) will
+				 * get this priority. */
+    InterCharacter	= 2,	/* Inter-character priority. Give this to any
+				 * remaining glyphs. */
+    NullPriority	= 3	/* Null priority. You should set this priority for
+				 * glyphs that only participate in justification
+				 * after the above priorities. Normally all glyphs
+				 * have one of the previous three values. If you
+				 * don't want a glyph to participate in justification,
+				 * and you don't want to set its factors to zero,
+				 * you may instead assign it to the null priority. */
+  };
+
+  protected:
+  Fixed		beforeGrowLimit;/* The ratio by which the advance width of the
+				 * glyph is permitted to grow on the left or top side. */
+  Fixed		beforeShrinkLimit;
+				/* The ratio by which the advance width of the
+				 * glyph is permitted to shrink on the left or top side. */
+  Fixed		afterGrowLimit;	/* The ratio by which the advance width of the glyph
+				 * is permitted to shrink on the left or top side. */
+  Fixed		afterShrinkLimit;
+				/* The ratio by which the advance width of the glyph
+				 * is at most permitted to shrink on the right or
+				 * bottom side. */
+  HBUINT16	growFlags;	/* Flags controlling the grow case. */
+  HBUINT16	shrinkFlags;	/* Flags controlling the shrink case. */
+
+  public:
+  DEFINE_SIZE_STATIC (20);
+};
+
+struct WidthDeltaPair
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  HBUINT32	justClass;	/* The justification category associated
+				 * with the wdRecord field. Only 7 bits of
+				 * this field are used. (The other bits are
+				 * used as padding to guarantee longword
+				 * alignment of the following record). */
+  JustWidthDeltaEntry
+		wdRecord;	/* The actual width delta record. */
+
+  public:
+  DEFINE_SIZE_STATIC (24);
+};
+  
+typedef OT::LArrayOf<WidthDeltaPair> WidthDeltaCluster;
+
+struct JustificationCategory
+{
+  typedef void EntryData;
+
+  enum Flags
+  {
+    SetMark		=0x8000,/* If set, make the current glyph the marked
+				 * glyph. */
+    DontAdvance		=0x4000,/* If set, don't advance to the next glyph before
+				 * going to the new state. */
+    MarkCategory	=0x3F80,/* The justification category for the marked
+				 * glyph if nonzero. */
+    CurrentCategory	=0x007F /* The justification category for the current
+				 * glyph if nonzero. */
+  };
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  morphHeader.sanitize (c) &&
+			  stHeader.sanitize (c)));
+  }
+
+  protected:
+  ChainSubtable<ObsoleteTypes>
+		morphHeader;	/* Metamorphosis-style subtable header. */
+  StateTable<ObsoleteTypes, EntryData>
+		stHeader;	/* The justification insertion state table header */
+  public:
+  DEFINE_SIZE_STATIC (30);
+};
+
+struct JustificationHeader
+{
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  justClassTable.sanitize (c, base, base) &&
+			  wdcTable.sanitize (c, base) &&
+			  pcTable.sanitize (c, base) &&
+			  lookupTable.sanitize (c, base)));
+  }
+
+  protected:
+  OffsetTo<JustificationCategory>
+		justClassTable;	/* Offset to the justification category state table. */
+  OffsetTo<WidthDeltaCluster>
+  		wdcTable;	/* Offset from start of justification table to start
+				 * of the subtable containing the width delta factors
+				 * for the glyphs in your font.
+				 *
+				 * The width delta clusters table. */
+  OffsetTo<PostcompensationActionChain>
+		pcTable;	/* Offset from start of justification table to start
+				 * of postcompensation subtable (set to zero if none).
+				 *
+				 * The postcompensation subtable, if present in the font. */
+  Lookup<OffsetTo<WidthDeltaCluster> >
+  		lookupTable;	/* Lookup table associating glyphs with width delta
+				 * clusters. See the description of Width Delta Clusters
+				 * table for details on how to interpret the lookup values. */
+
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+struct just
+{
+  static constexpr hb_tag_t tableTag = HB_AAT_TAG_just;
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+
+    return_trace (likely (c->check_struct (this) &&
+			  version.major == 1 &&
+			  horizData.sanitize (c, this, this) &&
+			  vertData.sanitize (c, this, this)));
+  }
+
+  protected:
+  FixedVersion<>version;	/* Version of the justification table
+				 * (0x00010000u for version 1.0). */
+  HBUINT16	format; 	/* Format of the justification table (set to 0). */
+  OffsetTo<JustificationHeader>
+		horizData;	/* Byte offset from the start of the justification table
+				 * to the header for tables that contain justification
+				 * information for horizontal text.
+				 * If you are not including this information,
+				 * store 0. */
+  OffsetTo<JustificationHeader>
+		vertData;	/* ditto, vertical */
+
+  public:
+  DEFINE_SIZE_STATIC (10);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_JUST_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-kerx-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-kerx-table.hh
new file mode 100644
index 0000000..a64c8073
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-kerx-table.hh
@@ -0,0 +1,1001 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ * Copyright © 2018  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_AAT_LAYOUT_KERX_TABLE_HH
+#define HB_AAT_LAYOUT_KERX_TABLE_HH
+
+#include "hb-kern.hh"
+#include "hb-aat-layout-ankr-table.hh"
+
+/*
+ * kerx -- Extended Kerning
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6kerx.html
+ */
+#define HB_AAT_TAG_kerx HB_TAG('k','e','r','x')
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+static inline int
+kerxTupleKern (int value,
+	       unsigned int tupleCount,
+	       const void *base,
+	       hb_aat_apply_context_t *c)
+{
+  if (likely (!tupleCount || !c)) return value;
+
+  unsigned int offset = value;
+  const FWORD *pv = &StructAtOffset<FWORD> (base, offset);
+  if (unlikely (!c->sanitizer.check_array (pv, tupleCount))) return 0;
+  return *pv;
+}
+
+
+struct hb_glyph_pair_t
+{
+  hb_codepoint_t left;
+  hb_codepoint_t right;
+};
+
+struct KernPair
+{
+  int get_kerning () const { return value; }
+
+  int cmp (const hb_glyph_pair_t &o) const
+  {
+    int ret = left.cmp (o.left);
+    if (ret) return ret;
+    return right.cmp (o.right);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  GlyphID	left;
+  GlyphID	right;
+  FWORD		value;
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+template <typename KernSubTableHeader>
+struct KerxSubTableFormat0
+{
+  int get_kerning (hb_codepoint_t left, hb_codepoint_t right,
+		   hb_aat_apply_context_t *c = nullptr) const
+  {
+    hb_glyph_pair_t pair = {left, right};
+    int v = pairs.bsearch (pair).get_kerning ();
+    return kerxTupleKern (v, header.tuple_count (), this, c);
+  }
+
+  bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    if (!c->plan->requested_kerning)
+      return false;
+
+    if (header.coverage & header.Backwards)
+      return false;
+
+    accelerator_t accel (*this, c);
+    hb_kern_machine_t<accelerator_t> machine (accel, header.coverage & header.CrossStream);
+    machine.kern (c->font, c->buffer, c->plan->kern_mask);
+
+    return_trace (true);
+  }
+
+  struct accelerator_t
+  {
+    const KerxSubTableFormat0 &table;
+    hb_aat_apply_context_t *c;
+
+    accelerator_t (const KerxSubTableFormat0 &table_,
+		   hb_aat_apply_context_t *c_) :
+		     table (table_), c (c_) {}
+
+    int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+    { return table.get_kerning (left, right, c); }
+  };
+
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (pairs.sanitize (c)));
+  }
+
+  protected:
+  KernSubTableHeader	header;
+  BinSearchArrayOf<KernPair, typename KernSubTableHeader::Types::HBUINT>
+			pairs;	/* Sorted kern records. */
+  public:
+  DEFINE_SIZE_ARRAY (KernSubTableHeader::static_size + 16, pairs);
+};
+
+
+template <bool extended>
+struct Format1Entry;
+
+template <>
+struct Format1Entry<true>
+{
+  enum Flags
+  {
+    Push		= 0x8000,	/* If set, push this glyph on the kerning stack. */
+    DontAdvance		= 0x4000,	/* If set, don't advance to the next glyph
+					 * before going to the new state. */
+    Reset		= 0x2000,	/* If set, reset the kerning data (clear the stack) */
+    Reserved		= 0x1FFF,	/* Not used; set to 0. */
+  };
+
+  struct EntryData
+  {
+    HBUINT16	kernActionIndex;/* Index into the kerning value array. If
+				 * this index is 0xFFFF, then no kerning
+				 * is to be performed. */
+    public:
+    DEFINE_SIZE_STATIC (2);
+  };
+
+  static bool performAction (const Entry<EntryData> &entry)
+  { return entry.data.kernActionIndex != 0xFFFF; }
+
+  static unsigned int kernActionIndex (const Entry<EntryData> &entry)
+  { return entry.data.kernActionIndex; }
+};
+template <>
+struct Format1Entry<false>
+{
+  enum Flags
+  {
+    Push		= 0x8000,	/* If set, push this glyph on the kerning stack. */
+    DontAdvance		= 0x4000,	/* If set, don't advance to the next glyph
+					 * before going to the new state. */
+    Offset		= 0x3FFF,	/* Byte offset from beginning of subtable to the
+					 * value table for the glyphs on the kerning stack. */
+
+    Reset		= 0x0000,	/* Not supported? */
+  };
+
+  typedef void EntryData;
+
+  static bool performAction (const Entry<EntryData> &entry)
+  { return entry.flags & Offset; }
+
+  static unsigned int kernActionIndex (const Entry<EntryData> &entry)
+  { return entry.flags & Offset; }
+};
+
+template <typename KernSubTableHeader>
+struct KerxSubTableFormat1
+{
+  typedef typename KernSubTableHeader::Types Types;
+  typedef typename Types::HBUINT HBUINT;
+
+  typedef Format1Entry<Types::extended> Format1EntryT;
+  typedef typename Format1EntryT::EntryData EntryData;
+
+  struct driver_context_t
+  {
+    static constexpr bool in_place = true;
+    enum
+    {
+      DontAdvance	= Format1EntryT::DontAdvance,
+    };
+
+    driver_context_t (const KerxSubTableFormat1 *table_,
+		      hb_aat_apply_context_t *c_) :
+	c (c_),
+	table (table_),
+	/* Apparently the offset kernAction is from the beginning of the state-machine,
+	 * similar to offsets in morx table, NOT from beginning of this table, like
+	 * other subtables in kerx.  Discovered via testing. */
+	kernAction (&table->machine + table->kernAction),
+	depth (0),
+	crossStream (table->header.coverage & table->header.CrossStream) {}
+
+    bool is_actionable (StateTableDriver<Types, EntryData> *driver HB_UNUSED,
+			const Entry<EntryData> &entry)
+    {
+      return Format1EntryT::performAction (entry);
+    }
+    void transition (StateTableDriver<Types, EntryData> *driver,
+		     const Entry<EntryData> &entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+      unsigned int flags = entry.flags;
+
+      if (flags & Format1EntryT::Reset)
+	depth = 0;
+
+      if (flags & Format1EntryT::Push)
+      {
+	if (likely (depth < ARRAY_LENGTH (stack)))
+	  stack[depth++] = buffer->idx;
+	else
+	  depth = 0; /* Probably not what CoreText does, but better? */
+      }
+
+      if (Format1EntryT::performAction (entry) && depth)
+      {
+	unsigned int tuple_count = MAX (1u, table->header.tuple_count ());
+
+	unsigned int kern_idx = Format1EntryT::kernActionIndex (entry);
+	kern_idx = Types::byteOffsetToIndex (kern_idx, &table->machine, kernAction.arrayZ);
+	const FWORD *actions = &kernAction[kern_idx];
+	if (!c->sanitizer.check_array (actions, depth, tuple_count))
+	{
+	  depth = 0;
+	  return;
+	}
+
+	hb_mask_t kern_mask = c->plan->kern_mask;
+
+	/* From Apple 'kern' spec:
+	 * "Each pops one glyph from the kerning stack and applies the kerning value to it.
+	 * The end of the list is marked by an odd value... */
+	bool last = false;
+	while (!last && depth)
+	{
+	  unsigned int idx = stack[--depth];
+	  int v = *actions;
+	  actions += tuple_count;
+	  if (idx >= buffer->len) continue;
+
+	  /* "The end of the list is marked by an odd value..." */
+	  last = v & 1;
+	  v &= ~1;
+
+	  hb_glyph_position_t &o = buffer->pos[idx];
+
+	  /* Testing shows that CoreText only applies kern (cross-stream or not)
+	   * if none has been applied by previous subtables.  That is, it does
+	   * NOT seem to accumulate as otherwise implied by specs. */
+
+	  /* The following flag is undocumented in the spec, but described
+	   * in the 'kern' table example. */
+	  if (v == -0x8000)
+	  {
+	    o.attach_type() = ATTACH_TYPE_NONE;
+	    o.attach_chain() = 0;
+	    o.x_offset = o.y_offset = 0;
+	  }
+	  else if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+	  {
+	    if (crossStream)
+	    {
+	      if (buffer->pos[idx].attach_type() && !buffer->pos[idx].y_offset)
+	      {
+		o.y_offset = c->font->em_scale_y (v);
+		buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
+	      }
+	    }
+	    else if (buffer->info[idx].mask & kern_mask)
+	    {
+	      if (!buffer->pos[idx].x_offset)
+	      {
+		buffer->pos[idx].x_advance += c->font->em_scale_x (v);
+		buffer->pos[idx].x_offset += c->font->em_scale_x (v);
+	      }
+	    }
+	  }
+	  else
+	  {
+	    if (crossStream)
+	    {
+	      /* CoreText doesn't do crossStream kerning in vertical.  We do. */
+	      if (buffer->pos[idx].attach_type() && !buffer->pos[idx].x_offset)
+	      {
+		o.x_offset = c->font->em_scale_x (v);
+		buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
+	      }
+	    }
+	    else if (buffer->info[idx].mask & kern_mask)
+	    {
+	      if (!buffer->pos[idx].y_offset)
+	      {
+		buffer->pos[idx].y_advance += c->font->em_scale_y (v);
+		buffer->pos[idx].y_offset += c->font->em_scale_y (v);
+	      }
+	    }
+	  }
+	}
+      }
+    }
+
+    private:
+    hb_aat_apply_context_t *c;
+    const KerxSubTableFormat1 *table;
+    const UnsizedArrayOf<FWORD> &kernAction;
+    unsigned int stack[8];
+    unsigned int depth;
+    bool crossStream;
+  };
+
+  bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    if (!c->plan->requested_kerning &&
+	!(header.coverage & header.CrossStream))
+      return false;
+
+    driver_context_t dc (this, c);
+
+    StateTableDriver<Types, EntryData> driver (machine, c->buffer, c->font->face);
+    driver.drive (&dc);
+
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    /* The rest of array sanitizations are done at run-time. */
+    return_trace (likely (c->check_struct (this) &&
+			  machine.sanitize (c)));
+  }
+
+  protected:
+  KernSubTableHeader				header;
+  StateTable<Types, EntryData>			machine;
+  NNOffsetTo<UnsizedArrayOf<FWORD>, HBUINT>	kernAction;
+  public:
+  DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 5 * sizeof (HBUINT));
+};
+
+template <typename KernSubTableHeader>
+struct KerxSubTableFormat2
+{
+  typedef typename KernSubTableHeader::Types Types;
+  typedef typename Types::HBUINT HBUINT;
+
+  int get_kerning (hb_codepoint_t left, hb_codepoint_t right,
+		   hb_aat_apply_context_t *c) const
+  {
+    unsigned int num_glyphs = c->sanitizer.get_num_glyphs ();
+    unsigned int l = (this+leftClassTable).get_class (left, num_glyphs, 0);
+    unsigned int r = (this+rightClassTable).get_class (right, num_glyphs, 0);
+
+    const UnsizedArrayOf<FWORD> &arrayZ = this+array;
+    unsigned int kern_idx = l + r;
+    kern_idx = Types::offsetToIndex (kern_idx, this, &arrayZ);
+    const FWORD *v = &arrayZ[kern_idx];
+    if (unlikely (!v->sanitize (&c->sanitizer))) return 0;
+
+    return kerxTupleKern (*v, header.tuple_count (), this, c);
+  }
+
+  bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    if (!c->plan->requested_kerning)
+      return false;
+
+    if (header.coverage & header.Backwards)
+      return false;
+
+    accelerator_t accel (*this, c);
+    hb_kern_machine_t<accelerator_t> machine (accel, header.coverage & header.CrossStream);
+    machine.kern (c->font, c->buffer, c->plan->kern_mask);
+
+    return_trace (true);
+  }
+
+  struct accelerator_t
+  {
+    const KerxSubTableFormat2 &table;
+    hb_aat_apply_context_t *c;
+
+    accelerator_t (const KerxSubTableFormat2 &table_,
+		   hb_aat_apply_context_t *c_) :
+		     table (table_), c (c_) {}
+
+    int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+    { return table.get_kerning (left, right, c); }
+  };
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  leftClassTable.sanitize (c, this) &&
+			  rightClassTable.sanitize (c, this) &&
+			  c->check_range (this, array)));
+  }
+
+  protected:
+  KernSubTableHeader	header;
+  HBUINT		rowWidth;	/* The width, in bytes, of a row in the table. */
+  NNOffsetTo<typename Types::ClassTypeWide, HBUINT>
+			leftClassTable;	/* Offset from beginning of this subtable to
+					 * left-hand class table. */
+  NNOffsetTo<typename Types::ClassTypeWide, HBUINT>
+			rightClassTable;/* Offset from beginning of this subtable to
+					 * right-hand class table. */
+  NNOffsetTo<UnsizedArrayOf<FWORD>, HBUINT>
+			 array;		/* Offset from beginning of this subtable to
+					 * the start of the kerning array. */
+  public:
+  DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 4 * sizeof (HBUINT));
+};
+
+template <typename KernSubTableHeader>
+struct KerxSubTableFormat4
+{
+  typedef ExtendedTypes Types;
+
+  struct EntryData
+  {
+    HBUINT16	ankrActionIndex;/* Either 0xFFFF (for no action) or the index of
+				 * the action to perform. */
+    public:
+    DEFINE_SIZE_STATIC (2);
+  };
+
+  struct driver_context_t
+  {
+    static constexpr bool in_place = true;
+    enum Flags
+    {
+      Mark		= 0x8000,	/* If set, remember this glyph as the marked glyph. */
+      DontAdvance	= 0x4000,	/* If set, don't advance to the next glyph before
+					 * going to the new state. */
+      Reserved		= 0x3FFF,	/* Not used; set to 0. */
+    };
+
+    enum SubTableFlags
+    {
+      ActionType	= 0xC0000000,	/* A two-bit field containing the action type. */
+      Unused		= 0x3F000000,	/* Unused - must be zero. */
+      Offset		= 0x00FFFFFF,	/* Masks the offset in bytes from the beginning
+					 * of the subtable to the beginning of the control
+					 * point table. */
+    };
+
+    driver_context_t (const KerxSubTableFormat4 *table,
+			     hb_aat_apply_context_t *c_) :
+	c (c_),
+	action_type ((table->flags & ActionType) >> 30),
+	ankrData ((HBUINT16 *) ((const char *) &table->machine + (table->flags & Offset))),
+	mark_set (false),
+	mark (0) {}
+
+    bool is_actionable (StateTableDriver<Types, EntryData> *driver HB_UNUSED,
+			const Entry<EntryData> &entry)
+    {
+      return entry.data.ankrActionIndex != 0xFFFF;
+    }
+    void transition (StateTableDriver<Types, EntryData> *driver,
+		     const Entry<EntryData> &entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+
+      if (mark_set && entry.data.ankrActionIndex != 0xFFFF && buffer->idx < buffer->len)
+      {
+	hb_glyph_position_t &o = buffer->cur_pos();
+	switch (action_type)
+	{
+	  case 0: /* Control Point Actions.*/
+	  {
+	    /* indexed into glyph outline. */
+	    const HBUINT16 *data = &ankrData[entry.data.ankrActionIndex];
+	    if (!c->sanitizer.check_array (data, 2)) return;
+	    HB_UNUSED unsigned int markControlPoint = *data++;
+	    HB_UNUSED unsigned int currControlPoint = *data++;
+	    hb_position_t markX = 0;
+	    hb_position_t markY = 0;
+	    hb_position_t currX = 0;
+	    hb_position_t currY = 0;
+	    if (!c->font->get_glyph_contour_point_for_origin (c->buffer->info[mark].codepoint,
+							      markControlPoint,
+							      HB_DIRECTION_LTR /*XXX*/,
+							      &markX, &markY) ||
+		!c->font->get_glyph_contour_point_for_origin (c->buffer->cur ().codepoint,
+							      currControlPoint,
+							      HB_DIRECTION_LTR /*XXX*/,
+							      &currX, &currY))
+	      return;
+
+	    o.x_offset = markX - currX;
+	    o.y_offset = markY - currY;
+	  }
+	  break;
+
+	  case 1: /* Anchor Point Actions. */
+	  {
+	   /* Indexed into 'ankr' table. */
+	    const HBUINT16 *data = &ankrData[entry.data.ankrActionIndex];
+	    if (!c->sanitizer.check_array (data, 2)) return;
+	    unsigned int markAnchorPoint = *data++;
+	    unsigned int currAnchorPoint = *data++;
+	    const Anchor &markAnchor = c->ankr_table->get_anchor (c->buffer->info[mark].codepoint,
+								  markAnchorPoint,
+								  c->sanitizer.get_num_glyphs ());
+	    const Anchor &currAnchor = c->ankr_table->get_anchor (c->buffer->cur ().codepoint,
+								  currAnchorPoint,
+								  c->sanitizer.get_num_glyphs ());
+
+	    o.x_offset = c->font->em_scale_x (markAnchor.xCoordinate) - c->font->em_scale_x (currAnchor.xCoordinate);
+	    o.y_offset = c->font->em_scale_y (markAnchor.yCoordinate) - c->font->em_scale_y (currAnchor.yCoordinate);
+	  }
+	  break;
+
+	  case 2: /* Control Point Coordinate Actions. */
+	  {
+	    const FWORD *data = (const FWORD *) &ankrData[entry.data.ankrActionIndex];
+	    if (!c->sanitizer.check_array (data, 4)) return;
+	    int markX = *data++;
+	    int markY = *data++;
+	    int currX = *data++;
+	    int currY = *data++;
+
+	    o.x_offset = c->font->em_scale_x (markX) - c->font->em_scale_x (currX);
+	    o.y_offset = c->font->em_scale_y (markY) - c->font->em_scale_y (currY);
+	  }
+	  break;
+	}
+	o.attach_type() = ATTACH_TYPE_MARK;
+	o.attach_chain() = (int) mark - (int) buffer->idx;
+	buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
+      }
+
+      if (entry.flags & Mark)
+      {
+	mark_set = true;
+	mark = buffer->idx;
+      }
+    }
+
+    private:
+    hb_aat_apply_context_t *c;
+    unsigned int action_type;
+    const HBUINT16 *ankrData;
+    bool mark_set;
+    unsigned int mark;
+  };
+
+  bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    driver_context_t dc (this, c);
+
+    StateTableDriver<Types, EntryData> driver (machine, c->buffer, c->font->face);
+    driver.drive (&dc);
+
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    /* The rest of array sanitizations are done at run-time. */
+    return_trace (likely (c->check_struct (this) &&
+			  machine.sanitize (c)));
+  }
+
+  protected:
+  KernSubTableHeader		header;
+  StateTable<Types, EntryData>	machine;
+  HBUINT32			flags;
+  public:
+  DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 20);
+};
+
+template <typename KernSubTableHeader>
+struct KerxSubTableFormat6
+{
+  enum Flags
+  {
+    ValuesAreLong	= 0x00000001,
+  };
+
+  bool is_long () const { return flags & ValuesAreLong; }
+
+  int get_kerning (hb_codepoint_t left, hb_codepoint_t right,
+			  hb_aat_apply_context_t *c) const
+  {
+    unsigned int num_glyphs = c->sanitizer.get_num_glyphs ();
+    if (is_long ())
+    {
+      const typename U::Long &t = u.l;
+      unsigned int l = (this+t.rowIndexTable).get_value_or_null (left, num_glyphs);
+      unsigned int r = (this+t.columnIndexTable).get_value_or_null (right, num_glyphs);
+      unsigned int offset = l + r;
+      if (unlikely (offset < l)) return 0; /* Addition overflow. */
+      if (unlikely (hb_unsigned_mul_overflows (offset, sizeof (FWORD32)))) return 0;
+      const FWORD32 *v = &StructAtOffset<FWORD32> (&(this+t.array), offset * sizeof (FWORD32));
+      if (unlikely (!v->sanitize (&c->sanitizer))) return 0;
+      return kerxTupleKern (*v, header.tuple_count (), &(this+vector), c);
+    }
+    else
+    {
+      const typename U::Short &t = u.s;
+      unsigned int l = (this+t.rowIndexTable).get_value_or_null (left, num_glyphs);
+      unsigned int r = (this+t.columnIndexTable).get_value_or_null (right, num_glyphs);
+      unsigned int offset = l + r;
+      const FWORD *v = &StructAtOffset<FWORD> (&(this+t.array), offset * sizeof (FWORD));
+      if (unlikely (!v->sanitize (&c->sanitizer))) return 0;
+      return kerxTupleKern (*v, header.tuple_count (), &(this+vector), c);
+    }
+  }
+
+  bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    if (!c->plan->requested_kerning)
+      return false;
+
+    if (header.coverage & header.Backwards)
+      return false;
+
+    accelerator_t accel (*this, c);
+    hb_kern_machine_t<accelerator_t> machine (accel, header.coverage & header.CrossStream);
+    machine.kern (c->font, c->buffer, c->plan->kern_mask);
+
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  (is_long () ?
+			   (
+			     u.l.rowIndexTable.sanitize (c, this) &&
+			     u.l.columnIndexTable.sanitize (c, this) &&
+			     c->check_range (this, u.l.array)
+			   ) : (
+			     u.s.rowIndexTable.sanitize (c, this) &&
+			     u.s.columnIndexTable.sanitize (c, this) &&
+			     c->check_range (this, u.s.array)
+			   )) &&
+			  (header.tuple_count () == 0 ||
+			   c->check_range (this, vector))));
+  }
+
+  struct accelerator_t
+  {
+    const KerxSubTableFormat6 &table;
+    hb_aat_apply_context_t *c;
+
+    accelerator_t (const KerxSubTableFormat6 &table_,
+		   hb_aat_apply_context_t *c_) :
+		     table (table_), c (c_) {}
+
+    int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+    { return table.get_kerning (left, right, c); }
+  };
+
+  protected:
+  KernSubTableHeader		header;
+  HBUINT32			flags;
+  HBUINT16			rowCount;
+  HBUINT16			columnCount;
+  union U
+  {
+    struct Long
+    {
+      LNNOffsetTo<Lookup<HBUINT32> >		rowIndexTable;
+      LNNOffsetTo<Lookup<HBUINT32> >		columnIndexTable;
+      LNNOffsetTo<UnsizedArrayOf<FWORD32> >	array;
+    } l;
+    struct Short
+    {
+      LNNOffsetTo<Lookup<HBUINT16> >		rowIndexTable;
+      LNNOffsetTo<Lookup<HBUINT16> >		columnIndexTable;
+      LNNOffsetTo<UnsizedArrayOf<FWORD> >	array;
+    } s;
+  } u;
+  LNNOffsetTo<UnsizedArrayOf<FWORD> >	vector;
+  public:
+  DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 24);
+};
+
+
+struct KerxSubTableHeader
+{
+  typedef ExtendedTypes Types;
+
+  unsigned int tuple_count () const { return tupleCount; }
+  bool is_horizontal () const       { return !(coverage & Vertical); }
+
+  enum Coverage
+  {
+    Vertical	= 0x80000000u,	/* Set if table has vertical kerning values. */
+    CrossStream	= 0x40000000u,	/* Set if table has cross-stream kerning values. */
+    Variation	= 0x20000000u,	/* Set if table has variation kerning values. */
+    Backwards	= 0x10000000u,	/* If clear, process the glyphs forwards, that
+				 * is, from first to last in the glyph stream.
+				 * If we, process them from last to first.
+				 * This flag only applies to state-table based
+				 * 'kerx' subtables (types 1 and 4). */
+    Reserved	= 0x0FFFFF00u,	/* Reserved, set to zero. */
+    SubtableType= 0x000000FFu,	/* Subtable type. */
+  };
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  public:
+  HBUINT32	length;
+  HBUINT32	coverage;
+  HBUINT32	tupleCount;
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+struct KerxSubTable
+{
+  friend struct kerx;
+
+  unsigned int get_size () const { return u.header.length; }
+  unsigned int get_type () const { return u.header.coverage & u.header.SubtableType; }
+
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    unsigned int subtable_type = get_type ();
+    TRACE_DISPATCH (this, subtable_type);
+    switch (subtable_type) {
+    case 0:	return_trace (c->dispatch (u.format0));
+    case 1:	return_trace (c->dispatch (u.format1));
+    case 2:	return_trace (c->dispatch (u.format2));
+    case 4:	return_trace (c->dispatch (u.format4));
+    case 6:	return_trace (c->dispatch (u.format6));
+    default:	return_trace (c->default_return_value ());
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.header.sanitize (c) ||
+	u.header.length <= u.header.static_size ||
+	!c->check_range (this, u.header.length))
+      return_trace (false);
+
+    return_trace (dispatch (c));
+  }
+
+  public:
+  union {
+  KerxSubTableHeader				header;
+  KerxSubTableFormat0<KerxSubTableHeader>	format0;
+  KerxSubTableFormat1<KerxSubTableHeader>	format1;
+  KerxSubTableFormat2<KerxSubTableHeader>	format2;
+  KerxSubTableFormat4<KerxSubTableHeader>	format4;
+  KerxSubTableFormat6<KerxSubTableHeader>	format6;
+  } u;
+  public:
+  DEFINE_SIZE_MIN (12);
+};
+
+
+/*
+ * The 'kerx' Table
+ */
+
+template <typename T>
+struct KerxTable
+{
+  /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
+  const T* thiz () const { return static_cast<const T *> (this); }
+
+  bool has_state_machine () const
+  {
+    typedef typename T::SubTable SubTable;
+
+    const SubTable *st = &thiz()->firstSubTable;
+    unsigned int count = thiz()->tableCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (st->get_type () == 1)
+        return true;
+      st = &StructAfter<SubTable> (*st);
+    }
+    return false;
+  }
+
+  bool has_cross_stream () const
+  {
+    typedef typename T::SubTable SubTable;
+
+    const SubTable *st = &thiz()->firstSubTable;
+    unsigned int count = thiz()->tableCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (st->u.header.coverage & st->u.header.CrossStream)
+        return true;
+      st = &StructAfter<SubTable> (*st);
+    }
+    return false;
+  }
+
+  int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+  {
+    typedef typename T::SubTable SubTable;
+
+    int v = 0;
+    const SubTable *st = &thiz()->firstSubTable;
+    unsigned int count = thiz()->tableCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if ((st->u.header.coverage & (st->u.header.Variation | st->u.header.CrossStream)) ||
+	  !st->u.header.is_horizontal ())
+        continue;
+      v += st->get_kerning (left, right);
+      st = &StructAfter<SubTable> (*st);
+    }
+    return v;
+  }
+
+  bool apply (AAT::hb_aat_apply_context_t *c) const
+  {
+    typedef typename T::SubTable SubTable;
+
+    bool ret = false;
+    bool seenCrossStream = false;
+    c->set_lookup_index (0);
+    const SubTable *st = &thiz()->firstSubTable;
+    unsigned int count = thiz()->tableCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      bool reverse;
+
+      if (!T::Types::extended && (st->u.header.coverage & st->u.header.Variation))
+        goto skip;
+
+      if (HB_DIRECTION_IS_HORIZONTAL (c->buffer->props.direction) != st->u.header.is_horizontal ())
+	goto skip;
+
+      reverse = bool (st->u.header.coverage & st->u.header.Backwards) !=
+		HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction);
+
+      if (!c->buffer->message (c->font, "start %c%c%c%c subtable %d", HB_UNTAG (thiz()->tableTag), c->lookup_index))
+	goto skip;
+
+      if (!seenCrossStream &&
+	  (st->u.header.coverage & st->u.header.CrossStream))
+      {
+        /* Attach all glyphs into a chain. */
+        seenCrossStream = true;
+	hb_glyph_position_t *pos = c->buffer->pos;
+	unsigned int count = c->buffer->len;
+	for (unsigned int i = 0; i < count; i++)
+	{
+	  pos[i].attach_type() = ATTACH_TYPE_CURSIVE;
+	  pos[i].attach_chain() = HB_DIRECTION_IS_FORWARD (c->buffer->props.direction) ? -1 : +1;
+	  /* We intentionally don't set HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT,
+	   * since there needs to be a non-zero attachment for post-positioning to
+	   * be needed. */
+	}
+      }
+
+      if (reverse)
+	c->buffer->reverse ();
+
+      {
+	/* See comment in sanitize() for conditional here. */
+	hb_sanitize_with_object_t with (&c->sanitizer, i < count - 1 ? st : (const SubTable *) nullptr);
+	ret |= st->dispatch (c);
+      }
+
+      if (reverse)
+	c->buffer->reverse ();
+
+      (void) c->buffer->message (c->font, "end %c%c%c%c subtable %d", HB_UNTAG (thiz()->tableTag), c->lookup_index);
+
+    skip:
+      st = &StructAfter<SubTable> (*st);
+      c->set_lookup_index (c->lookup_index + 1);
+    }
+
+    return ret;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!thiz()->version.sanitize (c) ||
+		  (unsigned) thiz()->version < (unsigned) T::minVersion ||
+		  !thiz()->tableCount.sanitize (c)))
+      return_trace (false);
+
+    typedef typename T::SubTable SubTable;
+
+    const SubTable *st = &thiz()->firstSubTable;
+    unsigned int count = thiz()->tableCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (unlikely (!st->u.header.sanitize (c)))
+	return_trace (false);
+      /* OpenType kern table has 2-byte subtable lengths.  That's limiting.
+       * MS implementation also only supports one subtable, of format 0,
+       * anyway.  Certain versions of some fonts, like Calibry, contain
+       * kern subtable that exceeds 64kb.  Looks like, the subtable length
+       * is simply ignored.  Which makes sense.  It's only needed if you
+       * have multiple subtables.  To handle such fonts, we just ignore
+       * the length for the last subtable. */
+      hb_sanitize_with_object_t with (c, i < count - 1 ? st : (const SubTable *) nullptr);
+
+      if (unlikely (!st->sanitize (c)))
+	return_trace (false);
+
+      st = &StructAfter<SubTable> (*st);
+    }
+
+    return_trace (true);
+  }
+};
+
+struct kerx : KerxTable<kerx>
+{
+  friend struct KerxTable<kerx>;
+
+  static constexpr hb_tag_t tableTag = HB_AAT_TAG_kerx;
+  static constexpr unsigned minVersion = 2u;
+
+  typedef KerxSubTableHeader SubTableHeader;
+  typedef SubTableHeader::Types Types;
+  typedef KerxSubTable SubTable;
+
+  bool has_data () const { return version; }
+
+  protected:
+  HBUINT16	version;	/* The version number of the extended kerning table
+				 * (currently 2, 3, or 4). */
+  HBUINT16	unused;		/* Set to 0. */
+  HBUINT32	tableCount;	/* The number of subtables included in the extended kerning
+				 * table. */
+  SubTable	firstSubTable;	/* Subtables. */
+/*subtableGlyphCoverageArray*/	/* Only if version >= 3. We don't use. */
+
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_KERX_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-lcar-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-lcar-table.hh
new file mode 100644
index 0000000..4be799f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-lcar-table.hh
@@ -0,0 +1,93 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+#ifndef HB_AAT_LAYOUT_LCAR_TABLE_HH
+#define HB_AAT_LAYOUT_LCAR_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-aat-layout-common.hh"
+
+/*
+ * lcar -- Ligature caret
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6lcar.html
+ */
+#define HB_AAT_TAG_lcar HB_TAG('l','c','a','r')
+
+
+namespace AAT {
+
+typedef ArrayOf<HBINT16> LigCaretClassEntry;
+
+struct lcar
+{
+  static constexpr hb_tag_t tableTag = HB_AAT_TAG_lcar;
+
+  unsigned int get_lig_carets (hb_font_t      *font,
+			       hb_direction_t  direction,
+			       hb_codepoint_t  glyph,
+			       unsigned int    start_offset,
+			       unsigned int   *caret_count /* IN/OUT */,
+			       hb_position_t  *caret_array /* OUT */) const
+  {
+    const OffsetTo<LigCaretClassEntry>* entry_offset = lookup.get_value (glyph,
+									 font->face->get_num_glyphs ());
+    const LigCaretClassEntry& array = entry_offset ? this+*entry_offset : Null (LigCaretClassEntry);
+    if (caret_count)
+    {
+      hb_array_t<const HBINT16> arr = array.sub_array (start_offset, caret_count);
+      unsigned int count = arr.length;
+      for (unsigned int i = 0; i < count; ++i)
+	switch (format)
+	{
+	case 0: caret_array[i] = font->em_scale_dir (arr[i], direction); break;
+	case 1:
+	  hb_position_t x, y;
+	  font->get_glyph_contour_point_for_origin (glyph, arr[i], direction, &x, &y);
+	  caret_array[i] = HB_DIRECTION_IS_HORIZONTAL (direction) ? x : y;
+	  break;
+	}
+    }
+    return array.len;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  version.major == 1 &&
+			  lookup.sanitize (c, this)));
+  }
+
+  protected:
+  FixedVersion<>version;	/* Version number of the ligature caret table */
+  HBUINT16	format;		/* Format of the ligature caret table. */
+  Lookup<OffsetTo<LigCaretClassEntry> >
+		lookup;		/* data Lookup table associating glyphs */
+
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+} /* namespace AAT */
+
+#endif /* HB_AAT_LAYOUT_LCAR_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-morx-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-morx-table.hh
new file mode 100644
index 0000000..4a1d959e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-morx-table.hh
@@ -0,0 +1,1159 @@
+/*
+ * Copyright © 2017  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_AAT_LAYOUT_MORX_TABLE_HH
+#define HB_AAT_LAYOUT_MORX_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-aat-layout-common.hh"
+#include "hb-ot-layout-common.hh"
+#include "hb-aat-map.hh"
+
+/*
+ * morx -- Extended Glyph Metamorphosis
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6morx.html
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6mort.html
+ */
+#define HB_AAT_TAG_morx HB_TAG('m','o','r','x')
+#define HB_AAT_TAG_mort HB_TAG('m','o','r','t')
+
+
+namespace AAT {
+
+using namespace OT;
+
+template <typename Types>
+struct RearrangementSubtable
+{
+  typedef typename Types::HBUINT HBUINT;
+
+  typedef void EntryData;
+
+  struct driver_context_t
+  {
+    static constexpr bool in_place = true;
+    enum Flags
+    {
+      MarkFirst		= 0x8000,	/* If set, make the current glyph the first
+					 * glyph to be rearranged. */
+      DontAdvance	= 0x4000,	/* If set, don't advance to the next glyph
+					 * before going to the new state. This means
+					 * that the glyph index doesn't change, even
+					 * if the glyph at that index has changed. */
+      MarkLast		= 0x2000,	/* If set, make the current glyph the last
+					 * glyph to be rearranged. */
+      Reserved		= 0x1FF0,	/* These bits are reserved and should be set to 0. */
+      Verb		= 0x000F,	/* The type of rearrangement specified. */
+    };
+
+    driver_context_t (const RearrangementSubtable *table HB_UNUSED) :
+	ret (false),
+	start (0), end (0) {}
+
+    bool is_actionable (StateTableDriver<Types, EntryData> *driver HB_UNUSED,
+			const Entry<EntryData> &entry)
+    {
+      return (entry.flags & Verb) && start < end;
+    }
+    void transition (StateTableDriver<Types, EntryData> *driver,
+		     const Entry<EntryData> &entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+      unsigned int flags = entry.flags;
+
+      if (flags & MarkFirst)
+	start = buffer->idx;
+
+      if (flags & MarkLast)
+	end = MIN (buffer->idx + 1, buffer->len);
+
+      if ((flags & Verb) && start < end)
+      {
+	/* The following map has two nibbles, for start-side
+	 * and end-side. Values of 0,1,2 mean move that many
+	 * to the other side. Value of 3 means move 2 and
+	 * flip them. */
+	const unsigned char map[16] =
+	{
+	  0x00,	/* 0	no change */
+	  0x10,	/* 1	Ax => xA */
+	  0x01,	/* 2	xD => Dx */
+	  0x11,	/* 3	AxD => DxA */
+	  0x20,	/* 4	ABx => xAB */
+	  0x30,	/* 5	ABx => xBA */
+	  0x02,	/* 6	xCD => CDx */
+	  0x03,	/* 7	xCD => DCx */
+	  0x12,	/* 8	AxCD => CDxA */
+	  0x13,	/* 9	AxCD => DCxA */
+	  0x21,	/* 10	ABxD => DxAB */
+	  0x31,	/* 11	ABxD => DxBA */
+	  0x22,	/* 12	ABxCD => CDxAB */
+	  0x32,	/* 13	ABxCD => CDxBA */
+	  0x23,	/* 14	ABxCD => DCxAB */
+	  0x33,	/* 15	ABxCD => DCxBA */
+	};
+
+	unsigned int m = map[flags & Verb];
+	unsigned int l = MIN<unsigned int> (2, m >> 4);
+	unsigned int r = MIN<unsigned int> (2, m & 0x0F);
+	bool reverse_l = 3 == (m >> 4);
+	bool reverse_r = 3 == (m & 0x0F);
+
+	if (end - start >= l + r)
+	{
+	  buffer->merge_clusters (start, MIN (buffer->idx + 1, buffer->len));
+	  buffer->merge_clusters (start, end);
+
+	  hb_glyph_info_t *info = buffer->info;
+	  hb_glyph_info_t buf[4];
+
+	  memcpy (buf, info + start, l * sizeof (buf[0]));
+	  memcpy (buf + 2, info + end - r, r * sizeof (buf[0]));
+
+	  if (l != r)
+	    memmove (info + start + r, info + start + l, (end - start - l - r) * sizeof (buf[0]));
+
+	  memcpy (info + start, buf + 2, r * sizeof (buf[0]));
+	  memcpy (info + end - l, buf, l * sizeof (buf[0]));
+	  if (reverse_l)
+	  {
+	    buf[0] = info[end - 1];
+	    info[end - 1] = info[end - 2];
+	    info[end - 2] = buf[0];
+	  }
+	  if (reverse_r)
+	  {
+	    buf[0] = info[start];
+	    info[start] = info[start + 1];
+	    info[start + 1] = buf[0];
+	  }
+	}
+      }
+    }
+
+    public:
+    bool ret;
+    private:
+    unsigned int start;
+    unsigned int end;
+  };
+
+  bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    driver_context_t dc (this);
+
+    StateTableDriver<Types, EntryData> driver (machine, c->buffer, c->face);
+    driver.drive (&dc);
+
+    return_trace (dc.ret);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (machine.sanitize (c));
+  }
+
+  protected:
+  StateTable<Types, EntryData>	machine;
+  public:
+  DEFINE_SIZE_STATIC (16);
+};
+
+template <typename Types>
+struct ContextualSubtable
+{
+  typedef typename Types::HBUINT HBUINT;
+
+  struct EntryData
+  {
+    HBUINT16	markIndex;	/* Index of the substitution table for the
+				 * marked glyph (use 0xFFFF for none). */
+    HBUINT16	currentIndex;	/* Index of the substitution table for the
+				 * current glyph (use 0xFFFF for none). */
+    public:
+    DEFINE_SIZE_STATIC (4);
+  };
+
+  struct driver_context_t
+  {
+    static constexpr bool in_place = true;
+    enum Flags
+    {
+      SetMark		= 0x8000,	/* If set, make the current glyph the marked glyph. */
+      DontAdvance	= 0x4000,	/* If set, don't advance to the next glyph before
+					 * going to the new state. */
+      Reserved		= 0x3FFF,	/* These bits are reserved and should be set to 0. */
+    };
+
+    driver_context_t (const ContextualSubtable *table_,
+			     hb_aat_apply_context_t *c_) :
+	ret (false),
+	c (c_),
+	mark_set (false),
+	mark (0),
+	table (table_),
+	subs (table+table->substitutionTables) {}
+
+    bool is_actionable (StateTableDriver<Types, EntryData> *driver,
+			const Entry<EntryData> &entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+
+      if (buffer->idx == buffer->len && !mark_set)
+        return false;
+
+      return entry.data.markIndex != 0xFFFF || entry.data.currentIndex != 0xFFFF;
+    }
+    void transition (StateTableDriver<Types, EntryData> *driver,
+		     const Entry<EntryData> &entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+
+      /* Looks like CoreText applies neither mark nor current substitution for
+       * end-of-text if mark was not explicitly set. */
+      if (buffer->idx == buffer->len && !mark_set)
+        return;
+
+      const GlyphID *replacement;
+
+      replacement = nullptr;
+      if (Types::extended)
+      {
+	if (entry.data.markIndex != 0xFFFF)
+	{
+	  const Lookup<GlyphID> &lookup = subs[entry.data.markIndex];
+	  replacement = lookup.get_value (buffer->info[mark].codepoint, driver->num_glyphs);
+	}
+      }
+      else
+      {
+	unsigned int offset = entry.data.markIndex + buffer->info[mark].codepoint;
+	const UnsizedArrayOf<GlyphID> &subs_old = (const UnsizedArrayOf<GlyphID> &) subs;
+	replacement = &subs_old[Types::wordOffsetToIndex (offset, table, subs_old.arrayZ)];
+	if (!replacement->sanitize (&c->sanitizer) || !*replacement)
+	  replacement = nullptr;
+      }
+      if (replacement)
+      {
+	buffer->unsafe_to_break (mark, MIN (buffer->idx + 1, buffer->len));
+	buffer->info[mark].codepoint = *replacement;
+	ret = true;
+      }
+
+      replacement = nullptr;
+      unsigned int idx = MIN (buffer->idx, buffer->len - 1);
+      if (Types::extended)
+      {
+	if (entry.data.currentIndex != 0xFFFF)
+	{
+	  const Lookup<GlyphID> &lookup = subs[entry.data.currentIndex];
+	  replacement = lookup.get_value (buffer->info[idx].codepoint, driver->num_glyphs);
+	}
+      }
+      else
+      {
+	unsigned int offset = entry.data.currentIndex + buffer->info[idx].codepoint;
+	const UnsizedArrayOf<GlyphID> &subs_old = (const UnsizedArrayOf<GlyphID> &) subs;
+	replacement = &subs_old[Types::wordOffsetToIndex (offset, table, subs_old.arrayZ)];
+	if (!replacement->sanitize (&c->sanitizer) || !*replacement)
+	  replacement = nullptr;
+      }
+      if (replacement)
+      {
+	buffer->info[idx].codepoint = *replacement;
+	ret = true;
+      }
+
+      if (entry.flags & SetMark)
+      {
+	mark_set = true;
+	mark = buffer->idx;
+      }
+    }
+
+    public:
+    bool ret;
+    private:
+    hb_aat_apply_context_t *c;
+    bool mark_set;
+    unsigned int mark;
+    const ContextualSubtable *table;
+    const UnsizedOffsetListOf<Lookup<GlyphID>, HBUINT, false> &subs;
+  };
+
+  bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    driver_context_t dc (this, c);
+
+    StateTableDriver<Types, EntryData> driver (machine, c->buffer, c->face);
+    driver.drive (&dc);
+
+    return_trace (dc.ret);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+
+    unsigned int num_entries = 0;
+    if (unlikely (!machine.sanitize (c, &num_entries))) return_trace (false);
+
+    if (!Types::extended)
+      return_trace (substitutionTables.sanitize (c, this, 0));
+
+    unsigned int num_lookups = 0;
+
+    const Entry<EntryData> *entries = machine.get_entries ();
+    for (unsigned int i = 0; i < num_entries; i++)
+    {
+      const EntryData &data = entries[i].data;
+
+      if (data.markIndex != 0xFFFF)
+	num_lookups = MAX<unsigned int> (num_lookups, 1 + data.markIndex);
+      if (data.currentIndex != 0xFFFF)
+	num_lookups = MAX<unsigned int> (num_lookups, 1 + data.currentIndex);
+    }
+
+    return_trace (substitutionTables.sanitize (c, this, num_lookups));
+  }
+
+  protected:
+  StateTable<Types, EntryData>
+		machine;
+  NNOffsetTo<UnsizedOffsetListOf<Lookup<GlyphID>, HBUINT, false>, HBUINT>
+		substitutionTables;
+  public:
+  DEFINE_SIZE_STATIC (20);
+};
+
+
+template <bool extended>
+struct LigatureEntry;
+
+template <>
+struct LigatureEntry<true>
+{
+  enum Flags
+  {
+    SetComponent	= 0x8000,	/* Push this glyph onto the component stack for
+					 * eventual processing. */
+    DontAdvance		= 0x4000,	/* Leave the glyph pointer at this glyph for the
+					   next iteration. */
+    PerformAction	= 0x2000,	/* Use the ligActionIndex to process a ligature
+					 * group. */
+    Reserved		= 0x1FFF,	/* These bits are reserved and should be set to 0. */
+  };
+
+  struct EntryData
+  {
+    HBUINT16	ligActionIndex;	/* Index to the first ligActionTable entry
+				 * for processing this group, if indicated
+				 * by the flags. */
+    public:
+    DEFINE_SIZE_STATIC (2);
+  };
+
+  static bool performAction (const Entry<EntryData> &entry)
+  { return entry.flags & PerformAction; }
+
+  static unsigned int ligActionIndex (const Entry<EntryData> &entry)
+  { return entry.data.ligActionIndex; }
+};
+template <>
+struct LigatureEntry<false>
+{
+  enum Flags
+  {
+    SetComponent	= 0x8000,	/* Push this glyph onto the component stack for
+					 * eventual processing. */
+    DontAdvance		= 0x4000,	/* Leave the glyph pointer at this glyph for the
+					   next iteration. */
+    Offset		= 0x3FFF,	/* Byte offset from beginning of subtable to the
+					 * ligature action list. This value must be a
+					 * multiple of 4. */
+  };
+
+  typedef void EntryData;
+
+  static bool performAction (const Entry<EntryData> &entry)
+  { return entry.flags & Offset; }
+
+  static unsigned int ligActionIndex (const Entry<EntryData> &entry)
+  { return entry.flags & Offset; }
+};
+
+
+template <typename Types>
+struct LigatureSubtable
+{
+  typedef typename Types::HBUINT HBUINT;
+
+  typedef LigatureEntry<Types::extended> LigatureEntryT;
+  typedef typename LigatureEntryT::EntryData EntryData;
+
+  struct driver_context_t
+  {
+    static constexpr bool in_place = false;
+    enum
+    {
+      DontAdvance	= LigatureEntryT::DontAdvance,
+    };
+    enum LigActionFlags
+    {
+      LigActionLast	= 0x80000000,	/* This is the last action in the list. This also
+					 * implies storage. */
+      LigActionStore	= 0x40000000,	/* Store the ligature at the current cumulated index
+					 * in the ligature table in place of the marked
+					 * (i.e. currently-popped) glyph. */
+      LigActionOffset	= 0x3FFFFFFF,	/* A 30-bit value which is sign-extended to 32-bits
+					 * and added to the glyph ID, resulting in an index
+					 * into the component table. */
+    };
+
+    driver_context_t (const LigatureSubtable *table_,
+		      hb_aat_apply_context_t *c_) :
+	ret (false),
+	c (c_),
+	table (table_),
+	ligAction (table+table->ligAction),
+	component (table+table->component),
+	ligature (table+table->ligature),
+	match_length (0) {}
+
+    bool is_actionable (StateTableDriver<Types, EntryData> *driver HB_UNUSED,
+			const Entry<EntryData> &entry)
+    {
+      return LigatureEntryT::performAction (entry);
+    }
+    void transition (StateTableDriver<Types, EntryData> *driver,
+		     const Entry<EntryData> &entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+
+      DEBUG_MSG (APPLY, nullptr, "Ligature transition at %u", buffer->idx);
+      if (entry.flags & LigatureEntryT::SetComponent)
+      {
+	/* Never mark same index twice, in case DontAdvance was used... */
+	if (match_length && match_positions[(match_length - 1u) % ARRAY_LENGTH (match_positions)] == buffer->out_len)
+	  match_length--;
+
+	match_positions[match_length++ % ARRAY_LENGTH (match_positions)] = buffer->out_len;
+	DEBUG_MSG (APPLY, nullptr, "Set component at %u", buffer->out_len);
+      }
+
+      if (LigatureEntryT::performAction (entry))
+      {
+	DEBUG_MSG (APPLY, nullptr, "Perform action with %u", match_length);
+	unsigned int end = buffer->out_len;
+
+	if (unlikely (!match_length))
+	  return;
+
+	if (buffer->idx >= buffer->len)
+	  return; /* TODO Work on previous instead? */
+
+	unsigned int cursor = match_length;
+
+	unsigned int action_idx = LigatureEntryT::ligActionIndex (entry);
+	action_idx = Types::offsetToIndex (action_idx, table, ligAction.arrayZ);
+	const HBUINT32 *actionData = &ligAction[action_idx];
+
+	unsigned int ligature_idx = 0;
+	unsigned int action;
+        do
+	{
+	  if (unlikely (!cursor))
+	  {
+	    /* Stack underflow.  Clear the stack. */
+	    DEBUG_MSG (APPLY, nullptr, "Stack underflow");
+	    match_length = 0;
+	    break;
+	  }
+
+	  DEBUG_MSG (APPLY, nullptr, "Moving to stack position %u", cursor - 1);
+	  buffer->move_to (match_positions[--cursor % ARRAY_LENGTH (match_positions)]);
+
+	  if (unlikely (!actionData->sanitize (&c->sanitizer))) break;
+	  action = *actionData;
+
+	  uint32_t uoffset = action & LigActionOffset;
+	  if (uoffset & 0x20000000)
+	    uoffset |= 0xC0000000; /* Sign-extend. */
+	  int32_t offset = (int32_t) uoffset;
+	  unsigned int component_idx = buffer->cur().codepoint + offset;
+	  component_idx = Types::wordOffsetToIndex (component_idx, table, component.arrayZ);
+	  const HBUINT16 &componentData = component[component_idx];
+	  if (unlikely (!componentData.sanitize (&c->sanitizer))) break;
+	  ligature_idx += componentData;
+
+	  DEBUG_MSG (APPLY, nullptr, "Action store %u last %u",
+		     bool (action & LigActionStore),
+		     bool (action & LigActionLast));
+	  if (action & (LigActionStore | LigActionLast))
+	  {
+	    ligature_idx = Types::offsetToIndex (ligature_idx, table, ligature.arrayZ);
+	    const GlyphID &ligatureData = ligature[ligature_idx];
+	    if (unlikely (!ligatureData.sanitize (&c->sanitizer))) break;
+	    hb_codepoint_t lig = ligatureData;
+
+	    DEBUG_MSG (APPLY, nullptr, "Produced ligature %u", lig);
+	    buffer->replace_glyph (lig);
+
+	    unsigned int lig_end = match_positions[(match_length - 1u) % ARRAY_LENGTH (match_positions)] + 1u;
+	    /* Now go and delete all subsequent components. */
+	    while (match_length - 1u > cursor)
+	    {
+	      DEBUG_MSG (APPLY, nullptr, "Skipping ligature component");
+	      buffer->move_to (match_positions[--match_length % ARRAY_LENGTH (match_positions)]);
+	      buffer->replace_glyph (DELETED_GLYPH);
+	    }
+
+	    buffer->move_to (lig_end);
+	    buffer->merge_out_clusters (match_positions[cursor % ARRAY_LENGTH (match_positions)], buffer->out_len);
+	  }
+
+	  actionData++;
+	}
+	while (!(action & LigActionLast));
+	buffer->move_to (end);
+      }
+    }
+
+    public:
+    bool ret;
+    private:
+    hb_aat_apply_context_t *c;
+    const LigatureSubtable *table;
+    const UnsizedArrayOf<HBUINT32> &ligAction;
+    const UnsizedArrayOf<HBUINT16> &component;
+    const UnsizedArrayOf<GlyphID> &ligature;
+    unsigned int match_length;
+    unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
+  };
+
+  bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    driver_context_t dc (this, c);
+
+    StateTableDriver<Types, EntryData> driver (machine, c->buffer, c->face);
+    driver.drive (&dc);
+
+    return_trace (dc.ret);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    /* The rest of array sanitizations are done at run-time. */
+    return_trace (c->check_struct (this) && machine.sanitize (c) &&
+		  ligAction && component && ligature);
+  }
+
+  protected:
+  StateTable<Types, EntryData>
+		machine;
+  NNOffsetTo<UnsizedArrayOf<HBUINT32>, HBUINT>
+		ligAction;	/* Offset to the ligature action table. */
+  NNOffsetTo<UnsizedArrayOf<HBUINT16>, HBUINT>
+		component;	/* Offset to the component table. */
+  NNOffsetTo<UnsizedArrayOf<GlyphID>, HBUINT>
+		ligature;	/* Offset to the actual ligature lists. */
+  public:
+  DEFINE_SIZE_STATIC (28);
+};
+
+template <typename Types>
+struct NoncontextualSubtable
+{
+  bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    bool ret = false;
+    unsigned int num_glyphs = c->face->get_num_glyphs ();
+
+    hb_glyph_info_t *info = c->buffer->info;
+    unsigned int count = c->buffer->len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      const GlyphID *replacement = substitute.get_value (info[i].codepoint, num_glyphs);
+      if (replacement)
+      {
+	info[i].codepoint = *replacement;
+	ret = true;
+      }
+    }
+
+    return_trace (ret);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (substitute.sanitize (c));
+  }
+
+  protected:
+  Lookup<GlyphID>	substitute;
+  public:
+  DEFINE_SIZE_MIN (2);
+};
+
+template <typename Types>
+struct InsertionSubtable
+{
+  typedef typename Types::HBUINT HBUINT;
+
+  struct EntryData
+  {
+    HBUINT16	currentInsertIndex;	/* Zero-based index into the insertion glyph table.
+					 * The number of glyphs to be inserted is contained
+					 * in the currentInsertCount field in the flags.
+					 * A value of 0xFFFF indicates no insertion is to
+					 * be done. */
+    HBUINT16	markedInsertIndex;	/* Zero-based index into the insertion glyph table.
+					 * The number of glyphs to be inserted is contained
+					 * in the markedInsertCount field in the flags.
+					 * A value of 0xFFFF indicates no insertion is to
+					 * be done. */
+    public:
+    DEFINE_SIZE_STATIC (4);
+  };
+
+  struct driver_context_t
+  {
+    static constexpr bool in_place = false;
+    enum Flags
+    {
+      SetMark		= 0x8000,	/* If set, mark the current glyph. */
+      DontAdvance	= 0x4000,	/* If set, don't advance to the next glyph before
+					 * going to the new state.  This does not mean
+					 * that the glyph pointed to is the same one as
+					 * before. If you've made insertions immediately
+					 * downstream of the current glyph, the next glyph
+					 * processed would in fact be the first one
+					 * inserted. */
+      CurrentIsKashidaLike= 0x2000,	/* If set, and the currentInsertList is nonzero,
+					 * then the specified glyph list will be inserted
+					 * as a kashida-like insertion, either before or
+					 * after the current glyph (depending on the state
+					 * of the currentInsertBefore flag). If clear, and
+					 * the currentInsertList is nonzero, then the
+					 * specified glyph list will be inserted as a
+					 * split-vowel-like insertion, either before or
+					 * after the current glyph (depending on the state
+					 * of the currentInsertBefore flag). */
+      MarkedIsKashidaLike= 0x1000,	/* If set, and the markedInsertList is nonzero,
+					 * then the specified glyph list will be inserted
+					 * as a kashida-like insertion, either before or
+					 * after the marked glyph (depending on the state
+					 * of the markedInsertBefore flag). If clear, and
+					 * the markedInsertList is nonzero, then the
+					 * specified glyph list will be inserted as a
+					 * split-vowel-like insertion, either before or
+					 * after the marked glyph (depending on the state
+					 * of the markedInsertBefore flag). */
+      CurrentInsertBefore= 0x0800,	/* If set, specifies that insertions are to be made
+					 * to the left of the current glyph. If clear,
+					 * they're made to the right of the current glyph. */
+      MarkedInsertBefore= 0x0400,	/* If set, specifies that insertions are to be
+					 * made to the left of the marked glyph. If clear,
+					 * they're made to the right of the marked glyph. */
+      CurrentInsertCount= 0x3E0,	/* This 5-bit field is treated as a count of the
+					 * number of glyphs to insert at the current
+					 * position. Since zero means no insertions, the
+					 * largest number of insertions at any given
+					 * current location is 31 glyphs. */
+      MarkedInsertCount= 0x001F,	/* This 5-bit field is treated as a count of the
+					 * number of glyphs to insert at the marked
+					 * position. Since zero means no insertions, the
+					 * largest number of insertions at any given
+					 * marked location is 31 glyphs. */
+    };
+
+    driver_context_t (const InsertionSubtable *table,
+		      hb_aat_apply_context_t *c_) :
+	ret (false),
+	c (c_),
+	mark (0),
+	insertionAction (table+table->insertionAction) {}
+
+    bool is_actionable (StateTableDriver<Types, EntryData> *driver HB_UNUSED,
+			const Entry<EntryData> &entry)
+    {
+      return (entry.flags & (CurrentInsertCount | MarkedInsertCount)) &&
+	     (entry.data.currentInsertIndex != 0xFFFF ||entry.data.markedInsertIndex != 0xFFFF);
+    }
+    void transition (StateTableDriver<Types, EntryData> *driver,
+		     const Entry<EntryData> &entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+      unsigned int flags = entry.flags;
+
+      unsigned mark_loc = buffer->out_len;
+
+      if (entry.data.markedInsertIndex != 0xFFFF)
+      {
+	unsigned int count = (flags & MarkedInsertCount);
+	unsigned int start = entry.data.markedInsertIndex;
+	const GlyphID *glyphs = &insertionAction[start];
+	if (unlikely (!c->sanitizer.check_array (glyphs, count))) count = 0;
+
+	bool before = flags & MarkedInsertBefore;
+
+	unsigned int end = buffer->out_len;
+	buffer->move_to (mark);
+
+	if (buffer->idx < buffer->len && !before)
+	  buffer->copy_glyph ();
+	/* TODO We ignore KashidaLike setting. */
+	for (unsigned int i = 0; i < count; i++)
+	  buffer->output_glyph (glyphs[i]);
+	if (buffer->idx < buffer->len && !before)
+	  buffer->skip_glyph ();
+
+	buffer->move_to (end + count);
+
+	buffer->unsafe_to_break_from_outbuffer (mark, MIN (buffer->idx + 1, buffer->len));
+      }
+
+      if (flags & SetMark)
+	mark = mark_loc;
+
+      if (entry.data.currentInsertIndex != 0xFFFF)
+      {
+	unsigned int count = (flags & CurrentInsertCount) >> 5;
+	unsigned int start = entry.data.currentInsertIndex;
+	const GlyphID *glyphs = &insertionAction[start];
+	if (unlikely (!c->sanitizer.check_array (glyphs, count))) count = 0;
+
+	bool before = flags & CurrentInsertBefore;
+
+	unsigned int end = buffer->out_len;
+
+	if (buffer->idx < buffer->len && !before)
+	  buffer->copy_glyph ();
+	/* TODO We ignore KashidaLike setting. */
+	for (unsigned int i = 0; i < count; i++)
+	  buffer->output_glyph (glyphs[i]);
+	if (buffer->idx < buffer->len && !before)
+	  buffer->skip_glyph ();
+
+	/* Humm. Not sure where to move to.  There's this wording under
+	 * DontAdvance flag:
+	 *
+	 * "If set, don't update the glyph index before going to the new state.
+	 * This does not mean that the glyph pointed to is the same one as
+	 * before. If you've made insertions immediately downstream of the
+	 * current glyph, the next glyph processed would in fact be the first
+	 * one inserted."
+	 *
+	 * This suggests that if DontAdvance is NOT set, we should move to
+	 * end+count.  If it *was*, then move to end, such that newly inserted
+	 * glyphs are now visible.
+	 *
+	 * https://github.com/harfbuzz/harfbuzz/issues/1224#issuecomment-427691417
+	 */
+	buffer->move_to ((flags & DontAdvance) ? end : end + count);
+      }
+    }
+
+    public:
+    bool ret;
+    private:
+    hb_aat_apply_context_t *c;
+    unsigned int mark;
+    const UnsizedArrayOf<GlyphID> &insertionAction;
+  };
+
+  bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    driver_context_t dc (this, c);
+
+    StateTableDriver<Types, EntryData> driver (machine, c->buffer, c->face);
+    driver.drive (&dc);
+
+    return_trace (dc.ret);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    /* The rest of array sanitizations are done at run-time. */
+    return_trace (c->check_struct (this) && machine.sanitize (c) &&
+		  insertionAction);
+  }
+
+  protected:
+  StateTable<Types, EntryData>
+		machine;
+  NNOffsetTo<UnsizedArrayOf<GlyphID>, HBUINT>
+		insertionAction;	/* Byte offset from stateHeader to the start of
+					 * the insertion glyph table. */
+  public:
+  DEFINE_SIZE_STATIC (20);
+};
+
+
+struct Feature
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT16	featureType;	/* The type of feature. */
+  HBUINT16	featureSetting;	/* The feature's setting (aka selector). */
+  HBUINT32	enableFlags;	/* Flags for the settings that this feature
+				 * and setting enables. */
+  HBUINT32	disableFlags;	/* Complement of flags for the settings that this
+				 * feature and setting disable. */
+
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+template <typename Types>
+struct ChainSubtable
+{
+  typedef typename Types::HBUINT HBUINT;
+
+  template <typename T>
+  friend struct Chain;
+
+  unsigned int get_size () const     { return length; }
+  unsigned int get_type () const     { return coverage & 0xFF; }
+  unsigned int get_coverage () const { return coverage >> (sizeof (HBUINT) * 8 - 8); }
+
+  enum Coverage
+  {
+    Vertical		= 0x80,	/* If set, this subtable will only be applied
+				 * to vertical text. If clear, this subtable
+				 * will only be applied to horizontal text. */
+    Backwards		= 0x40,	/* If set, this subtable will process glyphs
+				 * in descending order. If clear, it will
+				 * process the glyphs in ascending order. */
+    AllDirections	= 0x20,	/* If set, this subtable will be applied to
+				 * both horizontal and vertical text (i.e.
+				 * the state of bit 0x80000000 is ignored). */
+    Logical		= 0x10,	/* If set, this subtable will process glyphs
+				 * in logical order (or reverse logical order,
+				 * depending on the value of bit 0x80000000). */
+  };
+  enum Type
+  {
+    Rearrangement	= 0,
+    Contextual		= 1,
+    Ligature		= 2,
+    Noncontextual	= 4,
+    Insertion		= 5
+  };
+
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    unsigned int subtable_type = get_type ();
+    TRACE_DISPATCH (this, subtable_type);
+    switch (subtable_type) {
+    case Rearrangement:		return_trace (c->dispatch (u.rearrangement));
+    case Contextual:		return_trace (c->dispatch (u.contextual));
+    case Ligature:		return_trace (c->dispatch (u.ligature));
+    case Noncontextual:		return_trace (c->dispatch (u.noncontextual));
+    case Insertion:		return_trace (c->dispatch (u.insertion));
+    default:			return_trace (c->default_return_value ());
+    }
+  }
+
+  bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    hb_sanitize_with_object_t with (&c->sanitizer, this);
+    return_trace (dispatch (c));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!length.sanitize (c) ||
+	length <= min_size ||
+	!c->check_range (this, length))
+      return_trace (false);
+
+    hb_sanitize_with_object_t with (c, this);
+    return_trace (dispatch (c));
+  }
+
+  protected:
+  HBUINT	length;		/* Total subtable length, including this header. */
+  HBUINT	coverage;	/* Coverage flags and subtable type. */
+  HBUINT32	subFeatureFlags;/* The 32-bit mask identifying which subtable this is. */
+  union {
+  RearrangementSubtable<Types>	rearrangement;
+  ContextualSubtable<Types>	contextual;
+  LigatureSubtable<Types>	ligature;
+  NoncontextualSubtable<Types>	noncontextual;
+  InsertionSubtable<Types>	insertion;
+  } u;
+  public:
+  DEFINE_SIZE_MIN (2 * sizeof (HBUINT) + 4);
+};
+
+template <typename Types>
+struct Chain
+{
+  typedef typename Types::HBUINT HBUINT;
+
+  hb_mask_t compile_flags (const hb_aat_map_builder_t *map) const
+  {
+    hb_mask_t flags = defaultFlags;
+    {
+      unsigned int count = featureCount;
+      for (unsigned i = 0; i < count; i++)
+      {
+	const Feature &feature = featureZ[i];
+	hb_aat_layout_feature_type_t type = (hb_aat_layout_feature_type_t) (unsigned int) feature.featureType;
+	hb_aat_layout_feature_selector_t setting = (hb_aat_layout_feature_selector_t) (unsigned int) feature.featureSetting;
+      retry:
+	const hb_aat_map_builder_t::feature_info_t *info = map->features.bsearch (type);
+	if (info && info->setting == setting)
+	{
+	  flags &= feature.disableFlags;
+	  flags |= feature.enableFlags;
+	}
+	else if (type == HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE && setting == HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS)
+	{
+	  /* Deprecated. https://github.com/harfbuzz/harfbuzz/issues/1342 */
+	  type = HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE;
+	  setting = HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS;
+	  goto retry;
+	}
+      }
+    }
+    return flags;
+  }
+
+  void apply (hb_aat_apply_context_t *c,
+		     hb_mask_t flags) const
+  {
+    const ChainSubtable<Types> *subtable = &StructAfter<ChainSubtable<Types> > (featureZ.as_array (featureCount));
+    unsigned int count = subtableCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      bool reverse;
+
+      if (!(subtable->subFeatureFlags & flags))
+        goto skip;
+
+      if (!(subtable->get_coverage() & ChainSubtable<Types>::AllDirections) &&
+	  HB_DIRECTION_IS_VERTICAL (c->buffer->props.direction) !=
+	  bool (subtable->get_coverage() & ChainSubtable<Types>::Vertical))
+        goto skip;
+
+      /* Buffer contents is always in logical direction.  Determine if
+       * we need to reverse before applying this subtable.  We reverse
+       * back after if we did reverse indeed.
+       *
+       * Quoting the spac:
+       * """
+       * Bits 28 and 30 of the coverage field control the order in which
+       * glyphs are processed when the subtable is run by the layout engine.
+       * Bit 28 is used to indicate if the glyph processing direction is
+       * the same as logical order or layout order. Bit 30 is used to
+       * indicate whether glyphs are processed forwards or backwards within
+       * that order.
+
+		Bit 30	Bit 28	Interpretation for Horizontal Text
+		0	0	The subtable is processed in layout order
+				(the same order as the glyphs, which is
+				always left-to-right).
+		1	0	The subtable is processed in reverse layout order
+				(the order opposite that of the glyphs, which is
+				always right-to-left).
+		0	1	The subtable is processed in logical order
+				(the same order as the characters, which may be
+				left-to-right or right-to-left).
+		1	1	The subtable is processed in reverse logical order
+				(the order opposite that of the characters, which
+				may be right-to-left or left-to-right).
+       */
+      reverse = subtable->get_coverage () & ChainSubtable<Types>::Logical ?
+		bool (subtable->get_coverage () & ChainSubtable<Types>::Backwards) :
+		bool (subtable->get_coverage () & ChainSubtable<Types>::Backwards) !=
+		HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction);
+
+      if (!c->buffer->message (c->font, "start chain subtable %d", c->lookup_index))
+        goto skip;
+
+      if (reverse)
+        c->buffer->reverse ();
+
+      subtable->apply (c);
+
+      if (reverse)
+        c->buffer->reverse ();
+
+      (void) c->buffer->message (c->font, "end chain subtable %d", c->lookup_index);
+
+      if (unlikely (!c->buffer->successful)) return;
+
+    skip:
+      subtable = &StructAfter<ChainSubtable<Types> > (*subtable);
+      c->set_lookup_index (c->lookup_index + 1);
+    }
+  }
+
+  unsigned int get_size () const { return length; }
+
+  bool sanitize (hb_sanitize_context_t *c, unsigned int version HB_UNUSED) const
+  {
+    TRACE_SANITIZE (this);
+    if (!length.sanitize (c) ||
+	length < min_size ||
+	!c->check_range (this, length))
+      return_trace (false);
+
+    if (!c->check_array (featureZ.arrayZ, featureCount))
+      return_trace (false);
+
+    const ChainSubtable<Types> *subtable = &StructAfter<ChainSubtable<Types> > (featureZ.as_array (featureCount));
+    unsigned int count = subtableCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (!subtable->sanitize (c))
+	return_trace (false);
+      subtable = &StructAfter<ChainSubtable<Types> > (*subtable);
+    }
+
+    return_trace (true);
+  }
+
+  protected:
+  HBUINT32	defaultFlags;	/* The default specification for subtables. */
+  HBUINT32	length;		/* Total byte count, including this header. */
+  HBUINT	featureCount;	/* Number of feature subtable entries. */
+  HBUINT	subtableCount;	/* The number of subtables in the chain. */
+
+  UnsizedArrayOf<Feature>	featureZ;	/* Features. */
+/*ChainSubtable	firstSubtable;*//* Subtables. */
+/*subtableGlyphCoverageArray*/	/* Only if version >= 3. We don't use. */
+
+  public:
+  DEFINE_SIZE_MIN (8 + 2 * sizeof (HBUINT));
+};
+
+
+/*
+ * The 'mort'/'morx' Table
+ */
+
+template <typename Types>
+struct mortmorx
+{
+  static constexpr hb_tag_t tableTag = HB_AAT_TAG_morx;
+
+  bool has_data () const { return version != 0; }
+
+  void compile_flags (const hb_aat_map_builder_t *mapper,
+		      hb_aat_map_t *map) const
+  {
+    const Chain<Types> *chain = &firstChain;
+    unsigned int count = chainCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      map->chain_flags.push (chain->compile_flags (mapper));
+      chain = &StructAfter<Chain<Types> > (*chain);
+    }
+  }
+
+  void apply (hb_aat_apply_context_t *c) const
+  {
+    if (unlikely (!c->buffer->successful)) return;
+    c->set_lookup_index (0);
+    const Chain<Types> *chain = &firstChain;
+    unsigned int count = chainCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      chain->apply (c, c->plan->aat_map.chain_flags[i]);
+      if (unlikely (!c->buffer->successful)) return;
+      chain = &StructAfter<Chain<Types> > (*chain);
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!version.sanitize (c) || !version || !chainCount.sanitize (c))
+      return_trace (false);
+
+    const Chain<Types> *chain = &firstChain;
+    unsigned int count = chainCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (!chain->sanitize (c, version))
+	return_trace (false);
+      chain = &StructAfter<Chain<Types> > (*chain);
+    }
+
+    return_trace (true);
+  }
+
+  protected:
+  HBUINT16	version;	/* Version number of the glyph metamorphosis table.
+				 * 1, 2, or 3. */
+  HBUINT16	unused;		/* Set to 0. */
+  HBUINT32	chainCount;	/* Number of metamorphosis chains contained in this
+				 * table. */
+  Chain<Types>	firstChain;	/* Chains. */
+
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+struct morx : mortmorx<ExtendedTypes>
+{
+  static constexpr hb_tag_t tableTag = HB_AAT_TAG_morx;
+};
+struct mort : mortmorx<ObsoleteTypes>
+{
+  static constexpr hb_tag_t tableTag = HB_AAT_TAG_mort;
+};
+
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_MORX_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-trak-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-trak-table.hh
new file mode 100644
index 0000000..0c8e455
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout-trak-table.hh
@@ -0,0 +1,237 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ * Copyright © 2018  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_AAT_LAYOUT_TRAK_TABLE_HH
+#define HB_AAT_LAYOUT_TRAK_TABLE_HH
+
+#include "hb-aat-layout-common.hh"
+#include "hb-ot-layout.hh"
+#include "hb-open-type.hh"
+
+/*
+ * trak -- Tracking
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6trak.html
+ */
+#define HB_AAT_TAG_trak HB_TAG('t','r','a','k')
+
+
+namespace AAT {
+
+
+struct TrackTableEntry
+{
+  friend struct TrackData;
+
+  float get_track_value () const { return track.to_float (); }
+
+  int get_value (const void *base, unsigned int index,
+		 unsigned int table_size) const
+  { return (base+valuesZ).as_array (table_size)[index]; }
+
+  public:
+  bool sanitize (hb_sanitize_context_t *c, const void *base,
+		 unsigned int table_size) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  (valuesZ.sanitize (c, base, table_size))));
+  }
+
+  protected:
+  Fixed		track;		/* Track value for this record. */
+  NameID	trackNameID;	/* The 'name' table index for this track.
+				 * (a short word or phrase like "loose"
+				 * or "very tight") */
+  NNOffsetTo<UnsizedArrayOf<FWORD> >
+		valuesZ;	/* Offset from start of tracking table to
+				 * per-size tracking values for this track. */
+
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct TrackData
+{
+  float interpolate_at (unsigned int idx,
+			float target_size,
+			const TrackTableEntry &trackTableEntry,
+			const void *base) const
+  {
+    unsigned int sizes = nSizes;
+    hb_array_t<const Fixed> size_table ((base+sizeTable).arrayZ, sizes);
+
+    float s0 = size_table[idx].to_float ();
+    float s1 = size_table[idx + 1].to_float ();
+    float t = unlikely (s0 == s1) ? 0.f : (target_size - s0) / (s1 - s0);
+    return t * trackTableEntry.get_value (base, idx + 1, sizes) +
+	   (1.f - t) * trackTableEntry.get_value (base, idx, sizes);
+  }
+
+  int get_tracking (const void *base, float ptem) const
+  {
+    /* CoreText points are CSS pixels (96 per inch),
+     * NOT typographic points (72 per inch).
+     *
+     * https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html
+     */
+    float csspx = ptem * 96.f / 72.f;
+
+    /*
+     * Choose track.
+     */
+    const TrackTableEntry *trackTableEntry = nullptr;
+    unsigned int count = nTracks;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      /* Note: Seems like the track entries are sorted by values.  But the
+       * spec doesn't explicitly say that.  It just mentions it in the example. */
+
+      /* For now we only seek for track entries with zero tracking value */
+
+      if (trackTable[i].get_track_value () == 0.f)
+      {
+	trackTableEntry = &trackTable[i];
+	break;
+      }
+    }
+    if (!trackTableEntry) return 0.;
+
+    /*
+     * Choose size.
+     */
+    unsigned int sizes = nSizes;
+    if (!sizes) return 0.;
+    if (sizes == 1) return trackTableEntry->get_value (base, 0, sizes);
+
+    hb_array_t<const Fixed> size_table ((base+sizeTable).arrayZ, sizes);
+    unsigned int size_index;
+    for (size_index = 0; size_index < sizes - 1; size_index++)
+      if (size_table[size_index].to_float () >= csspx)
+        break;
+
+    return round (interpolate_at (size_index ? size_index - 1 : 0, csspx,
+				  *trackTableEntry, base));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  sizeTable.sanitize (c, base, nSizes) &&
+			  trackTable.sanitize (c, nTracks, base, nSizes)));
+  }
+
+  protected:
+  HBUINT16	nTracks;	/* Number of separate tracks included in this table. */
+  HBUINT16	nSizes;		/* Number of point sizes included in this table. */
+  LOffsetTo<UnsizedArrayOf<Fixed>, false>
+		sizeTable;	/* Offset from start of the tracking table to
+				 * Array[nSizes] of size values.. */
+  UnsizedArrayOf<TrackTableEntry>
+		trackTable;	/* Array[nTracks] of TrackTableEntry records. */
+
+  public:
+  DEFINE_SIZE_ARRAY (8, trackTable);
+};
+
+struct trak
+{
+  static constexpr hb_tag_t tableTag = HB_AAT_TAG_trak;
+
+  bool has_data () const { return version.to_int (); }
+
+  bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    hb_mask_t trak_mask = c->plan->trak_mask;
+
+    const float ptem = c->font->ptem;
+    if (unlikely (ptem <= 0.f))
+      return_trace (false);
+
+    hb_buffer_t *buffer = c->buffer;
+    if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+    {
+      const TrackData &trackData = this+horizData;
+      int tracking = trackData.get_tracking (this, ptem);
+      hb_position_t offset_to_add = c->font->em_scalef_x (tracking / 2);
+      hb_position_t advance_to_add = c->font->em_scalef_x (tracking);
+      foreach_grapheme (buffer, start, end)
+      {
+        if (!(buffer->info[start].mask & trak_mask)) continue;
+	buffer->pos[start].x_advance += advance_to_add;
+	buffer->pos[start].x_offset += offset_to_add;
+      }
+    }
+    else
+    {
+      const TrackData &trackData = this+vertData;
+      int tracking = trackData.get_tracking (this, ptem);
+      hb_position_t offset_to_add = c->font->em_scalef_y (tracking / 2);
+      hb_position_t advance_to_add = c->font->em_scalef_y (tracking);
+      foreach_grapheme (buffer, start, end)
+      {
+        if (!(buffer->info[start].mask & trak_mask)) continue;
+	buffer->pos[start].y_advance += advance_to_add;
+	buffer->pos[start].y_offset += offset_to_add;
+      }
+    }
+
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+
+    return_trace (likely (c->check_struct (this) &&
+			  version.major == 1 &&
+			  horizData.sanitize (c, this, this) &&
+			  vertData.sanitize (c, this, this)));
+  }
+
+  protected:
+  FixedVersion<>version;	/* Version of the tracking table
+					 * (0x00010000u for version 1.0). */
+  HBUINT16	format; 	/* Format of the tracking table (set to 0). */
+  OffsetTo<TrackData>
+		horizData;	/* Offset from start of tracking table to TrackData
+				 * for horizontal text (or 0 if none). */
+  OffsetTo<TrackData>
+		vertData;	/* Offset from start of tracking table to TrackData
+				 * for vertical text (or 0 if none). */
+  HBUINT16	reserved;	/* Reserved. Set to 0. */
+
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_TRAK_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout.cc
new file mode 100644
index 0000000..5168a9c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout.cc
@@ -0,0 +1,384 @@
+/*
+ * Copyright © 2017  Google, Inc.
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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
+ */
+
+#include "hb-open-type.hh"
+
+#include "hb-ot-face.hh"
+#include "hb-aat-layout.hh"
+#include "hb-aat-fdsc-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-aat-layout-ankr-table.hh"
+#include "hb-aat-layout-bsln-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-aat-layout-feat-table.hh"
+#include "hb-aat-layout-just-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-aat-layout-kerx-table.hh"
+#include "hb-aat-layout-morx-table.hh"
+#include "hb-aat-layout-trak-table.hh"
+#include "hb-aat-ltag-table.hh"
+
+
+/**
+ * SECTION:hb-aat-layout
+ * @title: hb-aat-layout
+ * @short_description: Apple Advanced Typography Layout
+ * @include: hb-aat.h
+ *
+ * Functions for querying OpenType Layout features in the font face.
+ **/
+
+
+/* Table data courtesy of Apple.  Converted from mnemonics to integers
+ * when moving to this file. */
+static const hb_aat_feature_mapping_t feature_mappings[] =
+{
+  {HB_TAG ('a','f','r','c'), HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS,               HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS,             HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS},
+  {HB_TAG ('c','2','p','c'), HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE,              HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS,         HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE},
+  {HB_TAG ('c','2','s','c'), HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE,              HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS,          HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE},
+  {HB_TAG ('c','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON,       HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF},
+  {HB_TAG ('c','a','s','e'), HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT,   HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON,       HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF},
+  {HB_TAG ('c','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES,               HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON,        HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF},
+  {HB_TAG ('c','p','s','p'), HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT,   HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON,      HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF},
+  {HB_TAG ('c','s','w','h'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF},
+  {HB_TAG ('d','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES,               HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON,              HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF},
+  {HB_TAG ('e','x','p','t'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS,              (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('f','r','a','c'), HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS,               HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS,             HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS},
+  {HB_TAG ('f','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT,                (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('h','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT,            (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('h','i','s','t'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES,               HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON,        HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF},
+  {HB_TAG ('h','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA,          HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON,        HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF},
+  {HB_TAG ('h','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES,               HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON,        HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF},
+  {HB_TAG ('h','n','g','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION,         HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL,                HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION},
+  {HB_TAG ('h','o','j','o'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS,                (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('h','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT,                (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('i','t','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN,        HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON,            HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF},
+  {HB_TAG ('j','p','0','4'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS,             (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('j','p','7','8'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS,             (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('j','p','8','3'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS,             (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('j','p','9','0'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS,             (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('l','i','g','a'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES,               HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON,            HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF},
+  {HB_TAG ('l','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE,             HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS,             (hb_aat_layout_feature_selector_t) 2},
+  {HB_TAG ('m','g','r','k'), HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS,     HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON,          HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF},
+  {HB_TAG ('n','l','c','k'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS,                  (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('o','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE,             HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS,             (hb_aat_layout_feature_selector_t) 2},
+  {HB_TAG ('o','r','d','n'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION,       HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS,                       HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION},
+  {HB_TAG ('p','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT,          (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('p','c','a','p'), HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE,              HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS,         HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE},
+  {HB_TAG ('p','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT,              (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('p','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING,          HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS,           (hb_aat_layout_feature_selector_t) 4},
+  {HB_TAG ('p','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT,              (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('q','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT,             (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('r','u','b','y'), HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA,               HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON,                   HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF},
+  {HB_TAG ('s','i','n','f'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION,       HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS,           HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION},
+  {HB_TAG ('s','m','c','p'), HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE,              HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS,          HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE},
+  {HB_TAG ('s','m','p','l'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS,          (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('s','s','0','1'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON,           HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF},
+  {HB_TAG ('s','s','0','2'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON,           HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF},
+  {HB_TAG ('s','s','0','3'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON,         HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF},
+  {HB_TAG ('s','s','0','4'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON,          HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF},
+  {HB_TAG ('s','s','0','5'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON,          HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF},
+  {HB_TAG ('s','s','0','6'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON,           HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF},
+  {HB_TAG ('s','s','0','7'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON,         HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF},
+  {HB_TAG ('s','s','0','8'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON,         HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF},
+  {HB_TAG ('s','s','0','9'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON,          HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF},
+  {HB_TAG ('s','s','1','0'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON,           HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF},
+  {HB_TAG ('s','s','1','1'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON,        HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF},
+  {HB_TAG ('s','s','1','2'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON,        HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF},
+  {HB_TAG ('s','s','1','3'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON,      HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF},
+  {HB_TAG ('s','s','1','4'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON,      HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF},
+  {HB_TAG ('s','s','1','5'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON,       HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF},
+  {HB_TAG ('s','s','1','6'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON,       HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF},
+  {HB_TAG ('s','s','1','7'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON,     HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF},
+  {HB_TAG ('s','s','1','8'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON,      HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF},
+  {HB_TAG ('s','s','1','9'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON,      HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF},
+  {HB_TAG ('s','s','2','0'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON,        HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF},
+  {HB_TAG ('s','u','b','s'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION,       HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS,                      HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION},
+  {HB_TAG ('s','u','p','s'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION,       HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS,                      HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION},
+  {HB_TAG ('s','w','s','h'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON,            HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF},
+  {HB_TAG ('t','i','t','l'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS,           HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS,                   HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS},
+  {HB_TAG ('t','n','a','m'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS,   (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('t','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING,          HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS,             (hb_aat_layout_feature_selector_t) 4},
+  {HB_TAG ('t','r','a','d'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS,         (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('t','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT,               (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('u','n','i','c'), HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE,             (hb_aat_layout_feature_selector_t) 14,                 (hb_aat_layout_feature_selector_t) 15},
+  {HB_TAG ('v','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT,          (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('v','e','r','t'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION,   HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON,   HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF},
+  {HB_TAG ('v','h','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT,            (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('v','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA,          HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON,         HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF},
+  {HB_TAG ('v','p','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT,          (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('v','r','t','2'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION,   HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON,   HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF},
+  {HB_TAG ('z','e','r','o'), HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS,      HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON,                HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF},
+};
+
+const hb_aat_feature_mapping_t *
+hb_aat_layout_find_feature_mapping (hb_tag_t tag)
+{
+  return (const hb_aat_feature_mapping_t *) bsearch (&tag,
+						     feature_mappings,
+						     ARRAY_LENGTH (feature_mappings),
+						     sizeof (feature_mappings[0]),
+						     hb_aat_feature_mapping_t::cmp);
+}
+
+
+/*
+ * hb_aat_apply_context_t
+ */
+
+AAT::hb_aat_apply_context_t::hb_aat_apply_context_t (const hb_ot_shape_plan_t *plan_,
+						     hb_font_t *font_,
+						     hb_buffer_t *buffer_,
+						     hb_blob_t *blob) :
+						       plan (plan_),
+						       font (font_),
+						       face (font->face),
+						       buffer (buffer_),
+						       sanitizer (),
+						       ankr_table (&Null(AAT::ankr)),
+						       lookup_index (0),
+						       debug_depth (0)
+{
+  sanitizer.init (blob);
+  sanitizer.set_num_glyphs (face->get_num_glyphs ());
+  sanitizer.start_processing ();
+  sanitizer.set_max_ops (HB_SANITIZE_MAX_OPS_MAX);
+}
+
+AAT::hb_aat_apply_context_t::~hb_aat_apply_context_t ()
+{ sanitizer.end_processing (); }
+
+void
+AAT::hb_aat_apply_context_t::set_ankr_table (const AAT::ankr *ankr_table_)
+{ ankr_table = ankr_table_; }
+
+
+/*
+ * mort/morx/kerx/trak
+ */
+
+
+void
+hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper,
+			   hb_aat_map_t *map)
+{
+  const AAT::morx& morx = *mapper->face->table.morx;
+  if (morx.has_data ())
+  {
+    morx.compile_flags (mapper, map);
+    return;
+  }
+
+  const AAT::mort& mort = *mapper->face->table.mort;
+  if (mort.has_data ())
+  {
+    mort.compile_flags (mapper, map);
+    return;
+  }
+}
+
+
+/*
+ * hb_aat_layout_has_substitution:
+ * @face:
+ *
+ * Returns:
+ * Since: 2.3.0
+ */
+hb_bool_t
+hb_aat_layout_has_substitution (hb_face_t *face)
+{
+  return face->table.morx->has_data () ||
+	 face->table.mort->has_data ();
+}
+
+void
+hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan,
+			  hb_font_t *font,
+			  hb_buffer_t *buffer)
+{
+  hb_blob_t *morx_blob = font->face->table.morx.get_blob ();
+  const AAT::morx& morx = *morx_blob->as<AAT::morx> ();
+  if (morx.has_data ())
+  {
+    AAT::hb_aat_apply_context_t c (plan, font, buffer, morx_blob);
+    morx.apply (&c);
+    return;
+  }
+
+  hb_blob_t *mort_blob = font->face->table.mort.get_blob ();
+  const AAT::mort& mort = *mort_blob->as<AAT::mort> ();
+  if (mort.has_data ())
+  {
+    AAT::hb_aat_apply_context_t c (plan, font, buffer, mort_blob);
+    mort.apply (&c);
+    return;
+  }
+}
+
+void
+hb_aat_layout_zero_width_deleted_glyphs (hb_buffer_t *buffer)
+{
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  hb_glyph_position_t *pos = buffer->pos;
+  for (unsigned int i = 0; i < count; i++)
+    if (unlikely (info[i].codepoint == AAT::DELETED_GLYPH))
+      pos[i].x_advance = pos[i].y_advance = pos[i].x_offset = pos[i].y_offset = 0;
+}
+
+static bool
+is_deleted_glyph (const hb_glyph_info_t *info)
+{
+  return info->codepoint == AAT::DELETED_GLYPH;
+}
+
+void
+hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer)
+{
+  hb_ot_layout_delete_glyphs_inplace (buffer, is_deleted_glyph);
+}
+
+/*
+ * hb_aat_layout_has_positioning:
+ * @face:
+ *
+ * Returns:
+ * Since: 2.3.0
+ */
+hb_bool_t
+hb_aat_layout_has_positioning (hb_face_t *face)
+{
+  return face->table.kerx->has_data ();
+}
+
+void
+hb_aat_layout_position (const hb_ot_shape_plan_t *plan,
+			hb_font_t *font,
+			hb_buffer_t *buffer)
+{
+  hb_blob_t *kerx_blob = font->face->table.kerx.get_blob ();
+  const AAT::kerx& kerx = *kerx_blob->as<AAT::kerx> ();
+
+  AAT::hb_aat_apply_context_t c (plan, font, buffer, kerx_blob);
+  c.set_ankr_table (font->face->table.ankr.get ());
+  kerx.apply (&c);
+}
+
+
+/*
+ * hb_aat_layout_has_tracking:
+ * @face:
+ *
+ * Returns:
+ * Since: 2.3.0
+ */
+hb_bool_t
+hb_aat_layout_has_tracking (hb_face_t *face)
+{
+  return face->table.trak->has_data ();
+}
+
+void
+hb_aat_layout_track (const hb_ot_shape_plan_t *plan,
+		     hb_font_t *font,
+		     hb_buffer_t *buffer)
+{
+  const AAT::trak& trak = *font->face->table.trak;
+
+  AAT::hb_aat_apply_context_t c (plan, font, buffer);
+  trak.apply (&c);
+}
+
+
+hb_language_t
+_hb_aat_language_get (hb_face_t *face,
+		      unsigned int i)
+{
+  return face->table.ltag->get_language (i);
+}
+
+/**
+ * hb_aat_layout_get_feature_types:
+ * @face: a face object
+ * @start_offset: iteration's start offset
+ * @feature_count:(inout) (allow-none): buffer size as input, filled size as output
+ * @features: (out caller-allocates) (array length=feature_count): features buffer
+ *
+ * Return value: Number of all available feature types.
+ *
+ * Since: 2.2.0
+ */
+unsigned int
+hb_aat_layout_get_feature_types (hb_face_t                    *face,
+				 unsigned int                  start_offset,
+				 unsigned int                 *feature_count, /* IN/OUT.  May be NULL. */
+				 hb_aat_layout_feature_type_t *features       /* OUT.     May be NULL. */)
+{
+  return face->table.feat->get_feature_types (start_offset, feature_count, features);
+}
+
+/**
+ * hb_aat_layout_feature_type_get_name_id:
+ * @face: a face object
+ * @feature_type: feature id
+ *
+ * Return value: Name ID index
+ *
+ * Since: 2.2.0
+ */
+hb_ot_name_id_t
+hb_aat_layout_feature_type_get_name_id (hb_face_t                    *face,
+					hb_aat_layout_feature_type_t  feature_type)
+{
+  return face->table.feat->get_feature_name_id (feature_type);
+}
+
+/**
+ * hb_aat_layout_feature_type_get_selectors:
+ * @face:    a face object
+ * @feature_type: feature id
+ * @start_offset:    iteration's start offset
+ * @selector_count: (inout) (allow-none): buffer size as input, filled size as output
+ * @selectors: (out caller-allocates) (array length=selector_count): settings buffer
+ * @default_index: (out) (allow-none): index of default selector if any
+ *
+ * If upon return, @default_index is set to #HB_AAT_LAYOUT_NO_SELECTOR_INDEX, then
+ * the feature type is non-exclusive.  Otherwise, @default_index is the index of
+ * the selector that is selected by default.
+ *
+ * Return value: Number of all available feature selectors.
+ *
+ * Since: 2.2.0
+ */
+unsigned int
+hb_aat_layout_feature_type_get_selector_infos (hb_face_t                             *face,
+					       hb_aat_layout_feature_type_t           feature_type,
+					       unsigned int                           start_offset,
+					       unsigned int                          *selector_count, /* IN/OUT.  May be NULL. */
+					       hb_aat_layout_feature_selector_info_t *selectors,      /* OUT.     May be NULL. */
+					       unsigned int                          *default_index   /* OUT.     May be NULL. */)
+{
+  return face->table.feat->get_selector_infos (feature_type, start_offset, selector_count, selectors, default_index);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout.h
new file mode 100644
index 0000000..760aaae4
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout.h
@@ -0,0 +1,486 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_AAT_H_IN
+#error "Include <hb-aat.h> instead."
+#endif
+
+#ifndef HB_AAT_LAYOUT_H
+#define HB_AAT_LAYOUT_H
+
+#include "hb.h"
+
+#include "hb-ot.h"
+
+HB_BEGIN_DECLS
+
+/**
+ * hb_aat_layout_feature_type_t:
+ *
+ *
+ * Since: 2.2.0
+ */
+typedef enum
+{
+  HB_AAT_LAYOUT_FEATURE_TYPE_INVALID				= 0xFFFF,
+
+  HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC			= 0,
+  HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES				= 1,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION			= 2,
+  HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE			= 3,
+  HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION		= 4,
+  HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT		= 5,
+  HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING			= 6,
+  HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE			= 8,
+  HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE			= 9,
+  HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION			= 10,
+  HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS				= 11,
+  HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE	= 13,
+  HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS			= 14,
+  HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS		= 15,
+  HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE			= 16,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES		= 17,
+  HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE		= 18,
+  HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS			= 19,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE			= 20,
+  HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE			= 21,
+  HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING			= 22,
+  HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION			= 23,
+  HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE			= 24,
+  HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE			= 25,
+  HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE		= 26,
+  HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE		= 27,
+  HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA				= 28,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE	= 29,
+  HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE	= 30,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE	= 31,
+  HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN			= 32,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT		= 33,
+  HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA			= 34,
+  HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES		= 35,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES		= 36,
+  HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE				= 37,
+  HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE				= 38,
+  HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE			= 39,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE		= 103,
+
+  _HB_AAT_LAYOUT_FEATURE_TYPE_MAX_VALUE= 0x7FFFFFFFu, /*< skip >*/
+} hb_aat_layout_feature_type_t;
+
+/**
+ * hb_aat_layout_feature_selector_t:
+ *
+ *
+ * Since: 2.2.0
+ */
+typedef enum
+{
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID			= 0xFFFF,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_ON		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_OFF		= 1,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_ON		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_OFF		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_ON			= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_OFF			= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_ON		= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_OFF		= 9,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_ON		= 10,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_OFF	= 11,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_ON		= 12,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_OFF		= 13,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_ON	= 14,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_OFF	= 15,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_ON		= 16,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_OFF		= 17,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON	= 18,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF	= 19,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON	= 20,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF	= 21,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_UNCONNECTED			= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PARTIALLY_CONNECTED		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CURSIVE			= 2,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_AND_LOWER_CASE		= 0, /* deprecated */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_CAPS			= 1, /* deprecated */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_LOWER_CASE			= 2, /* deprecated */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS			= 3, /* deprecated */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS			= 4, /* deprecated */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS_AND_SMALL_CAPS	= 5, /* deprecated */
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF	= 1,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_ON	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_OFF	= 1,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_NUMBERS		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_NUMBERS		= 3,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_ON	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_OFF	= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_ON		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_OFF		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_ON	= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_OFF	= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_ON		= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_OFF		= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_ON		= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_OFF		= 9,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SHOW_DIACRITICS		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HIDE_DIACRITICS		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DECOMPOSE_DIACRITICS		= 2,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS			= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS			= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS			= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS		= 4,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS			= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS		= 2,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_ON		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_OFF		= 1,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_ON		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_OFF		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_ON		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_OFF		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_ON		= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_OFF		= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_ON		= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_OFF		= 9,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_ON		= 10,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_OFF	= 11,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_ON		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_OFF		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_ON	= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_OFF	= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_ON		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_OFF		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_ON	= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_OFF	= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_ON			= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_OFF			= 9,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON		= 10,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF		= 11,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ORNAMENTS			= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DINGBATS			= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PI_CHARACTERS			= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_FLEURONS			= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DECORATIVE_BORDERS		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INTERNATIONAL_SYMBOLS		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_MATH_SYMBOLS			= 6,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ALTERNATES			= 0,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL1			= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL2			= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL3			= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL4			= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL5			= 4,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DISPLAY_TEXT			= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ENGRAVED_TEXT			= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ILLUMINATED_CAPS		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS			= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TALL_CAPS			= 5,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_ONE		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_TWO		= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_THREE		= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FOUR		= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FIVE		= 9,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS		= 10,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS		= 11,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS		= 12,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS			= 13,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS	= 14,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS		= 1,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT		= 6,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HIRAGANA_TO_KATAKANA		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_KATAKANA_TO_HIRAGANA		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_KANA_TO_ROMANIZATION		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_HIRAGANA	= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_KATAKANA	= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_ONE	= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_TWO	= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_THREE	= 9,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ANNOTATION			= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_BOX_ANNOTATION			= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ROUNDED_BOX_ANNOTATION		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CIRCLE_ANNOTATION		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_CIRCLE_ANNOTATION	= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PARENTHESIS_ANNOTATION		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIOD_ANNOTATION		= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMAN_NUMERAL_ANNOTATION	= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAMOND_ANNOTATION		= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_BOX_ANNOTATION	= 9,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_ROUNDED_BOX_ANNOTATION= 10,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_KANA		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_KANA		= 1,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_IDEOGRAPHS		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_IDEOGRAPHS	= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_IDEOGRAPHS		= 2,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_ON	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_OFF	= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_ON	= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_OFF	= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_ON	= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_OFF	= 5,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_RUBY_KANA			= 0, /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF instead */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA			= 1, /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON instead */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON			= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF			= 3,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_SYMBOL_ALTERNATIVES	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_ONE		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_TWO		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_THREE		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FOUR		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FIVE		= 5,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_IDEOGRAPHIC_ALTERNATIVES	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_ONE		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_TWO		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_THREE		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FOUR		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FIVE		= 5,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_CENTERED	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_HBASELINE	= 1,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_ITALIC_ROMAN		= 0,    /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF instead */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN		= 1,    /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON instead */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF		= 3,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF	= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON	= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF	= 3,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF	= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF	= 3,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLISTIC_ALTERNATES	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON		= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF	= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON		= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF		= 9,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON		= 10,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF		= 11,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON		= 12,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF		= 13,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON		= 14,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF	= 15,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON		= 16,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF	= 17,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON		= 18,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF		= 19,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON		= 20,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF		= 21,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON	= 22,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF	= 23,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON	= 24,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF	= 25,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON	= 26,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF	= 27,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON	= 28,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF	= 29,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON	= 30,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF	= 31,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON	= 32,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF	= 33,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON	= 34,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF	= 35,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON	= 36,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF	= 37,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON	= 38,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF	= 39,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON	= 40,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF	= 41,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF	= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON	= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF= 5,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS		= 2,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS		= 2,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_CJK_ROMAN		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_CJK_ROMAN		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN		= 3,
+
+  _HB_AAT_LAYOUT_FEATURE_SELECTOR_MAX_VALUE= 0x7FFFFFFFu, /*< skip >*/
+} hb_aat_layout_feature_selector_t;
+
+HB_EXTERN unsigned int
+hb_aat_layout_get_feature_types (hb_face_t                    *face,
+				 unsigned int                  start_offset,
+				 unsigned int                 *feature_count, /* IN/OUT.  May be NULL. */
+				 hb_aat_layout_feature_type_t *features       /* OUT.     May be NULL. */);
+
+HB_EXTERN hb_ot_name_id_t
+hb_aat_layout_feature_type_get_name_id (hb_face_t                    *face,
+					hb_aat_layout_feature_type_t  feature_type);
+
+typedef struct hb_aat_layout_feature_selector_info_t
+{
+  hb_ot_name_id_t			name_id;
+  hb_aat_layout_feature_selector_t	enable;
+  hb_aat_layout_feature_selector_t	disable;
+  /*< private >*/
+  unsigned int				reserved;
+} hb_aat_layout_feature_selector_info_t;
+
+#define HB_AAT_LAYOUT_NO_SELECTOR_INDEX		0xFFFFu
+
+HB_EXTERN unsigned int
+hb_aat_layout_feature_type_get_selector_infos (hb_face_t                             *face,
+					       hb_aat_layout_feature_type_t           feature_type,
+					       unsigned int                           start_offset,
+					       unsigned int                          *selector_count, /* IN/OUT.  May be NULL. */
+					       hb_aat_layout_feature_selector_info_t *selectors,      /* OUT.     May be NULL. */
+					       unsigned int                          *default_index   /* OUT.     May be NULL. */);
+
+
+/*
+ * morx/mort
+ */
+
+HB_EXTERN hb_bool_t
+hb_aat_layout_has_substitution (hb_face_t *face);
+
+
+/*
+ * kerx
+ */
+
+HB_EXTERN hb_bool_t
+hb_aat_layout_has_positioning (hb_face_t *face);
+
+
+/*
+ * trak
+ */
+
+HB_EXTERN hb_bool_t
+hb_aat_layout_has_tracking (hb_face_t *face);
+
+
+HB_END_DECLS
+
+#endif /* HB_AAT_LAYOUT_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout.hh
new file mode 100644
index 0000000..8346d9f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-layout.hh
@@ -0,0 +1,85 @@
+/*
+ * Copyright © 2017  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_AAT_LAYOUT_HH
+#define HB_AAT_LAYOUT_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape.hh"
+
+
+struct hb_aat_feature_mapping_t
+{
+  hb_tag_t otFeatureTag;
+  hb_aat_layout_feature_type_t aatFeatureType;
+  hb_aat_layout_feature_selector_t selectorToEnable;
+  hb_aat_layout_feature_selector_t selectorToDisable;
+
+  static int cmp (const void *key_, const void *entry_)
+  {
+    hb_tag_t key = * (unsigned int *) key_;
+    const hb_aat_feature_mapping_t * entry = (const hb_aat_feature_mapping_t *) entry_;
+    return key < entry->otFeatureTag ? -1 :
+	   key > entry->otFeatureTag ? 1 :
+	   0;
+  }
+};
+
+HB_INTERNAL const hb_aat_feature_mapping_t *
+hb_aat_layout_find_feature_mapping (hb_tag_t tag);
+
+HB_INTERNAL void
+hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper,
+			   hb_aat_map_t *map);
+
+HB_INTERNAL void
+hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan,
+			  hb_font_t *font,
+			  hb_buffer_t *buffer);
+
+HB_INTERNAL void
+hb_aat_layout_zero_width_deleted_glyphs (hb_buffer_t *buffer);
+
+HB_INTERNAL void
+hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer);
+
+HB_INTERNAL void
+hb_aat_layout_position (const hb_ot_shape_plan_t *plan,
+			hb_font_t *font,
+			hb_buffer_t *buffer);
+
+HB_INTERNAL void
+hb_aat_layout_track (const hb_ot_shape_plan_t *plan,
+		     hb_font_t *font,
+		     hb_buffer_t *buffer);
+
+HB_INTERNAL hb_language_t
+_hb_aat_language_get (hb_face_t *face,
+		      unsigned int i);
+
+
+#endif /* HB_AAT_LAYOUT_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-ltag-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-ltag-table.hh
new file mode 100644
index 0000000..6f34a00
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-ltag-table.hh
@@ -0,0 +1,92 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_AAT_LTAG_TABLE_HH
+#define HB_AAT_LTAG_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * ltag -- Language Tag
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6ltag.html
+ */
+#define HB_AAT_TAG_ltag HB_TAG('l','t','a','g')
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+struct FTStringRange
+{
+  friend struct ltag;
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && (base+tag).sanitize (c, length));
+  }
+
+  protected:
+  NNOffsetTo<UnsizedArrayOf<HBUINT8> >
+		tag;		/* Offset from the start of the table to
+				 * the beginning of the string */
+  HBUINT16	length;		/* String length (in bytes) */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct ltag
+{
+  static constexpr hb_tag_t tableTag = HB_AAT_TAG_ltag;
+
+  hb_language_t get_language (unsigned int i) const
+  {
+    const FTStringRange &range = tagRanges[i];
+    return hb_language_from_string ((const char *) (this+range.tag).arrayZ,
+				    range.length);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  version >= 1 &&
+			  tagRanges.sanitize (c, this)));
+  }
+
+  protected:
+  HBUINT32	version;	/* Table version; currently 1 */
+  HBUINT32	flags;		/* Table flags; currently none defined */
+  LArrayOf<FTStringRange>
+		tagRanges;	/* Range for each tag's string */
+  public:
+  DEFINE_SIZE_ARRAY (12, tagRanges);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LTAG_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-map.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-map.cc
new file mode 100644
index 0000000..98c5d7f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-map.cc
@@ -0,0 +1,68 @@
+/*
+ * Copyright © 2009,2010  Red Hat, Inc.
+ * Copyright © 2010,2011,2013  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-aat-map.hh"
+
+#include "hb-aat-layout.hh"
+
+
+void hb_aat_map_builder_t::add_feature (hb_tag_t tag,
+					unsigned int value)
+{
+  if (tag == HB_TAG ('a','a','l','t'))
+  {
+    feature_info_t *info = features.push();
+    info->type = HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES;
+    info->setting = (hb_aat_layout_feature_selector_t) value;
+    return;
+  }
+
+  const hb_aat_feature_mapping_t *mapping = hb_aat_layout_find_feature_mapping (tag);
+  if (!mapping) return;
+
+  feature_info_t *info = features.push();
+  info->type = mapping->aatFeatureType;
+  info->setting = value ? mapping->selectorToEnable : mapping->selectorToDisable;
+}
+
+void
+hb_aat_map_builder_t::compile (hb_aat_map_t  &m)
+{
+  /* Sort features and merge duplicates */
+  if (features.length)
+  {
+    features.qsort ();
+    unsigned int j = 0;
+    for (unsigned int i = 1; i < features.length; i++)
+      if (features[i].type != features[j].type)
+	features[++j] = features[i];
+    features.shrink (j + 1);
+  }
+
+  hb_aat_layout_compile_map (this, &m);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-map.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-map.hh
new file mode 100644
index 0000000..3d5ad0e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat-map.hh
@@ -0,0 +1,91 @@
+/*
+ * Copyright © 2018  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_AAT_MAP_HH
+#define HB_AAT_MAP_HH
+
+#include "hb.hh"
+
+
+struct hb_aat_map_t
+{
+  friend struct hb_aat_map_builder_t;
+
+  public:
+
+  void init ()
+  {
+    memset (this, 0, sizeof (*this));
+    chain_flags.init ();
+  }
+  void fini () { chain_flags.fini (); }
+
+  public:
+  hb_vector_t<hb_mask_t> chain_flags;
+};
+
+struct hb_aat_map_builder_t
+{
+  public:
+
+  HB_INTERNAL hb_aat_map_builder_t (hb_face_t *face_,
+				    const hb_segment_properties_t *props_ HB_UNUSED) :
+				      face (face_) {}
+
+  HB_INTERNAL void add_feature (hb_tag_t tag, unsigned int value=1);
+
+  HB_INTERNAL void compile (hb_aat_map_t  &m);
+
+  public:
+  struct feature_info_t
+  {
+    hb_aat_layout_feature_type_t  type;
+    hb_aat_layout_feature_selector_t  setting;
+    unsigned  seq; /* For stable sorting only. */
+
+    static int cmp (const void *pa, const void *pb)
+    {
+      const feature_info_t *a = (const feature_info_t *) pa;
+      const feature_info_t *b = (const feature_info_t *) pb;
+      return (a->type != b->type) ? (a->type < b->type ? -1 : 1) :
+	     (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0);
+    }
+
+    int cmp (hb_aat_layout_feature_type_t ty) const
+    {
+      return (type != ty) ? (type < ty ? -1 : 1) : 0;
+    }
+  };
+
+  public:
+  hb_face_t *face;
+
+  public:
+  hb_vector_t<feature_info_t> features;
+};
+
+
+#endif /* HB_AAT_MAP_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat.h
new file mode 100644
index 0000000..c14313d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-aat.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_AAT_H
+#define HB_AAT_H
+#define HB_AAT_H_IN
+
+#include "hb.h"
+
+#include "hb-aat-layout.h"
+
+HB_BEGIN_DECLS
+
+HB_END_DECLS
+
+#undef HB_AAT_H_IN
+#endif /* HB_AAT_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-array.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-array.hh
new file mode 100644
index 0000000..52b775e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-array.hh
@@ -0,0 +1,277 @@
+/*
+ * Copyright © 2018  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_ARRAY_HH
+#define HB_ARRAY_HH
+
+#include "hb.hh"
+#include "hb-dsalgs.hh"
+#include "hb-iter.hh"
+#include "hb-null.hh"
+
+
+template <typename Type>
+struct hb_sorted_array_t;
+
+template <typename Type>
+struct hb_array_t :
+	hb_iter_t<hb_array_t<Type>, Type>,
+	hb_iter_mixin_t<hb_array_t<Type>, Type>
+{
+  /*
+   * Constructors.
+   */
+  hb_array_t () : arrayZ (nullptr), length (0) {}
+  hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
+  template <unsigned int length_> hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_) {}
+
+
+  /*
+   * Iterator implementation.
+   */
+  typedef Type __item_type__;
+  Type& __item_at__ (unsigned i) const
+  {
+    if (unlikely (i >= length)) return CrapOrNull (Type);
+    return arrayZ[i];
+  }
+  void __forward__ (unsigned n)
+  {
+    if (unlikely (n > length))
+      n = length;
+    length -= n;
+    arrayZ += n;
+  }
+  void __rewind__ (unsigned n)
+  {
+    if (unlikely (n > length))
+      n = length;
+    length -= n;
+  }
+  unsigned __len__ () const { return length; }
+  bool __random_access__ () const { return true; }
+
+  /* Extra operators.
+   */
+  Type * operator & () const { return arrayZ; }
+  operator hb_array_t<const Type> () { return hb_array_t<const Type> (arrayZ, length); }
+  template <typename T> operator T * () const { return arrayZ; }
+
+  /*
+   * Compare, Sort, and Search.
+   */
+
+  /* Note: our compare is NOT lexicographic; it also does NOT call Type::cmp. */
+  int cmp (const hb_array_t<Type> &a) const
+  {
+    if (length != a.length)
+      return (int) a.length - (int) length;
+    return hb_memcmp (a.arrayZ, arrayZ, get_size ());
+  }
+  static int cmp (const void *pa, const void *pb)
+  {
+    hb_array_t<Type> *a = (hb_array_t<Type> *) pa;
+    hb_array_t<Type> *b = (hb_array_t<Type> *) pb;
+    return b->cmp (*a);
+  }
+
+  template <typename T>
+  Type *lsearch (const T &x, Type *not_found = nullptr)
+  {
+    unsigned int count = length;
+    for (unsigned int i = 0; i < count; i++)
+      if (!this->arrayZ[i].cmp (x))
+	return &this->arrayZ[i];
+    return not_found;
+  }
+  template <typename T>
+  const Type *lsearch (const T &x, const Type *not_found = nullptr) const
+  {
+    unsigned int count = length;
+    for (unsigned int i = 0; i < count; i++)
+      if (!this->arrayZ[i].cmp (x))
+	return &this->arrayZ[i];
+    return not_found;
+  }
+
+  hb_sorted_array_t<Type> qsort (int (*cmp_)(const void*, const void*))
+  {
+    if (likely (length))
+      ::qsort (arrayZ, length, this->item_size, cmp_);
+    return hb_sorted_array_t<Type> (*this);
+  }
+  hb_sorted_array_t<Type> qsort ()
+  {
+    if (likely (length))
+      ::qsort (arrayZ, length, this->item_size, Type::cmp);
+    return hb_sorted_array_t<Type> (*this);
+  }
+  void qsort (unsigned int start, unsigned int end)
+  {
+    end = MIN (end, length);
+    assert (start <= end);
+    if (likely (start < end))
+      ::qsort (arrayZ + start, end - start, this->item_size, Type::cmp);
+  }
+
+  /*
+   * Other methods.
+   */
+
+  unsigned int get_size () const { return length * this->item_size; }
+
+  hb_array_t<Type> sub_array (unsigned int start_offset = 0, unsigned int *seg_count = nullptr /* IN/OUT */) const
+  {
+    if (!start_offset && !seg_count)
+      return *this;
+
+    unsigned int count = length;
+    if (unlikely (start_offset > count))
+      count = 0;
+    else
+      count -= start_offset;
+    if (seg_count)
+      count = *seg_count = MIN (count, *seg_count);
+    return hb_array_t<Type> (arrayZ + start_offset, count);
+  }
+  hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int seg_count) const
+  { return sub_array (start_offset, &seg_count); }
+
+  /* Only call if you allocated the underlying array using malloc() or similar. */
+  void free ()
+  { ::free ((void *) arrayZ); arrayZ = nullptr; length = 0; }
+
+  template <typename hb_sanitize_context_t>
+  bool sanitize (hb_sanitize_context_t *c) const
+  { return c->check_array (arrayZ, length); }
+
+  /*
+   * Members
+   */
+
+  public:
+  Type *arrayZ;
+  unsigned int length;
+};
+template <typename T> inline hb_array_t<T>
+hb_array (T *array, unsigned int length)
+{ return hb_array_t<T> (array, length); }
+template <typename T, unsigned int length_> inline hb_array_t<T>
+hb_array (T (&array_)[length_])
+{ return hb_array_t<T> (array_); }
+
+
+enum hb_bfind_not_found_t
+{
+  HB_BFIND_NOT_FOUND_DONT_STORE,
+  HB_BFIND_NOT_FOUND_STORE,
+  HB_BFIND_NOT_FOUND_STORE_CLOSEST,
+};
+
+template <typename Type>
+struct hb_sorted_array_t :
+	hb_sorted_iter_t<hb_sorted_array_t<Type>, Type>,
+	hb_array_t<Type>,
+	hb_iter_mixin_t<hb_sorted_array_t<Type>, Type>
+{
+  hb_sorted_array_t () : hb_array_t<Type> () {}
+  hb_sorted_array_t (const hb_array_t<Type> &o) : hb_array_t<Type> (o) {}
+  hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t<Type> (array_, length_) {}
+  template <unsigned int length_> hb_sorted_array_t (Type (&array_)[length_]) : hb_array_t<Type> (array_) {}
+
+  hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int *seg_count /* IN/OUT */) const
+  { return hb_sorted_array_t<Type> (((const hb_array_t<Type> *) (this))->sub_array (start_offset, seg_count)); }
+  hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int seg_count) const
+  { return sub_array (start_offset, &seg_count); }
+
+  template <typename T>
+  Type *bsearch (const T &x, Type *not_found = nullptr)
+  {
+    unsigned int i;
+    return bfind (x, &i) ? &this->arrayZ[i] : not_found;
+  }
+  template <typename T>
+  const Type *bsearch (const T &x, const Type *not_found = nullptr) const
+  {
+    unsigned int i;
+    return bfind (x, &i) ? &this->arrayZ[i] : not_found;
+  }
+  template <typename T>
+  bool bfind (const T &x, unsigned int *i = nullptr,
+		     hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+		     unsigned int to_store = (unsigned int) -1) const
+  {
+    int min = 0, max = (int) this->length - 1;
+    const Type *array = this->arrayZ;
+    while (min <= max)
+    {
+      int mid = ((unsigned int) min + (unsigned int) max) / 2;
+      int c = array[mid].cmp (x);
+      if (c < 0)
+        max = mid - 1;
+      else if (c > 0)
+        min = mid + 1;
+      else
+      {
+	if (i)
+	  *i = mid;
+	return true;
+      }
+    }
+    if (i)
+    {
+      switch (not_found)
+      {
+	case HB_BFIND_NOT_FOUND_DONT_STORE:
+	  break;
+
+	case HB_BFIND_NOT_FOUND_STORE:
+	  *i = to_store;
+	  break;
+
+	case HB_BFIND_NOT_FOUND_STORE_CLOSEST:
+	  if (max < 0 || (max < (int) this->length && array[max].cmp (x) > 0))
+	    max++;
+	  *i = max;
+	  break;
+      }
+    }
+    return false;
+  }
+};
+template <typename T> inline hb_sorted_array_t<T>
+hb_sorted_array (T *array, unsigned int length)
+{ return hb_sorted_array_t<T> (array, length); }
+template <typename T, unsigned int length_> inline hb_sorted_array_t<T>
+hb_sorted_array (T (&array_)[length_])
+{ return hb_sorted_array_t<T> (array_); }
+
+
+typedef hb_array_t<const char> hb_bytes_t;
+typedef hb_array_t<const unsigned char> hb_ubytes_t;
+
+
+#endif /* HB_ARRAY_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-atomic.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-atomic.hh
new file mode 100644
index 0000000..9321932
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-atomic.hh
@@ -0,0 +1,300 @@
+/*
+ * Copyright © 2007  Chris Wilson
+ * Copyright © 2009,2010  Red Hat, Inc.
+ * Copyright © 2011,2012  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.
+ *
+ * Contributor(s):
+ *	Chris Wilson <chris@chris-wilson.co.uk>
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_ATOMIC_HH
+#define HB_ATOMIC_HH
+
+#include "hb.hh"
+
+
+/*
+ * Atomic integers and pointers.
+ */
+
+
+/* We need external help for these */
+
+#if defined(hb_atomic_int_impl_add) \
+ && defined(hb_atomic_ptr_impl_get) \
+ && defined(hb_atomic_ptr_impl_cmpexch)
+
+/* Defined externally, i.e. in config.h. */
+
+
+#elif !defined(HB_NO_MT) && defined(__ATOMIC_ACQUIRE)
+
+/* C++11-style GCC primitives. */
+
+#define _hb_memory_barrier()			__sync_synchronize ()
+
+#define hb_atomic_int_impl_add(AI, V)		__atomic_fetch_add ((AI), (V), __ATOMIC_ACQ_REL)
+#define hb_atomic_int_impl_set_relaxed(AI, V)	__atomic_store_n ((AI), (V), __ATOMIC_RELAXED)
+#define hb_atomic_int_impl_set(AI, V)		__atomic_store_n ((AI), (V), __ATOMIC_RELEASE)
+#define hb_atomic_int_impl_get_relaxed(AI)	__atomic_load_n ((AI), __ATOMIC_RELAXED)
+#define hb_atomic_int_impl_get(AI)		__atomic_load_n ((AI), __ATOMIC_ACQUIRE)
+
+#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
+#define hb_atomic_ptr_impl_get_relaxed(P)	__atomic_load_n ((P), __ATOMIC_RELAXED)
+#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
+static inline bool
+_hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N)
+{
+  const void *O = O_; // Need lvalue
+  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
+}
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
+
+#elif !defined(HB_NO_MT) && __cplusplus >= 201103L
+
+/* C++11 atomics. */
+
+#include <atomic>
+
+#define _hb_memory_barrier()			std::atomic_thread_fence(std::memory_order_ack_rel)
+#define _hb_memory_r_barrier()			std::atomic_thread_fence(std::memory_order_acquire)
+#define _hb_memory_w_barrier()			std::atomic_thread_fence(std::memory_order_release)
+
+#define hb_atomic_int_impl_add(AI, V)		(reinterpret_cast<std::atomic<int> *> (AI)->fetch_add ((V), std::memory_order_acq_rel))
+#define hb_atomic_int_impl_set_relaxed(AI, V)	(reinterpret_cast<std::atomic<int> *> (AI)->store ((V), std::memory_order_relaxed))
+#define hb_atomic_int_impl_set(AI, V)		(reinterpret_cast<std::atomic<int> *> (AI)->store ((V), std::memory_order_release))
+#define hb_atomic_int_impl_get_relaxed(AI)	(reinterpret_cast<std::atomic<int> *> (AI)->load (std::memory_order_relaxed))
+#define hb_atomic_int_impl_get(AI)		(reinterpret_cast<std::atomic<int> *> (AI)->load (std::memory_order_acquire))
+
+#define hb_atomic_ptr_impl_set_relaxed(P, V)	(reinterpret_cast<std::atomic<void*> *> (P)->store ((V), std::memory_order_relaxed))
+#define hb_atomic_ptr_impl_get_relaxed(P)	(reinterpret_cast<std::atomic<void*> *> (P)->load (std::memory_order_relaxed))
+#define hb_atomic_ptr_impl_get(P)		(reinterpret_cast<std::atomic<void*> *> (P)->load (std::memory_order_acquire))
+static inline bool
+_hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N)
+{
+  const void *O = O_; // Need lvalue
+  return reinterpret_cast<std::atomic<const void*> *> (P)->compare_exchange_weak (O, N, std::memory_order_acq_rel, std::memory_order_relaxed);
+}
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
+
+
+#elif !defined(HB_NO_MT) && defined(_WIN32)
+
+#include <windows.h>
+
+static inline void _hb_memory_barrier ()
+{
+#if !defined(MemoryBarrier)
+  /* MinGW has a convoluted history of supporting MemoryBarrier. */
+  LONG dummy = 0;
+  InterlockedExchange (&dummy, 1);
+#else
+  MemoryBarrier ();
+#endif
+}
+#define _hb_memory_barrier()			_hb_memory_barrier ()
+
+#define hb_atomic_int_impl_add(AI, V)		InterlockedExchangeAdd ((LONG *) (AI), (V))
+static_assert ((sizeof (LONG) == sizeof (int)), "");
+
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)	(InterlockedCompareExchangePointer ((P), (N), (O)) == (O))
+
+
+#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)
+
+#define _hb_memory_barrier()			__sync_synchronize ()
+
+#define hb_atomic_int_impl_add(AI, V)		__sync_fetch_and_add ((AI), (V))
+
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)	__sync_bool_compare_and_swap ((P), (O), (N))
+
+
+#elif !defined(HB_NO_MT) && defined(HAVE_SOLARIS_ATOMIC_OPS)
+
+#include <atomic.h>
+#include <mbarrier.h>
+
+#define _hb_memory_r_barrier()			__machine_r_barrier ()
+#define _hb_memory_w_barrier()			__machine_w_barrier ()
+#define _hb_memory_barrier()			__machine_rw_barrier ()
+
+static inline int _hb_fetch_and_add (int *AI, int V)
+{
+  _hb_memory_w_barrier ();
+  int result = atomic_add_int_nv ((uint_t *) AI, V) - V;
+  _hb_memory_r_barrier ();
+  return result;
+}
+static inline bool _hb_compare_and_swap_ptr (void **P, void *O, void *N)
+{
+  _hb_memory_w_barrier ();
+  bool result = atomic_cas_ptr (P, O, N) == O;
+  _hb_memory_r_barrier ();
+  return result;
+}
+
+#define hb_atomic_int_impl_add(AI, V)           _hb_fetch_and_add ((AI), (V))
+
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)       _hb_compare_and_swap_ptr ((P), (O), (N))
+
+
+#elif !defined(HB_NO_MT) && defined(__APPLE__)
+
+#include <libkern/OSAtomic.h>
+#ifdef __MAC_OS_X_MIN_REQUIRED
+#include <AvailabilityMacros.h>
+#elif defined(__IPHONE_OS_MIN_REQUIRED)
+#include <Availability.h>
+#endif
+
+#define _hb_memory_barrier()			OSMemoryBarrier ()
+
+#define hb_atomic_int_impl_add(AI, V)		(OSAtomicAdd32Barrier ((V), (AI)) - (V))
+
+#if (MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 || __IPHONE_VERSION_MIN_REQUIRED >= 20100)
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)	OSAtomicCompareAndSwapPtrBarrier ((O), (N), (P))
+#else
+#if __ppc64__ || __x86_64__ || __aarch64__
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)	OSAtomicCompareAndSwap64Barrier ((int64_t) (O), (int64_t) (N), (int64_t*) (P))
+#else
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)	OSAtomicCompareAndSwap32Barrier ((int32_t) (O), (int32_t) (N), (int32_t*) (P))
+#endif
+#endif
+
+
+#elif !defined(HB_NO_MT) && defined(_AIX) && defined(__IBMCPP__)
+
+#include <builtins.h>
+
+#define _hb_memory_barrier()			__lwsync ()
+
+static inline int _hb_fetch_and_add (int *AI, int V)
+{
+  _hb_memory_barrier ();
+  int result = __fetch_and_add (AI, V);
+  _hb_memory_barrier ();
+  return result;
+}
+static inline bool _hb_compare_and_swaplp (long *P, long O, long N)
+{
+  _hb_memory_barrier ();
+  bool result = __compare_and_swaplp (P, &O, N);
+  _hb_memory_barrier ();
+  return result;
+}
+
+#define hb_atomic_int_impl_add(AI, V)           _hb_fetch_and_add ((AI), (V))
+
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)       _hb_compare_and_swaplp ((long *) (P), (long) (O), (long) (N))
+static_assert ((sizeof (long) == sizeof (void *)), "");
+
+
+#elif !defined(HB_NO_MT)
+
+#define HB_ATOMIC_INT_NIL 1 /* Warn that fallback implementation is in use. */
+
+#define _hb_memory_barrier()
+
+#define hb_atomic_int_impl_add(AI, V)		((*(AI) += (V)) - (V))
+
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)	(* (void **) (P) == (void *) (O) ? (* (void **) (P) = (void *) (N), true) : false)
+
+
+#else /* HB_NO_MT */
+
+#define hb_atomic_int_impl_add(AI, V)		((*(AI) += (V)) - (V))
+
+#define _hb_memory_barrier()
+
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)	(* (void **) (P) == (void *) (O) ? (* (void **) (P) = (void *) (N), true) : false)
+
+
+#endif
+
+
+#ifndef _hb_memory_r_barrier
+#define _hb_memory_r_barrier()			_hb_memory_barrier ()
+#endif
+#ifndef _hb_memory_w_barrier
+#define _hb_memory_w_barrier()			_hb_memory_barrier ()
+#endif
+#ifndef hb_atomic_int_impl_set_relaxed
+#define hb_atomic_int_impl_set_relaxed(AI, V)	(*(AI) = (V))
+#endif
+#ifndef hb_atomic_int_impl_get_relaxed
+#define hb_atomic_int_impl_get_relaxed(AI)	(*(AI))
+#endif
+
+#ifndef hb_atomic_ptr_impl_set_relaxed
+#define hb_atomic_ptr_impl_set_relaxed(P, V)	(*(P) = (V))
+#endif
+#ifndef hb_atomic_ptr_impl_get_relaxed
+#define hb_atomic_ptr_impl_get_relaxed(P)	(*(P))
+#endif
+#ifndef hb_atomic_int_impl_set
+inline void hb_atomic_int_impl_set (int *AI, int v)	{ _hb_memory_w_barrier (); *AI = v; }
+#endif
+#ifndef hb_atomic_int_impl_get
+inline int hb_atomic_int_impl_get (const int *AI)	{ int v = *AI; _hb_memory_r_barrier (); return v; }
+#endif
+#ifndef hb_atomic_ptr_impl_get
+inline void *hb_atomic_ptr_impl_get (void ** const P)	{ void *v = *P; _hb_memory_r_barrier (); return v; }
+#endif
+
+
+#define HB_ATOMIC_INT_INIT(V)          {V}
+struct hb_atomic_int_t
+{
+  void set_relaxed (int v_) { hb_atomic_int_impl_set_relaxed (&v, v_); }
+  void set (int v_) { hb_atomic_int_impl_set (&v, v_); }
+  int get_relaxed () const { return hb_atomic_int_impl_get_relaxed (&v); }
+  int get () const { return hb_atomic_int_impl_get (&v); }
+  int inc () { return hb_atomic_int_impl_add (&v,  1); }
+  int dec () { return hb_atomic_int_impl_add (&v, -1); }
+
+  int v;
+};
+
+
+#define HB_ATOMIC_PTR_INIT(V)          {V}
+template <typename P>
+struct hb_atomic_ptr_t
+{
+  typedef typename hb_remove_pointer (P) T;
+
+  void init (T* v_ = nullptr) { set_relaxed (v_); }
+  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
+  T *get_relaxed () const { return (T *) hb_atomic_ptr_impl_get_relaxed (&v); }
+  T *get () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
+  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
+
+  T * operator -> () const                    { return get (); }
+  template <typename C> operator C * () const { return get (); }
+
+  T *v;
+};
+
+
+#endif /* HB_ATOMIC_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-blob.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-blob.cc
new file mode 100644
index 0000000..bcf381e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-blob.cc
@@ -0,0 +1,678 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ */
+
+
+/* https://github.com/harfbuzz/harfbuzz/issues/1308
+ * http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html
+ * https://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html
+ */
+#ifndef _POSIX_C_SOURCE
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-macros"
+#define _POSIX_C_SOURCE 200809L
+#pragma GCC diagnostic pop
+#endif
+
+#include "hb.hh"
+#include "hb-blob.hh"
+
+#ifdef HAVE_SYS_MMAN_H
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#include <sys/mman.h>
+#endif /* HAVE_SYS_MMAN_H */
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+
+
+/**
+ * SECTION: hb-blob
+ * @title: hb-blob
+ * @short_description: Binary data containers
+ * @include: hb.h
+ *
+ * Blobs wrap a chunk of binary data to handle lifecycle management of data
+ * while it is passed between client and HarfBuzz.  Blobs are primarily used
+ * to create font faces, but also to access font face tables, as well as
+ * pass around other binary data.
+ **/
+
+
+/**
+ * hb_blob_create: (skip)
+ * @data: Pointer to blob data.
+ * @length: Length of @data in bytes.
+ * @mode: Memory mode for @data.
+ * @user_data: Data parameter to pass to @destroy.
+ * @destroy: Callback to call when @data is not needed anymore.
+ *
+ * Creates a new "blob" object wrapping @data.  The @mode parameter is used
+ * to negotiate ownership and lifecycle of @data.
+ *
+ * Return value: New blob, or the empty blob if something failed or if @length is
+ * zero.  Destroy with hb_blob_destroy().
+ *
+ * Since: 0.9.2
+ **/
+hb_blob_t *
+hb_blob_create (const char        *data,
+		unsigned int       length,
+		hb_memory_mode_t   mode,
+		void              *user_data,
+		hb_destroy_func_t  destroy)
+{
+  hb_blob_t *blob;
+
+  if (!length ||
+      length >= 1u << 31 ||
+      !(blob = hb_object_create<hb_blob_t> ())) {
+    if (destroy)
+      destroy (user_data);
+    return hb_blob_get_empty ();
+  }
+
+  blob->data = data;
+  blob->length = length;
+  blob->mode = mode;
+
+  blob->user_data = user_data;
+  blob->destroy = destroy;
+
+  if (blob->mode == HB_MEMORY_MODE_DUPLICATE) {
+    blob->mode = HB_MEMORY_MODE_READONLY;
+    if (!blob->try_make_writable ()) {
+      hb_blob_destroy (blob);
+      return hb_blob_get_empty ();
+    }
+  }
+
+  return blob;
+}
+
+static void
+_hb_blob_destroy (void *data)
+{
+  hb_blob_destroy ((hb_blob_t *) data);
+}
+
+/**
+ * hb_blob_create_sub_blob:
+ * @parent: Parent blob.
+ * @offset: Start offset of sub-blob within @parent, in bytes.
+ * @length: Length of sub-blob.
+ *
+ * Returns a blob that represents a range of bytes in @parent.  The new
+ * blob is always created with %HB_MEMORY_MODE_READONLY, meaning that it
+ * will never modify data in the parent blob.  The parent data is not
+ * expected to be modified, and will result in undefined behavior if it
+ * is.
+ *
+ * Makes @parent immutable.
+ *
+ * Return value: New blob, or the empty blob if something failed or if
+ * @length is zero or @offset is beyond the end of @parent's data.  Destroy
+ * with hb_blob_destroy().
+ *
+ * Since: 0.9.2
+ **/
+hb_blob_t *
+hb_blob_create_sub_blob (hb_blob_t    *parent,
+			 unsigned int  offset,
+			 unsigned int  length)
+{
+  hb_blob_t *blob;
+
+  if (!length || !parent || offset >= parent->length)
+    return hb_blob_get_empty ();
+
+  hb_blob_make_immutable (parent);
+
+  blob = hb_blob_create (parent->data + offset,
+			 MIN (length, parent->length - offset),
+			 HB_MEMORY_MODE_READONLY,
+			 hb_blob_reference (parent),
+			 _hb_blob_destroy);
+
+  return blob;
+}
+
+/**
+ * hb_blob_copy_writable_or_fail:
+ * @blob: A blob.
+ *
+ * Makes a writable copy of @blob.
+ *
+ * Return value: New blob, or nullptr if allocation failed.
+ *
+ * Since: 1.8.0
+ **/
+hb_blob_t *
+hb_blob_copy_writable_or_fail (hb_blob_t *blob)
+{
+  blob = hb_blob_create (blob->data,
+			 blob->length,
+			 HB_MEMORY_MODE_DUPLICATE,
+			 nullptr,
+			 nullptr);
+
+  if (unlikely (blob == hb_blob_get_empty ()))
+    blob = nullptr;
+
+  return blob;
+}
+
+/**
+ * hb_blob_get_empty:
+ *
+ * Returns the singleton empty blob.
+ *
+ * See TODO:link object types for more information.
+ *
+ * Return value: (transfer full): the empty blob.
+ *
+ * Since: 0.9.2
+ **/
+hb_blob_t *
+hb_blob_get_empty ()
+{
+  return const_cast<hb_blob_t *> (&Null(hb_blob_t));
+}
+
+/**
+ * hb_blob_reference: (skip)
+ * @blob: a blob.
+ *
+ * Increases the reference count on @blob.
+ *
+ * See TODO:link object types for more information.
+ *
+ * Return value: @blob.
+ *
+ * Since: 0.9.2
+ **/
+hb_blob_t *
+hb_blob_reference (hb_blob_t *blob)
+{
+  return hb_object_reference (blob);
+}
+
+/**
+ * hb_blob_destroy: (skip)
+ * @blob: a blob.
+ *
+ * Decreases the reference count on @blob, and if it reaches zero, destroys
+ * @blob, freeing all memory, possibly calling the destroy-callback the blob
+ * was created for if it has not been called already.
+ *
+ * See TODO:link object types for more information.
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_blob_destroy (hb_blob_t *blob)
+{
+  if (!hb_object_destroy (blob)) return;
+
+  blob->fini_shallow ();
+
+  free (blob);
+}
+
+/**
+ * hb_blob_set_user_data: (skip)
+ * @blob: a blob.
+ * @key: key for data to set.
+ * @data: data to set.
+ * @destroy: callback to call when @data is not needed anymore.
+ * @replace: whether to replace an existing data with the same key.
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_blob_set_user_data (hb_blob_t          *blob,
+		       hb_user_data_key_t *key,
+		       void *              data,
+		       hb_destroy_func_t   destroy,
+		       hb_bool_t           replace)
+{
+  return hb_object_set_user_data (blob, key, data, destroy, replace);
+}
+
+/**
+ * hb_blob_get_user_data: (skip)
+ * @blob: a blob.
+ * @key: key for data to get.
+ *
+ *
+ *
+ * Return value: (transfer none):
+ *
+ * Since: 0.9.2
+ **/
+void *
+hb_blob_get_user_data (hb_blob_t          *blob,
+		       hb_user_data_key_t *key)
+{
+  return hb_object_get_user_data (blob, key);
+}
+
+
+/**
+ * hb_blob_make_immutable:
+ * @blob: a blob.
+ *
+ *
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_blob_make_immutable (hb_blob_t *blob)
+{
+  if (hb_object_is_immutable (blob))
+    return;
+
+  hb_object_make_immutable (blob);
+}
+
+/**
+ * hb_blob_is_immutable:
+ * @blob: a blob.
+ *
+ *
+ *
+ * Return value: TODO
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_blob_is_immutable (hb_blob_t *blob)
+{
+  return hb_object_is_immutable (blob);
+}
+
+
+/**
+ * hb_blob_get_length:
+ * @blob: a blob.
+ *
+ *
+ *
+ * Return value: the length of blob data in bytes.
+ *
+ * Since: 0.9.2
+ **/
+unsigned int
+hb_blob_get_length (hb_blob_t *blob)
+{
+  return blob->length;
+}
+
+/**
+ * hb_blob_get_data:
+ * @blob: a blob.
+ * @length: (out):
+ *
+ *
+ *
+ * Returns: (transfer none) (array length=length):
+ *
+ * Since: 0.9.2
+ **/
+const char *
+hb_blob_get_data (hb_blob_t *blob, unsigned int *length)
+{
+  if (length)
+    *length = blob->length;
+
+  return blob->data;
+}
+
+/**
+ * hb_blob_get_data_writable:
+ * @blob: a blob.
+ * @length: (out): output length of the writable data.
+ *
+ * Tries to make blob data writable (possibly copying it) and
+ * return pointer to data.
+ *
+ * Fails if blob has been made immutable, or if memory allocation
+ * fails.
+ *
+ * Returns: (transfer none) (array length=length): Writable blob data,
+ * or %NULL if failed.
+ *
+ * Since: 0.9.2
+ **/
+char *
+hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length)
+{
+  if (!blob->try_make_writable ()) {
+    if (length)
+      *length = 0;
+
+    return nullptr;
+  }
+
+  if (length)
+    *length = blob->length;
+
+  return const_cast<char *> (blob->data);
+}
+
+
+bool
+hb_blob_t::try_make_writable_inplace_unix ()
+{
+#if defined(HAVE_SYS_MMAN_H) && defined(HAVE_MPROTECT)
+  uintptr_t pagesize = -1, mask, length;
+  const char *addr;
+
+#if defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE)
+  pagesize = (uintptr_t) sysconf (_SC_PAGE_SIZE);
+#elif defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE)
+  pagesize = (uintptr_t) sysconf (_SC_PAGESIZE);
+#elif defined(HAVE_GETPAGESIZE)
+  pagesize = (uintptr_t) getpagesize ();
+#endif
+
+  if ((uintptr_t) -1L == pagesize) {
+    DEBUG_MSG_FUNC (BLOB, this, "failed to get pagesize: %s", strerror (errno));
+    return false;
+  }
+  DEBUG_MSG_FUNC (BLOB, this, "pagesize is %lu", (unsigned long) pagesize);
+
+  mask = ~(pagesize-1);
+  addr = (const char *) (((uintptr_t) this->data) & mask);
+  length = (const char *) (((uintptr_t) this->data + this->length + pagesize-1) & mask)  - addr;
+  DEBUG_MSG_FUNC (BLOB, this,
+		  "calling mprotect on [%p..%p] (%lu bytes)",
+		  addr, addr+length, (unsigned long) length);
+  if (-1 == mprotect ((void *) addr, length, PROT_READ | PROT_WRITE)) {
+    DEBUG_MSG_FUNC (BLOB, this, "mprotect failed: %s", strerror (errno));
+    return false;
+  }
+
+  this->mode = HB_MEMORY_MODE_WRITABLE;
+
+  DEBUG_MSG_FUNC (BLOB, this,
+		  "successfully made [%p..%p] (%lu bytes) writable\n",
+		  addr, addr+length, (unsigned long) length);
+  return true;
+#else
+  return false;
+#endif
+}
+
+bool
+hb_blob_t::try_make_writable_inplace ()
+{
+  DEBUG_MSG_FUNC (BLOB, this, "making writable inplace\n");
+
+  if (this->try_make_writable_inplace_unix ())
+    return true;
+
+  DEBUG_MSG_FUNC (BLOB, this, "making writable -> FAILED\n");
+
+  /* Failed to make writable inplace, mark that */
+  this->mode = HB_MEMORY_MODE_READONLY;
+  return false;
+}
+
+bool
+hb_blob_t::try_make_writable ()
+{
+  if (hb_object_is_immutable (this))
+    return false;
+
+  if (this->mode == HB_MEMORY_MODE_WRITABLE)
+    return true;
+
+  if (this->mode == HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE && this->try_make_writable_inplace ())
+    return true;
+
+  if (this->mode == HB_MEMORY_MODE_WRITABLE)
+    return true;
+
+
+  DEBUG_MSG_FUNC (BLOB, this, "current data is -> %p\n", this->data);
+
+  char *new_data;
+
+  new_data = (char *) malloc (this->length);
+  if (unlikely (!new_data))
+    return false;
+
+  DEBUG_MSG_FUNC (BLOB, this, "dupped successfully -> %p\n", this->data);
+
+  memcpy (new_data, this->data, this->length);
+  this->destroy_user_data ();
+  this->mode = HB_MEMORY_MODE_WRITABLE;
+  this->data = new_data;
+  this->user_data = new_data;
+  this->destroy = free;
+
+  return true;
+}
+
+/*
+ * Mmap
+ */
+
+#ifdef HAVE_MMAP
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <fcntl.h>
+#endif
+
+#ifdef _WIN32
+# include <windows.h>
+#else
+# ifndef O_BINARY
+#  define O_BINARY 0
+# endif
+#endif
+
+#ifndef MAP_NORESERVE
+# define MAP_NORESERVE 0
+#endif
+
+struct hb_mapped_file_t
+{
+  char *contents;
+  unsigned long length;
+#ifdef _WIN32
+  HANDLE mapping;
+#endif
+};
+
+#if (defined(HAVE_MMAP) || defined(_WIN32)) && !defined(HB_NO_MMAP)
+static void
+_hb_mapped_file_destroy (void *file_)
+{
+  hb_mapped_file_t *file = (hb_mapped_file_t *) file_;
+#ifdef HAVE_MMAP
+  munmap (file->contents, file->length);
+#elif defined(_WIN32)
+  UnmapViewOfFile (file->contents);
+  CloseHandle (file->mapping);
+#else
+  assert (0); // If we don't have mmap we shouldn't reach here
+#endif
+
+  free (file);
+}
+#endif
+
+/**
+ * hb_blob_create_from_file:
+ * @file_name: font filename.
+ *
+ * Returns: A hb_blob_t pointer with the content of the file
+ *
+ * Since: 1.7.7
+ **/
+hb_blob_t *
+hb_blob_create_from_file (const char *file_name)
+{
+  /* Adopted from glib's gmappedfile.c with Matthias Clasen and
+     Allison Lortie permission but changed a lot to suit our need. */
+#if defined(HAVE_MMAP) && !defined(HB_NO_MMAP)
+  hb_mapped_file_t *file = (hb_mapped_file_t *) calloc (1, sizeof (hb_mapped_file_t));
+  if (unlikely (!file)) return hb_blob_get_empty ();
+
+  int fd = open (file_name, O_RDONLY | O_BINARY, 0);
+  if (unlikely (fd == -1)) goto fail_without_close;
+
+  struct stat st;
+  if (unlikely (fstat (fd, &st) == -1)) goto fail;
+
+  file->length = (unsigned long) st.st_size;
+  file->contents = (char *) mmap (nullptr, file->length, PROT_READ,
+				  MAP_PRIVATE | MAP_NORESERVE, fd, 0);
+
+  if (unlikely (file->contents == MAP_FAILED)) goto fail;
+
+  close (fd);
+
+  return hb_blob_create (file->contents, file->length,
+			 HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, (void *) file,
+			 (hb_destroy_func_t) _hb_mapped_file_destroy);
+
+fail:
+  close (fd);
+fail_without_close:
+  free (file);
+
+#elif defined(_WIN32) && !defined(HB_NO_MMAP)
+  hb_mapped_file_t *file = (hb_mapped_file_t *) calloc (1, sizeof (hb_mapped_file_t));
+  if (unlikely (!file)) return hb_blob_get_empty ();
+
+  HANDLE fd;
+  unsigned int size = strlen (file_name) + 1;
+  wchar_t * wchar_file_name = (wchar_t *) malloc (sizeof (wchar_t) * size);
+  if (unlikely (wchar_file_name == nullptr)) goto fail_without_close;
+  mbstowcs (wchar_file_name, file_name, size);
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+  {
+    CREATEFILE2_EXTENDED_PARAMETERS ceparams = { 0 };
+    ceparams.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
+    ceparams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED & 0xFFFF;
+    ceparams.dwFileFlags = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED & 0xFFF00000;
+    ceparams.dwSecurityQosFlags = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED & 0x000F0000;
+    ceparams.lpSecurityAttributes = nullptr;
+    ceparams.hTemplateFile = nullptr;
+    fd = CreateFile2 (wchar_file_name, GENERIC_READ, FILE_SHARE_READ,
+                      OPEN_EXISTING, &ceparams);
+  }
+#else
+  fd = CreateFileW (wchar_file_name, GENERIC_READ, FILE_SHARE_READ, nullptr,
+		    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
+		    nullptr);
+#endif
+  free (wchar_file_name);
+
+  if (unlikely (fd == INVALID_HANDLE_VALUE)) goto fail_without_close;
+
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+  {
+    LARGE_INTEGER length;
+    GetFileSizeEx (fd, &length);
+    file->length = length.LowPart;
+    file->mapping = CreateFileMappingFromApp (fd, nullptr, PAGE_READONLY, length.QuadPart, nullptr);
+  }
+#else
+  file->length = (unsigned long) GetFileSize (fd, nullptr);
+  file->mapping = CreateFileMapping (fd, nullptr, PAGE_READONLY, 0, 0, nullptr);
+#endif
+  if (unlikely (file->mapping == nullptr)) goto fail;
+
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+  file->contents = (char *) MapViewOfFileFromApp (file->mapping, FILE_MAP_READ, 0, 0);
+#else
+  file->contents = (char *) MapViewOfFile (file->mapping, FILE_MAP_READ, 0, 0, 0);
+#endif
+  if (unlikely (file->contents == nullptr)) goto fail;
+
+  CloseHandle (fd);
+  return hb_blob_create (file->contents, file->length,
+			 HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, (void *) file,
+			 (hb_destroy_func_t) _hb_mapped_file_destroy);
+
+fail:
+  CloseHandle (fd);
+fail_without_close:
+  free (file);
+
+#endif
+
+  /* The following tries to read a file without knowing its size beforehand
+     It's used as a fallback for systems without mmap or to read from pipes */
+  unsigned long len = 0, allocated = BUFSIZ * 16;
+  char *data = (char *) malloc (allocated);
+  if (unlikely (data == nullptr)) return hb_blob_get_empty ();
+
+  FILE *fp = fopen (file_name, "rb");
+  if (unlikely (fp == nullptr)) goto fread_fail_without_close;
+
+  while (!feof (fp))
+  {
+    if (allocated - len < BUFSIZ)
+    {
+      allocated *= 2;
+      /* Don't allocate and go more than ~536MB, our mmap reader still
+	 can cover files like that but lets limit our fallback reader */
+      if (unlikely (allocated > (2 << 28))) goto fread_fail;
+      char *new_data = (char *) realloc (data, allocated);
+      if (unlikely (new_data == nullptr)) goto fread_fail;
+      data = new_data;
+    }
+
+    unsigned long addition = fread (data + len, 1, allocated - len, fp);
+
+    int err = ferror (fp);
+#ifdef EINTR // armcc doesn't have it
+    if (unlikely (err == EINTR)) continue;
+#endif
+    if (unlikely (err)) goto fread_fail;
+
+    len += addition;
+  }
+
+  return hb_blob_create (data, len, HB_MEMORY_MODE_WRITABLE, data,
+                         (hb_destroy_func_t) free);
+
+fread_fail:
+  fclose (fp);
+fread_fail_without_close:
+  free (data);
+  return hb_blob_get_empty ();
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-blob.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-blob.h
new file mode 100644
index 0000000..d1d9134
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-blob.h
@@ -0,0 +1,131 @@
+/*
+ * Copyright © 2009  Red Hat, 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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_BLOB_H
+#define HB_BLOB_H
+
+#include "hb-common.h"
+
+HB_BEGIN_DECLS
+
+
+/*
+ * Note re various memory-modes:
+ *
+ * - In no case shall the HarfBuzz client modify memory
+ *   that is passed to HarfBuzz in a blob.  If there is
+ *   any such possibility, MODE_DUPLICATE should be used
+ *   such that HarfBuzz makes a copy immediately,
+ *
+ * - Use MODE_READONLY otherwise, unless you really really
+ *   really know what you are doing,
+ *
+ * - MODE_WRITABLE is appropriate if you really made a
+ *   copy of data solely for the purpose of passing to
+ *   HarfBuzz and doing that just once (no reuse!),
+ *
+ * - If the font is mmap()ed, it's ok to use
+ *   READONLY_MAY_MAKE_WRITABLE, however, using that mode
+ *   correctly is very tricky.  Use MODE_READONLY instead.
+ */
+typedef enum {
+  HB_MEMORY_MODE_DUPLICATE,
+  HB_MEMORY_MODE_READONLY,
+  HB_MEMORY_MODE_WRITABLE,
+  HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE
+} hb_memory_mode_t;
+
+typedef struct hb_blob_t hb_blob_t;
+
+HB_EXTERN hb_blob_t *
+hb_blob_create (const char        *data,
+		unsigned int       length,
+		hb_memory_mode_t   mode,
+		void              *user_data,
+		hb_destroy_func_t  destroy);
+
+/* Always creates with MEMORY_MODE_READONLY.
+ * Even if the parent blob is writable, we don't
+ * want the user of the sub-blob to be able to
+ * modify the parent data as that data may be
+ * shared among multiple sub-blobs.
+ */
+HB_EXTERN hb_blob_t *
+hb_blob_create_sub_blob (hb_blob_t    *parent,
+			 unsigned int  offset,
+			 unsigned int  length);
+
+HB_EXTERN hb_blob_t *
+hb_blob_copy_writable_or_fail (hb_blob_t *blob);
+
+HB_EXTERN hb_blob_t *
+hb_blob_get_empty (void);
+
+HB_EXTERN hb_blob_t *
+hb_blob_reference (hb_blob_t *blob);
+
+HB_EXTERN void
+hb_blob_destroy (hb_blob_t *blob);
+
+HB_EXTERN hb_bool_t
+hb_blob_set_user_data (hb_blob_t          *blob,
+		       hb_user_data_key_t *key,
+		       void *              data,
+		       hb_destroy_func_t   destroy,
+		       hb_bool_t           replace);
+
+
+HB_EXTERN void *
+hb_blob_get_user_data (hb_blob_t          *blob,
+		       hb_user_data_key_t *key);
+
+
+HB_EXTERN void
+hb_blob_make_immutable (hb_blob_t *blob);
+
+HB_EXTERN hb_bool_t
+hb_blob_is_immutable (hb_blob_t *blob);
+
+
+HB_EXTERN unsigned int
+hb_blob_get_length (hb_blob_t *blob);
+
+HB_EXTERN const char *
+hb_blob_get_data (hb_blob_t *blob, unsigned int *length);
+
+HB_EXTERN char *
+hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length);
+
+HB_EXTERN hb_blob_t *
+hb_blob_create_from_file (const char *file_name);
+
+HB_END_DECLS
+
+#endif /* HB_BLOB_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-blob.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-blob.hh
new file mode 100644
index 0000000..4ea13f8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-blob.hh
@@ -0,0 +1,101 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2018  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_BLOB_HH
+#define HB_BLOB_HH
+
+#include "hb.hh"
+
+
+/*
+ * hb_blob_t
+ */
+
+struct hb_blob_t
+{
+  void fini_shallow () { destroy_user_data (); }
+
+  void destroy_user_data ()
+  {
+    if (destroy)
+    {
+      destroy (user_data);
+      user_data = nullptr;
+      destroy = nullptr;
+    }
+  }
+
+  HB_INTERNAL bool try_make_writable ();
+  HB_INTERNAL bool try_make_writable_inplace ();
+  HB_INTERNAL bool try_make_writable_inplace_unix ();
+
+  template <typename Type>
+  const Type* as () const
+  {
+    return length < hb_null_size (Type) ? &Null(Type) : reinterpret_cast<const Type *> (data);
+  }
+  hb_bytes_t as_bytes () const
+  { return hb_bytes_t (data, length); }
+
+  public:
+  hb_object_header_t header;
+
+  const char *data;
+  unsigned int length;
+  hb_memory_mode_t mode;
+
+  void *user_data;
+  hb_destroy_func_t destroy;
+};
+
+
+/*
+ * hb_blob_ptr_t
+ */
+
+template <typename P>
+struct hb_blob_ptr_t
+{
+  typedef typename hb_remove_pointer (P) T;
+
+  hb_blob_ptr_t (hb_blob_t *b_ = nullptr) : b (b_) {}
+  hb_blob_t * operator = (hb_blob_t *b_) { return b = b_; }
+  const T * operator -> () const { return get (); }
+  const T & operator * () const  { return *get (); }
+  template <typename C> operator const C * () const { return get (); }
+  operator const char * () const { return (const char *) get (); }
+  const T * get () const { return b->as<T> (); }
+  hb_blob_t * get_blob () const { return b.get_raw (); }
+  unsigned int get_length () const { return b.get ()->length; }
+  void destroy () { hb_blob_destroy (b.get ()); b = nullptr; }
+
+  hb_nonnull_ptr_t<hb_blob_t> b;
+};
+
+
+#endif /* HB_BLOB_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-deserialize-json.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-deserialize-json.hh
new file mode 100644
index 0000000..1f9e2e9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-deserialize-json.hh
@@ -0,0 +1,643 @@
+
+#line 1 "hb-buffer-deserialize-json.rl"
+/*
+ * Copyright © 2013  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_BUFFER_DESERIALIZE_JSON_HH
+#define HB_BUFFER_DESERIALIZE_JSON_HH
+
+#include "hb.hh"
+
+
+#line 36 "hb-buffer-deserialize-json.hh"
+static const unsigned char _deserialize_json_trans_keys[] = {
+	0u, 0u, 9u, 123u, 9u, 34u, 97u, 103u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 
+	48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 
+	9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u, 
+	120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 
+	9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 
+	65u, 122u, 34u, 122u, 9u, 125u, 9u, 125u, 9u, 93u, 9u, 123u, 0u, 0u, 0
+};
+
+static const char _deserialize_json_key_spans[] = {
+	0, 115, 26, 7, 2, 1, 50, 49, 
+	10, 117, 117, 117, 1, 50, 49, 10, 
+	117, 117, 1, 1, 50, 49, 117, 117, 
+	2, 1, 50, 49, 10, 117, 117, 1, 
+	50, 49, 10, 117, 117, 1, 50, 49, 
+	58, 89, 117, 117, 85, 115, 0
+};
+
+static const short _deserialize_json_index_offsets[] = {
+	0, 0, 116, 143, 151, 154, 156, 207, 
+	257, 268, 386, 504, 622, 624, 675, 725, 
+	736, 854, 972, 974, 976, 1027, 1077, 1195, 
+	1313, 1316, 1318, 1369, 1419, 1430, 1548, 1666, 
+	1668, 1719, 1769, 1780, 1898, 2016, 2018, 2069, 
+	2119, 2178, 2268, 2386, 2504, 2590, 2706
+};
+
+static const char _deserialize_json_indicies[] = {
+	0, 0, 0, 0, 0, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	0, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 2, 1, 3, 3, 3, 
+	3, 3, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 3, 1, 4, 1, 
+	5, 1, 6, 7, 1, 1, 8, 1, 
+	9, 10, 1, 11, 1, 11, 11, 11, 
+	11, 11, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 11, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 12, 1, 
+	12, 12, 12, 12, 12, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 12, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 13, 1, 1, 14, 
+	15, 15, 15, 15, 15, 15, 15, 15, 
+	15, 1, 16, 17, 17, 17, 17, 17, 
+	17, 17, 17, 17, 1, 18, 18, 18, 
+	18, 18, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 18, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	19, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 20, 1, 21, 21, 21, 21, 21, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 21, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 3, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 22, 
+	1, 18, 18, 18, 18, 18, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	18, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 19, 1, 1, 1, 
+	17, 17, 17, 17, 17, 17, 17, 17, 
+	17, 17, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 20, 1, 23, 
+	1, 23, 23, 23, 23, 23, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	23, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 24, 1, 24, 24, 24, 24, 
+	24, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 24, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	25, 1, 1, 26, 27, 27, 27, 27, 
+	27, 27, 27, 27, 27, 1, 28, 29, 
+	29, 29, 29, 29, 29, 29, 29, 29, 
+	1, 30, 30, 30, 30, 30, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	30, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 31, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 32, 1, 30, 
+	30, 30, 30, 30, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 30, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 31, 1, 1, 1, 29, 29, 
+	29, 29, 29, 29, 29, 29, 29, 29, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 32, 1, 33, 1, 34, 
+	1, 34, 34, 34, 34, 34, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	34, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 35, 1, 35, 35, 35, 35, 
+	35, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 35, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 36, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 1, 38, 38, 
+	38, 38, 38, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 38, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 39, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 40, 1, 38, 38, 38, 38, 
+	38, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 38, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 39, 
+	1, 1, 1, 41, 41, 41, 41, 41, 
+	41, 41, 41, 41, 41, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	40, 1, 42, 43, 1, 44, 1, 44, 
+	44, 44, 44, 44, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 44, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	45, 1, 45, 45, 45, 45, 45, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 45, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 46, 1, 
+	1, 47, 48, 48, 48, 48, 48, 48, 
+	48, 48, 48, 1, 49, 50, 50, 50, 
+	50, 50, 50, 50, 50, 50, 1, 51, 
+	51, 51, 51, 51, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 51, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 52, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 53, 1, 51, 51, 51, 
+	51, 51, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 51, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	52, 1, 1, 1, 50, 50, 50, 50, 
+	50, 50, 50, 50, 50, 50, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 53, 1, 54, 1, 54, 54, 54, 
+	54, 54, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 54, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 55, 1, 
+	55, 55, 55, 55, 55, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 55, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 56, 1, 1, 57, 
+	58, 58, 58, 58, 58, 58, 58, 58, 
+	58, 1, 59, 60, 60, 60, 60, 60, 
+	60, 60, 60, 60, 1, 61, 61, 61, 
+	61, 61, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 61, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	62, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 63, 1, 61, 61, 61, 61, 61, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 61, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 62, 1, 
+	1, 1, 60, 60, 60, 60, 60, 60, 
+	60, 60, 60, 60, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 63, 
+	1, 64, 1, 64, 64, 64, 64, 64, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 64, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 65, 1, 65, 65, 
+	65, 65, 65, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 65, 1, 66, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 67, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 1, 
+	69, 69, 69, 69, 69, 69, 69, 69, 
+	69, 69, 69, 69, 69, 69, 69, 69, 
+	69, 69, 69, 69, 69, 69, 69, 69, 
+	69, 69, 1, 1, 1, 1, 1, 1, 
+	69, 69, 69, 69, 69, 69, 69, 69, 
+	69, 69, 69, 69, 69, 69, 69, 69, 
+	69, 69, 69, 69, 69, 69, 69, 69, 
+	69, 69, 1, 70, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 71, 71, 
+	1, 71, 71, 71, 71, 71, 71, 71, 
+	71, 71, 71, 1, 1, 1, 1, 1, 
+	1, 1, 71, 71, 71, 71, 71, 71, 
+	71, 71, 71, 71, 71, 71, 71, 71, 
+	71, 71, 71, 71, 71, 71, 71, 71, 
+	71, 71, 71, 71, 1, 1, 1, 1, 
+	71, 1, 71, 71, 71, 71, 71, 71, 
+	71, 71, 71, 71, 71, 71, 71, 71, 
+	71, 71, 71, 71, 71, 71, 71, 71, 
+	71, 71, 71, 71, 1, 72, 72, 72, 
+	72, 72, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 72, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	73, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 74, 1, 72, 72, 72, 72, 72, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 72, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 73, 1, 
+	1, 1, 75, 75, 75, 75, 75, 75, 
+	75, 75, 75, 75, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 74, 
+	1, 76, 76, 76, 76, 76, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	76, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 77, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 78, 1, 0, 
+	0, 0, 0, 0, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 0, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 2, 1, 1, 0
+};
+
+static const char _deserialize_json_trans_targs[] = {
+	1, 0, 2, 2, 3, 4, 18, 24, 
+	37, 5, 12, 6, 7, 8, 9, 11, 
+	9, 11, 10, 2, 44, 10, 44, 13, 
+	14, 15, 16, 17, 16, 17, 10, 2, 
+	44, 19, 20, 21, 22, 23, 10, 2, 
+	44, 23, 25, 31, 26, 27, 28, 29, 
+	30, 29, 30, 10, 2, 44, 32, 33, 
+	34, 35, 36, 35, 36, 10, 2, 44, 
+	38, 39, 40, 42, 43, 41, 10, 41, 
+	10, 2, 44, 43, 44, 45, 46
+};
+
+static const char _deserialize_json_trans_actions[] = {
+	0, 0, 1, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 2, 2, 2, 
+	0, 0, 3, 3, 4, 0, 5, 0, 
+	0, 2, 2, 2, 0, 0, 6, 6, 
+	7, 0, 0, 0, 2, 2, 8, 8, 
+	9, 0, 0, 0, 0, 0, 2, 2, 
+	2, 0, 0, 10, 10, 11, 0, 0, 
+	2, 2, 2, 0, 0, 12, 12, 13, 
+	0, 0, 0, 2, 2, 2, 14, 0, 
+	15, 15, 16, 0, 0, 0, 0
+};
+
+static const int deserialize_json_start = 1;
+static const int deserialize_json_first_final = 44;
+static const int deserialize_json_error = 0;
+
+static const int deserialize_json_en_main = 1;
+
+
+#line 97 "hb-buffer-deserialize-json.rl"
+
+
+static hb_bool_t
+_hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
+				    const char *buf,
+				    unsigned int buf_len,
+				    const char **end_ptr,
+				    hb_font_t *font)
+{
+  const char *p = buf, *pe = buf + buf_len;
+
+  /* Ensure we have positions. */
+  (void) hb_buffer_get_glyph_positions (buffer, nullptr);
+
+  while (p < pe && ISSPACE (*p))
+    p++;
+  if (p < pe && *p == (buffer->len ? ',' : '['))
+  {
+    *end_ptr = ++p;
+  }
+
+  const char *tok = nullptr;
+  int cs;
+  hb_glyph_info_t info = {0};
+  hb_glyph_position_t pos = {0};
+  
+#line 466 "hb-buffer-deserialize-json.hh"
+	{
+	cs = deserialize_json_start;
+	}
+
+#line 471 "hb-buffer-deserialize-json.hh"
+	{
+	int _slen;
+	int _trans;
+	const unsigned char *_keys;
+	const char *_inds;
+	if ( p == pe )
+		goto _test_eof;
+	if ( cs == 0 )
+		goto _out;
+_resume:
+	_keys = _deserialize_json_trans_keys + (cs<<1);
+	_inds = _deserialize_json_indicies + _deserialize_json_index_offsets[cs];
+
+	_slen = _deserialize_json_key_spans[cs];
+	_trans = _inds[ _slen > 0 && _keys[0] <=(*p) &&
+		(*p) <= _keys[1] ?
+		(*p) - _keys[0] : _slen ];
+
+	cs = _deserialize_json_trans_targs[_trans];
+
+	if ( _deserialize_json_trans_actions[_trans] == 0 )
+		goto _again;
+
+	switch ( _deserialize_json_trans_actions[_trans] ) {
+	case 1:
+#line 38 "hb-buffer-deserialize-json.rl"
+	{
+	memset (&info, 0, sizeof (info));
+	memset (&pos , 0, sizeof (pos ));
+}
+	break;
+	case 5:
+#line 43 "hb-buffer-deserialize-json.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 2:
+#line 51 "hb-buffer-deserialize-json.rl"
+	{
+	tok = p;
+}
+	break;
+	case 14:
+#line 55 "hb-buffer-deserialize-json.rl"
+	{
+	if (!hb_font_glyph_from_string (font,
+					tok, p - tok,
+					&info.codepoint))
+	  return false;
+}
+	break;
+	case 15:
+#line 62 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_uint (tok, p, &info.codepoint)) return false; }
+	break;
+	case 8:
+#line 63 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
+	break;
+	case 10:
+#line 64 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_int  (tok, p, &pos.x_offset )) return false; }
+	break;
+	case 12:
+#line 65 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+	break;
+	case 3:
+#line 66 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+	break;
+	case 6:
+#line 67 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
+	break;
+	case 16:
+#line 62 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_uint (tok, p, &info.codepoint)) return false; }
+#line 43 "hb-buffer-deserialize-json.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 9:
+#line 63 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
+#line 43 "hb-buffer-deserialize-json.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 11:
+#line 64 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_int  (tok, p, &pos.x_offset )) return false; }
+#line 43 "hb-buffer-deserialize-json.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 13:
+#line 65 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+#line 43 "hb-buffer-deserialize-json.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 4:
+#line 66 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+#line 43 "hb-buffer-deserialize-json.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 7:
+#line 67 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
+#line 43 "hb-buffer-deserialize-json.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+#line 624 "hb-buffer-deserialize-json.hh"
+	}
+
+_again:
+	if ( cs == 0 )
+		goto _out;
+	if ( ++p != pe )
+		goto _resume;
+	_test_eof: {}
+	_out: {}
+	}
+
+#line 125 "hb-buffer-deserialize-json.rl"
+
+
+  *end_ptr = p;
+
+  return p == pe && *(p-1) != ']';
+}
+
+#endif /* HB_BUFFER_DESERIALIZE_JSON_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-deserialize-json.rl b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-deserialize-json.rl
new file mode 100644
index 0000000..f3abb02
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-deserialize-json.rl
@@ -0,0 +1,132 @@
+/*
+ * Copyright © 2013  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_BUFFER_DESERIALIZE_JSON_HH
+#define HB_BUFFER_DESERIALIZE_JSON_HH
+
+#include "hb.hh"
+
+%%{
+
+machine deserialize_json;
+alphtype unsigned char;
+write data;
+
+action clear_item {
+	memset (&info, 0, sizeof (info));
+	memset (&pos , 0, sizeof (pos ));
+}
+
+action add_item {
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+
+action tok {
+	tok = p;
+}
+
+action parse_glyph {
+	if (!hb_font_glyph_from_string (font,
+					tok, p - tok,
+					&info.codepoint))
+	  return false;
+}
+
+action parse_gid       { if (!parse_uint (tok, p, &info.codepoint)) return false; }
+action parse_cluster   { if (!parse_uint (tok, p, &info.cluster )) return false; }
+action parse_x_offset  { if (!parse_int  (tok, p, &pos.x_offset )) return false; }
+action parse_y_offset  { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+action parse_x_advance { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+action parse_y_advance { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
+
+unum	= '0' | [1-9] digit*;
+num	= '-'? unum;
+
+comma = space* ',' space*;
+colon = space* ':' space*;
+
+glyph_id = unum;
+glyph_name = alpha (alnum|'_'|'.'|'-')*;
+
+glyph_string   = '"' (glyph_name >tok %parse_glyph) '"';
+glyph_number = (glyph_id >tok %parse_gid);
+
+glyph	= "\"g\""  colon (glyph_string | glyph_number);
+cluster	= "\"cl\"" colon (unum >tok %parse_cluster);
+xoffset	= "\"dx\"" colon (num >tok %parse_x_offset);
+yoffset	= "\"dy\"" colon (num >tok %parse_y_offset);
+xadvance= "\"ax\"" colon (num >tok %parse_x_advance);
+yadvance= "\"ay\"" colon (num >tok %parse_y_advance);
+
+element = glyph | cluster | xoffset | yoffset | xadvance | yadvance;
+item	=
+	( '{' space* element (comma element)* space* '}')
+	>clear_item
+	@add_item
+	;
+
+main := space* item (comma item)* space* (','|']')?;
+
+}%%
+
+static hb_bool_t
+_hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
+				    const char *buf,
+				    unsigned int buf_len,
+				    const char **end_ptr,
+				    hb_font_t *font)
+{
+  const char *p = buf, *pe = buf + buf_len;
+
+  /* Ensure we have positions. */
+  (void) hb_buffer_get_glyph_positions (buffer, nullptr);
+
+  while (p < pe && ISSPACE (*p))
+    p++;
+  if (p < pe && *p == (buffer->len ? ',' : '['))
+  {
+    *end_ptr = ++p;
+  }
+
+  const char *tok = nullptr;
+  int cs;
+  hb_glyph_info_t info = {0};
+  hb_glyph_position_t pos = {0};
+  %%{
+    write init;
+    write exec;
+  }%%
+
+  *end_ptr = p;
+
+  return p == pe && *(p-1) != ']';
+}
+
+#endif /* HB_BUFFER_DESERIALIZE_JSON_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-deserialize-text.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-deserialize-text.hh
new file mode 100644
index 0000000..67f0a12
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-deserialize-text.hh
@@ -0,0 +1,571 @@
+
+#line 1 "hb-buffer-deserialize-text.rl"
+/*
+ * Copyright © 2013  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_BUFFER_DESERIALIZE_TEXT_HH
+#define HB_BUFFER_DESERIALIZE_TEXT_HH
+
+#include "hb.hh"
+
+
+#line 36 "hb-buffer-deserialize-text.hh"
+static const unsigned char _deserialize_text_trans_keys[] = {
+	0u, 0u, 9u, 122u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 
+	48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, 
+	9u, 122u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 
+	9u, 124u, 9u, 124u, 9u, 124u, 0
+};
+
+static const char _deserialize_text_key_spans[] = {
+	0, 114, 13, 10, 13, 10, 10, 13, 
+	10, 1, 13, 10, 14, 116, 116, 0, 
+	114, 116, 116, 116, 116, 116, 116, 116, 
+	116, 116, 116
+};
+
+static const short _deserialize_text_index_offsets[] = {
+	0, 0, 115, 129, 140, 154, 165, 176, 
+	190, 201, 203, 217, 228, 243, 360, 477, 
+	478, 593, 710, 827, 944, 1061, 1178, 1295, 
+	1412, 1529, 1646
+};
+
+static const char _deserialize_text_indicies[] = {
+	0, 0, 0, 0, 0, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	0, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	2, 3, 3, 3, 3, 3, 3, 3, 
+	3, 3, 1, 1, 1, 1, 1, 1, 
+	1, 4, 4, 4, 4, 4, 4, 4, 
+	4, 4, 4, 4, 4, 4, 4, 4, 
+	4, 4, 4, 4, 4, 4, 4, 4, 
+	4, 4, 4, 1, 1, 1, 1, 1, 
+	1, 4, 4, 4, 4, 4, 4, 4, 
+	4, 4, 4, 4, 4, 4, 4, 4, 
+	4, 4, 4, 4, 4, 4, 4, 4, 
+	4, 4, 4, 1, 5, 1, 1, 6, 
+	7, 7, 7, 7, 7, 7, 7, 7, 
+	7, 1, 8, 9, 9, 9, 9, 9, 
+	9, 9, 9, 9, 1, 10, 1, 1, 
+	11, 12, 12, 12, 12, 12, 12, 12, 
+	12, 12, 1, 13, 14, 14, 14, 14, 
+	14, 14, 14, 14, 14, 1, 15, 16, 
+	16, 16, 16, 16, 16, 16, 16, 16, 
+	1, 17, 1, 1, 18, 19, 19, 19, 
+	19, 19, 19, 19, 19, 19, 1, 20, 
+	21, 21, 21, 21, 21, 21, 21, 21, 
+	21, 1, 22, 1, 23, 1, 1, 24, 
+	25, 25, 25, 25, 25, 25, 25, 25, 
+	25, 1, 26, 27, 27, 27, 27, 27, 
+	27, 27, 27, 27, 1, 22, 1, 1, 
+	1, 21, 21, 21, 21, 21, 21, 21, 
+	21, 21, 21, 1, 28, 28, 28, 28, 
+	28, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 28, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 29, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	30, 1, 1, 31, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	32, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 33, 
+	1, 34, 34, 34, 34, 34, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	34, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 35, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 36, 1, 1, 0, 
+	0, 0, 0, 0, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 0, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 2, 3, 
+	3, 3, 3, 3, 3, 3, 3, 3, 
+	1, 1, 1, 1, 1, 1, 1, 4, 
+	4, 4, 4, 4, 4, 4, 4, 4, 
+	4, 4, 4, 4, 4, 4, 4, 4, 
+	4, 4, 4, 4, 4, 4, 4, 4, 
+	4, 1, 1, 1, 1, 1, 1, 4, 
+	4, 4, 4, 4, 4, 4, 4, 4, 
+	4, 4, 4, 4, 4, 4, 4, 4, 
+	4, 4, 4, 4, 4, 4, 4, 4, 
+	4, 1, 28, 28, 28, 28, 28, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 28, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 29, 1, 1, 1, 
+	1, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 1, 1, 1, 30, 1, 
+	1, 31, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 32, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 33, 1, 38, 
+	38, 38, 38, 38, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 38, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 39, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 40, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 41, 1, 42, 42, 42, 42, 
+	42, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 42, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	43, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 44, 
+	1, 42, 42, 42, 42, 42, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	42, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	14, 14, 14, 14, 14, 14, 14, 14, 
+	14, 14, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 43, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 44, 1, 38, 38, 
+	38, 38, 38, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 38, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 39, 1, 1, 1, 9, 9, 9, 
+	9, 9, 9, 9, 9, 9, 9, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 40, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 41, 1, 45, 45, 45, 45, 45, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 45, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 46, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 47, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 48, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 49, 1, 
+	50, 50, 50, 50, 50, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 50, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 51, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 52, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 53, 1, 50, 50, 50, 
+	50, 50, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 50, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 51, 
+	1, 1, 1, 1, 27, 27, 27, 27, 
+	27, 27, 27, 27, 27, 27, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 52, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	53, 1, 45, 45, 45, 45, 45, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 45, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 46, 1, 1, 1, 
+	1, 54, 54, 54, 54, 54, 54, 54, 
+	54, 54, 54, 1, 1, 1, 1, 1, 
+	1, 47, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 48, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 49, 1, 28, 
+	28, 28, 28, 28, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 28, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 29, 1, 55, 55, 1, 55, 55, 
+	55, 55, 55, 55, 55, 55, 55, 55, 
+	1, 1, 1, 30, 1, 1, 31, 55, 
+	55, 55, 55, 55, 55, 55, 55, 55, 
+	55, 55, 55, 55, 55, 55, 55, 55, 
+	55, 55, 55, 55, 55, 55, 55, 55, 
+	55, 1, 1, 32, 1, 55, 1, 55, 
+	55, 55, 55, 55, 55, 55, 55, 55, 
+	55, 55, 55, 55, 55, 55, 55, 55, 
+	55, 55, 55, 55, 55, 55, 55, 55, 
+	55, 1, 33, 1, 0
+};
+
+static const char _deserialize_text_trans_targs[] = {
+	1, 0, 13, 17, 26, 3, 18, 21, 
+	18, 21, 5, 19, 20, 19, 20, 22, 
+	25, 8, 9, 12, 9, 12, 10, 11, 
+	23, 24, 23, 24, 14, 2, 6, 7, 
+	15, 16, 14, 15, 16, 17, 14, 4, 
+	15, 16, 14, 15, 16, 14, 2, 7, 
+	15, 16, 14, 2, 15, 16, 25, 26
+};
+
+static const char _deserialize_text_trans_actions[] = {
+	0, 0, 1, 1, 1, 2, 2, 2, 
+	0, 0, 2, 2, 2, 0, 0, 2, 
+	2, 2, 2, 2, 0, 0, 3, 2, 
+	2, 2, 0, 0, 4, 5, 5, 5, 
+	4, 4, 0, 0, 0, 0, 6, 7, 
+	6, 6, 8, 8, 8, 9, 10, 10, 
+	9, 9, 11, 12, 11, 11, 0, 0
+};
+
+static const char _deserialize_text_eof_actions[] = {
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 4, 0, 0, 
+	0, 4, 6, 8, 8, 6, 9, 11, 
+	11, 9, 4
+};
+
+static const int deserialize_text_start = 1;
+static const int deserialize_text_first_final = 13;
+static const int deserialize_text_error = 0;
+
+static const int deserialize_text_en_main = 1;
+
+
+#line 91 "hb-buffer-deserialize-text.rl"
+
+
+static hb_bool_t
+_hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
+				    const char *buf,
+				    unsigned int buf_len,
+				    const char **end_ptr,
+				    hb_font_t *font)
+{
+  const char *p = buf, *pe = buf + buf_len;
+
+  /* Ensure we have positions. */
+  (void) hb_buffer_get_glyph_positions (buffer, nullptr);
+
+  while (p < pe && ISSPACE (*p))
+    p++;
+  if (p < pe && *p == (buffer->len ? '|' : '['))
+  {
+    *end_ptr = ++p;
+  }
+
+  const char *eof = pe, *tok = nullptr;
+  int cs;
+  hb_glyph_info_t info = {0};
+  hb_glyph_position_t pos = {0};
+  
+#line 343 "hb-buffer-deserialize-text.hh"
+	{
+	cs = deserialize_text_start;
+	}
+
+#line 348 "hb-buffer-deserialize-text.hh"
+	{
+	int _slen;
+	int _trans;
+	const unsigned char *_keys;
+	const char *_inds;
+	if ( p == pe )
+		goto _test_eof;
+	if ( cs == 0 )
+		goto _out;
+_resume:
+	_keys = _deserialize_text_trans_keys + (cs<<1);
+	_inds = _deserialize_text_indicies + _deserialize_text_index_offsets[cs];
+
+	_slen = _deserialize_text_key_spans[cs];
+	_trans = _inds[ _slen > 0 && _keys[0] <=(*p) &&
+		(*p) <= _keys[1] ?
+		(*p) - _keys[0] : _slen ];
+
+	cs = _deserialize_text_trans_targs[_trans];
+
+	if ( _deserialize_text_trans_actions[_trans] == 0 )
+		goto _again;
+
+	switch ( _deserialize_text_trans_actions[_trans] ) {
+	case 2:
+#line 51 "hb-buffer-deserialize-text.rl"
+	{
+	tok = p;
+}
+	break;
+	case 5:
+#line 55 "hb-buffer-deserialize-text.rl"
+	{
+	if (!hb_font_glyph_from_string (font,
+					tok, p - tok,
+					&info.codepoint))
+	  return false;
+}
+	break;
+	case 10:
+#line 62 "hb-buffer-deserialize-text.rl"
+	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
+	break;
+	case 3:
+#line 63 "hb-buffer-deserialize-text.rl"
+	{ if (!parse_int  (tok, p, &pos.x_offset )) return false; }
+	break;
+	case 12:
+#line 64 "hb-buffer-deserialize-text.rl"
+	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+	break;
+	case 7:
+#line 65 "hb-buffer-deserialize-text.rl"
+	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+	break;
+	case 1:
+#line 38 "hb-buffer-deserialize-text.rl"
+	{
+	memset (&info, 0, sizeof (info));
+	memset (&pos , 0, sizeof (pos ));
+}
+#line 51 "hb-buffer-deserialize-text.rl"
+	{
+	tok = p;
+}
+	break;
+	case 4:
+#line 55 "hb-buffer-deserialize-text.rl"
+	{
+	if (!hb_font_glyph_from_string (font,
+					tok, p - tok,
+					&info.codepoint))
+	  return false;
+}
+#line 43 "hb-buffer-deserialize-text.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 9:
+#line 62 "hb-buffer-deserialize-text.rl"
+	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
+#line 43 "hb-buffer-deserialize-text.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 11:
+#line 64 "hb-buffer-deserialize-text.rl"
+	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+#line 43 "hb-buffer-deserialize-text.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 6:
+#line 65 "hb-buffer-deserialize-text.rl"
+	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+#line 43 "hb-buffer-deserialize-text.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 8:
+#line 66 "hb-buffer-deserialize-text.rl"
+	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
+#line 43 "hb-buffer-deserialize-text.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+#line 480 "hb-buffer-deserialize-text.hh"
+	}
+
+_again:
+	if ( cs == 0 )
+		goto _out;
+	if ( ++p != pe )
+		goto _resume;
+	_test_eof: {}
+	if ( p == eof )
+	{
+	switch ( _deserialize_text_eof_actions[cs] ) {
+	case 4:
+#line 55 "hb-buffer-deserialize-text.rl"
+	{
+	if (!hb_font_glyph_from_string (font,
+					tok, p - tok,
+					&info.codepoint))
+	  return false;
+}
+#line 43 "hb-buffer-deserialize-text.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 9:
+#line 62 "hb-buffer-deserialize-text.rl"
+	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
+#line 43 "hb-buffer-deserialize-text.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 11:
+#line 64 "hb-buffer-deserialize-text.rl"
+	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+#line 43 "hb-buffer-deserialize-text.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 6:
+#line 65 "hb-buffer-deserialize-text.rl"
+	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+#line 43 "hb-buffer-deserialize-text.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 8:
+#line 66 "hb-buffer-deserialize-text.rl"
+	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
+#line 43 "hb-buffer-deserialize-text.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+#line 557 "hb-buffer-deserialize-text.hh"
+	}
+	}
+
+	_out: {}
+	}
+
+#line 119 "hb-buffer-deserialize-text.rl"
+
+
+  *end_ptr = p;
+
+  return p == pe && *(p-1) != ']';
+}
+
+#endif /* HB_BUFFER_DESERIALIZE_TEXT_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-deserialize-text.rl b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-deserialize-text.rl
new file mode 100644
index 0000000..6268a6c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-deserialize-text.rl
@@ -0,0 +1,126 @@
+/*
+ * Copyright © 2013  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_BUFFER_DESERIALIZE_TEXT_HH
+#define HB_BUFFER_DESERIALIZE_TEXT_HH
+
+#include "hb.hh"
+
+%%{
+
+machine deserialize_text;
+alphtype unsigned char;
+write data;
+
+action clear_item {
+	memset (&info, 0, sizeof (info));
+	memset (&pos , 0, sizeof (pos ));
+}
+
+action add_item {
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+
+action tok {
+	tok = p;
+}
+
+action parse_glyph {
+	if (!hb_font_glyph_from_string (font,
+					tok, p - tok,
+					&info.codepoint))
+	  return false;
+}
+
+action parse_cluster   { if (!parse_uint (tok, p, &info.cluster )) return false; }
+action parse_x_offset  { if (!parse_int  (tok, p, &pos.x_offset )) return false; }
+action parse_y_offset  { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+action parse_x_advance { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+action parse_y_advance { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
+
+unum	= '0' | [1-9] digit*;
+num	= '-'? unum;
+
+glyph_id = unum;
+glyph_name = alpha (alnum|'_'|'.'|'-')*;
+
+glyph	= (glyph_id | glyph_name) >tok %parse_glyph;
+cluster	= '=' (unum >tok %parse_cluster);
+offsets	= '@' (num >tok %parse_x_offset)   ',' (num >tok %parse_y_offset );
+advances= '+' (num >tok %parse_x_advance) (',' (num >tok %parse_y_advance))?;
+item	=
+	(
+		glyph
+		cluster?
+		offsets?
+		advances?
+	)
+	>clear_item
+	%add_item
+	;
+
+main := space* item (space* '|' space* item)* space* ('|'|']')?;
+
+}%%
+
+static hb_bool_t
+_hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
+				    const char *buf,
+				    unsigned int buf_len,
+				    const char **end_ptr,
+				    hb_font_t *font)
+{
+  const char *p = buf, *pe = buf + buf_len;
+
+  /* Ensure we have positions. */
+  (void) hb_buffer_get_glyph_positions (buffer, nullptr);
+
+  while (p < pe && ISSPACE (*p))
+    p++;
+  if (p < pe && *p == (buffer->len ? '|' : '['))
+  {
+    *end_ptr = ++p;
+  }
+
+  const char *eof = pe, *tok = nullptr;
+  int cs;
+  hb_glyph_info_t info = {0};
+  hb_glyph_position_t pos = {0};
+  %%{
+    write init;
+    write exec;
+  }%%
+
+  *end_ptr = p;
+
+  return p == pe && *(p-1) != ']';
+}
+
+#endif /* HB_BUFFER_DESERIALIZE_TEXT_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-serialize.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-serialize.cc
new file mode 100644
index 0000000..6e265e8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer-serialize.cc
@@ -0,0 +1,486 @@
+/*
+ * Copyright © 2012,2013  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
+ */
+
+#include "hb-buffer.hh"
+
+
+static const char *serialize_formats[] = {
+  "text",
+  "json",
+  nullptr
+};
+
+/**
+ * hb_buffer_serialize_list_formats:
+ *
+ * Returns a list of supported buffer serialization formats.
+ *
+ * Return value: (transfer none):
+ * A string array of buffer serialization formats. Should not be freed.
+ *
+ * Since: 0.9.7
+ **/
+const char **
+hb_buffer_serialize_list_formats ()
+{
+  return serialize_formats;
+}
+
+/**
+ * hb_buffer_serialize_format_from_string:
+ * @str: (array length=len) (element-type uint8_t): a string to parse
+ * @len: length of @str, or -1 if string is %NULL terminated
+ *
+ * Parses a string into an #hb_buffer_serialize_format_t. Does not check if
+ * @str is a valid buffer serialization format, use
+ * hb_buffer_serialize_list_formats() to get the list of supported formats.
+ *
+ * Return value:
+ * The parsed #hb_buffer_serialize_format_t.
+ *
+ * Since: 0.9.7
+ **/
+hb_buffer_serialize_format_t
+hb_buffer_serialize_format_from_string (const char *str, int len)
+{
+  /* Upper-case it. */
+  return (hb_buffer_serialize_format_t) (hb_tag_from_string (str, len) & ~0x20202020u);
+}
+
+/**
+ * hb_buffer_serialize_format_to_string:
+ * @format: an #hb_buffer_serialize_format_t to convert.
+ *
+ * Converts @format to the string corresponding it, or %NULL if it is not a valid
+ * #hb_buffer_serialize_format_t.
+ *
+ * Return value: (transfer none):
+ * A %NULL terminated string corresponding to @format. Should not be freed.
+ *
+ * Since: 0.9.7
+ **/
+const char *
+hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format)
+{
+  switch (format)
+  {
+    case HB_BUFFER_SERIALIZE_FORMAT_TEXT:	return serialize_formats[0];
+    case HB_BUFFER_SERIALIZE_FORMAT_JSON:	return serialize_formats[1];
+    default:
+    case HB_BUFFER_SERIALIZE_FORMAT_INVALID:	return nullptr;
+  }
+}
+
+static unsigned int
+_hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
+				  unsigned int start,
+				  unsigned int end,
+				  char *buf,
+				  unsigned int buf_size,
+				  unsigned int *buf_consumed,
+				  hb_font_t *font,
+				  hb_buffer_serialize_flags_t flags)
+{
+  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
+  hb_glyph_position_t *pos = (flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS) ?
+			     nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
+
+  *buf_consumed = 0;
+  hb_position_t x = 0, y = 0;
+  for (unsigned int i = start; i < end; i++)
+  {
+    char b[1024];
+    char *p = b;
+
+    /* In the following code, we know b is large enough that no overflow can happen. */
+
+#define APPEND(s) HB_STMT_START { strcpy (p, s); p += strlen (s); } HB_STMT_END
+
+    if (i)
+      *p++ = ',';
+
+    *p++ = '{';
+
+    APPEND ("\"g\":");
+    if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES))
+    {
+      char g[128];
+      hb_font_glyph_to_string (font, info[i].codepoint, g, sizeof (g));
+      *p++ = '"';
+      for (char *q = g; *q; q++) {
+        if (*q == '"')
+	  *p++ = '\\';
+	*p++ = *q;
+      }
+      *p++ = '"';
+    }
+    else
+      p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint));
+
+    if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) {
+      p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"cl\":%u", info[i].cluster));
+    }
+
+    if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
+    {
+      p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d",
+			     x+pos[i].x_offset, y+pos[i].y_offset));
+      if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+	p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d",
+			       pos[i].x_advance, pos[i].y_advance));
+    }
+
+    if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
+    {
+      if (info[i].mask & HB_GLYPH_FLAG_DEFINED)
+	p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"fl\":%u", info[i].mask & HB_GLYPH_FLAG_DEFINED));
+    }
+
+    if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
+    {
+      hb_glyph_extents_t extents;
+      hb_font_get_glyph_extents(font, info[i].codepoint, &extents);
+      p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"xb\":%d,\"yb\":%d",
+		extents.x_bearing, extents.y_bearing));
+      p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"w\":%d,\"h\":%d",
+		extents.width, extents.height));
+    }
+
+    *p++ = '}';
+
+    unsigned int l = p - b;
+    if (buf_size > l)
+    {
+      memcpy (buf, b, l);
+      buf += l;
+      buf_size -= l;
+      *buf_consumed += l;
+      *buf = '\0';
+    } else
+      return i - start;
+
+    if (pos && (flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+    {
+      x += pos[i].x_advance;
+      y += pos[i].y_advance;
+    }
+  }
+
+  return end - start;
+}
+
+static unsigned int
+_hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
+				  unsigned int start,
+				  unsigned int end,
+				  char *buf,
+				  unsigned int buf_size,
+				  unsigned int *buf_consumed,
+				  hb_font_t *font,
+				  hb_buffer_serialize_flags_t flags)
+{
+  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
+  hb_glyph_position_t *pos = (flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS) ?
+			     nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
+
+  *buf_consumed = 0;
+  hb_position_t x = 0, y = 0;
+  for (unsigned int i = start; i < end; i++)
+  {
+    char b[1024];
+    char *p = b;
+
+    /* In the following code, we know b is large enough that no overflow can happen. */
+
+    if (i)
+      *p++ = '|';
+
+    if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES))
+    {
+      hb_font_glyph_to_string (font, info[i].codepoint, p, 128);
+      p += strlen (p);
+    }
+    else
+      p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint));
+
+    if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) {
+      p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "=%u", info[i].cluster));
+    }
+
+    if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
+    {
+      if (x+pos[i].x_offset || y+pos[i].y_offset)
+	p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", x+pos[i].x_offset, y+pos[i].y_offset));
+
+      if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+      {
+	*p++ = '+';
+	p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance));
+	if (pos[i].y_advance)
+	  p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance));
+      }
+    }
+
+    if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
+    {
+      if (info[i].mask & HB_GLYPH_FLAG_DEFINED)
+	p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "#%X", info[i].mask &HB_GLYPH_FLAG_DEFINED));
+    }
+
+    if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
+    {
+      hb_glyph_extents_t extents;
+      hb_font_get_glyph_extents(font, info[i].codepoint, &extents);
+      p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "<%d,%d,%d,%d>", extents.x_bearing, extents.y_bearing, extents.width, extents.height));
+    }
+
+    unsigned int l = p - b;
+    if (buf_size > l)
+    {
+      memcpy (buf, b, l);
+      buf += l;
+      buf_size -= l;
+      *buf_consumed += l;
+      *buf = '\0';
+    } else
+      return i - start;
+
+    if (pos && (flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+    {
+      x += pos[i].x_advance;
+      y += pos[i].y_advance;
+    }
+  }
+
+  return end - start;
+}
+
+/**
+ * hb_buffer_serialize_glyphs:
+ * @buffer: an #hb_buffer_t buffer.
+ * @start: the first item in @buffer to serialize.
+ * @end: the last item in @buffer to serialize.
+ * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to
+ *       write serialized buffer into.
+ * @buf_size: the size of @buf.
+ * @buf_consumed: (out) (allow-none): if not %NULL, will be set to the number of byes written into @buf.
+ * @font: (allow-none): the #hb_font_t used to shape this buffer, needed to
+ *        read glyph names and extents. If %NULL, and empty font will be used.
+ * @format: the #hb_buffer_serialize_format_t to use for formatting the output.
+ * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties
+ *         to serialize.
+ *
+ * Serializes @buffer into a textual representation of its glyph content,
+ * useful for showing the contents of the buffer, for example during debugging.
+ * There are currently two supported serialization formats:
+ *
+ * ## text
+ * A human-readable, plain text format.
+ * The serialized glyphs will look something like:
+ *
+ * ```
+ * [uni0651=0@518,0+0|uni0628=0+1897]
+ * ```
+ * - The serialized glyphs are delimited with `[` and `]`.
+ * - Glyphs are separated with `|`
+ * - Each glyph starts with glyph name, or glyph index if
+ *   #HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES flag is set. Then,
+ *   - If #HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS is not set, `=` then #hb_glyph_info_t.cluster.
+ *   - If #HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS is not set, the #hb_glyph_position_t in the format:
+ *     - If both #hb_glyph_position_t.x_offset and #hb_glyph_position_t.y_offset are not 0, `@x_offset,y_offset`. Then,
+ *     - `+x_advance`, then `,y_advance` if #hb_glyph_position_t.y_advance is not 0. Then,
+ *   - If #HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS is set, the
+ *     #hb_glyph_extents_t in the format
+ *     `&lt;x_bearing,y_bearing,width,height&gt;`
+ *
+ * ## json
+ * TODO.
+ *
+ * Return value:
+ * The number of serialized items.
+ *
+ * Since: 0.9.7
+ **/
+unsigned int
+hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
+			    unsigned int start,
+			    unsigned int end,
+			    char *buf,
+			    unsigned int buf_size,
+			    unsigned int *buf_consumed,
+			    hb_font_t *font,
+			    hb_buffer_serialize_format_t format,
+			    hb_buffer_serialize_flags_t flags)
+{
+  assert (start <= end && end <= buffer->len);
+
+  unsigned int sconsumed;
+  if (!buf_consumed)
+    buf_consumed = &sconsumed;
+  *buf_consumed = 0;
+  if (buf_size)
+    *buf = '\0';
+
+  assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) ||
+	  buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS);
+
+  if (!buffer->have_positions)
+    flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS;
+
+  if (unlikely (start == end))
+    return 0;
+
+  if (!font)
+    font = hb_font_get_empty ();
+
+  switch (format)
+  {
+    case HB_BUFFER_SERIALIZE_FORMAT_TEXT:
+      return _hb_buffer_serialize_glyphs_text (buffer, start, end,
+					       buf, buf_size, buf_consumed,
+					       font, flags);
+
+    case HB_BUFFER_SERIALIZE_FORMAT_JSON:
+      return _hb_buffer_serialize_glyphs_json (buffer, start, end,
+					       buf, buf_size, buf_consumed,
+					       font, flags);
+
+    default:
+    case HB_BUFFER_SERIALIZE_FORMAT_INVALID:
+      return 0;
+
+  }
+}
+
+
+static hb_bool_t
+parse_uint (const char *pp, const char *end, uint32_t *pv)
+{
+  char buf[32];
+  unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - pp));
+  strncpy (buf, pp, len);
+  buf[len] = '\0';
+
+  char *p = buf;
+  char *pend = p;
+  uint32_t v;
+
+  errno = 0;
+  v = strtol (p, &pend, 10);
+  if (errno || p == pend || pend - p != end - pp)
+    return false;
+
+  *pv = v;
+  return true;
+}
+
+static hb_bool_t
+parse_int (const char *pp, const char *end, int32_t *pv)
+{
+  char buf[32];
+  unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - pp));
+  strncpy (buf, pp, len);
+  buf[len] = '\0';
+
+  char *p = buf;
+  char *pend = p;
+  int32_t v;
+
+  errno = 0;
+  v = strtol (p, &pend, 10);
+  if (errno || p == pend || pend - p != end - pp)
+    return false;
+
+  *pv = v;
+  return true;
+}
+
+#include "hb-buffer-deserialize-json.hh"
+#include "hb-buffer-deserialize-text.hh"
+
+/**
+ * hb_buffer_deserialize_glyphs:
+ * @buffer: an #hb_buffer_t buffer.
+ * @buf: (array length=buf_len):
+ * @buf_len:
+ * @end_ptr: (out):
+ * @font:
+ * @format:
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.7
+ **/
+hb_bool_t
+hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
+			      const char *buf,
+			      int buf_len, /* -1 means nul-terminated */
+			      const char **end_ptr, /* May be NULL */
+			      hb_font_t *font, /* May be NULL */
+			      hb_buffer_serialize_format_t format)
+{
+  const char *end;
+  if (!end_ptr)
+    end_ptr = &end;
+  *end_ptr = buf;
+
+  assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) ||
+	  buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS);
+
+  if (buf_len == -1)
+    buf_len = strlen (buf);
+
+  if (!buf_len)
+  {
+    *end_ptr = buf;
+    return false;
+  }
+
+  hb_buffer_set_content_type (buffer, HB_BUFFER_CONTENT_TYPE_GLYPHS);
+
+  if (!font)
+    font = hb_font_get_empty ();
+
+  switch (format)
+  {
+    case HB_BUFFER_SERIALIZE_FORMAT_TEXT:
+      return _hb_buffer_deserialize_glyphs_text (buffer,
+						 buf, buf_len, end_ptr,
+						 font);
+
+    case HB_BUFFER_SERIALIZE_FORMAT_JSON:
+      return _hb_buffer_deserialize_glyphs_json (buffer,
+						 buf, buf_len, end_ptr,
+						 font);
+
+    default:
+    case HB_BUFFER_SERIALIZE_FORMAT_INVALID:
+      return false;
+
+  }
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer.cc
new file mode 100644
index 0000000..2dc02e9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer.cc
@@ -0,0 +1,2032 @@
+/*
+ * Copyright © 1998-2004  David Turner and Werner Lemberg
+ * Copyright © 2004,2007,2009,2010  Red Hat, Inc.
+ * Copyright © 2011,2012  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.
+ *
+ * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-buffer.hh"
+#include "hb-utf.hh"
+
+
+/**
+ * SECTION: hb-buffer
+ * @title: hb-buffer
+ * @short_description: Input and output buffers
+ * @include: hb.h
+ *
+ * Buffers serve dual role in HarfBuzz; they hold the input characters that are
+ * passed to hb_shape(), and after shaping they hold the output glyphs.
+ **/
+
+
+/**
+ * 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:
+ * %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)
+{
+  return a->direction == b->direction &&
+	 a->script    == b->script    &&
+	 a->language  == b->language  &&
+	 a->reserved1 == b->reserved1 &&
+	 a->reserved2 == b->reserved2;
+
+}
+
+/**
+ * hb_segment_properties_hash:
+ * @p: #hb_segment_properties_t to hash.
+ *
+ * Creates a hash representing @p.
+ *
+ * Return value:
+ * A hash of @p.
+ *
+ * Since: 0.9.7
+ **/
+unsigned int
+hb_segment_properties_hash (const hb_segment_properties_t *p)
+{
+  return (unsigned int) p->direction ^
+	 (unsigned int) p->script ^
+	 (intptr_t) (p->language);
+}
+
+
+
+/* Here is how the buffer works internally:
+ *
+ * There are two info pointers: info and out_info.  They always have
+ * the same allocated size, but different lengths.
+ *
+ * As an optimization, both info and out_info may point to the
+ * same piece of memory, which is owned by info.  This remains the
+ * case as long as out_len doesn't exceed i at any time.
+ * In that case, swap_buffers() is no-op and the glyph operations operate
+ * mostly in-place.
+ *
+ * As soon as out_info gets longer than info, out_info is moved over
+ * to an alternate buffer (which we reuse the pos buffer for!), and its
+ * current contents (out_len entries) are copied to the new place.
+ * This should all remain transparent to the user.  swap_buffers() then
+ * switches info and out_info.
+ */
+
+
+
+/* Internal API */
+
+bool
+hb_buffer_t::enlarge (unsigned int size)
+{
+  if (unlikely (!successful))
+    return false;
+  if (unlikely (size > max_len))
+  {
+    successful = false;
+    return false;
+  }
+
+  unsigned int new_allocated = allocated;
+  hb_glyph_position_t *new_pos = nullptr;
+  hb_glyph_info_t *new_info = nullptr;
+  bool separate_out = out_info != info;
+
+  if (unlikely (hb_unsigned_mul_overflows (size, sizeof (info[0]))))
+    goto done;
+
+  while (size >= new_allocated)
+    new_allocated += (new_allocated >> 1) + 32;
+
+  static_assert ((sizeof (info[0]) == sizeof (pos[0])), "");
+  if (unlikely (hb_unsigned_mul_overflows (new_allocated, sizeof (info[0]))))
+    goto done;
+
+  new_pos = (hb_glyph_position_t *) realloc (pos, new_allocated * sizeof (pos[0]));
+  new_info = (hb_glyph_info_t *) realloc (info, new_allocated * sizeof (info[0]));
+
+done:
+  if (unlikely (!new_pos || !new_info))
+    successful = false;
+
+  if (likely (new_pos))
+    pos = new_pos;
+
+  if (likely (new_info))
+    info = new_info;
+
+  out_info = separate_out ? (hb_glyph_info_t *) pos : info;
+  if (likely (successful))
+    allocated = new_allocated;
+
+  return likely (successful);
+}
+
+bool
+hb_buffer_t::make_room_for (unsigned int num_in,
+			    unsigned int num_out)
+{
+  if (unlikely (!ensure (out_len + num_out))) return false;
+
+  if (out_info == info &&
+      out_len + num_out > idx + num_in)
+  {
+    assert (have_output);
+
+    out_info = (hb_glyph_info_t *) pos;
+    memcpy (out_info, info, out_len * sizeof (out_info[0]));
+  }
+
+  return true;
+}
+
+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...
+     *
+     * Ideally, we should at least set Default_Ignorable bits on
+     * these, as well as consistent cluster values.  But the former
+     * is layering violation... */
+    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)
+{
+  have_output = false;
+  have_positions = false;
+
+  out_len = 0;
+  out_info = info;
+
+  assert ((uintptr_t) pos % sizeof (scratch_buffer_t) == 0);
+  *size = allocated * sizeof (pos[0]) / sizeof (scratch_buffer_t);
+  return (scratch_buffer_t *) (void *) pos;
+}
+
+
+
+/* HarfBuzz-Internal API */
+
+void
+hb_buffer_t::reset ()
+{
+  if (unlikely (hb_object_is_immutable (this)))
+    return;
+
+  hb_unicode_funcs_destroy (unicode);
+  unicode = hb_unicode_funcs_reference (hb_unicode_funcs_get_default ());
+  flags = HB_BUFFER_FLAG_DEFAULT;
+  replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT;
+  invisible = 0;
+
+  clear ();
+}
+
+void
+hb_buffer_t::clear ()
+{
+  if (unlikely (hb_object_is_immutable (this)))
+    return;
+
+  hb_segment_properties_t default_props = HB_SEGMENT_PROPERTIES_DEFAULT;
+  props = default_props;
+  scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
+
+  content_type = HB_BUFFER_CONTENT_TYPE_INVALID;
+  successful = true;
+  have_output = false;
+  have_positions = false;
+
+  idx = 0;
+  len = 0;
+  out_len = 0;
+  out_info = info;
+
+  serial = 0;
+
+  memset (context, 0, sizeof context);
+  memset (context_len, 0, sizeof context_len);
+
+  deallocate_var_all ();
+}
+
+void
+hb_buffer_t::add (hb_codepoint_t  codepoint,
+		  unsigned int    cluster)
+{
+  hb_glyph_info_t *glyph;
+
+  if (unlikely (!ensure (len + 1))) return;
+
+  glyph = &info[len];
+
+  memset (glyph, 0, sizeof (*glyph));
+  glyph->codepoint = codepoint;
+  glyph->mask = 0;
+  glyph->cluster = cluster;
+
+  len++;
+}
+
+void
+hb_buffer_t::add_info (const hb_glyph_info_t &glyph_info)
+{
+  if (unlikely (!ensure (len + 1))) return;
+
+  info[len] = glyph_info;
+
+  len++;
+}
+
+
+void
+hb_buffer_t::remove_output ()
+{
+  if (unlikely (hb_object_is_immutable (this)))
+    return;
+
+  have_output = false;
+  have_positions = false;
+
+  out_len = 0;
+  out_info = info;
+}
+
+void
+hb_buffer_t::clear_output ()
+{
+  if (unlikely (hb_object_is_immutable (this)))
+    return;
+
+  have_output = true;
+  have_positions = false;
+
+  out_len = 0;
+  out_info = info;
+}
+
+void
+hb_buffer_t::clear_positions ()
+{
+  if (unlikely (hb_object_is_immutable (this)))
+    return;
+
+  have_output = false;
+  have_positions = true;
+
+  out_len = 0;
+  out_info = info;
+
+  memset (pos, 0, sizeof (pos[0]) * len);
+}
+
+void
+hb_buffer_t::swap_buffers ()
+{
+  if (unlikely (!successful)) return;
+
+  assert (have_output);
+  have_output = false;
+
+  if (out_info != info)
+  {
+    hb_glyph_info_t *tmp_string;
+    tmp_string = info;
+    info = out_info;
+    out_info = tmp_string;
+    pos = (hb_glyph_position_t *) out_info;
+  }
+
+  unsigned int tmp;
+  tmp = len;
+  len = out_len;
+  out_len = tmp;
+
+  idx = 0;
+}
+
+
+void
+hb_buffer_t::replace_glyphs (unsigned int num_in,
+			     unsigned int num_out,
+			     const uint32_t *glyph_data)
+{
+  if (unlikely (!make_room_for (num_in, num_out))) return;
+
+  assert (idx + num_in <= len);
+
+  merge_clusters (idx, idx + num_in);
+
+  hb_glyph_info_t orig_info = info[idx];
+  hb_glyph_info_t *pinfo = &out_info[out_len];
+  for (unsigned int i = 0; i < num_out; i++)
+  {
+    *pinfo = orig_info;
+    pinfo->codepoint = glyph_data[i];
+    pinfo++;
+  }
+
+  idx  += num_in;
+  out_len += num_out;
+}
+
+bool
+hb_buffer_t::move_to (unsigned int i)
+{
+  if (!have_output)
+  {
+    assert (i <= len);
+    idx = i;
+    return true;
+  }
+  if (unlikely (!successful))
+    return false;
+
+  assert (i <= out_len + (len - idx));
+
+  if (out_len < i)
+  {
+    unsigned int count = i - out_len;
+    if (unlikely (!make_room_for (count, count))) return false;
+
+    memmove (out_info + out_len, info + idx, count * sizeof (out_info[0]));
+    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...
+     *
+     * We used to shift with extra 32 items, instead of the 0 below.
+     * But that would leave empty slots in the buffer in case of allocation
+     * failures.  Setting to zero for now to avoid other problems (see
+     * comments in shift_forward().  This can cause O(N^2) behavior more
+     * severely than adding 32 empty slots can... */
+    if (unlikely (idx < count && !shift_forward (count + 0))) return false;
+
+    assert (idx >= count);
+
+    idx -= count;
+    out_len -= count;
+    memmove (info + idx, out_info + out_len, count * sizeof (out_info[0]));
+  }
+
+  return true;
+}
+
+
+void
+hb_buffer_t::set_masks (hb_mask_t    value,
+			hb_mask_t    mask,
+			unsigned int cluster_start,
+			unsigned int cluster_end)
+{
+  hb_mask_t not_mask = ~mask;
+  value &= mask;
+
+  if (!mask)
+    return;
+
+  if (cluster_start == 0 && cluster_end == (unsigned int)-1) {
+    unsigned int count = len;
+    for (unsigned int i = 0; i < count; i++)
+      info[i].mask = (info[i].mask & not_mask) | value;
+    return;
+  }
+
+  unsigned int count = len;
+  for (unsigned int i = 0; i < count; i++)
+    if (cluster_start <= info[i].cluster && info[i].cluster < cluster_end)
+      info[i].mask = (info[i].mask & not_mask) | value;
+}
+
+void
+hb_buffer_t::reverse_range (unsigned int start,
+			    unsigned int end)
+{
+  unsigned int i, j;
+
+  if (end - start < 2)
+    return;
+
+  for (i = start, j = end - 1; i < j; i++, j--) {
+    hb_glyph_info_t t;
+
+    t = info[i];
+    info[i] = info[j];
+    info[j] = t;
+  }
+
+  if (have_positions) {
+    for (i = start, j = end - 1; i < j; i++, j--) {
+      hb_glyph_position_t t;
+
+      t = pos[i];
+      pos[i] = pos[j];
+      pos[j] = t;
+    }
+  }
+}
+
+void
+hb_buffer_t::reverse ()
+{
+  if (unlikely (!len))
+    return;
+
+  reverse_range (0, len);
+}
+
+void
+hb_buffer_t::reverse_clusters ()
+{
+  unsigned int i, start, count, last_cluster;
+
+  if (unlikely (!len))
+    return;
+
+  reverse ();
+
+  count = len;
+  start = 0;
+  last_cluster = info[0].cluster;
+  for (i = 1; i < count; i++) {
+    if (last_cluster != info[i].cluster) {
+      reverse_range (start, i);
+      start = i;
+      last_cluster = info[i].cluster;
+    }
+  }
+  reverse_range (start, i);
+}
+
+void
+hb_buffer_t::merge_clusters_impl (unsigned int start,
+				  unsigned int end)
+{
+  if (cluster_level == HB_BUFFER_CLUSTER_LEVEL_CHARACTERS)
+  {
+    unsafe_to_break (start, end);
+    return;
+  }
+
+  unsigned int cluster = info[start].cluster;
+
+  for (unsigned int i = start + 1; i < end; i++)
+    cluster = MIN<unsigned int> (cluster, info[i].cluster);
+
+  /* Extend end */
+  while (end < len && info[end - 1].cluster == info[end].cluster)
+    end++;
+
+  /* Extend start */
+  while (idx < start && info[start - 1].cluster == info[start].cluster)
+    start--;
+
+  /* If we hit the start of buffer, continue in out-buffer. */
+  if (idx == start)
+    for (unsigned int i = out_len; i && out_info[i - 1].cluster == info[start].cluster; i--)
+      set_cluster (out_info[i - 1], cluster);
+
+  for (unsigned int i = start; i < end; i++)
+    set_cluster (info[i], cluster);
+}
+void
+hb_buffer_t::merge_out_clusters (unsigned int start,
+				 unsigned int end)
+{
+  if (cluster_level == HB_BUFFER_CLUSTER_LEVEL_CHARACTERS)
+    return;
+
+  if (unlikely (end - start < 2))
+    return;
+
+  unsigned int cluster = out_info[start].cluster;
+
+  for (unsigned int i = start + 1; i < end; i++)
+    cluster = MIN<unsigned int> (cluster, out_info[i].cluster);
+
+  /* Extend start */
+  while (start && out_info[start - 1].cluster == out_info[start].cluster)
+    start--;
+
+  /* Extend end */
+  while (end < out_len && out_info[end - 1].cluster == out_info[end].cluster)
+    end++;
+
+  /* If we hit the end of out-buffer, continue in buffer. */
+  if (end == out_len)
+    for (unsigned int i = idx; i < len && info[i].cluster == out_info[end - 1].cluster; i++)
+      set_cluster (info[i], cluster);
+
+  for (unsigned int i = start; i < end; i++)
+    set_cluster (out_info[i], cluster);
+}
+void
+hb_buffer_t::delete_glyph ()
+{
+  /* The logic here is duplicated in hb_ot_hide_default_ignorables(). */
+
+  unsigned int cluster = info[idx].cluster;
+  if (idx + 1 < len && cluster == info[idx + 1].cluster)
+  {
+    /* Cluster survives; do nothing. */
+    goto done;
+  }
+
+  if (out_len)
+  {
+    /* Merge cluster backward. */
+    if (cluster < out_info[out_len - 1].cluster)
+    {
+      unsigned int mask = info[idx].mask;
+      unsigned int old_cluster = out_info[out_len - 1].cluster;
+      for (unsigned i = out_len; i && out_info[i - 1].cluster == old_cluster; i--)
+	set_cluster (out_info[i - 1], cluster, mask);
+    }
+    goto done;
+  }
+
+  if (idx + 1 < len)
+  {
+    /* Merge cluster forward. */
+    merge_clusters (idx, idx + 2);
+    goto done;
+  }
+
+done:
+  skip_glyph ();
+}
+
+void
+hb_buffer_t::unsafe_to_break_impl (unsigned int start, unsigned int end)
+{
+  unsigned int cluster = (unsigned int) -1;
+  cluster = _unsafe_to_break_find_min_cluster (info, start, end, cluster);
+  _unsafe_to_break_set_mask (info, start, end, cluster);
+}
+void
+hb_buffer_t::unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end)
+{
+  if (!have_output)
+  {
+    unsafe_to_break_impl (start, end);
+    return;
+  }
+
+  assert (start <= out_len);
+  assert (idx <= end);
+
+  unsigned int cluster = (unsigned int) -1;
+  cluster = _unsafe_to_break_find_min_cluster (out_info, start, out_len, cluster);
+  cluster = _unsafe_to_break_find_min_cluster (info, idx, end, cluster);
+  _unsafe_to_break_set_mask (out_info, start, out_len, cluster);
+  _unsafe_to_break_set_mask (info, idx, end, cluster);
+}
+
+void
+hb_buffer_t::guess_segment_properties ()
+{
+  assert (content_type == HB_BUFFER_CONTENT_TYPE_UNICODE ||
+	  (!len && content_type == HB_BUFFER_CONTENT_TYPE_INVALID));
+
+  /* If script is set to INVALID, guess from buffer contents */
+  if (props.script == HB_SCRIPT_INVALID) {
+    for (unsigned int i = 0; i < len; i++) {
+      hb_script_t script = unicode->script (info[i].codepoint);
+      if (likely (script != HB_SCRIPT_COMMON &&
+		  script != HB_SCRIPT_INHERITED &&
+		  script != HB_SCRIPT_UNKNOWN)) {
+        props.script = script;
+        break;
+      }
+    }
+  }
+
+  /* If direction is set to INVALID, guess from script */
+  if (props.direction == HB_DIRECTION_INVALID) {
+    props.direction = hb_script_get_horizontal_direction (props.script);
+    if (props.direction == HB_DIRECTION_INVALID)
+      props.direction = HB_DIRECTION_LTR;
+  }
+
+  /* If language is not set, use default language from locale */
+  if (props.language == HB_LANGUAGE_INVALID) {
+    /* TODO get_default_for_script? using $LANGUAGE */
+    props.language = hb_language_get_default ();
+  }
+}
+
+
+/* Public API */
+
+DEFINE_NULL_INSTANCE (hb_buffer_t) =
+{
+  HB_OBJECT_HEADER_STATIC,
+
+  const_cast<hb_unicode_funcs_t *> (&_hb_Null_hb_unicode_funcs_t),
+  HB_BUFFER_FLAG_DEFAULT,
+  HB_BUFFER_CLUSTER_LEVEL_DEFAULT,
+  HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT,
+  0, /* invisible */
+  HB_BUFFER_SCRATCH_FLAG_DEFAULT,
+  HB_BUFFER_MAX_LEN_DEFAULT,
+  HB_BUFFER_MAX_OPS_DEFAULT,
+
+  HB_BUFFER_CONTENT_TYPE_INVALID,
+  HB_SEGMENT_PROPERTIES_DEFAULT,
+  false, /* successful */
+  true, /* have_output */
+  true  /* have_positions */
+
+  /* Zero is good enough for everything else. */
+};
+
+
+/**
+ * hb_buffer_create: (Xconstructor)
+ *
+ * Creates a new #hb_buffer_t with all properties to defaults.
+ *
+ * Return value: (transfer full):
+ * A newly allocated #hb_buffer_t with a reference count of 1. The initial
+ * reference count should be released with hb_buffer_destroy() when you are done
+ * using the #hb_buffer_t. This function never returns %NULL. If memory cannot
+ * be allocated, a special #hb_buffer_t object will be returned on which
+ * hb_buffer_allocation_successful() returns %false.
+ *
+ * Since: 0.9.2
+ **/
+hb_buffer_t *
+hb_buffer_create ()
+{
+  hb_buffer_t *buffer;
+
+  if (!(buffer = hb_object_create<hb_buffer_t> ()))
+    return hb_buffer_get_empty ();
+
+  buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
+  buffer->max_ops = HB_BUFFER_MAX_OPS_DEFAULT;
+
+  buffer->reset ();
+
+  return buffer;
+}
+
+/**
+ * hb_buffer_get_empty:
+ *
+ *
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.2
+ **/
+hb_buffer_t *
+hb_buffer_get_empty ()
+{
+  return const_cast<hb_buffer_t *> (&Null(hb_buffer_t));
+}
+
+/**
+ * hb_buffer_reference: (skip)
+ * @buffer: an #hb_buffer_t.
+ *
+ * Increases the reference count on @buffer by one. This prevents @buffer from
+ * being destroyed until a matching call to hb_buffer_destroy() is made.
+ *
+ * Return value: (transfer full):
+ * The referenced #hb_buffer_t.
+ *
+ * Since: 0.9.2
+ **/
+hb_buffer_t *
+hb_buffer_reference (hb_buffer_t *buffer)
+{
+  return hb_object_reference (buffer);
+}
+
+/**
+ * hb_buffer_destroy: (skip)
+ * @buffer: an #hb_buffer_t.
+ *
+ * Deallocate the @buffer.
+ * Decreases the reference count on @buffer by one. If the result is zero, then
+ * @buffer and all associated resources are freed. See hb_buffer_reference().
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_buffer_destroy (hb_buffer_t *buffer)
+{
+  if (!hb_object_destroy (buffer)) return;
+
+  hb_unicode_funcs_destroy (buffer->unicode);
+
+  free (buffer->info);
+  free (buffer->pos);
+  if (buffer->message_destroy)
+    buffer->message_destroy (buffer->message_data);
+
+  free (buffer);
+}
+
+/**
+ * hb_buffer_set_user_data: (skip)
+ * @buffer: an #hb_buffer_t.
+ * @key:
+ * @data:
+ * @destroy:
+ * @replace:
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_buffer_set_user_data (hb_buffer_t        *buffer,
+			 hb_user_data_key_t *key,
+			 void *              data,
+			 hb_destroy_func_t   destroy,
+			 hb_bool_t           replace)
+{
+  return hb_object_set_user_data (buffer, key, data, destroy, replace);
+}
+
+/**
+ * hb_buffer_get_user_data: (skip)
+ * @buffer: an #hb_buffer_t.
+ * @key:
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+void *
+hb_buffer_get_user_data (hb_buffer_t        *buffer,
+			 hb_user_data_key_t *key)
+{
+  return hb_object_get_user_data (buffer, key);
+}
+
+
+/**
+ * hb_buffer_set_content_type:
+ * @buffer: an #hb_buffer_t.
+ * @content_type: the type of buffer contents to set
+ *
+ * Sets the type of @buffer contents, buffers are either empty, contain
+ * characters (before shaping) or glyphs (the result of shaping).
+ *
+ * Since: 0.9.5
+ **/
+void
+hb_buffer_set_content_type (hb_buffer_t              *buffer,
+			    hb_buffer_content_type_t  content_type)
+{
+  buffer->content_type = content_type;
+}
+
+/**
+ * hb_buffer_get_content_type:
+ * @buffer: an #hb_buffer_t.
+ *
+ * see hb_buffer_set_content_type().
+ *
+ * Return value:
+ * The type of @buffer contents.
+ *
+ * Since: 0.9.5
+ **/
+hb_buffer_content_type_t
+hb_buffer_get_content_type (hb_buffer_t *buffer)
+{
+  return buffer->content_type;
+}
+
+
+/**
+ * hb_buffer_set_unicode_funcs:
+ * @buffer: an #hb_buffer_t.
+ * @unicode_funcs:
+ *
+ *
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_buffer_set_unicode_funcs (hb_buffer_t        *buffer,
+			     hb_unicode_funcs_t *unicode_funcs)
+{
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
+  if (!unicode_funcs)
+    unicode_funcs = hb_unicode_funcs_get_default ();
+
+  hb_unicode_funcs_reference (unicode_funcs);
+  hb_unicode_funcs_destroy (buffer->unicode);
+  buffer->unicode = unicode_funcs;
+}
+
+/**
+ * hb_buffer_get_unicode_funcs:
+ * @buffer: an #hb_buffer_t.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_unicode_funcs_t *
+hb_buffer_get_unicode_funcs (hb_buffer_t        *buffer)
+{
+  return buffer->unicode;
+}
+
+/**
+ * hb_buffer_set_direction:
+ * @buffer: an #hb_buffer_t.
+ * @direction: the #hb_direction_t of the @buffer
+ *
+ * Set the text flow direction of the buffer. No shaping can happen without
+ * setting @buffer direction, and it controls the visual direction for the
+ * output glyphs; for RTL direction the glyphs will be reversed. Many layout
+ * features depend on the proper setting of the direction, for example,
+ * reversing RTL text before shaping, then shaping with LTR direction is not
+ * the same as keeping the text in logical order and shaping with RTL
+ * direction.
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_buffer_set_direction (hb_buffer_t    *buffer,
+			 hb_direction_t  direction)
+
+{
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
+  buffer->props.direction = direction;
+}
+
+/**
+ * hb_buffer_get_direction:
+ * @buffer: an #hb_buffer_t.
+ *
+ * See hb_buffer_set_direction()
+ *
+ * Return value:
+ * The direction of the @buffer.
+ *
+ * Since: 0.9.2
+ **/
+hb_direction_t
+hb_buffer_get_direction (hb_buffer_t    *buffer)
+{
+  return buffer->props.direction;
+}
+
+/**
+ * hb_buffer_set_script:
+ * @buffer: an #hb_buffer_t.
+ * @script: an #hb_script_t to set.
+ *
+ * Sets the script of @buffer to @script.
+ *
+ * Script is crucial for choosing the proper shaping behaviour for scripts that
+ * require it (e.g. Arabic) and the which OpenType features defined in the font
+ * to be applied.
+ *
+ * You can pass one of the predefined #hb_script_t values, or use
+ * hb_script_from_string() or hb_script_from_iso15924_tag() to get the
+ * corresponding script from an ISO 15924 script tag.
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_buffer_set_script (hb_buffer_t *buffer,
+		      hb_script_t  script)
+{
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
+  buffer->props.script = script;
+}
+
+/**
+ * hb_buffer_get_script:
+ * @buffer: an #hb_buffer_t.
+ *
+ * See hb_buffer_set_script().
+ *
+ * Return value:
+ * The #hb_script_t of the @buffer.
+ *
+ * Since: 0.9.2
+ **/
+hb_script_t
+hb_buffer_get_script (hb_buffer_t *buffer)
+{
+  return buffer->props.script;
+}
+
+/**
+ * hb_buffer_set_language:
+ * @buffer: an #hb_buffer_t.
+ * @language: an hb_language_t to set.
+ *
+ * Sets the language of @buffer to @language.
+ *
+ * Languages are crucial for selecting which OpenType feature to apply to the
+ * buffer which can result in applying language-specific behaviour. Languages
+ * are orthogonal to the scripts, and though they are related, they are
+ * different concepts and should not be confused with each other.
+ *
+ * Use hb_language_from_string() to convert from BCP 47 language tags to
+ * #hb_language_t.
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_buffer_set_language (hb_buffer_t   *buffer,
+			hb_language_t  language)
+{
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
+  buffer->props.language = language;
+}
+
+/**
+ * hb_buffer_get_language:
+ * @buffer: an #hb_buffer_t.
+ *
+ * See hb_buffer_set_language().
+ *
+ * Return value: (transfer none):
+ * The #hb_language_t of the buffer. Must not be freed by the caller.
+ *
+ * Since: 0.9.2
+ **/
+hb_language_t
+hb_buffer_get_language (hb_buffer_t *buffer)
+{
+  return buffer->props.language;
+}
+
+/**
+ * hb_buffer_set_segment_properties:
+ * @buffer: an #hb_buffer_t.
+ * @props: an #hb_segment_properties_t to use.
+ *
+ * Sets the segment properties of the buffer, a shortcut for calling
+ * hb_buffer_set_direction(), hb_buffer_set_script() and
+ * hb_buffer_set_language() individually.
+ *
+ * Since: 0.9.7
+ **/
+void
+hb_buffer_set_segment_properties (hb_buffer_t *buffer,
+				  const hb_segment_properties_t *props)
+{
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
+  buffer->props = *props;
+}
+
+/**
+ * hb_buffer_get_segment_properties:
+ * @buffer: an #hb_buffer_t.
+ * @props: (out): the output #hb_segment_properties_t.
+ *
+ * Sets @props to the #hb_segment_properties_t of @buffer.
+ *
+ * Since: 0.9.7
+ **/
+void
+hb_buffer_get_segment_properties (hb_buffer_t *buffer,
+				  hb_segment_properties_t *props)
+{
+  *props = buffer->props;
+}
+
+
+/**
+ * hb_buffer_set_flags:
+ * @buffer: an #hb_buffer_t.
+ * @flags: the buffer flags to set.
+ *
+ * Sets @buffer flags to @flags. See #hb_buffer_flags_t.
+ *
+ * Since: 0.9.7
+ **/
+void
+hb_buffer_set_flags (hb_buffer_t       *buffer,
+		     hb_buffer_flags_t  flags)
+{
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
+  buffer->flags = flags;
+}
+
+/**
+ * hb_buffer_get_flags:
+ * @buffer: an #hb_buffer_t.
+ *
+ * See hb_buffer_set_flags().
+ *
+ * Return value:
+ * The @buffer flags.
+ *
+ * Since: 0.9.7
+ **/
+hb_buffer_flags_t
+hb_buffer_get_flags (hb_buffer_t *buffer)
+{
+  return buffer->flags;
+}
+
+/**
+ * hb_buffer_set_cluster_level:
+ * @buffer: an #hb_buffer_t.
+ * @cluster_level:
+ *
+ *
+ *
+ * Since: 0.9.42
+ **/
+void
+hb_buffer_set_cluster_level (hb_buffer_t       *buffer,
+		     hb_buffer_cluster_level_t  cluster_level)
+{
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
+  buffer->cluster_level = cluster_level;
+}
+
+/**
+ * hb_buffer_get_cluster_level:
+ * @buffer: an #hb_buffer_t.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.42
+ **/
+hb_buffer_cluster_level_t
+hb_buffer_get_cluster_level (hb_buffer_t *buffer)
+{
+  return buffer->cluster_level;
+}
+
+
+/**
+ * hb_buffer_set_replacement_codepoint:
+ * @buffer: an #hb_buffer_t.
+ * @replacement: the replacement #hb_codepoint_t
+ *
+ * Sets the #hb_codepoint_t that replaces invalid entries for a given encoding
+ * when adding text to @buffer.
+ *
+ * Default is %HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT.
+ *
+ * Since: 0.9.31
+ **/
+void
+hb_buffer_set_replacement_codepoint (hb_buffer_t    *buffer,
+				     hb_codepoint_t  replacement)
+{
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
+  buffer->replacement = replacement;
+}
+
+/**
+ * hb_buffer_get_replacement_codepoint:
+ * @buffer: an #hb_buffer_t.
+ *
+ * See hb_buffer_set_replacement_codepoint().
+ *
+ * Return value:
+ * The @buffer replacement #hb_codepoint_t.
+ *
+ * Since: 0.9.31
+ **/
+hb_codepoint_t
+hb_buffer_get_replacement_codepoint (hb_buffer_t    *buffer)
+{
+  return buffer->replacement;
+}
+
+
+/**
+ * hb_buffer_set_invisible_glyph:
+ * @buffer: an #hb_buffer_t.
+ * @invisible: the invisible #hb_codepoint_t
+ *
+ * Sets the #hb_codepoint_t that replaces invisible characters in
+ * the shaping result.  If set to zero (default), the glyph for the
+ * U+0020 SPACE character is used.  Otherwise, this value is used
+ * verbatim.
+ *
+ * Since: 2.0.0
+ **/
+void
+hb_buffer_set_invisible_glyph (hb_buffer_t    *buffer,
+			       hb_codepoint_t  invisible)
+{
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
+  buffer->invisible = invisible;
+}
+
+/**
+ * hb_buffer_get_invisible_glyph:
+ * @buffer: an #hb_buffer_t.
+ *
+ * See hb_buffer_set_invisible_glyph().
+ *
+ * Return value:
+ * The @buffer invisible #hb_codepoint_t.
+ *
+ * Since: 2.0.0
+ **/
+hb_codepoint_t
+hb_buffer_get_invisible_glyph (hb_buffer_t    *buffer)
+{
+  return buffer->invisible;
+}
+
+
+/**
+ * hb_buffer_reset:
+ * @buffer: an #hb_buffer_t.
+ *
+ * Resets the buffer to its initial status, as if it was just newly created
+ * with hb_buffer_create().
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_buffer_reset (hb_buffer_t *buffer)
+{
+  buffer->reset ();
+}
+
+/**
+ * hb_buffer_clear_contents:
+ * @buffer: an #hb_buffer_t.
+ *
+ * Similar to hb_buffer_reset(), but does not clear the Unicode functions and
+ * the replacement code point.
+ *
+ * Since: 0.9.11
+ **/
+void
+hb_buffer_clear_contents (hb_buffer_t *buffer)
+{
+  buffer->clear ();
+}
+
+/**
+ * hb_buffer_pre_allocate:
+ * @buffer: an #hb_buffer_t.
+ * @size: number of items to pre allocate.
+ *
+ * Pre allocates memory for @buffer to fit at least @size number of items.
+ *
+ * Return value:
+ * %true if @buffer memory allocation succeeded, %false otherwise.
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_buffer_pre_allocate (hb_buffer_t *buffer, unsigned int size)
+{
+  return buffer->ensure (size);
+}
+
+/**
+ * hb_buffer_allocation_successful:
+ * @buffer: an #hb_buffer_t.
+ *
+ * Check if allocating memory for the buffer succeeded.
+ *
+ * Return value:
+ * %true if @buffer memory allocation succeeded, %false otherwise.
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_buffer_allocation_successful (hb_buffer_t  *buffer)
+{
+  return buffer->successful;
+}
+
+/**
+ * hb_buffer_add:
+ * @buffer: an #hb_buffer_t.
+ * @codepoint: a Unicode code point.
+ * @cluster: the cluster value of @codepoint.
+ *
+ * Appends a character with the Unicode value of @codepoint to @buffer, and
+ * gives it the initial cluster value of @cluster. Clusters can be any thing
+ * the client wants, they are usually used to refer to the index of the
+ * character in the input text stream and are output in
+ * #hb_glyph_info_t.cluster field.
+ *
+ * This function does not check the validity of @codepoint, it is up to the
+ * caller to ensure it is a valid Unicode code point.
+ *
+ * Since: 0.9.7
+ **/
+void
+hb_buffer_add (hb_buffer_t    *buffer,
+	       hb_codepoint_t  codepoint,
+	       unsigned int    cluster)
+{
+  buffer->add (codepoint, cluster);
+  buffer->clear_context (1);
+}
+
+/**
+ * hb_buffer_set_length:
+ * @buffer: an #hb_buffer_t.
+ * @length: the new length of @buffer.
+ *
+ * Similar to hb_buffer_pre_allocate(), but clears any new items added at the
+ * end.
+ *
+ * Return value:
+ * %true if @buffer memory allocation succeeded, %false otherwise.
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_buffer_set_length (hb_buffer_t  *buffer,
+		      unsigned int  length)
+{
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return length == 0;
+
+  if (!buffer->ensure (length))
+    return false;
+
+  /* Wipe the new space */
+  if (length > buffer->len) {
+    memset (buffer->info + buffer->len, 0, sizeof (buffer->info[0]) * (length - buffer->len));
+    if (buffer->have_positions)
+      memset (buffer->pos + buffer->len, 0, sizeof (buffer->pos[0]) * (length - buffer->len));
+  }
+
+  buffer->len = length;
+
+  if (!length)
+  {
+    buffer->content_type = HB_BUFFER_CONTENT_TYPE_INVALID;
+    buffer->clear_context (0);
+  }
+  buffer->clear_context (1);
+
+  return true;
+}
+
+/**
+ * hb_buffer_get_length:
+ * @buffer: an #hb_buffer_t.
+ *
+ * Returns the number of items in the buffer.
+ *
+ * Return value:
+ * The @buffer length.
+ * The value valid as long as buffer has not been modified.
+ *
+ * Since: 0.9.2
+ **/
+unsigned int
+hb_buffer_get_length (hb_buffer_t *buffer)
+{
+  return buffer->len;
+}
+
+/**
+ * hb_buffer_get_glyph_infos:
+ * @buffer: an #hb_buffer_t.
+ * @length: (out): output array length.
+ *
+ * Returns @buffer glyph information array.  Returned pointer
+ * is valid as long as @buffer contents are not modified.
+ *
+ * Return value: (transfer none) (array length=length):
+ * The @buffer glyph information array.
+ * The value valid as long as buffer has not been modified.
+ *
+ * Since: 0.9.2
+ **/
+hb_glyph_info_t *
+hb_buffer_get_glyph_infos (hb_buffer_t  *buffer,
+                           unsigned int *length)
+{
+  if (length)
+    *length = buffer->len;
+
+  return (hb_glyph_info_t *) buffer->info;
+}
+
+/**
+ * hb_buffer_get_glyph_positions:
+ * @buffer: an #hb_buffer_t.
+ * @length: (out): output length.
+ *
+ * Returns @buffer glyph position array.  Returned pointer
+ * is valid as long as @buffer contents are not modified.
+ *
+ * Return value: (transfer none) (array length=length):
+ * The @buffer glyph position array.
+ * The value valid as long as buffer has not been modified.
+ *
+ * Since: 0.9.2
+ **/
+hb_glyph_position_t *
+hb_buffer_get_glyph_positions (hb_buffer_t  *buffer,
+                               unsigned int *length)
+{
+  if (!buffer->have_positions)
+    buffer->clear_positions ();
+
+  if (length)
+    *length = buffer->len;
+
+  return (hb_glyph_position_t *) buffer->pos;
+}
+
+/**
+ * hb_glyph_info_get_glyph_flags:
+ * @info: a #hb_glyph_info_t.
+ *
+ * Returns glyph flags encoded within a #hb_glyph_info_t.
+ *
+ * Return value:
+ * The #hb_glyph_flags_t encoded within @info.
+ *
+ * Since: 1.5.0
+ **/
+hb_glyph_flags_t
+(hb_glyph_info_get_glyph_flags) (const hb_glyph_info_t *info)
+{
+  return hb_glyph_info_get_glyph_flags (info);
+}
+
+/**
+ * hb_buffer_reverse:
+ * @buffer: an #hb_buffer_t.
+ *
+ * Reverses buffer contents.
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_buffer_reverse (hb_buffer_t *buffer)
+{
+  buffer->reverse ();
+}
+
+/**
+ * hb_buffer_reverse_range:
+ * @buffer: an #hb_buffer_t.
+ * @start: start index.
+ * @end: end index.
+ *
+ * Reverses buffer contents between start to end.
+ *
+ * Since: 0.9.41
+ **/
+void
+hb_buffer_reverse_range (hb_buffer_t *buffer,
+			 unsigned int start, unsigned int end)
+{
+  buffer->reverse_range (start, end);
+}
+
+/**
+ * hb_buffer_reverse_clusters:
+ * @buffer: an #hb_buffer_t.
+ *
+ * Reverses buffer clusters.  That is, the buffer contents are
+ * reversed, then each cluster (consecutive items having the
+ * same cluster number) are reversed again.
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_buffer_reverse_clusters (hb_buffer_t *buffer)
+{
+  buffer->reverse_clusters ();
+}
+
+/**
+ * hb_buffer_guess_segment_properties:
+ * @buffer: an #hb_buffer_t.
+ *
+ * Sets unset buffer segment properties based on buffer Unicode
+ * contents.  If buffer is not empty, it must have content type
+ * %HB_BUFFER_CONTENT_TYPE_UNICODE.
+ *
+ * If buffer script is not set (ie. is %HB_SCRIPT_INVALID), it
+ * will be set to the Unicode script of the first character in
+ * the buffer that has a script other than %HB_SCRIPT_COMMON,
+ * %HB_SCRIPT_INHERITED, and %HB_SCRIPT_UNKNOWN.
+ *
+ * Next, if buffer direction is not set (ie. is %HB_DIRECTION_INVALID),
+ * it will be set to the natural horizontal direction of the
+ * buffer script as returned by hb_script_get_horizontal_direction().
+ * If hb_script_get_horizontal_direction() returns %HB_DIRECTION_INVALID,
+ * then %HB_DIRECTION_LTR is used.
+ *
+ * Finally, if buffer language is not set (ie. is %HB_LANGUAGE_INVALID),
+ * it will be set to the process's default language as returned by
+ * hb_language_get_default().  This may change in the future by
+ * taking buffer script into consideration when choosing a language.
+ * Note that hb_language_get_default() is NOT threadsafe the first time
+ * it is called.  See documentation for that function for details.
+ *
+ * Since: 0.9.7
+ **/
+void
+hb_buffer_guess_segment_properties (hb_buffer_t *buffer)
+{
+  buffer->guess_segment_properties ();
+}
+
+template <typename utf_t>
+static inline void
+hb_buffer_add_utf (hb_buffer_t  *buffer,
+		   const typename utf_t::codepoint_t *text,
+		   int           text_length,
+		   unsigned int  item_offset,
+		   int           item_length)
+{
+  typedef typename utf_t::codepoint_t T;
+  const hb_codepoint_t replacement = buffer->replacement;
+
+  assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE ||
+	  (!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID));
+
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
+  if (text_length == -1)
+    text_length = utf_t::strlen (text);
+
+  if (item_length == -1)
+    item_length = text_length - item_offset;
+
+  buffer->ensure (buffer->len + item_length * sizeof (T) / 4);
+
+  /* If buffer is empty and pre-context provided, install it.
+   * This check is written this way, to make sure people can
+   * provide pre-context in one add_utf() call, then provide
+   * text in a follow-up call.  See:
+   *
+   * https://bugzilla.mozilla.org/show_bug.cgi?id=801410#c13
+   */
+  if (!buffer->len && item_offset > 0)
+  {
+    /* Add pre-context */
+    buffer->clear_context (0);
+    const T *prev = text + item_offset;
+    const T *start = text;
+    while (start < prev && buffer->context_len[0] < buffer->CONTEXT_LENGTH)
+    {
+      hb_codepoint_t u;
+      prev = utf_t::prev (prev, start, &u, replacement);
+      buffer->context[0][buffer->context_len[0]++] = u;
+    }
+  }
+
+  const T *next = text + item_offset;
+  const T *end = next + item_length;
+  while (next < end)
+  {
+    hb_codepoint_t u;
+    const T *old_next = next;
+    next = utf_t::next (next, end, &u, replacement);
+    buffer->add (u, old_next - (const T *) text);
+  }
+
+  /* Add post-context */
+  buffer->clear_context (1);
+  end = text + text_length;
+  while (next < end && buffer->context_len[1] < buffer->CONTEXT_LENGTH)
+  {
+    hb_codepoint_t u;
+    next = utf_t::next (next, end, &u, replacement);
+    buffer->context[1][buffer->context_len[1]++] = u;
+  }
+
+  buffer->content_type = HB_BUFFER_CONTENT_TYPE_UNICODE;
+}
+
+/**
+ * hb_buffer_add_utf8:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8
+ *               characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ *               end of @text (assuming it is %NULL terminated).
+ *
+ * See hb_buffer_add_codepoints().
+ *
+ * Replaces invalid UTF-8 characters with the @buffer replacement code point,
+ * see hb_buffer_set_replacement_codepoint().
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_buffer_add_utf8 (hb_buffer_t  *buffer,
+		    const char   *text,
+		    int           text_length,
+		    unsigned int  item_offset,
+		    int           item_length)
+{
+  hb_buffer_add_utf<hb_utf8_t> (buffer, (const uint8_t *) text, text_length, item_offset, item_length);
+}
+
+/**
+ * hb_buffer_add_utf16:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length): an array of UTF-16 characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ *               end of @text (assuming it is %NULL terminated).
+ *
+ * See hb_buffer_add_codepoints().
+ *
+ * Replaces invalid UTF-16 characters with the @buffer replacement code point,
+ * see hb_buffer_set_replacement_codepoint().
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_buffer_add_utf16 (hb_buffer_t    *buffer,
+		     const uint16_t *text,
+		     int             text_length,
+		     unsigned int    item_offset,
+		     int             item_length)
+{
+  hb_buffer_add_utf<hb_utf16_t> (buffer, text, text_length, item_offset, item_length);
+}
+
+/**
+ * hb_buffer_add_utf32:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length): an array of UTF-32 characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ *               end of @text (assuming it is %NULL terminated).
+ *
+ * See hb_buffer_add_codepoints().
+ *
+ * Replaces invalid UTF-32 characters with the @buffer replacement code point,
+ * see hb_buffer_set_replacement_codepoint().
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_buffer_add_utf32 (hb_buffer_t    *buffer,
+		     const uint32_t *text,
+		     int             text_length,
+		     unsigned int    item_offset,
+		     int             item_length)
+{
+  hb_buffer_add_utf<hb_utf32_t> (buffer, text, text_length, item_offset, item_length);
+}
+
+/**
+ * hb_buffer_add_latin1:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8
+ *               characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ *               end of @text (assuming it is %NULL terminated).
+ *
+ * Similar to hb_buffer_add_codepoints(), but allows only access to first 256
+ * Unicode code points that can fit in 8-bit strings.
+ *
+ * <note>Has nothing to do with non-Unicode Latin-1 encoding.</note>
+ *
+ * Since: 0.9.39
+ **/
+void
+hb_buffer_add_latin1 (hb_buffer_t   *buffer,
+		      const uint8_t *text,
+		      int            text_length,
+		      unsigned int   item_offset,
+		      int            item_length)
+{
+  hb_buffer_add_utf<hb_latin1_t> (buffer, text, text_length, item_offset, item_length);
+}
+
+/**
+ * hb_buffer_add_codepoints:
+ * @buffer: a #hb_buffer_t to append characters to.
+ * @text: (array length=text_length): an array of Unicode code points to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first code point to add to the @buffer.
+ * @item_length: the number of code points to add to the @buffer, or -1 for the
+ *               end of @text (assuming it is %NULL terminated).
+ *
+ * Appends characters from @text array to @buffer. The @item_offset is the
+ * position of the first character from @text that will be appended, and
+ * @item_length is the number of character. When shaping part of a larger text
+ * (e.g. a run of text from a paragraph), instead of passing just the substring
+ * corresponding to the run, it is preferable to pass the whole
+ * paragraph and specify the run start and length as @item_offset and
+ * @item_length, respectively, to give HarfBuzz the full context to be able,
+ * for example, to do cross-run Arabic shaping or properly handle combining
+ * marks at stat of run.
+ *
+ * This function does not check the validity of @text, it is up to the caller
+ * to ensure it contains a valid Unicode code points.
+ *
+ * Since: 0.9.31
+ **/
+void
+hb_buffer_add_codepoints (hb_buffer_t          *buffer,
+			  const hb_codepoint_t *text,
+			  int                   text_length,
+			  unsigned int          item_offset,
+			  int                   item_length)
+{
+  hb_buffer_add_utf<hb_utf32_novalidate_t> (buffer, text, text_length, item_offset, item_length);
+}
+
+
+/**
+ * hb_buffer_append:
+ * @buffer: an #hb_buffer_t.
+ * @source: source #hb_buffer_t.
+ * @start: start index into source buffer to copy.  Use 0 to copy from start of buffer.
+ * @end: end index into source buffer to copy.  Use (unsigned int) -1 to copy to end of buffer.
+ *
+ * Append (part of) contents of another buffer to this buffer.
+ *
+ * Since: 1.5.0
+ **/
+HB_EXTERN void
+hb_buffer_append (hb_buffer_t *buffer,
+		  hb_buffer_t *source,
+		  unsigned int start,
+		  unsigned int end)
+{
+  assert (!buffer->have_output && !source->have_output);
+  assert (buffer->have_positions == source->have_positions ||
+	  !buffer->len || !source->len);
+  assert (buffer->content_type == source->content_type ||
+	  !buffer->len || !source->len);
+
+  if (end > source->len)
+    end = source->len;
+  if (start > end)
+    start = end;
+  if (start == end)
+    return;
+
+  if (!buffer->len)
+    buffer->content_type = source->content_type;
+  if (!buffer->have_positions && source->have_positions)
+    buffer->clear_positions ();
+
+  if (buffer->len + (end - start) < buffer->len) /* Overflows. */
+  {
+    buffer->successful = false;
+    return;
+  }
+
+  unsigned int orig_len = buffer->len;
+  hb_buffer_set_length (buffer, buffer->len + (end - start));
+  if (unlikely (!buffer->successful))
+    return;
+
+  memcpy (buffer->info + orig_len, source->info + start, (end - start) * sizeof (buffer->info[0]));
+  if (buffer->have_positions)
+    memcpy (buffer->pos + orig_len, source->pos + start, (end - start) * sizeof (buffer->pos[0]));
+}
+
+
+static int
+compare_info_codepoint (const hb_glyph_info_t *pa,
+			const hb_glyph_info_t *pb)
+{
+  return (int) pb->codepoint - (int) pa->codepoint;
+}
+
+static inline void
+normalize_glyphs_cluster (hb_buffer_t *buffer,
+			  unsigned int start,
+			  unsigned int end,
+			  bool backward)
+{
+  hb_glyph_position_t *pos = buffer->pos;
+
+  /* Total cluster advance */
+  hb_position_t total_x_advance = 0, total_y_advance = 0;
+  for (unsigned int i = start; i < end; i++)
+  {
+    total_x_advance += pos[i].x_advance;
+    total_y_advance += pos[i].y_advance;
+  }
+
+  hb_position_t x_advance = 0, y_advance = 0;
+  for (unsigned int i = start; i < end; i++)
+  {
+    pos[i].x_offset += x_advance;
+    pos[i].y_offset += y_advance;
+
+    x_advance += pos[i].x_advance;
+    y_advance += pos[i].y_advance;
+
+    pos[i].x_advance = 0;
+    pos[i].y_advance = 0;
+  }
+
+  if (backward)
+  {
+    /* Transfer all cluster advance to the last glyph. */
+    pos[end - 1].x_advance = total_x_advance;
+    pos[end - 1].y_advance = total_y_advance;
+
+    hb_stable_sort (buffer->info + start, end - start - 1, compare_info_codepoint, buffer->pos + start);
+  } else {
+    /* Transfer all cluster advance to the first glyph. */
+    pos[start].x_advance += total_x_advance;
+    pos[start].y_advance += total_y_advance;
+    for (unsigned int i = start + 1; i < end; i++) {
+      pos[i].x_offset -= total_x_advance;
+      pos[i].y_offset -= total_y_advance;
+    }
+    hb_stable_sort (buffer->info + start + 1, end - start - 1, compare_info_codepoint, buffer->pos + start + 1);
+  }
+}
+
+/**
+ * hb_buffer_normalize_glyphs:
+ * @buffer: an #hb_buffer_t.
+ *
+ * Reorders a glyph buffer to have canonical in-cluster glyph order / position.
+ * The resulting clusters should behave identical to pre-reordering clusters.
+ *
+ * <note>This has nothing to do with Unicode normalization.</note>
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_buffer_normalize_glyphs (hb_buffer_t *buffer)
+{
+  assert (buffer->have_positions);
+  assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS ||
+	  (!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID));
+
+  bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
+
+  unsigned int count = buffer->len;
+  if (unlikely (!count)) return;
+  hb_glyph_info_t *info = buffer->info;
+
+  unsigned int start = 0;
+  unsigned int end;
+  for (end = start + 1; end < count; end++)
+    if (info[start].cluster != info[end].cluster) {
+      normalize_glyphs_cluster (buffer, start, end, backward);
+      start = end;
+    }
+  normalize_glyphs_cluster (buffer, start, end, backward);
+}
+
+void
+hb_buffer_t::sort (unsigned int start, unsigned int end, int(*compar)(const hb_glyph_info_t *, const hb_glyph_info_t *))
+{
+  assert (!have_positions);
+  for (unsigned int i = start + 1; i < end; i++)
+  {
+    unsigned int j = i;
+    while (j > start && compar (&info[j - 1], &info[i]) > 0)
+      j--;
+    if (i == j)
+      continue;
+    /* Move item i to occupy place for item j, shift what's in between. */
+    merge_clusters (j, i + 1);
+    {
+      hb_glyph_info_t t = info[i];
+      memmove (&info[j + 1], &info[j], (i - j) * sizeof (hb_glyph_info_t));
+      info[j] = t;
+    }
+  }
+}
+
+
+/*
+ * Comparing buffers.
+ */
+
+/**
+ * hb_buffer_diff:
+ * @buffer: a buffer.
+ * @reference: other buffer to compare to.
+ * @dottedcircle_glyph: glyph id of U+25CC DOTTED CIRCLE, or (hb_codepont_t) -1.
+ * @position_fuzz: allowed absolute difference in position values.
+ *
+ * If dottedcircle_glyph is (hb_codepoint_t) -1 then %HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT
+ * and %HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT are never returned.  This should be used by most
+ * callers if just comparing two buffers is needed.
+ *
+ * Since: 1.5.0
+ **/
+hb_buffer_diff_flags_t
+hb_buffer_diff (hb_buffer_t *buffer,
+		hb_buffer_t *reference,
+		hb_codepoint_t dottedcircle_glyph,
+		unsigned int position_fuzz)
+{
+  if (buffer->content_type != reference->content_type && buffer->len && reference->len)
+    return HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH;
+
+  hb_buffer_diff_flags_t result = HB_BUFFER_DIFF_FLAG_EQUAL;
+  bool contains = dottedcircle_glyph != (hb_codepoint_t) -1;
+
+  unsigned int count = reference->len;
+
+  if (buffer->len != count)
+  {
+    /*
+     * we can't compare glyph-by-glyph, but we do want to know if there
+     * are .notdef or dottedcircle glyphs present in the reference buffer
+     */
+    const hb_glyph_info_t *info = reference->info;
+    unsigned int i;
+    for (i = 0; i < count; i++)
+    {
+      if (contains && info[i].codepoint == dottedcircle_glyph)
+        result |= HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT;
+      if (contains && info[i].codepoint == 0)
+        result |= HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT;
+    }
+    result |= HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH;
+    return hb_buffer_diff_flags_t (result);
+  }
+
+  if (!count)
+    return hb_buffer_diff_flags_t (result);
+
+  const hb_glyph_info_t *buf_info = buffer->info;
+  const hb_glyph_info_t *ref_info = reference->info;
+  for (unsigned int i = 0; i < count; i++)
+  {
+    if (buf_info->codepoint != ref_info->codepoint)
+      result |= HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH;
+    if (buf_info->cluster != ref_info->cluster)
+      result |= HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH;
+    if ((buf_info->mask & ~ref_info->mask & HB_GLYPH_FLAG_DEFINED))
+      result |= HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH;
+    if (contains && ref_info->codepoint == dottedcircle_glyph)
+      result |= HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT;
+    if (contains && ref_info->codepoint == 0)
+      result |= HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT;
+    buf_info++;
+    ref_info++;
+  }
+
+  if (buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS)
+  {
+    assert (buffer->have_positions);
+    const hb_glyph_position_t *buf_pos = buffer->pos;
+    const hb_glyph_position_t *ref_pos = reference->pos;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if ((unsigned int) abs (buf_pos->x_advance - ref_pos->x_advance) > position_fuzz ||
+          (unsigned int) abs (buf_pos->y_advance - ref_pos->y_advance) > position_fuzz ||
+          (unsigned int) abs (buf_pos->x_offset - ref_pos->x_offset) > position_fuzz ||
+          (unsigned int) abs (buf_pos->y_offset - ref_pos->y_offset) > position_fuzz)
+      {
+        result |= HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH;
+        break;
+      }
+      buf_pos++;
+      ref_pos++;
+    }
+  }
+
+  return result;
+}
+
+
+/*
+ * Debugging.
+ */
+
+/**
+ * hb_buffer_set_message_func:
+ * @buffer: an #hb_buffer_t.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.1.3
+ **/
+void
+hb_buffer_set_message_func (hb_buffer_t *buffer,
+			    hb_buffer_message_func_t func,
+			    void *user_data, hb_destroy_func_t destroy)
+{
+  if (buffer->message_destroy)
+    buffer->message_destroy (buffer->message_data);
+
+  if (func) {
+    buffer->message_func = func;
+    buffer->message_data = user_data;
+    buffer->message_destroy = destroy;
+  } else {
+    buffer->message_func = nullptr;
+    buffer->message_data = nullptr;
+    buffer->message_destroy = nullptr;
+  }
+}
+
+bool
+hb_buffer_t::message_impl (hb_font_t *font, const char *fmt, va_list ap)
+{
+  char buf[100];
+  vsnprintf (buf, sizeof (buf),  fmt, ap);
+  return (bool) this->message_func (this, font, buf, this->message_data);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer.h
new file mode 100644
index 0000000..f989d25
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer.h
@@ -0,0 +1,581 @@
+/*
+ * Copyright © 1998-2004  David Turner and Werner Lemberg
+ * Copyright © 2004,2007,2009  Red Hat, Inc.
+ * Copyright © 2011,2012  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.
+ *
+ * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_BUFFER_H
+#define HB_BUFFER_H
+
+#include "hb-common.h"
+#include "hb-unicode.h"
+#include "hb-font.h"
+
+HB_BEGIN_DECLS
+
+/**
+ * hb_glyph_info_t:
+ * @codepoint: either a Unicode code point (before shaping) or a glyph index
+ *             (after shaping).
+ * @cluster: the index of the character in the original text that corresponds
+ *           to this #hb_glyph_info_t, or whatever the client passes to
+ *           hb_buffer_add(). More than one #hb_glyph_info_t can have the same
+ *           @cluster value, if they resulted from the same character (e.g. one
+ *           to many glyph substitution), and when more than one character gets
+ *           merged in the same glyph (e.g. many to one glyph substitution) the
+ *           #hb_glyph_info_t will have the smallest cluster value of them.
+ *           By default some characters are merged into the same cluster
+ *           (e.g. combining marks have the same cluster as their bases)
+ *           even if they are separate glyphs, hb_buffer_set_cluster_level()
+ *           allow selecting more fine-grained cluster handling.
+ *
+ * The #hb_glyph_info_t is the structure that holds information about the
+ * glyphs and their relation to input text.
+ */
+typedef struct hb_glyph_info_t
+{
+  hb_codepoint_t codepoint;
+  /*< private >*/
+  hb_mask_t      mask;
+  /*< public >*/
+  uint32_t       cluster;
+
+  /*< private >*/
+  hb_var_int_t   var1;
+  hb_var_int_t   var2;
+} hb_glyph_info_t;
+
+/**
+ * hb_glyph_flags_t:
+ * @HB_GLYPH_FLAG_UNSAFE_TO_BREAK: Indicates that if input text is broken at the
+ * 				   beginning of the cluster this glyph is part of,
+ * 				   then both sides need to be re-shaped, as the
+ * 				   result might be different.  On the flip side,
+ * 				   it means that when this flag is not present,
+ * 				   then it's safe to break the glyph-run at the
+ * 				   beginning of this cluster, and the two sides
+ * 				   represent the exact same result one would get
+ * 				   if breaking input text at the beginning of
+ * 				   this cluster and shaping the two sides
+ * 				   separately.  This can be used to optimize
+ * 				   paragraph layout, by avoiding re-shaping
+ * 				   of each line after line-breaking, or limiting
+ * 				   the reshaping to a small piece around the
+ * 				   breaking point only.
+ * @HB_GLYPH_FLAG_DEFINED: All the currently defined flags.
+ *
+ * Since: 1.5.0
+ */
+typedef enum { /*< flags >*/
+  HB_GLYPH_FLAG_UNSAFE_TO_BREAK		= 0x00000001,
+
+  HB_GLYPH_FLAG_DEFINED			= 0x00000001 /* OR of all defined flags */
+} hb_glyph_flags_t;
+
+HB_EXTERN hb_glyph_flags_t
+hb_glyph_info_get_glyph_flags (const hb_glyph_info_t *info);
+
+#define hb_glyph_info_get_glyph_flags(info) \
+	((hb_glyph_flags_t) ((unsigned int) (info)->mask & HB_GLYPH_FLAG_DEFINED))
+
+
+/**
+ * hb_glyph_position_t:
+ * @x_advance: how much the line advances after drawing this glyph when setting
+ *             text in horizontal direction.
+ * @y_advance: how much the line advances after drawing this glyph when setting
+ *             text in vertical direction.
+ * @x_offset: how much the glyph moves on the X-axis before drawing it, this
+ *            should not affect how much the line advances.
+ * @y_offset: how much the glyph moves on the Y-axis before drawing it, this
+ *            should not affect how much the line advances.
+ *
+ * The #hb_glyph_position_t is the structure that holds the positions of the
+ * glyph in both horizontal and vertical directions. All positions in
+ * #hb_glyph_position_t are relative to the current point.
+ *
+ */
+typedef struct hb_glyph_position_t {
+  hb_position_t  x_advance;
+  hb_position_t  y_advance;
+  hb_position_t  x_offset;
+  hb_position_t  y_offset;
+
+  /*< private >*/
+  hb_var_int_t   var;
+} hb_glyph_position_t;
+
+/**
+ * hb_segment_properties_t:
+ * @direction: the #hb_direction_t of the buffer, see hb_buffer_set_direction().
+ * @script: the #hb_script_t of the buffer, see hb_buffer_set_script().
+ * @language: the #hb_language_t of the buffer, see hb_buffer_set_language().
+ *
+ * The structure that holds various text properties of an #hb_buffer_t. Can be
+ * set and retrieved using hb_buffer_set_segment_properties() and
+ * hb_buffer_get_segment_properties(), respectively.
+ */
+typedef struct hb_segment_properties_t {
+  hb_direction_t  direction;
+  hb_script_t     script;
+  hb_language_t   language;
+  /*< private >*/
+  void           *reserved1;
+  void           *reserved2;
+} hb_segment_properties_t;
+
+#define HB_SEGMENT_PROPERTIES_DEFAULT {HB_DIRECTION_INVALID, \
+				       HB_SCRIPT_INVALID, \
+				       HB_LANGUAGE_INVALID, \
+				       (void *) 0, \
+				       (void *) 0}
+
+HB_EXTERN hb_bool_t
+hb_segment_properties_equal (const hb_segment_properties_t *a,
+			     const hb_segment_properties_t *b);
+
+HB_EXTERN unsigned int
+hb_segment_properties_hash (const hb_segment_properties_t *p);
+
+
+
+/**
+ * hb_buffer_t:
+ *
+ * The main structure holding the input text and its properties before shaping,
+ * and output glyphs and their information after shaping.
+ */
+
+typedef struct hb_buffer_t hb_buffer_t;
+
+HB_EXTERN hb_buffer_t *
+hb_buffer_create (void);
+
+HB_EXTERN hb_buffer_t *
+hb_buffer_get_empty (void);
+
+HB_EXTERN hb_buffer_t *
+hb_buffer_reference (hb_buffer_t *buffer);
+
+HB_EXTERN void
+hb_buffer_destroy (hb_buffer_t *buffer);
+
+HB_EXTERN hb_bool_t
+hb_buffer_set_user_data (hb_buffer_t        *buffer,
+			 hb_user_data_key_t *key,
+			 void *              data,
+			 hb_destroy_func_t   destroy,
+			 hb_bool_t           replace);
+
+HB_EXTERN void *
+hb_buffer_get_user_data (hb_buffer_t        *buffer,
+			 hb_user_data_key_t *key);
+
+
+/**
+ * hb_buffer_content_type_t:
+ * @HB_BUFFER_CONTENT_TYPE_INVALID: Initial value for new buffer.
+ * @HB_BUFFER_CONTENT_TYPE_UNICODE: The buffer contains input characters (before shaping).
+ * @HB_BUFFER_CONTENT_TYPE_GLYPHS: The buffer contains output glyphs (after shaping).
+ */
+typedef enum {
+  HB_BUFFER_CONTENT_TYPE_INVALID = 0,
+  HB_BUFFER_CONTENT_TYPE_UNICODE,
+  HB_BUFFER_CONTENT_TYPE_GLYPHS
+} hb_buffer_content_type_t;
+
+HB_EXTERN void
+hb_buffer_set_content_type (hb_buffer_t              *buffer,
+			    hb_buffer_content_type_t  content_type);
+
+HB_EXTERN hb_buffer_content_type_t
+hb_buffer_get_content_type (hb_buffer_t *buffer);
+
+
+HB_EXTERN void
+hb_buffer_set_unicode_funcs (hb_buffer_t        *buffer,
+			     hb_unicode_funcs_t *unicode_funcs);
+
+HB_EXTERN hb_unicode_funcs_t *
+hb_buffer_get_unicode_funcs (hb_buffer_t        *buffer);
+
+HB_EXTERN void
+hb_buffer_set_direction (hb_buffer_t    *buffer,
+			 hb_direction_t  direction);
+
+HB_EXTERN hb_direction_t
+hb_buffer_get_direction (hb_buffer_t *buffer);
+
+HB_EXTERN void
+hb_buffer_set_script (hb_buffer_t *buffer,
+		      hb_script_t  script);
+
+HB_EXTERN hb_script_t
+hb_buffer_get_script (hb_buffer_t *buffer);
+
+HB_EXTERN void
+hb_buffer_set_language (hb_buffer_t   *buffer,
+			hb_language_t  language);
+
+
+HB_EXTERN hb_language_t
+hb_buffer_get_language (hb_buffer_t *buffer);
+
+HB_EXTERN void
+hb_buffer_set_segment_properties (hb_buffer_t *buffer,
+				  const hb_segment_properties_t *props);
+
+HB_EXTERN void
+hb_buffer_get_segment_properties (hb_buffer_t *buffer,
+				  hb_segment_properties_t *props);
+
+HB_EXTERN void
+hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
+
+
+/**
+ * hb_buffer_flags_t:
+ * @HB_BUFFER_FLAG_DEFAULT: the default buffer flag.
+ * @HB_BUFFER_FLAG_BOT: flag indicating that special handling of the beginning
+ *                      of text paragraph can be applied to this buffer. Should usually
+ *                      be set, unless you are passing to the buffer only part
+ *                      of the text without the full context.
+ * @HB_BUFFER_FLAG_EOT: flag indicating that special handling of the end of text
+ *                      paragraph can be applied to this buffer, similar to
+ *                      @HB_BUFFER_FLAG_BOT.
+ * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES:
+ *                      flag indication that character with Default_Ignorable
+ *                      Unicode property should use the corresponding glyph
+ *                      from the font, instead of hiding them (done by
+ *                      replacing them with the space glyph and zeroing the
+ *                      advance width.)  This flag takes precedence over
+ *                      @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES.
+ * @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES:
+ *                      flag indication that character with Default_Ignorable
+ *                      Unicode property should be removed from glyph string
+ *                      instead of hiding them (done by replacing them with the
+ *                      space glyph and zeroing the advance width.)
+ *                      @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES takes
+ *                      precedence over this flag. Since: 1.8.0
+ *
+ * Since: 0.9.20
+ */
+typedef enum { /*< flags >*/
+  HB_BUFFER_FLAG_DEFAULT			= 0x00000000u,
+  HB_BUFFER_FLAG_BOT				= 0x00000001u, /* Beginning-of-text */
+  HB_BUFFER_FLAG_EOT				= 0x00000002u, /* End-of-text */
+  HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES	= 0x00000004u,
+  HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES	= 0x00000008u
+} hb_buffer_flags_t;
+
+HB_EXTERN void
+hb_buffer_set_flags (hb_buffer_t       *buffer,
+		     hb_buffer_flags_t  flags);
+
+HB_EXTERN hb_buffer_flags_t
+hb_buffer_get_flags (hb_buffer_t *buffer);
+
+/**
+ * hb_buffer_cluster_level_t:
+ * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES: Return cluster values grouped by graphemes into
+ *   monotone order.
+ * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS: Return cluster values grouped into monotone order.
+ * @HB_BUFFER_CLUSTER_LEVEL_CHARACTERS: Don't group cluster values.
+ * @HB_BUFFER_CLUSTER_LEVEL_DEFAULT: Default cluster level,
+ *   equal to @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES.
+ *
+ * Since: 0.9.42
+ */
+typedef enum {
+  HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES	= 0,
+  HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS	= 1,
+  HB_BUFFER_CLUSTER_LEVEL_CHARACTERS		= 2,
+  HB_BUFFER_CLUSTER_LEVEL_DEFAULT = HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES
+} hb_buffer_cluster_level_t;
+
+HB_EXTERN void
+hb_buffer_set_cluster_level (hb_buffer_t               *buffer,
+			     hb_buffer_cluster_level_t  cluster_level);
+
+HB_EXTERN hb_buffer_cluster_level_t
+hb_buffer_get_cluster_level (hb_buffer_t *buffer);
+
+/**
+ * HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT:
+ *
+ * The default code point for replacing invalid characters in a given encoding.
+ * Set to U+FFFD REPLACEMENT CHARACTER.
+ *
+ * Since: 0.9.31
+ */
+#define HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT 0xFFFDu
+
+HB_EXTERN void
+hb_buffer_set_replacement_codepoint (hb_buffer_t    *buffer,
+				     hb_codepoint_t  replacement);
+
+HB_EXTERN hb_codepoint_t
+hb_buffer_get_replacement_codepoint (hb_buffer_t    *buffer);
+
+HB_EXTERN void
+hb_buffer_set_invisible_glyph (hb_buffer_t    *buffer,
+			       hb_codepoint_t  invisible);
+
+HB_EXTERN hb_codepoint_t
+hb_buffer_get_invisible_glyph (hb_buffer_t    *buffer);
+
+
+HB_EXTERN void
+hb_buffer_reset (hb_buffer_t *buffer);
+
+HB_EXTERN void
+hb_buffer_clear_contents (hb_buffer_t *buffer);
+
+HB_EXTERN hb_bool_t
+hb_buffer_pre_allocate (hb_buffer_t  *buffer,
+		        unsigned int  size);
+
+
+HB_EXTERN hb_bool_t
+hb_buffer_allocation_successful (hb_buffer_t  *buffer);
+
+HB_EXTERN void
+hb_buffer_reverse (hb_buffer_t *buffer);
+
+HB_EXTERN void
+hb_buffer_reverse_range (hb_buffer_t *buffer,
+			 unsigned int start, unsigned int end);
+
+HB_EXTERN void
+hb_buffer_reverse_clusters (hb_buffer_t *buffer);
+
+
+/* Filling the buffer in */
+
+HB_EXTERN void
+hb_buffer_add (hb_buffer_t    *buffer,
+	       hb_codepoint_t  codepoint,
+	       unsigned int    cluster);
+
+HB_EXTERN void
+hb_buffer_add_utf8 (hb_buffer_t  *buffer,
+		    const char   *text,
+		    int           text_length,
+		    unsigned int  item_offset,
+		    int           item_length);
+
+HB_EXTERN void
+hb_buffer_add_utf16 (hb_buffer_t    *buffer,
+		     const uint16_t *text,
+		     int             text_length,
+		     unsigned int    item_offset,
+		     int             item_length);
+
+HB_EXTERN void
+hb_buffer_add_utf32 (hb_buffer_t    *buffer,
+		     const uint32_t *text,
+		     int             text_length,
+		     unsigned int    item_offset,
+		     int             item_length);
+
+HB_EXTERN void
+hb_buffer_add_latin1 (hb_buffer_t   *buffer,
+		      const uint8_t *text,
+		      int            text_length,
+		      unsigned int   item_offset,
+		      int            item_length);
+
+HB_EXTERN void
+hb_buffer_add_codepoints (hb_buffer_t          *buffer,
+			  const hb_codepoint_t *text,
+			  int                   text_length,
+			  unsigned int          item_offset,
+			  int                   item_length);
+
+HB_EXTERN void
+hb_buffer_append (hb_buffer_t *buffer,
+		  hb_buffer_t *source,
+		  unsigned int start,
+		  unsigned int end);
+
+HB_EXTERN hb_bool_t
+hb_buffer_set_length (hb_buffer_t  *buffer,
+		      unsigned int  length);
+
+HB_EXTERN unsigned int
+hb_buffer_get_length (hb_buffer_t *buffer);
+
+/* Getting glyphs out of the buffer */
+
+HB_EXTERN hb_glyph_info_t *
+hb_buffer_get_glyph_infos (hb_buffer_t  *buffer,
+                           unsigned int *length);
+
+HB_EXTERN hb_glyph_position_t *
+hb_buffer_get_glyph_positions (hb_buffer_t  *buffer,
+                               unsigned int *length);
+
+
+HB_EXTERN void
+hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
+
+
+/*
+ * Serialize
+ */
+
+/**
+ * hb_buffer_serialize_flags_t:
+ * @HB_BUFFER_SERIALIZE_FLAG_DEFAULT: serialize glyph names, clusters and positions.
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS: do not serialize glyph cluster.
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information.
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name.
+ * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents.
+ * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS: serialize glyph flags. Since: 1.5.0
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES: do not serialize glyph advances,
+ *  glyph offsets will reflect absolute glyph positions. Since: 1.8.0
+ *
+ * Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().
+ *
+ * Since: 0.9.20
+ */
+typedef enum { /*< flags >*/
+  HB_BUFFER_SERIALIZE_FLAG_DEFAULT		= 0x00000000u,
+  HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS		= 0x00000001u,
+  HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS		= 0x00000002u,
+  HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES	= 0x00000004u,
+  HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS	= 0x00000008u,
+  HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS		= 0x00000010u,
+  HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES		= 0x00000020u
+} hb_buffer_serialize_flags_t;
+
+/**
+ * hb_buffer_serialize_format_t:
+ * @HB_BUFFER_SERIALIZE_FORMAT_TEXT: a human-readable, plain text format.
+ * @HB_BUFFER_SERIALIZE_FORMAT_JSON: a machine-readable JSON format.
+ * @HB_BUFFER_SERIALIZE_FORMAT_INVALID: invalid format.
+ *
+ * The buffer serialization and de-serialization format used in
+ * hb_buffer_serialize_glyphs() and hb_buffer_deserialize_glyphs().
+ *
+ * Since: 0.9.2
+ */
+typedef enum {
+  HB_BUFFER_SERIALIZE_FORMAT_TEXT	= HB_TAG('T','E','X','T'),
+  HB_BUFFER_SERIALIZE_FORMAT_JSON	= HB_TAG('J','S','O','N'),
+  HB_BUFFER_SERIALIZE_FORMAT_INVALID	= HB_TAG_NONE
+} hb_buffer_serialize_format_t;
+
+HB_EXTERN hb_buffer_serialize_format_t
+hb_buffer_serialize_format_from_string (const char *str, int len);
+
+HB_EXTERN const char *
+hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format);
+
+HB_EXTERN const char **
+hb_buffer_serialize_list_formats (void);
+
+HB_EXTERN unsigned int
+hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
+			    unsigned int start,
+			    unsigned int end,
+			    char *buf,
+			    unsigned int buf_size,
+			    unsigned int *buf_consumed,
+			    hb_font_t *font,
+			    hb_buffer_serialize_format_t format,
+			    hb_buffer_serialize_flags_t flags);
+
+HB_EXTERN hb_bool_t
+hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
+			      const char *buf,
+			      int buf_len,
+			      const char **end_ptr,
+			      hb_font_t *font,
+			      hb_buffer_serialize_format_t format);
+
+
+/*
+ * Compare buffers
+ */
+
+typedef enum { /*< flags >*/
+  HB_BUFFER_DIFF_FLAG_EQUAL			= 0x0000,
+
+  /* Buffers with different content_type cannot be meaningfully compared
+   * in any further detail. */
+  HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH	= 0x0001,
+
+  /* For buffers with differing length, the per-glyph comparison is not
+   * attempted, though we do still scan reference for dottedcircle / .notdef
+   * glyphs. */
+  HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH		= 0x0002,
+
+  /* We want to know if dottedcircle / .notdef glyphs are present in the
+   * reference, as we may not care so much about other differences in this
+   * case. */
+  HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT		= 0x0004,
+  HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT	= 0x0008,
+
+  /* If the buffers have the same length, we compare them glyph-by-glyph
+   * and report which aspect(s) of the glyph info/position are different. */
+  HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH	= 0x0010,
+  HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH		= 0x0020,
+  HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH	= 0x0040,
+  HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH		= 0x0080
+
+} hb_buffer_diff_flags_t;
+
+/* Compare the contents of two buffers, report types of differences. */
+HB_EXTERN hb_buffer_diff_flags_t
+hb_buffer_diff (hb_buffer_t *buffer,
+		hb_buffer_t *reference,
+		hb_codepoint_t dottedcircle_glyph,
+		unsigned int position_fuzz);
+
+
+/*
+ * Debugging.
+ */
+
+typedef hb_bool_t	(*hb_buffer_message_func_t)	(hb_buffer_t *buffer,
+							 hb_font_t   *font,
+							 const char  *message,
+							 void        *user_data);
+
+HB_EXTERN void
+hb_buffer_set_message_func (hb_buffer_t *buffer,
+			    hb_buffer_message_func_t func,
+			    void *user_data, hb_destroy_func_t destroy);
+
+
+HB_END_DECLS
+
+#endif /* HB_BUFFER_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer.hh
new file mode 100644
index 0000000..330f88ba
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-buffer.hh
@@ -0,0 +1,439 @@
+/*
+ * Copyright © 1998-2004  David Turner and Werner Lemberg
+ * Copyright © 2004,2007,2009,2010  Red Hat, Inc.
+ * Copyright © 2011,2012  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.
+ *
+ * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_BUFFER_HH
+#define HB_BUFFER_HH
+
+#include "hb.hh"
+#include "hb-unicode.hh"
+
+
+#ifndef HB_BUFFER_MAX_LEN_FACTOR
+#define HB_BUFFER_MAX_LEN_FACTOR 32
+#endif
+#ifndef HB_BUFFER_MAX_LEN_MIN
+#define HB_BUFFER_MAX_LEN_MIN 8192
+#endif
+#ifndef HB_BUFFER_MAX_LEN_DEFAULT
+#define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
+#endif
+
+#ifndef HB_BUFFER_MAX_OPS_FACTOR
+#define HB_BUFFER_MAX_OPS_FACTOR 64
+#endif
+#ifndef HB_BUFFER_MAX_OPS_MIN
+#define HB_BUFFER_MAX_OPS_MIN 1024
+#endif
+#ifndef HB_BUFFER_MAX_OPS_DEFAULT
+#define HB_BUFFER_MAX_OPS_DEFAULT 0x1FFFFFFF /* Shaping more than a billion operations? Let us know! */
+#endif
+
+static_assert ((sizeof (hb_glyph_info_t) == 20), "");
+static_assert ((sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t)), "");
+
+HB_MARK_AS_FLAG_T (hb_buffer_flags_t);
+HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t);
+HB_MARK_AS_FLAG_T (hb_buffer_diff_flags_t);
+
+enum hb_buffer_scratch_flags_t {
+  HB_BUFFER_SCRATCH_FLAG_DEFAULT			= 0x00000000u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII			= 0x00000001u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES		= 0x00000002u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK		= 0x00000004u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT		= 0x00000008u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK		= 0x00000010u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_CGJ			= 0x00000020u,
+
+  /* Reserved for complex shapers' internal use. */
+  HB_BUFFER_SCRATCH_FLAG_COMPLEX0			= 0x01000000u,
+  HB_BUFFER_SCRATCH_FLAG_COMPLEX1			= 0x02000000u,
+  HB_BUFFER_SCRATCH_FLAG_COMPLEX2			= 0x04000000u,
+  HB_BUFFER_SCRATCH_FLAG_COMPLEX3			= 0x08000000u,
+};
+HB_MARK_AS_FLAG_T (hb_buffer_scratch_flags_t);
+
+
+/*
+ * hb_buffer_t
+ */
+
+struct hb_buffer_t
+{
+  hb_object_header_t header;
+
+  /* Information about how the text in the buffer should be treated */
+  hb_unicode_funcs_t *unicode; /* Unicode functions */
+  hb_buffer_flags_t flags; /* BOT / EOT / etc. */
+  hb_buffer_cluster_level_t cluster_level;
+  hb_codepoint_t replacement; /* U+FFFD or something else. */
+  hb_codepoint_t invisible; /* 0 or something else. */
+  hb_buffer_scratch_flags_t scratch_flags; /* Have space-fallback, etc. */
+  unsigned int max_len; /* Maximum allowed len. */
+  int max_ops; /* Maximum allowed operations. */
+
+  /* Buffer contents */
+  hb_buffer_content_type_t content_type;
+  hb_segment_properties_t props; /* Script, language, direction */
+
+  bool successful; /* Allocations successful */
+  bool have_output; /* Whether we have an output buffer going on */
+  bool have_positions; /* Whether we have positions */
+
+  unsigned int idx; /* Cursor into ->info and ->pos arrays */
+  unsigned int len; /* Length of ->info and ->pos arrays */
+  unsigned int out_len; /* Length of ->out array if have_output */
+
+  unsigned int allocated; /* Length of allocated arrays */
+  hb_glyph_info_t     *info;
+  hb_glyph_info_t     *out_info;
+  hb_glyph_position_t *pos;
+
+  unsigned int serial;
+
+  /* Text before / after the main buffer contents.
+   * Always in Unicode, and ordered outward.
+   * Index 0 is for "pre-context", 1 for "post-context". */
+  static constexpr unsigned CONTEXT_LENGTH = 5u;
+  hb_codepoint_t context[2][CONTEXT_LENGTH];
+  unsigned int context_len[2];
+
+  /* Debugging API */
+  hb_buffer_message_func_t message_func;
+  void *message_data;
+  hb_destroy_func_t message_destroy;
+
+  /* Internal debugging. */
+  /* The bits here reflect current allocations of the bytes in glyph_info_t's var1 and var2. */
+#ifndef HB_NDEBUG
+  uint8_t allocated_var_bits;
+#endif
+
+
+  /* Methods */
+
+  bool in_error () const { return !successful; }
+
+  void allocate_var (unsigned int start, unsigned int count)
+  {
+#ifndef HB_NDEBUG
+    unsigned int end = start + count;
+    assert (end <= 8);
+    unsigned int bits = (1u<<end) - (1u<<start);
+    assert (0 == (allocated_var_bits & bits));
+    allocated_var_bits |= bits;
+#endif
+  }
+  void deallocate_var (unsigned int start, unsigned int count)
+  {
+#ifndef HB_NDEBUG
+    unsigned int end = start + count;
+    assert (end <= 8);
+    unsigned int bits = (1u<<end) - (1u<<start);
+    assert (bits == (allocated_var_bits & bits));
+    allocated_var_bits &= ~bits;
+#endif
+  }
+  void assert_var (unsigned int start, unsigned int count)
+  {
+#ifndef HB_NDEBUG
+    unsigned int end = start + count;
+    assert (end <= 8);
+    unsigned int bits = (1u<<end) - (1u<<start);
+    assert (bits == (allocated_var_bits & bits));
+#endif
+  }
+  void deallocate_var_all ()
+  {
+#ifndef HB_NDEBUG
+    allocated_var_bits = 0;
+#endif
+  }
+
+  hb_glyph_info_t &cur (unsigned int i = 0) { return info[idx + i]; }
+  hb_glyph_info_t cur (unsigned int i = 0) const { return info[idx + i]; }
+
+  hb_glyph_position_t &cur_pos (unsigned int i = 0) { return pos[idx + i]; }
+  hb_glyph_position_t cur_pos (unsigned int i = 0) const { return pos[idx + i]; }
+
+  hb_glyph_info_t &prev ()      { return out_info[out_len ? out_len - 1 : 0]; }
+  hb_glyph_info_t prev () const { return out_info[out_len ? out_len - 1 : 0]; }
+
+  bool has_separate_output () const { return info != out_info; }
+
+
+  HB_INTERNAL void reset ();
+  HB_INTERNAL void clear ();
+
+  unsigned int backtrack_len () const { return have_output? out_len : idx; }
+  unsigned int lookahead_len () const { return len - idx; }
+  unsigned int next_serial () { return serial++; }
+
+  HB_INTERNAL void add (hb_codepoint_t  codepoint,
+			unsigned int    cluster);
+  HB_INTERNAL void add_info (const hb_glyph_info_t &glyph_info);
+
+  HB_INTERNAL void reverse_range (unsigned int start, unsigned int end);
+  HB_INTERNAL void reverse ();
+  HB_INTERNAL void reverse_clusters ();
+  HB_INTERNAL void guess_segment_properties ();
+
+  HB_INTERNAL void swap_buffers ();
+  HB_INTERNAL void remove_output ();
+  HB_INTERNAL void clear_output ();
+  HB_INTERNAL void clear_positions ();
+
+  HB_INTERNAL void replace_glyphs (unsigned int num_in,
+				   unsigned int num_out,
+				   const hb_codepoint_t *glyph_data);
+
+  void replace_glyph (hb_codepoint_t glyph_index)
+  {
+    if (unlikely (out_info != info || out_len != idx)) {
+      if (unlikely (!make_room_for (1, 1))) return;
+      out_info[out_len] = info[idx];
+    }
+    out_info[out_len].codepoint = glyph_index;
+
+    idx++;
+    out_len++;
+  }
+  /* Makes a copy of the glyph at idx to output and replace glyph_index */
+  hb_glyph_info_t & output_glyph (hb_codepoint_t glyph_index)
+  {
+    if (unlikely (!make_room_for (0, 1))) return Crap(hb_glyph_info_t);
+
+    if (unlikely (idx == len && !out_len))
+      return Crap(hb_glyph_info_t);
+
+    out_info[out_len] = idx < len ? info[idx] : out_info[out_len - 1];
+    out_info[out_len].codepoint = glyph_index;
+
+    out_len++;
+
+    return out_info[out_len - 1];
+  }
+  void output_info (const hb_glyph_info_t &glyph_info)
+  {
+    if (unlikely (!make_room_for (0, 1))) return;
+
+    out_info[out_len] = glyph_info;
+
+    out_len++;
+  }
+  /* Copies glyph at idx to output but doesn't advance idx */
+  void copy_glyph ()
+  {
+    if (unlikely (!make_room_for (0, 1))) return;
+
+    out_info[out_len] = info[idx];
+
+    out_len++;
+  }
+  /* Copies glyph at idx to output and advance idx.
+   * If there's no output, just advance idx. */
+  void
+  next_glyph ()
+  {
+    if (have_output)
+    {
+      if (out_info != info || out_len != idx)
+      {
+	if (unlikely (!make_room_for (1, 1))) return;
+	out_info[out_len] = info[idx];
+      }
+      out_len++;
+    }
+
+    idx++;
+  }
+  /* Copies n glyphs at idx to output and advance idx.
+   * If there's no output, just advance idx. */
+  void
+  next_glyphs (unsigned int n)
+  {
+    if (have_output)
+    {
+      if (out_info != info || out_len != idx)
+      {
+	if (unlikely (!make_room_for (n, n))) return;
+	memmove (out_info + out_len, info + idx, n * sizeof (out_info[0]));
+      }
+      out_len += n;
+    }
+
+    idx += n;
+  }
+  /* Advance idx without copying to output. */
+  void skip_glyph () { idx++; }
+  void reset_masks (hb_mask_t mask)
+  {
+    for (unsigned int j = 0; j < len; j++)
+      info[j].mask = mask;
+  }
+  void add_masks (hb_mask_t mask)
+  {
+    for (unsigned int j = 0; j < len; j++)
+      info[j].mask |= mask;
+  }
+  HB_INTERNAL void set_masks (hb_mask_t value, hb_mask_t mask,
+			      unsigned int cluster_start, unsigned int cluster_end);
+
+  void merge_clusters (unsigned int start, unsigned int end)
+  {
+    if (end - start < 2)
+      return;
+    merge_clusters_impl (start, end);
+  }
+  HB_INTERNAL void merge_clusters_impl (unsigned int start, unsigned int end);
+  HB_INTERNAL void merge_out_clusters (unsigned int start, unsigned int end);
+  /* Merge clusters for deleting current glyph, and skip it. */
+  HB_INTERNAL void delete_glyph ();
+
+  void unsafe_to_break (unsigned int start,
+			       unsigned int end)
+  {
+    if (end - start < 2)
+      return;
+    unsafe_to_break_impl (start, end);
+  }
+  HB_INTERNAL void unsafe_to_break_impl (unsigned int start, unsigned int end);
+  HB_INTERNAL void unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end);
+
+
+  /* Internal methods */
+  HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */
+
+  HB_INTERNAL bool enlarge (unsigned int size);
+
+  bool ensure (unsigned int size)
+  { return likely (!size || size < allocated) ? true : enlarge (size); }
+
+  bool ensure_inplace (unsigned int size)
+  { return likely (!size || size < allocated); }
+
+  HB_INTERNAL bool make_room_for (unsigned int num_in, unsigned int num_out);
+  HB_INTERNAL bool shift_forward (unsigned int count);
+
+  typedef long scratch_buffer_t;
+  HB_INTERNAL scratch_buffer_t *get_scratch_buffer (unsigned int *size);
+
+  void clear_context (unsigned int side) { context_len[side] = 0; }
+
+  HB_INTERNAL void sort (unsigned int start, unsigned int end, int(*compar)(const hb_glyph_info_t *, const hb_glyph_info_t *));
+
+  bool messaging () { return unlikely (message_func); }
+  bool message (hb_font_t *font, const char *fmt, ...) HB_PRINTF_FUNC(3, 4)
+  {
+    if (!messaging ())
+      return true;
+    va_list ap;
+    va_start (ap, fmt);
+    bool ret = message_impl (font, fmt, ap);
+    va_end (ap);
+    return ret;
+  }
+  HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0);
+
+  static void
+  set_cluster (hb_glyph_info_t &inf, unsigned int cluster, unsigned int mask = 0)
+  {
+    if (inf.cluster != cluster)
+    {
+      if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
+	inf.mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+      else
+	inf.mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+    }
+    inf.cluster = cluster;
+  }
+
+  int
+  _unsafe_to_break_find_min_cluster (const hb_glyph_info_t *infos,
+				     unsigned int start, unsigned int end,
+				     unsigned int cluster) const
+  {
+    for (unsigned int i = start; i < end; i++)
+      cluster = MIN<unsigned int> (cluster, infos[i].cluster);
+    return cluster;
+  }
+  void
+  _unsafe_to_break_set_mask (hb_glyph_info_t *infos,
+			     unsigned int start, unsigned int end,
+			     unsigned int cluster)
+  {
+    for (unsigned int i = start; i < end; i++)
+      if (cluster != infos[i].cluster)
+      {
+	scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK;
+	infos[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+      }
+  }
+
+  void unsafe_to_break_all ()
+  { unsafe_to_break_impl (0, len); }
+  void safe_to_break_all ()
+  {
+    for (unsigned int i = 0; i < len; i++)
+      info[i].mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+  }
+};
+DECLARE_NULL_INSTANCE (hb_buffer_t);
+
+
+/* Loop over clusters. Duplicated in foreach_syllable(). */
+#define foreach_cluster(buffer, start, end) \
+  for (unsigned int \
+       _count = buffer->len, \
+       start = 0, end = _count ? _next_cluster (buffer, 0) : 0; \
+       start < _count; \
+       start = end, end = _next_cluster (buffer, start))
+
+static inline unsigned int
+_next_cluster (hb_buffer_t *buffer, unsigned int start)
+{
+  hb_glyph_info_t *info = buffer->info;
+  unsigned int count = buffer->len;
+
+  unsigned int cluster = info[start].cluster;
+  while (++start < count && cluster == info[start].cluster)
+    ;
+
+  return start;
+}
+
+
+#define HB_BUFFER_XALLOCATE_VAR(b, func, var) \
+  b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
+	   sizeof (b->info[0].var))
+#define HB_BUFFER_ALLOCATE_VAR(b, var)		HB_BUFFER_XALLOCATE_VAR (b, allocate_var,   var ())
+#define HB_BUFFER_DEALLOCATE_VAR(b, var)	HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var ())
+#define HB_BUFFER_ASSERT_VAR(b, var)		HB_BUFFER_XALLOCATE_VAR (b, assert_var,     var ())
+
+
+#endif /* HB_BUFFER_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cache.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cache.hh
new file mode 100644
index 0000000..bf26d96
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cache.hh
@@ -0,0 +1,80 @@
+/*
+ * Copyright © 2012  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_CACHE_HH
+#define HB_CACHE_HH
+
+#include "hb.hh"
+
+
+/* Implements a lock-free cache for int->int functions. */
+
+template <unsigned int key_bits, unsigned int value_bits, unsigned int cache_bits>
+struct hb_cache_t
+{
+  static_assert ((key_bits >= cache_bits), "");
+  static_assert ((key_bits + value_bits - cache_bits <= 8 * sizeof (hb_atomic_int_t)), "");
+  static_assert (sizeof (hb_atomic_int_t) == sizeof (unsigned int), "");
+
+  void init () { clear (); }
+  void fini () {}
+
+  void clear ()
+  {
+    for (unsigned i = 0; i < ARRAY_LENGTH (values); i++)
+      values[i].set_relaxed (-1);
+  }
+
+  bool get (unsigned int key, unsigned int *value) const
+  {
+    unsigned int k = key & ((1u<<cache_bits)-1);
+    unsigned int v = values[k].get_relaxed ();
+    if ((key_bits + value_bits - cache_bits == 8 * sizeof (hb_atomic_int_t) && v == (unsigned int) -1) ||
+	(v >> value_bits) != (key >> cache_bits))
+      return false;
+    *value = v & ((1u<<value_bits)-1);
+    return true;
+  }
+
+  bool set (unsigned int key, unsigned int value)
+  {
+    if (unlikely ((key >> key_bits) || (value >> value_bits)))
+      return false; /* Overflows */
+    unsigned int k = key & ((1u<<cache_bits)-1);
+    unsigned int v = ((key>>cache_bits)<<value_bits) | value;
+    values[k].set_relaxed (v);
+    return true;
+  }
+
+  private:
+  hb_atomic_int_t 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_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff-interp-common.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff-interp-common.hh
new file mode 100644
index 0000000..72e9e06
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff-interp-common.hh
@@ -0,0 +1,725 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+#ifndef HB_CFF_INTERP_COMMON_HH
+#define HB_CFF_INTERP_COMMON_HH
+
+namespace CFF {
+
+using namespace OT;
+
+typedef unsigned int op_code_t;
+
+
+/* === Dict operators === */
+
+/* One byte operators (0-31) */
+#define OpCode_version		  0 /* CFF Top */
+#define OpCode_Notice		  1 /* CFF Top */
+#define OpCode_FullName		  2 /* CFF Top */
+#define OpCode_FamilyName	  3 /* CFF Top */
+#define OpCode_Weight		  4 /* CFF Top */
+#define OpCode_FontBBox		  5 /* CFF Top */
+#define OpCode_BlueValues	  6 /* CFF Private, CFF2 Private */
+#define OpCode_OtherBlues	  7 /* CFF Private, CFF2 Private */
+#define OpCode_FamilyBlues	  8 /* CFF Private, CFF2 Private */
+#define OpCode_FamilyOtherBlues	  9 /* CFF Private, CFF2 Private */
+#define OpCode_StdHW		 10 /* CFF Private, CFF2 Private */
+#define OpCode_StdVW		 11 /* CFF Private, CFF2 Private */
+#define OpCode_escape		 12 /* All. Shared with CS */
+#define OpCode_UniqueID		 13 /* CFF Top */
+#define OpCode_XUID		 14 /* CFF Top */
+#define OpCode_charset		 15 /* CFF Top (0) */
+#define OpCode_Encoding		 16 /* CFF Top (0) */
+#define OpCode_CharStrings	 17 /* CFF Top, CFF2 Top */
+#define OpCode_Private		 18 /* CFF Top, CFF2 FD */
+#define OpCode_Subrs		 19 /* CFF Private, CFF2 Private */
+#define OpCode_defaultWidthX	 20 /* CFF Private (0) */
+#define OpCode_nominalWidthX	 21 /* CFF Private (0) */
+#define OpCode_vsindexdict	 22 /* CFF2 Private/CS */
+#define OpCode_blenddict	 23 /* CFF2 Private/CS */
+#define OpCode_vstore		 24 /* CFF2 Top */
+#define OpCode_reserved25	 25
+#define OpCode_reserved26	 26
+#define OpCode_reserved27	 27
+
+/* Numbers */
+#define OpCode_shortint		 28 /* 16-bit integer, All */
+#define OpCode_longintdict	 29 /* 32-bit integer, All */
+#define OpCode_BCD		 30 /* Real number, CFF2 Top/FD */
+#define OpCode_reserved31	 31
+
+/* 1-byte integers */
+#define OpCode_OneByteIntFirst	 32 /* All. beginning of the range of first byte ints */
+#define OpCode_OneByteIntLast	246 /* All. ending of the range of first byte int */
+
+/* 2-byte integers */
+#define OpCode_TwoBytePosInt0	247 /* All. first byte of two byte positive int (+108 to +1131) */
+#define OpCode_TwoBytePosInt1	248
+#define OpCode_TwoBytePosInt2	249
+#define OpCode_TwoBytePosInt3	250
+
+#define OpCode_TwoByteNegInt0	251 /* All. first byte of two byte negative int (-1131 to -108) */
+#define OpCode_TwoByteNegInt1	252
+#define OpCode_TwoByteNegInt2	253
+#define OpCode_TwoByteNegInt3	254
+
+/* Two byte escape operators 12, (0-41) */
+#define OpCode_ESC_Base		256
+#define Make_OpCode_ESC(byte2)	((op_code_t)(OpCode_ESC_Base + (byte2)))
+
+inline op_code_t Unmake_OpCode_ESC (op_code_t op)  { return (op_code_t)(op - OpCode_ESC_Base); }
+inline bool Is_OpCode_ESC (op_code_t op) { return op >= OpCode_ESC_Base; }
+inline unsigned int OpCode_Size (op_code_t op) { return Is_OpCode_ESC (op) ? 2: 1; }
+
+#define OpCode_Copyright	Make_OpCode_ESC(0) /* CFF Top */
+#define OpCode_isFixedPitch	Make_OpCode_ESC(1) /* CFF Top (false) */
+#define OpCode_ItalicAngle	Make_OpCode_ESC(2) /* CFF Top (0) */
+#define OpCode_UnderlinePosition Make_OpCode_ESC(3) /* CFF Top (-100) */
+#define OpCode_UnderlineThickness Make_OpCode_ESC(4) /* CFF Top (50) */
+#define OpCode_PaintType	Make_OpCode_ESC(5) /* CFF Top (0) */
+#define OpCode_CharstringType	Make_OpCode_ESC(6) /* CFF Top (2) */
+#define OpCode_FontMatrix	Make_OpCode_ESC(7) /* CFF Top, CFF2 Top (.001 0 0 .001 0 0)*/
+#define OpCode_StrokeWidth	Make_OpCode_ESC(8) /* CFF Top (0) */
+#define OpCode_BlueScale	Make_OpCode_ESC(9) /* CFF Private, CFF2 Private (0.039625) */
+#define OpCode_BlueShift	Make_OpCode_ESC(10) /* CFF Private, CFF2 Private (7) */
+#define OpCode_BlueFuzz		Make_OpCode_ESC(11) /* CFF Private, CFF2 Private (1) */
+#define OpCode_StemSnapH	Make_OpCode_ESC(12) /* CFF Private, CFF2 Private */
+#define OpCode_StemSnapV	Make_OpCode_ESC(13) /* CFF Private, CFF2 Private */
+#define OpCode_ForceBold	Make_OpCode_ESC(14) /* CFF Private (false) */
+#define OpCode_reservedESC15	Make_OpCode_ESC(15)
+#define OpCode_reservedESC16	Make_OpCode_ESC(16)
+#define OpCode_LanguageGroup	Make_OpCode_ESC(17) /* CFF Private, CFF2 Private (0) */
+#define OpCode_ExpansionFactor	Make_OpCode_ESC(18) /* CFF Private, CFF2 Private (0.06) */
+#define OpCode_initialRandomSeed Make_OpCode_ESC(19) /* CFF Private (0) */
+#define OpCode_SyntheticBase	Make_OpCode_ESC(20) /* CFF Top */
+#define OpCode_PostScript	Make_OpCode_ESC(21) /* CFF Top */
+#define OpCode_BaseFontName	Make_OpCode_ESC(22) /* CFF Top */
+#define OpCode_BaseFontBlend	Make_OpCode_ESC(23) /* CFF Top */
+#define OpCode_reservedESC24	Make_OpCode_ESC(24)
+#define OpCode_reservedESC25	Make_OpCode_ESC(25)
+#define OpCode_reservedESC26	Make_OpCode_ESC(26)
+#define OpCode_reservedESC27	Make_OpCode_ESC(27)
+#define OpCode_reservedESC28	Make_OpCode_ESC(28)
+#define OpCode_reservedESC29	Make_OpCode_ESC(29)
+#define OpCode_ROS		Make_OpCode_ESC(30) /* CFF Top_CID */
+#define OpCode_CIDFontVersion	Make_OpCode_ESC(31) /* CFF Top_CID (0) */
+#define OpCode_CIDFontRevision	Make_OpCode_ESC(32) /* CFF Top_CID (0) */
+#define OpCode_CIDFontType	Make_OpCode_ESC(33) /* CFF Top_CID (0) */
+#define OpCode_CIDCount		Make_OpCode_ESC(34) /* CFF Top_CID (8720) */
+#define OpCode_UIDBase		Make_OpCode_ESC(35) /* CFF Top_CID */
+#define OpCode_FDArray		Make_OpCode_ESC(36) /* CFF Top_CID, CFF2 Top */
+#define OpCode_FDSelect		Make_OpCode_ESC(37) /* CFF Top_CID, CFF2 Top */
+#define OpCode_FontName		Make_OpCode_ESC(38) /* CFF Top_CID */
+
+
+/* === CharString operators === */
+
+#define OpCode_hstem		  1 /* CFF, CFF2 */
+#define OpCode_Reserved2	  2
+#define OpCode_vstem		  3 /* CFF, CFF2 */
+#define OpCode_vmoveto		  4 /* CFF, CFF2 */
+#define OpCode_rlineto		  5 /* CFF, CFF2 */
+#define OpCode_hlineto		  6 /* CFF, CFF2 */
+#define OpCode_vlineto		  7 /* CFF, CFF2 */
+#define OpCode_rrcurveto	  8 /* CFF, CFF2 */
+#define OpCode_Reserved9	  9
+#define OpCode_callsubr		 10 /* CFF, CFF2 */
+#define OpCode_return		 11 /* CFF */
+//#define OpCode_escape		 12 /* CFF, CFF2 */
+#define OpCode_Reserved13	 13
+#define OpCode_endchar		 14 /* CFF */
+#define OpCode_vsindexcs	 15 /* CFF2 */
+#define OpCode_blendcs		 16 /* CFF2 */
+#define OpCode_Reserved17	 17
+#define OpCode_hstemhm		 18 /* CFF, CFF2 */
+#define OpCode_hintmask		 19 /* CFF, CFF2 */
+#define OpCode_cntrmask		 20 /* CFF, CFF2 */
+#define OpCode_rmoveto		 21 /* CFF, CFF2 */
+#define OpCode_hmoveto		 22 /* CFF, CFF2 */
+#define OpCode_vstemhm		 23 /* CFF, CFF2 */
+#define OpCode_rcurveline	 24 /* CFF, CFF2 */
+#define OpCode_rlinecurve	 25 /* CFF, CFF2 */
+#define OpCode_vvcurveto	 26 /* CFF, CFF2 */
+#define OpCode_hhcurveto	 27 /* CFF, CFF2 */
+//#define OpCode_shortint	 28 /* CFF, CFF2 */
+#define OpCode_callgsubr	 29 /* CFF, CFF2 */
+#define OpCode_vhcurveto	 30 /* CFF, CFF2 */
+#define OpCode_hvcurveto	 31 /* CFF, CFF2 */
+
+#define OpCode_fixedcs		255 /* 32-bit fixed */
+
+/* Two byte escape operators 12, (0-41) */
+#define OpCode_dotsection	Make_OpCode_ESC(0) /* CFF (obsoleted) */
+#define OpCode_ReservedESC1	Make_OpCode_ESC(1)
+#define OpCode_ReservedESC2	Make_OpCode_ESC(2)
+#define OpCode_and		Make_OpCode_ESC(3) /* CFF */
+#define OpCode_or		Make_OpCode_ESC(4) /* CFF */
+#define OpCode_not		Make_OpCode_ESC(5) /* CFF */
+#define OpCode_ReservedESC6	Make_OpCode_ESC(6)
+#define OpCode_ReservedESC7	Make_OpCode_ESC(7)
+#define OpCode_ReservedESC8	Make_OpCode_ESC(8)
+#define OpCode_abs		Make_OpCode_ESC(9) /* CFF */
+#define OpCode_add		Make_OpCode_ESC(10) /* CFF */
+#define OpCode_sub		Make_OpCode_ESC(11) /* CFF */
+#define OpCode_div		Make_OpCode_ESC(12) /* CFF */
+#define OpCode_ReservedESC13	Make_OpCode_ESC(13)
+#define OpCode_neg		Make_OpCode_ESC(14) /* CFF */
+#define OpCode_eq		Make_OpCode_ESC(15) /* CFF */
+#define OpCode_ReservedESC16	Make_OpCode_ESC(16)
+#define OpCode_ReservedESC17	Make_OpCode_ESC(17)
+#define OpCode_drop		Make_OpCode_ESC(18) /* CFF */
+#define OpCode_ReservedESC19	Make_OpCode_ESC(19)
+#define OpCode_put		Make_OpCode_ESC(20) /* CFF */
+#define OpCode_get		Make_OpCode_ESC(21) /* CFF */
+#define OpCode_ifelse		Make_OpCode_ESC(22) /* CFF */
+#define OpCode_random		Make_OpCode_ESC(23) /* CFF */
+#define OpCode_mul		Make_OpCode_ESC(24) /* CFF */
+//#define OpCode_reservedESC25	Make_OpCode_ESC(25)
+#define OpCode_sqrt		Make_OpCode_ESC(26) /* CFF */
+#define OpCode_dup		Make_OpCode_ESC(27) /* CFF */
+#define OpCode_exch		Make_OpCode_ESC(28) /* CFF */
+#define OpCode_index		Make_OpCode_ESC(29) /* CFF */
+#define OpCode_roll		Make_OpCode_ESC(30) /* CFF */
+#define OpCode_reservedESC31	Make_OpCode_ESC(31)
+#define OpCode_reservedESC32	Make_OpCode_ESC(32)
+#define OpCode_reservedESC33	Make_OpCode_ESC(33)
+#define OpCode_hflex		Make_OpCode_ESC(34) /* CFF, CFF2 */
+#define OpCode_flex		Make_OpCode_ESC(35) /* CFF, CFF2 */
+#define OpCode_hflex1		Make_OpCode_ESC(36) /* CFF, CFF2 */
+#define OpCode_flex1		Make_OpCode_ESC(37) /* CFF, CFF2 */
+
+
+#define OpCode_Invalid		0xFFFFu
+
+
+struct number_t
+{
+  void init () { set_real (0.0); }
+  void fini () {}
+
+  void set_int (int v)       { value = (double) v; }
+  int to_int () const        { return (int) value; }
+
+  void set_fixed (int32_t v) { value = v / 65536.0; }
+  int32_t to_fixed () const  { return (int32_t) (value * 65536.0); }
+
+  void set_real (double v)	 { value = v; }
+  double to_real () const    { return value; }
+
+  int ceil () const          { return (int) ::ceil (value); }
+  int floor () const         { return (int) ::floor (value); }
+
+  bool in_int_range () const
+  { return ((double) (int16_t) to_int () == value); }
+
+  bool operator > (const number_t &n) const
+  { return value > n.to_real (); }
+
+  bool operator < (const number_t &n) const
+  { return n > *this; }
+
+  bool operator >= (const number_t &n) const
+  { return !(*this < n); }
+
+  bool operator <= (const number_t &n) const
+  { return !(*this > n); }
+
+  const number_t &operator += (const number_t &n)
+  {
+    set_real (to_real () + n.to_real ());
+
+    return *this;
+  }
+
+  protected:
+  double  value;
+};
+
+/* byte string */
+struct UnsizedByteStr : UnsizedArrayOf <HBUINT8>
+{
+  // encode 2-byte int (Dict/CharString) or 4-byte int (Dict)
+  template <typename INTTYPE, int minVal, int maxVal>
+  static bool serialize_int (hb_serialize_context_t *c, op_code_t intOp, int value)
+  {
+    TRACE_SERIALIZE (this);
+
+    if (unlikely ((value < minVal || value > maxVal)))
+      return_trace (false);
+
+    HBUINT8 *p = c->allocate_size<HBUINT8> (1);
+    if (unlikely (p == nullptr)) return_trace (false);
+    p->set (intOp);
+
+    INTTYPE *ip = c->allocate_size<INTTYPE> (INTTYPE::static_size);
+    if (unlikely (ip == nullptr)) return_trace (false);
+    ip->set ((unsigned int)value);
+
+    return_trace (true);
+  }
+
+  static bool serialize_int4 (hb_serialize_context_t *c, int value)
+  { return serialize_int<HBUINT32, 0, 0x7FFFFFFF> (c, OpCode_longintdict, value); }
+
+  static bool serialize_int2 (hb_serialize_context_t *c, int value)
+  { return serialize_int<HBUINT16, 0, 0x7FFF> (c, OpCode_shortint, value); }
+
+  /* Defining null_size allows a Null object may be created. Should be safe because:
+   * A descendent struct Dict uses a Null pointer to indicate a missing table,
+   * checked before access.
+   * byte_str_t, a wrapper struct pairing a byte pointer along with its length, always
+   * checks the length before access. A Null pointer is used as the initial pointer
+   * along with zero length by the default ctor.
+   */
+  DEFINE_SIZE_MIN(0);
+};
+
+/* Holder of a section of byte string within a CFFIndex entry */
+struct byte_str_t : hb_ubytes_t
+{
+  byte_str_t ()
+    : hb_ubytes_t () {}
+  byte_str_t (const UnsizedByteStr& s, unsigned int l)
+    : hb_ubytes_t ((const unsigned char*)&s, l) {}
+  byte_str_t (const unsigned char *s, unsigned int l)
+    : hb_ubytes_t (s, l) {}
+  byte_str_t (const hb_ubytes_t &ub)	/* conversion from hb_ubytes_t */
+    : hb_ubytes_t (ub) {}
+  
+  /* sub-string */
+  byte_str_t sub_str (unsigned int offset, unsigned int len_) const
+  { return byte_str_t (hb_ubytes_t::sub_array (offset, len_)); }
+
+  bool check_limit (unsigned int offset, unsigned int count) const
+  { return (offset + count <= length); }
+};
+
+/* A byte string associated with the current offset and an error condition */
+struct byte_str_ref_t
+{
+  byte_str_ref_t ()
+  { init (); }
+
+  void init ()
+  {
+    str = byte_str_t ();
+    offset = 0;
+    error = false;
+  }
+
+  void fini () {}
+
+  byte_str_ref_t (const byte_str_t &str_, unsigned int offset_ = 0)
+    : str (str_), offset (offset_), error (false) {}
+
+  void reset (const byte_str_t &str_, unsigned int offset_ = 0)
+  {
+    str = str_;
+    offset = offset_;
+    error = false;
+  }
+
+  const unsigned char& operator [] (int i) {
+    if (unlikely ((unsigned int)(offset + i) >= str.length))
+    {
+      set_error ();
+      return Null(unsigned char);
+    }
+    else
+      return str[offset + i];
+  }
+
+  /* Conversion to byte_str_t */
+  operator byte_str_t () const { return str.sub_str (offset, str.length - offset); }
+
+  byte_str_t sub_str (unsigned int offset_, unsigned int len_) const
+  { return str.sub_str (offset_, len_); }
+
+  bool avail (unsigned int count=1) const
+  {
+    return (!in_error () && str.check_limit (offset, count));
+  }
+  void inc (unsigned int count=1)
+  {
+    if (likely (!in_error () && (offset <= str.length) && (offset + count <= str.length)))
+    {
+      offset += count;
+    }
+    else
+    {
+      offset = str.length;
+      set_error ();
+    }
+  }
+
+  void set_error ()      { error = true; }
+  bool in_error () const { return error; }
+
+  byte_str_t       str;
+  unsigned int  offset; /* beginning of the sub-string within str */
+
+  protected:
+  bool	  error;
+};
+
+typedef hb_vector_t<byte_str_t> byte_str_array_t;
+
+/* stack */
+template <typename ELEM, int LIMIT>
+struct stack_t
+{
+  void init ()
+  {
+    error = false;
+    count = 0;
+    elements.init ();
+    elements.resize (kSizeLimit);
+    for (unsigned int i = 0; i < elements.length; i++)
+      elements[i].init ();
+  }
+
+  void fini ()
+  {
+    elements.fini_deep ();
+  }
+
+  ELEM& operator [] (unsigned int i)
+  {
+    if (unlikely (i >= count)) set_error ();
+    return elements[i];
+  }
+
+  void push (const ELEM &v)
+  {
+    if (likely (count < elements.length))
+      elements[count++] = v;
+    else
+      set_error ();
+  }
+
+  ELEM &push ()
+  {
+    if (likely (count < elements.length))
+      return elements[count++];
+    else
+    {
+      set_error ();
+      return Crap(ELEM);
+    }
+  }
+
+  ELEM& pop ()
+  {
+    if (likely (count > 0))
+      return elements[--count];
+    else
+    {
+      set_error ();
+      return Crap(ELEM);
+    }
+  }
+
+  void pop (unsigned int n)
+  {
+    if (likely (count >= n))
+      count -= n;
+    else
+      set_error ();
+  }
+
+  const ELEM& peek ()
+  {
+    if (likely (count > 0))
+      return elements[count-1];
+    else
+    {
+      set_error ();
+      return Null(ELEM);
+    }
+  }
+
+  void unpop ()
+  {
+    if (likely (count < elements.length))
+      count++;
+    else
+      set_error ();
+  }
+
+  void clear () { count = 0; }
+
+  bool in_error () const { return (error || elements.in_error ()); }
+  void set_error ()      { error = true; }
+
+  unsigned int get_count () const { return count; }
+  bool is_empty () const { return count == 0; }
+
+  static constexpr unsigned kSizeLimit = LIMIT;
+
+  protected:
+  bool error;
+  unsigned int count;
+  hb_vector_t<ELEM> elements;
+};
+
+/* argument stack */
+template <typename ARG=number_t>
+struct arg_stack_t : stack_t<ARG, 513>
+{
+  void push_int (int v)
+  {
+    ARG &n = S::push ();
+    n.set_int (v);
+  }
+
+  void push_fixed (int32_t v)
+  {
+    ARG &n = S::push ();
+    n.set_fixed (v);
+  }
+
+  void push_real (double v)
+  {
+    ARG &n = S::push ();
+    n.set_real (v);
+  }
+
+  ARG& pop_num () { return this->pop (); }
+
+  int pop_int ()  { return this->pop ().to_int (); }
+
+  unsigned int pop_uint ()
+  {
+    int i = pop_int ();
+    if (unlikely (i < 0))
+    {
+      i = 0;
+      S::set_error ();
+    }
+    return (unsigned)i;
+  }
+
+  void push_longint_from_substr (byte_str_ref_t& str_ref)
+  {
+    push_int ((str_ref[0] << 24) | (str_ref[1] << 16) | (str_ref[2] << 8) | (str_ref[3]));
+    str_ref.inc (4);
+  }
+
+  bool push_fixed_from_substr (byte_str_ref_t& str_ref)
+  {
+    if (unlikely (!str_ref.avail (4)))
+      return false;
+    push_fixed ((int32_t)*(const HBUINT32*)&str_ref[0]);
+    str_ref.inc (4);
+    return true;
+  }
+
+  hb_array_t<const ARG> get_subarray (unsigned int start) const
+  {
+    return S::elements.sub_array (start);
+  }
+
+  private:
+  typedef stack_t<ARG, 513> S;
+};
+
+/* an operator prefixed by its operands in a byte string */
+struct op_str_t
+{
+  void init () {}
+  void fini () {}
+
+  op_code_t  op;
+  byte_str_t str;
+};
+
+/* base of OP_SERIALIZER */
+struct op_serializer_t
+{
+  protected:
+  bool copy_opstr (hb_serialize_context_t *c, const op_str_t& opstr) const
+  {
+    TRACE_SERIALIZE (this);
+
+    HBUINT8 *d = c->allocate_size<HBUINT8> (opstr.str.length);
+    if (unlikely (d == nullptr)) return_trace (false);
+    memcpy (d, &opstr.str[0], opstr.str.length);
+    return_trace (true);
+  }
+};
+
+template <typename VAL>
+struct parsed_values_t
+{
+  void init ()
+  {
+    opStart = 0;
+    values.init ();
+  }
+  void fini () { values.fini_deep (); }
+
+  void add_op (op_code_t op, const byte_str_ref_t& str_ref = byte_str_ref_t ())
+  {
+    VAL *val = values.push ();
+    val->op = op;
+    val->str = str_ref.str.sub_str (opStart, str_ref.offset - opStart);
+    opStart = str_ref.offset;
+  }
+
+  void add_op (op_code_t op, const byte_str_ref_t& str_ref, const VAL &v)
+  {
+    VAL *val = values.push (v);
+    val->op = op;
+    val->str = str_ref.sub_str ( opStart, str_ref.offset - opStart);
+    opStart = str_ref.offset;
+  }
+
+  bool has_op (op_code_t op) const
+  {
+    for (unsigned int i = 0; i < get_count (); i++)
+      if (get_value (i).op == op) return true;
+    return false;
+  }
+
+  unsigned get_count () const { return values.length; }
+  const VAL &get_value (unsigned int i) const { return values[i]; }
+  const VAL &operator [] (unsigned int i) const { return get_value (i); }
+
+  unsigned int       opStart;
+  hb_vector_t<VAL>   values;
+};
+
+template <typename ARG=number_t>
+struct interp_env_t
+{
+  void init (const byte_str_t &str_)
+  {
+    str_ref.reset (str_);
+    argStack.init ();
+    error = false;
+  }
+  void fini () { argStack.fini (); }
+
+  bool in_error () const
+  { return error || str_ref.in_error () || argStack.in_error (); }
+
+  void set_error () { error = true; }
+
+  op_code_t fetch_op ()
+  {
+    op_code_t  op = OpCode_Invalid;
+    if (unlikely (!str_ref.avail ()))
+      return OpCode_Invalid;
+    op = (op_code_t)(unsigned char)str_ref[0];
+    if (op == OpCode_escape) {
+      if (unlikely (!str_ref.avail ()))
+	return OpCode_Invalid;
+      op = Make_OpCode_ESC(str_ref[1]);
+      str_ref.inc ();
+    }
+    str_ref.inc ();
+    return op;
+  }
+
+  const ARG& eval_arg (unsigned int i)
+  {
+    return argStack[i];
+  }
+
+  ARG& pop_arg ()
+  {
+    return argStack.pop ();
+  }
+
+  void pop_n_args (unsigned int n)
+  {
+    argStack.pop (n);
+  }
+
+  void clear_args ()
+  {
+    pop_n_args (argStack.get_count ());
+  }
+
+  byte_str_ref_t    str_ref;
+  arg_stack_t<ARG> argStack;
+  protected:
+  bool	  error;
+};
+
+typedef interp_env_t<> num_interp_env_t;
+
+template <typename ARG=number_t>
+struct opset_t
+{
+  static void process_op (op_code_t op, interp_env_t<ARG>& env)
+  {
+    switch (op) {
+      case OpCode_shortint:
+	env.argStack.push_int ((int16_t)((env.str_ref[0] << 8) | env.str_ref[1]));
+	env.str_ref.inc (2);
+	break;
+
+      case OpCode_TwoBytePosInt0: case OpCode_TwoBytePosInt1:
+      case OpCode_TwoBytePosInt2: case OpCode_TwoBytePosInt3:
+	env.argStack.push_int ((int16_t)((op - OpCode_TwoBytePosInt0) * 256 + env.str_ref[0] + 108));
+	env.str_ref.inc ();
+	break;
+
+      case OpCode_TwoByteNegInt0: case OpCode_TwoByteNegInt1:
+      case OpCode_TwoByteNegInt2: case OpCode_TwoByteNegInt3:
+	env.argStack.push_int ((int16_t)(-(op - OpCode_TwoByteNegInt0) * 256 - env.str_ref[0] - 108));
+	env.str_ref.inc ();
+	break;
+
+      default:
+	/* 1-byte integer */
+	if (likely ((OpCode_OneByteIntFirst <= op) && (op <= OpCode_OneByteIntLast)))
+	{
+	  env.argStack.push_int ((int)op - 139);
+	} else {
+	  /* invalid unknown operator */
+	  env.clear_args ();
+	  env.set_error ();
+	}
+	break;
+    }
+  }
+};
+
+template <typename ENV>
+struct interpreter_t {
+
+  ~interpreter_t() { fini (); }
+
+  void fini () { env.fini (); }
+
+  ENV env;
+};
+
+} /* namespace CFF */
+
+#endif /* HB_CFF_INTERP_COMMON_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff-interp-cs-common.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff-interp-cs-common.hh
new file mode 100644
index 0000000..283bdf1
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff-interp-cs-common.hh
@@ -0,0 +1,905 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+#ifndef HB_CFF_INTERP_CS_COMMON_HH
+#define HB_CFF_INTERP_CS_COMMON_HH
+
+#include "hb.hh"
+#include "hb-cff-interp-common.hh"
+
+namespace CFF {
+
+using namespace OT;
+
+enum cs_type_t {
+  CSType_CharString,
+  CSType_GlobalSubr,
+  CSType_LocalSubr
+};
+
+struct call_context_t
+{
+  void init (const byte_str_ref_t substr_=byte_str_ref_t (), cs_type_t type_=CSType_CharString, unsigned int subr_num_=0)
+  {
+    str_ref = substr_;
+    type = type_;
+    subr_num = subr_num_;
+  }
+
+  void fini () {}
+
+  byte_str_ref_t  str_ref;
+  cs_type_t	  type;
+  unsigned int    subr_num;
+};
+
+/* call stack */
+const unsigned int kMaxCallLimit = 10;
+struct call_stack_t : stack_t<call_context_t, kMaxCallLimit> {};
+
+template <typename SUBRS>
+struct biased_subrs_t
+{
+  void init (const SUBRS &subrs_)
+  {
+    subrs = &subrs_;
+    unsigned int  nSubrs = get_count ();
+    if (nSubrs < 1240)
+      bias = 107;
+    else if (nSubrs < 33900)
+      bias = 1131;
+    else
+      bias = 32768;
+  }
+
+  void fini () {}
+
+  unsigned int get_count () const { return (subrs == nullptr)? 0: subrs->count; }
+  unsigned int get_bias () const { return bias; }
+
+  byte_str_t operator [] (unsigned int index) const
+  {
+    if (unlikely ((subrs == nullptr) || index >= subrs->count))
+      return Null(byte_str_t);
+    else
+      return (*subrs)[index];
+  }
+
+  protected:
+  unsigned int  bias;
+  const SUBRS   *subrs;
+};
+
+struct point_t
+{
+  void init ()
+  {
+    x.init ();
+    y.init ();
+  }
+
+  void set_int (int _x, int _y)
+  {
+    x.set_int (_x);
+    y.set_int (_y);
+  }
+
+  void move_x (const number_t &dx) { x += dx; }
+  void move_y (const number_t &dy) { y += dy; }
+  void move (const number_t &dx, const number_t &dy) { move_x (dx); move_y (dy); }
+  void move (const point_t &d) { move_x (d.x); move_y (d.y); }
+
+  number_t  x;
+  number_t  y;
+};
+
+template <typename ARG, typename SUBRS>
+struct cs_interp_env_t : interp_env_t<ARG>
+{
+  void init (const byte_str_t &str, const SUBRS &globalSubrs_, const SUBRS &localSubrs_)
+  {
+    interp_env_t<ARG>::init (str);
+
+    context.init (str, CSType_CharString);
+    seen_moveto = true;
+    seen_hintmask = false;
+    hstem_count = 0;
+    vstem_count = 0;
+    hintmask_size = 0;
+    pt.init ();
+    callStack.init ();
+    globalSubrs.init (globalSubrs_);
+    localSubrs.init (localSubrs_);
+  }
+  void fini ()
+  {
+    interp_env_t<ARG>::fini ();
+
+    callStack.fini ();
+    globalSubrs.fini ();
+    localSubrs.fini ();
+  }
+
+  bool in_error () const
+  {
+    return callStack.in_error () || SUPER::in_error ();
+  }
+
+  bool popSubrNum (const biased_subrs_t<SUBRS>& biasedSubrs, unsigned int &subr_num)
+  {
+    int n = SUPER::argStack.pop_int ();
+    n += biasedSubrs.get_bias ();
+    if (unlikely ((n < 0) || ((unsigned int)n >= biasedSubrs.get_count ())))
+      return false;
+
+    subr_num = (unsigned int)n;
+    return true;
+  }
+
+  void callSubr (const biased_subrs_t<SUBRS>& biasedSubrs, cs_type_t type)
+  {
+    unsigned int subr_num;
+
+    if (unlikely (!popSubrNum (biasedSubrs, subr_num)
+		 || callStack.get_count () >= kMaxCallLimit))
+    {
+      SUPER::set_error ();
+      return;
+    }
+    context.str_ref = SUPER::str_ref;
+    callStack.push (context);
+
+    context.init ( biasedSubrs[subr_num], type, subr_num);
+    SUPER::str_ref = context.str_ref;
+  }
+
+  void returnFromSubr ()
+  {
+    if (unlikely (SUPER::str_ref.in_error ()))
+      SUPER::set_error ();
+    context = callStack.pop ();
+    SUPER::str_ref = context.str_ref;
+  }
+
+  void determine_hintmask_size ()
+  {
+    if (!seen_hintmask)
+    {
+      vstem_count += SUPER::argStack.get_count() / 2;
+      hintmask_size = (hstem_count + vstem_count + 7) >> 3;
+      seen_hintmask = true;
+    }
+  }
+
+  void set_endchar (bool endchar_flag_) { endchar_flag = endchar_flag_; }
+  bool is_endchar () const { return endchar_flag; }
+
+  const number_t &get_x () const { return pt.x; }
+  const number_t &get_y () const { return pt.y; }
+  const point_t &get_pt () const { return pt; }
+
+  void moveto (const point_t &pt_ ) { pt = pt_; }
+
+  public:
+  call_context_t   context;
+  bool	  endchar_flag;
+  bool	  seen_moveto;
+  bool	  seen_hintmask;
+
+  unsigned int  hstem_count;
+  unsigned int  vstem_count;
+  unsigned int  hintmask_size;
+  call_stack_t	callStack;
+  biased_subrs_t<SUBRS>   globalSubrs;
+  biased_subrs_t<SUBRS>   localSubrs;
+
+  private:
+  point_t	 pt;
+
+  typedef interp_env_t<ARG> SUPER;
+};
+
+template <typename ENV, typename PARAM>
+struct path_procs_null_t
+{
+  static void rmoveto (ENV &env, PARAM& param) {}
+  static void hmoveto (ENV &env, PARAM& param) {}
+  static void vmoveto (ENV &env, PARAM& param) {}
+  static void rlineto (ENV &env, PARAM& param) {}
+  static void hlineto (ENV &env, PARAM& param) {}
+  static void vlineto (ENV &env, PARAM& param) {}
+  static void rrcurveto (ENV &env, PARAM& param) {}
+  static void rcurveline (ENV &env, PARAM& param) {}
+  static void rlinecurve (ENV &env, PARAM& param) {}
+  static void vvcurveto (ENV &env, PARAM& param) {}
+  static void hhcurveto (ENV &env, PARAM& param) {}
+  static void vhcurveto (ENV &env, PARAM& param) {}
+  static void hvcurveto (ENV &env, PARAM& param) {}
+  static void moveto (ENV &env, PARAM& param, const point_t &pt) {}
+  static void line (ENV &env, PARAM& param, const point_t &pt1) {}
+  static void curve (ENV &env, PARAM& param, const point_t &pt1, const point_t &pt2, const point_t &pt3) {}
+  static void hflex (ENV &env, PARAM& param) {}
+  static void flex (ENV &env, PARAM& param) {}
+  static void hflex1 (ENV &env, PARAM& param) {}
+  static void flex1 (ENV &env, PARAM& param) {}
+};
+
+template <typename ARG, typename OPSET, typename ENV, typename PARAM, typename PATH=path_procs_null_t<ENV, PARAM> >
+struct cs_opset_t : opset_t<ARG>
+{
+  static void process_op (op_code_t op, ENV &env, PARAM& param)
+  {
+    switch (op) {
+
+      case OpCode_return:
+	env.returnFromSubr ();
+	break;
+      case OpCode_endchar:
+	OPSET::check_width (op, env, param);
+	env.set_endchar (true);
+	OPSET::flush_args_and_op (op, env, param);
+	break;
+
+      case OpCode_fixedcs:
+	env.argStack.push_fixed_from_substr (env.str_ref);
+	break;
+
+      case OpCode_callsubr:
+	env.callSubr (env.localSubrs, CSType_LocalSubr);
+	break;
+
+      case OpCode_callgsubr:
+	env.callSubr (env.globalSubrs, CSType_GlobalSubr);
+	break;
+
+      case OpCode_hstem:
+      case OpCode_hstemhm:
+	OPSET::check_width (op, env, param);
+	OPSET::process_hstem (op, env, param);
+	break;
+      case OpCode_vstem:
+      case OpCode_vstemhm:
+	OPSET::check_width (op, env, param);
+	OPSET::process_vstem (op, env, param);
+	break;
+      case OpCode_hintmask:
+      case OpCode_cntrmask:
+	OPSET::check_width (op, env, param);
+	OPSET::process_hintmask (op, env, param);
+	break;
+      case OpCode_rmoveto:
+	OPSET::check_width (op, env, param);
+	PATH::rmoveto (env, param);
+	OPSET::process_post_move (op, env, param);
+	break;
+      case OpCode_hmoveto:
+	OPSET::check_width (op, env, param);
+	PATH::hmoveto (env, param);
+	OPSET::process_post_move (op, env, param);
+	break;
+      case OpCode_vmoveto:
+	OPSET::check_width (op, env, param);
+	PATH::vmoveto (env, param);
+	OPSET::process_post_move (op, env, param);
+	break;
+      case OpCode_rlineto:
+	PATH::rlineto (env, param);
+	process_post_path (op, env, param);
+	break;
+      case OpCode_hlineto:
+	PATH::hlineto (env, param);
+	process_post_path (op, env, param);
+	break;
+      case OpCode_vlineto:
+	PATH::vlineto (env, param);
+	process_post_path (op, env, param);
+	break;
+      case OpCode_rrcurveto:
+	PATH::rrcurveto (env, param);
+	process_post_path (op, env, param);
+	break;
+      case OpCode_rcurveline:
+	PATH::rcurveline (env, param);
+	process_post_path (op, env, param);
+	break;
+      case OpCode_rlinecurve:
+	PATH::rlinecurve (env, param);
+	process_post_path (op, env, param);
+	break;
+      case OpCode_vvcurveto:
+	PATH::vvcurveto (env, param);
+	process_post_path (op, env, param);
+	break;
+      case OpCode_hhcurveto:
+	PATH::hhcurveto (env, param);
+	process_post_path (op, env, param);
+	break;
+      case OpCode_vhcurveto:
+	PATH::vhcurveto (env, param);
+	process_post_path (op, env, param);
+	break;
+      case OpCode_hvcurveto:
+	PATH::hvcurveto (env, param);
+	process_post_path (op, env, param);
+	break;
+
+      case OpCode_hflex:
+	PATH::hflex (env, param);
+	OPSET::process_post_flex (op, env, param);
+	break;
+
+      case OpCode_flex:
+	PATH::flex (env, param);
+	OPSET::process_post_flex (op, env, param);
+	break;
+
+      case OpCode_hflex1:
+	PATH::hflex1 (env, param);
+	OPSET::process_post_flex (op, env, param);
+	break;
+
+      case OpCode_flex1:
+	PATH::flex1 (env, param);
+	OPSET::process_post_flex (op, env, param);
+	break;
+
+      default:
+	SUPER::process_op (op, env);
+	break;
+    }
+  }
+
+  static void process_hstem (op_code_t op, ENV &env, PARAM& param)
+  {
+    env.hstem_count += env.argStack.get_count () / 2;
+    OPSET::flush_args_and_op (op, env, param);
+  }
+
+  static void process_vstem (op_code_t op, ENV &env, PARAM& param)
+  {
+    env.vstem_count += env.argStack.get_count () / 2;
+    OPSET::flush_args_and_op (op, env, param);
+  }
+
+  static void process_hintmask (op_code_t op, ENV &env, PARAM& param)
+  {
+    env.determine_hintmask_size ();
+    if (likely (env.str_ref.avail (env.hintmask_size)))
+    {
+      OPSET::flush_hintmask (op, env, param);
+      env.str_ref.inc (env.hintmask_size);
+    }
+  }
+
+  static void process_post_flex (op_code_t op, ENV &env, PARAM& param)
+  {
+    OPSET::flush_args_and_op (op, env, param);
+  }
+
+  static void check_width (op_code_t op, ENV &env, PARAM& param)
+  {}
+
+  static void process_post_move (op_code_t op, ENV &env, PARAM& param)
+  {
+    if (!env.seen_moveto)
+    {
+      env.determine_hintmask_size ();
+      env.seen_moveto = true;
+    }
+    OPSET::flush_args_and_op (op, env, param);
+  }
+
+  static void process_post_path (op_code_t op, ENV &env, PARAM& param)
+  {
+    OPSET::flush_args_and_op (op, env, param);
+  }
+
+  static void flush_args_and_op (op_code_t op, ENV &env, PARAM& param)
+  {
+    OPSET::flush_args (env, param);
+    OPSET::flush_op (op, env, param);
+  }
+
+  static void flush_args (ENV &env, PARAM& param)
+  {
+    env.pop_n_args (env.argStack.get_count ());
+  }
+
+  static void flush_op (op_code_t op, ENV &env, PARAM& param)
+  {
+  }
+
+  static void flush_hintmask (op_code_t op, ENV &env, PARAM& param)
+  {
+    OPSET::flush_args_and_op (op, env, param);
+  }
+
+  static bool is_number_op (op_code_t op)
+  {
+    switch (op)
+    {
+      case OpCode_shortint:
+      case OpCode_fixedcs:
+      case OpCode_TwoBytePosInt0: case OpCode_TwoBytePosInt1:
+      case OpCode_TwoBytePosInt2: case OpCode_TwoBytePosInt3:
+      case OpCode_TwoByteNegInt0: case OpCode_TwoByteNegInt1:
+      case OpCode_TwoByteNegInt2: case OpCode_TwoByteNegInt3:
+	return true;
+
+      default:
+	/* 1-byte integer */
+	return (OpCode_OneByteIntFirst <= op) && (op <= OpCode_OneByteIntLast);
+    }
+  }
+
+  protected:
+  typedef opset_t<ARG>  SUPER;
+};
+
+template <typename PATH, typename ENV, typename PARAM>
+struct path_procs_t
+{
+  static void rmoveto (ENV &env, PARAM& param)
+  {
+    point_t pt1 = env.get_pt ();
+    const number_t &dy = env.pop_arg ();
+    const number_t &dx = env.pop_arg ();
+    pt1.move (dx, dy);
+    PATH::moveto (env, param, pt1);
+  }
+
+  static void hmoveto (ENV &env, PARAM& param)
+  {
+    point_t pt1 = env.get_pt ();
+    pt1.move_x (env.pop_arg ());
+    PATH::moveto (env, param, pt1);
+  }
+
+  static void vmoveto (ENV &env, PARAM& param)
+  {
+    point_t pt1 = env.get_pt ();
+    pt1.move_y (env.pop_arg ());
+    PATH::moveto (env, param, pt1);
+  }
+
+  static void rlineto (ENV &env, PARAM& param)
+  {
+    for (unsigned int i = 0; i + 2 <= env.argStack.get_count (); i += 2)
+    {
+      point_t pt1 = env.get_pt ();
+      pt1.move (env.eval_arg (i), env.eval_arg (i+1));
+      PATH::line (env, param, pt1);
+    }
+  }
+
+  static void hlineto (ENV &env, PARAM& param)
+  {
+    point_t pt1;
+    unsigned int i = 0;
+    for (; i + 2 <= env.argStack.get_count (); i += 2)
+    {
+      pt1 = env.get_pt ();
+      pt1.move_x (env.eval_arg (i));
+      PATH::line (env, param, pt1);
+      pt1.move_y (env.eval_arg (i+1));
+      PATH::line (env, param, pt1);
+    }
+    if (i < env.argStack.get_count ())
+    {
+      pt1 = env.get_pt ();
+      pt1.move_x (env.eval_arg (i));
+      PATH::line (env, param, pt1);
+    }
+  }
+
+  static void vlineto (ENV &env, PARAM& param)
+  {
+    point_t pt1;
+    unsigned int i = 0;
+    for (; i + 2 <= env.argStack.get_count (); i += 2)
+    {
+      pt1 = env.get_pt ();
+      pt1.move_y (env.eval_arg (i));
+      PATH::line (env, param, pt1);
+      pt1.move_x (env.eval_arg (i+1));
+      PATH::line (env, param, pt1);
+    }
+    if (i < env.argStack.get_count ())
+    {
+      pt1 = env.get_pt ();
+      pt1.move_y (env.eval_arg (i));
+      PATH::line (env, param, pt1);
+    }
+  }
+
+  static void rrcurveto (ENV &env, PARAM& param)
+  {
+    for (unsigned int i = 0; i + 6 <= env.argStack.get_count (); i += 6)
+    {
+      point_t pt1 = env.get_pt ();
+      pt1.move (env.eval_arg (i), env.eval_arg (i+1));
+      point_t pt2 = pt1;
+      pt2.move (env.eval_arg (i+2), env.eval_arg (i+3));
+      point_t pt3 = pt2;
+      pt3.move (env.eval_arg (i+4), env.eval_arg (i+5));
+      PATH::curve (env, param, pt1, pt2, pt3);
+    }
+  }
+
+  static void rcurveline (ENV &env, PARAM& param)
+  {
+    unsigned int i = 0;
+    for (; i + 6 <= env.argStack.get_count (); i += 6)
+    {
+      point_t pt1 = env.get_pt ();
+      pt1.move (env.eval_arg (i), env.eval_arg (i+1));
+      point_t pt2 = pt1;
+      pt2.move (env.eval_arg (i+2), env.eval_arg (i+3));
+      point_t pt3 = pt2;
+      pt3.move (env.eval_arg (i+4), env.eval_arg (i+5));
+      PATH::curve (env, param, pt1, pt2, pt3);
+    }
+    for (; i + 2 <= env.argStack.get_count (); i += 2)
+    {
+      point_t pt1 = env.get_pt ();
+      pt1.move (env.eval_arg (i), env.eval_arg (i+1));
+      PATH::line (env, param, pt1);
+    }
+  }
+
+  static void rlinecurve (ENV &env, PARAM& param)
+  {
+    unsigned int i = 0;
+    unsigned int line_limit = (env.argStack.get_count () % 6);
+    for (; i + 2 <= line_limit; i += 2)
+    {
+      point_t pt1 = env.get_pt ();
+      pt1.move (env.eval_arg (i), env.eval_arg (i+1));
+      PATH::line (env, param, pt1);
+    }
+    for (; i + 6 <= env.argStack.get_count (); i += 6)
+    {
+      point_t pt1 = env.get_pt ();
+      pt1.move (env.eval_arg (i), env.eval_arg (i+1));
+      point_t pt2 = pt1;
+      pt2.move (env.eval_arg (i+2), env.eval_arg (i+3));
+      point_t pt3 = pt2;
+      pt3.move (env.eval_arg (i+4), env.eval_arg (i+5));
+      PATH::curve (env, param, pt1, pt2, pt3);
+    }
+  }
+
+  static void vvcurveto (ENV &env, PARAM& param)
+  {
+    unsigned int i = 0;
+    point_t pt1 = env.get_pt ();
+    if ((env.argStack.get_count () & 1) != 0)
+      pt1.move_x (env.eval_arg (i++));
+    for (; i + 4 <= env.argStack.get_count (); i += 4)
+    {
+      pt1.move_y (env.eval_arg (i));
+      point_t pt2 = pt1;
+      pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+      point_t pt3 = pt2;
+      pt3.move_y (env.eval_arg (i+3));
+      PATH::curve (env, param, pt1, pt2, pt3);
+      pt1 = env.get_pt ();
+    }
+  }
+
+  static void hhcurveto (ENV &env, PARAM& param)
+  {
+    unsigned int i = 0;
+    point_t pt1 = env.get_pt ();
+    if ((env.argStack.get_count () & 1) != 0)
+      pt1.move_y (env.eval_arg (i++));
+    for (; i + 4 <= env.argStack.get_count (); i += 4)
+    {
+      pt1.move_x (env.eval_arg (i));
+      point_t pt2 = pt1;
+      pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+      point_t pt3 = pt2;
+      pt3.move_x (env.eval_arg (i+3));
+      PATH::curve (env, param, pt1, pt2, pt3);
+      pt1 = env.get_pt ();
+    }
+  }
+
+  static void vhcurveto (ENV &env, PARAM& param)
+  {
+    point_t pt1, pt2, pt3;
+    unsigned int i = 0;
+    if ((env.argStack.get_count () % 8) >= 4)
+    {
+      point_t pt1 = env.get_pt ();
+      pt1.move_y (env.eval_arg (i));
+      point_t pt2 = pt1;
+      pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+      point_t pt3 = pt2;
+      pt3.move_x (env.eval_arg (i+3));
+      i += 4;
+
+      for (; i + 8 <= env.argStack.get_count (); i += 8)
+      {
+	PATH::curve (env, param, pt1, pt2, pt3);
+	pt1 = env.get_pt ();
+	pt1.move_x (env.eval_arg (i));
+	pt2 = pt1;
+	pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+	pt3 = pt2;
+	pt3.move_y (env.eval_arg (i+3));
+	PATH::curve (env, param, pt1, pt2, pt3);
+
+	pt1 = pt3;
+	pt1.move_y (env.eval_arg (i+4));
+	pt2 = pt1;
+	pt2.move (env.eval_arg (i+5), env.eval_arg (i+6));
+	pt3 = pt2;
+	pt3.move_x (env.eval_arg (i+7));
+      }
+      if (i < env.argStack.get_count ())
+	pt3.move_y (env.eval_arg (i));
+      PATH::curve (env, param, pt1, pt2, pt3);
+    }
+    else
+    {
+      for (; i + 8 <= env.argStack.get_count (); i += 8)
+      {
+	pt1 = env.get_pt ();
+	pt1.move_y (env.eval_arg (i));
+	pt2 = pt1;
+	pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+	pt3 = pt2;
+	pt3.move_x (env.eval_arg (i+3));
+	PATH::curve (env, param, pt1, pt2, pt3);
+
+	pt1 = pt3;
+	pt1.move_x (env.eval_arg (i+4));
+	pt2 = pt1;
+	pt2.move (env.eval_arg (i+5), env.eval_arg (i+6));
+	pt3 = pt2;
+	pt3.move_y (env.eval_arg (i+7));
+	if ((env.argStack.get_count () - i < 16) && ((env.argStack.get_count () & 1) != 0))
+	  pt3.move_x (env.eval_arg (i+8));
+	PATH::curve (env, param, pt1, pt2, pt3);
+      }
+    }
+  }
+
+  static void hvcurveto (ENV &env, PARAM& param)
+  {
+    point_t pt1, pt2, pt3;
+    unsigned int i = 0;
+    if ((env.argStack.get_count () % 8) >= 4)
+    {
+      point_t pt1 = env.get_pt ();
+      pt1.move_x (env.eval_arg (i));
+      point_t pt2 = pt1;
+      pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+      point_t pt3 = pt2;
+      pt3.move_y (env.eval_arg (i+3));
+      i += 4;
+
+      for (; i + 8 <= env.argStack.get_count (); i += 8)
+      {
+	PATH::curve (env, param, pt1, pt2, pt3);
+	pt1 = env.get_pt ();
+	pt1.move_y (env.eval_arg (i));
+	pt2 = pt1;
+	pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+	pt3 = pt2;
+	pt3.move_x (env.eval_arg (i+3));
+	PATH::curve (env, param, pt1, pt2, pt3);
+
+	pt1 = pt3;
+	pt1.move_x (env.eval_arg (i+4));
+	pt2 = pt1;
+	pt2.move (env.eval_arg (i+5), env.eval_arg (i+6));
+	pt3 = pt2;
+	pt3.move_y (env.eval_arg (i+7));
+      }
+      if (i < env.argStack.get_count ())
+	pt3.move_x (env.eval_arg (i));
+      PATH::curve (env, param, pt1, pt2, pt3);
+    }
+    else
+    {
+      for (; i + 8 <= env.argStack.get_count (); i += 8)
+      {
+	pt1 = env.get_pt ();
+	pt1.move_x (env.eval_arg (i));
+	pt2 = pt1;
+	pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+	pt3 = pt2;
+	pt3.move_y (env.eval_arg (i+3));
+	PATH::curve (env, param, pt1, pt2, pt3);
+
+	pt1 = pt3;
+	pt1.move_y (env.eval_arg (i+4));
+	pt2 = pt1;
+	pt2.move (env.eval_arg (i+5), env.eval_arg (i+6));
+	pt3 = pt2;
+	pt3.move_x (env.eval_arg (i+7));
+	if ((env.argStack.get_count () - i < 16) && ((env.argStack.get_count () & 1) != 0))
+	  pt3.move_y (env.eval_arg (i+8));
+	PATH::curve (env, param, pt1, pt2, pt3);
+      }
+    }
+  }
+
+  /* default actions to be overridden */
+  static void moveto (ENV &env, PARAM& param, const point_t &pt)
+  { env.moveto (pt); }
+
+  static void line (ENV &env, PARAM& param, const point_t &pt1)
+  { PATH::moveto (env, param, pt1); }
+
+  static void curve (ENV &env, PARAM& param, const point_t &pt1, const point_t &pt2, const point_t &pt3)
+  { PATH::moveto (env, param, pt3); }
+
+  static void hflex (ENV &env, PARAM& param)
+  {
+    if (likely (env.argStack.get_count () == 7))
+    {
+      point_t pt1 = env.get_pt ();
+      pt1.move_x (env.eval_arg (0));
+      point_t pt2 = pt1;
+      pt2.move (env.eval_arg (1), env.eval_arg (2));
+      point_t pt3 = pt2;
+      pt3.move_x (env.eval_arg (3));
+      point_t pt4 = pt3;
+      pt4.move_x (env.eval_arg (4));
+      point_t pt5 = pt4;
+      pt5.move_x (env.eval_arg (5));
+      pt5.y = pt1.y;
+      point_t pt6 = pt5;
+      pt6.move_x (env.eval_arg (6));
+
+      curve2 (env, param, pt1, pt2, pt3, pt4, pt5, pt6);
+    }
+    else
+      env.set_error ();
+  }
+
+  static void flex (ENV &env, PARAM& param)
+  {
+    if (likely (env.argStack.get_count () == 13))
+    {
+      point_t pt1 = env.get_pt ();
+      pt1.move (env.eval_arg (0), env.eval_arg (1));
+      point_t pt2 = pt1;
+      pt2.move (env.eval_arg (2), env.eval_arg (3));
+      point_t pt3 = pt2;
+      pt3.move (env.eval_arg (4), env.eval_arg (5));
+      point_t pt4 = pt3;
+      pt4.move (env.eval_arg (6), env.eval_arg (7));
+      point_t pt5 = pt4;
+      pt5.move (env.eval_arg (8), env.eval_arg (9));
+      point_t pt6 = pt5;
+      pt6.move (env.eval_arg (10), env.eval_arg (11));
+
+      curve2 (env, param, pt1, pt2, pt3, pt4, pt5, pt6);
+    }
+    else
+      env.set_error ();
+  }
+
+  static void hflex1 (ENV &env, PARAM& param)
+  {
+    if (likely (env.argStack.get_count () == 9))
+    {
+      point_t pt1 = env.get_pt ();
+      pt1.move (env.eval_arg (0), env.eval_arg (1));
+      point_t pt2 = pt1;
+      pt2.move (env.eval_arg (2), env.eval_arg (3));
+      point_t pt3 = pt2;
+      pt3.move_x (env.eval_arg (4));
+      point_t pt4 = pt3;
+      pt4.move_x (env.eval_arg (5));
+      point_t pt5 = pt4;
+      pt5.move (env.eval_arg (6), env.eval_arg (7));
+      point_t pt6 = pt5;
+      pt6.move_x (env.eval_arg (8));
+      pt6.y = env.get_pt ().y;
+
+      curve2 (env, param, pt1, pt2, pt3, pt4, pt5, pt6);
+    }
+    else
+      env.set_error ();
+  }
+
+  static void flex1 (ENV &env, PARAM& param)
+  {
+    if (likely (env.argStack.get_count () == 11))
+    {
+      point_t d;
+      d.init ();
+      for (unsigned int i = 0; i < 10; i += 2)
+	d.move (env.eval_arg (i), env.eval_arg (i+1));
+
+      point_t pt1 = env.get_pt ();
+      pt1.move (env.eval_arg (0), env.eval_arg (1));
+      point_t pt2 = pt1;
+      pt2.move (env.eval_arg (2), env.eval_arg (3));
+      point_t pt3 = pt2;
+      pt3.move (env.eval_arg (4), env.eval_arg (5));
+      point_t pt4 = pt3;
+      pt4.move (env.eval_arg (6), env.eval_arg (7));
+      point_t pt5 = pt4;
+      pt5.move (env.eval_arg (8), env.eval_arg (9));
+      point_t pt6 = pt5;
+
+      if (fabs (d.x.to_real ()) > fabs (d.y.to_real ()))
+      {
+	pt6.move_x (env.eval_arg (10));
+	pt6.y = env.get_pt ().y;
+      }
+      else
+      {
+	pt6.x = env.get_pt ().x;
+	pt6.move_y (env.eval_arg (10));
+      }
+
+      curve2 (env, param, pt1, pt2, pt3, pt4, pt5, pt6);
+    }
+    else
+      env.set_error ();
+  }
+
+  protected:
+  static void curve2 (ENV &env, PARAM& param,
+		      const point_t &pt1, const point_t &pt2, const point_t &pt3,
+		      const point_t &pt4, const point_t &pt5, const point_t &pt6)
+  {
+    PATH::curve (env, param, pt1, pt2, pt3);
+    PATH::curve (env, param, pt4, pt5, pt6);
+  }
+};
+
+template <typename ENV, typename OPSET, typename PARAM>
+struct cs_interpreter_t : interpreter_t<ENV>
+{
+  bool interpret (PARAM& param)
+  {
+    SUPER::env.set_endchar (false);
+
+    for (;;) {
+      OPSET::process_op (SUPER::env.fetch_op (), SUPER::env, param);
+      if (unlikely (SUPER::env.in_error ()))
+	return false;
+      if (SUPER::env.is_endchar ())
+	break;
+    }
+
+    return true;
+  }
+
+  private:
+  typedef interpreter_t<ENV> SUPER;
+};
+
+} /* namespace CFF */
+
+#endif /* HB_CFF_INTERP_CS_COMMON_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff-interp-dict-common.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff-interp-dict-common.hh
new file mode 100644
index 0000000..2c54909
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff-interp-dict-common.hh
@@ -0,0 +1,294 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+#ifndef HB_CFF_INTERP_DICT_COMMON_HH
+#define HB_CFF_INTERP_DICT_COMMON_HH
+
+#include "hb-cff-interp-common.hh"
+#include <math.h>
+#include <float.h>
+
+namespace CFF {
+
+using namespace OT;
+
+/* an opstr and the parsed out dict value(s) */
+struct dict_val_t : op_str_t
+{
+  void init () { single_val.set_int (0); }
+  void fini () {}
+
+  number_t	      single_val;
+};
+
+typedef dict_val_t num_dict_val_t;
+
+template <typename VAL> struct dict_values_t : parsed_values_t<VAL> {};
+
+template <typename OPSTR=op_str_t>
+struct top_dict_values_t : dict_values_t<OPSTR>
+{
+  void init ()
+  {
+    dict_values_t<OPSTR>::init ();
+    charStringsOffset = 0;
+    FDArrayOffset = 0;
+  }
+  void fini () { dict_values_t<OPSTR>::fini (); }
+
+  unsigned int calculate_serialized_op_size (const OPSTR& opstr) const
+  {
+    switch (opstr.op)
+    {
+      case OpCode_CharStrings:
+      case OpCode_FDArray:
+	return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (opstr.op);
+
+      default:
+	return opstr.str.length;
+    }
+  }
+
+  unsigned int  charStringsOffset;
+  unsigned int  FDArrayOffset;
+};
+
+struct dict_opset_t : opset_t<number_t>
+{
+  static void process_op (op_code_t op, interp_env_t<number_t>& env)
+  {
+    switch (op) {
+      case OpCode_longintdict:  /* 5-byte integer */
+	env.argStack.push_longint_from_substr (env.str_ref);
+	break;
+
+      case OpCode_BCD:  /* real number */
+	env.argStack.push_real (parse_bcd (env.str_ref));
+	break;
+
+      default:
+	opset_t<number_t>::process_op (op, env);
+	break;
+    }
+  }
+
+  static double parse_bcd (byte_str_ref_t& str_ref)
+  {
+    bool    neg = false;
+    double  int_part = 0;
+    uint64_t frac_part = 0;
+    uint32_t  frac_count = 0;
+    bool    exp_neg = false;
+    uint32_t  exp_part = 0;
+    bool    exp_overflow = false;
+    enum Part { INT_PART=0, FRAC_PART, EXP_PART } part = INT_PART;
+    enum Nibble { DECIMAL=10, EXP_POS, EXP_NEG, RESERVED, NEG, END };
+    const uint64_t MAX_FRACT = 0xFFFFFFFFFFFFFull; /* 1^52-1 */
+    const uint32_t MAX_EXP = 0x7FFu; /* 1^11-1 */
+
+    double  value = 0.0;
+    unsigned char byte = 0;
+    for (uint32_t i = 0;; i++)
+    {
+      char d;
+      if ((i & 1) == 0)
+      {
+	if (!str_ref.avail ())
+	{
+	  str_ref.set_error ();
+	  return 0.0;
+	}
+	byte = str_ref[0];
+	str_ref.inc ();
+	d = byte >> 4;
+      }
+      else
+	d = byte & 0x0F;
+
+      switch (d)
+      {
+	case RESERVED:
+	  str_ref.set_error ();
+	  return value;
+
+	case END:
+	  value = (double)(neg? -int_part: int_part);
+	  if (frac_count > 0)
+	  {
+	    double frac = (frac_part / pow (10.0, (double)frac_count));
+	    if (neg) frac = -frac;
+	    value += frac;
+	  }
+	  if (unlikely (exp_overflow))
+	  {
+	    if (value == 0.0)
+	      return value;
+	    if (exp_neg)
+	      return neg? -DBL_MIN: DBL_MIN;
+	    else
+	      return neg? -DBL_MAX: DBL_MAX;
+	  }
+	  if (exp_part != 0)
+	  {
+	    if (exp_neg)
+	      value /= pow (10.0, (double)exp_part);
+	    else
+	      value *= pow (10.0, (double)exp_part);
+	  }
+	  return value;
+
+	case NEG:
+	  if (i != 0)
+	  {
+	    str_ref.set_error ();
+	    return 0.0;
+	  }
+	  neg = true;
+	  break;
+
+	case DECIMAL:
+	  if (part != INT_PART)
+	  {
+	    str_ref.set_error ();
+	    return value;
+	  }
+	  part = FRAC_PART;
+	  break;
+
+	case EXP_NEG:
+	  exp_neg = true;
+	  HB_FALLTHROUGH;
+
+	case EXP_POS:
+	  if (part == EXP_PART)
+	  {
+	    str_ref.set_error ();
+	    return value;
+	  }
+	  part = EXP_PART;
+	  break;
+
+	default:
+	  switch (part) {
+	    default:
+	    case INT_PART:
+	      int_part = (int_part * 10) + d;
+	      break;
+
+	    case FRAC_PART:
+	      if (likely (frac_part <= MAX_FRACT / 10))
+	      {
+		frac_part = (frac_part * 10) + (unsigned)d;
+		frac_count++;
+	      }
+	      break;
+
+	    case EXP_PART:
+	      if (likely (exp_part * 10 + d <= MAX_EXP))
+	      {
+	      	exp_part = (exp_part * 10) + d;
+	      }
+	      else
+	      	exp_overflow = true;
+	      break;
+	  }
+      }
+    }
+
+    return value;
+  }
+
+  static bool is_hint_op (op_code_t op)
+  {
+    switch (op)
+    {
+      case OpCode_BlueValues:
+      case OpCode_OtherBlues:
+      case OpCode_FamilyBlues:
+      case OpCode_FamilyOtherBlues:
+      case OpCode_StemSnapH:
+      case OpCode_StemSnapV:
+      case OpCode_StdHW:
+      case OpCode_StdVW:
+      case OpCode_BlueScale:
+      case OpCode_BlueShift:
+      case OpCode_BlueFuzz:
+      case OpCode_ForceBold:
+      case OpCode_LanguageGroup:
+      case OpCode_ExpansionFactor:
+	return true;
+      default:
+	return false;
+    }
+  }
+};
+
+template <typename VAL=op_str_t>
+struct top_dict_opset_t : dict_opset_t
+{
+  static void process_op (op_code_t op, interp_env_t<number_t>& env, top_dict_values_t<VAL> & dictval)
+  {
+    switch (op) {
+      case OpCode_CharStrings:
+	dictval.charStringsOffset = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+      case OpCode_FDArray:
+	dictval.FDArrayOffset = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+      case OpCode_FontMatrix:
+	env.clear_args ();
+	break;
+      default:
+	dict_opset_t::process_op (op, env);
+	break;
+    }
+  }
+};
+
+template <typename OPSET, typename PARAM, typename ENV=num_interp_env_t>
+struct dict_interpreter_t : interpreter_t<ENV>
+{
+  bool interpret (PARAM& param)
+  {
+    param.init ();
+    while (SUPER::env.str_ref.avail ())
+    {
+      OPSET::process_op (SUPER::env.fetch_op (), SUPER::env, param);
+      if (unlikely (SUPER::env.in_error ()))
+	return false;
+    }
+
+    return true;
+  }
+
+  private:
+  typedef interpreter_t<ENV> SUPER;
+};
+
+} /* namespace CFF */
+
+#endif /* HB_CFF_INTERP_DICT_COMMON_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff1-interp-cs.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff1-interp-cs.hh
new file mode 100644
index 0000000..c7209ed
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff1-interp-cs.hh
@@ -0,0 +1,161 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+#ifndef HB_CFF1_INTERP_CS_HH
+#define HB_CFF1_INTERP_CS_HH
+
+#include "hb.hh"
+#include "hb-cff-interp-cs-common.hh"
+
+namespace CFF {
+
+using namespace OT;
+
+typedef biased_subrs_t<CFF1Subrs>   cff1_biased_subrs_t;
+
+struct cff1_cs_interp_env_t : cs_interp_env_t<number_t, CFF1Subrs>
+{
+  template <typename ACC>
+  void init (const byte_str_t &str, ACC &acc, unsigned int fd)
+  {
+    SUPER::init (str, *acc.globalSubrs, *acc.privateDicts[fd].localSubrs);
+    processed_width = false;
+    has_width = false;
+    arg_start = 0;
+    in_seac = false;
+  }
+
+  void fini () { SUPER::fini (); }
+
+  void set_width (bool has_width_)
+  {
+    if (likely (!processed_width && (SUPER::argStack.get_count () > 0)))
+    {
+      if (has_width_)
+      {
+	width = SUPER::argStack[0];
+	has_width = true;
+	arg_start = 1;
+      }
+    }
+    processed_width = true;
+  }
+
+  void clear_args ()
+  {
+    arg_start = 0;
+    SUPER::clear_args ();
+  }
+
+  void set_in_seac (bool _in_seac) { in_seac = _in_seac; }
+
+  bool	  processed_width;
+  bool	  has_width;
+  unsigned int  arg_start;
+  number_t	width;
+  bool	  in_seac;
+
+  private:
+  typedef cs_interp_env_t<number_t, CFF1Subrs> SUPER;
+};
+
+template <typename OPSET, typename PARAM, typename PATH=path_procs_null_t<cff1_cs_interp_env_t, PARAM> >
+struct cff1_cs_opset_t : cs_opset_t<number_t, OPSET, cff1_cs_interp_env_t, PARAM, PATH>
+{
+  /* PostScript-originated legacy opcodes (OpCode_add etc) are unsupported */
+  /* Type 1-originated deprecated opcodes, seac behavior of endchar and dotsection are supported */
+
+  static void process_op (op_code_t op, cff1_cs_interp_env_t &env, PARAM& param)
+  {
+    switch (op) {
+      case OpCode_dotsection:
+	SUPER::flush_args_and_op (op, env, param);
+	break;
+
+      case OpCode_endchar:
+	OPSET::check_width (op, env, param);
+	if (env.argStack.get_count () >= 4)
+	{
+	  OPSET::process_seac (env, param);
+	}
+	OPSET::flush_args_and_op (op, env, param);
+	env.set_endchar (true);
+	break;
+
+      default:
+	SUPER::process_op (op, env, param);
+    }
+  }
+
+  static void check_width (op_code_t op, cff1_cs_interp_env_t &env, PARAM& param)
+  {
+    if (!env.processed_width)
+    {
+      bool  has_width = false;
+      switch (op)
+      {
+	case OpCode_endchar:
+	case OpCode_hstem:
+	case OpCode_hstemhm:
+	case OpCode_vstem:
+	case OpCode_vstemhm:
+	case OpCode_hintmask:
+	case OpCode_cntrmask:
+	  has_width = ((env.argStack.get_count () & 1) != 0);
+	  break;
+	case OpCode_hmoveto:
+	case OpCode_vmoveto:
+	  has_width = (env.argStack.get_count () > 1);
+	  break;
+	case OpCode_rmoveto:
+	  has_width = (env.argStack.get_count () > 2);
+	  break;
+	default:
+	  return;
+      }
+      env.set_width (has_width);
+    }
+  }
+
+  static void process_seac (cff1_cs_interp_env_t &env, PARAM& param)
+  {
+  }
+
+  static void flush_args (cff1_cs_interp_env_t &env, PARAM& param)
+  {
+    SUPER::flush_args (env, param);
+    env.clear_args ();  /* pop off width */
+  }
+
+  private:
+  typedef cs_opset_t<number_t, OPSET, cff1_cs_interp_env_t, PARAM, PATH>  SUPER;
+};
+
+template <typename OPSET, typename PARAM>
+struct cff1_cs_interpreter_t : cs_interpreter_t<cff1_cs_interp_env_t, OPSET, PARAM> {};
+
+} /* namespace CFF */
+
+#endif /* HB_CFF1_INTERP_CS_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff2-interp-cs.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff2-interp-cs.hh
new file mode 100644
index 0000000..49e5ee73
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-cff2-interp-cs.hh
@@ -0,0 +1,271 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+#ifndef HB_CFF2_INTERP_CS_HH
+#define HB_CFF2_INTERP_CS_HH
+
+#include "hb.hh"
+#include "hb-cff-interp-cs-common.hh"
+
+namespace CFF {
+
+using namespace OT;
+
+struct blend_arg_t : number_t
+{
+  void init ()
+  {
+    number_t::init ();
+    deltas.init ();
+  }
+
+  void fini ()
+  {
+    number_t::fini ();
+    deltas.fini_deep ();
+  }
+
+  void set_int (int v) { reset_blends (); number_t::set_int (v); }
+  void set_fixed (int32_t v) { reset_blends (); number_t::set_fixed (v); }
+  void set_real (double v) { reset_blends (); number_t::set_real (v); }
+
+  void set_blends (unsigned int numValues_, unsigned int valueIndex_,
+			  unsigned int numBlends, hb_array_t<const blend_arg_t> blends_)
+  {
+    numValues = numValues_;
+    valueIndex = valueIndex_;
+    deltas.resize (numBlends);
+    for (unsigned int i = 0; i < numBlends; i++)
+      deltas[i] = blends_[i];
+  }
+
+  bool blending () const { return deltas.length > 0; }
+  void reset_blends ()
+  {
+    numValues = valueIndex = 0;
+    deltas.resize (0);
+  }
+
+  unsigned int numValues;
+  unsigned int valueIndex;
+  hb_vector_t<number_t> deltas;
+};
+
+typedef interp_env_t<blend_arg_t> BlendInterpEnv;
+typedef biased_subrs_t<CFF2Subrs>   cff2_biased_subrs_t;
+
+struct cff2_cs_interp_env_t : cs_interp_env_t<blend_arg_t, CFF2Subrs>
+{
+  template <typename ACC>
+  void init (const byte_str_t &str, ACC &acc, unsigned int fd,
+		    const int *coords_=nullptr, unsigned int num_coords_=0)
+  {
+    SUPER::init (str, *acc.globalSubrs, *acc.privateDicts[fd].localSubrs);
+
+    coords = coords_;
+    num_coords = num_coords_;
+    varStore = acc.varStore;
+    seen_blend = false;
+    seen_vsindex_ = false;
+    scalars.init ();
+    do_blend = (coords != nullptr) && num_coords && (varStore != &Null(CFF2VariationStore));
+    set_ivs (acc.privateDicts[fd].ivs);
+  }
+
+  void fini ()
+  {
+    scalars.fini ();
+    SUPER::fini ();
+  }
+
+  op_code_t fetch_op ()
+  {
+    if (this->str_ref.avail ())
+      return SUPER::fetch_op ();
+
+    /* make up return or endchar op */
+    if (this->callStack.is_empty ())
+      return OpCode_endchar;
+    else
+      return OpCode_return;
+  }
+
+  const blend_arg_t& eval_arg (unsigned int i)
+  {
+    blend_arg_t  &arg = argStack[i];
+    blend_arg (arg);
+    return arg;
+  }
+
+  const blend_arg_t& pop_arg ()
+  {
+    blend_arg_t  &arg = argStack.pop ();
+    blend_arg (arg);
+    return arg;
+  }
+
+  void process_blend ()
+  {
+    if (!seen_blend)
+    {
+      region_count = varStore->varStore.get_region_index_count (get_ivs ());
+      if (do_blend)
+      {
+	scalars.resize (region_count);
+	varStore->varStore.get_scalars (get_ivs (),
+					(int *)coords, num_coords,
+					&scalars[0], region_count);
+      }
+      seen_blend = true;
+    }
+  }
+
+  void process_vsindex ()
+  {
+    unsigned int  index = argStack.pop_uint ();
+    if (unlikely (seen_vsindex () || seen_blend))
+    {
+      set_error ();
+    }
+    else
+    {
+      set_ivs (index);
+    }
+    seen_vsindex_ = true;
+  }
+
+  unsigned int get_region_count () const { return region_count; }
+  void	 set_region_count (unsigned int region_count_) { region_count = region_count_; }
+  unsigned int get_ivs () const { return ivs; }
+  void	 set_ivs (unsigned int ivs_) { ivs = ivs_; }
+  bool	 seen_vsindex () const { return seen_vsindex_; }
+
+  protected:
+  void blend_arg (blend_arg_t &arg)
+  {
+    if (do_blend && arg.blending ())
+    {
+      if (likely (scalars.length == arg.deltas.length))
+      {
+	double v = arg.to_real ();
+	for (unsigned int i = 0; i < scalars.length; i++)
+	{
+	  v += (double)scalars[i] * arg.deltas[i].to_real ();
+	}
+	arg.set_real (v);
+	arg.deltas.resize (0);
+      }
+    }
+  }
+
+  protected:
+  const int     *coords;
+  unsigned int  num_coords;
+  const	 CFF2VariationStore *varStore;
+  unsigned int  region_count;
+  unsigned int  ivs;
+  hb_vector_t<float>  scalars;
+  bool	  do_blend;
+  bool	  seen_vsindex_;
+  bool	  seen_blend;
+
+  typedef cs_interp_env_t<blend_arg_t, CFF2Subrs> SUPER;
+};
+template <typename OPSET, typename PARAM, typename PATH=path_procs_null_t<cff2_cs_interp_env_t, PARAM> >
+struct cff2_cs_opset_t : cs_opset_t<blend_arg_t, OPSET, cff2_cs_interp_env_t, PARAM, PATH>
+{
+  static void process_op (op_code_t op, cff2_cs_interp_env_t &env, PARAM& param)
+  {
+    switch (op) {
+      case OpCode_callsubr:
+      case OpCode_callgsubr:
+	/* a subroutine number shoudln't be a blended value */
+	if (unlikely (env.argStack.peek ().blending ()))
+	{
+	  env.set_error ();
+	  break;
+	}
+	SUPER::process_op (op, env, param);
+	break;
+
+      case OpCode_blendcs:
+	OPSET::process_blend (env, param);
+	break;
+
+      case OpCode_vsindexcs:
+	if (unlikely (env.argStack.peek ().blending ()))
+	{
+	  env.set_error ();
+	  break;
+	}
+	OPSET::process_vsindex (env, param);
+	break;
+
+      default:
+	SUPER::process_op (op, env, param);
+    }
+  }
+
+  static void process_blend (cff2_cs_interp_env_t &env, PARAM& param)
+  {
+    unsigned int n, k;
+
+    env.process_blend ();
+    k = env.get_region_count ();
+    n = env.argStack.pop_uint ();
+    /* copy the blend values into blend array of the default values */
+    unsigned int start = env.argStack.get_count () - ((k+1) * n);
+    /* let an obvious error case fail, but note CFF2 spec doesn't forbid n==0 */
+    if (unlikely (start > env.argStack.get_count ()))
+    {
+      env.set_error ();
+      return;
+    }
+    for (unsigned int i = 0; i < n; i++)
+    {
+      const hb_array_t<const blend_arg_t>	blends = env.argStack.get_subarray (start + n + (i * k));
+      env.argStack[start + i].set_blends (n, i, k, blends);
+    }
+
+    /* pop off blend values leaving default values now adorned with blend values */
+    env.argStack.pop (k * n);
+  }
+
+  static void process_vsindex (cff2_cs_interp_env_t &env, PARAM& param)
+  {
+    env.process_vsindex ();
+    env.clear_args ();
+  }
+
+  private:
+  typedef cs_opset_t<blend_arg_t, OPSET, cff2_cs_interp_env_t, PARAM, PATH>  SUPER;
+};
+
+template <typename OPSET, typename PARAM>
+struct cff2_cs_interpreter_t : cs_interpreter_t<cff2_cs_interp_env_t, OPSET, PARAM> {};
+
+} /* namespace CFF */
+
+#endif /* HB_CFF2_INTERP_CS_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-common.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-common.cc
new file mode 100644
index 0000000..93f5b79
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-common.cc
@@ -0,0 +1,1131 @@
+/*
+ * Copyright © 2009,2010  Red Hat, Inc.
+ * Copyright © 2011,2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#include "hb-machinery.hh"
+
+#include <locale.h>
+#ifdef HAVE_XLOCALE_H
+#include <xlocale.h>
+#endif
+
+
+/**
+ * SECTION:hb-common
+ * @title: hb-common
+ * @short_description: Common data types
+ * @include: hb.h
+ *
+ * Common data types used across HarfBuzz are defined here.
+ **/
+
+
+/* hb_options_t */
+
+hb_atomic_int_t _hb_options;
+
+void
+_hb_options_init ()
+{
+  hb_options_union_t u;
+  u.i = 0;
+  u.opts.initialized = true;
+
+  const char *c = getenv ("HB_OPTIONS");
+  if (c)
+  {
+    while (*c)
+    {
+      const char *p = strchr (c, ':');
+      if (!p)
+        p = c + strlen (c);
+
+#define OPTION(name, symbol) \
+	if (0 == strncmp (c, name, p - c) && strlen (name) == p - c) u.opts.symbol = true;
+
+      OPTION ("uniscribe-bug-compatible", uniscribe_bug_compatible);
+      OPTION ("aat", aat);
+
+#undef OPTION
+
+      c = *p ? p + 1 : p;
+    }
+
+  }
+
+  /* This is idempotent and threadsafe. */
+  _hb_options.set_relaxed (u.i);
+}
+
+
+/* hb_tag_t */
+
+/**
+ * hb_tag_from_string:
+ * @str: (array length=len) (element-type uint8_t):
+ * @len:
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_tag_t
+hb_tag_from_string (const char *str, int len)
+{
+  char tag[4];
+  unsigned int i;
+
+  if (!str || !len || !*str)
+    return HB_TAG_NONE;
+
+  if (len < 0 || len > 4)
+    len = 4;
+  for (i = 0; i < (unsigned) len && str[i]; i++)
+    tag[i] = str[i];
+  for (; i < 4; i++)
+    tag[i] = ' ';
+
+  return HB_TAG (tag[0], tag[1], tag[2], tag[3]);
+}
+
+/**
+ * hb_tag_to_string:
+ * @tag:
+ * @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)
+{
+  buf[0] = (char) (uint8_t) (tag >> 24);
+  buf[1] = (char) (uint8_t) (tag >> 16);
+  buf[2] = (char) (uint8_t) (tag >>  8);
+  buf[3] = (char) (uint8_t) (tag >>  0);
+}
+
+
+/* hb_direction_t */
+
+const char direction_strings[][4] = {
+  "ltr",
+  "rtl",
+  "ttb",
+  "btt"
+};
+
+/**
+ * hb_direction_from_string:
+ * @str: (array length=len) (element-type uint8_t):
+ * @len:
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_direction_t
+hb_direction_from_string (const char *str, int len)
+{
+  if (unlikely (!str || !len || !*str))
+    return HB_DIRECTION_INVALID;
+
+  /* Lets match loosely: just match the first letter, such that
+   * all of "ltr", "left-to-right", etc work!
+   */
+  char c = TOLOWER (str[0]);
+  for (unsigned int i = 0; i < ARRAY_LENGTH (direction_strings); i++)
+    if (c == direction_strings[i][0])
+      return (hb_direction_t) (HB_DIRECTION_LTR + i);
+
+  return HB_DIRECTION_INVALID;
+}
+
+/**
+ * hb_direction_to_string:
+ * @direction:
+ *
+ *
+ *
+ * Return value: (transfer none):
+ *
+ * Since: 0.9.2
+ **/
+const char *
+hb_direction_to_string (hb_direction_t direction)
+{
+  if (likely ((unsigned int) (direction - HB_DIRECTION_LTR)
+	      < ARRAY_LENGTH (direction_strings)))
+    return direction_strings[direction - HB_DIRECTION_LTR];
+
+  return "invalid";
+}
+
+
+/* hb_language_t */
+
+struct hb_language_impl_t {
+  const char s[1];
+};
+
+static const char canon_map[256] = {
+   0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,
+   0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,
+   0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,  '-',  0,   0,
+  '0', '1', '2', '3', '4', '5', '6', '7',  '8', '9',  0,   0,   0,   0,   0,   0,
+   0,  'a', 'b', 'c', 'd', 'e', 'f', 'g',  'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
+  'p', 'q', 'r', 's', 't', 'u', 'v', 'w',  'x', 'y', 'z',  0,   0,   0,   0,  '-',
+   0,  'a', 'b', 'c', 'd', 'e', 'f', 'g',  'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
+  'p', 'q', 'r', 's', 't', 'u', 'v', 'w',  'x', 'y', 'z',  0,   0,   0,   0,   0
+};
+
+static bool
+lang_equal (hb_language_t  v1,
+	    const void    *v2)
+{
+  const unsigned char *p1 = (const unsigned char *) v1;
+  const unsigned char *p2 = (const unsigned char *) v2;
+
+  while (*p1 && *p1 == canon_map[*p2]) {
+    p1++;
+    p2++;
+  }
+
+  return *p1 == canon_map[*p2];
+}
+
+#if 0
+static unsigned int
+lang_hash (const void *key)
+{
+  const unsigned char *p = key;
+  unsigned int h = 0;
+  while (canon_map[*p])
+    {
+      h = (h << 5) - h + canon_map[*p];
+      p++;
+    }
+
+  return h;
+}
+#endif
+
+
+struct hb_language_item_t {
+
+  struct hb_language_item_t *next;
+  hb_language_t lang;
+
+  bool operator == (const char *s) const
+  { return lang_equal (lang, s); }
+
+  hb_language_item_t & operator = (const char *s) {
+    /* If a custom allocated is used calling strdup() pairs
+    badly with a call to the custom free() in fini() below.
+    Therefore don't call strdup(), implement its behavior.
+    */
+    size_t len = strlen(s) + 1;
+    lang = (hb_language_t) malloc(len);
+    if (likely (lang))
+    {
+      memcpy((unsigned char *) lang, s, len);
+      for (unsigned char *p = (unsigned char *) lang; *p; p++)
+	*p = canon_map[*p];
+    }
+
+    return *this;
+  }
+
+  void fini () { free ((void *) lang); }
+};
+
+
+/* Thread-safe lock-free language list */
+
+static hb_atomic_ptr_t <hb_language_item_t> langs;
+
+#if HB_USE_ATEXIT
+static void
+free_langs ()
+{
+retry:
+  hb_language_item_t *first_lang = langs;
+  if (unlikely (!langs.cmpexch (first_lang, nullptr)))
+    goto retry;
+
+  while (first_lang) {
+    hb_language_item_t *next = first_lang->next;
+    first_lang->fini ();
+    free (first_lang);
+    first_lang = next;
+  }
+}
+#endif
+
+static hb_language_item_t *
+lang_find_or_insert (const char *key)
+{
+retry:
+  hb_language_item_t *first_lang = langs;
+
+  for (hb_language_item_t *lang = first_lang; lang; lang = lang->next)
+    if (*lang == key)
+      return lang;
+
+  /* Not found; allocate one. */
+  hb_language_item_t *lang = (hb_language_item_t *) calloc (1, sizeof (hb_language_item_t));
+  if (unlikely (!lang))
+    return nullptr;
+  lang->next = first_lang;
+  *lang = key;
+  if (unlikely (!lang->lang))
+  {
+    free (lang);
+    return nullptr;
+  }
+
+  if (unlikely (!langs.cmpexch (first_lang, lang)))
+  {
+    lang->fini ();
+    free (lang);
+    goto retry;
+  }
+
+#if HB_USE_ATEXIT
+  if (!first_lang)
+    atexit (free_langs); /* First person registers atexit() callback. */
+#endif
+
+  return lang;
+}
+
+
+/**
+ * hb_language_from_string:
+ * @str: (array length=len) (element-type uint8_t): a string representing
+ *       a BCP 47 language tag
+ * @len: length of the @str, or -1 if it is %NULL-terminated.
+ *
+ * Converts @str representing a BCP 47 language tag to the corresponding
+ * #hb_language_t.
+ *
+ * Return value: (transfer none):
+ * The #hb_language_t corresponding to the BCP 47 language tag.
+ *
+ * Since: 0.9.2
+ **/
+hb_language_t
+hb_language_from_string (const char *str, int len)
+{
+  if (!str || !len || !*str)
+    return HB_LANGUAGE_INVALID;
+
+  hb_language_item_t *item = nullptr;
+  if (len >= 0)
+  {
+    /* NUL-terminate it. */
+    char strbuf[64];
+    len = MIN (len, (int) sizeof (strbuf) - 1);
+    memcpy (strbuf, str, len);
+    strbuf[len] = '\0';
+    item = lang_find_or_insert (strbuf);
+  }
+  else
+    item = lang_find_or_insert (str);
+
+  return likely (item) ? item->lang : HB_LANGUAGE_INVALID;
+}
+
+/**
+ * hb_language_to_string:
+ * @language: an #hb_language_t to convert.
+ *
+ * See hb_language_from_string().
+ *
+ * Return value: (transfer none):
+ * A %NULL-terminated string representing the @language. Must not be freed by
+ * the caller.
+ *
+ * Since: 0.9.2
+ **/
+const char *
+hb_language_to_string (hb_language_t language)
+{
+  /* This is actually nullptr-safe! */
+  return language->s;
+}
+
+/**
+ * hb_language_get_default:
+ *
+ * Get default language from current locale.
+ *
+ * Note that the first time this function is called, it calls
+ * "setlocale (LC_CTYPE, nullptr)" to fetch current locale.  The underlying
+ * setlocale function is, in many implementations, NOT threadsafe.  To avoid
+ * problems, call this function once before multiple threads can call it.
+ * This function is only used from hb_buffer_guess_segment_properties() by
+ * HarfBuzz itself.
+ *
+ * Return value: (transfer none):
+ *
+ * Since: 0.9.2
+ **/
+hb_language_t
+hb_language_get_default ()
+{
+  static hb_atomic_ptr_t <hb_language_t> default_language;
+
+  hb_language_t language = default_language;
+  if (unlikely (language == HB_LANGUAGE_INVALID))
+  {
+    language = hb_language_from_string (setlocale (LC_CTYPE, nullptr), -1);
+    (void) default_language.cmpexch (HB_LANGUAGE_INVALID, language);
+  }
+
+  return language;
+}
+
+
+/* hb_script_t */
+
+/**
+ * hb_script_from_iso15924_tag:
+ * @tag: an #hb_tag_t representing an ISO 15924 tag.
+ *
+ * Converts an ISO 15924 script tag to a corresponding #hb_script_t.
+ *
+ * Return value:
+ * An #hb_script_t corresponding to the ISO 15924 tag.
+ *
+ * Since: 0.9.2
+ **/
+hb_script_t
+hb_script_from_iso15924_tag (hb_tag_t tag)
+{
+  if (unlikely (tag == HB_TAG_NONE))
+    return HB_SCRIPT_INVALID;
+
+  /* Be lenient, adjust case (one capital letter followed by three small letters) */
+  tag = (tag & 0xDFDFDFDFu) | 0x00202020u;
+
+  switch (tag) {
+
+    /* These graduated from the 'Q' private-area codes, but
+     * the old code is still aliased by Unicode, and the Qaai
+     * one in use by ICU. */
+    case HB_TAG('Q','a','a','i'): return HB_SCRIPT_INHERITED;
+    case HB_TAG('Q','a','a','c'): return HB_SCRIPT_COPTIC;
+
+    /* Script variants from https://unicode.org/iso15924/ */
+    case HB_TAG('C','y','r','s'): return HB_SCRIPT_CYRILLIC;
+    case HB_TAG('L','a','t','f'): return HB_SCRIPT_LATIN;
+    case HB_TAG('L','a','t','g'): return HB_SCRIPT_LATIN;
+    case HB_TAG('S','y','r','e'): return HB_SCRIPT_SYRIAC;
+    case HB_TAG('S','y','r','j'): return HB_SCRIPT_SYRIAC;
+    case HB_TAG('S','y','r','n'): return HB_SCRIPT_SYRIAC;
+  }
+
+  /* If it looks right, just use the tag as a script */
+  if (((uint32_t) tag & 0xE0E0E0E0u) == 0x40606060u)
+    return (hb_script_t) tag;
+
+  /* Otherwise, return unknown */
+  return HB_SCRIPT_UNKNOWN;
+}
+
+/**
+ * hb_script_from_string:
+ * @str: (array length=len) (element-type uint8_t): a string representing an
+ *       ISO 15924 tag.
+ * @len: length of the @str, or -1 if it is %NULL-terminated.
+ *
+ * Converts a string @str representing an ISO 15924 script tag to a
+ * corresponding #hb_script_t. Shorthand for hb_tag_from_string() then
+ * hb_script_from_iso15924_tag().
+ *
+ * Return value:
+ * An #hb_script_t corresponding to the ISO 15924 tag.
+ *
+ * Since: 0.9.2
+ **/
+hb_script_t
+hb_script_from_string (const char *str, int len)
+{
+  return hb_script_from_iso15924_tag (hb_tag_from_string (str, len));
+}
+
+/**
+ * hb_script_to_iso15924_tag:
+ * @script: an #hb_script_ to convert.
+ *
+ * See hb_script_from_iso15924_tag().
+ *
+ * Return value:
+ * An #hb_tag_t representing an ISO 15924 script tag.
+ *
+ * Since: 0.9.2
+ **/
+hb_tag_t
+hb_script_to_iso15924_tag (hb_script_t script)
+{
+  return (hb_tag_t) script;
+}
+
+/**
+ * hb_script_get_horizontal_direction:
+ * @script:
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_direction_t
+hb_script_get_horizontal_direction (hb_script_t script)
+{
+  /* https://docs.google.com/spreadsheets/d/1Y90M0Ie3MUJ6UVCRDOypOtijlMDLNNyyLk36T6iMu0o */
+  switch ((hb_tag_t) script)
+  {
+    /* Unicode-1.1 additions */
+    case HB_SCRIPT_ARABIC:
+    case HB_SCRIPT_HEBREW:
+
+    /* Unicode-3.0 additions */
+    case HB_SCRIPT_SYRIAC:
+    case HB_SCRIPT_THAANA:
+
+    /* Unicode-4.0 additions */
+    case HB_SCRIPT_CYPRIOT:
+
+    /* Unicode-4.1 additions */
+    case HB_SCRIPT_KHAROSHTHI:
+
+    /* Unicode-5.0 additions */
+    case HB_SCRIPT_PHOENICIAN:
+    case HB_SCRIPT_NKO:
+
+    /* Unicode-5.1 additions */
+    case HB_SCRIPT_LYDIAN:
+
+    /* Unicode-5.2 additions */
+    case HB_SCRIPT_AVESTAN:
+    case HB_SCRIPT_IMPERIAL_ARAMAIC:
+    case HB_SCRIPT_INSCRIPTIONAL_PAHLAVI:
+    case HB_SCRIPT_INSCRIPTIONAL_PARTHIAN:
+    case HB_SCRIPT_OLD_SOUTH_ARABIAN:
+    case HB_SCRIPT_OLD_TURKIC:
+    case HB_SCRIPT_SAMARITAN:
+
+    /* Unicode-6.0 additions */
+    case HB_SCRIPT_MANDAIC:
+
+    /* Unicode-6.1 additions */
+    case HB_SCRIPT_MEROITIC_CURSIVE:
+    case HB_SCRIPT_MEROITIC_HIEROGLYPHS:
+
+    /* Unicode-7.0 additions */
+    case HB_SCRIPT_MANICHAEAN:
+    case HB_SCRIPT_MENDE_KIKAKUI:
+    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_HATRAN:
+
+    /* Unicode-9.0 additions */
+    case HB_SCRIPT_ADLAM:
+
+    /* Unicode-11.0 additions */
+    case HB_SCRIPT_HANIFI_ROHINGYA:
+    case HB_SCRIPT_OLD_SOGDIAN:
+    case HB_SCRIPT_SOGDIAN:
+
+      return HB_DIRECTION_RTL;
+
+
+    /* https://github.com/harfbuzz/harfbuzz/issues/1000 */
+    case HB_SCRIPT_OLD_HUNGARIAN:
+    case HB_SCRIPT_OLD_ITALIC:
+    case HB_SCRIPT_RUNIC:
+
+      return HB_DIRECTION_INVALID;
+  }
+
+  return HB_DIRECTION_LTR;
+}
+
+
+/* hb_user_data_array_t */
+
+bool
+hb_user_data_array_t::set (hb_user_data_key_t *key,
+			   void *              data,
+			   hb_destroy_func_t   destroy,
+			   hb_bool_t           replace)
+{
+  if (!key)
+    return false;
+
+  if (replace) {
+    if (!data && !destroy) {
+      items.remove (key, lock);
+      return true;
+    }
+  }
+  hb_user_data_item_t item = {key, data, destroy};
+  bool ret = !!items.replace_or_insert (item, lock, (bool) replace);
+
+  return ret;
+}
+
+void *
+hb_user_data_array_t::get (hb_user_data_key_t *key)
+{
+  hb_user_data_item_t item = {nullptr, nullptr, nullptr};
+
+  return items.find (key, &item, lock) ? item.data : nullptr;
+}
+
+
+/* hb_version */
+
+
+/**
+ * SECTION:hb-version
+ * @title: hb-version
+ * @short_description: Information about the version of HarfBuzz in use
+ * @include: hb.h
+ *
+ * These functions and macros allow accessing version of the HarfBuzz
+ * library used at compile- as well as run-time, and to direct code
+ * conditionally based on those versions, again, at compile- or run-time.
+ **/
+
+
+/**
+ * hb_version:
+ * @major: (out): Library major version component.
+ * @minor: (out): Library minor version component.
+ * @micro: (out): Library micro version component.
+ *
+ * Returns library version as three integer components.
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_version (unsigned int *major,
+	    unsigned int *minor,
+	    unsigned int *micro)
+{
+  *major = HB_VERSION_MAJOR;
+  *minor = HB_VERSION_MINOR;
+  *micro = HB_VERSION_MICRO;
+}
+
+/**
+ * hb_version_string:
+ *
+ * Returns library version as a string with three components.
+ *
+ * Return value: library version string.
+ *
+ * Since: 0.9.2
+ **/
+const char *
+hb_version_string ()
+{
+  return HB_VERSION_STRING;
+}
+
+/**
+ * hb_version_atleast:
+ * @major:
+ * @minor:
+ * @micro:
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.30
+ **/
+hb_bool_t
+hb_version_atleast (unsigned int major,
+		    unsigned int minor,
+		    unsigned int micro)
+{
+  return HB_VERSION_ATLEAST (major, minor, micro);
+}
+
+
+
+/* hb_feature_t and hb_variation_t */
+
+static bool
+parse_space (const char **pp, const char *end)
+{
+  while (*pp < end && ISSPACE (**pp))
+    (*pp)++;
+  return true;
+}
+
+static bool
+parse_char (const char **pp, const char *end, char c)
+{
+  parse_space (pp, end);
+
+  if (*pp == end || **pp != c)
+    return false;
+
+  (*pp)++;
+  return true;
+}
+
+static bool
+parse_uint (const char **pp, const char *end, unsigned int *pv)
+{
+  char buf[32];
+  unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp));
+  strncpy (buf, *pp, len);
+  buf[len] = '\0';
+
+  char *p = buf;
+  char *pend = p;
+  unsigned int v;
+
+  /* Intentionally use strtol instead of strtoul, such that
+   * -1 turns into "big number"... */
+  errno = 0;
+  v = strtol (p, &pend, 0);
+  if (errno || p == pend)
+    return false;
+
+  *pv = v;
+  *pp += pend - p;
+  return true;
+}
+
+static bool
+parse_uint32 (const char **pp, const char *end, uint32_t *pv)
+{
+  char buf[32];
+  unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp));
+  strncpy (buf, *pp, len);
+  buf[len] = '\0';
+
+  char *p = buf;
+  char *pend = p;
+  unsigned int v;
+
+  /* Intentionally use strtol instead of strtoul, such that
+   * -1 turns into "big number"... */
+  errno = 0;
+  v = strtol (p, &pend, 0);
+  if (errno || p == pend)
+    return false;
+
+  *pv = v;
+  *pp += pend - p;
+  return true;
+}
+
+#if defined (HAVE_NEWLOCALE) && defined (HAVE_STRTOD_L)
+#define USE_XLOCALE 1
+#define HB_LOCALE_T locale_t
+#define HB_CREATE_LOCALE(locName) newlocale (LC_ALL_MASK, locName, nullptr)
+#define HB_FREE_LOCALE(loc) freelocale (loc)
+#elif defined(_MSC_VER)
+#define USE_XLOCALE 1
+#define HB_LOCALE_T _locale_t
+#define HB_CREATE_LOCALE(locName) _create_locale (LC_ALL, locName)
+#define HB_FREE_LOCALE(loc) _free_locale (loc)
+#define strtod_l(a, b, c) _strtod_l ((a), (b), (c))
+#endif
+
+#ifdef USE_XLOCALE
+
+#if HB_USE_ATEXIT
+static void free_static_C_locale ();
+#endif
+
+static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer (HB_LOCALE_T),
+							  hb_C_locale_lazy_loader_t>
+{
+  static HB_LOCALE_T create ()
+  {
+    HB_LOCALE_T C_locale = HB_CREATE_LOCALE ("C");
+
+#if HB_USE_ATEXIT
+    atexit (free_static_C_locale);
+#endif
+
+    return C_locale;
+  }
+  static void destroy (HB_LOCALE_T p)
+  {
+    HB_FREE_LOCALE (p);
+  }
+  static HB_LOCALE_T get_null ()
+  {
+    return nullptr;
+  }
+} static_C_locale;
+
+#if HB_USE_ATEXIT
+static
+void free_static_C_locale ()
+{
+  static_C_locale.free_instance ();
+}
+#endif
+
+static HB_LOCALE_T
+get_C_locale ()
+{
+  return static_C_locale.get_unconst ();
+}
+#endif /* USE_XLOCALE */
+
+static bool
+parse_float (const char **pp, const char *end, float *pv)
+{
+  char buf[32];
+  unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp));
+  strncpy (buf, *pp, len);
+  buf[len] = '\0';
+
+  char *p = buf;
+  char *pend = p;
+  float v;
+
+  errno = 0;
+#ifdef USE_XLOCALE
+  v = strtod_l (p, &pend, get_C_locale ());
+#else
+  v = strtod (p, &pend);
+#endif
+  if (errno || p == pend)
+    return false;
+
+  *pv = v;
+  *pp += pend - p;
+  return true;
+}
+
+static bool
+parse_bool (const char **pp, const char *end, uint32_t *pv)
+{
+  parse_space (pp, end);
+
+  const char *p = *pp;
+  while (*pp < end && ISALPHA(**pp))
+    (*pp)++;
+
+  /* CSS allows on/off as aliases 1/0. */
+  if (*pp - p == 2 && 0 == strncmp (p, "on", 2))
+    *pv = 1;
+  else if (*pp - p == 3 && 0 == strncmp (p, "off", 3))
+    *pv = 0;
+  else
+    return false;
+
+  return true;
+}
+
+/* hb_feature_t */
+
+static bool
+parse_feature_value_prefix (const char **pp, const char *end, hb_feature_t *feature)
+{
+  if (parse_char (pp, end, '-'))
+    feature->value = 0;
+  else {
+    parse_char (pp, end, '+');
+    feature->value = 1;
+  }
+
+  return true;
+}
+
+static bool
+parse_tag (const char **pp, const char *end, hb_tag_t *tag)
+{
+  parse_space (pp, end);
+
+  char quote = 0;
+
+  if (*pp < end && (**pp == '\'' || **pp == '"'))
+  {
+    quote = **pp;
+    (*pp)++;
+  }
+
+  const char *p = *pp;
+  while (*pp < end && (ISALNUM(**pp) || **pp == '_'))
+    (*pp)++;
+
+  if (p == *pp || *pp - p > 4)
+    return false;
+
+  *tag = hb_tag_from_string (p, *pp - p);
+
+  if (quote)
+  {
+    /* CSS expects exactly four bytes.  And we only allow quotations for
+     * CSS compatibility.  So, enforce the length. */
+     if (*pp - p != 4)
+       return false;
+    if (*pp == end || **pp != quote)
+      return false;
+    (*pp)++;
+  }
+
+  return true;
+}
+
+static bool
+parse_feature_indices (const char **pp, const char *end, hb_feature_t *feature)
+{
+  parse_space (pp, end);
+
+  bool has_start;
+
+  feature->start = HB_FEATURE_GLOBAL_START;
+  feature->end = HB_FEATURE_GLOBAL_END;
+
+  if (!parse_char (pp, end, '['))
+    return true;
+
+  has_start = parse_uint (pp, end, &feature->start);
+
+  if (parse_char (pp, end, ':') || parse_char (pp, end, ';')) {
+    parse_uint (pp, end, &feature->end);
+  } else {
+    if (has_start)
+      feature->end = feature->start + 1;
+  }
+
+  return parse_char (pp, end, ']');
+}
+
+static bool
+parse_feature_value_postfix (const char **pp, const char *end, hb_feature_t *feature)
+{
+  bool had_equal = parse_char (pp, end, '=');
+  bool had_value = parse_uint32 (pp, end, &feature->value) ||
+                   parse_bool (pp, end, &feature->value);
+  /* CSS doesn't use equal-sign between tag and value.
+   * If there was an equal-sign, then there *must* be a value.
+   * A value without an equal-sign is ok, but not required. */
+  return !had_equal || had_value;
+}
+
+static bool
+parse_one_feature (const char **pp, const char *end, hb_feature_t *feature)
+{
+  return parse_feature_value_prefix (pp, end, feature) &&
+	 parse_tag (pp, end, &feature->tag) &&
+	 parse_feature_indices (pp, end, feature) &&
+	 parse_feature_value_postfix (pp, end, feature) &&
+	 parse_space (pp, end) &&
+	 *pp == end;
+}
+
+/**
+ * hb_feature_from_string:
+ * @str: (array length=len) (element-type uint8_t): a string to parse
+ * @len: length of @str, or -1 if string is %NULL terminated
+ * @feature: (out): the #hb_feature_t to initialize with the parsed values
+ *
+ * Parses a string into a #hb_feature_t.
+ *
+ * TODO: document the syntax here.
+ *
+ * Return value:
+ * %true if @str is successfully parsed, %false otherwise.
+ *
+ * Since: 0.9.5
+ **/
+hb_bool_t
+hb_feature_from_string (const char *str, int len,
+			hb_feature_t *feature)
+{
+  hb_feature_t feat;
+
+  if (len < 0)
+    len = strlen (str);
+
+  if (likely (parse_one_feature (&str, str + len, &feat)))
+  {
+    if (feature)
+      *feature = feat;
+    return true;
+  }
+
+  if (feature)
+    memset (feature, 0, sizeof (*feature));
+  return false;
+}
+
+/**
+ * hb_feature_to_string:
+ * @feature: an #hb_feature_t to convert
+ * @buf: (array length=size) (out): output string
+ * @size: the allocated size of @buf
+ *
+ * Converts a #hb_feature_t into a %NULL-terminated string in the format
+ * understood by hb_feature_from_string(). The client in responsible for
+ * allocating big enough size for @buf, 128 bytes is more than enough.
+ *
+ * Since: 0.9.5
+ **/
+void
+hb_feature_to_string (hb_feature_t *feature,
+		      char *buf, unsigned int size)
+{
+  if (unlikely (!size)) return;
+
+  char s[128];
+  unsigned int len = 0;
+  if (feature->value == 0)
+    s[len++] = '-';
+  hb_tag_to_string (feature->tag, s + len);
+  len += 4;
+  while (len && s[len - 1] == ' ')
+    len--;
+  if (feature->start != 0 || feature->end != (unsigned int) -1)
+  {
+    s[len++] = '[';
+    if (feature->start)
+      len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->start));
+    if (feature->end != feature->start + 1) {
+      s[len++] = ':';
+      if (feature->end != (unsigned int) -1)
+	len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->end));
+    }
+    s[len++] = ']';
+  }
+  if (feature->value > 1)
+  {
+    s[len++] = '=';
+    len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->value));
+  }
+  assert (len < ARRAY_LENGTH (s));
+  len = MIN (len, size - 1);
+  memcpy (buf, s, len);
+  buf[len] = '\0';
+}
+
+/* hb_variation_t */
+
+static bool
+parse_variation_value (const char **pp, const char *end, hb_variation_t *variation)
+{
+  parse_char (pp, end, '='); /* Optional. */
+  return parse_float (pp, end, &variation->value);
+}
+
+static bool
+parse_one_variation (const char **pp, const char *end, hb_variation_t *variation)
+{
+  return parse_tag (pp, end, &variation->tag) &&
+	 parse_variation_value (pp, end, variation) &&
+	 parse_space (pp, end) &&
+	 *pp == end;
+}
+
+/**
+ * hb_variation_from_string:
+ *
+ * Since: 1.4.2
+ */
+hb_bool_t
+hb_variation_from_string (const char *str, int len,
+			  hb_variation_t *variation)
+{
+  hb_variation_t var;
+
+  if (len < 0)
+    len = strlen (str);
+
+  if (likely (parse_one_variation (&str, str + len, &var)))
+  {
+    if (variation)
+      *variation = var;
+    return true;
+  }
+
+  if (variation)
+    memset (variation, 0, sizeof (*variation));
+  return false;
+}
+
+/**
+ * hb_variation_to_string:
+ *
+ * Since: 1.4.2
+ */
+void
+hb_variation_to_string (hb_variation_t *variation,
+			char *buf, unsigned int size)
+{
+  if (unlikely (!size)) return;
+
+  char s[128];
+  unsigned int len = 0;
+  hb_tag_to_string (variation->tag, s + len);
+  len += 4;
+  while (len && s[len - 1] == ' ')
+    len--;
+  s[len++] = '=';
+  len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%g", (double) variation->value));
+
+  assert (len < ARRAY_LENGTH (s));
+  len = MIN (len, size - 1);
+  memcpy (buf, s, len);
+  buf[len] = '\0';
+}
+
+/* If there is no visibility control, then hb-static.cc will NOT
+ * define anything.  Instead, we get it to define one set in here
+ * only, so only libharfbuzz.so defines them, not other libs. */
+#ifdef HB_NO_VISIBILITY
+#undef HB_NO_VISIBILITY
+#include "hb-static.cc"
+#define HB_NO_VISIBILITY 1
+#endif
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-common.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-common.h
new file mode 100644
index 0000000..2b29e44
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-common.h
@@ -0,0 +1,498 @@
+/*
+ * Copyright © 2007,2008,2009  Red Hat, Inc.
+ * Copyright © 2011,2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_COMMON_H
+#define HB_COMMON_H
+
+#ifndef HB_EXTERN
+#define HB_EXTERN extern
+#endif
+
+#ifndef HB_BEGIN_DECLS
+# ifdef __cplusplus
+#  define HB_BEGIN_DECLS	extern "C" {
+#  define HB_END_DECLS		}
+# else /* !__cplusplus */
+#  define HB_BEGIN_DECLS
+#  define HB_END_DECLS
+# endif /* !__cplusplus */
+#endif
+
+#if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || \
+    defined (_sgi) || defined (__sun) || defined (sun) || \
+    defined (__digital__) || defined (__HP_cc)
+#  include <inttypes.h>
+#elif defined (_AIX)
+#  include <sys/inttypes.h>
+#elif defined (_MSC_VER) && _MSC_VER < 1600
+/* VS 2010 (_MSC_VER 1600) has stdint.h */
+typedef __int8 int8_t;
+typedef unsigned __int8 uint8_t;
+typedef __int16 int16_t;
+typedef unsigned __int16 uint16_t;
+typedef __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+#else
+#  include <stdint.h>
+#endif
+
+#if defined(__GNUC__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
+#define HB_DEPRECATED __attribute__((__deprecated__))
+#elif defined(_MSC_VER) && (_MSC_VER >= 1300)
+#define HB_DEPRECATED __declspec(deprecated)
+#else
+#define HB_DEPRECATED
+#endif
+
+#if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
+#define HB_DEPRECATED_FOR(f) __attribute__((__deprecated__("Use '" #f "' instead")))
+#elif defined(_MSC_FULL_VER) && (_MSC_FULL_VER > 140050320)
+#define HB_DEPRECATED_FOR(f) __declspec(deprecated("is deprecated. Use '" #f "' instead"))
+#else
+#define HB_DEPRECATED_FOR(f) HB_DEPRECATED
+#endif
+
+
+HB_BEGIN_DECLS
+
+
+typedef int hb_bool_t;
+
+typedef uint32_t hb_codepoint_t;
+typedef int32_t hb_position_t;
+typedef uint32_t hb_mask_t;
+
+typedef union _hb_var_int_t {
+  uint32_t u32;
+  int32_t i32;
+  uint16_t u16[2];
+  int16_t i16[2];
+  uint8_t u8[4];
+  int8_t i8[4];
+} hb_var_int_t;
+
+
+/* hb_tag_t */
+
+typedef uint32_t hb_tag_t;
+
+#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
+#define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
+
+#define HB_TAG_NONE HB_TAG(0,0,0,0)
+#define HB_TAG_MAX HB_TAG(0xff,0xff,0xff,0xff)
+#define HB_TAG_MAX_SIGNED HB_TAG(0x7f,0xff,0xff,0xff)
+
+/* len=-1 means str is NUL-terminated. */
+HB_EXTERN hb_tag_t
+hb_tag_from_string (const char *str, int len);
+
+/* buf should have 4 bytes. */
+HB_EXTERN void
+hb_tag_to_string (hb_tag_t tag, char *buf);
+
+
+/**
+ * hb_direction_t:
+ * @HB_DIRECTION_INVALID: Initial, unset direction.
+ * @HB_DIRECTION_LTR: Text is set horizontally from left to right.
+ * @HB_DIRECTION_RTL: Text is set horizontally from right to left.
+ * @HB_DIRECTION_TTB: Text is set vertically from top to bottom.
+ * @HB_DIRECTION_BTT: Text is set vertically from bottom to top.
+ */
+typedef enum {
+  HB_DIRECTION_INVALID = 0,
+  HB_DIRECTION_LTR = 4,
+  HB_DIRECTION_RTL,
+  HB_DIRECTION_TTB,
+  HB_DIRECTION_BTT
+} hb_direction_t;
+
+/* len=-1 means str is NUL-terminated */
+HB_EXTERN hb_direction_t
+hb_direction_from_string (const char *str, int len);
+
+HB_EXTERN const char *
+hb_direction_to_string (hb_direction_t direction);
+
+#define HB_DIRECTION_IS_VALID(dir)	((((unsigned int) (dir)) & ~3U) == 4)
+/* Direction must be valid for the following */
+#define HB_DIRECTION_IS_HORIZONTAL(dir)	((((unsigned int) (dir)) & ~1U) == 4)
+#define HB_DIRECTION_IS_VERTICAL(dir)	((((unsigned int) (dir)) & ~1U) == 6)
+#define HB_DIRECTION_IS_FORWARD(dir)	((((unsigned int) (dir)) & ~2U) == 4)
+#define HB_DIRECTION_IS_BACKWARD(dir)	((((unsigned int) (dir)) & ~2U) == 5)
+#define HB_DIRECTION_REVERSE(dir)	((hb_direction_t) (((unsigned int) (dir)) ^ 1))
+
+
+/* hb_language_t */
+
+typedef const struct hb_language_impl_t *hb_language_t;
+
+HB_EXTERN hb_language_t
+hb_language_from_string (const char *str, int len);
+
+HB_EXTERN const char *
+hb_language_to_string (hb_language_t language);
+
+#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
+
+HB_EXTERN hb_language_t
+hb_language_get_default (void);
+
+
+/* hb_script_t */
+
+/* https://unicode.org/iso15924/ */
+/* https://docs.google.com/spreadsheets/d/1Y90M0Ie3MUJ6UVCRDOypOtijlMDLNNyyLk36T6iMu0o */
+/* Unicode Character Database property: Script (sc) */
+typedef enum
+{
+  /*1.1*/ HB_SCRIPT_COMMON			= HB_TAG ('Z','y','y','y'),
+  /*1.1*/ HB_SCRIPT_INHERITED			= HB_TAG ('Z','i','n','h'),
+  /*5.0*/ HB_SCRIPT_UNKNOWN			= HB_TAG ('Z','z','z','z'),
+
+  /*1.1*/ HB_SCRIPT_ARABIC			= HB_TAG ('A','r','a','b'),
+  /*1.1*/ HB_SCRIPT_ARMENIAN			= HB_TAG ('A','r','m','n'),
+  /*1.1*/ HB_SCRIPT_BENGALI			= HB_TAG ('B','e','n','g'),
+  /*1.1*/ HB_SCRIPT_CYRILLIC			= HB_TAG ('C','y','r','l'),
+  /*1.1*/ HB_SCRIPT_DEVANAGARI			= HB_TAG ('D','e','v','a'),
+  /*1.1*/ HB_SCRIPT_GEORGIAN			= HB_TAG ('G','e','o','r'),
+  /*1.1*/ HB_SCRIPT_GREEK			= HB_TAG ('G','r','e','k'),
+  /*1.1*/ HB_SCRIPT_GUJARATI			= HB_TAG ('G','u','j','r'),
+  /*1.1*/ HB_SCRIPT_GURMUKHI			= HB_TAG ('G','u','r','u'),
+  /*1.1*/ HB_SCRIPT_HANGUL			= HB_TAG ('H','a','n','g'),
+  /*1.1*/ HB_SCRIPT_HAN				= HB_TAG ('H','a','n','i'),
+  /*1.1*/ HB_SCRIPT_HEBREW			= HB_TAG ('H','e','b','r'),
+  /*1.1*/ HB_SCRIPT_HIRAGANA			= HB_TAG ('H','i','r','a'),
+  /*1.1*/ HB_SCRIPT_KANNADA			= HB_TAG ('K','n','d','a'),
+  /*1.1*/ HB_SCRIPT_KATAKANA			= HB_TAG ('K','a','n','a'),
+  /*1.1*/ HB_SCRIPT_LAO				= HB_TAG ('L','a','o','o'),
+  /*1.1*/ HB_SCRIPT_LATIN			= HB_TAG ('L','a','t','n'),
+  /*1.1*/ HB_SCRIPT_MALAYALAM			= HB_TAG ('M','l','y','m'),
+  /*1.1*/ HB_SCRIPT_ORIYA			= HB_TAG ('O','r','y','a'),
+  /*1.1*/ HB_SCRIPT_TAMIL			= HB_TAG ('T','a','m','l'),
+  /*1.1*/ HB_SCRIPT_TELUGU			= HB_TAG ('T','e','l','u'),
+  /*1.1*/ HB_SCRIPT_THAI			= HB_TAG ('T','h','a','i'),
+
+  /*2.0*/ HB_SCRIPT_TIBETAN			= HB_TAG ('T','i','b','t'),
+
+  /*3.0*/ HB_SCRIPT_BOPOMOFO			= HB_TAG ('B','o','p','o'),
+  /*3.0*/ HB_SCRIPT_BRAILLE			= HB_TAG ('B','r','a','i'),
+  /*3.0*/ HB_SCRIPT_CANADIAN_SYLLABICS		= HB_TAG ('C','a','n','s'),
+  /*3.0*/ HB_SCRIPT_CHEROKEE			= HB_TAG ('C','h','e','r'),
+  /*3.0*/ HB_SCRIPT_ETHIOPIC			= HB_TAG ('E','t','h','i'),
+  /*3.0*/ HB_SCRIPT_KHMER			= HB_TAG ('K','h','m','r'),
+  /*3.0*/ HB_SCRIPT_MONGOLIAN			= HB_TAG ('M','o','n','g'),
+  /*3.0*/ HB_SCRIPT_MYANMAR			= HB_TAG ('M','y','m','r'),
+  /*3.0*/ HB_SCRIPT_OGHAM			= HB_TAG ('O','g','a','m'),
+  /*3.0*/ HB_SCRIPT_RUNIC			= HB_TAG ('R','u','n','r'),
+  /*3.0*/ HB_SCRIPT_SINHALA			= HB_TAG ('S','i','n','h'),
+  /*3.0*/ HB_SCRIPT_SYRIAC			= HB_TAG ('S','y','r','c'),
+  /*3.0*/ HB_SCRIPT_THAANA			= HB_TAG ('T','h','a','a'),
+  /*3.0*/ HB_SCRIPT_YI				= HB_TAG ('Y','i','i','i'),
+
+  /*3.1*/ HB_SCRIPT_DESERET			= HB_TAG ('D','s','r','t'),
+  /*3.1*/ HB_SCRIPT_GOTHIC			= HB_TAG ('G','o','t','h'),
+  /*3.1*/ HB_SCRIPT_OLD_ITALIC			= HB_TAG ('I','t','a','l'),
+
+  /*3.2*/ HB_SCRIPT_BUHID			= HB_TAG ('B','u','h','d'),
+  /*3.2*/ HB_SCRIPT_HANUNOO			= HB_TAG ('H','a','n','o'),
+  /*3.2*/ HB_SCRIPT_TAGALOG			= HB_TAG ('T','g','l','g'),
+  /*3.2*/ HB_SCRIPT_TAGBANWA			= HB_TAG ('T','a','g','b'),
+
+  /*4.0*/ HB_SCRIPT_CYPRIOT			= HB_TAG ('C','p','r','t'),
+  /*4.0*/ HB_SCRIPT_LIMBU			= HB_TAG ('L','i','m','b'),
+  /*4.0*/ HB_SCRIPT_LINEAR_B			= HB_TAG ('L','i','n','b'),
+  /*4.0*/ HB_SCRIPT_OSMANYA			= HB_TAG ('O','s','m','a'),
+  /*4.0*/ HB_SCRIPT_SHAVIAN			= HB_TAG ('S','h','a','w'),
+  /*4.0*/ HB_SCRIPT_TAI_LE			= HB_TAG ('T','a','l','e'),
+  /*4.0*/ HB_SCRIPT_UGARITIC			= HB_TAG ('U','g','a','r'),
+
+  /*4.1*/ HB_SCRIPT_BUGINESE			= HB_TAG ('B','u','g','i'),
+  /*4.1*/ HB_SCRIPT_COPTIC			= HB_TAG ('C','o','p','t'),
+  /*4.1*/ HB_SCRIPT_GLAGOLITIC			= HB_TAG ('G','l','a','g'),
+  /*4.1*/ HB_SCRIPT_KHAROSHTHI			= HB_TAG ('K','h','a','r'),
+  /*4.1*/ HB_SCRIPT_NEW_TAI_LUE			= HB_TAG ('T','a','l','u'),
+  /*4.1*/ HB_SCRIPT_OLD_PERSIAN			= HB_TAG ('X','p','e','o'),
+  /*4.1*/ HB_SCRIPT_SYLOTI_NAGRI		= HB_TAG ('S','y','l','o'),
+  /*4.1*/ HB_SCRIPT_TIFINAGH			= HB_TAG ('T','f','n','g'),
+
+  /*5.0*/ HB_SCRIPT_BALINESE			= HB_TAG ('B','a','l','i'),
+  /*5.0*/ HB_SCRIPT_CUNEIFORM			= HB_TAG ('X','s','u','x'),
+  /*5.0*/ HB_SCRIPT_NKO				= HB_TAG ('N','k','o','o'),
+  /*5.0*/ HB_SCRIPT_PHAGS_PA			= HB_TAG ('P','h','a','g'),
+  /*5.0*/ HB_SCRIPT_PHOENICIAN			= HB_TAG ('P','h','n','x'),
+
+  /*5.1*/ HB_SCRIPT_CARIAN			= HB_TAG ('C','a','r','i'),
+  /*5.1*/ HB_SCRIPT_CHAM			= HB_TAG ('C','h','a','m'),
+  /*5.1*/ HB_SCRIPT_KAYAH_LI			= HB_TAG ('K','a','l','i'),
+  /*5.1*/ HB_SCRIPT_LEPCHA			= HB_TAG ('L','e','p','c'),
+  /*5.1*/ HB_SCRIPT_LYCIAN			= HB_TAG ('L','y','c','i'),
+  /*5.1*/ HB_SCRIPT_LYDIAN			= HB_TAG ('L','y','d','i'),
+  /*5.1*/ HB_SCRIPT_OL_CHIKI			= HB_TAG ('O','l','c','k'),
+  /*5.1*/ HB_SCRIPT_REJANG			= HB_TAG ('R','j','n','g'),
+  /*5.1*/ HB_SCRIPT_SAURASHTRA			= HB_TAG ('S','a','u','r'),
+  /*5.1*/ HB_SCRIPT_SUNDANESE			= HB_TAG ('S','u','n','d'),
+  /*5.1*/ HB_SCRIPT_VAI				= HB_TAG ('V','a','i','i'),
+
+  /*5.2*/ HB_SCRIPT_AVESTAN			= HB_TAG ('A','v','s','t'),
+  /*5.2*/ HB_SCRIPT_BAMUM			= HB_TAG ('B','a','m','u'),
+  /*5.2*/ HB_SCRIPT_EGYPTIAN_HIEROGLYPHS	= HB_TAG ('E','g','y','p'),
+  /*5.2*/ HB_SCRIPT_IMPERIAL_ARAMAIC		= HB_TAG ('A','r','m','i'),
+  /*5.2*/ HB_SCRIPT_INSCRIPTIONAL_PAHLAVI	= HB_TAG ('P','h','l','i'),
+  /*5.2*/ HB_SCRIPT_INSCRIPTIONAL_PARTHIAN	= HB_TAG ('P','r','t','i'),
+  /*5.2*/ HB_SCRIPT_JAVANESE			= HB_TAG ('J','a','v','a'),
+  /*5.2*/ HB_SCRIPT_KAITHI			= HB_TAG ('K','t','h','i'),
+  /*5.2*/ HB_SCRIPT_LISU			= HB_TAG ('L','i','s','u'),
+  /*5.2*/ HB_SCRIPT_MEETEI_MAYEK		= HB_TAG ('M','t','e','i'),
+  /*5.2*/ HB_SCRIPT_OLD_SOUTH_ARABIAN		= HB_TAG ('S','a','r','b'),
+  /*5.2*/ HB_SCRIPT_OLD_TURKIC			= HB_TAG ('O','r','k','h'),
+  /*5.2*/ HB_SCRIPT_SAMARITAN			= HB_TAG ('S','a','m','r'),
+  /*5.2*/ HB_SCRIPT_TAI_THAM			= HB_TAG ('L','a','n','a'),
+  /*5.2*/ HB_SCRIPT_TAI_VIET			= HB_TAG ('T','a','v','t'),
+
+  /*6.0*/ HB_SCRIPT_BATAK			= HB_TAG ('B','a','t','k'),
+  /*6.0*/ HB_SCRIPT_BRAHMI			= HB_TAG ('B','r','a','h'),
+  /*6.0*/ HB_SCRIPT_MANDAIC			= HB_TAG ('M','a','n','d'),
+
+  /*6.1*/ HB_SCRIPT_CHAKMA			= HB_TAG ('C','a','k','m'),
+  /*6.1*/ HB_SCRIPT_MEROITIC_CURSIVE		= HB_TAG ('M','e','r','c'),
+  /*6.1*/ HB_SCRIPT_MEROITIC_HIEROGLYPHS	= HB_TAG ('M','e','r','o'),
+  /*6.1*/ HB_SCRIPT_MIAO			= HB_TAG ('P','l','r','d'),
+  /*6.1*/ HB_SCRIPT_SHARADA			= HB_TAG ('S','h','r','d'),
+  /*6.1*/ HB_SCRIPT_SORA_SOMPENG		= HB_TAG ('S','o','r','a'),
+  /*6.1*/ HB_SCRIPT_TAKRI			= HB_TAG ('T','a','k','r'),
+
+  /*
+   * Since: 0.9.30
+   */
+  /*7.0*/ HB_SCRIPT_BASSA_VAH			= HB_TAG ('B','a','s','s'),
+  /*7.0*/ HB_SCRIPT_CAUCASIAN_ALBANIAN		= HB_TAG ('A','g','h','b'),
+  /*7.0*/ HB_SCRIPT_DUPLOYAN			= HB_TAG ('D','u','p','l'),
+  /*7.0*/ HB_SCRIPT_ELBASAN			= HB_TAG ('E','l','b','a'),
+  /*7.0*/ HB_SCRIPT_GRANTHA			= HB_TAG ('G','r','a','n'),
+  /*7.0*/ HB_SCRIPT_KHOJKI			= HB_TAG ('K','h','o','j'),
+  /*7.0*/ HB_SCRIPT_KHUDAWADI			= HB_TAG ('S','i','n','d'),
+  /*7.0*/ HB_SCRIPT_LINEAR_A			= HB_TAG ('L','i','n','a'),
+  /*7.0*/ HB_SCRIPT_MAHAJANI			= HB_TAG ('M','a','h','j'),
+  /*7.0*/ HB_SCRIPT_MANICHAEAN			= HB_TAG ('M','a','n','i'),
+  /*7.0*/ HB_SCRIPT_MENDE_KIKAKUI		= HB_TAG ('M','e','n','d'),
+  /*7.0*/ HB_SCRIPT_MODI			= HB_TAG ('M','o','d','i'),
+  /*7.0*/ HB_SCRIPT_MRO				= HB_TAG ('M','r','o','o'),
+  /*7.0*/ HB_SCRIPT_NABATAEAN			= HB_TAG ('N','b','a','t'),
+  /*7.0*/ HB_SCRIPT_OLD_NORTH_ARABIAN		= HB_TAG ('N','a','r','b'),
+  /*7.0*/ HB_SCRIPT_OLD_PERMIC			= HB_TAG ('P','e','r','m'),
+  /*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'),
+
+  /*
+   * 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'),
+
+  /*
+   * Since 1.6.0
+   */
+  /*10.0*/HB_SCRIPT_MASARAM_GONDI		= HB_TAG ('G','o','n','m'),
+  /*10.0*/HB_SCRIPT_NUSHU			= HB_TAG ('N','s','h','u'),
+  /*10.0*/HB_SCRIPT_SOYOMBO			= HB_TAG ('S','o','y','o'),
+  /*10.0*/HB_SCRIPT_ZANABAZAR_SQUARE		= HB_TAG ('Z','a','n','b'),
+
+  /*
+   * Since 1.8.0
+   */
+  /*11.0*/HB_SCRIPT_DOGRA			= HB_TAG ('D','o','g','r'),
+  /*11.0*/HB_SCRIPT_GUNJALA_GONDI		= HB_TAG ('G','o','n','g'),
+  /*11.0*/HB_SCRIPT_HANIFI_ROHINGYA		= HB_TAG ('R','o','h','g'),
+  /*11.0*/HB_SCRIPT_MAKASAR			= HB_TAG ('M','a','k','a'),
+  /*11.0*/HB_SCRIPT_MEDEFAIDRIN			= HB_TAG ('M','e','d','f'),
+  /*11.0*/HB_SCRIPT_OLD_SOGDIAN			= HB_TAG ('S','o','g','o'),
+  /*11.0*/HB_SCRIPT_SOGDIAN			= HB_TAG ('S','o','g','d'),
+
+  /* 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.  We have two, for historical reasons.
+   * HB_TAG_MAX used to be unsigned, but that was invalid Ansi C, so was changed
+   * to _HB_SCRIPT_MAX_VALUE to be equal to HB_TAG_MAX_SIGNED as well.
+   *
+   * See this thread for technicalities:
+   *
+   *   https://lists.freedesktop.org/archives/harfbuzz/2014-March/004150.html
+   */
+  _HB_SCRIPT_MAX_VALUE				= HB_TAG_MAX_SIGNED, /*< skip >*/
+  _HB_SCRIPT_MAX_VALUE_SIGNED			= HB_TAG_MAX_SIGNED /*< skip >*/
+
+} hb_script_t;
+
+
+/* Script functions */
+
+HB_EXTERN hb_script_t
+hb_script_from_iso15924_tag (hb_tag_t tag);
+
+HB_EXTERN hb_script_t
+hb_script_from_string (const char *str, int len);
+
+HB_EXTERN hb_tag_t
+hb_script_to_iso15924_tag (hb_script_t script);
+
+HB_EXTERN hb_direction_t
+hb_script_get_horizontal_direction (hb_script_t script);
+
+
+/* User data */
+
+typedef struct hb_user_data_key_t {
+  /*< private >*/
+  char unused;
+} hb_user_data_key_t;
+
+typedef void (*hb_destroy_func_t) (void *user_data);
+
+
+/* Font features and variations. */
+
+/**
+ * HB_FEATURE_GLOBAL_START
+ *
+ * Since: 2.0.0
+ */
+#define HB_FEATURE_GLOBAL_START	0
+/**
+ * HB_FEATURE_GLOBAL_END
+ *
+ * Since: 2.0.0
+ */
+#define HB_FEATURE_GLOBAL_END	((unsigned int) -1)
+
+typedef struct hb_feature_t {
+  hb_tag_t      tag;
+  uint32_t      value;
+  unsigned int  start;
+  unsigned int  end;
+} hb_feature_t;
+
+HB_EXTERN hb_bool_t
+hb_feature_from_string (const char *str, int len,
+			hb_feature_t *feature);
+
+HB_EXTERN void
+hb_feature_to_string (hb_feature_t *feature,
+		      char *buf, unsigned int size);
+
+/**
+ * hb_variation_t:
+ *
+ * Since: 1.4.2
+ */
+typedef struct hb_variation_t {
+  hb_tag_t tag;
+  float    value;
+} hb_variation_t;
+
+HB_EXTERN hb_bool_t
+hb_variation_from_string (const char *str, int len,
+			  hb_variation_t *variation);
+
+HB_EXTERN void
+hb_variation_to_string (hb_variation_t *variation,
+			char *buf, unsigned int size);
+
+/**
+ * hb_color_t:
+ *
+ * Data type for holding color values.
+ *
+ * Since: 2.1.0
+ */
+typedef uint32_t hb_color_t;
+
+#define HB_COLOR(b,g,r,a) ((hb_color_t) HB_TAG ((b),(g),(r),(a)))
+
+/**
+ * hb_color_get_alpha:
+ *
+ *
+ *
+ * Since: 2.1.0
+ */
+#define hb_color_get_alpha(color)	((color) & 0xFF)
+/**
+ * hb_color_get_red:
+ *
+ *
+ *
+ * Since: 2.1.0
+ */
+#define hb_color_get_red(color)		(((color) >> 8) & 0xFF)
+/**
+ * hb_color_get_green:
+ *
+ *
+ *
+ * Since: 2.1.0
+ */
+#define hb_color_get_green(color)	(((color) >> 16) & 0xFF)
+/**
+ * hb_color_get_blue:
+ *
+ *
+ *
+ * Since: 2.1.0
+ */
+#define hb_color_get_blue(color)	(((color) >> 24) & 0xFF)
+
+
+HB_END_DECLS
+
+#endif /* HB_COMMON_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-coretext.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-coretext.cc
new file mode 100644
index 0000000..42ea3ea
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-coretext.cc
@@ -0,0 +1,1206 @@
+/*
+ * Copyright © 2012,2013  Mozilla Foundation.
+ * Copyright © 2012,2013  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.
+ *
+ * Mozilla Author(s): Jonathan Kew
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+#include "hb-shaper-impl.hh"
+
+#include "hb-coretext.h"
+#include "hb-aat-layout.hh"
+#include <math.h>
+
+
+/**
+ * SECTION:hb-coretext
+ * @title: hb-coretext
+ * @short_description: CoreText integration
+ * @include: hb-coretext.h
+ *
+ * Functions for using HarfBuzz with the CoreText fonts.
+ **/
+
+/* https://developer.apple.com/documentation/coretext/1508745-ctfontcreatewithgraphicsfont */
+#define HB_CORETEXT_DEFAULT_FONT_SIZE 12.f
+
+static CGFloat
+coretext_font_size_from_ptem (float ptem)
+{
+  /* CoreText points are CSS pixels (96 per inch),
+   * NOT typographic points (72 per inch).
+   *
+   * https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html
+   */
+  ptem *= 96.f / 72.f;
+  return ptem <= 0.f ? HB_CORETEXT_DEFAULT_FONT_SIZE : ptem;
+}
+static float
+coretext_font_size_to_ptem (CGFloat size)
+{
+  size *= 72.f / 96.f;
+  return size <= 0.f ? 0 : size;
+}
+
+static void
+release_table_data (void *user_data)
+{
+  CFDataRef cf_data = reinterpret_cast<CFDataRef> (user_data);
+  CFRelease(cf_data);
+}
+
+static hb_blob_t *
+reference_table  (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
+{
+  CGFontRef cg_font = reinterpret_cast<CGFontRef> (user_data);
+  CFDataRef cf_data = CGFontCopyTableForTag (cg_font, tag);
+  if (unlikely (!cf_data))
+    return nullptr;
+
+  const char *data = reinterpret_cast<const char*> (CFDataGetBytePtr (cf_data));
+  const size_t length = CFDataGetLength (cf_data);
+  if (!data || !length)
+  {
+    CFRelease (cf_data);
+    return nullptr;
+  }
+
+  return hb_blob_create (data, length, HB_MEMORY_MODE_READONLY,
+			 reinterpret_cast<void *> (const_cast<__CFData *> (cf_data)),
+			 release_table_data);
+}
+
+static void
+_hb_cg_font_release (void *data)
+{
+  CGFontRelease ((CGFontRef) data);
+}
+
+
+static CTFontDescriptorRef
+get_last_resort_font_desc ()
+{
+  // TODO Handle allocation failures?
+  CTFontDescriptorRef last_resort = CTFontDescriptorCreateWithNameAndSize (CFSTR("LastResort"), 0);
+  CFArrayRef cascade_list = CFArrayCreate (kCFAllocatorDefault,
+					   (const void **) &last_resort,
+					   1,
+					   &kCFTypeArrayCallBacks);
+  CFRelease (last_resort);
+  CFDictionaryRef attributes = CFDictionaryCreate (kCFAllocatorDefault,
+						   (const void **) &kCTFontCascadeListAttribute,
+						   (const void **) &cascade_list,
+						   1,
+						   &kCFTypeDictionaryKeyCallBacks,
+						   &kCFTypeDictionaryValueCallBacks);
+  CFRelease (cascade_list);
+
+  CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes);
+  CFRelease (attributes);
+  return font_desc;
+}
+
+static void
+release_data (void *info, const void *data, size_t size)
+{
+  assert (hb_blob_get_length ((hb_blob_t *) info) == size &&
+          hb_blob_get_data ((hb_blob_t *) info, nullptr) == data);
+
+  hb_blob_destroy ((hb_blob_t *) info);
+}
+
+static CGFontRef
+create_cg_font (hb_face_t *face)
+{
+  CGFontRef cg_font = nullptr;
+  if (face->destroy == _hb_cg_font_release)
+  {
+    cg_font = CGFontRetain ((CGFontRef) face->user_data);
+  }
+  else
+  {
+    hb_blob_t *blob = hb_face_reference_blob (face);
+    unsigned int blob_length;
+    const char *blob_data = hb_blob_get_data (blob, &blob_length);
+    if (unlikely (!blob_length))
+      DEBUG_MSG (CORETEXT, face, "Face has empty blob");
+
+    CGDataProviderRef provider = CGDataProviderCreateWithData (blob, blob_data, blob_length, &release_data);
+    if (likely (provider))
+    {
+      cg_font = CGFontCreateWithDataProvider (provider);
+      if (unlikely (!cg_font))
+	DEBUG_MSG (CORETEXT, face, "Face CGFontCreateWithDataProvider() failed");
+      CGDataProviderRelease (provider);
+    }
+  }
+  return cg_font;
+}
+
+static CTFontRef
+create_ct_font (CGFontRef cg_font, CGFloat font_size)
+{
+  CTFontRef ct_font = nullptr;
+
+  /* CoreText does not enable trak table usage / tracking when creating a CTFont
+   * using CTFontCreateWithGraphicsFont. The only way of enabling tracking seems
+   * to be through the CTFontCreateUIFontForLanguage call. */
+  CFStringRef cg_postscript_name = CGFontCopyPostScriptName (cg_font);
+  if (CFStringHasPrefix (cg_postscript_name, CFSTR (".SFNSText")) ||
+      CFStringHasPrefix (cg_postscript_name, CFSTR (".SFNSDisplay")))
+  {
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 1080
+# define kCTFontUIFontSystem kCTFontSystemFontType
+# define kCTFontUIFontEmphasizedSystem kCTFontEmphasizedSystemFontType
+#endif
+    CTFontUIFontType font_type = kCTFontUIFontSystem;
+    if (CFStringHasSuffix (cg_postscript_name, CFSTR ("-Bold")))
+      font_type = kCTFontUIFontEmphasizedSystem;
+
+    ct_font = CTFontCreateUIFontForLanguage (font_type, font_size, nullptr);
+    CFStringRef ct_result_name = CTFontCopyPostScriptName(ct_font);
+    if (CFStringCompare (ct_result_name, cg_postscript_name, 0) != kCFCompareEqualTo)
+    {
+      CFRelease(ct_font);
+      ct_font = nullptr;
+    }
+    CFRelease (ct_result_name);
+  }
+  CFRelease (cg_postscript_name);
+
+  if (!ct_font)
+    ct_font = CTFontCreateWithGraphicsFont (cg_font, font_size, nullptr, nullptr);
+
+  if (unlikely (!ct_font)) {
+    DEBUG_MSG (CORETEXT, cg_font, "Font CTFontCreateWithGraphicsFont() failed");
+    return nullptr;
+  }
+
+  /* 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. Except for the emoji font, where _not_
+   * reconfiguring the cascade list causes CoreText crashes. For details, see
+   * crbug.com/549610 */
+  // 0x00070000 stands for "kCTVersionNumber10_10", see CoreText.h
+  if (&CTGetCoreTextVersion != nullptr && CTGetCoreTextVersion() < 0x00070000) {
+    CFStringRef fontName = CTFontCopyPostScriptName (ct_font);
+    bool isEmojiFont = CFStringCompare (fontName, CFSTR("AppleColorEmoji"), 0) == kCFCompareEqualTo;
+    CFRelease (fontName);
+    if (!isEmojiFont)
+      return ct_font;
+  }
+
+  CFURLRef original_url = nullptr;
+#if TARGET_OS_OSX && MAC_OS_X_VERSION_MIN_REQUIRED < 1060
+  ATSFontRef atsFont;
+  FSRef fsref;
+  OSStatus status;
+  atsFont = CTFontGetPlatformFont (ct_font, NULL);
+  status = ATSFontGetFileReference (atsFont, &fsref);
+  if (status == noErr)
+    original_url = CFURLCreateFromFSRef (NULL, &fsref);
+#else
+  original_url = (CFURLRef) CTFontCopyAttribute (ct_font, kCTFontURLAttribute);
+#endif
+
+  /* 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, nullptr, last_resort_font_desc);
+    CFRelease (last_resort_font_desc);
+    if (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 = nullptr;
+#if TARGET_OS_OSX && MAC_OS_X_VERSION_MIN_REQUIRED < 1060
+      atsFont = CTFontGetPlatformFont (new_ct_font, NULL);
+      status = ATSFontGetFileReference (atsFont, &fsref);
+      if (status == noErr)
+        new_url = CFURLCreateFromFSRef (NULL, &fsref);
+#else
+      new_url = (CFURLRef) CTFontCopyAttribute (new_ct_font, kCTFontURLAttribute);
+#endif
+      // 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");
+  }
+
+  if (original_url)
+    CFRelease (original_url);
+  return ct_font;
+}
+
+hb_coretext_face_data_t *
+_hb_coretext_shaper_face_data_create (hb_face_t *face)
+{
+  CGFontRef cg_font = create_cg_font (face);
+
+  if (unlikely (!cg_font))
+  {
+    DEBUG_MSG (CORETEXT, face, "CGFont creation failed..");
+    return nullptr;
+  }
+
+  return (hb_coretext_face_data_t *) cg_font;
+}
+
+void
+_hb_coretext_shaper_face_data_destroy (hb_coretext_face_data_t *data)
+{
+  CFRelease ((CGFontRef) data);
+}
+
+hb_face_t *
+hb_coretext_face_create (CGFontRef cg_font)
+{
+  return hb_face_create_for_tables (reference_table, CGFontRetain (cg_font), _hb_cg_font_release);
+}
+
+/*
+ * Since: 0.9.10
+ */
+CGFontRef
+hb_coretext_face_get_cg_font (hb_face_t *face)
+{
+  return (CGFontRef) (const void *) face->data.coretext;
+}
+
+
+hb_coretext_font_data_t *
+_hb_coretext_shaper_font_data_create (hb_font_t *font)
+{
+  hb_face_t *face = font->face;
+  const hb_coretext_face_data_t *face_data = face->data.coretext;
+  if (unlikely (!face_data)) return nullptr;
+  CGFontRef cg_font = (CGFontRef) (const void *) face->data.coretext;
+
+  CTFontRef ct_font = create_ct_font (cg_font, coretext_font_size_from_ptem (font->ptem));
+
+  if (unlikely (!ct_font))
+  {
+    DEBUG_MSG (CORETEXT, font, "CGFont creation failed..");
+    return nullptr;
+  }
+
+  return (hb_coretext_font_data_t *) ct_font;
+}
+
+void
+_hb_coretext_shaper_font_data_destroy (hb_coretext_font_data_t *data)
+{
+  CFRelease ((CTFontRef) data);
+}
+
+static const hb_coretext_font_data_t *
+hb_coretext_font_data_sync (hb_font_t *font)
+{
+retry:
+  const hb_coretext_font_data_t *data = font->data.coretext;
+  if (unlikely (!data)) return nullptr;
+
+  if (fabs (CTFontGetSize((CTFontRef) data) - coretext_font_size_from_ptem (font->ptem)) > .5)
+  {
+    /* XXX-MT-bug
+     * Note that evaluating condition above can be dangerous if another thread
+     * got here first and destructed data.  That's, as always, bad use pattern.
+     * If you modify the font (change font size), other threads must not be
+     * using it at the same time.  However, since this check is delayed to
+     * when one actually tries to shape something, this is a XXX race condition
+     * (and the only one we have that I know of) right now.  Ie. you modify the
+     * font size in one thread, then (supposedly safely) try to use it from two
+     * or more threads and BOOM!  I'm not sure how to fix this.  We want RCU.
+     */
+
+    /* Drop and recreate. */
+    /* If someone dropped it in the mean time, throw it away and don't touch it.
+     * Otherwise, destruct it. */
+    if (likely (font->data.coretext.cmpexch (const_cast<hb_coretext_font_data_t *> (data), nullptr)))
+      _hb_coretext_shaper_font_data_destroy (const_cast<hb_coretext_font_data_t *> (data));
+    else
+      goto retry;
+  }
+  return font->data.coretext;
+}
+
+
+/*
+ * Since: 1.7.2
+ */
+hb_font_t *
+hb_coretext_font_create (CTFontRef ct_font)
+{
+  CGFontRef cg_font = CTFontCopyGraphicsFont (ct_font, nullptr);
+  hb_face_t *face = hb_coretext_face_create (cg_font);
+  CFRelease (cg_font);
+  hb_font_t *font = hb_font_create (face);
+  hb_face_destroy (face);
+
+  if (unlikely (hb_object_is_immutable (font)))
+    return font;
+
+  hb_font_set_ptem (font, coretext_font_size_to_ptem (CTFontGetSize(ct_font)));
+
+  /* Let there be dragons here... */
+  font->data.coretext.cmpexch (nullptr, (hb_coretext_font_data_t *) CFRetain (ct_font));
+
+  return font;
+}
+
+CTFontRef
+hb_coretext_font_get_ct_font (hb_font_t *font)
+{
+  const hb_coretext_font_data_t *data = hb_coretext_font_data_sync (font);
+  return data ? (CTFontRef) data : nullptr;
+}
+
+
+/*
+ * shaper
+ */
+
+struct feature_record_t {
+  unsigned int feature;
+  unsigned int setting;
+};
+
+struct active_feature_t {
+  feature_record_t rec;
+  unsigned int order;
+
+  static int cmp (const void *pa, const void *pb) {
+    const active_feature_t *a = (const active_feature_t *) pa;
+    const active_feature_t *b = (const active_feature_t *) pb;
+    return a->rec.feature < b->rec.feature ? -1 : a->rec.feature > b->rec.feature ? 1 :
+	   a->order < b->order ? -1 : a->order > b->order ? 1 :
+	   a->rec.setting < b->rec.setting ? -1 : a->rec.setting > b->rec.setting ? 1 :
+	   0;
+  }
+  bool operator== (const active_feature_t *f) {
+    return cmp (this, f) == 0;
+  }
+};
+
+struct feature_event_t {
+  unsigned int index;
+  bool start;
+  active_feature_t feature;
+
+  static int cmp (const void *pa, const void *pb) {
+    const feature_event_t *a = (const feature_event_t *) pa;
+    const feature_event_t *b = (const feature_event_t *) pb;
+    return a->index < b->index ? -1 : a->index > b->index ? 1 :
+	   a->start < b->start ? -1 : a->start > b->start ? 1 :
+	   active_feature_t::cmp (&a->feature, &b->feature);
+  }
+};
+
+struct range_record_t {
+  CTFontRef font;
+  unsigned int index_first; /* == start */
+  unsigned int index_last;  /* == end - 1 */
+};
+
+
+hb_bool_t
+_hb_coretext_shape (hb_shape_plan_t    *shape_plan,
+		    hb_font_t          *font,
+                    hb_buffer_t        *buffer,
+                    const hb_feature_t *features,
+                    unsigned int        num_features)
+{
+  hb_face_t *face = font->face;
+  CGFontRef cg_font = (CGFontRef) (const void *) face->data.coretext;
+  CTFontRef ct_font = (CTFontRef) hb_coretext_font_data_sync (font);
+
+  CGFloat ct_font_size = CTFontGetSize (ct_font);
+  CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size;
+  CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size;
+
+  /* Attach marks to their bases, to match the 'ot' shaper.
+   * Adapted from a very old version of hb-ot-shape:hb_form_clusters().
+   * Note that this only makes us be closer to the 'ot' shaper,
+   * but by no means the same.  For example, if there's
+   * B1 M1 B2 M2, and B1-B2 form a ligature, M2's cluster will
+   * continue pointing to B2 even though B2 was merged into B1's
+   * cluster... */
+  if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
+  {
+    hb_unicode_funcs_t *unicode = buffer->unicode;
+    unsigned int count = buffer->len;
+    hb_glyph_info_t *info = buffer->info;
+    for (unsigned int i = 1; i < count; i++)
+      if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (unicode->general_category (info[i].codepoint)))
+	buffer->merge_clusters (i - 1, i + 1);
+  }
+
+  hb_vector_t<feature_record_t> feature_records;
+  hb_vector_t<range_record_t> range_records;
+
+  /*
+   * Set up features.
+   * (copied + modified from code from hb-uniscribe.cc)
+   */
+  if (num_features)
+  {
+    /* Sort features by start/end events. */
+    hb_vector_t<feature_event_t> feature_events;
+    for (unsigned int i = 0; i < num_features; i++)
+    {
+      const hb_aat_feature_mapping_t * mapping = hb_aat_layout_find_feature_mapping (features[i].tag);
+      if (!mapping)
+        continue;
+
+      active_feature_t feature;
+      feature.rec.feature = mapping->aatFeatureType;
+      feature.rec.setting = features[i].value ? mapping->selectorToEnable : mapping->selectorToDisable;
+      feature.order = i;
+
+      feature_event_t *event;
+
+      event = feature_events.push ();
+      event->index = features[i].start;
+      event->start = true;
+      event->feature = feature;
+
+      event = feature_events.push ();
+      event->index = features[i].end;
+      event->start = false;
+      event->feature = feature;
+    }
+    feature_events.qsort ();
+    /* Add a strategic final event. */
+    {
+      active_feature_t feature;
+      feature.rec.feature = HB_TAG_NONE;
+      feature.rec.setting = 0;
+      feature.order = num_features + 1;
+
+      feature_event_t *event = feature_events.push ();
+      event->index = 0; /* This value does magic. */
+      event->start = false;
+      event->feature = feature;
+    }
+
+    /* Scan events and save features for each range. */
+    hb_vector_t<active_feature_t> active_features;
+    unsigned int last_index = 0;
+    for (unsigned int i = 0; i < feature_events.length; i++)
+    {
+      feature_event_t *event = &feature_events[i];
+
+      if (event->index != last_index)
+      {
+        /* Save a snapshot of active features and the range. */
+	range_record_t *range = range_records.push ();
+
+	if (active_features.length)
+	{
+	  CFMutableArrayRef features_array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
+
+	  /* TODO sort and resolve conflicting features? */
+	  /* active_features.qsort (); */
+	  for (unsigned int j = 0; j < active_features.length; j++)
+	  {
+	    CFStringRef keys[] = {
+	      kCTFontFeatureTypeIdentifierKey,
+	      kCTFontFeatureSelectorIdentifierKey
+	    };
+	    CFNumberRef values[] = {
+	      CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &active_features[j].rec.feature),
+	      CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &active_features[j].rec.setting)
+	    };
+	    static_assert ((ARRAY_LENGTH_CONST (keys) == ARRAY_LENGTH_CONST (values)), "");
+	    CFDictionaryRef dict = CFDictionaryCreate (kCFAllocatorDefault,
+						       (const void **) keys,
+						       (const void **) values,
+						       ARRAY_LENGTH (keys),
+						       &kCFTypeDictionaryKeyCallBacks,
+						       &kCFTypeDictionaryValueCallBacks);
+	    for (unsigned int i = 0; i < ARRAY_LENGTH (values); i++)
+	      CFRelease (values[i]);
+
+	    CFArrayAppendValue (features_array, dict);
+	    CFRelease (dict);
+
+	  }
+
+	  CFDictionaryRef attributes = CFDictionaryCreate (kCFAllocatorDefault,
+							   (const void **) &kCTFontFeatureSettingsAttribute,
+							   (const void **) &features_array,
+							   1,
+							   &kCFTypeDictionaryKeyCallBacks,
+							   &kCFTypeDictionaryValueCallBacks);
+	  CFRelease (features_array);
+
+	  CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes);
+	  CFRelease (attributes);
+
+	  range->font = CTFontCreateCopyWithAttributes (ct_font, 0.0, nullptr, font_desc);
+	  CFRelease (font_desc);
+	}
+	else
+	{
+	  range->font = nullptr;
+	}
+
+	range->index_first = last_index;
+	range->index_last  = event->index - 1;
+
+	last_index = event->index;
+      }
+
+      if (event->start)
+      {
+        active_features.push (event->feature);
+      } else {
+        active_feature_t *feature = active_features.find (&event->feature);
+	if (feature)
+	  active_features.remove (feature - active_features.arrayZ ());
+      }
+    }
+  }
+
+  unsigned int scratch_size;
+  hb_buffer_t::scratch_buffer_t *scratch = buffer->get_scratch_buffer (&scratch_size);
+
+#define ALLOCATE_ARRAY(Type, name, len, on_no_room) \
+  Type *name = (Type *) scratch; \
+  { \
+    unsigned int _consumed = DIV_CEIL ((len) * sizeof (Type), sizeof (*scratch)); \
+    if (unlikely (_consumed > scratch_size)) \
+    { \
+      on_no_room; \
+      assert (0); \
+    } \
+    scratch += _consumed; \
+    scratch_size -= _consumed; \
+  }
+
+  ALLOCATE_ARRAY (UniChar, pchars, buffer->len * 2, /*nothing*/);
+  unsigned int chars_len = 0;
+  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) & ((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;
+    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. */
+  }
+
+#define FAIL(...) \
+  HB_STMT_START { \
+    DEBUG_MSG (CORETEXT, nullptr, __VA_ARGS__); \
+    ret = false; \
+    goto fail; \
+  } HB_STMT_END;
+
+  bool ret = true;
+  CFStringRef string_ref = nullptr;
+  CTLineRef line = nullptr;
+
+  if (false)
+  {
+resize_and_retry:
+    DEBUG_MSG (CORETEXT, buffer, "Buffer resize");
+    /* string_ref uses the scratch-buffer for backing store, and line references
+     * string_ref (via attr_string).  We must release those before resizing buffer. */
+    assert (string_ref);
+    assert (line);
+    CFRelease (string_ref);
+    CFRelease (line);
+    string_ref = nullptr;
+    line = nullptr;
+
+    /* Get previous start-of-scratch-area, that we use later for readjusting
+     * our existing scratch arrays. */
+    unsigned int old_scratch_used;
+    hb_buffer_t::scratch_buffer_t *old_scratch;
+    old_scratch = buffer->get_scratch_buffer (&old_scratch_used);
+    old_scratch_used = scratch - old_scratch;
+
+    if (unlikely (!buffer->ensure (buffer->allocated * 2)))
+      FAIL ("Buffer resize failed");
+
+    /* Adjust scratch, pchars, and log_cluster arrays.  This is ugly, but really the
+     * cleanest way to do without completely restructuring the rest of this shaper. */
+    scratch = buffer->get_scratch_buffer (&scratch_size);
+    pchars = reinterpret_cast<UniChar *> (((char *) scratch + ((char *) pchars - (char *) old_scratch)));
+    log_clusters = reinterpret_cast<unsigned int *> (((char *) scratch + ((char *) log_clusters - (char *) old_scratch)));
+    scratch += old_scratch_used;
+    scratch_size -= old_scratch_used;
+  }
+  {
+    string_ref = CFStringCreateWithCharactersNoCopy (nullptr,
+						     pchars, chars_len,
+						     kCFAllocatorNull);
+    if (unlikely (!string_ref))
+      FAIL ("CFStringCreateWithCharactersNoCopy failed");
+
+    /* Create an attributed string, populate it, and create a line from it, then release attributed string. */
+    {
+      CFMutableAttributedStringRef attr_string = CFAttributedStringCreateMutable (kCFAllocatorDefault,
+										  chars_len);
+      if (unlikely (!attr_string))
+	FAIL ("CFAttributedStringCreateMutable failed");
+      CFAttributedStringReplaceString (attr_string, CFRangeMake (0, 0), string_ref);
+      if (HB_DIRECTION_IS_VERTICAL (buffer->props.direction))
+      {
+	CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
+					kCTVerticalFormsAttributeName, kCFBooleanTrue);
+      }
+
+      if (buffer->props.language)
+      {
+/* What's the iOS equivalent of this check?
+ * The symbols was introduced in iOS 7.0.
+ * At any rate, our fallback is safe and works fine. */
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 1090
+#  define kCTLanguageAttributeName CFSTR ("NSLanguage")
+#endif
+        CFStringRef lang = CFStringCreateWithCStringNoCopy (kCFAllocatorDefault,
+							    hb_language_to_string (buffer->props.language),
+							    kCFStringEncodingUTF8,
+							    kCFAllocatorNull);
+	if (unlikely (!lang))
+        {
+	  CFRelease (attr_string);
+	  FAIL ("CFStringCreateWithCStringNoCopy failed");
+        }
+	CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
+					kCTLanguageAttributeName, lang);
+	CFRelease (lang);
+      }
+      CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
+				      kCTFontAttributeName, ct_font);
+
+      if (num_features && range_records.length)
+      {
+	unsigned int start = 0;
+	range_record_t *last_range = &range_records[0];
+	for (unsigned int k = 0; k < chars_len; k++)
+	{
+	  range_record_t *range = last_range;
+	  while (log_clusters[k] < range->index_first)
+	    range--;
+	  while (log_clusters[k] > range->index_last)
+	    range++;
+	  if (range != last_range)
+	  {
+	    if (last_range->font)
+	      CFAttributedStringSetAttribute (attr_string, CFRangeMake (start, k - start),
+					      kCTFontAttributeName, last_range->font);
+
+	    start = k;
+	  }
+
+	  last_range = range;
+	}
+	if (start != chars_len && last_range->font)
+	  CFAttributedStringSetAttribute (attr_string, CFRangeMake (start, chars_len - start),
+					  kCTFontAttributeName, last_range->font);
+      }
+      /* Enable/disable kern if requested.
+       *
+       * Note: once kern is disabled, reenabling it doesn't currently seem to work in CoreText.
+       */
+      if (num_features)
+      {
+	unsigned int zeroint = 0;
+	CFNumberRef zero = CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &zeroint);
+	for (unsigned int i = 0; i < num_features; i++)
+	{
+	  const hb_feature_t &feature = features[i];
+	  if (feature.tag == HB_TAG('k','e','r','n') &&
+	      feature.start < chars_len && feature.start < feature.end)
+	  {
+	    CFRange feature_range = CFRangeMake (feature.start,
+	                                         MIN (feature.end, chars_len) - feature.start);
+	    if (feature.value)
+	      CFAttributedStringRemoveAttribute (attr_string, feature_range, kCTKernAttributeName);
+	    else
+	      CFAttributedStringSetAttribute (attr_string, feature_range, kCTKernAttributeName, zero);
+	  }
+	}
+	CFRelease (zero);
+      }
+
+      int level = HB_DIRECTION_IS_FORWARD (buffer->props.direction) ? 0 : 1;
+      CFNumberRef level_number = CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &level);
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
+      extern const CFStringRef kCTTypesetterOptionForcedEmbeddingLevel;
+#endif
+      CFDictionaryRef options = CFDictionaryCreate (kCFAllocatorDefault,
+						    (const void **) &kCTTypesetterOptionForcedEmbeddingLevel,
+						    (const void **) &level_number,
+						    1,
+						    &kCFTypeDictionaryKeyCallBacks,
+						    &kCFTypeDictionaryValueCallBacks);
+      CFRelease (level_number);
+      if (unlikely (!options))
+      {
+        CFRelease (attr_string);
+        FAIL ("CFDictionaryCreate failed");
+      }
+
+      CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedStringAndOptions (attr_string, options);
+      CFRelease (options);
+      CFRelease (attr_string);
+      if (unlikely (!typesetter))
+	FAIL ("CTTypesetterCreateWithAttributedStringAndOptions failed");
+
+      line = CTTypesetterCreateLine (typesetter, CFRangeMake(0, 0));
+      CFRelease (typesetter);
+      if (unlikely (!line))
+	FAIL ("CTTypesetterCreateLine failed");
+    }
+
+    CFArrayRef glyph_runs = CTLineGetGlyphRuns (line);
+    unsigned int num_runs = CFArrayGetCount (glyph_runs);
+    DEBUG_MSG (CORETEXT, nullptr, "Num runs: %d", num_runs);
+
+    buffer->len = 0;
+    uint32_t status_and = ~0, status_or = 0;
+    double advances_so_far = 0;
+    /* For right-to-left runs, CoreText returns the glyphs positioned such that
+     * any trailing whitespace is to the left of (0,0).  Adjust coordinate system
+     * to fix for that.  Test with any RTL string with trailing spaces.
+     * https://crbug.com/469028
+     */
+    if (HB_DIRECTION_IS_BACKWARD (buffer->props.direction))
+    {
+      advances_so_far -= CTLineGetTrailingWhitespaceWidth (line);
+      if (HB_DIRECTION_IS_VERTICAL (buffer->props.direction))
+	  advances_so_far = -advances_so_far;
+    }
+
+    const CFRange range_all = CFRangeMake (0, 0);
+
+    for (unsigned int i = 0; i < num_runs; i++)
+    {
+      CTRunRef run = static_cast<CTRunRef>(CFArrayGetValueAtIndex (glyph_runs, i));
+      CTRunStatus run_status = CTRunGetStatus (run);
+      status_or  |= run_status;
+      status_and &= run_status;
+      DEBUG_MSG (CORETEXT, run, "CTRunStatus: %x", run_status);
+      double run_advance = CTRunGetTypographicBounds (run, range_all, nullptr, nullptr, nullptr);
+      if (HB_DIRECTION_IS_VERTICAL (buffer->props.direction))
+	  run_advance = -run_advance;
+      DEBUG_MSG (CORETEXT, run, "Run advance: %g", run_advance);
+
+      /* CoreText does automatic font fallback (AKA "cascading") for  characters
+       * not supported by the requested font, and provides no way to turn it off,
+       * so we must detect if the returned run uses a font other than the requested
+       * one and fill in the buffer with .notdef glyphs instead of random glyph
+       * indices from a different font.
+       */
+      CFDictionaryRef attributes = CTRunGetAttributes (run);
+      CTFontRef run_ct_font = static_cast<CTFontRef>(CFDictionaryGetValue (attributes, kCTFontAttributeName));
+      if (!CFEqual (run_ct_font, ct_font))
+      {
+	/* The run doesn't use our main font instance.  We have to figure out
+	 * whether font fallback happened, or this is just CoreText giving us
+	 * another CTFont using the same underlying CGFont.  CoreText seems
+	 * to do that in a variety of situations, one of which being vertical
+	 * text, but also perhaps for caching reasons.
+	 *
+	 * First, see if it uses any of our subfonts created to set font features...
+	 *
+	 * Next, compare the CGFont to the one we used to create our fonts.
+	 * Even this doesn't work all the time.
+	 *
+	 * Finally, we compare PS names, which I don't think are unique...
+	 *
+	 * Looks like if we really want to be sure here we have to modify the
+	 * font to change the name table, similar to what we do in the uniscribe
+	 * backend.
+	 *
+	 * However, even that wouldn't work if we were passed in the CGFont to
+	 * construct a hb_face to begin with.
+	 *
+	 * See: https://github.com/harfbuzz/harfbuzz/pull/36
+	 *
+	 * Also see: https://bugs.chromium.org/p/chromium/issues/detail?id=597098
+	 */
+	bool matched = false;
+	for (unsigned int i = 0; i < range_records.length; i++)
+	  if (range_records[i].font && CFEqual (run_ct_font, range_records[i].font))
+	  {
+	    matched = true;
+	    break;
+	  }
+	if (!matched)
+	{
+	  CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, nullptr);
+	  if (run_cg_font)
+	  {
+	    matched = CFEqual (run_cg_font, cg_font);
+	    CFRelease (run_cg_font);
+	  }
+	}
+	if (!matched)
+	{
+	  CFStringRef font_ps_name = CTFontCopyName (ct_font, kCTFontPostScriptNameKey);
+	  CFStringRef run_ps_name = CTFontCopyName (run_ct_font, kCTFontPostScriptNameKey);
+	  CFComparisonResult result = CFStringCompare (run_ps_name, font_ps_name, 0);
+	  CFRelease (run_ps_name);
+	  CFRelease (font_ps_name);
+	  if (result == kCFCompareEqualTo)
+	    matched = true;
+	}
+	if (!matched)
+	{
+	  CFRange range = CTRunGetStringRange (run);
+          DEBUG_MSG (CORETEXT, run, "Run used fallback font: %ld..%ld",
+		     range.location, range.location + range.length);
+	  if (!buffer->ensure_inplace (buffer->len + range.length))
+	    goto resize_and_retry;
+	  hb_glyph_info_t *info = buffer->info + buffer->len;
+
+	  hb_codepoint_t notdef = 0;
+	  hb_direction_t dir = buffer->props.direction;
+	  hb_position_t x_advance, y_advance, x_offset, y_offset;
+	  hb_font_get_glyph_advance_for_direction (font, notdef, dir, &x_advance, &y_advance);
+	  hb_font_get_glyph_origin_for_direction (font, notdef, dir, &x_offset, &y_offset);
+	  hb_position_t advance = x_advance + y_advance;
+	  x_offset = -x_offset;
+	  y_offset = -y_offset;
+
+	  unsigned int old_len = buffer->len;
+	  for (CFIndex j = range.location; j < range.location + range.length; j++)
+	  {
+	      UniChar ch = CFStringGetCharacterAtIndex (string_ref, j);
+	      if (hb_in_range<UniChar> (ch, 0xDC00u, 0xDFFFu) && range.location < j)
+	      {
+		ch = CFStringGetCharacterAtIndex (string_ref, j - 1);
+		if (hb_in_range<UniChar> (ch, 0xD800u, 0xDBFFu))
+		  /* This is the second of a surrogate pair.  Don't need .notdef
+		   * for this one. */
+		  continue;
+	      }
+	      if (buffer->unicode->is_default_ignorable (ch))
+	        continue;
+
+	      info->codepoint = notdef;
+	      info->cluster = log_clusters[j];
+
+	      info->mask = advance;
+	      info->var1.i32 = x_offset;
+	      info->var2.i32 = y_offset;
+
+	      info++;
+	      buffer->len++;
+	  }
+	  if (HB_DIRECTION_IS_BACKWARD (buffer->props.direction))
+	    buffer->reverse_range (old_len, buffer->len);
+	  advances_so_far += run_advance;
+	  continue;
+	}
+      }
+
+      unsigned int num_glyphs = CTRunGetGlyphCount (run);
+      if (num_glyphs == 0)
+	continue;
+
+      if (!buffer->ensure_inplace (buffer->len + num_glyphs))
+	goto resize_and_retry;
+
+      hb_glyph_info_t *run_info = buffer->info + buffer->len;
+
+      /* Testing used to indicate that CTRunGetGlyphsPtr, etc (almost?) always
+       * succeed, and so copying data to our own buffer will be rare.  Reports
+       * have it that this changed in OS X 10.10 Yosemite, and nullptr is returned
+       * frequently.  At any rate, we can test that codepath by setting USE_PTR
+       * to false. */
+
+#define USE_PTR true
+
+#define SCRATCH_SAVE() \
+  unsigned int scratch_size_saved = scratch_size; \
+  hb_buffer_t::scratch_buffer_t *scratch_saved = scratch
+
+#define SCRATCH_RESTORE() \
+  scratch_size = scratch_size_saved; \
+  scratch = scratch_saved;
+
+      { /* Setup glyphs */
+        SCRATCH_SAVE();
+	const CGGlyph* glyphs = USE_PTR ? CTRunGetGlyphsPtr (run) : nullptr;
+	if (!glyphs) {
+	  ALLOCATE_ARRAY (CGGlyph, glyph_buf, num_glyphs, goto resize_and_retry);
+	  CTRunGetGlyphs (run, range_all, glyph_buf);
+	  glyphs = glyph_buf;
+	}
+	const CFIndex* string_indices = USE_PTR ? CTRunGetStringIndicesPtr (run) : nullptr;
+	if (!string_indices) {
+	  ALLOCATE_ARRAY (CFIndex, index_buf, num_glyphs, goto resize_and_retry);
+	  CTRunGetStringIndices (run, range_all, index_buf);
+	  string_indices = index_buf;
+	}
+	hb_glyph_info_t *info = run_info;
+	for (unsigned int j = 0; j < num_glyphs; j++)
+	{
+	  info->codepoint = glyphs[j];
+	  info->cluster = log_clusters[string_indices[j]];
+	  info++;
+	}
+	SCRATCH_RESTORE();
+      }
+      {
+        /* Setup positions.
+	 * Note that CoreText does not return advances for glyphs.  As such,
+	 * for all but last glyph, we use the delta position to next glyph as
+	 * advance (in the advance direction only), and for last glyph we set
+	 * whatever is needed to make the whole run's advance add up. */
+        SCRATCH_SAVE();
+	const CGPoint* positions = USE_PTR ? CTRunGetPositionsPtr (run) : nullptr;
+	if (!positions) {
+	  ALLOCATE_ARRAY (CGPoint, position_buf, num_glyphs, goto resize_and_retry);
+	  CTRunGetPositions (run, range_all, position_buf);
+	  positions = position_buf;
+	}
+	hb_glyph_info_t *info = run_info;
+	if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+	{
+	  hb_position_t x_offset = (positions[0].x - advances_so_far) * x_mult;
+	  for (unsigned int j = 0; j < num_glyphs; j++)
+	  {
+	    double advance;
+	    if (likely (j + 1 < num_glyphs))
+	      advance = positions[j + 1].x - positions[j].x;
+	    else /* last glyph */
+	      advance = run_advance - (positions[j].x - positions[0].x);
+	    info->mask = advance * x_mult;
+	    info->var1.i32 = x_offset;
+	    info->var2.i32 = positions[j].y * y_mult;
+	    info++;
+	  }
+	}
+	else
+	{
+	  hb_position_t y_offset = (positions[0].y - advances_so_far) * y_mult;
+	  for (unsigned int j = 0; j < num_glyphs; j++)
+	  {
+	    double advance;
+	    if (likely (j + 1 < num_glyphs))
+	      advance = positions[j + 1].y - positions[j].y;
+	    else /* last glyph */
+	      advance = run_advance - (positions[j].y - positions[0].y);
+	    info->mask = advance * y_mult;
+	    info->var1.i32 = positions[j].x * x_mult;
+	    info->var2.i32 = y_offset;
+	    info++;
+	  }
+	}
+	SCRATCH_RESTORE();
+	advances_so_far += run_advance;
+      }
+#undef SCRATCH_RESTORE
+#undef SCRATCH_SAVE
+#undef USE_PTR
+#undef ALLOCATE_ARRAY
+
+      buffer->len += num_glyphs;
+    }
+
+    /* Mac OS 10.6 doesn't have kCTTypesetterOptionForcedEmbeddingLevel,
+     * or if it does, it doesn't respect it.  So we get runs with wrong
+     * directions.  As such, disable the assert...  It wouldn't crash, but
+     * cursoring will be off...
+     *
+     * https://crbug.com/419769
+     */
+    if (false)
+    {
+      /* Make sure all runs had the expected direction. */
+      bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
+      assert (bool (status_and & kCTRunStatusRightToLeft) == backward);
+      assert (bool (status_or  & kCTRunStatusRightToLeft) == backward);
+    }
+
+    buffer->clear_positions ();
+
+    unsigned int count = buffer->len;
+    hb_glyph_info_t *info = buffer->info;
+    hb_glyph_position_t *pos = buffer->pos;
+    if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+      for (unsigned int i = 0; i < count; i++)
+      {
+	pos->x_advance = info->mask;
+	pos->x_offset = info->var1.i32;
+	pos->y_offset = info->var2.i32;
+
+	info++, pos++;
+      }
+    else
+      for (unsigned int i = 0; i < count; i++)
+      {
+	pos->y_advance = info->mask;
+	pos->x_offset = info->var1.i32;
+	pos->y_offset = info->var2.i32;
+
+	info++, pos++;
+      }
+
+    /* Fix up clusters so that we never return out-of-order indices;
+     * if core text has reordered glyphs, we'll merge them to the
+     * beginning of the reordered cluster.  CoreText is nice enough
+     * to tell us whenever it has produced nonmonotonic results...
+     * Note that we assume the input clusters were nonmonotonic to
+     * begin with.
+     *
+     * This does *not* mean we'll form the same clusters as Uniscribe
+     * or the native OT backend, only that the cluster indices will be
+     * monotonic in the output buffer. */
+    if (count > 1 && (status_or & kCTRunStatusNonMonotonic))
+    {
+      hb_glyph_info_t *info = buffer->info;
+      if (HB_DIRECTION_IS_FORWARD (buffer->props.direction))
+      {
+	unsigned int cluster = info[count - 1].cluster;
+	for (unsigned int i = count - 1; i > 0; i--)
+	{
+	  cluster = MIN (cluster, info[i - 1].cluster);
+	  info[i - 1].cluster = cluster;
+	}
+      }
+      else
+      {
+	unsigned int cluster = info[0].cluster;
+	for (unsigned int i = 1; i < count; i++)
+	{
+	  cluster = MIN (cluster, info[i].cluster);
+	  info[i].cluster = cluster;
+	}
+      }
+    }
+  }
+
+  buffer->unsafe_to_break_all ();
+
+#undef FAIL
+
+fail:
+  if (string_ref)
+    CFRelease (string_ref);
+  if (line)
+    CFRelease (line);
+
+  for (unsigned int i = 0; i < range_records.length; i++)
+    if (range_records[i].font)
+      CFRelease (range_records[i].font);
+
+  return ret;
+}
+
+
+/*
+ * AAT shaper
+ */
+
+/*
+ * shaper face data
+ */
+
+struct hb_coretext_aat_face_data_t {};
+
+hb_coretext_aat_face_data_t *
+_hb_coretext_aat_shaper_face_data_create (hb_face_t *face)
+{
+  return hb_aat_layout_has_substitution (face) || hb_aat_layout_has_positioning (face) ?
+	 (hb_coretext_aat_face_data_t *) HB_SHAPER_DATA_SUCCEEDED : nullptr;
+}
+
+void
+_hb_coretext_aat_shaper_face_data_destroy (hb_coretext_aat_face_data_t *data HB_UNUSED)
+{
+}
+
+
+/*
+ * shaper font data
+ */
+
+struct hb_coretext_aat_font_data_t {};
+
+hb_coretext_aat_font_data_t *
+_hb_coretext_aat_shaper_font_data_create (hb_font_t *font)
+{
+  return font->data.coretext ? (hb_coretext_aat_font_data_t *) HB_SHAPER_DATA_SUCCEEDED : nullptr;
+}
+
+void
+_hb_coretext_aat_shaper_font_data_destroy (hb_coretext_aat_font_data_t *data HB_UNUSED)
+{
+}
+
+
+/*
+ * shaper
+ */
+
+hb_bool_t
+_hb_coretext_aat_shape (hb_shape_plan_t    *shape_plan,
+			hb_font_t          *font,
+			hb_buffer_t        *buffer,
+			const hb_feature_t *features,
+			unsigned int        num_features)
+{
+  return _hb_coretext_shape (shape_plan, font, buffer, features, num_features);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-coretext.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-coretext.h
new file mode 100644
index 0000000..4b0a6f0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-coretext.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright © 2012  Mozilla Foundation.
+ *
+ *  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.
+ *
+ * Mozilla Author(s): Jonathan Kew
+ */
+
+#ifndef HB_CORETEXT_H
+#define HB_CORETEXT_H
+
+#include "hb.h"
+
+#include <TargetConditionals.h>
+#if TARGET_OS_IPHONE
+#  include <CoreText/CoreText.h>
+#  include <CoreGraphics/CoreGraphics.h>
+#else
+#  include <ApplicationServices/ApplicationServices.h>
+#endif
+
+HB_BEGIN_DECLS
+
+
+#define HB_CORETEXT_TAG_MORT HB_TAG('m','o','r','t')
+#define HB_CORETEXT_TAG_MORX HB_TAG('m','o','r','x')
+#define HB_CORETEXT_TAG_KERX HB_TAG('k','e','r','x')
+
+
+HB_EXTERN hb_face_t *
+hb_coretext_face_create (CGFontRef cg_font);
+
+HB_EXTERN hb_font_t *
+hb_coretext_font_create (CTFontRef ct_font);
+
+
+HB_EXTERN CGFontRef
+hb_coretext_face_get_cg_font (hb_face_t *face);
+
+HB_EXTERN CTFontRef
+hb_coretext_font_get_ct_font (hb_font_t *font);
+
+
+HB_END_DECLS
+
+#endif /* HB_CORETEXT_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-debug.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-debug.hh
new file mode 100644
index 0000000..d7d0165
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-debug.hh
@@ -0,0 +1,471 @@
+/*
+ * Copyright © 2017  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_DEBUG_HH
+#define HB_DEBUG_HH
+
+#include "hb.hh"
+#include "hb-atomic.hh"
+#include "hb-dsalgs.hh"
+
+
+#ifndef HB_DEBUG
+#define HB_DEBUG 0
+#endif
+
+
+/*
+ * Global runtime options.
+ */
+
+struct hb_options_t
+{
+  bool unused : 1; /* In-case sign bit is here. */
+  bool initialized : 1;
+  bool uniscribe_bug_compatible : 1;
+  bool aat : 1;
+};
+
+union hb_options_union_t {
+  int i;
+  hb_options_t opts;
+};
+static_assert ((sizeof (hb_atomic_int_t) >= sizeof (hb_options_union_t)), "");
+
+HB_INTERNAL void
+_hb_options_init ();
+
+extern HB_INTERNAL hb_atomic_int_t _hb_options;
+
+static inline hb_options_t
+hb_options ()
+{
+  /* Make a local copy, so we can access bitfield threadsafely. */
+  hb_options_union_t u;
+  u.i = _hb_options.get_relaxed ();
+
+  if (unlikely (!u.i))
+  {
+    _hb_options_init ();
+    u.i = _hb_options.get_relaxed ();
+  }
+
+  return u.opts;
+}
+
+
+/*
+ * Debug output (needs enabling at compile time.)
+ */
+
+static inline bool
+_hb_debug (unsigned int level,
+	   unsigned int max_level)
+{
+  return level < max_level;
+}
+
+#define DEBUG_LEVEL_ENABLED(WHAT, LEVEL) (_hb_debug ((LEVEL), HB_DEBUG_##WHAT))
+#define DEBUG_ENABLED(WHAT) (DEBUG_LEVEL_ENABLED (WHAT, 0))
+
+static inline void
+_hb_print_func (const char *func)
+{
+  if (func)
+  {
+    unsigned int func_len = strlen (func);
+    /* Skip "static" */
+    if (0 == strncmp (func, "static ", 7))
+      func += 7;
+    /* Skip "typename" */
+    if (0 == strncmp (func, "typename ", 9))
+      func += 9;
+    /* Skip return type */
+    const char *space = strchr (func, ' ');
+    if (space)
+      func = space + 1;
+    /* Skip parameter list */
+    const char *paren = strchr (func, '(');
+    if (paren)
+      func_len = paren - func;
+    fprintf (stderr, "%.*s", func_len, func);
+  }
+}
+
+template <int max_level> static inline void
+_hb_debug_msg_va (const char *what,
+		  const void *obj,
+		  const char *func,
+		  bool indented,
+		  unsigned int level,
+		  int level_dir,
+		  const char *message,
+		  va_list ap) HB_PRINTF_FUNC(7, 0);
+template <int max_level> static inline void
+_hb_debug_msg_va (const char *what,
+		  const void *obj,
+		  const char *func,
+		  bool indented,
+		  unsigned int level,
+		  int level_dir,
+		  const char *message,
+		  va_list ap)
+{
+  if (!_hb_debug (level, max_level))
+    return;
+
+  fprintf (stderr, "%-10s", what ? what : "");
+
+  if (obj)
+    fprintf (stderr, "(%*p) ", (unsigned int) (2 * sizeof (void *)), obj);
+  else
+    fprintf (stderr, " %*s  ", (unsigned int) (2 * sizeof (void *)), "");
+
+  if (indented) {
+#define VBAR	"\342\224\202"	/* U+2502 BOX DRAWINGS LIGHT VERTICAL */
+#define VRBAR	"\342\224\234"	/* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
+#define DLBAR	"\342\225\256"	/* U+256E BOX DRAWINGS LIGHT ARC DOWN AND LEFT */
+#define ULBAR	"\342\225\257"	/* U+256F BOX DRAWINGS LIGHT ARC UP AND LEFT */
+#define LBAR	"\342\225\264"	/* U+2574 BOX DRAWINGS LIGHT LEFT */
+    static const char bars[] =
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR;
+    fprintf (stderr, "%2u %s" VRBAR "%s",
+	     level,
+	     bars + sizeof (bars) - 1 - MIN ((unsigned int) sizeof (bars) - 1, (unsigned int) (sizeof (VBAR) - 1) * level),
+	     level_dir ? (level_dir > 0 ? DLBAR : ULBAR) : LBAR);
+  } else
+    fprintf (stderr, "   " VRBAR LBAR);
+
+  _hb_print_func (func);
+
+  if (message)
+  {
+    fprintf (stderr, ": ");
+    vfprintf (stderr, message, ap);
+  }
+
+  fprintf (stderr, "\n");
+}
+template <> inline void HB_PRINTF_FUNC(7, 0)
+_hb_debug_msg_va<0> (const char *what HB_UNUSED,
+		     const void *obj HB_UNUSED,
+		     const char *func HB_UNUSED,
+		     bool indented HB_UNUSED,
+		     unsigned int level HB_UNUSED,
+		     int level_dir HB_UNUSED,
+		     const char *message HB_UNUSED,
+		     va_list ap HB_UNUSED) {}
+
+template <int max_level> static inline void
+_hb_debug_msg (const char *what,
+	       const void *obj,
+	       const char *func,
+	       bool indented,
+	       unsigned int level,
+	       int level_dir,
+	       const char *message,
+	       ...) HB_PRINTF_FUNC(7, 8);
+template <int max_level> static inline void HB_PRINTF_FUNC(7, 8)
+_hb_debug_msg (const char *what,
+	       const void *obj,
+	       const char *func,
+	       bool indented,
+	       unsigned int level,
+	       int level_dir,
+	       const char *message,
+	       ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  _hb_debug_msg_va<max_level> (what, obj, func, indented, level, level_dir, message, ap);
+  va_end (ap);
+}
+template <> inline void
+_hb_debug_msg<0> (const char *what HB_UNUSED,
+		  const void *obj HB_UNUSED,
+		  const char *func HB_UNUSED,
+		  bool indented HB_UNUSED,
+		  unsigned int level HB_UNUSED,
+		  int level_dir HB_UNUSED,
+		  const char *message HB_UNUSED,
+		  ...) HB_PRINTF_FUNC(7, 8);
+template <> inline void HB_PRINTF_FUNC(7, 8)
+_hb_debug_msg<0> (const char *what HB_UNUSED,
+		  const void *obj HB_UNUSED,
+		  const char *func HB_UNUSED,
+		  bool indented HB_UNUSED,
+		  unsigned int level HB_UNUSED,
+		  int level_dir HB_UNUSED,
+		  const char *message HB_UNUSED,
+		  ...) {}
+
+#define DEBUG_MSG_LEVEL(WHAT, OBJ, LEVEL, LEVEL_DIR, ...)	_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    true, (LEVEL), (LEVEL_DIR), __VA_ARGS__)
+#define DEBUG_MSG(WHAT, OBJ, ...) 				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    false, 0, 0, __VA_ARGS__)
+#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
+
+
+/*
+ * Printer
+ */
+
+template <typename T>
+struct hb_printer_t {
+  const char *print (const T&) { return "something"; }
+};
+
+template <>
+struct hb_printer_t<bool> {
+  const char *print (bool v) { return v ? "true" : "false"; }
+};
+
+template <>
+struct hb_printer_t<hb_void_t> {
+  const char *print (hb_void_t) { return ""; }
+};
+
+
+/*
+ * Trace
+ */
+
+template <typename T>
+static inline void _hb_warn_no_return (bool returned)
+{
+  if (unlikely (!returned)) {
+    fprintf (stderr, "OUCH, returned with no call to return_trace().  This is a bug, please report.\n");
+  }
+}
+template <>
+/*static*/ inline void _hb_warn_no_return<hb_void_t> (bool returned HB_UNUSED)
+{}
+
+template <int max_level, typename ret_t>
+struct hb_auto_trace_t
+{
+  explicit inline hb_auto_trace_t (unsigned int *plevel_,
+				   const char *what_,
+				   const void *obj_,
+				   const char *func,
+				   const char *message,
+				   ...) HB_PRINTF_FUNC(6, 7)
+				   : plevel (plevel_), what (what_), obj (obj_), returned (false)
+  {
+    if (plevel) ++*plevel;
+
+    va_list ap;
+    va_start (ap, message);
+    _hb_debug_msg_va<max_level> (what, obj, func, true, plevel ? *plevel : 0, +1, message, ap);
+    va_end (ap);
+  }
+  ~hb_auto_trace_t ()
+  {
+    _hb_warn_no_return<ret_t> (returned);
+    if (!returned) {
+      _hb_debug_msg<max_level> (what, obj, nullptr, true, plevel ? *plevel : 1, -1, " ");
+    }
+    if (plevel) --*plevel;
+  }
+
+  ret_t ret (ret_t v,
+	     const char *func = "",
+	     unsigned int line = 0)
+  {
+    if (unlikely (returned)) {
+      fprintf (stderr, "OUCH, double calls to return_trace().  This is a bug, please report.\n");
+      return v;
+    }
+
+    _hb_debug_msg<max_level> (what, obj, func, true, plevel ? *plevel : 1, -1,
+			      "return %s (line %d)",
+			      hb_printer_t<ret_t>().print (v), line);
+    if (plevel) --*plevel;
+    plevel = nullptr;
+    returned = true;
+    return v;
+  }
+
+  private:
+  unsigned int *plevel;
+  const char *what;
+  const void *obj;
+  bool returned;
+};
+template <typename ret_t> /* Make sure we don't use hb_auto_trace_t when not tracing. */
+struct hb_auto_trace_t<0, ret_t>
+{
+  explicit inline hb_auto_trace_t (unsigned int *plevel_,
+				   const char *what_,
+				   const void *obj_,
+				   const char *func,
+				   const char *message,
+				   ...) HB_PRINTF_FUNC(6, 7) {}
+
+  ret_t ret (ret_t v,
+	     const char *func HB_UNUSED = nullptr,
+	     unsigned int line HB_UNUSED = 0) { return v; }
+};
+
+/* For disabled tracing; optimize out everything.
+ * https://github.com/harfbuzz/harfbuzz/pull/605 */
+template <typename ret_t>
+struct hb_no_trace_t {
+  ret_t ret (ret_t v,
+	     const char *func HB_UNUSED = "",
+	     unsigned int line HB_UNUSED = 0) { return v; }
+};
+
+#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
+
+
+/*
+ * Instances.
+ */
+
+#ifndef HB_DEBUG_ARABIC
+#define HB_DEBUG_ARABIC (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_BLOB
+#define HB_DEBUG_BLOB (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_CORETEXT
+#define HB_DEBUG_CORETEXT (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_DIRECTWRITE
+#define HB_DEBUG_DIRECTWRITE (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_FT
+#define HB_DEBUG_FT (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_GET_COVERAGE
+#define HB_DEBUG_GET_COVERAGE (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_OBJECT
+#define HB_DEBUG_OBJECT (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_SHAPE_PLAN
+#define HB_DEBUG_SHAPE_PLAN (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_UNISCRIBE
+#define HB_DEBUG_UNISCRIBE (HB_DEBUG+0)
+#endif
+
+/*
+ * With tracing.
+ */
+
+#ifndef HB_DEBUG_APPLY
+#define HB_DEBUG_APPLY (HB_DEBUG+0)
+#endif
+#if HB_DEBUG_APPLY
+#define TRACE_APPLY(this) \
+	hb_auto_trace_t<HB_DEBUG_APPLY, bool> trace \
+	(&c->debug_depth, c->get_name (), this, HB_FUNC, \
+	 "idx %d gid %u lookup %d", \
+	 c->buffer->idx, c->buffer->cur().codepoint, (int) c->lookup_index)
+#else
+#define TRACE_APPLY(this) hb_no_trace_t<bool> trace
+#endif
+
+#ifndef HB_DEBUG_SANITIZE
+#define HB_DEBUG_SANITIZE (HB_DEBUG+0)
+#endif
+#if HB_DEBUG_SANITIZE
+#define TRACE_SANITIZE(this) \
+	hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace \
+	(&c->debug_depth, c->get_name (), this, HB_FUNC, \
+	 " ");
+#else
+#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
+#endif
+
+#ifndef HB_DEBUG_SERIALIZE
+#define HB_DEBUG_SERIALIZE (HB_DEBUG+0)
+#endif
+#if HB_DEBUG_SERIALIZE
+#define TRACE_SERIALIZE(this) \
+	hb_auto_trace_t<HB_DEBUG_SERIALIZE, bool> trace \
+	(&c->debug_depth, "SERIALIZE", c, HB_FUNC, \
+	 " ");
+#else
+#define TRACE_SERIALIZE(this) hb_no_trace_t<bool> trace
+#endif
+
+#ifndef HB_DEBUG_SUBSET
+#define HB_DEBUG_SUBSET (HB_DEBUG+0)
+#endif
+#if HB_DEBUG_SUBSET
+#define TRACE_SUBSET(this) \
+  hb_auto_trace_t<HB_DEBUG_SUBSET, bool> trace \
+  (&c->debug_depth, c->get_name (), this, HB_FUNC, \
+   " ");
+#else
+#define TRACE_SUBSET(this) hb_no_trace_t<bool> trace
+#endif
+
+#ifndef HB_DEBUG_WOULD_APPLY
+#define HB_DEBUG_WOULD_APPLY (HB_DEBUG+0)
+#endif
+#if HB_DEBUG_WOULD_APPLY
+#define TRACE_WOULD_APPLY(this) \
+	hb_auto_trace_t<HB_DEBUG_WOULD_APPLY, bool> trace \
+	(&c->debug_depth, c->get_name (), this, HB_FUNC, \
+	 "%d glyphs", c->len);
+#else
+#define TRACE_WOULD_APPLY(this) hb_no_trace_t<bool> trace
+#endif
+
+#ifndef HB_DEBUG_DISPATCH
+#define HB_DEBUG_DISPATCH ( \
+	HB_DEBUG_APPLY + \
+	HB_DEBUG_SANITIZE + \
+	HB_DEBUG_SERIALIZE + \
+  HB_DEBUG_SUBSET + \
+	HB_DEBUG_WOULD_APPLY + \
+	0)
+#endif
+#if HB_DEBUG_DISPATCH
+#define TRACE_DISPATCH(this, format) \
+	hb_auto_trace_t<context_t::max_debug_depth, typename context_t::return_t> trace \
+	(&c->debug_depth, c->get_name (), this, HB_FUNC, \
+	 "format %d", (int) format);
+#else
+#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
+#endif
+
+
+#endif /* HB_DEBUG_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-deprecated.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-deprecated.h
new file mode 100644
index 0000000..4a5e702
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-deprecated.h
@@ -0,0 +1,226 @@
+/*
+ * Copyright © 2013  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_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_DEPRECATED_H
+#define HB_DEPRECATED_H
+
+#include "hb-common.h"
+#include "hb-unicode.h"
+#include "hb-font.h"
+#include "hb-set.h"
+
+
+/**
+ * SECTION:hb-deprecated
+ * @title: hb-deprecated
+ * @short_description: Deprecated API
+ * @include: hb.h
+ *
+ * These API have been deprecated in favor of newer API, or because they
+ * were deemed unnecessary.
+ **/
+
+
+HB_BEGIN_DECLS
+
+#ifndef HB_DISABLE_DEPRECATED
+
+
+#define HB_SCRIPT_CANADIAN_ABORIGINAL		HB_SCRIPT_CANADIAN_SYLLABICS
+
+#define HB_BUFFER_FLAGS_DEFAULT			HB_BUFFER_FLAG_DEFAULT
+#define HB_BUFFER_SERIALIZE_FLAGS_DEFAULT	HB_BUFFER_SERIALIZE_FLAG_DEFAULT
+
+typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data,
+					       hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+					       hb_codepoint_t *glyph,
+					       void *user_data);
+
+HB_EXTERN HB_DEPRECATED_FOR(hb_font_funcs_set_nominal_glyph_func or hb_font_funcs_set_variation_glyph_func) void
+hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
+			      hb_font_get_glyph_func_t func,
+			      void *user_data, hb_destroy_func_t destroy);
+
+HB_EXTERN HB_DEPRECATED void
+hb_set_invert (hb_set_t *set);
+
+/**
+ * hb_unicode_eastasian_width_func_t:
+ *
+ * Deprecated: 2.0.0
+ */
+typedef unsigned int			(*hb_unicode_eastasian_width_func_t)	(hb_unicode_funcs_t *ufuncs,
+										 hb_codepoint_t      unicode,
+										 void               *user_data);
+
+/**
+ * hb_unicode_funcs_set_eastasian_width_func:
+ * @ufuncs: a Unicode function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ * Deprecated: 2.0.0
+ **/
+HB_EXTERN HB_DEPRECATED void
+hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs,
+					   hb_unicode_eastasian_width_func_t func,
+					   void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_unicode_eastasian_width:
+ *
+ * Since: 0.9.2
+ * Deprecated: 2.0.0
+ **/
+HB_EXTERN HB_DEPRECATED unsigned int
+hb_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs,
+			    hb_codepoint_t unicode);
+
+
+/**
+ * hb_unicode_decompose_compatibility_func_t:
+ * @ufuncs: a Unicode function structure
+ * @u: codepoint to decompose
+ * @decomposed: address of codepoint array (of length %HB_UNICODE_MAX_DECOMPOSITION_LEN) to write decomposition into
+ * @user_data: user data pointer as passed to hb_unicode_funcs_set_decompose_compatibility_func()
+ *
+ * Fully decompose @u to its Unicode compatibility decomposition. The codepoints of the decomposition will be written to @decomposed.
+ * The complete length of the decomposition will be returned.
+ *
+ * If @u has no compatibility decomposition, zero should be returned.
+ *
+ * The Unicode standard guarantees that a buffer of length %HB_UNICODE_MAX_DECOMPOSITION_LEN codepoints will always be sufficient for any
+ * compatibility decomposition plus an terminating value of 0.  Consequently, @decompose must be allocated by the caller to be at least this length.  Implementations
+ * of this function type must ensure that they do not write past the provided array.
+ *
+ * Return value: number of codepoints in the full compatibility decomposition of @u, or 0 if no decomposition available.
+ *
+ * Deprecated: 2.0.0
+ */
+typedef unsigned int			(*hb_unicode_decompose_compatibility_func_t)	(hb_unicode_funcs_t *ufuncs,
+											 hb_codepoint_t      u,
+											 hb_codepoint_t     *decomposed,
+											 void               *user_data);
+
+/**
+ * HB_UNICODE_MAX_DECOMPOSITION_LEN:
+ *
+ * See Unicode 6.1 for details on the maximum decomposition length.
+ *
+ * Deprecated: 2.0.0
+ */
+#define HB_UNICODE_MAX_DECOMPOSITION_LEN (18+1) /* codepoints */
+
+/**
+ * hb_unicode_funcs_set_decompose_compatibility_func:
+ * @ufuncs: a Unicode function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ * Deprecated: 2.0.0
+ **/
+HB_EXTERN HB_DEPRECATED void
+hb_unicode_funcs_set_decompose_compatibility_func (hb_unicode_funcs_t *ufuncs,
+						   hb_unicode_decompose_compatibility_func_t func,
+						   void *user_data, hb_destroy_func_t destroy);
+
+HB_EXTERN HB_DEPRECATED unsigned int
+hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
+				    hb_codepoint_t      u,
+				    hb_codepoint_t     *decomposed);
+
+
+typedef hb_position_t (*hb_font_get_glyph_kerning_func_t) (hb_font_t *font, void *font_data,
+							   hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
+							   void *user_data);
+typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t;
+typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t;
+
+/**
+ * hb_font_funcs_set_glyph_h_kerning_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ * Deprecated: 2.0.0
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs,
+					hb_font_get_glyph_h_kerning_func_t func,
+					void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_glyph_v_kerning_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ * Deprecated: 2.0.0
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs,
+					hb_font_get_glyph_v_kerning_func_t func,
+					void *user_data, hb_destroy_func_t destroy);
+
+HB_EXTERN hb_position_t
+hb_font_get_glyph_h_kerning (hb_font_t *font,
+			     hb_codepoint_t left_glyph, hb_codepoint_t right_glyph);
+HB_EXTERN hb_position_t
+hb_font_get_glyph_v_kerning (hb_font_t *font,
+			     hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph);
+
+HB_EXTERN void
+hb_font_get_glyph_kerning_for_direction (hb_font_t *font,
+					 hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
+					 hb_direction_t direction,
+					 hb_position_t *x, hb_position_t *y);
+
+
+#endif
+
+HB_END_DECLS
+
+#endif /* HB_DEPRECATED_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-directwrite.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-directwrite.cc
new file mode 100644
index 0000000..aaf10a1
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-directwrite.cc
@@ -0,0 +1,870 @@
+/*
+ * Copyright © 2015-2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#include "hb.hh"
+#include "hb-shaper-impl.hh"
+
+#include <DWrite_1.h>
+
+#include "hb-directwrite.h"
+
+
+/*
+ * hb-directwrite uses new/delete syntatically but as we let users
+ * to override malloc/free, we will redefine new/delete so users
+ * won't need to do that by their own.
+ */
+void* operator new (size_t size)        { return malloc (size); }
+void* operator new [] (size_t size)     { return malloc (size); }
+void operator delete (void* pointer)    { free (pointer); }
+void operator delete [] (void* pointer) { free (pointer); }
+
+
+/*
+ * 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_t fontFileReferenceKeySize,
+		       OUT IDWriteFontFileStream** fontFileStream)
+  {
+    *fontFileStream = mFontFileStream;
+    return S_OK;
+  }
+
+  virtual ~DWriteFontFileLoader() {}
+};
+
+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; }
+
+  virtual ~DWriteFontFileStream() {}
+};
+
+
+/*
+* shaper face data
+*/
+
+struct hb_directwrite_face_data_t
+{
+  IDWriteFactory *dwriteFactory;
+  IDWriteFontFile *fontFile;
+  DWriteFontFileStream *fontFileStream;
+  DWriteFontFileLoader *fontFileLoader;
+  IDWriteFontFace *fontFace;
+  hb_blob_t *faceBlob;
+};
+
+hb_directwrite_face_data_t *
+_hb_directwrite_shaper_face_data_create (hb_face_t *face)
+{
+  hb_directwrite_face_data_t *data = new hb_directwrite_face_data_t;
+  if (unlikely (!data))
+    return nullptr;
+
+  // 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);
+  DWriteFontFileStream *fontFileStream;
+  fontFileStream = new DWriteFontFileStream ((uint8_t *) hb_blob_get_data (blob, nullptr),
+					     hb_blob_get_length (blob));
+
+  DWriteFontFileLoader *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, nullptr, __VA_ARGS__); \
+    return nullptr; \
+  } HB_STMT_END;
+
+  if (FAILED (hr))
+    FAIL ("Failed to load font file from data!");
+
+  BOOL isSupported;
+  DWRITE_FONT_FILE_TYPE fileType;
+  DWRITE_FONT_FACE_TYPE faceType;
+  uint32_t numberOfFaces;
+  hr = fontFile->Analyze (&isSupported, &fileType, &faceType, &numberOfFaces);
+  if (FAILED (hr) || !isSupported)
+    FAIL ("Font file is not supported.");
+
+#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_face_data_t *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)
+    delete data;
+}
+
+
+/*
+ * shaper font data
+ */
+
+struct hb_directwrite_font_data_t {};
+
+hb_directwrite_font_data_t *
+_hb_directwrite_shaper_font_data_create (hb_font_t *font)
+{
+  hb_directwrite_font_data_t *data = new hb_directwrite_font_data_t;
+  if (unlikely (!data))
+    return nullptr;
+
+  return data;
+}
+
+void
+_hb_directwrite_shaper_font_data_destroy (hb_directwrite_font_data_t *data)
+{
+  delete data;
+}
+
+
+// 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; }
+  IFACEMETHOD_ (ULONG, Release) () { return 1; }
+
+  // A single contiguous run of characters containing the same analysis
+  // results.
+  struct Run
+  {
+    uint32_t mTextStart;   // starting text position of this run
+    uint32_t mTextLength;  // number of contiguous code units covered
+    uint32_t mGlyphStart;  // starting glyph in the glyphs array
+    uint32_t mGlyphCount;  // number of glyphs associated with this run
+    // text
+    DWRITE_SCRIPT_ANALYSIS mScript;
+    uint8_t mBidiLevel;
+    bool mIsSideways;
+
+    bool ContainsTextPosition (uint32_t aTextPosition) const
+    {
+      return aTextPosition >= mTextStart &&
+	     aTextPosition <  mTextStart + mTextLength;
+    }
+
+    Run *nextRun;
+  };
+
+public:
+  TextAnalysis (const wchar_t* text, uint32_t textLength,
+		const wchar_t* localeName, DWRITE_READING_DIRECTION readingDirection)
+	       : mTextLength (textLength), mText (text), mLocaleName (localeName),
+		 mReadingDirection (readingDirection), mCurrentRun (nullptr) {}
+  ~TextAnalysis ()
+  {
+    // delete runs, except mRunHead which is part of the TextAnalysis object
+    for (Run *run = mRunHead.nextRun; run;)
+    {
+      Run *origRun = run;
+      run = run->nextRun;
+      delete origRun;
+    }
+  }
+
+  STDMETHODIMP
+  GenerateResults (IDWriteTextAnalyzer* textAnalyzer, Run **runHead)
+  {
+    // Analyzes the text using the script analyzer and returns
+    // the result as a series of runs.
+
+    HRESULT hr = S_OK;
+
+    // Initially start out with one result that covers the entire range.
+    // This result will be subdivided by the analysis processes.
+    mRunHead.mTextStart = 0;
+    mRunHead.mTextLength = mTextLength;
+    mRunHead.mBidiLevel =
+      (mReadingDirection == DWRITE_READING_DIRECTION_RIGHT_TO_LEFT);
+    mRunHead.nextRun = nullptr;
+    mCurrentRun = &mRunHead;
+
+    // Call each of the analyzers in sequence, recording their results.
+    if (SUCCEEDED (hr = textAnalyzer->AnalyzeScript (this, 0, mTextLength, this)))
+      *runHead = &mRunHead;
+
+    return hr;
+  }
+
+  // IDWriteTextAnalysisSource implementation
+
+  IFACEMETHODIMP
+  GetTextAtPosition (uint32_t textPosition,
+		     OUT wchar_t const** textString,
+		     OUT uint32_t* textLength)
+  {
+    if (textPosition >= mTextLength)
+    {
+      // No text at this position, valid query though.
+      *textString = nullptr;
+      *textLength = 0;
+    }
+    else
+    {
+      *textString = mText + textPosition;
+      *textLength = mTextLength - textPosition;
+    }
+    return S_OK;
+  }
+
+  IFACEMETHODIMP
+  GetTextBeforePosition (uint32_t textPosition,
+			 OUT wchar_t const** textString,
+			 OUT uint32_t* textLength)
+  {
+    if (textPosition == 0 || textPosition > mTextLength)
+    {
+      // Either there is no text before here (== 0), or this
+      // is an invalid position. The query is considered valid though.
+      *textString = nullptr;
+      *textLength = 0;
+    }
+    else
+    {
+      *textString = mText;
+      *textLength = textPosition;
+    }
+    return S_OK;
+  }
+
+  IFACEMETHODIMP_ (DWRITE_READING_DIRECTION)
+  GetParagraphReadingDirection () { return mReadingDirection; }
+
+  IFACEMETHODIMP GetLocaleName (uint32_t textPosition, uint32_t* textLength,
+				wchar_t const** localeName)
+  { return S_OK; }
+
+  IFACEMETHODIMP
+  GetNumberSubstitution (uint32_t textPosition,
+			 OUT uint32_t* textLength,
+			 OUT IDWriteNumberSubstitution** numberSubstitution)
+  {
+    // We do not support number substitution.
+    *numberSubstitution = nullptr;
+    *textLength = mTextLength - textPosition;
+
+    return S_OK;
+  }
+
+  // IDWriteTextAnalysisSink implementation
+
+  IFACEMETHODIMP
+  SetScriptAnalysis (uint32_t textPosition, uint32_t textLength,
+		     DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis)
+  {
+    SetCurrentRun (textPosition);
+    SplitCurrentRun (textPosition);
+    while (textLength > 0)
+    {
+      Run *run = FetchNextRun (&textLength);
+      run->mScript = *scriptAnalysis;
+    }
+
+    return S_OK;
+  }
+
+  IFACEMETHODIMP
+  SetLineBreakpoints (uint32_t textPosition,
+		      uint32_t textLength,
+		      const DWRITE_LINE_BREAKPOINT* lineBreakpoints)
+  { return S_OK; }
+
+  IFACEMETHODIMP SetBidiLevel (uint32_t textPosition, uint32_t textLength,
+			       uint8_t explicitLevel, uint8_t resolvedLevel)
+  { return S_OK; }
+
+  IFACEMETHODIMP
+  SetNumberSubstitution (uint32_t textPosition, uint32_t textLength,
+			 IDWriteNumberSubstitution* numberSubstitution)
+  { return S_OK; }
+
+protected:
+  Run *FetchNextRun (IN OUT uint32_t* textLength)
+  {
+    // 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);
+    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))
+      return;
+
+    for (Run *run = &mRunHead; run; run = run->nextRun)
+      if (run->ContainsTextPosition (textPosition))
+      {
+	mCurrentRun = run;
+	return;
+      }
+    assert (0); // We should always be able to find the text position in one of our runs
+  }
+
+  void SplitCurrentRun (uint32_t splitPosition)
+  {
+    if (!mCurrentRun)
+    {
+      assert (0); // 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)
+    {
+      // No need to split, already the start of a run
+      // or before it. Usually the first.
+      return;
+    }
+    Run *newRun = new Run;
+
+    *newRun = *mCurrentRun;
+
+    // Insert the new run in our linked list.
+    newRun->nextRun = mCurrentRun->nextRun;
+    mCurrentRun->nextRun = newRun;
+
+    // Adjust runs' text positions and lengths.
+    uint32_t splitPoint = splitPosition - mCurrentRun->mTextStart;
+    newRun->mTextStart += splitPoint;
+    newRun->mTextLength -= splitPoint;
+    mCurrentRun->mTextLength = splitPoint;
+    mCurrentRun = newRun;
+  }
+
+protected:
+  // Input
+  // (weak references are fine here, since this class is a transient
+  //  stack-based helper that doesn't need to copy data)
+  uint32_t mTextLength;
+  const wchar_t* mText;
+  const wchar_t* mLocaleName;
+  DWRITE_READING_DIRECTION mReadingDirection;
+
+  // Current processing state.
+  Run *mCurrentRun;
+
+  // Output is a list of runs starting here
+  Run  mRunHead;
+};
+
+static inline uint16_t hb_uint16_swap (const uint16_t v)
+{ return (v >> 8) | (v << 8); }
+static inline uint32_t hb_uint32_swap (const uint32_t v)
+{ return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); }
+
+/*
+ * shaper
+ */
+
+static hb_bool_t
+_hb_directwrite_shape_full (hb_shape_plan_t    *shape_plan,
+			    hb_font_t          *font,
+			    hb_buffer_t        *buffer,
+			    const hb_feature_t *features,
+			    unsigned int        num_features,
+			    float               lineWidth)
+{
+  hb_face_t *face = font->face;
+  const hb_directwrite_face_data_t *face_data = face->data.directwrite;
+  IDWriteFactory *dwriteFactory = face_data->dwriteFactory;
+  IDWriteFontFace *fontFace = face_data->fontFace;
+
+  IDWriteTextAnalyzer* analyzer;
+  dwriteFactory->CreateTextAnalyzer (&analyzer);
+
+  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); \
+    scratch += _consumed; \
+    scratch_size -= _consumed; \
+  }
+
+#define utf16_index() var1.u32
+
+  ALLOCATE_ARRAY (wchar_t, textString, buffer->len * 2);
+
+  unsigned int chars_len = 0;
+  for (unsigned int i = 0; i < buffer->len; i++)
+  {
+    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) & ((1u << 10) - 1));
+    }
+  }
+
+  ALLOCATE_ARRAY (WORD, log_clusters, chars_len);
+  /* Need log_clusters to assign features. */
+  chars_len = 0;
+  for (unsigned int i = 0; i < buffer->len; i++)
+  {
+    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. */
+  }
+
+  // TODO: Handle TEST_DISABLE_OPTIONAL_LIGATURES
+
+  DWRITE_READING_DIRECTION readingDirection;
+  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, nullptr, readingDirection);
+  TextAnalysis::Run *runHead;
+  HRESULT hr;
+  hr = analysis.GenerateResults (analyzer, &runHead);
+
+#define FAIL(...) \
+  HB_STMT_START { \
+    DEBUG_MSG (DIRECTWRITE, nullptr, __VA_ARGS__); \
+    return false; \
+  } HB_STMT_END;
+
+  if (FAILED (hr))
+    FAIL ("Analyzer failed to generate results.");
+
+  uint32_t maxGlyphCount = 3 * textLength / 2 + 16;
+  uint32_t glyphCount;
+  bool isRightToLeft = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
+
+  const wchar_t localeName[20] = {0};
+  if (buffer->props.language != nullptr)
+    mbstowcs ((wchar_t*) localeName,
+	      hb_language_to_string (buffer->props.language), 20);
+
+  // TODO: it does work but doesn't care about ranges
+  DWRITE_TYPOGRAPHIC_FEATURES typographic_features;
+  typographic_features.featureCount = num_features;
+  if (num_features)
+  {
+    typographic_features.features = new DWRITE_FONT_FEATURE[num_features];
+    for (unsigned int i = 0; i < num_features; ++i)
+    {
+      typographic_features.features[i].nameTag = (DWRITE_FONT_FEATURE_TAG)
+						 hb_uint32_swap (features[i].tag);
+      typographic_features.features[i].parameter = features[i].value;
+    }
+  }
+  const DWRITE_TYPOGRAPHIC_FEATURES* dwFeatures;
+  dwFeatures = (const DWRITE_TYPOGRAPHIC_FEATURES*) &typographic_features;
+  const uint32_t featureRangeLengths[] = { textLength };
+  //
+
+  uint16_t* clusterMap;
+  clusterMap = new uint16_t[textLength];
+  DWRITE_SHAPING_TEXT_PROPERTIES* textProperties;
+  textProperties = new DWRITE_SHAPING_TEXT_PROPERTIES[textLength];
+retry_getglyphs:
+  uint16_t* glyphIndices = new uint16_t[maxGlyphCount];
+  DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProperties;
+  glyphProperties = new DWRITE_SHAPING_GLYPH_PROPERTIES[maxGlyphCount];
+
+  hr = analyzer->GetGlyphs (textString, textLength, fontFace, false,
+			    isRightToLeft, &runHead->mScript, localeName,
+			    nullptr, &dwFeatures, featureRangeLengths, 1,
+			    maxGlyphCount, clusterMap, textProperties,
+			    glyphIndices, glyphProperties, &glyphCount);
+
+  if (unlikely (hr == HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER)))
+  {
+    delete [] glyphIndices;
+    delete [] glyphProperties;
+
+    maxGlyphCount *= 2;
+
+    goto retry_getglyphs;
+  }
+  if (FAILED (hr))
+    FAIL ("Analyzer failed to get glyphs.");
+
+  float* glyphAdvances = new float[maxGlyphCount];
+  DWRITE_GLYPH_OFFSET* glyphOffsets = new DWRITE_GLYPH_OFFSET[maxGlyphCount];
+
+  /* The -2 in the following is to compensate for possible
+   * alignment needed after the WORD array.  sizeof (WORD) == 2. */
+  unsigned int glyphs_size = (scratch_size * sizeof (int) - 2)
+			     / (sizeof (WORD) +
+			        sizeof (DWRITE_SHAPING_GLYPH_PROPERTIES) +
+			        sizeof (int) +
+			        sizeof (DWRITE_GLYPH_OFFSET) +
+			        sizeof (uint32_t));
+  ALLOCATE_ARRAY (uint32_t, vis_clusters, glyphs_size);
+
+#undef ALLOCATE_ARRAY
+
+  int fontEmSize = font->face->get_upem ();
+  if (fontEmSize < 0) fontEmSize = -fontEmSize;
+
+  if (fontEmSize < 0) fontEmSize = -fontEmSize;
+  double x_mult = (double) font->x_scale / fontEmSize;
+  double y_mult = (double) font->y_scale / fontEmSize;
+
+  hr = analyzer->GetGlyphPlacements (textString, clusterMap, textProperties,
+				     textLength, glyphIndices, glyphProperties,
+				     glyphCount, fontFace, fontEmSize,
+				     false, isRightToLeft, &runHead->mScript, localeName,
+				     &dwFeatures, featureRangeLengths, 1,
+				     glyphAdvances, glyphOffsets);
+
+  if (FAILED (hr))
+    FAIL ("Analyzer failed to get glyph placements.");
+
+  IDWriteTextAnalyzer1* analyzer1;
+  analyzer->QueryInterface (&analyzer1);
+
+  if (analyzer1 && lineWidth)
+  {
+    DWRITE_JUSTIFICATION_OPPORTUNITY* justificationOpportunities =
+      new DWRITE_JUSTIFICATION_OPPORTUNITY[maxGlyphCount];
+    hr = analyzer1->GetJustificationOpportunities (fontFace, fontEmSize, runHead->mScript,
+						   textLength, glyphCount, textString,
+						   clusterMap, glyphProperties,
+						   justificationOpportunities);
+
+    if (FAILED (hr))
+      FAIL ("Analyzer failed to get justification opportunities.");
+
+    float* justifiedGlyphAdvances = new float[maxGlyphCount];
+    DWRITE_GLYPH_OFFSET* justifiedGlyphOffsets = new DWRITE_GLYPH_OFFSET[glyphCount];
+    hr = analyzer1->JustifyGlyphAdvances (lineWidth, glyphCount, justificationOpportunities,
+					  glyphAdvances, glyphOffsets, justifiedGlyphAdvances,
+					  justifiedGlyphOffsets);
+
+    if (FAILED (hr)) FAIL ("Analyzer failed to get justify glyph advances.");
+
+    DWRITE_SCRIPT_PROPERTIES scriptProperties;
+    hr = analyzer1->GetScriptProperties (runHead->mScript, &scriptProperties);
+    if (FAILED (hr)) FAIL ("Analyzer failed to get script properties.");
+    uint32_t justificationCharacter = scriptProperties.justificationCharacter;
+
+    // if a script justificationCharacter is not space, it can have GetJustifiedGlyphs
+    if (justificationCharacter != 32)
+    {
+      uint16_t* modifiedClusterMap = new uint16_t[textLength];
+    retry_getjustifiedglyphs:
+      uint16_t* modifiedGlyphIndices = new uint16_t[maxGlyphCount];
+      float* modifiedGlyphAdvances = new float[maxGlyphCount];
+      DWRITE_GLYPH_OFFSET* modifiedGlyphOffsets = new DWRITE_GLYPH_OFFSET[maxGlyphCount];
+      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;
+	delete [] modifiedGlyphIndices;
+	delete [] modifiedGlyphAdvances;
+	delete [] modifiedGlyphOffsets;
+
+	maxGlyphCount = actualGlyphsCount;
+
+	goto retry_getjustifiedglyphs;
+      }
+      if (FAILED (hr))
+	FAIL ("Analyzer failed to get justified glyphs.");
+
+      delete [] clusterMap;
+      delete [] glyphIndices;
+      delete [] glyphAdvances;
+      delete [] glyphOffsets;
+
+      glyphCount = actualGlyphsCount;
+      clusterMap = modifiedClusterMap;
+      glyphIndices = modifiedGlyphIndices;
+      glyphAdvances = modifiedGlyphAdvances;
+      glyphOffsets = modifiedGlyphOffsets;
+
+      delete [] justifiedGlyphAdvances;
+      delete [] justifiedGlyphOffsets;
+    }
+    else
+    {
+      delete [] glyphAdvances;
+      delete [] glyphOffsets;
+
+      glyphAdvances = justifiedGlyphAdvances;
+      glyphOffsets = justifiedGlyphOffsets;
+    }
+
+    delete [] justificationOpportunities;
+  }
+
+  /* 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] = (uint32_t) -1;
+  for (unsigned int i = 0; i < buffer->len; i++)
+  {
+    uint32_t *p =
+      &vis_clusters[log_clusters[buffer->info[i].utf16_index ()]];
+    *p = MIN (*p, buffer->info[i].cluster);
+  }
+  for (unsigned int i = 1; i < glyphCount; i++)
+    if (vis_clusters[i] == (uint32_t) -1)
+      vis_clusters[i] = vis_clusters[i - 1];
+
+#undef utf16_index
+
+  if (unlikely (!buffer->ensure (glyphCount)))
+    FAIL ("Buffer in error");
+
+#undef FAIL
+
+  /* Set glyph infos */
+  buffer->len = 0;
+  for (unsigned int i = 0; i < glyphCount; i++)
+  {
+    hb_glyph_info_t *info = &buffer->info[buffer->len++];
+
+    info->codepoint = glyphIndices[i];
+    info->cluster = vis_clusters[i];
+
+    /* The rest is crap.  Let's store position info there for now. */
+    info->mask = glyphAdvances[i];
+    info->var1.i32 = glyphOffsets[i].advanceOffset;
+    info->var2.i32 = glyphOffsets[i].ascenderOffset;
+  }
+
+  /* Set glyph positions */
+  buffer->clear_positions ();
+  for (unsigned int i = 0; i < glyphCount; i++)
+  {
+    hb_glyph_info_t *info = &buffer->info[i];
+    hb_glyph_position_t *pos = &buffer->pos[i];
+
+    /* TODO vertical */
+    pos->x_advance = x_mult * (int32_t) info->mask;
+    pos->x_offset = x_mult * (isRightToLeft ? -info->var1.i32 : info->var1.i32);
+    pos->y_offset = y_mult * info->var2.i32;
+  }
+
+  if (isRightToLeft) hb_buffer_reverse (buffer);
+
+  delete [] clusterMap;
+  delete [] glyphIndices;
+  delete [] textProperties;
+  delete [] glyphProperties;
+  delete [] glyphAdvances;
+  delete [] glyphOffsets;
+
+  if (num_features)
+    delete [] typographic_features.features;
+
+  /* Wow, done! */
+  return true;
+}
+
+hb_bool_t
+_hb_directwrite_shape (hb_shape_plan_t    *shape_plan,
+		       hb_font_t          *font,
+		       hb_buffer_t        *buffer,
+		       const hb_feature_t *features,
+		       unsigned int        num_features)
+{
+  return _hb_directwrite_shape_full (shape_plan, font, buffer,
+				     features, num_features, 0);
+}
+
+/*
+ * Public [experimental] API
+ */
+
+hb_bool_t
+hb_directwrite_shape_experimental_width (hb_font_t          *font,
+					 hb_buffer_t        *buffer,
+					 const hb_feature_t *features,
+					 unsigned int        num_features,
+					 float               width)
+{
+  static const char *shapers = "directwrite";
+  hb_shape_plan_t *shape_plan;
+  shape_plan = hb_shape_plan_create_cached (font->face, &buffer->props,
+					    features, num_features, &shapers);
+  hb_bool_t res = _hb_directwrite_shape_full (shape_plan, font, buffer,
+					      features, num_features, width);
+
+  buffer->unsafe_to_break_all ();
+
+  return res;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-directwrite.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-directwrite.h
new file mode 100644
index 0000000..9bfd1f72
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-directwrite.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright © 2015  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_DIRECTWRITE_H
+#define HB_DIRECTWRITE_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+HB_EXTERN hb_bool_t
+hb_directwrite_shape_experimental_width (hb_font_t *font, hb_buffer_t *buffer,
+					 const hb_feature_t *features,
+					 unsigned int num_features, float width);
+
+HB_END_DECLS
+
+#endif /* HB_DIRECTWRITE_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-dsalgs.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-dsalgs.hh
new file mode 100644
index 0000000..cb3057c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-dsalgs.hh
@@ -0,0 +1,641 @@
+/*
+ * Copyright © 2017  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_DSALGS_HH
+#define HB_DSALGS_HH
+
+#include "hb.hh"
+#include "hb-null.hh"
+
+
+/* Void! For when we need a expression-type of void. */
+typedef const struct _hb_void_t *hb_void_t;
+#define HB_VOID ((const _hb_void_t *) nullptr)
+
+
+/*
+ * Bithacks.
+ */
+
+/* Return the number of 1 bits in v. */
+template <typename T>
+static inline HB_CONST_FUNC unsigned int
+hb_popcount (T v)
+{
+#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
+  if (sizeof (T) <= sizeof (unsigned int))
+    return __builtin_popcount (v);
+
+  if (sizeof (T) <= sizeof (unsigned long))
+    return __builtin_popcountl (v);
+
+  if (sizeof (T) <= sizeof (unsigned long long))
+    return __builtin_popcountll (v);
+#endif
+
+  if (sizeof (T) <= 4)
+  {
+    /* "HACKMEM 169" */
+    uint32_t y;
+    y = (v >> 1) &033333333333;
+    y = v - y - ((y >>1) & 033333333333);
+    return (((y + (y >> 3)) & 030707070707) % 077);
+  }
+
+  if (sizeof (T) == 8)
+  {
+    unsigned int shift = 32;
+    return hb_popcount<uint32_t> ((uint32_t) v) + hb_popcount ((uint32_t) (v >> shift));
+  }
+
+  if (sizeof (T) == 16)
+  {
+    unsigned int shift = 64;
+    return hb_popcount<uint64_t> ((uint64_t) v) + hb_popcount ((uint64_t) (v >> shift));
+  }
+
+  assert (0);
+  return 0; /* Shut up stupid compiler. */
+}
+
+/* Returns the number of bits needed to store number */
+template <typename T>
+static inline HB_CONST_FUNC unsigned int
+hb_bit_storage (T v)
+{
+  if (unlikely (!v)) return 0;
+
+#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
+  if (sizeof (T) <= sizeof (unsigned int))
+    return sizeof (unsigned int) * 8 - __builtin_clz (v);
+
+  if (sizeof (T) <= sizeof (unsigned long))
+    return sizeof (unsigned long) * 8 - __builtin_clzl (v);
+
+  if (sizeof (T) <= sizeof (unsigned long long))
+    return sizeof (unsigned long long) * 8 - __builtin_clzll (v);
+#endif
+
+#if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__)
+  if (sizeof (T) <= sizeof (unsigned int))
+  {
+    unsigned long where;
+    _BitScanReverse (&where, v);
+    return 1 + where;
+  }
+# if defined(_WIN64)
+  if (sizeof (T) <= 8)
+  {
+    unsigned long where;
+    _BitScanReverse64 (&where, v);
+    return 1 + where;
+  }
+# endif
+#endif
+
+  if (sizeof (T) <= 4)
+  {
+    /* "bithacks" */
+    const unsigned int b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
+    const unsigned int S[] = {1, 2, 4, 8, 16};
+    unsigned int r = 0;
+    for (int i = 4; i >= 0; i--)
+      if (v & b[i])
+      {
+	v >>= S[i];
+	r |= S[i];
+      }
+    return r + 1;
+  }
+  if (sizeof (T) <= 8)
+  {
+    /* "bithacks" */
+    const uint64_t b[] = {0x2ULL, 0xCULL, 0xF0ULL, 0xFF00ULL, 0xFFFF0000ULL, 0xFFFFFFFF00000000ULL};
+    const unsigned int S[] = {1, 2, 4, 8, 16, 32};
+    unsigned int r = 0;
+    for (int i = 5; i >= 0; i--)
+      if (v & b[i])
+      {
+	v >>= S[i];
+	r |= S[i];
+      }
+    return r + 1;
+  }
+  if (sizeof (T) == 16)
+  {
+    unsigned int shift = 64;
+    return (v >> shift) ? hb_bit_storage<uint64_t> ((uint64_t) (v >> shift)) + shift :
+			  hb_bit_storage<uint64_t> ((uint64_t) v);
+  }
+
+  assert (0);
+  return 0; /* Shut up stupid compiler. */
+}
+
+/* Returns the number of zero bits in the least significant side of v */
+template <typename T>
+static inline HB_CONST_FUNC unsigned int
+hb_ctz (T v)
+{
+  if (unlikely (!v)) return 0;
+
+#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
+  if (sizeof (T) <= sizeof (unsigned int))
+    return __builtin_ctz (v);
+
+  if (sizeof (T) <= sizeof (unsigned long))
+    return __builtin_ctzl (v);
+
+  if (sizeof (T) <= sizeof (unsigned long long))
+    return __builtin_ctzll (v);
+#endif
+
+#if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__)
+  if (sizeof (T) <= sizeof (unsigned int))
+  {
+    unsigned long where;
+    _BitScanForward (&where, v);
+    return where;
+  }
+# if defined(_WIN64)
+  if (sizeof (T) <= 8)
+  {
+    unsigned long where;
+    _BitScanForward64 (&where, v);
+    return where;
+  }
+# endif
+#endif
+
+  if (sizeof (T) <= 4)
+  {
+    /* "bithacks" */
+    unsigned int c = 32;
+    v &= - (int32_t) v;
+    if (v) c--;
+    if (v & 0x0000FFFF) c -= 16;
+    if (v & 0x00FF00FF) c -= 8;
+    if (v & 0x0F0F0F0F) c -= 4;
+    if (v & 0x33333333) c -= 2;
+    if (v & 0x55555555) c -= 1;
+    return c;
+  }
+  if (sizeof (T) <= 8)
+  {
+    /* "bithacks" */
+    unsigned int c = 64;
+    v &= - (int64_t) (v);
+    if (v) c--;
+    if (v & 0x00000000FFFFFFFFULL) c -= 32;
+    if (v & 0x0000FFFF0000FFFFULL) c -= 16;
+    if (v & 0x00FF00FF00FF00FFULL) c -= 8;
+    if (v & 0x0F0F0F0F0F0F0F0FULL) c -= 4;
+    if (v & 0x3333333333333333ULL) c -= 2;
+    if (v & 0x5555555555555555ULL) c -= 1;
+    return c;
+  }
+  if (sizeof (T) == 16)
+  {
+    unsigned int shift = 64;
+    return (uint64_t) v ? hb_bit_storage<uint64_t> ((uint64_t) v) :
+			  hb_bit_storage<uint64_t> ((uint64_t) (v >> shift)) + shift;
+  }
+
+  assert (0);
+  return 0; /* Shut up stupid compiler. */
+}
+
+
+/*
+ * Tiny stuff.
+ */
+
+template <typename T>
+static inline T* hb_addressof (T& arg)
+{
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-align"
+  /* https://en.cppreference.com/w/cpp/memory/addressof */
+  return reinterpret_cast<T*>(
+	   &const_cast<char&>(
+	      reinterpret_cast<const volatile char&>(arg)));
+#pragma GCC diagnostic pop
+}
+
+/* ASCII tag/character handling */
+static inline bool ISALPHA (unsigned char c)
+{ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); }
+static inline bool ISALNUM (unsigned char c)
+{ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'); }
+static inline bool ISSPACE (unsigned char c)
+{ return c == ' ' || c =='\f'|| c =='\n'|| c =='\r'|| c =='\t'|| c =='\v'; }
+static inline unsigned char TOUPPER (unsigned char c)
+{ return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c; }
+static inline unsigned char TOLOWER (unsigned char c)
+{ return (c >= 'A' && c <= 'Z') ? c - 'A' + 'a' : c; }
+
+#undef MIN
+template <typename Type>
+static inline Type MIN (const Type &a, const Type &b) { return a < b ? a : b; }
+
+#undef MAX
+template <typename Type>
+static inline Type MAX (const Type &a, const Type &b) { return a > b ? a : b; }
+
+static inline unsigned int DIV_CEIL (const unsigned int a, unsigned int b)
+{ return (a + (b - 1)) / b; }
+
+
+#undef  ARRAY_LENGTH
+template <typename Type, unsigned int n>
+static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; }
+/* A const version, but does not detect erratically being called on pointers. */
+#define ARRAY_LENGTH_CONST(__array) ((signed int) (sizeof (__array) / sizeof (__array[0])))
+
+
+static inline int
+hb_memcmp (const void *a, const void *b, unsigned int len)
+{
+  /* It's illegal to pass NULL to memcmp(), even if len is zero.
+   * So, wrap it.
+   * https://sourceware.org/bugzilla/show_bug.cgi?id=23878 */
+  if (!len) return 0;
+  return memcmp (a, b, len);
+}
+
+static inline bool
+hb_unsigned_mul_overflows (unsigned int count, unsigned int size)
+{
+  return (size > 0) && (count >= ((unsigned int) -1) / size);
+}
+
+static inline unsigned int
+hb_ceil_to_4 (unsigned int v)
+{
+  return ((v - 1) | 3) + 1;
+}
+
+template <typename T> struct hb_is_signed;
+template <> struct hb_is_signed<signed char> { enum { value = true }; };
+template <> struct hb_is_signed<signed short> { enum { value = true }; };
+template <> struct hb_is_signed<signed int> { enum { value = true }; };
+template <> struct hb_is_signed<signed long> { enum { value = true }; };
+template <> struct hb_is_signed<unsigned char> { enum { value = false }; };
+template <> struct hb_is_signed<unsigned short> { enum { value = false }; };
+template <> struct hb_is_signed<unsigned int> { enum { value = false }; };
+template <> struct hb_is_signed<unsigned long> { enum { value = false }; };
+/* We need to define hb_is_signed for the typedefs we use on pre-Visual
+ * Studio 2010 for the int8_t type, since __int8/__int64 is not considered
+ * the same as char/long.  The previous lines will suffice for the other
+ * types, though.  Note that somehow, unsigned __int8 is considered same
+ * as unsigned char.
+ * https://github.com/harfbuzz/harfbuzz/pull/1499
+ */
+#if defined(_MSC_VER) && (_MSC_VER < 1600)
+template <> struct hb_is_signed<__int8> { enum { value = true }; };
+#endif
+
+template <typename T> static inline bool
+hb_in_range (T u, T lo, T hi)
+{
+  /* The sizeof() is here to force template instantiation.
+   * I'm sure there are better ways to do this but can't think of
+   * one right now.  Declaring a variable won't work as HB_UNUSED
+   * is unusable on some platforms and unused types are less likely
+   * to generate a warning than unused variables. */
+  static_assert (!hb_is_signed<T>::value, "");
+
+  /* The casts below are important as if T is smaller than int,
+   * the subtract results will become a signed int! */
+  return (T)(u - lo) <= (T)(hi - lo);
+}
+template <typename T> static inline bool
+hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2)
+{
+  return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2);
+}
+template <typename T> static inline bool
+hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3)
+{
+  return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2) || hb_in_range (u, lo3, hi3);
+}
+
+
+/*
+ * Sort and search.
+ */
+
+static inline void *
+hb_bsearch (const void *key, const void *base,
+	    size_t nmemb, size_t size,
+	    int (*compar)(const void *_key, const void *_item))
+{
+  int min = 0, max = (int) nmemb - 1;
+  while (min <= max)
+  {
+    int mid = (min + max) / 2;
+    const void *p = (const void *) (((const char *) base) + (mid * size));
+    int c = compar (key, p);
+    if (c < 0)
+      max = mid - 1;
+    else if (c > 0)
+      min = mid + 1;
+    else
+      return (void *) p;
+  }
+  return nullptr;
+}
+
+static inline void *
+hb_bsearch_r (const void *key, const void *base,
+	      size_t nmemb, size_t size,
+	      int (*compar)(const void *_key, const void *_item, void *_arg),
+	      void *arg)
+{
+  int min = 0, max = (int) nmemb - 1;
+  while (min <= max)
+  {
+    int mid = ((unsigned int) min + (unsigned int) max) / 2;
+    const void *p = (const void *) (((const char *) base) + (mid * size));
+    int c = compar (key, p, arg);
+    if (c < 0)
+      max = mid - 1;
+    else if (c > 0)
+      min = mid + 1;
+    else
+      return (void *) p;
+  }
+  return nullptr;
+}
+
+
+/* From https://github.com/noporpoise/sort_r
+ * With following modifications:
+ *
+ * 10 November 2018:
+ * https://github.com/noporpoise/sort_r/issues/7
+ */
+
+/* Isaac Turner 29 April 2014 Public Domain */
+
+/*
+
+hb_sort_r function to be exported.
+
+Parameters:
+  base is the array to be sorted
+  nel is the number of elements in the array
+  width is the size in bytes of each element of the array
+  compar is the comparison function
+  arg is a pointer to be passed to the comparison function
+
+void hb_sort_r(void *base, size_t nel, size_t width,
+               int (*compar)(const void *_a, const void *_b, void *_arg),
+               void *arg);
+*/
+
+
+/* swap a, b iff a>b */
+/* __restrict is same as restrict but better support on old machines */
+static int sort_r_cmpswap(char *__restrict a, char *__restrict b, size_t w,
+			  int (*compar)(const void *_a, const void *_b,
+					void *_arg),
+			  void *arg)
+{
+  char tmp, *end = a+w;
+  if(compar(a, b, arg) > 0) {
+    for(; a < end; a++, b++) { tmp = *a; *a = *b; *b = tmp; }
+    return 1;
+  }
+  return 0;
+}
+
+/* Note: quicksort is not stable, equivalent values may be swapped */
+static inline void sort_r_simple(void *base, size_t nel, size_t w,
+				 int (*compar)(const void *_a, const void *_b,
+					       void *_arg),
+				 void *arg)
+{
+  char *b = (char *)base, *end = b + nel*w;
+  if(nel < 7) {
+    /* Insertion sort for arbitrarily small inputs */
+    char *pi, *pj;
+    for(pi = b+w; pi < end; pi += w) {
+      for(pj = pi; pj > b && sort_r_cmpswap(pj-w,pj,w,compar,arg); pj -= w) {}
+    }
+  }
+  else
+  {
+    /* nel > 6; Quicksort */
+
+    /* Use median of first, middle and last items as pivot */
+    char *x, *y, *xend, ch;
+    char *pl, *pm, *pr;
+    char *last = b+w*(nel-1), *tmp;
+    char *l[3];
+    l[0] = b;
+    l[1] = b+w*(nel/2);
+    l[2] = last;
+
+    if(compar(l[0],l[1],arg) > 0) { tmp=l[0]; l[0]=l[1]; l[1]=tmp; }
+    if(compar(l[1],l[2],arg) > 0) {
+      tmp=l[1]; l[1]=l[2]; l[2]=tmp; /* swap(l[1],l[2]) */
+      if(compar(l[0],l[1],arg) > 0) { tmp=l[0]; l[0]=l[1]; l[1]=tmp; }
+    }
+
+    /* swap l[id], l[2] to put pivot as last element */
+    for(x = l[1], y = last, xend = x+w; x<xend; x++, y++) {
+      ch = *x; *x = *y; *y = ch;
+    }
+
+    pl = b;
+    pr = last;
+
+    while(pl < pr) {
+      pm = pl+((pr-pl+1)>>1);
+      for(; pl < pm; pl += w) {
+        if(sort_r_cmpswap(pl, pr, w, compar, arg)) {
+          pr -= w; /* pivot now at pl */
+          break;
+        }
+      }
+      pm = pl+((pr-pl)>>1);
+      for(; pm < pr; pr -= w) {
+        if(sort_r_cmpswap(pl, pr, w, compar, arg)) {
+          pl += w; /* pivot now at pr */
+          break;
+        }
+      }
+    }
+
+    sort_r_simple(b, (pl-b)/w, w, compar, arg);
+    sort_r_simple(pl+w, (end-(pl+w))/w, w, compar, arg);
+  }
+}
+
+static inline void hb_sort_r(void *base, size_t nel, size_t width,
+			     int (*compar)(const void *_a, const void *_b, void *_arg),
+			     void *arg)
+{
+    sort_r_simple(base, nel, width, compar, arg);
+}
+
+
+template <typename T, typename T2> static inline void
+hb_stable_sort (T *array, unsigned int len, int(*compar)(const T *, const T *), T2 *array2)
+{
+  for (unsigned int i = 1; i < len; i++)
+  {
+    unsigned int j = i;
+    while (j && compar (&array[j - 1], &array[i]) > 0)
+      j--;
+    if (i == j)
+      continue;
+    /* Move item i to occupy place for item j, shift what's in between. */
+    {
+      T t = array[i];
+      memmove (&array[j + 1], &array[j], (i - j) * sizeof (T));
+      array[j] = t;
+    }
+    if (array2)
+    {
+      T2 t = array2[i];
+      memmove (&array2[j + 1], &array2[j], (i - j) * sizeof (T2));
+      array2[j] = t;
+    }
+  }
+}
+
+template <typename T> static inline void
+hb_stable_sort (T *array, unsigned int len, int(*compar)(const T *, const T *))
+{
+  hb_stable_sort (array, len, compar, (int *) nullptr);
+}
+
+static inline hb_bool_t
+hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *out)
+{
+  /* Pain because we don't know whether s is nul-terminated. */
+  char buf[64];
+  len = MIN (ARRAY_LENGTH (buf) - 1, len);
+  strncpy (buf, s, len);
+  buf[len] = '\0';
+
+  char *end;
+  errno = 0;
+  unsigned long v = strtoul (buf, &end, base);
+  if (errno) return false;
+  if (*end) return false;
+  *out = v;
+  return true;
+}
+
+
+struct HbOpOr
+{
+  static constexpr bool passthru_left = true;
+  static constexpr bool passthru_right = true;
+  template <typename T> static void process (T &o, const T &a, const T &b) { o = a | b; }
+};
+struct HbOpAnd
+{
+  static constexpr bool passthru_left = false;
+  static constexpr bool passthru_right = false;
+  template <typename T> static void process (T &o, const T &a, const T &b) { o = a & b; }
+};
+struct HbOpMinus
+{
+  static constexpr bool passthru_left = true;
+  static constexpr bool passthru_right = false;
+  template <typename T> static void process (T &o, const T &a, const T &b) { o = a & ~b; }
+};
+struct HbOpXor
+{
+  static constexpr bool passthru_left = true;
+  static constexpr bool passthru_right = true;
+  template <typename T> static void process (T &o, const T &a, const T &b) { o = a ^ b; }
+};
+
+
+/* Compiler-assisted vectorization. */
+
+/* Type behaving similar to vectorized vars defined using __attribute__((vector_size(...))),
+ * using vectorized operations if HB_VECTOR_SIZE is set to **bit** numbers (eg 128).
+ * Define that to 0 to disable. */
+template <typename elt_t, unsigned int byte_size>
+struct hb_vector_size_t
+{
+  elt_t& operator [] (unsigned int i) { return u.v[i]; }
+  const elt_t& operator [] (unsigned int i) const { return u.v[i]; }
+
+  void clear (unsigned char v = 0) { memset (this, v, sizeof (*this)); }
+
+  template <class Op>
+  hb_vector_size_t process (const hb_vector_size_t &o) const
+  {
+    hb_vector_size_t r;
+#if HB_VECTOR_SIZE
+    if (HB_VECTOR_SIZE && 0 == (byte_size * 8) % HB_VECTOR_SIZE)
+      for (unsigned int i = 0; i < ARRAY_LENGTH (u.vec); i++)
+	Op::process (r.u.vec[i], u.vec[i], o.u.vec[i]);
+    else
+#endif
+      for (unsigned int i = 0; i < ARRAY_LENGTH (u.v); i++)
+	Op::process (r.u.v[i], u.v[i], o.u.v[i]);
+    return r;
+  }
+  hb_vector_size_t operator | (const hb_vector_size_t &o) const
+  { return process<HbOpOr> (o); }
+  hb_vector_size_t operator & (const hb_vector_size_t &o) const
+  { return process<HbOpAnd> (o); }
+  hb_vector_size_t operator ^ (const hb_vector_size_t &o) const
+  { return process<HbOpXor> (o); }
+  hb_vector_size_t operator ~ () const
+  {
+    hb_vector_size_t r;
+#if HB_VECTOR_SIZE && 0
+    if (HB_VECTOR_SIZE && 0 == (byte_size * 8) % HB_VECTOR_SIZE)
+      for (unsigned int i = 0; i < ARRAY_LENGTH (u.vec); i++)
+	r.u.vec[i] = ~u.vec[i];
+    else
+#endif
+    for (unsigned int i = 0; i < ARRAY_LENGTH (u.v); i++)
+      r.u.v[i] = ~u.v[i];
+    return r;
+  }
+
+  private:
+  static_assert (byte_size / sizeof (elt_t) * sizeof (elt_t) == byte_size, "");
+  union {
+    elt_t v[byte_size / sizeof (elt_t)];
+#if HB_VECTOR_SIZE
+    hb_vector_size_impl_t vec[byte_size / sizeof (hb_vector_size_impl_t)];
+#endif
+  } u;
+};
+
+
+#endif /* HB_DSALGS_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-face.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-face.cc
new file mode 100644
index 0000000..375ef92
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-face.cc
@@ -0,0 +1,723 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#include "hb-face.hh"
+#include "hb-blob.hh"
+#include "hb-open-file.hh"
+#include "hb-ot-face.hh"
+#include "hb-ot-cmap-table.hh"
+
+
+/**
+ * SECTION:hb-face
+ * @title: hb-face
+ * @short_description: Font face objects
+ * @include: hb.h
+ *
+ * Font face is objects represent a single face in a font family.
+ * More exactly, a font face represents a single face in a binary font file.
+ * Font faces are typically built from a binary blob and a face index.
+ * Font faces are used to create fonts.
+ **/
+
+
+/**
+ * hb_face_count:
+ * @blob: a blob.
+ *
+ * Get number of faces in a blob.
+ *
+ * Return value: Number of faces in @blob
+ *
+ * Since: 1.7.7
+ **/
+unsigned int
+hb_face_count (hb_blob_t *blob)
+{
+  if (unlikely (!blob))
+    return 0;
+
+  /* TODO We shouldn't be sanitizing blob.  Port to run sanitizer and return if not sane. */
+  /* Make API signature const after. */
+  hb_blob_t *sanitized = hb_sanitize_context_t ().sanitize_blob<OT::OpenTypeFontFile> (hb_blob_reference (blob));
+  const OT::OpenTypeFontFile& ot = *sanitized->as<OT::OpenTypeFontFile> ();
+  unsigned int ret = ot.get_face_count ();
+  hb_blob_destroy (sanitized);
+
+  return ret;
+}
+
+/*
+ * hb_face_t
+ */
+
+DEFINE_NULL_INSTANCE (hb_face_t) =
+{
+  HB_OBJECT_HEADER_STATIC,
+
+  nullptr, /* reference_table_func */
+  nullptr, /* user_data */
+  nullptr, /* destroy */
+
+  0,    /* index */
+  HB_ATOMIC_INT_INIT (1000), /* upem */
+  HB_ATOMIC_INT_INIT (0),    /* num_glyphs */
+
+  /* Zero for the rest is fine. */
+};
+
+
+/**
+ * hb_face_create_for_tables:
+ * @reference_table_func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Return value: (transfer full)
+ *
+ * Since: 0.9.2
+ **/
+hb_face_t *
+hb_face_create_for_tables (hb_reference_table_func_t  reference_table_func,
+			   void                      *user_data,
+			   hb_destroy_func_t          destroy)
+{
+  hb_face_t *face;
+
+  if (!reference_table_func || !(face = hb_object_create<hb_face_t> ())) {
+    if (destroy)
+      destroy (user_data);
+    return hb_face_get_empty ();
+  }
+
+  face->reference_table_func = reference_table_func;
+  face->user_data = user_data;
+  face->destroy = destroy;
+
+  face->num_glyphs.set_relaxed (-1);
+
+  face->data.init0 (face);
+  face->table.init0 (face);
+
+  return face;
+}
+
+
+typedef struct hb_face_for_data_closure_t {
+  hb_blob_t *blob;
+  unsigned int  index;
+} hb_face_for_data_closure_t;
+
+static hb_face_for_data_closure_t *
+_hb_face_for_data_closure_create (hb_blob_t *blob, unsigned int index)
+{
+  hb_face_for_data_closure_t *closure;
+
+  closure = (hb_face_for_data_closure_t *) calloc (1, sizeof (hb_face_for_data_closure_t));
+  if (unlikely (!closure))
+    return nullptr;
+
+  closure->blob = blob;
+  closure->index = index;
+
+  return closure;
+}
+
+static void
+_hb_face_for_data_closure_destroy (void *data)
+{
+  hb_face_for_data_closure_t *closure = (hb_face_for_data_closure_t *) data;
+
+  hb_blob_destroy (closure->blob);
+  free (closure);
+}
+
+static hb_blob_t *
+_hb_face_for_data_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
+{
+  hb_face_for_data_closure_t *data = (hb_face_for_data_closure_t *) user_data;
+
+  if (tag == HB_TAG_NONE)
+    return hb_blob_reference (data->blob);
+
+  const OT::OpenTypeFontFile &ot_file = *data->blob->as<OT::OpenTypeFontFile> ();
+  unsigned int base_offset;
+  const OT::OpenTypeFontFace &ot_face = ot_file.get_face (data->index, &base_offset);
+
+  const OT::OpenTypeTable &table = ot_face.get_table_by_tag (tag);
+
+  hb_blob_t *blob = hb_blob_create_sub_blob (data->blob, base_offset + table.offset, table.length);
+
+  return blob;
+}
+
+/**
+ * hb_face_create: (Xconstructor)
+ * @blob:
+ * @index:
+ *
+ *
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.2
+ **/
+hb_face_t *
+hb_face_create (hb_blob_t    *blob,
+		unsigned int  index)
+{
+  hb_face_t *face;
+
+  if (unlikely (!blob))
+    blob = hb_blob_get_empty ();
+
+  hb_face_for_data_closure_t *closure = _hb_face_for_data_closure_create (hb_sanitize_context_t ().sanitize_blob<OT::OpenTypeFontFile> (hb_blob_reference (blob)), index);
+
+  if (unlikely (!closure))
+    return hb_face_get_empty ();
+
+  face = hb_face_create_for_tables (_hb_face_for_data_reference_table,
+				    closure,
+				    _hb_face_for_data_closure_destroy);
+
+  face->index = index;
+
+  return face;
+}
+
+/**
+ * hb_face_get_empty:
+ *
+ *
+ *
+ * Return value: (transfer full)
+ *
+ * Since: 0.9.2
+ **/
+hb_face_t *
+hb_face_get_empty ()
+{
+  return const_cast<hb_face_t *> (&Null(hb_face_t));
+}
+
+
+/**
+ * hb_face_reference: (skip)
+ * @face: a face.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_face_t *
+hb_face_reference (hb_face_t *face)
+{
+  return hb_object_reference (face);
+}
+
+/**
+ * hb_face_destroy: (skip)
+ * @face: a face.
+ *
+ *
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_face_destroy (hb_face_t *face)
+{
+  if (!hb_object_destroy (face)) return;
+
+  for (hb_face_t::plan_node_t *node = face->shape_plans; node; )
+  {
+    hb_face_t::plan_node_t *next = node->next;
+    hb_shape_plan_destroy (node->shape_plan);
+    free (node);
+    node = next;
+  }
+
+  face->data.fini ();
+  face->table.fini ();
+
+  if (face->destroy)
+    face->destroy (face->user_data);
+
+  free (face);
+}
+
+/**
+ * hb_face_set_user_data: (skip)
+ * @face: a face.
+ * @key:
+ * @data:
+ * @destroy:
+ * @replace:
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_face_set_user_data (hb_face_t          *face,
+		       hb_user_data_key_t *key,
+		       void *              data,
+		       hb_destroy_func_t   destroy,
+		       hb_bool_t           replace)
+{
+  return hb_object_set_user_data (face, key, data, destroy, replace);
+}
+
+/**
+ * hb_face_get_user_data: (skip)
+ * @face: a face.
+ * @key:
+ *
+ *
+ *
+ * Return value: (transfer none):
+ *
+ * Since: 0.9.2
+ **/
+void *
+hb_face_get_user_data (const hb_face_t    *face,
+		       hb_user_data_key_t *key)
+{
+  return hb_object_get_user_data (face, key);
+}
+
+/**
+ * hb_face_make_immutable:
+ * @face: a face.
+ *
+ *
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_face_make_immutable (hb_face_t *face)
+{
+  if (hb_object_is_immutable (face))
+    return;
+
+  hb_object_make_immutable (face);
+}
+
+/**
+ * hb_face_is_immutable:
+ * @face: a face.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_face_is_immutable (const hb_face_t *face)
+{
+  return hb_object_is_immutable (face);
+}
+
+
+/**
+ * hb_face_reference_table:
+ * @face: a face.
+ * @tag:
+ *
+ *
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.2
+ **/
+hb_blob_t *
+hb_face_reference_table (const hb_face_t *face,
+			 hb_tag_t tag)
+{
+  return face->reference_table (tag);
+}
+
+/**
+ * hb_face_reference_blob:
+ * @face: a face.
+ *
+ *
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.2
+ **/
+hb_blob_t *
+hb_face_reference_blob (hb_face_t *face)
+{
+  return face->reference_table (HB_TAG_NONE);
+}
+
+/**
+ * hb_face_set_index:
+ * @face: a face.
+ * @index:
+ *
+ *
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_face_set_index (hb_face_t    *face,
+		   unsigned int  index)
+{
+  if (hb_object_is_immutable (face))
+    return;
+
+  face->index = index;
+}
+
+/**
+ * hb_face_get_index:
+ * @face: a face.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+unsigned int
+hb_face_get_index (const hb_face_t *face)
+{
+  return face->index;
+}
+
+/**
+ * hb_face_set_upem:
+ * @face: a face.
+ * @upem:
+ *
+ *
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_face_set_upem (hb_face_t    *face,
+		  unsigned int  upem)
+{
+  if (hb_object_is_immutable (face))
+    return;
+
+  face->upem.set_relaxed (upem);
+}
+
+/**
+ * hb_face_get_upem:
+ * @face: a face.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+unsigned int
+hb_face_get_upem (const hb_face_t *face)
+{
+  return face->get_upem ();
+}
+
+/**
+ * hb_face_set_glyph_count:
+ * @face: a face.
+ * @glyph_count:
+ *
+ *
+ *
+ * Since: 0.9.7
+ **/
+void
+hb_face_set_glyph_count (hb_face_t    *face,
+			 unsigned int  glyph_count)
+{
+  if (hb_object_is_immutable (face))
+    return;
+
+  face->num_glyphs.set_relaxed (glyph_count);
+}
+
+/**
+ * hb_face_get_glyph_count:
+ * @face: a face.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.7
+ **/
+unsigned int
+hb_face_get_glyph_count (const hb_face_t *face)
+{
+  return face->get_num_glyphs ();
+}
+
+/**
+ * hb_face_get_table_tags:
+ * @face: a face.
+ * @start_offset: index of first tag to return.
+ * @table_count: input length of @table_tags array, output number of items written.
+ * @table_tags: array to write tags into.
+ *
+ * Retrieves table tags for a face, if possible.
+ *
+ * Return value: total number of tables, or 0 if not possible to list.
+ *
+ * Since: 1.6.0
+ **/
+unsigned int
+hb_face_get_table_tags (const hb_face_t *face,
+			unsigned int  start_offset,
+			unsigned int *table_count, /* IN/OUT */
+			hb_tag_t     *table_tags /* OUT */)
+{
+  if (face->destroy != (hb_destroy_func_t) _hb_face_for_data_closure_destroy)
+  {
+    if (table_count)
+      *table_count = 0;
+    return 0;
+  }
+
+  hb_face_for_data_closure_t *data = (hb_face_for_data_closure_t *) face->user_data;
+
+  const OT::OpenTypeFontFile &ot_file = *data->blob->as<OT::OpenTypeFontFile> ();
+  const OT::OpenTypeFontFace &ot_face = ot_file.get_face (data->index);
+
+  return ot_face.get_table_tags (start_offset, table_count, table_tags);
+}
+
+
+/*
+ * Character set.
+ */
+
+
+/**
+ * hb_face_collect_unicodes:
+ * @face: font face.
+ * @out: set to add Unicode characters covered by @face to.
+ *
+ * Since: 1.9.0
+ */
+void
+hb_face_collect_unicodes (hb_face_t *face,
+			  hb_set_t  *out)
+{
+  face->table.cmap->collect_unicodes (out);
+}
+
+/**
+ * hb_face_collect_variation_selectors:
+ * @face: font face.
+ * @out: set to add Variation Selector characters covered by @face to.
+ *
+ *
+ *
+ * Since: 1.9.0
+ */
+void
+hb_face_collect_variation_selectors (hb_face_t *face,
+				     hb_set_t  *out)
+{
+  face->table.cmap->collect_variation_selectors (out);
+}
+
+/**
+ * hb_face_collect_variation_unicodes:
+ * @face: font face.
+ * @out: set to add Unicode characters for @variation_selector covered by @face to.
+ *
+ *
+ *
+ * Since: 1.9.0
+ */
+void
+hb_face_collect_variation_unicodes (hb_face_t *face,
+				    hb_codepoint_t variation_selector,
+				    hb_set_t  *out)
+{
+  face->table.cmap->collect_variation_unicodes (variation_selector, out);
+}
+
+
+
+/*
+ * face-builder: A face that has add_table().
+ */
+
+struct hb_face_builder_data_t
+{
+  struct table_entry_t
+  {
+    int cmp (hb_tag_t t) const
+    {
+      if (t < tag) return -1;
+      if (t > tag) return -1;
+      return 0;
+    }
+
+    hb_tag_t   tag;
+    hb_blob_t *blob;
+  };
+
+  hb_vector_t<table_entry_t> tables;
+};
+
+static hb_face_builder_data_t *
+_hb_face_builder_data_create ()
+{
+  hb_face_builder_data_t *data = (hb_face_builder_data_t *) calloc (1, sizeof (hb_face_builder_data_t));
+  if (unlikely (!data))
+    return nullptr;
+
+  data->tables.init ();
+
+  return data;
+}
+
+static void
+_hb_face_builder_data_destroy (void *user_data)
+{
+  hb_face_builder_data_t *data = (hb_face_builder_data_t *) user_data;
+
+  for (unsigned int i = 0; i < data->tables.length; i++)
+    hb_blob_destroy (data->tables[i].blob);
+
+  data->tables.fini ();
+
+  free (data);
+}
+
+static hb_blob_t *
+_hb_face_builder_data_reference_blob (hb_face_builder_data_t *data)
+{
+
+  unsigned int table_count = data->tables.length;
+  unsigned int face_length = table_count * 16 + 12;
+
+  for (unsigned int i = 0; i < table_count; i++)
+    face_length += hb_ceil_to_4 (hb_blob_get_length (data->tables[i].blob));
+
+  char *buf = (char *) malloc (face_length);
+  if (unlikely (!buf))
+    return nullptr;
+
+  hb_serialize_context_t c (buf, face_length);
+  c.propagate_error (data->tables);
+  OT::OpenTypeFontFile *f = c.start_serialize<OT::OpenTypeFontFile> ();
+
+  bool is_cff = data->tables.lsearch (HB_TAG ('C','F','F',' ')) || data->tables.lsearch (HB_TAG ('C','F','F','2'));
+  hb_tag_t sfnt_tag = is_cff ? OT::OpenTypeFontFile::CFFTag : OT::OpenTypeFontFile::TrueTypeTag;
+
+  bool ret = f->serialize_single (&c, sfnt_tag, data->tables.as_array ());
+
+  c.end_serialize ();
+
+  if (unlikely (!ret))
+  {
+    free (buf);
+    return nullptr;
+  }
+
+  return hb_blob_create (buf, face_length, HB_MEMORY_MODE_WRITABLE, buf, free);
+}
+
+static hb_blob_t *
+_hb_face_builder_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
+{
+  hb_face_builder_data_t *data = (hb_face_builder_data_t *) user_data;
+
+  if (!tag)
+    return _hb_face_builder_data_reference_blob (data);
+
+  hb_face_builder_data_t::table_entry_t *entry = data->tables.lsearch (tag);
+  if (entry)
+    return hb_blob_reference (entry->blob);
+
+  return nullptr;
+}
+
+
+/**
+ * hb_face_builder_create:
+ *
+ * Creates a #hb_face_t that can be used with hb_face_builder_add_table().
+ * After tables are added to the face, it can be compiled to a binary
+ * font file by calling hb_face_reference_blob().
+ *
+ * Return value: (transfer full): New face.
+ *
+ * Since: 1.9.0
+ **/
+hb_face_t *
+hb_face_builder_create ()
+{
+  hb_face_builder_data_t *data = _hb_face_builder_data_create ();
+  if (unlikely (!data)) return hb_face_get_empty ();
+
+  return hb_face_create_for_tables (_hb_face_builder_reference_table,
+				    data,
+				    _hb_face_builder_data_destroy);
+}
+
+/**
+ * hb_face_builder_add_table:
+ *
+ * Add table for @tag with data provided by @blob to the face.  @face must
+ * be created using hb_face_builder_create().
+ *
+ * Since: 1.9.0
+ **/
+hb_bool_t
+hb_face_builder_add_table (hb_face_t *face, hb_tag_t tag, hb_blob_t *blob)
+{
+  if (unlikely (face->destroy != (hb_destroy_func_t) _hb_face_builder_data_destroy))
+    return false;
+
+  hb_face_builder_data_t *data = (hb_face_builder_data_t *) face->user_data;
+  hb_face_builder_data_t::table_entry_t *entry = data->tables.push ();
+
+  entry->tag = tag;
+  entry->blob = hb_blob_reference (blob);
+
+  return true;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-face.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-face.h
new file mode 100644
index 0000000..e8ff090
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-face.h
@@ -0,0 +1,158 @@
+/*
+ * Copyright © 2009  Red Hat, 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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_FACE_H
+#define HB_FACE_H
+
+#include "hb-common.h"
+#include "hb-blob.h"
+#include "hb-set.h"
+
+HB_BEGIN_DECLS
+
+
+HB_EXTERN unsigned int
+hb_face_count (hb_blob_t *blob);
+
+
+/*
+ * hb_face_t
+ */
+
+typedef struct hb_face_t hb_face_t;
+
+HB_EXTERN hb_face_t *
+hb_face_create (hb_blob_t    *blob,
+		unsigned int  index);
+
+typedef hb_blob_t * (*hb_reference_table_func_t)  (hb_face_t *face, hb_tag_t tag, void *user_data);
+
+/* calls destroy() when not needing user_data anymore */
+HB_EXTERN hb_face_t *
+hb_face_create_for_tables (hb_reference_table_func_t  reference_table_func,
+			   void                      *user_data,
+			   hb_destroy_func_t          destroy);
+
+HB_EXTERN hb_face_t *
+hb_face_get_empty (void);
+
+HB_EXTERN hb_face_t *
+hb_face_reference (hb_face_t *face);
+
+HB_EXTERN void
+hb_face_destroy (hb_face_t *face);
+
+HB_EXTERN hb_bool_t
+hb_face_set_user_data (hb_face_t          *face,
+		       hb_user_data_key_t *key,
+		       void *              data,
+		       hb_destroy_func_t   destroy,
+		       hb_bool_t           replace);
+
+HB_EXTERN void *
+hb_face_get_user_data (const hb_face_t    *face,
+		       hb_user_data_key_t *key);
+
+HB_EXTERN void
+hb_face_make_immutable (hb_face_t *face);
+
+HB_EXTERN hb_bool_t
+hb_face_is_immutable (const hb_face_t *face);
+
+
+HB_EXTERN hb_blob_t *
+hb_face_reference_table (const hb_face_t *face,
+			 hb_tag_t tag);
+
+HB_EXTERN hb_blob_t *
+hb_face_reference_blob (hb_face_t *face);
+
+HB_EXTERN void
+hb_face_set_index (hb_face_t    *face,
+		   unsigned int  index);
+
+HB_EXTERN unsigned int
+hb_face_get_index (const hb_face_t *face);
+
+HB_EXTERN void
+hb_face_set_upem (hb_face_t    *face,
+		  unsigned int  upem);
+
+HB_EXTERN unsigned int
+hb_face_get_upem (const hb_face_t *face);
+
+HB_EXTERN void
+hb_face_set_glyph_count (hb_face_t    *face,
+			 unsigned int  glyph_count);
+
+HB_EXTERN unsigned int
+hb_face_get_glyph_count (const hb_face_t *face);
+
+HB_EXTERN unsigned int
+hb_face_get_table_tags (const hb_face_t *face,
+			unsigned int  start_offset,
+			unsigned int *table_count, /* IN/OUT */
+			hb_tag_t     *table_tags /* OUT */);
+
+
+/*
+ * Character set.
+ */
+
+HB_EXTERN void
+hb_face_collect_unicodes (hb_face_t *face,
+			  hb_set_t  *out);
+
+HB_EXTERN void
+hb_face_collect_variation_selectors (hb_face_t *face,
+				     hb_set_t  *out);
+
+HB_EXTERN void
+hb_face_collect_variation_unicodes (hb_face_t *face,
+				    hb_codepoint_t variation_selector,
+				    hb_set_t  *out);
+
+
+/*
+ * Builder face.
+ */
+
+HB_EXTERN hb_face_t *
+hb_face_builder_create (void);
+
+HB_EXTERN hb_bool_t
+hb_face_builder_add_table (hb_face_t *face,
+			   hb_tag_t   tag,
+			   hb_blob_t *blob);
+
+
+HB_END_DECLS
+
+#endif /* HB_FACE_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-face.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-face.hh
new file mode 100644
index 0000000..68834ba
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-face.hh
@@ -0,0 +1,109 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2011  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_FACE_HH
+#define HB_FACE_HH
+
+#include "hb.hh"
+
+#include "hb-shaper.hh"
+#include "hb-shape-plan.hh"
+#include "hb-ot-face.hh"
+
+
+/*
+ * hb_face_t
+ */
+
+#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INSTANTIATE_SHAPERS(shaper, face);
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+
+struct hb_face_t
+{
+  hb_object_header_t header;
+
+  hb_reference_table_func_t  reference_table_func;
+  void                      *user_data;
+  hb_destroy_func_t          destroy;
+
+  unsigned int index;			/* Face index in a collection, zero-based. */
+  mutable hb_atomic_int_t upem;		/* Units-per-EM. */
+  mutable hb_atomic_int_t num_glyphs;	/* Number of glyphs. */
+
+  hb_shaper_object_dataset_t<hb_face_t> data;/* Various shaper data. */
+  hb_ot_face_t table;			/* All the face's tables. */
+
+  /* Cache */
+  struct plan_node_t
+  {
+    hb_shape_plan_t *shape_plan;
+    plan_node_t *next;
+  };
+  hb_atomic_ptr_t<plan_node_t> shape_plans;
+
+  hb_blob_t *reference_table (hb_tag_t tag) const
+  {
+    hb_blob_t *blob;
+
+    if (unlikely (!reference_table_func))
+      return hb_blob_get_empty ();
+
+    blob = reference_table_func (/*XXX*/const_cast<hb_face_t *> (this), tag, user_data);
+    if (unlikely (!blob))
+      return hb_blob_get_empty ();
+
+    return blob;
+  }
+
+  HB_PURE_FUNC unsigned int get_upem () const
+  {
+    unsigned int ret = upem.get_relaxed ();
+    if (unlikely (!ret))
+    {
+      return load_upem ();
+    }
+    return ret;
+  }
+
+  unsigned int get_num_glyphs () const
+  {
+    unsigned int ret = num_glyphs.get_relaxed ();
+    if (unlikely (ret == (unsigned int) -1))
+      return load_num_glyphs ();
+    return ret;
+  }
+
+  private:
+  HB_INTERNAL unsigned int load_upem () const;
+  HB_INTERNAL unsigned int load_num_glyphs () const;
+};
+DECLARE_NULL_INSTANCE (hb_face_t);
+
+
+#endif /* HB_FACE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-fallback-shape.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-fallback-shape.cc
new file mode 100644
index 0000000..09f0290
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-fallback-shape.cc
@@ -0,0 +1,122 @@
+/*
+ * Copyright © 2011  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
+ */
+
+#include "hb-shaper-impl.hh"
+
+
+/*
+ * shaper face data
+ */
+
+struct hb_fallback_face_data_t {};
+
+hb_fallback_face_data_t *
+_hb_fallback_shaper_face_data_create (hb_face_t *face HB_UNUSED)
+{
+  return (hb_fallback_face_data_t *) HB_SHAPER_DATA_SUCCEEDED;
+}
+
+void
+_hb_fallback_shaper_face_data_destroy (hb_fallback_face_data_t *data HB_UNUSED)
+{
+}
+
+
+/*
+ * shaper font data
+ */
+
+struct hb_fallback_font_data_t {};
+
+hb_fallback_font_data_t *
+_hb_fallback_shaper_font_data_create (hb_font_t *font HB_UNUSED)
+{
+  return (hb_fallback_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
+}
+
+void
+_hb_fallback_shaper_font_data_destroy (hb_fallback_font_data_t *data HB_UNUSED)
+{
+}
+
+
+/*
+ * shaper
+ */
+
+hb_bool_t
+_hb_fallback_shape (hb_shape_plan_t    *shape_plan HB_UNUSED,
+		    hb_font_t          *font,
+		    hb_buffer_t        *buffer,
+		    const hb_feature_t *features HB_UNUSED,
+		    unsigned int        num_features HB_UNUSED)
+{
+  /* TODO
+   *
+   * - Apply fallback kern.
+   * - Handle Variation Selectors?
+   * - Apply normalization?
+   *
+   * This will make the fallback shaper into a dumb "TrueType"
+   * shaper which many people unfortunately still request.
+   */
+
+  hb_codepoint_t space;
+  bool has_space = (bool) font->get_nominal_glyph (' ', &space);
+
+  buffer->clear_positions ();
+
+  hb_direction_t direction = buffer->props.direction;
+  hb_unicode_funcs_t *unicode = buffer->unicode;
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  hb_glyph_position_t *pos = buffer->pos;
+  for (unsigned int i = 0; i < count; i++)
+  {
+    if (has_space && unicode->is_default_ignorable (info[i].codepoint)) {
+      info[i].codepoint = space;
+      pos[i].x_advance = 0;
+      pos[i].y_advance = 0;
+      continue;
+    }
+    (void) font->get_nominal_glyph (info[i].codepoint, &info[i].codepoint);
+    font->get_glyph_advance_for_direction (info[i].codepoint,
+					   direction,
+					   &pos[i].x_advance,
+					   &pos[i].y_advance);
+    font->subtract_glyph_origin_for_direction (info[i].codepoint,
+					       direction,
+					       &pos[i].x_offset,
+					       &pos[i].y_offset);
+  }
+
+  if (HB_DIRECTION_IS_BACKWARD (direction))
+    hb_buffer_reverse (buffer);
+
+  buffer->safe_to_break_all ();
+
+  return true;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-font.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-font.cc
new file mode 100644
index 0000000..817a1a7
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-font.cc
@@ -0,0 +1,2038 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#include "hb-font.hh"
+#include "hb-machinery.hh"
+
+#include "hb-ot.h"
+
+
+/**
+ * SECTION:hb-font
+ * @title: hb-font
+ * @short_description: Font objects
+ * @include: hb.h
+ *
+ * Font objects represent a font face at a certain size and other
+ * parameters (pixels per EM, points per EM, variation settings.)
+ * Fonts are created from font faces, and are used as input to
+ * hb_shape() among other things.
+ **/
+
+
+/*
+ * hb_font_funcs_t
+ */
+
+static hb_bool_t
+hb_font_get_font_h_extents_nil (hb_font_t *font HB_UNUSED,
+				void *font_data HB_UNUSED,
+				hb_font_extents_t *extents,
+				void *user_data HB_UNUSED)
+{
+  memset (extents, 0, sizeof (*extents));
+  return false;
+}
+static hb_bool_t
+hb_font_get_font_h_extents_default (hb_font_t *font,
+				    void *font_data HB_UNUSED,
+				    hb_font_extents_t *extents,
+				    void *user_data HB_UNUSED)
+{
+  hb_bool_t ret = font->parent->get_font_h_extents (extents);
+  if (ret) {
+    extents->ascender = font->parent_scale_y_distance (extents->ascender);
+    extents->descender = font->parent_scale_y_distance (extents->descender);
+    extents->line_gap = font->parent_scale_y_distance (extents->line_gap);
+  }
+  return ret;
+}
+
+static hb_bool_t
+hb_font_get_font_v_extents_nil (hb_font_t *font HB_UNUSED,
+				void *font_data HB_UNUSED,
+				hb_font_extents_t *extents,
+				void *user_data HB_UNUSED)
+{
+  memset (extents, 0, sizeof (*extents));
+  return false;
+}
+static hb_bool_t
+hb_font_get_font_v_extents_default (hb_font_t *font,
+				    void *font_data HB_UNUSED,
+				    hb_font_extents_t *extents,
+				    void *user_data HB_UNUSED)
+{
+  hb_bool_t ret = font->parent->get_font_v_extents (extents);
+  if (ret) {
+    extents->ascender = font->parent_scale_x_distance (extents->ascender);
+    extents->descender = font->parent_scale_x_distance (extents->descender);
+    extents->line_gap = font->parent_scale_x_distance (extents->line_gap);
+  }
+  return ret;
+}
+
+static hb_bool_t
+hb_font_get_nominal_glyph_nil (hb_font_t *font HB_UNUSED,
+			       void *font_data HB_UNUSED,
+			       hb_codepoint_t unicode HB_UNUSED,
+			       hb_codepoint_t *glyph,
+			       void *user_data HB_UNUSED)
+{
+  *glyph = 0;
+  return false;
+}
+static hb_bool_t
+hb_font_get_nominal_glyph_default (hb_font_t *font,
+				   void *font_data HB_UNUSED,
+				   hb_codepoint_t unicode,
+				   hb_codepoint_t *glyph,
+				   void *user_data HB_UNUSED)
+{
+  if (font->has_nominal_glyphs_func_set ())
+  {
+    return font->get_nominal_glyphs (1, &unicode, 0, glyph, 0);
+  }
+  return font->parent->get_nominal_glyph (unicode, glyph);
+}
+
+#define hb_font_get_nominal_glyphs_nil hb_font_get_nominal_glyphs_default
+static unsigned int
+hb_font_get_nominal_glyphs_default (hb_font_t *font,
+				    void *font_data HB_UNUSED,
+				    unsigned int count,
+				    const hb_codepoint_t *first_unicode,
+				    unsigned int unicode_stride,
+				    hb_codepoint_t *first_glyph,
+				    unsigned int glyph_stride,
+				    void *user_data HB_UNUSED)
+{
+  if (font->has_nominal_glyph_func_set ())
+  {
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (!font->get_nominal_glyph (*first_unicode, first_glyph))
+	return i;
+
+      first_unicode = &StructAtOffsetUnaligned<hb_codepoint_t> (first_unicode, unicode_stride);
+      first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+    }
+    return count;
+  }
+
+  return font->parent->get_nominal_glyphs (count,
+					   first_unicode, unicode_stride,
+					   first_glyph, glyph_stride);
+}
+
+static hb_bool_t
+hb_font_get_variation_glyph_nil (hb_font_t *font HB_UNUSED,
+				 void *font_data HB_UNUSED,
+				 hb_codepoint_t unicode HB_UNUSED,
+				 hb_codepoint_t variation_selector HB_UNUSED,
+				 hb_codepoint_t *glyph,
+				 void *user_data HB_UNUSED)
+{
+  *glyph = 0;
+  return false;
+}
+static hb_bool_t
+hb_font_get_variation_glyph_default (hb_font_t *font,
+				     void *font_data HB_UNUSED,
+				     hb_codepoint_t unicode,
+				     hb_codepoint_t variation_selector,
+				     hb_codepoint_t *glyph,
+				     void *user_data HB_UNUSED)
+{
+  return font->parent->get_variation_glyph (unicode, variation_selector, glyph);
+}
+
+
+static hb_position_t
+hb_font_get_glyph_h_advance_nil (hb_font_t *font,
+				 void *font_data HB_UNUSED,
+				 hb_codepoint_t glyph HB_UNUSED,
+				 void *user_data HB_UNUSED)
+{
+  return font->x_scale;
+}
+static hb_position_t
+hb_font_get_glyph_h_advance_default (hb_font_t *font,
+				     void *font_data HB_UNUSED,
+				     hb_codepoint_t glyph,
+				     void *user_data HB_UNUSED)
+{
+  if (font->has_glyph_h_advances_func_set ())
+  {
+    hb_position_t ret;
+    font->get_glyph_h_advances (1, &glyph, 0, &ret, 0);
+    return ret;
+  }
+  return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph));
+}
+
+static hb_position_t
+hb_font_get_glyph_v_advance_nil (hb_font_t *font,
+				 void *font_data HB_UNUSED,
+				 hb_codepoint_t glyph HB_UNUSED,
+				 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_default (hb_font_t *font,
+				     void *font_data HB_UNUSED,
+				     hb_codepoint_t glyph,
+				     void *user_data HB_UNUSED)
+{
+  if (font->has_glyph_v_advances_func_set ())
+  {
+    hb_position_t ret;
+    font->get_glyph_v_advances (1, &glyph, 0, &ret, 0);
+    return ret;
+  }
+  return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph));
+}
+
+#define hb_font_get_glyph_h_advances_nil hb_font_get_glyph_h_advances_default
+static void
+hb_font_get_glyph_h_advances_default (hb_font_t* font,
+				      void* font_data HB_UNUSED,
+				      unsigned int count,
+				      const hb_codepoint_t *first_glyph,
+				      unsigned int glyph_stride,
+				      hb_position_t *first_advance,
+				      unsigned int advance_stride,
+				      void *user_data HB_UNUSED)
+{
+  if (font->has_glyph_h_advance_func_set ())
+  {
+    for (unsigned int i = 0; i < count; i++)
+    {
+      *first_advance = font->get_glyph_h_advance (*first_glyph);
+      first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+      first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
+    }
+    return;
+  }
+
+  font->parent->get_glyph_h_advances (count,
+				      first_glyph, glyph_stride,
+				      first_advance, advance_stride);
+  for (unsigned int i = 0; i < count; i++)
+  {
+    *first_advance = font->parent_scale_x_distance (*first_advance);
+    first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
+  }
+}
+
+#define hb_font_get_glyph_v_advances_nil hb_font_get_glyph_v_advances_default
+static void
+hb_font_get_glyph_v_advances_default (hb_font_t* font,
+				      void* font_data HB_UNUSED,
+				      unsigned int count,
+				      const hb_codepoint_t *first_glyph,
+				      unsigned int glyph_stride,
+				      hb_position_t *first_advance,
+				      unsigned int advance_stride,
+				      void *user_data HB_UNUSED)
+{
+  if (font->has_glyph_v_advance_func_set ())
+  {
+    for (unsigned int i = 0; i < count; i++)
+    {
+      *first_advance = font->get_glyph_v_advance (*first_glyph);
+      first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+      first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
+    }
+    return;
+  }
+
+  font->parent->get_glyph_v_advances (count,
+				      first_glyph, glyph_stride,
+				      first_advance, advance_stride);
+  for (unsigned int i = 0; i < count; i++)
+  {
+    *first_advance = font->parent_scale_y_distance (*first_advance);
+    first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
+  }
+}
+
+static hb_bool_t
+hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED,
+				void *font_data HB_UNUSED,
+				hb_codepoint_t glyph HB_UNUSED,
+				hb_position_t *x,
+				hb_position_t *y,
+				void *user_data HB_UNUSED)
+{
+  *x = *y = 0;
+  return true;
+}
+static hb_bool_t
+hb_font_get_glyph_h_origin_default (hb_font_t *font,
+				    void *font_data HB_UNUSED,
+				    hb_codepoint_t glyph,
+				    hb_position_t *x,
+				    hb_position_t *y,
+				    void *user_data HB_UNUSED)
+{
+  hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y);
+  if (ret)
+    font->parent_scale_position (x, y);
+  return ret;
+}
+
+static hb_bool_t
+hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED,
+				void *font_data HB_UNUSED,
+				hb_codepoint_t glyph HB_UNUSED,
+				hb_position_t *x,
+				hb_position_t *y,
+				void *user_data HB_UNUSED)
+{
+  *x = *y = 0;
+  return false;
+}
+static hb_bool_t
+hb_font_get_glyph_v_origin_default (hb_font_t *font,
+				    void *font_data HB_UNUSED,
+				    hb_codepoint_t glyph,
+				    hb_position_t *x,
+				    hb_position_t *y,
+				    void *user_data HB_UNUSED)
+{
+  hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y);
+  if (ret)
+    font->parent_scale_position (x, y);
+  return ret;
+}
+
+static hb_position_t
+hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED,
+				 void *font_data HB_UNUSED,
+				 hb_codepoint_t left_glyph HB_UNUSED,
+				 hb_codepoint_t right_glyph HB_UNUSED,
+				 void *user_data HB_UNUSED)
+{
+  return 0;
+}
+static hb_position_t
+hb_font_get_glyph_h_kerning_default (hb_font_t *font,
+				     void *font_data HB_UNUSED,
+				     hb_codepoint_t left_glyph,
+				     hb_codepoint_t right_glyph,
+				     void *user_data HB_UNUSED)
+{
+  return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph));
+}
+
+static hb_position_t
+hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED,
+				 void *font_data HB_UNUSED,
+				 hb_codepoint_t top_glyph HB_UNUSED,
+				 hb_codepoint_t bottom_glyph HB_UNUSED,
+				 void *user_data HB_UNUSED)
+{
+  return 0;
+}
+static hb_position_t
+hb_font_get_glyph_v_kerning_default (hb_font_t *font,
+				     void *font_data HB_UNUSED,
+				     hb_codepoint_t top_glyph,
+				     hb_codepoint_t bottom_glyph,
+				     void *user_data HB_UNUSED)
+{
+  return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph));
+}
+
+static hb_bool_t
+hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED,
+			       void *font_data HB_UNUSED,
+			       hb_codepoint_t glyph HB_UNUSED,
+			       hb_glyph_extents_t *extents,
+			       void *user_data HB_UNUSED)
+{
+  memset (extents, 0, sizeof (*extents));
+  return false;
+}
+static hb_bool_t
+hb_font_get_glyph_extents_default (hb_font_t *font,
+				   void *font_data HB_UNUSED,
+				   hb_codepoint_t glyph,
+				   hb_glyph_extents_t *extents,
+				   void *user_data HB_UNUSED)
+{
+  hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents);
+  if (ret) {
+    font->parent_scale_position (&extents->x_bearing, &extents->y_bearing);
+    font->parent_scale_distance (&extents->width, &extents->height);
+  }
+  return ret;
+}
+
+static hb_bool_t
+hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED,
+				     void *font_data HB_UNUSED,
+				     hb_codepoint_t glyph HB_UNUSED,
+				     unsigned int point_index HB_UNUSED,
+				     hb_position_t *x,
+				     hb_position_t *y,
+				     void *user_data HB_UNUSED)
+{
+  *x = *y = 0;
+  return false;
+}
+static hb_bool_t
+hb_font_get_glyph_contour_point_default (hb_font_t *font,
+					 void *font_data HB_UNUSED,
+					 hb_codepoint_t glyph,
+					 unsigned int point_index,
+					 hb_position_t *x,
+					 hb_position_t *y,
+					 void *user_data HB_UNUSED)
+{
+  hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y);
+  if (ret)
+    font->parent_scale_position (x, y);
+  return ret;
+}
+
+static hb_bool_t
+hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED,
+			    void *font_data HB_UNUSED,
+			    hb_codepoint_t glyph HB_UNUSED,
+			    char *name, unsigned int size,
+			    void *user_data HB_UNUSED)
+{
+  if (size) *name = '\0';
+  return false;
+}
+static hb_bool_t
+hb_font_get_glyph_name_default (hb_font_t *font,
+				void *font_data HB_UNUSED,
+				hb_codepoint_t glyph,
+				char *name, unsigned int size,
+				void *user_data HB_UNUSED)
+{
+  return font->parent->get_glyph_name (glyph, name, size);
+}
+
+static hb_bool_t
+hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED,
+				 void *font_data HB_UNUSED,
+				 const char *name HB_UNUSED,
+				 int len HB_UNUSED, /* -1 means nul-terminated */
+				 hb_codepoint_t *glyph,
+				 void *user_data HB_UNUSED)
+{
+  *glyph = 0;
+  return false;
+}
+static hb_bool_t
+hb_font_get_glyph_from_name_default (hb_font_t *font,
+				     void *font_data HB_UNUSED,
+				     const char *name, int len, /* -1 means nul-terminated */
+				     hb_codepoint_t *glyph,
+				     void *user_data HB_UNUSED)
+{
+  return font->parent->get_glyph_from_name (name, len, glyph);
+}
+
+DEFINE_NULL_INSTANCE (hb_font_funcs_t) =
+{
+  HB_OBJECT_HEADER_STATIC,
+
+  {
+#define HB_FONT_FUNC_IMPLEMENT(name) nullptr,
+    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+  },
+  {
+#define HB_FONT_FUNC_IMPLEMENT(name) nullptr,
+    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+  },
+  {
+    {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil,
+      HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+    }
+  }
+};
+
+static const hb_font_funcs_t _hb_font_funcs_default = {
+  HB_OBJECT_HEADER_STATIC,
+
+  {
+#define HB_FONT_FUNC_IMPLEMENT(name) nullptr,
+    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+  },
+  {
+#define HB_FONT_FUNC_IMPLEMENT(name) nullptr,
+    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+  },
+  {
+    {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_default,
+      HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+    }
+  }
+};
+
+
+/**
+ * hb_font_funcs_create: (Xconstructor)
+ *
+ * 
+ *
+ * Return value: (transfer full): 
+ *
+ * Since: 0.9.2
+ **/
+hb_font_funcs_t *
+hb_font_funcs_create ()
+{
+  hb_font_funcs_t *ffuncs;
+
+  if (!(ffuncs = hb_object_create<hb_font_funcs_t> ()))
+    return hb_font_funcs_get_empty ();
+
+  ffuncs->get = _hb_font_funcs_default.get;
+
+  return ffuncs;
+}
+
+/**
+ * hb_font_funcs_get_empty:
+ *
+ * 
+ *
+ * Return value: (transfer full): 
+ *
+ * Since: 0.9.2
+ **/
+hb_font_funcs_t *
+hb_font_funcs_get_empty ()
+{
+  return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_default);
+}
+
+/**
+ * hb_font_funcs_reference: (skip)
+ * @ffuncs: font functions.
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_font_funcs_t *
+hb_font_funcs_reference (hb_font_funcs_t *ffuncs)
+{
+  return hb_object_reference (ffuncs);
+}
+
+/**
+ * hb_font_funcs_destroy: (skip)
+ * @ffuncs: font functions.
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_funcs_destroy (hb_font_funcs_t *ffuncs)
+{
+  if (!hb_object_destroy (ffuncs)) return;
+
+#define HB_FONT_FUNC_IMPLEMENT(name) if (ffuncs->destroy.name) \
+  ffuncs->destroy.name (ffuncs->user_data.name);
+  HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+
+  free (ffuncs);
+}
+
+/**
+ * hb_font_funcs_set_user_data: (skip)
+ * @ffuncs: font functions.
+ * @key: 
+ * @data: 
+ * @destroy: 
+ * @replace: 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_font_funcs_set_user_data (hb_font_funcs_t    *ffuncs,
+			     hb_user_data_key_t *key,
+			     void *              data,
+			     hb_destroy_func_t   destroy,
+			     hb_bool_t           replace)
+{
+  return hb_object_set_user_data (ffuncs, key, data, destroy, replace);
+}
+
+/**
+ * hb_font_funcs_get_user_data: (skip)
+ * @ffuncs: font functions.
+ * @key: 
+ *
+ * 
+ *
+ * Return value: (transfer none): 
+ *
+ * Since: 0.9.2
+ **/
+void *
+hb_font_funcs_get_user_data (hb_font_funcs_t    *ffuncs,
+			     hb_user_data_key_t *key)
+{
+  return hb_object_get_user_data (ffuncs, key);
+}
+
+
+/**
+ * hb_font_funcs_make_immutable:
+ * @ffuncs: font functions.
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs)
+{
+  if (hb_object_is_immutable (ffuncs))
+    return;
+
+  hb_object_make_immutable (ffuncs);
+}
+
+/**
+ * hb_font_funcs_is_immutable:
+ * @ffuncs: font functions.
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs)
+{
+  return hb_object_is_immutable (ffuncs);
+}
+
+
+#define HB_FONT_FUNC_IMPLEMENT(name) \
+                                                                         \
+void                                                                     \
+hb_font_funcs_set_##name##_func (hb_font_funcs_t             *ffuncs,    \
+                                 hb_font_get_##name##_func_t  func,      \
+                                 void                        *user_data, \
+                                 hb_destroy_func_t            destroy)   \
+{                                                                        \
+  if (hb_object_is_immutable (ffuncs)) {                                 \
+    if (destroy)                                                         \
+      destroy (user_data);                                               \
+    return;                                                              \
+  }                                                                      \
+                                                                         \
+  if (ffuncs->destroy.name)                                              \
+    ffuncs->destroy.name (ffuncs->user_data.name);                       \
+                                                                         \
+  if (func) {                                                            \
+    ffuncs->get.f.name = func;                                           \
+    ffuncs->user_data.name = user_data;                                  \
+    ffuncs->destroy.name = destroy;                                      \
+  } else {                                                               \
+    ffuncs->get.f.name = hb_font_get_##name##_default;                   \
+    ffuncs->user_data.name = nullptr;                                    \
+    ffuncs->destroy.name = nullptr;                                      \
+  }                                                                      \
+}
+
+HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+
+bool
+hb_font_t::has_func_set (unsigned int i)
+{
+  return this->klass->get.array[i] != _hb_font_funcs_default.get.array[i];
+}
+
+bool
+hb_font_t::has_func (unsigned int i)
+{
+  return has_func_set (i) ||
+	 (parent && parent != &_hb_Null_hb_font_t && parent->has_func (i));
+}
+
+/* Public getters */
+
+/**
+ * hb_font_get_h_extents:
+ * @font: a font.
+ * @extents: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.1.3
+ **/
+hb_bool_t
+hb_font_get_h_extents (hb_font_t *font,
+		       hb_font_extents_t *extents)
+{
+  return font->get_font_h_extents (extents);
+}
+
+/**
+ * hb_font_get_v_extents:
+ * @font: a font.
+ * @extents: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.1.3
+ **/
+hb_bool_t
+hb_font_get_v_extents (hb_font_t *font,
+		       hb_font_extents_t *extents)
+{
+  return font->get_font_v_extents (extents);
+}
+
+/**
+ * hb_font_get_glyph:
+ * @font: a font.
+ * @unicode: 
+ * @variation_selector: 
+ * @glyph: (out): 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_font_get_glyph (hb_font_t *font,
+		   hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+		   hb_codepoint_t *glyph)
+{
+  if (unlikely (variation_selector))
+    return font->get_variation_glyph (unicode, variation_selector, glyph);
+  return font->get_nominal_glyph (unicode, glyph);
+}
+
+/**
+ * hb_font_get_nominal_glyph:
+ * @font: a font.
+ * @unicode: 
+ * @glyph: (out): 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 1.2.3
+ **/
+hb_bool_t
+hb_font_get_nominal_glyph (hb_font_t *font,
+			   hb_codepoint_t unicode,
+			   hb_codepoint_t *glyph)
+{
+  return font->get_nominal_glyph (unicode, glyph);
+}
+
+/**
+ * hb_font_get_variation_glyph:
+ * @font: a font.
+ * @unicode: 
+ * @variation_selector: 
+ * @glyph: (out): 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 1.2.3
+ **/
+hb_bool_t
+hb_font_get_variation_glyph (hb_font_t *font,
+			     hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+			     hb_codepoint_t *glyph)
+{
+  return font->get_variation_glyph (unicode, variation_selector, glyph);
+}
+
+/**
+ * hb_font_get_glyph_h_advance:
+ * @font: a font.
+ * @glyph: 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_position_t
+hb_font_get_glyph_h_advance (hb_font_t *font,
+			     hb_codepoint_t glyph)
+{
+  return font->get_glyph_h_advance (glyph);
+}
+
+/**
+ * hb_font_get_glyph_v_advance:
+ * @font: a font.
+ * @glyph: 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_position_t
+hb_font_get_glyph_v_advance (hb_font_t *font,
+			     hb_codepoint_t glyph)
+{
+  return font->get_glyph_v_advance (glyph);
+}
+
+/**
+ * hb_font_get_glyph_h_advances:
+ * @font: a font.
+ *
+ * 
+ *
+ * Since: 1.8.6
+ **/
+void
+hb_font_get_glyph_h_advances (hb_font_t* font,
+			      unsigned int count,
+			      const hb_codepoint_t *first_glyph,
+			      unsigned glyph_stride,
+			      hb_position_t *first_advance,
+			      unsigned advance_stride)
+{
+  font->get_glyph_h_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
+}
+/**
+ * hb_font_get_glyph_v_advances:
+ * @font: a font.
+ *
+ * 
+ *
+ * Since: 1.8.6
+ **/
+void
+hb_font_get_glyph_v_advances (hb_font_t* font,
+			      unsigned int count,
+			      const hb_codepoint_t *first_glyph,
+			      unsigned glyph_stride,
+			      hb_position_t *first_advance,
+			      unsigned advance_stride)
+{
+  font->get_glyph_v_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
+}
+
+/**
+ * hb_font_get_glyph_h_origin:
+ * @font: a font.
+ * @glyph: 
+ * @x: (out): 
+ * @y: (out): 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_font_get_glyph_h_origin (hb_font_t *font,
+			    hb_codepoint_t glyph,
+			    hb_position_t *x, hb_position_t *y)
+{
+  return font->get_glyph_h_origin (glyph, x, y);
+}
+
+/**
+ * hb_font_get_glyph_v_origin:
+ * @font: a font.
+ * @glyph: 
+ * @x: (out): 
+ * @y: (out): 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_font_get_glyph_v_origin (hb_font_t *font,
+			    hb_codepoint_t glyph,
+			    hb_position_t *x, hb_position_t *y)
+{
+  return font->get_glyph_v_origin (glyph, x, y);
+}
+
+/**
+ * hb_font_get_glyph_h_kerning:
+ * @font: a font.
+ * @left_glyph: 
+ * @right_glyph: 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ * Deprecated: 2.0.0
+ **/
+hb_position_t
+hb_font_get_glyph_h_kerning (hb_font_t *font,
+			     hb_codepoint_t left_glyph, hb_codepoint_t right_glyph)
+{
+  return font->get_glyph_h_kerning (left_glyph, right_glyph);
+}
+
+/**
+ * hb_font_get_glyph_v_kerning:
+ * @font: a font.
+ * @top_glyph: 
+ * @bottom_glyph: 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ * Deprecated: 2.0.0
+ **/
+hb_position_t
+hb_font_get_glyph_v_kerning (hb_font_t *font,
+			     hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph)
+{
+  return font->get_glyph_v_kerning (top_glyph, bottom_glyph);
+}
+
+/**
+ * hb_font_get_glyph_extents:
+ * @font: a font.
+ * @glyph: 
+ * @extents: (out): 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_font_get_glyph_extents (hb_font_t *font,
+			   hb_codepoint_t glyph,
+			   hb_glyph_extents_t *extents)
+{
+  return font->get_glyph_extents (glyph, extents);
+}
+
+/**
+ * hb_font_get_glyph_contour_point:
+ * @font: a font.
+ * @glyph: 
+ * @point_index: 
+ * @x: (out): 
+ * @y: (out): 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_font_get_glyph_contour_point (hb_font_t *font,
+				 hb_codepoint_t glyph, unsigned int point_index,
+				 hb_position_t *x, hb_position_t *y)
+{
+  return font->get_glyph_contour_point (glyph, point_index, x, y);
+}
+
+/**
+ * hb_font_get_glyph_name:
+ * @font: a font.
+ * @glyph: 
+ * @name: (array length=size): 
+ * @size: 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_font_get_glyph_name (hb_font_t *font,
+			hb_codepoint_t glyph,
+			char *name, unsigned int size)
+{
+  return font->get_glyph_name (glyph, name, size);
+}
+
+/**
+ * hb_font_get_glyph_from_name:
+ * @font: a font.
+ * @name: (array length=len): 
+ * @len: 
+ * @glyph: (out): 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_font_get_glyph_from_name (hb_font_t *font,
+			     const char *name, int len, /* -1 means nul-terminated */
+			     hb_codepoint_t *glyph)
+{
+  return font->get_glyph_from_name (name, len, glyph);
+}
+
+
+/* A bit higher-level, and with fallback */
+
+/**
+ * hb_font_get_extents_for_direction:
+ * @font: a font.
+ * @direction:
+ * @extents: (out):
+ *
+ *
+ *
+ * Since: 1.1.3
+ **/
+void
+hb_font_get_extents_for_direction (hb_font_t *font,
+				   hb_direction_t direction,
+				   hb_font_extents_t *extents)
+{
+  return font->get_extents_for_direction (direction, extents);
+}
+/**
+ * hb_font_get_glyph_advance_for_direction:
+ * @font: a font.
+ * @glyph: 
+ * @direction: 
+ * @x: (out): 
+ * @y: (out): 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_get_glyph_advance_for_direction (hb_font_t *font,
+					 hb_codepoint_t glyph,
+					 hb_direction_t direction,
+					 hb_position_t *x, hb_position_t *y)
+{
+  return font->get_glyph_advance_for_direction (glyph, direction, x, y);
+}
+/**
+ * hb_font_get_glyph_advances_for_direction:
+ * @font: a font.
+ * @direction: 
+ *
+ * 
+ *
+ * Since: 1.8.6
+ **/
+HB_EXTERN void
+hb_font_get_glyph_advances_for_direction (hb_font_t* font,
+					  hb_direction_t direction,
+					  unsigned int count,
+					  const hb_codepoint_t *first_glyph,
+					  unsigned glyph_stride,
+					  hb_position_t *first_advance,
+					  unsigned advance_stride)
+{
+  font->get_glyph_advances_for_direction (direction, count, first_glyph, glyph_stride, first_advance, advance_stride);
+}
+
+/**
+ * hb_font_get_glyph_origin_for_direction:
+ * @font: a font.
+ * @glyph: 
+ * @direction: 
+ * @x: (out): 
+ * @y: (out): 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_get_glyph_origin_for_direction (hb_font_t *font,
+					hb_codepoint_t glyph,
+					hb_direction_t direction,
+					hb_position_t *x, hb_position_t *y)
+{
+  return font->get_glyph_origin_for_direction (glyph, direction, x, y);
+}
+
+/**
+ * hb_font_add_glyph_origin_for_direction:
+ * @font: a font.
+ * @glyph: 
+ * @direction: 
+ * @x: (out): 
+ * @y: (out): 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_add_glyph_origin_for_direction (hb_font_t *font,
+					hb_codepoint_t glyph,
+					hb_direction_t direction,
+					hb_position_t *x, hb_position_t *y)
+{
+  return font->add_glyph_origin_for_direction (glyph, direction, x, y);
+}
+
+/**
+ * hb_font_subtract_glyph_origin_for_direction:
+ * @font: a font.
+ * @glyph: 
+ * @direction: 
+ * @x: (out): 
+ * @y: (out): 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_subtract_glyph_origin_for_direction (hb_font_t *font,
+					     hb_codepoint_t glyph,
+					     hb_direction_t direction,
+					     hb_position_t *x, hb_position_t *y)
+{
+  return font->subtract_glyph_origin_for_direction (glyph, direction, x, y);
+}
+
+/**
+ * hb_font_get_glyph_kerning_for_direction:
+ * @font: a font.
+ * @first_glyph: 
+ * @second_glyph: 
+ * @direction: 
+ * @x: (out): 
+ * @y: (out): 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ * Deprecated: 2.0.0
+ **/
+void
+hb_font_get_glyph_kerning_for_direction (hb_font_t *font,
+					 hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
+					 hb_direction_t direction,
+					 hb_position_t *x, hb_position_t *y)
+{
+  return font->get_glyph_kerning_for_direction (first_glyph, second_glyph, direction, x, y);
+}
+
+/**
+ * hb_font_get_glyph_extents_for_origin:
+ * @font: a font.
+ * @glyph: 
+ * @direction: 
+ * @extents: (out): 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_font_get_glyph_extents_for_origin (hb_font_t *font,
+				      hb_codepoint_t glyph,
+				      hb_direction_t direction,
+				      hb_glyph_extents_t *extents)
+{
+  return font->get_glyph_extents_for_origin (glyph, direction, extents);
+}
+
+/**
+ * hb_font_get_glyph_contour_point_for_origin:
+ * @font: a font.
+ * @glyph: 
+ * @point_index: 
+ * @direction: 
+ * @x: (out): 
+ * @y: (out): 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_font_get_glyph_contour_point_for_origin (hb_font_t *font,
+					    hb_codepoint_t glyph, unsigned int point_index,
+					    hb_direction_t direction,
+					    hb_position_t *x, hb_position_t *y)
+{
+  return font->get_glyph_contour_point_for_origin (glyph, point_index, direction, x, y);
+}
+
+/* Generates gidDDD if glyph has no name. */
+/**
+ * hb_font_glyph_to_string:
+ * @font: a font.
+ * @glyph: 
+ * @s: (array length=size): 
+ * @size: 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_glyph_to_string (hb_font_t *font,
+			 hb_codepoint_t glyph,
+			 char *s, unsigned int size)
+{
+  font->glyph_to_string (glyph, s, size);
+}
+
+/* Parses gidDDD and uniUUUU strings automatically. */
+/**
+ * hb_font_glyph_from_string:
+ * @font: a font.
+ * @s: (array length=len) (element-type uint8_t): 
+ * @len: 
+ * @glyph: (out): 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_font_glyph_from_string (hb_font_t *font,
+			   const char *s, int len, /* -1 means nul-terminated */
+			   hb_codepoint_t *glyph)
+{
+  return font->glyph_from_string (s, len, glyph);
+}
+
+
+/*
+ * hb_font_t
+ */
+
+DEFINE_NULL_INSTANCE (hb_font_t) =
+{
+  HB_OBJECT_HEADER_STATIC,
+
+  nullptr, /* parent */
+  const_cast<hb_face_t *> (&_hb_Null_hb_face_t),
+
+  1000, /* x_scale */
+  1000, /* y_scale */
+
+  0, /* x_ppem */
+  0, /* y_ppem */
+  0, /* ptem */
+
+  0, /* num_coords */
+  nullptr, /* coords */
+
+  const_cast<hb_font_funcs_t *> (&_hb_Null_hb_font_funcs_t),
+
+  /* Zero for the rest is fine. */
+};
+
+
+static hb_font_t *
+_hb_font_create (hb_face_t *face)
+{
+  hb_font_t *font;
+
+  if (unlikely (!face))
+    face = hb_face_get_empty ();
+  if (!(font = hb_object_create<hb_font_t> ()))
+    return hb_font_get_empty ();
+
+  hb_face_make_immutable (face);
+  font->parent = hb_font_get_empty ();
+  font->face = hb_face_reference (face);
+  font->klass = hb_font_funcs_get_empty ();
+  font->data.init0 (font);
+  font->x_scale = font->y_scale = hb_face_get_upem (face);
+
+  return font;
+}
+
+/**
+ * hb_font_create: (Xconstructor)
+ * @face: a face.
+ *
+ * 
+ *
+ * Return value: (transfer full): 
+ *
+ * Since: 0.9.2
+ **/
+hb_font_t *
+hb_font_create (hb_face_t *face)
+{
+  hb_font_t *font = _hb_font_create (face);
+
+  /* Install our in-house, very lightweight, funcs. */
+  hb_ot_font_set_funcs (font);
+
+  return font;
+}
+
+/**
+ * hb_font_create_sub_font:
+ * @parent: parent font.
+ *
+ * 
+ *
+ * Return value: (transfer full): 
+ *
+ * Since: 0.9.2
+ **/
+hb_font_t *
+hb_font_create_sub_font (hb_font_t *parent)
+{
+  if (unlikely (!parent))
+    parent = hb_font_get_empty ();
+
+  hb_font_t *font = _hb_font_create (parent->face);
+
+  if (unlikely (hb_object_is_immutable (font)))
+    return font;
+
+  font->parent = hb_font_reference (parent);
+
+  font->x_scale = parent->x_scale;
+  font->y_scale = parent->y_scale;
+  font->x_ppem = parent->x_ppem;
+  font->y_ppem = parent->y_ppem;
+  font->ptem = parent->ptem;
+
+  font->num_coords = parent->num_coords;
+  if (!font->num_coords)
+    font->coords = nullptr;
+  else
+  {
+    unsigned int size = parent->num_coords * sizeof (parent->coords[0]);
+    font->coords = (int *) malloc (size);
+    if (unlikely (!font->coords))
+      font->num_coords = 0;
+    else
+      memcpy (font->coords, parent->coords, size);
+  }
+
+  return font;
+}
+
+/**
+ * hb_font_get_empty:
+ *
+ * 
+ *
+ * Return value: (transfer full)
+ *
+ * Since: 0.9.2
+ **/
+hb_font_t *
+hb_font_get_empty ()
+{
+  return const_cast<hb_font_t *> (&Null(hb_font_t));
+}
+
+/**
+ * hb_font_reference: (skip)
+ * @font: a font.
+ *
+ * 
+ *
+ * Return value: (transfer full): 
+ *
+ * Since: 0.9.2
+ **/
+hb_font_t *
+hb_font_reference (hb_font_t *font)
+{
+  return hb_object_reference (font);
+}
+
+/**
+ * hb_font_destroy: (skip)
+ * @font: a font.
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_destroy (hb_font_t *font)
+{
+  if (!hb_object_destroy (font)) return;
+
+  font->data.fini ();
+
+  if (font->destroy)
+    font->destroy (font->user_data);
+
+  hb_font_destroy (font->parent);
+  hb_face_destroy (font->face);
+  hb_font_funcs_destroy (font->klass);
+
+  free (font->coords);
+
+  free (font);
+}
+
+/**
+ * hb_font_set_user_data: (skip)
+ * @font: a font.
+ * @key: 
+ * @data: 
+ * @destroy: 
+ * @replace: 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_font_set_user_data (hb_font_t          *font,
+		       hb_user_data_key_t *key,
+		       void *              data,
+		       hb_destroy_func_t   destroy,
+		       hb_bool_t           replace)
+{
+  return hb_object_set_user_data (font, key, data, destroy, replace);
+}
+
+/**
+ * hb_font_get_user_data: (skip)
+ * @font: a font.
+ * @key: 
+ *
+ * 
+ *
+ * Return value: (transfer none): 
+ *
+ * Since: 0.9.2
+ **/
+void *
+hb_font_get_user_data (hb_font_t          *font,
+		       hb_user_data_key_t *key)
+{
+  return hb_object_get_user_data (font, key);
+}
+
+/**
+ * hb_font_make_immutable:
+ * @font: a font.
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_make_immutable (hb_font_t *font)
+{
+  if (hb_object_is_immutable (font))
+    return;
+
+  if (font->parent)
+    hb_font_make_immutable (font->parent);
+
+  hb_object_make_immutable (font);
+}
+
+/**
+ * hb_font_is_immutable:
+ * @font: a font.
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_font_is_immutable (hb_font_t *font)
+{
+  return hb_object_is_immutable (font);
+}
+
+/**
+ * hb_font_set_parent:
+ * @font: a font.
+ * @parent: new parent.
+ *
+ * Sets parent font of @font.
+ *
+ * Since: 1.0.5
+ **/
+void
+hb_font_set_parent (hb_font_t *font,
+		    hb_font_t *parent)
+{
+  if (hb_object_is_immutable (font))
+    return;
+
+  if (!parent)
+    parent = hb_font_get_empty ();
+
+  hb_font_t *old = font->parent;
+
+  font->parent = hb_font_reference (parent);
+
+  hb_font_destroy (old);
+}
+
+/**
+ * hb_font_get_parent:
+ * @font: a font.
+ *
+ * 
+ *
+ * Return value: (transfer none): 
+ *
+ * Since: 0.9.2
+ **/
+hb_font_t *
+hb_font_get_parent (hb_font_t *font)
+{
+  return font->parent;
+}
+
+/**
+ * hb_font_set_face:
+ * @font: a font.
+ * @face: new face.
+ *
+ * Sets font-face of @font.
+ *
+ * Since: 1.4.3
+ **/
+void
+hb_font_set_face (hb_font_t *font,
+		  hb_face_t *face)
+{
+  if (hb_object_is_immutable (font))
+    return;
+
+  if (unlikely (!face))
+    face = hb_face_get_empty ();
+
+  hb_face_t *old = font->face;
+
+  font->face = hb_face_reference (face);
+
+  hb_face_destroy (old);
+}
+
+/**
+ * hb_font_get_face:
+ * @font: a font.
+ *
+ * 
+ *
+ * Return value: (transfer none): 
+ *
+ * Since: 0.9.2
+ **/
+hb_face_t *
+hb_font_get_face (hb_font_t *font)
+{
+  return font->face;
+}
+
+
+/**
+ * hb_font_set_funcs:
+ * @font: a font.
+ * @klass: (closure font_data) (destroy destroy) (scope notified):
+ * @font_data: 
+ * @destroy: 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_set_funcs (hb_font_t         *font,
+		   hb_font_funcs_t   *klass,
+		   void              *font_data,
+		   hb_destroy_func_t  destroy)
+{
+  if (hb_object_is_immutable (font))
+  {
+    if (destroy)
+      destroy (font_data);
+    return;
+  }
+
+  if (font->destroy)
+    font->destroy (font->user_data);
+
+  if (!klass)
+    klass = hb_font_funcs_get_empty ();
+
+  hb_font_funcs_reference (klass);
+  hb_font_funcs_destroy (font->klass);
+  font->klass = klass;
+  font->user_data = font_data;
+  font->destroy = destroy;
+}
+
+/**
+ * hb_font_set_funcs_data:
+ * @font: a font.
+ * @font_data: (destroy destroy) (scope notified):
+ * @destroy: 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_set_funcs_data (hb_font_t         *font,
+		        void              *font_data,
+		        hb_destroy_func_t  destroy)
+{
+  /* Destroy user_data? */
+  if (hb_object_is_immutable (font))
+  {
+    if (destroy)
+      destroy (font_data);
+    return;
+  }
+
+  if (font->destroy)
+    font->destroy (font->user_data);
+
+  font->user_data = font_data;
+  font->destroy = destroy;
+}
+
+
+/**
+ * hb_font_set_scale:
+ * @font: a font.
+ * @x_scale: 
+ * @y_scale: 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_set_scale (hb_font_t *font,
+		   int x_scale,
+		   int y_scale)
+{
+  if (hb_object_is_immutable (font))
+    return;
+
+  font->x_scale = x_scale;
+  font->y_scale = y_scale;
+}
+
+/**
+ * hb_font_get_scale:
+ * @font: a font.
+ * @x_scale: (out): 
+ * @y_scale: (out): 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_get_scale (hb_font_t *font,
+		   int *x_scale,
+		   int *y_scale)
+{
+  if (x_scale) *x_scale = font->x_scale;
+  if (y_scale) *y_scale = font->y_scale;
+}
+
+/**
+ * hb_font_set_ppem:
+ * @font: a font.
+ * @x_ppem: 
+ * @y_ppem: 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_set_ppem (hb_font_t *font,
+		  unsigned int x_ppem,
+		  unsigned int y_ppem)
+{
+  if (hb_object_is_immutable (font))
+    return;
+
+  font->x_ppem = x_ppem;
+  font->y_ppem = y_ppem;
+}
+
+/**
+ * hb_font_get_ppem:
+ * @font: a font.
+ * @x_ppem: (out): 
+ * @y_ppem: (out): 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_font_get_ppem (hb_font_t *font,
+		  unsigned int *x_ppem,
+		  unsigned int *y_ppem)
+{
+  if (x_ppem) *x_ppem = font->x_ppem;
+  if (y_ppem) *y_ppem = font->y_ppem;
+}
+
+/**
+ * hb_font_set_ptem:
+ * @font: a font.
+ * @ptem: font size in points.
+ *
+ * Sets "point size" of the font.  Set to 0 to unset.
+ *
+ * There are 72 points in an inch.
+ *
+ * Since: 1.6.0
+ **/
+void
+hb_font_set_ptem (hb_font_t *font, float ptem)
+{
+  if (hb_object_is_immutable (font))
+    return;
+
+  font->ptem = ptem;
+}
+
+/**
+ * hb_font_get_ptem:
+ * @font: a font.
+ *
+ * Gets the "point size" of the font.  A value of 0 means unset.
+ *
+ * Return value: Point size.
+ *
+ * Since: 0.9.2
+ **/
+float
+hb_font_get_ptem (hb_font_t *font)
+{
+  return font->ptem;
+}
+
+/*
+ * Variations
+ */
+
+static void
+_hb_font_adopt_var_coords_normalized (hb_font_t *font,
+				      int *coords, /* 2.14 normalized */
+				      unsigned int coords_length)
+{
+  free (font->coords);
+
+  font->coords = coords;
+  font->num_coords = coords_length;
+}
+
+/**
+ * hb_font_set_variations:
+ *
+ * Since: 1.4.2
+ */
+void
+hb_font_set_variations (hb_font_t *font,
+			const hb_variation_t *variations,
+			unsigned int variations_length)
+{
+  if (hb_object_is_immutable (font))
+    return;
+
+  if (!variations_length)
+  {
+    hb_font_set_var_coords_normalized (font, nullptr, 0);
+    return;
+  }
+
+  unsigned int coords_length = hb_ot_var_get_axis_count (font->face);
+
+  int *normalized = coords_length ? (int *) calloc (coords_length, sizeof (int)) : nullptr;
+  if (unlikely (coords_length && !normalized))
+    return;
+
+  hb_ot_var_normalize_variations (font->face,
+				  variations, variations_length,
+				  normalized, coords_length);
+  _hb_font_adopt_var_coords_normalized (font, normalized, coords_length);
+}
+
+/**
+ * hb_font_set_var_coords_design:
+ *
+ * Since: 1.4.2
+ */
+void
+hb_font_set_var_coords_design (hb_font_t *font,
+			       const float *coords,
+			       unsigned int coords_length)
+{
+  if (hb_object_is_immutable (font))
+    return;
+
+  int *normalized = coords_length ? (int *) calloc (coords_length, sizeof (int)) : nullptr;
+  if (unlikely (coords_length && !normalized))
+    return;
+
+  hb_ot_var_normalize_coords (font->face, coords_length, coords, normalized);
+  _hb_font_adopt_var_coords_normalized (font, normalized, coords_length);
+}
+
+/**
+ * hb_font_set_var_coords_normalized:
+ *
+ * Since: 1.4.2
+ */
+void
+hb_font_set_var_coords_normalized (hb_font_t *font,
+				   const int *coords, /* 2.14 normalized */
+				   unsigned int coords_length)
+{
+  if (hb_object_is_immutable (font))
+    return;
+
+  int *copy = coords_length ? (int *) calloc (coords_length, sizeof (coords[0])) : nullptr;
+  if (unlikely (coords_length && !copy))
+    return;
+
+  if (coords_length)
+    memcpy (copy, coords, coords_length * sizeof (coords[0]));
+
+  _hb_font_adopt_var_coords_normalized (font, copy, coords_length);
+}
+
+/**
+ * hb_font_get_var_coords_normalized:
+ *
+ * Return value is valid as long as variation coordinates of the font
+ * are not modified.
+ *
+ * Since: 1.4.2
+ */
+const int *
+hb_font_get_var_coords_normalized (hb_font_t *font,
+				   unsigned int *length)
+{
+  if (length)
+    *length = font->num_coords;
+
+  return font->coords;
+}
+
+
+/*
+ * Deprecated get_glyph_func():
+ */
+
+struct hb_trampoline_closure_t
+{
+  void *user_data;
+  hb_destroy_func_t destroy;
+  unsigned int ref_count;
+};
+
+template <typename FuncType>
+struct hb_trampoline_t
+{
+  hb_trampoline_closure_t closure; /* Must be first. */
+  FuncType func;
+};
+
+template <typename FuncType>
+static hb_trampoline_t<FuncType> *
+trampoline_create (FuncType           func,
+		   void              *user_data,
+		   hb_destroy_func_t  destroy)
+{
+  typedef hb_trampoline_t<FuncType> trampoline_t;
+
+  trampoline_t *trampoline = (trampoline_t *) calloc (1, sizeof (trampoline_t));
+
+  if (unlikely (!trampoline))
+    return nullptr;
+
+  trampoline->closure.user_data = user_data;
+  trampoline->closure.destroy = destroy;
+  trampoline->closure.ref_count = 1;
+  trampoline->func = func;
+
+  return trampoline;
+}
+
+static void
+trampoline_reference (hb_trampoline_closure_t *closure)
+{
+  closure->ref_count++;
+}
+
+static void
+trampoline_destroy (void *user_data)
+{
+  hb_trampoline_closure_t *closure = (hb_trampoline_closure_t *) user_data;
+
+  if (--closure->ref_count)
+    return;
+
+  if (closure->destroy)
+    closure->destroy (closure->user_data);
+  free (closure);
+}
+
+typedef hb_trampoline_t<hb_font_get_glyph_func_t> hb_font_get_glyph_trampoline_t;
+
+static hb_bool_t
+hb_font_get_nominal_glyph_trampoline (hb_font_t *font,
+				      void *font_data,
+				      hb_codepoint_t unicode,
+				      hb_codepoint_t *glyph,
+				      void *user_data)
+{
+  hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data;
+  return trampoline->func (font, font_data, unicode, 0, glyph, trampoline->closure.user_data);
+}
+
+static hb_bool_t
+hb_font_get_variation_glyph_trampoline (hb_font_t *font,
+					void *font_data,
+					hb_codepoint_t unicode,
+					hb_codepoint_t variation_selector,
+					hb_codepoint_t *glyph,
+					void *user_data)
+{
+  hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data;
+  return trampoline->func (font, font_data, unicode, variation_selector, glyph, trampoline->closure.user_data);
+}
+
+/**
+ * hb_font_funcs_set_glyph_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified): callback function.
+ * @user_data: data to pass to @func.
+ * @destroy: function to call when @user_data is not needed anymore.
+ *
+ * Deprecated.  Use hb_font_funcs_set_nominal_glyph_func() and
+ * hb_font_funcs_set_variation_glyph_func() instead.
+ *
+ * Since: 0.9.2
+ * Deprecated: 1.2.3
+ **/
+void
+hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
+			      hb_font_get_glyph_func_t func,
+			      void *user_data, hb_destroy_func_t destroy)
+{
+  hb_font_get_glyph_trampoline_t *trampoline;
+
+  trampoline = trampoline_create (func, user_data, destroy);
+  if (unlikely (!trampoline))
+  {
+    if (destroy)
+      destroy (user_data);
+    return;
+  }
+
+  hb_font_funcs_set_nominal_glyph_func (ffuncs,
+					hb_font_get_nominal_glyph_trampoline,
+					trampoline,
+					trampoline_destroy);
+
+  trampoline_reference (&trampoline->closure);
+  hb_font_funcs_set_variation_glyph_func (ffuncs,
+					  hb_font_get_variation_glyph_trampoline,
+					  trampoline,
+					  trampoline_destroy);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-font.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-font.h
new file mode 100644
index 0000000..e2086d8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-font.h
@@ -0,0 +1,679 @@
+/*
+ * Copyright © 2009  Red Hat, 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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_FONT_H
+#define HB_FONT_H
+
+#include "hb-common.h"
+#include "hb-face.h"
+
+HB_BEGIN_DECLS
+
+
+typedef struct hb_font_t hb_font_t;
+
+
+/*
+ * hb_font_funcs_t
+ */
+
+typedef struct hb_font_funcs_t hb_font_funcs_t;
+
+HB_EXTERN hb_font_funcs_t *
+hb_font_funcs_create (void);
+
+HB_EXTERN hb_font_funcs_t *
+hb_font_funcs_get_empty (void);
+
+HB_EXTERN hb_font_funcs_t *
+hb_font_funcs_reference (hb_font_funcs_t *ffuncs);
+
+HB_EXTERN void
+hb_font_funcs_destroy (hb_font_funcs_t *ffuncs);
+
+HB_EXTERN hb_bool_t
+hb_font_funcs_set_user_data (hb_font_funcs_t    *ffuncs,
+			     hb_user_data_key_t *key,
+			     void *              data,
+			     hb_destroy_func_t   destroy,
+			     hb_bool_t           replace);
+
+
+HB_EXTERN void *
+hb_font_funcs_get_user_data (hb_font_funcs_t    *ffuncs,
+			     hb_user_data_key_t *key);
+
+
+HB_EXTERN void
+hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs);
+
+HB_EXTERN hb_bool_t
+hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs);
+
+
+/* font and glyph extents */
+
+/* Note that typically ascender is positive and descender negative in coordinate systems that grow up. */
+typedef struct hb_font_extents_t
+{
+  hb_position_t ascender; /* typographic ascender. */
+  hb_position_t descender; /* typographic descender. */
+  hb_position_t line_gap; /* suggested line spacing gap. */
+  /*< private >*/
+  hb_position_t reserved9;
+  hb_position_t reserved8;
+  hb_position_t reserved7;
+  hb_position_t reserved6;
+  hb_position_t reserved5;
+  hb_position_t reserved4;
+  hb_position_t reserved3;
+  hb_position_t reserved2;
+  hb_position_t reserved1;
+} hb_font_extents_t;
+
+/* Note that height is negative in coordinate systems that grow up. */
+typedef struct hb_glyph_extents_t
+{
+  hb_position_t x_bearing; /* left side of glyph from origin. */
+  hb_position_t y_bearing; /* top side of glyph from origin. */
+  hb_position_t width; /* distance from left to right side. */
+  hb_position_t height; /* distance from top to bottom side. */
+} hb_glyph_extents_t;
+
+/* func types */
+
+typedef hb_bool_t (*hb_font_get_font_extents_func_t) (hb_font_t *font, void *font_data,
+						       hb_font_extents_t *extents,
+						       void *user_data);
+typedef hb_font_get_font_extents_func_t hb_font_get_font_h_extents_func_t;
+typedef hb_font_get_font_extents_func_t hb_font_get_font_v_extents_func_t;
+
+
+typedef hb_bool_t (*hb_font_get_nominal_glyph_func_t) (hb_font_t *font, void *font_data,
+						       hb_codepoint_t unicode,
+						       hb_codepoint_t *glyph,
+						       void *user_data);
+typedef hb_bool_t (*hb_font_get_variation_glyph_func_t) (hb_font_t *font, void *font_data,
+							 hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+							 hb_codepoint_t *glyph,
+							 void *user_data);
+
+typedef unsigned int (*hb_font_get_nominal_glyphs_func_t) (hb_font_t *font, void *font_data,
+							   unsigned int count,
+							   const hb_codepoint_t *first_unicode,
+							   unsigned int unicode_stride,
+							   hb_codepoint_t *first_glyph,
+							   unsigned int glyph_stride,
+							   void *user_data);
+
+
+typedef hb_position_t (*hb_font_get_glyph_advance_func_t) (hb_font_t *font, void *font_data,
+							   hb_codepoint_t glyph,
+							   void *user_data);
+typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_h_advance_func_t;
+typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_v_advance_func_t;
+
+typedef void (*hb_font_get_glyph_advances_func_t) (hb_font_t* font, void* font_data,
+						   unsigned int count,
+						   const hb_codepoint_t *first_glyph,
+						   unsigned glyph_stride,
+						   hb_position_t *first_advance,
+						   unsigned advance_stride,
+						   void *user_data);
+typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_h_advances_func_t;
+typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_v_advances_func_t;
+
+typedef hb_bool_t (*hb_font_get_glyph_origin_func_t) (hb_font_t *font, void *font_data,
+						      hb_codepoint_t glyph,
+						      hb_position_t *x, hb_position_t *y,
+						      void *user_data);
+typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_h_origin_func_t;
+typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_v_origin_func_t;
+
+
+typedef hb_bool_t (*hb_font_get_glyph_extents_func_t) (hb_font_t *font, void *font_data,
+						       hb_codepoint_t glyph,
+						       hb_glyph_extents_t *extents,
+						       void *user_data);
+typedef hb_bool_t (*hb_font_get_glyph_contour_point_func_t) (hb_font_t *font, void *font_data,
+							     hb_codepoint_t glyph, unsigned int point_index,
+							     hb_position_t *x, hb_position_t *y,
+							     void *user_data);
+
+
+typedef hb_bool_t (*hb_font_get_glyph_name_func_t) (hb_font_t *font, void *font_data,
+						    hb_codepoint_t glyph,
+						    char *name, unsigned int size,
+						    void *user_data);
+typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void *font_data,
+							 const char *name, int len, /* -1 means nul-terminated */
+							 hb_codepoint_t *glyph,
+							 void *user_data);
+
+
+/* func setters */
+
+/**
+ * hb_font_funcs_set_font_h_extents_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.1.2
+ **/
+HB_EXTERN void
+hb_font_funcs_set_font_h_extents_func (hb_font_funcs_t *ffuncs,
+				       hb_font_get_font_h_extents_func_t func,
+				       void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_font_v_extents_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.1.2
+ **/
+HB_EXTERN void
+hb_font_funcs_set_font_v_extents_func (hb_font_funcs_t *ffuncs,
+				       hb_font_get_font_v_extents_func_t func,
+				       void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_nominal_glyph_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 1.2.3
+ **/
+HB_EXTERN void
+hb_font_funcs_set_nominal_glyph_func (hb_font_funcs_t *ffuncs,
+				      hb_font_get_nominal_glyph_func_t func,
+				      void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_nominal_glyphs_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 2.0.0
+ **/
+HB_EXTERN void
+hb_font_funcs_set_nominal_glyphs_func (hb_font_funcs_t *ffuncs,
+				       hb_font_get_nominal_glyphs_func_t func,
+				       void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_variation_glyph_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 1.2.3
+ **/
+HB_EXTERN void
+hb_font_funcs_set_variation_glyph_func (hb_font_funcs_t *ffuncs,
+					hb_font_get_variation_glyph_func_t func,
+					void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_glyph_h_advance_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_h_advance_func (hb_font_funcs_t *ffuncs,
+					hb_font_get_glyph_h_advance_func_t func,
+					void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_glyph_v_advance_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_v_advance_func (hb_font_funcs_t *ffuncs,
+					hb_font_get_glyph_v_advance_func_t func,
+					void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_glyph_h_advances_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 1.8.6
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_h_advances_func (hb_font_funcs_t *ffuncs,
+					hb_font_get_glyph_h_advances_func_t func,
+					void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_glyph_v_advances_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 1.8.6
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_v_advances_func (hb_font_funcs_t *ffuncs,
+					hb_font_get_glyph_v_advances_func_t func,
+					void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_glyph_h_origin_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs,
+				       hb_font_get_glyph_h_origin_func_t func,
+				       void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_glyph_v_origin_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs,
+				       hb_font_get_glyph_v_origin_func_t func,
+				       void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_glyph_extents_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_extents_func (hb_font_funcs_t *ffuncs,
+				      hb_font_get_glyph_extents_func_t func,
+				      void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_glyph_contour_point_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_contour_point_func (hb_font_funcs_t *ffuncs,
+					    hb_font_get_glyph_contour_point_func_t func,
+					    void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_glyph_name_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_name_func (hb_font_funcs_t *ffuncs,
+				   hb_font_get_glyph_name_func_t func,
+				   void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_glyph_from_name_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_from_name_func (hb_font_funcs_t *ffuncs,
+					hb_font_get_glyph_from_name_func_t func,
+					void *user_data, hb_destroy_func_t destroy);
+
+/* func dispatch */
+
+HB_EXTERN hb_bool_t
+hb_font_get_h_extents (hb_font_t *font,
+		       hb_font_extents_t *extents);
+HB_EXTERN hb_bool_t
+hb_font_get_v_extents (hb_font_t *font,
+		       hb_font_extents_t *extents);
+
+HB_EXTERN hb_bool_t
+hb_font_get_nominal_glyph (hb_font_t *font,
+			   hb_codepoint_t unicode,
+			   hb_codepoint_t *glyph);
+HB_EXTERN hb_bool_t
+hb_font_get_variation_glyph (hb_font_t *font,
+			     hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+			     hb_codepoint_t *glyph);
+
+HB_EXTERN hb_position_t
+hb_font_get_glyph_h_advance (hb_font_t *font,
+			     hb_codepoint_t glyph);
+HB_EXTERN hb_position_t
+hb_font_get_glyph_v_advance (hb_font_t *font,
+			     hb_codepoint_t glyph);
+
+HB_EXTERN void
+hb_font_get_glyph_h_advances (hb_font_t* font,
+			      unsigned int count,
+			      const hb_codepoint_t *first_glyph,
+			      unsigned glyph_stride,
+			      hb_position_t *first_advance,
+			      unsigned advance_stride);
+HB_EXTERN void
+hb_font_get_glyph_v_advances (hb_font_t* font,
+			      unsigned int count,
+			      const hb_codepoint_t *first_glyph,
+			      unsigned glyph_stride,
+			      hb_position_t *first_advance,
+			      unsigned advance_stride);
+
+HB_EXTERN hb_bool_t
+hb_font_get_glyph_h_origin (hb_font_t *font,
+			    hb_codepoint_t glyph,
+			    hb_position_t *x, hb_position_t *y);
+HB_EXTERN hb_bool_t
+hb_font_get_glyph_v_origin (hb_font_t *font,
+			    hb_codepoint_t glyph,
+			    hb_position_t *x, hb_position_t *y);
+
+HB_EXTERN hb_bool_t
+hb_font_get_glyph_extents (hb_font_t *font,
+			   hb_codepoint_t glyph,
+			   hb_glyph_extents_t *extents);
+
+HB_EXTERN hb_bool_t
+hb_font_get_glyph_contour_point (hb_font_t *font,
+				 hb_codepoint_t glyph, unsigned int point_index,
+				 hb_position_t *x, hb_position_t *y);
+
+HB_EXTERN hb_bool_t
+hb_font_get_glyph_name (hb_font_t *font,
+			hb_codepoint_t glyph,
+			char *name, unsigned int size);
+HB_EXTERN hb_bool_t
+hb_font_get_glyph_from_name (hb_font_t *font,
+			     const char *name, int len, /* -1 means nul-terminated */
+			     hb_codepoint_t *glyph);
+
+
+/* high-level funcs, with fallback */
+
+/* Calls either hb_font_get_nominal_glyph() if variation_selector is 0,
+ * otherwise calls hb_font_get_variation_glyph(). */
+HB_EXTERN hb_bool_t
+hb_font_get_glyph (hb_font_t *font,
+		   hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+		   hb_codepoint_t *glyph);
+
+HB_EXTERN void
+hb_font_get_extents_for_direction (hb_font_t *font,
+				   hb_direction_t direction,
+				   hb_font_extents_t *extents);
+HB_EXTERN void
+hb_font_get_glyph_advance_for_direction (hb_font_t *font,
+					 hb_codepoint_t glyph,
+					 hb_direction_t direction,
+					 hb_position_t *x, hb_position_t *y);
+HB_EXTERN void
+hb_font_get_glyph_advances_for_direction (hb_font_t* font,
+					  hb_direction_t direction,
+					  unsigned int count,
+					  const hb_codepoint_t *first_glyph,
+					  unsigned glyph_stride,
+					  hb_position_t *first_advance,
+					  unsigned advance_stride);
+HB_EXTERN void
+hb_font_get_glyph_origin_for_direction (hb_font_t *font,
+					hb_codepoint_t glyph,
+					hb_direction_t direction,
+					hb_position_t *x, hb_position_t *y);
+HB_EXTERN void
+hb_font_add_glyph_origin_for_direction (hb_font_t *font,
+					hb_codepoint_t glyph,
+					hb_direction_t direction,
+					hb_position_t *x, hb_position_t *y);
+HB_EXTERN void
+hb_font_subtract_glyph_origin_for_direction (hb_font_t *font,
+					     hb_codepoint_t glyph,
+					     hb_direction_t direction,
+					     hb_position_t *x, hb_position_t *y);
+
+HB_EXTERN hb_bool_t
+hb_font_get_glyph_extents_for_origin (hb_font_t *font,
+				      hb_codepoint_t glyph,
+				      hb_direction_t direction,
+				      hb_glyph_extents_t *extents);
+
+HB_EXTERN hb_bool_t
+hb_font_get_glyph_contour_point_for_origin (hb_font_t *font,
+					    hb_codepoint_t glyph, unsigned int point_index,
+					    hb_direction_t direction,
+					    hb_position_t *x, hb_position_t *y);
+
+/* Generates gidDDD if glyph has no name. */
+HB_EXTERN void
+hb_font_glyph_to_string (hb_font_t *font,
+			 hb_codepoint_t glyph,
+			 char *s, unsigned int size);
+/* Parses gidDDD and uniUUUU strings automatically. */
+HB_EXTERN hb_bool_t
+hb_font_glyph_from_string (hb_font_t *font,
+			   const char *s, int len, /* -1 means nul-terminated */
+			   hb_codepoint_t *glyph);
+
+
+/*
+ * hb_font_t
+ */
+
+/* Fonts are very light-weight objects */
+
+HB_EXTERN hb_font_t *
+hb_font_create (hb_face_t *face);
+
+HB_EXTERN hb_font_t *
+hb_font_create_sub_font (hb_font_t *parent);
+
+HB_EXTERN hb_font_t *
+hb_font_get_empty (void);
+
+HB_EXTERN hb_font_t *
+hb_font_reference (hb_font_t *font);
+
+HB_EXTERN void
+hb_font_destroy (hb_font_t *font);
+
+HB_EXTERN hb_bool_t
+hb_font_set_user_data (hb_font_t          *font,
+		       hb_user_data_key_t *key,
+		       void *              data,
+		       hb_destroy_func_t   destroy,
+		       hb_bool_t           replace);
+
+
+HB_EXTERN void *
+hb_font_get_user_data (hb_font_t          *font,
+		       hb_user_data_key_t *key);
+
+HB_EXTERN void
+hb_font_make_immutable (hb_font_t *font);
+
+HB_EXTERN hb_bool_t
+hb_font_is_immutable (hb_font_t *font);
+
+HB_EXTERN void
+hb_font_set_parent (hb_font_t *font,
+		    hb_font_t *parent);
+
+HB_EXTERN hb_font_t *
+hb_font_get_parent (hb_font_t *font);
+
+HB_EXTERN void
+hb_font_set_face (hb_font_t *font,
+		  hb_face_t *face);
+
+HB_EXTERN hb_face_t *
+hb_font_get_face (hb_font_t *font);
+
+
+HB_EXTERN void
+hb_font_set_funcs (hb_font_t         *font,
+		   hb_font_funcs_t   *klass,
+		   void              *font_data,
+		   hb_destroy_func_t  destroy);
+
+/* Be *very* careful with this function! */
+HB_EXTERN void
+hb_font_set_funcs_data (hb_font_t         *font,
+		        void              *font_data,
+		        hb_destroy_func_t  destroy);
+
+
+HB_EXTERN void
+hb_font_set_scale (hb_font_t *font,
+		   int x_scale,
+		   int y_scale);
+
+HB_EXTERN void
+hb_font_get_scale (hb_font_t *font,
+		   int *x_scale,
+		   int *y_scale);
+
+/*
+ * A zero value means "no hinting in that direction"
+ */
+HB_EXTERN void
+hb_font_set_ppem (hb_font_t *font,
+		  unsigned int x_ppem,
+		  unsigned int y_ppem);
+
+HB_EXTERN void
+hb_font_get_ppem (hb_font_t *font,
+		  unsigned int *x_ppem,
+		  unsigned int *y_ppem);
+
+/*
+ * Point size per EM.  Used for optical-sizing in CoreText.
+ * A value of zero means "not set".
+ */
+HB_EXTERN void
+hb_font_set_ptem (hb_font_t *font, float ptem);
+
+HB_EXTERN float
+hb_font_get_ptem (hb_font_t *font);
+
+HB_EXTERN void
+hb_font_set_variations (hb_font_t *font,
+			const hb_variation_t *variations,
+			unsigned int variations_length);
+
+HB_EXTERN void
+hb_font_set_var_coords_design (hb_font_t *font,
+			       const float *coords,
+			       unsigned int coords_length);
+
+HB_EXTERN void
+hb_font_set_var_coords_normalized (hb_font_t *font,
+				   const int *coords, /* 2.14 normalized */
+				   unsigned int coords_length);
+
+HB_EXTERN const int *
+hb_font_get_var_coords_normalized (hb_font_t *font,
+				   unsigned int *length);
+
+HB_END_DECLS
+
+#endif /* HB_FONT_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-font.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-font.hh
new file mode 100644
index 0000000..aaa0fd9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-font.hh
@@ -0,0 +1,617 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2011  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_FONT_HH
+#define HB_FONT_HH
+
+#include "hb.hh"
+
+#include "hb-face.hh"
+#include "hb-shaper.hh"
+
+
+/*
+ * hb_font_funcs_t
+ */
+
+#define HB_FONT_FUNCS_IMPLEMENT_CALLBACKS \
+  HB_FONT_FUNC_IMPLEMENT (font_h_extents) \
+  HB_FONT_FUNC_IMPLEMENT (font_v_extents) \
+  HB_FONT_FUNC_IMPLEMENT (nominal_glyph) \
+  HB_FONT_FUNC_IMPLEMENT (nominal_glyphs) \
+  HB_FONT_FUNC_IMPLEMENT (variation_glyph) \
+  HB_FONT_FUNC_IMPLEMENT (glyph_h_advance) \
+  HB_FONT_FUNC_IMPLEMENT (glyph_v_advance) \
+  HB_FONT_FUNC_IMPLEMENT (glyph_h_advances) \
+  HB_FONT_FUNC_IMPLEMENT (glyph_v_advances) \
+  HB_FONT_FUNC_IMPLEMENT (glyph_h_origin) \
+  HB_FONT_FUNC_IMPLEMENT (glyph_v_origin) \
+  HB_FONT_FUNC_IMPLEMENT (glyph_h_kerning) \
+  HB_FONT_FUNC_IMPLEMENT (glyph_v_kerning) \
+  HB_FONT_FUNC_IMPLEMENT (glyph_extents) \
+  HB_FONT_FUNC_IMPLEMENT (glyph_contour_point) \
+  HB_FONT_FUNC_IMPLEMENT (glyph_name) \
+  HB_FONT_FUNC_IMPLEMENT (glyph_from_name) \
+  /* ^--- Add new callbacks here */
+
+struct hb_font_funcs_t
+{
+  hb_object_header_t header;
+
+  struct {
+#define HB_FONT_FUNC_IMPLEMENT(name) void *name;
+    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+  } user_data;
+
+  struct {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_destroy_func_t name;
+    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+  } destroy;
+
+  /* Don't access these directly.  Call font->get_*() instead. */
+  union get_t {
+    struct get_funcs_t {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name;
+      HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+    } f;
+    void (*array[0
+#define HB_FONT_FUNC_IMPLEMENT(name) +1
+      HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+		]) ();
+  } get;
+};
+DECLARE_NULL_INSTANCE (hb_font_funcs_t);
+
+
+/*
+ * hb_font_t
+ */
+
+#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INSTANTIATE_SHAPERS(shaper, font);
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+
+struct hb_font_t
+{
+  hb_object_header_t header;
+
+  hb_font_t *parent;
+  hb_face_t *face;
+
+  int x_scale;
+  int y_scale;
+
+  unsigned int x_ppem;
+  unsigned int y_ppem;
+
+  float ptem;
+
+  /* Font variation coordinates. */
+  unsigned int num_coords;
+  int *coords;
+
+  hb_font_funcs_t   *klass;
+  void              *user_data;
+  hb_destroy_func_t  destroy;
+
+  hb_shaper_object_dataset_t<hb_font_t> data; /* Various shaper data. */
+
+
+  /* Convert from font-space to user-space */
+  int dir_scale (hb_direction_t direction)
+  { return HB_DIRECTION_IS_VERTICAL(direction) ? y_scale : x_scale; }
+  hb_position_t em_scale_x (int16_t v) { return em_scale (v, x_scale); }
+  hb_position_t em_scale_y (int16_t v) { return em_scale (v, y_scale); }
+  hb_position_t em_scalef_x (float v) { return em_scalef (v, this->x_scale); }
+  hb_position_t em_scalef_y (float v) { return em_scalef (v, this->y_scale); }
+  float em_fscale_x (int16_t v) { return em_fscale (v, x_scale); }
+  float em_fscale_y (int16_t v) { return em_fscale (v, y_scale); }
+  hb_position_t em_scale_dir (int16_t v, hb_direction_t direction)
+  { return em_scale (v, dir_scale (direction)); }
+
+  /* Convert from parent-font user-space to our user-space */
+  hb_position_t parent_scale_x_distance (hb_position_t v)
+  {
+    if (unlikely (parent && parent->x_scale != x_scale))
+      return (hb_position_t) (v * (int64_t) this->x_scale / this->parent->x_scale);
+    return v;
+  }
+  hb_position_t parent_scale_y_distance (hb_position_t v)
+  {
+    if (unlikely (parent && parent->y_scale != y_scale))
+      return (hb_position_t) (v * (int64_t) this->y_scale / this->parent->y_scale);
+    return v;
+  }
+  hb_position_t parent_scale_x_position (hb_position_t v)
+  { return parent_scale_x_distance (v); }
+  hb_position_t parent_scale_y_position (hb_position_t v)
+  { return parent_scale_y_distance (v); }
+
+  void parent_scale_distance (hb_position_t *x, hb_position_t *y)
+  {
+    *x = parent_scale_x_distance (*x);
+    *y = parent_scale_y_distance (*y);
+  }
+  void parent_scale_position (hb_position_t *x, hb_position_t *y)
+  {
+    *x = parent_scale_x_position (*x);
+    *y = parent_scale_y_position (*y);
+  }
+
+
+  /* Public getters */
+
+  HB_INTERNAL bool has_func (unsigned int i);
+  HB_INTERNAL bool has_func_set (unsigned int i);
+
+  /* has_* ... */
+#define HB_FONT_FUNC_IMPLEMENT(name) \
+  bool \
+  has_##name##_func () \
+  { \
+    hb_font_funcs_t *funcs = this->klass; \
+    unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \
+    return has_func (i); \
+  } \
+  bool \
+  has_##name##_func_set () \
+  { \
+    hb_font_funcs_t *funcs = this->klass; \
+    unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \
+    return has_func_set (i); \
+  }
+  HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+
+  hb_bool_t get_font_h_extents (hb_font_extents_t *extents)
+  {
+    memset (extents, 0, sizeof (*extents));
+    return klass->get.f.font_h_extents (this, user_data,
+					extents,
+					klass->user_data.font_h_extents);
+  }
+  hb_bool_t get_font_v_extents (hb_font_extents_t *extents)
+  {
+    memset (extents, 0, sizeof (*extents));
+    return klass->get.f.font_v_extents (this, user_data,
+					extents,
+					klass->user_data.font_v_extents);
+  }
+
+  bool has_glyph (hb_codepoint_t unicode)
+  {
+    hb_codepoint_t glyph;
+    return get_nominal_glyph (unicode, &glyph);
+  }
+
+  hb_bool_t get_nominal_glyph (hb_codepoint_t unicode,
+				      hb_codepoint_t *glyph)
+  {
+    *glyph = 0;
+    return klass->get.f.nominal_glyph (this, user_data,
+				       unicode, glyph,
+				       klass->user_data.nominal_glyph);
+  }
+  unsigned int get_nominal_glyphs (unsigned int count,
+				   const hb_codepoint_t *first_unicode,
+				   unsigned int unicode_stride,
+				   hb_codepoint_t *first_glyph,
+				   unsigned int glyph_stride)
+  {
+    return klass->get.f.nominal_glyphs (this, user_data,
+					count,
+					first_unicode, unicode_stride,
+					first_glyph, glyph_stride,
+					klass->user_data.nominal_glyphs);
+  }
+
+  hb_bool_t get_variation_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+				 hb_codepoint_t *glyph)
+  {
+    *glyph = 0;
+    return klass->get.f.variation_glyph (this, user_data,
+					 unicode, variation_selector, glyph,
+					 klass->user_data.variation_glyph);
+  }
+
+  hb_position_t get_glyph_h_advance (hb_codepoint_t glyph)
+  {
+    return klass->get.f.glyph_h_advance (this, user_data,
+					 glyph,
+					 klass->user_data.glyph_h_advance);
+  }
+
+  hb_position_t get_glyph_v_advance (hb_codepoint_t glyph)
+  {
+    return klass->get.f.glyph_v_advance (this, user_data,
+					 glyph,
+					 klass->user_data.glyph_v_advance);
+  }
+
+  void get_glyph_h_advances (unsigned int count,
+			     const hb_codepoint_t *first_glyph,
+			     unsigned int glyph_stride,
+			     hb_position_t *first_advance,
+			     unsigned int advance_stride)
+  {
+    return klass->get.f.glyph_h_advances (this, user_data,
+					  count,
+					  first_glyph, glyph_stride,
+					  first_advance, advance_stride,
+					  klass->user_data.glyph_h_advances);
+  }
+
+  void get_glyph_v_advances (unsigned int count,
+			     const hb_codepoint_t *first_glyph,
+			     unsigned int glyph_stride,
+			     hb_position_t *first_advance,
+			     unsigned int advance_stride)
+  {
+    return klass->get.f.glyph_v_advances (this, user_data,
+					  count,
+					  first_glyph, glyph_stride,
+					  first_advance, advance_stride,
+					  klass->user_data.glyph_v_advances);
+  }
+
+  hb_bool_t get_glyph_h_origin (hb_codepoint_t glyph,
+				       hb_position_t *x, hb_position_t *y)
+  {
+    *x = *y = 0;
+    return klass->get.f.glyph_h_origin (this, user_data,
+					glyph, x, y,
+					klass->user_data.glyph_h_origin);
+  }
+
+  hb_bool_t get_glyph_v_origin (hb_codepoint_t glyph,
+				hb_position_t *x, hb_position_t *y)
+  {
+    *x = *y = 0;
+    return klass->get.f.glyph_v_origin (this, user_data,
+					glyph, x, y,
+					klass->user_data.glyph_v_origin);
+  }
+
+  hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph,
+				     hb_codepoint_t right_glyph)
+  {
+    return klass->get.f.glyph_h_kerning (this, user_data,
+					 left_glyph, right_glyph,
+					 klass->user_data.glyph_h_kerning);
+  }
+
+  hb_position_t get_glyph_v_kerning (hb_codepoint_t top_glyph,
+				     hb_codepoint_t bottom_glyph)
+  {
+    return klass->get.f.glyph_v_kerning (this, user_data,
+					 top_glyph, bottom_glyph,
+					 klass->user_data.glyph_v_kerning);
+  }
+
+  hb_bool_t get_glyph_extents (hb_codepoint_t glyph,
+				      hb_glyph_extents_t *extents)
+  {
+    memset (extents, 0, sizeof (*extents));
+    return klass->get.f.glyph_extents (this, user_data,
+				       glyph,
+				       extents,
+				       klass->user_data.glyph_extents);
+  }
+
+  hb_bool_t get_glyph_contour_point (hb_codepoint_t glyph, unsigned int point_index,
+					    hb_position_t *x, hb_position_t *y)
+  {
+    *x = *y = 0;
+    return klass->get.f.glyph_contour_point (this, user_data,
+					     glyph, point_index,
+					     x, y,
+					     klass->user_data.glyph_contour_point);
+  }
+
+  hb_bool_t get_glyph_name (hb_codepoint_t glyph,
+			    char *name, unsigned int size)
+  {
+    if (size) *name = '\0';
+    return klass->get.f.glyph_name (this, user_data,
+				    glyph,
+				    name, size,
+				    klass->user_data.glyph_name);
+  }
+
+  hb_bool_t get_glyph_from_name (const char *name, int len, /* -1 means nul-terminated */
+				 hb_codepoint_t *glyph)
+  {
+    *glyph = 0;
+    if (len == -1) len = strlen (name);
+    return klass->get.f.glyph_from_name (this, user_data,
+					 name, len,
+					 glyph,
+					 klass->user_data.glyph_from_name);
+  }
+
+
+  /* A bit higher-level, and with fallback */
+
+  void get_h_extents_with_fallback (hb_font_extents_t *extents)
+  {
+    if (!get_font_h_extents (extents))
+    {
+      extents->ascender = y_scale * .8;
+      extents->descender = extents->ascender - y_scale;
+      extents->line_gap = 0;
+    }
+  }
+  void get_v_extents_with_fallback (hb_font_extents_t *extents)
+  {
+    if (!get_font_v_extents (extents))
+    {
+      extents->ascender = x_scale / 2;
+      extents->descender = extents->ascender - x_scale;
+      extents->line_gap = 0;
+    }
+  }
+
+  void get_extents_for_direction (hb_direction_t direction,
+				  hb_font_extents_t *extents)
+  {
+    if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
+      get_h_extents_with_fallback (extents);
+    else
+      get_v_extents_with_fallback (extents);
+  }
+
+  void get_glyph_advance_for_direction (hb_codepoint_t glyph,
+					hb_direction_t direction,
+					hb_position_t *x, hb_position_t *y)
+  {
+    *x = *y = 0;
+    if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
+      *x = get_glyph_h_advance (glyph);
+    else
+      *y = get_glyph_v_advance (glyph);
+  }
+  void get_glyph_advances_for_direction (hb_direction_t direction,
+					 unsigned int count,
+					 const hb_codepoint_t *first_glyph,
+					 unsigned glyph_stride,
+					 hb_position_t *first_advance,
+					 unsigned advance_stride)
+  {
+    if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
+      get_glyph_h_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
+    else
+      get_glyph_v_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
+  }
+
+  void guess_v_origin_minus_h_origin (hb_codepoint_t glyph,
+				      hb_position_t *x, hb_position_t *y)
+  {
+    *x = get_glyph_h_advance (glyph) / 2;
+
+    /* TODO cache this somehow?! */
+    hb_font_extents_t extents;
+    get_h_extents_with_fallback (&extents);
+    *y = extents.ascender;
+  }
+
+  void get_glyph_h_origin_with_fallback (hb_codepoint_t glyph,
+					 hb_position_t *x, hb_position_t *y)
+  {
+    if (!get_glyph_h_origin (glyph, x, y) &&
+	 get_glyph_v_origin (glyph, x, y))
+    {
+      hb_position_t dx, dy;
+      guess_v_origin_minus_h_origin (glyph, &dx, &dy);
+      *x -= dx; *y -= dy;
+    }
+  }
+  void get_glyph_v_origin_with_fallback (hb_codepoint_t glyph,
+					 hb_position_t *x, hb_position_t *y)
+  {
+    if (!get_glyph_v_origin (glyph, x, y) &&
+	 get_glyph_h_origin (glyph, x, y))
+    {
+      hb_position_t dx, dy;
+      guess_v_origin_minus_h_origin (glyph, &dx, &dy);
+      *x += dx; *y += dy;
+    }
+  }
+
+  void get_glyph_origin_for_direction (hb_codepoint_t glyph,
+				       hb_direction_t direction,
+				       hb_position_t *x, hb_position_t *y)
+  {
+    if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
+      get_glyph_h_origin_with_fallback (glyph, x, y);
+    else
+      get_glyph_v_origin_with_fallback (glyph, x, y);
+  }
+
+  void add_glyph_h_origin (hb_codepoint_t glyph,
+			   hb_position_t *x, hb_position_t *y)
+  {
+    hb_position_t origin_x, origin_y;
+
+    get_glyph_h_origin_with_fallback (glyph, &origin_x, &origin_y);
+
+    *x += origin_x;
+    *y += origin_y;
+  }
+  void add_glyph_v_origin (hb_codepoint_t glyph,
+			   hb_position_t *x, hb_position_t *y)
+  {
+    hb_position_t origin_x, origin_y;
+
+    get_glyph_v_origin_with_fallback (glyph, &origin_x, &origin_y);
+
+    *x += origin_x;
+    *y += origin_y;
+  }
+  void add_glyph_origin_for_direction (hb_codepoint_t glyph,
+				       hb_direction_t direction,
+				       hb_position_t *x, hb_position_t *y)
+  {
+    hb_position_t origin_x, origin_y;
+
+    get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y);
+
+    *x += origin_x;
+    *y += origin_y;
+  }
+
+  void subtract_glyph_h_origin (hb_codepoint_t glyph,
+			        hb_position_t *x, hb_position_t *y)
+  {
+    hb_position_t origin_x, origin_y;
+
+    get_glyph_h_origin_with_fallback (glyph, &origin_x, &origin_y);
+
+    *x -= origin_x;
+    *y -= origin_y;
+  }
+  void subtract_glyph_v_origin (hb_codepoint_t glyph,
+				hb_position_t *x, hb_position_t *y)
+  {
+    hb_position_t origin_x, origin_y;
+
+    get_glyph_v_origin_with_fallback (glyph, &origin_x, &origin_y);
+
+    *x -= origin_x;
+    *y -= origin_y;
+  }
+  void subtract_glyph_origin_for_direction (hb_codepoint_t glyph,
+					    hb_direction_t direction,
+					    hb_position_t *x, hb_position_t *y)
+  {
+    hb_position_t origin_x, origin_y;
+
+    get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y);
+
+    *x -= origin_x;
+    *y -= origin_y;
+  }
+
+  void get_glyph_kerning_for_direction (hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
+					hb_direction_t direction,
+					hb_position_t *x, hb_position_t *y)
+  {
+    if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) {
+      *y = 0;
+      *x = get_glyph_h_kerning (first_glyph, second_glyph);
+    } else {
+      *x = 0;
+      *y = get_glyph_v_kerning (first_glyph, second_glyph);
+    }
+  }
+
+  hb_bool_t get_glyph_extents_for_origin (hb_codepoint_t glyph,
+					  hb_direction_t direction,
+					  hb_glyph_extents_t *extents)
+  {
+    hb_bool_t ret = get_glyph_extents (glyph, extents);
+
+    if (ret)
+      subtract_glyph_origin_for_direction (glyph, direction, &extents->x_bearing, &extents->y_bearing);
+
+    return ret;
+  }
+
+  hb_bool_t get_glyph_contour_point_for_origin (hb_codepoint_t glyph, unsigned int point_index,
+						hb_direction_t direction,
+						hb_position_t *x, hb_position_t *y)
+  {
+    hb_bool_t ret = get_glyph_contour_point (glyph, point_index, x, y);
+
+    if (ret)
+      subtract_glyph_origin_for_direction (glyph, direction, x, y);
+
+    return ret;
+  }
+
+  /* Generates gidDDD if glyph has no name. */
+  void
+  glyph_to_string (hb_codepoint_t glyph,
+		   char *s, unsigned int size)
+  {
+    if (get_glyph_name (glyph, s, size)) return;
+
+    if (size && snprintf (s, size, "gid%u", glyph) < 0)
+      *s = '\0';
+  }
+
+  /* Parses gidDDD and uniUUUU strings automatically. */
+  hb_bool_t
+  glyph_from_string (const char *s, int len, /* -1 means nul-terminated */
+		     hb_codepoint_t *glyph)
+  {
+    if (get_glyph_from_name (s, len, glyph)) return true;
+
+    if (len == -1) len = strlen (s);
+
+    /* Straight glyph index. */
+    if (hb_codepoint_parse (s, len, 10, glyph))
+      return true;
+
+    if (len > 3)
+    {
+      /* gidDDD syntax for glyph indices. */
+      if (0 == strncmp (s, "gid", 3) &&
+	  hb_codepoint_parse (s + 3, len - 3, 10, glyph))
+	return true;
+
+      /* uniUUUU and other Unicode character indices. */
+      hb_codepoint_t unichar;
+      if (0 == strncmp (s, "uni", 3) &&
+	  hb_codepoint_parse (s + 3, len - 3, 16, &unichar) &&
+	  get_nominal_glyph (unichar, glyph))
+	return true;
+    }
+
+    return false;
+  }
+
+  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);
+  }
+  hb_position_t em_scalef (float v, int scale)
+  { return (hb_position_t) round (v * scale / face->get_upem ()); }
+  float em_fscale (int16_t v, int scale)
+  { return (float) v * scale / face->get_upem (); }
+};
+DECLARE_NULL_INSTANCE (hb_font_t);
+
+
+#endif /* HB_FONT_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ft.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ft.cc
new file mode 100644
index 0000000..1900f30
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ft.cc
@@ -0,0 +1,856 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2009  Keith Stribley
+ * Copyright © 2015  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#include "hb-ft.h"
+
+#include "hb-font.hh"
+#include "hb-machinery.hh"
+#include "hb-cache.hh"
+
+#include FT_ADVANCES_H
+#include FT_MULTIPLE_MASTERS_H
+#include FT_TRUETYPE_TABLES_H
+
+
+/**
+ * SECTION:hb-ft
+ * @title: hb-ft
+ * @short_description: FreeType integration
+ * @include: hb-ft.h
+ *
+ * Functions for using HarfBuzz with the FreeType library to provide face and
+ * font data.
+ **/
+
+
+/* TODO:
+ *
+ * In general, this file does a fine job of what it's supposed to do.
+ * There are, however, things that need more work:
+ *
+ *   - FreeType works in 26.6 mode.  Clients can decide to use that mode, and everything
+ *     would work fine.  However, we also abuse this API for performing in font-space,
+ *     but don't pass the correct flags to FreeType.  We just abuse the no-hinting mode
+ *     for that, such that no rounding etc happens.  As such, we don't set ppem, and
+ *     pass NO_HINTING as load_flags.  Would be much better to use NO_SCALE, and scale
+ *     ourselves.
+ *
+ *   - We don't handle / allow for emboldening / obliqueing.
+ *
+ *   - In the future, we should add constructors to create fonts in font space?
+ */
+
+
+struct hb_ft_font_t
+{
+  mutable hb_mutex_t lock;
+  FT_Face ft_face;
+  int load_flags;
+  bool symbol; /* Whether selected cmap is symbol cmap. */
+  bool unref; /* Whether to destroy ft_face when done. */
+
+  mutable hb_atomic_int_t cached_x_scale;
+  mutable hb_advance_cache_t advance_cache;
+};
+
+static hb_ft_font_t *
+_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 nullptr;
+
+  ft_font->lock.init ();
+  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;
+
+  ft_font->cached_x_scale.set (0);
+  ft_font->advance_cache.init ();
+
+  return ft_font;
+}
+
+static void
+_hb_ft_face_destroy (void *data)
+{
+  FT_Done_Face ((FT_Face) data);
+}
+
+static void
+_hb_ft_font_destroy (void *data)
+{
+  hb_ft_font_t *ft_font = (hb_ft_font_t *) data;
+
+  ft_font->advance_cache.fini ();
+
+  if (ft_font->unref)
+    _hb_ft_face_destroy (ft_font->ft_face);
+
+  ft_font->lock.fini ();
+
+  free (ft_font);
+}
+
+/**
+ * hb_ft_font_set_load_flags:
+ * @font:
+ * @load_flags:
+ *
+ *
+ *
+ * Since: 1.0.5
+ **/
+void
+hb_ft_font_set_load_flags (hb_font_t *font, int load_flags)
+{
+  if (hb_object_is_immutable (font))
+    return;
+
+  if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)
+    return;
+
+  hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data;
+
+  ft_font->load_flags = load_flags;
+}
+
+/**
+ * hb_ft_font_get_load_flags:
+ * @font:
+ *
+ *
+ *
+ * Return value:
+ * Since: 1.0.5
+ **/
+int
+hb_ft_font_get_load_flags (hb_font_t *font)
+{
+  if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)
+    return 0;
+
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data;
+
+  return ft_font->load_flags;
+}
+
+FT_Face
+hb_ft_font_get_face (hb_font_t *font)
+{
+  if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)
+    return nullptr;
+
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data;
+
+  return ft_font->ft_face;
+}
+
+
+
+static hb_bool_t
+hb_ft_get_nominal_glyph (hb_font_t *font HB_UNUSED,
+			 void *font_data,
+			 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;
+  hb_lock_t lock (ft_font->lock);
+  unsigned int g = FT_Get_Char_Index (ft_font->ft_face, unicode);
+
+  if (unlikely (!g))
+  {
+    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:
+       * https://docs.microsoft.com/en-us/typography/opentype/spec/recom
+       * 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 unsigned int
+hb_ft_get_nominal_glyphs (hb_font_t *font HB_UNUSED,
+			  void *font_data,
+			  unsigned int count,
+			  const hb_codepoint_t *first_unicode,
+			  unsigned int unicode_stride,
+			  hb_codepoint_t *first_glyph,
+			  unsigned int glyph_stride,
+			  void *user_data HB_UNUSED)
+{
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+  hb_lock_t lock (ft_font->lock);
+  unsigned int done;
+  for (done = 0;
+       done < count && (*first_glyph = FT_Get_Char_Index (ft_font->ft_face, *first_unicode));
+       done++)
+  {
+    first_unicode = &StructAtOffsetUnaligned<hb_codepoint_t> (first_unicode, unicode_stride);
+    first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+  }
+  /* We don't need to do ft_font->symbol dance here, since HB calls the singular
+   * nominal_glyph() for what we don't handle here. */
+  return done;
+}
+
+
+static hb_bool_t
+hb_ft_get_variation_glyph (hb_font_t *font HB_UNUSED,
+			   void *font_data,
+			   hb_codepoint_t unicode,
+			   hb_codepoint_t variation_selector,
+			   hb_codepoint_t *glyph,
+			   void *user_data HB_UNUSED)
+{
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+  hb_lock_t lock (ft_font->lock);
+  unsigned int g = FT_Face_GetCharVariantIndex (ft_font->ft_face, unicode, variation_selector);
+
+  if (unlikely (!g))
+    return false;
+
+  *glyph = g;
+  return true;
+}
+
+static void
+hb_ft_get_glyph_h_advances (hb_font_t* font, void* font_data,
+			    unsigned count,
+			    const hb_codepoint_t *first_glyph,
+			    unsigned glyph_stride,
+			    hb_position_t *first_advance,
+			    unsigned advance_stride,
+			    void *user_data HB_UNUSED)
+{
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+  hb_lock_t lock (ft_font->lock);
+  FT_Face ft_face = ft_font->ft_face;
+  int load_flags = ft_font->load_flags;
+  int mult = font->x_scale < 0 ? -1 : +1;
+
+  if (font->x_scale != ft_font->cached_x_scale.get ())
+  {
+    ft_font->advance_cache.clear ();
+    ft_font->cached_x_scale.set (font->x_scale);
+  }
+
+  for (unsigned int i = 0; i < count; i++)
+  {
+    FT_Fixed v = 0;
+    hb_codepoint_t glyph = *first_glyph;
+
+    unsigned int cv;
+    if (ft_font->advance_cache.get (glyph, &cv))
+      v = cv;
+    else
+    {
+      FT_Get_Advance (ft_face, glyph, load_flags, &v);
+      ft_font->advance_cache.set (glyph, v);
+    }
+
+    *first_advance = (v * mult + (1<<9)) >> 10;
+    first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+    first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
+  }
+}
+
+static hb_position_t
+hb_ft_get_glyph_v_advance (hb_font_t *font,
+			   void *font_data,
+			   hb_codepoint_t glyph,
+			   void *user_data HB_UNUSED)
+{
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+  hb_lock_t lock (ft_font->lock);
+  FT_Fixed v;
+
+  if (unlikely (FT_Get_Advance (ft_font->ft_face, glyph, ft_font->load_flags | FT_LOAD_VERTICAL_LAYOUT, &v)))
+    return 0;
+
+  if (font->y_scale < 0)
+    v = -v;
+
+  /* Note: FreeType's vertical metrics grows downward while other FreeType coordinates
+   * have a Y growing upward.  Hence the extra negation. */
+  return (-v + (1<<9)) >> 10;
+}
+
+static hb_bool_t
+hb_ft_get_glyph_v_origin (hb_font_t *font,
+			  void *font_data,
+			  hb_codepoint_t glyph,
+			  hb_position_t *x,
+			  hb_position_t *y,
+			  void *user_data HB_UNUSED)
+{
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+  hb_lock_t lock (ft_font->lock);
+  FT_Face ft_face = ft_font->ft_face;
+
+  if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags)))
+    return false;
+
+  /* Note: FreeType's vertical metrics grows downward while other FreeType coordinates
+   * have a Y growing upward.  Hence the extra negation. */
+  *x = ft_face->glyph->metrics.horiBearingX -   ft_face->glyph->metrics.vertBearingX;
+  *y = ft_face->glyph->metrics.horiBearingY - (-ft_face->glyph->metrics.vertBearingY);
+
+  if (font->x_scale < 0)
+    *x = -*x;
+  if (font->y_scale < 0)
+    *y = -*y;
+
+  return true;
+}
+
+static hb_bool_t
+hb_ft_get_glyph_extents (hb_font_t *font,
+			 void *font_data,
+			 hb_codepoint_t glyph,
+			 hb_glyph_extents_t *extents,
+			 void *user_data HB_UNUSED)
+{
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+  hb_lock_t lock (ft_font->lock);
+  FT_Face ft_face = ft_font->ft_face;
+
+  if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags)))
+    return false;
+
+  extents->x_bearing = ft_face->glyph->metrics.horiBearingX;
+  extents->y_bearing = ft_face->glyph->metrics.horiBearingY;
+  extents->width = ft_face->glyph->metrics.width;
+  extents->height = -ft_face->glyph->metrics.height;
+  if (font->x_scale < 0)
+  {
+    extents->x_bearing = -extents->x_bearing;
+    extents->width = -extents->width;
+  }
+  if (font->y_scale < 0)
+  {
+    extents->y_bearing = -extents->y_bearing;
+    extents->height = -extents->height;
+  }
+  return true;
+}
+
+static hb_bool_t
+hb_ft_get_glyph_contour_point (hb_font_t *font HB_UNUSED,
+			       void *font_data,
+			       hb_codepoint_t glyph,
+			       unsigned int point_index,
+			       hb_position_t *x,
+			       hb_position_t *y,
+			       void *user_data HB_UNUSED)
+{
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+  hb_lock_t lock (ft_font->lock);
+  FT_Face ft_face = ft_font->ft_face;
+
+  if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags)))
+      return false;
+
+  if (unlikely (ft_face->glyph->format != FT_GLYPH_FORMAT_OUTLINE))
+      return false;
+
+  if (unlikely (point_index >= (unsigned int) ft_face->glyph->outline.n_points))
+      return false;
+
+  *x = ft_face->glyph->outline.points[point_index].x;
+  *y = ft_face->glyph->outline.points[point_index].y;
+
+  return true;
+}
+
+static hb_bool_t
+hb_ft_get_glyph_name (hb_font_t *font HB_UNUSED,
+		      void *font_data,
+		      hb_codepoint_t glyph,
+		      char *name, unsigned int size,
+		      void *user_data HB_UNUSED)
+{
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+  hb_lock_t lock (ft_font->lock);
+  FT_Face ft_face = ft_font->ft_face;
+
+  hb_bool_t ret = !FT_Get_Glyph_Name (ft_face, glyph, name, size);
+  if (ret && (size && !*name))
+    ret = false;
+
+  return ret;
+}
+
+static hb_bool_t
+hb_ft_get_glyph_from_name (hb_font_t *font HB_UNUSED,
+			   void *font_data,
+			   const char *name, int len, /* -1 means nul-terminated */
+			   hb_codepoint_t *glyph,
+			   void *user_data HB_UNUSED)
+{
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+  hb_lock_t lock (ft_font->lock);
+  FT_Face ft_face = ft_font->ft_face;
+
+  if (len < 0)
+    *glyph = FT_Get_Name_Index (ft_face, (FT_String *) name);
+  else {
+    /* Make a nul-terminated version. */
+    char buf[128];
+    len = MIN (len, (int) sizeof (buf) - 1);
+    strncpy (buf, name, len);
+    buf[len] = '\0';
+    *glyph = FT_Get_Name_Index (ft_face, buf);
+  }
+
+  if (*glyph == 0)
+  {
+    /* Check whether the given name was actually the name of glyph 0. */
+    char buf[128];
+    if (!FT_Get_Glyph_Name(ft_face, 0, buf, sizeof (buf)) &&
+        len < 0 ? !strcmp (buf, name) : !strncmp (buf, name, len))
+      return true;
+  }
+
+  return *glyph != 0;
+}
+
+static hb_bool_t
+hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED,
+			  void *font_data,
+			  hb_font_extents_t *metrics,
+			  void *user_data HB_UNUSED)
+{
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+  hb_lock_t lock (ft_font->lock);
+  FT_Face ft_face = ft_font->ft_face;
+  metrics->ascender = FT_MulFix(ft_face->ascender, ft_face->size->metrics.y_scale);
+  metrics->descender = FT_MulFix(ft_face->descender, ft_face->size->metrics.y_scale);
+  metrics->line_gap = FT_MulFix( ft_face->height, ft_face->size->metrics.y_scale ) - (metrics->ascender - metrics->descender);
+  if (font->y_scale < 0)
+  {
+    metrics->ascender = -metrics->ascender;
+    metrics->descender = -metrics->descender;
+    metrics->line_gap = -metrics->line_gap;
+  }
+  return true;
+}
+
+#if HB_USE_ATEXIT
+static void free_static_ft_funcs ();
+#endif
+
+static struct hb_ft_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t<hb_ft_font_funcs_lazy_loader_t>
+{
+  static hb_font_funcs_t *create ()
+  {
+    hb_font_funcs_t *funcs = hb_font_funcs_create ();
+
+    hb_font_funcs_set_font_h_extents_func (funcs, hb_ft_get_font_h_extents, nullptr, nullptr);
+    //hb_font_funcs_set_font_v_extents_func (funcs, hb_ft_get_font_v_extents, nullptr, nullptr);
+    hb_font_funcs_set_nominal_glyph_func (funcs, hb_ft_get_nominal_glyph, nullptr, nullptr);
+    hb_font_funcs_set_nominal_glyphs_func (funcs, hb_ft_get_nominal_glyphs, nullptr, nullptr);
+    hb_font_funcs_set_variation_glyph_func (funcs, hb_ft_get_variation_glyph, nullptr, nullptr);
+    hb_font_funcs_set_glyph_h_advances_func (funcs, hb_ft_get_glyph_h_advances, nullptr, nullptr);
+    hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ft_get_glyph_v_advance, nullptr, nullptr);
+    //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ft_get_glyph_h_origin, nullptr, nullptr);
+    hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ft_get_glyph_v_origin, nullptr, nullptr);
+    hb_font_funcs_set_glyph_extents_func (funcs, hb_ft_get_glyph_extents, nullptr, nullptr);
+    hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ft_get_glyph_contour_point, nullptr, nullptr);
+    hb_font_funcs_set_glyph_name_func (funcs, hb_ft_get_glyph_name, nullptr, nullptr);
+    hb_font_funcs_set_glyph_from_name_func (funcs, hb_ft_get_glyph_from_name, nullptr, nullptr);
+
+    hb_font_funcs_make_immutable (funcs);
+
+#if HB_USE_ATEXIT
+    atexit (free_static_ft_funcs);
+#endif
+
+    return funcs;
+  }
+} static_ft_funcs;
+
+#if HB_USE_ATEXIT
+static
+void free_static_ft_funcs ()
+{
+  static_ft_funcs.free_instance ();
+}
+#endif
+
+static hb_font_funcs_t *
+_hb_ft_get_font_funcs ()
+{
+  return static_ft_funcs.get_unconst ();
+}
+
+static void
+_hb_ft_font_set_funcs (hb_font_t *font, FT_Face ft_face, bool unref)
+{
+  bool symbol = ft_face->charmap && ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL;
+
+  hb_font_set_funcs (font,
+		     _hb_ft_get_font_funcs (),
+		     _hb_ft_font_create (ft_face, symbol, unref),
+		     _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;
+  FT_Byte *buffer;
+  FT_ULong  length = 0;
+  FT_Error error;
+
+  /* Note: FreeType like HarfBuzz uses the NONE tag for fetching the entire blob */
+
+  error = FT_Load_Sfnt_Table (ft_face, tag, 0, nullptr, &length);
+  if (error)
+    return nullptr;
+
+  buffer = (FT_Byte *) malloc (length);
+  if (!buffer)
+    return nullptr;
+
+  error = FT_Load_Sfnt_Table (ft_face, tag, 0, buffer, &length);
+  if (error)
+  {
+    free (buffer);
+    return nullptr;
+  }
+
+  return hb_blob_create ((const char *) buffer, length,
+			 HB_MEMORY_MODE_WRITABLE,
+			 buffer, free);
+}
+
+/**
+ * hb_ft_face_create:
+ * @ft_face: (destroy destroy) (scope notified):
+ * @destroy:
+ *
+ *
+ *
+ * Return value: (transfer full):
+ * Since: 0.9.2
+ **/
+hb_face_t *
+hb_ft_face_create (FT_Face           ft_face,
+		   hb_destroy_func_t destroy)
+{
+  hb_face_t *face;
+
+  if (!ft_face->stream->read) {
+    hb_blob_t *blob;
+
+    blob = hb_blob_create ((const char *) ft_face->stream->base,
+			   (unsigned int) ft_face->stream->size,
+			   HB_MEMORY_MODE_READONLY,
+			   ft_face, destroy);
+    face = hb_face_create (blob, ft_face->face_index);
+    hb_blob_destroy (blob);
+  } else {
+    face = hb_face_create_for_tables (reference_table, ft_face, destroy);
+  }
+
+  hb_face_set_index (face, ft_face->face_index);
+  hb_face_set_upem (face, ft_face->units_per_EM);
+
+  return face;
+}
+
+/**
+ * hb_ft_face_create_referenced:
+ * @ft_face:
+ *
+ *
+ *
+ * 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_ft_face_destroy);
+}
+
+static void
+hb_ft_face_finalize (FT_Face ft_face)
+{
+  hb_face_destroy ((hb_face_t *) ft_face->generic.data);
+}
+
+/**
+ * hb_ft_face_create_cached:
+ * @ft_face:
+ *
+ *
+ *
+ * Return value: (transfer full):
+ * Since: 0.9.2
+ **/
+hb_face_t *
+hb_ft_face_create_cached (FT_Face ft_face)
+{
+  if (unlikely (!ft_face->generic.data || ft_face->generic.finalizer != (FT_Generic_Finalizer) hb_ft_face_finalize))
+  {
+    if (ft_face->generic.finalizer)
+      ft_face->generic.finalizer (ft_face);
+
+    ft_face->generic.data = hb_ft_face_create (ft_face, nullptr);
+    ft_face->generic.finalizer = (FT_Generic_Finalizer) hb_ft_face_finalize;
+  }
+
+  return hb_face_reference ((hb_face_t *) ft_face->generic.data);
+}
+
+
+/**
+ * hb_ft_font_create:
+ * @ft_face: (destroy destroy) (scope notified):
+ * @destroy:
+ *
+ *
+ *
+ * Return value: (transfer full):
+ * Since: 0.9.2
+ **/
+hb_font_t *
+hb_ft_font_create (FT_Face           ft_face,
+		   hb_destroy_func_t destroy)
+{
+  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_ft_font_changed (font);
+  return font;
+}
+
+void
+hb_ft_font_changed (hb_font_t *font)
+{
+  if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)
+    return;
+
+  hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data;
+  FT_Face ft_face = ft_font->ft_face;
+
+  hb_font_set_scale (font,
+		     (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
+
+#ifdef HAVE_FT_GET_VAR_BLEND_COORDINATES
+  FT_MM_Var *mm_var = nullptr;
+  if (!FT_Get_MM_Var (ft_face, &mm_var))
+  {
+    FT_Fixed *ft_coords = (FT_Fixed *) calloc (mm_var->num_axis, sizeof (FT_Fixed));
+    int *coords = (int *) calloc (mm_var->num_axis, sizeof (int));
+    if (coords && ft_coords)
+    {
+      if (!FT_Get_Var_Blend_Coordinates (ft_face, mm_var->num_axis, ft_coords))
+      {
+	bool nonzero = false;
+
+	for (unsigned int i = 0; i < mm_var->num_axis; ++i)
+	 {
+	  coords[i] = ft_coords[i] >>= 2;
+	  nonzero = nonzero || coords[i];
+	 }
+
+	if (nonzero)
+	  hb_font_set_var_coords_normalized (font, coords, mm_var->num_axis);
+	else
+	  hb_font_set_var_coords_normalized (font, nullptr, 0);
+      }
+    }
+    free (coords);
+    free (ft_coords);
+#ifdef HAVE_FT_DONE_MM_VAR
+    FT_Done_MM_Var (ft_face->glyph->library, mm_var);
+#else
+    free (mm_var);
+#endif
+  }
+#endif
+}
+
+/**
+ * hb_ft_font_create_referenced:
+ * @ft_face:
+ *
+ *
+ *
+ * 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_ft_face_destroy);
+}
+
+#if HB_USE_ATEXIT
+static void free_static_ft_library ();
+#endif
+
+static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer (FT_Library),
+							     hb_ft_library_lazy_loader_t>
+{
+  static FT_Library create ()
+  {
+    FT_Library l;
+    if (FT_Init_FreeType (&l))
+      return nullptr;
+
+#if HB_USE_ATEXIT
+    atexit (free_static_ft_library);
+#endif
+
+    return l;
+  }
+  static void destroy (FT_Library l)
+  {
+    FT_Done_FreeType (l);
+  }
+  static FT_Library get_null ()
+  {
+    return nullptr;
+  }
+} static_ft_library;
+
+#if HB_USE_ATEXIT
+static
+void free_static_ft_library ()
+{
+  static_ft_library.free_instance ();
+}
+#endif
+
+static FT_Library
+get_ft_library ()
+{
+  return static_ft_library.get_unconst ();
+}
+
+static void
+_release_blob (FT_Face ft_face)
+{
+  hb_blob_destroy ((hb_blob_t *) ft_face->generic.data);
+}
+
+void
+hb_ft_font_set_funcs (hb_font_t *font)
+{
+  hb_blob_t *blob = hb_face_reference_blob (font->face);
+  unsigned int blob_length;
+  const char *blob_data = hb_blob_get_data (blob, &blob_length);
+  if (unlikely (!blob_length))
+    DEBUG_MSG (FT, font, "Font face has empty blob");
+
+  FT_Face ft_face = nullptr;
+  FT_Error err = FT_New_Memory_Face (get_ft_library (),
+				     (const FT_Byte *) blob_data,
+				     blob_length,
+				     hb_face_get_index (font->face),
+				     &ft_face);
+
+  if (unlikely (err)) {
+    hb_blob_destroy (blob);
+    DEBUG_MSG (FT, font, "Font face FT_New_Memory_Face() failed");
+    return;
+  }
+
+  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
+  if (font->x_scale < 0 || font->y_scale < 0)
+  {
+    FT_Matrix matrix = { font->x_scale < 0 ? -1 : +1, 0,
+			  0, font->y_scale < 0 ? -1 : +1};
+    FT_Set_Transform (ft_face, &matrix, nullptr);
+  }
+
+#ifdef HAVE_FT_SET_VAR_BLEND_COORDINATES
+  unsigned int num_coords;
+  const int *coords = hb_font_get_var_coords_normalized (font, &num_coords);
+  if (num_coords)
+  {
+    FT_Fixed *ft_coords = (FT_Fixed *) calloc (num_coords, sizeof (FT_Fixed));
+    if (ft_coords)
+    {
+      for (unsigned int i = 0; i < num_coords; i++)
+	ft_coords[i] = coords[i] << 2;
+      FT_Set_Var_Blend_Coordinates (ft_face, num_coords, ft_coords);
+      free (ft_coords);
+    }
+  }
+#endif
+
+  ft_face->generic.data = blob;
+  ft_face->generic.finalizer = (FT_Generic_Finalizer) _release_blob;
+
+  _hb_ft_font_set_funcs (font, ft_face, true);
+  hb_ft_font_set_load_flags (font, FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ft.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ft.h
new file mode 100644
index 0000000..94013ee
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ft.h
@@ -0,0 +1,132 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2015  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_FT_H
+#define HB_FT_H
+
+#include "hb.h"
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+HB_BEGIN_DECLS
+
+/*
+ * Note: FreeType is not thread-safe.
+ * Hence, these functions are not either.
+ */
+
+/*
+ * hb-face from ft-face.
+ */
+
+/* This one creates a new hb-face for given ft-face.
+ * When the returned hb-face is destroyed, the destroy
+ * callback is called (if not NULL), with the ft-face passed
+ * to it.
+ *
+ * The client is responsible to make sure that ft-face is
+ * destroyed after hb-face is destroyed.
+ *
+ * Most often you don't want this function.  You should use either
+ * hb_ft_face_create_cached(), or hb_ft_face_create_referenced().
+ * In particular, if you are going to pass NULL as destroy, you
+ * probably should use (the more recent) hb_ft_face_create_referenced()
+ * instead.
+ */
+HB_EXTERN hb_face_t *
+hb_ft_face_create (FT_Face           ft_face,
+		   hb_destroy_func_t destroy);
+
+/* This version is like hb_ft_face_create(), except that it caches
+ * the hb-face using the generic pointer of the ft-face.  This means
+ * that subsequent calls to this function with the same ft-face will
+ * return the same hb-face (correctly referenced).
+ *
+ * Client is still responsible for making sure that ft-face is destroyed
+ * after hb-face is.
+ */
+HB_EXTERN hb_face_t *
+hb_ft_face_create_cached (FT_Face ft_face);
+
+/* This version is like hb_ft_face_create(), except that it calls
+ * FT_Reference_Face() on ft-face, as such keeping ft-face alive
+ * as long as the hb-face is.
+ *
+ * This is the most convenient version to use.  Use it unless you have
+ * very good reasons not to.
+ */
+HB_EXTERN hb_face_t *
+hb_ft_face_create_referenced (FT_Face ft_face);
+
+
+/*
+ * hb-font from ft-face.
+ */
+
+/*
+ * Note:
+ *
+ * Set face size on ft-face before creating hb-font from it.
+ * Otherwise hb-ft would NOT pick up the font size correctly.
+ */
+
+/* See notes on hb_ft_face_create().  Same issues re lifecycle-management
+ * apply here.  Use hb_ft_font_create_referenced() if you can. */
+HB_EXTERN hb_font_t *
+hb_ft_font_create (FT_Face           ft_face,
+		   hb_destroy_func_t destroy);
+
+/* See notes on hb_ft_face_create_referenced() re lifecycle-management
+ * issues. */
+HB_EXTERN hb_font_t *
+hb_ft_font_create_referenced (FT_Face ft_face);
+
+HB_EXTERN FT_Face
+hb_ft_font_get_face (hb_font_t *font);
+
+HB_EXTERN void
+hb_ft_font_set_load_flags (hb_font_t *font, int load_flags);
+
+HB_EXTERN int
+hb_ft_font_get_load_flags (hb_font_t *font);
+
+/* Call when size or variations settings on underlying FT_Face change. */
+HB_EXTERN void
+hb_ft_font_changed (hb_font_t *font);
+
+/* Makes an hb_font_t use FreeType internally to implement font functions.
+ * Note: this internally creates an FT_Face.  Use it when you create your
+ * hb_face_t using hb_face_create(). */
+HB_EXTERN void
+hb_ft_font_set_funcs (hb_font_t *font);
+
+
+HB_END_DECLS
+
+#endif /* HB_FT_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-glib.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-glib.cc
new file mode 100644
index 0000000..5763754
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-glib.cc
@@ -0,0 +1,406 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2011  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#include "hb-glib.h"
+
+#include "hb-machinery.hh"
+
+
+/**
+ * SECTION:hb-glib
+ * @title: hb-glib
+ * @short_description: GLib integration
+ * @include: hb-glib.h
+ *
+ * Functions for using HarfBuzz with the GLib library to provide Unicode data.
+ **/
+
+
+#if !GLIB_CHECK_VERSION(2,29,14)
+static const hb_script_t
+glib_script_to_script[] =
+{
+  HB_SCRIPT_COMMON,
+  HB_SCRIPT_INHERITED,
+  HB_SCRIPT_ARABIC,
+  HB_SCRIPT_ARMENIAN,
+  HB_SCRIPT_BENGALI,
+  HB_SCRIPT_BOPOMOFO,
+  HB_SCRIPT_CHEROKEE,
+  HB_SCRIPT_COPTIC,
+  HB_SCRIPT_CYRILLIC,
+  HB_SCRIPT_DESERET,
+  HB_SCRIPT_DEVANAGARI,
+  HB_SCRIPT_ETHIOPIC,
+  HB_SCRIPT_GEORGIAN,
+  HB_SCRIPT_GOTHIC,
+  HB_SCRIPT_GREEK,
+  HB_SCRIPT_GUJARATI,
+  HB_SCRIPT_GURMUKHI,
+  HB_SCRIPT_HAN,
+  HB_SCRIPT_HANGUL,
+  HB_SCRIPT_HEBREW,
+  HB_SCRIPT_HIRAGANA,
+  HB_SCRIPT_KANNADA,
+  HB_SCRIPT_KATAKANA,
+  HB_SCRIPT_KHMER,
+  HB_SCRIPT_LAO,
+  HB_SCRIPT_LATIN,
+  HB_SCRIPT_MALAYALAM,
+  HB_SCRIPT_MONGOLIAN,
+  HB_SCRIPT_MYANMAR,
+  HB_SCRIPT_OGHAM,
+  HB_SCRIPT_OLD_ITALIC,
+  HB_SCRIPT_ORIYA,
+  HB_SCRIPT_RUNIC,
+  HB_SCRIPT_SINHALA,
+  HB_SCRIPT_SYRIAC,
+  HB_SCRIPT_TAMIL,
+  HB_SCRIPT_TELUGU,
+  HB_SCRIPT_THAANA,
+  HB_SCRIPT_THAI,
+  HB_SCRIPT_TIBETAN,
+  HB_SCRIPT_CANADIAN_SYLLABICS,
+  HB_SCRIPT_YI,
+  HB_SCRIPT_TAGALOG,
+  HB_SCRIPT_HANUNOO,
+  HB_SCRIPT_BUHID,
+  HB_SCRIPT_TAGBANWA,
+
+  /* Unicode-4.0 additions */
+  HB_SCRIPT_BRAILLE,
+  HB_SCRIPT_CYPRIOT,
+  HB_SCRIPT_LIMBU,
+  HB_SCRIPT_OSMANYA,
+  HB_SCRIPT_SHAVIAN,
+  HB_SCRIPT_LINEAR_B,
+  HB_SCRIPT_TAI_LE,
+  HB_SCRIPT_UGARITIC,
+
+  /* Unicode-4.1 additions */
+  HB_SCRIPT_NEW_TAI_LUE,
+  HB_SCRIPT_BUGINESE,
+  HB_SCRIPT_GLAGOLITIC,
+  HB_SCRIPT_TIFINAGH,
+  HB_SCRIPT_SYLOTI_NAGRI,
+  HB_SCRIPT_OLD_PERSIAN,
+  HB_SCRIPT_KHAROSHTHI,
+
+  /* Unicode-5.0 additions */
+  HB_SCRIPT_UNKNOWN,
+  HB_SCRIPT_BALINESE,
+  HB_SCRIPT_CUNEIFORM,
+  HB_SCRIPT_PHOENICIAN,
+  HB_SCRIPT_PHAGS_PA,
+  HB_SCRIPT_NKO,
+
+  /* Unicode-5.1 additions */
+  HB_SCRIPT_KAYAH_LI,
+  HB_SCRIPT_LEPCHA,
+  HB_SCRIPT_REJANG,
+  HB_SCRIPT_SUNDANESE,
+  HB_SCRIPT_SAURASHTRA,
+  HB_SCRIPT_CHAM,
+  HB_SCRIPT_OL_CHIKI,
+  HB_SCRIPT_VAI,
+  HB_SCRIPT_CARIAN,
+  HB_SCRIPT_LYCIAN,
+  HB_SCRIPT_LYDIAN,
+
+  /* Unicode-5.2 additions */
+  HB_SCRIPT_AVESTAN,
+  HB_SCRIPT_BAMUM,
+  HB_SCRIPT_EGYPTIAN_HIEROGLYPHS,
+  HB_SCRIPT_IMPERIAL_ARAMAIC,
+  HB_SCRIPT_INSCRIPTIONAL_PAHLAVI,
+  HB_SCRIPT_INSCRIPTIONAL_PARTHIAN,
+  HB_SCRIPT_JAVANESE,
+  HB_SCRIPT_KAITHI,
+  HB_SCRIPT_TAI_THAM,
+  HB_SCRIPT_LISU,
+  HB_SCRIPT_MEETEI_MAYEK,
+  HB_SCRIPT_OLD_SOUTH_ARABIAN,
+  HB_SCRIPT_OLD_TURKIC,
+  HB_SCRIPT_SAMARITAN,
+  HB_SCRIPT_TAI_VIET,
+
+  /* Unicode-6.0 additions */
+  HB_SCRIPT_BATAK,
+  HB_SCRIPT_BRAHMI,
+  HB_SCRIPT_MANDAIC,
+
+  /* Unicode-6.1 additions */
+  HB_SCRIPT_CHAKMA,
+  HB_SCRIPT_MEROITIC_CURSIVE,
+  HB_SCRIPT_MEROITIC_HIEROGLYPHS,
+  HB_SCRIPT_MIAO,
+  HB_SCRIPT_SHARADA,
+  HB_SCRIPT_SORA_SOMPENG,
+  HB_SCRIPT_TAKRI
+};
+#endif
+
+hb_script_t
+hb_glib_script_to_script (GUnicodeScript script)
+{
+#if GLIB_CHECK_VERSION(2,29,14)
+  return (hb_script_t) g_unicode_script_to_iso15924 (script);
+#else
+  if (likely ((unsigned int) script < ARRAY_LENGTH (glib_script_to_script)))
+    return glib_script_to_script[script];
+
+  if (unlikely (script == G_UNICODE_SCRIPT_INVALID_CODE))
+    return HB_SCRIPT_INVALID;
+
+  return HB_SCRIPT_UNKNOWN;
+#endif
+}
+
+GUnicodeScript
+hb_glib_script_from_script (hb_script_t script)
+{
+#if GLIB_CHECK_VERSION(2,29,14)
+  return g_unicode_script_from_iso15924 (script);
+#else
+  unsigned int count = ARRAY_LENGTH (glib_script_to_script);
+  for (unsigned int i = 0; i < count; i++)
+    if (glib_script_to_script[i] == script)
+      return (GUnicodeScript) i;
+
+  if (unlikely (script == HB_SCRIPT_INVALID))
+    return G_UNICODE_SCRIPT_INVALID_CODE;
+
+  return G_UNICODE_SCRIPT_UNKNOWN;
+#endif
+}
+
+
+static hb_unicode_combining_class_t
+hb_glib_unicode_combining_class (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+				 hb_codepoint_t      unicode,
+				 void               *user_data HB_UNUSED)
+
+{
+  return (hb_unicode_combining_class_t) g_unichar_combining_class (unicode);
+}
+
+static hb_unicode_general_category_t
+hb_glib_unicode_general_category (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+				  hb_codepoint_t      unicode,
+				  void               *user_data HB_UNUSED)
+
+{
+  /* hb_unicode_general_category_t and GUnicodeType are identical */
+  return (hb_unicode_general_category_t) g_unichar_type (unicode);
+}
+
+static hb_codepoint_t
+hb_glib_unicode_mirroring (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+			   hb_codepoint_t      unicode,
+			   void               *user_data HB_UNUSED)
+{
+  g_unichar_get_mirror_char (unicode, &unicode);
+  return unicode;
+}
+
+static hb_script_t
+hb_glib_unicode_script (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+			hb_codepoint_t      unicode,
+			void               *user_data HB_UNUSED)
+{
+  return hb_glib_script_to_script (g_unichar_get_script (unicode));
+}
+
+static hb_bool_t
+hb_glib_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+			 hb_codepoint_t      a,
+			 hb_codepoint_t      b,
+			 hb_codepoint_t     *ab,
+			 void               *user_data HB_UNUSED)
+{
+#if GLIB_CHECK_VERSION(2,29,12)
+  return g_unichar_compose (a, b, ab);
+#endif
+
+  /* We don't ifdef-out the fallback code such that compiler always
+   * sees it and makes sure it's compilable. */
+
+  gchar utf8[12];
+  gchar *normalized;
+  int len;
+  hb_bool_t ret;
+
+  len = g_unichar_to_utf8 (a, utf8);
+  len += g_unichar_to_utf8 (b, utf8 + len);
+  normalized = g_utf8_normalize (utf8, len, G_NORMALIZE_NFC);
+  len = g_utf8_strlen (normalized, -1);
+  if (unlikely (!len))
+    return false;
+
+  if (len == 1) {
+    *ab = g_utf8_get_char (normalized);
+    ret = true;
+  } else {
+    ret = false;
+  }
+
+  g_free (normalized);
+  return ret;
+}
+
+static hb_bool_t
+hb_glib_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+			   hb_codepoint_t      ab,
+			   hb_codepoint_t     *a,
+			   hb_codepoint_t     *b,
+			   void               *user_data HB_UNUSED)
+{
+#if GLIB_CHECK_VERSION(2,29,12)
+  return g_unichar_decompose (ab, a, b);
+#endif
+
+  /* We don't ifdef-out the fallback code such that compiler always
+   * sees it and makes sure it's compilable. */
+
+  gchar utf8[6];
+  gchar *normalized;
+  int len;
+  hb_bool_t ret;
+
+  len = g_unichar_to_utf8 (ab, utf8);
+  normalized = g_utf8_normalize (utf8, len, G_NORMALIZE_NFD);
+  len = g_utf8_strlen (normalized, -1);
+  if (unlikely (!len))
+    return false;
+
+  if (len == 1) {
+    *a = g_utf8_get_char (normalized);
+    *b = 0;
+    ret = *a != ab;
+  } else if (len == 2) {
+    *a = g_utf8_get_char (normalized);
+    *b = g_utf8_get_char (g_utf8_next_char (normalized));
+    /* Here's the ugly part: if ab decomposes to a single character and
+     * that character decomposes again, we have to detect that and undo
+     * the second part :-(. */
+    gchar *recomposed = g_utf8_normalize (normalized, -1, G_NORMALIZE_NFC);
+    hb_codepoint_t c = g_utf8_get_char (recomposed);
+    if (c != ab && c != *a) {
+      *a = c;
+      *b = 0;
+    }
+    g_free (recomposed);
+    ret = true;
+  } else {
+    /* If decomposed to more than two characters, take the last one,
+     * and recompose the rest to get the first component. */
+    gchar *end = g_utf8_offset_to_pointer (normalized, len - 1);
+    gchar *recomposed;
+    *b = g_utf8_get_char (end);
+    recomposed = g_utf8_normalize (normalized, end - normalized, G_NORMALIZE_NFC);
+    /* We expect that recomposed has exactly one character now. */
+    *a = g_utf8_get_char (recomposed);
+    g_free (recomposed);
+    ret = true;
+  }
+
+  g_free (normalized);
+  return ret;
+}
+
+
+#if HB_USE_ATEXIT
+static void free_static_glib_funcs ();
+#endif
+
+static struct hb_glib_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t<hb_glib_unicode_funcs_lazy_loader_t>
+{
+  static hb_unicode_funcs_t *create ()
+  {
+    hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr);
+
+    hb_unicode_funcs_set_combining_class_func (funcs, hb_glib_unicode_combining_class, nullptr, nullptr);
+    hb_unicode_funcs_set_general_category_func (funcs, hb_glib_unicode_general_category, nullptr, nullptr);
+    hb_unicode_funcs_set_mirroring_func (funcs, hb_glib_unicode_mirroring, nullptr, nullptr);
+    hb_unicode_funcs_set_script_func (funcs, hb_glib_unicode_script, nullptr, nullptr);
+    hb_unicode_funcs_set_compose_func (funcs, hb_glib_unicode_compose, nullptr, nullptr);
+    hb_unicode_funcs_set_decompose_func (funcs, hb_glib_unicode_decompose, nullptr, nullptr);
+
+    hb_unicode_funcs_make_immutable (funcs);
+
+#if HB_USE_ATEXIT
+    atexit (free_static_glib_funcs);
+#endif
+
+    return funcs;
+  }
+} static_glib_funcs;
+
+#if HB_USE_ATEXIT
+static
+void free_static_glib_funcs ()
+{
+  static_glib_funcs.free_instance ();
+}
+#endif
+
+hb_unicode_funcs_t *
+hb_glib_get_unicode_funcs ()
+{
+  return static_glib_funcs.get_unconst ();
+}
+
+
+
+#if GLIB_CHECK_VERSION(2,31,10)
+
+static void
+_hb_g_bytes_unref (void *data)
+{
+  g_bytes_unref ((GBytes *) data);
+}
+
+/**
+ * hb_glib_blob_create:
+ *
+ * Since: 0.9.38
+ **/
+hb_blob_t *
+hb_glib_blob_create (GBytes *gbytes)
+{
+  gsize size = 0;
+  gconstpointer data = g_bytes_get_data (gbytes, &size);
+  return hb_blob_create ((const char *) data,
+			 size,
+			 HB_MEMORY_MODE_READONLY,
+			 g_bytes_ref (gbytes),
+			 _hb_g_bytes_unref);
+}
+#endif
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-glib.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-glib.h
new file mode 100644
index 0000000..5f04183
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-glib.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2011  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_GLIB_H
+#define HB_GLIB_H
+
+#include "hb.h"
+
+#include <glib.h>
+
+HB_BEGIN_DECLS
+
+
+HB_EXTERN hb_script_t
+hb_glib_script_to_script (GUnicodeScript script);
+
+HB_EXTERN GUnicodeScript
+hb_glib_script_from_script (hb_script_t script);
+
+
+HB_EXTERN hb_unicode_funcs_t *
+hb_glib_get_unicode_funcs (void);
+
+#if GLIB_CHECK_VERSION(2,31,10)
+HB_EXTERN hb_blob_t *
+hb_glib_blob_create (GBytes *gbytes);
+#endif
+
+HB_END_DECLS
+
+#endif /* HB_GLIB_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject-enums.cc.tmpl b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject-enums.cc.tmpl
new file mode 100644
index 0000000..e3a9a6b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject-enums.cc.tmpl
@@ -0,0 +1,73 @@
+/*** BEGIN file-header ***/
+/*
+ * Copyright © 2011  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
+ */
+
+#include "hb.hh"
+
+/* g++ didn't like older gtype.h gcc-only code path. */
+#include <glib.h>
+#if !GLIB_CHECK_VERSION(2,29,16)
+#undef __GNUC__
+#undef __GNUC_MINOR__
+#define __GNUC__ 2
+#define __GNUC_MINOR__ 6
+#endif
+
+#include "hb-gobject.h"
+
+/*** END file-header ***/
+
+/*** BEGIN file-production ***/
+/* enumerations from "@filename@" */
+/*** END file-production ***/
+
+/*** BEGIN value-header ***/
+GType
+@enum_name@_get_type ()
+{
+  static gsize type_id = 0;
+
+  if (g_once_init_enter (&type_id))
+    {
+      static const G@Type@Value values[] = {
+/*** END value-header ***/
+
+/*** BEGIN value-production ***/
+        { @VALUENAME@, "@VALUENAME@", "@valuenick@" },
+/*** END value-production ***/
+
+/*** BEGIN value-tail ***/
+        { 0, NULL, NULL }
+      };
+      GType id =
+        g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
+      g_once_init_leave (&type_id, id);
+    }
+
+  return type_id;
+}
+
+/*** END value-tail ***/
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject-enums.h.tmpl b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject-enums.h.tmpl
new file mode 100644
index 0000000..7ef9dfc0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject-enums.h.tmpl
@@ -0,0 +1,56 @@
+/*** BEGIN file-header ***/
+/*
+ * Copyright © 2013  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_GOBJECT_H_IN
+#error "Include <hb-gobject.h> instead."
+#endif
+
+#ifndef HB_GOBJECT_ENUMS_H
+#define HB_GOBJECT_ENUMS_H
+
+#include "hb.h"
+
+#include <glib-object.h>
+
+HB_BEGIN_DECLS
+
+
+/*** END file-header ***/
+
+/*** BEGIN value-header ***/
+HB_EXTERN GType
+@enum_name@_get_type () G_GNUC_CONST;
+#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ())
+
+/*** END value-header ***/
+
+/*** BEGIN file-tail ***/
+
+HB_END_DECLS
+
+#endif /* HB_GOBJECT_ENUMS_H */
+/*** END file-tail ***/
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject-structs.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject-structs.cc
new file mode 100644
index 0000000..3cff880
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject-structs.cc
@@ -0,0 +1,96 @@
+/*
+ * Copyright © 2011  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
+ */
+
+#include "hb.hh"
+
+
+/**
+ * SECTION:hb-gobject
+ * @title: hb-gobject
+ * @short_description: GObject integration
+ * @include: hb-gobject.h
+ *
+ * Functions for using HarfBuzz with the GObject library to provide
+ * type data.
+ **/
+
+
+/* g++ didn't like older gtype.h gcc-only code path. */
+#include <glib.h>
+#if !GLIB_CHECK_VERSION(2,29,16)
+#undef __GNUC__
+#undef __GNUC_MINOR__
+#define __GNUC__ 2
+#define __GNUC_MINOR__ 6
+#endif
+
+#include "hb-gobject.h"
+
+#define HB_DEFINE_BOXED_TYPE(name,copy_func,free_func) \
+GType \
+hb_gobject_##name##_get_type () \
+{ \
+   static gsize type_id = 0; \
+   if (g_once_init_enter (&type_id)) { \
+      GType id = g_boxed_type_register_static (g_intern_static_string ("hb_" #name "_t"), \
+					       (GBoxedCopyFunc) copy_func, \
+					       (GBoxedFreeFunc) free_func); \
+      g_once_init_leave (&type_id, id); \
+   } \
+   return type_id; \
+}
+
+#define HB_DEFINE_OBJECT_TYPE(name) \
+	HB_DEFINE_BOXED_TYPE (name, hb_##name##_reference, hb_##name##_destroy)
+
+#define HB_DEFINE_VALUE_TYPE(name) \
+	static hb_##name##_t *_hb_##name##_reference (const hb_##name##_t *l) \
+	{ \
+	  hb_##name##_t *c = (hb_##name##_t *) calloc (1, sizeof (hb_##name##_t)); \
+	  if (unlikely (!c)) return nullptr; \
+	  *c = *l; \
+	  return c; \
+	} \
+	static void _hb_##name##_destroy (hb_##name##_t *l) { free (l); } \
+	HB_DEFINE_BOXED_TYPE (name, _hb_##name##_reference, _hb_##name##_destroy)
+
+HB_DEFINE_OBJECT_TYPE (buffer)
+HB_DEFINE_OBJECT_TYPE (blob)
+HB_DEFINE_OBJECT_TYPE (face)
+HB_DEFINE_OBJECT_TYPE (font)
+HB_DEFINE_OBJECT_TYPE (font_funcs)
+HB_DEFINE_OBJECT_TYPE (set)
+HB_DEFINE_OBJECT_TYPE (map)
+HB_DEFINE_OBJECT_TYPE (shape_plan)
+HB_DEFINE_OBJECT_TYPE (unicode_funcs)
+HB_DEFINE_VALUE_TYPE (feature)
+HB_DEFINE_VALUE_TYPE (glyph_info)
+HB_DEFINE_VALUE_TYPE (glyph_position)
+HB_DEFINE_VALUE_TYPE (segment_properties)
+HB_DEFINE_VALUE_TYPE (user_data_key)
+
+HB_DEFINE_VALUE_TYPE (ot_math_glyph_variant)
+HB_DEFINE_VALUE_TYPE (ot_math_glyph_part)
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject-structs.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject-structs.h
new file mode 100644
index 0000000..800beed
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject-structs.h
@@ -0,0 +1,142 @@
+/*
+ * Copyright © 2011  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_GOBJECT_H_IN
+#error "Include <hb-gobject.h> instead."
+#endif
+
+#ifndef HB_GOBJECT_STRUCTS_H
+#define HB_GOBJECT_STRUCTS_H
+
+#include "hb.h"
+
+#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_map_get_type (void);
+#define HB_GOBJECT_TYPE_MAP (hb_gobject_map_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);
+#define HB_GOBJECT_TYPE_FEATURE (hb_gobject_feature_get_type ())
+
+HB_EXTERN GType
+hb_gobject_glyph_info_get_type (void);
+#define HB_GOBJECT_TYPE_GLYPH_INFO (hb_gobject_glyph_info_get_type ())
+
+HB_EXTERN GType
+hb_gobject_glyph_position_get_type (void);
+#define HB_GOBJECT_TYPE_GLYPH_POSITION (hb_gobject_glyph_position_get_type ())
+
+HB_EXTERN GType
+hb_gobject_segment_properties_get_type (void);
+#define HB_GOBJECT_TYPE_SEGMENT_PROPERTIES (hb_gobject_segment_properties_get_type ())
+
+HB_EXTERN GType
+hb_gobject_user_data_key_get_type (void);
+#define HB_GOBJECT_TYPE_USER_DATA_KEY (hb_gobject_user_data_key_get_type ())
+
+HB_EXTERN GType
+hb_gobject_ot_math_glyph_variant_get_type (void);
+#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT (hb_gobject_ot_math_glyph_variant_get_type ())
+
+HB_EXTERN GType
+hb_gobject_ot_math_glyph_part_get_type (void);
+#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART (hb_gobject_ot_math_glyph_part_get_type ())
+
+
+HB_END_DECLS
+
+#endif /* HB_GOBJECT_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject.h
new file mode 100644
index 0000000..ea1bd25
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-gobject.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2011  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_GOBJECT_H
+#define HB_GOBJECT_H
+#define HB_GOBJECT_H_IN
+
+#include "hb.h"
+
+#include "hb-gobject-enums.h"
+#include "hb-gobject-structs.h"
+
+HB_BEGIN_DECLS
+HB_END_DECLS
+
+#undef HB_GOBJECT_H_IN
+#endif /* HB_GOBJECT_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-graphite2.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-graphite2.cc
new file mode 100644
index 0000000..a1c602c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-graphite2.cc
@@ -0,0 +1,444 @@
+/*
+ * Copyright © 2011  Martin Hosken
+ * Copyright © 2011  SIL International
+ * Copyright © 2011,2012  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
+ */
+
+#include "hb-shaper-impl.hh"
+
+#include "hb-graphite2.h"
+
+#include <graphite2/Segment.h>
+
+#include "hb-ot-layout.h"
+
+
+/**
+ * SECTION:hb-graphite2
+ * @title: hb-graphite2
+ * @short_description: Graphite2 integration
+ * @include: hb-graphite2.h
+ *
+ * Functions for using HarfBuzz with the Graphite2 fonts.
+ **/
+
+
+/*
+ * shaper face data
+ */
+
+typedef struct hb_graphite2_tablelist_t
+{
+  struct hb_graphite2_tablelist_t *next;
+  hb_blob_t *blob;
+  unsigned int tag;
+} hb_graphite2_tablelist_t;
+
+struct hb_graphite2_face_data_t
+{
+  hb_face_t *face;
+  gr_face   *grface;
+  hb_atomic_ptr_t<hb_graphite2_tablelist_t> tlist;
+};
+
+static const void *hb_graphite2_get_table (const void *data, unsigned int tag, size_t *len)
+{
+  hb_graphite2_face_data_t *face_data = (hb_graphite2_face_data_t *) data;
+  hb_graphite2_tablelist_t *tlist = face_data->tlist;
+
+  hb_blob_t *blob = nullptr;
+
+  for (hb_graphite2_tablelist_t *p = tlist; p; p = p->next)
+    if (p->tag == tag) {
+      blob = p->blob;
+      break;
+    }
+
+  if (unlikely (!blob))
+  {
+    blob = face_data->face->reference_table (tag);
+
+    hb_graphite2_tablelist_t *p = (hb_graphite2_tablelist_t *) calloc (1, sizeof (hb_graphite2_tablelist_t));
+    if (unlikely (!p)) {
+      hb_blob_destroy (blob);
+      return nullptr;
+    }
+    p->blob = blob;
+    p->tag = tag;
+
+retry:
+    hb_graphite2_tablelist_t *tlist = face_data->tlist;
+    p->next = tlist;
+
+    if (unlikely (!face_data->tlist.cmpexch (tlist, p)))
+      goto retry;
+  }
+
+  unsigned int tlen;
+  const char *d = hb_blob_get_data (blob, &tlen);
+  *len = tlen;
+  return d;
+}
+
+static void hb_graphite2_release_table(const void *data, const void *table_buffer)
+{
+  hb_graphite2_face_data_t *face_data = (hb_graphite2_face_data_t *) data;
+  hb_graphite2_tablelist_t *tlist = face_data->tlist;
+
+  hb_graphite2_tablelist_t *prev = nullptr;
+  hb_graphite2_tablelist_t *curr = tlist;
+  while (curr)
+  {
+    if (hb_blob_get_data(curr->blob, nullptr) == table_buffer)
+    {
+      if (prev == nullptr)
+        face_data->tlist.cmpexch(tlist, curr->next);
+      else
+        prev->next = curr->next;
+      hb_blob_destroy(curr->blob);
+      free(curr);
+      break;
+    }
+    prev = curr;
+    curr = curr->next;
+  }
+}
+
+static gr_face_ops hb_graphite2_face_ops = { sizeof(gr_face_ops), hb_graphite2_get_table, hb_graphite2_release_table };
+
+hb_graphite2_face_data_t *
+_hb_graphite2_shaper_face_data_create (hb_face_t *face)
+{
+  hb_blob_t *silf_blob = face->reference_table (HB_GRAPHITE2_TAG_SILF);
+  /* Umm, we just reference the table to check whether it exists.
+   * Maybe add better API for this? */
+  if (!hb_blob_get_length (silf_blob))
+  {
+    hb_blob_destroy (silf_blob);
+    return nullptr;
+  }
+  hb_blob_destroy (silf_blob);
+
+  hb_graphite2_face_data_t *data = (hb_graphite2_face_data_t *) calloc (1, sizeof (hb_graphite2_face_data_t));
+  if (unlikely (!data))
+    return nullptr;
+
+  data->face = face;
+  data->grface = gr_make_face_with_ops (data, &hb_graphite2_face_ops, gr_face_preloadAll);
+
+  if (unlikely (!data->grface)) {
+    free (data);
+    return nullptr;
+  }
+
+  return data;
+}
+
+void
+_hb_graphite2_shaper_face_data_destroy (hb_graphite2_face_data_t *data)
+{
+  hb_graphite2_tablelist_t *tlist = data->tlist;
+
+  while (tlist)
+  {
+    hb_graphite2_tablelist_t *old = tlist;
+    hb_blob_destroy (tlist->blob);
+    tlist = tlist->next;
+    free (old);
+  }
+
+  gr_face_destroy (data->grface);
+
+  free (data);
+}
+
+/*
+ * Since: 0.9.10
+ */
+gr_face *
+hb_graphite2_face_get_gr_face (hb_face_t *face)
+{
+  const hb_graphite2_face_data_t *data = face->data.graphite2;
+  return data ? data->grface : nullptr;
+}
+
+
+/*
+ * shaper font data
+ */
+
+struct hb_graphite2_font_data_t {};
+
+hb_graphite2_font_data_t *
+_hb_graphite2_shaper_font_data_create (hb_font_t *font HB_UNUSED)
+{
+  return (hb_graphite2_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
+}
+
+void
+_hb_graphite2_shaper_font_data_destroy (hb_graphite2_font_data_t *data HB_UNUSED)
+{
+}
+
+/**
+ * hb_graphite2_font_get_gr_font:
+ *
+ * Since: 0.9.10
+ * Deprecated: 1.4.2
+ */
+gr_font *
+hb_graphite2_font_get_gr_font (hb_font_t *font HB_UNUSED)
+{
+  return nullptr;
+}
+
+
+/*
+ * shaper
+ */
+
+struct hb_graphite2_cluster_t {
+  unsigned int base_char;
+  unsigned int num_chars;
+  unsigned int base_glyph;
+  unsigned int num_glyphs;
+  unsigned int cluster;
+  float advance;
+};
+
+hb_bool_t
+_hb_graphite2_shape (hb_shape_plan_t    *shape_plan HB_UNUSED,
+		     hb_font_t          *font,
+		     hb_buffer_t        *buffer,
+		     const hb_feature_t *features,
+		     unsigned int        num_features)
+{
+  hb_face_t *face = font->face;
+  gr_face *grface = face->data.graphite2->grface;
+
+  const char *lang = hb_language_to_string (hb_buffer_get_language (buffer));
+  const char *lang_end = lang ? strchr (lang, '-') : nullptr;
+  int lang_len = lang_end ? lang_end - lang : -1;
+  gr_feature_val *feats = gr_face_featureval_for_lang (grface, lang ? hb_tag_from_string (lang, lang_len) : 0);
+
+  for (unsigned int i = 0; i < num_features; i++)
+  {
+    const gr_feature_ref *fref = gr_face_find_fref (grface, features[i].tag);
+    if (fref)
+      gr_fref_set_feature_value (fref, features[i].value, feats);
+  }
+
+  gr_segment *seg = nullptr;
+  const gr_slot *is;
+  unsigned int ci = 0, ic = 0;
+  float curradvx = 0., curradvy = 0.;
+
+  unsigned int scratch_size;
+  hb_buffer_t::scratch_buffer_t *scratch = buffer->get_scratch_buffer (&scratch_size);
+
+  uint32_t *chars = (uint32_t *) scratch;
+
+  for (unsigned int i = 0; i < buffer->len; ++i)
+    chars[i] = buffer->info[i].codepoint;
+
+  /* TODO ensure_native_direction. */
+
+  hb_tag_t script_tag[HB_OT_MAX_TAGS_PER_SCRIPT];
+  unsigned int count = HB_OT_MAX_TAGS_PER_SCRIPT;
+  hb_ot_tags_from_script_and_language (hb_buffer_get_script (buffer),
+				       HB_LANGUAGE_INVALID,
+				       &count,
+				       script_tag,
+				       nullptr, nullptr);
+
+  seg = gr_make_seg (nullptr, grface,
+		     count ? script_tag[count - 1] : HB_OT_TAG_DEFAULT_SCRIPT,
+		     feats,
+		     gr_utf32, chars, buffer->len,
+		     2 | (hb_buffer_get_direction (buffer) == HB_DIRECTION_RTL ? 1 : 0));
+
+  if (unlikely (!seg)) {
+    if (feats) gr_featureval_destroy (feats);
+    return false;
+  }
+
+  unsigned int glyph_count = gr_seg_n_slots (seg);
+  if (unlikely (!glyph_count)) {
+    if (feats) gr_featureval_destroy (feats);
+    gr_seg_destroy (seg);
+    buffer->len = 0;
+    return true;
+  }
+
+  buffer->ensure (glyph_count);
+  scratch = buffer->get_scratch_buffer (&scratch_size);
+  while ((DIV_CEIL (sizeof (hb_graphite2_cluster_t) * buffer->len, sizeof (*scratch)) +
+	  DIV_CEIL (sizeof (hb_codepoint_t) * glyph_count, sizeof (*scratch))) > scratch_size)
+  {
+    if (unlikely (!buffer->ensure (buffer->allocated * 2)))
+    {
+      if (feats) gr_featureval_destroy (feats);
+      gr_seg_destroy (seg);
+      return false;
+    }
+    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); \
+    scratch += _consumed; \
+    scratch_size -= _consumed; \
+  }
+
+  ALLOCATE_ARRAY (hb_graphite2_cluster_t, clusters, buffer->len);
+  ALLOCATE_ARRAY (hb_codepoint_t, gids, glyph_count);
+
+#undef ALLOCATE_ARRAY
+
+  memset (clusters, 0, sizeof (clusters[0]) * buffer->len);
+
+  hb_codepoint_t *pg = gids;
+  clusters[0].cluster = buffer->info[0].cluster;
+  float curradv = 0.;
+  if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
+  {
+    curradv = gr_slot_origin_X(gr_seg_first_slot(seg));
+    clusters[0].advance = gr_seg_advance_X(seg) - curradv;
+  }
+  else
+    clusters[0].advance = 0;
+  for (is = gr_seg_first_slot (seg), ic = 0; is; is = gr_slot_next_in_segment (is), ic++)
+  {
+    unsigned int before = gr_slot_before (is);
+    unsigned int after = gr_slot_after (is);
+    *pg = gr_slot_gid (is);
+    pg++;
+    while (clusters[ci].base_char > before && ci)
+    {
+      clusters[ci-1].num_chars += clusters[ci].num_chars;
+      clusters[ci-1].num_glyphs += clusters[ci].num_glyphs;
+      clusters[ci-1].advance += clusters[ci].advance;
+      ci--;
+    }
+
+    if (gr_slot_can_insert_before (is) && clusters[ci].num_chars && before >= clusters[ci].base_char + clusters[ci].num_chars)
+    {
+      hb_graphite2_cluster_t *c = clusters + ci + 1;
+      c->base_char = clusters[ci].base_char + clusters[ci].num_chars;
+      c->cluster = buffer->info[c->base_char].cluster;
+      c->num_chars = before - c->base_char;
+      c->base_glyph = ic;
+      c->num_glyphs = 0;
+      if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
+        c->advance = curradv - gr_slot_origin_X(is);
+      else
+      {
+        c->advance = 0;
+        clusters[ci].advance += gr_slot_origin_X(is) - curradv;
+      }
+      ci++;
+      curradv = gr_slot_origin_X(is);
+    }
+    clusters[ci].num_glyphs++;
+
+    if (clusters[ci].base_char + clusters[ci].num_chars < after + 1)
+	clusters[ci].num_chars = after + 1 - clusters[ci].base_char;
+  }
+
+  if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
+    clusters[ci].advance += curradv;
+  else
+    clusters[ci].advance += gr_seg_advance_X(seg) - curradv;
+  ci++;
+
+  for (unsigned int i = 0; i < ci; ++i)
+  {
+    for (unsigned int j = 0; j < clusters[i].num_glyphs; ++j)
+    {
+      hb_glyph_info_t *info = &buffer->info[clusters[i].base_glyph + j];
+      info->codepoint = gids[clusters[i].base_glyph + j];
+      info->cluster = clusters[i].cluster;
+      info->var1.i32 = clusters[i].advance;     // all glyphs in the cluster get the same advance
+    }
+  }
+  buffer->len = glyph_count;
+
+  unsigned int upem = hb_face_get_upem (face);
+  float xscale = (float) font->x_scale / upem;
+  float yscale = (float) font->y_scale / upem;
+  yscale *= yscale / xscale;
+  /* Positioning. */
+  unsigned int currclus = (unsigned int) -1;
+  const hb_glyph_info_t *info = buffer->info;
+  hb_glyph_position_t *pPos = hb_buffer_get_glyph_positions (buffer, nullptr);
+  if (!HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
+  {
+    curradvx = 0;
+    for (is = gr_seg_first_slot (seg); is; pPos++, ++info, is = gr_slot_next_in_segment (is))
+    {
+      pPos->x_offset = gr_slot_origin_X (is) * xscale - curradvx;
+      pPos->y_offset = gr_slot_origin_Y (is) * yscale - curradvy;
+      if (info->cluster != currclus) {
+	pPos->x_advance = info->var1.i32 * xscale;
+	curradvx += pPos->x_advance;
+	currclus = info->cluster;
+      } else
+	pPos->x_advance = 0.;
+
+      pPos->y_advance = gr_slot_advance_Y (is, grface, nullptr) * yscale;
+      curradvy += pPos->y_advance;
+    }
+  }
+  else
+  {
+    curradvx = gr_seg_advance_X(seg) * xscale;
+    for (is = gr_seg_first_slot (seg); is; pPos++, info++, is = gr_slot_next_in_segment (is))
+    {
+      if (info->cluster != currclus)
+      {
+	pPos->x_advance = info->var1.i32 * xscale;
+	curradvx -= pPos->x_advance;
+	currclus = info->cluster;
+      } else
+	pPos->x_advance = 0.;
+
+      pPos->y_advance = gr_slot_advance_Y (is, grface, nullptr) * yscale;
+      curradvy -= pPos->y_advance;
+      pPos->x_offset = (gr_slot_origin_X (is) - info->var1.i32) * xscale - curradvx + pPos->x_advance;
+      pPos->y_offset = gr_slot_origin_Y (is) * yscale - curradvy;
+    }
+    hb_buffer_reverse_clusters (buffer);
+  }
+
+  if (feats) gr_featureval_destroy (feats);
+  gr_seg_destroy (seg);
+
+  buffer->unsafe_to_break_all ();
+
+  return true;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-graphite2.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-graphite2.h
new file mode 100644
index 0000000..1720191
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-graphite2.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright © 2011  Martin Hosken
+ * Copyright © 2011  SIL International
+ *
+ *  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.
+ */
+
+#ifndef HB_GRAPHITE2_H
+#define HB_GRAPHITE2_H
+
+#include "hb.h"
+
+#include <graphite2/Font.h>
+
+HB_BEGIN_DECLS
+
+
+#define HB_GRAPHITE2_TAG_SILF HB_TAG('S','i','l','f')
+
+
+HB_EXTERN gr_face *
+hb_graphite2_face_get_gr_face (hb_face_t *face);
+
+#ifndef HB_DISABLE_DEPRECATED
+
+HB_EXTERN HB_DEPRECATED_FOR (hb_graphite2_face_get_gr_face) gr_font *
+hb_graphite2_font_get_gr_font (hb_font_t *font);
+
+#endif
+
+
+HB_END_DECLS
+
+#endif /* HB_GRAPHITE2_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-icu.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-icu.cc
new file mode 100644
index 0000000..c26c91d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-icu.cc
@@ -0,0 +1,350 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2009  Keith Stribley
+ * Copyright © 2011  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#include "hb-icu.h"
+
+#include "hb-machinery.hh"
+
+#include <unicode/uchar.h>
+#include <unicode/unorm2.h>
+#include <unicode/ustring.h>
+#include <unicode/utf16.h>
+#include <unicode/uversion.h>
+
+
+/**
+ * SECTION:hb-icu
+ * @title: hb-icu
+ * @short_description: ICU integration
+ * @include: hb-icu.h
+ *
+ * Functions for using HarfBuzz with the ICU library to provide Unicode data.
+ **/
+
+
+hb_script_t
+hb_icu_script_to_script (UScriptCode script)
+{
+  if (unlikely (script == USCRIPT_INVALID_CODE))
+    return HB_SCRIPT_INVALID;
+
+  return hb_script_from_string (uscript_getShortName (script), -1);
+}
+
+UScriptCode
+hb_icu_script_from_script (hb_script_t script)
+{
+  if (unlikely (script == HB_SCRIPT_INVALID))
+    return USCRIPT_INVALID_CODE;
+
+  unsigned int numScriptCode = 1 + u_getIntPropertyMaxValue (UCHAR_SCRIPT);
+  for (unsigned int i = 0; i < numScriptCode; i++)
+    if (unlikely (hb_icu_script_to_script ((UScriptCode) i) == script))
+      return (UScriptCode) i;
+
+  return USCRIPT_UNKNOWN;
+}
+
+
+static hb_unicode_combining_class_t
+hb_icu_unicode_combining_class (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+				hb_codepoint_t      unicode,
+				void               *user_data HB_UNUSED)
+
+{
+  return (hb_unicode_combining_class_t) u_getCombiningClass (unicode);
+}
+
+static hb_unicode_general_category_t
+hb_icu_unicode_general_category (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+				 hb_codepoint_t      unicode,
+				 void               *user_data HB_UNUSED)
+{
+  switch (u_getIntPropertyValue(unicode, UCHAR_GENERAL_CATEGORY))
+  {
+  case U_UNASSIGNED:			return HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED;
+
+  case U_UPPERCASE_LETTER:		return HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER;
+  case U_LOWERCASE_LETTER:		return HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER;
+  case U_TITLECASE_LETTER:		return HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER;
+  case U_MODIFIER_LETTER:		return HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER;
+  case U_OTHER_LETTER:			return HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER;
+
+  case U_NON_SPACING_MARK:		return HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK;
+  case U_ENCLOSING_MARK:		return HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK;
+  case U_COMBINING_SPACING_MARK:	return HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK;
+
+  case U_DECIMAL_DIGIT_NUMBER:		return HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER;
+  case U_LETTER_NUMBER:			return HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER;
+  case U_OTHER_NUMBER:			return HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER;
+
+  case U_SPACE_SEPARATOR:		return HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR;
+  case U_LINE_SEPARATOR:		return HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR;
+  case U_PARAGRAPH_SEPARATOR:		return HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR;
+
+  case U_CONTROL_CHAR:			return HB_UNICODE_GENERAL_CATEGORY_CONTROL;
+  case U_FORMAT_CHAR:			return HB_UNICODE_GENERAL_CATEGORY_FORMAT;
+  case U_PRIVATE_USE_CHAR:		return HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE;
+  case U_SURROGATE:			return HB_UNICODE_GENERAL_CATEGORY_SURROGATE;
+
+
+  case U_DASH_PUNCTUATION:		return HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION;
+  case U_START_PUNCTUATION:		return HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION;
+  case U_END_PUNCTUATION:		return HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION;
+  case U_CONNECTOR_PUNCTUATION:		return HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION;
+  case U_OTHER_PUNCTUATION:		return HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION;
+
+  case U_MATH_SYMBOL:			return HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL;
+  case U_CURRENCY_SYMBOL:		return HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL;
+  case U_MODIFIER_SYMBOL:		return HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL;
+  case U_OTHER_SYMBOL:			return HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL;
+
+  case U_INITIAL_PUNCTUATION:		return HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION;
+  case U_FINAL_PUNCTUATION:		return HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION;
+  }
+
+  return HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED;
+}
+
+static hb_codepoint_t
+hb_icu_unicode_mirroring (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+			  hb_codepoint_t      unicode,
+			  void               *user_data HB_UNUSED)
+{
+  return u_charMirror(unicode);
+}
+
+static hb_script_t
+hb_icu_unicode_script (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+		       hb_codepoint_t      unicode,
+		       void               *user_data HB_UNUSED)
+{
+  UErrorCode status = U_ZERO_ERROR;
+  UScriptCode scriptCode = uscript_getScript(unicode, &status);
+
+  if (unlikely (U_FAILURE (status)))
+    return HB_SCRIPT_UNKNOWN;
+
+  return hb_icu_script_to_script (scriptCode);
+}
+
+static hb_bool_t
+hb_icu_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+			hb_codepoint_t      a,
+			hb_codepoint_t      b,
+			hb_codepoint_t     *ab,
+			void               *user_data HB_UNUSED)
+{
+#if U_ICU_VERSION_MAJOR_NUM >= 49
+  {
+    const UNormalizer2 *normalizer = (const UNormalizer2 *) user_data;
+    UChar32 ret = unorm2_composePair (normalizer, a, b);
+    if (ret < 0) return false;
+    *ab = ret;
+    return true;
+  }
+#endif
+
+  /* We don't ifdef-out the fallback code such that compiler always
+   * sees it and makes sure it's compilable. */
+
+  UChar utf16[4], normalized[5];
+  unsigned int len;
+  hb_bool_t ret, err;
+  UErrorCode icu_err;
+
+  len = 0;
+  err = false;
+  U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), a, err);
+  if (err) return false;
+  U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), b, err);
+  if (err) return false;
+
+  icu_err = U_ZERO_ERROR;
+  len = unorm2_normalize (unorm2_getNFCInstance (&icu_err), utf16, len, normalized, ARRAY_LENGTH (normalized), &icu_err);
+  if (U_FAILURE (icu_err))
+    return false;
+  if (u_countChar32 (normalized, len) == 1) {
+    U16_GET_UNSAFE (normalized, 0, *ab);
+    ret = true;
+  } else {
+    ret = false;
+  }
+
+  return ret;
+}
+
+static hb_bool_t
+hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+			  hb_codepoint_t      ab,
+			  hb_codepoint_t     *a,
+			  hb_codepoint_t     *b,
+			  void               *user_data HB_UNUSED)
+{
+#if U_ICU_VERSION_MAJOR_NUM >= 49
+  {
+    const UNormalizer2 *normalizer = (const UNormalizer2 *) user_data;
+    UChar decomposed[4];
+    int len;
+    UErrorCode icu_err = U_ZERO_ERROR;
+    len = unorm2_getRawDecomposition (normalizer, ab, decomposed,
+				      ARRAY_LENGTH (decomposed), &icu_err);
+    if (U_FAILURE (icu_err) || len < 0) return false;
+
+    len = u_countChar32 (decomposed, len);
+    if (len == 1) {
+      U16_GET_UNSAFE (decomposed, 0, *a);
+      *b = 0;
+      return *a != ab;
+    } else if (len == 2) {
+      len =0;
+      U16_NEXT_UNSAFE (decomposed, len, *a);
+      U16_NEXT_UNSAFE (decomposed, len, *b);
+    }
+    return true;
+  }
+#endif
+
+  /* We don't ifdef-out the fallback code such that compiler always
+   * sees it and makes sure it's compilable. */
+
+  UChar utf16[2], normalized[2 * HB_UNICODE_MAX_DECOMPOSITION_LEN + 1];
+  unsigned int len;
+  hb_bool_t ret, err;
+  UErrorCode icu_err;
+
+  /* This function is a monster! Maybe it wasn't a good idea adding a
+   * pairwise decompose API... */
+  /* Watchout for the dragons.  Err, watchout for macros changing len. */
+
+  len = 0;
+  err = false;
+  U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), ab, err);
+  if (err) return false;
+
+  icu_err = U_ZERO_ERROR;
+  len = unorm2_normalize (unorm2_getNFDInstance (&icu_err), utf16, len, normalized, ARRAY_LENGTH (normalized), &icu_err);
+  if (U_FAILURE (icu_err))
+    return false;
+
+  len = u_countChar32 (normalized, len);
+
+  if (len == 1) {
+    U16_GET_UNSAFE (normalized, 0, *a);
+    *b = 0;
+    ret = *a != ab;
+  } else if (len == 2) {
+    len =0;
+    U16_NEXT_UNSAFE (normalized, len, *a);
+    U16_NEXT_UNSAFE (normalized, len, *b);
+
+    /* Here's the ugly part: if ab decomposes to a single character and
+     * that character decomposes again, we have to detect that and undo
+     * the second part :-(. */
+    UChar recomposed[20];
+    icu_err = U_ZERO_ERROR;
+    unorm2_normalize (unorm2_getNFCInstance (&icu_err), normalized, len, recomposed, ARRAY_LENGTH (recomposed), &icu_err);
+    if (U_FAILURE (icu_err))
+      return false;
+    hb_codepoint_t c;
+    U16_GET_UNSAFE (recomposed, 0, c);
+    if (c != *a && c != ab) {
+      *a = c;
+      *b = 0;
+    }
+    ret = true;
+  } else {
+    /* If decomposed to more than two characters, take the last one,
+     * and recompose the rest to get the first component. */
+    U16_PREV_UNSAFE (normalized, len, *b); /* Changes len in-place. */
+    UChar recomposed[18 * 2];
+    icu_err = U_ZERO_ERROR;
+    len = unorm2_normalize (unorm2_getNFCInstance (&icu_err), normalized, len, recomposed, ARRAY_LENGTH (recomposed), &icu_err);
+    if (U_FAILURE (icu_err))
+      return false;
+    /* We expect that recomposed has exactly one character now. */
+    if (unlikely (u_countChar32 (recomposed, len) != 1))
+      return false;
+    U16_GET_UNSAFE (recomposed, 0, *a);
+    ret = true;
+  }
+
+  return ret;
+}
+
+
+#if HB_USE_ATEXIT
+static void free_static_icu_funcs ();
+#endif
+
+static struct hb_icu_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t<hb_icu_unicode_funcs_lazy_loader_t>
+{
+  static hb_unicode_funcs_t *create ()
+  {
+    void *user_data = nullptr;
+#if U_ICU_VERSION_MAJOR_NUM >= 49
+    UErrorCode icu_err = U_ZERO_ERROR;
+    user_data = (void *) unorm2_getNFCInstance (&icu_err);
+    assert (user_data);
+#endif
+
+    hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr);
+
+    hb_unicode_funcs_set_combining_class_func (funcs, hb_icu_unicode_combining_class, nullptr, nullptr);
+    hb_unicode_funcs_set_general_category_func (funcs, hb_icu_unicode_general_category, nullptr, nullptr);
+    hb_unicode_funcs_set_mirroring_func (funcs, hb_icu_unicode_mirroring, nullptr, nullptr);
+    hb_unicode_funcs_set_script_func (funcs, hb_icu_unicode_script, nullptr, nullptr);
+    hb_unicode_funcs_set_compose_func (funcs, hb_icu_unicode_compose, user_data, nullptr);
+    hb_unicode_funcs_set_decompose_func (funcs, hb_icu_unicode_decompose, user_data, nullptr);
+
+    hb_unicode_funcs_make_immutable (funcs);
+
+#if HB_USE_ATEXIT
+    atexit (free_static_icu_funcs);
+#endif
+
+    return funcs;
+  }
+} static_icu_funcs;
+
+#if HB_USE_ATEXIT
+static
+void free_static_icu_funcs ()
+{
+  static_icu_funcs.free_instance ();
+}
+#endif
+
+hb_unicode_funcs_t *
+hb_icu_get_unicode_funcs ()
+{
+  return static_icu_funcs.get_unconst ();
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-icu.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-icu.h
new file mode 100644
index 0000000..2db6a7b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-icu.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2011  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_ICU_H
+#define HB_ICU_H
+
+#include "hb.h"
+
+#include <unicode/uscript.h>
+
+HB_BEGIN_DECLS
+
+
+HB_EXTERN hb_script_t
+hb_icu_script_to_script (UScriptCode script);
+
+HB_EXTERN UScriptCode
+hb_icu_script_from_script (hb_script_t script);
+
+
+HB_EXTERN hb_unicode_funcs_t *
+hb_icu_get_unicode_funcs (void);
+
+
+HB_END_DECLS
+
+#endif /* HB_ICU_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-iter.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-iter.hh
new file mode 100644
index 0000000..c4ab26dc
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-iter.hh
@@ -0,0 +1,153 @@
+/*
+ * Copyright © 2018  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_ITER_HH
+#define HB_ITER_HH
+
+#include "hb.hh"
+#include "hb-null.hh"
+
+
+/* Unified iterator object.
+ *
+ * The goal of this template is to make the same iterator interface
+ * available to all types, and make it very easy and compact to use.
+ * hb_iter_tator objects are small, light-weight, objects that can be
+ * copied by value.  If the collection / object being iterated on
+ * is writable, then the iterator returns lvalues, otherwise it
+ * returns rvalues.
+ */
+
+/* Base class for all iterators. */
+template <typename Iter, typename Item = typename Iter::__item_type__>
+struct hb_iter_t
+{
+  typedef Iter iter_t;
+  typedef iter_t const_iter_t;
+  typedef Item item_t;
+  static constexpr unsigned item_size = hb_static_size (Item);
+
+  private:
+  /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
+  const iter_t* thiz () const { return static_cast<const iter_t *> (this); }
+        iter_t* thiz ()       { return static_cast<      iter_t *> (this); }
+  public:
+
+  /* Operators. */
+  operator iter_t () { return iter(); }
+  explicit_operator bool () const { return more (); }
+  item_t& operator * () const { return item (); }
+  item_t& operator [] (signed i) const { return item_at ((unsigned) i); }
+  iter_t& operator += (unsigned count) { forward (count); return *thiz(); }
+  iter_t& operator ++ () { next (); return *thiz(); }
+  iter_t& operator -= (unsigned count) { rewind (count); return *thiz(); }
+  iter_t& operator -- () { prev (); return *thiz(); }
+  iter_t operator + (unsigned count) { iter_t c (*thiz()); c += count; return c; }
+  iter_t operator ++ (int) { iter_t c (*thiz()); ++*thiz(); return c; }
+  iter_t operator - (unsigned count) { iter_t c (*thiz()); c -= count; return c; }
+  iter_t operator -- (int) { iter_t c (*thiz()); --*thiz(); return c; }
+
+  /* Methods. */
+  iter_t iter () const { return *thiz(); }
+  const_iter_t const_iter () const { return iter (); }
+  item_t& item () const { return thiz()->__item__ (); }
+  item_t& item_at (unsigned i) const { return thiz()->__item_at__ (i); }
+  bool more () const { return thiz()->__more__ (); }
+  unsigned len () const { return thiz()->__len__ (); }
+  void next () { thiz()->__next__ (); }
+  void forward (unsigned n) { thiz()->__forward__ (n); }
+  void prev () { thiz()->__prev__ (); }
+  void rewind (unsigned n) { thiz()->__rewind__ (n); }
+  bool random_access () const { return thiz()->__random_access__ (); }
+
+  protected:
+  hb_iter_t () {}
+  hb_iter_t (const hb_iter_t &o HB_UNUSED) {}
+  void operator = (const hb_iter_t &o HB_UNUSED) {}
+};
+
+/* Base class for sorted iterators.  Does not enforce anything.
+ * Just for class taxonomy and requirements. */
+template <typename Iter, typename Item = typename Iter::__item_type__>
+struct hb_sorted_iter_t : hb_iter_t<Iter, Item>
+{
+  protected:
+  hb_sorted_iter_t () {}
+  hb_sorted_iter_t (const hb_sorted_iter_t &o) : hb_iter_t<Iter, Item> (o) {}
+  void operator = (const hb_sorted_iter_t &o HB_UNUSED) {}
+};
+
+/* Mixin to fill in what the subclass doesn't provide. */
+template <typename iter_t, typename item_t = typename iter_t::__item_type__>
+struct hb_iter_mixin_t
+{
+  private:
+  /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
+  const iter_t* thiz () const { return static_cast<const iter_t *> (this); }
+        iter_t* thiz ()       { return static_cast<      iter_t *> (this); }
+  public:
+
+  /* Access: Implement __item__(), or __item_at__() if random-access. */
+  item_t& __item__ () const { return thiz()->item_at (0); }
+  item_t& __item_at__ (unsigned i) const { return *(thiz() + i); }
+
+  /* Termination: Implement __more__(), or __len__() if random-access. */
+  bool __more__ () const { return thiz()->__len__ (); }
+  unsigned __len__ () const
+  { iter_t c (*thiz()); unsigned l = 0; while (c) { c++; l++; }; return l; }
+
+  /* Advancing: Implement __next__(), or __forward__() if random-access. */
+  void __next__ () { thiz()->forward (1); }
+  void __forward__ (unsigned n) { while (n--) thiz()->next (); }
+
+  /* Rewinding: Implement __prev__() or __rewind__() if bidirectional. */
+  void __prev__ () { thiz()->rewind (1); }
+  void __rewind__ (unsigned n) { while (n--) thiz()->prev (); }
+
+  /* Random access: Return true if item_at(), len(), forward() are fast. */
+  bool __random_access__ () const { return false; }
+};
+
+
+/* Functions operating on iterators or iteratables. */
+
+template <typename C, typename V> inline void
+hb_fill (const C& c, const V &v)
+{
+  for (typename C::iter_t i (c); i; i++)
+    hb_assign (*i, v);
+}
+
+template <typename S, typename D> inline bool
+hb_copy (hb_iter_t<D> &id, hb_iter_t<S> &is)
+{
+  for (; id && is; ++id, ++is)
+    *id = *is;
+  return !is;
+}
+
+
+#endif /* HB_ITER_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-kern.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-kern.hh
new file mode 100644
index 0000000..fd5bb9e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-kern.hh
@@ -0,0 +1,139 @@
+/*
+ * Copyright © 2017  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_KERN_HH
+#define HB_KERN_HH
+
+#include "hb-open-type.hh"
+#include "hb-aat-layout-common.hh"
+#include "hb-ot-layout-gpos-table.hh"
+
+
+namespace OT {
+
+
+template <typename Driver>
+struct hb_kern_machine_t
+{
+  hb_kern_machine_t (const Driver &driver_,
+		     bool crossStream_ = false) :
+		       driver (driver_),
+		       crossStream (crossStream_) {}
+
+  HB_NO_SANITIZE_SIGNED_INTEGER_OVERFLOW
+  void kern (hb_font_t   *font,
+	     hb_buffer_t *buffer,
+	     hb_mask_t    kern_mask,
+	     bool         scale = true) const
+  {
+    OT::hb_ot_apply_context_t c (1, font, buffer);
+    c.set_lookup_mask (kern_mask);
+    c.set_lookup_props (OT::LookupFlag::IgnoreMarks);
+    OT::hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c.iter_input;
+    skippy_iter.init (&c);
+
+    bool horizontal = HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction);
+    unsigned int count = buffer->len;
+    hb_glyph_info_t *info = buffer->info;
+    hb_glyph_position_t *pos = buffer->pos;
+    for (unsigned int idx = 0; idx < count;)
+    {
+      if (!(info[idx].mask & kern_mask))
+      {
+	idx++;
+	continue;
+      }
+
+      skippy_iter.reset (idx, 1);
+      if (!skippy_iter.next ())
+      {
+	idx++;
+	continue;
+      }
+
+      unsigned int i = idx;
+      unsigned int j = skippy_iter.idx;
+
+      hb_position_t kern = driver.get_kerning (info[i].codepoint,
+					       info[j].codepoint);
+
+
+      if (likely (!kern))
+        goto skip;
+
+      if (horizontal)
+      {
+        if (scale)
+	  kern = font->em_scale_x (kern);
+	if (crossStream)
+	{
+	  pos[j].y_offset = kern;
+	  buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
+	}
+	else
+	{
+	  hb_position_t kern1 = kern >> 1;
+	  hb_position_t kern2 = kern - kern1;
+	  pos[i].x_advance += kern1;
+	  pos[j].x_advance += kern2;
+	  pos[j].x_offset += kern2;
+	}
+      }
+      else
+      {
+        if (scale)
+	  kern = font->em_scale_y (kern);
+	if (crossStream)
+	{
+	  pos[j].x_offset = kern;
+	  buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
+	}
+	else
+	{
+	  hb_position_t kern1 = kern >> 1;
+	  hb_position_t kern2 = kern - kern1;
+	  pos[i].y_advance += kern1;
+	  pos[j].y_advance += kern2;
+	  pos[j].y_offset += kern2;
+	}
+      }
+
+      buffer->unsafe_to_break (i, j + 1);
+
+    skip:
+      idx = skippy_iter.idx;
+    }
+  }
+
+  const Driver &driver;
+  bool crossStream;
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_KERN_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-machinery.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-machinery.hh
new file mode 100644
index 0000000..b22c238
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-machinery.hh
@@ -0,0 +1,931 @@
+/*
+ * Copyright © 2007,2008,2009,2010  Red Hat, Inc.
+ * Copyright © 2012,2018  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_MACHINERY_HH
+#define HB_MACHINERY_HH
+
+#include "hb.hh"
+#include "hb-blob.hh"
+
+#include "hb-array.hh"
+#include "hb-vector.hh"
+
+
+/*
+ * Casts
+ */
+
+/* Cast to struct T, reference to reference */
+template<typename Type, typename TObject>
+static inline const Type& CastR(const TObject &X)
+{ return reinterpret_cast<const Type&> (X); }
+template<typename Type, typename TObject>
+static inline Type& CastR(TObject &X)
+{ return reinterpret_cast<Type&> (X); }
+
+/* Cast to struct T, pointer to pointer */
+template<typename Type, typename TObject>
+static inline const Type* CastP(const TObject *X)
+{ return reinterpret_cast<const Type*> (X); }
+template<typename Type, typename TObject>
+static inline Type* CastP(TObject *X)
+{ return reinterpret_cast<Type*> (X); }
+
+/* StructAtOffset<T>(P,Ofs) returns the struct T& that is placed at memory
+ * location pointed to by P plus Ofs bytes. */
+template<typename Type>
+static inline const Type& StructAtOffset(const void *P, unsigned int offset)
+{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
+template<typename Type>
+static inline Type& StructAtOffset(void *P, unsigned int offset)
+{ return * reinterpret_cast<Type*> ((char *) P + offset); }
+template<typename Type>
+static inline const Type& StructAtOffsetUnaligned(const void *P, unsigned int offset)
+{
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-align"
+  return * reinterpret_cast<Type*> ((char *) P + offset);
+#pragma GCC diagnostic pop
+}
+template<typename Type>
+static inline Type& StructAtOffsetUnaligned(void *P, unsigned int offset)
+{
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-align"
+  return * reinterpret_cast<Type*> ((char *) P + offset);
+#pragma GCC diagnostic pop
+}
+
+/* StructAfter<T>(X) returns the struct T& that is placed after X.
+ * Works with X of variable size also.  X must implement get_size() */
+template<typename Type, typename TObject>
+static inline const Type& StructAfter(const TObject &X)
+{ return StructAtOffset<Type>(&X, X.get_size()); }
+template<typename Type, typename TObject>
+static inline Type& StructAfter(TObject &X)
+{ return StructAtOffset<Type>(&X, X.get_size()); }
+
+
+/*
+ * Size checking
+ */
+
+/* Check _assertion in a method environment */
+#define _DEFINE_INSTANCE_ASSERTION1(_line, _assertion) \
+  void _instance_assertion_on_line_##_line () const \
+  { static_assert ((_assertion), ""); }
+# define _DEFINE_INSTANCE_ASSERTION0(_line, _assertion) _DEFINE_INSTANCE_ASSERTION1 (_line, _assertion)
+# define DEFINE_INSTANCE_ASSERTION(_assertion) _DEFINE_INSTANCE_ASSERTION0 (__LINE__, _assertion)
+
+/* Check that _code compiles in a method environment */
+#define _DEFINE_COMPILES_ASSERTION1(_line, _code) \
+  void _compiles_assertion_on_line_##_line () const \
+  { _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)) \
+  unsigned int get_size () const { return (size); } \
+  static constexpr unsigned null_size = (size); \
+  static constexpr unsigned min_size = (size); \
+  static constexpr unsigned static_size = (size)
+
+#define DEFINE_SIZE_UNION(size, _member) \
+  DEFINE_COMPILES_ASSERTION ((void) this->u._member.static_size) \
+  DEFINE_INSTANCE_ASSERTION (sizeof(this->u._member) == (size)) \
+  static constexpr unsigned null_size = (size); \
+  static constexpr unsigned min_size = (size)
+
+#define DEFINE_SIZE_MIN(size) \
+  DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)) \
+  static constexpr unsigned null_size = (size); \
+  static constexpr unsigned min_size = (size)
+
+#define DEFINE_SIZE_UNBOUNDED(size) \
+  DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)) \
+  static constexpr unsigned min_size = (size)
+
+#define DEFINE_SIZE_ARRAY(size, array) \
+  DEFINE_COMPILES_ASSERTION ((void) (array)[0].static_size) \
+  DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + VAR * sizeof ((array)[0])) \
+  static constexpr unsigned null_size = (size); \
+  static constexpr unsigned min_size = (size)
+
+#define DEFINE_SIZE_ARRAY_SIZED(size, array) \
+  unsigned int get_size () const { return (size - (array).min_size + (array).get_size ()); } \
+  DEFINE_SIZE_ARRAY(size, array)
+
+
+/*
+ * Dispatch
+ */
+
+template <typename Context, typename Return, unsigned int MaxDebugDepth>
+struct hb_dispatch_context_t
+{
+  static constexpr unsigned max_debug_depth = MaxDebugDepth;
+  typedef Return return_t;
+  template <typename T, typename F>
+  bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; }
+  static return_t no_dispatch_return_value () { return Context::default_return_value (); }
+  static bool stop_sublookup_iteration (const return_t r HB_UNUSED) { return false; }
+};
+
+
+/*
+ * Sanitize
+ *
+ *
+ * === Introduction ===
+ *
+ * The sanitize machinery is at the core of our zero-cost font loading.  We
+ * mmap() font file into memory and create a blob out of it.  Font subtables
+ * are returned as a readonly sub-blob of the main font blob.  These table
+ * blobs are then sanitized before use, to ensure invalid memory access does
+ * not happen.  The toplevel sanitize API use is like, eg. to load the 'head'
+ * table:
+ *
+ *   hb_blob_t *head_blob = hb_sanitize_context_t ().reference_table<OT::head> (face);
+ *
+ * The blob then can be converted to a head table struct with:
+ *
+ *   const head *head_table = head_blob->as<head> ();
+ *
+ * What the reference_table does is, to call hb_face_reference_table() to load
+ * the table blob, sanitize it and return either the sanitized blob, or empty
+ * blob if sanitization failed.  The blob->as() function returns the null
+ * object of its template type argument if the blob is empty.  Otherwise, it
+ * just casts the blob contents to the desired type.
+ *
+ * Sanitizing a blob of data with a type T works as follows (with minor
+ * simplification):
+ *
+ *   - Cast blob content to T*, call sanitize() method of it,
+ *   - If sanitize succeeded, return blob.
+ *   - Otherwise, if blob is not writable, try making it writable,
+ *     or copy if cannot be made writable in-place,
+ *   - Call sanitize() again.  Return blob if sanitize succeeded.
+ *   - Return empty blob otherwise.
+ *
+ *
+ * === The sanitize() contract ===
+ *
+ * The sanitize() method of each object type shall return true if it's safe to
+ * call other methods of the object, and false otherwise.
+ *
+ * Note that what sanitize() checks for might align with what the specification
+ * describes as valid table data, but does not have to be.  In particular, we
+ * do NOT want to be pedantic and concern ourselves with validity checks that
+ * are irrelevant to our use of the table.  On the contrary, we want to be
+ * lenient with error handling and accept invalid data to the extent that it
+ * does not impose extra burden on us.
+ *
+ * Based on the sanitize contract, one can see that what we check for depends
+ * on how we use the data in other table methods.  Ie. if other table methods
+ * assume that offsets do NOT point out of the table data block, then that's
+ * something sanitize() must check for (GSUB/GPOS/GDEF/etc work this way).  On
+ * the other hand, if other methods do such checks themselves, then sanitize()
+ * does not have to bother with them (glyf/local work this way).  The choice
+ * depends on the table structure and sanitize() performance.  For example, to
+ * check glyf/loca offsets in sanitize() would cost O(num-glyphs).  We try hard
+ * to avoid such costs during font loading.  By postponing such checks to the
+ * actual glyph loading, we reduce the sanitize cost to O(1) and total runtime
+ * cost to O(used-glyphs).  As such, this is preferred.
+ *
+ * The same argument can be made re GSUB/GPOS/GDEF, but there, the table
+ * structure is so complicated that by checking all offsets at sanitize() time,
+ * we make the code much simpler in other methods, as offsets and referenced
+ * objects do not need to be validated at each use site.
+ */
+
+/* This limits sanitizing time on really broken fonts. */
+#ifndef HB_SANITIZE_MAX_EDITS
+#define HB_SANITIZE_MAX_EDITS 32
+#endif
+#ifndef HB_SANITIZE_MAX_OPS_FACTOR
+#define HB_SANITIZE_MAX_OPS_FACTOR 8
+#endif
+#ifndef HB_SANITIZE_MAX_OPS_MIN
+#define HB_SANITIZE_MAX_OPS_MIN 16384
+#endif
+#ifndef HB_SANITIZE_MAX_OPS_MAX
+#define HB_SANITIZE_MAX_OPS_MAX 0x3FFFFFFF
+#endif
+
+struct hb_sanitize_context_t :
+       hb_dispatch_context_t<hb_sanitize_context_t, bool, HB_DEBUG_SANITIZE>
+{
+  hb_sanitize_context_t () :
+	debug_depth (0),
+	start (nullptr), end (nullptr),
+	max_ops (0),
+	writable (false), edit_count (0),
+	blob (nullptr),
+	num_glyphs (65536),
+	num_glyphs_set (false) {}
+
+  const char *get_name () { return "SANITIZE"; }
+  template <typename T, typename F>
+  bool may_dispatch (const T *obj HB_UNUSED, const F *format)
+  { return format->sanitize (this); }
+  template <typename T>
+  return_t dispatch (const T &obj) { return obj.sanitize (this); }
+  static return_t default_return_value () { return true; }
+  static return_t no_dispatch_return_value () { return false; }
+  bool stop_sublookup_iteration (const return_t r) const { return !r; }
+
+  void init (hb_blob_t *b)
+  {
+    this->blob = hb_blob_reference (b);
+    this->writable = false;
+  }
+
+  void set_num_glyphs (unsigned int num_glyphs_)
+  {
+    num_glyphs = num_glyphs_;
+    num_glyphs_set = true;
+  }
+  unsigned int get_num_glyphs () { return num_glyphs; }
+
+  void set_max_ops (int max_ops_) { max_ops = max_ops_; }
+
+  template <typename T>
+  void set_object (const T *obj)
+  {
+    reset_object ();
+
+    if (!obj) return;
+
+    const char *obj_start = (const char *) obj;
+    if (unlikely (obj_start < this->start || this->end <= obj_start))
+      this->start = this->end = nullptr;
+    else
+    {
+      this->start = obj_start;
+      this->end   = obj_start + MIN<uintptr_t> (this->end - obj_start, obj->get_size ());
+    }
+  }
+
+  void reset_object ()
+  {
+    this->start = this->blob->data;
+    this->end = this->start + this->blob->length;
+    assert (this->start <= this->end); /* Must not overflow. */
+  }
+
+  void start_processing ()
+  {
+    reset_object ();
+    this->max_ops = MAX ((unsigned int) (this->end - this->start) * HB_SANITIZE_MAX_OPS_FACTOR,
+			 (unsigned) HB_SANITIZE_MAX_OPS_MIN);
+    this->edit_count = 0;
+    this->debug_depth = 0;
+
+    DEBUG_MSG_LEVEL (SANITIZE, start, 0, +1,
+		     "start [%p..%p] (%lu bytes)",
+		     this->start, this->end,
+		     (unsigned long) (this->end - this->start));
+  }
+
+  void end_processing ()
+  {
+    DEBUG_MSG_LEVEL (SANITIZE, this->start, 0, -1,
+		     "end [%p..%p] %u edit requests",
+		     this->start, this->end, this->edit_count);
+
+    hb_blob_destroy (this->blob);
+    this->blob = nullptr;
+    this->start = this->end = nullptr;
+  }
+
+  bool check_range (const void *base,
+			   unsigned int len) const
+  {
+    const char *p = (const char *) base;
+    bool ok = this->start <= p &&
+	      p <= this->end &&
+	      (unsigned int) (this->end - p) >= len &&
+	      this->max_ops-- > 0;
+
+    DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
+       "check_range [%p..%p] (%d bytes) in [%p..%p] -> %s",
+       p, p + len, len,
+       this->start, this->end,
+       ok ? "OK" : "OUT-OF-RANGE");
+
+    return likely (ok);
+  }
+
+  template <typename T>
+  bool check_range (const T *base,
+			   unsigned int a,
+			   unsigned int b) const
+  {
+    return !hb_unsigned_mul_overflows (a, b) &&
+	   this->check_range (base, a * b);
+  }
+
+  template <typename T>
+  bool check_range (const T *base,
+			   unsigned int a,
+			   unsigned int b,
+			   unsigned int c) const
+  {
+    return !hb_unsigned_mul_overflows (a, b) &&
+	   this->check_range (base, a * b, c);
+  }
+
+  template <typename T>
+  bool check_array (const T *base, unsigned int len) const
+  {
+    return this->check_range (base, len, hb_static_size (T));
+  }
+
+  template <typename T>
+  bool check_array (const T *base,
+		    unsigned int a,
+		    unsigned int b) const
+  {
+    return this->check_range (base, a, b, hb_static_size (T));
+  }
+
+  template <typename Type>
+  bool check_struct (const Type *obj) const
+  { return likely (this->check_range (obj, obj->min_size)); }
+
+  bool may_edit (const void *base, unsigned int len)
+  {
+    if (this->edit_count >= HB_SANITIZE_MAX_EDITS)
+      return false;
+
+    const char *p = (const char *) base;
+    this->edit_count++;
+
+    DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
+       "may_edit(%u) [%p..%p] (%d bytes) in [%p..%p] -> %s",
+       this->edit_count,
+       p, p + len, len,
+       this->start, this->end,
+       this->writable ? "GRANTED" : "DENIED");
+
+    return this->writable;
+  }
+
+  template <typename Type, typename ValueType>
+  bool try_set (const Type *obj, const ValueType &v)
+  {
+    if (this->may_edit (obj, hb_static_size (Type)))
+    {
+      hb_assign (* const_cast<Type *> (obj), v);
+      return true;
+    }
+    return false;
+  }
+
+  template <typename Type>
+  hb_blob_t *sanitize_blob (hb_blob_t *blob)
+  {
+    bool sane;
+
+    init (blob);
+
+  retry:
+    DEBUG_MSG_FUNC (SANITIZE, start, "start");
+
+    start_processing ();
+
+    if (unlikely (!start))
+    {
+      end_processing ();
+      return blob;
+    }
+
+    Type *t = CastP<Type> (const_cast<char *> (start));
+
+    sane = t->sanitize (this);
+    if (sane)
+    {
+      if (edit_count)
+      {
+	DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %d edits; going for second round", edit_count);
+
+        /* sanitize again to ensure no toe-stepping */
+        edit_count = 0;
+	sane = t->sanitize (this);
+	if (edit_count) {
+	  DEBUG_MSG_FUNC (SANITIZE, start, "requested %d edits in second round; FAILLING", edit_count);
+	  sane = false;
+	}
+      }
+    }
+    else
+    {
+      if (edit_count && !writable) {
+        start = hb_blob_get_data_writable (blob, nullptr);
+	end = start + blob->length;
+
+	if (start)
+	{
+	  writable = true;
+	  /* ok, we made it writable by relocating.  try again */
+	  DEBUG_MSG_FUNC (SANITIZE, start, "retry");
+	  goto retry;
+	}
+      }
+    }
+
+    end_processing ();
+
+    DEBUG_MSG_FUNC (SANITIZE, start, sane ? "PASSED" : "FAILED");
+    if (sane)
+    {
+      hb_blob_make_immutable (blob);
+      return blob;
+    }
+    else
+    {
+      hb_blob_destroy (blob);
+      return hb_blob_get_empty ();
+    }
+  }
+
+  template <typename Type>
+  hb_blob_t *reference_table (const hb_face_t *face, hb_tag_t tableTag = Type::tableTag)
+  {
+    if (!num_glyphs_set)
+      set_num_glyphs (hb_face_get_glyph_count (face));
+    return sanitize_blob<Type> (hb_face_reference_table (face, tableTag));
+  }
+
+  mutable unsigned int debug_depth;
+  const char *start, *end;
+  mutable int max_ops;
+  private:
+  bool writable;
+  unsigned int edit_count;
+  hb_blob_t *blob;
+  unsigned int num_glyphs;
+  bool  num_glyphs_set;
+};
+
+struct hb_sanitize_with_object_t
+{
+  template <typename T>
+  hb_sanitize_with_object_t (hb_sanitize_context_t *c,
+				    const T& obj) : c (c)
+  { c->set_object (obj); }
+  ~hb_sanitize_with_object_t ()
+  { c->reset_object (); }
+
+  private:
+  hb_sanitize_context_t *c;
+};
+
+
+/*
+ * Serialize
+ */
+
+struct hb_serialize_context_t
+{
+  hb_serialize_context_t (void *start_, unsigned int size)
+  {
+    this->start = (char *) start_;
+    this->end = this->start + size;
+    reset ();
+  }
+
+  bool in_error () const { return !this->successful; }
+
+  void reset ()
+  {
+    this->successful = true;
+    this->head = this->start;
+    this->debug_depth = 0;
+  }
+
+  bool propagate_error (bool e)
+  { return this->successful = this->successful && e; }
+  template <typename T> bool propagate_error (const T &obj)
+  { return this->successful = this->successful && !obj.in_error (); }
+  template <typename T> bool propagate_error (const T *obj)
+  { return this->successful = this->successful && !obj->in_error (); }
+  template <typename T1, typename T2> bool propagate_error (T1 &o1, T2 &o2)
+  { return propagate_error (o1) && propagate_error (o2); }
+  template <typename T1, typename T2> bool propagate_error (T1 *o1, T2 *o2)
+  { return propagate_error (o1) && propagate_error (o2); }
+  template <typename T1, typename T2, typename T3>
+  bool propagate_error (T1 &o1, T2 &o2, T3 &o3)
+  { return propagate_error (o1) && propagate_error (o2, o3); }
+  template <typename T1, typename T2, typename T3>
+  bool propagate_error (T1 *o1, T2 *o2, T3 *o3)
+  { return propagate_error (o1) && propagate_error (o2, o3); }
+
+  /* To be called around main operation. */
+  template <typename Type>
+  Type *start_serialize ()
+  {
+    DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, +1,
+		     "start [%p..%p] (%lu bytes)",
+		     this->start, this->end,
+		     (unsigned long) (this->end - this->start));
+
+    return start_embed<Type> ();
+  }
+  void end_serialize ()
+  {
+    DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, -1,
+		     "end [%p..%p] serialized %d bytes; %s",
+		     this->start, this->end,
+		     (int) (this->head - this->start),
+		     this->successful ? "successful" : "UNSUCCESSFUL");
+  }
+
+  unsigned int length () const { return this->head - this->start; }
+
+  void align (unsigned int alignment)
+  {
+    unsigned int l = length () % alignment;
+    if (l)
+      allocate_size<void> (alignment - l);
+  }
+
+  template <typename Type>
+  Type *start_embed (const Type *_ HB_UNUSED = nullptr) const
+  {
+    Type *ret = reinterpret_cast<Type *> (this->head);
+    return ret;
+  }
+
+  template <typename Type>
+  Type *allocate_size (unsigned int size)
+  {
+    if (unlikely (!this->successful || this->end - this->head < ptrdiff_t (size))) {
+      this->successful = false;
+      return nullptr;
+    }
+    memset (this->head, 0, size);
+    char *ret = this->head;
+    this->head += size;
+    return reinterpret_cast<Type *> (ret);
+  }
+
+  template <typename Type>
+  Type *allocate_min ()
+  {
+    return this->allocate_size<Type> (Type::min_size);
+  }
+
+  template <typename Type>
+  Type *embed (const Type &obj)
+  {
+    unsigned int size = obj.get_size ();
+    Type *ret = this->allocate_size<Type> (size);
+    if (unlikely (!ret)) return nullptr;
+    memcpy (ret, &obj, size);
+    return ret;
+  }
+  template <typename Type>
+  hb_serialize_context_t &operator << (const Type &obj) { embed (obj); return *this; }
+
+  template <typename Type>
+  Type *extend_size (Type &obj, unsigned int size)
+  {
+    assert (this->start <= (char *) &obj);
+    assert ((char *) &obj <= this->head);
+    assert ((char *) &obj + size >= this->head);
+    if (unlikely (!this->allocate_size<Type> (((char *) &obj) + size - this->head))) return nullptr;
+    return reinterpret_cast<Type *> (&obj);
+  }
+
+  template <typename Type>
+  Type *extend_min (Type &obj) { return extend_size (obj, obj.min_size); }
+
+  template <typename Type>
+  Type *extend (Type &obj) { return extend_size (obj, obj.get_size ()); }
+
+  /* Output routines. */
+  template <typename Type>
+  Type *copy () const
+  {
+    assert (this->successful);
+    unsigned int len = this->head - this->start;
+    void *p = malloc (len);
+    if (p)
+      memcpy (p, this->start, len);
+    return reinterpret_cast<Type *> (p);
+  }
+  hb_bytes_t copy_bytes () const
+  {
+    assert (this->successful);
+    unsigned int len = this->head - this->start;
+    void *p = malloc (len);
+    if (p)
+      memcpy (p, this->start, len);
+    else
+      return hb_bytes_t ();
+    return hb_bytes_t ((char *) p, len);
+  }
+  hb_blob_t *copy_blob () const
+  {
+    assert (this->successful);
+    return hb_blob_create (this->start,
+			   this->head - this->start,
+			   HB_MEMORY_MODE_DUPLICATE,
+			   nullptr, nullptr);
+  }
+
+  public:
+  unsigned int debug_depth;
+  char *start, *end, *head;
+  bool successful;
+};
+
+
+
+/*
+ * Big-endian integers.
+ */
+
+template <typename Type, int Bytes> struct BEInt;
+
+template <typename Type>
+struct BEInt<Type, 1>
+{
+  public:
+  void set (Type V)      { v = V; }
+  operator Type () const { return v; }
+  private: uint8_t v;
+};
+template <typename Type>
+struct BEInt<Type, 2>
+{
+  public:
+  void set (Type V)
+  {
+    v[0] = (V >>  8) & 0xFF;
+    v[1] = (V      ) & 0xFF;
+  }
+  operator Type () const
+  {
+#if ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \
+    defined(__BYTE_ORDER) && \
+    (__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN)
+    /* Spoon-feed the compiler a big-endian integer with alignment 1.
+     * https://github.com/harfbuzz/harfbuzz/pull/1398 */
+    struct __attribute__((packed)) packed_uint16_t { uint16_t v; };
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+    return __builtin_bswap16 (((packed_uint16_t *) this)->v);
+#else /* __BYTE_ORDER == __BIG_ENDIAN */
+    return ((packed_uint16_t *) this)->v;
+#endif
+#endif
+    return (v[0] <<  8)
+         + (v[1]      );
+  }
+  private: uint8_t v[2];
+};
+template <typename Type>
+struct BEInt<Type, 3>
+{
+  public:
+  void set (Type V)
+  {
+    v[0] = (V >> 16) & 0xFF;
+    v[1] = (V >>  8) & 0xFF;
+    v[2] = (V      ) & 0xFF;
+  }
+  operator Type () const
+  {
+    return (v[0] << 16)
+         + (v[1] <<  8)
+         + (v[2]      );
+  }
+  private: uint8_t v[3];
+};
+template <typename Type>
+struct BEInt<Type, 4>
+{
+  public:
+  typedef Type type;
+  void set (Type V)
+  {
+    v[0] = (V >> 24) & 0xFF;
+    v[1] = (V >> 16) & 0xFF;
+    v[2] = (V >>  8) & 0xFF;
+    v[3] = (V      ) & 0xFF;
+  }
+  operator Type () const
+  {
+    return (v[0] << 24)
+         + (v[1] << 16)
+         + (v[2] <<  8)
+         + (v[3]      );
+  }
+  private: uint8_t v[4];
+};
+
+
+/*
+ * Lazy loaders.
+ */
+
+template <typename Data, unsigned int WheresData>
+struct hb_data_wrapper_t
+{
+  static_assert (WheresData > 0, "");
+
+  Data * get_data () const
+  { return *(((Data **) (void *) this) - WheresData); }
+
+  bool is_inert () const { return !get_data (); }
+
+  template <typename Stored, typename Subclass>
+  Stored * call_create () const { return Subclass::create (get_data ()); }
+};
+template <>
+struct hb_data_wrapper_t<void, 0>
+{
+  bool is_inert () const { return false; }
+
+  template <typename Stored, typename Funcs>
+  Stored * call_create () const { return Funcs::create (); }
+};
+
+template <typename T1, typename T2> struct hb_non_void_t { typedef T1 value; };
+template <typename T2> struct hb_non_void_t<void, T2> { typedef T2 value; };
+
+template <typename Returned,
+	  typename Subclass = void,
+	  typename Data = void,
+	  unsigned int WheresData = 0,
+	  typename Stored = Returned>
+struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData>
+{
+  typedef typename hb_non_void_t<Subclass,
+				 hb_lazy_loader_t<Returned,Subclass,Data,WheresData,Stored>
+				>::value Funcs;
+
+  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
+  void init ()  { instance.set_relaxed (nullptr); }
+  void fini ()  { do_destroy (instance.get ()); }
+
+  void free_instance ()
+  {
+  retry:
+    Stored *p = instance.get ();
+    if (unlikely (p && !cmpexch (p, nullptr)))
+      goto retry;
+    do_destroy (p);
+  }
+
+  static void do_destroy (Stored *p)
+  {
+    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
+      Funcs::destroy (p);
+  }
+
+  const Returned * operator -> () const { return get (); }
+  const Returned & operator * () const  { return *get (); }
+  explicit_operator bool () const
+  { return get_stored () != Funcs::get_null (); }
+  template <typename C> operator const C * () const { return get (); }
+
+  Stored * get_stored () const
+  {
+  retry:
+    Stored *p = this->instance.get ();
+    if (unlikely (!p))
+    {
+      if (unlikely (this->is_inert ()))
+	return const_cast<Stored *> (Funcs::get_null ());
+
+      p = this->template call_create<Stored, Funcs> ();
+      if (unlikely (!p))
+	p = const_cast<Stored *> (Funcs::get_null ());
+
+      if (unlikely (!cmpexch (nullptr, p)))
+      {
+        do_destroy (p);
+	goto retry;
+      }
+    }
+    return p;
+  }
+  Stored * get_stored_relaxed () const
+  {
+    return this->instance.get_relaxed ();
+  }
+
+  bool cmpexch (Stored *current, Stored *value) const
+  {
+    /* This *must* be called when there are no other threads accessing. */
+    return this->instance.cmpexch (current, value);
+  }
+
+  const Returned * get () const { return Funcs::convert (get_stored ()); }
+  const Returned * get_relaxed () const { return Funcs::convert (get_stored_relaxed ()); }
+  Returned * get_unconst () const { return const_cast<Returned *> (Funcs::convert (get_stored ())); }
+
+  /* To be possibly overloaded by subclasses. */
+  static Returned* convert (Stored *p) { return p; }
+
+  /* By default null/init/fini the object. */
+  static const Stored* get_null () { return &Null(Stored); }
+  static Stored *create (Data *data)
+  {
+    Stored *p = (Stored *) calloc (1, sizeof (Stored));
+    if (likely (p))
+      p->init (data);
+    return p;
+  }
+  static Stored *create ()
+  {
+    Stored *p = (Stored *) calloc (1, sizeof (Stored));
+    if (likely (p))
+      p->init ();
+    return p;
+  }
+  static void destroy (Stored *p)
+  {
+    p->fini ();
+    free (p);
+  }
+
+//  private:
+  /* Must only have one pointer. */
+  hb_atomic_ptr_t<Stored *> instance;
+};
+
+/* Specializations. */
+
+template <typename T, unsigned int WheresFace>
+struct hb_face_lazy_loader_t : hb_lazy_loader_t<T,
+						hb_face_lazy_loader_t<T, WheresFace>,
+						hb_face_t, WheresFace> {};
+
+template <typename T, unsigned int WheresFace>
+struct hb_table_lazy_loader_t : hb_lazy_loader_t<T,
+						 hb_table_lazy_loader_t<T, WheresFace>,
+						 hb_face_t, WheresFace,
+						 hb_blob_t>
+{
+  static hb_blob_t *create (hb_face_t *face)
+  { return hb_sanitize_context_t ().reference_table<T> (face); }
+  static void destroy (hb_blob_t *p) { hb_blob_destroy (p); }
+
+  static const hb_blob_t *get_null ()
+  { return hb_blob_get_empty (); }
+
+  static const T* convert (const hb_blob_t *blob)
+  { return blob->as<T> (); }
+
+  hb_blob_t* get_blob () const { return this->get_stored (); }
+};
+
+template <typename Subclass>
+struct hb_font_funcs_lazy_loader_t : hb_lazy_loader_t<hb_font_funcs_t, Subclass>
+{
+  static void destroy (hb_font_funcs_t *p)
+  { hb_font_funcs_destroy (p); }
+  static const hb_font_funcs_t *get_null ()
+  { return hb_font_funcs_get_empty (); }
+};
+template <typename Subclass>
+struct hb_unicode_funcs_lazy_loader_t : hb_lazy_loader_t<hb_unicode_funcs_t, Subclass>
+{
+  static void destroy (hb_unicode_funcs_t *p)
+  { hb_unicode_funcs_destroy (p); }
+  static const hb_unicode_funcs_t *get_null ()
+  { return hb_unicode_funcs_get_empty (); }
+};
+
+
+#endif /* HB_MACHINERY_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-map.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-map.cc
new file mode 100644
index 0000000..a2c770c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-map.cc
@@ -0,0 +1,268 @@
+/*
+ * Copyright © 2018  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
+ */
+
+#include "hb-map.hh"
+
+
+/**
+ * SECTION:hb-map
+ * @title: hb-map
+ * @short_description: Object representing integer to integer mapping
+ * @include: hb.h
+ *
+ * Map objects are integer-to-integer hash-maps.  Currently they are
+ * not used in the HarfBuzz public API, but are provided for client's
+ * use if desired.
+ **/
+
+
+/**
+ * hb_map_create: (Xconstructor)
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 1.7.7
+ **/
+hb_map_t *
+hb_map_create ()
+{
+  hb_map_t *map;
+
+  if (!(map = hb_object_create<hb_map_t> ()))
+    return hb_map_get_empty ();
+
+  map->init_shallow ();
+
+  return map;
+}
+
+/**
+ * hb_map_get_empty:
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 1.7.7
+ **/
+hb_map_t *
+hb_map_get_empty ()
+{
+  return const_cast<hb_map_t *> (&Null(hb_map_t));
+}
+
+/**
+ * hb_map_reference: (skip)
+ * @map: a map.
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 1.7.7
+ **/
+hb_map_t *
+hb_map_reference (hb_map_t *map)
+{
+  return hb_object_reference (map);
+}
+
+/**
+ * hb_map_destroy: (skip)
+ * @map: a map.
+ *
+ * Since: 1.7.7
+ **/
+void
+hb_map_destroy (hb_map_t *map)
+{
+  if (!hb_object_destroy (map)) return;
+
+  map->fini_shallow ();
+
+  free (map);
+}
+
+/**
+ * hb_map_set_user_data: (skip)
+ * @map: a map.
+ * @key:
+ * @data:
+ * @destroy:
+ * @replace:
+ *
+ * Return value:
+ *
+ * Since: 1.7.7
+ **/
+hb_bool_t
+hb_map_set_user_data (hb_map_t           *map,
+		      hb_user_data_key_t *key,
+		      void *              data,
+		      hb_destroy_func_t   destroy,
+		      hb_bool_t           replace)
+{
+  return hb_object_set_user_data (map, key, data, destroy, replace);
+}
+
+/**
+ * hb_map_get_user_data: (skip)
+ * @map: a map.
+ * @key:
+ *
+ * Return value: (transfer none):
+ *
+ * Since: 1.7.7
+ **/
+void *
+hb_map_get_user_data (hb_map_t           *map,
+		      hb_user_data_key_t *key)
+{
+  return hb_object_get_user_data (map, key);
+}
+
+
+/**
+ * hb_map_allocation_successful:
+ * @map: a map.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.7.7
+ **/
+hb_bool_t
+hb_map_allocation_successful (const hb_map_t  *map)
+{
+  return map->successful;
+}
+
+
+/**
+ * hb_map_set:
+ * @map: a map.
+ * @key:
+ * @value:
+ *
+ *
+ *
+ * Since: 1.7.7
+ **/
+void
+hb_map_set (hb_map_t       *map,
+	    hb_codepoint_t  key,
+	    hb_codepoint_t  value)
+{
+  map->set (key, value);
+}
+
+/**
+ * hb_map_get:
+ * @map: a map.
+ * @key:
+ *
+ *
+ *
+ * Since: 1.7.7
+ **/
+hb_codepoint_t
+hb_map_get (const hb_map_t *map,
+	    hb_codepoint_t  key)
+{
+  return map->get (key);
+}
+
+/**
+ * hb_map_del:
+ * @map: a map.
+ * @key:
+ *
+ *
+ *
+ * Since: 1.7.7
+ **/
+void
+hb_map_del (hb_map_t       *map,
+	    hb_codepoint_t  key)
+{
+  map->del (key);
+}
+
+/**
+ * hb_map_has:
+ * @map: a map.
+ * @key:
+ *
+ *
+ *
+ * Since: 1.7.7
+ **/
+hb_bool_t
+hb_map_has (const hb_map_t *map,
+	    hb_codepoint_t  key)
+{
+  return map->has (key);
+}
+
+
+/**
+ * hb_map_clear:
+ * @map: a map.
+ *
+ *
+ *
+ * Since: 1.7.7
+ **/
+void
+hb_map_clear (hb_map_t *map)
+{
+  return map->clear ();
+}
+
+/**
+ * hb_map_is_empty:
+ * @map: a map.
+ *
+ *
+ *
+ * Since: 1.7.7
+ **/
+hb_bool_t
+hb_map_is_empty (const hb_map_t *map)
+{
+  return map->is_empty ();
+}
+
+/**
+ * hb_map_get_population:
+ * @map: a map.
+ *
+ *
+ *
+ * Since: 1.7.7
+ **/
+unsigned int
+hb_map_get_population (const hb_map_t *map)
+{
+  return map->get_population ();
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-map.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-map.h
new file mode 100644
index 0000000..b77843c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-map.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright © 2018  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_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_MAP_H
+#define HB_MAP_H
+
+#include "hb-common.h"
+
+HB_BEGIN_DECLS
+
+
+/*
+ * Since: 1.7.7
+ */
+#define HB_MAP_VALUE_INVALID ((hb_codepoint_t) -1)
+
+typedef struct hb_map_t hb_map_t;
+
+
+HB_EXTERN hb_map_t *
+hb_map_create (void);
+
+HB_EXTERN hb_map_t *
+hb_map_get_empty (void);
+
+HB_EXTERN hb_map_t *
+hb_map_reference (hb_map_t *map);
+
+HB_EXTERN void
+hb_map_destroy (hb_map_t *map);
+
+HB_EXTERN hb_bool_t
+hb_map_set_user_data (hb_map_t           *map,
+		      hb_user_data_key_t *key,
+		      void *              data,
+		      hb_destroy_func_t   destroy,
+		      hb_bool_t           replace);
+
+HB_EXTERN void *
+hb_map_get_user_data (hb_map_t           *map,
+		      hb_user_data_key_t *key);
+
+
+/* Returns false if allocation has failed before */
+HB_EXTERN hb_bool_t
+hb_map_allocation_successful (const hb_map_t *map);
+
+HB_EXTERN void
+hb_map_clear (hb_map_t *map);
+
+HB_EXTERN hb_bool_t
+hb_map_is_empty (const hb_map_t *map);
+
+HB_EXTERN unsigned int
+hb_map_get_population (const hb_map_t *map);
+
+HB_EXTERN void
+hb_map_set (hb_map_t       *map,
+	    hb_codepoint_t  key,
+	    hb_codepoint_t  value);
+
+HB_EXTERN hb_codepoint_t
+hb_map_get (const hb_map_t *map,
+	    hb_codepoint_t  key);
+
+HB_EXTERN void
+hb_map_del (hb_map_t       *map,
+	    hb_codepoint_t  key);
+
+HB_EXTERN hb_bool_t
+hb_map_has (const hb_map_t *map,
+	    hb_codepoint_t  key);
+
+
+HB_END_DECLS
+
+#endif /* HB_MAP_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-map.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-map.hh
new file mode 100644
index 0000000..02d5406
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-map.hh
@@ -0,0 +1,252 @@
+/*
+ * Copyright © 2018  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_MAP_HH
+#define HB_MAP_HH
+
+#include "hb.hh"
+
+
+template <typename T>
+inline uint32_t Hash (const T &v)
+{
+  /* Knuth's multiplicative method: */
+  return (uint32_t) v * 2654435761u;
+}
+
+
+/*
+ * hb_map_t
+ */
+
+struct hb_map_t
+{
+  HB_NO_COPY_ASSIGN (hb_map_t);
+  hb_map_t ()  { init (); }
+  ~hb_map_t () { fini (); }
+
+  struct item_t
+  {
+    hb_codepoint_t key;
+    hb_codepoint_t value;
+
+    bool is_unused () const    { return key == INVALID; }
+    bool is_tombstone () const { return key != INVALID && value == INVALID; }
+  };
+
+  hb_object_header_t header;
+  bool successful; /* Allocations successful */
+  unsigned int population; /* Not including tombstones. */
+  unsigned int occupancy; /* Including tombstones. */
+  unsigned int mask;
+  unsigned int prime;
+  item_t *items;
+
+  void init_shallow ()
+  {
+    successful = true;
+    population = occupancy = 0;
+    mask = 0;
+    prime = 0;
+    items = nullptr;
+  }
+  void init ()
+  {
+    hb_object_init (this);
+    init_shallow ();
+  }
+  void fini_shallow ()
+  {
+    free (items);
+    items = nullptr;
+  }
+  void fini ()
+  {
+    population = occupancy = 0;
+    hb_object_fini (this);
+    fini_shallow ();
+  }
+
+  bool in_error () const { return !successful; }
+
+  bool resize ()
+  {
+    if (unlikely (!successful)) return false;
+
+    unsigned int power = hb_bit_storage (population * 2 + 8);
+    unsigned int new_size = 1u << power;
+    item_t *new_items = (item_t *) malloc ((size_t) new_size * sizeof (item_t));
+    if (unlikely (!new_items))
+    {
+      successful = false;
+      return false;
+    }
+    memset (new_items, 0xFF, (size_t) new_size * sizeof (item_t));
+
+    unsigned int old_size = mask + 1;
+    item_t *old_items = items;
+
+    /* Switch to new, empty, array. */
+    population = occupancy = 0;
+    mask = new_size - 1;
+    prime = prime_for (power);
+    items = new_items;
+
+    /* Insert back old items. */
+    if (old_items)
+      for (unsigned int i = 0; i < old_size; i++)
+	if (old_items[i].key != INVALID && old_items[i].value != INVALID)
+	  set (old_items[i].key, old_items[i].value);
+
+    free (old_items);
+
+    return true;
+  }
+
+  void set (hb_codepoint_t key, hb_codepoint_t value)
+  {
+    if (unlikely (!successful)) return;
+    if (unlikely (key == INVALID)) return;
+    if ((occupancy + occupancy / 2) >= mask && !resize ()) return;
+    unsigned int i = bucket_for (key);
+
+    if (value == INVALID && items[i].key != key)
+      return; /* Trying to delete non-existent key. */
+
+    if (!items[i].is_unused ())
+    {
+      occupancy--;
+      if (items[i].is_tombstone ())
+	population--;
+    }
+
+    items[i].key = key;
+    items[i].value = value;
+
+    occupancy++;
+    if (!items[i].is_tombstone ())
+      population++;
+
+  }
+  hb_codepoint_t get (hb_codepoint_t key) const
+  {
+    if (unlikely (!items)) return INVALID;
+    unsigned int i = bucket_for (key);
+    return items[i].key == key ? items[i].value : INVALID;
+  }
+
+  void del (hb_codepoint_t key) { set (key, INVALID); }
+
+  bool has (hb_codepoint_t key) const
+  { return get (key) != INVALID; }
+
+  hb_codepoint_t operator [] (unsigned int key) const
+  { return get (key); }
+
+  static constexpr hb_codepoint_t INVALID = HB_MAP_VALUE_INVALID;
+
+  void clear ()
+  {
+    memset (items, 0xFF, ((size_t) mask + 1) * sizeof (item_t));
+    population = occupancy = 0;
+  }
+
+  bool is_empty () const { return population == 0; }
+
+  unsigned int get_population () const { return population; }
+
+  protected:
+
+  unsigned int bucket_for (hb_codepoint_t key) const
+  {
+    unsigned int i = Hash (key) % prime;
+    unsigned int step = 0;
+    unsigned int tombstone = INVALID;
+    while (!items[i].is_unused ())
+    {
+      if (items[i].key == key)
+        return i;
+      if (tombstone == INVALID && items[i].is_tombstone ())
+        tombstone = i;
+      i = (i + ++step) & mask;
+    }
+    return tombstone == INVALID ? i : tombstone;
+  }
+
+  static unsigned int prime_for (unsigned int shift)
+  {
+    /* Following comment and table copied from glib. */
+    /* Each table size has an associated prime modulo (the first prime
+     * lower than the table size) used to find the initial bucket. Probing
+     * then works modulo 2^n. The prime modulo is necessary to get a
+     * good distribution with poor hash functions.
+     */
+    /* Not declaring static to make all kinds of compilers happy... */
+    /*static*/ const unsigned int prime_mod [32] =
+    {
+      1,          /* For 1 << 0 */
+      2,
+      3,
+      7,
+      13,
+      31,
+      61,
+      127,
+      251,
+      509,
+      1021,
+      2039,
+      4093,
+      8191,
+      16381,
+      32749,
+      65521,      /* For 1 << 16 */
+      131071,
+      262139,
+      524287,
+      1048573,
+      2097143,
+      4194301,
+      8388593,
+      16777213,
+      33554393,
+      67108859,
+      134217689,
+      268435399,
+      536870909,
+      1073741789,
+      2147483647  /* For 1 << 31 */
+    };
+
+    if (unlikely (shift >= ARRAY_LENGTH (prime_mod)))
+      return prime_mod[ARRAY_LENGTH (prime_mod) - 1];
+
+    return prime_mod[shift];
+  }
+};
+
+
+#endif /* HB_MAP_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-mutex.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-mutex.hh
new file mode 100644
index 0000000..35f1fde
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-mutex.hh
@@ -0,0 +1,149 @@
+/*
+ * Copyright © 2007  Chris Wilson
+ * Copyright © 2009,2010  Red Hat, Inc.
+ * Copyright © 2011,2012  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.
+ *
+ * Contributor(s):
+ *	Chris Wilson <chris@chris-wilson.co.uk>
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_MUTEX_HH
+#define HB_MUTEX_HH
+
+#include "hb.hh"
+
+
+/* mutex */
+
+/* We need external help for these */
+
+#if defined(HB_MUTEX_IMPL_INIT) \
+ && defined(hb_mutex_impl_init) \
+ && defined(hb_mutex_impl_lock) \
+ && defined(hb_mutex_impl_unlock) \
+ && defined(hb_mutex_impl_finish)
+
+/* Defined externally, i.e. in config.h; must have typedef'ed hb_mutex_impl_t as well. */
+
+
+#elif !defined(HB_NO_MT) && defined(_WIN32)
+
+#include <windows.h>
+typedef CRITICAL_SECTION hb_mutex_impl_t;
+#define HB_MUTEX_IMPL_INIT	{0}
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+#define hb_mutex_impl_init(M)	InitializeCriticalSectionEx (M, 0, 0)
+#else
+#define hb_mutex_impl_init(M)	InitializeCriticalSection (M)
+#endif
+#define hb_mutex_impl_lock(M)	EnterCriticalSection (M)
+#define hb_mutex_impl_unlock(M)	LeaveCriticalSection (M)
+#define hb_mutex_impl_finish(M)	DeleteCriticalSection (M)
+
+
+#elif !defined(HB_NO_MT) && (defined(HAVE_PTHREAD) || defined(__APPLE__))
+
+#include <pthread.h>
+typedef pthread_mutex_t hb_mutex_impl_t;
+#define HB_MUTEX_IMPL_INIT	PTHREAD_MUTEX_INITIALIZER
+#define hb_mutex_impl_init(M)	pthread_mutex_init (M, nullptr)
+#define hb_mutex_impl_lock(M)	pthread_mutex_lock (M)
+#define hb_mutex_impl_unlock(M)	pthread_mutex_unlock (M)
+#define hb_mutex_impl_finish(M)	pthread_mutex_destroy (M)
+
+
+#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)
+
+#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_YIELD)
+# include <sched.h>
+# define HB_SCHED_YIELD() sched_yield ()
+#else
+# define HB_SCHED_YIELD() HB_STMT_START {} HB_STMT_END
+#endif
+
+/* This actually is not a totally awful implementation. */
+typedef volatile int hb_mutex_impl_t;
+#define HB_MUTEX_IMPL_INIT	0
+#define hb_mutex_impl_init(M)	*(M) = 0
+#define hb_mutex_impl_lock(M)	HB_STMT_START { while (__sync_lock_test_and_set((M), 1)) HB_SCHED_YIELD (); } HB_STMT_END
+#define hb_mutex_impl_unlock(M)	__sync_lock_release (M)
+#define hb_mutex_impl_finish(M)	HB_STMT_START {} HB_STMT_END
+
+
+#elif !defined(HB_NO_MT)
+
+#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_YIELD)
+# include <sched.h>
+# define HB_SCHED_YIELD() sched_yield ()
+#else
+# define HB_SCHED_YIELD() HB_STMT_START {} HB_STMT_END
+#endif
+
+#define HB_MUTEX_INT_NIL 1 /* Warn that fallback implementation is in use. */
+typedef volatile int hb_mutex_impl_t;
+#define HB_MUTEX_IMPL_INIT	0
+#define hb_mutex_impl_init(M)	*(M) = 0
+#define hb_mutex_impl_lock(M)	HB_STMT_START { while (*(M)) HB_SCHED_YIELD (); (*(M))++; } HB_STMT_END
+#define hb_mutex_impl_unlock(M)	(*(M))--;
+#define hb_mutex_impl_finish(M)	HB_STMT_START {} HB_STMT_END
+
+
+#else /* HB_NO_MT */
+
+typedef int hb_mutex_impl_t;
+#define HB_MUTEX_IMPL_INIT	0
+#define hb_mutex_impl_init(M)	HB_STMT_START {} HB_STMT_END
+#define hb_mutex_impl_lock(M)	HB_STMT_START {} HB_STMT_END
+#define hb_mutex_impl_unlock(M)	HB_STMT_START {} HB_STMT_END
+#define hb_mutex_impl_finish(M)	HB_STMT_START {} HB_STMT_END
+
+
+#endif
+
+
+#define HB_MUTEX_INIT		{HB_MUTEX_IMPL_INIT}
+
+struct hb_mutex_t
+{
+  /* TODO Add tracing. */
+
+  hb_mutex_impl_t m;
+
+  void init   () { hb_mutex_impl_init   (&m); }
+  void lock   () { hb_mutex_impl_lock   (&m); }
+  void unlock () { hb_mutex_impl_unlock (&m); }
+  void fini ()   { hb_mutex_impl_finish (&m); }
+};
+
+struct hb_lock_t
+{
+  hb_lock_t (hb_mutex_t &mutex_) : mutex (mutex_) { mutex.lock (); }
+  ~hb_lock_t () { mutex.unlock (); }
+  private:
+  hb_mutex_t &mutex;
+};
+
+
+#endif /* HB_MUTEX_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-null.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-null.hh
new file mode 100644
index 0000000..204c2fe
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-null.hh
@@ -0,0 +1,204 @@
+/*
+ * Copyright © 2018  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_NULL_HH
+#define HB_NULL_HH
+
+#include "hb.hh"
+
+
+/*
+ * Static pools
+ */
+
+/* Global nul-content Null pool.  Enlarge as necessary. */
+
+#define HB_NULL_POOL_SIZE 9880
+
+/* Use SFINAE to sniff whether T has min_size; in which case return T::null_size,
+ * otherwise return sizeof(T). */
+
+/* The hard way...
+ * https://stackoverflow.com/questions/7776448/sfinae-tried-with-bool-gives-compiler-error-template-argument-tvalue-invol
+ */
+
+template<bool> struct _hb_bool_type {};
+
+template <typename T, typename B>
+struct _hb_null_size
+{ enum { value = sizeof (T) }; };
+template <typename T>
+struct _hb_null_size<T, _hb_bool_type<(bool) (1 + (unsigned int) T::min_size)> >
+{ enum { value = T::null_size }; };
+
+template <typename T>
+struct hb_null_size
+{ enum { value = _hb_null_size<T, _hb_bool_type<true> >::value }; };
+#define hb_null_size(T) hb_null_size<T>::value
+
+/* These doesn't belong here, but since is copy/paste from above, put it here. */
+
+/* hb_static_size (T)
+ * Returns T::static_size if T::min_size is defined, or sizeof (T) otherwise. */
+
+template <typename T, typename B>
+struct _hb_static_size
+{ enum { value = sizeof (T) }; };
+template <typename T>
+struct _hb_static_size<T, _hb_bool_type<(bool) (1 + (unsigned int) T::min_size)> >
+{ enum { value = T::static_size }; };
+
+template <typename T>
+struct hb_static_size
+{ enum { value = _hb_static_size<T, _hb_bool_type<true> >::value }; };
+#define hb_static_size(T) hb_static_size<T>::value
+
+
+/* hb_assign (obj, value)
+ * Calls obj.set (value) if obj.min_size is defined and value has different type
+ * from obj, or obj = v otherwise. */
+
+template <typename T, typename V, typename B>
+struct _hb_assign
+{ static inline void value (T &o, const V v) { o = v; } };
+template <typename T, typename V>
+struct _hb_assign<T, V, _hb_bool_type<(bool) (1 + (unsigned int) T::min_size)> >
+{ static inline void value (T &o, const V v) { o.set (v); } };
+template <typename T>
+struct _hb_assign<T, T, _hb_bool_type<(bool) (1 + (unsigned int) T::min_size)> >
+{ static inline void value (T &o, const T v) { o = v; } };
+
+template <typename T, typename V>
+static inline void hb_assign (T &o, const V v)
+{ _hb_assign<T, V, _hb_bool_type<true> >::value (o, v); }
+
+
+/*
+ * Null()
+ */
+
+extern HB_INTERNAL
+hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)];
+
+/* Generic nul-content Null objects. */
+template <typename Type>
+static inline Type const & Null () {
+  static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
+  return *reinterpret_cast<Type const *> (_hb_NullPool);
+}
+template <typename QType>
+struct NullHelper
+{
+  typedef typename hb_remove_const (typename hb_remove_reference (QType)) Type;
+  static const Type & get_null () { return Null<Type> (); }
+};
+#define Null(Type) NullHelper<Type>::get_null ()
+
+/* Specializations for arbitrary-content Null objects expressed in bytes. */
+#define DECLARE_NULL_NAMESPACE_BYTES(Namespace, Type) \
+	} /* Close namespace. */ \
+	extern HB_INTERNAL const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::null_size]; \
+	template <> \
+	/*static*/ inline const Namespace::Type& Null<Namespace::Type> () { \
+	  return *reinterpret_cast<const Namespace::Type *> (_hb_Null_##Namespace##_##Type); \
+	} \
+	namespace Namespace { \
+	static_assert (true, "Just so we take semicolon after.")
+#define DEFINE_NULL_NAMESPACE_BYTES(Namespace, Type) \
+	const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::null_size]
+
+/* Specializations for arbitrary-content Null objects expressed as struct initializer. */
+#define DECLARE_NULL_INSTANCE(Type) \
+	extern HB_INTERNAL const Type _hb_Null_##Type; \
+	template <> \
+	/*static*/ inline const Type& Null<Type> () { \
+	  return _hb_Null_##Type; \
+	} \
+static_assert (true, "Just so we take semicolon after.")
+#define DEFINE_NULL_INSTANCE(Type) \
+	const Type _hb_Null_##Type
+
+/* Global writable pool.  Enlarge as necessary. */
+
+/* To be fully correct, CrapPool must be thread_local. However, we do not rely on CrapPool
+ * for correct operation. It only exist to catch and divert program logic bugs instead of
+ * causing bad memory access. So, races there are not actually introducing incorrectness
+ * in the code. Has ~12kb binary size overhead to have it, also clang build fails with it. */
+extern HB_INTERNAL
+/*thread_local*/ hb_vector_size_impl_t _hb_CrapPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)];
+
+/* CRAP pool: Common Region for Access Protection. */
+template <typename Type>
+static inline Type& Crap () {
+  static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
+  Type *obj = reinterpret_cast<Type *> (_hb_CrapPool);
+  memcpy (obj, &Null(Type), sizeof (*obj));
+  return *obj;
+}
+template <typename QType>
+struct CrapHelper
+{
+  typedef typename hb_remove_const (typename hb_remove_reference (QType)) Type;
+  static Type & get_crap () { return Crap<Type> (); }
+};
+#define Crap(Type) CrapHelper<Type>::get_crap ()
+
+template <typename Type>
+struct CrapOrNullHelper {
+  static Type & get () { return Crap(Type); }
+};
+template <typename Type>
+struct CrapOrNullHelper<const Type> {
+  static const Type & get () { return Null(Type); }
+};
+#define CrapOrNull(Type) CrapOrNullHelper<Type>::get ()
+
+
+/*
+ * hb_nonnull_ptr_t
+ */
+
+template <typename P>
+struct hb_nonnull_ptr_t
+{
+  typedef typename hb_remove_pointer (P) T;
+
+  hb_nonnull_ptr_t (T *v_ = nullptr) : v (v_) {}
+  T * operator = (T *v_)   { return v = v_; }
+  T * operator -> () const { return get (); }
+  T & operator * () const  { return *get (); }
+  T ** operator & () const { return &v; }
+  /* Only auto-cast to const types. */
+  template <typename C> operator const C * () const { return get (); }
+  operator const char * () const { return (const char *) get (); }
+  T * get () const { return v ? v : const_cast<T *> (&Null(T)); }
+  T * get_raw () const { return v; }
+
+  T *v;
+};
+
+
+#endif /* HB_NULL_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-object.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-object.hh
new file mode 100644
index 0000000..68520f2
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-object.hh
@@ -0,0 +1,342 @@
+/*
+ * Copyright © 2007  Chris Wilson
+ * Copyright © 2009,2010  Red Hat, Inc.
+ * Copyright © 2011,2012  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.
+ *
+ * Contributor(s):
+ *	Chris Wilson <chris@chris-wilson.co.uk>
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OBJECT_HH
+#define HB_OBJECT_HH
+
+#include "hb.hh"
+#include "hb-atomic.hh"
+#include "hb-mutex.hh"
+#include "hb-vector.hh"
+
+
+/*
+ * Lockable set
+ */
+
+template <typename item_t, typename lock_t>
+struct hb_lockable_set_t
+{
+  hb_vector_t<item_t> items;
+
+  void init () { items.init (); }
+
+  template <typename T>
+  item_t *replace_or_insert (T v, lock_t &l, bool replace)
+  {
+    l.lock ();
+    item_t *item = items.find (v);
+    if (item) {
+      if (replace) {
+	item_t old = *item;
+	*item = v;
+	l.unlock ();
+	old.fini ();
+      }
+      else {
+        item = nullptr;
+	l.unlock ();
+      }
+    } else {
+      item = items.push (v);
+      l.unlock ();
+    }
+    return item;
+  }
+
+  template <typename T>
+  void remove (T v, lock_t &l)
+  {
+    l.lock ();
+    item_t *item = items.find (v);
+    if (item)
+    {
+      item_t old = *item;
+      *item = items[items.length - 1];
+      items.pop ();
+      l.unlock ();
+      old.fini ();
+    } else {
+      l.unlock ();
+    }
+  }
+
+  template <typename T>
+  bool find (T v, item_t *i, lock_t &l)
+  {
+    l.lock ();
+    item_t *item = items.find (v);
+    if (item)
+      *i = *item;
+    l.unlock ();
+    return !!item;
+  }
+
+  template <typename T>
+  item_t *find_or_insert (T v, lock_t &l)
+  {
+    l.lock ();
+    item_t *item = items.find (v);
+    if (!item) {
+      item = items.push (v);
+    }
+    l.unlock ();
+    return item;
+  }
+
+  void fini (lock_t &l)
+  {
+    if (!items.length)
+    {
+      /* No need to lock. */
+      items.fini ();
+      return;
+    }
+    l.lock ();
+    while (items.length)
+    {
+      item_t old = items[items.length - 1];
+      items.pop ();
+      l.unlock ();
+      old.fini ();
+      l.lock ();
+    }
+    items.fini ();
+    l.unlock ();
+  }
+
+};
+
+
+/*
+ * Reference-count.
+ */
+
+#define HB_REFERENCE_COUNT_INERT_VALUE 0
+#define HB_REFERENCE_COUNT_POISON_VALUE -0x0000DEAD
+#define HB_REFERENCE_COUNT_INIT {HB_ATOMIC_INT_INIT (HB_REFERENCE_COUNT_INERT_VALUE)}
+
+struct hb_reference_count_t
+{
+  mutable hb_atomic_int_t ref_count;
+
+  void init (int v = 1) { ref_count.set_relaxed (v); }
+  int get_relaxed () const { return ref_count.get_relaxed (); }
+  int inc () const { return ref_count.inc (); }
+  int dec () const { return ref_count.dec (); }
+  void fini () { ref_count.set_relaxed (HB_REFERENCE_COUNT_POISON_VALUE); }
+
+  bool is_inert () const { return ref_count.get_relaxed () == HB_REFERENCE_COUNT_INERT_VALUE; }
+  bool is_valid () const { return ref_count.get_relaxed () > 0; }
+};
+
+
+/* user_data */
+
+struct hb_user_data_array_t
+{
+  struct hb_user_data_item_t {
+    hb_user_data_key_t *key;
+    void *data;
+    hb_destroy_func_t destroy;
+
+    bool operator == (hb_user_data_key_t *other_key) const { return key == other_key; }
+    bool operator == (hb_user_data_item_t &other) const { return key == other.key; }
+
+    void fini () { if (destroy) destroy (data); }
+  };
+
+  hb_mutex_t lock;
+  hb_lockable_set_t<hb_user_data_item_t, hb_mutex_t> items;
+
+  void init () { lock.init (); items.init (); }
+
+  HB_INTERNAL bool set (hb_user_data_key_t *key,
+			void *              data,
+			hb_destroy_func_t   destroy,
+			hb_bool_t           replace);
+
+  HB_INTERNAL void *get (hb_user_data_key_t *key);
+
+  void fini () { items.fini (lock); lock.fini (); }
+};
+
+
+/*
+ * Object header
+ */
+
+struct hb_object_header_t
+{
+  hb_reference_count_t ref_count;
+  mutable hb_atomic_int_t writable;
+  hb_atomic_ptr_t<hb_user_data_array_t> user_data;
+};
+#define HB_OBJECT_HEADER_STATIC \
+	{ \
+	  HB_REFERENCE_COUNT_INIT, \
+	  HB_ATOMIC_INT_INIT (false), \
+	  HB_ATOMIC_PTR_INIT (nullptr) \
+	}
+
+
+/*
+ * Object
+ */
+
+template <typename Type>
+static inline void hb_object_trace (const Type *obj, const char *function)
+{
+  DEBUG_MSG (OBJECT, (void *) obj,
+	     "%s refcount=%d",
+	     function,
+	     obj ? obj->header.ref_count.get_relaxed () : 0);
+}
+
+template <typename Type>
+static inline Type *hb_object_create ()
+{
+  Type *obj = (Type *) calloc (1, sizeof (Type));
+
+  if (unlikely (!obj))
+    return obj;
+
+  hb_object_init (obj);
+  hb_object_trace (obj, HB_FUNC);
+  return obj;
+}
+template <typename Type>
+static inline void hb_object_init (Type *obj)
+{
+  obj->header.ref_count.init ();
+  obj->header.writable.set_relaxed (true);
+  obj->header.user_data.init ();
+}
+template <typename Type>
+static inline bool hb_object_is_inert (const Type *obj)
+{
+  return unlikely (obj->header.ref_count.is_inert ());
+}
+template <typename Type>
+static inline bool hb_object_is_valid (const Type *obj)
+{
+  return likely (obj->header.ref_count.is_valid ());
+}
+template <typename Type>
+static inline bool hb_object_is_immutable (const Type *obj)
+{
+  return !obj->header.writable.get_relaxed ();
+}
+template <typename Type>
+static inline void hb_object_make_immutable (const Type *obj)
+{
+  obj->header.writable.set_relaxed (false);
+}
+template <typename Type>
+static inline Type *hb_object_reference (Type *obj)
+{
+  hb_object_trace (obj, HB_FUNC);
+  if (unlikely (!obj || hb_object_is_inert (obj)))
+    return obj;
+  assert (hb_object_is_valid (obj));
+  obj->header.ref_count.inc ();
+  return obj;
+}
+template <typename Type>
+static inline bool hb_object_destroy (Type *obj)
+{
+  hb_object_trace (obj, HB_FUNC);
+  if (unlikely (!obj || hb_object_is_inert (obj)))
+    return false;
+  assert (hb_object_is_valid (obj));
+  if (obj->header.ref_count.dec () != 1)
+    return false;
+
+  hb_object_fini (obj);
+  return true;
+}
+template <typename Type>
+static inline void hb_object_fini (Type *obj)
+{
+  obj->header.ref_count.fini (); /* Do this before user_data */
+  hb_user_data_array_t *user_data = obj->header.user_data.get ();
+  if (user_data)
+  {
+    user_data->fini ();
+    free (user_data);
+    user_data = nullptr;
+  }
+}
+template <typename Type>
+static inline bool hb_object_set_user_data (Type               *obj,
+					    hb_user_data_key_t *key,
+					    void *              data,
+					    hb_destroy_func_t   destroy,
+					    hb_bool_t           replace)
+{
+  if (unlikely (!obj || hb_object_is_inert (obj)))
+    return false;
+  assert (hb_object_is_valid (obj));
+
+retry:
+  hb_user_data_array_t *user_data = obj->header.user_data.get ();
+  if (unlikely (!user_data))
+  {
+    user_data = (hb_user_data_array_t *) calloc (sizeof (hb_user_data_array_t), 1);
+    if (unlikely (!user_data))
+      return false;
+    user_data->init ();
+    if (unlikely (!obj->header.user_data.cmpexch (nullptr, user_data)))
+    {
+      user_data->fini ();
+      free (user_data);
+      goto retry;
+    }
+  }
+
+  return user_data->set (key, data, destroy, replace);
+}
+
+template <typename Type>
+static inline void *hb_object_get_user_data (Type               *obj,
+					     hb_user_data_key_t *key)
+{
+  if (unlikely (!obj || hb_object_is_inert (obj)))
+    return nullptr;
+  assert (hb_object_is_valid (obj));
+  hb_user_data_array_t *user_data = obj->header.user_data.get ();
+  if (!user_data)
+    return nullptr;
+  return user_data->get (key);
+}
+
+
+#endif /* HB_OBJECT_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-open-file.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-open-file.hh
new file mode 100644
index 0000000..32a223c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-open-file.hh
@@ -0,0 +1,525 @@
+/*
+ * Copyright © 2007,2008,2009  Red Hat, Inc.
+ * Copyright © 2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OPEN_FILE_HH
+#define HB_OPEN_FILE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-head-table.hh"
+
+
+namespace OT {
+
+
+/*
+ *
+ * The OpenType Font File
+ *
+ */
+
+
+/*
+ * Organization of an OpenType Font
+ */
+
+struct OpenTypeFontFile;
+struct OffsetTable;
+struct TTCHeader;
+
+
+typedef struct TableRecord
+{
+  int cmp (Tag t) const { return -t.cmp (tag); }
+
+  static int cmp (const void *pa, const void *pb)
+  {
+    const TableRecord *a = (const TableRecord *) pa;
+    const TableRecord *b = (const TableRecord *) pb;
+    return b->cmp (a->tag);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  Tag		tag;		/* 4-byte identifier. */
+  CheckSum	checkSum;	/* CheckSum for this table. */
+  Offset32	offset;		/* Offset from beginning of TrueType font
+				 * file. */
+  HBUINT32	length;		/* Length of this table. */
+  public:
+  DEFINE_SIZE_STATIC (16);
+} OpenTypeTable;
+
+typedef struct OffsetTable
+{
+  friend struct OpenTypeFontFile;
+
+  unsigned int get_table_count () const { return tables.len; }
+  const TableRecord& get_table (unsigned int i) const
+  { return tables[i]; }
+  unsigned int get_table_tags (unsigned int  start_offset,
+				      unsigned int *table_count, /* IN/OUT */
+				      hb_tag_t     *table_tags /* OUT */) const
+  {
+    if (table_count)
+    {
+      if (start_offset >= tables.len)
+        *table_count = 0;
+      else
+        *table_count = MIN<unsigned int> (*table_count, tables.len - start_offset);
+
+      const TableRecord *sub_tables = tables.arrayZ + start_offset;
+      unsigned int count = *table_count;
+      for (unsigned int i = 0; i < count; i++)
+	table_tags[i] = sub_tables[i].tag;
+    }
+    return tables.len;
+  }
+  bool find_table_index (hb_tag_t tag, unsigned int *table_index) const
+  {
+    Tag t;
+    t.set (tag);
+    return tables.bfind (t, table_index, HB_BFIND_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
+  }
+  const TableRecord& get_table_by_tag (hb_tag_t tag) const
+  {
+    unsigned int table_index;
+    find_table_index (tag, &table_index);
+    return get_table (table_index);
+  }
+
+  public:
+
+  template <typename item_t>
+  bool serialize (hb_serialize_context_t *c,
+		  hb_tag_t sfnt_tag,
+		  hb_array_t<item_t> items)
+  {
+    TRACE_SERIALIZE (this);
+    /* Alloc 12 for the OTHeader. */
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    /* Write sfntVersion (bytes 0..3). */
+    sfnt_version.set (sfnt_tag);
+    /* Take space for numTables, searchRange, entrySelector, RangeShift
+     * and the TableRecords themselves.  */
+    if (unlikely (!tables.serialize (c, items.length))) return_trace (false);
+
+    const char *dir_end = (const char *) c->head;
+    HBUINT32 *checksum_adjustment = nullptr;
+
+    /* Write OffsetTables, alloc for and write actual table blobs. */
+    for (unsigned int i = 0; i < tables.len; i++)
+    {
+      TableRecord &rec = tables.arrayZ[i];
+      hb_blob_t *blob = items[i].blob;
+      rec.tag.set (items[i].tag);
+      rec.length.set (hb_blob_get_length (blob));
+      rec.offset.serialize (c, this);
+
+      /* Allocate room for the table and copy it. */
+      char *start = (char *) c->allocate_size<void> (rec.length);
+      if (unlikely (!start)) {return false;}
+
+      memcpy (start, hb_blob_get_data (blob, nullptr), rec.length);
+
+      /* 4-byte alignment. */
+      c->align (4);
+      const char *end = (const char *) c->head;
+
+      if (items[i].tag == HB_OT_TAG_head &&
+	  (unsigned) (end - start) >= head::static_size)
+      {
+	head *h = (head *) start;
+	checksum_adjustment = &h->checkSumAdjustment;
+	checksum_adjustment->set (0);
+      }
+
+      rec.checkSum.set_for_data (start, end - start);
+    }
+
+    tables.qsort ();
+
+    if (checksum_adjustment)
+    {
+      CheckSum checksum;
+
+      /* The following line is a slower version of the following block. */
+      //checksum.set_for_data (this, (const char *) c->head - (const char *) this);
+      checksum.set_for_data (this, dir_end - (const char *) this);
+      for (unsigned int i = 0; i < items.length; i++)
+      {
+	TableRecord &rec = tables.arrayZ[i];
+	checksum.set (checksum + rec.checkSum);
+      }
+
+      checksum_adjustment->set (0xB1B0AFBAu - checksum);
+    }
+
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && tables.sanitize (c));
+  }
+
+  protected:
+  Tag		sfnt_version;	/* '\0\001\0\00' if TrueType / 'OTTO' if CFF */
+  BinSearchArrayOf<TableRecord>
+		tables;
+  public:
+  DEFINE_SIZE_ARRAY (12, tables);
+} OpenTypeFontFace;
+
+
+/*
+ * TrueType Collections
+ */
+
+struct TTCHeaderVersion1
+{
+  friend struct TTCHeader;
+
+  unsigned int get_face_count () const { return table.len; }
+  const OpenTypeFontFace& get_face (unsigned int i) const { return this+table[i]; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (table.sanitize (c, this));
+  }
+
+  protected:
+  Tag		ttcTag;		/* TrueType Collection ID string: 'ttcf' */
+  FixedVersion<>version;	/* Version of the TTC Header (1.0),
+				 * 0x00010000u */
+  LArrayOf<LOffsetTo<OffsetTable> >
+		table;		/* Array of offsets to the OffsetTable for each font
+				 * from the beginning of the file */
+  public:
+  DEFINE_SIZE_ARRAY (12, table);
+};
+
+struct TTCHeader
+{
+  friend struct OpenTypeFontFile;
+
+  private:
+
+  unsigned int get_face_count () const
+  {
+    switch (u.header.version.major) {
+    case 2: /* version 2 is compatible with version 1 */
+    case 1: return u.version1.get_face_count ();
+    default:return 0;
+    }
+  }
+  const OpenTypeFontFace& get_face (unsigned int i) const
+  {
+    switch (u.header.version.major) {
+    case 2: /* version 2 is compatible with version 1 */
+    case 1: return u.version1.get_face (i);
+    default:return Null(OpenTypeFontFace);
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!u.header.version.sanitize (c))) return_trace (false);
+    switch (u.header.version.major) {
+    case 2: /* version 2 is compatible with version 1 */
+    case 1: return_trace (u.version1.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  protected:
+  union {
+  struct {
+  Tag		ttcTag;		/* TrueType Collection ID string: 'ttcf' */
+  FixedVersion<>version;	/* Version of the TTC Header (1.0 or 2.0),
+				 * 0x00010000u or 0x00020000u */
+  }			header;
+  TTCHeaderVersion1	version1;
+  } u;
+};
+
+/*
+ * Mac Resource Fork
+ *
+ * http://mirror.informatimago.com/next/developer.apple.com/documentation/mac/MoreToolbox/MoreToolbox-99.html
+ */
+
+struct ResourceRecord
+{
+  const OpenTypeFontFace & get_face (const void *data_base) const
+  { return CastR<OpenTypeFontFace> ((data_base+offset).arrayZ); }
+
+  bool sanitize (hb_sanitize_context_t *c,
+			const void *data_base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  offset.sanitize (c, data_base) &&
+		  get_face (data_base).sanitize (c));
+  }
+
+  protected:
+  HBUINT16	id;		/* Resource ID. */
+  HBINT16	nameOffset;	/* Offset from beginning of resource name list
+				 * to resource name, -1 means there is none. */
+  HBUINT8	attrs;		/* Resource attributes */
+  NNOffsetTo<LArrayOf<HBUINT8>, HBUINT24>
+		offset;		/* Offset from beginning of data block to
+				 * data for this resource */
+  HBUINT32	reserved;	/* Reserved for handle to resource */
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+#define HB_TAG_sfnt HB_TAG ('s','f','n','t')
+
+struct ResourceTypeRecord
+{
+  unsigned int get_resource_count () const
+  { return tag == HB_TAG_sfnt ? resCountM1 + 1 : 0; }
+
+  bool is_sfnt () const { return tag == HB_TAG_sfnt; }
+
+  const ResourceRecord& get_resource_record (unsigned int i,
+					     const void *type_base) const
+  { return (type_base+resourcesZ).as_array (get_resource_count ())[i]; }
+
+  bool sanitize (hb_sanitize_context_t *c,
+		 const void *type_base,
+		 const void *data_base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  resourcesZ.sanitize (c, type_base,
+				       get_resource_count (),
+				       data_base));
+  }
+
+  protected:
+  Tag		tag;		/* Resource type. */
+  HBUINT16	resCountM1;	/* Number of resources minus 1. */
+  NNOffsetTo<UnsizedArrayOf<ResourceRecord> >
+		resourcesZ;	/* Offset from beginning of resource type list
+				 * to reference item list for this type. */
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct ResourceMap
+{
+  unsigned int get_face_count () const
+  {
+    unsigned int count = get_type_count ();
+    for (unsigned int i = 0; i < count; i++)
+    {
+      const ResourceTypeRecord& type = get_type_record (i);
+      if (type.is_sfnt ())
+	return type.get_resource_count ();
+    }
+    return 0;
+  }
+
+  const OpenTypeFontFace& get_face (unsigned int idx,
+				    const void *data_base) const
+  {
+    unsigned int count = get_type_count ();
+    for (unsigned int i = 0; i < count; i++)
+    {
+      const ResourceTypeRecord& type = get_type_record (i);
+      /* The check for idx < count is here because ResourceRecord is NOT null-safe.
+       * Because an offset of 0 there does NOT mean null. */
+      if (type.is_sfnt () && idx < type.get_resource_count ())
+	return type.get_resource_record (idx, &(this+typeList)).get_face (data_base);
+    }
+    return Null (OpenTypeFontFace);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *data_base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  typeList.sanitize (c, this,
+				     &(this+typeList),
+				     data_base));
+  }
+
+  private:
+  unsigned int get_type_count () const { return (this+typeList).lenM1 + 1; }
+
+  const ResourceTypeRecord& get_type_record (unsigned int i) const
+  { return (this+typeList)[i]; }
+
+  protected:
+  HBUINT8	reserved0[16];	/* Reserved for copy of resource header */
+  HBUINT32	reserved1;	/* Reserved for handle to next resource map */
+  HBUINT16	resreved2;	/* Reserved for file reference number */
+  HBUINT16	attrs;		/* Resource fork attribute */
+  NNOffsetTo<ArrayOfM1<ResourceTypeRecord> >
+		typeList;	/* Offset from beginning of map to
+				 * resource type list */
+  Offset16	nameList;	/* Offset from beginning of map to
+				 * resource name list */
+  public:
+  DEFINE_SIZE_STATIC (28);
+};
+
+struct ResourceForkHeader
+{
+  unsigned int get_face_count () const
+  { return (this+map).get_face_count (); }
+
+  const OpenTypeFontFace& get_face (unsigned int idx,
+				    unsigned int *base_offset = nullptr) const
+  {
+    const OpenTypeFontFace &face = (this+map).get_face (idx, &(this+data));
+    if (base_offset)
+      *base_offset = (const char *) &face - (const char *) this;
+    return face;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  data.sanitize (c, this, dataLen) &&
+		  map.sanitize (c, this, &(this+data)));
+  }
+
+  protected:
+  LNNOffsetTo<UnsizedArrayOf<HBUINT8> >
+		data;		/* Offset from beginning of resource fork
+				 * to resource data */
+  LNNOffsetTo<ResourceMap >
+		map;		/* Offset from beginning of resource fork
+				 * to resource map */
+  HBUINT32	dataLen;	/* Length of resource data */
+  HBUINT32	mapLen;		/* Length of resource map */
+  public:
+  DEFINE_SIZE_STATIC (16);
+};
+
+/*
+ * OpenType Font File
+ */
+
+struct OpenTypeFontFile
+{
+  enum {
+    CFFTag		= HB_TAG ('O','T','T','O'), /* OpenType with Postscript outlines */
+    TrueTypeTag		= HB_TAG ( 0 , 1 , 0 , 0 ), /* OpenType with TrueType outlines */
+    TTCTag		= HB_TAG ('t','t','c','f'), /* TrueType Collection */
+    DFontTag		= HB_TAG ( 0 , 0 , 1 , 0 ), /* DFont Mac Resource Fork */
+    TrueTag		= HB_TAG ('t','r','u','e'), /* Obsolete Apple TrueType */
+    Typ1Tag		= HB_TAG ('t','y','p','1')  /* Obsolete Apple Type1 font in SFNT container */
+  };
+
+  hb_tag_t get_tag () const { return u.tag; }
+
+  unsigned int get_face_count () const
+  {
+    switch (u.tag) {
+    case CFFTag:	/* All the non-collection tags */
+    case TrueTag:
+    case Typ1Tag:
+    case TrueTypeTag:	return 1;
+    case TTCTag:	return u.ttcHeader.get_face_count ();
+    case DFontTag:	return u.rfHeader.get_face_count ();
+    default:		return 0;
+    }
+  }
+  const OpenTypeFontFace& get_face (unsigned int i, unsigned int *base_offset = nullptr) const
+  {
+    if (base_offset)
+      *base_offset = 0;
+    switch (u.tag) {
+    /* Note: for non-collection SFNT data we ignore index.  This is because
+     * Apple dfont container is a container of SFNT's.  So each SFNT is a
+     * non-TTC, but the index is more than zero. */
+    case CFFTag:	/* All the non-collection tags */
+    case TrueTag:
+    case Typ1Tag:
+    case TrueTypeTag:	return u.fontFace;
+    case TTCTag:	return u.ttcHeader.get_face (i);
+    case DFontTag:	return u.rfHeader.get_face (i, base_offset);
+    default:		return Null(OpenTypeFontFace);
+    }
+  }
+
+  template <typename item_t>
+  bool serialize_single (hb_serialize_context_t *c,
+			 hb_tag_t sfnt_tag,
+			 hb_array_t<item_t> items)
+  {
+    TRACE_SERIALIZE (this);
+    assert (sfnt_tag != TTCTag);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    return_trace (u.fontFace.serialize (c, sfnt_tag, items));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!u.tag.sanitize (c))) return_trace (false);
+    switch (u.tag) {
+    case CFFTag:	/* All the non-collection tags */
+    case TrueTag:
+    case Typ1Tag:
+    case TrueTypeTag:	return_trace (u.fontFace.sanitize (c));
+    case TTCTag:	return_trace (u.ttcHeader.sanitize (c));
+    case DFontTag:	return_trace (u.rfHeader.sanitize (c));
+    default:		return_trace (true);
+    }
+  }
+
+  protected:
+  union {
+  Tag			tag;		/* 4-byte identifier. */
+  OpenTypeFontFace	fontFace;
+  TTCHeader		ttcHeader;
+  ResourceForkHeader	rfHeader;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (4, tag);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OPEN_FILE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-open-type.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-open-type.hh
new file mode 100644
index 0000000..6abb898
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-open-type.hh
@@ -0,0 +1,1008 @@
+/*
+ * Copyright © 2007,2008,2009,2010  Red Hat, Inc.
+ * Copyright © 2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OPEN_TYPE_HH
+#define HB_OPEN_TYPE_HH
+
+#include "hb.hh"
+#include "hb-blob.hh"
+#include "hb-face.hh"
+#include "hb-machinery.hh"
+#include "hb-subset.hh"
+
+
+namespace OT {
+
+
+/*
+ *
+ * The OpenType Font File: Data Types
+ */
+
+
+/* "The following data types are used in the OpenType font file.
+ *  All OpenType fonts use Motorola-style byte ordering (Big Endian):" */
+
+/*
+ * Int types
+ */
+
+template <bool is_signed> struct hb_signedness_int;
+template <> struct hb_signedness_int<false> { typedef unsigned int value; };
+template <> struct hb_signedness_int<true>  { typedef   signed int value; };
+
+/* Integer types in big-endian order and no alignment requirement */
+template <typename Type, unsigned int Size>
+struct IntType
+{
+  typedef Type type;
+  typedef typename hb_signedness_int<hb_is_signed<Type>::value>::value wide_type;
+
+  void set (wide_type i) { v.set (i); }
+  operator wide_type () const { return v; }
+  bool operator == (const IntType<Type,Size> &o) const { return (Type) v == (Type) o.v; }
+  bool operator != (const IntType<Type,Size> &o) const { return !(*this == o); }
+  static int cmp (const IntType<Type,Size> *a, const IntType<Type,Size> *b) { return b->cmp (*a); }
+  template <typename Type2>
+  int cmp (Type2 a) const
+  {
+    Type b = v;
+    if (sizeof (Type) < sizeof (int) && sizeof (Type2) < sizeof (int))
+      return (int) a - (int) b;
+    else
+      return a < b ? -1 : a == b ? 0 : +1;
+  }
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+  protected:
+  BEInt<Type, Size> v;
+  public:
+  DEFINE_SIZE_STATIC (Size);
+};
+
+typedef IntType<uint8_t,  1> HBUINT8;	/* 8-bit unsigned integer. */
+typedef IntType<int8_t,   1> HBINT8;	/* 8-bit signed integer. */
+typedef IntType<uint16_t, 2> HBUINT16;	/* 16-bit unsigned integer. */
+typedef IntType<int16_t,  2> HBINT16;	/* 16-bit signed integer. */
+typedef IntType<uint32_t, 4> HBUINT32;	/* 32-bit unsigned integer. */
+typedef IntType<int32_t,  4> HBINT32;	/* 32-bit signed integer. */
+/* Note: we cannot defined a signed HBINT24 because there's no corresponding C type.
+ * Works for unsigned, but not signed, since we rely on compiler for sign-extension. */
+typedef IntType<uint32_t, 3> HBUINT24;	/* 24-bit unsigned integer. */
+
+/* 16-bit signed integer (HBINT16) that describes a quantity in FUnits. */
+typedef HBINT16 FWORD;
+
+/* 32-bit signed integer (HBINT32) that describes a quantity in FUnits. */
+typedef HBINT32 FWORD32;
+
+/* 16-bit unsigned integer (HBUINT16) that describes a quantity in FUnits. */
+typedef HBUINT16 UFWORD;
+
+/* 16-bit signed fixed number with the low 14 bits of fraction (2.14). */
+struct F2DOT14 : HBINT16
+{
+  // 16384 means 1<<14
+  float to_float () const  { return ((int32_t) v) / 16384.f; }
+  void set_float (float f) { v.set (round (f * 16384.f)); }
+  public:
+  DEFINE_SIZE_STATIC (2);
+};
+
+/* 32-bit signed fixed-point number (16.16). */
+struct Fixed : HBINT32
+{
+  // 65536 means 1<<16
+  float to_float () const  { return ((int32_t) v) / 65536.f; }
+  void set_float (float f) { v.set (round (f * 65536.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
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+  protected:
+  HBINT32 major;
+  HBUINT32 minor;
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+/* Array of four uint8s (length = 32 bits) used to identify a script, language
+ * system, feature, or baseline */
+struct Tag : HBUINT32
+{
+  /* What the char* converters return is NOT nul-terminated.  Print using "%.4s" */
+  operator const char* () const { return reinterpret_cast<const char *> (&this->v); }
+  operator char* ()             { return reinterpret_cast<char *> (&this->v); }
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+/* Glyph index number, same as uint16 (length = 16 bits) */
+typedef HBUINT16 GlyphID;
+
+/* Script/language-system/feature index */
+struct Index : HBUINT16 {
+  static constexpr unsigned NOT_FOUND_INDEX = 0xFFFFu;
+};
+DECLARE_NULL_NAMESPACE_BYTES (OT, Index);
+
+typedef Index NameID;
+
+/* Offset, Null offset = 0 */
+template <typename Type, bool has_null=true>
+struct Offset : Type
+{
+  typedef Type type;
+
+  bool is_null () const { return has_null && 0 == *this; }
+
+  void *serialize (hb_serialize_context_t *c, const void *base)
+  {
+    void *t = c->start_embed<void> ();
+    this->set ((char *) t - (char *) base); /* TODO(serialize) Overflow? */
+    return t;
+  }
+
+  public:
+  DEFINE_SIZE_STATIC (sizeof (Type));
+};
+
+typedef Offset<HBUINT16> Offset16;
+typedef Offset<HBUINT32> Offset32;
+
+
+/* CheckSum */
+struct CheckSum : HBUINT32
+{
+  /* This is reference implementation from the spec. */
+  static uint32_t CalcTableChecksum (const HBUINT32 *Table, uint32_t Length)
+  {
+    uint32_t Sum = 0L;
+    assert (0 == (Length & 3));
+    const HBUINT32 *EndPtr = Table + Length / HBUINT32::static_size;
+
+    while (Table < EndPtr)
+      Sum += *Table++;
+    return Sum;
+  }
+
+  /* Note: data should be 4byte aligned and have 4byte padding at the end. */
+  void set_for_data (const void *data, unsigned int length)
+  { set (CalcTableChecksum ((const HBUINT32 *) data, length)); }
+
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+
+/*
+ * Version Numbers
+ */
+
+template <typename FixedType=HBUINT16>
+struct FixedVersion
+{
+  uint32_t to_int () const { return (major << (sizeof (FixedType) * 8)) + minor; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  FixedType major;
+  FixedType minor;
+  public:
+  DEFINE_SIZE_STATIC (2 * sizeof (FixedType));
+};
+
+
+/*
+ * Template subclasses of Offset that do the dereferencing.
+ * Use: (base+offset)
+ */
+
+template <typename Type, bool has_null>
+struct _hb_has_null
+{
+  static const Type *get_null () { return nullptr; }
+  static Type *get_crap ()       { return nullptr; }
+};
+template <typename Type>
+struct _hb_has_null<Type, true>
+{
+  static const Type *get_null () { return &Null(Type); }
+  static Type *get_crap ()       { return &Crap(Type); }
+};
+
+template <typename Type, typename OffsetType=HBUINT16, bool has_null=true>
+struct OffsetTo : Offset<OffsetType, has_null>
+{
+  const Type& operator () (const void *base) const
+  {
+    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
+    return StructAtOffset<const Type> (base, *this);
+  }
+  Type& operator () (void *base) const
+  {
+    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_crap ();
+    return StructAtOffset<Type> (base, *this);
+  }
+
+  Type& serialize (hb_serialize_context_t *c, const void *base)
+  {
+    return * (Type *) Offset<OffsetType>::serialize (c, base);
+  }
+
+  template <typename T>
+  void serialize_subset (hb_subset_context_t *c, const T &src, const void *base)
+  {
+    if (&src == &Null (T))
+    {
+      this->set (0);
+      return;
+    }
+    serialize (c->serializer, base);
+    if (!src.subset (c))
+      this->set (0);
+  }
+
+  bool sanitize_shallow (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!c->check_struct (this))) return_trace (false);
+    if (unlikely (this->is_null ())) return_trace (true);
+    if (unlikely (!c->check_range (base, *this))) return_trace (false);
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (sanitize_shallow (c, base) &&
+		  (this->is_null () ||
+		   StructAtOffset<Type> (base, *this).sanitize (c) ||
+		   neuter (c)));
+  }
+  template <typename T1>
+  bool sanitize (hb_sanitize_context_t *c, const void *base, T1 d1) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (sanitize_shallow (c, base) &&
+		  (this->is_null () ||
+		   StructAtOffset<Type> (base, *this).sanitize (c, d1) ||
+		   neuter (c)));
+  }
+  template <typename T1, typename T2>
+  bool sanitize (hb_sanitize_context_t *c, const void *base, T1 d1, T2 d2) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (sanitize_shallow (c, base) &&
+		  (this->is_null () ||
+		   StructAtOffset<Type> (base, *this).sanitize (c, d1, d2) ||
+		   neuter (c)));
+  }
+  template <typename T1, typename T2, typename T3>
+  bool sanitize (hb_sanitize_context_t *c, const void *base, T1 d1, T2 d2, T3 d3) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (sanitize_shallow (c, base) &&
+		  (this->is_null () ||
+		   StructAtOffset<Type> (base, *this).sanitize (c, d1, d2, d3) ||
+		   neuter (c)));
+  }
+
+  /* Set the offset to Null */
+  bool neuter (hb_sanitize_context_t *c) const
+  {
+    if (!has_null) return false;
+    return c->try_set (this, 0);
+  }
+  DEFINE_SIZE_STATIC (sizeof (OffsetType));
+};
+/* Partial specializations. */
+template <typename Type,                               bool has_null=true> struct   LOffsetTo : OffsetTo<Type, HBUINT32,   has_null> {};
+template <typename Type, typename OffsetType=HBUINT16                    > struct  NNOffsetTo : OffsetTo<Type, OffsetType, false> {};
+template <typename Type                                                  > struct LNNOffsetTo : OffsetTo<Type, HBUINT32,   false> {};
+
+template <typename Base, typename OffsetType, bool has_null, typename Type>
+static inline const Type& operator + (const Base &base, const OffsetTo<Type, OffsetType, has_null> &offset) { return offset (base); }
+template <typename Base, typename OffsetType, bool has_null, typename Type>
+static inline Type& operator + (Base &base, OffsetTo<Type, OffsetType, has_null> &offset) { return offset (base); }
+
+
+/*
+ * Array Types
+ */
+
+template <typename Type>
+struct UnsizedArrayOf
+{
+  typedef Type item_t;
+  static constexpr unsigned item_size = hb_static_size (Type);
+
+  HB_NO_CREATE_COPY_ASSIGN_TEMPLATE (UnsizedArrayOf, Type);
+
+  const Type& operator [] (int i_) const
+  {
+    unsigned int i = (unsigned int) i_;
+    const Type *p = &arrayZ[i];
+    if (unlikely (p < arrayZ)) return Null (Type); /* Overflowed. */
+    return *p;
+  }
+  Type& operator [] (int i_)
+  {
+    unsigned int i = (unsigned int) i_;
+    Type *p = &arrayZ[i];
+    if (unlikely (p < arrayZ)) return Crap (Type); /* Overflowed. */
+    return *p;
+  }
+
+  unsigned int get_size (unsigned int len) const
+  { return len * Type::static_size; }
+
+  template <typename T> operator T * () { return arrayZ; }
+  template <typename T> operator const T * () const { return arrayZ; }
+  hb_array_t<Type> as_array (unsigned int len)
+  { return hb_array (arrayZ, len); }
+  hb_array_t<const Type> as_array (unsigned int len) const
+  { return hb_array (arrayZ, len); }
+  operator hb_array_t<Type> ()             { return as_array (); }
+  operator hb_array_t<const Type> () const { return as_array (); }
+
+  template <typename T>
+  Type &lsearch (unsigned int len, const T &x, Type &not_found = Crap (Type))
+  { return *as_array (len).lsearch (x, &not_found); }
+  template <typename T>
+  const Type &lsearch (unsigned int len, const T &x, const Type &not_found = Null (Type)) const
+  { return *as_array (len).lsearch (x, &not_found); }
+
+  void qsort (unsigned int len, unsigned int start = 0, unsigned int end = (unsigned int) -1)
+  { as_array (len).qsort (start, end); }
+
+  bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
+
+    /* Note: for structs that do not reference other structs,
+     * we do not need to call their sanitize() as we already did
+     * a bound check on the aggregate array size.  We just include
+     * a small unreachable expression to make sure the structs
+     * pointed to do have a simple sanitize(), ie. they do not
+     * reference other structs via offsets.
+     */
+    (void) (false && arrayZ[0].sanitize (c));
+
+    return_trace (true);
+  }
+  bool sanitize (hb_sanitize_context_t *c, unsigned int count, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!arrayZ[i].sanitize (c, base)))
+	return_trace (false);
+    return_trace (true);
+  }
+  template <typename T>
+  bool sanitize (hb_sanitize_context_t *c, unsigned int count, const void *base, T user_data) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!arrayZ[i].sanitize (c, base, user_data)))
+	return_trace (false);
+    return_trace (true);
+  }
+
+  bool sanitize_shallow (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_array (arrayZ, count));
+  }
+
+  public:
+  Type		arrayZ[VAR];
+  public:
+  DEFINE_SIZE_UNBOUNDED (0);
+};
+
+/* Unsized array of offset's */
+template <typename Type, typename OffsetType, bool has_null=true>
+struct UnsizedOffsetArrayOf : UnsizedArrayOf<OffsetTo<Type, OffsetType, has_null> > {};
+
+/* Unsized array of offsets relative to the beginning of the array itself. */
+template <typename Type, typename OffsetType, bool has_null=true>
+struct UnsizedOffsetListOf : UnsizedOffsetArrayOf<Type, OffsetType, has_null>
+{
+  const Type& operator [] (int i_) const
+  {
+    unsigned int i = (unsigned int) i_;
+    const OffsetTo<Type, OffsetType, has_null> *p = &this->arrayZ[i];
+    if (unlikely (p < this->arrayZ)) return Null (Type); /* Overflowed. */
+    return this+*p;
+  }
+  Type& operator [] (int i_)
+  {
+    unsigned int i = (unsigned int) i_;
+    const OffsetTo<Type, OffsetType, has_null> *p = &this->arrayZ[i];
+    if (unlikely (p < this->arrayZ)) return Crap (Type); /* Overflowed. */
+    return this+*p;
+  }
+
+
+  bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace ((UnsizedOffsetArrayOf<Type, OffsetType, has_null>::sanitize (c, count, this)));
+  }
+  template <typename T>
+  bool sanitize (hb_sanitize_context_t *c, unsigned int count, T user_data) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace ((UnsizedOffsetArrayOf<Type, OffsetType, has_null>::sanitize (c, count, this, user_data)));
+  }
+};
+
+/* An array with sorted elements.  Supports binary searching. */
+template <typename Type>
+struct SortedUnsizedArrayOf : UnsizedArrayOf<Type>
+{
+  hb_sorted_array_t<Type> as_array (unsigned int len)
+  { return hb_sorted_array (this->arrayZ, len); }
+  hb_sorted_array_t<const Type> as_array (unsigned int len) const
+  { return hb_sorted_array (this->arrayZ, len); }
+  operator hb_sorted_array_t<Type> ()             { return as_array (); }
+  operator hb_sorted_array_t<const Type> () const { return as_array (); }
+
+  template <typename T>
+  Type &bsearch (unsigned int len, const T &x, Type &not_found = Crap (Type))
+  { return *as_array (len).bsearch (x, &not_found); }
+  template <typename T>
+  const Type &bsearch (unsigned int len, const T &x, const Type &not_found = Null (Type)) const
+  { return *as_array (len).bsearch (x, &not_found); }
+  template <typename T>
+  bool bfind (unsigned int len, const T &x, unsigned int *i = nullptr,
+		     hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+		     unsigned int to_store = (unsigned int) -1) const
+  { return as_array (len).bfind (x, i, not_found, to_store); }
+};
+
+
+/* An array with a number of elements. */
+template <typename Type, typename LenType=HBUINT16>
+struct ArrayOf
+{
+  typedef Type item_t;
+  static constexpr unsigned item_size = hb_static_size (Type);
+
+  HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (ArrayOf, Type, LenType);
+
+  const Type& operator [] (int i_) const
+  {
+    unsigned int i = (unsigned int) i_;
+    if (unlikely (i >= len)) return Null (Type);
+    return arrayZ[i];
+  }
+  Type& operator [] (int i_)
+  {
+    unsigned int i = (unsigned int) i_;
+    if (unlikely (i >= len)) return Crap (Type);
+    return arrayZ[i];
+  }
+
+  unsigned int get_size () const
+  { return len.static_size + len * Type::static_size; }
+
+  hb_array_t<Type> as_array ()
+  { return hb_array (arrayZ, len); }
+  hb_array_t<const Type> as_array () const
+  { return hb_array (arrayZ, len); }
+  operator hb_array_t<Type> (void)             { return as_array (); }
+  operator hb_array_t<const Type> (void) const { return as_array (); }
+
+  hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
+  { return as_array ().sub_array (start_offset, count);}
+  hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const
+  { return as_array ().sub_array (start_offset, count);}
+  hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
+  { return as_array ().sub_array (start_offset, count);}
+  hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */)
+  { return as_array ().sub_array (start_offset, count);}
+
+  bool serialize (hb_serialize_context_t *c, unsigned int items_len)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    len.set (items_len); /* TODO(serialize) Overflow? */
+    if (unlikely (!c->extend (*this))) return_trace (false);
+    return_trace (true);
+  }
+  template <typename T>
+  bool serialize (hb_serialize_context_t *c, hb_array_t<const T> items)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!serialize (c, items.length))) return_trace (false);
+    for (unsigned int i = 0; i < items.length; i++)
+      hb_assign (arrayZ[i], items[i]);
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c))) return_trace (false);
+
+    /* Note: for structs that do not reference other structs,
+     * we do not need to call their sanitize() as we already did
+     * a bound check on the aggregate array size.  We just include
+     * a small unreachable expression to make sure the structs
+     * pointed to do have a simple sanitize(), ie. they do not
+     * reference other structs via offsets.
+     */
+    (void) (false && arrayZ[0].sanitize (c));
+
+    return_trace (true);
+  }
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c))) return_trace (false);
+    unsigned int count = len;
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!arrayZ[i].sanitize (c, base)))
+	return_trace (false);
+    return_trace (true);
+  }
+  template <typename T>
+  bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c))) return_trace (false);
+    unsigned int count = len;
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!arrayZ[i].sanitize (c, base, user_data)))
+	return_trace (false);
+    return_trace (true);
+  }
+
+  template <typename T>
+  Type &lsearch (const T &x, Type &not_found = Crap (Type))
+  { return *as_array ().lsearch (x, &not_found); }
+  template <typename T>
+  const Type &lsearch (const T &x, const Type &not_found = Null (Type)) const
+  { return *as_array ().lsearch (x, &not_found); }
+
+  void qsort (unsigned int start = 0, unsigned int end = (unsigned int) -1)
+  { as_array ().qsort (start, end); }
+
+  bool sanitize_shallow (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (len.sanitize (c) && c->check_array (arrayZ, len));
+  }
+
+  public:
+  LenType	len;
+  Type		arrayZ[VAR];
+  public:
+  DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ);
+};
+template <typename Type> struct LArrayOf : ArrayOf<Type, HBUINT32> {};
+typedef ArrayOf<HBUINT8, HBUINT8> PString;
+
+/* Array of Offset's */
+template <typename Type>
+struct OffsetArrayOf : ArrayOf<OffsetTo<Type, HBUINT16> > {};
+template <typename Type>
+struct LOffsetArrayOf : ArrayOf<OffsetTo<Type, HBUINT32> > {};
+template <typename Type>
+struct LOffsetLArrayOf : ArrayOf<OffsetTo<Type, HBUINT32>, HBUINT32> {};
+
+/* Array of offsets relative to the beginning of the array itself. */
+template <typename Type>
+struct OffsetListOf : OffsetArrayOf<Type>
+{
+  const Type& operator [] (int i_) const
+  {
+    unsigned int i = (unsigned int) i_;
+    if (unlikely (i >= this->len)) return Null (Type);
+    return this+this->arrayZ[i];
+  }
+  const Type& operator [] (int i_)
+  {
+    unsigned int i = (unsigned int) i_;
+    if (unlikely (i >= this->len)) return Crap (Type);
+    return this+this->arrayZ[i];
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    struct OffsetListOf<Type> *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+    unsigned int count = this->len;
+    for (unsigned int i = 0; i < count; i++)
+      out->arrayZ[i].serialize_subset (c, (*this)[i], out);
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (OffsetArrayOf<Type>::sanitize (c, this));
+  }
+  template <typename T>
+  bool sanitize (hb_sanitize_context_t *c, T user_data) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (OffsetArrayOf<Type>::sanitize (c, this, user_data));
+  }
+};
+
+/* An array starting at second element. */
+template <typename Type, typename LenType=HBUINT16>
+struct HeadlessArrayOf
+{
+  static constexpr unsigned item_size = Type::static_size;
+
+  HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (HeadlessArrayOf, Type, LenType);
+
+  const Type& operator [] (int i_) const
+  {
+    unsigned int i = (unsigned int) i_;
+    if (unlikely (i >= lenP1 || !i)) return Null (Type);
+    return arrayZ[i-1];
+  }
+  Type& operator [] (int i_)
+  {
+    unsigned int i = (unsigned int) i_;
+    if (unlikely (i >= lenP1 || !i)) return Crap (Type);
+    return arrayZ[i-1];
+  }
+  unsigned int get_size () const
+  { return lenP1.static_size + (lenP1 ? lenP1 - 1 : 0) * Type::static_size; }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const Type> items)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    lenP1.set (items.length + 1); /* TODO(serialize) Overflow? */
+    if (unlikely (!c->extend (*this))) return_trace (false);
+    for (unsigned int i = 0; i < items.length; i++)
+      arrayZ[i] = items[i];
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c))) return_trace (false);
+
+    /* Note: for structs that do not reference other structs,
+     * we do not need to call their sanitize() as we already did
+     * a bound check on the aggregate array size.  We just include
+     * a small unreachable expression to make sure the structs
+     * pointed to do have a simple sanitize(), ie. they do not
+     * reference other structs via offsets.
+     */
+    (void) (false && arrayZ[0].sanitize (c));
+
+    return_trace (true);
+  }
+
+  private:
+  bool sanitize_shallow (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (lenP1.sanitize (c) &&
+		  (!lenP1 || c->check_array (arrayZ, lenP1 - 1)));
+  }
+
+  public:
+  LenType	lenP1;
+  Type		arrayZ[VAR];
+  public:
+  DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ);
+};
+
+/* An array storing length-1. */
+template <typename Type, typename LenType=HBUINT16>
+struct ArrayOfM1
+{
+  HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (ArrayOfM1, Type, LenType);
+
+  const Type& operator [] (int i_) const
+  {
+    unsigned int i = (unsigned int) i_;
+    if (unlikely (i > lenM1)) return Null (Type);
+    return arrayZ[i];
+  }
+  Type& operator [] (int i_)
+  {
+    unsigned int i = (unsigned int) i_;
+    if (unlikely (i > lenM1)) return Crap (Type);
+    return arrayZ[i];
+  }
+  unsigned int get_size () const
+  { return lenM1.static_size + (lenM1 + 1) * Type::static_size; }
+
+  template <typename T>
+  bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c))) return_trace (false);
+    unsigned int count = lenM1 + 1;
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!arrayZ[i].sanitize (c, base, user_data)))
+	return_trace (false);
+    return_trace (true);
+  }
+
+  private:
+  bool sanitize_shallow (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (lenM1.sanitize (c) &&
+		  (c->check_array (arrayZ, lenM1 + 1)));
+  }
+
+  public:
+  LenType	lenM1;
+  Type		arrayZ[VAR];
+  public:
+  DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ);
+};
+
+/* An array with sorted elements.  Supports binary searching. */
+template <typename Type, typename LenType=HBUINT16>
+struct SortedArrayOf : ArrayOf<Type, LenType>
+{
+  hb_sorted_array_t<Type> as_array ()
+  { return hb_sorted_array (this->arrayZ, this->len); }
+  hb_sorted_array_t<const Type> as_array () const
+  { return hb_sorted_array (this->arrayZ, this->len); }
+  operator hb_sorted_array_t<Type> ()             { return as_array (); }
+  operator hb_sorted_array_t<const Type> () const { return as_array (); }
+
+  hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
+  { return as_array ().sub_array (start_offset, count);}
+  hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const
+  { return as_array ().sub_array (start_offset, count);}
+  hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
+  { return as_array ().sub_array (start_offset, count);}
+  hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */)
+  { return as_array ().sub_array (start_offset, count);}
+
+  template <typename T>
+  Type &bsearch (const T &x, Type &not_found = Crap (Type))
+  { return *as_array ().bsearch (x, &not_found); }
+  template <typename T>
+  const Type &bsearch (const T &x, const Type &not_found = Null (Type)) const
+  { return *as_array ().bsearch (x, &not_found); }
+  template <typename T>
+  bool bfind (const T &x, unsigned int *i = nullptr,
+		     hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+		     unsigned int to_store = (unsigned int) -1) const
+  { return as_array ().bfind (x, i, not_found, to_store); }
+};
+
+/*
+ * Binary-search arrays
+ */
+
+template <typename LenType=HBUINT16>
+struct BinSearchHeader
+{
+  operator uint32_t () const { return len; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  void set (unsigned int v)
+  {
+    len.set (v);
+    assert (len == v);
+    entrySelector.set (MAX (1u, hb_bit_storage (v)) - 1);
+    searchRange.set (16 * (1u << entrySelector));
+    rangeShift.set (v * 16 > searchRange
+		    ? 16 * v - searchRange
+		    : 0);
+  }
+
+  protected:
+  LenType	len;
+  LenType	searchRange;
+  LenType	entrySelector;
+  LenType	rangeShift;
+
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+template <typename Type, typename LenType=HBUINT16>
+struct BinSearchArrayOf : SortedArrayOf<Type, BinSearchHeader<LenType> > {};
+
+
+struct VarSizedBinSearchHeader
+{
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT16	unitSize;	/* Size of a lookup unit for this search in bytes. */
+  HBUINT16	nUnits;		/* Number of units of the preceding size to be searched. */
+  HBUINT16	searchRange;	/* The value of unitSize times the largest power of 2
+				 * that is less than or equal to the value of nUnits. */
+  HBUINT16	entrySelector;	/* The log base 2 of the largest power of 2 less than
+				 * or equal to the value of nUnits. */
+  HBUINT16	rangeShift;	/* The value of unitSize times the difference of the
+				 * value of nUnits minus the largest power of 2 less
+				 * than or equal to the value of nUnits. */
+  public:
+  DEFINE_SIZE_STATIC (10);
+};
+
+template <typename Type>
+struct VarSizedBinSearchArrayOf
+{
+  static constexpr unsigned item_size = Type::static_size;
+
+  HB_NO_CREATE_COPY_ASSIGN_TEMPLATE (VarSizedBinSearchArrayOf, Type);
+
+  bool last_is_terminator () const
+  {
+    if (unlikely (!header.nUnits)) return false;
+
+    /* Gah.
+     *
+     * "The number of termination values that need to be included is table-specific.
+     * The value that indicates binary search termination is 0xFFFF." */
+    const HBUINT16 *words = &StructAtOffset<HBUINT16> (&bytesZ, (header.nUnits - 1) * header.unitSize);
+    unsigned int count = Type::TerminationWordCount;
+    for (unsigned int i = 0; i < count; i++)
+      if (words[i] != 0xFFFFu)
+        return false;
+    return true;
+  }
+
+  const Type& operator [] (int i_) const
+  {
+    unsigned int i = (unsigned int) i_;
+    if (unlikely (i >= get_length ())) return Null (Type);
+    return StructAtOffset<Type> (&bytesZ, i * header.unitSize);
+  }
+  Type& operator [] (int i_)
+  {
+    unsigned int i = (unsigned int) i_;
+    if (unlikely (i >= get_length ())) return Crap (Type);
+    return StructAtOffset<Type> (&bytesZ, i * header.unitSize);
+  }
+  unsigned int get_length () const
+  { return header.nUnits - last_is_terminator (); }
+  unsigned int get_size () const
+  { return header.static_size + header.nUnits * header.unitSize; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c))) return_trace (false);
+
+    /* Note: for structs that do not reference other structs,
+     * we do not need to call their sanitize() as we already did
+     * a bound check on the aggregate array size.  We just include
+     * a small unreachable expression to make sure the structs
+     * pointed to do have a simple sanitize(), ie. they do not
+     * reference other structs via offsets.
+     */
+    (void) (false && StructAtOffset<Type> (&bytesZ, 0).sanitize (c));
+
+    return_trace (true);
+  }
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c))) return_trace (false);
+    unsigned int count = get_length ();
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!(*this)[i].sanitize (c, base)))
+	return_trace (false);
+    return_trace (true);
+  }
+  template <typename T>
+  bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c))) return_trace (false);
+    unsigned int count = get_length ();
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!(*this)[i].sanitize (c, base, user_data)))
+	return_trace (false);
+    return_trace (true);
+  }
+
+  template <typename T>
+  const Type *bsearch (const T &key) const
+  {
+    unsigned int size = header.unitSize;
+    int min = 0, max = (int) get_length () - 1;
+    while (min <= max)
+    {
+      int mid = ((unsigned int) min + (unsigned int) max) / 2;
+      const Type *p = (const Type *) (((const char *) &bytesZ) + (mid * size));
+      int c = p->cmp (key);
+      if (c < 0) max = mid - 1;
+      else if (c > 0) min = mid + 1;
+      else return p;
+    }
+    return nullptr;
+  }
+
+  private:
+  bool sanitize_shallow (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (header.sanitize (c) &&
+		  Type::static_size <= header.unitSize &&
+		  c->check_range (bytesZ.arrayZ,
+				  header.nUnits,
+				  header.unitSize));
+  }
+
+  protected:
+  VarSizedBinSearchHeader	header;
+  UnsizedArrayOf<HBUINT8>	bytesZ;
+  public:
+  DEFINE_SIZE_ARRAY (10, bytesZ);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OPEN_TYPE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff-common.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff-common.hh
new file mode 100644
index 0000000..c645953e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff-common.hh
@@ -0,0 +1,713 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+#ifndef HB_OT_CFF_COMMON_HH
+#define HB_OT_CFF_COMMON_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-layout-common.hh"
+#include "hb-cff-interp-dict-common.hh"
+#include "hb-subset-plan.hh"
+
+namespace CFF {
+
+using namespace OT;
+
+#define CFF_UNDEF_CODE  0xFFFFFFFF
+
+/* utility macro */
+template<typename Type>
+static inline const Type& StructAtOffsetOrNull(const void *P, unsigned int offset)
+{ return offset? (* reinterpret_cast<const Type*> ((const char *) P + offset)): Null(Type); }
+
+inline unsigned int calcOffSize(unsigned int dataSize)
+{
+  unsigned int size = 1;
+  unsigned int offset = dataSize + 1;
+  while ((offset & ~0xFF) != 0)
+  {
+    size++;
+    offset >>= 8;
+  }
+  /* format does not support size > 4; caller should handle it as an error */
+  return size;
+}
+
+struct code_pair_t
+{
+  hb_codepoint_t  code;
+  hb_codepoint_t  glyph;
+};
+
+typedef hb_vector_t<unsigned char> str_buff_t;
+struct str_buff_vec_t : hb_vector_t<str_buff_t>
+{
+  void fini () { SUPER::fini_deep (); }
+
+  unsigned int total_size () const
+  {
+    unsigned int size = 0;
+    for (unsigned int i = 0; i < length; i++)
+      size += (*this)[i].length;
+    return size;
+  }
+
+  private:
+  typedef hb_vector_t<str_buff_t> SUPER;
+};
+
+/* CFF INDEX */
+template <typename COUNT>
+struct CFFIndex
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely ((count.sanitize (c) && count == 0) || /* empty INDEX */
+			  (c->check_struct (this) && offSize >= 1 && offSize <= 4 &&
+			   c->check_array (offsets, offSize, count + 1) &&
+			   c->check_array ((const HBUINT8*)data_base (), 1, max_offset () - 1))));
+  }
+
+  static unsigned int calculate_offset_array_size (unsigned int offSize, unsigned int count)
+  { return offSize * (count + 1); }
+
+  unsigned int offset_array_size () const
+  { return calculate_offset_array_size (offSize, count); }
+
+  static unsigned int calculate_serialized_size (unsigned int offSize, unsigned int count, unsigned int dataSize)
+  {
+    if (count == 0)
+      return COUNT::static_size;
+    else
+      return min_size + calculate_offset_array_size (offSize, count) + dataSize;
+  }
+
+  bool serialize (hb_serialize_context_t *c, const CFFIndex &src)
+  {
+    TRACE_SERIALIZE (this);
+    unsigned int size = src.get_size ();
+    CFFIndex *dest = c->allocate_size<CFFIndex> (size);
+    if (unlikely (dest == nullptr)) return_trace (false);
+    memcpy (dest, &src, size);
+    return_trace (true);
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  unsigned int offSize_,
+		  const byte_str_array_t &byteArray)
+  {
+    TRACE_SERIALIZE (this);
+    if (byteArray.length == 0)
+    {
+      COUNT *dest = c->allocate_min<COUNT> ();
+      if (unlikely (dest == nullptr)) return_trace (false);
+      dest->set (0);
+    }
+    else
+    {
+      /* serialize CFFIndex header */
+      if (unlikely (!c->extend_min (*this))) return_trace (false);
+      this->count.set (byteArray.length);
+      this->offSize.set (offSize_);
+      if (!unlikely (c->allocate_size<HBUINT8> (offSize_ * (byteArray.length + 1))))
+	return_trace (false);
+
+      /* serialize indices */
+      unsigned int  offset = 1;
+      unsigned int  i = 0;
+      for (; i < byteArray.length; i++)
+      {
+	set_offset_at (i, offset);
+	offset += byteArray[i].get_size ();
+      }
+      set_offset_at (i, offset);
+
+      /* serialize data */
+      for (unsigned int i = 0; i < byteArray.length; i++)
+      {
+      	const byte_str_t &bs = byteArray[i];
+	unsigned char  *dest = c->allocate_size<unsigned char> (bs.length);
+	if (unlikely (dest == nullptr))
+	  return_trace (false);
+	memcpy (dest, &bs[0], bs.length);
+      }
+    }
+    return_trace (true);
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  unsigned int offSize_,
+		  const str_buff_vec_t &buffArray)
+  {
+    byte_str_array_t  byteArray;
+    byteArray.init ();
+    byteArray.resize (buffArray.length);
+    for (unsigned int i = 0; i < byteArray.length; i++)
+    {
+      byteArray[i] = byte_str_t (buffArray[i].arrayZ (), buffArray[i].length);
+    }
+    bool result = this->serialize (c, offSize_, byteArray);
+    byteArray.fini ();
+    return result;
+  }
+
+  void set_offset_at (unsigned int index, unsigned int offset)
+  {
+    HBUINT8 *p = offsets + offSize * index + offSize;
+    unsigned int size = offSize;
+    for (; size; size--)
+    {
+      --p;
+      p->set (offset & 0xFF);
+      offset >>= 8;
+    }
+  }
+
+  unsigned int offset_at (unsigned int index) const
+  {
+    assert (index <= count);
+    const HBUINT8 *p = offsets + offSize * index;
+    unsigned int size = offSize;
+    unsigned int offset = 0;
+    for (; size; size--)
+      offset = (offset << 8) + *p++;
+    return offset;
+  }
+
+  unsigned int length_at (unsigned int index) const
+  {
+	if (likely ((offset_at (index + 1) >= offset_at (index)) &&
+		    (offset_at (index + 1) <= offset_at (count))))
+	  return offset_at (index + 1) - offset_at (index);
+	else
+	  return 0;
+  }
+
+  const unsigned char *data_base () const
+  { return (const unsigned char *)this + min_size + offset_array_size (); }
+
+  unsigned int data_size () const { return HBINT8::static_size; }
+
+  byte_str_t operator [] (unsigned int index) const
+  {
+    if (likely (index < count))
+      return byte_str_t (data_base () + offset_at (index) - 1, length_at (index));
+    else
+      return Null(byte_str_t);
+  }
+
+  unsigned int get_size () const
+  {
+    if (this != &Null(CFFIndex))
+    {
+      if (count > 0)
+	return min_size + offset_array_size () + (offset_at (count) - 1);
+      else
+	return count.static_size;  /* empty CFFIndex contains count only */
+    }
+    else
+      return 0;
+  }
+
+  protected:
+  unsigned int max_offset () const
+  {
+    unsigned int max = 0;
+    for (unsigned int i = 0; i < count + 1u; i++)
+    {
+      unsigned int off = offset_at (i);
+      if (off > max) max = off;
+    }
+    return max;
+  }
+
+  public:
+  COUNT     count;	/* Number of object data. Note there are (count+1) offsets */
+  HBUINT8   offSize;      /* The byte size of each offset in the offsets array. */
+  HBUINT8   offsets[VAR]; /* The array of (count + 1) offsets into objects array (1-base). */
+  /* HBUINT8 data[VAR];      Object data */
+  public:
+  DEFINE_SIZE_ARRAY (COUNT::static_size + HBUINT8::static_size, offsets);
+};
+
+template <typename COUNT, typename TYPE>
+struct CFFIndexOf : CFFIndex<COUNT>
+{
+  const byte_str_t operator [] (unsigned int index) const
+  {
+    if (likely (index < CFFIndex<COUNT>::count))
+      return byte_str_t (CFFIndex<COUNT>::data_base () + CFFIndex<COUNT>::offset_at (index) - 1, CFFIndex<COUNT>::length_at (index));
+    return Null(byte_str_t);
+  }
+
+  template <typename DATA, typename PARAM1, typename PARAM2>
+  bool serialize (hb_serialize_context_t *c,
+		  unsigned int offSize_,
+		  const DATA *dataArray,
+		  unsigned int dataArrayLen,
+		  const hb_vector_t<unsigned int> &dataSizeArray,
+		  const PARAM1 &param1,
+		  const PARAM2 &param2)
+  {
+    TRACE_SERIALIZE (this);
+    /* serialize CFFIndex header */
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    this->count.set (dataArrayLen);
+    this->offSize.set (offSize_);
+    if (!unlikely (c->allocate_size<HBUINT8> (offSize_ * (dataArrayLen + 1))))
+      return_trace (false);
+
+    /* serialize indices */
+    unsigned int  offset = 1;
+    unsigned int  i = 0;
+    for (; i < dataArrayLen; i++)
+    {
+      CFFIndex<COUNT>::set_offset_at (i, offset);
+      offset += dataSizeArray[i];
+    }
+    CFFIndex<COUNT>::set_offset_at (i, offset);
+
+    /* serialize data */
+    for (unsigned int i = 0; i < dataArrayLen; i++)
+    {
+      TYPE  *dest = c->start_embed<TYPE> ();
+      if (unlikely (dest == nullptr ||
+		    !dest->serialize (c, dataArray[i], param1, param2)))
+	return_trace (false);
+    }
+    return_trace (true);
+  }
+
+  /* in parallel to above */
+  template <typename DATA, typename PARAM>
+  static unsigned int calculate_serialized_size (unsigned int &offSize_ /* OUT */,
+						 const DATA *dataArray,
+						 unsigned int dataArrayLen,
+						 hb_vector_t<unsigned int> &dataSizeArray, /* OUT */
+						 const PARAM &param)
+  {
+    /* determine offset size */
+    unsigned int  totalDataSize = 0;
+    for (unsigned int i = 0; i < dataArrayLen; i++)
+    {
+      unsigned int dataSize = TYPE::calculate_serialized_size (dataArray[i], param);
+      dataSizeArray[i] = dataSize;
+      totalDataSize += dataSize;
+    }
+    offSize_ = calcOffSize (totalDataSize);
+
+    return CFFIndex<COUNT>::calculate_serialized_size (offSize_, dataArrayLen, totalDataSize);
+  }
+};
+
+/* Top Dict, Font Dict, Private Dict */
+struct Dict : UnsizedByteStr
+{
+  template <typename DICTVAL, typename OP_SERIALIZER, typename PARAM>
+  bool serialize (hb_serialize_context_t *c,
+		  const DICTVAL &dictval,
+		  OP_SERIALIZER& opszr,
+		  PARAM& param)
+  {
+    TRACE_SERIALIZE (this);
+    for (unsigned int i = 0; i < dictval.get_count (); i++)
+    {
+      if (unlikely (!opszr.serialize (c, dictval[i], param)))
+	return_trace (false);
+    }
+    return_trace (true);
+  }
+
+  /* in parallel to above */
+  template <typename DICTVAL, typename OP_SERIALIZER, typename PARAM>
+  static unsigned int calculate_serialized_size (const DICTVAL &dictval,
+						 OP_SERIALIZER& opszr,
+						 PARAM& param)
+  {
+    unsigned int size = 0;
+    for (unsigned int i = 0; i < dictval.get_count (); i++)
+      size += opszr.calculate_serialized_size (dictval[i], param);
+    return size;
+  }
+
+  template <typename DICTVAL, typename OP_SERIALIZER>
+  static unsigned int calculate_serialized_size (const DICTVAL &dictval,
+						 OP_SERIALIZER& opszr)
+  {
+    unsigned int size = 0;
+    for (unsigned int i = 0; i < dictval.get_count (); i++)
+      size += opszr.calculate_serialized_size (dictval[i]);
+    return size;
+  }
+
+  template <typename INTTYPE, int minVal, int maxVal>
+  static bool serialize_int_op (hb_serialize_context_t *c, op_code_t op, int value, op_code_t intOp)
+  {
+    // XXX: not sure why but LLVM fails to compile the following 'unlikely' macro invocation
+    if (/*unlikely*/ (!serialize_int<INTTYPE, minVal, maxVal> (c, intOp, value)))
+      return false;
+
+    TRACE_SERIALIZE (this);
+    /* serialize the opcode */
+    HBUINT8 *p = c->allocate_size<HBUINT8> (OpCode_Size (op));
+    if (unlikely (p == nullptr)) return_trace (false);
+    if (Is_OpCode_ESC (op))
+    {
+      p->set (OpCode_escape);
+      op = Unmake_OpCode_ESC (op);
+      p++;
+    }
+    p->set (op);
+    return_trace (true);
+  }
+
+  static bool serialize_uint4_op (hb_serialize_context_t *c, op_code_t op, int value)
+  { return serialize_int_op<HBUINT32, 0, 0x7FFFFFFF> (c, op, value, OpCode_longintdict); }
+
+  static bool serialize_uint2_op (hb_serialize_context_t *c, op_code_t op, int value)
+  { return serialize_int_op<HBUINT16, 0, 0x7FFF> (c, op, value, OpCode_shortint); }
+
+  static bool serialize_offset4_op (hb_serialize_context_t *c, op_code_t op, int value)
+  {
+    return serialize_uint4_op (c, op, value);
+  }
+
+  static bool serialize_offset2_op (hb_serialize_context_t *c, op_code_t op, int value)
+  {
+    return serialize_uint2_op (c, op, value);
+  }
+};
+
+struct TopDict : Dict {};
+struct FontDict : Dict {};
+struct PrivateDict : Dict {};
+
+struct table_info_t
+{
+  void init () { offSize = offset = size = 0; }
+
+  unsigned int    offset;
+  unsigned int    size;
+  unsigned int    offSize;
+};
+
+/* used to remap font index or SID from fullset to subset.
+ * set to CFF_UNDEF_CODE if excluded from subset */
+struct remap_t : hb_vector_t<hb_codepoint_t>
+{
+  void init () { SUPER::init (); }
+
+  void fini () { SUPER::fini (); }
+
+  bool reset (unsigned int size)
+  {
+    if (unlikely (!SUPER::resize (size)))
+      return false;
+    for (unsigned int i = 0; i < length; i++)
+      (*this)[i] = CFF_UNDEF_CODE;
+    count = 0;
+    return true;
+  }
+
+  bool identity (unsigned int size)
+  {
+    if (unlikely (!SUPER::resize (size)))
+      return false;
+    unsigned int i;
+    for (i = 0; i < length; i++)
+      (*this)[i] = i;
+    count = i;
+    return true;
+  }
+
+  bool excludes (hb_codepoint_t id) const
+  { return (id < length) && ((*this)[id] == CFF_UNDEF_CODE); }
+
+  bool includes (hb_codepoint_t id) const
+  { return !excludes (id); }
+
+  unsigned int add (unsigned int i)
+  {
+    if ((*this)[i] == CFF_UNDEF_CODE)
+      (*this)[i] = count++;
+    return (*this)[i];
+  }
+
+  hb_codepoint_t get_count () const { return count; }
+
+  protected:
+  hb_codepoint_t  count;
+
+  private:
+  typedef hb_vector_t<hb_codepoint_t> SUPER;
+};
+
+template <typename COUNT>
+struct FDArray : CFFIndexOf<COUNT, FontDict>
+{
+  /* used by CFF1 */
+  template <typename DICTVAL, typename OP_SERIALIZER>
+  bool serialize (hb_serialize_context_t *c,
+		  unsigned int offSize_,
+		  const hb_vector_t<DICTVAL> &fontDicts,
+		  OP_SERIALIZER& opszr)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    this->count.set (fontDicts.length);
+    this->offSize.set (offSize_);
+    if (!unlikely (c->allocate_size<HBUINT8> (offSize_ * (fontDicts.length + 1))))
+      return_trace (false);
+
+    /* serialize font dict offsets */
+    unsigned int  offset = 1;
+    unsigned int fid = 0;
+    for (; fid < fontDicts.length; fid++)
+    {
+      CFFIndexOf<COUNT, FontDict>::set_offset_at (fid, offset);
+      offset += FontDict::calculate_serialized_size (fontDicts[fid], opszr);
+    }
+    CFFIndexOf<COUNT, FontDict>::set_offset_at (fid, offset);
+
+    /* serialize font dicts */
+    for (unsigned int i = 0; i < fontDicts.length; i++)
+    {
+      FontDict *dict = c->start_embed<FontDict> ();
+      if (unlikely (!dict->serialize (c, fontDicts[i], opszr, fontDicts[i])))
+	return_trace (false);
+    }
+    return_trace (true);
+  }
+
+  /* used by CFF2 */
+  template <typename DICTVAL, typename OP_SERIALIZER>
+  bool serialize (hb_serialize_context_t *c,
+		  unsigned int offSize_,
+		  const hb_vector_t<DICTVAL> &fontDicts,
+		  unsigned int fdCount,
+		  const remap_t &fdmap,
+		  OP_SERIALIZER& opszr,
+		  const hb_vector_t<table_info_t> &privateInfos)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    this->count.set (fdCount);
+    this->offSize.set (offSize_);
+    if (!unlikely (c->allocate_size<HBUINT8> (offSize_ * (fdCount + 1))))
+      return_trace (false);
+
+    /* serialize font dict offsets */
+    unsigned int  offset = 1;
+    unsigned int  fid = 0;
+    for (unsigned i = 0; i < fontDicts.length; i++)
+      if (fdmap.includes (i))
+      {
+	CFFIndexOf<COUNT, FontDict>::set_offset_at (fid++, offset);
+	offset += FontDict::calculate_serialized_size (fontDicts[i], opszr);
+      }
+    CFFIndexOf<COUNT, FontDict>::set_offset_at (fid, offset);
+
+    /* serialize font dicts */
+    for (unsigned int i = 0; i < fontDicts.length; i++)
+      if (fdmap.includes (i))
+      {
+	FontDict *dict = c->start_embed<FontDict> ();
+	if (unlikely (!dict->serialize (c, fontDicts[i], opszr, privateInfos[fdmap[i]])))
+	  return_trace (false);
+      }
+    return_trace (true);
+  }
+
+  /* in parallel to above */
+  template <typename OP_SERIALIZER, typename DICTVAL>
+  static unsigned int calculate_serialized_size (unsigned int &offSize_ /* OUT */,
+						 const hb_vector_t<DICTVAL> &fontDicts,
+						 unsigned int fdCount,
+						 const remap_t &fdmap,
+						 OP_SERIALIZER& opszr)
+  {
+    unsigned int dictsSize = 0;
+    for (unsigned int i = 0; i < fontDicts.len; i++)
+      if (fdmap.includes (i))
+	dictsSize += FontDict::calculate_serialized_size (fontDicts[i], opszr);
+
+    offSize_ = calcOffSize (dictsSize);
+    return CFFIndex<COUNT>::calculate_serialized_size (offSize_, fdCount, dictsSize);
+  }
+};
+
+/* FDSelect */
+struct FDSelect0 {
+  bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!(c->check_struct (this))))
+      return_trace (false);
+    for (unsigned int i = 0; i < c->get_num_glyphs (); i++)
+      if (unlikely (!fds[i].sanitize (c)))
+	return_trace (false);
+
+    return_trace (true);
+  }
+
+  hb_codepoint_t get_fd (hb_codepoint_t glyph) const
+  {
+    return (hb_codepoint_t)fds[glyph];
+  }
+
+  unsigned int get_size (unsigned int num_glyphs) const
+  { return HBUINT8::static_size * num_glyphs; }
+
+  HBUINT8     fds[VAR];
+
+  DEFINE_SIZE_MIN (1);
+};
+
+template <typename GID_TYPE, typename FD_TYPE>
+struct FDSelect3_4_Range {
+  bool sanitize (hb_sanitize_context_t *c, const void */*nullptr*/, unsigned int fdcount) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (first < c->get_num_glyphs () && (fd < fdcount));
+  }
+
+  GID_TYPE    first;
+  FD_TYPE     fd;
+
+  DEFINE_SIZE_STATIC (GID_TYPE::static_size + FD_TYPE::static_size);
+};
+
+template <typename GID_TYPE, typename FD_TYPE>
+struct FDSelect3_4 {
+  unsigned int get_size () const
+  { return GID_TYPE::static_size * 2 + ranges.get_size (); }
+
+  bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!c->check_struct (this) || !ranges.sanitize (c, nullptr, fdcount) ||
+    		  (nRanges () == 0) || ranges[0].first != 0))
+      return_trace (false);
+
+    for (unsigned int i = 1; i < nRanges (); i++)
+    {
+      if (unlikely (ranges[i - 1].first >= ranges[i].first))
+	  return_trace (false);
+    }
+
+    if (unlikely (!sentinel().sanitize (c) || (sentinel() != c->get_num_glyphs ())))
+      return_trace (false);
+
+    return_trace (true);
+  }
+
+  hb_codepoint_t get_fd (hb_codepoint_t glyph) const
+  {
+    unsigned int i;
+    for (i = 1; i < nRanges (); i++)
+      if (glyph < ranges[i].first)
+	break;
+
+    return (hb_codepoint_t)ranges[i - 1].fd;
+  }
+
+  GID_TYPE &nRanges () { return ranges.len; }
+  GID_TYPE nRanges () const { return ranges.len; }
+  GID_TYPE &sentinel ()  { return StructAfter<GID_TYPE> (ranges[nRanges () - 1]); }
+  const GID_TYPE &sentinel () const  { return StructAfter<GID_TYPE> (ranges[nRanges () - 1]); }
+
+  ArrayOf<FDSelect3_4_Range<GID_TYPE, FD_TYPE>, GID_TYPE> ranges;
+  /* GID_TYPE sentinel */
+
+  DEFINE_SIZE_ARRAY (GID_TYPE::static_size, ranges);
+};
+
+typedef FDSelect3_4<HBUINT16, HBUINT8> FDSelect3;
+typedef FDSelect3_4_Range<HBUINT16, HBUINT8> FDSelect3_Range;
+
+struct FDSelect {
+  bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const
+  {
+    TRACE_SANITIZE (this);
+
+    return_trace (likely (c->check_struct (this) && (format == 0 || format == 3) &&
+			  (format == 0)?
+			  u.format0.sanitize (c, fdcount):
+			  u.format3.sanitize (c, fdcount)));
+  }
+
+  bool serialize (hb_serialize_context_t *c, const FDSelect &src, unsigned int num_glyphs)
+  {
+    TRACE_SERIALIZE (this);
+    unsigned int size = src.get_size (num_glyphs);
+    FDSelect *dest = c->allocate_size<FDSelect> (size);
+    if (unlikely (dest == nullptr)) return_trace (false);
+    memcpy (dest, &src, size);
+    return_trace (true);
+  }
+
+  unsigned int calculate_serialized_size (unsigned int num_glyphs) const
+  { return get_size (num_glyphs); }
+
+  unsigned int get_size (unsigned int num_glyphs) const
+  {
+    unsigned int size = format.static_size;
+    if (format == 0)
+      size += u.format0.get_size (num_glyphs);
+    else
+      size += u.format3.get_size ();
+    return size;
+  }
+
+  hb_codepoint_t get_fd (hb_codepoint_t glyph) const
+  {
+    if (this == &Null(FDSelect))
+      return 0;
+    if (format == 0)
+      return u.format0.get_fd (glyph);
+    else
+      return u.format3.get_fd (glyph);
+  }
+
+  HBUINT8       format;
+  union {
+    FDSelect0   format0;
+    FDSelect3   format3;
+  } u;
+
+  DEFINE_SIZE_MIN (1);
+};
+
+template <typename COUNT>
+struct Subrs : CFFIndex<COUNT>
+{
+  typedef COUNT count_type;
+  typedef CFFIndex<COUNT> SUPER;
+};
+
+} /* namespace CFF */
+
+#endif /* HB_OT_CFF_COMMON_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff1-table.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff1-table.cc
new file mode 100644
index 0000000..8773c05
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff1-table.cc
@@ -0,0 +1,385 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb-ot-cff1-table.hh"
+#include "hb-cff1-interp-cs.hh"
+
+using namespace CFF;
+
+/* SID to code */
+static const uint8_t standard_encoding_to_code [] =
+{
+    0,   32,   33,   34,   35,   36,   37,   38,  39,   40,   41,   42,   43,   44,   45,   46,
+   47,   48,   49,   50,   51,   52,   53,   54,  55,   56,   57,   58,   59,   60,   61,   62,
+   63,   64,   65,   66,   67,   68,   69,   70,  71,   72,   73,   74,   75,   76,   77,   78,
+   79,   80,   81,   82,   83,   84,   85,   86,  87,   88,   89,   90,   91,   92,   93,   94,
+   95,   96,   97,   98,   99,  100,  101,  102, 103,  104,  105,  106,  107,  108,  109,  110,
+  111,  112,  113,  114,  115,  116,  117,  118, 119,  120,  121,  122,  123,  124,  125,  126,
+  161,  162,  163,  164,  165,  166,  167,  168, 169,  170,  171,  172,  173,  174,  175,  177,
+  178,  179,  180,  182,  183,  184,  185,  186, 187,  188,  189,  191,  193,  194,  195,  196,
+  197,  198,  199,  200,  202,  203,  205,  206, 207,  208,  225,  227,  232,  233,  234,  235,
+  241,  245,  248,  249,  250,  251
+};
+
+/* SID to code */
+static const uint8_t expert_encoding_to_code [] =
+{
+    0,   32,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   44,   45,   46,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   58,   59,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,   47,    0,    0,    0,    0,    0,    0,    0,    0,    0,   87,   88,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,  201,    0,    0,    0,    0,  189,    0,    0,  188,    0,
+    0,    0,    0,  190,  202,    0,    0,    0,    0,  203,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,   33,   34,   36,   37,   38,   39,   40,   41,   42,   43,   48,
+   49,   50,   51,   52,   53,   54,   55,   56,   57,   60,   61,   62,   63,   65,   66,   67,
+   68,   69,   73,   76,   77,   78,   79,   82,   83,   84,   86,   89,   90,   91,   93,   94,
+   95,   96,   97,   98,   99,  100,  101,  102,  103,  104,  105,  106,  107,  108,  109,  110,
+  111,  112,  113,  114,  115,  116,  117,  118,  119,  120,  121,  122,  123,  124,  125,  126,
+  161,  162,  163,  166,  167,  168,  169,  170,  172,  175,  178,  179,  182,  183,  184,  191,
+  192,  193,  194,  195,  196,  197,  200,  204,  205,  206,  207,  208,  209,  210,  211,  212,
+  213,  214,  215,  216,  217,  218,  219,  220,  221,  222,  223,  224,  225,  226,  227,  228,
+  229,  230,  231,  232,  233,  234,  235,  236,  237,  238,  239,  240,  241,  242,  243,  244,
+  245,  246,  247,  248,  249,  250,  251,  252,  253,  254,  255
+};
+
+/* glyph ID to SID */
+static const uint16_t expert_charset_to_sid [] =
+{
+    0,    1,  229,  230,  231,  232,  233,  234,  235,  236,  237,  238,   13,   14,   15,   99,
+  239,  240,  241,  242,  243,  244,  245,  246,  247,  248,   27,   28,  249,  250,  251,  252,
+  253,  254,  255,  256,  257,  258,  259,  260,  261,  262,  263,  264,  265,  266,  109,  110,
+  267,  268,  269,  270,  271,  272,  273,  274,  275,  276,  277,  278,  279,  280,  281,  282,
+  283,  284,  285,  286,  287,  288,  289,  290,  291,  292,  293,  294,  295,  296,  297,  298,
+  299,  300,  301,  302,  303,  304,  305,  306,  307,  308,  309,  310,  311,  312,  313,  314,
+  315,  316,  317,  318,  158,  155,  163,  319,  320,  321,  322,  323,  324,  325,  326,  150,
+  164,  169,  327,  328,  329,  330,  331,  332,  333,  334,  335,  336,  337,  338,  339,  340,
+  341,  342,  343,  344,  345,  346,  347,  348,  349,  350,  351,  352,  353,  354,  355,  356,
+  357,  358,  359,  360,  361,  362,  363,  364,  365,  366,  367,  368,  369,  370,  371,  372,
+  373,  374,  375,  376,  377,  378
+};
+
+/* glyph ID to SID */
+static const uint16_t expert_subset_charset_to_sid [] =
+{
+    0,    1,  231,  232,  235,  236,  237,  238,   13,   14,   15,   99,  239,  240,  241,  242,
+  243,  244,  245,  246,  247,  248,   27,   28,  249,  250,  251,  253,  254,  255,  256,  257,
+  258,  259,  260,  261,  262,  263,  264,  265,  266,  109,  110,  267,  268,  269,  270,  272,
+  300,  301,  302,  305,  314,  315,  158,  155,  163,  320,  321,  322,  323,  324,  325,  326,
+  150,  164,  169,  327,  328,  329,  330,  331,  332,  333,  334,  335,  336,  337,  338,  339,
+  340,  341,  342,  343,  344,  345,  346
+};
+
+/* code to SID */
+static const uint8_t standard_encoding_to_sid [] =
+{
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    1,    2,    3,    4,    5,    6,    7,    8,    9,   10,   11,   12,   13,   14,   15,   16,
+    17,  18,   19,   20,   21,   22,   23,   24,   25,   26,   27,   28,   29,   30,   31,   32,
+    33,  34,   35,   36,   37,   38,   39,   40,   41,   42,   43,   44,   45,   46,   47,   48,
+    49,  50,   51,   52,   53,   54,   55,   56,   57,   58,   59,   60,   61,   62,   63,   64,
+    65,  66,   67,   68,   69,   70,   71,   72,   73,   74,   75,   76,   77,   78,   79,   80,
+    81,  82,   83,   84,   85,   86,   87,   88,   89,   90,   91,   92,   93,   94,   95,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,   96,   97,   98,   99,  100,  101,  102,  103,  104,  105,  106,  107,  108,  109,  110,
+    0,  111,  112,  113,  114,    0,  115,  116,  117,  118,  119,  120,  121,  122,    0,  123,
+    0,  124,  125,  126,  127,  128,  129,  130,  131,    0,  132,  133,    0,  134,  135,  136,
+  137,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,   138,   0,  139,    0,    0,    0,    0,  140,  141,  142,  143,    0,    0,    0,    0,
+    0,   144,   0,    0,    0,  145,    0,    0,  146,  147,  148,  149,    0,    0,    0,    0
+};
+
+hb_codepoint_t OT::cff1::lookup_standard_encoding_for_code (hb_codepoint_t sid)
+{
+  if (sid < ARRAY_LENGTH (standard_encoding_to_code))
+    return (hb_codepoint_t)standard_encoding_to_code[sid];
+  else
+    return 0;
+}
+
+hb_codepoint_t OT::cff1::lookup_expert_encoding_for_code (hb_codepoint_t sid)
+{
+  if (sid < ARRAY_LENGTH (expert_encoding_to_code))
+    return (hb_codepoint_t)expert_encoding_to_code[sid];
+  else
+    return 0;
+}
+
+hb_codepoint_t OT::cff1::lookup_expert_charset_for_sid (hb_codepoint_t glyph)
+{
+  if (glyph < ARRAY_LENGTH (expert_charset_to_sid))
+    return (hb_codepoint_t)expert_charset_to_sid[glyph];
+  else
+    return 0;
+}
+
+hb_codepoint_t OT::cff1::lookup_expert_subset_charset_for_sid (hb_codepoint_t glyph)
+{
+  if (glyph < ARRAY_LENGTH (expert_subset_charset_to_sid))
+    return (hb_codepoint_t)expert_subset_charset_to_sid[glyph];
+  else
+    return 0;
+}
+
+hb_codepoint_t OT::cff1::lookup_standard_encoding_for_sid (hb_codepoint_t code)
+{
+  if (code < ARRAY_LENGTH (standard_encoding_to_sid))
+    return (hb_codepoint_t)standard_encoding_to_sid[code];
+  else
+    return CFF_UNDEF_SID;
+}
+
+struct bounds_t
+{
+  void init ()
+  {
+    min.set_int (0x7FFFFFFF, 0x7FFFFFFF);
+    max.set_int (-0x80000000, -0x80000000);
+  }
+
+  void update (const point_t &pt)
+  {
+    if (pt.x < min.x) min.x = pt.x;
+    if (pt.x > max.x) max.x = pt.x;
+    if (pt.y < min.y) min.y = pt.y;
+    if (pt.y > max.y) max.y = pt.y;
+  }
+
+  void merge (const bounds_t &b)
+  {
+    if (empty ())
+      *this = b;
+    else if (!b.empty ())
+    {
+      if (b.min.x < min.x) min.x = b.min.x;
+      if (b.max.x > max.x) max.x = b.max.x;
+      if (b.min.y < min.y) min.y = b.min.y;
+      if (b.max.y > max.y) max.y = b.max.y;
+    }
+  }
+
+  void offset (const point_t &delta)
+  {
+    if (!empty ())
+    {
+      min.move (delta);
+      max.move (delta);
+    }
+  }
+
+  bool empty () const
+  { return (min.x >= max.x) || (min.y >= max.y); }
+
+  point_t min;
+  point_t max;
+};
+
+struct extents_param_t
+{
+  void init (const OT::cff1::accelerator_t *_cff)
+  {
+    path_open = false;
+    cff = _cff;
+    bounds.init ();
+  }
+
+  void start_path ()         { path_open = true; }
+  void end_path ()           { path_open = false; }
+  bool is_path_open () const { return path_open; }
+
+  bool    path_open;
+  bounds_t  bounds;
+
+  const OT::cff1::accelerator_t *cff;
+};
+
+struct cff1_path_procs_extents_t : path_procs_t<cff1_path_procs_extents_t, cff1_cs_interp_env_t, extents_param_t>
+{
+  static void moveto (cff1_cs_interp_env_t &env, extents_param_t& param, const point_t &pt)
+  {
+    param.end_path ();
+    env.moveto (pt);
+  }
+
+  static void line (cff1_cs_interp_env_t &env, extents_param_t& param, const point_t &pt1)
+  {
+    if (!param.is_path_open ())
+    {
+      param.start_path ();
+      param.bounds.update (env.get_pt ());
+    }
+    env.moveto (pt1);
+    param.bounds.update (env.get_pt ());
+  }
+
+  static void curve (cff1_cs_interp_env_t &env, extents_param_t& param, const point_t &pt1, const point_t &pt2, const point_t &pt3)
+  {
+    if (!param.is_path_open ())
+    {
+      param.start_path ();
+      param.bounds.update (env.get_pt ());
+    }
+    /* include control points */
+    param.bounds.update (pt1);
+    param.bounds.update (pt2);
+    env.moveto (pt3);
+    param.bounds.update (env.get_pt ());
+  }
+};
+
+static bool _get_bounds (const OT::cff1::accelerator_t *cff, hb_codepoint_t glyph, bounds_t &bounds, bool in_seac=false);
+
+struct cff1_cs_opset_extents_t : cff1_cs_opset_t<cff1_cs_opset_extents_t, extents_param_t, cff1_path_procs_extents_t>
+{
+  static void process_seac (cff1_cs_interp_env_t &env, extents_param_t& param)
+  {
+    unsigned int  n = env.argStack.get_count ();
+    point_t delta;
+    delta.x = env.argStack[n-4];
+    delta.y = env.argStack[n-3];
+    hb_codepoint_t base = param.cff->std_code_to_glyph (env.argStack[n-2].to_int ());
+    hb_codepoint_t accent = param.cff->std_code_to_glyph (env.argStack[n-1].to_int ());
+
+    bounds_t  base_bounds, accent_bounds;
+    if (likely (!env.in_seac && base && accent
+	       && _get_bounds (param.cff, base, base_bounds, true)
+	       && _get_bounds (param.cff, accent, accent_bounds, true)))
+    {
+      param.bounds.merge (base_bounds);
+      accent_bounds.offset (delta);
+      param.bounds.merge (accent_bounds);
+    }
+    else
+      env.set_error ();
+  }
+};
+
+bool _get_bounds (const OT::cff1::accelerator_t *cff, hb_codepoint_t glyph, bounds_t &bounds, bool in_seac)
+{
+  bounds.init ();
+  if (unlikely (!cff->is_valid () || (glyph >= cff->num_glyphs))) return false;
+
+  unsigned int fd = cff->fdSelect->get_fd (glyph);
+  cff1_cs_interpreter_t<cff1_cs_opset_extents_t, extents_param_t> interp;
+  const byte_str_t str = (*cff->charStrings)[glyph];
+  interp.env.init (str, *cff, fd);
+  interp.env.set_in_seac (in_seac);
+  extents_param_t  param;
+  param.init (cff);
+  if (unlikely (!interp.interpret (param))) return false;
+  bounds = param.bounds;
+  return true;
+}
+
+bool OT::cff1::accelerator_t::get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const
+{
+  bounds_t  bounds;
+
+  if (!_get_bounds (this, glyph, bounds))
+    return false;
+
+  if (bounds.min.x >= bounds.max.x)
+  {
+    extents->width = 0;
+    extents->x_bearing = 0;
+  }
+  else
+  {
+    extents->x_bearing = (int32_t)bounds.min.x.floor ();
+    extents->width = (int32_t)bounds.max.x.ceil () - extents->x_bearing;
+  }
+  if (bounds.min.y >= bounds.max.y)
+  {
+    extents->height = 0;
+    extents->y_bearing = 0;
+  }
+  else
+  {
+    extents->y_bearing = (int32_t)bounds.max.y.ceil ();
+    extents->height = (int32_t)bounds.min.y.floor () - extents->y_bearing;
+  }
+
+  return true;
+}
+
+struct get_seac_param_t
+{
+  void init (const OT::cff1::accelerator_t *_cff)
+  {
+    cff = _cff;
+    base = 0;
+    accent = 0;
+  }
+
+  bool has_seac () const { return base && accent; }
+
+  const OT::cff1::accelerator_t *cff;
+  hb_codepoint_t  base;
+  hb_codepoint_t  accent;
+};
+
+struct cff1_cs_opset_seac_t : cff1_cs_opset_t<cff1_cs_opset_seac_t, get_seac_param_t>
+{
+  static void process_seac (cff1_cs_interp_env_t &env, get_seac_param_t& param)
+  {
+    unsigned int  n = env.argStack.get_count ();
+    hb_codepoint_t  base_char = (hb_codepoint_t)env.argStack[n-2].to_int ();
+    hb_codepoint_t  accent_char = (hb_codepoint_t)env.argStack[n-1].to_int ();
+
+    param.base = param.cff->std_code_to_glyph (base_char);
+    param.accent = param.cff->std_code_to_glyph (accent_char);
+  }
+};
+
+bool OT::cff1::accelerator_t::get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const
+{
+  if (unlikely (!is_valid () || (glyph >= num_glyphs))) return false;
+
+  unsigned int fd = fdSelect->get_fd (glyph);
+  cff1_cs_interpreter_t<cff1_cs_opset_seac_t, get_seac_param_t> interp;
+  const byte_str_t str = (*charStrings)[glyph];
+  interp.env.init (str, *this, fd);
+  get_seac_param_t  param;
+  param.init (this);
+  if (unlikely (!interp.interpret (param))) return false;
+
+  if (param.has_seac ())
+  {
+    *base = param.base;
+    *accent = param.accent;
+    return true;
+  }
+  return false;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff1-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff1-table.hh
new file mode 100644
index 0000000..1effdf0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff1-table.hh
@@ -0,0 +1,1299 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_OT_CFF1_TABLE_HH
+#define HB_OT_CFF1_TABLE_HH
+
+#include "hb-ot-head-table.hh"
+#include "hb-ot-cff-common.hh"
+#include "hb-subset-cff1.hh"
+
+namespace CFF {
+
+/*
+ * CFF -- Compact Font Format (CFF)
+ * http://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5176.CFF.pdf
+ */
+#define HB_OT_TAG_cff1 HB_TAG('C','F','F',' ')
+
+#define CFF_UNDEF_SID   CFF_UNDEF_CODE
+
+enum EncodingID { StandardEncoding = 0, ExpertEncoding = 1 };
+enum CharsetID { ISOAdobeCharset = 0, ExpertCharset = 1, ExpertSubsetCharset = 2 };
+
+typedef CFFIndex<HBUINT16>  CFF1Index;
+template <typename Type> struct CFF1IndexOf : CFFIndexOf<HBUINT16, Type> {};
+
+typedef CFFIndex<HBUINT16> CFF1Index;
+typedef CFF1Index          CFF1CharStrings;
+typedef FDArray<HBUINT16>  CFF1FDArray;
+typedef Subrs<HBUINT16>    CFF1Subrs;
+
+struct CFF1FDSelect : FDSelect {};
+
+/* Encoding */
+struct Encoding0 {
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && codes[nCodes - 1].sanitize (c));
+  }
+
+  hb_codepoint_t get_code (hb_codepoint_t glyph) const
+  {
+    assert (glyph > 0);
+    glyph--;
+    if (glyph < nCodes)
+    {
+      return (hb_codepoint_t)codes[glyph];
+    }
+    else
+      return CFF_UNDEF_CODE;
+  }
+
+  unsigned int get_size () const
+  { return HBUINT8::static_size * (nCodes + 1); }
+
+  HBUINT8     nCodes;
+  HBUINT8     codes[VAR];
+
+  DEFINE_SIZE_ARRAY(1, codes);
+};
+
+struct Encoding1_Range {
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT8   first;
+  HBUINT8   nLeft;
+
+  DEFINE_SIZE_STATIC (2);
+};
+
+struct Encoding1 {
+  unsigned int get_size () const
+  { return HBUINT8::static_size + Encoding1_Range::static_size * nRanges; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && ((nRanges == 0) || (ranges[nRanges - 1]).sanitize (c)));
+  }
+
+  hb_codepoint_t get_code (hb_codepoint_t glyph) const
+  {
+    assert (glyph > 0);
+    glyph--;
+    for (unsigned int i = 0; i < nRanges; i++)
+    {
+      if (glyph <= ranges[i].nLeft)
+      {
+	return (hb_codepoint_t)ranges[i].first + glyph;
+      }
+      glyph -= (ranges[i].nLeft + 1);
+    }
+    return CFF_UNDEF_CODE;
+  }
+
+  HBUINT8	   nRanges;
+  Encoding1_Range   ranges[VAR];
+
+  DEFINE_SIZE_ARRAY (1, ranges);
+};
+
+struct SuppEncoding {
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT8   code;
+  HBUINT16  glyph;
+
+  DEFINE_SIZE_STATIC (3);
+};
+
+struct CFF1SuppEncData {
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && ((nSups == 0) || (supps[nSups - 1]).sanitize (c)));
+  }
+
+  void get_codes (hb_codepoint_t sid, hb_vector_t<hb_codepoint_t> &codes) const
+  {
+    for (unsigned int i = 0; i < nSups; i++)
+      if (sid == supps[i].glyph)
+	codes.push (supps[i].code);
+  }
+
+  unsigned int get_size () const
+  { return HBUINT8::static_size + SuppEncoding::static_size * nSups; }
+
+  HBUINT8	 nSups;
+  SuppEncoding   supps[VAR];
+
+  DEFINE_SIZE_ARRAY (1, supps);
+};
+
+struct Encoding {
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+
+    if (unlikely (!c->check_struct (this)))
+      return_trace (false);
+    unsigned int fmt = format & 0x7F;
+    if (unlikely (fmt > 1))
+      return_trace (false);
+    if (unlikely (!((fmt == 0)? u.format0.sanitize (c): u.format1.sanitize (c))))
+      return_trace (false);
+    return_trace (((format & 0x80) == 0) || suppEncData ().sanitize (c));
+  }
+
+  /* serialize a fullset Encoding */
+  bool serialize (hb_serialize_context_t *c, const Encoding &src)
+  {
+    TRACE_SERIALIZE (this);
+    unsigned int size = src.get_size ();
+    Encoding *dest = c->allocate_size<Encoding> (size);
+    if (unlikely (dest == nullptr)) return_trace (false);
+    memcpy (dest, &src, size);
+    return_trace (true);
+  }
+
+  /* serialize a subset Encoding */
+  bool serialize (hb_serialize_context_t *c,
+		  uint8_t format,
+		  unsigned int enc_count,
+		  const hb_vector_t<code_pair_t>& code_ranges,
+		  const hb_vector_t<code_pair_t>& supp_codes)
+  {
+    TRACE_SERIALIZE (this);
+    Encoding *dest = c->extend_min (*this);
+    if (unlikely (dest == nullptr)) return_trace (false);
+    dest->format.set (format | ((supp_codes.length > 0)? 0x80: 0));
+    if (format == 0)
+    {
+      Encoding0 *fmt0 = c->allocate_size<Encoding0> (Encoding0::min_size + HBUINT8::static_size * enc_count);
+    if (unlikely (fmt0 == nullptr)) return_trace (false);
+      fmt0->nCodes.set (enc_count);
+      unsigned int glyph = 0;
+      for (unsigned int i = 0; i < code_ranges.length; i++)
+      {
+	hb_codepoint_t code = code_ranges[i].code;
+	for (int left = (int)code_ranges[i].glyph; left >= 0; left--)
+	  fmt0->codes[glyph++].set (code++);
+	if (unlikely (!((glyph <= 0x100) && (code <= 0x100))))
+	  return_trace (false);
+      }
+    }
+    else
+    {
+      Encoding1 *fmt1 = c->allocate_size<Encoding1> (Encoding1::min_size + Encoding1_Range::static_size * code_ranges.length);
+      if (unlikely (fmt1 == nullptr)) return_trace (false);
+      fmt1->nRanges.set (code_ranges.length);
+      for (unsigned int i = 0; i < code_ranges.length; i++)
+      {
+	if (unlikely (!((code_ranges[i].code <= 0xFF) && (code_ranges[i].glyph <= 0xFF))))
+	  return_trace (false);
+	fmt1->ranges[i].first.set (code_ranges[i].code);
+	fmt1->ranges[i].nLeft.set (code_ranges[i].glyph);
+      }
+    }
+    if (supp_codes.length > 0)
+    {
+      CFF1SuppEncData *suppData = c->allocate_size<CFF1SuppEncData> (CFF1SuppEncData::min_size + SuppEncoding::static_size * supp_codes.length);
+      if (unlikely (suppData == nullptr)) return_trace (false);
+      suppData->nSups.set (supp_codes.length);
+      for (unsigned int i = 0; i < supp_codes.length; i++)
+      {
+	suppData->supps[i].code.set (supp_codes[i].code);
+	suppData->supps[i].glyph.set (supp_codes[i].glyph); /* actually SID */
+      }
+    }
+    return_trace (true);
+  }
+
+  /* parallel to above: calculate the size of a subset Encoding */
+  static unsigned int calculate_serialized_size (uint8_t format,
+						 unsigned int enc_count,
+						 unsigned int supp_count)
+  {
+    unsigned int  size = min_size;
+    if (format == 0)
+      size += Encoding0::min_size + HBUINT8::static_size * enc_count;
+    else
+      size += Encoding1::min_size + Encoding1_Range::static_size * enc_count;
+    if (supp_count > 0)
+      size += CFF1SuppEncData::min_size + SuppEncoding::static_size * supp_count;
+    return size;
+  }
+
+  unsigned int get_size () const
+  {
+    unsigned int size = min_size;
+    if (table_format () == 0)
+      size += u.format0.get_size ();
+    else
+      size += u.format1.get_size ();
+    if (has_supplement ())
+      size += suppEncData ().get_size ();
+    return size;
+  }
+
+  hb_codepoint_t get_code (hb_codepoint_t glyph) const
+  {
+    if (table_format () == 0)
+      return u.format0.get_code (glyph);
+    else
+      return u.format1.get_code (glyph);
+  }
+
+  uint8_t table_format () const { return (format & 0x7F); }
+  bool  has_supplement () const { return (format & 0x80) != 0; }
+
+  void get_supplement_codes (hb_codepoint_t sid, hb_vector_t<hb_codepoint_t> &codes) const
+  {
+    codes.resize (0);
+    if (has_supplement ())
+      suppEncData().get_codes (sid, codes);
+  }
+
+  protected:
+  const CFF1SuppEncData &suppEncData () const
+  {
+    if ((format & 0x7F) == 0)
+      return StructAfter<CFF1SuppEncData> (u.format0.codes[u.format0.nCodes-1]);
+    else
+      return StructAfter<CFF1SuppEncData> (u.format1.ranges[u.format1.nRanges-1]);
+  }
+
+  public:
+  HBUINT8       format;
+
+  union {
+    Encoding0   format0;
+    Encoding1   format1;
+  } u;
+  /* CFF1SuppEncData  suppEncData; */
+
+  DEFINE_SIZE_MIN (1);
+};
+
+/* Charset */
+struct Charset0 {
+  bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && sids[num_glyphs - 1].sanitize (c));
+  }
+
+  hb_codepoint_t get_sid (hb_codepoint_t glyph) const
+  {
+    if (glyph == 0)
+      return 0;
+    else
+      return sids[glyph - 1];
+  }
+
+  hb_codepoint_t get_glyph (hb_codepoint_t sid, unsigned int num_glyphs) const
+  {
+    if (sid == 0)
+      return 0;
+
+    for (unsigned int glyph = 1; glyph < num_glyphs; glyph++)
+    {
+      if (sids[glyph-1] == sid)
+	return glyph;
+    }
+    return 0;
+  }
+
+  unsigned int get_size (unsigned int num_glyphs) const
+  {
+    assert (num_glyphs > 0);
+    return HBUINT16::static_size * (num_glyphs - 1);
+  }
+
+  HBUINT16  sids[VAR];
+
+  DEFINE_SIZE_ARRAY(0, sids);
+};
+
+template <typename TYPE>
+struct Charset_Range {
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT16  first;
+  TYPE      nLeft;
+
+  DEFINE_SIZE_STATIC (HBUINT16::static_size + TYPE::static_size);
+};
+
+template <typename TYPE>
+struct Charset1_2 {
+  bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!c->check_struct (this)))
+      return_trace (false);
+    num_glyphs--;
+    for (unsigned int i = 0; num_glyphs > 0; i++)
+    {
+      if (unlikely (!ranges[i].sanitize (c) || (num_glyphs < ranges[i].nLeft + 1)))
+	return_trace (false);
+      num_glyphs -= (ranges[i].nLeft + 1);
+    }
+    return_trace (true);
+  }
+
+  hb_codepoint_t get_sid (hb_codepoint_t glyph) const
+  {
+    if (glyph == 0) return 0;
+    glyph--;
+    for (unsigned int i = 0;; i++)
+    {
+      if (glyph <= ranges[i].nLeft)
+	return (hb_codepoint_t)ranges[i].first + glyph;
+      glyph -= (ranges[i].nLeft + 1);
+    }
+
+    return 0;
+  }
+
+  hb_codepoint_t get_glyph (hb_codepoint_t sid, unsigned int num_glyphs) const
+  {
+    if (sid == 0) return 0;
+    hb_codepoint_t  glyph = 1;
+    for (unsigned int i = 0;; i++)
+    {
+      if (glyph >= num_glyphs)
+      	return 0;
+      if ((ranges[i].first <= sid) && (sid <= ranges[i].first + ranges[i].nLeft))
+	return glyph + (sid - ranges[i].first);
+      glyph += (ranges[i].nLeft + 1);
+    }
+
+    return 0;
+  }
+
+  unsigned int get_size (unsigned int num_glyphs) const
+  {
+    unsigned int size = HBUINT8::static_size;
+    int glyph = (int)num_glyphs;
+
+    assert (glyph > 0);
+    glyph--;
+    for (unsigned int i = 0; glyph > 0; i++)
+    {
+      glyph -= (ranges[i].nLeft + 1);
+      size += Charset_Range<TYPE>::static_size;
+    }
+
+    return size;
+  }
+
+  Charset_Range<TYPE>   ranges[VAR];
+
+  DEFINE_SIZE_ARRAY (0, ranges);
+};
+
+typedef Charset1_2<HBUINT8>     Charset1;
+typedef Charset1_2<HBUINT16>    Charset2;
+typedef Charset_Range<HBUINT8>  Charset1_Range;
+typedef Charset_Range<HBUINT16> Charset2_Range;
+
+struct Charset {
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+
+    if (unlikely (!c->check_struct (this)))
+      return_trace (false);
+    if (format == 0)
+      return_trace (u.format0.sanitize (c, c->get_num_glyphs ()));
+    else if (format == 1)
+      return_trace (u.format1.sanitize (c, c->get_num_glyphs ()));
+    else if (likely (format == 2))
+      return_trace (u.format2.sanitize (c, c->get_num_glyphs ()));
+    else
+      return_trace (false);
+  }
+
+  /* serialize a fullset Charset */
+  bool serialize (hb_serialize_context_t *c, const Charset &src, unsigned int num_glyphs)
+  {
+    TRACE_SERIALIZE (this);
+    unsigned int size = src.get_size (num_glyphs);
+    Charset *dest = c->allocate_size<Charset> (size);
+    if (unlikely (dest == nullptr)) return_trace (false);
+    memcpy (dest, &src, size);
+    return_trace (true);
+  }
+
+  /* serialize a subset Charset */
+  bool serialize (hb_serialize_context_t *c,
+		  uint8_t format,
+		  unsigned int num_glyphs,
+		  const hb_vector_t<code_pair_t>& sid_ranges)
+  {
+    TRACE_SERIALIZE (this);
+    Charset *dest = c->extend_min (*this);
+    if (unlikely (dest == nullptr)) return_trace (false);
+    dest->format.set (format);
+    if (format == 0)
+    {
+      Charset0 *fmt0 = c->allocate_size<Charset0> (Charset0::min_size + HBUINT16::static_size * (num_glyphs - 1));
+    if (unlikely (fmt0 == nullptr)) return_trace (false);
+      unsigned int glyph = 0;
+      for (unsigned int i = 0; i < sid_ranges.length; i++)
+      {
+	hb_codepoint_t sid = sid_ranges[i].code;
+	for (int left = (int)sid_ranges[i].glyph; left >= 0; left--)
+	  fmt0->sids[glyph++].set (sid++);
+      }
+    }
+    else if (format == 1)
+    {
+      Charset1 *fmt1 = c->allocate_size<Charset1> (Charset1::min_size + Charset1_Range::static_size * sid_ranges.length);
+      if (unlikely (fmt1 == nullptr)) return_trace (false);
+      for (unsigned int i = 0; i < sid_ranges.length; i++)
+      {
+      	if (unlikely (!(sid_ranges[i].glyph <= 0xFF)))
+	  return_trace (false);
+	fmt1->ranges[i].first.set (sid_ranges[i].code);
+	fmt1->ranges[i].nLeft.set (sid_ranges[i].glyph);
+      }
+    }
+    else /* format 2 */
+    {
+      Charset2 *fmt2 = c->allocate_size<Charset2> (Charset2::min_size + Charset2_Range::static_size * sid_ranges.length);
+      if (unlikely (fmt2 == nullptr)) return_trace (false);
+      for (unsigned int i = 0; i < sid_ranges.length; i++)
+      {
+      	if (unlikely (!(sid_ranges[i].glyph <= 0xFFFF)))
+	  return_trace (false);
+	fmt2->ranges[i].first.set (sid_ranges[i].code);
+	fmt2->ranges[i].nLeft.set (sid_ranges[i].glyph);
+      }
+    }
+    return_trace (true);
+  }
+
+  /* parallel to above: calculate the size of a subset Charset */
+  static unsigned int calculate_serialized_size (
+			uint8_t format,
+			unsigned int count)
+  {
+    unsigned int  size = min_size;
+    if (format == 0)
+      size += Charset0::min_size + HBUINT16::static_size * (count - 1);
+    else if (format == 1)
+      size += Charset1::min_size + Charset1_Range::static_size * count;
+    else
+      size += Charset2::min_size + Charset2_Range::static_size * count;
+
+    return size;
+  }
+
+  unsigned int get_size (unsigned int num_glyphs) const
+  {
+    unsigned int size = min_size;
+    if (format == 0)
+      size += u.format0.get_size (num_glyphs);
+    else if (format == 1)
+      size += u.format1.get_size (num_glyphs);
+    else
+      size += u.format2.get_size (num_glyphs);
+    return size;
+  }
+
+  hb_codepoint_t get_sid (hb_codepoint_t glyph) const
+  {
+    if (format == 0)
+      return u.format0.get_sid (glyph);
+    else if (format == 1)
+      return u.format1.get_sid (glyph);
+    else
+      return u.format2.get_sid (glyph);
+  }
+
+  hb_codepoint_t get_glyph (hb_codepoint_t sid, unsigned int num_glyphs) const
+  {
+    if (format == 0)
+      return u.format0.get_glyph (sid, num_glyphs);
+    else if (format == 1)
+      return u.format1.get_glyph (sid, num_glyphs);
+    else
+      return u.format2.get_glyph (sid, num_glyphs);
+  }
+
+  HBUINT8       format;
+  union {
+    Charset0    format0;
+    Charset1    format1;
+    Charset2    format2;
+  } u;
+
+  DEFINE_SIZE_MIN (1);
+};
+
+struct CFF1StringIndex : CFF1Index
+{
+  bool serialize (hb_serialize_context_t *c, const CFF1StringIndex &strings,
+		  unsigned int offSize_, const remap_t &sidmap)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely ((strings.count == 0) || (sidmap.get_count () == 0)))
+    {
+      if (!unlikely (c->extend_min (this->count)))
+	return_trace (false);
+      count.set (0);
+      return_trace (true);
+    }
+
+    byte_str_array_t bytesArray;
+    bytesArray.init ();
+    if (!bytesArray.resize (sidmap.get_count ()))
+      return_trace (false);
+    for (unsigned int i = 0; i < strings.count; i++)
+    {
+      hb_codepoint_t  j = sidmap[i];
+      if (j != CFF_UNDEF_CODE)
+	bytesArray[j] = strings[i];
+    }
+
+    bool result = CFF1Index::serialize (c, offSize_, bytesArray);
+    bytesArray.fini ();
+    return_trace (result);
+  }
+
+  /* in parallel to above */
+  unsigned int calculate_serialized_size (unsigned int &offSize /*OUT*/, const remap_t &sidmap) const
+  {
+    offSize = 0;
+    if ((count == 0) || (sidmap.get_count () == 0))
+      return count.static_size;
+
+    unsigned int dataSize = 0;
+    for (unsigned int i = 0; i < count; i++)
+      if (sidmap[i] != CFF_UNDEF_CODE)
+	dataSize += length_at (i);
+
+    offSize = calcOffSize(dataSize);
+    return CFF1Index::calculate_serialized_size (offSize, sidmap.get_count (), dataSize);
+  }
+};
+
+struct cff1_top_dict_interp_env_t : num_interp_env_t
+{
+  cff1_top_dict_interp_env_t ()
+    : num_interp_env_t(), prev_offset(0), last_offset(0) {}
+
+  unsigned int prev_offset;
+  unsigned int last_offset;
+};
+
+struct name_dict_values_t
+{
+  enum name_dict_val_index_t
+  {
+      version,
+      notice,
+      copyright,
+      fullName,
+      familyName,
+      weight,
+      postscript,
+      fontName,
+      baseFontName,
+      registry,
+      ordering,
+
+      ValCount
+  };
+
+  void init ()
+  {
+    for (unsigned int i = 0; i < ValCount; i++)
+      values[i] = CFF_UNDEF_SID;
+  }
+
+  unsigned int& operator[] (unsigned int i)
+  { assert (i < ValCount); return values[i]; }
+
+  unsigned int operator[] (unsigned int i) const
+  { assert (i < ValCount); return values[i]; }
+
+  static enum name_dict_val_index_t name_op_to_index (op_code_t op)
+  {
+    switch (op) {
+      default: // can't happen - just make some compiler happy
+      case OpCode_version:
+	return version;
+      case OpCode_Notice:
+	return notice;
+      case OpCode_Copyright:
+	return copyright;
+      case OpCode_FullName:
+	return fullName;
+      case OpCode_FamilyName:
+	return familyName;
+      case OpCode_Weight:
+	return weight;
+      case OpCode_PostScript:
+	return postscript;
+      case OpCode_FontName:
+	return fontName;
+      case OpCode_BaseFontName:
+	return baseFontName;
+    }
+  }
+
+  unsigned int  values[ValCount];
+};
+
+struct cff1_top_dict_val_t : op_str_t
+{
+  unsigned int  last_arg_offset;
+};
+
+struct cff1_top_dict_values_t : top_dict_values_t<cff1_top_dict_val_t>
+{
+  void init ()
+  {
+    top_dict_values_t<cff1_top_dict_val_t>::init ();
+
+    nameSIDs.init ();
+    ros_supplement = 0;
+    cidCount = 8720;
+    EncodingOffset = 0;
+    CharsetOffset = 0;
+    FDSelectOffset = 0;
+    privateDictInfo.init ();
+  }
+  void fini () { top_dict_values_t<cff1_top_dict_val_t>::fini (); }
+
+  bool is_CID () const
+  { return nameSIDs[name_dict_values_t::registry] != CFF_UNDEF_SID; }
+
+  name_dict_values_t  nameSIDs;
+  unsigned int    ros_supplement_offset;
+  unsigned int    ros_supplement;
+  unsigned int    cidCount;
+
+  unsigned int    EncodingOffset;
+  unsigned int    CharsetOffset;
+  unsigned int    FDSelectOffset;
+  table_info_t       privateDictInfo;
+};
+
+struct cff1_top_dict_opset_t : top_dict_opset_t<cff1_top_dict_val_t>
+{
+  static void process_op (op_code_t op, cff1_top_dict_interp_env_t& env, cff1_top_dict_values_t& dictval)
+  {
+    cff1_top_dict_val_t  val;
+    val.last_arg_offset = (env.last_offset-1) - dictval.opStart;  /* offset to the last argument */
+
+    switch (op) {
+      case OpCode_version:
+      case OpCode_Notice:
+      case OpCode_Copyright:
+      case OpCode_FullName:
+      case OpCode_FamilyName:
+      case OpCode_Weight:
+      case OpCode_PostScript:
+      case OpCode_BaseFontName:
+	dictval.nameSIDs[name_dict_values_t::name_op_to_index (op)] = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+      case OpCode_isFixedPitch:
+      case OpCode_ItalicAngle:
+      case OpCode_UnderlinePosition:
+      case OpCode_UnderlineThickness:
+      case OpCode_PaintType:
+      case OpCode_CharstringType:
+      case OpCode_UniqueID:
+      case OpCode_StrokeWidth:
+      case OpCode_SyntheticBase:
+      case OpCode_CIDFontVersion:
+      case OpCode_CIDFontRevision:
+      case OpCode_CIDFontType:
+      case OpCode_UIDBase:
+      case OpCode_FontBBox:
+      case OpCode_XUID:
+      case OpCode_BaseFontBlend:
+	env.clear_args ();
+	break;
+
+      case OpCode_CIDCount:
+	dictval.cidCount = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+
+      case OpCode_ROS:
+	dictval.ros_supplement = env.argStack.pop_uint ();
+	dictval.nameSIDs[name_dict_values_t::ordering] = env.argStack.pop_uint ();
+	dictval.nameSIDs[name_dict_values_t::registry] = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+
+      case OpCode_Encoding:
+	dictval.EncodingOffset = env.argStack.pop_uint ();
+	env.clear_args ();
+	if (unlikely (dictval.EncodingOffset == 0)) return;
+	break;
+
+      case OpCode_charset:
+	dictval.CharsetOffset = env.argStack.pop_uint ();
+	env.clear_args ();
+	if (unlikely (dictval.CharsetOffset == 0)) return;
+	break;
+
+      case OpCode_FDSelect:
+	dictval.FDSelectOffset = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+
+      case OpCode_Private:
+	dictval.privateDictInfo.offset = env.argStack.pop_uint ();
+	dictval.privateDictInfo.size = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+
+      default:
+	env.last_offset = env.str_ref.offset;
+	top_dict_opset_t<cff1_top_dict_val_t>::process_op (op, env, dictval);
+	/* Record this operand below if stack is empty, otherwise done */
+	if (!env.argStack.is_empty ()) return;
+	break;
+    }
+
+    if (unlikely (env.in_error ())) return;
+
+    dictval.add_op (op, env.str_ref, val);
+  }
+};
+
+struct cff1_font_dict_values_t : dict_values_t<op_str_t>
+{
+  void init ()
+  {
+    dict_values_t<op_str_t>::init ();
+    privateDictInfo.init ();
+    fontName = CFF_UNDEF_SID;
+  }
+  void fini () { dict_values_t<op_str_t>::fini (); }
+
+  table_info_t       privateDictInfo;
+  unsigned int    fontName;
+};
+
+struct cff1_font_dict_opset_t : dict_opset_t
+{
+  static void process_op (op_code_t op, num_interp_env_t& env, cff1_font_dict_values_t& dictval)
+  {
+    switch (op) {
+      case OpCode_FontName:
+	dictval.fontName = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+      case OpCode_FontMatrix:
+      case OpCode_PaintType:
+	env.clear_args ();
+	break;
+      case OpCode_Private:
+	dictval.privateDictInfo.offset = env.argStack.pop_uint ();
+	dictval.privateDictInfo.size = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+
+      default:
+	dict_opset_t::process_op (op, env);
+	if (!env.argStack.is_empty ()) return;
+	break;
+    }
+
+    if (unlikely (env.in_error ())) return;
+
+    dictval.add_op (op, env.str_ref);
+  }
+};
+
+template <typename VAL>
+struct cff1_private_dict_values_base_t : dict_values_t<VAL>
+{
+  void init ()
+  {
+    dict_values_t<VAL>::init ();
+    subrsOffset = 0;
+    localSubrs = &Null(CFF1Subrs);
+  }
+  void fini () { dict_values_t<VAL>::fini (); }
+
+  unsigned int calculate_serialized_size () const
+  {
+    unsigned int size = 0;
+    for (unsigned int i = 0; i < dict_values_t<VAL>::get_count; i++)
+      if (dict_values_t<VAL>::get_value (i).op == OpCode_Subrs)
+	size += OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Subrs);
+      else
+	size += dict_values_t<VAL>::get_value (i).str.length;
+    return size;
+  }
+
+  unsigned int      subrsOffset;
+  const CFF1Subrs    *localSubrs;
+};
+
+typedef cff1_private_dict_values_base_t<op_str_t> cff1_private_dict_values_subset_t;
+typedef cff1_private_dict_values_base_t<num_dict_val_t> cff1_private_dict_values_t;
+
+struct cff1_private_dict_opset_t : dict_opset_t
+{
+  static void process_op (op_code_t op, num_interp_env_t& env, cff1_private_dict_values_t& dictval)
+  {
+    num_dict_val_t val;
+    val.init ();
+
+    switch (op) {
+      case OpCode_BlueValues:
+      case OpCode_OtherBlues:
+      case OpCode_FamilyBlues:
+      case OpCode_FamilyOtherBlues:
+      case OpCode_StemSnapH:
+      case OpCode_StemSnapV:
+	env.clear_args ();
+	break;
+      case OpCode_StdHW:
+      case OpCode_StdVW:
+      case OpCode_BlueScale:
+      case OpCode_BlueShift:
+      case OpCode_BlueFuzz:
+      case OpCode_ForceBold:
+      case OpCode_LanguageGroup:
+      case OpCode_ExpansionFactor:
+      case OpCode_initialRandomSeed:
+      case OpCode_defaultWidthX:
+      case OpCode_nominalWidthX:
+	val.single_val = env.argStack.pop_num ();
+	env.clear_args ();
+	break;
+      case OpCode_Subrs:
+	dictval.subrsOffset = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+
+      default:
+	dict_opset_t::process_op (op, env);
+	if (!env.argStack.is_empty ()) return;
+	break;
+    }
+
+    if (unlikely (env.in_error ())) return;
+
+    dictval.add_op (op, env.str_ref, val);
+  }
+};
+
+struct cff1_private_dict_opset_subset : dict_opset_t
+{
+  static void process_op (op_code_t op, num_interp_env_t& env, cff1_private_dict_values_subset_t& dictval)
+  {
+    switch (op) {
+      case OpCode_BlueValues:
+      case OpCode_OtherBlues:
+      case OpCode_FamilyBlues:
+      case OpCode_FamilyOtherBlues:
+      case OpCode_StemSnapH:
+      case OpCode_StemSnapV:
+      case OpCode_StdHW:
+      case OpCode_StdVW:
+      case OpCode_BlueScale:
+      case OpCode_BlueShift:
+      case OpCode_BlueFuzz:
+      case OpCode_ForceBold:
+      case OpCode_LanguageGroup:
+      case OpCode_ExpansionFactor:
+      case OpCode_initialRandomSeed:
+      case OpCode_defaultWidthX:
+      case OpCode_nominalWidthX:
+	env.clear_args ();
+	break;
+
+      case OpCode_Subrs:
+	dictval.subrsOffset = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+
+      default:
+	dict_opset_t::process_op (op, env);
+	if (!env.argStack.is_empty ()) return;
+	break;
+    }
+
+    if (unlikely (env.in_error ())) return;
+
+    dictval.add_op (op, env.str_ref);
+  }
+};
+
+typedef dict_interpreter_t<cff1_top_dict_opset_t, cff1_top_dict_values_t, cff1_top_dict_interp_env_t> cff1_top_dict_interpreter_t;
+typedef dict_interpreter_t<cff1_font_dict_opset_t, cff1_font_dict_values_t> cff1_font_dict_interpreter_t;
+
+typedef CFF1Index CFF1NameIndex;
+typedef CFF1IndexOf<TopDict> CFF1TopDictIndex;
+
+} /* namespace CFF */
+
+namespace OT {
+
+using namespace CFF;
+
+struct cff1
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_cff1;
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  likely (version.major == 1));
+  }
+
+  template <typename PRIVOPSET, typename PRIVDICTVAL>
+  struct accelerator_templ_t
+  {
+    void init (hb_face_t *face)
+    {
+      topDict.init ();
+      fontDicts.init ();
+      privateDicts.init ();
+
+      this->blob = sc.reference_table<cff1> (face);
+
+      /* setup for run-time santization */
+      sc.init (this->blob);
+      sc.start_processing ();
+
+      const OT::cff1 *cff = this->blob->template as<OT::cff1> ();
+
+      if (cff == &Null(OT::cff1))
+      { fini (); return; }
+
+      nameIndex = &cff->nameIndex (cff);
+      if ((nameIndex == &Null (CFF1NameIndex)) || !nameIndex->sanitize (&sc))
+      { fini (); return; }
+
+      topDictIndex = &StructAtOffset<CFF1TopDictIndex> (nameIndex, nameIndex->get_size ());
+      if ((topDictIndex == &Null (CFF1TopDictIndex)) || !topDictIndex->sanitize (&sc) || (topDictIndex->count == 0))
+      { fini (); return; }
+
+      { /* parse top dict */
+	const byte_str_t topDictStr = (*topDictIndex)[0];
+	if (unlikely (!topDictStr.sanitize (&sc))) { fini (); return; }
+	cff1_top_dict_interpreter_t top_interp;
+	top_interp.env.init (topDictStr);
+	topDict.init ();
+	if (unlikely (!top_interp.interpret (topDict))) { fini (); return; }
+      }
+
+      if (is_predef_charset ())
+	charset = &Null(Charset);
+      else
+      {
+	charset = &StructAtOffsetOrNull<Charset> (cff, topDict.CharsetOffset);
+	if (unlikely ((charset == &Null (Charset)) || !charset->sanitize (&sc))) { fini (); return; }
+      }
+
+      fdCount = 1;
+      if (is_CID ())
+      {
+	fdArray = &StructAtOffsetOrNull<CFF1FDArray> (cff, topDict.FDArrayOffset);
+	fdSelect = &StructAtOffsetOrNull<CFF1FDSelect> (cff, topDict.FDSelectOffset);
+	if (unlikely ((fdArray == &Null(CFF1FDArray)) || !fdArray->sanitize (&sc) ||
+	    (fdSelect == &Null(CFF1FDSelect)) || !fdSelect->sanitize (&sc, fdArray->count)))
+	{ fini (); return; }
+
+	fdCount = fdArray->count;
+      }
+      else
+      {
+	fdArray = &Null(CFF1FDArray);
+	fdSelect = &Null(CFF1FDSelect);
+      }
+
+      stringIndex = &StructAtOffset<CFF1StringIndex> (topDictIndex, topDictIndex->get_size ());
+      if ((stringIndex == &Null (CFF1StringIndex)) || !stringIndex->sanitize (&sc))
+      { fini (); return; }
+
+      globalSubrs = &StructAtOffset<CFF1Subrs> (stringIndex, stringIndex->get_size ());
+      if ((globalSubrs != &Null (CFF1Subrs)) && !globalSubrs->sanitize (&sc))
+      { fini (); return; }
+
+      charStrings = &StructAtOffsetOrNull<CFF1CharStrings> (cff, topDict.charStringsOffset);
+
+      if ((charStrings == &Null(CFF1CharStrings)) || unlikely (!charStrings->sanitize (&sc)))
+      { fini (); return; }
+
+      num_glyphs = charStrings->count;
+      if (num_glyphs != sc.get_num_glyphs ())
+      { fini (); return; }
+
+      privateDicts.resize (fdCount);
+      for (unsigned int i = 0; i < fdCount; i++)
+	privateDicts[i].init ();
+
+      // parse CID font dicts and gather private dicts
+      if (is_CID ())
+      {
+	for (unsigned int i = 0; i < fdCount; i++)
+	{
+	  byte_str_t fontDictStr = (*fdArray)[i];
+	  if (unlikely (!fontDictStr.sanitize (&sc))) { fini (); return; }
+	  cff1_font_dict_values_t  *font;
+	  cff1_font_dict_interpreter_t font_interp;
+	  font_interp.env.init (fontDictStr);
+	  font = fontDicts.push ();
+	  if (unlikely (font == &Crap(cff1_font_dict_values_t))) { fini (); return; }
+	  font->init ();
+	  if (unlikely (!font_interp.interpret (*font))) { fini (); return; }
+	  PRIVDICTVAL  *priv = &privateDicts[i];
+	  const byte_str_t privDictStr (StructAtOffset<UnsizedByteStr> (cff, font->privateDictInfo.offset), font->privateDictInfo.size);
+	  if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; }
+	  dict_interpreter_t<PRIVOPSET, PRIVDICTVAL> priv_interp;
+	  priv_interp.env.init (privDictStr);
+	  priv->init ();
+	  if (unlikely (!priv_interp.interpret (*priv))) { fini (); return; }
+
+	  priv->localSubrs = &StructAtOffsetOrNull<CFF1Subrs> (&privDictStr, priv->subrsOffset);
+	  if (priv->localSubrs != &Null(CFF1Subrs) &&
+	      unlikely (!priv->localSubrs->sanitize (&sc)))
+	  { fini (); return; }
+	}
+      }
+      else  /* non-CID */
+      {
+	cff1_top_dict_values_t  *font = &topDict;
+	PRIVDICTVAL  *priv = &privateDicts[0];
+
+	const byte_str_t privDictStr (StructAtOffset<UnsizedByteStr> (cff, font->privateDictInfo.offset), font->privateDictInfo.size);
+	if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; }
+	dict_interpreter_t<PRIVOPSET, PRIVDICTVAL> priv_interp;
+	priv_interp.env.init (privDictStr);
+	priv->init ();
+	if (unlikely (!priv_interp.interpret (*priv))) { fini (); return; }
+
+	priv->localSubrs = &StructAtOffsetOrNull<CFF1Subrs> (&privDictStr, priv->subrsOffset);
+	if (priv->localSubrs != &Null(CFF1Subrs) &&
+	    unlikely (!priv->localSubrs->sanitize (&sc)))
+	{ fini (); return; }
+      }
+    }
+
+    void fini ()
+    {
+      sc.end_processing ();
+      topDict.fini ();
+      fontDicts.fini_deep ();
+      privateDicts.fini_deep ();
+      hb_blob_destroy (blob);
+      blob = nullptr;
+    }
+
+    bool is_valid () const { return blob != nullptr; }
+    bool is_CID () const { return topDict.is_CID (); }
+
+    bool is_predef_charset () const { return topDict.CharsetOffset <= ExpertSubsetCharset; }
+
+    unsigned int std_code_to_glyph (hb_codepoint_t code) const
+    {
+      hb_codepoint_t sid = lookup_standard_encoding_for_sid (code);
+      if (unlikely (sid == CFF_UNDEF_SID))
+	return 0;
+
+      if (charset != &Null(Charset))
+	return charset->get_glyph (sid, num_glyphs);
+      else if ((topDict.CharsetOffset == ISOAdobeCharset)
+	      && (code <= 228 /*zcaron*/)) return sid;
+      return 0;
+    }
+
+    protected:
+    hb_blob_t	       *blob;
+    hb_sanitize_context_t   sc;
+
+    public:
+    const Charset	   *charset;
+    const CFF1NameIndex     *nameIndex;
+    const CFF1TopDictIndex  *topDictIndex;
+    const CFF1StringIndex   *stringIndex;
+    const CFF1Subrs	 *globalSubrs;
+    const CFF1CharStrings   *charStrings;
+    const CFF1FDArray       *fdArray;
+    const CFF1FDSelect      *fdSelect;
+    unsigned int	    fdCount;
+
+    cff1_top_dict_values_t       topDict;
+    hb_vector_t<cff1_font_dict_values_t>   fontDicts;
+    hb_vector_t<PRIVDICTVAL>	  privateDicts;
+
+    unsigned int	    num_glyphs;
+  };
+
+  struct accelerator_t : accelerator_templ_t<cff1_private_dict_opset_t, cff1_private_dict_values_t>
+  {
+    HB_INTERNAL bool get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const;
+    HB_INTERNAL bool get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const;
+  };
+
+  struct accelerator_subset_t : accelerator_templ_t<cff1_private_dict_opset_subset, cff1_private_dict_values_subset_t>
+  {
+    void init (hb_face_t *face)
+    {
+      SUPER::init (face);
+      if (blob == nullptr) return;
+
+      const OT::cff1 *cff = this->blob->as<OT::cff1> ();
+      encoding = &Null(Encoding);
+      if (is_CID ())
+      {
+	if (unlikely (charset == &Null(Charset))) { fini (); return; }
+      }
+      else
+      {
+	if (!is_predef_encoding ())
+	{
+	  encoding = &StructAtOffsetOrNull<Encoding> (cff, topDict.EncodingOffset);
+	  if (unlikely ((encoding == &Null (Encoding)) || !encoding->sanitize (&sc))) { fini (); return; }
+	}
+      }
+    }
+
+    bool is_predef_encoding () const { return topDict.EncodingOffset <= ExpertEncoding; }
+
+    hb_codepoint_t  glyph_to_code (hb_codepoint_t glyph) const
+    {
+      if (encoding != &Null(Encoding))
+	return encoding->get_code (glyph);
+      else
+      {
+	hb_codepoint_t  sid = glyph_to_sid (glyph);
+	if (sid == 0) return 0;
+	hb_codepoint_t  code = 0;
+	switch (topDict.EncodingOffset)
+	{
+	  case  StandardEncoding:
+	    code = lookup_standard_encoding_for_code (sid);
+	    break;
+	  case  ExpertEncoding:
+	    code = lookup_expert_encoding_for_code (sid);
+	    break;
+	  default:
+	    break;
+	}
+	return code;
+      }
+    }
+
+    hb_codepoint_t glyph_to_sid (hb_codepoint_t glyph) const
+    {
+      if (charset != &Null(Charset))
+	return charset->get_sid (glyph);
+      else
+      {
+	hb_codepoint_t sid = 0;
+	switch (topDict.CharsetOffset)
+	{
+	  case  ISOAdobeCharset:
+	    if (glyph <= 228 /*zcaron*/) sid = glyph;
+	    break;
+	  case  ExpertCharset:
+	    sid = lookup_expert_charset_for_sid (glyph);
+	    break;
+	  case  ExpertSubsetCharset:
+	      sid = lookup_expert_subset_charset_for_sid (glyph);
+	    break;
+	  default:
+	    break;
+	}
+	return sid;
+      }
+    }
+
+    const Encoding	  *encoding;
+
+    private:
+    typedef accelerator_templ_t<cff1_private_dict_opset_subset, cff1_private_dict_values_subset_t> SUPER;
+  };
+
+  bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_blob_t *cff_prime = nullptr;
+
+    bool success = true;
+    if (hb_subset_cff1 (plan, &cff_prime)) {
+      success = success && plan->add_table (HB_OT_TAG_cff1, cff_prime);
+      hb_blob_t *head_blob = hb_sanitize_context_t().reference_table<head> (plan->source);
+      success = success && head_blob && plan->add_table (HB_OT_TAG_head, head_blob);
+      hb_blob_destroy (head_blob);
+    } else {
+      success = false;
+    }
+    hb_blob_destroy (cff_prime);
+
+    return success;
+  }
+
+  protected:
+  HB_INTERNAL static hb_codepoint_t lookup_standard_encoding_for_code (hb_codepoint_t sid);
+  HB_INTERNAL static hb_codepoint_t lookup_expert_encoding_for_code (hb_codepoint_t sid);
+  HB_INTERNAL static hb_codepoint_t lookup_expert_charset_for_sid (hb_codepoint_t glyph);
+  HB_INTERNAL static hb_codepoint_t lookup_expert_subset_charset_for_sid (hb_codepoint_t glyph);
+  HB_INTERNAL static hb_codepoint_t lookup_standard_encoding_for_sid (hb_codepoint_t code);
+
+  public:
+  FixedVersion<HBUINT8> version;	  /* Version of CFF table. set to 0x0100u */
+  OffsetTo<CFF1NameIndex, HBUINT8> nameIndex; /* headerSize = Offset to Name INDEX. */
+  HBUINT8	       offSize;	  /* offset size (unused?) */
+
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct cff1_accelerator_t : cff1::accelerator_t {};
+} /* namespace OT */
+
+#endif /* HB_OT_CFF1_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff2-table.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff2-table.cc
new file mode 100644
index 0000000..7daa536
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff2-table.cc
@@ -0,0 +1,136 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb-ot-cff2-table.hh"
+#include "hb-cff2-interp-cs.hh"
+
+using namespace CFF;
+
+struct extents_param_t
+{
+  void init ()
+  {
+    path_open = false;
+    min_x.set_int (0x7FFFFFFF);
+    min_y.set_int (0x7FFFFFFF);
+    max_x.set_int (-0x80000000);
+    max_y.set_int (-0x80000000);
+  }
+
+  void start_path ()         { path_open = true; }
+  void end_path ()           { path_open = false; }
+  bool is_path_open () const { return path_open; }
+
+  void update_bounds (const point_t &pt)
+  {
+    if (pt.x < min_x) min_x = pt.x;
+    if (pt.x > max_x) max_x = pt.x;
+    if (pt.y < min_y) min_y = pt.y;
+    if (pt.y > max_y) max_y = pt.y;
+  }
+
+  bool  path_open;
+  number_t min_x;
+  number_t min_y;
+  number_t max_x;
+  number_t max_y;
+};
+
+struct cff2_path_procs_extents_t : path_procs_t<cff2_path_procs_extents_t, cff2_cs_interp_env_t, extents_param_t>
+{
+  static void moveto (cff2_cs_interp_env_t &env, extents_param_t& param, const point_t &pt)
+  {
+    param.end_path ();
+    env.moveto (pt);
+  }
+
+  static void line (cff2_cs_interp_env_t &env, extents_param_t& param, const point_t &pt1)
+  {
+    if (!param.is_path_open ())
+    {
+      param.start_path ();
+      param.update_bounds (env.get_pt ());
+    }
+    env.moveto (pt1);
+    param.update_bounds (env.get_pt ());
+  }
+
+  static void curve (cff2_cs_interp_env_t &env, extents_param_t& param, const point_t &pt1, const point_t &pt2, const point_t &pt3)
+  {
+    if (!param.is_path_open ())
+    {
+      param.start_path ();
+      param.update_bounds (env.get_pt ());
+    }
+    /* include control points */
+    param.update_bounds (pt1);
+    param.update_bounds (pt2);
+    env.moveto (pt3);
+    param.update_bounds (env.get_pt ());
+  }
+};
+
+struct cff2_cs_opset_extents_t : cff2_cs_opset_t<cff2_cs_opset_extents_t, extents_param_t, cff2_path_procs_extents_t> {};
+
+bool OT::cff2::accelerator_t::get_extents (hb_font_t *font,
+					   hb_codepoint_t glyph,
+					   hb_glyph_extents_t *extents) const
+{
+  if (unlikely (!is_valid () || (glyph >= num_glyphs))) return false;
+
+  unsigned int num_coords;
+  const int *coords = hb_font_get_var_coords_normalized (font, &num_coords);
+  unsigned int fd = fdSelect->get_fd (glyph);
+  cff2_cs_interpreter_t<cff2_cs_opset_extents_t, extents_param_t> interp;
+  const byte_str_t str = (*charStrings)[glyph];
+  interp.env.init (str, *this, fd, coords, num_coords);
+  extents_param_t  param;
+  param.init ();
+  if (unlikely (!interp.interpret (param))) return false;
+
+  if (param.min_x >= param.max_x)
+  {
+    extents->width = 0;
+    extents->x_bearing = 0;
+  }
+  else
+  {
+    extents->x_bearing = (int32_t)param.min_x.floor ();
+    extents->width = (int32_t)param.max_x.ceil () - extents->x_bearing;
+  }
+  if (param.min_y >= param.max_y)
+  {
+    extents->height = 0;
+    extents->y_bearing = 0;
+  }
+  else
+  {
+    extents->y_bearing = (int32_t)param.max_y.ceil ();
+    extents->height = (int32_t)param.min_y.floor () - extents->y_bearing;
+  }
+
+  return true;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff2-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff2-table.hh
new file mode 100644
index 0000000..a7b0ba9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cff2-table.hh
@@ -0,0 +1,566 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_OT_CFF2_TABLE_HH
+#define HB_OT_CFF2_TABLE_HH
+
+#include "hb-ot-head-table.hh"
+#include "hb-ot-cff-common.hh"
+#include "hb-subset-cff2.hh"
+
+namespace CFF {
+
+/*
+ * CFF2 -- Compact Font Format (CFF) Version 2
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/cff2
+ */
+#define HB_OT_TAG_cff2 HB_TAG('C','F','F','2')
+
+typedef CFFIndex<HBUINT32>  CFF2Index;
+template <typename Type> struct CFF2IndexOf : CFFIndexOf<HBUINT32, Type> {};
+
+typedef CFF2Index         CFF2CharStrings;
+typedef FDArray<HBUINT32> CFF2FDArray;
+typedef Subrs<HBUINT32>   CFF2Subrs;
+
+typedef FDSelect3_4<HBUINT32, HBUINT16> FDSelect4;
+typedef FDSelect3_4_Range<HBUINT32, HBUINT16> FDSelect4_Range;
+
+struct CFF2FDSelect
+{
+  bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const
+  {
+    TRACE_SANITIZE (this);
+
+    return_trace (likely (c->check_struct (this) && (format == 0 || format == 3 || format == 4) &&
+			  (format == 0)?
+			  u.format0.sanitize (c, fdcount):
+			    ((format == 3)?
+			    u.format3.sanitize (c, fdcount):
+			    u.format4.sanitize (c, fdcount))));
+  }
+
+  bool serialize (hb_serialize_context_t *c, const CFF2FDSelect &src, unsigned int num_glyphs)
+  {
+    TRACE_SERIALIZE (this);
+    unsigned int size = src.get_size (num_glyphs);
+    CFF2FDSelect *dest = c->allocate_size<CFF2FDSelect> (size);
+    if (unlikely (dest == nullptr)) return_trace (false);
+    memcpy (dest, &src, size);
+    return_trace (true);
+  }
+
+  unsigned int calculate_serialized_size (unsigned int num_glyphs) const
+  { return get_size (num_glyphs); }
+
+  unsigned int get_size (unsigned int num_glyphs) const
+  {
+    unsigned int size = format.static_size;
+    if (format == 0)
+      size += u.format0.get_size (num_glyphs);
+    else if (format == 3)
+      size += u.format3.get_size ();
+    else
+      size += u.format4.get_size ();
+    return size;
+  }
+
+  hb_codepoint_t get_fd (hb_codepoint_t glyph) const
+  {
+    if (this == &Null(CFF2FDSelect))
+      return 0;
+    if (format == 0)
+      return u.format0.get_fd (glyph);
+    else if (format == 3)
+      return u.format3.get_fd (glyph);
+    else
+      return u.format4.get_fd (glyph);
+  }
+
+  HBUINT8       format;
+  union {
+    FDSelect0   format0;
+    FDSelect3   format3;
+    FDSelect4   format4;
+  } u;
+
+  DEFINE_SIZE_MIN (2);
+};
+
+struct CFF2VariationStore
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)) && c->check_range (&varStore, size) && varStore.sanitize (c));
+  }
+
+  bool serialize (hb_serialize_context_t *c, const CFF2VariationStore *varStore)
+  {
+    TRACE_SERIALIZE (this);
+    unsigned int size_ = varStore->get_size ();
+    CFF2VariationStore *dest = c->allocate_size<CFF2VariationStore> (size_);
+    if (unlikely (dest == nullptr)) return_trace (false);
+    memcpy (dest, varStore, size_);
+    return_trace (true);
+  }
+
+  unsigned int get_size () const { return HBUINT16::static_size + size; }
+
+  HBUINT16	size;
+  VariationStore  varStore;
+
+  DEFINE_SIZE_MIN (2 + VariationStore::min_size);
+};
+
+struct cff2_top_dict_values_t : top_dict_values_t<>
+{
+  void init ()
+  {
+    top_dict_values_t<>::init ();
+    vstoreOffset = 0;
+    FDSelectOffset = 0;
+  }
+  void fini () { top_dict_values_t<>::fini (); }
+
+  unsigned int calculate_serialized_size () const
+  {
+    unsigned int size = 0;
+    for (unsigned int i = 0; i < get_count (); i++)
+    {
+      op_code_t op = get_value (i).op;
+      switch (op)
+      {
+	case OpCode_vstore:
+	case OpCode_FDSelect:
+	  size += OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (op);
+	  break;
+	default:
+	  size += top_dict_values_t<>::calculate_serialized_op_size (get_value (i));
+	  break;
+      }
+    }
+    return size;
+  }
+
+  unsigned int  vstoreOffset;
+  unsigned int  FDSelectOffset;
+};
+
+struct cff2_top_dict_opset_t : top_dict_opset_t<>
+{
+  static void process_op (op_code_t op, num_interp_env_t& env, cff2_top_dict_values_t& dictval)
+  {
+    switch (op) {
+      case OpCode_FontMatrix:
+	{
+	  dict_val_t val;
+	  val.init ();
+	  dictval.add_op (op, env.str_ref);
+	  env.clear_args ();
+	}
+	break;
+
+      case OpCode_vstore:
+	dictval.vstoreOffset = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+      case OpCode_FDSelect:
+	dictval.FDSelectOffset = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+
+      default:
+	SUPER::process_op (op, env, dictval);
+	/* Record this operand below if stack is empty, otherwise done */
+	if (!env.argStack.is_empty ()) return;
+    }
+
+    if (unlikely (env.in_error ())) return;
+
+    dictval.add_op (op, env.str_ref);
+  }
+
+  typedef top_dict_opset_t<> SUPER;
+};
+
+struct cff2_font_dict_values_t : dict_values_t<op_str_t>
+{
+  void init ()
+  {
+    dict_values_t<op_str_t>::init ();
+    privateDictInfo.init ();
+  }
+  void fini () { dict_values_t<op_str_t>::fini (); }
+
+  table_info_t    privateDictInfo;
+};
+
+struct cff2_font_dict_opset_t : dict_opset_t
+{
+  static void process_op (op_code_t op, num_interp_env_t& env, cff2_font_dict_values_t& dictval)
+  {
+    switch (op) {
+      case OpCode_Private:
+	dictval.privateDictInfo.offset = env.argStack.pop_uint ();
+	dictval.privateDictInfo.size = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+
+      default:
+	SUPER::process_op (op, env);
+	if (!env.argStack.is_empty ())
+	  return;
+    }
+
+    if (unlikely (env.in_error ())) return;
+
+    dictval.add_op (op, env.str_ref);
+  }
+
+  private:
+  typedef dict_opset_t SUPER;
+};
+
+template <typename VAL>
+struct cff2_private_dict_values_base_t : dict_values_t<VAL>
+{
+  void init ()
+  {
+    dict_values_t<VAL>::init ();
+    subrsOffset = 0;
+    localSubrs = &Null(CFF2Subrs);
+    ivs = 0;
+  }
+  void fini () { dict_values_t<VAL>::fini (); }
+
+  unsigned int calculate_serialized_size () const
+  {
+    unsigned int size = 0;
+    for (unsigned int i = 0; i < dict_values_t<VAL>::get_count; i++)
+      if (dict_values_t<VAL>::get_value (i).op == OpCode_Subrs)
+	size += OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Subrs);
+      else
+	size += dict_values_t<VAL>::get_value (i).str.length;
+    return size;
+  }
+
+  unsigned int      subrsOffset;
+  const CFF2Subrs   *localSubrs;
+  unsigned int      ivs;
+};
+
+typedef cff2_private_dict_values_base_t<op_str_t> cff2_private_dict_values_subset_t;
+typedef cff2_private_dict_values_base_t<num_dict_val_t> cff2_private_dict_values_t;
+
+struct cff2_priv_dict_interp_env_t : num_interp_env_t
+{
+  void init (const byte_str_t &str)
+  {
+    num_interp_env_t::init (str);
+    ivs = 0;
+    seen_vsindex = false;
+  }
+
+  void process_vsindex ()
+  {
+    if (likely (!seen_vsindex))
+    {
+      set_ivs (argStack.pop_uint ());
+    }
+    seen_vsindex = true;
+  }
+
+  unsigned int get_ivs () const { return ivs; }
+  void	 set_ivs (unsigned int ivs_) { ivs = ivs_; }
+
+  protected:
+  unsigned int  ivs;
+  bool	  seen_vsindex;
+};
+
+struct cff2_private_dict_opset_t : dict_opset_t
+{
+  static void process_op (op_code_t op, cff2_priv_dict_interp_env_t& env, cff2_private_dict_values_t& dictval)
+  {
+    num_dict_val_t val;
+    val.init ();
+
+    switch (op) {
+      case OpCode_StdHW:
+      case OpCode_StdVW:
+      case OpCode_BlueScale:
+      case OpCode_BlueShift:
+      case OpCode_BlueFuzz:
+      case OpCode_ExpansionFactor:
+      case OpCode_LanguageGroup:
+	val.single_val = env.argStack.pop_num ();
+	env.clear_args ();
+	break;
+      case OpCode_BlueValues:
+      case OpCode_OtherBlues:
+      case OpCode_FamilyBlues:
+      case OpCode_FamilyOtherBlues:
+      case OpCode_StemSnapH:
+      case OpCode_StemSnapV:
+	env.clear_args ();
+	break;
+      case OpCode_Subrs:
+	dictval.subrsOffset = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+      case OpCode_vsindexdict:
+	env.process_vsindex ();
+	dictval.ivs = env.get_ivs ();
+	env.clear_args ();
+	break;
+      case OpCode_blenddict:
+	break;
+
+      default:
+	dict_opset_t::process_op (op, env);
+	if (!env.argStack.is_empty ()) return;
+	break;
+    }
+
+    if (unlikely (env.in_error ())) return;
+
+    dictval.add_op (op, env.str_ref, val);
+  }
+};
+
+struct cff2_private_dict_opset_subset_t : dict_opset_t
+{
+  static void process_op (op_code_t op, cff2_priv_dict_interp_env_t& env, cff2_private_dict_values_subset_t& dictval)
+  {
+    switch (op) {
+      case OpCode_BlueValues:
+      case OpCode_OtherBlues:
+      case OpCode_FamilyBlues:
+      case OpCode_FamilyOtherBlues:
+      case OpCode_StdHW:
+      case OpCode_StdVW:
+      case OpCode_BlueScale:
+      case OpCode_BlueShift:
+      case OpCode_BlueFuzz:
+      case OpCode_StemSnapH:
+      case OpCode_StemSnapV:
+      case OpCode_LanguageGroup:
+      case OpCode_ExpansionFactor:
+	env.clear_args ();
+	break;
+
+      case OpCode_blenddict:
+	env.clear_args ();
+	return;
+
+      case OpCode_Subrs:
+	dictval.subrsOffset = env.argStack.pop_uint ();
+	env.clear_args ();
+	break;
+
+      default:
+	SUPER::process_op (op, env);
+	if (!env.argStack.is_empty ()) return;
+	break;
+    }
+
+    if (unlikely (env.in_error ())) return;
+
+    dictval.add_op (op, env.str_ref);
+  }
+
+  private:
+  typedef dict_opset_t SUPER;
+};
+
+typedef dict_interpreter_t<cff2_top_dict_opset_t, cff2_top_dict_values_t> cff2_top_dict_interpreter_t;
+typedef dict_interpreter_t<cff2_font_dict_opset_t, cff2_font_dict_values_t> cff2_font_dict_interpreter_t;
+
+} /* namespace CFF */
+
+namespace OT {
+
+using namespace CFF;
+
+struct cff2
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_cff2;
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  likely (version.major == 2));
+  }
+
+  template <typename PRIVOPSET, typename PRIVDICTVAL>
+  struct accelerator_templ_t
+  {
+    void init (hb_face_t *face)
+    {
+      topDict.init ();
+      fontDicts.init ();
+      privateDicts.init ();
+
+      this->blob = sc.reference_table<cff2> (face);
+
+      /* setup for run-time santization */
+      sc.init (this->blob);
+      sc.start_processing ();
+
+      const OT::cff2 *cff2 = this->blob->template as<OT::cff2> ();
+
+      if (cff2 == &Null(OT::cff2))
+      { fini (); return; }
+
+      { /* parse top dict */
+	byte_str_t topDictStr (cff2 + cff2->topDict, cff2->topDictSize);
+	if (unlikely (!topDictStr.sanitize (&sc))) { fini (); return; }
+	cff2_top_dict_interpreter_t top_interp;
+	top_interp.env.init (topDictStr);
+	topDict.init ();
+	if (unlikely (!top_interp.interpret (topDict))) { fini (); return; }
+      }
+
+      globalSubrs = &StructAtOffset<CFF2Subrs> (cff2, cff2->topDict + cff2->topDictSize);
+      varStore = &StructAtOffsetOrNull<CFF2VariationStore> (cff2, topDict.vstoreOffset);
+      charStrings = &StructAtOffsetOrNull<CFF2CharStrings> (cff2, topDict.charStringsOffset);
+      fdArray = &StructAtOffsetOrNull<CFF2FDArray> (cff2, topDict.FDArrayOffset);
+      fdSelect = &StructAtOffsetOrNull<CFF2FDSelect> (cff2, topDict.FDSelectOffset);
+
+      if (((varStore != &Null(CFF2VariationStore)) && unlikely (!varStore->sanitize (&sc))) ||
+	  (charStrings == &Null(CFF2CharStrings)) || unlikely (!charStrings->sanitize (&sc)) ||
+	  (globalSubrs == &Null(CFF2Subrs)) || unlikely (!globalSubrs->sanitize (&sc)) ||
+	  (fdArray == &Null(CFF2FDArray)) || unlikely (!fdArray->sanitize (&sc)) ||
+	  (((fdSelect != &Null(CFF2FDSelect)) && unlikely (!fdSelect->sanitize (&sc, fdArray->count)))))
+      { fini (); return; }
+
+      num_glyphs = charStrings->count;
+      if (num_glyphs != sc.get_num_glyphs ())
+      { fini (); return; }
+
+      fdCount = fdArray->count;
+      privateDicts.resize (fdCount);
+
+      /* parse font dicts and gather private dicts */
+      for (unsigned int i = 0; i < fdCount; i++)
+      {
+	const byte_str_t fontDictStr = (*fdArray)[i];
+	if (unlikely (!fontDictStr.sanitize (&sc))) { fini (); return; }
+	cff2_font_dict_values_t  *font;
+	cff2_font_dict_interpreter_t font_interp;
+	font_interp.env.init (fontDictStr);
+	font = fontDicts.push ();
+	if (unlikely (font == &Crap(cff2_font_dict_values_t))) { fini (); return; }
+	font->init ();
+	if (unlikely (!font_interp.interpret (*font))) { fini (); return; }
+
+	const byte_str_t privDictStr (StructAtOffsetOrNull<UnsizedByteStr> (cff2, font->privateDictInfo.offset), font->privateDictInfo.size);
+	if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; }
+	dict_interpreter_t<PRIVOPSET, PRIVDICTVAL, cff2_priv_dict_interp_env_t>  priv_interp;
+	priv_interp.env.init(privDictStr);
+	privateDicts[i].init ();
+	if (unlikely (!priv_interp.interpret (privateDicts[i]))) { fini (); return; }
+
+	privateDicts[i].localSubrs = &StructAtOffsetOrNull<CFF2Subrs> (&privDictStr[0], privateDicts[i].subrsOffset);
+	if (privateDicts[i].localSubrs != &Null(CFF2Subrs) &&
+	  unlikely (!privateDicts[i].localSubrs->sanitize (&sc)))
+	{ fini (); return; }
+      }
+    }
+
+    void fini ()
+    {
+      sc.end_processing ();
+      topDict.fini ();
+      fontDicts.fini_deep ();
+      privateDicts.fini_deep ();
+      hb_blob_destroy (blob);
+      blob = nullptr;
+    }
+
+    bool is_valid () const { return blob != nullptr; }
+
+    protected:
+    hb_blob_t			*blob;
+    hb_sanitize_context_t	sc;
+
+    public:
+    cff2_top_dict_values_t	topDict;
+    const CFF2Subrs		*globalSubrs;
+    const CFF2VariationStore	*varStore;
+    const CFF2CharStrings	*charStrings;
+    const CFF2FDArray		*fdArray;
+    const CFF2FDSelect		*fdSelect;
+    unsigned int		fdCount;
+
+    hb_vector_t<cff2_font_dict_values_t>     fontDicts;
+    hb_vector_t<PRIVDICTVAL>  privateDicts;
+
+    unsigned int	      num_glyphs;
+  };
+
+  struct accelerator_t : accelerator_templ_t<cff2_private_dict_opset_t, cff2_private_dict_values_t>
+  {
+    HB_INTERNAL bool get_extents (hb_font_t *font,
+				  hb_codepoint_t glyph,
+				  hb_glyph_extents_t *extents) const;
+  };
+
+  typedef accelerator_templ_t<cff2_private_dict_opset_subset_t, cff2_private_dict_values_subset_t> accelerator_subset_t;
+
+  bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_blob_t *cff2_prime = nullptr;
+
+    bool success = true;
+    if (hb_subset_cff2 (plan, &cff2_prime)) {
+      success = success && plan->add_table (HB_OT_TAG_cff2, cff2_prime);
+      hb_blob_t *head_blob = hb_sanitize_context_t().reference_table<head> (plan->source);
+      success = success && head_blob && plan->add_table (HB_OT_TAG_head, head_blob);
+      hb_blob_destroy (head_blob);
+    } else {
+      success = false;
+    }
+    hb_blob_destroy (cff2_prime);
+
+    return success;
+  }
+
+  public:
+  FixedVersion<HBUINT8>		version;	/* Version of CFF2 table. set to 0x0200u */
+  NNOffsetTo<TopDict, HBUINT8>	topDict;	/* headerSize = Offset to Top DICT. */
+  HBUINT16			topDictSize;	/* Top DICT size */
+
+  public:
+  DEFINE_SIZE_STATIC (5);
+};
+
+struct cff2_accelerator_t : cff2::accelerator_t {};
+} /* namespace OT */
+
+#endif /* HB_OT_CFF2_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cmap-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cmap-table.hh
new file mode 100644
index 0000000..0526c35
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-cmap-table.hh
@@ -0,0 +1,1180 @@
+/*
+ * Copyright © 2014  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_CMAP_TABLE_HH
+#define HB_OT_CMAP_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-set.hh"
+
+/*
+ * cmap -- Character to Glyph Index Mapping
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/cmap
+ */
+#define HB_OT_TAG_cmap HB_TAG('c','m','a','p')
+
+namespace OT {
+
+
+struct CmapSubtableFormat0
+{
+  bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+  {
+    hb_codepoint_t gid = codepoint < 256 ? glyphIdArray[codepoint] : 0;
+    if (!gid)
+      return false;
+    *glyph = gid;
+    return true;
+  }
+  void collect_unicodes (hb_set_t *out) const
+  {
+    for (unsigned int i = 0; i < 256; i++)
+      if (glyphIdArray[i])
+	out->add (i);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format number is set to 0. */
+  HBUINT16	length;		/* Byte length of this subtable. */
+  HBUINT16	language;	/* Ignore. */
+  HBUINT8	glyphIdArray[256];/* An array that maps character
+				 * code to glyph index values. */
+  public:
+  DEFINE_SIZE_STATIC (6 + 256);
+};
+
+struct CmapSubtableFormat4
+{
+  struct segment_plan
+  {
+    HBUINT16 start_code;
+    HBUINT16 end_code;
+    bool use_delta;
+  };
+
+  bool serialize (hb_serialize_context_t *c,
+		  const hb_subset_plan_t *plan,
+		  const hb_vector_t<segment_plan> &segments)
+  {
+    TRACE_SERIALIZE (this);
+
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+
+    this->format.set (4);
+    this->length.set (get_sub_table_size (segments));
+
+    this->segCountX2.set (segments.length * 2);
+    this->entrySelector.set (MAX (1u, hb_bit_storage (segments.length)) - 1);
+    this->searchRange.set (2 * (1u << this->entrySelector));
+    this->rangeShift.set (segments.length * 2 > this->searchRange
+			  ? 2 * segments.length - this->searchRange
+			  : 0);
+
+    HBUINT16 *end_count = c->allocate_size<HBUINT16> (HBUINT16::static_size * segments.length);
+    c->allocate_size<HBUINT16> (HBUINT16::static_size); // 2 bytes of padding.
+    HBUINT16 *start_count = c->allocate_size<HBUINT16> (HBUINT16::static_size * segments.length);
+    HBINT16 *id_delta = c->allocate_size<HBINT16> (HBUINT16::static_size * segments.length);
+    HBUINT16 *id_range_offset = c->allocate_size<HBUINT16> (HBUINT16::static_size * segments.length);
+
+    if (id_range_offset == nullptr)
+      return_trace (false);
+
+    for (unsigned int i = 0; i < segments.length; i++)
+    {
+      end_count[i].set (segments[i].end_code);
+      start_count[i].set (segments[i].start_code);
+      if (segments[i].use_delta)
+      {
+	hb_codepoint_t cp = segments[i].start_code;
+	hb_codepoint_t start_gid = 0;
+	if (unlikely (!plan->new_gid_for_codepoint (cp, &start_gid) && cp != 0xFFFF))
+	  return_trace (false);
+	id_delta[i].set (start_gid - segments[i].start_code);
+      } else {
+	id_delta[i].set (0);
+	unsigned int num_codepoints = segments[i].end_code - segments[i].start_code + 1;
+	HBUINT16 *glyph_id_array = c->allocate_size<HBUINT16> (HBUINT16::static_size * num_codepoints);
+	if (glyph_id_array == nullptr)
+	  return_trace (false);
+	// From the cmap spec:
+	//
+	// id_range_offset[i]/2
+	// + (cp - segments[i].start_code)
+	// + (id_range_offset + i)
+	// =
+	// glyph_id_array + (cp - segments[i].start_code)
+	//
+	// So, solve for id_range_offset[i]:
+	//
+	// id_range_offset[i]
+	// =
+	// 2 * (glyph_id_array - id_range_offset - i)
+	id_range_offset[i].set (2 * (
+	    glyph_id_array - id_range_offset - i));
+	for (unsigned int j = 0; j < num_codepoints; j++)
+	{
+	  hb_codepoint_t cp = segments[i].start_code + j;
+	  hb_codepoint_t new_gid;
+	  if (unlikely (!plan->new_gid_for_codepoint (cp, &new_gid)))
+	    return_trace (false);
+	  glyph_id_array[j].set (new_gid);
+	}
+      }
+    }
+
+    return_trace (true);
+  }
+
+  static size_t get_sub_table_size (const hb_vector_t<segment_plan> &segments)
+  {
+    size_t segment_size = 0;
+    for (unsigned int i = 0; i < segments.length; i++)
+    {
+      // Parallel array entries
+      segment_size +=
+	    2  // end count
+	  + 2  // start count
+	  + 2  // delta
+	  + 2; // range offset
+
+      if (!segments[i].use_delta)
+	// Add bytes for the glyph index array entries for this segment.
+	segment_size += (segments[i].end_code - segments[i].start_code + 1) * 2;
+    }
+
+    return min_size
+	+ 2 // Padding
+	+ segment_size;
+  }
+
+  static bool create_sub_table_plan (const hb_subset_plan_t *plan,
+				     hb_vector_t<segment_plan> *segments)
+  {
+    segment_plan *segment = nullptr;
+    hb_codepoint_t last_gid = 0;
+
+    hb_codepoint_t cp = HB_SET_VALUE_INVALID;
+    while (plan->unicodes->next (&cp)) {
+      hb_codepoint_t new_gid;
+      if (unlikely (!plan->new_gid_for_codepoint (cp, &new_gid)))
+      {
+	DEBUG_MSG(SUBSET, nullptr, "Unable to find new gid for %04x", cp);
+	return false;
+      }
+
+      /* Stop adding to cmap if we are now outside of unicode BMP. */
+      if (cp > 0xFFFF) break;
+
+      if (!segment ||
+	  cp != segment->end_code + 1u)
+      {
+	segment = segments->push ();
+	segment->start_code.set (cp);
+	segment->end_code.set (cp);
+	segment->use_delta = true;
+      } else {
+	segment->end_code.set (cp);
+	if (last_gid + 1u != new_gid)
+	  // gid's are not consecutive in this segment so delta
+	  // cannot be used.
+	  segment->use_delta = false;
+      }
+
+      last_gid = new_gid;
+    }
+
+    // There must be a final entry with end_code == 0xFFFF. Check if we need to add one.
+    if (segment == nullptr || segment->end_code != 0xFFFF)
+    {
+      segment = segments->push ();
+      segment->start_code.set (0xFFFF);
+      segment->end_code.set (0xFFFF);
+      segment->use_delta = true;
+    }
+
+    return true;
+  }
+
+  struct accelerator_t
+  {
+    accelerator_t () {}
+    accelerator_t (const CmapSubtableFormat4 *subtable) { init (subtable); }
+    ~accelerator_t () { fini (); }
+
+    void init (const CmapSubtableFormat4 *subtable)
+    {
+      segCount = subtable->segCountX2 / 2;
+      endCount = subtable->values.arrayZ;
+      startCount = endCount + segCount + 1;
+      idDelta = startCount + segCount;
+      idRangeOffset = idDelta + segCount;
+      glyphIdArray = idRangeOffset + segCount;
+      glyphIdArrayLength = (subtable->length - 16 - 8 * segCount) / 2;
+    }
+    void fini () {}
+
+    bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+    {
+      /* Custom two-array bsearch. */
+      int min = 0, max = (int) this->segCount - 1;
+      const HBUINT16 *startCount = this->startCount;
+      const HBUINT16 *endCount = this->endCount;
+      unsigned int i;
+      while (min <= max)
+      {
+	int mid = ((unsigned int) min + (unsigned int) max) / 2;
+	if (codepoint < startCount[mid])
+	  max = mid - 1;
+	else if (codepoint > endCount[mid])
+	  min = mid + 1;
+	else
+	{
+	  i = mid;
+	  goto found;
+	}
+      }
+      return false;
+
+    found:
+      hb_codepoint_t gid;
+      unsigned int rangeOffset = this->idRangeOffset[i];
+      if (rangeOffset == 0)
+	gid = codepoint + this->idDelta[i];
+      else
+      {
+	/* Somebody has been smoking... */
+	unsigned int index = rangeOffset / 2 + (codepoint - this->startCount[i]) + i - this->segCount;
+	if (unlikely (index >= this->glyphIdArrayLength))
+	  return false;
+	gid = this->glyphIdArray[index];
+	if (unlikely (!gid))
+	  return false;
+	gid += this->idDelta[i];
+      }
+      gid &= 0xFFFFu;
+      if (!gid)
+	return false;
+      *glyph = gid;
+      return true;
+    }
+    static bool get_glyph_func (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph)
+    {
+      return ((const accelerator_t *) obj)->get_glyph (codepoint, glyph);
+    }
+    void collect_unicodes (hb_set_t *out) const
+    {
+      unsigned int count = this->segCount;
+      if (count && this->startCount[count - 1] == 0xFFFFu)
+	count--; /* Skip sentinel segment. */
+      for (unsigned int i = 0; i < count; i++)
+      {
+	unsigned int rangeOffset = this->idRangeOffset[i];
+	if (rangeOffset == 0)
+	  out->add_range (this->startCount[i], this->endCount[i]);
+	else
+	{
+	  for (hb_codepoint_t codepoint = this->startCount[i];
+	       codepoint <= this->endCount[i];
+	       codepoint++)
+	  {
+	    unsigned int index = rangeOffset / 2 + (codepoint - this->startCount[i]) + i - this->segCount;
+	    if (unlikely (index >= this->glyphIdArrayLength))
+	      break;
+	    hb_codepoint_t gid = this->glyphIdArray[index];
+	    if (unlikely (!gid))
+	      continue;
+	    out->add (codepoint);
+	  }
+	}
+      }
+    }
+
+    const HBUINT16 *endCount;
+    const HBUINT16 *startCount;
+    const HBUINT16 *idDelta;
+    const HBUINT16 *idRangeOffset;
+    const HBUINT16 *glyphIdArray;
+    unsigned int segCount;
+    unsigned int glyphIdArrayLength;
+  };
+
+  bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+  {
+    accelerator_t accel (this);
+    return accel.get_glyph_func (&accel, codepoint, glyph);
+  }
+  void collect_unicodes (hb_set_t *out) const
+  {
+    accelerator_t accel (this);
+    accel.collect_unicodes (out);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!c->check_struct (this)))
+      return_trace (false);
+
+    if (unlikely (!c->check_range (this, length)))
+    {
+      /* Some broken fonts have too long of a "length" value.
+       * If that is the case, just change the value to truncate
+       * the subtable at the end of the blob. */
+      uint16_t new_length = (uint16_t) MIN ((uintptr_t) 65535,
+					    (uintptr_t) (c->end -
+							 (char *) this));
+      if (!c->try_set (&length, new_length))
+	return_trace (false);
+    }
+
+    return_trace (16 + 4 * (unsigned int) segCountX2 <= length);
+  }
+
+
+
+  protected:
+  HBUINT16	format;		/* Format number is set to 4. */
+  HBUINT16	length;		/* This is the length in bytes of the
+				 * subtable. */
+  HBUINT16	language;	/* Ignore. */
+  HBUINT16	segCountX2;	/* 2 x segCount. */
+  HBUINT16	searchRange;	/* 2 * (2**floor(log2(segCount))) */
+  HBUINT16	entrySelector;	/* log2(searchRange/2) */
+  HBUINT16	rangeShift;	/* 2 x segCount - searchRange */
+
+  UnsizedArrayOf<HBUINT16>
+		values;
+#if 0
+  HBUINT16	endCount[segCount];	/* End characterCode for each segment,
+					 * last=0xFFFFu. */
+  HBUINT16	reservedPad;		/* Set to 0. */
+  HBUINT16	startCount[segCount];	/* Start character code for each segment. */
+  HBINT16		idDelta[segCount];	/* Delta for all character codes in segment. */
+  HBUINT16	idRangeOffset[segCount];/* Offsets into glyphIdArray or 0 */
+  UnsizedArrayOf<HBUINT16>
+		glyphIdArray;	/* Glyph index array (arbitrary length) */
+#endif
+
+  public:
+  DEFINE_SIZE_ARRAY (14, values);
+};
+
+struct CmapSubtableLongGroup
+{
+  friend struct CmapSubtableFormat12;
+  friend struct CmapSubtableFormat13;
+  template<typename U>
+  friend struct CmapSubtableLongSegmented;
+  friend struct cmap;
+
+  int cmp (hb_codepoint_t codepoint) const
+  {
+    if (codepoint < startCharCode) return -1;
+    if (codepoint > endCharCode)   return +1;
+    return 0;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  private:
+  HBUINT32		startCharCode;	/* First character code in this group. */
+  HBUINT32		endCharCode;	/* Last character code in this group. */
+  HBUINT32		glyphID;	/* Glyph index; interpretation depends on
+					 * subtable format. */
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+DECLARE_NULL_NAMESPACE_BYTES (OT, CmapSubtableLongGroup);
+
+template <typename UINT>
+struct CmapSubtableTrimmed
+{
+  bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+  {
+    /* Rely on our implicit array bound-checking. */
+    hb_codepoint_t gid = glyphIdArray[codepoint - startCharCode];
+    if (!gid)
+      return false;
+    *glyph = gid;
+    return true;
+  }
+  void collect_unicodes (hb_set_t *out) const
+  {
+    hb_codepoint_t start = startCharCode;
+    unsigned int count = glyphIdArray.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (glyphIdArray[i])
+	out->add (start + i);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && glyphIdArray.sanitize (c));
+  }
+
+  protected:
+  UINT		formatReserved;	/* Subtable format and (maybe) padding. */
+  UINT		length;		/* Byte length of this subtable. */
+  UINT		language;	/* Ignore. */
+  UINT		startCharCode;	/* First character code covered. */
+  ArrayOf<GlyphID, UINT>
+		glyphIdArray;	/* Array of glyph index values for character
+				 * codes in the range. */
+  public:
+  DEFINE_SIZE_ARRAY (5 * sizeof (UINT), glyphIdArray);
+};
+
+struct CmapSubtableFormat6  : CmapSubtableTrimmed<HBUINT16> {};
+struct CmapSubtableFormat10 : CmapSubtableTrimmed<HBUINT32 > {};
+
+template <typename T>
+struct CmapSubtableLongSegmented
+{
+  friend struct cmap;
+
+  bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+  {
+    hb_codepoint_t gid = T::group_get_glyph (groups.bsearch (codepoint), codepoint);
+    if (!gid)
+      return false;
+    *glyph = gid;
+    return true;
+  }
+
+  void collect_unicodes (hb_set_t *out) const
+  {
+    for (unsigned int i = 0; i < this->groups.len; i++) {
+      out->add_range (this->groups[i].startCharCode,
+		      MIN ((hb_codepoint_t) this->groups[i].endCharCode,
+			   (hb_codepoint_t) HB_UNICODE_MAX));
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && groups.sanitize (c));
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  const hb_vector_t<CmapSubtableLongGroup> &group_data)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!groups.serialize (c, group_data.as_array ()))) return_trace (false);
+    return true;
+  }
+
+  protected:
+  HBUINT16	format;		/* Subtable format; set to 12. */
+  HBUINT16	reserved;	/* Reserved; set to 0. */
+  HBUINT32	length;		/* Byte length of this subtable. */
+  HBUINT32	language;	/* Ignore. */
+  SortedArrayOf<CmapSubtableLongGroup, HBUINT32>
+		groups;		/* Groupings. */
+  public:
+  DEFINE_SIZE_ARRAY (16, groups);
+};
+
+struct CmapSubtableFormat12 : CmapSubtableLongSegmented<CmapSubtableFormat12>
+{
+  static hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group,
+					 hb_codepoint_t u)
+  { return likely (group.startCharCode <= group.endCharCode) ?
+	   group.glyphID + (u - group.startCharCode) : 0; }
+
+
+  bool serialize (hb_serialize_context_t *c,
+		  const hb_vector_t<CmapSubtableLongGroup> &groups)
+  {
+    if (unlikely (!c->extend_min (*this))) return false;
+
+    this->format.set (12);
+    this->reserved.set (0);
+    this->length.set (get_sub_table_size (groups));
+
+    return CmapSubtableLongSegmented<CmapSubtableFormat12>::serialize (c, groups);
+  }
+
+  static size_t get_sub_table_size (const hb_vector_t<CmapSubtableLongGroup> &groups)
+  {
+    return 16 + 12 * groups.length;
+  }
+
+  static bool create_sub_table_plan (const hb_subset_plan_t *plan,
+				     hb_vector_t<CmapSubtableLongGroup> *groups)
+  {
+    CmapSubtableLongGroup *group = nullptr;
+
+    hb_codepoint_t cp = HB_SET_VALUE_INVALID;
+    while (plan->unicodes->next (&cp)) {
+      hb_codepoint_t new_gid;
+      if (unlikely (!plan->new_gid_for_codepoint (cp, &new_gid)))
+      {
+	DEBUG_MSG(SUBSET, nullptr, "Unable to find new gid for %04x", cp);
+	return false;
+      }
+
+      if (!group || !_is_gid_consecutive (group, cp, new_gid))
+      {
+	group = groups->push ();
+	group->startCharCode.set (cp);
+	group->endCharCode.set (cp);
+	group->glyphID.set (new_gid);
+      }
+      else group->endCharCode.set (cp);
+    }
+
+    DEBUG_MSG(SUBSET, nullptr, "cmap");
+    for (unsigned int i = 0; i < groups->length; i++) {
+      CmapSubtableLongGroup& group = (*groups)[i];
+      DEBUG_MSG(SUBSET, nullptr, "  %d: U+%04X-U+%04X, gid %d-%d", i, (uint32_t) group.startCharCode, (uint32_t) group.endCharCode, (uint32_t) group.glyphID, (uint32_t) group.glyphID + ((uint32_t) group.endCharCode - (uint32_t) group.startCharCode));
+    }
+
+    return true;
+  }
+
+ private:
+  static bool _is_gid_consecutive (CmapSubtableLongGroup *group,
+				   hb_codepoint_t cp,
+				   hb_codepoint_t new_gid)
+  {
+    return (cp - 1 == group->endCharCode) &&
+	new_gid == group->glyphID + (cp - group->startCharCode);
+  }
+
+};
+
+struct CmapSubtableFormat13 : CmapSubtableLongSegmented<CmapSubtableFormat13>
+{
+  static hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group,
+					 hb_codepoint_t u HB_UNUSED)
+  { return group.glyphID; }
+};
+
+typedef enum
+{
+  GLYPH_VARIANT_NOT_FOUND = 0,
+  GLYPH_VARIANT_FOUND = 1,
+  GLYPH_VARIANT_USE_DEFAULT = 2
+} glyph_variant_t;
+
+struct UnicodeValueRange
+{
+  int cmp (const hb_codepoint_t &codepoint) const
+  {
+    if (codepoint < startUnicodeValue) return -1;
+    if (codepoint > startUnicodeValue + additionalCount) return +1;
+    return 0;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT24	startUnicodeValue;	/* First value in this range. */
+  HBUINT8	additionalCount;	/* Number of additional values in this
+					 * range. */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct DefaultUVS : SortedArrayOf<UnicodeValueRange, HBUINT32>
+{
+  void collect_unicodes (hb_set_t *out) const
+  {
+    unsigned int count = len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      hb_codepoint_t first = arrayZ[i].startUnicodeValue;
+      hb_codepoint_t last = MIN ((hb_codepoint_t) (first + arrayZ[i].additionalCount),
+				 (hb_codepoint_t) HB_UNICODE_MAX);
+      out->add_range (first, last);
+    }
+  }
+
+  public:
+  DEFINE_SIZE_ARRAY (4, *this);
+};
+
+struct UVSMapping
+{
+  int cmp (const hb_codepoint_t &codepoint) const
+  {
+    return unicodeValue.cmp (codepoint);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT24	unicodeValue;	/* Base Unicode value of the UVS */
+  GlyphID	glyphID;	/* Glyph ID of the UVS */
+  public:
+  DEFINE_SIZE_STATIC (5);
+};
+
+struct NonDefaultUVS : SortedArrayOf<UVSMapping, HBUINT32>
+{
+  void collect_unicodes (hb_set_t *out) const
+  {
+    unsigned int count = len;
+    for (unsigned int i = 0; i < count; i++)
+      out->add (arrayZ[i].glyphID);
+  }
+
+  public:
+  DEFINE_SIZE_ARRAY (4, *this);
+};
+
+struct VariationSelectorRecord
+{
+  glyph_variant_t get_glyph (hb_codepoint_t codepoint,
+			     hb_codepoint_t *glyph,
+			     const void *base) const
+  {
+    if ((base+defaultUVS).bfind (codepoint))
+      return GLYPH_VARIANT_USE_DEFAULT;
+    const UVSMapping &nonDefault = (base+nonDefaultUVS).bsearch (codepoint);
+    if (nonDefault.glyphID)
+    {
+      *glyph = nonDefault.glyphID;
+       return GLYPH_VARIANT_FOUND;
+    }
+    return GLYPH_VARIANT_NOT_FOUND;
+  }
+
+  void collect_unicodes (hb_set_t *out, const void *base) const
+  {
+    (base+defaultUVS).collect_unicodes (out);
+    (base+nonDefaultUVS).collect_unicodes (out);
+  }
+
+  int cmp (const hb_codepoint_t &variation_selector) const
+  {
+    return varSelector.cmp (variation_selector);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  defaultUVS.sanitize (c, base) &&
+		  nonDefaultUVS.sanitize (c, base));
+  }
+
+  HBUINT24	varSelector;	/* Variation selector. */
+  LOffsetTo<DefaultUVS>
+		defaultUVS;	/* Offset to Default UVS Table.  May be 0. */
+  LOffsetTo<NonDefaultUVS>
+		nonDefaultUVS;	/* Offset to Non-Default UVS Table.  May be 0. */
+  public:
+  DEFINE_SIZE_STATIC (11);
+};
+
+struct CmapSubtableFormat14
+{
+  glyph_variant_t get_glyph_variant (hb_codepoint_t codepoint,
+				     hb_codepoint_t variation_selector,
+				     hb_codepoint_t *glyph) const
+  {
+    return record.bsearch (variation_selector).get_glyph (codepoint, glyph, this);
+  }
+
+  void collect_variation_selectors (hb_set_t *out) const
+  {
+    unsigned int count = record.len;
+    for (unsigned int i = 0; i < count; i++)
+      out->add (record.arrayZ[i].varSelector);
+  }
+  void collect_variation_unicodes (hb_codepoint_t variation_selector,
+				   hb_set_t *out) const
+  {
+    record.bsearch (variation_selector).collect_unicodes (out, this);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  record.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format number is set to 14. */
+  HBUINT32	length;		/* Byte length of this subtable. */
+  SortedArrayOf<VariationSelectorRecord, HBUINT32>
+		record;		/* Variation selector records; sorted
+				 * in increasing order of `varSelector'. */
+  public:
+  DEFINE_SIZE_ARRAY (10, record);
+};
+
+struct CmapSubtable
+{
+  /* Note: We intentionally do NOT implement subtable formats 2 and 8. */
+
+  bool get_glyph (hb_codepoint_t codepoint,
+		  hb_codepoint_t *glyph) const
+  {
+    switch (u.format) {
+    case  0: return u.format0 .get_glyph (codepoint, glyph);
+    case  4: return u.format4 .get_glyph (codepoint, glyph);
+    case  6: return u.format6 .get_glyph (codepoint, glyph);
+    case 10: return u.format10.get_glyph (codepoint, glyph);
+    case 12: return u.format12.get_glyph (codepoint, glyph);
+    case 13: return u.format13.get_glyph (codepoint, glyph);
+    case 14:
+    default: return false;
+    }
+  }
+  void collect_unicodes (hb_set_t *out) const
+  {
+    switch (u.format) {
+    case  0: u.format0 .collect_unicodes (out); return;
+    case  4: u.format4 .collect_unicodes (out); return;
+    case  6: u.format6 .collect_unicodes (out); return;
+    case 10: u.format10.collect_unicodes (out); return;
+    case 12: u.format12.collect_unicodes (out); return;
+    case 13: u.format13.collect_unicodes (out); return;
+    case 14:
+    default: return;
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format) {
+    case  0: return_trace (u.format0 .sanitize (c));
+    case  4: return_trace (u.format4 .sanitize (c));
+    case  6: return_trace (u.format6 .sanitize (c));
+    case 10: return_trace (u.format10.sanitize (c));
+    case 12: return_trace (u.format12.sanitize (c));
+    case 13: return_trace (u.format13.sanitize (c));
+    case 14: return_trace (u.format14.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  public:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  CmapSubtableFormat0	format0;
+  CmapSubtableFormat4	format4;
+  CmapSubtableFormat6	format6;
+  CmapSubtableFormat10	format10;
+  CmapSubtableFormat12	format12;
+  CmapSubtableFormat13	format13;
+  CmapSubtableFormat14	format14;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+
+struct EncodingRecord
+{
+  int cmp (const EncodingRecord &other) const
+  {
+    int ret;
+    ret = platformID.cmp (other.platformID);
+    if (ret) return ret;
+    ret = encodingID.cmp (other.encodingID);
+    if (ret) return ret;
+    return 0;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  subtable.sanitize (c, base));
+  }
+
+  HBUINT16	platformID;	/* Platform ID. */
+  HBUINT16	encodingID;	/* Platform-specific encoding ID. */
+  LOffsetTo<CmapSubtable>
+		subtable;	/* Byte offset from beginning of table to the subtable for this encoding. */
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct cmap
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_cmap;
+
+  struct subset_plan
+  {
+    size_t final_size () const
+    {
+      return 4 // header
+	  +  8 * 3 // 3 EncodingRecord
+	  +  CmapSubtableFormat4::get_sub_table_size (this->format4_segments)
+	  +  CmapSubtableFormat12::get_sub_table_size (this->format12_groups);
+    }
+
+    hb_vector_t<CmapSubtableFormat4::segment_plan> format4_segments;
+    hb_vector_t<CmapSubtableLongGroup> format12_groups;
+  };
+
+  bool _create_plan (const hb_subset_plan_t *plan,
+		     subset_plan *cmap_plan) const
+  {
+    if (unlikely (!CmapSubtableFormat4::create_sub_table_plan (plan, &cmap_plan->format4_segments)))
+      return false;
+
+    return CmapSubtableFormat12::create_sub_table_plan (plan, &cmap_plan->format12_groups);
+  }
+
+  bool _subset (const hb_subset_plan_t *plan,
+		const subset_plan &cmap_subset_plan,
+		size_t dest_sz,
+		void *dest) const
+  {
+    hb_serialize_context_t c (dest, dest_sz);
+
+    cmap *table = c.start_serialize<cmap> ();
+    if (unlikely (!c.extend_min (*table)))
+    {
+      return false;
+    }
+
+    table->version.set (0);
+
+    if (unlikely (!table->encodingRecord.serialize (&c, /* numTables */ 3)))
+      return false;
+
+    // TODO(grieger): Convert the below to a for loop
+
+    // Format 4, Plat 0 Encoding Record
+    EncodingRecord &format4_plat0_rec = table->encodingRecord[0];
+    format4_plat0_rec.platformID.set (0); // Unicode
+    format4_plat0_rec.encodingID.set (3);
+
+    // Format 4, Plat 3 Encoding Record
+    EncodingRecord &format4_plat3_rec = table->encodingRecord[1];
+    format4_plat3_rec.platformID.set (3); // Windows
+    format4_plat3_rec.encodingID.set (1); // Unicode BMP
+
+    // Format 12 Encoding Record
+    EncodingRecord &format12_rec = table->encodingRecord[2];
+    format12_rec.platformID.set (3); // Windows
+    format12_rec.encodingID.set (10); // Unicode UCS-4
+
+    // Write out format 4 sub table
+    {
+      CmapSubtable &subtable = format4_plat0_rec.subtable.serialize (&c, table);
+      format4_plat3_rec.subtable.set (format4_plat0_rec.subtable);
+      subtable.u.format.set (4);
+
+      CmapSubtableFormat4 &format4 = subtable.u.format4;
+      if (unlikely (!format4.serialize (&c, plan, cmap_subset_plan.format4_segments)))
+	return false;
+    }
+
+    // Write out format 12 sub table.
+    {
+      CmapSubtable &subtable = format12_rec.subtable.serialize (&c, table);
+      subtable.u.format.set (12);
+
+      CmapSubtableFormat12 &format12 = subtable.u.format12;
+      if (unlikely (!format12.serialize (&c, cmap_subset_plan.format12_groups)))
+	return false;
+    }
+
+    c.end_serialize ();
+
+    return true;
+  }
+
+  bool subset (hb_subset_plan_t *plan) const
+  {
+    subset_plan cmap_subset_plan;
+
+    if (unlikely (!_create_plan (plan, &cmap_subset_plan)))
+    {
+      DEBUG_MSG(SUBSET, nullptr, "Failed to generate a cmap subsetting plan.");
+      return false;
+    }
+
+    // We now know how big our blob needs to be
+    size_t dest_sz = cmap_subset_plan.final_size ();
+    void *dest = malloc (dest_sz);
+    if (unlikely (!dest)) {
+      DEBUG_MSG(SUBSET, nullptr, "Unable to alloc %lu for cmap subset output", (unsigned long) dest_sz);
+      return false;
+    }
+
+    if (unlikely (!_subset (plan, cmap_subset_plan, dest_sz, dest)))
+    {
+      DEBUG_MSG(SUBSET, nullptr, "Failed to perform subsetting of cmap.");
+      free (dest);
+      return false;
+    }
+
+    // all done, write the blob into dest
+    hb_blob_t *cmap_prime = hb_blob_create ((const char *) dest,
+					    dest_sz,
+					    HB_MEMORY_MODE_READONLY,
+					    dest,
+					    free);
+    bool result =  plan->add_table (HB_OT_TAG_cmap, cmap_prime);
+    hb_blob_destroy (cmap_prime);
+    return result;
+  }
+
+  const CmapSubtable *find_best_subtable (bool *symbol = nullptr) const
+  {
+    if (symbol) *symbol = false;
+
+    const CmapSubtable *subtable;
+
+    /* 32-bit subtables. */
+    if ((subtable = this->find_subtable (3, 10))) return subtable;
+    if ((subtable = this->find_subtable (0, 6))) return subtable;
+    if ((subtable = this->find_subtable (0, 4))) return subtable;
+
+    /* 16-bit subtables. */
+    if ((subtable = this->find_subtable (3, 1))) return subtable;
+    if ((subtable = this->find_subtable (0, 3))) return subtable;
+    if ((subtable = this->find_subtable (0, 2))) return subtable;
+    if ((subtable = this->find_subtable (0, 1))) return subtable;
+    if ((subtable = this->find_subtable (0, 0))) return subtable;
+
+    /* Symbol subtable. */
+    if ((subtable = this->find_subtable (3, 0)))
+    {
+      if (symbol) *symbol = true;
+      return subtable;
+    }
+
+    /* Meh. */
+    return &Null (CmapSubtable);
+  }
+
+  struct accelerator_t
+  {
+    void init (hb_face_t *face)
+    {
+      this->table = hb_sanitize_context_t ().reference_table<cmap> (face);
+      bool symbol;
+      this->subtable = table->find_best_subtable (&symbol);
+      this->subtable_uvs = &Null (CmapSubtableFormat14);
+      {
+	const CmapSubtable *st = table->find_subtable (0, 5);
+	if (st && st->u.format == 14)
+	  subtable_uvs = &st->u.format14;
+      }
+
+      this->get_glyph_data = subtable;
+      if (unlikely (symbol))
+      {
+	this->get_glyph_funcZ = get_glyph_from_symbol<CmapSubtable>;
+      } else {
+	switch (subtable->u.format) {
+	/* Accelerate format 4 and format 12. */
+	default:
+	  this->get_glyph_funcZ = get_glyph_from<CmapSubtable>;
+	  break;
+	case 12:
+	  this->get_glyph_funcZ = get_glyph_from<CmapSubtableFormat12>;
+	  break;
+	case  4:
+	  {
+	    this->format4_accel.init (&subtable->u.format4);
+	    this->get_glyph_data = &this->format4_accel;
+	    this->get_glyph_funcZ = this->format4_accel.get_glyph_func;
+	  }
+	  break;
+	}
+      }
+    }
+
+    void fini () { this->table.destroy (); }
+
+    bool get_nominal_glyph (hb_codepoint_t  unicode,
+				   hb_codepoint_t *glyph) const
+    {
+      if (unlikely (!this->get_glyph_funcZ)) return false;
+      return this->get_glyph_funcZ (this->get_glyph_data, unicode, glyph);
+    }
+    unsigned int get_nominal_glyphs (unsigned int count,
+				     const hb_codepoint_t *first_unicode,
+				     unsigned int unicode_stride,
+				     hb_codepoint_t *first_glyph,
+				     unsigned int glyph_stride) const
+    {
+      if (unlikely (!this->get_glyph_funcZ)) return 0;
+
+      hb_cmap_get_glyph_func_t get_glyph_funcZ = this->get_glyph_funcZ;
+      const void *get_glyph_data = this->get_glyph_data;
+
+      unsigned int done;
+      for (done = 0;
+	   done < count && get_glyph_funcZ (get_glyph_data, *first_unicode, first_glyph);
+	   done++)
+      {
+	first_unicode = &StructAtOffsetUnaligned<hb_codepoint_t> (first_unicode, unicode_stride);
+	first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+      }
+      return done;
+    }
+
+    bool get_variation_glyph (hb_codepoint_t  unicode,
+			      hb_codepoint_t  variation_selector,
+			      hb_codepoint_t *glyph) const
+    {
+      switch (this->subtable_uvs->get_glyph_variant (unicode,
+						     variation_selector,
+						     glyph))
+      {
+	case GLYPH_VARIANT_NOT_FOUND:	return false;
+	case GLYPH_VARIANT_FOUND:	return true;
+	case GLYPH_VARIANT_USE_DEFAULT:	break;
+      }
+
+      return get_nominal_glyph (unicode, glyph);
+    }
+
+    void collect_unicodes (hb_set_t *out) const
+    {
+      subtable->collect_unicodes (out);
+    }
+    void collect_variation_selectors (hb_set_t *out) const
+    {
+      subtable_uvs->collect_variation_selectors (out);
+    }
+    void collect_variation_unicodes (hb_codepoint_t variation_selector,
+				     hb_set_t *out) const
+    {
+      subtable_uvs->collect_variation_unicodes (variation_selector, out);
+    }
+
+    protected:
+    typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj,
+					      hb_codepoint_t codepoint,
+					      hb_codepoint_t *glyph);
+
+    template <typename Type>
+    static 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 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:
+	 * https://docs.microsoft.com/en-us/typography/opentype/spec/recom
+	 * under "Non-Standard (Symbol) Fonts". */
+	return typed_obj->get_glyph (0xF000u + codepoint, glyph);
+      }
+
+      return false;
+    }
+
+    private:
+    hb_nonnull_ptr_t<const CmapSubtable> subtable;
+    hb_nonnull_ptr_t<const CmapSubtableFormat14> subtable_uvs;
+
+    hb_cmap_get_glyph_func_t get_glyph_funcZ;
+    const void *get_glyph_data;
+
+    CmapSubtableFormat4::accelerator_t format4_accel;
+
+    hb_blob_ptr_t<cmap> table;
+  };
+
+  protected:
+
+  const CmapSubtable *find_subtable (unsigned int platform_id,
+				     unsigned int encoding_id) const
+  {
+    EncodingRecord key;
+    key.platformID.set (platform_id);
+    key.encodingID.set (encoding_id);
+
+    const EncodingRecord &result = encodingRecord.bsearch (key);
+    if (!result.subtable)
+      return nullptr;
+
+    return &(this+result.subtable);
+  }
+
+  public:
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  likely (version == 0) &&
+		  encodingRecord.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16		version;	/* Table version number (0). */
+  SortedArrayOf<EncodingRecord>
+			encodingRecord;	/* Encoding tables. */
+  public:
+  DEFINE_SIZE_ARRAY (4, encodingRecord);
+};
+
+struct cmap_accelerator_t : cmap::accelerator_t {};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_CMAP_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-cbdt-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-cbdt-table.hh
new file mode 100644
index 0000000..333ceaa
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-cbdt-table.hh
@@ -0,0 +1,535 @@
+/*
+ * 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): Seigo Nonaka
+ */
+
+#ifndef HB_OT_COLOR_CBDT_TABLE_HH
+#define HB_OT_COLOR_CBDT_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * CBLC -- Color Bitmap Location
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/cblc
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/eblc
+ * CBDT -- Color Bitmap Data
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/cbdt
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/ebdt
+ */
+#define HB_OT_TAG_CBLC HB_TAG('C','B','L','C')
+#define HB_OT_TAG_CBDT HB_TAG('C','B','D','T')
+
+
+namespace OT {
+
+struct SmallGlyphMetrics
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  void get_extents (hb_glyph_extents_t *extents) const
+  {
+    extents->x_bearing = bearingX;
+    extents->y_bearing = bearingY;
+    extents->width = width;
+    extents->height = - (hb_position_t) height;
+  }
+
+  HBUINT8	height;
+  HBUINT8	width;
+  HBINT8	bearingX;
+  HBINT8	bearingY;
+  HBUINT8	advance;
+  public:
+  DEFINE_SIZE_STATIC(5);
+};
+
+struct BigGlyphMetrics : SmallGlyphMetrics
+{
+  HBINT8	vertBearingX;
+  HBINT8	vertBearingY;
+  HBUINT8	vertAdvance;
+  public:
+  DEFINE_SIZE_STATIC(8);
+};
+
+struct SBitLineMetrics
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBINT8	ascender;
+  HBINT8	decender;
+  HBUINT8	widthMax;
+  HBINT8	caretSlopeNumerator;
+  HBINT8	caretSlopeDenominator;
+  HBINT8	caretOffset;
+  HBINT8	minOriginSB;
+  HBINT8	minAdvanceSB;
+  HBINT8	maxBeforeBL;
+  HBINT8	minAfterBL;
+  HBINT8	padding1;
+  HBINT8	padding2;
+  public:
+  DEFINE_SIZE_STATIC(12);
+};
+
+
+/*
+ * Index Subtables.
+ */
+
+struct IndexSubtableHeader
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT16	indexFormat;
+  HBUINT16	imageFormat;
+  HBUINT32	imageDataOffset;
+  public:
+  DEFINE_SIZE_STATIC(8);
+};
+
+template <typename OffsetType>
+struct IndexSubtableFormat1Or3
+{
+  bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  offsetArrayZ.sanitize (c, glyph_count + 1));
+  }
+
+  bool get_image_data (unsigned int idx,
+		       unsigned int *offset,
+		       unsigned int *length) const
+  {
+    if (unlikely (offsetArrayZ[idx + 1] <= offsetArrayZ[idx]))
+      return false;
+
+    *offset = header.imageDataOffset + offsetArrayZ[idx];
+    *length = offsetArrayZ[idx + 1] - offsetArrayZ[idx];
+    return true;
+  }
+
+  IndexSubtableHeader	header;
+  UnsizedArrayOf<Offset<OffsetType> >
+ 			offsetArrayZ;
+  public:
+  DEFINE_SIZE_ARRAY(8, offsetArrayZ);
+};
+
+struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<HBUINT32> {};
+struct IndexSubtableFormat3 : IndexSubtableFormat1Or3<HBUINT16> {};
+
+struct IndexSubtable
+{
+  bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.header.sanitize (c)) return_trace (false);
+    switch (u.header.indexFormat) {
+    case 1: return_trace (u.format1.sanitize (c, glyph_count));
+    case 3: return_trace (u.format3.sanitize (c, glyph_count));
+    default:return_trace (true);
+    }
+  }
+
+  bool get_extents (hb_glyph_extents_t *extents HB_UNUSED) const
+  {
+    switch (u.header.indexFormat) {
+    case 2: case 5: /* TODO */
+    case 1: case 3: case 4: /* Variable-metrics formats do not have metrics here. */
+    default:return (false);
+    }
+  }
+
+  bool get_image_data (unsigned int idx,
+		       unsigned int *offset,
+		       unsigned int *length,
+		       unsigned int *format) const
+  {
+    *format = u.header.imageFormat;
+    switch (u.header.indexFormat) {
+    case 1: return u.format1.get_image_data (idx, offset, length);
+    case 3: return u.format3.get_image_data (idx, offset, length);
+    default: return false;
+    }
+  }
+
+  protected:
+  union {
+  IndexSubtableHeader	header;
+  IndexSubtableFormat1	format1;
+  IndexSubtableFormat3	format3;
+  /* TODO: Format 2, 4, 5. */
+  } u;
+  public:
+  DEFINE_SIZE_UNION (8, header);
+};
+
+struct IndexSubtableRecord
+{
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  firstGlyphIndex <= lastGlyphIndex &&
+		  offsetToSubtable.sanitize (c, base, lastGlyphIndex - firstGlyphIndex + 1));
+  }
+
+  bool get_extents (hb_glyph_extents_t *extents,
+		    const void *base) const
+  {
+    return (base+offsetToSubtable).get_extents (extents);
+  }
+
+  bool get_image_data (unsigned int  gid,
+		       const void   *base,
+		       unsigned int *offset,
+		       unsigned int *length,
+		       unsigned int *format) const
+  {
+    if (gid < firstGlyphIndex || gid > lastGlyphIndex) return false;
+    return (base+offsetToSubtable).get_image_data (gid - firstGlyphIndex,
+						   offset, length, format);
+  }
+
+  GlyphID			firstGlyphIndex;
+  GlyphID			lastGlyphIndex;
+  LOffsetTo<IndexSubtable>	offsetToSubtable;
+  public:
+  DEFINE_SIZE_STATIC(8);
+};
+
+struct IndexSubtableArray
+{
+  friend struct CBDT;
+
+  bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (indexSubtablesZ.sanitize (c, count, this));
+  }
+
+  public:
+  const IndexSubtableRecord* find_table (hb_codepoint_t glyph, unsigned int numTables) const
+  {
+    for (unsigned int i = 0; i < numTables; ++i)
+    {
+      unsigned int firstGlyphIndex = indexSubtablesZ[i].firstGlyphIndex;
+      unsigned int lastGlyphIndex = indexSubtablesZ[i].lastGlyphIndex;
+      if (firstGlyphIndex <= glyph && glyph <= lastGlyphIndex)
+        return &indexSubtablesZ[i];
+    }
+    return nullptr;
+  }
+
+  protected:
+  UnsizedArrayOf<IndexSubtableRecord>	indexSubtablesZ;
+};
+
+struct BitmapSizeTable
+{
+  friend struct CBLC;
+  friend struct CBDT;
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  indexSubtableArrayOffset.sanitize (c, base, numberOfIndexSubtables) &&
+		  horizontal.sanitize (c) &&
+		  vertical.sanitize (c));
+  }
+
+  const IndexSubtableRecord *find_table (hb_codepoint_t glyph,
+					 const void *base,
+					 const void **out_base) const
+  {
+    *out_base = &(base+indexSubtableArrayOffset);
+    return (base+indexSubtableArrayOffset).find_table (glyph, numberOfIndexSubtables);
+  }
+
+  protected:
+  LNNOffsetTo<IndexSubtableArray>
+			indexSubtableArrayOffset;
+  HBUINT32		indexTablesSize;
+  HBUINT32		numberOfIndexSubtables;
+  HBUINT32		colorRef;
+  SBitLineMetrics	horizontal;
+  SBitLineMetrics	vertical;
+  GlyphID		startGlyphIndex;
+  GlyphID		endGlyphIndex;
+  HBUINT8		ppemX;
+  HBUINT8		ppemY;
+  HBUINT8		bitDepth;
+  HBINT8		flags;
+  public:
+  DEFINE_SIZE_STATIC(48);
+};
+
+
+/*
+ * Glyph Bitmap Data Formats.
+ */
+
+struct GlyphBitmapDataFormat17
+{
+  SmallGlyphMetrics	glyphMetrics;
+  LArrayOf<HBUINT8>	data;
+  public:
+  DEFINE_SIZE_ARRAY(9, data);
+};
+
+struct GlyphBitmapDataFormat18
+{
+  BigGlyphMetrics	glyphMetrics;
+  LArrayOf<HBUINT8>	data;
+  public:
+  DEFINE_SIZE_ARRAY(12, data);
+};
+
+struct GlyphBitmapDataFormat19
+{
+  LArrayOf<HBUINT8>	data;
+  public:
+  DEFINE_SIZE_ARRAY(4, data);
+};
+
+struct CBLC
+{
+  friend struct CBDT;
+
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_CBLC;
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  likely (version.major == 2 || version.major == 3) &&
+		  sizeTables.sanitize (c, this));
+  }
+
+  protected:
+  const BitmapSizeTable &choose_strike (hb_font_t *font) const
+  {
+    unsigned count = sizeTables.len;
+    if (unlikely (!count))
+      return Null(BitmapSizeTable);
+
+    unsigned int requested_ppem = MAX (font->x_ppem, font->y_ppem);
+    if (!requested_ppem)
+      requested_ppem = 1<<30; /* Choose largest strike. */
+    unsigned int best_i = 0;
+    unsigned int best_ppem = MAX (sizeTables[0].ppemX, sizeTables[0].ppemY);
+
+    for (unsigned int i = 1; i < count; i++)
+    {
+      unsigned int ppem = MAX (sizeTables[i].ppemX, sizeTables[i].ppemY);
+      if ((requested_ppem <= ppem && ppem < best_ppem) ||
+	  (requested_ppem > best_ppem && ppem > best_ppem))
+      {
+	best_i = i;
+	best_ppem = ppem;
+      }
+    }
+
+    return sizeTables[best_i];
+  }
+
+  protected:
+  FixedVersion<>		version;
+  LArrayOf<BitmapSizeTable>	sizeTables;
+  public:
+  DEFINE_SIZE_ARRAY(8, sizeTables);
+};
+
+struct CBDT
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_CBDT;
+
+  struct accelerator_t
+  {
+    void init (hb_face_t *face)
+    {
+      cblc = hb_sanitize_context_t().reference_table<CBLC> (face);
+      cbdt = hb_sanitize_context_t().reference_table<CBDT> (face);
+
+      upem = hb_face_get_upem (face);
+    }
+
+    void fini ()
+    {
+      this->cblc.destroy ();
+      this->cbdt.destroy ();
+    }
+
+    bool get_extents (hb_font_t *font, hb_codepoint_t glyph,
+		      hb_glyph_extents_t *extents) const
+    {
+      const void *base;
+      const BitmapSizeTable &strike = this->cblc->choose_strike (font);
+      const IndexSubtableRecord *subtable_record = strike.find_table (glyph, cblc, &base);
+      if (!subtable_record || !strike.ppemX || !strike.ppemY)
+	return false;
+
+      if (subtable_record->get_extents (extents, base))
+	return true;
+
+      unsigned int image_offset = 0, image_length = 0, image_format = 0;
+      if (!subtable_record->get_image_data (glyph, base, &image_offset, &image_length, &image_format))
+	return false;
+
+      {
+	unsigned int cbdt_len = cbdt.get_length ();
+	if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length))
+	  return false;
+
+	switch (image_format)
+	{
+	  case 17: {
+	    if (unlikely (image_length < GlyphBitmapDataFormat17::min_size))
+	      return false;
+	    const GlyphBitmapDataFormat17& glyphFormat17 =
+		StructAtOffset<GlyphBitmapDataFormat17> (this->cbdt, image_offset);
+	    glyphFormat17.glyphMetrics.get_extents (extents);
+	    break;
+	  }
+	  case 18: {
+	    if (unlikely (image_length < GlyphBitmapDataFormat18::min_size))
+	      return false;
+	    const GlyphBitmapDataFormat18& glyphFormat18 =
+		StructAtOffset<GlyphBitmapDataFormat18> (this->cbdt, image_offset);
+	    glyphFormat18.glyphMetrics.get_extents (extents);
+	    break;
+	  }
+	  default:
+	    // TODO: Support other image formats.
+	    return false;
+	}
+      }
+
+      /* Convert to font units. */
+      double x_scale = upem / (double) strike.ppemX;
+      double y_scale = upem / (double) strike.ppemY;
+      extents->x_bearing = round (extents->x_bearing * x_scale);
+      extents->y_bearing = round (extents->y_bearing * y_scale);
+      extents->width = round (extents->width * x_scale);
+      extents->height = round (extents->height * y_scale);
+
+      return true;
+    }
+
+    hb_blob_t* reference_png (hb_font_t      *font,
+				     hb_codepoint_t  glyph) const
+    {
+      const void *base;
+      const BitmapSizeTable &strike = this->cblc->choose_strike (font);
+      const IndexSubtableRecord *subtable_record = strike.find_table (glyph, cblc, &base);
+      if (!subtable_record || !strike.ppemX || !strike.ppemY)
+	return hb_blob_get_empty ();
+
+      unsigned int image_offset = 0, image_length = 0, image_format = 0;
+      if (!subtable_record->get_image_data (glyph, base, &image_offset, &image_length, &image_format))
+	return hb_blob_get_empty ();
+
+      {
+	unsigned int cbdt_len = cbdt.get_length ();
+	if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length))
+	  return hb_blob_get_empty ();
+
+	switch (image_format)
+	{
+	  case 17: {
+	    if (unlikely (image_length < GlyphBitmapDataFormat17::min_size))
+	      return hb_blob_get_empty ();
+	    const GlyphBitmapDataFormat17& glyphFormat17 =
+	      StructAtOffset<GlyphBitmapDataFormat17> (this->cbdt, image_offset);
+	    return hb_blob_create_sub_blob (cbdt.get_blob (),
+					    image_offset + GlyphBitmapDataFormat17::min_size,
+					    glyphFormat17.data.len);
+	  }
+	  case 18: {
+	    if (unlikely (image_length < GlyphBitmapDataFormat18::min_size))
+	      return hb_blob_get_empty ();
+	    const GlyphBitmapDataFormat18& glyphFormat18 =
+	      StructAtOffset<GlyphBitmapDataFormat18> (this->cbdt, image_offset);
+	    return hb_blob_create_sub_blob (cbdt.get_blob (),
+					    image_offset + GlyphBitmapDataFormat18::min_size,
+					    glyphFormat18.data.len);
+	  }
+	  case 19: {
+	    if (unlikely (image_length < GlyphBitmapDataFormat19::min_size))
+	      return hb_blob_get_empty ();
+	    const GlyphBitmapDataFormat19& glyphFormat19 =
+	      StructAtOffset<GlyphBitmapDataFormat19> (this->cbdt, image_offset);
+	    return hb_blob_create_sub_blob (cbdt.get_blob (),
+					    image_offset + GlyphBitmapDataFormat19::min_size,
+					    glyphFormat19.data.len);
+	  }
+	}
+      }
+
+      return hb_blob_get_empty ();
+    }
+
+    bool has_data () const { return cbdt.get_length (); }
+
+    private:
+    hb_blob_ptr_t<CBLC> cblc;
+    hb_blob_ptr_t<CBDT> cbdt;
+
+    unsigned int upem;
+  };
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  likely (version.major == 2 || version.major == 3));
+  }
+
+  protected:
+  FixedVersion<>		version;
+  UnsizedArrayOf<HBUINT8>	dataZ;
+  public:
+  DEFINE_SIZE_ARRAY(4, dataZ);
+};
+
+struct CBDT_accelerator_t : CBDT::accelerator_t {};
+
+} /* namespace OT */
+
+#endif /* HB_OT_COLOR_CBDT_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-colr-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-colr-table.hh
new file mode 100644
index 0000000..a57911ad
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-colr-table.hh
@@ -0,0 +1,140 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_OT_COLOR_COLR_TABLE_HH
+#define HB_OT_COLOR_COLR_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * COLR -- Color
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/colr
+ */
+#define HB_OT_TAG_COLR HB_TAG('C','O','L','R')
+
+
+namespace OT {
+
+
+struct LayerRecord
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  GlyphID	glyphId;	/* Glyph ID of layer glyph */
+  Index		colorIdx;	/* Index value to use with a
+				 * selected color palette.
+				 * An index value of 0xFFFF
+				 * is a special case indicating
+				 * that the text foreground
+				 * color (defined by a
+				 * higher-level client) should
+				 * be used and shall not be
+				 * treated as actual index
+				 * into CPAL ColorRecord array. */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct BaseGlyphRecord
+{
+  int cmp (hb_codepoint_t g) const
+  { return g < glyphId ? -1 : g > glyphId ? 1 : 0; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  public:
+  GlyphID	glyphId;	/* Glyph ID of reference glyph */
+  HBUINT16	firstLayerIdx;	/* Index (from beginning of
+				 * the Layer Records) to the
+				 * layer record. There will be
+				 * numLayers consecutive entries
+				 * for this base glyph. */
+  HBUINT16	numLayers;	/* Number of color layers
+				 * associated with this glyph */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct COLR
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_COLR;
+
+  bool has_data () const { return numBaseGlyphs; }
+
+  unsigned int get_glyph_layers (hb_codepoint_t       glyph,
+				 unsigned int         start_offset,
+				 unsigned int        *count, /* IN/OUT.  May be NULL. */
+				 hb_ot_color_layer_t *layers /* OUT.     May be NULL. */) const
+  {
+    const BaseGlyphRecord &record = (this+baseGlyphsZ).bsearch (numBaseGlyphs, glyph);
+
+    hb_array_t<const LayerRecord> all_layers ((this+layersZ).arrayZ, numLayers);
+    hb_array_t<const LayerRecord> glyph_layers = all_layers.sub_array (record.firstLayerIdx,
+								       record.numLayers);
+    if (count)
+    {
+      hb_array_t<const LayerRecord> segment_layers = glyph_layers.sub_array (start_offset, *count);
+      *count = segment_layers.length;
+      for (unsigned int i = 0; i < segment_layers.length; i++)
+      {
+        layers[i].glyph = segment_layers.arrayZ[i].glyphId;
+        layers[i].color_index = segment_layers.arrayZ[i].colorIdx;
+      }
+    }
+    return glyph_layers.length;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  (this+baseGlyphsZ).sanitize (c, numBaseGlyphs) &&
+			  (this+layersZ).sanitize (c, numLayers)));
+  }
+
+  protected:
+  HBUINT16	version;	/* Table version number (starts at 0). */
+  HBUINT16	numBaseGlyphs;	/* Number of Base Glyph Records. */
+  LNNOffsetTo<SortedUnsizedArrayOf<BaseGlyphRecord> >
+		baseGlyphsZ;	/* Offset to Base Glyph records. */
+  LNNOffsetTo<UnsizedArrayOf<LayerRecord> >
+		layersZ;	/* Offset to Layer Records. */
+  HBUINT16	numLayers;	/* Number of Layer Records. */
+  public:
+  DEFINE_SIZE_STATIC (14);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_COLOR_COLR_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-cpal-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-cpal-table.hh
new file mode 100644
index 0000000..4070493
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-cpal-table.hh
@@ -0,0 +1,193 @@
+/*
+ * Copyright © 2016  Google, Inc.
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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): Sascha Brawer
+ */
+
+#ifndef HB_OT_COLOR_CPAL_TABLE_HH
+#define HB_OT_COLOR_CPAL_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-color.h"
+#include "hb-ot-name.h"
+
+
+/*
+ * CPAL -- Color Palette
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/cpal
+ */
+#define HB_OT_TAG_CPAL HB_TAG('C','P','A','L')
+
+
+namespace OT {
+
+
+struct CPALV1Tail
+{
+  friend struct CPAL;
+
+  private:
+  hb_ot_color_palette_flags_t get_palette_flags (const void *base,
+						 unsigned int palette_index,
+						 unsigned int palette_count) const
+  {
+    if (!paletteFlagsZ) return HB_OT_COLOR_PALETTE_FLAG_DEFAULT;
+    return (hb_ot_color_palette_flags_t) (uint32_t)
+	   (base+paletteFlagsZ).as_array (palette_count)[palette_index];
+  }
+
+  hb_ot_name_id_t get_palette_name_id (const void *base,
+				       unsigned int palette_index,
+				       unsigned int palette_count) const
+  {
+    if (!paletteLabelsZ) return HB_OT_NAME_ID_INVALID;
+    return (base+paletteLabelsZ).as_array (palette_count)[palette_index];
+  }
+
+  hb_ot_name_id_t get_color_name_id (const void *base,
+				     unsigned int color_index,
+				     unsigned int color_count) const
+  {
+    if (!colorLabelsZ) return HB_OT_NAME_ID_INVALID;
+    return (base+colorLabelsZ).as_array (color_count)[color_index];
+  }
+
+  public:
+  bool sanitize (hb_sanitize_context_t *c,
+		 const void *base,
+		 unsigned int palette_count,
+		 unsigned int color_count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  (!paletteFlagsZ  || (base+paletteFlagsZ).sanitize (c, palette_count)) &&
+		  (!paletteLabelsZ || (base+paletteLabelsZ).sanitize (c, palette_count)) &&
+		  (!colorLabelsZ   || (base+colorLabelsZ).sanitize (c, color_count)));
+  }
+
+  protected:
+  LNNOffsetTo<UnsizedArrayOf<HBUINT32> >
+		paletteFlagsZ;		/* Offset from the beginning of CPAL table to
+					 * the Palette Type Array. Set to 0 if no array
+					 * is provided. */
+  LNNOffsetTo<UnsizedArrayOf<NameID> >
+		paletteLabelsZ;		/* Offset from the beginning of CPAL table to
+					 * the palette labels array. Set to 0 if no
+					 * array is provided. */
+  LNNOffsetTo<UnsizedArrayOf<NameID> >
+		colorLabelsZ;		/* Offset from the beginning of CPAL table to
+					 * the color labels array. Set to 0
+					 * if no array is provided. */
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+typedef HBUINT32 BGRAColor;
+
+struct CPAL
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_CPAL;
+
+  bool has_data () const { return numPalettes; }
+
+  unsigned int get_size () const
+  { return min_size + numPalettes * sizeof (colorRecordIndicesZ[0]); }
+
+  unsigned int get_palette_count () const { return numPalettes; }
+  unsigned int get_color_count () const   { return numColors; }
+
+  hb_ot_color_palette_flags_t get_palette_flags (unsigned int palette_index) const
+  { return v1 ().get_palette_flags (this, palette_index, numPalettes); }
+
+  hb_ot_name_id_t get_palette_name_id (unsigned int palette_index) const
+  { return v1 ().get_palette_name_id (this, palette_index, numPalettes); }
+
+  hb_ot_name_id_t get_color_name_id (unsigned int color_index) const
+  { return v1 ().get_color_name_id (this, color_index, numColors); }
+
+  unsigned int get_palette_colors (unsigned int  palette_index,
+				   unsigned int  start_offset,
+				   unsigned int *color_count, /* IN/OUT.  May be NULL. */
+				   hb_color_t   *colors       /* OUT.     May be NULL. */) const
+  {
+    if (unlikely (palette_index >= numPalettes))
+    {
+      if (color_count) *color_count = 0;
+      return 0;
+    }
+    unsigned int start_index = colorRecordIndicesZ[palette_index];
+    hb_array_t<const BGRAColor> all_colors ((this+colorRecordsZ).arrayZ, numColorRecords);
+    hb_array_t<const BGRAColor> palette_colors = all_colors.sub_array (start_index,
+								       numColors);
+    if (color_count)
+    {
+      hb_array_t<const BGRAColor> segment_colors = palette_colors.sub_array (start_offset, *color_count);
+      /* Always return numColors colors per palette even if it has out-of-bounds start index. */
+      unsigned int count = MIN<unsigned int> (MAX<int> (numColors - start_offset, 0), *color_count);
+      *color_count = count;
+      for (unsigned int i = 0; i < count; i++)
+        colors[i] = segment_colors[i]; /* Bound-checked read. */
+    }
+    return numColors;
+  }
+
+  private:
+  const CPALV1Tail& v1 () const
+  {
+    if (version == 0) return Null(CPALV1Tail);
+    return StructAfter<CPALV1Tail> (*this);
+  }
+
+  public:
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  (this+colorRecordsZ).sanitize (c, numColorRecords) &&
+		  colorRecordIndicesZ.sanitize (c, numPalettes) &&
+		  (version == 0 || v1 ().sanitize (c, this, numPalettes, numColors)));
+  }
+
+  protected:
+  HBUINT16	version;		/* Table version number */
+  /* Version 0 */
+  HBUINT16	numColors;		/* Number of colors in each palette. */
+  HBUINT16	numPalettes;		/* Number of palettes in the table. */
+  HBUINT16	numColorRecords;	/* Total number of color records, combined for
+					 * all palettes. */
+  LNNOffsetTo<UnsizedArrayOf<BGRAColor> >
+		colorRecordsZ;		/* Offset from the beginning of CPAL table to
+					 * the first ColorRecord. */
+  UnsizedArrayOf<HBUINT16>
+		colorRecordIndicesZ;	/* Index of each palette’s first color record in
+					 * the combined color record array. */
+/*CPALV1Tail	v1;*/
+  public:
+  DEFINE_SIZE_ARRAY (12, colorRecordIndicesZ);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_COLOR_CPAL_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-sbix-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-sbix-table.hh
new file mode 100644
index 0000000..f6bdbb3
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-sbix-table.hh
@@ -0,0 +1,286 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_OT_COLOR_SBIX_TABLE_HH
+#define HB_OT_COLOR_SBIX_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * sbix -- Standard Bitmap Graphics
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/sbix
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6sbix.html
+ */
+#define HB_OT_TAG_sbix HB_TAG('s','b','i','x')
+
+
+namespace OT {
+
+
+struct SBIXGlyph
+{
+  HBINT16	xOffset;	/* The horizontal (x-axis) offset from the left
+				 * edge of the graphic to the glyph’s origin.
+				 * That is, the x-coordinate of the point on the
+				 * baseline at the left edge of the glyph. */
+  HBINT16	yOffset;	/* The vertical (y-axis) offset from the bottom
+				 * edge of the graphic to the glyph’s origin.
+				 * That is, the y-coordinate of the point on the
+				 * baseline at the left edge of the glyph. */
+  Tag		graphicType;	/* Indicates the format of the embedded graphic
+				 * data: one of 'jpg ', 'png ' or 'tiff', or the
+				 * special format 'dupe'. */
+  UnsizedArrayOf<HBUINT8>
+		data;		/* The actual embedded graphic data. The total
+				 * length is inferred from sequential entries in
+				 * the glyphDataOffsets array and the fixed size
+				 * (8 bytes) of the preceding fields. */
+  public:
+  DEFINE_SIZE_ARRAY (8, data);
+};
+
+struct SBIXStrike
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  imageOffsetsZ.sanitize_shallow (c, c->get_num_glyphs () + 1));
+  }
+
+  hb_blob_t *get_glyph_blob (unsigned int  glyph_id,
+			     hb_blob_t    *sbix_blob,
+			     hb_tag_t      file_type,
+			     int          *x_offset,
+			     int          *y_offset,
+			     unsigned int  num_glyphs,
+			     unsigned int *strike_ppem) const
+  {
+    if (unlikely (!ppem)) return hb_blob_get_empty (); /* To get Null() object out of the way. */
+
+    unsigned int retry_count = 8;
+    unsigned int sbix_len = sbix_blob->length;
+    unsigned int strike_offset = (const char *) this - (const char *) sbix_blob->data;
+    assert (strike_offset < sbix_len);
+
+  retry:
+    if (unlikely (glyph_id >= num_glyphs ||
+		  imageOffsetsZ[glyph_id + 1] <= imageOffsetsZ[glyph_id] ||
+		  imageOffsetsZ[glyph_id + 1] - imageOffsetsZ[glyph_id] <= SBIXGlyph::min_size ||
+		  (unsigned int) imageOffsetsZ[glyph_id + 1] > sbix_len - strike_offset))
+      return hb_blob_get_empty ();
+
+    unsigned int glyph_offset = strike_offset + (unsigned int) imageOffsetsZ[glyph_id] + SBIXGlyph::min_size;
+    unsigned int glyph_length = imageOffsetsZ[glyph_id + 1] - imageOffsetsZ[glyph_id] - SBIXGlyph::min_size;
+
+    const SBIXGlyph *glyph = &(this+imageOffsetsZ[glyph_id]);
+
+    if (glyph->graphicType == HB_TAG ('d','u','p','e'))
+    {
+      if (glyph_length >= 2)
+      {
+	glyph_id = *((HBUINT16 *) &glyph->data);
+	if (retry_count--)
+	  goto retry;
+      }
+      return hb_blob_get_empty ();
+    }
+
+    if (unlikely (file_type != glyph->graphicType))
+      return hb_blob_get_empty ();
+
+    if (strike_ppem) *strike_ppem = ppem;
+    if (x_offset) *x_offset = glyph->xOffset;
+    if (y_offset) *y_offset = glyph->yOffset;
+    return hb_blob_create_sub_blob (sbix_blob, glyph_offset, glyph_length);
+  }
+
+  public:
+  HBUINT16	ppem;		/* The PPEM size for which this strike was designed. */
+  HBUINT16	resolution;	/* The device pixel density (in PPI) for which this
+				 * strike was designed. (E.g., 96 PPI, 192 PPI.) */
+  protected:
+  UnsizedArrayOf<LOffsetTo<SBIXGlyph> >
+		imageOffsetsZ;	/* Offset from the beginning of the strike data header
+				 * to bitmap data for an individual glyph ID. */
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct sbix
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_sbix;
+
+  bool has_data () const { return version; }
+
+  const SBIXStrike &get_strike (unsigned int i) const { return this+strikes[i]; }
+
+  struct accelerator_t
+  {
+    void init (hb_face_t *face)
+    {
+      table = hb_sanitize_context_t().reference_table<sbix> (face);
+      num_glyphs = face->get_num_glyphs ();
+    }
+    void fini () { table.destroy (); }
+
+    bool has_data () const { return table->has_data (); }
+
+    bool get_extents (hb_font_t          *font,
+		      hb_codepoint_t      glyph,
+		      hb_glyph_extents_t *extents) const
+    {
+      /* We only support PNG right now, and following function checks type. */
+      return get_png_extents (font, glyph, extents);
+    }
+
+    hb_blob_t *reference_png (hb_font_t      *font,
+			      hb_codepoint_t  glyph_id,
+			      int            *x_offset,
+			      int            *y_offset,
+			      unsigned int   *available_ppem) const
+    {
+      return choose_strike (font).get_glyph_blob (glyph_id, table.get_blob (),
+						  HB_TAG ('p','n','g',' '),
+						  x_offset, y_offset,
+						  num_glyphs, available_ppem);
+    }
+
+    private:
+
+    const SBIXStrike &choose_strike (hb_font_t *font) const
+    {
+      unsigned count = table->strikes.len;
+      if (unlikely (!count))
+        return Null(SBIXStrike);
+
+      unsigned int requested_ppem = MAX (font->x_ppem, font->y_ppem);
+      if (!requested_ppem)
+        requested_ppem = 1<<30; /* Choose largest strike. */
+      /* TODO Add DPI sensitivity as well? */
+      unsigned int best_i = 0;
+      unsigned int best_ppem = table->get_strike (0).ppem;
+
+      for (unsigned int i = 1; i < count; i++)
+      {
+	unsigned int ppem = (table->get_strike (i)).ppem;
+	if ((requested_ppem <= ppem && ppem < best_ppem) ||
+	    (requested_ppem > best_ppem && ppem > best_ppem))
+	{
+	  best_i = i;
+	  best_ppem = ppem;
+	}
+      }
+
+      return table->get_strike (best_i);
+    }
+
+    struct PNGHeader
+    {
+      HBUINT8	signature[8];
+      struct
+      {
+        struct
+	{
+	  HBUINT32	length;
+	  Tag		type;
+	}		header;
+	HBUINT32	width;
+	HBUINT32	height;
+	HBUINT8		bitDepth;
+	HBUINT8		colorType;
+	HBUINT8		compressionMethod;
+	HBUINT8		filterMethod;
+	HBUINT8		interlaceMethod;
+      } IHDR;
+
+      public:
+      DEFINE_SIZE_STATIC (29);
+    };
+
+    bool get_png_extents (hb_font_t          *font,
+			  hb_codepoint_t      glyph,
+			  hb_glyph_extents_t *extents) const
+    {
+      /* Following code is safe to call even without data.
+       * But faster to short-circuit. */
+      if (!has_data ())
+        return false;
+
+      int x_offset = 0, y_offset = 0;
+      unsigned int strike_ppem = 0;
+      hb_blob_t *blob = reference_png (font, glyph, &x_offset, &y_offset, &strike_ppem);
+
+      const PNGHeader &png = *blob->as<PNGHeader>();
+
+      extents->x_bearing = x_offset;
+      extents->y_bearing = y_offset;
+      extents->width     = png.IHDR.width;
+      extents->height    = png.IHDR.height;
+
+      /* Convert to font units. */
+      if (strike_ppem)
+      {
+	double scale = font->face->get_upem () / (double) strike_ppem;
+	extents->x_bearing = round (extents->x_bearing * scale);
+	extents->y_bearing = round (extents->y_bearing * scale);
+	extents->width = round (extents->width * scale);
+	extents->height = round (extents->height * scale);
+      }
+
+      hb_blob_destroy (blob);
+
+      return strike_ppem;
+    }
+
+    private:
+    hb_blob_ptr_t<sbix> table;
+
+    unsigned int num_glyphs;
+  };
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  version >= 1 &&
+			  strikes.sanitize (c, this)));
+  }
+
+  protected:
+  HBUINT16	version;	/* Table version number — set to 1 */
+  HBUINT16	flags;		/* Bit 0: Set to 1. Bit 1: Draw outlines.
+				 * Bits 2 to 15: reserved (set to 0). */
+  LOffsetLArrayOf<SBIXStrike>
+		strikes;	/* Offsets from the beginning of the 'sbix'
+				 * table to data for each individual bitmap strike. */
+  public:
+  DEFINE_SIZE_ARRAY (8, strikes);
+};
+
+struct sbix_accelerator_t : sbix::accelerator_t {};
+
+} /* namespace OT */
+
+#endif /* HB_OT_COLOR_SBIX_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-svg-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-svg-table.hh
new file mode 100644
index 0000000..6e8eddf
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color-svg-table.hh
@@ -0,0 +1,124 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_OT_COLOR_SVG_TABLE_HH
+#define HB_OT_COLOR_SVG_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * SVG -- SVG (Scalable Vector Graphics)
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/svg
+ */
+
+#define HB_OT_TAG_SVG HB_TAG('S','V','G',' ')
+
+
+namespace OT {
+
+
+struct SVGDocumentIndexEntry
+{
+  int cmp (hb_codepoint_t g) const
+  { return g < startGlyphID ? -1 : g > endGlyphID ? 1 : 0; }
+
+  hb_blob_t *reference_blob (hb_blob_t *svg_blob, unsigned int index_offset) const
+  {
+    return hb_blob_create_sub_blob (svg_blob,
+				    index_offset + (unsigned int) svgDoc,
+				    svgDocLength);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  svgDoc.sanitize (c, base, svgDocLength));
+  }
+
+  protected:
+  HBUINT16	startGlyphID;	/* The first glyph ID in the range described by
+				 * this index entry. */
+  HBUINT16	endGlyphID;	/* The last glyph ID in the range described by
+				 * this index entry. Must be >= startGlyphID. */
+  LNNOffsetTo<UnsizedArrayOf<HBUINT8> >
+		svgDoc;		/* Offset from the beginning of the SVG Document Index
+				 * to an SVG document. Must be non-zero. */
+  HBUINT32	svgDocLength;	/* Length of the SVG document.
+				 * Must be non-zero. */
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+struct SVG
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_SVG;
+
+  bool has_data () const { return svgDocEntries; }
+
+  struct accelerator_t
+  {
+    void init (hb_face_t *face)
+    { table = hb_sanitize_context_t().reference_table<SVG> (face); }
+    void fini () { table.destroy (); }
+
+    hb_blob_t *reference_blob_for_glyph (hb_codepoint_t glyph_id) const
+    {
+      return table->get_glyph_entry (glyph_id).reference_blob (table.get_blob (),
+							       table->svgDocEntries);
+    }
+
+    bool has_data () const { return table->has_data (); }
+
+    private:
+    hb_blob_ptr_t<SVG> table;
+  };
+
+  const SVGDocumentIndexEntry &get_glyph_entry (hb_codepoint_t glyph_id) const
+  { return (this+svgDocEntries).bsearch (glyph_id); }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  (this+svgDocEntries).sanitize_shallow (c)));
+  }
+
+  protected:
+  HBUINT16	version;	/* Table version (starting at 0). */
+  LOffsetTo<SortedArrayOf<SVGDocumentIndexEntry> >
+		svgDocEntries;	/* Offset (relative to the start of the SVG table) to the
+				 * SVG Documents Index. Must be non-zero. */
+				/* Array of SVG Document Index Entries. */
+  HBUINT32	reserved;	/* Set to 0. */
+  public:
+  DEFINE_SIZE_STATIC (10);
+};
+
+struct SVG_accelerator_t : SVG::accelerator_t {};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_COLOR_SVG_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color.cc
new file mode 100644
index 0000000..791135b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color.cc
@@ -0,0 +1,299 @@
+/*
+ * Copyright © 2016  Google, Inc.
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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): Sascha Brawer, Behdad Esfahbod
+ */
+
+#include "hb-open-type.hh"
+#include "hb-ot-color-cbdt-table.hh"
+#include "hb-ot-color-colr-table.hh"
+#include "hb-ot-color-cpal-table.hh"
+#include "hb-ot-color-sbix-table.hh"
+#include "hb-ot-color-svg-table.hh"
+#include "hb-ot-face.hh"
+#include "hb-ot.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "hb-ot-layout.hh"
+
+
+/**
+ * SECTION:hb-ot-color
+ * @title: hb-ot-color
+ * @short_description: OpenType Color Fonts
+ * @include: hb-ot.h
+ *
+ * Functions for fetching color-font information from OpenType font faces.
+ **/
+
+
+/*
+ * CPAL
+ */
+
+
+/**
+ * hb_ot_color_has_palettes:
+ * @face: a font face.
+ *
+ * Returns: whether CPAL table is available.
+ *
+ * Since: 2.1.0
+ */
+hb_bool_t
+hb_ot_color_has_palettes (hb_face_t *face)
+{
+  return face->table.CPAL->has_data ();
+}
+
+/**
+ * hb_ot_color_palette_get_count:
+ * @face: a font face.
+ *
+ * Returns: the number of color palettes in @face, or zero if @face has
+ * no colors.
+ *
+ * Since: 2.1.0
+ */
+unsigned int
+hb_ot_color_palette_get_count (hb_face_t *face)
+{
+  return face->table.CPAL->get_palette_count ();
+}
+
+/**
+ * hb_ot_color_palette_get_name_id:
+ * @face:    a font face.
+ * @palette_index: the index of the color palette whose name is being requested.
+ *
+ * Retrieves the name id of a color palette. For example, a color font can
+ * have themed palettes like "Spring", "Summer", "Fall", and "Winter".
+ *
+ * Returns: an identifier within @face's `name` table.
+ * If the requested palette has no name the result is #HB_OT_NAME_ID_INVALID.
+ *
+ * Since: 2.1.0
+ */
+hb_ot_name_id_t
+hb_ot_color_palette_get_name_id (hb_face_t *face,
+				 unsigned int palette_index)
+{
+  return face->table.CPAL->get_palette_name_id (palette_index);
+}
+
+/**
+ * hb_ot_color_palette_color_get_name_id:
+ * @face:        a font face.
+ * @color_index: palette entry index.
+ *
+ * Returns: Name ID associated with a palette entry, e.g. eye color
+ *
+ * Since: 2.1.0
+ */
+hb_ot_name_id_t
+hb_ot_color_palette_color_get_name_id (hb_face_t *face,
+				       unsigned int color_index)
+{
+  return face->table.CPAL->get_color_name_id (color_index);
+}
+
+/**
+ * hb_ot_color_palette_get_flags:
+ * @face:          a font face
+ * @palette_index: the index of the color palette whose flags are being requested
+ *
+ * Returns: the flags for the requested color palette.
+ *
+ * Since: 2.1.0
+ */
+hb_ot_color_palette_flags_t
+hb_ot_color_palette_get_flags (hb_face_t *face,
+			       unsigned int palette_index)
+{
+  return face->table.CPAL->get_palette_flags (palette_index);
+}
+
+/**
+ * hb_ot_color_palette_get_colors:
+ * @face:         a font face.
+ * @palette_index:the index of the color palette whose colors
+ *                are being requested.
+ * @start_offset: the index of the first color being requested.
+ * @color_count:  (inout) (optional): on input, how many colors
+ *                can be maximally stored into the @colors array;
+ *                on output, how many colors were actually stored.
+ * @colors: (array length=color_count) (out) (optional):
+ *                an array of #hb_color_t records. After calling
+ *                this function, @colors will be filled with
+ *                the palette colors. If @colors is NULL, the function
+ *                will just return the number of total colors
+ *                without storing any actual colors; this can be used
+ *                for allocating a buffer of suitable size before calling
+ *                hb_ot_color_palette_get_colors() a second time.
+ *
+ * Retrieves the colors in a color palette.
+ *
+ * Returns: the total number of colors in the palette.
+ *
+ * Since: 2.1.0
+ */
+unsigned int
+hb_ot_color_palette_get_colors (hb_face_t     *face,
+				unsigned int   palette_index,
+				unsigned int   start_offset,
+				unsigned int  *colors_count  /* IN/OUT.  May be NULL. */,
+				hb_color_t    *colors        /* OUT.     May be NULL. */)
+{
+  return face->table.CPAL->get_palette_colors (palette_index, start_offset, colors_count, colors);
+}
+
+
+/*
+ * COLR
+ */
+
+/**
+ * hb_ot_color_has_layers:
+ * @face: a font face.
+ *
+ * Returns: whether COLR table is available.
+ *
+ * Since: 2.1.0
+ */
+hb_bool_t
+hb_ot_color_has_layers (hb_face_t *face)
+{
+  return face->table.COLR->has_data ();
+}
+
+/**
+ * hb_ot_color_glyph_get_layers:
+ * @face:         a font face.
+ * @glyph:        a layered color glyph id.
+ * @start_offset: starting offset of layers.
+ * @count:  (inout) (optional): gets number of layers available to be written on buffer
+ * 				and returns number of written layers.
+ * @layers: (array length=count) (out) (optional): layers buffer to buffer.
+ *
+ * Returns: Total number of layers a layered color glyph have.
+ *
+ * Since: 2.1.0
+ */
+unsigned int
+hb_ot_color_glyph_get_layers (hb_face_t           *face,
+			      hb_codepoint_t       glyph,
+			      unsigned int         start_offset,
+			      unsigned int        *count, /* IN/OUT.  May be NULL. */
+			      hb_ot_color_layer_t *layers /* OUT.     May be NULL. */)
+{
+  return face->table.COLR->get_glyph_layers (glyph, start_offset, count, layers);
+}
+
+
+/*
+ * SVG
+ */
+
+/**
+ * hb_ot_color_has_svg:
+ * @face: a font face.
+ *
+ * Check whether @face has SVG glyph images.
+ *
+ * Returns true if available, false otherwise.
+ *
+ * Since: 2.1.0
+ */
+hb_bool_t
+hb_ot_color_has_svg (hb_face_t *face)
+{
+  return face->table.SVG->has_data ();
+}
+
+/**
+ * hb_ot_color_glyph_reference_svg:
+ * @face:  a font face.
+ * @glyph: a svg glyph index.
+ *
+ * Get SVG document for a glyph. The blob may be either plain text or gzip-encoded.
+ *
+ * Returns: (transfer full): respective svg blob of the glyph, if available.
+ *
+ * Since: 2.1.0
+ */
+hb_blob_t *
+hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph)
+{
+  return face->table.SVG->reference_blob_for_glyph (glyph);
+}
+
+
+/*
+ * PNG: CBDT or sbix
+ */
+
+/**
+ * hb_ot_color_has_png:
+ * @face: a font face.
+ *
+ * Check whether @face has PNG glyph images (either CBDT or sbix tables).
+ *
+ * Returns true if available, false otherwise.
+ *
+ * Since: 2.1.0
+ */
+hb_bool_t
+hb_ot_color_has_png (hb_face_t *face)
+{
+  return face->table.CBDT->has_data () || face->table.sbix->has_data ();
+}
+
+/**
+ * hb_ot_color_glyph_reference_png:
+ * @font:  a font object, not face. upem should be set on
+ * 	   that font object if one wants to get optimal png blob, otherwise
+ * 	   return the biggest one
+ * @glyph: a glyph index.
+ *
+ * Get PNG image for a glyph.
+ *
+ * Returns: (transfer full): respective PNG blob of the glyph, if available.
+ *
+ * Since: 2.1.0
+ */
+hb_blob_t *
+hb_ot_color_glyph_reference_png (hb_font_t *font, hb_codepoint_t  glyph)
+{
+  hb_blob_t *blob = hb_blob_get_empty ();
+
+  if (font->face->table.sbix->has_data ())
+    blob = font->face->table.sbix->reference_png (font, glyph, nullptr, nullptr, nullptr);
+
+  if (!blob->length && font->face->table.CBDT->has_data ())
+    blob = font->face->table.CBDT->reference_png (font, glyph);
+
+  return blob;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color.h
new file mode 100644
index 0000000..49646bf
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-color.h
@@ -0,0 +1,139 @@
+/*
+ * Copyright © 2016  Google, Inc.
+ * Copyright © 2018  Khaled Hosny
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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): Sascha Brawer, Behdad Esfahbod
+ */
+
+#ifndef HB_OT_H_IN
+#error "Include <hb-ot.h> instead."
+#endif
+
+#ifndef HB_OT_COLOR_H
+#define HB_OT_COLOR_H
+
+#include "hb.h"
+#include "hb-ot-name.h"
+
+HB_BEGIN_DECLS
+
+
+/*
+ * Color palettes.
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_color_has_palettes (hb_face_t *face);
+
+HB_EXTERN unsigned int
+hb_ot_color_palette_get_count (hb_face_t *face);
+
+HB_EXTERN hb_ot_name_id_t
+hb_ot_color_palette_get_name_id (hb_face_t *face,
+				 unsigned int palette_index);
+
+HB_EXTERN hb_ot_name_id_t
+hb_ot_color_palette_color_get_name_id (hb_face_t *face,
+				       unsigned int color_index);
+
+/**
+ * hb_ot_color_palette_flags_t:
+ * @HB_OT_COLOR_PALETTE_FLAG_DEFAULT: default indicating that there is nothing special
+ *   to note about a color palette.
+ * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND: flag indicating that the color
+ *   palette is appropriate to use when displaying the font on a light background such as white.
+ * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND: flag indicating that the color
+ *   palette is appropriate to use when displaying the font on a dark background such as black.
+ *
+ * Since: 2.1.0
+ */
+typedef enum { /*< flags >*/
+  HB_OT_COLOR_PALETTE_FLAG_DEFAULT			= 0x00000000u,
+  HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND	= 0x00000001u,
+  HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND	= 0x00000002u
+} hb_ot_color_palette_flags_t;
+
+HB_EXTERN hb_ot_color_palette_flags_t
+hb_ot_color_palette_get_flags (hb_face_t *face,
+			       unsigned int palette_index);
+
+HB_EXTERN unsigned int
+hb_ot_color_palette_get_colors (hb_face_t    *face,
+				unsigned int  palette_index,
+				unsigned int  start_offset,
+				unsigned int *color_count,  /* IN/OUT.  May be NULL. */
+				hb_color_t   *colors        /* OUT.     May be NULL. */);
+
+
+/*
+ * Color layers.
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_color_has_layers (hb_face_t *face);
+
+/**
+ * hb_ot_color_layer_t:
+ *
+ * Pairs of glyph and color index.
+ *
+ * Since: 2.1.0
+ **/
+typedef struct hb_ot_color_layer_t
+{
+  hb_codepoint_t glyph;
+  unsigned int   color_index;
+} hb_ot_color_layer_t;
+
+HB_EXTERN unsigned int
+hb_ot_color_glyph_get_layers (hb_face_t           *face,
+			      hb_codepoint_t       glyph,
+			      unsigned int         start_offset,
+			      unsigned int        *count, /* IN/OUT.  May be NULL. */
+			      hb_ot_color_layer_t *layers /* OUT.     May be NULL. */);
+
+/*
+ * SVG
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_color_has_svg (hb_face_t *face);
+
+HB_EXTERN hb_blob_t *
+hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph);
+
+/*
+ * PNG: CBDT or sbix
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_color_has_png (hb_face_t *face);
+
+HB_EXTERN hb_blob_t *
+hb_ot_color_glyph_reference_png (hb_font_t *font, hb_codepoint_t glyph);
+
+
+HB_END_DECLS
+
+#endif /* HB_OT_COLOR_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-deprecated.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-deprecated.h
new file mode 100644
index 0000000..bce51b7
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-deprecated.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright © 2018  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_H_IN
+#error "Include <hb-ot.h> instead."
+#endif
+
+#ifndef HB_OT_DEPRECATED_H
+#define HB_OT_DEPRECATED_H
+
+#include "hb.h"
+#include "hb-ot-name.h"
+
+
+HB_BEGIN_DECLS
+
+#ifndef HB_DISABLE_DEPRECATED
+
+
+/* Like hb_ot_layout_table_find_script, but takes zero-terminated array of scripts to test */
+HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_table_select_script) hb_bool_t
+hb_ot_layout_table_choose_script (hb_face_t      *face,
+				  hb_tag_t        table_tag,
+				  const hb_tag_t *script_tags,
+				  unsigned int   *script_index,
+				  hb_tag_t       *chosen_script);
+
+HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_script_select_language) hb_bool_t
+hb_ot_layout_script_find_language (hb_face_t    *face,
+				   hb_tag_t      table_tag,
+				   unsigned int  script_index,
+				   hb_tag_t      language_tag,
+				   unsigned int *language_index);
+
+HB_EXTERN HB_DEPRECATED_FOR (hb_ot_tags_from_script_and_language) void
+hb_ot_tags_from_script (hb_script_t  script,
+			hb_tag_t    *script_tag_1,
+			hb_tag_t    *script_tag_2);
+
+HB_EXTERN HB_DEPRECATED_FOR (hb_ot_tags_from_script_and_language) hb_tag_t
+hb_ot_tag_from_language (hb_language_t language);
+
+
+/**
+ * HB_OT_VAR_NO_AXIS_INDEX:
+ *
+ * Since: 1.4.2
+ * Deprecated: 2.2.0
+ */
+#define HB_OT_VAR_NO_AXIS_INDEX		0xFFFFFFFFu
+
+/**
+ * hb_ot_var_axis_t:
+ *
+ * Since: 1.4.2
+ * Deprecated: 2.2.0
+ */
+typedef struct hb_ot_var_axis_t
+{
+  hb_tag_t tag;
+  hb_ot_name_id_t name_id;
+  float min_value;
+  float default_value;
+  float max_value;
+} hb_ot_var_axis_t;
+
+HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_get_axis_infos) unsigned int
+hb_ot_var_get_axes (hb_face_t        *face,
+		    unsigned int      start_offset,
+		    unsigned int     *axes_count /* IN/OUT */,
+		    hb_ot_var_axis_t *axes_array /* OUT */);
+
+HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_find_axis_info) hb_bool_t
+hb_ot_var_find_axis (hb_face_t        *face,
+		     hb_tag_t          axis_tag,
+		     unsigned int     *axis_index,
+		     hb_ot_var_axis_t *axis_info);
+
+
+#endif
+
+HB_END_DECLS
+
+#endif /* HB_OT_DEPRECATED_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-face.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-face.cc
new file mode 100644
index 0000000..9b17526
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-face.cc
@@ -0,0 +1,61 @@
+/*
+ * Copyright © 2018  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
+ */
+
+#include "hb-ot-face.hh"
+
+#include "hb-ot-cmap-table.hh"
+#include "hb-ot-glyf-table.hh"
+#include "hb-ot-cff1-table.hh"
+#include "hb-ot-cff2-table.hh"
+#include "hb-ot-hmtx-table.hh"
+#include "hb-ot-kern-table.hh"
+#include "hb-ot-name-table.hh"
+#include "hb-ot-post-table.hh"
+#include "hb-ot-color-cbdt-table.hh"
+#include "hb-ot-color-sbix-table.hh"
+#include "hb-ot-color-svg-table.hh"
+#include "hb-ot-layout-gdef-table.hh"
+#include "hb-ot-layout-gsub-table.hh"
+#include "hb-ot-layout-gpos-table.hh"
+
+
+void hb_ot_face_t::init0 (hb_face_t *face)
+{
+  this->face = face;
+#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
+#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
+  HB_OT_TABLES
+#undef HB_OT_ACCELERATOR
+#undef HB_OT_TABLE
+}
+void hb_ot_face_t::fini ()
+{
+#define HB_OT_TABLE(Namespace, Type) Type.fini ();
+#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
+  HB_OT_TABLES
+#undef HB_OT_ACCELERATOR
+#undef HB_OT_TABLE
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-face.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-face.hh
new file mode 100644
index 0000000..7f47ba6
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-face.hh
@@ -0,0 +1,120 @@
+/*
+ * Copyright © 2007,2008,2009  Red Hat, Inc.
+ * Copyright © 2012,2013  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_FACE_HH
+#define HB_OT_FACE_HH
+
+#include "hb.hh"
+
+#include "hb-machinery.hh"
+
+
+/*
+ * hb_ot_face_t
+ */
+
+#define HB_OT_TABLES \
+    /* OpenType fundamentals. */ \
+    HB_OT_TABLE(OT, head) \
+    HB_OT_ACCELERATOR(OT, cmap) \
+    HB_OT_ACCELERATOR(OT, hmtx) \
+    HB_OT_ACCELERATOR(OT, vmtx) \
+    HB_OT_ACCELERATOR(OT, post) \
+    HB_OT_TABLE(OT, kern) \
+    HB_OT_ACCELERATOR(OT, glyf) \
+    HB_OT_ACCELERATOR(OT, cff1) \
+    HB_OT_ACCELERATOR(OT, cff2) \
+    HB_OT_TABLE(OT, VORG) \
+    HB_OT_ACCELERATOR(OT, name) \
+    HB_OT_TABLE(OT, OS2) \
+    HB_OT_TABLE(OT, STAT) \
+    /* OpenType shaping. */ \
+    HB_OT_ACCELERATOR(OT, GDEF) \
+    HB_OT_ACCELERATOR(OT, GSUB) \
+    HB_OT_ACCELERATOR(OT, GPOS) \
+    HB_OT_TABLE(OT, BASE) \
+    HB_OT_TABLE(OT, JSTF) \
+    /* AAT shaping. */ \
+    HB_OT_TABLE(AAT, mort) \
+    HB_OT_TABLE(AAT, morx) \
+    HB_OT_TABLE(AAT, kerx) \
+    HB_OT_TABLE(AAT, ankr) \
+    HB_OT_TABLE(AAT, trak) \
+    HB_OT_TABLE(AAT, lcar) \
+    HB_OT_TABLE(AAT, ltag) \
+    HB_OT_TABLE(AAT, feat) \
+    /* OpenType variations. */ \
+    HB_OT_TABLE(OT, fvar) \
+    HB_OT_TABLE(OT, avar) \
+    HB_OT_TABLE(OT, MVAR) \
+    /* OpenType math. */ \
+    HB_OT_TABLE(OT, MATH) \
+    /* OpenType color fonts. */ \
+    HB_OT_TABLE(OT, COLR) \
+    HB_OT_TABLE(OT, CPAL) \
+    HB_OT_ACCELERATOR(OT, CBDT) \
+    HB_OT_ACCELERATOR(OT, sbix) \
+    HB_OT_ACCELERATOR(OT, SVG) \
+    /* */
+
+/* Declare tables. */
+#define HB_OT_TABLE(Namespace, Type) namespace Namespace { struct Type; }
+#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type##_accelerator_t)
+HB_OT_TABLES
+#undef HB_OT_ACCELERATOR
+#undef HB_OT_TABLE
+
+struct hb_ot_face_t
+{
+  HB_INTERNAL void init0 (hb_face_t *face);
+  HB_INTERNAL void fini ();
+
+#define HB_OT_TABLE_ORDER(Namespace, Type) \
+    HB_PASTE (ORDER_, HB_PASTE (Namespace, HB_PASTE (_, Type)))
+  enum order_t
+  {
+    ORDER_ZERO,
+#define HB_OT_TABLE(Namespace, Type) HB_OT_TABLE_ORDER (Namespace, Type),
+#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
+    HB_OT_TABLES
+#undef HB_OT_ACCELERATOR
+#undef HB_OT_TABLE
+  };
+
+  hb_face_t *face; /* MUST be JUST before the lazy loaders. */
+#define HB_OT_TABLE(Namespace, Type) \
+  hb_table_lazy_loader_t<Namespace::Type, HB_OT_TABLE_ORDER (Namespace, Type)> Type;
+#define HB_OT_ACCELERATOR(Namespace, Type) \
+  hb_face_lazy_loader_t<Namespace::Type##_accelerator_t, HB_OT_TABLE_ORDER (Namespace, Type)> Type;
+  HB_OT_TABLES
+#undef HB_OT_ACCELERATOR
+#undef HB_OT_TABLE
+};
+
+
+#endif /* HB_OT_FACE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-font.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-font.cc
new file mode 100644
index 0000000..20b09df
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-font.cc
@@ -0,0 +1,313 @@
+/*
+ * Copyright © 2011,2014  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, Roozbeh Pournader
+ */
+
+#include "hb.hh"
+
+#include "hb-ot.h"
+
+#include "hb-font.hh"
+#include "hb-machinery.hh"
+#include "hb-ot-face.hh"
+
+#include "hb-ot-cmap-table.hh"
+#include "hb-ot-glyf-table.hh"
+#include "hb-ot-cff1-table.hh"
+#include "hb-ot-cff2-table.hh"
+#include "hb-ot-hmtx-table.hh"
+#include "hb-ot-kern-table.hh"
+#include "hb-ot-os2-table.hh"
+#include "hb-ot-post-table.hh"
+#include "hb-ot-stat-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-ot-vorg-table.hh"
+#include "hb-ot-color-cbdt-table.hh"
+#include "hb-ot-color-sbix-table.hh"
+
+
+/**
+ * SECTION:hb-ot-font
+ * @title: hb-ot-font
+ * @short_description: OpenType font implementation
+ * @include: hb-ot.h
+ *
+ * Functions for using OpenType fonts with hb_shape().  Not that fonts returned
+ * by hb_font_create() default to using these functions, so most clients would
+ * never need to call these functions directly.
+ **/
+
+
+static hb_bool_t
+hb_ot_get_nominal_glyph (hb_font_t *font HB_UNUSED,
+			 void *font_data,
+			 hb_codepoint_t unicode,
+			 hb_codepoint_t *glyph,
+			 void *user_data HB_UNUSED)
+{
+  const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+  return ot_face->cmap->get_nominal_glyph (unicode, glyph);
+}
+
+static unsigned int
+hb_ot_get_nominal_glyphs (hb_font_t *font HB_UNUSED,
+			  void *font_data,
+			  unsigned int count,
+			  const hb_codepoint_t *first_unicode,
+			  unsigned int unicode_stride,
+			  hb_codepoint_t *first_glyph,
+			  unsigned int glyph_stride,
+			  void *user_data HB_UNUSED)
+{
+  const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+  return ot_face->cmap->get_nominal_glyphs (count,
+					    first_unicode, unicode_stride,
+					    first_glyph, glyph_stride);
+}
+
+static hb_bool_t
+hb_ot_get_variation_glyph (hb_font_t *font HB_UNUSED,
+			   void *font_data,
+			   hb_codepoint_t unicode,
+			   hb_codepoint_t variation_selector,
+			   hb_codepoint_t *glyph,
+			   void *user_data HB_UNUSED)
+{
+  const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+  return ot_face->cmap->get_variation_glyph (unicode, variation_selector, glyph);
+}
+
+static void
+hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data,
+			    unsigned count,
+			    const hb_codepoint_t *first_glyph,
+			    unsigned glyph_stride,
+			    hb_position_t *first_advance,
+			    unsigned advance_stride,
+			    void *user_data HB_UNUSED)
+{
+  const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+  const OT::hmtx_accelerator_t &hmtx = *ot_face->hmtx;
+
+  for (unsigned int i = 0; i < count; i++)
+  {
+    *first_advance = font->em_scale_x (hmtx.get_advance (*first_glyph, font));
+    first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+    first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
+  }
+}
+
+static void
+hb_ot_get_glyph_v_advances (hb_font_t* font, void* font_data,
+			    unsigned count,
+			    const hb_codepoint_t *first_glyph,
+			    unsigned glyph_stride,
+			    hb_position_t *first_advance,
+			    unsigned advance_stride,
+			    void *user_data HB_UNUSED)
+{
+  const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+  const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx;
+
+  for (unsigned int i = 0; i < count; i++)
+  {
+    *first_advance = font->em_scale_y (-(int) vmtx.get_advance (*first_glyph, font));
+    first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+    first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
+  }
+}
+
+static hb_bool_t
+hb_ot_get_glyph_v_origin (hb_font_t *font,
+			  void *font_data,
+			  hb_codepoint_t glyph,
+			  hb_position_t *x,
+			  hb_position_t *y,
+			  void *user_data HB_UNUSED)
+{
+  const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+
+  *x = font->get_glyph_h_advance (glyph) / 2;
+
+  const OT::VORG &VORG = *ot_face->VORG;
+  if (VORG.has_data ())
+  {
+    *y = font->em_scale_y (VORG.get_y_origin (glyph));
+    return true;
+  }
+
+  hb_glyph_extents_t extents = {0};
+  if (ot_face->glyf->get_extents (glyph, &extents))
+  {
+    const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx;
+    hb_position_t tsb = vmtx.get_side_bearing (glyph);
+    *y = font->em_scale_y (extents.y_bearing + tsb);
+    return true;
+  }
+
+  hb_font_extents_t font_extents;
+  font->get_h_extents_with_fallback (&font_extents);
+  *y = font_extents.ascender;
+
+  return true;
+}
+
+static hb_bool_t
+hb_ot_get_glyph_extents (hb_font_t *font,
+			 void *font_data,
+			 hb_codepoint_t glyph,
+			 hb_glyph_extents_t *extents,
+			 void *user_data HB_UNUSED)
+{
+  const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+  bool ret = ot_face->sbix->get_extents (font, glyph, extents);
+  if (!ret)
+    ret = ot_face->glyf->get_extents (glyph, extents);
+  if (!ret)
+    ret = ot_face->cff1->get_extents (glyph, extents);
+  if (!ret)
+    ret = ot_face->cff2->get_extents (font, glyph, extents);
+  if (!ret)
+    ret = ot_face->CBDT->get_extents (font, glyph, extents);
+  // TODO Hook up side-bearings variations.
+  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
+hb_ot_get_glyph_name (hb_font_t *font HB_UNUSED,
+                      void *font_data,
+                      hb_codepoint_t glyph,
+                      char *name, unsigned int size,
+                      void *user_data HB_UNUSED)
+{
+  const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+  return ot_face->post->get_glyph_name (glyph, name, size);
+}
+
+static hb_bool_t
+hb_ot_get_glyph_from_name (hb_font_t *font HB_UNUSED,
+                           void *font_data,
+                           const char *name, int len,
+                           hb_codepoint_t *glyph,
+                           void *user_data HB_UNUSED)
+{
+  const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+  return ot_face->post->get_glyph_from_name (name, len, glyph);
+}
+
+static hb_bool_t
+hb_ot_get_font_h_extents (hb_font_t *font,
+			  void *font_data,
+			  hb_font_extents_t *metrics,
+			  void *user_data HB_UNUSED)
+{
+  const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+  const OT::hmtx_accelerator_t &hmtx = *ot_face->hmtx;
+  metrics->ascender = font->em_scale_y (hmtx.ascender);
+  metrics->descender = font->em_scale_y (hmtx.descender);
+  metrics->line_gap = font->em_scale_y (hmtx.line_gap);
+  // TODO Hook up variations.
+  return hmtx.has_font_extents;
+}
+
+static hb_bool_t
+hb_ot_get_font_v_extents (hb_font_t *font,
+			  void *font_data,
+			  hb_font_extents_t *metrics,
+			  void *user_data HB_UNUSED)
+{
+  const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+  const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx;
+  metrics->ascender = font->em_scale_x (vmtx.ascender);
+  metrics->descender = font->em_scale_x (vmtx.descender);
+  metrics->line_gap = font->em_scale_x (vmtx.line_gap);
+  // TODO Hook up variations.
+  return vmtx.has_font_extents;
+}
+
+#if HB_USE_ATEXIT
+static void free_static_ot_funcs ();
+#endif
+
+static struct hb_ot_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t<hb_ot_font_funcs_lazy_loader_t>
+{
+  static hb_font_funcs_t *create ()
+  {
+    hb_font_funcs_t *funcs = hb_font_funcs_create ();
+
+    hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, nullptr, nullptr);
+    hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, nullptr, nullptr);
+    hb_font_funcs_set_nominal_glyph_func (funcs, hb_ot_get_nominal_glyph, nullptr, nullptr);
+    hb_font_funcs_set_nominal_glyphs_func (funcs, hb_ot_get_nominal_glyphs, nullptr, nullptr);
+    hb_font_funcs_set_variation_glyph_func (funcs, hb_ot_get_variation_glyph, nullptr, nullptr);
+    hb_font_funcs_set_glyph_h_advances_func (funcs, hb_ot_get_glyph_h_advances, nullptr, nullptr);
+    hb_font_funcs_set_glyph_v_advances_func (funcs, hb_ot_get_glyph_v_advances, nullptr, nullptr);
+    //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ot_get_glyph_h_origin, nullptr, nullptr);
+    hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, nullptr, nullptr);
+    hb_font_funcs_set_glyph_extents_func (funcs, hb_ot_get_glyph_extents, nullptr, nullptr);
+    //hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ot_get_glyph_contour_point, nullptr, nullptr);
+    hb_font_funcs_set_glyph_name_func (funcs, hb_ot_get_glyph_name, nullptr, nullptr);
+    hb_font_funcs_set_glyph_from_name_func (funcs, hb_ot_get_glyph_from_name, nullptr, nullptr);
+
+    hb_font_funcs_make_immutable (funcs);
+
+#if HB_USE_ATEXIT
+    atexit (free_static_ot_funcs);
+#endif
+
+    return funcs;
+  }
+} static_ot_funcs;
+
+#if HB_USE_ATEXIT
+static
+void free_static_ot_funcs ()
+{
+  static_ot_funcs.free_instance ();
+}
+#endif
+
+static hb_font_funcs_t *
+_hb_ot_get_font_funcs ()
+{
+  return static_ot_funcs.get_unconst ();
+}
+
+
+/**
+ * hb_ot_font_set_funcs:
+ *
+ * Since: 0.9.28
+ **/
+void
+hb_ot_font_set_funcs (hb_font_t *font)
+{
+  hb_font_set_funcs (font,
+		     _hb_ot_get_font_funcs (),
+		     &font->face->table,
+		     nullptr);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-font.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-font.h
new file mode 100644
index 0000000..80eaa54
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-font.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright © 2014  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, Roozbeh Pournader
+ */
+
+#ifndef HB_OT_H_IN
+#error "Include <hb-ot.h> instead."
+#endif
+
+#ifndef HB_OT_FONT_H
+#define HB_OT_FONT_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+
+HB_EXTERN void
+hb_ot_font_set_funcs (hb_font_t *font);
+
+
+HB_END_DECLS
+
+#endif /* HB_OT_FONT_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-gasp-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-gasp-table.hh
new file mode 100644
index 0000000..94fff58
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-gasp-table.hh
@@ -0,0 +1,84 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_OT_GASP_TABLE_HH
+#define HB_OT_GASP_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-hhea-table.hh"
+#include "hb-ot-os2-table.hh"
+#include "hb-ot-var-hvar-table.hh"
+
+/*
+ * gasp -- Grid-fitting and Scan-conversion Procedure
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/gasp
+ */
+#define HB_OT_TAG_gasp HB_TAG('g','a','s','p')
+
+
+namespace OT {
+
+struct GaspRange
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT16 	rangeMaxPPEM;	/* Upper limit of range, in PPEM */
+  HBUINT16 	rangeGaspBehavior;
+				/* Flags describing desired rasterizer behavior. */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct gasp
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_gasp;
+
+  const GaspRange &get_gasp_range (unsigned int i) const
+  { return gaspRanges[i]; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  gaspRanges.sanitize (c));
+  }
+
+  protected:
+  HBUINT16	version;	/* Version number (set to 1) */
+  ArrayOf<GaspRange>
+		gaspRanges;	/* Number of records to follow
+				 * Sorted by ppem */
+  public:
+  DEFINE_SIZE_ARRAY (4, gaspRanges);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_GASP_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-glyf-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-glyf-table.hh
new file mode 100644
index 0000000..c2b38b0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-glyf-table.hh
@@ -0,0 +1,482 @@
+/*
+ * Copyright © 2015  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_GLYF_TABLE_HH
+#define HB_OT_GLYF_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-head-table.hh"
+#include "hb-subset-glyf.hh"
+
+namespace OT {
+
+
+/*
+ * loca -- Index to Location
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/loca
+ */
+#define HB_OT_TAG_loca HB_TAG('l','o','c','a')
+
+
+struct loca
+{
+  friend struct glyf;
+
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_loca;
+
+  bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (true);
+  }
+
+  protected:
+  UnsizedArrayOf<HBUINT8>	dataZ;		/* Location data. */
+  public:
+  DEFINE_SIZE_MIN (0); /* In reality, this is UNBOUNDED() type; but since we always
+			* check the size externally, allow Null() object of it by
+			* defining it MIN() instead. */
+};
+
+
+/*
+ * glyf -- TrueType Glyph Data
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/glyf
+ */
+#define HB_OT_TAG_glyf HB_TAG('g','l','y','f')
+
+
+struct glyf
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_glyf;
+
+  bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const
+  {
+    TRACE_SANITIZE (this);
+    /* We don't check for anything specific here.  The users of the
+     * struct do all the hard work... */
+    return_trace (true);
+  }
+
+  bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_blob_t *glyf_prime = nullptr;
+    hb_blob_t *loca_prime = nullptr;
+
+    bool success = true;
+    bool use_short_loca = false;
+    if (hb_subset_glyf_and_loca (plan, &use_short_loca, &glyf_prime, &loca_prime)) {
+      success = success && plan->add_table (HB_OT_TAG_glyf, glyf_prime);
+      success = success && plan->add_table (HB_OT_TAG_loca, loca_prime);
+      success = success && _add_head_and_set_loca_version (plan, use_short_loca);
+    } else {
+      success = false;
+    }
+    hb_blob_destroy (loca_prime);
+    hb_blob_destroy (glyf_prime);
+
+    return success;
+  }
+
+  static bool
+  _add_head_and_set_loca_version (hb_subset_plan_t *plan, bool use_short_loca)
+  {
+    hb_blob_t *head_blob = hb_sanitize_context_t ().reference_table<head> (plan->source);
+    hb_blob_t *head_prime_blob = hb_blob_copy_writable_or_fail (head_blob);
+    hb_blob_destroy (head_blob);
+
+    if (unlikely (!head_prime_blob))
+      return false;
+
+    head *head_prime = (head *) hb_blob_get_data_writable (head_prime_blob, nullptr);
+    head_prime->indexToLocFormat.set (use_short_loca ? 0 : 1);
+    bool success = plan->add_table (HB_OT_TAG_head, head_prime_blob);
+
+    hb_blob_destroy (head_prime_blob);
+    return success;
+  }
+
+  struct GlyphHeader
+  {
+    HBINT16		numberOfContours;	/* If the number of contours is
+						 * greater than or equal to zero,
+						 * this is a simple glyph; if negative,
+						 * this is a composite glyph. */
+    FWORD		xMin;			/* Minimum x for coordinate data. */
+    FWORD		yMin;			/* Minimum y for coordinate data. */
+    FWORD		xMax;			/* Maximum x for coordinate data. */
+    FWORD		yMax;			/* Maximum y for coordinate data. */
+
+    DEFINE_SIZE_STATIC (10);
+  };
+
+  struct CompositeGlyphHeader
+  {
+    enum composite_glyph_flag_t {
+      ARG_1_AND_2_ARE_WORDS =      0x0001,
+      ARGS_ARE_XY_VALUES =         0x0002,
+      ROUND_XY_TO_GRID =           0x0004,
+      WE_HAVE_A_SCALE =            0x0008,
+      MORE_COMPONENTS =            0x0020,
+      WE_HAVE_AN_X_AND_Y_SCALE =   0x0040,
+      WE_HAVE_A_TWO_BY_TWO =       0x0080,
+      WE_HAVE_INSTRUCTIONS =       0x0100,
+      USE_MY_METRICS =             0x0200,
+      OVERLAP_COMPOUND =           0x0400,
+      SCALED_COMPONENT_OFFSET =    0x0800,
+      UNSCALED_COMPONENT_OFFSET =  0x1000
+    };
+
+    HBUINT16 flags;
+    GlyphID  glyphIndex;
+
+    unsigned int get_size () const
+    {
+      unsigned int size = min_size;
+      // arg1 and 2 are int16
+      if (flags & ARG_1_AND_2_ARE_WORDS) size += 4;
+      // arg1 and 2 are int8
+      else size += 2;
+
+      // One x 16 bit (scale)
+      if (flags & WE_HAVE_A_SCALE) size += 2;
+      // Two x 16 bit (xscale, yscale)
+      else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) size += 4;
+      // Four x 16 bit (xscale, scale01, scale10, yscale)
+      else if (flags & WE_HAVE_A_TWO_BY_TWO) size += 8;
+
+      return size;
+    }
+
+    struct Iterator
+    {
+      const char *glyph_start;
+      const char *glyph_end;
+      const CompositeGlyphHeader *current;
+
+      bool move_to_next ()
+      {
+	if (current->flags & CompositeGlyphHeader::MORE_COMPONENTS)
+	{
+	  const CompositeGlyphHeader *possible =
+	    &StructAfter<CompositeGlyphHeader, CompositeGlyphHeader> (*current);
+	  if (!in_range (possible))
+	    return false;
+	  current = possible;
+	  return true;
+	}
+	return false;
+      }
+
+      bool in_range (const CompositeGlyphHeader *composite) const
+      {
+	return (const char *) composite >= glyph_start
+	  && ((const char *) composite + CompositeGlyphHeader::min_size) <= glyph_end
+	  && ((const char *) composite + composite->get_size ()) <= glyph_end;
+      }
+    };
+
+    static bool get_iterator (const char * glyph_data,
+			      unsigned int length,
+			      CompositeGlyphHeader::Iterator *iterator /* OUT */)
+    {
+      if (length < GlyphHeader::static_size)
+	return false; /* Empty glyph; zero extents. */
+
+      const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyph_data, 0);
+      if (glyph_header.numberOfContours < 0)
+      {
+	const CompositeGlyphHeader *possible =
+	  &StructAfter<CompositeGlyphHeader, GlyphHeader> (glyph_header);
+
+	iterator->glyph_start = glyph_data;
+	iterator->glyph_end = (const char *) glyph_data + length;
+	if (!iterator->in_range (possible))
+	  return false;
+	iterator->current = possible;
+	return true;
+      }
+
+      return false;
+    }
+
+    DEFINE_SIZE_MIN (4);
+  };
+
+  struct accelerator_t
+  {
+    void init (hb_face_t *face)
+    {
+      memset (this, 0, sizeof (accelerator_t));
+
+      const OT::head &head = *face->table.head;
+      if (head.indexToLocFormat > 1 || head.glyphDataFormat != 0)
+	/* Unknown format.  Leave num_glyphs=0, that takes care of disabling us. */
+	return;
+      short_offset = 0 == head.indexToLocFormat;
+
+      loca_table = hb_sanitize_context_t ().reference_table<loca> (face);
+      glyf_table = hb_sanitize_context_t ().reference_table<glyf> (face);
+
+      num_glyphs = MAX (1u, loca_table.get_length () / (short_offset ? 2 : 4)) - 1;
+    }
+
+    void fini ()
+    {
+      loca_table.destroy ();
+      glyf_table.destroy ();
+    }
+
+    /*
+     * Returns true if the referenced glyph is a valid glyph and a composite glyph.
+     * If true is returned a pointer to the composite glyph will be written into
+     * composite.
+     */
+    bool get_composite (hb_codepoint_t glyph,
+			CompositeGlyphHeader::Iterator *composite /* OUT */) const
+    {
+      if (unlikely (!num_glyphs))
+	return false;
+
+      unsigned int start_offset, end_offset;
+      if (!get_offsets (glyph, &start_offset, &end_offset))
+	return false; /* glyph not found */
+
+      return CompositeGlyphHeader::get_iterator ((const char *) this->glyf_table + start_offset,
+						 end_offset - start_offset,
+						 composite);
+    }
+
+    enum simple_glyph_flag_t {
+      FLAG_ON_CURVE = 0x01,
+      FLAG_X_SHORT = 0x02,
+      FLAG_Y_SHORT = 0x04,
+      FLAG_REPEAT = 0x08,
+      FLAG_X_SAME = 0x10,
+      FLAG_Y_SAME = 0x20,
+      FLAG_RESERVED1 = 0x40,
+      FLAG_RESERVED2 = 0x80
+    };
+
+    /* based on FontTools _g_l_y_f.py::trim */
+    bool remove_padding (unsigned int start_offset,
+				unsigned int *end_offset) const
+    {
+      if (*end_offset - start_offset < GlyphHeader::static_size) return true;
+
+      const char *glyph = ((const char *) glyf_table) + start_offset;
+      const char * const glyph_end = glyph + (*end_offset - start_offset);
+      const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyph, 0);
+      int16_t num_contours = (int16_t) glyph_header.numberOfContours;
+
+      if (num_contours < 0)
+	/* Trimming for composites not implemented.
+	 * If removing hints it falls out of that. */
+	return true;
+      else if (num_contours > 0)
+      {
+	/* simple glyph w/contours, possibly trimmable */
+	glyph += GlyphHeader::static_size + 2 * num_contours;
+
+	if (unlikely (glyph + 2 >= glyph_end)) return false;
+	uint16_t nCoordinates = (uint16_t) StructAtOffset<HBUINT16> (glyph - 2, 0) + 1;
+	uint16_t nInstructions = (uint16_t) StructAtOffset<HBUINT16> (glyph, 0);
+
+	glyph += 2 + nInstructions;
+	if (unlikely (glyph + 2 >= glyph_end)) return false;
+
+	unsigned int coordBytes = 0;
+	unsigned int coordsWithFlags = 0;
+	while (glyph < glyph_end)
+	{
+	  uint8_t flag = (uint8_t) *glyph;
+	  glyph++;
+
+	  unsigned int repeat = 1;
+	  if (flag & FLAG_REPEAT)
+	  {
+	    if (glyph >= glyph_end)
+	    {
+	      DEBUG_MSG(SUBSET, nullptr, "Bad flag");
+	      return false;
+	    }
+	    repeat = ((uint8_t) *glyph) + 1;
+	    glyph++;
+	  }
+
+	  unsigned int xBytes, yBytes;
+	  xBytes = yBytes = 0;
+	  if (flag & FLAG_X_SHORT) xBytes = 1;
+	  else if ((flag & FLAG_X_SAME) == 0) xBytes = 2;
+
+	  if (flag & FLAG_Y_SHORT) yBytes = 1;
+	  else if ((flag & FLAG_Y_SAME) == 0) yBytes = 2;
+
+	  coordBytes += (xBytes + yBytes) * repeat;
+	  coordsWithFlags += repeat;
+	  if (coordsWithFlags >= nCoordinates)
+	    break;
+	}
+
+	if (coordsWithFlags != nCoordinates)
+	{
+	  DEBUG_MSG(SUBSET, nullptr, "Expect %d coords to have flags, got flags for %d", nCoordinates, coordsWithFlags);
+	  return false;
+	}
+	glyph += coordBytes;
+
+	if (glyph < glyph_end)
+	  *end_offset -= glyph_end - glyph;
+      }
+      return true;
+    }
+
+    bool get_offsets (hb_codepoint_t  glyph,
+		      unsigned int   *start_offset /* OUT */,
+		      unsigned int   *end_offset   /* OUT */) const
+    {
+      if (unlikely (glyph >= num_glyphs))
+	return false;
+
+      if (short_offset)
+      {
+	const HBUINT16 *offsets = (const HBUINT16 *) loca_table->dataZ.arrayZ;
+	*start_offset = 2 * offsets[glyph];
+	*end_offset   = 2 * offsets[glyph + 1];
+      }
+      else
+      {
+	const HBUINT32 *offsets = (const HBUINT32 *) loca_table->dataZ.arrayZ;
+
+	*start_offset = offsets[glyph];
+	*end_offset   = offsets[glyph + 1];
+      }
+
+      if (*start_offset > *end_offset || *end_offset > glyf_table.get_length ())
+	return false;
+
+      return true;
+    }
+
+    bool get_instruction_offsets (unsigned int start_offset,
+				  unsigned int end_offset,
+				  unsigned int *instruction_start /* OUT */,
+				  unsigned int *instruction_end /* OUT */) const
+    {
+      if (end_offset - start_offset < GlyphHeader::static_size)
+      {
+	*instruction_start = 0;
+	*instruction_end = 0;
+	return true; /* Empty glyph; no instructions. */
+      }
+      const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyf_table, start_offset);
+      int16_t num_contours = (int16_t) glyph_header.numberOfContours;
+      if (num_contours < 0)
+      {
+	CompositeGlyphHeader::Iterator composite_it;
+	if (unlikely (!CompositeGlyphHeader::get_iterator (
+	    (const char*) this->glyf_table + start_offset,
+	     end_offset - start_offset, &composite_it))) return false;
+	const CompositeGlyphHeader *last;
+	do {
+	  last = composite_it.current;
+	} while (composite_it.move_to_next ());
+
+	if ((uint16_t) last->flags & CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS)
+	  *instruction_start = ((char *) last - (char *) glyf_table->dataZ.arrayZ) + last->get_size ();
+	else
+	  *instruction_start = end_offset;
+	*instruction_end = end_offset;
+	if (unlikely (*instruction_start > *instruction_end))
+	{
+	  DEBUG_MSG(SUBSET, nullptr, "Invalid instruction offset, %d is outside [%d, %d]", *instruction_start, start_offset, end_offset);
+	  return false;
+	}
+      }
+      else
+      {
+	unsigned int instruction_length_offset = start_offset + GlyphHeader::static_size + 2 * num_contours;
+	if (unlikely (instruction_length_offset + 2 > end_offset))
+	{
+	  DEBUG_MSG(SUBSET, nullptr, "Glyph size is too short, missing field instructionLength.");
+	  return false;
+	}
+
+	const HBUINT16 &instruction_length = StructAtOffset<HBUINT16> (glyf_table, instruction_length_offset);
+	unsigned int start = instruction_length_offset + 2;
+	unsigned int end = start + (uint16_t) instruction_length;
+	if (unlikely (end > end_offset)) // Out of bounds of the current glyph
+	{
+	  DEBUG_MSG(SUBSET, nullptr, "The instructions array overruns the glyph's boundaries.");
+	  return false;
+	}
+
+	*instruction_start = start;
+	*instruction_end = end;
+      }
+      return true;
+    }
+
+    bool get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const
+    {
+      unsigned int start_offset, end_offset;
+      if (!get_offsets (glyph, &start_offset, &end_offset))
+	return false;
+
+      if (end_offset - start_offset < GlyphHeader::static_size)
+	return true; /* Empty glyph; zero extents. */
+
+      const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyf_table, start_offset);
+
+      extents->x_bearing = MIN (glyph_header.xMin, glyph_header.xMax);
+      extents->y_bearing = MAX (glyph_header.yMin, glyph_header.yMax);
+      extents->width     = MAX (glyph_header.xMin, glyph_header.xMax) - extents->x_bearing;
+      extents->height    = MIN (glyph_header.yMin, glyph_header.yMax) - extents->y_bearing;
+
+      return true;
+    }
+
+    private:
+    bool short_offset;
+    unsigned int num_glyphs;
+    hb_blob_ptr_t<loca> loca_table;
+    hb_blob_ptr_t<glyf> glyf_table;
+  };
+
+  protected:
+  UnsizedArrayOf<HBUINT8>	dataZ;		/* Glyphs data. */
+  public:
+  DEFINE_SIZE_MIN (0); /* In reality, this is UNBOUNDED() type; but since we always
+			* check the size externally, allow Null() object of it by
+			* defining it MIN() instead. */
+};
+
+struct glyf_accelerator_t : glyf::accelerator_t {};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_GLYF_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-hdmx-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-hdmx-table.hh
new file mode 100644
index 0000000..95229c5
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-hdmx-table.hh
@@ -0,0 +1,214 @@
+/*
+ * Copyright © 2018  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): Garret Rieger
+ */
+
+#ifndef HB_OT_HDMX_TABLE_HH
+#define HB_OT_HDMX_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * hdmx -- Horizontal Device Metrics
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/hdmx
+ */
+#define HB_OT_TAG_hdmx HB_TAG('h','d','m','x')
+
+
+namespace OT {
+
+
+struct DeviceRecord
+{
+  struct SubsetView
+  {
+    const DeviceRecord *source_device_record;
+    unsigned int sizeDeviceRecord;
+    hb_subset_plan_t *subset_plan;
+
+    void init (const DeviceRecord *source_device_record,
+	       unsigned int sizeDeviceRecord,
+	       hb_subset_plan_t   *subset_plan)
+    {
+      this->source_device_record = source_device_record;
+      this->sizeDeviceRecord = sizeDeviceRecord;
+      this->subset_plan = subset_plan;
+    }
+
+    unsigned int len () const
+    { return this->subset_plan->glyphs.length; }
+
+    const HBUINT8* operator [] (unsigned int i) const
+    {
+      if (unlikely (i >= len ())) return nullptr;
+      hb_codepoint_t gid = this->subset_plan->glyphs [i];
+
+      if (gid >= sizeDeviceRecord - DeviceRecord::min_size)
+        return nullptr;
+      return &(this->source_device_record->widthsZ[gid]);
+    }
+  };
+
+  static unsigned int get_size (unsigned int count)
+  { return hb_ceil_to_4 (min_size + count * HBUINT8::static_size); }
+
+  bool serialize (hb_serialize_context_t *c, const SubsetView &subset_view)
+  {
+    TRACE_SERIALIZE (this);
+
+    unsigned int size = get_size (subset_view.len ());
+    if (unlikely (!c->allocate_size<DeviceRecord> (size)))
+    {
+      DEBUG_MSG(SUBSET, nullptr, "Couldn't allocate enough space for DeviceRecord: %d.",
+		 size);
+      return_trace (false);
+    }
+
+    this->pixelSize.set (subset_view.source_device_record->pixelSize);
+    this->maxWidth.set (subset_view.source_device_record->maxWidth);
+
+    for (unsigned int i = 0; i < subset_view.len (); i++)
+    {
+      const HBUINT8 *width = subset_view[i];
+      if (!width)
+      {
+	DEBUG_MSG(SUBSET, nullptr, "HDMX width for new gid %d is missing.", i);
+	return_trace (false);
+      }
+      widthsZ[i].set (*width);
+    }
+
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c, unsigned int sizeDeviceRecord) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  c->check_range (this, sizeDeviceRecord)));
+  }
+
+  HBUINT8			pixelSize;	/* Pixel size for following widths (as ppem). */
+  HBUINT8			maxWidth;	/* Maximum width. */
+  UnsizedArrayOf<HBUINT8>	widthsZ;	/* Array of widths (numGlyphs is from the 'maxp' table). */
+  public:
+  DEFINE_SIZE_ARRAY (2, widthsZ);
+};
+
+
+struct hdmx
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_hdmx;
+
+  unsigned int get_size () const
+  { return min_size + numRecords * sizeDeviceRecord; }
+
+  const DeviceRecord& operator [] (unsigned int i) const
+  {
+    /* XXX Null(DeviceRecord) is NOT safe as it's num-glyphs lengthed.
+     * https://github.com/harfbuzz/harfbuzz/issues/1300 */
+    if (unlikely (i >= numRecords)) return Null (DeviceRecord);
+    return StructAtOffset<DeviceRecord> (&this->firstDeviceRecord, i * sizeDeviceRecord);
+  }
+
+  bool serialize (hb_serialize_context_t *c, const hdmx *source_hdmx, hb_subset_plan_t *plan)
+  {
+    TRACE_SERIALIZE (this);
+
+    if (unlikely (!c->extend_min ((*this))))  return_trace (false);
+
+    this->version.set (source_hdmx->version);
+    this->numRecords.set (source_hdmx->numRecords);
+    this->sizeDeviceRecord.set (DeviceRecord::get_size (plan->glyphs.length));
+
+    for (unsigned int i = 0; i < source_hdmx->numRecords; i++)
+    {
+      DeviceRecord::SubsetView subset_view;
+      subset_view.init (&(*source_hdmx)[i], source_hdmx->sizeDeviceRecord, plan);
+
+      if (!c->start_embed<DeviceRecord> ()->serialize (c, subset_view))
+	return_trace (false);
+    }
+
+    return_trace (true);
+  }
+
+  static size_t get_subsetted_size (const hdmx *source_hdmx, hb_subset_plan_t *plan)
+  {
+    return min_size + source_hdmx->numRecords * DeviceRecord::get_size (plan->glyphs.length);
+  }
+
+  bool subset (hb_subset_plan_t *plan) const
+  {
+    size_t dest_size = get_subsetted_size (this, plan);
+    hdmx *dest = (hdmx *) malloc (dest_size);
+    if (unlikely (!dest))
+    {
+      DEBUG_MSG(SUBSET, nullptr, "Unable to alloc %lu for hdmx subset output.", (unsigned long) dest_size);
+      return false;
+    }
+
+    hb_serialize_context_t c (dest, dest_size);
+    hdmx *hdmx_prime = c.start_serialize<hdmx> ();
+    if (!hdmx_prime || !hdmx_prime->serialize (&c, this, plan))
+    {
+      free (dest);
+      DEBUG_MSG(SUBSET, nullptr, "Failed to serialize write new hdmx.");
+      return false;
+    }
+    c.end_serialize ();
+
+    hb_blob_t *hdmx_prime_blob = hb_blob_create ((const char *) dest,
+						 dest_size,
+						 HB_MEMORY_MODE_READONLY,
+						 dest,
+						 free);
+    bool result = plan->add_table (HB_OT_TAG_hdmx, hdmx_prime_blob);
+    hb_blob_destroy (hdmx_prime_blob);
+
+    return result;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  !hb_unsigned_mul_overflows (numRecords, sizeDeviceRecord) &&
+		  sizeDeviceRecord >= DeviceRecord::min_size &&
+		  c->check_range (this, get_size ()));
+  }
+
+  protected:
+  HBUINT16		version;		/* Table version number (0) */
+  HBUINT16		numRecords;		/* Number of device records. */
+  HBUINT32		sizeDeviceRecord;	/* Size of a device record, 32-bit aligned. */
+  DeviceRecord		firstDeviceRecord;	/* Array of device records. */
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_HDMX_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-head-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-head-table.hh
new file mode 100644
index 0000000..3c0bb3d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-head-table.hh
@@ -0,0 +1,167 @@
+/*
+ * Copyright © 2010  Red Hat, Inc.
+ * Copyright © 2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_HEAD_TABLE_HH
+#define HB_OT_HEAD_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * head -- Font Header
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/head
+ */
+#define HB_OT_TAG_head HB_TAG('h','e','a','d')
+
+
+namespace OT {
+
+
+struct head
+{
+  friend struct OffsetTable;
+
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_head;
+
+  unsigned int get_upem () const
+  {
+    unsigned int upem = unitsPerEm;
+    /* If no valid head table found, assume 1000, which matches typical Type1 usage. */
+    return 16 <= upem && upem <= 16384 ? upem : 1000;
+  }
+
+  enum mac_style_flag_t {
+    BOLD	= 1u<<0,
+    ITALIC	= 1u<<1,
+    UNDERLINE	= 1u<<2,
+    OUTLINE	= 1u<<3,
+    SHADOW	= 1u<<4,
+    CONDENSED	= 1u<<5
+  };
+
+  bool is_bold () const      { return macStyle & BOLD; }
+  bool is_italic () const    { return macStyle & ITALIC; }
+  bool is_condensed () const { return macStyle & CONDENSED; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  version.major == 1 &&
+		  magicNumber == 0x5F0F3CF5u);
+  }
+
+  protected:
+  FixedVersion<>version;		/* Version of the head table--currently
+					 * 0x00010000u for version 1.0. */
+  FixedVersion<>fontRevision;		/* Set by font manufacturer. */
+  HBUINT32	checkSumAdjustment;	/* To compute: set it to 0, sum the
+					 * entire font as HBUINT32, then store
+					 * 0xB1B0AFBAu - sum. */
+  HBUINT32	magicNumber;		/* Set to 0x5F0F3CF5u. */
+  HBUINT16	flags;			/* Bit 0: Baseline for font at y=0;
+					 * Bit 1: Left sidebearing point at x=0;
+					 * Bit 2: Instructions may depend on point size;
+					 * Bit 3: Force ppem to integer values for all
+					 *   internal scaler math; may use fractional
+					 *   ppem sizes if this bit is clear;
+					 * Bit 4: Instructions may alter advance width
+					 *   (the advance widths might not scale linearly);
+					 * Bits 5-10: These should be set according to
+					 *   Apple's specification. However, they are not
+					 *   implemented in OpenType.
+					 * Bit 5: This bit should be set in fonts that are
+					 *   intended to e laid out vertically, and in
+					 *   which the glyphs have been drawn such that an
+					 *   x-coordinate of 0 corresponds to the desired
+					 *   vertical baseline.
+					 * Bit 6: This bit must be set to zero.
+					 * Bit 7: This bit should be set if the font
+					 *   requires layout for correct linguistic
+					 *   rendering (e.g. Arabic fonts).
+					 * Bit 8: This bit should be set for a GX font
+					 *   which has one or more metamorphosis effects
+					 *   designated as happening by default.
+					 * Bit 9: This bit should be set if the font
+					 *   contains any strong right-to-left glyphs.
+					 * Bit 10: This bit should be set if the font
+					 *   contains Indic-style rearrangement effects.
+					 * Bit 11: Font data is 'lossless,' as a result
+					 *   of having been compressed and decompressed
+					 *   with the Agfa MicroType Express engine.
+					 * Bit 12: Font converted (produce compatible metrics)
+					 * Bit 13: Font optimized for ClearType™.
+					 *   Note, fonts that rely on embedded bitmaps (EBDT)
+					 *   for rendering should not be considered optimized
+					 *   for ClearType, and therefore should keep this bit
+					 *   cleared.
+					 * Bit 14: Last Resort font. If set, indicates that
+					 * the glyphs encoded in the cmap subtables are simply
+					 * generic symbolic representations of code point
+					 * ranges and don’t truly represent support for those
+					 * code points. If unset, indicates that the glyphs
+					 * encoded in the cmap subtables represent proper
+					 * support for those code points.
+					 * Bit 15: Reserved, set to 0. */
+  HBUINT16	unitsPerEm;		/* Valid range is from 16 to 16384. This value
+					 * should be a power of 2 for fonts that have
+					 * TrueType outlines. */
+  LONGDATETIME	created;		/* Number of seconds since 12:00 midnight,
+					   January 1, 1904. 64-bit integer */
+  LONGDATETIME	modified;		/* Number of seconds since 12:00 midnight,
+					   January 1, 1904. 64-bit integer */
+  HBINT16	xMin;			/* For all glyph bounding boxes. */
+  HBINT16	yMin;			/* For all glyph bounding boxes. */
+  HBINT16	xMax;			/* For all glyph bounding boxes. */
+  HBINT16	yMax;			/* For all glyph bounding boxes. */
+  HBUINT16	macStyle;		/* Bit 0: Bold (if set to 1);
+					 * Bit 1: Italic (if set to 1)
+					 * Bit 2: Underline (if set to 1)
+					 * Bit 3: Outline (if set to 1)
+					 * Bit 4: Shadow (if set to 1)
+					 * Bit 5: Condensed (if set to 1)
+					 * Bit 6: Extended (if set to 1)
+					 * Bits 7-15: Reserved (set to 0). */
+  HBUINT16	lowestRecPPEM;		/* Smallest readable size in pixels. */
+  HBINT16	fontDirectionHint;	/* Deprecated (Set to 2).
+					 * 0: Fully mixed directional glyphs;
+					 * 1: Only strongly left to right;
+					 * 2: Like 1 but also contains neutrals;
+					 * -1: Only strongly right to left;
+					 * -2: Like -1 but also contains neutrals. */
+  public:
+  HBUINT16	indexToLocFormat;	/* 0 for short offsets, 1 for long. */
+  HBUINT16	glyphDataFormat;	/* 0 for current format. */
+
+  DEFINE_SIZE_STATIC (54);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_HEAD_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-hhea-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-hhea-table.hh
new file mode 100644
index 0000000..c3155b7
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-hhea-table.hh
@@ -0,0 +1,99 @@
+/*
+ * Copyright © 2011,2012  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_HHEA_TABLE_HH
+#define HB_OT_HHEA_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * hhea -- Horizontal Header
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/hhea
+ * vhea -- Vertical Header
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/vhea
+ */
+#define HB_OT_TAG_hhea HB_TAG('h','h','e','a')
+#define HB_OT_TAG_vhea HB_TAG('v','h','e','a')
+
+
+namespace OT {
+
+
+template <typename T>
+struct _hea
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && likely (version.major == 1));
+  }
+
+  public:
+  FixedVersion<>version;		/* 0x00010000u for version 1.0. */
+  FWORD		ascender;		/* Typographic ascent. */
+  FWORD		descender;		/* Typographic descent. */
+  FWORD		lineGap;		/* Typographic line gap. */
+  UFWORD	advanceMax;		/* Maximum advance width/height value in
+					 * metrics table. */
+  FWORD		minLeadingBearing;	/* Minimum left/top sidebearing value in
+					 * metrics table. */
+  FWORD		minTrailingBearing;	/* Minimum right/bottom sidebearing value;
+					 * calculated as Min(aw - lsb -
+					 * (xMax - xMin)) for horizontal. */
+  FWORD		maxExtent;		/* horizontal: Max(lsb + (xMax - xMin)),
+					 * vertical: minLeadingBearing+(yMax-yMin). */
+  HBINT16		caretSlopeRise;		/* Used to calculate the slope of the
+					 * cursor (rise/run); 1 for vertical caret,
+					 * 0 for horizontal.*/
+  HBINT16		caretSlopeRun;		/* 0 for vertical caret, 1 for horizontal. */
+  HBINT16		caretOffset;		/* The amount by which a slanted
+					 * highlight on a glyph needs
+					 * to be shifted to produce the
+					 * best appearance. Set to 0 for
+					 * non-slanted fonts. */
+  HBINT16		reserved1;		/* Set to 0. */
+  HBINT16		reserved2;		/* Set to 0. */
+  HBINT16		reserved3;		/* Set to 0. */
+  HBINT16		reserved4;		/* Set to 0. */
+  HBINT16		metricDataFormat;	/* 0 for current format. */
+  HBUINT16	numberOfLongMetrics;	/* Number of LongMetric entries in metric
+					 * table. */
+  public:
+  DEFINE_SIZE_STATIC (36);
+};
+
+struct hhea : _hea<hhea> {
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_hhea;
+};
+struct vhea : _hea<vhea> {
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_vhea;
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_HHEA_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-hmtx-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-hmtx-table.hh
new file mode 100644
index 0000000..a95a56f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-hmtx-table.hh
@@ -0,0 +1,342 @@
+/*
+ * Copyright © 2011,2012  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, Roderick Sheeter
+ */
+
+#ifndef HB_OT_HMTX_TABLE_HH
+#define HB_OT_HMTX_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-hhea-table.hh"
+#include "hb-ot-os2-table.hh"
+#include "hb-ot-var-hvar-table.hh"
+
+/*
+ * hmtx -- Horizontal Metrics
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/hmtx
+ * vmtx -- Vertical Metrics
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/vmtx
+ */
+#define HB_OT_TAG_hmtx HB_TAG('h','m','t','x')
+#define HB_OT_TAG_vmtx HB_TAG('v','m','t','x')
+
+
+namespace OT {
+
+
+struct LongMetric
+{
+  UFWORD	advance; /* Advance width/height. */
+  FWORD		sb; /* Leading (left/top) side bearing. */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+template <typename T, typename H>
+struct hmtxvmtx
+{
+  bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const
+  {
+    TRACE_SANITIZE (this);
+    /* We don't check for anything specific here.  The users of the
+     * struct do all the hard work... */
+    return_trace (true);
+  }
+
+
+  bool subset_update_header (hb_subset_plan_t *plan,
+				    unsigned int num_hmetrics) const
+  {
+    hb_blob_t *src_blob = hb_sanitize_context_t ().reference_table<H> (plan->source, H::tableTag);
+    hb_blob_t *dest_blob = hb_blob_copy_writable_or_fail (src_blob);
+    hb_blob_destroy (src_blob);
+
+    if (unlikely (!dest_blob)) {
+      return false;
+    }
+
+    unsigned int length;
+    H *table = (H *) hb_blob_get_data (dest_blob, &length);
+    table->numberOfLongMetrics.set (num_hmetrics);
+
+    bool result = plan->add_table (H::tableTag, dest_blob);
+    hb_blob_destroy (dest_blob);
+
+    return result;
+  }
+
+  bool subset (hb_subset_plan_t *plan) const
+  {
+    typename T::accelerator_t _mtx;
+    _mtx.init (plan->source);
+
+    /* All the trailing glyphs with the same advance can use one LongMetric
+     * and just keep LSB */
+    hb_vector_t<hb_codepoint_t> &gids = plan->glyphs;
+    unsigned int num_advances = gids.length;
+    unsigned int last_advance = _mtx.get_advance (gids[num_advances - 1]);
+    while (num_advances > 1 &&
+	   last_advance == _mtx.get_advance (gids[num_advances - 2]))
+    {
+      num_advances--;
+    }
+
+    /* alloc the new table */
+    size_t dest_sz = num_advances * 4
+		  + (gids.length - num_advances) * 2;
+    void *dest = (void *) malloc (dest_sz);
+    if (unlikely (!dest))
+    {
+      return false;
+    }
+    DEBUG_MSG(SUBSET, nullptr, "%c%c%c%c in src has %d advances, %d lsbs", HB_UNTAG(T::tableTag), _mtx.num_advances, _mtx.num_metrics - _mtx.num_advances);
+    DEBUG_MSG(SUBSET, nullptr, "%c%c%c%c in dest has %d advances, %d lsbs, %u bytes", HB_UNTAG(T::tableTag), num_advances, gids.length - num_advances, (unsigned int) dest_sz);
+
+    const char *source_table = hb_blob_get_data (_mtx.table.get_blob (), nullptr);
+    // Copy everything over
+    LongMetric * old_metrics = (LongMetric *) source_table;
+    FWORD *lsbs = (FWORD *) (old_metrics + _mtx.num_advances);
+    char * dest_pos = (char *) dest;
+
+    bool failed = false;
+    for (unsigned int i = 0; i < gids.length; i++)
+    {
+      /* the last metric or the one for gids[i] */
+      LongMetric *src_metric = old_metrics + MIN ((hb_codepoint_t) _mtx.num_advances - 1, gids[i]);
+      if (gids[i] < _mtx.num_advances)
+      {
+        /* src is a LongMetric */
+        if (i < num_advances)
+        {
+          /* dest is a LongMetric, copy it */
+          *((LongMetric *) dest_pos) = *src_metric;
+        }
+        else
+        {
+          /* dest just sb */
+          *((FWORD *) dest_pos) = src_metric->sb;
+        }
+      }
+      else
+      {
+	if (gids[i] >= _mtx.num_metrics)
+	{
+	  DEBUG_MSG(SUBSET, nullptr, "gid %d is >= number of source metrics %d",
+		    gids[i], _mtx.num_metrics);
+	  failed = true;
+	  break;
+	}
+	FWORD src_sb = *(lsbs + gids[i] - _mtx.num_advances);
+        if (i < num_advances)
+        {
+          /* dest needs a full LongMetric */
+          LongMetric *metric = (LongMetric *)dest_pos;
+          metric->advance = src_metric->advance;
+          metric->sb = src_sb;
+        }
+        else
+        {
+          /* dest just needs an sb */
+          *((FWORD *) dest_pos) = src_sb;
+        }
+      }
+      dest_pos += (i < num_advances ? 4 : 2);
+    }
+    _mtx.fini ();
+
+    // Amend header num hmetrics
+    if (failed || unlikely (!subset_update_header (plan, num_advances)))
+    {
+      free (dest);
+      return false;
+    }
+
+    hb_blob_t *result = hb_blob_create ((const char *)dest,
+                                        dest_sz,
+                                        HB_MEMORY_MODE_READONLY,
+                                        dest,
+                                        free);
+    bool success = plan->add_table (T::tableTag, result);
+    hb_blob_destroy (result);
+    return success;
+  }
+
+  struct accelerator_t
+  {
+    friend struct hmtxvmtx;
+
+    void init (hb_face_t *face,
+		      unsigned int default_advance_ = 0)
+    {
+      default_advance = default_advance_ ? default_advance_ : hb_face_get_upem (face);
+
+      bool got_font_extents = false;
+      if (T::os2Tag != HB_TAG_NONE && face->table.OS2->is_typo_metrics ())
+      {
+	ascender = abs (face->table.OS2->sTypoAscender);
+	descender = -abs (face->table.OS2->sTypoDescender);
+	line_gap = face->table.OS2->sTypoLineGap;
+	got_font_extents = (ascender | descender) != 0;
+      }
+
+      hb_blob_t *_hea_blob = hb_sanitize_context_t().reference_table<H> (face);
+      const H *_hea_table = _hea_blob->as<H> ();
+      num_advances = _hea_table->numberOfLongMetrics;
+      if (!got_font_extents)
+      {
+	ascender = abs (_hea_table->ascender);
+	descender = -abs (_hea_table->descender);
+	line_gap = _hea_table->lineGap;
+	got_font_extents = (ascender | descender) != 0;
+      }
+      hb_blob_destroy (_hea_blob);
+
+      has_font_extents = got_font_extents;
+
+      table = hb_sanitize_context_t().reference_table<hmtxvmtx> (face, T::tableTag);
+
+      /* Cap num_metrics() and num_advances() based on table length. */
+      unsigned int len = table.get_length ();
+      if (unlikely (num_advances * 4 > len))
+	num_advances = len / 4;
+      num_metrics = num_advances + (len - 4 * num_advances) / 2;
+
+      /* We MUST set num_metrics to zero if num_advances is zero.
+       * Our get_advance() depends on that. */
+      if (unlikely (!num_advances))
+      {
+	num_metrics = num_advances = 0;
+	table.destroy ();
+	table = hb_blob_get_empty ();
+      }
+
+      var_table = hb_sanitize_context_t().reference_table<HVARVVAR> (face, T::variationsTag);
+    }
+
+    void fini ()
+    {
+      table.destroy ();
+      var_table.destroy ();
+    }
+
+    /* TODO Add variations version. */
+    unsigned int get_side_bearing (hb_codepoint_t glyph) const
+    {
+      if (glyph < num_advances)
+        return table->longMetricZ[glyph].sb;
+
+      if (unlikely (glyph >= num_metrics))
+        return 0;
+
+      const FWORD *bearings = (const FWORD *) &table->longMetricZ[num_advances];
+      return bearings[glyph - num_advances];
+    }
+
+    unsigned int get_advance (hb_codepoint_t glyph) const
+    {
+      if (unlikely (glyph >= num_metrics))
+      {
+	/* If num_metrics is zero, it means we don't have the metrics table
+	 * for this direction: return default advance.  Otherwise, it means that the
+	 * glyph index is out of bound: return zero. */
+	if (num_metrics)
+	  return 0;
+	else
+	  return default_advance;
+      }
+
+      return table->longMetricZ[MIN (glyph, (uint32_t) num_advances - 1)].advance;
+    }
+
+    unsigned int get_advance (hb_codepoint_t  glyph,
+			      hb_font_t      *font) const
+    {
+      unsigned int advance = get_advance (glyph);
+      if (likely (glyph < num_metrics))
+      {
+	advance += (font->num_coords ? var_table->get_advance_var (glyph, font->coords, font->num_coords) : 0); // TODO Optimize?!
+      }
+      return advance;
+    }
+
+    public:
+    bool has_font_extents;
+    int ascender;
+    int descender;
+    int line_gap;
+
+    protected:
+    unsigned int num_metrics;
+    unsigned int num_advances;
+    unsigned int default_advance;
+
+    private:
+    hb_blob_ptr_t<hmtxvmtx> table;
+    hb_blob_ptr_t<HVARVVAR> var_table;
+  };
+
+  protected:
+  UnsizedArrayOf<LongMetric>longMetricZ;/* Paired advance width and leading
+					 * bearing values for each glyph. The
+					 * value numOfHMetrics comes from
+					 * the 'hhea' table. If the font is
+					 * monospaced, only one entry need
+					 * be in the array, but that entry is
+					 * required. The last entry applies to
+					 * all subsequent glyphs. */
+/*UnsizedArrayOf<FWORD>	leadingBearingX;*//* Here the advance is assumed
+					 * to be the same as the advance
+					 * for the last entry above. The
+					 * number of entries in this array is
+					 * derived from numGlyphs (from 'maxp'
+					 * table) minus numberOfLongMetrics.
+					 * This generally is used with a run
+					 * of monospaced glyphs (e.g., Kanji
+					 * fonts or Courier fonts). Only one
+					 * run is allowed and it must be at
+					 * the end. This allows a monospaced
+					 * font to vary the side bearing
+					 * values for each glyph. */
+  public:
+  DEFINE_SIZE_ARRAY (0, longMetricZ);
+};
+
+struct hmtx : hmtxvmtx<hmtx, hhea> {
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_hmtx;
+  static constexpr hb_tag_t variationsTag = HB_OT_TAG_HVAR;
+  static constexpr hb_tag_t os2Tag = HB_OT_TAG_OS2;
+};
+struct vmtx : hmtxvmtx<vmtx, vhea> {
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_vmtx;
+  static constexpr hb_tag_t variationsTag = HB_OT_TAG_VVAR;
+  static constexpr hb_tag_t os2Tag = HB_TAG_NONE;
+};
+
+struct hmtx_accelerator_t : hmtx::accelerator_t {};
+struct vmtx_accelerator_t : vmtx::accelerator_t {};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_HMTX_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-kern-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-kern-table.hh
new file mode 100644
index 0000000..ec6a3c8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-kern-table.hh
@@ -0,0 +1,340 @@
+/*
+ * Copyright © 2017  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_KERN_TABLE_HH
+#define HB_OT_KERN_TABLE_HH
+
+#include "hb-aat-layout-kerx-table.hh"
+
+
+/*
+ * kern -- Kerning
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/kern
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6kern.html
+ */
+#define HB_OT_TAG_kern HB_TAG('k','e','r','n')
+
+
+namespace OT {
+
+
+template <typename KernSubTableHeader>
+struct KernSubTableFormat3
+{
+  int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+  {
+    hb_array_t<const FWORD> kernValue = kernValueZ.as_array (kernValueCount);
+    hb_array_t<const HBUINT8> leftClass = StructAfter<const UnsizedArrayOf<HBUINT8> > (kernValue).as_array (glyphCount);
+    hb_array_t<const HBUINT8> rightClass = StructAfter<const UnsizedArrayOf<HBUINT8> > (leftClass).as_array (glyphCount);
+    hb_array_t<const HBUINT8> kernIndex = StructAfter<const UnsizedArrayOf<HBUINT8> > (rightClass).as_array (leftClassCount * rightClassCount);
+
+    unsigned int leftC = leftClass[left];
+    unsigned int rightC = rightClass[right];
+    if (unlikely (leftC >= leftClassCount || rightC >= rightClassCount))
+      return 0;
+    unsigned int i = leftC * rightClassCount + rightC;
+    return kernValue[kernIndex[i]];
+  }
+
+  bool apply (AAT::hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    if (!c->plan->requested_kerning)
+      return false;
+
+    if (header.coverage & header.Backwards)
+      return false;
+
+    hb_kern_machine_t<KernSubTableFormat3> machine (*this, header.coverage & header.CrossStream);
+    machine.kern (c->font, c->buffer, c->plan->kern_mask);
+
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  c->check_range (kernValueZ,
+				  kernValueCount * sizeof (FWORD) +
+				  glyphCount * 2 +
+				  leftClassCount * rightClassCount));
+  }
+
+  protected:
+  KernSubTableHeader	header;
+  HBUINT16		glyphCount;	/* The number of glyphs in this font. */
+  HBUINT8		kernValueCount;	/* The number of kerning values. */
+  HBUINT8		leftClassCount;	/* The number of left-hand classes. */
+  HBUINT8		rightClassCount;/* The number of right-hand classes. */
+  HBUINT8		flags;		/* Set to zero (reserved for future use). */
+  UnsizedArrayOf<FWORD>	kernValueZ;	/* The kerning values.
+					 * Length kernValueCount. */
+#if 0
+  UnsizedArrayOf<HBUINT8>leftClass;	/* The left-hand classes.
+					 * Length glyphCount. */
+  UnsizedArrayOf<HBUINT8>rightClass;	/* The right-hand classes.
+					 * Length glyphCount. */
+  UnsizedArrayOf<HBUINT8>kernIndex;	/* The indices into the kernValue array.
+					 * Length leftClassCount * rightClassCount */
+#endif
+  public:
+  DEFINE_SIZE_ARRAY (KernSubTableHeader::static_size + 6, kernValueZ);
+};
+
+template <typename KernSubTableHeader>
+struct KernSubTable
+{
+  unsigned int get_size () const { return u.header.length; }
+  unsigned int get_type () const { return u.header.format; }
+
+  int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+  {
+    switch (get_type ()) {
+    /* This method hooks up to hb_font_t's get_h_kerning.  Only support Format0. */
+    case 0: return u.format0.get_kerning (left, right);
+    default:return 0;
+    }
+  }
+
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    unsigned int subtable_type = get_type ();
+    TRACE_DISPATCH (this, subtable_type);
+    switch (subtable_type) {
+    case 0:	return_trace (c->dispatch (u.format0));
+    case 1:	return_trace (u.header.apple ? c->dispatch (u.format1) : c->default_return_value ());
+    case 2:	return_trace (c->dispatch (u.format2));
+    case 3:	return_trace (u.header.apple ? c->dispatch (u.format3) : c->default_return_value ());
+    default:	return_trace (c->default_return_value ());
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!u.header.sanitize (c) ||
+		  u.header.length < u.header.min_size ||
+		  !c->check_range (this, u.header.length))) return_trace (false);
+
+    return_trace (dispatch (c));
+  }
+
+  public:
+  union {
+  KernSubTableHeader				header;
+  AAT::KerxSubTableFormat0<KernSubTableHeader>	format0;
+  AAT::KerxSubTableFormat1<KernSubTableHeader>	format1;
+  AAT::KerxSubTableFormat2<KernSubTableHeader>	format2;
+  KernSubTableFormat3<KernSubTableHeader>	format3;
+  } u;
+  public:
+  DEFINE_SIZE_MIN (KernSubTableHeader::static_size);
+};
+
+
+struct KernOTSubTableHeader
+{
+  static constexpr bool apple = false;
+  typedef AAT::ObsoleteTypes Types;
+
+  unsigned int tuple_count () const { return 0; }
+  bool is_horizontal () const { return (coverage & Horizontal); }
+
+  enum Coverage
+  {
+    Horizontal	= 0x01u,
+    Minimum	= 0x02u,
+    CrossStream	= 0x04u,
+    Override	= 0x08u,
+
+    /* Not supported: */
+    Backwards	= 0x00u,
+    Variation	= 0x00u,
+  };
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT16	versionZ;	/* Unused. */
+  HBUINT16	length;		/* Length of the subtable (including this header). */
+  HBUINT8	format;		/* Subtable format. */
+  HBUINT8	coverage;	/* Coverage bits. */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct KernOT : AAT::KerxTable<KernOT>
+{
+  friend struct AAT::KerxTable<KernOT>;
+
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_kern;
+  static constexpr unsigned minVersion = 0u;
+
+  typedef KernOTSubTableHeader SubTableHeader;
+  typedef SubTableHeader::Types Types;
+  typedef KernSubTable<SubTableHeader> SubTable;
+
+  protected:
+  HBUINT16	version;	/* Version--0x0000u */
+  HBUINT16	tableCount;	/* Number of subtables in the kerning table. */
+  SubTable	firstSubTable;	/* Subtables. */
+  public:
+  DEFINE_SIZE_MIN (4);
+};
+
+
+struct KernAATSubTableHeader
+{
+  static constexpr bool apple = true;
+  typedef AAT::ObsoleteTypes Types;
+
+  unsigned int tuple_count () const { return 0; }
+  bool is_horizontal () const       { return !(coverage & Vertical); }
+
+  enum Coverage
+  {
+    Vertical	= 0x80u,
+    CrossStream	= 0x40u,
+    Variation	= 0x20u,
+
+    /* Not supported: */
+    Backwards	= 0x00u,
+  };
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT32	length;		/* Length of the subtable (including this header). */
+  HBUINT8	coverage;	/* Coverage bits. */
+  HBUINT8	format;		/* Subtable format. */
+  HBUINT16	tupleIndex;	/* The tuple index (used for variations fonts).
+			       * This value specifies which tuple this subtable covers.
+			       * Note: We don't implement. */
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct KernAAT : AAT::KerxTable<KernAAT>
+{
+  friend struct AAT::KerxTable<KernAAT>;
+
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_kern;
+  static constexpr unsigned minVersion = 0x00010000u;
+
+  typedef KernAATSubTableHeader SubTableHeader;
+  typedef SubTableHeader::Types Types;
+  typedef KernSubTable<SubTableHeader> SubTable;
+
+  protected:
+  HBUINT32	version;	/* Version--0x00010000u */
+  HBUINT32	tableCount;	/* Number of subtables in the kerning table. */
+  SubTable	firstSubTable;	/* Subtables. */
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+struct kern
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_kern;
+
+  bool has_data () const { return u.version32; }
+  unsigned int get_type () const { return u.major; }
+
+  bool has_state_machine () const
+  {
+    switch (get_type ()) {
+    case 0: return u.ot.has_state_machine ();
+    case 1: return u.aat.has_state_machine ();
+    default:return false;
+    }
+  }
+
+  bool has_cross_stream () const
+  {
+    switch (get_type ()) {
+    case 0: return u.ot.has_cross_stream ();
+    case 1: return u.aat.has_cross_stream ();
+    default:return false;
+    }
+  }
+
+  int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+  {
+    switch (get_type ()) {
+    case 0: return u.ot.get_h_kerning (left, right);
+    case 1: return u.aat.get_h_kerning (left, right);
+    default:return 0;
+    }
+  }
+
+  bool apply (AAT::hb_aat_apply_context_t *c) const
+  { return dispatch (c); }
+
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    unsigned int subtable_type = get_type ();
+    TRACE_DISPATCH (this, subtable_type);
+    switch (subtable_type) {
+    case 0:	return_trace (c->dispatch (u.ot));
+    case 1:	return_trace (c->dispatch (u.aat));
+    default:	return_trace (c->default_return_value ());
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.version32.sanitize (c)) return_trace (false);
+    return_trace (dispatch (c));
+  }
+
+  protected:
+  union {
+  HBUINT32		version32;
+  HBUINT16		major;
+  KernOT		ot;
+  KernAAT		aat;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (4, version32);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_KERN_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-base-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-base-table.hh
new file mode 100644
index 0000000..dd0fba1
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-base-table.hh
@@ -0,0 +1,541 @@
+/*
+ * Copyright © 2016 Elie Roux <elie.roux@telecom-bretagne.eu>
+ * Copyright © 2018  Google, Inc.
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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_LAYOUT_BASE_TABLE_HH
+#define HB_OT_LAYOUT_BASE_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-layout-common.hh"
+
+/* To be removed */
+typedef hb_tag_t hb_ot_layout_baseline_t;
+
+namespace OT {
+
+/*
+ * BASE -- Baseline
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/base
+ */
+
+struct BaseCoordFormat1
+{
+  hb_position_t get_coord () const { return coordinate; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 1 */
+  FWORD		coordinate;	/* X or Y value, in design units */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct BaseCoordFormat2
+{
+  hb_position_t get_coord () const
+  {
+    /* TODO */
+    return coordinate;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 2 */
+  FWORD		coordinate;	/* X or Y value, in design units */
+  GlyphID	referenceGlyph;	/* Glyph ID of control glyph */
+  HBUINT16	coordPoint;	/* Index of contour point on the
+				 * reference glyph */
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct BaseCoordFormat3
+{
+  hb_position_t get_coord (hb_font_t *font,
+			   const VariationStore &var_store,
+			   hb_direction_t direction) const
+  {
+    const Device &device = this+deviceTable;
+    return coordinate + (HB_DIRECTION_IS_VERTICAL (direction) ?
+			 device.get_y_delta (font, var_store) :
+			 device.get_x_delta (font, var_store));
+  }
+
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  deviceTable.sanitize (c, this)));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 3 */
+  FWORD		coordinate;	/* X or Y value, in design units */
+  OffsetTo<Device>
+		deviceTable;	/* Offset to Device table for X or
+				 * Y value, from beginning of
+				 * BaseCoord table (may be NULL). */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct BaseCoord
+{
+  hb_position_t get_coord (hb_font_t *font,
+			   const VariationStore &var_store,
+			   hb_direction_t direction) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.get_coord ();
+    case 2: return u.format2.get_coord ();
+    case 3: return u.format3.get_coord (font, var_store, direction);
+    default:return 0;
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!u.format.sanitize (c))) return_trace (false);
+    switch (u.format) {
+    case 1: return_trace (u.format1.sanitize (c));
+    case 2: return_trace (u.format2.sanitize (c));
+    case 3: return_trace (u.format3.sanitize (c));
+    default:return_trace (false);
+    }
+  }
+
+  protected:
+  union {
+    HBUINT16		format;
+    BaseCoordFormat1	format1;
+    BaseCoordFormat2	format2;
+    BaseCoordFormat3	format3;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+struct FeatMinMaxRecord
+{
+  static int cmp (const void *key_, const void *entry_)
+  {
+    hb_tag_t key = * (hb_tag_t *) key_;
+    const FeatMinMaxRecord &entry = * (const FeatMinMaxRecord *) entry_;
+    return key < (unsigned int) entry.tag ? -1 :
+	   key > (unsigned int) entry.tag ? 1 :
+	   0;
+  }
+
+  void get_min_max (const BaseCoord **min, const BaseCoord **max) const
+  {
+    if (likely (min)) *min = &(this+minCoord);
+    if (likely (max)) *max = &(this+maxCoord);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  minCoord.sanitize (c, this) &&
+			  maxCoord.sanitize (c, this)));
+  }
+
+  protected:
+  Tag		tag;		/* 4-byte feature identification tag--must
+				 * match feature tag in FeatureList */
+  OffsetTo<BaseCoord>
+		minCoord;	/* Offset to BaseCoord table that defines
+				 * the minimum extent value, from beginning
+				 * of MinMax table (may be NULL) */
+  OffsetTo<BaseCoord>
+		maxCoord;	/* Offset to BaseCoord table that defines
+				 * the maximum extent value, from beginning
+				 * of MinMax table (may be NULL) */
+  public:
+  DEFINE_SIZE_STATIC (8);
+
+};
+
+struct MinMax
+{
+  void get_min_max (hb_tag_t          feature_tag,
+			   const BaseCoord **min,
+			   const BaseCoord **max) const
+  {
+    /* TODO Replace hb_bsearch() with .bsearch(). */
+    const FeatMinMaxRecord *minMaxCoord = (const FeatMinMaxRecord *)
+					  hb_bsearch (&feature_tag, featMinMaxRecords.arrayZ,
+						      featMinMaxRecords.len,
+						      FeatMinMaxRecord::static_size,
+						      FeatMinMaxRecord::cmp);
+    if (minMaxCoord)
+      minMaxCoord->get_min_max (min, max);
+    else
+    {
+      if (likely (min)) *min = &(this+minCoord);
+      if (likely (max)) *max = &(this+maxCoord);
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  minCoord.sanitize (c, this) &&
+			  maxCoord.sanitize (c, this) &&
+			  featMinMaxRecords.sanitize (c, this)));
+  }
+
+  protected:
+  OffsetTo<BaseCoord>
+		minCoord;	/* Offset to BaseCoord table that defines
+				 * minimum extent value, from the beginning
+				 * of MinMax table (may be NULL) */
+  OffsetTo<BaseCoord>
+		maxCoord;	/* Offset to BaseCoord table that defines
+				 * maximum extent value, from the beginning
+				 * of MinMax table (may be NULL) */
+  SortedArrayOf<FeatMinMaxRecord>
+		featMinMaxRecords;
+				/* Array of FeatMinMaxRecords, in alphabetical
+				 * order by featureTableTag */
+  public:
+  DEFINE_SIZE_ARRAY (6, featMinMaxRecords);
+};
+
+struct BaseValues
+{
+  const BaseCoord &get_base_coord (int baseline_tag_index) const
+  {
+    if (baseline_tag_index == -1) baseline_tag_index = defaultIndex;
+    return this+baseCoords[baseline_tag_index];
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  baseCoords.sanitize (c, this)));
+  }
+
+  protected:
+  Index		defaultIndex;	/* Index number of default baseline for this
+				 * script — equals index position of baseline tag
+				 * in baselineTags array of the BaseTagList */
+  OffsetArrayOf<BaseCoord>
+		baseCoords;	/* Number of BaseCoord tables defined — should equal
+				 * baseTagCount in the BaseTagList
+				 *
+				 * Array of offsets to BaseCoord tables, from beginning of
+				 * BaseValues table — order matches baselineTags array in
+				 * the BaseTagList */
+  public:
+  DEFINE_SIZE_ARRAY (4, baseCoords);
+};
+
+struct BaseLangSysRecord
+{
+  static int cmp (const void *key_, const void *entry_)
+  {
+    hb_tag_t key = * (hb_tag_t *) key_;
+    const BaseLangSysRecord &entry = * (const BaseLangSysRecord *) entry_;
+    return key < (unsigned int) entry.baseLangSysTag ? -1 :
+	   key > (unsigned int) entry.baseLangSysTag ? 1 :
+	   0;
+  }
+
+  const MinMax &get_min_max () const
+  { return this+minMax; }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  minMax.sanitize (c, this)));
+  }
+
+  protected:
+  Tag		baseLangSysTag;	/* 4-byte language system identification tag */
+  OffsetTo<MinMax>
+		minMax;		/* Offset to MinMax table, from beginning
+				 * of BaseScript table */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct BaseScript
+{
+  const MinMax &get_min_max (hb_tag_t language_tag) const
+  {
+    /* TODO Replace hb_bsearch() with .bsearch(). */
+    const BaseLangSysRecord* record = (const BaseLangSysRecord *)
+				      hb_bsearch (&language_tag, baseLangSysRecords.arrayZ,
+						  baseLangSysRecords.len,
+						  BaseLangSysRecord::static_size,
+						  BaseLangSysRecord::cmp);
+    return record ? record->get_min_max () : this+defaultMinMax;
+  }
+
+  const BaseCoord &get_base_coord (int baseline_tag_index) const
+  { return (this+baseValues).get_base_coord (baseline_tag_index); }
+
+  bool is_empty () const { return !baseValues; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  baseValues.sanitize (c, this) &&
+			  defaultMinMax.sanitize (c, this) &&
+			  baseLangSysRecords.sanitize (c, this)));
+  }
+
+  protected:
+  OffsetTo<BaseValues>
+		baseValues;	/* Offset to BaseValues table, from beginning
+				 * of BaseScript table (may be NULL) */
+  OffsetTo<MinMax>
+		defaultMinMax;	/* Offset to MinMax table, from beginning of
+				 * BaseScript table (may be NULL) */
+  SortedArrayOf<BaseLangSysRecord>
+		baseLangSysRecords;
+				/* Number of BaseLangSysRecords
+				 * defined — may be zero (0) */
+
+  public:
+  DEFINE_SIZE_ARRAY (6, baseLangSysRecords);
+};
+
+struct BaseScriptList;
+struct BaseScriptRecord
+{
+  static int cmp (const void *key_, const void *entry_)
+  {
+    hb_tag_t key = * (hb_tag_t *) key_;
+    const BaseScriptRecord &entry = * (const BaseScriptRecord *) entry_;
+    return key < (unsigned int) entry.baseScriptTag ? -1 :
+	   key > (unsigned int) entry.baseScriptTag ? 1 :
+	   0;
+  }
+
+  const BaseScript &get_base_script (const BaseScriptList *list) const
+  { return list+baseScript; }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  baseScript.sanitize (c, base)));
+  }
+
+  protected:
+  Tag		baseScriptTag;	/* 4-byte script identification tag */
+  OffsetTo<BaseScript>
+		baseScript;	/* Offset to BaseScript table, from beginning
+				 * of BaseScriptList */
+
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct BaseScriptList
+{
+  const BaseScriptRecord *find_record (hb_tag_t script) const
+  {
+    /* TODO Replace hb_bsearch() with .bsearch(). */
+    return (const BaseScriptRecord *) hb_bsearch (&script, baseScriptRecords.arrayZ,
+						  baseScriptRecords.len,
+						  BaseScriptRecord::static_size,
+						  BaseScriptRecord::cmp);
+  }
+
+  /* TODO: Or client should handle fallback? */
+  const BaseScript &get_base_script (hb_tag_t script) const
+  {
+    const BaseScriptRecord *record = find_record (script);
+    if (!record) record = find_record ((hb_script_t) HB_TAG ('D','F','L','T'));
+
+    return record ? record->get_base_script (this) : Null (BaseScript);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  baseScriptRecords.sanitize (c, this));
+  }
+
+  protected:
+  SortedArrayOf<BaseScriptRecord>
+			baseScriptRecords;
+
+  public:
+  DEFINE_SIZE_ARRAY (2, baseScriptRecords);
+};
+
+struct Axis
+{
+  bool get_baseline (hb_ot_layout_baseline_t   baseline,
+			    hb_tag_t                  script_tag,
+			    hb_tag_t                  language_tag,
+			    const BaseCoord         **coord) const
+  {
+    const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag);
+    if (base_script.is_empty ()) return false;
+
+    if (likely (coord)) *coord = &base_script.get_base_coord ((this+baseTagList).bsearch (baseline));
+
+    return true;
+  }
+
+  bool get_min_max (hb_tag_t          script_tag,
+		    hb_tag_t          language_tag,
+		    hb_tag_t          feature_tag,
+		    const BaseCoord **min_coord,
+		    const BaseCoord **max_coord) const
+  {
+    const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag);
+    if (base_script.is_empty ()) return false;
+
+    base_script.get_min_max (language_tag).get_min_max (feature_tag, min_coord, max_coord);
+
+    return true;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  (this+baseTagList).sanitize (c) &&
+			  (this+baseScriptList).sanitize (c)));
+  }
+
+  protected:
+  OffsetTo<SortedArrayOf<Tag> >
+		baseTagList;	/* Offset to BaseTagList table, from beginning
+				 * of Axis table (may be NULL)
+				 * Array of 4-byte baseline identification tags — must
+				 * be in alphabetical order */
+  OffsetTo<BaseScriptList>
+		baseScriptList;	/* Offset to BaseScriptList table, from beginning
+				 * of Axis table
+				 * Array of BaseScriptRecords, in alphabetical order
+				 * by baseScriptTag */
+
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct BASE
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_BASE;
+
+  const Axis &get_axis (hb_direction_t direction) const
+  { return HB_DIRECTION_IS_VERTICAL (direction) ? this+vAxis : this+hAxis; }
+
+  const VariationStore &get_var_store () const
+  { return version.to_int () < 0x00010001u ? Null (VariationStore) : this+varStore; }
+
+  bool get_baseline (hb_font_t               *font,
+		     hb_ot_layout_baseline_t  baseline,
+		     hb_direction_t           direction,
+		     hb_tag_t                 script_tag,
+		     hb_tag_t                 language_tag,
+		     hb_position_t           *base) const
+  {
+    const BaseCoord *base_coord;
+    if (!get_axis (direction).get_baseline (baseline, script_tag, language_tag, &base_coord))
+      return false;
+
+    if (likely (base && base_coord)) *base = base_coord->get_coord (font,
+								    get_var_store (),
+								    direction);
+    return true;
+  }
+
+  /* TODO: Expose this separately sometime? */
+  bool get_min_max (hb_font_t      *font,
+		    hb_direction_t  direction,
+		    hb_tag_t        script_tag,
+		    hb_tag_t        language_tag,
+		    hb_tag_t        feature_tag,
+		    hb_position_t  *min,
+		    hb_position_t  *max)
+  {
+    const BaseCoord *min_coord, *max_coord;
+    if (!get_axis (direction).get_min_max (script_tag, language_tag, feature_tag,
+					   &min_coord, &max_coord))
+      return false;
+
+    const VariationStore &var_store = get_var_store ();
+    if (likely (min && min_coord)) *min = min_coord->get_coord (font, var_store, direction);
+    if (likely (max && max_coord)) *max = max_coord->get_coord (font, var_store, direction);
+    return true;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  likely (version.major == 1) &&
+			  hAxis.sanitize (c, this) &&
+			  vAxis.sanitize (c, this) &&
+			  (version.to_int () < 0x00010001u || varStore.sanitize (c, this))));
+  }
+
+  protected:
+  FixedVersion<>version;	/* Version of the BASE table */
+  OffsetTo<Axis>hAxis;		/* Offset to horizontal Axis table, from beginning
+				 * of BASE table (may be NULL) */
+  OffsetTo<Axis>vAxis;		/* Offset to vertical Axis table, from beginning
+				 * of BASE table (may be NULL) */
+  LOffsetTo<VariationStore>
+		varStore;	/* Offset to the table of Item Variation
+				 * Store--from beginning of BASE
+				 * header (may be NULL).  Introduced
+				 * in version 0x00010001. */
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_LAYOUT_BASE_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-common.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-common.hh
new file mode 100644
index 0000000..39a8bba
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-common.hh
@@ -0,0 +1,2178 @@
+/*
+ * Copyright © 2007,2008,2009  Red Hat, Inc.
+ * Copyright © 2010,2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_LAYOUT_COMMON_HH
+#define HB_OT_LAYOUT_COMMON_HH
+
+#include "hb.hh"
+#include "hb-ot-layout.hh"
+#include "hb-open-type.hh"
+#include "hb-set.hh"
+
+
+#ifndef HB_MAX_NESTING_LEVEL
+#define HB_MAX_NESTING_LEVEL	6
+#endif
+#ifndef HB_MAX_CONTEXT_LENGTH
+#define HB_MAX_CONTEXT_LENGTH	64
+#endif
+#ifndef HB_CLOSURE_MAX_STAGES
+/*
+ * The maximum number of times a lookup can be applied during shaping.
+ * Used to limit the number of iterations of the closure algorithm.
+ * This must be larger than the number of times add_pause() is
+ * called in a collect_features call of any shaper.
+ */
+#define HB_CLOSURE_MAX_STAGES	32
+#endif
+
+#ifndef HB_MAX_SCRIPTS
+#define HB_MAX_SCRIPTS	500
+#endif
+
+#ifndef HB_MAX_LANGSYS
+#define HB_MAX_LANGSYS	2000
+#endif
+
+
+namespace OT {
+
+
+#define NOT_COVERED		((unsigned int) -1)
+
+
+
+/*
+ *
+ * OpenType Layout Common Table Formats
+ *
+ */
+
+
+/*
+ * Script, ScriptList, LangSys, Feature, FeatureList, Lookup, LookupList
+ */
+
+struct Record_sanitize_closure_t {
+  hb_tag_t tag;
+  const void *list_base;
+};
+
+template <typename Type>
+struct Record
+{
+  int cmp (hb_tag_t a) const { return tag.cmp (a); }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    const Record_sanitize_closure_t closure = {tag, base};
+    return_trace (c->check_struct (this) && offset.sanitize (c, base, &closure));
+  }
+
+  Tag		tag;		/* 4-byte Tag identifier */
+  OffsetTo<Type>
+		offset;		/* Offset from beginning of object holding
+				 * the Record */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+template <typename Type>
+struct RecordArrayOf : SortedArrayOf<Record<Type> >
+{
+  const OffsetTo<Type>& get_offset (unsigned int i) const
+  { return (*this)[i].offset; }
+  OffsetTo<Type>& get_offset (unsigned int i)
+  { return (*this)[i].offset; }
+  const Tag& get_tag (unsigned int i) const
+  { return (*this)[i].tag; }
+  unsigned int get_tags (unsigned int start_offset,
+			 unsigned int *record_count /* IN/OUT */,
+			 hb_tag_t     *record_tags /* OUT */) const
+  {
+    if (record_count) {
+      const Record<Type> *arr = this->sub_array (start_offset, record_count);
+      unsigned int count = *record_count;
+      for (unsigned int i = 0; i < count; i++)
+	record_tags[i] = arr[i].tag;
+    }
+    return this->len;
+  }
+  bool find_index (hb_tag_t tag, unsigned int *index) const
+  {
+    return this->bfind (tag, index, HB_BFIND_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
+  }
+};
+
+template <typename Type>
+struct RecordListOf : RecordArrayOf<Type>
+{
+  const Type& operator [] (unsigned int i) const
+  { return this+this->get_offset (i); }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    struct RecordListOf<Type> *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+    unsigned int count = this->len;
+    for (unsigned int i = 0; i < count; i++)
+      out->get_offset (i).serialize_subset (c, (*this)[i], out);
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (RecordArrayOf<Type>::sanitize (c, this));
+  }
+};
+
+
+struct RangeRecord
+{
+  int cmp (hb_codepoint_t g) const
+  { return g < start ? -1 : g <= end ? 0 : +1; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  bool intersects (const hb_set_t *glyphs) const
+  { return glyphs->intersects (start, end); }
+
+  template <typename set_t>
+  bool add_coverage (set_t *glyphs) const
+  { return glyphs->add_range (start, end); }
+
+  GlyphID	start;		/* First GlyphID in the range */
+  GlyphID	end;		/* Last GlyphID in the range */
+  HBUINT16	value;		/* Value */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+DECLARE_NULL_NAMESPACE_BYTES (OT, RangeRecord);
+
+
+struct IndexArray : ArrayOf<Index>
+{
+  unsigned int get_indexes (unsigned int start_offset,
+			    unsigned int *_count /* IN/OUT */,
+			    unsigned int *_indexes /* OUT */) const
+  {
+    if (_count) {
+      const HBUINT16 *arr = this->sub_array (start_offset, _count);
+      unsigned int count = *_count;
+      for (unsigned int i = 0; i < count; i++)
+	_indexes[i] = arr[i];
+    }
+    return this->len;
+  }
+
+  void add_indexes_to (hb_set_t* output /* OUT */) const
+  {
+    output->add_array (arrayZ, len);
+  }
+};
+
+
+struct Script;
+struct LangSys;
+struct Feature;
+
+
+struct LangSys
+{
+  unsigned int get_feature_count () const
+  { return featureIndex.len; }
+  hb_tag_t get_feature_index (unsigned int i) const
+  { return featureIndex[i]; }
+  unsigned int get_feature_indexes (unsigned int start_offset,
+				    unsigned int *feature_count /* IN/OUT */,
+				    unsigned int *feature_indexes /* OUT */) const
+  { return featureIndex.get_indexes (start_offset, feature_count, feature_indexes); }
+  void add_feature_indexes_to (hb_set_t *feature_indexes) const
+  { featureIndex.add_indexes_to (feature_indexes); }
+
+  bool has_required_feature () const { return reqFeatureIndex != 0xFFFFu; }
+  unsigned int get_required_feature_index () const
+  {
+    if (reqFeatureIndex == 0xFFFFu)
+      return Index::NOT_FOUND_INDEX;
+   return reqFeatureIndex;;
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    return_trace (c->serializer->embed (*this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c,
+		 const Record_sanitize_closure_t * = nullptr) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && featureIndex.sanitize (c));
+  }
+
+  Offset16	lookupOrderZ;	/* = Null (reserved for an offset to a
+				 * reordering table) */
+  HBUINT16	reqFeatureIndex;/* Index of a feature required for this
+				 * language system--if no required features
+				 * = 0xFFFFu */
+  IndexArray	featureIndex;	/* Array of indices into the FeatureList */
+  public:
+  DEFINE_SIZE_ARRAY_SIZED (6, featureIndex);
+};
+DECLARE_NULL_NAMESPACE_BYTES (OT, LangSys);
+
+struct Script
+{
+  unsigned int get_lang_sys_count () const
+  { return langSys.len; }
+  const Tag& get_lang_sys_tag (unsigned int i) const
+  { return langSys.get_tag (i); }
+  unsigned int get_lang_sys_tags (unsigned int start_offset,
+				  unsigned int *lang_sys_count /* IN/OUT */,
+				  hb_tag_t     *lang_sys_tags /* OUT */) const
+  { return langSys.get_tags (start_offset, lang_sys_count, lang_sys_tags); }
+  const LangSys& get_lang_sys (unsigned int i) const
+  {
+    if (i == Index::NOT_FOUND_INDEX) return get_default_lang_sys ();
+    return this+langSys[i].offset;
+  }
+  bool find_lang_sys_index (hb_tag_t tag, unsigned int *index) const
+  { return langSys.find_index (tag, index); }
+
+  bool has_default_lang_sys () const           { return defaultLangSys != 0; }
+  const LangSys& get_default_lang_sys () const { return this+defaultLangSys; }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    struct Script *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+    out->defaultLangSys.serialize_subset (c, this+defaultLangSys, out);
+    unsigned int count = langSys.len;
+    for (unsigned int i = 0; i < count; i++)
+      out->langSys.arrayZ[i].offset.serialize_subset (c, this+langSys[i].offset, out);
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c,
+		 const Record_sanitize_closure_t * = nullptr) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (defaultLangSys.sanitize (c, this) && langSys.sanitize (c, this));
+  }
+
+  protected:
+  OffsetTo<LangSys>
+		defaultLangSys;	/* Offset to DefaultLangSys table--from
+				 * beginning of Script table--may be Null */
+  RecordArrayOf<LangSys>
+		langSys;	/* Array of LangSysRecords--listed
+				 * alphabetically by LangSysTag */
+  public:
+  DEFINE_SIZE_ARRAY_SIZED (4, langSys);
+};
+
+typedef RecordListOf<Script> ScriptList;
+
+
+/* https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#size */
+struct FeatureParamsSize
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!c->check_struct (this))) return_trace (false);
+
+    /* This subtable has some "history", if you will.  Some earlier versions of
+     * Adobe tools calculated the offset of the FeatureParams sutable from the
+     * beginning of the FeatureList table!  Now, that is dealt with in the
+     * Feature implementation.  But we still need to be able to tell junk from
+     * real data.  Note: We don't check that the nameID actually exists.
+     *
+     * Read Roberts wrote on 9/15/06 on opentype-list@indx.co.uk :
+     *
+     * Yes, it is correct that a new version of the AFDKO (version 2.0) will be
+     * coming out soon, and that the makeotf program will build a font with a
+     * 'size' feature that is correct by the specification.
+     *
+     * The specification for this feature tag is in the "OpenType Layout Tag
+     * Registry". You can see a copy of this at:
+     * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#tag-size
+     *
+     * Here is one set of rules to determine if the 'size' feature is built
+     * correctly, or as by the older versions of MakeOTF. You may be able to do
+     * better.
+     *
+     * Assume that the offset to the size feature is according to specification,
+     * and make the following value checks. If it fails, assume the size
+     * feature is calculated as versions of MakeOTF before the AFDKO 2.0 built it.
+     * If this fails, reject the 'size' feature. The older makeOTF's calculated the
+     * offset from the beginning of the FeatureList table, rather than from the
+     * beginning of the 'size' Feature table.
+     *
+     * If "design size" == 0:
+     *     fails check
+     *
+     * Else if ("subfamily identifier" == 0 and
+     *     "range start" == 0 and
+     *     "range end" == 0 and
+     *     "range start" == 0 and
+     *     "menu name ID" == 0)
+     *     passes check: this is the format used when there is a design size
+     * specified, but there is no recommended size range.
+     *
+     * Else if ("design size" <  "range start" or
+     *     "design size" >   "range end" or
+     *     "range end" <= "range start" or
+     *     "menu name ID"  < 256 or
+     *     "menu name ID"  > 32767 or
+     *     menu name ID is not a name ID which is actually in the name table)
+     *     fails test
+     * Else
+     *     passes test.
+     */
+
+    if (!designSize)
+      return_trace (false);
+    else if (subfamilyID == 0 &&
+	     subfamilyNameID == 0 &&
+	     rangeStart == 0 &&
+	     rangeEnd == 0)
+      return_trace (true);
+    else if (designSize < rangeStart ||
+	     designSize > rangeEnd ||
+	     subfamilyNameID < 256 ||
+	     subfamilyNameID > 32767)
+      return_trace (false);
+    else
+      return_trace (true);
+  }
+
+  HBUINT16	designSize;	/* Represents the design size in 720/inch
+				 * units (decipoints).  The design size entry
+				 * must be non-zero.  When there is a design
+				 * size but no recommended size range, the
+				 * rest of the array will consist of zeros. */
+  HBUINT16	subfamilyID;	/* Has no independent meaning, but serves
+				 * as an identifier that associates fonts
+				 * in a subfamily. All fonts which share a
+				 * Preferred or Font Family name and which
+				 * differ only by size range shall have the
+				 * same subfamily value, and no fonts which
+				 * differ in weight or style shall have the
+				 * same subfamily value. If this value is
+				 * zero, the remaining fields in the array
+				 * will be ignored. */
+  NameID	subfamilyNameID;/* If the preceding value is non-zero, this
+				 * value must be set in the range 256 - 32767
+				 * (inclusive). It records the value of a
+				 * field in the name table, which must
+				 * contain English-language strings encoded
+				 * in Windows Unicode and Macintosh Roman,
+				 * and may contain additional strings
+				 * localized to other scripts and languages.
+				 * Each of these strings is the name an
+				 * application should use, in combination
+				 * with the family name, to represent the
+				 * subfamily in a menu.  Applications will
+				 * choose the appropriate version based on
+				 * their selection criteria. */
+  HBUINT16	rangeStart;	/* Large end of the recommended usage range
+				 * (inclusive), stored in 720/inch units
+				 * (decipoints). */
+  HBUINT16	rangeEnd;	/* Small end of the recommended usage range
+				   (exclusive), stored in 720/inch units
+				 * (decipoints). */
+  public:
+  DEFINE_SIZE_STATIC (10);
+};
+
+/* https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#ssxx */
+struct FeatureParamsStylisticSet
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    /* Right now minorVersion is at zero.  Which means, any table supports
+     * the uiNameID field. */
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT16	version;	/* (set to 0): This corresponds to a “minor”
+				 * version number. Additional data may be
+				 * added to the end of this Feature Parameters
+				 * table in the future. */
+
+  NameID	uiNameID;	/* The 'name' table name ID that specifies a
+				 * string (or strings, for multiple languages)
+				 * for a user-interface label for this
+				 * feature.  The values of uiLabelNameId and
+				 * sampleTextNameId are expected to be in the
+				 * font-specific name ID range (256-32767),
+				 * though that is not a requirement in this
+				 * Feature Parameters specification. The
+				 * user-interface label for the feature can
+				 * be provided in multiple languages. An
+				 * English string should be included as a
+				 * fallback. The string should be kept to a
+				 * minimal length to fit comfortably with
+				 * different application interfaces. */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+/* https://docs.microsoft.com/en-us/typography/opentype/spec/features_ae#cv01-cv99 */
+struct FeatureParamsCharacterVariants
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  characters.sanitize (c));
+  }
+
+  HBUINT16	format;			/* Format number is set to 0. */
+  NameID	featUILableNameID;	/* The ‘name’ table name ID that
+					 * specifies a string (or strings,
+					 * for multiple languages) for a
+					 * user-interface label for this
+					 * feature. (May be NULL.) */
+  NameID	featUITooltipTextNameID;/* The ‘name’ table name ID that
+					 * specifies a string (or strings,
+					 * for multiple languages) that an
+					 * application can use for tooltip
+					 * text for this feature. (May be
+					 * nullptr.) */
+  NameID	sampleTextNameID;	/* The ‘name’ table name ID that
+					 * specifies sample text that
+					 * illustrates the effect of this
+					 * feature. (May be NULL.) */
+  HBUINT16	numNamedParameters;	/* Number of named parameters. (May
+					 * be zero.) */
+  NameID	firstParamUILabelNameID;/* The first ‘name’ table name ID
+					 * used to specify strings for
+					 * user-interface labels for the
+					 * feature parameters. (Must be zero
+					 * if numParameters is zero.) */
+  ArrayOf<HBUINT24>
+		characters;		/* Array of the Unicode Scalar Value
+					 * of the characters for which this
+					 * feature provides glyph variants.
+					 * (May be zero.) */
+  public:
+  DEFINE_SIZE_ARRAY (14, characters);
+};
+
+struct FeatureParams
+{
+  bool sanitize (hb_sanitize_context_t *c, hb_tag_t tag) const
+  {
+    TRACE_SANITIZE (this);
+    if (tag == HB_TAG ('s','i','z','e'))
+      return_trace (u.size.sanitize (c));
+    if ((tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */
+      return_trace (u.stylisticSet.sanitize (c));
+    if ((tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */
+      return_trace (u.characterVariants.sanitize (c));
+    return_trace (true);
+  }
+
+  const FeatureParamsSize& get_size_params (hb_tag_t tag) const
+  {
+    if (tag == HB_TAG ('s','i','z','e'))
+      return u.size;
+    return Null (FeatureParamsSize);
+  }
+
+  const FeatureParamsStylisticSet& get_stylistic_set_params (hb_tag_t tag) const
+  {
+    if ((tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */
+      return u.stylisticSet;
+    return Null (FeatureParamsStylisticSet);
+  }
+
+  const FeatureParamsCharacterVariants& get_character_variants_params (hb_tag_t tag) const
+  {
+    if ((tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */
+      return u.characterVariants;
+    return Null (FeatureParamsCharacterVariants);
+  }
+
+  private:
+  union {
+  FeatureParamsSize			size;
+  FeatureParamsStylisticSet		stylisticSet;
+  FeatureParamsCharacterVariants	characterVariants;
+  } u;
+  public:
+  DEFINE_SIZE_STATIC (17);
+};
+
+struct Feature
+{
+  unsigned int get_lookup_count () const
+  { return lookupIndex.len; }
+  hb_tag_t get_lookup_index (unsigned int i) const
+  { return lookupIndex[i]; }
+  unsigned int get_lookup_indexes (unsigned int start_index,
+				   unsigned int *lookup_count /* IN/OUT */,
+				   unsigned int *lookup_tags /* OUT */) const
+  { return lookupIndex.get_indexes (start_index, lookup_count, lookup_tags); }
+  void add_lookup_indexes_to (hb_set_t *lookup_indexes) const
+  { lookupIndex.add_indexes_to (lookup_indexes); }
+
+  const FeatureParams &get_feature_params () const
+  { return this+featureParams; }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    struct Feature *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+    out->featureParams.set (0); /* TODO(subset) FeatureParams. */
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c,
+		 const Record_sanitize_closure_t *closure = nullptr) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!(c->check_struct (this) && lookupIndex.sanitize (c))))
+      return_trace (false);
+
+    /* Some earlier versions of Adobe tools calculated the offset of the
+     * FeatureParams subtable from the beginning of the FeatureList table!
+     *
+     * If sanitizing "failed" for the FeatureParams subtable, try it with the
+     * alternative location.  We would know sanitize "failed" if old value
+     * of the offset was non-zero, but it's zeroed now.
+     *
+     * Only do this for the 'size' feature, since at the time of the faulty
+     * Adobe tools, only the 'size' feature had FeatureParams defined.
+     */
+
+    OffsetTo<FeatureParams> orig_offset = featureParams;
+    if (unlikely (!featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE)))
+      return_trace (false);
+
+    if (likely (orig_offset.is_null ()))
+      return_trace (true);
+
+    if (featureParams == 0 && closure &&
+	closure->tag == HB_TAG ('s','i','z','e') &&
+	closure->list_base && closure->list_base < this)
+    {
+      unsigned int new_offset_int = (unsigned int) orig_offset -
+				    (((char *) this) - ((char *) closure->list_base));
+
+      OffsetTo<FeatureParams> new_offset;
+      /* Check that it did not overflow. */
+      new_offset.set (new_offset_int);
+      if (new_offset == new_offset_int &&
+	  c->try_set (&featureParams, new_offset) &&
+	  !featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE))
+	return_trace (false);
+    }
+
+    return_trace (true);
+  }
+
+  OffsetTo<FeatureParams>
+		 featureParams;	/* Offset to Feature Parameters table (if one
+				 * has been defined for the feature), relative
+				 * to the beginning of the Feature Table; = Null
+				 * if not required */
+  IndexArray	 lookupIndex;	/* Array of LookupList indices */
+  public:
+  DEFINE_SIZE_ARRAY_SIZED (4, lookupIndex);
+};
+
+typedef RecordListOf<Feature> FeatureList;
+
+
+struct LookupFlag : HBUINT16
+{
+  enum Flags {
+    RightToLeft		= 0x0001u,
+    IgnoreBaseGlyphs	= 0x0002u,
+    IgnoreLigatures	= 0x0004u,
+    IgnoreMarks		= 0x0008u,
+    IgnoreFlags		= 0x000Eu,
+    UseMarkFilteringSet	= 0x0010u,
+    Reserved		= 0x00E0u,
+    MarkAttachmentType	= 0xFF00u
+  };
+  public:
+  DEFINE_SIZE_STATIC (2);
+};
+
+} /* namespace OT */
+/* This has to be outside the namespace. */
+HB_MARK_AS_FLAG_T (OT::LookupFlag::Flags);
+namespace OT {
+
+struct Lookup
+{
+  unsigned int get_subtable_count () const { return subTable.len; }
+
+  template <typename TSubTable>
+  const TSubTable& get_subtable (unsigned int i) const
+  { return this+CastR<OffsetArrayOf<TSubTable> > (subTable)[i]; }
+
+  template <typename TSubTable>
+  const OffsetArrayOf<TSubTable>& get_subtables () const
+  { return CastR<OffsetArrayOf<TSubTable> > (subTable); }
+  template <typename TSubTable>
+  OffsetArrayOf<TSubTable>& get_subtables ()
+  { return CastR<OffsetArrayOf<TSubTable> > (subTable); }
+
+  unsigned int get_size () const
+  {
+    const HBUINT16 &markFilteringSet = StructAfter<const HBUINT16> (subTable);
+    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
+      return (const char *) &StructAfter<const char> (markFilteringSet) - (const char *) this;
+    return (const char *) &markFilteringSet - (const char *) this;
+  }
+
+  unsigned int get_type () const { return lookupType; }
+
+  /* lookup_props is a 32-bit integer where the lower 16-bit is LookupFlag and
+   * higher 16-bit is mark-filtering-set if the lookup uses one.
+   * Not to be confused with glyph_props which is very similar. */
+  uint32_t get_props () const
+  {
+    unsigned int flag = lookupFlag;
+    if (unlikely (flag & LookupFlag::UseMarkFilteringSet))
+    {
+      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
+      flag += (markFilteringSet << 16);
+    }
+    return flag;
+  }
+
+  template <typename TSubTable, typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    unsigned int lookup_type = get_type ();
+    TRACE_DISPATCH (this, lookup_type);
+    unsigned int count = get_subtable_count ();
+    for (unsigned int i = 0; i < count; i++) {
+      typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type);
+      if (c->stop_sublookup_iteration (r))
+	return_trace (r);
+    }
+    return_trace (c->default_return_value ());
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  unsigned int lookup_type,
+		  uint32_t lookup_props,
+		  unsigned int num_subtables)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    lookupType.set (lookup_type);
+    lookupFlag.set (lookup_props & 0xFFFFu);
+    if (unlikely (!subTable.serialize (c, num_subtables))) return_trace (false);
+    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
+    {
+      if (unlikely (!c->extend (*this))) return_trace (false);
+      HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
+      markFilteringSet.set (lookup_props >> 16);
+    }
+    return_trace (true);
+  }
+
+  /* Older compilers need this to NOT be locally defined in a function. */
+  template <typename TSubTable>
+  struct SubTableSubsetWrapper
+  {
+    SubTableSubsetWrapper (const TSubTable &subtable_,
+			   unsigned int lookup_type_) :
+			     subtable (subtable_),
+			     lookup_type (lookup_type_) {}
+
+    bool subset (hb_subset_context_t *c) const
+    { return subtable.dispatch (c, lookup_type); }
+
+    private:
+    const TSubTable &subtable;
+    unsigned int lookup_type;
+  };
+
+  template <typename TSubTable>
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    struct Lookup *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+
+    /* Subset the actual subtables. */
+    /* TODO Drop empty ones, either by calling intersects() beforehand,
+     * or just dropping null offsets after. */
+    const OffsetArrayOf<TSubTable>& subtables = get_subtables<TSubTable> ();
+    OffsetArrayOf<TSubTable>& out_subtables = out->get_subtables<TSubTable> ();
+    unsigned int count = subTable.len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      SubTableSubsetWrapper<TSubTable> wrapper (this+subtables[i], get_type ());
+
+      out_subtables[i].serialize_subset (c, wrapper, out);
+    }
+
+    return_trace (true);
+  }
+
+  /* Older compilers need this to NOT be locally defined in a function. */
+  template <typename TSubTable>
+  struct SubTableSanitizeWrapper : TSubTable
+  {
+    bool sanitize (hb_sanitize_context_t *c, unsigned int lookup_type) const
+    { return this->dispatch (c, lookup_type); }
+  };
+
+  template <typename TSubTable>
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
+    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
+    {
+      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
+      if (!markFilteringSet.sanitize (c)) return_trace (false);
+    }
+
+    if (unlikely (!CastR<OffsetArrayOf<SubTableSanitizeWrapper<TSubTable> > > (subTable)
+		   .sanitize (c, this, get_type ())))
+      return_trace (false);
+
+    if (unlikely (get_type () == TSubTable::Extension))
+    {
+      /* The spec says all subtables of an Extension lookup should
+       * have the same type, which shall not be the Extension type
+       * itself (but we already checked for that).
+       * This is specially important if one has a reverse type! */
+      unsigned int type = get_subtable<TSubTable> (0).u.extension.get_type ();
+      unsigned int count = get_subtable_count ();
+      for (unsigned int i = 1; i < count; i++)
+	if (get_subtable<TSubTable> (i).u.extension.get_type () != type)
+	  return_trace (false);
+    }
+    return_trace (true);
+    return_trace (true);
+  }
+
+  private:
+  HBUINT16	lookupType;		/* Different enumerations for GSUB and GPOS */
+  HBUINT16	lookupFlag;		/* Lookup qualifiers */
+  ArrayOf<Offset16>
+		subTable;		/* Array of SubTables */
+/*HBUINT16	markFilteringSetX[VAR];*//* Index (base 0) into GDEF mark glyph sets
+					 * structure. This field is only present if bit
+					 * UseMarkFilteringSet of lookup flags is set. */
+  public:
+  DEFINE_SIZE_ARRAY (6, subTable);
+};
+
+typedef OffsetListOf<Lookup> LookupList;
+
+
+/*
+ * Coverage Table
+ */
+
+struct CoverageFormat1
+{
+  friend struct Coverage;
+
+  private:
+  unsigned int get_coverage (hb_codepoint_t glyph_id) const
+  {
+    unsigned int i;
+    glyphArray.bfind (glyph_id, &i, HB_BFIND_NOT_FOUND_STORE, NOT_COVERED);
+    return i;
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> glyphs)
+  {
+    TRACE_SERIALIZE (this);
+    return_trace (glyphArray.serialize (c, glyphs));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (glyphArray.sanitize (c));
+  }
+
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    /* TODO Speed up, using hb_set_next() and bsearch()? */
+    unsigned int count = glyphArray.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (glyphs->has (glyphArray[i]))
+	return true;
+    return false;
+  }
+  bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const
+  { return glyphs->has (glyphArray[index]); }
+
+  template <typename set_t>
+  bool add_coverage (set_t *glyphs) const
+  {
+    return glyphs->add_sorted_array (glyphArray.arrayZ, glyphArray.len);
+  }
+
+  public:
+  /* Older compilers need this to be public. */
+  struct Iter {
+    void init (const struct CoverageFormat1 &c_) { c = &c_; i = 0; }
+    void fini () {}
+    bool more () { return i < c->glyphArray.len; }
+    void next () { i++; }
+    hb_codepoint_t get_glyph () { return c->glyphArray[i]; }
+    unsigned int get_coverage () { return i; }
+
+    private:
+    const struct CoverageFormat1 *c;
+    unsigned int i;
+  };
+  private:
+
+  protected:
+  HBUINT16	coverageFormat;	/* Format identifier--format = 1 */
+  SortedArrayOf<GlyphID>
+		glyphArray;	/* Array of GlyphIDs--in numerical order */
+  public:
+  DEFINE_SIZE_ARRAY (4, glyphArray);
+};
+
+struct CoverageFormat2
+{
+  friend struct Coverage;
+
+  private:
+  unsigned int get_coverage (hb_codepoint_t glyph_id) const
+  {
+    const RangeRecord &range = rangeRecord.bsearch (glyph_id);
+    return likely (range.start <= range.end) ?
+	   (unsigned int) range.value + (glyph_id - range.start) :
+	   NOT_COVERED;
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> glyphs)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+
+    if (unlikely (!glyphs.length))
+    {
+      rangeRecord.len.set (0);
+      return_trace (true);
+    }
+
+    unsigned int num_ranges = 1;
+    for (unsigned int i = 1; i < glyphs.length; i++)
+      if (glyphs[i - 1] + 1 != glyphs[i])
+	num_ranges++;
+    rangeRecord.len.set (num_ranges);
+    if (unlikely (!c->extend (rangeRecord))) return_trace (false);
+
+    unsigned int range = 0;
+    rangeRecord[range].start = glyphs[0];
+    rangeRecord[range].value.set (0);
+    for (unsigned int i = 1; i < glyphs.length; i++)
+    {
+      if (glyphs[i - 1] + 1 != glyphs[i])
+      {
+	range++;
+	rangeRecord[range].start = glyphs[i];
+	rangeRecord[range].value.set (i);
+      }
+      rangeRecord[range].end = glyphs[i];
+    }
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (rangeRecord.sanitize (c));
+  }
+
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    /* TODO Speed up, using hb_set_next() and bsearch()? */
+    unsigned int count = rangeRecord.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (rangeRecord[i].intersects (glyphs))
+	return true;
+    return false;
+  }
+  bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const
+  {
+    unsigned int i;
+    unsigned int count = rangeRecord.len;
+    for (i = 0; i < count; i++) {
+      const RangeRecord &range = rangeRecord[i];
+      if (range.value <= index &&
+	  index < (unsigned int) range.value + (range.end - range.start) &&
+	  range.intersects (glyphs))
+	return true;
+      else if (index < range.value)
+	return false;
+    }
+    return false;
+  }
+
+  template <typename set_t>
+  bool add_coverage (set_t *glyphs) const
+  {
+    unsigned int count = rangeRecord.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
+	return false;
+    return true;
+  }
+
+  public:
+  /* Older compilers need this to be public. */
+  struct Iter
+  {
+    void init (const CoverageFormat2 &c_)
+    {
+      c = &c_;
+      coverage = 0;
+      i = 0;
+      j = c->rangeRecord.len ? c->rangeRecord[0].start : 0;
+      if (unlikely (c->rangeRecord[0].start > c->rangeRecord[0].end))
+      {
+	/* Broken table. Skip. */
+	i = c->rangeRecord.len;
+      }
+    }
+    void fini () {}
+    bool more () { return i < c->rangeRecord.len; }
+    void next ()
+    {
+      if (j >= c->rangeRecord[i].end)
+      {
+	i++;
+	if (more ())
+	{
+	  hb_codepoint_t old = j;
+	  j = c->rangeRecord[i].start;
+	  if (unlikely (j <= old))
+	  {
+	    /* Broken table. Skip. Important to avoid DoS. */
+	   i = c->rangeRecord.len;
+	   return;
+	  }
+	  coverage = c->rangeRecord[i].value;
+	}
+	return;
+      }
+      coverage++;
+      j++;
+    }
+    hb_codepoint_t get_glyph () { return j; }
+    unsigned int get_coverage () { return coverage; }
+
+    private:
+    const struct CoverageFormat2 *c;
+    unsigned int i, coverage;
+    hb_codepoint_t j;
+  };
+  private:
+
+  protected:
+  HBUINT16	coverageFormat;	/* Format identifier--format = 2 */
+  SortedArrayOf<RangeRecord>
+		rangeRecord;	/* Array of glyph ranges--ordered by
+				 * Start GlyphID. rangeCount entries
+				 * long */
+  public:
+  DEFINE_SIZE_ARRAY (4, rangeRecord);
+};
+
+struct Coverage
+{
+  unsigned int get_coverage (hb_codepoint_t glyph_id) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.get_coverage (glyph_id);
+    case 2: return u.format2.get_coverage (glyph_id);
+    default:return NOT_COVERED;
+    }
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> glyphs)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+
+    unsigned int num_ranges = 1;
+    for (unsigned int i = 1; i < glyphs.length; i++)
+      if (glyphs[i - 1] + 1 != glyphs[i])
+	num_ranges++;
+    u.format.set (glyphs.length * 2 < num_ranges * 3 ? 1 : 2);
+
+    switch (u.format)
+    {
+    case 1: return_trace (u.format1.serialize (c, glyphs));
+    case 2: return_trace (u.format2.serialize (c, glyphs));
+    default:return_trace (false);
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format)
+    {
+    case 1: return_trace (u.format1.sanitize (c));
+    case 2: return_trace (u.format2.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    switch (u.format)
+    {
+    case 1: return u.format1.intersects (glyphs);
+    case 2: return u.format2.intersects (glyphs);
+    default:return false;
+    }
+  }
+  bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const
+  {
+    switch (u.format)
+    {
+    case 1: return u.format1.intersects_coverage (glyphs, index);
+    case 2: return u.format2.intersects_coverage (glyphs, index);
+    default:return false;
+    }
+  }
+
+  /* Might return false if array looks unsorted.
+   * Used for faster rejection of corrupt data. */
+  template <typename set_t>
+  bool add_coverage (set_t *glyphs) const
+  {
+    switch (u.format)
+    {
+    case 1: return u.format1.add_coverage (glyphs);
+    case 2: return u.format2.add_coverage (glyphs);
+    default:return false;
+    }
+  }
+
+  struct Iter
+  {
+    Iter (const Coverage &c_)
+    {
+      memset (this, 0, sizeof (*this));
+      format = c_.u.format;
+      switch (format)
+      {
+      case 1: u.format1.init (c_.u.format1); return;
+      case 2: u.format2.init (c_.u.format2); return;
+      default:				     return;
+      }
+    }
+    bool more ()
+    {
+      switch (format)
+      {
+      case 1: return u.format1.more ();
+      case 2: return u.format2.more ();
+      default:return false;
+      }
+    }
+    void next ()
+    {
+      switch (format)
+      {
+      case 1: u.format1.next (); break;
+      case 2: u.format2.next (); break;
+      default:			 break;
+      }
+    }
+    hb_codepoint_t get_glyph ()
+    {
+      switch (format)
+      {
+      case 1: return u.format1.get_glyph ();
+      case 2: return u.format2.get_glyph ();
+      default:return 0;
+      }
+    }
+    unsigned int get_coverage ()
+    {
+      switch (format)
+      {
+      case 1: return u.format1.get_coverage ();
+      case 2: return u.format2.get_coverage ();
+      default:return -1;
+      }
+    }
+
+    private:
+    unsigned int format;
+    union {
+    CoverageFormat2::Iter	format2; /* Put this one first since it's larger; helps shut up compiler. */
+    CoverageFormat1::Iter	format1;
+    } u;
+  };
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  CoverageFormat1	format1;
+  CoverageFormat2	format2;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+
+/*
+ * Class Definition Table
+ */
+
+static inline void ClassDef_serialize (hb_serialize_context_t *c,
+				       hb_array_t<const GlyphID> glyphs,
+				       hb_array_t<const HBUINT16> klasses);
+
+struct ClassDefFormat1
+{
+  friend struct ClassDef;
+
+  private:
+  unsigned int get_class (hb_codepoint_t glyph_id) const
+  {
+    return classValue[(unsigned int) (glyph_id - startGlyph)];
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const HBUINT16> glyphs,
+		  hb_array_t<const HBUINT16> klasses)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+
+    if (unlikely (!glyphs.length))
+    {
+      startGlyph.set (0);
+      classValue.len.set (0);
+      return_trace (true);
+    }
+
+    hb_codepoint_t glyph_min = glyphs[0];
+    hb_codepoint_t glyph_max = glyphs[glyphs.length - 1];
+
+    startGlyph.set (glyph_min);
+    classValue.len.set (glyph_max - glyph_min + 1);
+    if (unlikely (!c->extend (classValue))) return_trace (false);
+
+    for (unsigned int i = 0; i < glyphs.length; i++)
+      classValue[glyphs[i] - glyph_min] = klasses[i];
+
+    return_trace (true);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    const hb_set_t &glyphset = *c->plan->glyphset;
+    const hb_map_t &glyph_map = *c->plan->glyph_map;
+    hb_vector_t<GlyphID> glyphs;
+    hb_vector_t<HBUINT16> klasses;
+
+    hb_codepoint_t start = startGlyph;
+    hb_codepoint_t end   = start + classValue.len;
+    for (hb_codepoint_t g = start; g < end; g++)
+    {
+      unsigned int value = classValue[g - start];
+      if (!value) continue;
+      if (!glyphset.has (g)) continue;
+      glyphs.push()->set (glyph_map[g]);
+      klasses.push()->set (value);
+    }
+    c->serializer->propagate_error (glyphs, klasses);
+    ClassDef_serialize (c->serializer, glyphs, klasses);
+    return_trace (glyphs.length);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && classValue.sanitize (c));
+  }
+
+  template <typename set_t>
+  bool add_coverage (set_t *glyphs) const
+  {
+    unsigned int start = 0;
+    unsigned int count = classValue.len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (classValue[i])
+	continue;
+
+      if (start != i)
+	if (unlikely (!glyphs->add_range (startGlyph + start, startGlyph + i)))
+	  return false;
+
+      start = i + 1;
+    }
+    if (start != count)
+      if (unlikely (!glyphs->add_range (startGlyph + start, startGlyph + count)))
+	return false;
+
+    return true;
+  }
+
+  template <typename set_t>
+  bool add_class (set_t *glyphs, unsigned int klass) const
+  {
+    unsigned int count = classValue.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (classValue[i] == klass) glyphs->add (startGlyph + i);
+    return true;
+  }
+
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    /* TODO Speed up, using hb_set_next()? */
+    hb_codepoint_t start = startGlyph;
+    hb_codepoint_t end = startGlyph + classValue.len;
+    for (hb_codepoint_t iter = startGlyph - 1;
+	 hb_set_next (glyphs, &iter) && iter < end;)
+      if (classValue[iter - start]) return true;
+    return false;
+  }
+  bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const
+  {
+    unsigned int count = classValue.len;
+    if (klass == 0)
+    {
+      /* Match if there's any glyph that is not listed! */
+      hb_codepoint_t g = HB_SET_VALUE_INVALID;
+      if (!hb_set_next (glyphs, &g)) return false;
+      if (g < startGlyph) return true;
+      g = startGlyph + count - 1;
+      if (hb_set_next (glyphs, &g)) return true;
+      /* Fall through. */
+    }
+    for (unsigned int i = 0; i < count; i++)
+      if (classValue[i] == klass && glyphs->has (startGlyph + i))
+	return true;
+    return false;
+  }
+
+  protected:
+  HBUINT16	classFormat;	/* Format identifier--format = 1 */
+  GlyphID	startGlyph;	/* First GlyphID of the classValueArray */
+  ArrayOf<HBUINT16>
+		classValue;	/* Array of Class Values--one per GlyphID */
+  public:
+  DEFINE_SIZE_ARRAY (6, classValue);
+};
+
+struct ClassDefFormat2
+{
+  friend struct ClassDef;
+
+  private:
+  unsigned int get_class (hb_codepoint_t glyph_id) const
+  {
+    return rangeRecord.bsearch (glyph_id).value;
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const HBUINT16> glyphs,
+		  hb_array_t<const HBUINT16> klasses)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+
+    if (unlikely (!glyphs.length))
+    {
+      rangeRecord.len.set (0);
+      return_trace (true);
+    }
+
+    unsigned int num_ranges = 1;
+    for (unsigned int i = 1; i < glyphs.length; i++)
+      if (glyphs[i - 1] + 1 != glyphs[i] ||
+	  klasses[i - 1] != klasses[i])
+	num_ranges++;
+    rangeRecord.len.set (num_ranges);
+    if (unlikely (!c->extend (rangeRecord))) return_trace (false);
+
+    unsigned int range = 0;
+    rangeRecord[range].start = glyphs[0];
+    rangeRecord[range].value.set (klasses[0]);
+    for (unsigned int i = 1; i < glyphs.length; i++)
+    {
+      if (glyphs[i - 1] + 1 != glyphs[i] ||
+	  klasses[i - 1] != klasses[i])
+      {
+	range++;
+	rangeRecord[range].start = glyphs[i];
+	rangeRecord[range].value = klasses[i];
+      }
+      rangeRecord[range].end = glyphs[i];
+    }
+    return_trace (true);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    const hb_set_t &glyphset = *c->plan->glyphset;
+    const hb_map_t &glyph_map = *c->plan->glyph_map;
+    hb_vector_t<GlyphID> glyphs;
+    hb_vector_t<HBUINT16> klasses;
+
+    unsigned int count = rangeRecord.len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      unsigned int value = rangeRecord[i].value;
+      if (!value) continue;
+      hb_codepoint_t start = rangeRecord[i].start;
+      hb_codepoint_t end   = rangeRecord[i].end + 1;
+      for (hb_codepoint_t g = start; g < end; g++)
+      {
+	if (!glyphset.has (g)) continue;
+	glyphs.push ()->set (glyph_map[g]);
+	klasses.push ()->set (value);
+      }
+    }
+    c->serializer->propagate_error (glyphs, klasses);
+    ClassDef_serialize (c->serializer, glyphs, klasses);
+    return_trace (glyphs.length);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (rangeRecord.sanitize (c));
+  }
+
+  template <typename set_t>
+  bool add_coverage (set_t *glyphs) const
+  {
+    unsigned int count = rangeRecord.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (rangeRecord[i].value)
+	if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
+	  return false;
+    return true;
+  }
+
+  template <typename set_t>
+  bool add_class (set_t *glyphs, unsigned int klass) const
+  {
+    unsigned int count = rangeRecord.len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (rangeRecord[i].value == klass)
+	if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
+	  return false;
+    }
+    return true;
+  }
+
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    /* TODO Speed up, using hb_set_next() and bsearch()? */
+    unsigned int count = rangeRecord.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (rangeRecord[i].intersects (glyphs))
+	return true;
+    return false;
+  }
+  bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const
+  {
+    unsigned int count = rangeRecord.len;
+    if (klass == 0)
+    {
+      /* Match if there's any glyph that is not listed! */
+      hb_codepoint_t g = HB_SET_VALUE_INVALID;
+      for (unsigned int i = 0; i < count; i++)
+      {
+	if (!hb_set_next (glyphs, &g))
+	  break;
+	if (g < rangeRecord[i].start)
+	  return true;
+	g = rangeRecord[i].end;
+      }
+      if (g != HB_SET_VALUE_INVALID && hb_set_next (glyphs, &g))
+	return true;
+      /* Fall through. */
+    }
+    for (unsigned int i = 0; i < count; i++)
+      if (rangeRecord[i].value == klass && rangeRecord[i].intersects (glyphs))
+	return true;
+    return false;
+  }
+
+  protected:
+  HBUINT16	classFormat;	/* Format identifier--format = 2 */
+  SortedArrayOf<RangeRecord>
+		rangeRecord;	/* Array of glyph ranges--ordered by
+				 * Start GlyphID */
+  public:
+  DEFINE_SIZE_ARRAY (4, rangeRecord);
+};
+
+struct ClassDef
+{
+  unsigned int get_class (hb_codepoint_t glyph_id) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.get_class (glyph_id);
+    case 2: return u.format2.get_class (glyph_id);
+    default:return 0;
+    }
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> glyphs,
+		  hb_array_t<const HBUINT16> klasses)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+
+    unsigned int format = 2;
+    if (glyphs.length)
+    {
+      hb_codepoint_t glyph_min = glyphs[0];
+      hb_codepoint_t glyph_max = glyphs[glyphs.length - 1];
+
+      unsigned int num_ranges = 1;
+      for (unsigned int i = 1; i < glyphs.length; i++)
+	if (glyphs[i - 1] + 1 != glyphs[i] ||
+	    klasses[i - 1] != klasses[i])
+	  num_ranges++;
+
+      if (1 + (glyph_max - glyph_min + 1) < num_ranges * 3)
+        format = 1;
+    }
+    u.format.set (format);
+
+    switch (u.format)
+    {
+    case 1: return_trace (u.format1.serialize (c, glyphs, klasses));
+    case 2: return_trace (u.format2.serialize (c, glyphs, klasses));
+    default:return_trace (false);
+    }
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    switch (u.format) {
+    case 1: return_trace (u.format1.subset (c));
+    case 2: return_trace (u.format2.subset (c));
+    default:return_trace (false);
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format) {
+    case 1: return_trace (u.format1.sanitize (c));
+    case 2: return_trace (u.format2.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  /* Might return false if array looks unsorted.
+   * Used for faster rejection of corrupt data. */
+  template <typename set_t>
+  bool add_coverage (set_t *glyphs) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.add_coverage (glyphs);
+    case 2: return u.format2.add_coverage (glyphs);
+    default:return false;
+    }
+  }
+
+  /* Might return false if array looks unsorted.
+   * Used for faster rejection of corrupt data. */
+  template <typename set_t>
+  bool add_class (set_t *glyphs, unsigned int klass) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.add_class (glyphs, klass);
+    case 2: return u.format2.add_class (glyphs, klass);
+    default:return false;
+    }
+  }
+
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.intersects (glyphs);
+    case 2: return u.format2.intersects (glyphs);
+    default:return false;
+    }
+  }
+  bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.intersects_class (glyphs, klass);
+    case 2: return u.format2.intersects_class (glyphs, klass);
+    default:return false;
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  ClassDefFormat1	format1;
+  ClassDefFormat2	format2;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+static inline void ClassDef_serialize (hb_serialize_context_t *c,
+				       hb_array_t<const GlyphID> glyphs,
+				       hb_array_t<const HBUINT16> klasses)
+{ c->start_embed<ClassDef> ()->serialize (c, glyphs, klasses); }
+
+
+/*
+ * Item Variation Store
+ */
+
+struct VarRegionAxis
+{
+  float evaluate (int coord) const
+  {
+    int start = startCoord, peak = peakCoord, end = endCoord;
+
+    /* TODO Move these to sanitize(). */
+    if (unlikely (start > peak || peak > end))
+      return 1.;
+    if (unlikely (start < 0 && end > 0 && peak != 0))
+      return 1.;
+
+    if (peak == 0 || coord == peak)
+      return 1.;
+
+    if (coord <= start || end <= coord)
+      return 0.;
+
+    /* Interpolate */
+    if (coord < peak)
+      return float (coord - start) / (peak - start);
+    else
+      return float (end - coord) / (end - peak);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+    /* TODO Handle invalid start/peak/end configs, so we don't
+     * have to do that at runtime. */
+  }
+
+  public:
+  F2DOT14	startCoord;
+  F2DOT14	peakCoord;
+  F2DOT14	endCoord;
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct VarRegionList
+{
+  float evaluate (unsigned int region_index,
+			 const int *coords, unsigned int coord_len) const
+  {
+    if (unlikely (region_index >= regionCount))
+      return 0.;
+
+    const VarRegionAxis *axes = axesZ.arrayZ + (region_index * axisCount);
+
+    float v = 1.;
+    unsigned int count = axisCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      int coord = i < coord_len ? coords[i] : 0;
+      float factor = axes[i].evaluate (coord);
+      if (factor == 0.f)
+	return 0.;
+      v *= factor;
+    }
+    return v;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  axesZ.sanitize (c, (unsigned int) axisCount * (unsigned int) regionCount));
+  }
+
+  unsigned int get_region_count () const { return regionCount; }
+
+  protected:
+  HBUINT16	axisCount;
+  HBUINT16	regionCount;
+  UnsizedArrayOf<VarRegionAxis>
+		axesZ;
+  public:
+  DEFINE_SIZE_ARRAY (4, axesZ);
+};
+
+struct VarData
+{
+  unsigned int get_region_index_count () const
+  { return regionIndices.len; }
+
+  unsigned int get_row_size () const
+  { return shortCount + regionIndices.len; }
+
+  unsigned int get_size () const
+  { return itemCount * get_row_size (); }
+
+  float get_delta (unsigned int inner,
+			  const int *coords, unsigned int coord_count,
+			  const VarRegionList &regions) const
+  {
+    if (unlikely (inner >= itemCount))
+      return 0.;
+
+   unsigned int count = regionIndices.len;
+   unsigned int scount = shortCount;
+
+   const HBUINT8 *bytes = &StructAfter<HBUINT8> (regionIndices);
+   const HBUINT8 *row = bytes + inner * (scount + count);
+
+   float delta = 0.;
+   unsigned int i = 0;
+
+   const HBINT16 *scursor = reinterpret_cast<const HBINT16 *> (row);
+   for (; i < scount; i++)
+   {
+     float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count);
+     delta += scalar * *scursor++;
+   }
+   const HBINT8 *bcursor = reinterpret_cast<const HBINT8 *> (scursor);
+   for (; i < count; i++)
+   {
+     float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count);
+     delta += scalar * *bcursor++;
+   }
+
+   return delta;
+  }
+
+  void get_scalars (int *coords, unsigned int coord_count,
+                    const VarRegionList &regions,
+                    float *scalars /*OUT */,
+                    unsigned int num_scalars) const
+  {
+    assert (num_scalars == regionIndices.len);
+   for (unsigned int i = 0; i < num_scalars; i++)
+   {
+     scalars[i] = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count);
+   }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  regionIndices.sanitize (c) &&
+		  shortCount <= regionIndices.len &&
+		  c->check_range (&StructAfter<HBUINT8> (regionIndices),
+				  itemCount,
+				  get_row_size ()));
+  }
+
+  protected:
+  HBUINT16		itemCount;
+  HBUINT16		shortCount;
+  ArrayOf<HBUINT16>	regionIndices;
+/*UnsizedArrayOf<HBUINT8>bytesX;*/
+  public:
+  DEFINE_SIZE_ARRAY (6, regionIndices);
+};
+
+struct VariationStore
+{
+  float get_delta (unsigned int outer, unsigned int inner,
+		   const int *coords, unsigned int coord_count) const
+  {
+    if (unlikely (outer >= dataSets.len))
+      return 0.;
+
+    return (this+dataSets[outer]).get_delta (inner,
+					     coords, coord_count,
+					     this+regions);
+  }
+
+  float get_delta (unsigned int index,
+		   const int *coords, unsigned int coord_count) const
+  {
+    unsigned int outer = index >> 16;
+    unsigned int inner = index & 0xFFFF;
+    return get_delta (outer, inner, coords, coord_count);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  format == 1 &&
+		  regions.sanitize (c, this) &&
+		  dataSets.sanitize (c, this));
+  }
+
+  unsigned int get_region_index_count (unsigned int ivs) const
+  { return (this+dataSets[ivs]).get_region_index_count (); }
+
+  void get_scalars (unsigned int ivs,
+		    int *coords, unsigned int coord_count,
+		    float *scalars /*OUT*/,
+		    unsigned int num_scalars) const
+  {
+    (this+dataSets[ivs]).get_scalars (coords, coord_count, this+regions,
+                                      &scalars[0], num_scalars);
+  }
+
+  protected:
+  HBUINT16				format;
+  LOffsetTo<VarRegionList>		regions;
+  LOffsetArrayOf<VarData>		dataSets;
+  public:
+  DEFINE_SIZE_ARRAY (8, dataSets);
+};
+
+/*
+ * Feature Variations
+ */
+
+struct ConditionFormat1
+{
+  friend struct Condition;
+
+  private:
+  bool evaluate (const int *coords, unsigned int coord_len) const
+  {
+    int coord = axisIndex < coord_len ? coords[axisIndex] : 0;
+    return filterRangeMinValue <= coord && coord <= filterRangeMaxValue;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 1 */
+  HBUINT16	axisIndex;
+  F2DOT14	filterRangeMinValue;
+  F2DOT14	filterRangeMaxValue;
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct Condition
+{
+  bool evaluate (const int *coords, unsigned int coord_len) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.evaluate (coords, coord_len);
+    default:return false;
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format) {
+    case 1: return_trace (u.format1.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  ConditionFormat1	format1;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+struct ConditionSet
+{
+  bool evaluate (const int *coords, unsigned int coord_len) const
+  {
+    unsigned int count = conditions.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (!(this+conditions.arrayZ[i]).evaluate (coords, coord_len))
+	return false;
+    return true;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (conditions.sanitize (c, this));
+  }
+
+  protected:
+  LOffsetArrayOf<Condition>	conditions;
+  public:
+  DEFINE_SIZE_ARRAY (2, conditions);
+};
+
+struct FeatureTableSubstitutionRecord
+{
+  friend struct FeatureTableSubstitution;
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && feature.sanitize (c, base));
+  }
+
+  protected:
+  HBUINT16		featureIndex;
+  LOffsetTo<Feature>	feature;
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct FeatureTableSubstitution
+{
+  const Feature *find_substitute (unsigned int feature_index) const
+  {
+    unsigned int count = substitutions.len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      const FeatureTableSubstitutionRecord &record = substitutions.arrayZ[i];
+      if (record.featureIndex == feature_index)
+	return &(this+record.feature);
+    }
+    return nullptr;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (version.sanitize (c) &&
+		  likely (version.major == 1) &&
+		  substitutions.sanitize (c, this));
+  }
+
+  protected:
+  FixedVersion<>	version;	/* Version--0x00010000u */
+  ArrayOf<FeatureTableSubstitutionRecord>
+			substitutions;
+  public:
+  DEFINE_SIZE_ARRAY (6, substitutions);
+};
+
+struct FeatureVariationRecord
+{
+  friend struct FeatureVariations;
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (conditions.sanitize (c, base) &&
+		  substitutions.sanitize (c, base));
+  }
+
+  protected:
+  LOffsetTo<ConditionSet>
+			conditions;
+  LOffsetTo<FeatureTableSubstitution>
+			substitutions;
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct FeatureVariations
+{
+  static constexpr unsigned NOT_FOUND_INDEX = 0xFFFFFFFFu;
+
+  bool find_index (const int *coords, unsigned int coord_len,
+			  unsigned int *index) const
+  {
+    unsigned int count = varRecords.len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      const FeatureVariationRecord &record = varRecords.arrayZ[i];
+      if ((this+record.conditions).evaluate (coords, coord_len))
+      {
+	*index = i;
+	return true;
+      }
+    }
+    *index = NOT_FOUND_INDEX;
+    return false;
+  }
+
+  const Feature *find_substitute (unsigned int variations_index,
+				  unsigned int feature_index) const
+  {
+    const FeatureVariationRecord &record = varRecords[variations_index];
+    return (this+record.substitutions).find_substitute (feature_index);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    return_trace (c->serializer->embed (*this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (version.sanitize (c) &&
+		  likely (version.major == 1) &&
+		  varRecords.sanitize (c, this));
+  }
+
+  protected:
+  FixedVersion<>	version;	/* Version--0x00010000u */
+  LArrayOf<FeatureVariationRecord>
+			varRecords;
+  public:
+  DEFINE_SIZE_ARRAY_SIZED (8, varRecords);
+};
+
+
+/*
+ * Device Tables
+ */
+
+struct HintingDevice
+{
+  friend struct Device;
+
+  private:
+
+  hb_position_t get_x_delta (hb_font_t *font) const
+  { return get_delta (font->x_ppem, font->x_scale); }
+
+  hb_position_t get_y_delta (hb_font_t *font) const
+  { return get_delta (font->y_ppem, font->y_scale); }
+
+  unsigned int get_size () const
+  {
+    unsigned int f = deltaFormat;
+    if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * HBUINT16::static_size;
+    return HBUINT16::static_size * (4 + ((endSize - startSize) >> (4 - f)));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && c->check_range (this, this->get_size ()));
+  }
+
+  private:
+
+  int get_delta (unsigned int ppem, int scale) const
+  {
+    if (!ppem) return 0;
+
+    int pixels = get_delta_pixels (ppem);
+
+    if (!pixels) return 0;
+
+    return (int) (pixels * (int64_t) scale / ppem);
+  }
+  int get_delta_pixels (unsigned int ppem_size) const
+  {
+    unsigned int f = deltaFormat;
+    if (unlikely (f < 1 || f > 3))
+      return 0;
+
+    if (ppem_size < startSize || ppem_size > endSize)
+      return 0;
+
+    unsigned int s = ppem_size - startSize;
+
+    unsigned int byte = deltaValueZ[s >> (4 - f)];
+    unsigned int bits = (byte >> (16 - (((s & ((1 << (4 - f)) - 1)) + 1) << f)));
+    unsigned int mask = (0xFFFFu >> (16 - (1 << f)));
+
+    int delta = bits & mask;
+
+    if ((unsigned int) delta >= ((mask + 1) >> 1))
+      delta -= mask + 1;
+
+    return delta;
+  }
+
+  protected:
+  HBUINT16	startSize;		/* Smallest size to correct--in ppem */
+  HBUINT16	endSize;		/* Largest size to correct--in ppem */
+  HBUINT16	deltaFormat;		/* Format of DeltaValue array data: 1, 2, or 3
+					 * 1	Signed 2-bit value, 8 values per uint16
+					 * 2	Signed 4-bit value, 4 values per uint16
+					 * 3	Signed 8-bit value, 2 values per uint16
+					 */
+  UnsizedArrayOf<HBUINT16>
+		deltaValueZ;		/* Array of compressed data */
+  public:
+  DEFINE_SIZE_ARRAY (6, deltaValueZ);
+};
+
+struct VariationDevice
+{
+  friend struct Device;
+
+  private:
+
+  hb_position_t get_x_delta (hb_font_t *font, const VariationStore &store) const
+  { return font->em_scalef_x (get_delta (font, store)); }
+
+  hb_position_t get_y_delta (hb_font_t *font, const VariationStore &store) const
+  { return font->em_scalef_y (get_delta (font, store)); }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  private:
+
+  float get_delta (hb_font_t *font, const VariationStore &store) const
+  {
+    return store.get_delta (outerIndex, innerIndex, font->coords, font->num_coords);
+  }
+
+  protected:
+  HBUINT16	outerIndex;
+  HBUINT16	innerIndex;
+  HBUINT16	deltaFormat;	/* Format identifier for this table: 0x0x8000 */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct DeviceHeader
+{
+  protected:
+  HBUINT16		reserved1;
+  HBUINT16		reserved2;
+  public:
+  HBUINT16		format;		/* Format identifier */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct Device
+{
+  hb_position_t get_x_delta (hb_font_t *font, const VariationStore &store=Null (VariationStore)) const
+  {
+    switch (u.b.format)
+    {
+    case 1: case 2: case 3:
+      return u.hinting.get_x_delta (font);
+    case 0x8000:
+      return u.variation.get_x_delta (font, store);
+    default:
+      return 0;
+    }
+  }
+  hb_position_t get_y_delta (hb_font_t *font, const VariationStore &store=Null (VariationStore)) const
+  {
+    switch (u.b.format)
+    {
+    case 1: case 2: case 3:
+      return u.hinting.get_y_delta (font);
+    case 0x8000:
+      return u.variation.get_y_delta (font, store);
+    default:
+      return 0;
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.b.format.sanitize (c)) return_trace (false);
+    switch (u.b.format) {
+    case 1: case 2: case 3:
+      return_trace (u.hinting.sanitize (c));
+    case 0x8000:
+      return_trace (u.variation.sanitize (c));
+    default:
+      return_trace (true);
+    }
+  }
+
+  protected:
+  union {
+  DeviceHeader		b;
+  HintingDevice		hinting;
+  VariationDevice	variation;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (6, b);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_LAYOUT_COMMON_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-gdef-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-gdef-table.hh
new file mode 100644
index 0000000..06c26fb
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-gdef-table.hh
@@ -0,0 +1,510 @@
+/*
+ * Copyright © 2007,2008,2009  Red Hat, Inc.
+ * Copyright © 2010,2011,2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_LAYOUT_GDEF_TABLE_HH
+#define HB_OT_LAYOUT_GDEF_TABLE_HH
+
+#include "hb-ot-layout-common.hh"
+
+#include "hb-font.hh"
+
+
+namespace OT {
+
+
+/*
+ * Attachment List Table
+ */
+
+typedef ArrayOf<HBUINT16> AttachPoint;	/* Array of contour point indices--in
+					 * increasing numerical order */
+
+struct AttachList
+{
+  unsigned int get_attach_points (hb_codepoint_t glyph_id,
+				  unsigned int start_offset,
+				  unsigned int *point_count /* IN/OUT */,
+				  unsigned int *point_array /* OUT */) const
+  {
+    unsigned int index = (this+coverage).get_coverage (glyph_id);
+    if (index == NOT_COVERED)
+    {
+      if (point_count)
+	*point_count = 0;
+      return 0;
+    }
+
+    const AttachPoint &points = this+attachPoint[index];
+
+    if (point_count)
+    {
+      hb_array_t<const HBUINT16> array = points.sub_array (start_offset, point_count);
+      unsigned int count = array.length;
+      for (unsigned int i = 0; i < count; i++)
+	point_array[i] = array[i];
+    }
+
+    return points.len;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (coverage.sanitize (c, this) && attachPoint.sanitize (c, this));
+  }
+
+  protected:
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table -- from
+					 * beginning of AttachList table */
+  OffsetArrayOf<AttachPoint>
+		attachPoint;		/* Array of AttachPoint tables
+					 * in Coverage Index order */
+  public:
+  DEFINE_SIZE_ARRAY (4, attachPoint);
+};
+
+/*
+ * Ligature Caret Table
+ */
+
+struct CaretValueFormat1
+{
+  friend struct CaretValue;
+
+  private:
+  hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction) const
+  {
+    return HB_DIRECTION_IS_HORIZONTAL (direction) ? font->em_scale_x (coordinate) : font->em_scale_y (coordinate);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT16	caretValueFormat;	/* Format identifier--format = 1 */
+  FWORD		coordinate;		/* X or Y value, in design units */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct CaretValueFormat2
+{
+  friend struct CaretValue;
+
+  private:
+  hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id) const
+  {
+    hb_position_t x, y;
+    font->get_glyph_contour_point_for_origin (glyph_id, caretValuePoint, direction, &x, &y);
+    return HB_DIRECTION_IS_HORIZONTAL (direction) ? x : y;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT16	caretValueFormat;	/* Format identifier--format = 2 */
+  HBUINT16	caretValuePoint;	/* Contour point index on glyph */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct CaretValueFormat3
+{
+  friend struct CaretValue;
+
+  hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction,
+				 const VariationStore &var_store) const
+  {
+    return HB_DIRECTION_IS_HORIZONTAL (direction) ?
+           font->em_scale_x (coordinate) + (this+deviceTable).get_x_delta (font, var_store) :
+           font->em_scale_y (coordinate) + (this+deviceTable).get_y_delta (font, var_store);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && deviceTable.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16	caretValueFormat;	/* Format identifier--format = 3 */
+  FWORD		coordinate;		/* X or Y value, in design units */
+  OffsetTo<Device>
+		deviceTable;		/* Offset to Device table for X or Y
+					 * value--from beginning of CaretValue
+					 * table */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct CaretValue
+{
+  hb_position_t get_caret_value (hb_font_t *font,
+					hb_direction_t direction,
+					hb_codepoint_t glyph_id,
+					const VariationStore &var_store) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.get_caret_value (font, direction);
+    case 2: return u.format2.get_caret_value (font, direction, glyph_id);
+    case 3: return u.format3.get_caret_value (font, direction, var_store);
+    default:return 0;
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format) {
+    case 1: return_trace (u.format1.sanitize (c));
+    case 2: return_trace (u.format2.sanitize (c));
+    case 3: return_trace (u.format3.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  CaretValueFormat1	format1;
+  CaretValueFormat2	format2;
+  CaretValueFormat3	format3;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+struct LigGlyph
+{
+  unsigned int get_lig_carets (hb_font_t *font,
+			       hb_direction_t direction,
+			       hb_codepoint_t glyph_id,
+			       const VariationStore &var_store,
+			       unsigned int start_offset,
+			       unsigned int *caret_count /* IN/OUT */,
+			       hb_position_t *caret_array /* OUT */) const
+  {
+    if (caret_count)
+    {
+      hb_array_t <const OffsetTo<CaretValue> > array = carets.sub_array (start_offset, caret_count);
+      unsigned int count = array.length;
+      for (unsigned int i = 0; i < count; i++)
+	caret_array[i] = (this+array[i]).get_caret_value (font, direction, glyph_id, var_store);
+    }
+
+    return carets.len;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (carets.sanitize (c, this));
+  }
+
+  protected:
+  OffsetArrayOf<CaretValue>
+		carets;			/* Offset array of CaretValue tables
+					 * --from beginning of LigGlyph table
+					 * --in increasing coordinate order */
+  public:
+  DEFINE_SIZE_ARRAY (2, carets);
+};
+
+struct LigCaretList
+{
+  unsigned int get_lig_carets (hb_font_t *font,
+			       hb_direction_t direction,
+			       hb_codepoint_t glyph_id,
+			       const VariationStore &var_store,
+			       unsigned int start_offset,
+			       unsigned int *caret_count /* IN/OUT */,
+			       hb_position_t *caret_array /* OUT */) const
+  {
+    unsigned int index = (this+coverage).get_coverage (glyph_id);
+    if (index == NOT_COVERED)
+    {
+      if (caret_count)
+	*caret_count = 0;
+      return 0;
+    }
+    const LigGlyph &lig_glyph = this+ligGlyph[index];
+    return lig_glyph.get_lig_carets (font, direction, glyph_id, var_store, start_offset, caret_count, caret_array);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (coverage.sanitize (c, this) && ligGlyph.sanitize (c, this));
+  }
+
+  protected:
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of LigCaretList table */
+  OffsetArrayOf<LigGlyph>
+		ligGlyph;		/* Array of LigGlyph tables
+					 * in Coverage Index order */
+  public:
+  DEFINE_SIZE_ARRAY (4, ligGlyph);
+};
+
+
+struct MarkGlyphSetsFormat1
+{
+  bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const
+  { return (this+coverage[set_index]).get_coverage (glyph_id) != NOT_COVERED; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (coverage.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  ArrayOf<LOffsetTo<Coverage> >
+		coverage;		/* Array of long offsets to mark set
+					 * coverage tables */
+  public:
+  DEFINE_SIZE_ARRAY (4, coverage);
+};
+
+struct MarkGlyphSets
+{
+  bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.covers (set_index, glyph_id);
+    default:return false;
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format) {
+    case 1: return_trace (u.format1.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  MarkGlyphSetsFormat1	format1;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+
+/*
+ * GDEF -- Glyph Definition
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/gdef
+ */
+
+
+struct GDEF
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_GDEF;
+
+  enum GlyphClasses {
+    UnclassifiedGlyph	= 0,
+    BaseGlyph		= 1,
+    LigatureGlyph	= 2,
+    MarkGlyph		= 3,
+    ComponentGlyph	= 4
+  };
+
+  bool has_data () const { return version.to_int (); }
+  bool has_glyph_classes () const { return glyphClassDef != 0; }
+  unsigned int get_glyph_class (hb_codepoint_t glyph) const
+  { return (this+glyphClassDef).get_class (glyph); }
+  void get_glyphs_in_class (unsigned int klass, hb_set_t *glyphs) const
+  { (this+glyphClassDef).add_class (glyphs, klass); }
+
+  bool has_mark_attachment_types () const { return markAttachClassDef != 0; }
+  unsigned int get_mark_attachment_type (hb_codepoint_t glyph) const
+  { return (this+markAttachClassDef).get_class (glyph); }
+
+  bool has_attach_points () const { return attachList != 0; }
+  unsigned int get_attach_points (hb_codepoint_t glyph_id,
+				  unsigned int start_offset,
+				  unsigned int *point_count /* IN/OUT */,
+				  unsigned int *point_array /* OUT */) const
+  { return (this+attachList).get_attach_points (glyph_id, start_offset, point_count, point_array); }
+
+  bool has_lig_carets () const { return ligCaretList != 0; }
+  unsigned int get_lig_carets (hb_font_t *font,
+			       hb_direction_t direction,
+			       hb_codepoint_t glyph_id,
+			       unsigned int start_offset,
+			       unsigned int *caret_count /* IN/OUT */,
+			       hb_position_t *caret_array /* OUT */) const
+  { return (this+ligCaretList).get_lig_carets (font,
+					       direction, glyph_id, get_var_store(),
+					       start_offset, caret_count, caret_array); }
+
+  bool has_mark_sets () const { return version.to_int () >= 0x00010002u && markGlyphSetsDef != 0; }
+  bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) const
+  { return version.to_int () >= 0x00010002u && (this+markGlyphSetsDef).covers (set_index, glyph_id); }
+
+  bool has_var_store () const { return version.to_int () >= 0x00010003u && varStore != 0; }
+  const VariationStore &get_var_store () const
+  { return version.to_int () >= 0x00010003u ? this+varStore : Null(VariationStore); }
+
+  /* glyph_props is a 16-bit integer where the lower 8-bit have bits representing
+   * glyph class and other bits, and high 8-bit the mark attachment type (if any).
+   * Not to be confused with lookup_props which is very similar. */
+  unsigned int get_glyph_props (hb_codepoint_t glyph) const
+  {
+    unsigned int klass = get_glyph_class (glyph);
+
+    static_assert (((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH == (unsigned int) LookupFlag::IgnoreBaseGlyphs), "");
+    static_assert (((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE == (unsigned int) LookupFlag::IgnoreLigatures), "");
+    static_assert (((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_MARK == (unsigned int) LookupFlag::IgnoreMarks), "");
+
+    switch (klass) {
+    default:			return 0;
+    case BaseGlyph:		return HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH;
+    case LigatureGlyph:		return HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE;
+    case MarkGlyph:
+	  klass = get_mark_attachment_type (glyph);
+	  return HB_OT_LAYOUT_GLYPH_PROPS_MARK | (klass << 8);
+    }
+  }
+
+  HB_INTERNAL bool is_blacklisted (hb_blob_t *blob,
+				   hb_face_t *face) const;
+
+  struct accelerator_t
+  {
+    void init (hb_face_t *face)
+    {
+      this->table = hb_sanitize_context_t().reference_table<GDEF> (face);
+      if (unlikely (this->table->is_blacklisted (this->table.get_blob (), face)))
+      {
+	hb_blob_destroy (this->table.get_blob ());
+	this->table = hb_blob_get_empty ();
+      }
+    }
+
+    void fini () { this->table.destroy (); }
+
+    hb_blob_ptr_t<GDEF> table;
+  };
+
+  unsigned int get_size () const
+  {
+    return min_size +
+	   (version.to_int () >= 0x00010002u ? markGlyphSetsDef.static_size : 0) +
+	   (version.to_int () >= 0x00010003u ? varStore.static_size : 0);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    struct GDEF *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+
+    out->glyphClassDef.serialize_subset (c, this+glyphClassDef, out);
+    out->attachList.set (0);//TODO(subset) serialize_subset (c, this+attachList, out);
+    out->ligCaretList.set (0);//TODO(subset) serialize_subset (c, this+ligCaretList, out);
+    out->markAttachClassDef.serialize_subset (c, this+markAttachClassDef, out);
+
+    if (version.to_int () >= 0x00010002u)
+      out->markGlyphSetsDef.set (0);// TODO(subset) serialize_subset (c, this+markGlyphSetsDef, out);
+
+    if (version.to_int () >= 0x00010003u)
+      out->varStore.set (0);// TODO(subset) serialize_subset (c, this+varStore, out);
+
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (version.sanitize (c) &&
+		  likely (version.major == 1) &&
+		  glyphClassDef.sanitize (c, this) &&
+		  attachList.sanitize (c, this) &&
+		  ligCaretList.sanitize (c, this) &&
+		  markAttachClassDef.sanitize (c, this) &&
+		  (version.to_int () < 0x00010002u || markGlyphSetsDef.sanitize (c, this)) &&
+		  (version.to_int () < 0x00010003u || varStore.sanitize (c, this)));
+  }
+
+  protected:
+  FixedVersion<>version;		/* Version of the GDEF table--currently
+					 * 0x00010003u */
+  OffsetTo<ClassDef>
+		glyphClassDef;		/* Offset to class definition table
+					 * for glyph type--from beginning of
+					 * GDEF header (may be Null) */
+  OffsetTo<AttachList>
+		attachList;		/* Offset to list of glyphs with
+					 * attachment points--from beginning
+					 * of GDEF header (may be Null) */
+  OffsetTo<LigCaretList>
+		ligCaretList;		/* Offset to list of positioning points
+					 * for ligature carets--from beginning
+					 * of GDEF header (may be Null) */
+  OffsetTo<ClassDef>
+		markAttachClassDef;	/* Offset to class definition table for
+					 * mark attachment type--from beginning
+					 * of GDEF header (may be Null) */
+  OffsetTo<MarkGlyphSets>
+		markGlyphSetsDef;	/* Offset to the table of mark set
+					 * definitions--from beginning of GDEF
+					 * header (may be NULL).  Introduced
+					 * in version 0x00010002. */
+  LOffsetTo<VariationStore>
+		varStore;		/* Offset to the table of Item Variation
+					 * Store--from beginning of GDEF
+					 * header (may be NULL).  Introduced
+					 * in version 0x00010003. */
+  public:
+  DEFINE_SIZE_MIN (12);
+};
+
+struct GDEF_accelerator_t : GDEF::accelerator_t {};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_LAYOUT_GDEF_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-gpos-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-gpos-table.hh
new file mode 100644
index 0000000..e17a282
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-gpos-table.hh
@@ -0,0 +1,1759 @@
+/*
+ * Copyright © 2007,2008,2009,2010  Red Hat, Inc.
+ * Copyright © 2010,2012,2013  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_LAYOUT_GPOS_TABLE_HH
+#define HB_OT_LAYOUT_GPOS_TABLE_HH
+
+#include "hb-ot-layout-gsubgpos.hh"
+
+
+namespace OT {
+
+
+/* buffer **position** var allocations */
+#define attach_chain() var.i16[0] /* glyph to which this attaches to, relative to current glyphs; negative for going back, positive for forward. */
+#define attach_type() var.u8[2] /* attachment type */
+/* Note! if attach_chain() is zero, the value of attach_type() is irrelevant. */
+
+enum attach_type_t {
+  ATTACH_TYPE_NONE	= 0X00,
+
+  /* Each attachment should be either a mark or a cursive; can't be both. */
+  ATTACH_TYPE_MARK	= 0X01,
+  ATTACH_TYPE_CURSIVE	= 0X02,
+};
+
+
+/* Shared Tables: ValueRecord, Anchor Table, and MarkArray */
+
+typedef HBUINT16 Value;
+
+typedef UnsizedArrayOf<Value> ValueRecord;
+
+struct ValueFormat : HBUINT16
+{
+  enum Flags {
+    xPlacement	= 0x0001u,	/* Includes horizontal adjustment for placement */
+    yPlacement	= 0x0002u,	/* Includes vertical adjustment for placement */
+    xAdvance	= 0x0004u,	/* Includes horizontal adjustment for advance */
+    yAdvance	= 0x0008u,	/* Includes vertical adjustment for advance */
+    xPlaDevice	= 0x0010u,	/* Includes horizontal Device table for placement */
+    yPlaDevice	= 0x0020u,	/* Includes vertical Device table for placement */
+    xAdvDevice	= 0x0040u,	/* Includes horizontal Device table for advance */
+    yAdvDevice	= 0x0080u,	/* Includes vertical Device table for advance */
+    ignored	= 0x0F00u,	/* Was used in TrueType Open for MM fonts */
+    reserved	= 0xF000u,	/* For future use */
+
+    devices	= 0x00F0u	/* Mask for having any Device table */
+  };
+
+/* All fields are options.  Only those available advance the value pointer. */
+#if 0
+  HBINT16		xPlacement;		/* Horizontal adjustment for
+					 * placement--in design units */
+  HBINT16		yPlacement;		/* Vertical adjustment for
+					 * placement--in design units */
+  HBINT16		xAdvance;		/* Horizontal adjustment for
+					 * advance--in design units (only used
+					 * for horizontal writing) */
+  HBINT16		yAdvance;		/* Vertical adjustment for advance--in
+					 * design units (only used for vertical
+					 * writing) */
+  OffsetTo<Device>	xPlaDevice;	/* Offset to Device table for
+					 * horizontal placement--measured from
+					 * beginning of PosTable (may be NULL) */
+  OffsetTo<Device>	yPlaDevice;	/* Offset to Device table for vertical
+					 * placement--measured from beginning
+					 * of PosTable (may be NULL) */
+  OffsetTo<Device>	xAdvDevice;	/* Offset to Device table for
+					 * horizontal advance--measured from
+					 * beginning of PosTable (may be NULL) */
+  OffsetTo<Device>	yAdvDevice;	/* Offset to Device table for vertical
+					 * advance--measured from beginning of
+					 * PosTable (may be NULL) */
+#endif
+
+  unsigned int get_len () const  { return hb_popcount ((unsigned int) *this); }
+  unsigned int get_size () const { return get_len () * Value::static_size; }
+
+  bool apply_value (hb_ot_apply_context_t   *c,
+		    const void           *base,
+		    const Value          *values,
+		    hb_glyph_position_t  &glyph_pos) const
+  {
+    bool ret = false;
+    unsigned int format = *this;
+    if (!format) return ret;
+
+    hb_font_t *font = c->font;
+    bool horizontal = HB_DIRECTION_IS_HORIZONTAL (c->direction);
+
+    if (format & xPlacement) glyph_pos.x_offset  += font->em_scale_x (get_short (values++, &ret));
+    if (format & yPlacement) glyph_pos.y_offset  += font->em_scale_y (get_short (values++, &ret));
+    if (format & xAdvance) {
+      if (likely (horizontal)) glyph_pos.x_advance += font->em_scale_x (get_short (values, &ret));
+      values++;
+    }
+    /* y_advance values grow downward but font-space grows upward, hence negation */
+    if (format & yAdvance) {
+      if (unlikely (!horizontal)) glyph_pos.y_advance -= font->em_scale_y (get_short (values, &ret));
+      values++;
+    }
+
+    if (!has_device ()) return ret;
+
+    bool use_x_device = font->x_ppem || font->num_coords;
+    bool use_y_device = font->y_ppem || font->num_coords;
+
+    if (!use_x_device && !use_y_device) return ret;
+
+    const VariationStore &store = c->var_store;
+
+    /* pixel -> fractional pixel */
+    if (format & xPlaDevice) {
+      if (use_x_device) glyph_pos.x_offset  += (base + get_device (values, &ret)).get_x_delta (font, store);
+      values++;
+    }
+    if (format & yPlaDevice) {
+      if (use_y_device) glyph_pos.y_offset  += (base + get_device (values, &ret)).get_y_delta (font, store);
+      values++;
+    }
+    if (format & xAdvDevice) {
+      if (horizontal && use_x_device) glyph_pos.x_advance += (base + get_device (values, &ret)).get_x_delta (font, store);
+      values++;
+    }
+    if (format & yAdvDevice) {
+      /* y_advance values grow downward but font-space grows upward, hence negation */
+      if (!horizontal && use_y_device) glyph_pos.y_advance -= (base + get_device (values, &ret)).get_y_delta (font, store);
+      values++;
+    }
+    return ret;
+  }
+
+  private:
+  bool sanitize_value_devices (hb_sanitize_context_t *c, const void *base, const Value *values) const
+  {
+    unsigned int format = *this;
+
+    if (format & xPlacement) values++;
+    if (format & yPlacement) values++;
+    if (format & xAdvance)   values++;
+    if (format & yAdvance)   values++;
+
+    if ((format & xPlaDevice) && !get_device (values++).sanitize (c, base)) return false;
+    if ((format & yPlaDevice) && !get_device (values++).sanitize (c, base)) return false;
+    if ((format & xAdvDevice) && !get_device (values++).sanitize (c, base)) return false;
+    if ((format & yAdvDevice) && !get_device (values++).sanitize (c, base)) return false;
+
+    return true;
+  }
+
+  static OffsetTo<Device>& get_device (Value* value)
+  { return *CastP<OffsetTo<Device> > (value); }
+  static const OffsetTo<Device>& get_device (const Value* value, bool *worked=nullptr)
+  {
+    if (worked) *worked |= bool (*value);
+    return *CastP<OffsetTo<Device> > (value);
+  }
+
+  static const HBINT16& get_short (const Value* value, bool *worked=nullptr)
+  {
+    if (worked) *worked |= bool (*value);
+    return *CastP<HBINT16> (value);
+  }
+
+  public:
+
+  bool has_device () const
+  {
+    unsigned int format = *this;
+    return (format & devices) != 0;
+  }
+
+  bool sanitize_value (hb_sanitize_context_t *c, const void *base, const Value *values) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_range (values, get_size ()) && (!has_device () || sanitize_value_devices (c, base, values)));
+  }
+
+  bool sanitize_values (hb_sanitize_context_t *c, const void *base, const Value *values, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    unsigned int len = get_len ();
+
+    if (!c->check_range (values, count, get_size ())) return_trace (false);
+
+    if (!has_device ()) return_trace (true);
+
+    for (unsigned int i = 0; i < count; i++) {
+      if (!sanitize_value_devices (c, base, values))
+	return_trace (false);
+      values += len;
+    }
+
+    return_trace (true);
+  }
+
+  /* Just sanitize referenced Device tables.  Doesn't check the values themselves. */
+  bool sanitize_values_stride_unsafe (hb_sanitize_context_t *c, const void *base, const Value *values, unsigned int count, unsigned int stride) const
+  {
+    TRACE_SANITIZE (this);
+
+    if (!has_device ()) return_trace (true);
+
+    for (unsigned int i = 0; i < count; i++) {
+      if (!sanitize_value_devices (c, base, values))
+	return_trace (false);
+      values += stride;
+    }
+
+    return_trace (true);
+  }
+};
+
+
+struct AnchorFormat1
+{
+  void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
+		   float *x, float *y) const
+  {
+    hb_font_t *font = c->font;
+    *x = font->em_fscale_x (xCoordinate);
+    *y = font->em_fscale_y (yCoordinate);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  FWORD		xCoordinate;		/* Horizontal value--in design units */
+  FWORD		yCoordinate;		/* Vertical value--in design units */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct AnchorFormat2
+{
+  void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id,
+		   float *x, float *y) const
+  {
+    hb_font_t *font = c->font;
+    unsigned int x_ppem = font->x_ppem;
+    unsigned int y_ppem = font->y_ppem;
+    hb_position_t cx = 0, cy = 0;
+    bool ret;
+
+    ret = (x_ppem || y_ppem) &&
+	  font->get_glyph_contour_point_for_origin (glyph_id, anchorPoint, HB_DIRECTION_LTR, &cx, &cy);
+    *x = ret && x_ppem ? cx : font->em_fscale_x (xCoordinate);
+    *y = ret && y_ppem ? cy : font->em_fscale_y (yCoordinate);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 2 */
+  FWORD		xCoordinate;		/* Horizontal value--in design units */
+  FWORD		yCoordinate;		/* Vertical value--in design units */
+  HBUINT16	anchorPoint;		/* Index to glyph contour point */
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct AnchorFormat3
+{
+  void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
+		   float *x, float *y) const
+  {
+    hb_font_t *font = c->font;
+    *x = font->em_fscale_x (xCoordinate);
+    *y = font->em_fscale_y (yCoordinate);
+
+    if (font->x_ppem || font->num_coords)
+      *x += (this+xDeviceTable).get_x_delta (font, c->var_store);
+    if (font->y_ppem || font->num_coords)
+      *y += (this+yDeviceTable).get_y_delta (font, c->var_store);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && xDeviceTable.sanitize (c, this) && yDeviceTable.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 3 */
+  FWORD		xCoordinate;		/* Horizontal value--in design units */
+  FWORD		yCoordinate;		/* Vertical value--in design units */
+  OffsetTo<Device>
+		xDeviceTable;		/* Offset to Device table for X
+					 * coordinate-- from beginning of
+					 * Anchor table (may be NULL) */
+  OffsetTo<Device>
+		yDeviceTable;		/* Offset to Device table for Y
+					 * coordinate-- from beginning of
+					 * Anchor table (may be NULL) */
+  public:
+  DEFINE_SIZE_STATIC (10);
+};
+
+struct Anchor
+{
+  void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id,
+		   float *x, float *y) const
+  {
+    *x = *y = 0;
+    switch (u.format) {
+    case 1: u.format1.get_anchor (c, glyph_id, x, y); return;
+    case 2: u.format2.get_anchor (c, glyph_id, x, y); return;
+    case 3: u.format3.get_anchor (c, glyph_id, x, y); return;
+    default:					      return;
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format) {
+    case 1: return_trace (u.format1.sanitize (c));
+    case 2: return_trace (u.format2.sanitize (c));
+    case 3: return_trace (u.format3.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  AnchorFormat1		format1;
+  AnchorFormat2		format2;
+  AnchorFormat3		format3;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+
+struct AnchorMatrix
+{
+  const Anchor& get_anchor (unsigned int row, unsigned int col,
+			    unsigned int cols, bool *found) const
+  {
+    *found = false;
+    if (unlikely (row >= rows || col >= cols)) return Null(Anchor);
+    *found = !matrixZ[row * cols + col].is_null ();
+    return this+matrixZ[row * cols + col];
+  }
+
+  bool sanitize (hb_sanitize_context_t *c, unsigned int cols) const
+  {
+    TRACE_SANITIZE (this);
+    if (!c->check_struct (this)) return_trace (false);
+    if (unlikely (hb_unsigned_mul_overflows (rows, cols))) return_trace (false);
+    unsigned int count = rows * cols;
+    if (!c->check_array (matrixZ.arrayZ, count)) return_trace (false);
+    for (unsigned int i = 0; i < count; i++)
+      if (!matrixZ[i].sanitize (c, this)) return_trace (false);
+    return_trace (true);
+  }
+
+  HBUINT16	rows;			/* Number of rows */
+  protected:
+  UnsizedArrayOf<OffsetTo<Anchor> >
+		matrixZ;		/* Matrix of offsets to Anchor tables--
+					 * from beginning of AnchorMatrix table */
+  public:
+  DEFINE_SIZE_ARRAY (2, matrixZ);
+};
+
+
+struct MarkRecord
+{
+  friend struct MarkArray;
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && markAnchor.sanitize (c, base));
+  }
+
+  protected:
+  HBUINT16	klass;			/* Class defined for this mark */
+  OffsetTo<Anchor>
+		markAnchor;		/* Offset to Anchor table--from
+					 * beginning of MarkArray table */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct MarkArray : ArrayOf<MarkRecord>	/* Array of MarkRecords--in Coverage order */
+{
+  bool apply (hb_ot_apply_context_t *c,
+	      unsigned int mark_index, unsigned int glyph_index,
+	      const AnchorMatrix &anchors, unsigned int class_count,
+	      unsigned int glyph_pos) const
+  {
+    TRACE_APPLY (this);
+    hb_buffer_t *buffer = c->buffer;
+    const MarkRecord &record = ArrayOf<MarkRecord>::operator[](mark_index);
+    unsigned int mark_class = record.klass;
+
+    const Anchor& mark_anchor = this + record.markAnchor;
+    bool found;
+    const Anchor& glyph_anchor = anchors.get_anchor (glyph_index, mark_class, class_count, &found);
+    /* If this subtable doesn't have an anchor for this base and this class,
+     * return false such that the subsequent subtables have a chance at it. */
+    if (unlikely (!found)) return_trace (false);
+
+    float mark_x, mark_y, base_x, base_y;
+
+    buffer->unsafe_to_break (glyph_pos, buffer->idx);
+    mark_anchor.get_anchor (c, buffer->cur().codepoint, &mark_x, &mark_y);
+    glyph_anchor.get_anchor (c, buffer->info[glyph_pos].codepoint, &base_x, &base_y);
+
+    hb_glyph_position_t &o = buffer->cur_pos();
+    o.x_offset = round (base_x - mark_x);
+    o.y_offset = round (base_y - mark_y);
+    o.attach_type() = ATTACH_TYPE_MARK;
+    o.attach_chain() = (int) glyph_pos - (int) buffer->idx;
+    buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
+
+    buffer->idx++;
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (ArrayOf<MarkRecord>::sanitize (c, this));
+  }
+};
+
+
+/* Lookups */
+
+struct SinglePosFormat1
+{
+  bool intersects (const hb_set_t *glyphs) const
+  { return (this+coverage).intersects (glyphs); }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  { if (unlikely (!(this+coverage).add_coverage (c->input))) return; }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    hb_buffer_t *buffer = c->buffer;
+    unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    valueFormat.apply_value (c, this, values, buffer->cur_pos());
+
+    buffer->idx++;
+    return_trace (true);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  coverage.sanitize (c, this) &&
+		  valueFormat.sanitize_value (c, this, values));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of subtable */
+  ValueFormat	valueFormat;		/* Defines the types of data in the
+					 * ValueRecord */
+  ValueRecord	values;			/* Defines positioning
+					 * value(s)--applied to all glyphs in
+					 * the Coverage table */
+  public:
+  DEFINE_SIZE_ARRAY (6, values);
+};
+
+struct SinglePosFormat2
+{
+  bool intersects (const hb_set_t *glyphs) const
+  { return (this+coverage).intersects (glyphs); }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  { if (unlikely (!(this+coverage).add_coverage (c->input))) return; }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    hb_buffer_t *buffer = c->buffer;
+    unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    if (likely (index >= valueCount)) return_trace (false);
+
+    valueFormat.apply_value (c, this,
+			     &values[index * valueFormat.get_len ()],
+			     buffer->cur_pos());
+
+    buffer->idx++;
+    return_trace (true);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  coverage.sanitize (c, this) &&
+		  valueFormat.sanitize_values (c, this, values, valueCount));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 2 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of subtable */
+  ValueFormat	valueFormat;		/* Defines the types of data in the
+					 * ValueRecord */
+  HBUINT16	valueCount;		/* Number of ValueRecords */
+  ValueRecord	values;			/* Array of ValueRecords--positioning
+					 * values applied to glyphs */
+  public:
+  DEFINE_SIZE_ARRAY (8, values);
+};
+
+struct SinglePos
+{
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1));
+    case 2: return_trace (c->dispatch (u.format2));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  SinglePosFormat1	format1;
+  SinglePosFormat2	format2;
+  } u;
+};
+
+
+struct PairValueRecord
+{
+  friend struct PairSet;
+
+  protected:
+  GlyphID	secondGlyph;		/* GlyphID of second glyph in the
+					 * pair--first glyph is listed in the
+					 * Coverage table */
+  ValueRecord	values;			/* Positioning data for the first glyph
+					 * followed by for second glyph */
+  public:
+  DEFINE_SIZE_ARRAY (2, values);
+};
+
+struct PairSet
+{
+  friend struct PairPosFormat1;
+
+  bool intersects (const hb_set_t *glyphs,
+			  const ValueFormat *valueFormats) const
+  {
+    unsigned int len1 = valueFormats[0].get_len ();
+    unsigned int len2 = valueFormats[1].get_len ();
+    unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2);
+
+    const PairValueRecord *record = &firstPairValueRecord;
+    unsigned int count = len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (glyphs->has (record->secondGlyph))
+	return true;
+      record = &StructAtOffset<const PairValueRecord> (record, record_size);
+    }
+    return false;
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c,
+			      const ValueFormat *valueFormats) const
+  {
+    unsigned int len1 = valueFormats[0].get_len ();
+    unsigned int len2 = valueFormats[1].get_len ();
+    unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2);
+
+    const PairValueRecord *record = &firstPairValueRecord;
+    c->input->add_array (&record->secondGlyph, len, record_size);
+  }
+
+  bool apply (hb_ot_apply_context_t *c,
+		     const ValueFormat *valueFormats,
+		     unsigned int pos) const
+  {
+    TRACE_APPLY (this);
+    hb_buffer_t *buffer = c->buffer;
+    unsigned int len1 = valueFormats[0].get_len ();
+    unsigned int len2 = valueFormats[1].get_len ();
+    unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2);
+
+    unsigned int count = len;
+
+    /* Hand-coded bsearch. */
+    if (unlikely (!count))
+      return_trace (false);
+    hb_codepoint_t x = buffer->info[pos].codepoint;
+    int min = 0, max = (int) count - 1;
+    while (min <= max)
+    {
+      int mid = ((unsigned int) min + (unsigned int) max) / 2;
+      const PairValueRecord *record = &StructAtOffset<PairValueRecord> (&firstPairValueRecord, record_size * mid);
+      hb_codepoint_t mid_x = record->secondGlyph;
+      if (x < mid_x)
+	max = mid - 1;
+      else if (x > mid_x)
+	min = mid + 1;
+      else
+      {
+	/* Note the intentional use of "|" instead of short-circuit "||". */
+	if (valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos()) |
+	    valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]))
+	  buffer->unsafe_to_break (buffer->idx, pos + 1);
+	if (len2)
+	  pos++;
+	buffer->idx = pos;
+	return_trace (true);
+      }
+    }
+
+    return_trace (false);
+  }
+
+  struct sanitize_closure_t
+  {
+    const void *base;
+    const ValueFormat *valueFormats;
+    unsigned int len1; /* valueFormats[0].get_len() */
+    unsigned int stride; /* 1 + len1 + len2 */
+  };
+
+  bool sanitize (hb_sanitize_context_t *c, const sanitize_closure_t *closure) const
+  {
+    TRACE_SANITIZE (this);
+    if (!(c->check_struct (this)
+       && c->check_range (&firstPairValueRecord,
+			  len,
+			  HBUINT16::static_size,
+			  closure->stride))) return_trace (false);
+
+    unsigned int count = len;
+    const PairValueRecord *record = &firstPairValueRecord;
+    return_trace (closure->valueFormats[0].sanitize_values_stride_unsafe (c, closure->base, &record->values[0], count, closure->stride) &&
+		  closure->valueFormats[1].sanitize_values_stride_unsafe (c, closure->base, &record->values[closure->len1], count, closure->stride));
+  }
+
+  protected:
+  HBUINT16		len;	/* Number of PairValueRecords */
+  PairValueRecord	firstPairValueRecord;
+				/* Array of PairValueRecords--ordered
+				 * by GlyphID of the second glyph */
+  public:
+  DEFINE_SIZE_MIN (2);
+};
+
+struct PairPosFormat1
+{
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    unsigned int count = pairSet.len;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+	break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
+      if (glyphs->has (iter.get_glyph ()) &&
+	  (this+pairSet[iter.get_coverage ()]).intersects (glyphs, valueFormat))
+	return true;
+    }
+    return false;
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    unsigned int count = pairSet.len;
+    for (unsigned int i = 0; i < count; i++)
+      (this+pairSet[i]).collect_glyphs (c, valueFormat);
+  }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    hb_buffer_t *buffer = c->buffer;
+    unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    skippy_iter.reset (buffer->idx, 1);
+    if (!skippy_iter.next ()) return_trace (false);
+
+    return_trace ((this+pairSet[index]).apply (c, valueFormat, skippy_iter.idx));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+
+    if (!c->check_struct (this)) return_trace (false);
+
+    unsigned int len1 = valueFormat[0].get_len ();
+    unsigned int len2 = valueFormat[1].get_len ();
+    PairSet::sanitize_closure_t closure =
+    {
+      this,
+      valueFormat,
+      len1,
+      1 + len1 + len2
+    };
+
+    return_trace (coverage.sanitize (c, this) && pairSet.sanitize (c, this, &closure));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of subtable */
+  ValueFormat	valueFormat[2];		/* [0] Defines the types of data in
+					 * ValueRecord1--for the first glyph
+					 * in the pair--may be zero (0) */
+					/* [1] Defines the types of data in
+					 * ValueRecord2--for the second glyph
+					 * in the pair--may be zero (0) */
+  OffsetArrayOf<PairSet>
+		pairSet;		/* Array of PairSet tables
+					 * ordered by Coverage Index */
+  public:
+  DEFINE_SIZE_ARRAY (10, pairSet);
+};
+
+struct PairPosFormat2
+{
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    return (this+coverage).intersects (glyphs) &&
+	   (this+classDef2).intersects (glyphs);
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+classDef2).add_coverage (c->input))) return;
+  }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    hb_buffer_t *buffer = c->buffer;
+    unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    skippy_iter.reset (buffer->idx, 1);
+    if (!skippy_iter.next ()) return_trace (false);
+
+    unsigned int len1 = valueFormat1.get_len ();
+    unsigned int len2 = valueFormat2.get_len ();
+    unsigned int record_len = len1 + len2;
+
+    unsigned int klass1 = (this+classDef1).get_class (buffer->cur().codepoint);
+    unsigned int klass2 = (this+classDef2).get_class (buffer->info[skippy_iter.idx].codepoint);
+    if (unlikely (klass1 >= class1Count || klass2 >= class2Count)) return_trace (false);
+
+    const Value *v = &values[record_len * (klass1 * class2Count + klass2)];
+    /* Note the intentional use of "|" instead of short-circuit "||". */
+    if (valueFormat1.apply_value (c, this, v, buffer->cur_pos()) |
+	valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]))
+      buffer->unsafe_to_break (buffer->idx, skippy_iter.idx + 1);
+
+    buffer->idx = skippy_iter.idx;
+    if (len2)
+      buffer->idx++;
+
+    return_trace (true);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!(c->check_struct (this)
+       && coverage.sanitize (c, this)
+       && classDef1.sanitize (c, this)
+       && classDef2.sanitize (c, this))) return_trace (false);
+
+    unsigned int len1 = valueFormat1.get_len ();
+    unsigned int len2 = valueFormat2.get_len ();
+    unsigned int stride = len1 + len2;
+    unsigned int record_size = valueFormat1.get_size () + valueFormat2.get_size ();
+    unsigned int count = (unsigned int) class1Count * (unsigned int) class2Count;
+    return_trace (c->check_range ((const void *) values,
+				  count,
+				  record_size) &&
+		  valueFormat1.sanitize_values_stride_unsafe (c, this, &values[0], count, stride) &&
+		  valueFormat2.sanitize_values_stride_unsafe (c, this, &values[len1], count, stride));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 2 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of subtable */
+  ValueFormat	valueFormat1;		/* ValueRecord definition--for the
+					 * first glyph of the pair--may be zero
+					 * (0) */
+  ValueFormat	valueFormat2;		/* ValueRecord definition--for the
+					 * second glyph of the pair--may be
+					 * zero (0) */
+  OffsetTo<ClassDef>
+		classDef1;		/* Offset to ClassDef table--from
+					 * beginning of PairPos subtable--for
+					 * the first glyph of the pair */
+  OffsetTo<ClassDef>
+		classDef2;		/* Offset to ClassDef table--from
+					 * beginning of PairPos subtable--for
+					 * the second glyph of the pair */
+  HBUINT16	class1Count;		/* Number of classes in ClassDef1
+					 * table--includes Class0 */
+  HBUINT16	class2Count;		/* Number of classes in ClassDef2
+					 * table--includes Class0 */
+  ValueRecord	values;			/* Matrix of value pairs:
+					 * class1-major, class2-minor,
+					 * Each entry has value1 and value2 */
+  public:
+  DEFINE_SIZE_ARRAY (16, values);
+};
+
+struct PairPos
+{
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1));
+    case 2: return_trace (c->dispatch (u.format2));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  PairPosFormat1	format1;
+  PairPosFormat2	format2;
+  } u;
+};
+
+
+struct EntryExitRecord
+{
+  friend struct CursivePosFormat1;
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (entryAnchor.sanitize (c, base) && exitAnchor.sanitize (c, base));
+  }
+
+  protected:
+  OffsetTo<Anchor>
+		entryAnchor;		/* Offset to EntryAnchor table--from
+					 * beginning of CursivePos
+					 * subtable--may be NULL */
+  OffsetTo<Anchor>
+		exitAnchor;		/* Offset to ExitAnchor table--from
+					 * beginning of CursivePos
+					 * subtable--may be NULL */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+static void
+reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction, unsigned int new_parent);
+
+struct CursivePosFormat1
+{
+  bool intersects (const hb_set_t *glyphs) const
+  { return (this+coverage).intersects (glyphs); }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  { if (unlikely (!(this+coverage).add_coverage (c->input))) return; }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    hb_buffer_t *buffer = c->buffer;
+
+    const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage  (buffer->cur().codepoint)];
+    if (!this_record.entryAnchor) return_trace (false);
+
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    skippy_iter.reset (buffer->idx, 1);
+    if (!skippy_iter.prev ()) return_trace (false);
+
+    const EntryExitRecord &prev_record = entryExitRecord[(this+coverage).get_coverage  (buffer->info[skippy_iter.idx].codepoint)];
+    if (!prev_record.exitAnchor) return_trace (false);
+
+    unsigned int i = skippy_iter.idx;
+    unsigned int j = buffer->idx;
+
+    buffer->unsafe_to_break (i, j);
+    float entry_x, entry_y, exit_x, exit_y;
+    (this+prev_record.exitAnchor).get_anchor (c, buffer->info[i].codepoint, &exit_x, &exit_y);
+    (this+this_record.entryAnchor).get_anchor (c, buffer->info[j].codepoint, &entry_x, &entry_y);
+
+    hb_glyph_position_t *pos = buffer->pos;
+
+    hb_position_t d;
+    /* Main-direction adjustment */
+    switch (c->direction) {
+      case HB_DIRECTION_LTR:
+	pos[i].x_advance  = round (exit_x) + pos[i].x_offset;
+
+	d = round (entry_x) + pos[j].x_offset;
+	pos[j].x_advance -= d;
+	pos[j].x_offset  -= d;
+	break;
+      case HB_DIRECTION_RTL:
+	d = round (exit_x) + pos[i].x_offset;
+	pos[i].x_advance -= d;
+	pos[i].x_offset  -= d;
+
+	pos[j].x_advance  = round (entry_x) + pos[j].x_offset;
+	break;
+      case HB_DIRECTION_TTB:
+	pos[i].y_advance  = round (exit_y) + pos[i].y_offset;
+
+	d = round (entry_y) + pos[j].y_offset;
+	pos[j].y_advance -= d;
+	pos[j].y_offset  -= d;
+	break;
+      case HB_DIRECTION_BTT:
+	d = round (exit_y) + pos[i].y_offset;
+	pos[i].y_advance -= d;
+	pos[i].y_offset  -= d;
+
+	pos[j].y_advance  = round (entry_y);
+	break;
+      case HB_DIRECTION_INVALID:
+      default:
+	break;
+    }
+
+    /* Cross-direction adjustment */
+
+    /* We attach child to parent (think graph theory and rooted trees whereas
+     * the root stays on baseline and each node aligns itself against its
+     * parent.
+     *
+     * Optimize things for the case of RightToLeft, as that's most common in
+     * Arabic. */
+    unsigned int child  = i;
+    unsigned int parent = j;
+    hb_position_t x_offset = entry_x - exit_x;
+    hb_position_t y_offset = entry_y - exit_y;
+    if  (!(c->lookup_props & LookupFlag::RightToLeft))
+    {
+      unsigned int k = child;
+      child = parent;
+      parent = k;
+      x_offset = -x_offset;
+      y_offset = -y_offset;
+    }
+
+    /* If child was already connected to someone else, walk through its old
+     * chain and reverse the link direction, such that the whole tree of its
+     * previous connection now attaches to new parent.  Watch out for case
+     * where new parent is on the path from old chain...
+     */
+    reverse_cursive_minor_offset (pos, child, c->direction, parent);
+
+    pos[child].attach_type() = ATTACH_TYPE_CURSIVE;
+    pos[child].attach_chain() = (int) parent - (int) child;
+    buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
+    if (likely (HB_DIRECTION_IS_HORIZONTAL (c->direction)))
+      pos[child].y_offset = y_offset;
+    else
+      pos[child].x_offset = x_offset;
+
+    buffer->idx++;
+    return_trace (true);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (coverage.sanitize (c, this) && entryExitRecord.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of subtable */
+  ArrayOf<EntryExitRecord>
+		entryExitRecord;	/* Array of EntryExit records--in
+					 * Coverage Index order */
+  public:
+  DEFINE_SIZE_ARRAY (6, entryExitRecord);
+};
+
+struct CursivePos
+{
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  CursivePosFormat1	format1;
+  } u;
+};
+
+
+typedef AnchorMatrix BaseArray;		/* base-major--
+					 * in order of BaseCoverage Index--,
+					 * mark-minor--
+					 * ordered by class--zero-based. */
+
+struct MarkBasePosFormat1
+{
+  bool intersects (const hb_set_t *glyphs) const
+  { return (this+markCoverage).intersects (glyphs) &&
+	   (this+baseCoverage).intersects (glyphs); }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    if (unlikely (!(this+markCoverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+baseCoverage).add_coverage (c->input))) return;
+  }
+
+  const Coverage &get_coverage () const { return this+markCoverage; }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    hb_buffer_t *buffer = c->buffer;
+    unsigned int mark_index = (this+markCoverage).get_coverage  (buffer->cur().codepoint);
+    if (likely (mark_index == NOT_COVERED)) return_trace (false);
+
+    /* Now we search backwards for a non-mark glyph */
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    skippy_iter.reset (buffer->idx, 1);
+    skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
+    do {
+      if (!skippy_iter.prev ()) return_trace (false);
+      /* We only want to attach to the first of a MultipleSubst sequence.
+       * https://github.com/harfbuzz/harfbuzz/issues/740
+       * Reject others...
+       * ...but stop if we find a mark in the MultipleSubst sequence:
+       * https://github.com/harfbuzz/harfbuzz/issues/1020 */
+      if (!_hb_glyph_info_multiplied (&buffer->info[skippy_iter.idx]) ||
+	  0 == _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]) ||
+	  (skippy_iter.idx == 0 ||
+	   _hb_glyph_info_is_mark (&buffer->info[skippy_iter.idx - 1]) ||
+	   _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx]) !=
+	   _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx - 1]) ||
+	   _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]) !=
+	   _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx - 1]) + 1
+	   ))
+	break;
+      skippy_iter.reject ();
+    } while (true);
+
+    /* Checking that matched glyph is actually a base glyph by GDEF is too strong; disabled */
+    //if (!_hb_glyph_info_is_base_glyph (&buffer->info[skippy_iter.idx])) { return_trace (false); }
+
+    unsigned int base_index = (this+baseCoverage).get_coverage  (buffer->info[skippy_iter.idx].codepoint);
+    if (base_index == NOT_COVERED) return_trace (false);
+
+    return_trace ((this+markArray).apply (c, mark_index, base_index, this+baseArray, classCount, skippy_iter.idx));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  markCoverage.sanitize (c, this) &&
+		  baseCoverage.sanitize (c, this) &&
+		  markArray.sanitize (c, this) &&
+		  baseArray.sanitize (c, this, (unsigned int) classCount));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  OffsetTo<Coverage>
+		markCoverage;		/* Offset to MarkCoverage table--from
+					 * beginning of MarkBasePos subtable */
+  OffsetTo<Coverage>
+		baseCoverage;		/* Offset to BaseCoverage table--from
+					 * beginning of MarkBasePos subtable */
+  HBUINT16	classCount;		/* Number of classes defined for marks */
+  OffsetTo<MarkArray>
+		markArray;		/* Offset to MarkArray table--from
+					 * beginning of MarkBasePos subtable */
+  OffsetTo<BaseArray>
+		baseArray;		/* Offset to BaseArray table--from
+					 * beginning of MarkBasePos subtable */
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+struct MarkBasePos
+{
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  MarkBasePosFormat1	format1;
+  } u;
+};
+
+
+typedef AnchorMatrix LigatureAttach;	/* component-major--
+					 * in order of writing direction--,
+					 * mark-minor--
+					 * ordered by class--zero-based. */
+
+typedef OffsetListOf<LigatureAttach> LigatureArray;
+					/* Array of LigatureAttach
+					 * tables ordered by
+					 * LigatureCoverage Index */
+
+struct MarkLigPosFormat1
+{
+  bool intersects (const hb_set_t *glyphs) const
+  { return (this+markCoverage).intersects (glyphs) &&
+	   (this+ligatureCoverage).intersects (glyphs); }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    if (unlikely (!(this+markCoverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+ligatureCoverage).add_coverage (c->input))) return;
+  }
+
+  const Coverage &get_coverage () const { return this+markCoverage; }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    hb_buffer_t *buffer = c->buffer;
+    unsigned int mark_index = (this+markCoverage).get_coverage  (buffer->cur().codepoint);
+    if (likely (mark_index == NOT_COVERED)) return_trace (false);
+
+    /* Now we search backwards for a non-mark glyph */
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    skippy_iter.reset (buffer->idx, 1);
+    skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
+    if (!skippy_iter.prev ()) return_trace (false);
+
+    /* Checking that matched glyph is actually a ligature by GDEF is too strong; disabled */
+    //if (!_hb_glyph_info_is_ligature (&buffer->info[skippy_iter.idx])) { return_trace (false); }
+
+    unsigned int j = skippy_iter.idx;
+    unsigned int lig_index = (this+ligatureCoverage).get_coverage  (buffer->info[j].codepoint);
+    if (lig_index == NOT_COVERED) return_trace (false);
+
+    const LigatureArray& lig_array = this+ligatureArray;
+    const LigatureAttach& lig_attach = lig_array[lig_index];
+
+    /* Find component to attach to */
+    unsigned int comp_count = lig_attach.rows;
+    if (unlikely (!comp_count)) return_trace (false);
+
+    /* We must now check whether the ligature ID of the current mark glyph
+     * is identical to the ligature ID of the found ligature.  If yes, we
+     * can directly use the component index.  If not, we attach the mark
+     * glyph to the last component of the ligature. */
+    unsigned int comp_index;
+    unsigned int lig_id = _hb_glyph_info_get_lig_id (&buffer->info[j]);
+    unsigned int mark_id = _hb_glyph_info_get_lig_id (&buffer->cur());
+    unsigned int mark_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
+    if (lig_id && lig_id == mark_id && mark_comp > 0)
+      comp_index = MIN (comp_count, _hb_glyph_info_get_lig_comp (&buffer->cur())) - 1;
+    else
+      comp_index = comp_count - 1;
+
+    return_trace ((this+markArray).apply (c, mark_index, comp_index, lig_attach, classCount, j));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  markCoverage.sanitize (c, this) &&
+		  ligatureCoverage.sanitize (c, this) &&
+		  markArray.sanitize (c, this) &&
+		  ligatureArray.sanitize (c, this, (unsigned int) classCount));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  OffsetTo<Coverage>
+		markCoverage;		/* Offset to Mark Coverage table--from
+					 * beginning of MarkLigPos subtable */
+  OffsetTo<Coverage>
+		ligatureCoverage;	/* Offset to Ligature Coverage
+					 * table--from beginning of MarkLigPos
+					 * subtable */
+  HBUINT16	classCount;		/* Number of defined mark classes */
+  OffsetTo<MarkArray>
+		markArray;		/* Offset to MarkArray table--from
+					 * beginning of MarkLigPos subtable */
+  OffsetTo<LigatureArray>
+		ligatureArray;		/* Offset to LigatureArray table--from
+					 * beginning of MarkLigPos subtable */
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+struct MarkLigPos
+{
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  MarkLigPosFormat1	format1;
+  } u;
+};
+
+
+typedef AnchorMatrix Mark2Array;	/* mark2-major--
+					 * in order of Mark2Coverage Index--,
+					 * mark1-minor--
+					 * ordered by class--zero-based. */
+
+struct MarkMarkPosFormat1
+{
+  bool intersects (const hb_set_t *glyphs) const
+  { return (this+mark1Coverage).intersects (glyphs) &&
+	   (this+mark2Coverage).intersects (glyphs); }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    if (unlikely (!(this+mark1Coverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+mark2Coverage).add_coverage (c->input))) return;
+  }
+
+  const Coverage &get_coverage () const { return this+mark1Coverage; }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    hb_buffer_t *buffer = c->buffer;
+    unsigned int mark1_index = (this+mark1Coverage).get_coverage  (buffer->cur().codepoint);
+    if (likely (mark1_index == NOT_COVERED)) return_trace (false);
+
+    /* now we search backwards for a suitable mark glyph until a non-mark glyph */
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    skippy_iter.reset (buffer->idx, 1);
+    skippy_iter.set_lookup_props (c->lookup_props & ~LookupFlag::IgnoreFlags);
+    if (!skippy_iter.prev ()) return_trace (false);
+
+    if (!_hb_glyph_info_is_mark (&buffer->info[skippy_iter.idx])) { return_trace (false); }
+
+    unsigned int j = skippy_iter.idx;
+
+    unsigned int id1 = _hb_glyph_info_get_lig_id (&buffer->cur());
+    unsigned int id2 = _hb_glyph_info_get_lig_id (&buffer->info[j]);
+    unsigned int comp1 = _hb_glyph_info_get_lig_comp (&buffer->cur());
+    unsigned int comp2 = _hb_glyph_info_get_lig_comp (&buffer->info[j]);
+
+    if (likely (id1 == id2)) {
+      if (id1 == 0) /* Marks belonging to the same base. */
+	goto good;
+      else if (comp1 == comp2) /* Marks belonging to the same ligature component. */
+	goto good;
+    } else {
+      /* If ligature ids don't match, it may be the case that one of the marks
+       * itself is a ligature.  In which case match. */
+      if ((id1 > 0 && !comp1) || (id2 > 0 && !comp2))
+	goto good;
+    }
+
+    /* Didn't match. */
+    return_trace (false);
+
+    good:
+    unsigned int mark2_index = (this+mark2Coverage).get_coverage  (buffer->info[j].codepoint);
+    if (mark2_index == NOT_COVERED) return_trace (false);
+
+    return_trace ((this+mark1Array).apply (c, mark1_index, mark2_index, this+mark2Array, classCount, j));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  mark1Coverage.sanitize (c, this) &&
+		  mark2Coverage.sanitize (c, this) &&
+		  mark1Array.sanitize (c, this) &&
+		  mark2Array.sanitize (c, this, (unsigned int) classCount));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  OffsetTo<Coverage>
+		mark1Coverage;		/* Offset to Combining Mark1 Coverage
+					 * table--from beginning of MarkMarkPos
+					 * subtable */
+  OffsetTo<Coverage>
+		mark2Coverage;		/* Offset to Combining Mark2 Coverage
+					 * table--from beginning of MarkMarkPos
+					 * subtable */
+  HBUINT16	classCount;		/* Number of defined mark classes */
+  OffsetTo<MarkArray>
+		mark1Array;		/* Offset to Mark1Array table--from
+					 * beginning of MarkMarkPos subtable */
+  OffsetTo<Mark2Array>
+		mark2Array;		/* Offset to Mark2Array table--from
+					 * beginning of MarkMarkPos subtable */
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+struct MarkMarkPos
+{
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  MarkMarkPosFormat1	format1;
+  } u;
+};
+
+
+struct ContextPos : Context {};
+
+struct ChainContextPos : ChainContext {};
+
+struct ExtensionPos : Extension<ExtensionPos>
+{
+  typedef struct PosLookupSubTable SubTable;
+};
+
+
+
+/*
+ * PosLookup
+ */
+
+
+struct PosLookupSubTable
+{
+  friend struct Lookup;
+  friend struct PosLookup;
+
+  enum Type {
+    Single		= 1,
+    Pair		= 2,
+    Cursive		= 3,
+    MarkBase		= 4,
+    MarkLig		= 5,
+    MarkMark		= 6,
+    Context		= 7,
+    ChainContext	= 8,
+    Extension		= 9
+  };
+
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const
+  {
+    TRACE_DISPATCH (this, lookup_type);
+    switch (lookup_type) {
+    case Single:		return_trace (u.single.dispatch (c));
+    case Pair:			return_trace (u.pair.dispatch (c));
+    case Cursive:		return_trace (u.cursive.dispatch (c));
+    case MarkBase:		return_trace (u.markBase.dispatch (c));
+    case MarkLig:		return_trace (u.markLig.dispatch (c));
+    case MarkMark:		return_trace (u.markMark.dispatch (c));
+    case Context:		return_trace (u.context.dispatch (c));
+    case ChainContext:		return_trace (u.chainContext.dispatch (c));
+    case Extension:		return_trace (u.extension.dispatch (c));
+    default:			return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  SinglePos		single;
+  PairPos		pair;
+  CursivePos		cursive;
+  MarkBasePos		markBase;
+  MarkLigPos		markLig;
+  MarkMarkPos		markMark;
+  ContextPos		context;
+  ChainContextPos	chainContext;
+  ExtensionPos		extension;
+  } u;
+  public:
+  DEFINE_SIZE_MIN (0);
+};
+
+
+struct PosLookup : Lookup
+{
+  typedef struct PosLookupSubTable SubTable;
+
+  const SubTable& get_subtable (unsigned int i) const
+  { return Lookup::get_subtable<SubTable> (i); }
+
+  bool is_reverse () const
+  {
+    return false;
+  }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    return_trace (dispatch (c));
+  }
+
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    hb_intersects_context_t c (glyphs);
+    return dispatch (&c);
+  }
+
+  hb_collect_glyphs_context_t::return_t collect_glyphs (hb_collect_glyphs_context_t *c) const
+  { return dispatch (c); }
+
+  template <typename set_t>
+  void add_coverage (set_t *glyphs) const
+  {
+    hb_add_coverage_context_t<set_t> c (glyphs);
+    dispatch (&c);
+  }
+
+  static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index);
+
+  template <typename context_t>
+  static typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
+
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  { return Lookup::dispatch<SubTable> (c); }
+
+  bool subset (hb_subset_context_t *c) const
+  { return Lookup::subset<SubTable> (c); }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  { return Lookup::sanitize<SubTable> (c); }
+};
+
+/*
+ * GPOS -- Glyph Positioning
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/gpos
+ */
+
+struct GPOS : GSUBGPOS
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_GPOS;
+
+  const PosLookup& get_lookup (unsigned int i) const
+  { return CastR<PosLookup> (GSUBGPOS::get_lookup (i)); }
+
+  static inline void position_start (hb_font_t *font, hb_buffer_t *buffer);
+  static inline void position_finish_advances (hb_font_t *font, hb_buffer_t *buffer);
+  static inline void position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer);
+
+  bool subset (hb_subset_context_t *c) const
+  { return GSUBGPOS::subset<PosLookup> (c); }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  { return GSUBGPOS::sanitize<PosLookup> (c); }
+
+  HB_INTERNAL bool is_blacklisted (hb_blob_t *blob,
+				   hb_face_t *face) const;
+
+  typedef GSUBGPOS::accelerator_t<GPOS> accelerator_t;
+};
+
+
+static void
+reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction, unsigned int new_parent)
+{
+  int chain = pos[i].attach_chain(), type = pos[i].attach_type();
+  if (likely (!chain || 0 == (type & ATTACH_TYPE_CURSIVE)))
+    return;
+
+  pos[i].attach_chain() = 0;
+
+  unsigned int j = (int) i + chain;
+
+  /* Stop if we see new parent in the chain. */
+  if (j == new_parent)
+    return;
+
+  reverse_cursive_minor_offset (pos, j, direction, new_parent);
+
+  if (HB_DIRECTION_IS_HORIZONTAL (direction))
+    pos[j].y_offset = -pos[i].y_offset;
+  else
+    pos[j].x_offset = -pos[i].x_offset;
+
+  pos[j].attach_chain() = -chain;
+  pos[j].attach_type() = type;
+}
+static void
+propagate_attachment_offsets (hb_glyph_position_t *pos,
+			      unsigned int len,
+			      unsigned int i,
+			      hb_direction_t direction)
+{
+  /* Adjusts offsets of attached glyphs (both cursive and mark) to accumulate
+   * offset of glyph they are attached to. */
+  int chain = pos[i].attach_chain(), type = pos[i].attach_type();
+  if (likely (!chain))
+    return;
+
+  pos[i].attach_chain() = 0;
+
+  unsigned int j = (int) i + chain;
+
+  if (unlikely (j >= len))
+    return;
+
+  propagate_attachment_offsets (pos, len, j, direction);
+
+  assert (!!(type & ATTACH_TYPE_MARK) ^ !!(type & ATTACH_TYPE_CURSIVE));
+
+  if (type & ATTACH_TYPE_CURSIVE)
+  {
+    if (HB_DIRECTION_IS_HORIZONTAL (direction))
+      pos[i].y_offset += pos[j].y_offset;
+    else
+      pos[i].x_offset += pos[j].x_offset;
+  }
+  else /*if (type & ATTACH_TYPE_MARK)*/
+  {
+    pos[i].x_offset += pos[j].x_offset;
+    pos[i].y_offset += pos[j].y_offset;
+
+    assert (j < i);
+    if (HB_DIRECTION_IS_FORWARD (direction))
+      for (unsigned int k = j; k < i; k++) {
+	pos[i].x_offset -= pos[k].x_advance;
+	pos[i].y_offset -= pos[k].y_advance;
+      }
+    else
+      for (unsigned int k = j + 1; k < i + 1; k++) {
+	pos[i].x_offset += pos[k].x_advance;
+	pos[i].y_offset += pos[k].y_advance;
+      }
+  }
+}
+
+void
+GPOS::position_start (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
+{
+  unsigned int count = buffer->len;
+  for (unsigned int i = 0; i < count; i++)
+    buffer->pos[i].attach_chain() = buffer->pos[i].attach_type() = 0;
+}
+
+void
+GPOS::position_finish_advances (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSED)
+{
+  //_hb_buffer_assert_gsubgpos_vars (buffer);
+}
+
+void
+GPOS::position_finish_offsets (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
+{
+  _hb_buffer_assert_gsubgpos_vars (buffer);
+
+  unsigned int len;
+  hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, &len);
+  hb_direction_t direction = buffer->props.direction;
+
+  /* Handle attachments */
+  if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT)
+    for (unsigned int i = 0; i < len; i++)
+      propagate_attachment_offsets (pos, len, i, direction);
+}
+
+
+struct GPOS_accelerator_t : GPOS::accelerator_t {};
+
+
+/* Out-of-class implementation for methods recursing */
+
+template <typename context_t>
+/*static*/ inline typename context_t::return_t PosLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index)
+{
+  const PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (lookup_index);
+  return l.dispatch (c);
+}
+
+/*static*/ inline bool PosLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index)
+{
+  const PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (lookup_index);
+  unsigned int saved_lookup_props = c->lookup_props;
+  unsigned int saved_lookup_index = c->lookup_index;
+  c->set_lookup_index (lookup_index);
+  c->set_lookup_props (l.get_props ());
+  bool ret = l.dispatch (c);
+  c->set_lookup_index (saved_lookup_index);
+  c->set_lookup_props (saved_lookup_props);
+  return ret;
+}
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_LAYOUT_GPOS_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-gsub-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-gsub-table.hh
new file mode 100644
index 0000000..33b8f0e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-gsub-table.hh
@@ -0,0 +1,1467 @@
+/*
+ * Copyright © 2007,2008,2009,2010  Red Hat, Inc.
+ * Copyright © 2010,2012,2013  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_LAYOUT_GSUB_TABLE_HH
+#define HB_OT_LAYOUT_GSUB_TABLE_HH
+
+#include "hb-ot-layout-gsubgpos.hh"
+
+
+namespace OT {
+
+
+static inline void SingleSubst_serialize (hb_serialize_context_t *c,
+					  hb_array_t<const GlyphID> glyphs,
+					  hb_array_t<const GlyphID> substitutes);
+
+struct SingleSubstFormat1
+{
+  bool intersects (const hb_set_t *glyphs) const
+  { return (this+coverage).intersects (glyphs); }
+
+  void closure (hb_closure_context_t *c) const
+  {
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      /* TODO Switch to range-based API to work around malicious fonts.
+       * https://github.com/harfbuzz/harfbuzz/issues/363 */
+      hb_codepoint_t glyph_id = iter.get_glyph ();
+      if (c->glyphs->has (glyph_id))
+	c->out->add ((glyph_id + deltaGlyphID) & 0xFFFFu);
+    }
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      /* TODO Switch to range-based API to work around malicious fonts.
+       * https://github.com/harfbuzz/harfbuzz/issues/363 */
+      hb_codepoint_t glyph_id = iter.get_glyph ();
+      c->output->add ((glyph_id + deltaGlyphID) & 0xFFFFu);
+    }
+  }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool would_apply (hb_would_apply_context_t *c) const
+  {
+    TRACE_WOULD_APPLY (this);
+    return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
+  }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
+    unsigned int index = (this+coverage).get_coverage (glyph_id);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    /* According to the Adobe Annotated OpenType Suite, result is always
+     * limited to 16bit. */
+    glyph_id = (glyph_id + deltaGlyphID) & 0xFFFFu;
+    c->replace_glyph (glyph_id);
+
+    return_trace (true);
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> glyphs,
+		  int delta)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs))) return_trace (false);
+    deltaGlyphID.set (delta); /* TODO(serialize) overflow? */
+    return_trace (true);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    const hb_set_t &glyphset = *c->plan->glyphset;
+    const hb_map_t &glyph_map = *c->plan->glyph_map;
+    hb_vector_t<GlyphID> from;
+    hb_vector_t<GlyphID> to;
+    hb_codepoint_t delta = deltaGlyphID;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (!glyphset.has (iter.get_glyph ())) continue;
+      from.push ()->set (glyph_map[iter.get_glyph ()]);
+      to.push ()->set (glyph_map[(iter.get_glyph () + delta) & 0xFFFF]);
+    }
+    c->serializer->propagate_error (from, to);
+    SingleSubst_serialize (c->serializer, from, to);
+    return_trace (from.length);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (coverage.sanitize (c, this) && deltaGlyphID.sanitize (c));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of Substitution table */
+  HBINT16	deltaGlyphID;		/* Add to original GlyphID to get
+					 * substitute GlyphID */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct SingleSubstFormat2
+{
+  bool intersects (const hb_set_t *glyphs) const
+  { return (this+coverage).intersects (glyphs); }
+
+  void closure (hb_closure_context_t *c) const
+  {
+    unsigned int count = substitute.len;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
+      if (c->glyphs->has (iter.get_glyph ()))
+	c->out->add (substitute[iter.get_coverage ()]);
+    }
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    unsigned int count = substitute.len;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
+      c->output->add (substitute[iter.get_coverage ()]);
+    }
+  }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool would_apply (hb_would_apply_context_t *c) const
+  {
+    TRACE_WOULD_APPLY (this);
+    return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
+  }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    if (unlikely (index >= substitute.len)) return_trace (false);
+
+    c->replace_glyph (substitute[index]);
+
+    return_trace (true);
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> glyphs,
+		  hb_array_t<const GlyphID> substitutes)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!substitute.serialize (c, substitutes))) return_trace (false);
+    if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs))) return_trace (false);
+    return_trace (true);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    const hb_set_t &glyphset = *c->plan->glyphset;
+    const hb_map_t &glyph_map = *c->plan->glyph_map;
+    hb_vector_t<GlyphID> from;
+    hb_vector_t<GlyphID> to;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (!glyphset.has (iter.get_glyph ())) continue;
+      from.push ()->set (glyph_map[iter.get_glyph ()]);
+      to.push ()->set (glyph_map[substitute[iter.get_coverage ()]]);
+    }
+    c->serializer->propagate_error (from, to);
+    SingleSubst_serialize (c->serializer, from, to);
+    return_trace (from.length);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (coverage.sanitize (c, this) && substitute.sanitize (c));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 2 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of Substitution table */
+  ArrayOf<GlyphID>
+		substitute;		/* Array of substitute
+					 * GlyphIDs--ordered by Coverage Index */
+  public:
+  DEFINE_SIZE_ARRAY (6, substitute);
+};
+
+struct SingleSubst
+{
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> glyphs,
+		  hb_array_t<const GlyphID> substitutes)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (u.format))) return_trace (false);
+    unsigned int format = 2;
+    int delta = 0;
+    if (glyphs.length)
+    {
+      format = 1;
+      /* TODO(serialize) check for wrap-around */
+      delta = substitutes[0] - glyphs[0];
+      for (unsigned int i = 1; i < glyphs.length; i++)
+	if (delta != (int) (substitutes[i] - glyphs[i])) {
+	  format = 2;
+	  break;
+	}
+    }
+    u.format.set (format);
+    switch (u.format) {
+    case 1: return_trace (u.format1.serialize (c, glyphs, delta));
+    case 2: return_trace (u.format2.serialize (c, glyphs, substitutes));
+    default:return_trace (false);
+    }
+  }
+
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1));
+    case 2: return_trace (c->dispatch (u.format2));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  SingleSubstFormat1	format1;
+  SingleSubstFormat2	format2;
+  } u;
+};
+
+static inline void
+SingleSubst_serialize (hb_serialize_context_t *c,
+		       hb_array_t<const GlyphID> glyphs,
+		       hb_array_t<const GlyphID> substitutes)
+{ c->start_embed<SingleSubst> ()->serialize (c, glyphs, substitutes); }
+
+struct Sequence
+{
+  void closure (hb_closure_context_t *c) const
+  {
+    unsigned int count = substitute.len;
+    for (unsigned int i = 0; i < count; i++)
+      c->out->add (substitute[i]);
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  { c->output->add_array (substitute.arrayZ, substitute.len); }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    unsigned int count = substitute.len;
+
+    /* Special-case to make it in-place and not consider this
+     * as a "multiplied" substitution. */
+    if (unlikely (count == 1))
+    {
+      c->replace_glyph (substitute.arrayZ[0]);
+      return_trace (true);
+    }
+    /* Spec disallows this, but Uniscribe allows it.
+     * https://github.com/harfbuzz/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.arrayZ[i], klass);
+    }
+    c->buffer->skip_glyph ();
+
+    return_trace (true);
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> glyphs)
+  {
+    TRACE_SERIALIZE (this);
+    return_trace (substitute.serialize (c, glyphs));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (substitute.sanitize (c));
+  }
+
+  protected:
+  ArrayOf<GlyphID>
+		substitute;		/* String of GlyphIDs to substitute */
+  public:
+  DEFINE_SIZE_ARRAY (2, substitute);
+};
+
+struct MultipleSubstFormat1
+{
+  bool intersects (const hb_set_t *glyphs) const
+  { return (this+coverage).intersects (glyphs); }
+
+  void closure (hb_closure_context_t *c) const
+  {
+    unsigned int count = sequence.len;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
+      if (c->glyphs->has (iter.get_glyph ()))
+	(this+sequence[iter.get_coverage ()]).closure (c);
+    }
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    unsigned int count = sequence.len;
+    for (unsigned int i = 0; i < count; i++)
+      (this+sequence[i]).collect_glyphs (c);
+  }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool would_apply (hb_would_apply_context_t *c) const
+  {
+    TRACE_WOULD_APPLY (this);
+    return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
+  }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    return_trace ((this+sequence[index]).apply (c));
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> glyphs,
+		  hb_array_t<const unsigned int> substitute_len_list,
+		  hb_array_t<const GlyphID> substitute_glyphs_list)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!sequence.serialize (c, glyphs.length))) return_trace (false);
+    for (unsigned int i = 0; i < glyphs.length; i++)
+    {
+      unsigned int substitute_len = substitute_len_list[i];
+      if (unlikely (!sequence[i].serialize (c, this)
+				.serialize (c, substitute_glyphs_list.sub_array (0, substitute_len))))
+	return_trace (false);
+      substitute_glyphs_list += substitute_len;
+    }
+    return_trace (coverage.serialize (c, this).serialize (c, glyphs));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (coverage.sanitize (c, this) && sequence.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of Substitution table */
+  OffsetArrayOf<Sequence>
+		sequence;		/* Array of Sequence tables
+					 * ordered by Coverage Index */
+  public:
+  DEFINE_SIZE_ARRAY (6, sequence);
+};
+
+struct MultipleSubst
+{
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> glyphs,
+		  hb_array_t<const unsigned int> substitute_len_list,
+		  hb_array_t<const GlyphID> substitute_glyphs_list)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (u.format))) return_trace (false);
+    unsigned int format = 1;
+    u.format.set (format);
+    switch (u.format) {
+    case 1: return_trace (u.format1.serialize (c, glyphs, substitute_len_list, substitute_glyphs_list));
+    default:return_trace (false);
+    }
+  }
+
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  MultipleSubstFormat1	format1;
+  } u;
+};
+
+struct AlternateSet
+{
+  void closure (hb_closure_context_t *c) const
+  {
+    unsigned int count = alternates.len;
+    for (unsigned int i = 0; i < count; i++)
+      c->out->add (alternates[i]);
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  { c->output->add_array (alternates.arrayZ, alternates.len); }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    unsigned int count = alternates.len;
+
+    if (unlikely (!count)) return_trace (false);
+
+    hb_mask_t glyph_mask = c->buffer->cur().mask;
+    hb_mask_t lookup_mask = c->lookup_mask;
+
+    /* Note: This breaks badly if two features enabled this lookup together. */
+    unsigned int shift = hb_ctz (lookup_mask);
+    unsigned int alt_index = ((lookup_mask & glyph_mask) >> shift);
+
+    /* If alt_index is MAX, randomize feature if it is the rand feature. */
+    if (alt_index == HB_OT_MAP_MAX_VALUE && c->random)
+      alt_index = c->random_number () % count + 1;
+
+    if (unlikely (alt_index > count || alt_index == 0)) return_trace (false);
+
+    c->replace_glyph (alternates[alt_index - 1]);
+
+    return_trace (true);
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> glyphs)
+  {
+    TRACE_SERIALIZE (this);
+    return_trace (alternates.serialize (c, glyphs));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (alternates.sanitize (c));
+  }
+
+  protected:
+  ArrayOf<GlyphID>
+		alternates;		/* Array of alternate GlyphIDs--in
+					 * arbitrary order */
+  public:
+  DEFINE_SIZE_ARRAY (2, alternates);
+};
+
+struct AlternateSubstFormat1
+{
+  bool intersects (const hb_set_t *glyphs) const
+  { return (this+coverage).intersects (glyphs); }
+
+  void closure (hb_closure_context_t *c) const
+  {
+    unsigned int count = alternateSet.len;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+	break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
+      if (c->glyphs->has (iter.get_glyph ()))
+	(this+alternateSet[iter.get_coverage ()]).closure (c);
+    }
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    unsigned int count = alternateSet.len;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+	break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
+      (this+alternateSet[iter.get_coverage ()]).collect_glyphs (c);
+    }
+  }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool would_apply (hb_would_apply_context_t *c) const
+  {
+    TRACE_WOULD_APPLY (this);
+    return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
+  }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    return_trace ((this+alternateSet[index]).apply (c));
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> glyphs,
+		  hb_array_t<const unsigned int> alternate_len_list,
+		  hb_array_t<const GlyphID> alternate_glyphs_list)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!alternateSet.serialize (c, glyphs.length))) return_trace (false);
+    for (unsigned int i = 0; i < glyphs.length; i++)
+    {
+      unsigned int alternate_len = alternate_len_list[i];
+      if (unlikely (!alternateSet[i].serialize (c, this)
+				    .serialize (c, alternate_glyphs_list.sub_array (0, alternate_len))))
+	return_trace (false);
+      alternate_glyphs_list += alternate_len;
+    }
+    return_trace (coverage.serialize (c, this).serialize (c, glyphs));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (coverage.sanitize (c, this) && alternateSet.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of Substitution table */
+  OffsetArrayOf<AlternateSet>
+		alternateSet;		/* Array of AlternateSet tables
+					 * ordered by Coverage Index */
+  public:
+  DEFINE_SIZE_ARRAY (6, alternateSet);
+};
+
+struct AlternateSubst
+{
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> glyphs,
+		  hb_array_t<const unsigned int> alternate_len_list,
+		  hb_array_t<const GlyphID> alternate_glyphs_list)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (u.format))) return_trace (false);
+    unsigned int format = 1;
+    u.format.set (format);
+    switch (u.format) {
+    case 1: return_trace (u.format1.serialize (c, glyphs, alternate_len_list, alternate_glyphs_list));
+    default:return_trace (false);
+    }
+  }
+
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  AlternateSubstFormat1	format1;
+  } u;
+};
+
+
+struct Ligature
+{
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    unsigned int count = component.lenP1;
+    for (unsigned int i = 1; i < count; i++)
+      if (!glyphs->has (component[i]))
+        return false;
+    return true;
+  }
+
+  void closure (hb_closure_context_t *c) const
+  {
+    unsigned int count = component.lenP1;
+    for (unsigned int i = 1; i < count; i++)
+      if (!c->glyphs->has (component[i]))
+        return;
+    c->out->add (ligGlyph);
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    c->input->add_array (component.arrayZ, component.lenP1 ? component.lenP1 - 1 : 0);
+    c->output->add (ligGlyph);
+  }
+
+  bool would_apply (hb_would_apply_context_t *c) const
+  {
+    TRACE_WOULD_APPLY (this);
+    if (c->len != component.lenP1)
+      return_trace (false);
+
+    for (unsigned int i = 1; i < c->len; i++)
+      if (likely (c->glyphs[i] != component[i]))
+	return_trace (false);
+
+    return_trace (true);
+  }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    unsigned int count = component.lenP1;
+
+    if (unlikely (!count)) return_trace (false);
+
+    /* Special-case to make it in-place and not consider this
+     * as a "ligated" substitution. */
+    if (unlikely (count == 1))
+    {
+      c->replace_glyph (ligGlyph);
+      return_trace (true);
+    }
+
+    unsigned int total_component_count = 0;
+
+    unsigned int match_length = 0;
+    unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
+
+    if (likely (!match_input (c, count,
+			      &component[1],
+			      match_glyph,
+			      nullptr,
+			      &match_length,
+			      match_positions,
+			      &total_component_count)))
+      return_trace (false);
+
+    ligate_input (c,
+		  count,
+		  match_positions,
+		  match_length,
+		  ligGlyph,
+		  total_component_count);
+
+    return_trace (true);
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  GlyphID ligature,
+		  hb_array_t<const GlyphID> components /* Starting from second */)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    ligGlyph = ligature;
+    if (unlikely (!component.serialize (c, components))) return_trace (false);
+    return_trace (true);
+  }
+
+  public:
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (ligGlyph.sanitize (c) && component.sanitize (c));
+  }
+
+  protected:
+  GlyphID	ligGlyph;		/* GlyphID of ligature to substitute */
+  HeadlessArrayOf<GlyphID>
+		component;		/* Array of component GlyphIDs--start
+					 * with the second  component--ordered
+					 * in writing direction */
+  public:
+  DEFINE_SIZE_ARRAY (4, component);
+};
+
+struct LigatureSet
+{
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    unsigned int num_ligs = ligature.len;
+    for (unsigned int i = 0; i < num_ligs; i++)
+      if ((this+ligature[i]).intersects (glyphs))
+        return true;
+    return false;
+  }
+
+  void closure (hb_closure_context_t *c) const
+  {
+    unsigned int num_ligs = ligature.len;
+    for (unsigned int i = 0; i < num_ligs; i++)
+      (this+ligature[i]).closure (c);
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    unsigned int num_ligs = ligature.len;
+    for (unsigned int i = 0; i < num_ligs; i++)
+      (this+ligature[i]).collect_glyphs (c);
+  }
+
+  bool would_apply (hb_would_apply_context_t *c) const
+  {
+    TRACE_WOULD_APPLY (this);
+    unsigned int num_ligs = ligature.len;
+    for (unsigned int i = 0; i < num_ligs; i++)
+    {
+      const Ligature &lig = this+ligature[i];
+      if (lig.would_apply (c))
+        return_trace (true);
+    }
+    return_trace (false);
+  }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    unsigned int num_ligs = ligature.len;
+    for (unsigned int i = 0; i < num_ligs; i++)
+    {
+      const Ligature &lig = this+ligature[i];
+      if (lig.apply (c)) return_trace (true);
+    }
+
+    return_trace (false);
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> ligatures,
+		  hb_array_t<const unsigned int> component_count_list,
+		  hb_array_t<const GlyphID> &component_list /* Starting from second for each ligature */)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!ligature.serialize (c, ligatures.length))) return_trace (false);
+    for (unsigned int i = 0; i < ligatures.length; i++)
+    {
+      unsigned int component_count = MAX<int> (component_count_list[i] - 1, 0);
+      if (unlikely (!ligature[i].serialize (c, this)
+				.serialize (c,
+					    ligatures[i],
+					    component_list.sub_array (0, component_count))))
+	return_trace (false);
+      component_list += component_count;
+    }
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (ligature.sanitize (c, this));
+  }
+
+  protected:
+  OffsetArrayOf<Ligature>
+		ligature;		/* Array LigatureSet tables
+					 * ordered by preference */
+  public:
+  DEFINE_SIZE_ARRAY (2, ligature);
+};
+
+struct LigatureSubstFormat1
+{
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    unsigned int count = ligatureSet.len;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
+      if (glyphs->has (iter.get_glyph ()) &&
+	  (this+ligatureSet[iter.get_coverage ()]).intersects (glyphs))
+        return true;
+    }
+    return false;
+  }
+
+  void closure (hb_closure_context_t *c) const
+  {
+    unsigned int count = ligatureSet.len;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
+      if (c->glyphs->has (iter.get_glyph ()))
+	(this+ligatureSet[iter.get_coverage ()]).closure (c);
+    }
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    unsigned int count = ligatureSet.len;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
+      (this+ligatureSet[iter.get_coverage ()]).collect_glyphs (c);
+    }
+  }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool would_apply (hb_would_apply_context_t *c) const
+  {
+    TRACE_WOULD_APPLY (this);
+    unsigned int index = (this+coverage).get_coverage (c->glyphs[0]);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    const LigatureSet &lig_set = this+ligatureSet[index];
+    return_trace (lig_set.would_apply (c));
+  }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    const LigatureSet &lig_set = this+ligatureSet[index];
+    return_trace (lig_set.apply (c));
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> first_glyphs,
+		  hb_array_t<const unsigned int> ligature_per_first_glyph_count_list,
+		  hb_array_t<const GlyphID> ligatures_list,
+		  hb_array_t<const unsigned int> component_count_list,
+		  hb_array_t<const GlyphID> component_list /* Starting from second for each ligature */)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!ligatureSet.serialize (c, first_glyphs.length))) return_trace (false);
+    for (unsigned int i = 0; i < first_glyphs.length; i++)
+    {
+      unsigned int ligature_count = ligature_per_first_glyph_count_list[i];
+      if (unlikely (!ligatureSet[i].serialize (c, this)
+				   .serialize (c,
+					       ligatures_list.sub_array (0, ligature_count),
+					       component_count_list.sub_array (0, ligature_count),
+					       component_list))) return_trace (false);
+      ligatures_list += ligature_count;
+      component_count_list += ligature_count;
+    }
+    return_trace (coverage.serialize (c, this).serialize (c, first_glyphs));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (coverage.sanitize (c, this) && ligatureSet.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of Substitution table */
+  OffsetArrayOf<LigatureSet>
+		ligatureSet;		/* Array LigatureSet tables
+					 * ordered by Coverage Index */
+  public:
+  DEFINE_SIZE_ARRAY (6, ligatureSet);
+};
+
+struct LigatureSubst
+{
+  bool serialize (hb_serialize_context_t *c,
+		  hb_array_t<const GlyphID> first_glyphs,
+		  hb_array_t<const unsigned int> ligature_per_first_glyph_count_list,
+		  hb_array_t<const GlyphID> ligatures_list,
+		  hb_array_t<const unsigned int> component_count_list,
+		  hb_array_t<const GlyphID> component_list /* Starting from second for each ligature */)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (u.format))) return_trace (false);
+    unsigned int format = 1;
+    u.format.set (format);
+    switch (u.format) {
+    case 1: return_trace (u.format1.serialize (c,
+					       first_glyphs,
+					       ligature_per_first_glyph_count_list,
+					       ligatures_list,
+					       component_count_list,
+					       component_list));
+    default:return_trace (false);
+    }
+  }
+
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  LigatureSubstFormat1	format1;
+  } u;
+};
+
+
+struct ContextSubst : Context {};
+
+struct ChainContextSubst : ChainContext {};
+
+struct ExtensionSubst : Extension<ExtensionSubst>
+{
+  typedef struct SubstLookupSubTable SubTable;
+
+  bool is_reverse () const;
+};
+
+
+struct ReverseChainSingleSubstFormat1
+{
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    if (!(this+coverage).intersects (glyphs))
+      return false;
+
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+
+    unsigned int count;
+
+    count = backtrack.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (!(this+backtrack[i]).intersects (glyphs))
+        return false;
+
+    count = lookahead.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (!(this+lookahead[i]).intersects (glyphs))
+        return false;
+
+    return true;
+  }
+
+  void closure (hb_closure_context_t *c) const
+  {
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+
+    unsigned int count;
+
+    count = backtrack.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (!(this+backtrack[i]).intersects (c->glyphs))
+        return;
+
+    count = lookahead.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (!(this+lookahead[i]).intersects (c->glyphs))
+        return;
+
+    const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
+    count = substitute.len;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
+      if (c->glyphs->has (iter.get_glyph ()))
+	c->out->add (substitute[iter.get_coverage ()]);
+    }
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+
+    unsigned int count;
+
+    count = backtrack.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!(this+backtrack[i]).add_coverage (c->before))) return;
+
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+    count = lookahead.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!(this+lookahead[i]).add_coverage (c->after))) return;
+
+    const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
+    count = substitute.len;
+    c->output->add_array (substitute.arrayZ, substitute.len);
+  }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool would_apply (hb_would_apply_context_t *c) const
+  {
+    TRACE_WOULD_APPLY (this);
+    return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
+  }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    if (unlikely (c->nesting_level_left != HB_MAX_NESTING_LEVEL))
+      return_trace (false); /* No chaining to this type */
+
+    unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+    const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
+
+  unsigned int start_index = 0, end_index = 0;
+    if (match_backtrack (c,
+			 backtrack.len, (HBUINT16 *) backtrack.arrayZ,
+			 match_coverage, this,
+			 &start_index) &&
+        match_lookahead (c,
+			 lookahead.len, (HBUINT16 *) lookahead.arrayZ,
+			 match_coverage, this,
+			 1, &end_index))
+    {
+      c->buffer->unsafe_to_break_from_outbuffer (start_index, end_index);
+      c->replace_glyph_inplace (substitute[index]);
+      /* Note: We DON'T decrease buffer->idx.  The main loop does it
+       * for us.  This is useful for preventing surprises if someone
+       * calls us through a Context lookup. */
+      return_trace (true);
+    }
+
+    return_trace (false);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!(coverage.sanitize (c, this) && backtrack.sanitize (c, this)))
+      return_trace (false);
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+    if (!lookahead.sanitize (c, this))
+      return_trace (false);
+    const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
+    return_trace (substitute.sanitize (c));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of table */
+  OffsetArrayOf<Coverage>
+		backtrack;		/* Array of coverage tables
+					 * in backtracking sequence, in glyph
+					 * sequence order */
+  OffsetArrayOf<Coverage>
+		lookaheadX;		/* Array of coverage tables
+					 * in lookahead sequence, in glyph
+					 * sequence order */
+  ArrayOf<GlyphID>
+		substituteX;		/* Array of substitute
+					 * GlyphIDs--ordered by Coverage Index */
+  public:
+  DEFINE_SIZE_MIN (10);
+};
+
+struct ReverseChainSingleSubst
+{
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16				format;		/* Format identifier */
+  ReverseChainSingleSubstFormat1	format1;
+  } u;
+};
+
+
+
+/*
+ * SubstLookup
+ */
+
+struct SubstLookupSubTable
+{
+  friend struct Lookup;
+  friend struct SubstLookup;
+
+  enum Type {
+    Single		= 1,
+    Multiple		= 2,
+    Alternate		= 3,
+    Ligature		= 4,
+    Context		= 5,
+    ChainContext	= 6,
+    Extension		= 7,
+    ReverseChainSingle	= 8
+  };
+
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const
+  {
+    TRACE_DISPATCH (this, lookup_type);
+    switch (lookup_type) {
+    case Single:		return_trace (u.single.dispatch (c));
+    case Multiple:		return_trace (u.multiple.dispatch (c));
+    case Alternate:		return_trace (u.alternate.dispatch (c));
+    case Ligature:		return_trace (u.ligature.dispatch (c));
+    case Context:		return_trace (u.context.dispatch (c));
+    case ChainContext:		return_trace (u.chainContext.dispatch (c));
+    case Extension:		return_trace (u.extension.dispatch (c));
+    case ReverseChainSingle:	return_trace (u.reverseChainContextSingle.dispatch (c));
+    default:			return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  SingleSubst			single;
+  MultipleSubst			multiple;
+  AlternateSubst		alternate;
+  LigatureSubst			ligature;
+  ContextSubst			context;
+  ChainContextSubst		chainContext;
+  ExtensionSubst		extension;
+  ReverseChainSingleSubst	reverseChainContextSingle;
+  } u;
+  public:
+  DEFINE_SIZE_MIN (0);
+};
+
+
+struct SubstLookup : Lookup
+{
+  typedef SubstLookupSubTable SubTable;
+
+  const SubTable& get_subtable (unsigned int i) const
+  { return Lookup::get_subtable<SubTable> (i); }
+
+  static bool lookup_type_is_reverse (unsigned int lookup_type)
+  { return lookup_type == SubTable::ReverseChainSingle; }
+
+  bool is_reverse () const
+  {
+    unsigned int type = get_type ();
+    if (unlikely (type == SubTable::Extension))
+      return CastR<ExtensionSubst> (get_subtable(0)).is_reverse ();
+    return lookup_type_is_reverse (type);
+  }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    return_trace (dispatch (c));
+  }
+
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    hb_intersects_context_t c (glyphs);
+    return dispatch (&c);
+  }
+
+  hb_closure_context_t::return_t closure (hb_closure_context_t *c, unsigned int this_index) const
+  {
+    if (!c->should_visit_lookup (this_index))
+      return hb_closure_context_t::default_return_value ();
+
+    c->set_recurse_func (dispatch_closure_recurse_func);
+
+    hb_closure_context_t::return_t ret = dispatch (c);
+
+    c->flush ();
+
+    return ret;
+  }
+
+  hb_collect_glyphs_context_t::return_t collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    c->set_recurse_func (dispatch_recurse_func<hb_collect_glyphs_context_t>);
+    return dispatch (c);
+  }
+
+  template <typename set_t>
+  void add_coverage (set_t *glyphs) const
+  {
+    hb_add_coverage_context_t<set_t> c (glyphs);
+    dispatch (&c);
+  }
+
+  bool would_apply (hb_would_apply_context_t *c,
+		    const hb_ot_layout_lookup_accelerator_t *accel) const
+  {
+    TRACE_WOULD_APPLY (this);
+    if (unlikely (!c->len))  return_trace (false);
+    if (!accel->may_have (c->glyphs[0]))  return_trace (false);
+      return_trace (dispatch (c));
+  }
+
+  static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index);
+
+  SubTable& serialize_subtable (hb_serialize_context_t *c,
+				       unsigned int i)
+  { return get_subtables<SubTable> ()[i].serialize (c, this); }
+
+  bool serialize_single (hb_serialize_context_t *c,
+			 uint32_t lookup_props,
+		         hb_array_t<const GlyphID> glyphs,
+		         hb_array_t<const GlyphID> substitutes)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!Lookup::serialize (c, SubTable::Single, lookup_props, 1))) return_trace (false);
+    return_trace (serialize_subtable (c, 0).u.single.serialize (c, glyphs, substitutes));
+  }
+
+  bool serialize_multiple (hb_serialize_context_t *c,
+			   uint32_t lookup_props,
+			   hb_array_t<const GlyphID> glyphs,
+			   hb_array_t<const unsigned int> substitute_len_list,
+			   hb_array_t<const GlyphID> substitute_glyphs_list)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!Lookup::serialize (c, SubTable::Multiple, lookup_props, 1))) return_trace (false);
+    return_trace (serialize_subtable (c, 0).u.multiple.serialize (c,
+								  glyphs,
+								  substitute_len_list,
+								  substitute_glyphs_list));
+  }
+
+  bool serialize_alternate (hb_serialize_context_t *c,
+			    uint32_t lookup_props,
+			    hb_array_t<const GlyphID> glyphs,
+			    hb_array_t<const unsigned int> alternate_len_list,
+			    hb_array_t<const GlyphID> alternate_glyphs_list)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!Lookup::serialize (c, SubTable::Alternate, lookup_props, 1))) return_trace (false);
+    return_trace (serialize_subtable (c, 0).u.alternate.serialize (c,
+								   glyphs,
+								   alternate_len_list,
+								   alternate_glyphs_list));
+  }
+
+  bool serialize_ligature (hb_serialize_context_t *c,
+			   uint32_t lookup_props,
+			   hb_array_t<const GlyphID> first_glyphs,
+			   hb_array_t<const unsigned int> ligature_per_first_glyph_count_list,
+			   hb_array_t<const GlyphID> ligatures_list,
+			   hb_array_t<const unsigned int> component_count_list,
+			   hb_array_t<const GlyphID> component_list /* Starting from second for each ligature */)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!Lookup::serialize (c, SubTable::Ligature, lookup_props, 1))) return_trace (false);
+    return_trace (serialize_subtable (c, 0).u.ligature.serialize (c,
+								  first_glyphs,
+								  ligature_per_first_glyph_count_list,
+								  ligatures_list,
+								  component_count_list,
+								  component_list));
+  }
+
+  template <typename context_t>
+  static typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
+
+  static hb_closure_context_t::return_t dispatch_closure_recurse_func (hb_closure_context_t *c, unsigned int lookup_index)
+  {
+    if (!c->should_visit_lookup (lookup_index))
+      return HB_VOID;
+
+    hb_closure_context_t::return_t ret = dispatch_recurse_func (c, lookup_index);
+
+    /* While in theory we should flush here, it will cause timeouts because a recursive
+     * lookup can keep growing the glyph set.  Skip, and outer loop will retry up to
+     * HB_CLOSURE_MAX_STAGES time, which should be enough for every realistic font. */
+    //c->flush ();
+
+    return ret;
+  }
+
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  { return Lookup::dispatch<SubTable> (c); }
+
+  bool subset (hb_subset_context_t *c) const
+  { return Lookup::subset<SubTable> (c); }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  { return Lookup::sanitize<SubTable> (c); }
+};
+
+/*
+ * GSUB -- Glyph Substitution
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/gsub
+ */
+
+struct GSUB : GSUBGPOS
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_GSUB;
+
+  const SubstLookup& get_lookup (unsigned int i) const
+  { return CastR<SubstLookup> (GSUBGPOS::get_lookup (i)); }
+
+  bool subset (hb_subset_context_t *c) const
+  { return GSUBGPOS::subset<SubstLookup> (c); }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  { return GSUBGPOS::sanitize<SubstLookup> (c); }
+
+  HB_INTERNAL bool is_blacklisted (hb_blob_t *blob,
+				   hb_face_t *face) const;
+
+  typedef GSUBGPOS::accelerator_t<GSUB> accelerator_t;
+};
+
+
+struct GSUB_accelerator_t : GSUB::accelerator_t {};
+
+
+/* Out-of-class implementation for methods recursing */
+
+/*static*/ inline bool ExtensionSubst::is_reverse () const
+{
+  unsigned int type = get_type ();
+  if (unlikely (type == SubTable::Extension))
+    return CastR<ExtensionSubst> (get_subtable<SubTable>()).is_reverse ();
+  return SubstLookup::lookup_type_is_reverse (type);
+}
+
+template <typename context_t>
+/*static*/ inline typename context_t::return_t SubstLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index)
+{
+  const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index);
+  return l.dispatch (c);
+}
+
+/*static*/ inline bool SubstLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index)
+{
+  const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index);
+  unsigned int saved_lookup_props = c->lookup_props;
+  unsigned int saved_lookup_index = c->lookup_index;
+  c->set_lookup_index (lookup_index);
+  c->set_lookup_props (l.get_props ());
+  bool ret = l.dispatch (c);
+  c->set_lookup_index (saved_lookup_index);
+  c->set_lookup_props (saved_lookup_props);
+  return ret;
+}
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_LAYOUT_GSUB_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-gsubgpos.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-gsubgpos.hh
new file mode 100644
index 0000000..88d834d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-gsubgpos.hh
@@ -0,0 +1,2779 @@
+/*
+ * Copyright © 2007,2008,2009,2010  Red Hat, Inc.
+ * Copyright © 2010,2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_LAYOUT_GSUBGPOS_HH
+#define HB_OT_LAYOUT_GSUBGPOS_HH
+
+#include "hb.hh"
+#include "hb-buffer.hh"
+#include "hb-map.hh"
+#include "hb-set.hh"
+#include "hb-ot-map.hh"
+#include "hb-ot-layout-common.hh"
+#include "hb-ot-layout-gdef-table.hh"
+
+
+namespace OT {
+
+
+struct hb_intersects_context_t :
+       hb_dispatch_context_t<hb_intersects_context_t, bool, 0>
+{
+  const char *get_name () { return "INTERSECTS"; }
+  template <typename T>
+  return_t dispatch (const T &obj) { return obj.intersects (this->glyphs); }
+  static return_t default_return_value () { return false; }
+  bool stop_sublookup_iteration (return_t r) const { return r; }
+
+  const hb_set_t *glyphs;
+  unsigned int debug_depth;
+
+  hb_intersects_context_t (const hb_set_t *glyphs_) :
+			     glyphs (glyphs_),
+			     debug_depth (0) {}
+};
+
+struct hb_closure_context_t :
+       hb_dispatch_context_t<hb_closure_context_t, hb_void_t, 0>
+{
+  const char *get_name () { return "CLOSURE"; }
+  typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
+  template <typename T>
+  return_t dispatch (const T &obj) { obj.closure (this); return HB_VOID; }
+  static return_t default_return_value () { return HB_VOID; }
+  void recurse (unsigned int lookup_index)
+  {
+    if (unlikely (nesting_level_left == 0 || !recurse_func))
+      return;
+
+    nesting_level_left--;
+    recurse_func (this, lookup_index);
+    nesting_level_left++;
+  }
+
+  bool should_visit_lookup (unsigned int lookup_index)
+  {
+    if (is_lookup_done (lookup_index))
+      return false;
+    done_lookups->set (lookup_index, glyphs->get_population ());
+    return true;
+  }
+
+  bool is_lookup_done (unsigned int lookup_index)
+  {
+    /* Have we visited this lookup with the current set of glyphs? */
+    return done_lookups->get (lookup_index) == glyphs->get_population ();
+  }
+
+  hb_face_t *face;
+  hb_set_t *glyphs;
+  hb_set_t out[1];
+  recurse_func_t recurse_func;
+  unsigned int nesting_level_left;
+  unsigned int debug_depth;
+
+  hb_closure_context_t (hb_face_t *face_,
+			hb_set_t *glyphs_,
+			hb_map_t *done_lookups_,
+			unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
+			  face (face_),
+			  glyphs (glyphs_),
+			  recurse_func (nullptr),
+			  nesting_level_left (nesting_level_left_),
+			  debug_depth (0),
+			  done_lookups (done_lookups_) {}
+
+  ~hb_closure_context_t () { flush (); }
+
+  void set_recurse_func (recurse_func_t func) { recurse_func = func; }
+
+  void flush ()
+  {
+    hb_set_union (glyphs, out);
+    hb_set_clear (out);
+  }
+
+  private:
+  hb_map_t *done_lookups;
+};
+
+
+struct hb_would_apply_context_t :
+       hb_dispatch_context_t<hb_would_apply_context_t, bool, HB_DEBUG_WOULD_APPLY>
+{
+  const char *get_name () { return "WOULD_APPLY"; }
+  template <typename T>
+  return_t dispatch (const T &obj) { return obj.would_apply (this); }
+  static return_t default_return_value () { return false; }
+  bool stop_sublookup_iteration (return_t r) const { return r; }
+
+  hb_face_t *face;
+  const hb_codepoint_t *glyphs;
+  unsigned int len;
+  bool zero_context;
+  unsigned int debug_depth;
+
+  hb_would_apply_context_t (hb_face_t *face_,
+			    const hb_codepoint_t *glyphs_,
+			    unsigned int len_,
+			    bool zero_context_) :
+			      face (face_),
+			      glyphs (glyphs_),
+			      len (len_),
+			      zero_context (zero_context_),
+			      debug_depth (0) {}
+};
+
+
+struct hb_collect_glyphs_context_t :
+       hb_dispatch_context_t<hb_collect_glyphs_context_t, hb_void_t, 0>
+{
+  const char *get_name () { return "COLLECT_GLYPHS"; }
+  typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
+  template <typename T>
+  return_t dispatch (const T &obj) { obj.collect_glyphs (this); return HB_VOID; }
+  static return_t default_return_value () { return HB_VOID; }
+  void recurse (unsigned int lookup_index)
+  {
+    if (unlikely (nesting_level_left == 0 || !recurse_func))
+      return;
+
+    /* Note that GPOS sets recurse_func to nullptr already, so it doesn't get
+     * past the previous check.  For GSUB, we only want to collect the output
+     * glyphs in the recursion.  If output is not requested, we can go home now.
+     *
+     * Note further, that the above is not exactly correct.  A recursed lookup
+     * is allowed to match input that is not matched in the context, but that's
+     * not how most fonts are built.  It's possible to relax that and recurse
+     * with all sets here if it proves to be an issue.
+     */
+
+    if (output == hb_set_get_empty ())
+      return;
+
+    /* Return if new lookup was recursed to before. */
+    if (recursed_lookups->has (lookup_index))
+      return;
+
+    hb_set_t *old_before = before;
+    hb_set_t *old_input  = input;
+    hb_set_t *old_after  = after;
+    before = input = after = hb_set_get_empty ();
+
+    nesting_level_left--;
+    recurse_func (this, lookup_index);
+    nesting_level_left++;
+
+    before = old_before;
+    input  = old_input;
+    after  = old_after;
+
+    recursed_lookups->add (lookup_index);
+  }
+
+  hb_face_t *face;
+  hb_set_t *before;
+  hb_set_t *input;
+  hb_set_t *after;
+  hb_set_t *output;
+  recurse_func_t recurse_func;
+  hb_set_t *recursed_lookups;
+  unsigned int nesting_level_left;
+  unsigned int debug_depth;
+
+  hb_collect_glyphs_context_t (hb_face_t *face_,
+			       hb_set_t  *glyphs_before, /* OUT.  May be NULL */
+			       hb_set_t  *glyphs_input,  /* OUT.  May be NULL */
+			       hb_set_t  *glyphs_after,  /* OUT.  May be NULL */
+			       hb_set_t  *glyphs_output, /* OUT.  May be NULL */
+			       unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
+			      face (face_),
+			      before (glyphs_before ? glyphs_before : hb_set_get_empty ()),
+			      input  (glyphs_input  ? glyphs_input  : hb_set_get_empty ()),
+			      after  (glyphs_after  ? glyphs_after  : hb_set_get_empty ()),
+			      output (glyphs_output ? glyphs_output : hb_set_get_empty ()),
+			      recurse_func (nullptr),
+			      recursed_lookups (hb_set_create ()),
+			      nesting_level_left (nesting_level_left_),
+			      debug_depth (0) {}
+  ~hb_collect_glyphs_context_t () { hb_set_destroy (recursed_lookups); }
+
+  void set_recurse_func (recurse_func_t func) { recurse_func = func; }
+};
+
+
+
+template <typename set_t>
+struct hb_add_coverage_context_t :
+       hb_dispatch_context_t<hb_add_coverage_context_t<set_t>, const Coverage &, HB_DEBUG_GET_COVERAGE>
+{
+  const char *get_name () { return "GET_COVERAGE"; }
+  typedef const Coverage &return_t;
+  template <typename T>
+  return_t dispatch (const T &obj) { return obj.get_coverage (); }
+  static return_t default_return_value () { return Null(Coverage); }
+  bool stop_sublookup_iteration (return_t r) const
+  {
+    r.add_coverage (set);
+    return false;
+  }
+
+  hb_add_coverage_context_t (set_t *set_) :
+			    set (set_),
+			    debug_depth (0) {}
+
+  set_t *set;
+  unsigned int debug_depth;
+};
+
+
+struct hb_ot_apply_context_t :
+       hb_dispatch_context_t<hb_ot_apply_context_t, bool, HB_DEBUG_APPLY>
+{
+  struct matcher_t
+  {
+    matcher_t () :
+	     lookup_props (0),
+	     ignore_zwnj (false),
+	     ignore_zwj (false),
+	     mask (-1),
+#define arg1(arg) (arg) /* Remove the macro to see why it's needed! */
+	     syllable arg1(0),
+#undef arg1
+	     match_func (nullptr),
+	     match_data (nullptr) {}
+
+    typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data);
+
+    void set_ignore_zwnj (bool ignore_zwnj_) { ignore_zwnj = ignore_zwnj_; }
+    void set_ignore_zwj (bool ignore_zwj_) { ignore_zwj = ignore_zwj_; }
+    void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; }
+    void set_mask (hb_mask_t mask_) { mask = mask_; }
+    void set_syllable (uint8_t syllable_)  { syllable = syllable_; }
+    void set_match_func (match_func_t match_func_,
+				const void *match_data_)
+    { match_func = match_func_; match_data = match_data_; }
+
+    enum may_match_t {
+      MATCH_NO,
+      MATCH_YES,
+      MATCH_MAYBE
+    };
+
+    may_match_t may_match (const hb_glyph_info_t &info,
+				  const HBUINT16        *glyph_data) const
+    {
+      if (!(info.mask & mask) ||
+	  (syllable && syllable != info.syllable ()))
+	return MATCH_NO;
+
+      if (match_func)
+	return match_func (info.codepoint, *glyph_data, match_data) ? MATCH_YES : MATCH_NO;
+
+      return MATCH_MAYBE;
+    }
+
+    enum may_skip_t {
+      SKIP_NO,
+      SKIP_YES,
+      SKIP_MAYBE
+    };
+
+    may_skip_t may_skip (const hb_ot_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_and_not_hidden (&info) &&
+		    (ignore_zwnj || !_hb_glyph_info_is_zwnj (&info)) &&
+		    (ignore_zwj || !_hb_glyph_info_is_zwj (&info))))
+	return SKIP_MAYBE;
+
+      return SKIP_NO;
+    }
+
+    protected:
+    unsigned int lookup_props;
+    bool ignore_zwnj;
+    bool ignore_zwj;
+    hb_mask_t mask;
+    uint8_t syllable;
+    match_func_t match_func;
+    const void *match_data;
+  };
+
+  struct skipping_iterator_t
+  {
+    void init (hb_ot_apply_context_t *c_, bool context_match = false)
+    {
+      c = c_;
+      match_glyph_data = nullptr;
+      matcher.set_match_func (nullptr, nullptr);
+      matcher.set_lookup_props (c->lookup_props);
+      /* Ignore ZWNJ if we are matching GPOS, or matching GSUB context and asked to. */
+      matcher.set_ignore_zwnj (c->table_index == 1 || (context_match && c->auto_zwnj));
+      /* Ignore ZWJ if we are matching context, or asked to. */
+      matcher.set_ignore_zwj  (context_match || c->auto_zwj);
+      matcher.set_mask (context_match ? -1 : c->lookup_mask);
+    }
+    void set_lookup_props (unsigned int lookup_props)
+    {
+      matcher.set_lookup_props (lookup_props);
+    }
+    void set_match_func (matcher_t::match_func_t match_func_,
+			 const void *match_data_,
+			 const HBUINT16 glyph_data[])
+    {
+      matcher.set_match_func (match_func_, match_data_);
+      match_glyph_data = glyph_data;
+    }
+
+    void reset (unsigned int start_index_,
+		       unsigned int num_items_)
+    {
+      idx = start_index_;
+      num_items = num_items_;
+      end = c->buffer->len;
+      matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().syllable () : 0);
+    }
+
+    void reject () { num_items++; match_glyph_data--; }
+
+    matcher_t::may_skip_t
+    may_skip (const hb_glyph_info_t &info) const
+    { return matcher.may_skip (c, info); }
+
+    bool next ()
+    {
+      assert (num_items > 0);
+      while (idx + num_items < end)
+      {
+	idx++;
+	const hb_glyph_info_t &info = c->buffer->info[idx];
+
+	matcher_t::may_skip_t skip = matcher.may_skip (c, info);
+	if (unlikely (skip == matcher_t::SKIP_YES))
+	  continue;
+
+	matcher_t::may_match_t match = matcher.may_match (info, match_glyph_data);
+	if (match == matcher_t::MATCH_YES ||
+	    (match == matcher_t::MATCH_MAYBE &&
+	     skip == matcher_t::SKIP_NO))
+	{
+	  num_items--;
+	  match_glyph_data++;
+	  return true;
+	}
+
+	if (skip == matcher_t::SKIP_NO)
+	  return false;
+      }
+      return false;
+    }
+    bool prev ()
+    {
+      assert (num_items > 0);
+      while (idx > num_items - 1)
+      {
+	idx--;
+	const hb_glyph_info_t &info = c->buffer->out_info[idx];
+
+	matcher_t::may_skip_t skip = matcher.may_skip (c, info);
+	if (unlikely (skip == matcher_t::SKIP_YES))
+	  continue;
+
+	matcher_t::may_match_t match = matcher.may_match (info, match_glyph_data);
+	if (match == matcher_t::MATCH_YES ||
+	    (match == matcher_t::MATCH_MAYBE &&
+	     skip == matcher_t::SKIP_NO))
+	{
+	  num_items--;
+	  match_glyph_data++;
+	  return true;
+	}
+
+	if (skip == matcher_t::SKIP_NO)
+	  return false;
+      }
+      return false;
+    }
+
+    unsigned int idx;
+    protected:
+    hb_ot_apply_context_t *c;
+    matcher_t matcher;
+    const HBUINT16 *match_glyph_data;
+
+    unsigned int num_items;
+    unsigned int end;
+  };
+
+
+  const char *get_name () { return "APPLY"; }
+  typedef return_t (*recurse_func_t) (hb_ot_apply_context_t *c, unsigned int lookup_index);
+  template <typename T>
+  return_t dispatch (const T &obj) { return obj.apply (this); }
+  static return_t default_return_value () { return false; }
+  bool stop_sublookup_iteration (return_t r) const { return r; }
+  return_t recurse (unsigned int sub_lookup_index)
+  {
+    if (unlikely (nesting_level_left == 0 || !recurse_func || buffer->max_ops-- <= 0))
+      return default_return_value ();
+
+    nesting_level_left--;
+    bool ret = recurse_func (this, sub_lookup_index);
+    nesting_level_left++;
+    return ret;
+  }
+
+  skipping_iterator_t iter_input, iter_context;
+
+  hb_font_t *font;
+  hb_face_t *face;
+  hb_buffer_t *buffer;
+  recurse_func_t recurse_func;
+  const GDEF &gdef;
+  const VariationStore &var_store;
+
+  hb_direction_t direction;
+  hb_mask_t lookup_mask;
+  unsigned int table_index; /* GSUB/GPOS */
+  unsigned int lookup_index;
+  unsigned int lookup_props;
+  unsigned int nesting_level_left;
+  unsigned int debug_depth;
+
+  bool has_glyph_classes;
+  bool auto_zwnj;
+  bool auto_zwj;
+  bool random;
+
+  uint32_t random_state;
+
+
+  hb_ot_apply_context_t (unsigned int table_index_,
+		      hb_font_t *font_,
+		      hb_buffer_t *buffer_) :
+			iter_input (), iter_context (),
+			font (font_), face (font->face), buffer (buffer_),
+			recurse_func (nullptr),
+			gdef (*face->table.GDEF->table),
+			var_store (gdef.get_var_store ()),
+			direction (buffer_->props.direction),
+			lookup_mask (1),
+			table_index (table_index_),
+			lookup_index ((unsigned int) -1),
+			lookup_props (0),
+			nesting_level_left (HB_MAX_NESTING_LEVEL),
+			debug_depth (0),
+			has_glyph_classes (gdef.has_glyph_classes ()),
+			auto_zwnj (true),
+			auto_zwj (true),
+			random (false),
+			random_state (1) { init_iters (); }
+
+  void init_iters ()
+  {
+    iter_input.init (this, false);
+    iter_context.init (this, true);
+  }
+
+  void set_lookup_mask (hb_mask_t mask) { lookup_mask = mask; init_iters (); }
+  void set_auto_zwj (bool auto_zwj_) { auto_zwj = auto_zwj_; init_iters (); }
+  void set_auto_zwnj (bool auto_zwnj_) { auto_zwnj = auto_zwnj_; init_iters (); }
+  void set_random (bool random_) { random = random_; }
+  void set_recurse_func (recurse_func_t func) { recurse_func = func; }
+  void set_lookup_index (unsigned int lookup_index_) { lookup_index = lookup_index_; }
+  void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; init_iters (); }
+
+  uint32_t random_number ()
+  {
+    /* http://www.cplusplus.com/reference/random/minstd_rand/ */
+    random_state = random_state * 48271 % 2147483647;
+    return random_state;
+  }
+
+  bool match_properties_mark (hb_codepoint_t  glyph,
+			      unsigned int    glyph_props,
+			      unsigned int    match_props) const
+  {
+    /* If using mark filtering sets, the high short of
+     * match_props has the set index.
+     */
+    if (match_props & LookupFlag::UseMarkFilteringSet)
+      return gdef.mark_set_covers (match_props >> 16, glyph);
+
+    /* The second byte of match_props has the meaning
+     * "ignore marks of attachment type different than
+     * the attachment type specified."
+     */
+    if (match_props & LookupFlag::MarkAttachmentType)
+      return (match_props & LookupFlag::MarkAttachmentType) == (glyph_props & LookupFlag::MarkAttachmentType);
+
+    return true;
+  }
+
+  bool check_glyph_property (const hb_glyph_info_t *info,
+			     unsigned int  match_props) const
+  {
+    hb_codepoint_t glyph = info->codepoint;
+    unsigned int glyph_props = _hb_glyph_info_get_glyph_props (info);
+
+    /* Not covered, if, for example, glyph class is ligature and
+     * match_props includes LookupFlags::IgnoreLigatures
+     */
+    if (glyph_props & match_props & LookupFlag::IgnoreFlags)
+      return false;
+
+    if (unlikely (glyph_props & HB_OT_LAYOUT_GLYPH_PROPS_MARK))
+      return match_properties_mark (glyph, glyph_props, match_props);
+
+    return true;
+  }
+
+  void _set_glyph_props (hb_codepoint_t glyph_index,
+			  unsigned int class_guess = 0,
+			  bool ligature = false,
+			  bool component = false) const
+  {
+    unsigned int add_in = _hb_glyph_info_get_glyph_props (&buffer->cur()) &
+			  HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE;
+    add_in |= HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED;
+    if (ligature)
+    {
+      add_in |= HB_OT_LAYOUT_GLYPH_PROPS_LIGATED;
+      /* In the only place that the MULTIPLIED bit is used, Uniscribe
+       * seems to only care about the "last" transformation between
+       * Ligature and Multiple substitutions.  Ie. if you ligate, expand,
+       * and ligate again, it forgives the multiplication and acts as
+       * if only ligation happened.  As such, clear MULTIPLIED bit.
+       */
+      add_in &= ~HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED;
+    }
+    if (component)
+      add_in |= HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED;
+    if (likely (has_glyph_classes))
+      _hb_glyph_info_set_glyph_props (&buffer->cur(), add_in | gdef.get_glyph_props (glyph_index));
+    else if (class_guess)
+      _hb_glyph_info_set_glyph_props (&buffer->cur(), add_in | class_guess);
+  }
+
+  void replace_glyph (hb_codepoint_t glyph_index) const
+  {
+    _set_glyph_props (glyph_index);
+    buffer->replace_glyph (glyph_index);
+  }
+  void replace_glyph_inplace (hb_codepoint_t glyph_index) const
+  {
+    _set_glyph_props (glyph_index);
+    buffer->cur().codepoint = glyph_index;
+  }
+  void replace_glyph_with_ligature (hb_codepoint_t glyph_index,
+					   unsigned int class_guess) const
+  {
+    _set_glyph_props (glyph_index, class_guess, true);
+    buffer->replace_glyph (glyph_index);
+  }
+  void output_glyph_for_component (hb_codepoint_t glyph_index,
+					  unsigned int class_guess) const
+  {
+    _set_glyph_props (glyph_index, class_guess, false, true);
+    buffer->output_glyph (glyph_index);
+  }
+};
+
+
+struct hb_get_subtables_context_t :
+       hb_dispatch_context_t<hb_get_subtables_context_t, hb_void_t, HB_DEBUG_APPLY>
+{
+  template <typename Type>
+  static bool apply_to (const void *obj, OT::hb_ot_apply_context_t *c)
+  {
+    const Type *typed_obj = (const Type *) obj;
+    return typed_obj->apply (c);
+  }
+
+  typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_ot_apply_context_t *c);
+
+  struct hb_applicable_t
+  {
+    template <typename T>
+    void init (const T &obj_, hb_apply_func_t apply_func_)
+    {
+      obj = &obj_;
+      apply_func = apply_func_;
+      digest.init ();
+      obj_.get_coverage ().add_coverage (&digest);
+    }
+
+    bool apply (OT::hb_ot_apply_context_t *c) const
+    {
+      return digest.may_have (c->buffer->cur().codepoint) && apply_func (obj, c);
+    }
+
+    private:
+    const void *obj;
+    hb_apply_func_t apply_func;
+    hb_set_digest_t digest;
+  };
+
+  typedef hb_vector_t<hb_applicable_t> array_t;
+
+  /* Dispatch interface. */
+  const char *get_name () { return "GET_SUBTABLES"; }
+  template <typename T>
+  return_t dispatch (const T &obj)
+  {
+    hb_applicable_t *entry = array.push();
+    entry->init (obj, apply_to<T>);
+    return HB_VOID;
+  }
+  static return_t default_return_value () { return HB_VOID; }
+
+  hb_get_subtables_context_t (array_t &array_) :
+			      array (array_),
+			      debug_depth (0) {}
+
+  array_t &array;
+  unsigned int debug_depth;
+};
+
+
+
+
+typedef bool (*intersects_func_t) (const hb_set_t *glyphs, const HBUINT16 &value, const void *data);
+typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, const HBUINT16 &value, const void *data);
+typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data);
+
+struct ContextClosureFuncs
+{
+  intersects_func_t intersects;
+};
+struct ContextCollectGlyphsFuncs
+{
+  collect_glyphs_func_t collect;
+};
+struct ContextApplyFuncs
+{
+  match_func_t match;
+};
+
+
+static inline bool intersects_glyph (const hb_set_t *glyphs, const HBUINT16 &value, const void *data HB_UNUSED)
+{
+  return glyphs->has (value);
+}
+static inline bool intersects_class (const hb_set_t *glyphs, const HBUINT16 &value, const void *data)
+{
+  const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
+  return class_def.intersects_class (glyphs, value);
+}
+static inline bool intersects_coverage (const hb_set_t *glyphs, const HBUINT16 &value, const void *data)
+{
+  const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
+  return (data+coverage).intersects (glyphs);
+}
+
+static inline bool intersects_array (const hb_set_t *glyphs,
+				     unsigned int count,
+				     const HBUINT16 values[],
+				     intersects_func_t intersects_func,
+				     const void *intersects_data)
+{
+  for (unsigned int i = 0; i < count; i++)
+    if (likely (!intersects_func (glyphs, values[i], intersects_data)))
+      return false;
+  return true;
+}
+
+
+static inline void collect_glyph (hb_set_t *glyphs, const HBUINT16 &value, const void *data HB_UNUSED)
+{
+  glyphs->add (value);
+}
+static inline void collect_class (hb_set_t *glyphs, const HBUINT16 &value, const void *data)
+{
+  const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
+  class_def.add_class (glyphs, value);
+}
+static inline void collect_coverage (hb_set_t *glyphs, const HBUINT16 &value, const void *data)
+{
+  const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
+  (data+coverage).add_coverage (glyphs);
+}
+static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED,
+				  hb_set_t *glyphs,
+				  unsigned int count,
+				  const HBUINT16 values[],
+				  collect_glyphs_func_t collect_func,
+				  const void *collect_data)
+{
+  for (unsigned int i = 0; i < count; i++)
+    collect_func (glyphs, values[i], collect_data);
+}
+
+
+static inline bool match_glyph (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data HB_UNUSED)
+{
+  return glyph_id == value;
+}
+static inline bool match_class (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data)
+{
+  const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
+  return class_def.get_class (glyph_id) == value;
+}
+static inline bool match_coverage (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data)
+{
+  const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
+  return (data+coverage).get_coverage (glyph_id) != NOT_COVERED;
+}
+
+static inline bool would_match_input (hb_would_apply_context_t *c,
+				      unsigned int count, /* Including the first glyph (not matched) */
+				      const HBUINT16 input[], /* Array of input values--start with second glyph */
+				      match_func_t match_func,
+				      const void *match_data)
+{
+  if (count != c->len)
+    return false;
+
+  for (unsigned int i = 1; i < count; i++)
+    if (likely (!match_func (c->glyphs[i], input[i - 1], match_data)))
+      return false;
+
+  return true;
+}
+static inline bool match_input (hb_ot_apply_context_t *c,
+				unsigned int count, /* Including the first glyph (not matched) */
+				const HBUINT16 input[], /* Array of input values--start with second glyph */
+				match_func_t match_func,
+				const void *match_data,
+				unsigned int *end_offset,
+				unsigned int match_positions[HB_MAX_CONTEXT_LENGTH],
+				unsigned int *p_total_component_count = nullptr)
+{
+  TRACE_APPLY (nullptr);
+
+  if (unlikely (count > HB_MAX_CONTEXT_LENGTH)) return_trace (false);
+
+  hb_buffer_t *buffer = c->buffer;
+
+  hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+  skippy_iter.reset (buffer->idx, count - 1);
+  skippy_iter.set_match_func (match_func, match_data, input);
+
+  /*
+   * This is perhaps the trickiest part of OpenType...  Remarks:
+   *
+   * - If all components of the ligature were marks, we call this a mark ligature.
+   *
+   * - If there is no GDEF, and the ligature is NOT a mark ligature, we categorize
+   *   it as a ligature glyph.
+   *
+   * - Ligatures cannot be formed across glyphs attached to different components
+   *   of previous ligatures.  Eg. the sequence is LAM,SHADDA,LAM,FATHA,HEH, and
+   *   LAM,LAM,HEH form a ligature, leaving SHADDA,FATHA next to eachother.
+   *   However, it would be wrong to ligate that SHADDA,FATHA sequence.
+   *   There are a couple of exceptions to this:
+   *
+   *   o If a ligature tries ligating with marks that belong to it itself, go ahead,
+   *     assuming that the font designer knows what they are doing (otherwise it can
+   *     break Indic stuff when a matra wants to ligate with a conjunct,
+   *
+   *   o If two marks want to ligate and they belong to different components of the
+   *     same ligature glyph, and said ligature glyph is to be ignored according to
+   *     mark-filtering rules, then allow.
+   *     https://github.com/harfbuzz/harfbuzz/issues/545
+   */
+
+  unsigned int total_component_count = 0;
+  total_component_count += _hb_glyph_info_get_lig_num_comps (&buffer->cur());
+
+  unsigned int first_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
+  unsigned int first_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
+
+  enum {
+    LIGBASE_NOT_CHECKED,
+    LIGBASE_MAY_NOT_SKIP,
+    LIGBASE_MAY_SKIP
+  } ligbase = LIGBASE_NOT_CHECKED;
+
+  match_positions[0] = buffer->idx;
+  for (unsigned int i = 1; i < count; i++)
+  {
+    if (!skippy_iter.next ()) return_trace (false);
+
+    match_positions[i] = skippy_iter.idx;
+
+    unsigned int this_lig_id = _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx]);
+    unsigned int this_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]);
+
+    if (first_lig_id && first_lig_comp)
+    {
+      /* If first component was attached to a previous ligature component,
+       * all subsequent components should be attached to the same ligature
+       * component, otherwise we shouldn't ligate them... */
+      if (first_lig_id != this_lig_id || first_lig_comp != this_lig_comp)
+      {
+	/* ...unless, we are attached to a base ligature and that base
+	 * ligature is ignorable. */
+	if (ligbase == LIGBASE_NOT_CHECKED)
+	{
+	  bool found = false;
+	  const hb_glyph_info_t *out = buffer->out_info;
+	  unsigned int j = buffer->out_len;
+	  while (j && _hb_glyph_info_get_lig_id (&out[j - 1]) == first_lig_id)
+	  {
+	    if (_hb_glyph_info_get_lig_comp (&out[j - 1]) == 0)
+	    {
+	      j--;
+	      found = true;
+	      break;
+	    }
+	    j--;
+	  }
+
+	  if (found && skippy_iter.may_skip (out[j]) == hb_ot_apply_context_t::matcher_t::SKIP_YES)
+	    ligbase = LIGBASE_MAY_SKIP;
+	  else
+	    ligbase = LIGBASE_MAY_NOT_SKIP;
+	}
+
+	if (ligbase == LIGBASE_MAY_NOT_SKIP)
+	  return_trace (false);
+      }
+    }
+    else
+    {
+      /* If first component was NOT attached to a previous ligature component,
+       * all subsequent components should also NOT be attached to any ligature
+       * component, unless they are attached to the first component itself! */
+      if (this_lig_id && this_lig_comp && (this_lig_id != first_lig_id))
+	return_trace (false);
+    }
+
+    total_component_count += _hb_glyph_info_get_lig_num_comps (&buffer->info[skippy_iter.idx]);
+  }
+
+  *end_offset = skippy_iter.idx - buffer->idx + 1;
+
+  if (p_total_component_count)
+    *p_total_component_count = total_component_count;
+
+  return_trace (true);
+}
+static inline bool ligate_input (hb_ot_apply_context_t *c,
+				 unsigned int count, /* Including the first glyph */
+				 const unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
+				 unsigned int match_length,
+				 hb_codepoint_t lig_glyph,
+				 unsigned int total_component_count)
+{
+  TRACE_APPLY (nullptr);
+
+  hb_buffer_t *buffer = c->buffer;
+
+  buffer->merge_clusters (buffer->idx, buffer->idx + match_length);
+
+  /* - If a base and one or more marks ligate, consider that as a base, NOT
+   *   ligature, such that all following marks can still attach to it.
+   *   https://github.com/harfbuzz/harfbuzz/issues/1109
+   *
+   * - If all components of the ligature were marks, we call this a mark ligature.
+   *   If it *is* a mark ligature, we don't allocate a new ligature id, and leave
+   *   the ligature to keep its old ligature id.  This will allow it to attach to
+   *   a base ligature in GPOS.  Eg. if the sequence is: LAM,LAM,SHADDA,FATHA,HEH,
+   *   and LAM,LAM,HEH for a ligature, they will leave SHADDA and FATHA with a
+   *   ligature id and component value of 2.  Then if SHADDA,FATHA form a ligature
+   *   later, we don't want them to lose their ligature id/component, otherwise
+   *   GPOS will fail to correctly position the mark ligature on top of the
+   *   LAM,LAM,HEH ligature.  See:
+   *     https://bugzilla.gnome.org/show_bug.cgi?id=676343
+   *
+   * - If a ligature is formed of components that some of which are also ligatures
+   *   themselves, and those ligature components had marks attached to *their*
+   *   components, we have to attach the marks to the new ligature component
+   *   positions!  Now *that*'s tricky!  And these marks may be following the
+   *   last component of the whole sequence, so we should loop forward looking
+   *   for them and update them.
+   *
+   *   Eg. the sequence is LAM,LAM,SHADDA,FATHA,HEH, and the font first forms a
+   *   'calt' ligature of LAM,HEH, leaving the SHADDA and FATHA with a ligature
+   *   id and component == 1.  Now, during 'liga', the LAM and the LAM-HEH ligature
+   *   form a LAM-LAM-HEH ligature.  We need to reassign the SHADDA and FATHA to
+   *   the new ligature with a component value of 2.
+   *
+   *   This in fact happened to a font...  See:
+   *   https://bugzilla.gnome.org/show_bug.cgi?id=437633
+   */
+
+  bool is_base_ligature = _hb_glyph_info_is_base_glyph (&buffer->info[match_positions[0]]);
+  bool is_mark_ligature = _hb_glyph_info_is_mark (&buffer->info[match_positions[0]]);
+  for (unsigned int i = 1; i < count; i++)
+    if (!_hb_glyph_info_is_mark (&buffer->info[match_positions[i]]))
+    {
+      is_base_ligature = false;
+      is_mark_ligature = false;
+      break;
+    }
+  bool is_ligature = !is_base_ligature && !is_mark_ligature;
+
+  unsigned int klass = is_ligature ? HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE : 0;
+  unsigned int lig_id = is_ligature ? _hb_allocate_lig_id (buffer) : 0;
+  unsigned int last_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
+  unsigned int last_num_components = _hb_glyph_info_get_lig_num_comps (&buffer->cur());
+  unsigned int components_so_far = last_num_components;
+
+  if (is_ligature)
+  {
+    _hb_glyph_info_set_lig_props_for_ligature (&buffer->cur(), lig_id, total_component_count);
+    if (_hb_glyph_info_get_general_category (&buffer->cur()) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
+    {
+      _hb_glyph_info_set_general_category (&buffer->cur(), HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER);
+    }
+  }
+  c->replace_glyph_with_ligature (lig_glyph, klass);
+
+  for (unsigned int i = 1; i < count; i++)
+  {
+    while (buffer->idx < match_positions[i] && buffer->successful)
+    {
+      if (is_ligature)
+      {
+	unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
+	if (this_comp == 0)
+	  this_comp = last_num_components;
+	unsigned int new_lig_comp = components_so_far - last_num_components +
+				    MIN (this_comp, last_num_components);
+	  _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp);
+      }
+      buffer->next_glyph ();
+    }
+
+    last_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
+    last_num_components = _hb_glyph_info_get_lig_num_comps (&buffer->cur());
+    components_so_far += last_num_components;
+
+    /* Skip the base glyph */
+    buffer->idx++;
+  }
+
+  if (!is_mark_ligature && last_lig_id) {
+    /* Re-adjust components for any marks following. */
+    for (unsigned int i = buffer->idx; i < buffer->len; i++) {
+      if (last_lig_id == _hb_glyph_info_get_lig_id (&buffer->info[i])) {
+	unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->info[i]);
+	if (!this_comp)
+	  break;
+	unsigned int new_lig_comp = components_so_far - last_num_components +
+				    MIN (this_comp, last_num_components);
+	_hb_glyph_info_set_lig_props_for_mark (&buffer->info[i], lig_id, new_lig_comp);
+      } else
+	break;
+    }
+  }
+  return_trace (true);
+}
+
+static inline bool match_backtrack (hb_ot_apply_context_t *c,
+				    unsigned int count,
+				    const HBUINT16 backtrack[],
+				    match_func_t match_func,
+				    const void *match_data,
+				    unsigned int *match_start)
+{
+  TRACE_APPLY (nullptr);
+
+  hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
+  skippy_iter.reset (c->buffer->backtrack_len (), count);
+  skippy_iter.set_match_func (match_func, match_data, backtrack);
+
+  for (unsigned int i = 0; i < count; i++)
+    if (!skippy_iter.prev ())
+      return_trace (false);
+
+  *match_start = skippy_iter.idx;
+
+  return_trace (true);
+}
+
+static inline bool match_lookahead (hb_ot_apply_context_t *c,
+				    unsigned int count,
+				    const HBUINT16 lookahead[],
+				    match_func_t match_func,
+				    const void *match_data,
+				    unsigned int offset,
+				    unsigned int *end_index)
+{
+  TRACE_APPLY (nullptr);
+
+  hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
+  skippy_iter.reset (c->buffer->idx + offset - 1, count);
+  skippy_iter.set_match_func (match_func, match_data, lookahead);
+
+  for (unsigned int i = 0; i < count; i++)
+    if (!skippy_iter.next ())
+      return_trace (false);
+
+  *end_index = skippy_iter.idx + 1;
+
+  return_trace (true);
+}
+
+
+
+struct LookupRecord
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT16	sequenceIndex;		/* Index into current glyph
+					 * sequence--first glyph = 0 */
+  HBUINT16	lookupListIndex;	/* Lookup to apply to that
+					 * position--zero--based */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+template <typename context_t>
+static inline void recurse_lookups (context_t *c,
+				    unsigned int lookupCount,
+				    const LookupRecord lookupRecord[] /* Array of LookupRecords--in design order */)
+{
+  for (unsigned int i = 0; i < lookupCount; i++)
+    c->recurse (lookupRecord[i].lookupListIndex);
+}
+
+static inline bool apply_lookup (hb_ot_apply_context_t *c,
+				 unsigned int count, /* Including the first glyph */
+				 unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
+				 unsigned int lookupCount,
+				 const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
+				 unsigned int match_length)
+{
+  TRACE_APPLY (nullptr);
+
+  hb_buffer_t *buffer = c->buffer;
+  int end;
+
+  /* All positions are distance from beginning of *output* buffer.
+   * Adjust. */
+  {
+    unsigned int bl = buffer->backtrack_len ();
+    end = bl + match_length;
+
+    int delta = bl - buffer->idx;
+    /* Convert positions to new indexing. */
+    for (unsigned int j = 0; j < count; j++)
+      match_positions[j] += delta;
+  }
+
+  for (unsigned int i = 0; i < lookupCount && buffer->successful; i++)
+  {
+    unsigned int idx = lookupRecord[i].sequenceIndex;
+    if (idx >= count)
+      continue;
+
+    /* Don't recurse to ourself at same position.
+     * Note that this test is too naive, it doesn't catch longer loops. */
+    if (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index)
+      continue;
+
+    if (unlikely (!buffer->move_to (match_positions[idx])))
+      break;
+
+    if (unlikely (buffer->max_ops <= 0))
+      break;
+
+    unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len ();
+    if (!c->recurse (lookupRecord[i].lookupListIndex))
+      continue;
+
+    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.
+     *
+     * TODO:
+     *
+     * Right now, if buffer length increased by n, we assume n new glyphs
+     * were added right after the current position, and if buffer length
+     * was decreased by n, we assume n match positions after the current
+     * one where removed.  The former (buffer length increased) case is
+     * fine, but the decrease case can be improved in at least two ways,
+     * both of which are significant:
+     *
+     *   - If recursed-to lookup is MultipleSubst and buffer length
+     *     decreased, then it's current match position that was deleted,
+     *     NOT the one after it.
+     *
+     *   - If buffer length was decreased by n, it does not necessarily
+     *     mean that n match positions where removed, as there might
+     *     have been marks and default-ignorables in the sequence.  We
+     *     should instead drop match positions between current-position
+     *     and current-position + n instead.
+     *
+     * It should be possible to construct tests for both of these cases.
+     */
+
+    end += delta;
+    if (end <= int (match_positions[idx]))
+    {
+      /* End might end up being smaller than match_positions[idx] if the recursed
+       * lookup ended up removing many items, more than we have had matched.
+       * Just never rewind end back and get out of here.
+       * https://bugs.chromium.org/p/chromium/issues/detail?id=659496 */
+      end = match_positions[idx];
+      /* There can't be any further changes. */
+      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;
+    }
+    else
+    {
+      /* NOTE: delta is negative. */
+      delta = MAX (delta, (int) next - (int) count);
+      next -= delta;
+    }
+
+    /* Shift! */
+    memmove (match_positions + next + delta, match_positions + next,
+	     (count - next) * sizeof (match_positions[0]));
+    next += delta;
+    count += delta;
+
+    /* Fill in new entries. */
+    for (unsigned int j = idx + 1; j < next; j++)
+      match_positions[j] = match_positions[j - 1] + 1;
+
+    /* And fixup the rest. */
+    for (; next < count; next++)
+      match_positions[next] += delta;
+  }
+
+  buffer->move_to (end);
+
+  return_trace (true);
+}
+
+
+
+/* Contextual lookups */
+
+struct ContextClosureLookupContext
+{
+  ContextClosureFuncs funcs;
+  const void *intersects_data;
+};
+
+struct ContextCollectGlyphsLookupContext
+{
+  ContextCollectGlyphsFuncs funcs;
+  const void *collect_data;
+};
+
+struct ContextApplyLookupContext
+{
+  ContextApplyFuncs funcs;
+  const void *match_data;
+};
+
+static inline bool context_intersects (const hb_set_t *glyphs,
+				       unsigned int inputCount, /* Including the first glyph (not matched) */
+				       const HBUINT16 input[], /* Array of input values--start with second glyph */
+				       ContextClosureLookupContext &lookup_context)
+{
+  return intersects_array (glyphs,
+			   inputCount ? inputCount - 1 : 0, input,
+			   lookup_context.funcs.intersects, lookup_context.intersects_data);
+}
+
+static inline void context_closure_lookup (hb_closure_context_t *c,
+					   unsigned int inputCount, /* Including the first glyph (not matched) */
+					   const HBUINT16 input[], /* Array of input values--start with second glyph */
+					   unsigned int lookupCount,
+					   const LookupRecord lookupRecord[],
+					   ContextClosureLookupContext &lookup_context)
+{
+  if (context_intersects (c->glyphs,
+			  inputCount, input,
+			  lookup_context))
+    recurse_lookups (c,
+		     lookupCount, lookupRecord);
+}
+
+static inline void context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
+						  unsigned int inputCount, /* Including the first glyph (not matched) */
+						  const HBUINT16 input[], /* Array of input values--start with second glyph */
+						  unsigned int lookupCount,
+						  const LookupRecord lookupRecord[],
+						  ContextCollectGlyphsLookupContext &lookup_context)
+{
+  collect_array (c, c->input,
+		 inputCount ? inputCount - 1 : 0, input,
+		 lookup_context.funcs.collect, lookup_context.collect_data);
+  recurse_lookups (c,
+		   lookupCount, lookupRecord);
+}
+
+static inline bool context_would_apply_lookup (hb_would_apply_context_t *c,
+					       unsigned int inputCount, /* Including the first glyph (not matched) */
+					       const HBUINT16 input[], /* Array of input values--start with second glyph */
+					       unsigned int lookupCount HB_UNUSED,
+					       const LookupRecord lookupRecord[] HB_UNUSED,
+					       ContextApplyLookupContext &lookup_context)
+{
+  return would_match_input (c,
+			    inputCount, input,
+			    lookup_context.funcs.match, lookup_context.match_data);
+}
+static inline bool context_apply_lookup (hb_ot_apply_context_t *c,
+					 unsigned int inputCount, /* Including the first glyph (not matched) */
+					 const HBUINT16 input[], /* Array of input values--start with second glyph */
+					 unsigned int lookupCount,
+					 const LookupRecord lookupRecord[],
+					 ContextApplyLookupContext &lookup_context)
+{
+  unsigned int match_length = 0;
+  unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
+  return match_input (c,
+		      inputCount, input,
+		      lookup_context.funcs.match, lookup_context.match_data,
+		      &match_length, match_positions)
+      && (c->buffer->unsafe_to_break (c->buffer->idx, c->buffer->idx + match_length),
+	  apply_lookup (c,
+		       inputCount, match_positions,
+		       lookupCount, lookupRecord,
+		       match_length));
+}
+
+struct Rule
+{
+  bool intersects (const hb_set_t *glyphs, ContextClosureLookupContext &lookup_context) const
+  {
+    return context_intersects (glyphs,
+			       inputCount, inputZ.arrayZ,
+			       lookup_context);
+  }
+
+  void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
+  {
+    const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord> >
+						       (inputZ.as_array ((inputCount ? inputCount - 1 : 0)));
+    context_closure_lookup (c,
+			    inputCount, inputZ.arrayZ,
+			    lookupCount, lookupRecord.arrayZ,
+			    lookup_context);
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c,
+		       ContextCollectGlyphsLookupContext &lookup_context) const
+  {
+    const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord> >
+						       (inputZ.as_array (inputCount ? inputCount - 1 : 0));
+    context_collect_glyphs_lookup (c,
+				   inputCount, inputZ.arrayZ,
+				   lookupCount, lookupRecord.arrayZ,
+				   lookup_context);
+  }
+
+  bool would_apply (hb_would_apply_context_t *c,
+		    ContextApplyLookupContext &lookup_context) const
+  {
+    TRACE_WOULD_APPLY (this);
+    const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord> >
+						       (inputZ.as_array (inputCount ? inputCount - 1 : 0));
+    return_trace (context_would_apply_lookup (c, inputCount, inputZ.arrayZ, lookupCount, lookupRecord.arrayZ, lookup_context));
+  }
+
+  bool apply (hb_ot_apply_context_t *c,
+	      ContextApplyLookupContext &lookup_context) const
+  {
+    TRACE_APPLY (this);
+    const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord> >
+						       (inputZ.as_array (inputCount ? inputCount - 1 : 0));
+    return_trace (context_apply_lookup (c, inputCount, inputZ.arrayZ, lookupCount, lookupRecord.arrayZ, lookup_context));
+  }
+
+  public:
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (inputCount.sanitize (c) &&
+		  lookupCount.sanitize (c) &&
+		  c->check_range (inputZ.arrayZ,
+				  inputZ.item_size * (inputCount ? inputCount - 1 : 0) +
+				  LookupRecord::static_size * lookupCount));
+  }
+
+  protected:
+  HBUINT16	inputCount;		/* Total number of glyphs in input
+					 * glyph sequence--includes the first
+					 * glyph */
+  HBUINT16	lookupCount;		/* Number of LookupRecords */
+  UnsizedArrayOf<HBUINT16>
+ 		inputZ;			/* Array of match inputs--start with
+					 * second glyph */
+/*UnsizedArrayOf<LookupRecord>
+		lookupRecordX;*/	/* Array of LookupRecords--in
+					 * design order */
+  public:
+  DEFINE_SIZE_ARRAY (4, inputZ);
+};
+
+struct RuleSet
+{
+  bool intersects (const hb_set_t *glyphs,
+		   ContextClosureLookupContext &lookup_context) const
+  {
+    unsigned int num_rules = rule.len;
+    for (unsigned int i = 0; i < num_rules; i++)
+      if ((this+rule[i]).intersects (glyphs, lookup_context))
+	return true;
+    return false;
+  }
+
+  void closure (hb_closure_context_t *c,
+		ContextClosureLookupContext &lookup_context) const
+  {
+    unsigned int num_rules = rule.len;
+    for (unsigned int i = 0; i < num_rules; i++)
+      (this+rule[i]).closure (c, lookup_context);
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c,
+		       ContextCollectGlyphsLookupContext &lookup_context) const
+  {
+    unsigned int num_rules = rule.len;
+    for (unsigned int i = 0; i < num_rules; i++)
+      (this+rule[i]).collect_glyphs (c, lookup_context);
+  }
+
+  bool would_apply (hb_would_apply_context_t *c,
+		    ContextApplyLookupContext &lookup_context) const
+  {
+    TRACE_WOULD_APPLY (this);
+    unsigned int num_rules = rule.len;
+    for (unsigned int i = 0; i < num_rules; i++)
+    {
+      if ((this+rule[i]).would_apply (c, lookup_context))
+	return_trace (true);
+    }
+    return_trace (false);
+  }
+
+  bool apply (hb_ot_apply_context_t *c,
+	      ContextApplyLookupContext &lookup_context) const
+  {
+    TRACE_APPLY (this);
+    unsigned int num_rules = rule.len;
+    for (unsigned int i = 0; i < num_rules; i++)
+    {
+      if ((this+rule[i]).apply (c, lookup_context))
+	return_trace (true);
+    }
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (rule.sanitize (c, this));
+  }
+
+  protected:
+  OffsetArrayOf<Rule>
+		rule;			/* Array of Rule tables
+					 * ordered by preference */
+  public:
+  DEFINE_SIZE_ARRAY (2, rule);
+};
+
+
+struct ContextFormat1
+{
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    struct ContextClosureLookupContext lookup_context = {
+      {intersects_glyph},
+      nullptr
+    };
+
+    unsigned int count = ruleSet.len;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+	break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
+      if (glyphs->has (iter.get_glyph ()) &&
+	  (this+ruleSet[iter.get_coverage ()]).intersects (glyphs, lookup_context))
+	return true;
+    }
+    return false;
+  }
+
+  void closure (hb_closure_context_t *c) const
+  {
+    struct ContextClosureLookupContext lookup_context = {
+      {intersects_glyph},
+      nullptr
+    };
+
+    unsigned int count = ruleSet.len;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+	break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
+      if (c->glyphs->has (iter.get_glyph ()))
+	(this+ruleSet[iter.get_coverage ()]).closure (c, lookup_context);
+    }
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    (this+coverage).add_coverage (c->input);
+
+    struct ContextCollectGlyphsLookupContext lookup_context = {
+      {collect_glyph},
+      nullptr
+    };
+
+    unsigned int count = ruleSet.len;
+    for (unsigned int i = 0; i < count; i++)
+      (this+ruleSet[i]).collect_glyphs (c, lookup_context);
+  }
+
+  bool would_apply (hb_would_apply_context_t *c) const
+  {
+    TRACE_WOULD_APPLY (this);
+
+    const RuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])];
+    struct ContextApplyLookupContext lookup_context = {
+      {match_glyph},
+      nullptr
+    };
+    return_trace (rule_set.would_apply (c, lookup_context));
+  }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED))
+      return_trace (false);
+
+    const RuleSet &rule_set = this+ruleSet[index];
+    struct ContextApplyLookupContext lookup_context = {
+      {match_glyph},
+      nullptr
+    };
+    return_trace (rule_set.apply (c, lookup_context));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (coverage.sanitize (c, this) && ruleSet.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of table */
+  OffsetArrayOf<RuleSet>
+		ruleSet;		/* Array of RuleSet tables
+					 * ordered by Coverage Index */
+  public:
+  DEFINE_SIZE_ARRAY (6, ruleSet);
+};
+
+
+struct ContextFormat2
+{
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    if (!(this+coverage).intersects (glyphs))
+      return false;
+
+    const ClassDef &class_def = this+classDef;
+
+    struct ContextClosureLookupContext lookup_context = {
+      {intersects_class},
+      &class_def
+    };
+
+    unsigned int count = ruleSet.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (class_def.intersects_class (glyphs, i) &&
+	  (this+ruleSet[i]).intersects (glyphs, lookup_context))
+	return true;
+
+    return false;
+  }
+
+  void closure (hb_closure_context_t *c) const
+  {
+    if (!(this+coverage).intersects (c->glyphs))
+      return;
+
+    const ClassDef &class_def = this+classDef;
+
+    struct ContextClosureLookupContext lookup_context = {
+      {intersects_class},
+      &class_def
+    };
+
+    unsigned int count = ruleSet.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (class_def.intersects_class (c->glyphs, i)) {
+	const RuleSet &rule_set = this+ruleSet[i];
+	rule_set.closure (c, lookup_context);
+      }
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    (this+coverage).add_coverage (c->input);
+
+    const ClassDef &class_def = this+classDef;
+    struct ContextCollectGlyphsLookupContext lookup_context = {
+      {collect_class},
+      &class_def
+    };
+
+    unsigned int count = ruleSet.len;
+    for (unsigned int i = 0; i < count; i++)
+      (this+ruleSet[i]).collect_glyphs (c, lookup_context);
+  }
+
+  bool would_apply (hb_would_apply_context_t *c) const
+  {
+    TRACE_WOULD_APPLY (this);
+
+    const ClassDef &class_def = this+classDef;
+    unsigned int index = class_def.get_class (c->glyphs[0]);
+    const RuleSet &rule_set = this+ruleSet[index];
+    struct ContextApplyLookupContext lookup_context = {
+      {match_class},
+      &class_def
+    };
+    return_trace (rule_set.would_apply (c, lookup_context));
+  }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    const ClassDef &class_def = this+classDef;
+    index = class_def.get_class (c->buffer->cur().codepoint);
+    const RuleSet &rule_set = this+ruleSet[index];
+    struct ContextApplyLookupContext lookup_context = {
+      {match_class},
+      &class_def
+    };
+    return_trace (rule_set.apply (c, lookup_context));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (coverage.sanitize (c, this) && classDef.sanitize (c, this) && ruleSet.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 2 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of table */
+  OffsetTo<ClassDef>
+		classDef;		/* Offset to glyph ClassDef table--from
+					 * beginning of table */
+  OffsetArrayOf<RuleSet>
+		ruleSet;		/* Array of RuleSet tables
+					 * ordered by class */
+  public:
+  DEFINE_SIZE_ARRAY (8, ruleSet);
+};
+
+
+struct ContextFormat3
+{
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    if (!(this+coverageZ[0]).intersects (glyphs))
+      return false;
+
+    struct ContextClosureLookupContext lookup_context = {
+      {intersects_coverage},
+      this
+    };
+    return context_intersects (glyphs,
+			       glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1),
+			       lookup_context);
+  }
+
+  void closure (hb_closure_context_t *c) const
+  {
+    if (!(this+coverageZ[0]).intersects (c->glyphs))
+      return;
+
+    const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
+    struct ContextClosureLookupContext lookup_context = {
+      {intersects_coverage},
+      this
+    };
+    context_closure_lookup (c,
+			    glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1),
+			    lookupCount, lookupRecord,
+			    lookup_context);
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    (this+coverageZ[0]).add_coverage (c->input);
+
+    const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
+    struct ContextCollectGlyphsLookupContext lookup_context = {
+      {collect_coverage},
+      this
+    };
+
+    context_collect_glyphs_lookup (c,
+				   glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1),
+				   lookupCount, lookupRecord,
+				   lookup_context);
+  }
+
+  bool would_apply (hb_would_apply_context_t *c) const
+  {
+    TRACE_WOULD_APPLY (this);
+
+    const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
+    struct ContextApplyLookupContext lookup_context = {
+      {match_coverage},
+      this
+    };
+    return_trace (context_would_apply_lookup (c, glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1), lookupCount, lookupRecord, lookup_context));
+  }
+
+  const Coverage &get_coverage () const { return this+coverageZ[0]; }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    unsigned int index = (this+coverageZ[0]).get_coverage (c->buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
+    struct ContextApplyLookupContext lookup_context = {
+      {match_coverage},
+      this
+    };
+    return_trace (context_apply_lookup (c, glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1), lookupCount, lookupRecord, lookup_context));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!c->check_struct (this)) return_trace (false);
+    unsigned int count = glyphCount;
+    if (!count) return_trace (false); /* We want to access coverageZ[0] freely. */
+    if (!c->check_array (coverageZ.arrayZ, count)) return_trace (false);
+    for (unsigned int i = 0; i < count; i++)
+      if (!coverageZ[i].sanitize (c, this)) return_trace (false);
+    const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
+    return_trace (c->check_array (lookupRecord, lookupCount));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 3 */
+  HBUINT16	glyphCount;		/* Number of glyphs in the input glyph
+					 * sequence */
+  HBUINT16	lookupCount;		/* Number of LookupRecords */
+  UnsizedArrayOf<OffsetTo<Coverage> >
+		coverageZ;		/* Array of offsets to Coverage
+					 * table in glyph sequence order */
+/*UnsizedArrayOf<LookupRecord>
+		lookupRecordX;*/	/* Array of LookupRecords--in
+					 * design order */
+  public:
+  DEFINE_SIZE_ARRAY (6, coverageZ);
+};
+
+struct Context
+{
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1));
+    case 2: return_trace (c->dispatch (u.format2));
+    case 3: return_trace (c->dispatch (u.format3));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  ContextFormat1	format1;
+  ContextFormat2	format2;
+  ContextFormat3	format3;
+  } u;
+};
+
+
+/* Chaining Contextual lookups */
+
+struct ChainContextClosureLookupContext
+{
+  ContextClosureFuncs funcs;
+  const void *intersects_data[3];
+};
+
+struct ChainContextCollectGlyphsLookupContext
+{
+  ContextCollectGlyphsFuncs funcs;
+  const void *collect_data[3];
+};
+
+struct ChainContextApplyLookupContext
+{
+  ContextApplyFuncs funcs;
+  const void *match_data[3];
+};
+
+static inline bool chain_context_intersects (const hb_set_t *glyphs,
+					     unsigned int backtrackCount,
+					     const HBUINT16 backtrack[],
+					     unsigned int inputCount, /* Including the first glyph (not matched) */
+					     const HBUINT16 input[], /* Array of input values--start with second glyph */
+					     unsigned int lookaheadCount,
+					     const HBUINT16 lookahead[],
+					     ChainContextClosureLookupContext &lookup_context)
+{
+  return intersects_array (glyphs,
+			   backtrackCount, backtrack,
+			   lookup_context.funcs.intersects, lookup_context.intersects_data[0])
+      && intersects_array (glyphs,
+			   inputCount ? inputCount - 1 : 0, input,
+			   lookup_context.funcs.intersects, lookup_context.intersects_data[1])
+      && intersects_array (glyphs,
+			  lookaheadCount, lookahead,
+			  lookup_context.funcs.intersects, lookup_context.intersects_data[2]);
+}
+
+static inline void chain_context_closure_lookup (hb_closure_context_t *c,
+						 unsigned int backtrackCount,
+						 const HBUINT16 backtrack[],
+						 unsigned int inputCount, /* Including the first glyph (not matched) */
+						 const HBUINT16 input[], /* Array of input values--start with second glyph */
+						 unsigned int lookaheadCount,
+						 const HBUINT16 lookahead[],
+						 unsigned int lookupCount,
+						 const LookupRecord lookupRecord[],
+						 ChainContextClosureLookupContext &lookup_context)
+{
+  if (chain_context_intersects (c->glyphs,
+				backtrackCount, backtrack,
+				inputCount, input,
+				lookaheadCount, lookahead,
+				lookup_context))
+    recurse_lookups (c,
+		     lookupCount, lookupRecord);
+}
+
+static inline void chain_context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
+							unsigned int backtrackCount,
+							const HBUINT16 backtrack[],
+							unsigned int inputCount, /* Including the first glyph (not matched) */
+							const HBUINT16 input[], /* Array of input values--start with second glyph */
+							unsigned int lookaheadCount,
+							const HBUINT16 lookahead[],
+							unsigned int lookupCount,
+							const LookupRecord lookupRecord[],
+							ChainContextCollectGlyphsLookupContext &lookup_context)
+{
+  collect_array (c, c->before,
+		 backtrackCount, backtrack,
+		 lookup_context.funcs.collect, lookup_context.collect_data[0]);
+  collect_array (c, c->input,
+		 inputCount ? inputCount - 1 : 0, input,
+		 lookup_context.funcs.collect, lookup_context.collect_data[1]);
+  collect_array (c, c->after,
+		 lookaheadCount, lookahead,
+		 lookup_context.funcs.collect, lookup_context.collect_data[2]);
+  recurse_lookups (c,
+		   lookupCount, lookupRecord);
+}
+
+static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c,
+						     unsigned int backtrackCount,
+						     const HBUINT16 backtrack[] HB_UNUSED,
+						     unsigned int inputCount, /* Including the first glyph (not matched) */
+						     const HBUINT16 input[], /* Array of input values--start with second glyph */
+						     unsigned int lookaheadCount,
+						     const HBUINT16 lookahead[] HB_UNUSED,
+						     unsigned int lookupCount HB_UNUSED,
+						     const LookupRecord lookupRecord[] HB_UNUSED,
+						     ChainContextApplyLookupContext &lookup_context)
+{
+  return (c->zero_context ? !backtrackCount && !lookaheadCount : true)
+      && would_match_input (c,
+			    inputCount, input,
+			    lookup_context.funcs.match, lookup_context.match_data[1]);
+}
+
+static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c,
+					       unsigned int backtrackCount,
+					       const HBUINT16 backtrack[],
+					       unsigned int inputCount, /* Including the first glyph (not matched) */
+					       const HBUINT16 input[], /* Array of input values--start with second glyph */
+					       unsigned int lookaheadCount,
+					       const HBUINT16 lookahead[],
+					       unsigned int lookupCount,
+					       const LookupRecord lookupRecord[],
+					       ChainContextApplyLookupContext &lookup_context)
+{
+  unsigned int start_index = 0, match_length = 0, end_index = 0;
+  unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
+  return match_input (c,
+		      inputCount, input,
+		      lookup_context.funcs.match, lookup_context.match_data[1],
+		      &match_length, match_positions)
+      && match_backtrack (c,
+			  backtrackCount, backtrack,
+			  lookup_context.funcs.match, lookup_context.match_data[0],
+			  &start_index)
+      && match_lookahead (c,
+			  lookaheadCount, lookahead,
+			  lookup_context.funcs.match, lookup_context.match_data[2],
+			  match_length, &end_index)
+      && (c->buffer->unsafe_to_break_from_outbuffer (start_index, end_index),
+	  apply_lookup (c,
+			inputCount, match_positions,
+			lookupCount, lookupRecord,
+			match_length));
+}
+
+struct ChainRule
+{
+  bool intersects (const hb_set_t *glyphs, ChainContextClosureLookupContext &lookup_context) const
+  {
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
+    return chain_context_intersects (glyphs,
+				     backtrack.len, backtrack.arrayZ,
+				     input.lenP1, input.arrayZ,
+				     lookahead.len, lookahead.arrayZ,
+				     lookup_context);
+  }
+
+  void closure (hb_closure_context_t *c,
+		ChainContextClosureLookupContext &lookup_context) const
+  {
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
+    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
+    chain_context_closure_lookup (c,
+				  backtrack.len, backtrack.arrayZ,
+				  input.lenP1, input.arrayZ,
+				  lookahead.len, lookahead.arrayZ,
+				  lookup.len, lookup.arrayZ,
+				  lookup_context);
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c,
+		       ChainContextCollectGlyphsLookupContext &lookup_context) const
+  {
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
+    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
+    chain_context_collect_glyphs_lookup (c,
+					 backtrack.len, backtrack.arrayZ,
+					 input.lenP1, input.arrayZ,
+					 lookahead.len, lookahead.arrayZ,
+					 lookup.len, lookup.arrayZ,
+					 lookup_context);
+  }
+
+  bool would_apply (hb_would_apply_context_t *c,
+		    ChainContextApplyLookupContext &lookup_context) const
+  {
+    TRACE_WOULD_APPLY (this);
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
+    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
+    return_trace (chain_context_would_apply_lookup (c,
+						    backtrack.len, backtrack.arrayZ,
+						    input.lenP1, input.arrayZ,
+						    lookahead.len, lookahead.arrayZ, lookup.len,
+						    lookup.arrayZ, lookup_context));
+  }
+
+  bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
+  {
+    TRACE_APPLY (this);
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
+    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
+    return_trace (chain_context_apply_lookup (c,
+					      backtrack.len, backtrack.arrayZ,
+					      input.lenP1, input.arrayZ,
+					      lookahead.len, lookahead.arrayZ, lookup.len,
+					      lookup.arrayZ, lookup_context));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!backtrack.sanitize (c)) return_trace (false);
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
+    if (!input.sanitize (c)) return_trace (false);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
+    if (!lookahead.sanitize (c)) return_trace (false);
+    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
+    return_trace (lookup.sanitize (c));
+  }
+
+  protected:
+  ArrayOf<HBUINT16>
+		backtrack;		/* Array of backtracking values
+					 * (to be matched before the input
+					 * sequence) */
+  HeadlessArrayOf<HBUINT16>
+		inputX;			/* Array of input values (start with
+					 * second glyph) */
+  ArrayOf<HBUINT16>
+		lookaheadX;		/* Array of lookahead values's (to be
+					 * matched after the input sequence) */
+  ArrayOf<LookupRecord>
+		lookupX;		/* Array of LookupRecords--in
+					 * design order) */
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+struct ChainRuleSet
+{
+  bool intersects (const hb_set_t *glyphs, ChainContextClosureLookupContext &lookup_context) const
+  {
+    unsigned int num_rules = rule.len;
+    for (unsigned int i = 0; i < num_rules; i++)
+      if ((this+rule[i]).intersects (glyphs, lookup_context))
+	return true;
+    return false;
+  }
+  void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
+  {
+    unsigned int num_rules = rule.len;
+    for (unsigned int i = 0; i < num_rules; i++)
+      (this+rule[i]).closure (c, lookup_context);
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const
+  {
+    unsigned int num_rules = rule.len;
+    for (unsigned int i = 0; i < num_rules; i++)
+      (this+rule[i]).collect_glyphs (c, lookup_context);
+  }
+
+  bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
+  {
+    TRACE_WOULD_APPLY (this);
+    unsigned int num_rules = rule.len;
+    for (unsigned int i = 0; i < num_rules; i++)
+      if ((this+rule[i]).would_apply (c, lookup_context))
+	return_trace (true);
+
+    return_trace (false);
+  }
+
+  bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
+  {
+    TRACE_APPLY (this);
+    unsigned int num_rules = rule.len;
+    for (unsigned int i = 0; i < num_rules; i++)
+      if ((this+rule[i]).apply (c, lookup_context))
+	return_trace (true);
+
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (rule.sanitize (c, this));
+  }
+
+  protected:
+  OffsetArrayOf<ChainRule>
+		rule;			/* Array of ChainRule tables
+					 * ordered by preference */
+  public:
+  DEFINE_SIZE_ARRAY (2, rule);
+};
+
+struct ChainContextFormat1
+{
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    struct ChainContextClosureLookupContext lookup_context = {
+      {intersects_glyph},
+      {nullptr, nullptr, nullptr}
+    };
+
+    unsigned int count = ruleSet.len;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+	break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
+      if (glyphs->has (iter.get_glyph ()) &&
+	  (this+ruleSet[iter.get_coverage ()]).intersects (glyphs, lookup_context))
+	return true;
+    }
+    return false;
+  }
+
+  void closure (hb_closure_context_t *c) const
+  {
+    struct ChainContextClosureLookupContext lookup_context = {
+      {intersects_glyph},
+      {nullptr, nullptr, nullptr}
+    };
+
+    unsigned int count = ruleSet.len;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+	break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
+      if (c->glyphs->has (iter.get_glyph ()))
+	(this+ruleSet[iter.get_coverage ()]).closure (c, lookup_context);
+    }
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    (this+coverage).add_coverage (c->input);
+
+    struct ChainContextCollectGlyphsLookupContext lookup_context = {
+      {collect_glyph},
+      {nullptr, nullptr, nullptr}
+    };
+
+    unsigned int count = ruleSet.len;
+    for (unsigned int i = 0; i < count; i++)
+      (this+ruleSet[i]).collect_glyphs (c, lookup_context);
+  }
+
+  bool would_apply (hb_would_apply_context_t *c) const
+  {
+    TRACE_WOULD_APPLY (this);
+
+    const ChainRuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])];
+    struct ChainContextApplyLookupContext lookup_context = {
+      {match_glyph},
+      {nullptr, nullptr, nullptr}
+    };
+    return_trace (rule_set.would_apply (c, lookup_context));
+  }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    const ChainRuleSet &rule_set = this+ruleSet[index];
+    struct ChainContextApplyLookupContext lookup_context = {
+      {match_glyph},
+      {nullptr, nullptr, nullptr}
+    };
+    return_trace (rule_set.apply (c, lookup_context));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (coverage.sanitize (c, this) && ruleSet.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of table */
+  OffsetArrayOf<ChainRuleSet>
+		ruleSet;		/* Array of ChainRuleSet tables
+					 * ordered by Coverage Index */
+  public:
+  DEFINE_SIZE_ARRAY (6, ruleSet);
+};
+
+struct ChainContextFormat2
+{
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    if (!(this+coverage).intersects (glyphs))
+      return false;
+
+    const ClassDef &backtrack_class_def = this+backtrackClassDef;
+    const ClassDef &input_class_def = this+inputClassDef;
+    const ClassDef &lookahead_class_def = this+lookaheadClassDef;
+
+    struct ChainContextClosureLookupContext lookup_context = {
+      {intersects_class},
+      {&backtrack_class_def,
+       &input_class_def,
+       &lookahead_class_def}
+    };
+
+    unsigned int count = ruleSet.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (input_class_def.intersects_class (glyphs, i) &&
+	  (this+ruleSet[i]).intersects (glyphs, lookup_context))
+	return true;
+
+    return false;
+  }
+  void closure (hb_closure_context_t *c) const
+  {
+    if (!(this+coverage).intersects (c->glyphs))
+      return;
+
+    const ClassDef &backtrack_class_def = this+backtrackClassDef;
+    const ClassDef &input_class_def = this+inputClassDef;
+    const ClassDef &lookahead_class_def = this+lookaheadClassDef;
+
+    struct ChainContextClosureLookupContext lookup_context = {
+      {intersects_class},
+      {&backtrack_class_def,
+       &input_class_def,
+       &lookahead_class_def}
+    };
+
+    unsigned int count = ruleSet.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (input_class_def.intersects_class (c->glyphs, i)) {
+	const ChainRuleSet &rule_set = this+ruleSet[i];
+	rule_set.closure (c, lookup_context);
+      }
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    (this+coverage).add_coverage (c->input);
+
+    const ClassDef &backtrack_class_def = this+backtrackClassDef;
+    const ClassDef &input_class_def = this+inputClassDef;
+    const ClassDef &lookahead_class_def = this+lookaheadClassDef;
+
+    struct ChainContextCollectGlyphsLookupContext lookup_context = {
+      {collect_class},
+      {&backtrack_class_def,
+       &input_class_def,
+       &lookahead_class_def}
+    };
+
+    unsigned int count = ruleSet.len;
+    for (unsigned int i = 0; i < count; i++)
+      (this+ruleSet[i]).collect_glyphs (c, lookup_context);
+  }
+
+  bool would_apply (hb_would_apply_context_t *c) const
+  {
+    TRACE_WOULD_APPLY (this);
+
+    const ClassDef &backtrack_class_def = this+backtrackClassDef;
+    const ClassDef &input_class_def = this+inputClassDef;
+    const ClassDef &lookahead_class_def = this+lookaheadClassDef;
+
+    unsigned int index = input_class_def.get_class (c->glyphs[0]);
+    const ChainRuleSet &rule_set = this+ruleSet[index];
+    struct ChainContextApplyLookupContext lookup_context = {
+      {match_class},
+      {&backtrack_class_def,
+       &input_class_def,
+       &lookahead_class_def}
+    };
+    return_trace (rule_set.would_apply (c, lookup_context));
+  }
+
+  const Coverage &get_coverage () const { return this+coverage; }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    const ClassDef &backtrack_class_def = this+backtrackClassDef;
+    const ClassDef &input_class_def = this+inputClassDef;
+    const ClassDef &lookahead_class_def = this+lookaheadClassDef;
+
+    index = input_class_def.get_class (c->buffer->cur().codepoint);
+    const ChainRuleSet &rule_set = this+ruleSet[index];
+    struct ChainContextApplyLookupContext lookup_context = {
+      {match_class},
+      {&backtrack_class_def,
+       &input_class_def,
+       &lookahead_class_def}
+    };
+    return_trace (rule_set.apply (c, lookup_context));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (coverage.sanitize (c, this) &&
+		  backtrackClassDef.sanitize (c, this) &&
+		  inputClassDef.sanitize (c, this) &&
+		  lookaheadClassDef.sanitize (c, this) &&
+		  ruleSet.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 2 */
+  OffsetTo<Coverage>
+		coverage;		/* Offset to Coverage table--from
+					 * beginning of table */
+  OffsetTo<ClassDef>
+		backtrackClassDef;	/* Offset to glyph ClassDef table
+					 * containing backtrack sequence
+					 * data--from beginning of table */
+  OffsetTo<ClassDef>
+		inputClassDef;		/* Offset to glyph ClassDef
+					 * table containing input sequence
+					 * data--from beginning of table */
+  OffsetTo<ClassDef>
+		lookaheadClassDef;	/* Offset to glyph ClassDef table
+					 * containing lookahead sequence
+					 * data--from beginning of table */
+  OffsetArrayOf<ChainRuleSet>
+		ruleSet;		/* Array of ChainRuleSet tables
+					 * ordered by class */
+  public:
+  DEFINE_SIZE_ARRAY (12, ruleSet);
+};
+
+struct ChainContextFormat3
+{
+  bool intersects (const hb_set_t *glyphs) const
+  {
+    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+
+    if (!(this+input[0]).intersects (glyphs))
+      return false;
+
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
+    struct ChainContextClosureLookupContext lookup_context = {
+      {intersects_coverage},
+      {this, this, this}
+    };
+    return chain_context_intersects (glyphs,
+				     backtrack.len, (const HBUINT16 *) backtrack.arrayZ,
+				     input.len, (const HBUINT16 *) input.arrayZ + 1,
+				     lookahead.len, (const HBUINT16 *) lookahead.arrayZ,
+				     lookup_context);
+  }
+
+  void closure (hb_closure_context_t *c) const
+  {
+    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+
+    if (!(this+input[0]).intersects (c->glyphs))
+      return;
+
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
+    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
+    struct ChainContextClosureLookupContext lookup_context = {
+      {intersects_coverage},
+      {this, this, this}
+    };
+    chain_context_closure_lookup (c,
+				  backtrack.len, (const HBUINT16 *) backtrack.arrayZ,
+				  input.len, (const HBUINT16 *) input.arrayZ + 1,
+				  lookahead.len, (const HBUINT16 *) lookahead.arrayZ,
+				  lookup.len, lookup.arrayZ,
+				  lookup_context);
+  }
+
+  void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+
+    (this+input[0]).add_coverage (c->input);
+
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
+    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
+    struct ChainContextCollectGlyphsLookupContext lookup_context = {
+      {collect_coverage},
+      {this, this, this}
+    };
+    chain_context_collect_glyphs_lookup (c,
+					 backtrack.len, (const HBUINT16 *) backtrack.arrayZ,
+					 input.len, (const HBUINT16 *) input.arrayZ + 1,
+					 lookahead.len, (const HBUINT16 *) lookahead.arrayZ,
+					 lookup.len, lookup.arrayZ,
+					 lookup_context);
+  }
+
+  bool would_apply (hb_would_apply_context_t *c) const
+  {
+    TRACE_WOULD_APPLY (this);
+
+    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
+    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
+    struct ChainContextApplyLookupContext lookup_context = {
+      {match_coverage},
+      {this, this, this}
+    };
+    return_trace (chain_context_would_apply_lookup (c,
+						    backtrack.len, (const HBUINT16 *) backtrack.arrayZ,
+						    input.len, (const HBUINT16 *) input.arrayZ + 1,
+						    lookahead.len, (const HBUINT16 *) lookahead.arrayZ,
+						    lookup.len, lookup.arrayZ, lookup_context));
+  }
+
+  const Coverage &get_coverage () const
+  {
+    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+    return this+input[0];
+  }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+
+    unsigned int index = (this+input[0]).get_coverage (c->buffer->cur().codepoint);
+    if (likely (index == NOT_COVERED)) return_trace (false);
+
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
+    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
+    struct ChainContextApplyLookupContext lookup_context = {
+      {match_coverage},
+      {this, this, this}
+    };
+    return_trace (chain_context_apply_lookup (c,
+					      backtrack.len, (const HBUINT16 *) backtrack.arrayZ,
+					      input.len, (const HBUINT16 *) input.arrayZ + 1,
+					      lookahead.len, (const HBUINT16 *) lookahead.arrayZ,
+					      lookup.len, lookup.arrayZ, lookup_context));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    // TODO(subset)
+    return_trace (false);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!backtrack.sanitize (c, this)) return_trace (false);
+    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+    if (!input.sanitize (c, this)) return_trace (false);
+    if (!input.len) return_trace (false); /* To be consistent with Context. */
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
+    if (!lookahead.sanitize (c, this)) return_trace (false);
+    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
+    return_trace (lookup.sanitize (c));
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier--format = 3 */
+  OffsetArrayOf<Coverage>
+		backtrack;		/* Array of coverage tables
+					 * in backtracking sequence, in  glyph
+					 * sequence order */
+  OffsetArrayOf<Coverage>
+		inputX		;	/* Array of coverage
+					 * tables in input sequence, in glyph
+					 * sequence order */
+  OffsetArrayOf<Coverage>
+		lookaheadX;		/* Array of coverage tables
+					 * in lookahead sequence, in glyph
+					 * sequence order */
+  ArrayOf<LookupRecord>
+		lookupX;		/* Array of LookupRecords--in
+					 * design order) */
+  public:
+  DEFINE_SIZE_MIN (10);
+};
+
+struct ChainContext
+{
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1));
+    case 2: return_trace (c->dispatch (u.format2));
+    case 3: return_trace (c->dispatch (u.format3));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;	/* Format identifier */
+  ChainContextFormat1	format1;
+  ChainContextFormat2	format2;
+  ChainContextFormat3	format3;
+  } u;
+};
+
+
+template <typename T>
+struct ExtensionFormat1
+{
+  unsigned int get_type () const { return extensionLookupType; }
+
+  template <typename X>
+  const X& get_subtable () const
+  {
+    unsigned int offset = extensionOffset;
+    if (unlikely (!offset)) return Null(typename T::SubTable);
+    return StructAtOffset<typename T::SubTable> (this, offset);
+  }
+
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, format);
+    if (unlikely (!c->may_dispatch (this, this))) return_trace (c->no_dispatch_return_value ());
+    return_trace (get_subtable<typename T::SubTable> ().dispatch (c, get_type ()));
+  }
+
+  /* This is called from may_dispatch() above with hb_sanitize_context_t. */
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  extensionOffset != 0 &&
+		  extensionLookupType != T::SubTable::Extension);
+  }
+
+  protected:
+  HBUINT16	format;			/* Format identifier. Set to 1. */
+  HBUINT16	extensionLookupType;	/* Lookup type of subtable referenced
+					 * by ExtensionOffset (i.e. the
+					 * extension subtable). */
+  HBUINT32	extensionOffset;	/* Offset to the extension subtable,
+					 * of lookup type subtable. */
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+template <typename T>
+struct Extension
+{
+  unsigned int get_type () const
+  {
+    switch (u.format) {
+    case 1: return u.format1.get_type ();
+    default:return 0;
+    }
+  }
+  template <typename X>
+  const X& get_subtable () const
+  {
+    switch (u.format) {
+    case 1: return u.format1.template get_subtable<typename T::SubTable> ();
+    default:return Null(typename T::SubTable);
+    }
+  }
+
+  template <typename context_t>
+  typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (u.format1.dispatch (c));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  ExtensionFormat1<T>	format1;
+  } u;
+};
+
+
+/*
+ * GSUB/GPOS Common
+ */
+
+struct hb_ot_layout_lookup_accelerator_t
+{
+  template <typename TLookup>
+  void init (const TLookup &lookup)
+  {
+    digest.init ();
+    lookup.add_coverage (&digest);
+
+    subtables.init ();
+    OT::hb_get_subtables_context_t c_get_subtables (subtables);
+    lookup.dispatch (&c_get_subtables);
+  }
+  void fini () { subtables.fini (); }
+
+  bool may_have (hb_codepoint_t g) const
+  { return digest.may_have (g); }
+
+  bool apply (hb_ot_apply_context_t *c) const
+  {
+    for (unsigned int i = 0; i < subtables.length; i++)
+      if (subtables[i].apply (c))
+	return true;
+    return false;
+  }
+
+  private:
+  hb_set_digest_t digest;
+  hb_get_subtables_context_t::array_t subtables;
+};
+
+struct GSUBGPOS
+{
+  bool has_data () const { return version.to_int (); }
+  unsigned int get_script_count () const
+  { return (this+scriptList).len; }
+  const Tag& get_script_tag (unsigned int i) const
+  { return (this+scriptList).get_tag (i); }
+  unsigned int get_script_tags (unsigned int start_offset,
+				unsigned int *script_count /* IN/OUT */,
+				hb_tag_t     *script_tags /* OUT */) const
+  { return (this+scriptList).get_tags (start_offset, script_count, script_tags); }
+  const Script& get_script (unsigned int i) const
+  { return (this+scriptList)[i]; }
+  bool find_script_index (hb_tag_t tag, unsigned int *index) const
+  { return (this+scriptList).find_index (tag, index); }
+
+  unsigned int get_feature_count () const
+  { return (this+featureList).len; }
+  hb_tag_t get_feature_tag (unsigned int i) const
+  { return i == Index::NOT_FOUND_INDEX ? HB_TAG_NONE : (this+featureList).get_tag (i); }
+  unsigned int get_feature_tags (unsigned int start_offset,
+				 unsigned int *feature_count /* IN/OUT */,
+				 hb_tag_t     *feature_tags /* OUT */) const
+  { return (this+featureList).get_tags (start_offset, feature_count, feature_tags); }
+  const Feature& get_feature (unsigned int i) const
+  { return (this+featureList)[i]; }
+  bool find_feature_index (hb_tag_t tag, unsigned int *index) const
+  { return (this+featureList).find_index (tag, index); }
+
+  unsigned int get_lookup_count () const
+  { return (this+lookupList).len; }
+  const Lookup& get_lookup (unsigned int i) const
+  { return (this+lookupList)[i]; }
+
+  bool find_variations_index (const int *coords, unsigned int num_coords,
+			      unsigned int *index) const
+  { return (version.to_int () >= 0x00010001u ? this+featureVars : Null(FeatureVariations))
+	   .find_index (coords, num_coords, index); }
+  const Feature& get_feature_variation (unsigned int feature_index,
+					unsigned int variations_index) const
+  {
+    if (FeatureVariations::NOT_FOUND_INDEX != variations_index &&
+	version.to_int () >= 0x00010001u)
+    {
+      const Feature *feature = (this+featureVars).find_substitute (variations_index,
+								   feature_index);
+      if (feature)
+	return *feature;
+    }
+    return get_feature (feature_index);
+  }
+
+  template <typename TLookup>
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    struct GSUBGPOS *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+
+    out->scriptList.serialize_subset (c, this+scriptList, out);
+    out->featureList.serialize_subset (c, this+featureList, out);
+
+    typedef OffsetListOf<TLookup> TLookupList;
+    /* TODO Use intersects() to count how many subtables survive? */
+    CastR<OffsetTo<TLookupList> > (out->lookupList)
+      .serialize_subset (c,
+			 this+CastR<const OffsetTo<TLookupList> > (lookupList),
+			 out);
+
+    if (version.to_int () >= 0x00010001u)
+     out->featureVars.serialize_subset (c, this+featureVars, out);
+
+    return_trace (true);
+  }
+
+  unsigned int get_size () const
+  {
+    return min_size +
+	   (version.to_int () >= 0x00010001u ? featureVars.static_size : 0);
+  }
+
+  template <typename TLookup>
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    typedef OffsetListOf<TLookup> TLookupList;
+    return_trace (version.sanitize (c) &&
+		  likely (version.major == 1) &&
+		  scriptList.sanitize (c, this) &&
+		  featureList.sanitize (c, this) &&
+		  CastR<OffsetTo<TLookupList> > (lookupList).sanitize (c, this) &&
+		  (version.to_int () < 0x00010001u || featureVars.sanitize (c, this)));
+  }
+
+  template <typename T>
+  struct accelerator_t
+  {
+    void init (hb_face_t *face)
+    {
+      this->table = hb_sanitize_context_t().reference_table<T> (face);
+      if (unlikely (this->table->is_blacklisted (this->table.get_blob (), face)))
+      {
+	hb_blob_destroy (this->table.get_blob ());
+	this->table = hb_blob_get_empty ();
+      }
+
+      this->lookup_count = table->get_lookup_count ();
+
+      this->accels = (hb_ot_layout_lookup_accelerator_t *) calloc (this->lookup_count, sizeof (hb_ot_layout_lookup_accelerator_t));
+      if (unlikely (!this->accels))
+	this->lookup_count = 0;
+
+      for (unsigned int i = 0; i < this->lookup_count; i++)
+	this->accels[i].init (table->get_lookup (i));
+    }
+
+    void fini ()
+    {
+      for (unsigned int i = 0; i < this->lookup_count; i++)
+	this->accels[i].fini ();
+      free (this->accels);
+      this->table.destroy ();
+    }
+
+    hb_blob_ptr_t<T> table;
+    unsigned int lookup_count;
+    hb_ot_layout_lookup_accelerator_t *accels;
+  };
+
+  protected:
+  FixedVersion<>version;	/* Version of the GSUB/GPOS table--initially set
+				 * to 0x00010000u */
+  OffsetTo<ScriptList>
+		scriptList;  	/* ScriptList table */
+  OffsetTo<FeatureList>
+		featureList; 	/* FeatureList table */
+  OffsetTo<LookupList>
+		lookupList; 	/* LookupList table */
+  LOffsetTo<FeatureVariations>
+		featureVars;	/* Offset to Feature Variations
+				   table--from beginning of table
+				 * (may be NULL).  Introduced
+				 * in version 0x00010001. */
+  public:
+  DEFINE_SIZE_MIN (10);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_LAYOUT_GSUBGPOS_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-jstf-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-jstf-table.hh
new file mode 100644
index 0000000..1dd31d5
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout-jstf-table.hh
@@ -0,0 +1,235 @@
+/*
+ * Copyright © 2013  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_LAYOUT_JSTF_TABLE_HH
+#define HB_OT_LAYOUT_JSTF_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-layout-gpos-table.hh"
+
+
+namespace OT {
+
+
+/*
+ * JstfModList -- Justification Modification List Tables
+ */
+
+typedef IndexArray JstfModList;
+
+
+/*
+ * JstfMax -- Justification Maximum Table
+ */
+
+typedef OffsetListOf<PosLookup> JstfMax;
+
+
+/*
+ * JstfPriority -- Justification Priority Table
+ */
+
+struct JstfPriority
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  shrinkageEnableGSUB.sanitize (c, this) &&
+		  shrinkageDisableGSUB.sanitize (c, this) &&
+		  shrinkageEnableGPOS.sanitize (c, this) &&
+		  shrinkageDisableGPOS.sanitize (c, this) &&
+		  shrinkageJstfMax.sanitize (c, this) &&
+		  extensionEnableGSUB.sanitize (c, this) &&
+		  extensionDisableGSUB.sanitize (c, this) &&
+		  extensionEnableGPOS.sanitize (c, this) &&
+		  extensionDisableGPOS.sanitize (c, this) &&
+		  extensionJstfMax.sanitize (c, this));
+  }
+
+  protected:
+  OffsetTo<JstfModList>
+		shrinkageEnableGSUB;	/* Offset to Shrinkage Enable GSUB
+					 * JstfModList table--from beginning of
+					 * JstfPriority table--may be NULL */
+  OffsetTo<JstfModList>
+		shrinkageDisableGSUB;	/* Offset to Shrinkage Disable GSUB
+					 * JstfModList table--from beginning of
+					 * JstfPriority table--may be NULL */
+  OffsetTo<JstfModList>
+		shrinkageEnableGPOS;	/* Offset to Shrinkage Enable GPOS
+					 * JstfModList table--from beginning of
+					 * JstfPriority table--may be NULL */
+  OffsetTo<JstfModList>
+		shrinkageDisableGPOS;	/* Offset to Shrinkage Disable GPOS
+					 * JstfModList table--from beginning of
+					 * JstfPriority table--may be NULL */
+  OffsetTo<JstfMax>
+		shrinkageJstfMax;	/* Offset to Shrinkage JstfMax table--
+					 * from beginning of JstfPriority table
+					 * --may be NULL */
+  OffsetTo<JstfModList>
+		extensionEnableGSUB;	/* Offset to Extension Enable GSUB
+					 * JstfModList table--from beginning of
+					 * JstfPriority table--may be NULL */
+  OffsetTo<JstfModList>
+		extensionDisableGSUB;	/* Offset to Extension Disable GSUB
+					 * JstfModList table--from beginning of
+					 * JstfPriority table--may be NULL */
+  OffsetTo<JstfModList>
+		extensionEnableGPOS;	/* Offset to Extension Enable GPOS
+					 * JstfModList table--from beginning of
+					 * JstfPriority table--may be NULL */
+  OffsetTo<JstfModList>
+		extensionDisableGPOS;	/* Offset to Extension Disable GPOS
+					 * JstfModList table--from beginning of
+					 * JstfPriority table--may be NULL */
+  OffsetTo<JstfMax>
+		extensionJstfMax;	/* Offset to Extension JstfMax table--
+					 * from beginning of JstfPriority table
+					 * --may be NULL */
+
+  public:
+  DEFINE_SIZE_STATIC (20);
+};
+
+
+/*
+ * JstfLangSys -- Justification Language System Table
+ */
+
+struct JstfLangSys : OffsetListOf<JstfPriority>
+{
+  bool sanitize (hb_sanitize_context_t *c,
+		 const Record_sanitize_closure_t * = nullptr) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (OffsetListOf<JstfPriority>::sanitize (c));
+  }
+};
+
+
+/*
+ * ExtenderGlyphs -- Extender Glyph Table
+ */
+
+typedef SortedArrayOf<GlyphID> ExtenderGlyphs;
+
+
+/*
+ * JstfScript -- The Justification Table
+ */
+
+struct JstfScript
+{
+  unsigned int get_lang_sys_count () const
+  { return langSys.len; }
+  const Tag& get_lang_sys_tag (unsigned int i) const
+  { return langSys.get_tag (i); }
+  unsigned int get_lang_sys_tags (unsigned int start_offset,
+				  unsigned int *lang_sys_count /* IN/OUT */,
+				  hb_tag_t     *lang_sys_tags /* OUT */) const
+  { return langSys.get_tags (start_offset, lang_sys_count, lang_sys_tags); }
+  const JstfLangSys& get_lang_sys (unsigned int i) const
+  {
+    if (i == Index::NOT_FOUND_INDEX) return get_default_lang_sys ();
+    return this+langSys[i].offset;
+  }
+  bool find_lang_sys_index (hb_tag_t tag, unsigned int *index) const
+  { return langSys.find_index (tag, index); }
+
+  bool has_default_lang_sys () const               { return defaultLangSys != 0; }
+  const JstfLangSys& get_default_lang_sys () const { return this+defaultLangSys; }
+
+  bool sanitize (hb_sanitize_context_t *c,
+		 const Record_sanitize_closure_t * = nullptr) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (extenderGlyphs.sanitize (c, this) &&
+		  defaultLangSys.sanitize (c, this) &&
+		  langSys.sanitize (c, this));
+  }
+
+  protected:
+  OffsetTo<ExtenderGlyphs>
+		extenderGlyphs;	/* Offset to ExtenderGlyph table--from beginning
+				 * of JstfScript table-may be NULL */
+  OffsetTo<JstfLangSys>
+		defaultLangSys;	/* Offset to DefaultJstfLangSys table--from
+				 * beginning of JstfScript table--may be Null */
+  RecordArrayOf<JstfLangSys>
+		langSys;	/* Array of JstfLangSysRecords--listed
+				 * alphabetically by LangSysTag */
+  public:
+  DEFINE_SIZE_ARRAY (6, langSys);
+};
+
+
+/*
+ * JSTF -- Justification
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/jstf
+ */
+
+struct JSTF
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_JSTF;
+
+  unsigned int get_script_count () const
+  { return scriptList.len; }
+  const Tag& get_script_tag (unsigned int i) const
+  { return scriptList.get_tag (i); }
+  unsigned int get_script_tags (unsigned int start_offset,
+				unsigned int *script_count /* IN/OUT */,
+				hb_tag_t     *script_tags /* OUT */) const
+  { return scriptList.get_tags (start_offset, script_count, script_tags); }
+  const JstfScript& get_script (unsigned int i) const
+  { return this+scriptList[i].offset; }
+  bool find_script_index (hb_tag_t tag, unsigned int *index) const
+  { return scriptList.find_index (tag, index); }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (version.sanitize (c) &&
+		  likely (version.major == 1) &&
+		  scriptList.sanitize (c, this));
+  }
+
+  protected:
+  FixedVersion<>version;	/* Version of the JSTF table--initially set
+				 * to 0x00010000u */
+  RecordArrayOf<JstfScript>
+		scriptList;  	/* Array of JstfScripts--listed
+				 * alphabetically by ScriptTag */
+  public:
+  DEFINE_SIZE_ARRAY (6, scriptList);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_LAYOUT_JSTF_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout.cc
new file mode 100644
index 0000000..d32be04a
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout.cc
@@ -0,0 +1,1531 @@
+/*
+ * Copyright © 1998-2004  David Turner and Werner Lemberg
+ * Copyright © 2006  Behdad Esfahbod
+ * Copyright © 2007,2008,2009  Red Hat, Inc.
+ * Copyright © 2012,2013  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-open-type.hh"
+#include "hb-ot-layout.hh"
+#include "hb-ot-face.hh"
+#include "hb-ot-map.hh"
+#include "hb-map.hh"
+
+#include "hb-ot-kern-table.hh"
+#include "hb-ot-gasp-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-ot-layout-gdef-table.hh"
+#include "hb-ot-layout-gsub-table.hh"
+#include "hb-ot-layout-gpos-table.hh"
+#include "hb-ot-layout-base-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-ot-layout-jstf-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-ot-name-table.hh"
+#include "hb-ot-os2-table.hh"
+
+#include "hb-aat-layout-lcar-table.hh"
+#include "hb-aat-layout-morx-table.hh"
+
+
+/**
+ * SECTION:hb-ot-layout
+ * @title: hb-ot-layout
+ * @short_description: OpenType Layout
+ * @include: hb-ot.h
+ *
+ * Functions for querying OpenType Layout features in the font face.
+ **/
+
+
+/*
+ * kern
+ */
+
+bool
+hb_ot_layout_has_kerning (hb_face_t *face)
+{
+  return face->table.kern->has_data ();
+}
+
+bool
+hb_ot_layout_has_machine_kerning (hb_face_t *face)
+{
+  return face->table.kern->has_state_machine ();
+}
+
+bool
+hb_ot_layout_has_cross_kerning (hb_face_t *face)
+{
+  return face->table.kern->has_cross_stream ();
+}
+
+void
+hb_ot_layout_kern (const hb_ot_shape_plan_t *plan,
+		   hb_font_t *font,
+		   hb_buffer_t  *buffer)
+{
+  hb_blob_t *blob = font->face->table.kern.get_blob ();
+  const AAT::kern& kern = *blob->as<AAT::kern> ();
+
+  AAT::hb_aat_apply_context_t c (plan, font, buffer, blob);
+
+  kern.apply (&c);
+}
+
+
+/*
+ * GDEF
+ */
+
+bool
+OT::GDEF::is_blacklisted (hb_blob_t *blob,
+			  hb_face_t *face) const
+{
+  /* 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
+   *
+   * In certain versions of Times New Roman Italic and Bold Italic,
+   * ASCII double quotation mark U+0022 has wrong glyph class 3 (mark)
+   * in GDEF.  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 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
+   */
+#define ENCODE(x,y,z) (((uint64_t) (x) << 48) | ((uint64_t) (y) << 24) | (uint64_t) (z))
+  switch ENCODE(blob->length,
+		face->table.GSUB->table.get_length (),
+		face->table.GPOS->table.get_length ())
+  {
+    /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */
+    case ENCODE (442, 2874, 42038):
+    /* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */
+    case ENCODE (430, 2874, 40662):
+    /* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */
+    case ENCODE (442, 2874, 39116):
+    /* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */
+    case ENCODE (430, 2874, 39374):
+    /* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */
+    case ENCODE (490, 3046, 41638):
+    /* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */
+    case ENCODE (478, 3046, 41902):
+    /* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c  tahoma.ttf from Windows 8 */
+    case ENCODE (898, 12554, 46470):
+    /* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc  tahomabd.ttf from Windows 8 */
+    case ENCODE (910, 12566, 47732):
+    /* sha1sum:4f95b7e4878f60fa3a39ca269618dfde9721a79e  tahoma.ttf from Windows 8.1 */
+    case ENCODE (928, 23298, 59332):
+    /* sha1sum:6d400781948517c3c0441ba42acb309584b73033  tahomabd.ttf from Windows 8.1 */
+    case ENCODE (940, 23310, 60732):
+    /* tahoma.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
+    case ENCODE (964, 23836, 60072):
+    /* tahomabd.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
+    case ENCODE (976, 23832, 61456):
+    /* sha1sum:e55fa2dfe957a9f7ec26be516a0e30b0c925f846  tahoma.ttf from Windows 10 */
+    case ENCODE (994, 24474, 60336):
+    /* sha1sum:7199385abb4c2cc81c83a151a7599b6368e92343  tahomabd.ttf from Windows 10 */
+    case ENCODE (1006, 24470, 61740):
+    /* tahoma.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
+    case ENCODE (1006, 24576, 61346):
+    /* tahomabd.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
+    case ENCODE (1018, 24572, 62828):
+    /* sha1sum:b9c84d820c49850d3d27ec498be93955b82772b5  tahoma.ttf from Windows 10 AU */
+    case ENCODE (1006, 24576, 61352):
+    /* sha1sum:2bdfaab28174bdadd2f3d4200a30a7ae31db79d2  tahomabd.ttf from Windows 10 AU */
+    case ENCODE (1018, 24572, 62834):
+    /* sha1sum:b0d36cf5a2fbe746a3dd277bffc6756a820807a7  Tahoma.ttf from Mac OS X 10.9 */
+    case ENCODE (832, 7324, 47162):
+    /* sha1sum:12fc4538e84d461771b30c18b5eb6bd434e30fba  Tahoma Bold.ttf from Mac OS X 10.9 */
+    case ENCODE (844, 7302, 45474):
+    /* sha1sum:eb8afadd28e9cf963e886b23a30b44ab4fd83acc  himalaya.ttf from Windows 7 */
+    case ENCODE (180, 13054, 7254):
+    /* sha1sum:73da7f025b238a3f737aa1fde22577a6370f77b0  himalaya.ttf from Windows 8 */
+    case ENCODE (192, 12638, 7254):
+    /* sha1sum:6e80fd1c0b059bbee49272401583160dc1e6a427  himalaya.ttf from Windows 8.1 */
+    case ENCODE (192, 12690, 7254):
+    /* 8d9267aea9cd2c852ecfb9f12a6e834bfaeafe44  cantarell-fonts-0.0.21/otf/Cantarell-Regular.otf */
+    /* 983988ff7b47439ab79aeaf9a45bd4a2c5b9d371  cantarell-fonts-0.0.21/otf/Cantarell-Oblique.otf */
+    case ENCODE (188, 248, 3852):
+    /* 2c0c90c6f6087ffbfea76589c93113a9cbb0e75f  cantarell-fonts-0.0.21/otf/Cantarell-Bold.otf */
+    /* 55461f5b853c6da88069ffcdf7f4dd3f8d7e3e6b  cantarell-fonts-0.0.21/otf/Cantarell-Bold-Oblique.otf */
+    case ENCODE (188, 264, 3426):
+    /* d125afa82a77a6475ac0e74e7c207914af84b37a padauk-2.80/Padauk.ttf RHEL 7.2 */
+    case ENCODE (1058, 47032, 11818):
+    /* 0f7b80437227b90a577cc078c0216160ae61b031 padauk-2.80/Padauk-Bold.ttf RHEL 7.2*/
+    case ENCODE (1046, 47030, 12600):
+    /* d3dde9aa0a6b7f8f6a89ef1002e9aaa11b882290 padauk-2.80/Padauk.ttf Ubuntu 16.04 */
+    case ENCODE (1058, 71796, 16770):
+    /* 5f3c98ccccae8a953be2d122c1b3a77fd805093f padauk-2.80/Padauk-Bold.ttf Ubuntu 16.04 */
+    case ENCODE (1046, 71790, 17862):
+    /* 6c93b63b64e8b2c93f5e824e78caca555dc887c7 padauk-2.80/Padauk-book.ttf */
+    case ENCODE (1046, 71788, 17112):
+    /* d89b1664058359b8ec82e35d3531931125991fb9 padauk-2.80/Padauk-bookbold.ttf */
+    case ENCODE (1058, 71794, 17514):
+    /* 824cfd193aaf6234b2b4dc0cf3c6ef576c0d00ef padauk-3.0/Padauk-book.ttf */
+    case ENCODE (1330, 109904, 57938):
+    /* 91fcc10cf15e012d27571e075b3b4dfe31754a8a padauk-3.0/Padauk-bookbold.ttf */
+    case ENCODE (1330, 109904, 58972):
+    /* sha1sum: c26e41d567ed821bed997e937bc0c41435689e85  Padauk.ttf
+     *  "Padauk Regular" "Version 2.5", see https://crbug.com/681813 */
+    case ENCODE (1004, 59092, 14836):
+      return true;
+#undef ENCODE
+  }
+  return false;
+}
+
+static void
+_hb_ot_layout_set_glyph_props (hb_font_t *font,
+			       hb_buffer_t *buffer)
+{
+  _hb_buffer_assert_gsubgpos_vars (buffer);
+
+  const OT::GDEF &gdef = *font->face->table.GDEF->table;
+  unsigned int count = buffer->len;
+  for (unsigned int i = 0; i < count; i++)
+  {
+    _hb_glyph_info_set_glyph_props (&buffer->info[i], gdef.get_glyph_props (buffer->info[i].codepoint));
+    _hb_glyph_info_clear_lig_props (&buffer->info[i]);
+    buffer->info[i].syllable() = 0;
+  }
+}
+
+/* Public API */
+
+hb_bool_t
+hb_ot_layout_has_glyph_classes (hb_face_t *face)
+{
+  return face->table.GDEF->table->has_glyph_classes ();
+}
+
+/**
+ * hb_ot_layout_get_glyph_class:
+ *
+ * Since: 0.9.7
+ **/
+hb_ot_layout_glyph_class_t
+hb_ot_layout_get_glyph_class (hb_face_t      *face,
+			      hb_codepoint_t  glyph)
+{
+  return (hb_ot_layout_glyph_class_t) face->table.GDEF->table->get_glyph_class (glyph);
+}
+
+/**
+ * hb_ot_layout_get_glyphs_in_class:
+ *
+ * Since: 0.9.7
+ **/
+void
+hb_ot_layout_get_glyphs_in_class (hb_face_t                  *face,
+				  hb_ot_layout_glyph_class_t  klass,
+				  hb_set_t                   *glyphs /* OUT */)
+{
+  return face->table.GDEF->table->get_glyphs_in_class (klass, glyphs);
+}
+
+unsigned int
+hb_ot_layout_get_attach_points (hb_face_t      *face,
+				hb_codepoint_t  glyph,
+				unsigned int    start_offset,
+				unsigned int   *point_count /* IN/OUT */,
+				unsigned int   *point_array /* OUT */)
+{
+  return face->table.GDEF->table->get_attach_points (glyph,
+						     start_offset,
+						     point_count,
+						     point_array);
+}
+
+unsigned int
+hb_ot_layout_get_ligature_carets (hb_font_t      *font,
+				  hb_direction_t  direction,
+				  hb_codepoint_t  glyph,
+				  unsigned int    start_offset,
+				  unsigned int   *caret_count /* IN/OUT */,
+				  hb_position_t  *caret_array /* OUT */)
+{
+  unsigned int result_caret_count = 0;
+  unsigned int result = font->face->table.GDEF->table->get_lig_carets (font, direction, glyph, start_offset, &result_caret_count, caret_array);
+  if (result)
+  {
+    if (caret_count) *caret_count = result_caret_count;
+  }
+  else
+    result = font->face->table.lcar->get_lig_carets (font, direction, glyph, start_offset, caret_count, caret_array);
+  return result;
+}
+
+
+/*
+ * GSUB/GPOS
+ */
+
+bool
+OT::GSUB::is_blacklisted (hb_blob_t *blob HB_UNUSED,
+			  hb_face_t *face) const
+{
+  /* Mac OS X prefers morx over GSUB.  It also ships with various Indic fonts,
+   * all by 'MUTF' foundry (Tamil MN, Tamil Sangam MN, etc.), that have broken
+   * GSUB/GPOS tables.  Some have GSUB with zero scripts, those are ignored by
+   * our morx/GSUB preference code.  But if GSUB has non-zero scripts, we tend
+   * to prefer it over morx because we want to be consistent with other OpenType
+   * shapers.
+   *
+   * To work around broken Indic Mac system fonts, we ignore GSUB table if
+   * OS/2 VendorId is 'MUTF' and font has morx table as well.
+   *
+   * https://github.com/harfbuzz/harfbuzz/issues/1410
+   * https://github.com/harfbuzz/harfbuzz/issues/1348
+   * https://github.com/harfbuzz/harfbuzz/issues/1391
+   */
+  if (unlikely (face->table.OS2->achVendID == HB_TAG ('M','U','T','F') &&
+		face->table.morx->has_data ()))
+    return true;
+
+  return false;
+}
+
+bool
+OT::GPOS::is_blacklisted (hb_blob_t *blob HB_UNUSED,
+			  hb_face_t *face HB_UNUSED) const
+{
+  return false;
+}
+
+static const OT::GSUBGPOS&
+get_gsubgpos_table (hb_face_t *face,
+		    hb_tag_t   table_tag)
+{
+  switch (table_tag) {
+    case HB_OT_TAG_GSUB: return *face->table.GSUB->table;
+    case HB_OT_TAG_GPOS: return *face->table.GPOS->table;
+    default:             return Null(OT::GSUBGPOS);
+  }
+}
+
+
+unsigned int
+hb_ot_layout_table_get_script_tags (hb_face_t    *face,
+				    hb_tag_t      table_tag,
+				    unsigned int  start_offset,
+				    unsigned int *script_count /* IN/OUT */,
+				    hb_tag_t     *script_tags  /* OUT */)
+{
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+  return g.get_script_tags (start_offset, script_count, script_tags);
+}
+
+#define HB_OT_TAG_LATIN_SCRIPT		HB_TAG ('l', 'a', 't', 'n')
+
+hb_bool_t
+hb_ot_layout_table_find_script (hb_face_t    *face,
+				hb_tag_t      table_tag,
+				hb_tag_t      script_tag,
+				unsigned int *script_index)
+{
+  static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_SCRIPT_INDEX), "");
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+  if (g.find_script_index (script_tag, script_index))
+    return true;
+
+  /* try finding 'DFLT' */
+  if (g.find_script_index (HB_OT_TAG_DEFAULT_SCRIPT, script_index))
+    return false;
+
+  /* try with 'dflt'; MS site has had typos and many fonts use it now :(.
+   * including many versions of DejaVu Sans Mono! */
+  if (g.find_script_index (HB_OT_TAG_DEFAULT_LANGUAGE, script_index))
+    return false;
+
+  /* try with 'latn'; some old fonts put their features there even though
+     they're really trying to support Thai, for example :( */
+  if (g.find_script_index (HB_OT_TAG_LATIN_SCRIPT, script_index))
+    return false;
+
+  if (script_index) *script_index = HB_OT_LAYOUT_NO_SCRIPT_INDEX;
+  return false;
+}
+
+hb_bool_t
+hb_ot_layout_table_choose_script (hb_face_t      *face,
+				  hb_tag_t        table_tag,
+				  const hb_tag_t *script_tags,
+				  unsigned int   *script_index,
+				  hb_tag_t       *chosen_script)
+{
+  const hb_tag_t *t;
+  for (t = script_tags; *t; t++);
+  return hb_ot_layout_table_select_script (face, table_tag, t - script_tags, script_tags, script_index, chosen_script);
+}
+
+/**
+ * hb_ot_layout_table_select_script:
+ *
+ * Since: 2.0.0
+ **/
+hb_bool_t
+hb_ot_layout_table_select_script (hb_face_t      *face,
+				  hb_tag_t        table_tag,
+				  unsigned int    script_count,
+				  const hb_tag_t *script_tags,
+				  unsigned int   *script_index  /* OUT */,
+				  hb_tag_t       *chosen_script /* OUT */)
+{
+  static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_SCRIPT_INDEX), "");
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+  unsigned int i;
+
+  for (i = 0; i < script_count; i++)
+  {
+    if (g.find_script_index (script_tags[i], script_index))
+    {
+      if (chosen_script)
+        *chosen_script = script_tags[i];
+      return true;
+    }
+  }
+
+  /* try finding 'DFLT' */
+  if (g.find_script_index (HB_OT_TAG_DEFAULT_SCRIPT, script_index)) {
+    if (chosen_script)
+      *chosen_script = HB_OT_TAG_DEFAULT_SCRIPT;
+    return false;
+  }
+
+  /* try with 'dflt'; MS site has had typos and many fonts use it now :( */
+  if (g.find_script_index (HB_OT_TAG_DEFAULT_LANGUAGE, script_index)) {
+    if (chosen_script)
+      *chosen_script = HB_OT_TAG_DEFAULT_LANGUAGE;
+    return false;
+  }
+
+  /* try with 'latn'; some old fonts put their features there even though
+     they're really trying to support Thai, for example :( */
+  if (g.find_script_index (HB_OT_TAG_LATIN_SCRIPT, script_index)) {
+    if (chosen_script)
+      *chosen_script = HB_OT_TAG_LATIN_SCRIPT;
+    return false;
+  }
+
+  if (script_index) *script_index = HB_OT_LAYOUT_NO_SCRIPT_INDEX;
+  if (chosen_script)
+    *chosen_script = HB_OT_LAYOUT_NO_SCRIPT_INDEX;
+  return false;
+}
+
+unsigned int
+hb_ot_layout_table_get_feature_tags (hb_face_t    *face,
+				     hb_tag_t      table_tag,
+				     unsigned int  start_offset,
+				     unsigned int *feature_count /* IN/OUT */,
+				     hb_tag_t     *feature_tags  /* OUT */)
+{
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+  return g.get_feature_tags (start_offset, feature_count, feature_tags);
+}
+
+bool
+hb_ot_layout_table_find_feature (hb_face_t    *face,
+				 hb_tag_t      table_tag,
+				 hb_tag_t      feature_tag,
+				 unsigned int *feature_index)
+{
+  static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_FEATURE_INDEX), "");
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+  unsigned int num_features = g.get_feature_count ();
+  for (unsigned int i = 0; i < num_features; i++)
+  {
+    if (feature_tag == g.get_feature_tag (i)) {
+      if (feature_index) *feature_index = i;
+      return true;
+    }
+  }
+
+  if (feature_index) *feature_index = HB_OT_LAYOUT_NO_FEATURE_INDEX;
+  return false;
+}
+
+
+unsigned int
+hb_ot_layout_script_get_language_tags (hb_face_t    *face,
+				       hb_tag_t      table_tag,
+				       unsigned int  script_index,
+				       unsigned int  start_offset,
+				       unsigned int *language_count /* IN/OUT */,
+				       hb_tag_t     *language_tags  /* OUT */)
+{
+  const OT::Script &s = get_gsubgpos_table (face, table_tag).get_script (script_index);
+
+  return s.get_lang_sys_tags (start_offset, language_count, language_tags);
+}
+
+hb_bool_t
+hb_ot_layout_script_find_language (hb_face_t    *face,
+				   hb_tag_t      table_tag,
+				   unsigned int  script_index,
+				   hb_tag_t      language_tag,
+				   unsigned int *language_index)
+{
+  return hb_ot_layout_script_select_language (face,
+					      table_tag,
+					      script_index,
+					      1,
+					      &language_tag,
+					      language_index);
+}
+
+/**
+ * hb_ot_layout_script_select_language:
+ *
+ * Since: 2.0.0
+ **/
+hb_bool_t
+hb_ot_layout_script_select_language (hb_face_t      *face,
+				     hb_tag_t        table_tag,
+				     unsigned int    script_index,
+				     unsigned int    language_count,
+				     const hb_tag_t *language_tags,
+				     unsigned int   *language_index /* OUT */)
+{
+  static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX), "");
+  const OT::Script &s = get_gsubgpos_table (face, table_tag).get_script (script_index);
+  unsigned int i;
+
+  for (i = 0; i < language_count; i++)
+  {
+    if (s.find_lang_sys_index (language_tags[i], language_index))
+      return true;
+  }
+
+  /* try finding 'dflt' */
+  if (s.find_lang_sys_index (HB_OT_TAG_DEFAULT_LANGUAGE, language_index))
+    return false;
+
+  if (language_index) *language_index = HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX;
+  return false;
+}
+
+hb_bool_t
+hb_ot_layout_language_get_required_feature_index (hb_face_t    *face,
+						  hb_tag_t      table_tag,
+						  unsigned int  script_index,
+						  unsigned int  language_index,
+						  unsigned int *feature_index)
+{
+  return hb_ot_layout_language_get_required_feature (face,
+						     table_tag,
+						     script_index,
+						     language_index,
+						     feature_index,
+						     nullptr);
+}
+
+/**
+ * hb_ot_layout_language_get_required_feature:
+ *
+ * Since: 0.9.30
+ **/
+hb_bool_t
+hb_ot_layout_language_get_required_feature (hb_face_t    *face,
+					    hb_tag_t      table_tag,
+					    unsigned int  script_index,
+					    unsigned int  language_index,
+					    unsigned int *feature_index,
+					    hb_tag_t     *feature_tag)
+{
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+  const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
+
+  unsigned int index = l.get_required_feature_index ();
+  if (feature_index) *feature_index = index;
+  if (feature_tag) *feature_tag = g.get_feature_tag (index);
+
+  return l.has_required_feature ();
+}
+
+unsigned int
+hb_ot_layout_language_get_feature_indexes (hb_face_t    *face,
+					   hb_tag_t      table_tag,
+					   unsigned int  script_index,
+					   unsigned int  language_index,
+					   unsigned int  start_offset,
+					   unsigned int *feature_count   /* IN/OUT */,
+					   unsigned int *feature_indexes /* OUT */)
+{
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+  const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
+
+  return l.get_feature_indexes (start_offset, feature_count, feature_indexes);
+}
+
+unsigned int
+hb_ot_layout_language_get_feature_tags (hb_face_t    *face,
+					hb_tag_t      table_tag,
+					unsigned int  script_index,
+					unsigned int  language_index,
+					unsigned int  start_offset,
+					unsigned int *feature_count /* IN/OUT */,
+					hb_tag_t     *feature_tags  /* OUT */)
+{
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+  const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
+
+  static_assert ((sizeof (unsigned int) == sizeof (hb_tag_t)), "");
+  unsigned int ret = l.get_feature_indexes (start_offset, feature_count, (unsigned int *) feature_tags);
+
+  if (feature_tags) {
+    unsigned int count = *feature_count;
+    for (unsigned int i = 0; i < count; i++)
+      feature_tags[i] = g.get_feature_tag ((unsigned int) feature_tags[i]);
+  }
+
+  return ret;
+}
+
+
+hb_bool_t
+hb_ot_layout_language_find_feature (hb_face_t    *face,
+				    hb_tag_t      table_tag,
+				    unsigned int  script_index,
+				    unsigned int  language_index,
+				    hb_tag_t      feature_tag,
+				    unsigned int *feature_index)
+{
+  static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_FEATURE_INDEX), "");
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+  const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
+
+  unsigned int num_features = l.get_feature_count ();
+  for (unsigned int i = 0; i < num_features; i++) {
+    unsigned int f_index = l.get_feature_index (i);
+
+    if (feature_tag == g.get_feature_tag (f_index)) {
+      if (feature_index) *feature_index = f_index;
+      return true;
+    }
+  }
+
+  if (feature_index) *feature_index = HB_OT_LAYOUT_NO_FEATURE_INDEX;
+  return false;
+}
+
+/**
+ * hb_ot_layout_feature_get_lookups:
+ *
+ * Since: 0.9.7
+ **/
+unsigned int
+hb_ot_layout_feature_get_lookups (hb_face_t    *face,
+				  hb_tag_t      table_tag,
+				  unsigned int  feature_index,
+				  unsigned int  start_offset,
+				  unsigned int *lookup_count   /* IN/OUT */,
+				  unsigned int *lookup_indexes /* OUT */)
+{
+  return hb_ot_layout_feature_with_variations_get_lookups (face,
+							   table_tag,
+							   feature_index,
+							   HB_OT_LAYOUT_NO_VARIATIONS_INDEX,
+							   start_offset,
+							   lookup_count,
+							   lookup_indexes);
+}
+
+/**
+ * hb_ot_layout_table_get_lookup_count:
+ *
+ * Since: 0.9.22
+ **/
+unsigned int
+hb_ot_layout_table_get_lookup_count (hb_face_t    *face,
+				     hb_tag_t      table_tag)
+{
+  return get_gsubgpos_table (face, table_tag).get_lookup_count ();
+}
+
+
+struct hb_collect_features_context_t
+{
+  hb_collect_features_context_t (hb_face_t       *face,
+				 hb_tag_t         table_tag,
+				 hb_set_t        *feature_indexes_)
+    : g (get_gsubgpos_table (face, table_tag)),
+      feature_indexes (feature_indexes_),
+      script_count(0),langsys_count(0) {}
+
+  bool visited (const OT::Script &s)
+  {
+    /* We might have Null() object here.  Don't want to involve
+     * that in the memoize.  So, detect empty objects and return. */
+    if (unlikely (!s.has_default_lang_sys () &&
+		  !s.get_lang_sys_count ()))
+      return true;
+
+    if (script_count++ > HB_MAX_SCRIPTS)
+      return true;
+
+    return visited (s, visited_script);
+  }
+  bool visited (const OT::LangSys &l)
+  {
+    /* We might have Null() object here.  Don't want to involve
+     * that in the memoize.  So, detect empty objects and return. */
+    if (unlikely (!l.has_required_feature () &&
+		  !l.get_feature_count ()))
+      return true;
+
+    if (langsys_count++ > HB_MAX_LANGSYS)
+      return true;
+
+    return visited (l, visited_langsys);
+  }
+
+  private:
+  template <typename T>
+  bool visited (const T &p, hb_set_t &visited_set)
+  {
+    hb_codepoint_t delta = (hb_codepoint_t) ((uintptr_t) &p - (uintptr_t) &g);
+     if (visited_set.has (delta))
+      return true;
+
+    visited_set.add (delta);
+    return false;
+  }
+
+  public:
+  const OT::GSUBGPOS &g;
+  hb_set_t           *feature_indexes;
+
+  private:
+  hb_set_t visited_script;
+  hb_set_t visited_langsys;
+  unsigned int script_count;
+  unsigned int langsys_count;
+};
+
+static void
+langsys_collect_features (hb_collect_features_context_t *c,
+			  const OT::LangSys  &l,
+			  const hb_tag_t     *features)
+{
+  if (c->visited (l)) return;
+
+  if (!features)
+  {
+    /* All features. */
+    if (l.has_required_feature ())
+      c->feature_indexes->add (l.get_required_feature_index ());
+
+    l.add_feature_indexes_to (c->feature_indexes);
+  }
+  else
+  {
+    /* Ugh. Any faster way? */
+    for (; *features; features++)
+    {
+      hb_tag_t feature_tag = *features;
+      unsigned int num_features = l.get_feature_count ();
+      for (unsigned int i = 0; i < num_features; i++)
+      {
+	unsigned int feature_index = l.get_feature_index (i);
+
+	if (feature_tag == c->g.get_feature_tag (feature_index))
+	{
+	  c->feature_indexes->add (feature_index);
+	  break;
+	}
+      }
+    }
+  }
+}
+
+static void
+script_collect_features (hb_collect_features_context_t *c,
+			 const OT::Script   &s,
+			 const hb_tag_t *languages,
+			 const hb_tag_t *features)
+{
+  if (c->visited (s)) return;
+
+  if (!languages)
+  {
+    /* All languages. */
+    if (s.has_default_lang_sys ())
+      langsys_collect_features (c,
+				s.get_default_lang_sys (),
+				features);
+
+    unsigned int count = s.get_lang_sys_count ();
+    for (unsigned int language_index = 0; language_index < count; language_index++)
+      langsys_collect_features (c,
+				s.get_lang_sys (language_index),
+				features);
+  }
+  else
+  {
+    for (; *languages; languages++)
+    {
+      unsigned int language_index;
+      if (s.find_lang_sys_index (*languages, &language_index))
+	langsys_collect_features (c,
+				  s.get_lang_sys (language_index),
+				  features);
+    }
+  }
+}
+
+/**
+ * hb_ot_layout_collect_features:
+ *
+ * Since: 1.8.5
+ **/
+void
+hb_ot_layout_collect_features (hb_face_t      *face,
+                               hb_tag_t        table_tag,
+                               const hb_tag_t *scripts,
+                               const hb_tag_t *languages,
+                               const hb_tag_t *features,
+                               hb_set_t       *feature_indexes /* OUT */)
+{
+  hb_collect_features_context_t c (face, table_tag, feature_indexes);
+  if (!scripts)
+  {
+    /* All scripts. */
+    unsigned int count = c.g.get_script_count ();
+    for (unsigned int script_index = 0; script_index < count; script_index++)
+      script_collect_features (&c,
+			       c.g.get_script (script_index),
+			       languages,
+			       features);
+  }
+  else
+  {
+    for (; *scripts; scripts++)
+    {
+      unsigned int script_index;
+      if (c.g.find_script_index (*scripts, &script_index))
+	script_collect_features (&c,
+				 c.g.get_script (script_index),
+				 languages,
+				 features);
+    }
+  }
+}
+
+/**
+ * hb_ot_layout_collect_lookups:
+ *
+ * Since: 0.9.8
+ **/
+void
+hb_ot_layout_collect_lookups (hb_face_t      *face,
+			      hb_tag_t        table_tag,
+			      const hb_tag_t *scripts,
+			      const hb_tag_t *languages,
+			      const hb_tag_t *features,
+			      hb_set_t       *lookup_indexes /* OUT */)
+{
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+  hb_set_t feature_indexes;
+  hb_ot_layout_collect_features (face, table_tag, scripts, languages, features, &feature_indexes);
+
+  for (hb_codepoint_t feature_index = HB_SET_VALUE_INVALID;
+       hb_set_next (&feature_indexes, &feature_index);)
+    g.get_feature (feature_index).add_lookup_indexes_to (lookup_indexes);
+}
+
+/**
+ * hb_ot_layout_lookup_collect_glyphs:
+ *
+ * Since: 0.9.7
+ **/
+void
+hb_ot_layout_lookup_collect_glyphs (hb_face_t    *face,
+				    hb_tag_t      table_tag,
+				    unsigned int  lookup_index,
+				    hb_set_t     *glyphs_before, /* OUT.  May be NULL */
+				    hb_set_t     *glyphs_input,  /* OUT.  May be NULL */
+				    hb_set_t     *glyphs_after,  /* OUT.  May be NULL */
+				    hb_set_t     *glyphs_output  /* OUT.  May be NULL */)
+{
+  OT::hb_collect_glyphs_context_t c (face,
+				     glyphs_before,
+				     glyphs_input,
+				     glyphs_after,
+				     glyphs_output);
+
+  switch (table_tag)
+  {
+    case HB_OT_TAG_GSUB:
+    {
+      const OT::SubstLookup& l = face->table.GSUB->table->get_lookup (lookup_index);
+      l.collect_glyphs (&c);
+      return;
+    }
+    case HB_OT_TAG_GPOS:
+    {
+      const OT::PosLookup& l = face->table.GPOS->table->get_lookup (lookup_index);
+      l.collect_glyphs (&c);
+      return;
+    }
+  }
+}
+
+
+/* Variations support */
+
+hb_bool_t
+hb_ot_layout_table_find_feature_variations (hb_face_t    *face,
+					    hb_tag_t      table_tag,
+					    const int    *coords,
+					    unsigned int  num_coords,
+					    unsigned int *variations_index /* out */)
+{
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+  return g.find_variations_index (coords, num_coords, variations_index);
+}
+
+unsigned int
+hb_ot_layout_feature_with_variations_get_lookups (hb_face_t    *face,
+						  hb_tag_t      table_tag,
+						  unsigned int  feature_index,
+						  unsigned int  variations_index,
+						  unsigned int  start_offset,
+						  unsigned int *lookup_count /* IN/OUT */,
+						  unsigned int *lookup_indexes /* OUT */)
+{
+  static_assert ((OT::FeatureVariations::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_VARIATIONS_INDEX), "");
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+  const OT::Feature &f = g.get_feature_variation (feature_index, variations_index);
+
+  return f.get_lookup_indexes (start_offset, lookup_count, lookup_indexes);
+}
+
+
+/*
+ * OT::GSUB
+ */
+
+hb_bool_t
+hb_ot_layout_has_substitution (hb_face_t *face)
+{
+  return face->table.GSUB->table->has_data ();
+}
+
+/**
+ * hb_ot_layout_lookup_would_substitute:
+ *
+ * Since: 0.9.7
+ **/
+hb_bool_t
+hb_ot_layout_lookup_would_substitute (hb_face_t            *face,
+				      unsigned int          lookup_index,
+				      const hb_codepoint_t *glyphs,
+				      unsigned int          glyphs_length,
+				      hb_bool_t             zero_context)
+{
+  return hb_ot_layout_lookup_would_substitute_fast (face,
+						    lookup_index,
+						    glyphs, glyphs_length,
+						    zero_context);
+}
+
+bool
+hb_ot_layout_lookup_would_substitute_fast (hb_face_t            *face,
+					   unsigned int          lookup_index,
+					   const hb_codepoint_t *glyphs,
+					   unsigned int          glyphs_length,
+					   bool                  zero_context)
+{
+  if (unlikely (lookup_index >= face->table.GSUB->lookup_count)) return false;
+  OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, (bool) zero_context);
+
+  const OT::SubstLookup& l = face->table.GSUB->table->get_lookup (lookup_index);
+
+  return l.would_apply (&c, &face->table.GSUB->accels[lookup_index]);
+}
+
+void
+hb_ot_layout_substitute_start (hb_font_t    *font,
+			       hb_buffer_t  *buffer)
+{
+_hb_ot_layout_set_glyph_props (font, buffer);
+}
+
+void
+hb_ot_layout_delete_glyphs_inplace (hb_buffer_t *buffer,
+				    bool (*filter) (const hb_glyph_info_t *info))
+{
+  /* Merge clusters and delete filtered glyphs.
+   * NOTE! We can't use out-buffer as we have positioning data. */
+  unsigned int j = 0;
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  hb_glyph_position_t *pos = buffer->pos;
+  for (unsigned int i = 0; i < count; i++)
+  {
+    if (filter (&info[i]))
+    {
+      /* Merge clusters.
+       * Same logic as buffer->delete_glyph(), but for in-place removal. */
+
+      unsigned int cluster = info[i].cluster;
+      if (i + 1 < count && cluster == info[i + 1].cluster)
+	continue; /* Cluster survives; do nothing. */
+
+      if (j)
+      {
+	/* Merge cluster backward. */
+	if (cluster < info[j - 1].cluster)
+	{
+	  unsigned int mask = info[i].mask;
+	  unsigned int old_cluster = info[j - 1].cluster;
+	  for (unsigned k = j; k && info[k - 1].cluster == old_cluster; k--)
+	    buffer->set_cluster (info[k - 1], cluster, mask);
+	}
+	continue;
+      }
+
+      if (i + 1 < count)
+	buffer->merge_clusters (i, i + 2); /* Merge cluster forward. */
+
+      continue;
+    }
+
+    if (j != i)
+    {
+      info[j] = info[i];
+      pos[j] = pos[i];
+    }
+    j++;
+  }
+  buffer->len = j;
+}
+
+/**
+ * hb_ot_layout_lookup_substitute_closure:
+ *
+ * Since: 0.9.7
+ **/
+void
+hb_ot_layout_lookup_substitute_closure (hb_face_t    *face,
+				        unsigned int  lookup_index,
+				        hb_set_t     *glyphs)
+{
+  hb_map_t done_lookups;
+  OT::hb_closure_context_t c (face, glyphs, &done_lookups);
+
+  const OT::SubstLookup& l = face->table.GSUB->table->get_lookup (lookup_index);
+
+  l.closure (&c, lookup_index);
+}
+
+/**
+ * hb_ot_layout_lookups_substitute_closure:
+ *
+ * Compute the transitive closure of glyphs needed for all of the
+ * provided lookups.
+ *
+ * Since: 1.8.1
+ **/
+void
+hb_ot_layout_lookups_substitute_closure (hb_face_t      *face,
+                                         const hb_set_t *lookups,
+                                         hb_set_t       *glyphs)
+{
+  hb_map_t done_lookups;
+  OT::hb_closure_context_t c (face, glyphs, &done_lookups);
+  const OT::GSUB& gsub = *face->table.GSUB->table;
+
+  unsigned int iteration_count = 0;
+  unsigned int glyphs_length;
+  do
+  {
+    glyphs_length = glyphs->get_population ();
+    if (lookups != nullptr)
+    {
+      for (hb_codepoint_t lookup_index = HB_SET_VALUE_INVALID; hb_set_next (lookups, &lookup_index);)
+        gsub.get_lookup (lookup_index).closure (&c, lookup_index);
+    }
+    else
+    {
+      for (unsigned int i = 0; i < gsub.get_lookup_count (); i++)
+        gsub.get_lookup (i).closure (&c, i);
+    }
+  } while (iteration_count++ <= HB_CLOSURE_MAX_STAGES &&
+	   glyphs_length != glyphs->get_population ());
+}
+
+/*
+ * OT::GPOS
+ */
+
+hb_bool_t
+hb_ot_layout_has_positioning (hb_face_t *face)
+{
+  return face->table.GPOS->table->has_data ();
+}
+
+void
+hb_ot_layout_position_start (hb_font_t *font, hb_buffer_t *buffer)
+{
+  OT::GPOS::position_start (font, buffer);
+}
+
+void
+hb_ot_layout_position_finish_advances (hb_font_t *font, hb_buffer_t *buffer)
+{
+  OT::GPOS::position_finish_advances (font, buffer);
+}
+
+void
+hb_ot_layout_position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer)
+{
+  OT::GPOS::position_finish_offsets (font, buffer);
+}
+
+/**
+ * hb_ot_layout_get_size_params:
+ *
+ * Since: 0.9.10
+ **/
+hb_bool_t
+hb_ot_layout_get_size_params (hb_face_t       *face,
+			      unsigned int    *design_size,       /* OUT.  May be NULL */
+			      unsigned int    *subfamily_id,      /* OUT.  May be NULL */
+			      hb_ot_name_id_t *subfamily_name_id, /* OUT.  May be NULL */
+			      unsigned int    *range_start,       /* OUT.  May be NULL */
+			      unsigned int    *range_end          /* OUT.  May be NULL */)
+{
+  const OT::GPOS &gpos = *face->table.GPOS->table;
+  const hb_tag_t tag = HB_TAG ('s','i','z','e');
+
+  unsigned int num_features = gpos.get_feature_count ();
+  for (unsigned int i = 0; i < num_features; i++)
+  {
+    if (tag == gpos.get_feature_tag (i))
+    {
+      const OT::Feature &f = gpos.get_feature (i);
+      const OT::FeatureParamsSize &params = f.get_feature_params ().get_size_params (tag);
+
+      if (params.designSize)
+      {
+	if (design_size) *design_size = params.designSize;
+	if (subfamily_id) *subfamily_id = params.subfamilyID;
+	if (subfamily_name_id) *subfamily_name_id = params.subfamilyNameID;
+	if (range_start) *range_start = params.rangeStart;
+	if (range_end) *range_end = params.rangeEnd;
+
+	return true;
+      }
+    }
+  }
+
+  if (design_size) *design_size = 0;
+  if (subfamily_id) *subfamily_id = 0;
+  if (subfamily_name_id) *subfamily_name_id = HB_OT_NAME_ID_INVALID;
+  if (range_start) *range_start = 0;
+  if (range_end) *range_end = 0;
+
+  return false;
+}
+
+/**
+ * hb_ot_layout_feature_get_name_ids:
+ * @face: #hb_face_t to work upon
+ * @table_tag: table tag to query, "GSUB" or "GPOS".
+ * @feature_index: index of feature to query.
+ * @label_id: (out) (allow-none): The ‘name’ table name ID that specifies a string
+ *            for a user-interface label for this feature. (May be NULL.)
+ * @tooltip_id: (out) (allow-none): The ‘name’ table name ID that specifies a string
+ *              that an application can use for tooltip text for this
+ *              feature. (May be NULL.)
+ * @sample_id: (out) (allow-none): The ‘name’ table name ID that specifies sample text
+ *             that illustrates the effect of this feature. (May be NULL.)
+ * @num_named_parameters: (out) (allow-none):  Number of named parameters. (May be zero.)
+ * @first_param_id: (out) (allow-none): The first ‘name’ table name ID used to specify
+ *                  strings for user-interface labels for the feature
+ *                  parameters. (Must be zero if numParameters is zero.)
+ *
+ * Fetches name indices from feature parameters for "Stylistic Set" ('ssXX') or
+ * "Character Variant" ('cvXX') features.
+ *
+ * Return value: true if data found, false otherwise
+ *
+ * Since: 2.0.0
+ **/
+hb_bool_t
+hb_ot_layout_feature_get_name_ids (hb_face_t       *face,
+				   hb_tag_t         table_tag,
+				   unsigned int     feature_index,
+				   hb_ot_name_id_t *label_id,             /* OUT.  May be NULL */
+				   hb_ot_name_id_t *tooltip_id,           /* OUT.  May be NULL */
+				   hb_ot_name_id_t *sample_id,            /* OUT.  May be NULL */
+				   unsigned int    *num_named_parameters, /* OUT.  May be NULL */
+				   hb_ot_name_id_t *first_param_id        /* OUT.  May be NULL */)
+{
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+  hb_tag_t feature_tag = g.get_feature_tag (feature_index);
+  const OT::Feature &f = g.get_feature (feature_index);
+
+  const OT::FeatureParams &feature_params = f.get_feature_params ();
+  if (&feature_params != &Null (OT::FeatureParams))
+  {
+    const OT::FeatureParamsStylisticSet& ss_params =
+      feature_params.get_stylistic_set_params (feature_tag);
+    if (&ss_params != &Null (OT::FeatureParamsStylisticSet)) /* ssXX */
+    {
+      if (label_id) *label_id = ss_params.uiNameID;
+      // ssXX features don't have the rest
+      if (tooltip_id) *tooltip_id = HB_OT_NAME_ID_INVALID;
+      if (sample_id) *sample_id = HB_OT_NAME_ID_INVALID;
+      if (num_named_parameters) *num_named_parameters = 0;
+      if (first_param_id) *first_param_id = HB_OT_NAME_ID_INVALID;
+      return true;
+    }
+    const OT::FeatureParamsCharacterVariants& cv_params =
+      feature_params.get_character_variants_params (feature_tag);
+    if (&cv_params != &Null (OT::FeatureParamsCharacterVariants)) /* cvXX */
+    {
+      if (label_id) *label_id = cv_params.featUILableNameID;
+      if (tooltip_id) *tooltip_id = cv_params.featUITooltipTextNameID;
+      if (sample_id) *sample_id = cv_params.sampleTextNameID;
+      if (num_named_parameters) *num_named_parameters = cv_params.numNamedParameters;
+      if (first_param_id) *first_param_id = cv_params.firstParamUILabelNameID;
+      return true;
+    }
+  }
+
+  if (label_id) *label_id = HB_OT_NAME_ID_INVALID;
+  if (tooltip_id) *tooltip_id = HB_OT_NAME_ID_INVALID;
+  if (sample_id) *sample_id = HB_OT_NAME_ID_INVALID;
+  if (num_named_parameters) *num_named_parameters = 0;
+  if (first_param_id) *first_param_id = HB_OT_NAME_ID_INVALID;
+  return false;
+}
+
+/**
+ * hb_ot_layout_feature_get_characters:
+ * @face: #hb_face_t to work upon
+ * @table_tag: table tag to query, "GSUB" or "GPOS".
+ * @feature_index: index of feature to query.
+ * @start_offset: In case the resulting char_count was equal to its input value, there
+ *                is a chance there were more characters on the tag so this API can be
+ *                called with an offset till resulting char_count gets to a number
+ *                lower than input buffer (or consider using just a bigger buffer for
+ *                one shot copying).
+ * @char_count: (inout) (allow-none): The count of characters for which this feature
+ *              provides glyph variants. (May be zero.)
+ * @characters: (out caller-allocates) (array length=char_count): A buffer pointer. The Unicode codepoints
+ *              of the characters for which this feature provides glyph variants.
+ *
+ * Fetches characters listed by designer under feature parameters for "Character
+ * Variant" ("cvXX") features.
+ *
+ * Return value: Number of total sample characters in the cvXX feature.
+ *
+ * Since: 2.0.0
+ **/
+unsigned int
+hb_ot_layout_feature_get_characters (hb_face_t      *face,
+				     hb_tag_t        table_tag,
+				     unsigned int    feature_index,
+				     unsigned int    start_offset,
+				     unsigned int   *char_count, /* IN/OUT.  May be NULL */
+				     hb_codepoint_t *characters  /* OUT.     May be NULL */)
+{
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+  hb_tag_t feature_tag = g.get_feature_tag (feature_index);
+  const OT::Feature &f = g.get_feature (feature_index);
+
+  const OT::FeatureParams &feature_params = f.get_feature_params ();
+
+  const OT::FeatureParamsCharacterVariants& cv_params =
+    feature_params.get_character_variants_params(feature_tag);
+
+  unsigned int len = 0;
+  if (char_count && characters && start_offset < cv_params.characters.len)
+  {
+    len = MIN (cv_params.characters.len - start_offset, *char_count);
+    for (unsigned int i = 0; i < len; ++i)
+      characters[i] = cv_params.characters[start_offset + i];
+  }
+  if (char_count) *char_count = len;
+  return cv_params.characters.len;
+}
+
+
+/*
+ * Parts of different types are implemented here such that they have direct
+ * access to GSUB/GPOS lookups.
+ */
+
+
+struct GSUBProxy
+{
+  static constexpr unsigned table_index = 0u;
+  static constexpr bool inplace = false;
+  typedef OT::SubstLookup Lookup;
+
+  GSUBProxy (hb_face_t *face) :
+    table (*face->table.GSUB->table),
+    accels (face->table.GSUB->accels) {}
+
+  const OT::GSUB &table;
+  const OT::hb_ot_layout_lookup_accelerator_t *accels;
+};
+
+struct GPOSProxy
+{
+  static constexpr unsigned table_index = 1u;
+  static constexpr bool inplace = true;
+  typedef OT::PosLookup Lookup;
+
+  GPOSProxy (hb_face_t *face) :
+    table (*face->table.GPOS->table),
+    accels (face->table.GPOS->accels) {}
+
+  const OT::GPOS &table;
+  const OT::hb_ot_layout_lookup_accelerator_t *accels;
+};
+
+
+static inline bool
+apply_forward (OT::hb_ot_apply_context_t *c,
+	       const OT::hb_ot_layout_lookup_accelerator_t &accel)
+{
+  bool ret = false;
+  hb_buffer_t *buffer = c->buffer;
+  while (buffer->idx < buffer->len && buffer->successful)
+  {
+    bool applied = false;
+    if (accel.may_have (buffer->cur().codepoint) &&
+	(buffer->cur().mask & c->lookup_mask) &&
+	c->check_glyph_property (&buffer->cur(), c->lookup_props))
+     {
+       applied = accel.apply (c);
+     }
+
+    if (applied)
+      ret = true;
+    else
+      buffer->next_glyph ();
+  }
+  return ret;
+}
+
+static inline bool
+apply_backward (OT::hb_ot_apply_context_t *c,
+	       const OT::hb_ot_layout_lookup_accelerator_t &accel)
+{
+  bool ret = false;
+  hb_buffer_t *buffer = c->buffer;
+  do
+  {
+    if (accel.may_have (buffer->cur().codepoint) &&
+	(buffer->cur().mask & c->lookup_mask) &&
+	c->check_glyph_property (&buffer->cur(), c->lookup_props))
+     ret |= accel.apply (c);
+
+    /* The reverse lookup doesn't "advance" cursor (for good reason). */
+    buffer->idx--;
+
+  }
+  while ((int) buffer->idx >= 0);
+  return ret;
+}
+
+template <typename Proxy>
+static inline void
+apply_string (OT::hb_ot_apply_context_t *c,
+	      const typename Proxy::Lookup &lookup,
+	      const OT::hb_ot_layout_lookup_accelerator_t &accel)
+{
+  hb_buffer_t *buffer = c->buffer;
+
+  if (unlikely (!buffer->len || !c->lookup_mask))
+    return;
+
+  c->set_lookup_props (lookup.get_props ());
+
+  if (likely (!lookup.is_reverse ()))
+  {
+    /* in/out forward substitution/positioning */
+    if (Proxy::table_index == 0u)
+      buffer->clear_output ();
+    buffer->idx = 0;
+
+    bool ret;
+    ret = apply_forward (c, accel);
+    if (ret)
+    {
+      if (!Proxy::inplace)
+	buffer->swap_buffers ();
+      else
+	assert (!buffer->has_separate_output ());
+    }
+  }
+  else
+  {
+    /* in-place backward substitution/positioning */
+    if (Proxy::table_index == 0u)
+      buffer->remove_output ();
+    buffer->idx = buffer->len - 1;
+
+    apply_backward (c, accel);
+  }
+}
+
+template <typename Proxy>
+inline void hb_ot_map_t::apply (const Proxy &proxy,
+				const hb_ot_shape_plan_t *plan,
+				hb_font_t *font,
+				hb_buffer_t *buffer) const
+{
+  const unsigned int table_index = proxy.table_index;
+  unsigned int i = 0;
+  OT::hb_ot_apply_context_t c (table_index, font, buffer);
+  c.set_recurse_func (Proxy::Lookup::apply_recurse_func);
+
+  for (unsigned int stage_index = 0; stage_index < stages[table_index].length; stage_index++) {
+    const stage_map_t *stage = &stages[table_index][stage_index];
+    for (; i < stage->last_lookup; i++)
+    {
+      unsigned int lookup_index = lookups[table_index][i].index;
+      if (!buffer->message (font, "start lookup %d", lookup_index)) continue;
+      c.set_lookup_index (lookup_index);
+      c.set_lookup_mask (lookups[table_index][i].mask);
+      c.set_auto_zwj (lookups[table_index][i].auto_zwj);
+      c.set_auto_zwnj (lookups[table_index][i].auto_zwnj);
+      if (lookups[table_index][i].random)
+      {
+	c.set_random (true);
+	buffer->unsafe_to_break_all ();
+      }
+      apply_string<Proxy> (&c,
+			   proxy.table.get_lookup (lookup_index),
+			   proxy.accels[lookup_index]);
+      (void) buffer->message (font, "end lookup %d", lookup_index);
+    }
+
+    if (stage->pause_func)
+    {
+      buffer->clear_output ();
+      stage->pause_func (plan, font, buffer);
+    }
+  }
+}
+
+void hb_ot_map_t::substitute (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
+{
+  GSUBProxy proxy (font->face);
+  apply (proxy, plan, font, buffer);
+}
+
+void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
+{
+  GPOSProxy proxy (font->face);
+  apply (proxy, plan, font, buffer);
+}
+
+void
+hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c,
+				const OT::SubstLookup &lookup,
+				const OT::hb_ot_layout_lookup_accelerator_t &accel)
+{
+  apply_string<GSUBProxy> (c, lookup, accel);
+}
+
+#if 0
+static const OT::BASE& _get_base (hb_face_t *face)
+{
+  return *face->table.BASE;
+}
+
+hb_bool_t
+hb_ot_layout_get_baseline (hb_font_t               *font,
+			   hb_ot_layout_baseline_t  baseline,
+			   hb_direction_t           direction,
+			   hb_tag_t                 script_tag,
+			   hb_tag_t                 language_tag,
+			   hb_position_t           *coord        /* OUT.  May be NULL. */)
+{
+  const OT::BASE &base = _get_base (font->face);
+  bool result = base.get_baseline (font, baseline, direction, script_tag,
+				   language_tag, coord);
+
+  /* TODO: Simulate https://docs.microsoft.com/en-us/typography/opentype/spec/baselinetags#ideographic-em-box */
+  if (!result && coord) *coord = 0;
+
+  if (coord) *coord = font->em_scale_dir (*coord, direction);
+
+  return result;
+}
+
+/* To be moved to public header */
+/*
+ * BASE
+ */
+
+/**
+ * hb_ot_layout_baseline_t:
+ *
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/baselinetags
+ *
+ * Since: DONTREPLACEME
+ */
+typedef enum {
+  HB_OT_LAYOUT_BASELINE_HANG = HB_TAG('h','a','n','g'),
+  HB_OT_LAYOUT_BASELINE_ICFB = HB_TAG('i','c','f','b'),
+  HB_OT_LAYOUT_BASELINE_ICFT = HB_TAG('i','c','f','t'),
+  HB_OT_LAYOUT_BASELINE_IDEO = HB_TAG('i','d','e','o'),
+  HB_OT_LAYOUT_BASELINE_IDTB = HB_TAG('i','d','t','b'),
+  HB_OT_LAYOUT_BASELINE_MATH = HB_TAG('m','a','t','h'),
+  HB_OT_LAYOUT_BASELINE_ROMN = HB_TAG('r','o','m','n')
+} hb_ot_layout_baseline_t;
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_get_baseline (hb_font_t               *font,
+			   hb_ot_layout_baseline_t  baseline,
+			   hb_direction_t           direction,
+			   hb_tag_t                 script_tag,
+			   hb_tag_t                 language_tag,
+			   hb_position_t           *coord        /* OUT.  May be NULL. */);
+
+#endif
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout.h
new file mode 100644
index 0000000..e473954
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout.h
@@ -0,0 +1,396 @@
+/*
+ * Copyright © 2007,2008,2009  Red Hat, 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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_H_IN
+#error "Include <hb-ot.h> instead."
+#endif
+
+#ifndef HB_OT_LAYOUT_H
+#define HB_OT_LAYOUT_H
+
+#include "hb.h"
+
+#include "hb-ot-name.h"
+
+HB_BEGIN_DECLS
+
+
+#define HB_OT_TAG_BASE HB_TAG('B','A','S','E')
+#define HB_OT_TAG_GDEF HB_TAG('G','D','E','F')
+#define HB_OT_TAG_GSUB HB_TAG('G','S','U','B')
+#define HB_OT_TAG_GPOS HB_TAG('G','P','O','S')
+#define HB_OT_TAG_JSTF HB_TAG('J','S','T','F')
+
+
+/*
+ * Script & Language tags.
+ */
+
+#define HB_OT_TAG_DEFAULT_SCRIPT	HB_TAG ('D', 'F', 'L', 'T')
+#define HB_OT_TAG_DEFAULT_LANGUAGE	HB_TAG ('d', 'f', 'l', 't')
+
+/**
+ * HB_OT_MAX_TAGS_PER_SCRIPT:
+ *
+ * Since: 2.0.0
+ **/
+#define HB_OT_MAX_TAGS_PER_SCRIPT	3u
+/**
+ * HB_OT_MAX_TAGS_PER_LANGUAGE:
+ *
+ * Since: 2.0.0
+ **/
+#define HB_OT_MAX_TAGS_PER_LANGUAGE	3u
+
+HB_EXTERN void
+hb_ot_tags_from_script_and_language (hb_script_t   script,
+				     hb_language_t language,
+				     unsigned int *script_count /* IN/OUT */,
+				     hb_tag_t     *script_tags /* OUT */,
+				     unsigned int *language_count /* IN/OUT */,
+				     hb_tag_t     *language_tags /* OUT */);
+
+HB_EXTERN hb_script_t
+hb_ot_tag_to_script (hb_tag_t tag);
+
+HB_EXTERN hb_language_t
+hb_ot_tag_to_language (hb_tag_t tag);
+
+HB_EXTERN void
+hb_ot_tags_to_script_and_language (hb_tag_t       script_tag,
+				   hb_tag_t       language_tag,
+				   hb_script_t   *script /* OUT */,
+				   hb_language_t *language /* OUT */);
+
+
+/*
+ * GDEF
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_has_glyph_classes (hb_face_t *face);
+
+typedef enum {
+  HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED	= 0,
+  HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH	= 1,
+  HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE	= 2,
+  HB_OT_LAYOUT_GLYPH_CLASS_MARK		= 3,
+  HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT	= 4
+} hb_ot_layout_glyph_class_t;
+
+HB_EXTERN hb_ot_layout_glyph_class_t
+hb_ot_layout_get_glyph_class (hb_face_t      *face,
+			      hb_codepoint_t  glyph);
+
+HB_EXTERN void
+hb_ot_layout_get_glyphs_in_class (hb_face_t                  *face,
+				  hb_ot_layout_glyph_class_t  klass,
+				  hb_set_t                   *glyphs /* OUT */);
+
+
+/* Not that useful.  Provides list of attach points for a glyph that a
+ * client may want to cache */
+HB_EXTERN unsigned int
+hb_ot_layout_get_attach_points (hb_face_t      *face,
+				hb_codepoint_t  glyph,
+				unsigned int    start_offset,
+				unsigned int   *point_count /* IN/OUT */,
+				unsigned int   *point_array /* OUT */);
+
+/* Ligature caret positions */
+HB_EXTERN unsigned int
+hb_ot_layout_get_ligature_carets (hb_font_t      *font,
+				  hb_direction_t  direction,
+				  hb_codepoint_t  glyph,
+				  unsigned int    start_offset,
+				  unsigned int   *caret_count /* IN/OUT */,
+				  hb_position_t  *caret_array /* OUT */);
+
+
+/*
+ * GSUB/GPOS feature query and enumeration interface
+ */
+
+#define HB_OT_LAYOUT_NO_SCRIPT_INDEX		0xFFFFu
+#define HB_OT_LAYOUT_NO_FEATURE_INDEX		0xFFFFu
+#define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX	0xFFFFu
+#define HB_OT_LAYOUT_NO_VARIATIONS_INDEX	0xFFFFFFFFu
+
+HB_EXTERN unsigned int
+hb_ot_layout_table_get_script_tags (hb_face_t    *face,
+				    hb_tag_t      table_tag,
+				    unsigned int  start_offset,
+				    unsigned int *script_count /* IN/OUT */,
+				    hb_tag_t     *script_tags /* OUT */);
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_table_find_script (hb_face_t    *face,
+				hb_tag_t      table_tag,
+				hb_tag_t      script_tag,
+				unsigned int *script_index);
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_table_select_script (hb_face_t      *face,
+				  hb_tag_t        table_tag,
+				  unsigned int    script_count,
+				  const hb_tag_t *script_tags,
+				  unsigned int   *script_index /* OUT */,
+				  hb_tag_t       *chosen_script /* OUT */);
+
+HB_EXTERN unsigned int
+hb_ot_layout_table_get_feature_tags (hb_face_t    *face,
+				     hb_tag_t      table_tag,
+				     unsigned int  start_offset,
+				     unsigned int *feature_count /* IN/OUT */,
+				     hb_tag_t     *feature_tags /* OUT */);
+
+HB_EXTERN unsigned int
+hb_ot_layout_script_get_language_tags (hb_face_t    *face,
+				       hb_tag_t      table_tag,
+				       unsigned int  script_index,
+				       unsigned int  start_offset,
+				       unsigned int *language_count /* IN/OUT */,
+				       hb_tag_t     *language_tags /* OUT */);
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_script_select_language (hb_face_t      *face,
+				     hb_tag_t        table_tag,
+				     unsigned int    script_index,
+				     unsigned int    language_count,
+				     const hb_tag_t *language_tags,
+				     unsigned int   *language_index /* OUT */);
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_language_get_required_feature_index (hb_face_t    *face,
+						  hb_tag_t      table_tag,
+						  unsigned int  script_index,
+						  unsigned int  language_index,
+						  unsigned int *feature_index);
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_language_get_required_feature (hb_face_t    *face,
+					    hb_tag_t      table_tag,
+					    unsigned int  script_index,
+					    unsigned int  language_index,
+					    unsigned int *feature_index,
+					    hb_tag_t     *feature_tag);
+
+HB_EXTERN unsigned int
+hb_ot_layout_language_get_feature_indexes (hb_face_t    *face,
+					   hb_tag_t      table_tag,
+					   unsigned int  script_index,
+					   unsigned int  language_index,
+					   unsigned int  start_offset,
+					   unsigned int *feature_count /* IN/OUT */,
+					   unsigned int *feature_indexes /* OUT */);
+
+HB_EXTERN unsigned int
+hb_ot_layout_language_get_feature_tags (hb_face_t    *face,
+					hb_tag_t      table_tag,
+					unsigned int  script_index,
+					unsigned int  language_index,
+					unsigned int  start_offset,
+					unsigned int *feature_count /* IN/OUT */,
+					hb_tag_t     *feature_tags /* OUT */);
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_language_find_feature (hb_face_t    *face,
+				    hb_tag_t      table_tag,
+				    unsigned int  script_index,
+				    unsigned int  language_index,
+				    hb_tag_t      feature_tag,
+				    unsigned int *feature_index);
+
+HB_EXTERN unsigned int
+hb_ot_layout_feature_get_lookups (hb_face_t    *face,
+				  hb_tag_t      table_tag,
+				  unsigned int  feature_index,
+				  unsigned int  start_offset,
+				  unsigned int *lookup_count /* IN/OUT */,
+				  unsigned int *lookup_indexes /* OUT */);
+
+HB_EXTERN unsigned int
+hb_ot_layout_table_get_lookup_count (hb_face_t    *face,
+				     hb_tag_t      table_tag);
+
+HB_EXTERN void
+hb_ot_layout_collect_features (hb_face_t      *face,
+                               hb_tag_t        table_tag,
+                               const hb_tag_t *scripts,
+                               const hb_tag_t *languages,
+                               const hb_tag_t *features,
+                               hb_set_t       *feature_indexes /* OUT */);
+
+HB_EXTERN void
+hb_ot_layout_collect_lookups (hb_face_t      *face,
+			      hb_tag_t        table_tag,
+			      const hb_tag_t *scripts,
+			      const hb_tag_t *languages,
+			      const hb_tag_t *features,
+			      hb_set_t       *lookup_indexes /* OUT */);
+
+HB_EXTERN void
+hb_ot_layout_lookup_collect_glyphs (hb_face_t    *face,
+				    hb_tag_t      table_tag,
+				    unsigned int  lookup_index,
+				    hb_set_t     *glyphs_before, /* OUT.  May be NULL */
+				    hb_set_t     *glyphs_input,  /* OUT.  May be NULL */
+				    hb_set_t     *glyphs_after,  /* OUT.  May be NULL */
+				    hb_set_t     *glyphs_output  /* OUT.  May be NULL */);
+
+#ifdef HB_NOT_IMPLEMENTED
+typedef struct
+{
+  const hb_codepoint_t *before,
+  unsigned int          before_length,
+  const hb_codepoint_t *input,
+  unsigned int          input_length,
+  const hb_codepoint_t *after,
+  unsigned int          after_length,
+} hb_ot_layout_glyph_sequence_t;
+
+typedef hb_bool_t
+(*hb_ot_layout_glyph_sequence_func_t) (hb_font_t    *font,
+				       hb_tag_t      table_tag,
+				       unsigned int  lookup_index,
+				       const hb_ot_layout_glyph_sequence_t *sequence,
+				       void         *user_data);
+
+HB_EXTERN void
+Xhb_ot_layout_lookup_enumerate_sequences (hb_face_t    *face,
+					 hb_tag_t      table_tag,
+					 unsigned int  lookup_index,
+					 hb_ot_layout_glyph_sequence_func_t callback,
+					 void         *user_data);
+#endif
+
+/* Variations support */
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_table_find_feature_variations (hb_face_t    *face,
+					    hb_tag_t      table_tag,
+					    const int    *coords,
+					    unsigned int  num_coords,
+					    unsigned int *variations_index /* out */);
+
+HB_EXTERN unsigned int
+hb_ot_layout_feature_with_variations_get_lookups (hb_face_t    *face,
+						  hb_tag_t      table_tag,
+						  unsigned int  feature_index,
+						  unsigned int  variations_index,
+						  unsigned int  start_offset,
+						  unsigned int *lookup_count /* IN/OUT */,
+						  unsigned int *lookup_indexes /* OUT */);
+
+
+/*
+ * GSUB
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_has_substitution (hb_face_t *face);
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_lookup_would_substitute (hb_face_t            *face,
+				      unsigned int          lookup_index,
+				      const hb_codepoint_t *glyphs,
+				      unsigned int          glyphs_length,
+				      hb_bool_t             zero_context);
+
+HB_EXTERN void
+hb_ot_layout_lookup_substitute_closure (hb_face_t    *face,
+				        unsigned int  lookup_index,
+				        hb_set_t     *glyphs
+					/*TODO , hb_bool_t  inclusive */);
+
+HB_EXTERN void
+hb_ot_layout_lookups_substitute_closure (hb_face_t      *face,
+                                         const hb_set_t *lookups,
+                                         hb_set_t       *glyphs);
+
+
+#ifdef HB_NOT_IMPLEMENTED
+/* Note: You better have GDEF when using this API, or marks won't do much. */
+HB_EXTERN hb_bool_t
+Xhb_ot_layout_lookup_substitute (hb_font_t            *font,
+				unsigned int          lookup_index,
+				const hb_ot_layout_glyph_sequence_t *sequence,
+				unsigned int          out_size,
+				hb_codepoint_t       *glyphs_out,   /* OUT */
+				unsigned int         *clusters_out, /* OUT */
+				unsigned int         *out_length    /* OUT */);
+#endif
+
+
+/*
+ * GPOS
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_has_positioning (hb_face_t *face);
+
+#ifdef HB_NOT_IMPLEMENTED
+/* Note: You better have GDEF when using this API, or marks won't do much. */
+HB_EXTERN hb_bool_t
+Xhb_ot_layout_lookup_position (hb_font_t            *font,
+			      unsigned int          lookup_index,
+			      const hb_ot_layout_glyph_sequence_t *sequence,
+			      hb_glyph_position_t  *positions /* IN / OUT */);
+#endif
+
+/* Optical 'size' feature info.  Returns true if found.
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#size */
+HB_EXTERN hb_bool_t
+hb_ot_layout_get_size_params (hb_face_t       *face,
+			      unsigned int    *design_size,       /* OUT.  May be NULL */
+			      unsigned int    *subfamily_id,      /* OUT.  May be NULL */
+			      hb_ot_name_id_t *subfamily_name_id, /* OUT.  May be NULL */
+			      unsigned int    *range_start,       /* OUT.  May be NULL */
+			      unsigned int    *range_end          /* OUT.  May be NULL */);
+
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_feature_get_name_ids (hb_face_t       *face,
+				   hb_tag_t         table_tag,
+				   unsigned int     feature_index,
+				   hb_ot_name_id_t *label_id             /* OUT.  May be NULL */,
+				   hb_ot_name_id_t *tooltip_id           /* OUT.  May be NULL */,
+				   hb_ot_name_id_t *sample_id            /* OUT.  May be NULL */,
+				   unsigned int    *num_named_parameters /* OUT.  May be NULL */,
+				   hb_ot_name_id_t *first_param_id       /* OUT.  May be NULL */);
+
+
+HB_EXTERN unsigned int
+hb_ot_layout_feature_get_characters (hb_face_t      *face,
+				     hb_tag_t        table_tag,
+				     unsigned int    feature_index,
+				     unsigned int    start_offset,
+				     unsigned int   *char_count    /* IN/OUT.  May be NULL */,
+				     hb_codepoint_t *characters    /* OUT.     May be NULL */);
+
+HB_END_DECLS
+
+#endif /* HB_OT_LAYOUT_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout.hh
new file mode 100644
index 0000000..a00b940
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-layout.hh
@@ -0,0 +1,612 @@
+/*
+ * Copyright © 2007,2008,2009  Red Hat, Inc.
+ * Copyright © 2012,2013  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_LAYOUT_HH
+#define HB_OT_LAYOUT_HH
+
+#include "hb.hh"
+
+#include "hb-font.hh"
+#include "hb-buffer.hh"
+#include "hb-open-type.hh"
+#include "hb-ot-shape.hh"
+#include "hb-set-digest.hh"
+
+
+struct hb_ot_shape_plan_t;
+
+
+/*
+ * kern
+ */
+
+HB_INTERNAL bool
+hb_ot_layout_has_kerning (hb_face_t *face);
+
+HB_INTERNAL bool
+hb_ot_layout_has_machine_kerning (hb_face_t *face);
+
+HB_INTERNAL bool
+hb_ot_layout_has_cross_kerning (hb_face_t *face);
+
+HB_INTERNAL void
+hb_ot_layout_kern (const hb_ot_shape_plan_t *plan,
+		   hb_font_t *font,
+		   hb_buffer_t  *buffer);
+
+
+/* Private API corresponding to hb-ot-layout.h: */
+
+HB_INTERNAL bool
+hb_ot_layout_table_find_feature (hb_face_t    *face,
+				 hb_tag_t      table_tag,
+				 hb_tag_t      feature_tag,
+				 unsigned int *feature_index);
+
+
+/*
+ * GDEF
+ */
+
+enum hb_ot_layout_glyph_props_flags_t
+{
+  /* The following three match LookupFlags::Ignore* numbers. */
+  HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH	= 0x02u,
+  HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE	= 0x04u,
+  HB_OT_LAYOUT_GLYPH_PROPS_MARK		= 0x08u,
+
+  /* The following are used internally; not derived from GDEF. */
+  HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED	= 0x10u,
+  HB_OT_LAYOUT_GLYPH_PROPS_LIGATED	= 0x20u,
+  HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED	= 0x40u,
+
+  HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE     = HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED |
+					  HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
+					  HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED
+};
+HB_MARK_AS_FLAG_T (hb_ot_layout_glyph_props_flags_t);
+
+
+/*
+ * GSUB/GPOS
+ */
+
+HB_INTERNAL bool
+hb_ot_layout_lookup_would_substitute_fast (hb_face_t            *face,
+					   unsigned int          lookup_index,
+					   const hb_codepoint_t *glyphs,
+					   unsigned int          glyphs_length,
+					   bool                  zero_context);
+
+
+/* Should be called before all the substitute_lookup's are done. */
+HB_INTERNAL void
+hb_ot_layout_substitute_start (hb_font_t    *font,
+			       hb_buffer_t  *buffer);
+
+HB_INTERNAL void
+hb_ot_layout_delete_glyphs_inplace (hb_buffer_t *buffer,
+				    bool (*filter) (const hb_glyph_info_t *info));
+
+namespace OT {
+  struct hb_ot_apply_context_t;
+  struct SubstLookup;
+  struct hb_ot_layout_lookup_accelerator_t;
+}
+
+HB_INTERNAL void
+hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c,
+				const OT::SubstLookup &lookup,
+				const OT::hb_ot_layout_lookup_accelerator_t &accel);
+
+
+/* Should be called before all the position_lookup's are done. */
+HB_INTERNAL void
+hb_ot_layout_position_start (hb_font_t    *font,
+			     hb_buffer_t  *buffer);
+
+/* Should be called after all the position_lookup's are done, to fini advances. */
+HB_INTERNAL void
+hb_ot_layout_position_finish_advances (hb_font_t    *font,
+				       hb_buffer_t  *buffer);
+
+/* Should be called after hb_ot_layout_position_finish_advances, to fini offsets. */
+HB_INTERNAL void
+hb_ot_layout_position_finish_offsets (hb_font_t    *font,
+				      hb_buffer_t  *buffer);
+
+
+/*
+ * Buffer var routines.
+ */
+
+/* buffer var allocations, used during the entire shaping process */
+#define unicode_props()		var2.u16[0]
+
+/* buffer var allocations, used during the GSUB/GPOS processing */
+#define glyph_props()		var1.u16[0] /* GDEF glyph properties */
+#define lig_props()		var1.u8[2] /* GSUB/GPOS ligature tracking */
+#define syllable()		var1.u8[3] /* GSUB/GPOS shaping boundaries */
+
+
+/* Loop over syllables. Based on foreach_cluster(). */
+#define foreach_syllable(buffer, start, end) \
+  for (unsigned int \
+       _count = buffer->len, \
+       start = 0, end = _count ? _hb_next_syllable (buffer, 0) : 0; \
+       start < _count; \
+       start = end, end = _hb_next_syllable (buffer, start))
+
+static inline unsigned int
+_hb_next_syllable (hb_buffer_t *buffer, unsigned int start)
+{
+  hb_glyph_info_t *info = buffer->info;
+  unsigned int count = buffer->len;
+
+  unsigned int syllable = info[start].syllable();
+  while (++start < count && syllable == info[start].syllable())
+    ;
+
+  return start;
+}
+
+
+/* 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().
+ *   * Whether it's one of the three Mongolian Free Variation Selectors,
+ *     CGJ, or other characters that are hidden but should not be ignored
+ *     like most other Default_Ignorable()s do during matching.
+ *   * Whether it's a grapheme continuation.
+ *
+ * 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.
+ */
+
+enum hb_unicode_props_flags_t {
+  UPROPS_MASK_GEN_CAT	= 0x001Fu,
+  UPROPS_MASK_IGNORABLE	= 0x0020u,
+  UPROPS_MASK_HIDDEN	= 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3, or TAG characters */
+  UPROPS_MASK_CONTINUATION=0x0080u,
+
+  /* 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;
+  unsigned int gen_cat = (unsigned int) unicode->general_category (u);
+  unsigned int props = gen_cat;
+
+  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_Cf_ZWNJ;
+      else 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/harfbuzz/harfbuzz/issues/234 */
+      else if (unlikely (hb_in_range (u, 0x180Bu, 0x180Du))) props |= UPROPS_MASK_HIDDEN;
+      /* TAG characters need similar treatment. Fixes:
+       * https://github.com/harfbuzz/harfbuzz/issues/463 */
+      else if (unlikely (hb_in_range (u, 0xE0020u, 0xE007Fu))) props |= UPROPS_MASK_HIDDEN;
+      /* COMBINING GRAPHEME JOINER should not be skipped; at least some times.
+       * https://github.com/harfbuzz/harfbuzz/issues/554 */
+      else if (unlikely (u == 0x034Fu))
+      {
+	buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_CGJ;
+	props |= UPROPS_MASK_HIDDEN;
+      }
+    }
+
+    if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (gen_cat)))
+    {
+      props |= UPROPS_MASK_CONTINUATION;
+      props |= unicode->modified_combining_class (u)<<8;
+    }
+  }
+
+  info->unicode_props() = props;
+}
+
+static inline void
+_hb_glyph_info_set_general_category (hb_glyph_info_t *info,
+				     hb_unicode_general_category_t gen_cat)
+{
+  /* Clears top-byte. */
+  info->unicode_props() = (unsigned int) gen_cat | (info->unicode_props() & (0xFF & ~UPROPS_MASK_GEN_CAT));
+}
+
+static inline hb_unicode_general_category_t
+_hb_glyph_info_get_general_category (const hb_glyph_info_t *info)
+{
+  return (hb_unicode_general_category_t) (info->unicode_props() & UPROPS_MASK_GEN_CAT);
+}
+
+static inline bool
+_hb_glyph_info_is_unicode_mark (const hb_glyph_info_t *info)
+{
+  return HB_UNICODE_GENERAL_CATEGORY_IS_MARK (info->unicode_props() & UPROPS_MASK_GEN_CAT);
+}
+static inline void
+_hb_glyph_info_set_modified_combining_class (hb_glyph_info_t *info,
+					     unsigned int modified_class)
+{
+  if (unlikely (!_hb_glyph_info_is_unicode_mark (info)))
+    return;
+  info->unicode_props() = (modified_class<<8) | (info->unicode_props() & 0xFF);
+}
+static inline unsigned int
+_hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info)
+{
+  return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0;
+}
+#define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info)))
+
+static inline bool
+_hb_glyph_info_is_unicode_space (const hb_glyph_info_t *info)
+{
+  return _hb_glyph_info_get_general_category (info) ==
+	 HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR;
+}
+static inline void
+_hb_glyph_info_set_unicode_space_fallback_type (hb_glyph_info_t *info, hb_unicode_funcs_t::space_t s)
+{
+  if (unlikely (!_hb_glyph_info_is_unicode_space (info)))
+    return;
+  info->unicode_props() = (((unsigned int) s)<<8) | (info->unicode_props() & 0xFF);
+}
+static inline hb_unicode_funcs_t::space_t
+_hb_glyph_info_get_unicode_space_fallback_type (const hb_glyph_info_t *info)
+{
+  return _hb_glyph_info_is_unicode_space (info) ?
+	 (hb_unicode_funcs_t::space_t) (info->unicode_props()>>8) :
+	 hb_unicode_funcs_t::NOT_SPACE;
+}
+
+static inline bool _hb_glyph_info_ligated (const hb_glyph_info_t *info);
+
+static inline bool
+_hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info)
+{
+  return (info->unicode_props() & UPROPS_MASK_IGNORABLE) &&
+	 !_hb_glyph_info_ligated (info);
+}
+static inline bool
+_hb_glyph_info_is_default_ignorable_and_not_hidden (const hb_glyph_info_t *info)
+{
+  return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_HIDDEN))
+	  == UPROPS_MASK_IGNORABLE) &&
+	 !_hb_glyph_info_ligated (info);
+}
+static inline void
+_hb_glyph_info_unhide (hb_glyph_info_t *info)
+{
+  info->unicode_props() &= ~ UPROPS_MASK_HIDDEN;
+}
+
+static inline void
+_hb_glyph_info_set_continuation (hb_glyph_info_t *info)
+{
+  info->unicode_props() |= UPROPS_MASK_CONTINUATION;
+}
+static inline void
+_hb_glyph_info_reset_continuation (hb_glyph_info_t *info)
+{
+  info->unicode_props() &= ~ UPROPS_MASK_CONTINUATION;
+}
+static inline bool
+_hb_glyph_info_is_continuation (const hb_glyph_info_t *info)
+{
+  return info->unicode_props() & UPROPS_MASK_CONTINUATION;
+}
+/* Loop over grapheme. Based on foreach_cluster(). */
+#define foreach_grapheme(buffer, start, end) \
+  for (unsigned int \
+       _count = buffer->len, \
+       start = 0, end = _count ? _hb_next_grapheme (buffer, 0) : 0; \
+       start < _count; \
+       start = end, end = _hb_next_grapheme (buffer, start))
+
+static inline unsigned int
+_hb_next_grapheme (hb_buffer_t *buffer, unsigned int start)
+{
+  hb_glyph_info_t *info = buffer->info;
+  unsigned int count = buffer->len;
+
+  while (++start < count && _hb_glyph_info_is_continuation (&info[start]))
+    ;
+
+  return start;
+}
+
+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 bool
+_hb_glyph_info_is_zwnj (const hb_glyph_info_t *info)
+{
+  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWNJ);
+}
+static inline bool
+_hb_glyph_info_is_zwj (const hb_glyph_info_t *info)
+{
+  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWJ);
+}
+static inline bool
+_hb_glyph_info_is_joiner (const hb_glyph_info_t *info)
+{
+  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)
+{
+  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,
+ *   - The ligature glyph will get lig_num_comps set to the number of components
+ *   - The marks get lig_comp > 0, reflecting which component of the ligature
+ *     they were applied to.
+ *   - This is used in GPOS to attach marks to the right component of a ligature
+ *     in MarkLigPos,
+ *   - Note that when marks are ligated together, much of the above is skipped
+ *     and the current lig_id reused.
+ *
+ * When a multiple-substitution is done:
+ *
+ *   - All resulting glyphs will have lig_id = 0,
+ *   - The resulting glyphs will have lig_comp = 0, 1, 2, ... respectively.
+ *   - This is used in GPOS to attach marks to the first component of a
+ *     multiple substitution in MarkBasePos.
+ *
+ * The numbers are also used in GPOS to do mark-to-mark positioning only
+ * to marks that belong to the same component of the same ligature.
+ */
+
+static inline void
+_hb_glyph_info_clear_lig_props (hb_glyph_info_t *info)
+{
+  info->lig_props() = 0;
+}
+
+#define IS_LIG_BASE 0x10
+
+static inline void
+_hb_glyph_info_set_lig_props_for_ligature (hb_glyph_info_t *info,
+					   unsigned int lig_id,
+					   unsigned int lig_num_comps)
+{
+  info->lig_props() = (lig_id << 5) | IS_LIG_BASE | (lig_num_comps & 0x0F);
+}
+
+static inline void
+_hb_glyph_info_set_lig_props_for_mark (hb_glyph_info_t *info,
+				       unsigned int lig_id,
+				       unsigned int lig_comp)
+{
+  info->lig_props() = (lig_id << 5) | (lig_comp & 0x0F);
+}
+
+static inline void
+_hb_glyph_info_set_lig_props_for_component (hb_glyph_info_t *info, unsigned int comp)
+{
+  _hb_glyph_info_set_lig_props_for_mark (info, 0, comp);
+}
+
+static inline unsigned int
+_hb_glyph_info_get_lig_id (const hb_glyph_info_t *info)
+{
+  return info->lig_props() >> 5;
+}
+
+static inline bool
+_hb_glyph_info_ligated_internal (const hb_glyph_info_t *info)
+{
+  return !!(info->lig_props() & IS_LIG_BASE);
+}
+
+static inline unsigned int
+_hb_glyph_info_get_lig_comp (const hb_glyph_info_t *info)
+{
+  if (_hb_glyph_info_ligated_internal (info))
+    return 0;
+  else
+    return info->lig_props() & 0x0F;
+}
+
+static inline unsigned int
+_hb_glyph_info_get_lig_num_comps (const hb_glyph_info_t *info)
+{
+  if ((info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE) &&
+      _hb_glyph_info_ligated_internal (info))
+    return info->lig_props() & 0x0F;
+  else
+    return 1;
+}
+
+static inline uint8_t
+_hb_allocate_lig_id (hb_buffer_t *buffer) {
+  uint8_t lig_id = buffer->next_serial () & 0x07;
+  if (unlikely (!lig_id))
+    lig_id = _hb_allocate_lig_id (buffer); /* in case of overflow */
+  return lig_id;
+}
+
+/* glyph_props: */
+
+static inline void
+_hb_glyph_info_set_glyph_props (hb_glyph_info_t *info, unsigned int props)
+{
+  info->glyph_props() = props;
+}
+
+static inline unsigned int
+_hb_glyph_info_get_glyph_props (const hb_glyph_info_t *info)
+{
+  return info->glyph_props();
+}
+
+static inline bool
+_hb_glyph_info_is_base_glyph (const hb_glyph_info_t *info)
+{
+  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH);
+}
+
+static inline bool
+_hb_glyph_info_is_ligature (const hb_glyph_info_t *info)
+{
+  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE);
+}
+
+static inline bool
+_hb_glyph_info_is_mark (const hb_glyph_info_t *info)
+{
+  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MARK);
+}
+
+static inline bool
+_hb_glyph_info_substituted (const hb_glyph_info_t *info)
+{
+  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED);
+}
+
+static inline bool
+_hb_glyph_info_ligated (const hb_glyph_info_t *info)
+{
+  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATED);
+}
+
+static inline bool
+_hb_glyph_info_multiplied (const hb_glyph_info_t *info)
+{
+  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED);
+}
+
+static inline bool
+_hb_glyph_info_ligated_and_didnt_multiply (const hb_glyph_info_t *info)
+{
+  return _hb_glyph_info_ligated (info) && !_hb_glyph_info_multiplied (info);
+}
+
+static inline void
+_hb_glyph_info_clear_ligated_and_multiplied (hb_glyph_info_t *info)
+{
+  info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
+			   HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED);
+}
+
+static inline void
+_hb_glyph_info_clear_substituted (hb_glyph_info_t *info)
+{
+  info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED);
+}
+
+
+/* Allocation / deallocation. */
+
+static inline void
+_hb_buffer_allocate_unicode_vars (hb_buffer_t *buffer)
+{
+  HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props);
+}
+
+static inline void
+_hb_buffer_deallocate_unicode_vars (hb_buffer_t *buffer)
+{
+  HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props);
+}
+
+static inline void
+_hb_buffer_assert_unicode_vars (hb_buffer_t *buffer)
+{
+  HB_BUFFER_ASSERT_VAR (buffer, unicode_props);
+}
+
+static inline void
+_hb_buffer_allocate_gsubgpos_vars (hb_buffer_t *buffer)
+{
+  HB_BUFFER_ALLOCATE_VAR (buffer, glyph_props);
+  HB_BUFFER_ALLOCATE_VAR (buffer, lig_props);
+  HB_BUFFER_ALLOCATE_VAR (buffer, syllable);
+}
+
+static inline void
+_hb_buffer_deallocate_gsubgpos_vars (hb_buffer_t *buffer)
+{
+  HB_BUFFER_DEALLOCATE_VAR (buffer, syllable);
+  HB_BUFFER_DEALLOCATE_VAR (buffer, lig_props);
+  HB_BUFFER_DEALLOCATE_VAR (buffer, glyph_props);
+}
+
+static inline void
+_hb_buffer_assert_gsubgpos_vars (hb_buffer_t *buffer)
+{
+  HB_BUFFER_ASSERT_VAR (buffer, glyph_props);
+  HB_BUFFER_ASSERT_VAR (buffer, lig_props);
+  HB_BUFFER_ASSERT_VAR (buffer, syllable);
+}
+
+/* Make sure no one directly touches our props... */
+#undef unicode_props0
+#undef unicode_props1
+#undef lig_props
+#undef glyph_props
+
+#endif /* HB_OT_LAYOUT_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-map.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-map.cc
new file mode 100644
index 0000000..ef0bcc7
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-map.cc
@@ -0,0 +1,334 @@
+/*
+ * Copyright © 2009,2010  Red Hat, Inc.
+ * Copyright © 2010,2011,2013  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-ot-map.hh"
+#include "hb-ot-shape.hh"
+#include "hb-ot-layout.hh"
+
+
+void hb_ot_map_t::collect_lookups (unsigned int table_index, hb_set_t *lookups_out) const
+{
+  for (unsigned int i = 0; i < lookups[table_index].length; i++)
+    hb_set_add (lookups_out, lookups[table_index][i].index);
+}
+
+
+hb_ot_map_builder_t::hb_ot_map_builder_t (hb_face_t *face_,
+					  const hb_segment_properties_t *props_)
+{
+  memset (this, 0, sizeof (*this));
+
+  feature_infos.init ();
+  for (unsigned int table_index = 0; table_index < 2; table_index++)
+    stages[table_index].init ();
+
+  face = face_;
+  props = *props_;
+
+
+  /* Fetch script/language indices for GSUB/GPOS.  We need these later to skip
+   * features not available in either table and not waste precious bits for them. */
+
+  unsigned int script_count = HB_OT_MAX_TAGS_PER_SCRIPT;
+  unsigned int language_count = HB_OT_MAX_TAGS_PER_LANGUAGE;
+  hb_tag_t script_tags[HB_OT_MAX_TAGS_PER_SCRIPT];
+  hb_tag_t language_tags[HB_OT_MAX_TAGS_PER_LANGUAGE];
+
+  hb_ot_tags_from_script_and_language (props.script, props.language, &script_count, script_tags, &language_count, language_tags);
+
+  for (unsigned int table_index = 0; table_index < 2; table_index++) {
+    hb_tag_t table_tag = table_tags[table_index];
+    found_script[table_index] = (bool) hb_ot_layout_table_select_script (face, table_tag, script_count, script_tags, &script_index[table_index], &chosen_script[table_index]);
+    hb_ot_layout_script_select_language (face, table_tag, script_index[table_index], language_count, language_tags, &language_index[table_index]);
+  }
+}
+
+hb_ot_map_builder_t::~hb_ot_map_builder_t ()
+{
+  feature_infos.fini ();
+  for (unsigned int table_index = 0; table_index < 2; table_index++)
+    stages[table_index].fini ();
+}
+
+void hb_ot_map_builder_t::add_feature (hb_tag_t tag,
+				       hb_ot_map_feature_flags_t flags,
+				       unsigned int value)
+{
+  if (unlikely (!tag)) return;
+  feature_info_t *info = feature_infos.push();
+  info->tag = tag;
+  info->seq = feature_infos.length;
+  info->max_value = value;
+  info->flags = flags;
+  info->default_value = (flags & F_GLOBAL) ? value : 0;
+  info->stage[0] = current_stage[0];
+  info->stage[1] = current_stage[1];
+}
+
+void
+hb_ot_map_builder_t::add_lookups (hb_ot_map_t  &m,
+				  unsigned int  table_index,
+				  unsigned int  feature_index,
+				  unsigned int  variations_index,
+				  hb_mask_t     mask,
+				  bool          auto_zwnj,
+				  bool          auto_zwj,
+				  bool          random)
+{
+  unsigned int lookup_indices[32];
+  unsigned int offset, len;
+  unsigned int table_lookup_count;
+
+  table_lookup_count = hb_ot_layout_table_get_lookup_count (face, table_tags[table_index]);
+
+  offset = 0;
+  do {
+    len = ARRAY_LENGTH (lookup_indices);
+    hb_ot_layout_feature_with_variations_get_lookups (face,
+						      table_tags[table_index],
+						      feature_index,
+						      variations_index,
+						      offset, &len,
+						      lookup_indices);
+
+    for (unsigned int i = 0; i < len; i++)
+    {
+      if (lookup_indices[i] >= table_lookup_count)
+	continue;
+      hb_ot_map_t::lookup_map_t *lookup = m.lookups[table_index].push ();
+      lookup->mask = mask;
+      lookup->index = lookup_indices[i];
+      lookup->auto_zwnj = auto_zwnj;
+      lookup->auto_zwj = auto_zwj;
+      lookup->random = random;
+    }
+
+    offset += len;
+  } while (len == ARRAY_LENGTH (lookup_indices));
+}
+
+
+void hb_ot_map_builder_t::add_pause (unsigned int table_index, hb_ot_map_t::pause_func_t pause_func)
+{
+  stage_info_t *s = stages[table_index].push ();
+  s->index = current_stage[table_index];
+  s->pause_func = pause_func;
+
+  current_stage[table_index]++;
+}
+
+void
+hb_ot_map_builder_t::compile (hb_ot_map_t                  &m,
+			      const hb_ot_shape_plan_key_t &key)
+{
+  static_assert ((!(HB_GLYPH_FLAG_DEFINED & (HB_GLYPH_FLAG_DEFINED + 1))), "");
+  unsigned int global_bit_mask = HB_GLYPH_FLAG_DEFINED + 1;
+  unsigned int global_bit_shift = hb_popcount (HB_GLYPH_FLAG_DEFINED);
+
+  m.global_mask = global_bit_mask;
+
+  unsigned int required_feature_index[2];
+  hb_tag_t required_feature_tag[2];
+  /* We default to applying required feature in stage 0.  If the required
+   * feature has a tag that is known to the shaper, we apply required feature
+   * in the stage for that tag.
+   */
+  unsigned int required_feature_stage[2] = {0, 0};
+
+  for (unsigned int table_index = 0; table_index < 2; table_index++)
+  {
+    m.chosen_script[table_index] = chosen_script[table_index];
+    m.found_script[table_index] = found_script[table_index];
+
+    hb_ot_layout_language_get_required_feature (face,
+						table_tags[table_index],
+						script_index[table_index],
+						language_index[table_index],
+						&required_feature_index[table_index],
+						&required_feature_tag[table_index]);
+  }
+
+  /* Sort features and merge duplicates */
+  if (feature_infos.length)
+  {
+    feature_infos.qsort ();
+    unsigned int j = 0;
+    for (unsigned int i = 1; i < feature_infos.length; i++)
+      if (feature_infos[i].tag != feature_infos[j].tag)
+	feature_infos[++j] = feature_infos[i];
+      else {
+	if (feature_infos[i].flags & F_GLOBAL) {
+	  feature_infos[j].flags |= F_GLOBAL;
+	  feature_infos[j].max_value = feature_infos[i].max_value;
+	  feature_infos[j].default_value = feature_infos[i].default_value;
+	} else {
+	  feature_infos[j].flags &= ~F_GLOBAL;
+	  feature_infos[j].max_value = MAX (feature_infos[j].max_value, feature_infos[i].max_value);
+	  /* Inherit default_value from j */
+	}
+	feature_infos[j].flags |= (feature_infos[i].flags & F_HAS_FALLBACK);
+	feature_infos[j].stage[0] = MIN (feature_infos[j].stage[0], feature_infos[i].stage[0]);
+	feature_infos[j].stage[1] = MIN (feature_infos[j].stage[1], feature_infos[i].stage[1]);
+      }
+    feature_infos.shrink (j + 1);
+  }
+
+
+  /* Allocate bits now */
+  unsigned int next_bit = global_bit_shift + 1;
+
+  for (unsigned int i = 0; i < feature_infos.length; i++)
+  {
+    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
+      /* Limit bits per feature. */
+      bits_needed = MIN(HB_OT_MAP_MAX_BITS, 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++)
+    {
+      if (required_feature_tag[table_index] == info->tag)
+	required_feature_stage[table_index] = info->stage[table_index];
+
+      found |= hb_ot_layout_language_find_feature (face,
+						   table_tags[table_index],
+						   script_index[table_index],
+						   language_index[table_index],
+						   info->tag,
+						   &feature_index[table_index]);
+    }
+    if (!found && (info->flags & F_GLOBAL_SEARCH))
+    {
+      for (unsigned int table_index = 0; table_index < 2; table_index++)
+      {
+	found |= hb_ot_layout_table_find_feature (face,
+						  table_tags[table_index],
+						  info->tag,
+						  &feature_index[table_index]);
+      }
+    }
+    if (!found && !(info->flags & F_HAS_FALLBACK))
+      continue;
+
+
+    hb_ot_map_t::feature_map_t *map = m.features.push ();
+
+    map->tag = info->tag;
+    map->index[0] = feature_index[0];
+    map->index[1] = feature_index[1];
+    map->stage[0] = info->stage[0];
+    map->stage[1] = info->stage[1];
+    map->auto_zwnj = !(info->flags & F_MANUAL_ZWNJ);
+    map->auto_zwj = !(info->flags & F_MANUAL_ZWJ);
+    map->random = !!(info->flags & F_RANDOM);
+    if ((info->flags & F_GLOBAL) && info->max_value == 1) {
+      /* Uses the global bit */
+      map->shift = global_bit_shift;
+      map->mask = global_bit_mask;
+    } else {
+      map->shift = 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 = (1u << map->shift) & map->mask;
+    map->needs_fallback = !found;
+
+  }
+  feature_infos.shrink (0); /* Done with these */
+
+
+  add_gsub_pause (nullptr);
+  add_gpos_pause (nullptr);
+
+  for (unsigned int table_index = 0; table_index < 2; table_index++)
+  {
+    /* Collect lookup indices for features */
+
+    unsigned int stage_index = 0;
+    unsigned int last_num_lookups = 0;
+    for (unsigned stage = 0; stage < current_stage[table_index]; stage++)
+    {
+      if (required_feature_index[table_index] != HB_OT_LAYOUT_NO_FEATURE_INDEX &&
+	  required_feature_stage[table_index] == stage)
+	add_lookups (m, table_index,
+		     required_feature_index[table_index],
+		     key.variations_index[table_index],
+		     global_bit_mask);
+
+      for (unsigned i = 0; i < m.features.length; i++)
+        if (m.features[i].stage[table_index] == stage)
+	  add_lookups (m, table_index,
+		       m.features[i].index[table_index],
+		       key.variations_index[table_index],
+		       m.features[i].mask,
+		       m.features[i].auto_zwnj,
+		       m.features[i].auto_zwj,
+		       m.features[i].random);
+
+      /* Sort lookups and merge duplicates */
+      if (last_num_lookups < m.lookups[table_index].length)
+      {
+	m.lookups[table_index].qsort (last_num_lookups, m.lookups[table_index].length);
+
+	unsigned int j = last_num_lookups;
+	for (unsigned int i = j + 1; i < m.lookups[table_index].length; i++)
+	  if (m.lookups[table_index][i].index != m.lookups[table_index][j].index)
+	    m.lookups[table_index][++j] = m.lookups[table_index][i];
+	  else
+	  {
+	    m.lookups[table_index][j].mask |= m.lookups[table_index][i].mask;
+	    m.lookups[table_index][j].auto_zwnj &= m.lookups[table_index][i].auto_zwnj;
+	    m.lookups[table_index][j].auto_zwj &= m.lookups[table_index][i].auto_zwj;
+	  }
+	m.lookups[table_index].shrink (j + 1);
+      }
+
+      last_num_lookups = m.lookups[table_index].length;
+
+      if (stage_index < stages[table_index].length && stages[table_index][stage_index].index == stage) {
+	hb_ot_map_t::stage_map_t *stage_map = m.stages[table_index].push ();
+	stage_map->last_lookup = last_num_lookups;
+	stage_map->pause_func = stages[table_index][stage_index].pause_func;
+
+	stage_index++;
+      }
+    }
+  }
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-map.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-map.hh
new file mode 100644
index 0000000..28407c2
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-map.hh
@@ -0,0 +1,284 @@
+/*
+ * Copyright © 2009,2010  Red Hat, Inc.
+ * Copyright © 2010,2011,2012,2013  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_MAP_HH
+#define HB_OT_MAP_HH
+
+#include "hb-buffer.hh"
+
+
+#define HB_OT_MAP_MAX_BITS 8u
+#define HB_OT_MAP_MAX_VALUE ((1u << HB_OT_MAP_MAX_BITS) - 1u)
+
+struct hb_ot_shape_plan_t;
+
+static const hb_tag_t table_tags[2] = {HB_OT_TAG_GSUB, HB_OT_TAG_GPOS};
+
+struct hb_ot_map_t
+{
+  friend struct hb_ot_map_builder_t;
+
+  public:
+
+  struct feature_map_t {
+    hb_tag_t tag; /* should be first for our bsearch to work */
+    unsigned int index[2]; /* GSUB/GPOS */
+    unsigned int stage[2]; /* GSUB/GPOS */
+    unsigned int shift;
+    hb_mask_t mask;
+    hb_mask_t _1_mask; /* mask for value=1, for quick access */
+    unsigned int needs_fallback : 1;
+    unsigned int auto_zwnj : 1;
+    unsigned int auto_zwj : 1;
+    unsigned int random : 1;
+
+    int cmp (const hb_tag_t tag_) const
+    { return tag_ < tag ? -1 : tag_ > tag ? 1 : 0; }
+  };
+
+  struct lookup_map_t {
+    unsigned short index;
+    unsigned short auto_zwnj : 1;
+    unsigned short auto_zwj : 1;
+    unsigned short random : 1;
+    hb_mask_t mask;
+
+    static int cmp (const void *pa, const void *pb)
+    {
+      const lookup_map_t *a = (const lookup_map_t *) pa;
+      const lookup_map_t *b = (const lookup_map_t *) pb;
+      return a->index < b->index ? -1 : a->index > b->index ? 1 : 0;
+    }
+  };
+
+  typedef void (*pause_func_t) (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer);
+
+  struct stage_map_t {
+    unsigned int last_lookup; /* Cumulative */
+    pause_func_t pause_func;
+  };
+
+  void init ()
+  {
+    memset (this, 0, sizeof (*this));
+
+    features.init ();
+    for (unsigned int table_index = 0; table_index < 2; table_index++)
+    {
+      lookups[table_index].init ();
+      stages[table_index].init ();
+    }
+  }
+  void fini ()
+  {
+    features.fini ();
+    for (unsigned int table_index = 0; table_index < 2; table_index++)
+    {
+      lookups[table_index].fini ();
+      stages[table_index].fini ();
+    }
+  }
+
+  hb_mask_t get_global_mask () const { return global_mask; }
+
+  hb_mask_t get_mask (hb_tag_t feature_tag, unsigned int *shift = nullptr) const
+  {
+    const feature_map_t *map = features.bsearch (feature_tag);
+    if (shift) *shift = map ? map->shift : 0;
+    return map ? map->mask : 0;
+  }
+
+  bool needs_fallback (hb_tag_t feature_tag) const
+  {
+    const feature_map_t *map = features.bsearch (feature_tag);
+    return map ? map->needs_fallback : false;
+  }
+
+  hb_mask_t get_1_mask (hb_tag_t feature_tag) const
+  {
+    const feature_map_t *map = features.bsearch (feature_tag);
+    return map ? map->_1_mask : 0;
+  }
+
+  unsigned int get_feature_index (unsigned int table_index, hb_tag_t feature_tag) const
+  {
+    const feature_map_t *map = features.bsearch (feature_tag);
+    return map ? map->index[table_index] : HB_OT_LAYOUT_NO_FEATURE_INDEX;
+  }
+
+  unsigned int get_feature_stage (unsigned int table_index, hb_tag_t feature_tag) const
+  {
+    const feature_map_t *map = features.bsearch (feature_tag);
+    return map ? map->stage[table_index] : (unsigned int) -1;
+  }
+
+  void get_stage_lookups (unsigned int table_index, unsigned int stage,
+			  const struct lookup_map_t **plookups, unsigned int *lookup_count) const
+  {
+    if (unlikely (stage == (unsigned int) -1)) {
+      *plookups = nullptr;
+      *lookup_count = 0;
+      return;
+    }
+    assert (stage <= stages[table_index].length);
+    unsigned int start = stage ? stages[table_index][stage - 1].last_lookup : 0;
+    unsigned int end   = stage < stages[table_index].length ? stages[table_index][stage].last_lookup : lookups[table_index].length;
+    *plookups = end == start ? nullptr : &lookups[table_index][start];
+    *lookup_count = end - start;
+  }
+
+  HB_INTERNAL void collect_lookups (unsigned int table_index, hb_set_t *lookups) const;
+  template <typename Proxy>
+  HB_INTERNAL inline void apply (const Proxy &proxy,
+				 const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const;
+  HB_INTERNAL void substitute (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const;
+  HB_INTERNAL void position (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const;
+
+  public:
+  hb_tag_t chosen_script[2];
+  bool found_script[2];
+
+  private:
+
+  hb_mask_t global_mask;
+
+  hb_vector_t<feature_map_t> features;
+  hb_vector_t<lookup_map_t> lookups[2]; /* GSUB/GPOS */
+  hb_vector_t<stage_map_t> stages[2]; /* GSUB/GPOS */
+};
+
+enum hb_ot_map_feature_flags_t
+{
+  F_NONE		= 0x0000u,
+  F_GLOBAL		= 0x0001u, /* Feature applies to all characters; results in no mask allocated for it. */
+  F_HAS_FALLBACK	= 0x0002u, /* Has fallback implementation, so include mask bit even if feature not found. */
+  F_MANUAL_ZWNJ		= 0x0004u, /* Don't skip over ZWNJ when matching **context**. */
+  F_MANUAL_ZWJ		= 0x0008u, /* Don't skip over ZWJ when matching **input**. */
+  F_MANUAL_JOINERS	= F_MANUAL_ZWNJ | F_MANUAL_ZWJ,
+  F_GLOBAL_MANUAL_JOINERS= F_GLOBAL | F_MANUAL_JOINERS,
+  F_GLOBAL_HAS_FALLBACK = F_GLOBAL | F_HAS_FALLBACK,
+  F_GLOBAL_SEARCH	= 0x0010u, /* If feature not found in LangSys, look for it in global feature list and pick one. */
+  F_RANDOM		= 0x0020u  /* Randomly select a glyph from an AlternateSubstFormat1 subtable. */
+};
+HB_MARK_AS_FLAG_T (hb_ot_map_feature_flags_t);
+
+
+struct hb_ot_map_feature_t
+{
+  hb_tag_t tag;
+  hb_ot_map_feature_flags_t flags;
+};
+
+struct hb_ot_shape_plan_key_t;
+
+struct hb_ot_map_builder_t
+{
+  public:
+
+  HB_INTERNAL hb_ot_map_builder_t (hb_face_t *face_,
+				   const hb_segment_properties_t *props_);
+
+  HB_INTERNAL ~hb_ot_map_builder_t ();
+
+  HB_INTERNAL void add_feature (hb_tag_t tag,
+				hb_ot_map_feature_flags_t flags=F_NONE,
+				unsigned int value=1);
+
+  void add_feature (const hb_ot_map_feature_t &feat)
+  { add_feature (feat.tag, feat.flags); }
+
+  void enable_feature (hb_tag_t tag,
+			      hb_ot_map_feature_flags_t flags=F_NONE,
+			      unsigned int value=1)
+  { add_feature (tag, F_GLOBAL | flags, value); }
+
+  void disable_feature (hb_tag_t tag)
+  { add_feature (tag, F_GLOBAL, 0); }
+
+  void add_gsub_pause (hb_ot_map_t::pause_func_t pause_func)
+  { add_pause (0, pause_func); }
+  void add_gpos_pause (hb_ot_map_t::pause_func_t pause_func)
+  { add_pause (1, pause_func); }
+
+  HB_INTERNAL void compile (hb_ot_map_t                  &m,
+			    const hb_ot_shape_plan_key_t &key);
+
+  private:
+
+  HB_INTERNAL void add_lookups (hb_ot_map_t  &m,
+				unsigned int  table_index,
+				unsigned int  feature_index,
+				unsigned int  variations_index,
+				hb_mask_t     mask,
+				bool          auto_zwnj = true,
+				bool          auto_zwj = true,
+				bool          random = false);
+
+  struct feature_info_t {
+    hb_tag_t tag;
+    unsigned int seq; /* sequence#, used for stable sorting only */
+    unsigned int max_value;
+    hb_ot_map_feature_flags_t flags;
+    unsigned int default_value; /* for non-global features, what should the unset glyphs take */
+    unsigned int stage[2]; /* GSUB/GPOS */
+
+    static int cmp (const void *pa, const void *pb)
+    {
+      const feature_info_t *a = (const feature_info_t *) pa;
+      const feature_info_t *b = (const feature_info_t *) pb;
+      return (a->tag != b->tag) ?  (a->tag < b->tag ? -1 : 1) :
+	     (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0);
+    }
+  };
+
+  struct stage_info_t {
+    unsigned int index;
+    hb_ot_map_t::pause_func_t pause_func;
+  };
+
+  HB_INTERNAL void add_pause (unsigned int table_index, hb_ot_map_t::pause_func_t pause_func);
+
+  public:
+
+  hb_face_t *face;
+  hb_segment_properties_t props;
+
+  hb_tag_t chosen_script[2];
+  bool found_script[2];
+  unsigned int script_index[2], language_index[2];
+
+  private:
+
+  unsigned int current_stage[2]; /* GSUB/GPOS */
+  hb_vector_t<feature_info_t> feature_infos;
+  hb_vector_t<stage_info_t> stages[2]; /* GSUB/GPOS */
+};
+
+
+
+#endif /* HB_OT_MAP_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-math-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-math-table.hh
new file mode 100644
index 0000000..62bf072e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-math-table.hh
@@ -0,0 +1,718 @@
+/*
+ * Copyright © 2016  Igalia S.L.
+ *
+ *  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.
+ *
+ * Igalia Author(s): Frédéric Wang
+ */
+
+#ifndef HB_OT_MATH_TABLE_HH
+#define HB_OT_MATH_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-layout-common.hh"
+#include "hb-ot-math.h"
+
+namespace OT {
+
+
+struct MathValueRecord
+{
+  hb_position_t get_x_value (hb_font_t *font, const void *base) const
+  { return font->em_scale_x (value) + (base+deviceTable).get_x_delta (font); }
+  hb_position_t get_y_value (hb_font_t *font, const void *base) const
+  { return font->em_scale_y (value) + (base+deviceTable).get_y_delta (font); }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && deviceTable.sanitize (c, base));
+  }
+
+  protected:
+  HBINT16			value;		/* The X or Y value in design units */
+  OffsetTo<Device>	deviceTable;	/* Offset to the device table - from the
+					 * beginning of parent table.  May be NULL.
+					 * Suggested format for device table is 1. */
+
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct MathConstants
+{
+  bool sanitize_math_value_records (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+
+    unsigned int count = ARRAY_LENGTH (mathValueRecords);
+    for (unsigned int i = 0; i < count; i++)
+      if (!mathValueRecords[i].sanitize (c, this))
+	return_trace (false);
+
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && sanitize_math_value_records (c));
+  }
+
+  hb_position_t get_value (hb_ot_math_constant_t constant,
+				  hb_font_t *font) const
+  {
+    switch (constant) {
+
+    case HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN:
+    case HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN:
+      return percentScaleDown[constant - HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN];
+
+    case HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT:
+    case HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT:
+      return font->em_scale_y (minHeight[constant - HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT]);
+
+    case HB_OT_MATH_CONSTANT_RADICAL_KERN_AFTER_DEGREE:
+    case HB_OT_MATH_CONSTANT_RADICAL_KERN_BEFORE_DEGREE:
+    case HB_OT_MATH_CONSTANT_SKEWED_FRACTION_HORIZONTAL_GAP:
+    case HB_OT_MATH_CONSTANT_SPACE_AFTER_SCRIPT:
+      return mathValueRecords[constant - HB_OT_MATH_CONSTANT_MATH_LEADING].get_x_value (font, this);
+
+    case HB_OT_MATH_CONSTANT_ACCENT_BASE_HEIGHT:
+    case HB_OT_MATH_CONSTANT_AXIS_HEIGHT:
+    case HB_OT_MATH_CONSTANT_FLATTENED_ACCENT_BASE_HEIGHT:
+    case HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_DISPLAY_STYLE_SHIFT_DOWN:
+    case HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_GAP_MIN:
+    case HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_SHIFT_DOWN:
+    case HB_OT_MATH_CONSTANT_FRACTION_DENOM_DISPLAY_STYLE_GAP_MIN:
+    case HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_DISPLAY_STYLE_SHIFT_UP:
+    case HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_GAP_MIN:
+    case HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_SHIFT_UP:
+    case HB_OT_MATH_CONSTANT_FRACTION_NUM_DISPLAY_STYLE_GAP_MIN:
+    case HB_OT_MATH_CONSTANT_FRACTION_RULE_THICKNESS:
+    case HB_OT_MATH_CONSTANT_LOWER_LIMIT_BASELINE_DROP_MIN:
+    case HB_OT_MATH_CONSTANT_LOWER_LIMIT_GAP_MIN:
+    case HB_OT_MATH_CONSTANT_MATH_LEADING:
+    case HB_OT_MATH_CONSTANT_OVERBAR_EXTRA_ASCENDER:
+    case HB_OT_MATH_CONSTANT_OVERBAR_RULE_THICKNESS:
+    case HB_OT_MATH_CONSTANT_OVERBAR_VERTICAL_GAP:
+    case HB_OT_MATH_CONSTANT_RADICAL_DISPLAY_STYLE_VERTICAL_GAP:
+    case HB_OT_MATH_CONSTANT_RADICAL_EXTRA_ASCENDER:
+    case HB_OT_MATH_CONSTANT_RADICAL_RULE_THICKNESS:
+    case HB_OT_MATH_CONSTANT_RADICAL_VERTICAL_GAP:
+    case HB_OT_MATH_CONSTANT_SKEWED_FRACTION_VERTICAL_GAP:
+    case HB_OT_MATH_CONSTANT_STACK_BOTTOM_DISPLAY_STYLE_SHIFT_DOWN:
+    case HB_OT_MATH_CONSTANT_STACK_BOTTOM_SHIFT_DOWN:
+    case HB_OT_MATH_CONSTANT_STACK_DISPLAY_STYLE_GAP_MIN:
+    case HB_OT_MATH_CONSTANT_STACK_GAP_MIN:
+    case HB_OT_MATH_CONSTANT_STACK_TOP_DISPLAY_STYLE_SHIFT_UP:
+    case HB_OT_MATH_CONSTANT_STACK_TOP_SHIFT_UP:
+    case HB_OT_MATH_CONSTANT_STRETCH_STACK_BOTTOM_SHIFT_DOWN:
+    case HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_ABOVE_MIN:
+    case HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_BELOW_MIN:
+    case HB_OT_MATH_CONSTANT_STRETCH_STACK_TOP_SHIFT_UP:
+    case HB_OT_MATH_CONSTANT_SUBSCRIPT_BASELINE_DROP_MIN:
+    case HB_OT_MATH_CONSTANT_SUBSCRIPT_SHIFT_DOWN:
+    case HB_OT_MATH_CONSTANT_SUBSCRIPT_TOP_MAX:
+    case HB_OT_MATH_CONSTANT_SUB_SUPERSCRIPT_GAP_MIN:
+    case HB_OT_MATH_CONSTANT_SUPERSCRIPT_BASELINE_DROP_MAX:
+    case HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MAX_WITH_SUBSCRIPT:
+    case HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MIN:
+    case HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP:
+    case HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP_CRAMPED:
+    case HB_OT_MATH_CONSTANT_UNDERBAR_EXTRA_DESCENDER:
+    case HB_OT_MATH_CONSTANT_UNDERBAR_RULE_THICKNESS:
+    case HB_OT_MATH_CONSTANT_UNDERBAR_VERTICAL_GAP:
+    case HB_OT_MATH_CONSTANT_UPPER_LIMIT_BASELINE_RISE_MIN:
+    case HB_OT_MATH_CONSTANT_UPPER_LIMIT_GAP_MIN:
+      return mathValueRecords[constant - HB_OT_MATH_CONSTANT_MATH_LEADING].get_y_value (font, this);
+
+    case HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT:
+      return radicalDegreeBottomRaisePercent;
+
+    default:
+      return 0;
+    }
+  }
+
+  protected:
+  HBINT16 percentScaleDown[2];
+  HBUINT16 minHeight[2];
+  MathValueRecord mathValueRecords[51];
+  HBINT16 radicalDegreeBottomRaisePercent;
+
+  public:
+  DEFINE_SIZE_STATIC (214);
+};
+
+struct MathItalicsCorrectionInfo
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  coverage.sanitize (c, this) &&
+		  italicsCorrection.sanitize (c, this));
+  }
+
+  hb_position_t get_value (hb_codepoint_t glyph,
+			   hb_font_t *font) const
+  {
+    unsigned int index = (this+coverage).get_coverage (glyph);
+    return italicsCorrection[index].get_x_value (font, this);
+  }
+
+  protected:
+  OffsetTo<Coverage>       coverage;		/* Offset to Coverage table -
+						 * from the beginning of
+						 * MathItalicsCorrectionInfo
+						 * table. */
+  ArrayOf<MathValueRecord> italicsCorrection;	/* Array of MathValueRecords
+						 * defining italics correction
+						 * values for each
+						 * covered glyph. */
+
+  public:
+  DEFINE_SIZE_ARRAY (4, italicsCorrection);
+};
+
+struct MathTopAccentAttachment
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  topAccentCoverage.sanitize (c, this) &&
+		  topAccentAttachment.sanitize (c, this));
+  }
+
+  hb_position_t get_value (hb_codepoint_t glyph,
+			   hb_font_t *font) const
+  {
+    unsigned int index = (this+topAccentCoverage).get_coverage (glyph);
+    if (index == NOT_COVERED)
+      return font->get_glyph_h_advance (glyph) / 2;
+    return topAccentAttachment[index].get_x_value (font, this);
+  }
+
+  protected:
+  OffsetTo<Coverage>       topAccentCoverage;   /* Offset to Coverage table -
+						 * from the beginning of
+						 * MathTopAccentAttachment
+						 * table. */
+  ArrayOf<MathValueRecord> topAccentAttachment; /* Array of MathValueRecords
+						 * defining top accent
+						 * attachment points for each
+						 * covered glyph. */
+
+  public:
+  DEFINE_SIZE_ARRAY (2 + 2, topAccentAttachment);
+};
+
+struct MathKern
+{
+  bool sanitize_math_value_records (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    unsigned int count = 2 * heightCount + 1;
+    for (unsigned int i = 0; i < count; i++)
+      if (!mathValueRecordsZ.arrayZ[i].sanitize (c, this)) return_trace (false);
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  c->check_array (mathValueRecordsZ.arrayZ, 2 * heightCount + 1) &&
+		  sanitize_math_value_records (c));
+  }
+
+  hb_position_t get_value (hb_position_t correction_height, hb_font_t *font) const
+  {
+    const MathValueRecord* correctionHeight = mathValueRecordsZ.arrayZ;
+    const MathValueRecord* kernValue = mathValueRecordsZ.arrayZ + heightCount;
+    int sign = font->y_scale < 0 ? -1 : +1;
+
+    /* The description of the MathKern table is a ambiguous, but interpreting
+     * "between the two heights found at those indexes" for 0 < i < len as
+     *
+     *   correctionHeight[i-1] < correction_height <= correctionHeight[i]
+     *
+     * makes the result consistent with the limit cases and we can just use the
+     * binary search algorithm of std::upper_bound:
+     */
+    unsigned int i = 0;
+    unsigned int count = heightCount;
+    while (count > 0)
+    {
+      unsigned int half = count / 2;
+      hb_position_t height = correctionHeight[i + half].get_y_value (font, this);
+      if (sign * height < sign * correction_height)
+      {
+	i += half + 1;
+	count -= half + 1;
+      } else
+	count = half;
+    }
+    return kernValue[i].get_x_value (font, this);
+  }
+
+  protected:
+  HBUINT16	heightCount;
+  UnsizedArrayOf<MathValueRecord>
+		mathValueRecordsZ;	/* Array of correction heights at
+					 * which the kern value changes.
+					 * Sorted by the height value in
+					 * design units (heightCount entries),
+					 * Followed by:
+					 * Array of kern values corresponding
+					 * to heights. (heightCount+1 entries).
+					 */
+
+  public:
+  DEFINE_SIZE_ARRAY (2, mathValueRecordsZ);
+};
+
+struct MathKernInfoRecord
+{
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+
+    unsigned int count = ARRAY_LENGTH (mathKern);
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!mathKern[i].sanitize (c, base)))
+	return_trace (false);
+
+    return_trace (true);
+  }
+
+  hb_position_t get_kerning (hb_ot_math_kern_t kern,
+			     hb_position_t correction_height,
+			     hb_font_t *font,
+			     const void *base) const
+  {
+    unsigned int idx = kern;
+    if (unlikely (idx >= ARRAY_LENGTH (mathKern))) return 0;
+    return (base+mathKern[idx]).get_value (correction_height, font);
+  }
+
+  protected:
+  /* Offset to MathKern table for each corner -
+   * from the beginning of MathKernInfo table.  May be NULL. */
+  OffsetTo<MathKern> mathKern[4];
+
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct MathKernInfo
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  mathKernCoverage.sanitize (c, this) &&
+		  mathKernInfoRecords.sanitize (c, this));
+  }
+
+  hb_position_t get_kerning (hb_codepoint_t glyph,
+			     hb_ot_math_kern_t kern,
+			     hb_position_t correction_height,
+			     hb_font_t *font) const
+  {
+    unsigned int index = (this+mathKernCoverage).get_coverage (glyph);
+    return mathKernInfoRecords[index].get_kerning (kern, correction_height, font, this);
+  }
+
+  protected:
+  OffsetTo<Coverage>		mathKernCoverage;    /* Offset to Coverage table -
+						      * from the beginning of the
+						      * MathKernInfo table. */
+  ArrayOf<MathKernInfoRecord>	mathKernInfoRecords; /* Array of
+						      * MathKernInfoRecords,
+						      * per-glyph information for
+						      * mathematical positioning
+						      * of subscripts and
+						      * superscripts. */
+
+  public:
+  DEFINE_SIZE_ARRAY (4, mathKernInfoRecords);
+};
+
+struct MathGlyphInfo
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  mathItalicsCorrectionInfo.sanitize (c, this) &&
+		  mathTopAccentAttachment.sanitize (c, this) &&
+		  extendedShapeCoverage.sanitize (c, this) &&
+		  mathKernInfo.sanitize (c, this));
+  }
+
+  hb_position_t
+  get_italics_correction (hb_codepoint_t  glyph, hb_font_t *font) const
+  { return (this+mathItalicsCorrectionInfo).get_value (glyph, font); }
+
+  hb_position_t
+  get_top_accent_attachment (hb_codepoint_t  glyph, hb_font_t *font) const
+  { return (this+mathTopAccentAttachment).get_value (glyph, font); }
+
+  bool is_extended_shape (hb_codepoint_t glyph) const
+  { return (this+extendedShapeCoverage).get_coverage (glyph) != NOT_COVERED; }
+
+  hb_position_t get_kerning (hb_codepoint_t glyph,
+			     hb_ot_math_kern_t kern,
+			     hb_position_t correction_height,
+			     hb_font_t *font) const
+  { return (this+mathKernInfo).get_kerning (glyph, kern, correction_height, font); }
+
+  protected:
+  /* Offset to MathItalicsCorrectionInfo table -
+   * from the beginning of MathGlyphInfo table. */
+  OffsetTo<MathItalicsCorrectionInfo> mathItalicsCorrectionInfo;
+
+  /* Offset to MathTopAccentAttachment table -
+   * from the beginning of MathGlyphInfo table. */
+  OffsetTo<MathTopAccentAttachment> mathTopAccentAttachment;
+
+  /* Offset to coverage table for Extended Shape glyphs -
+   * from the beginning of MathGlyphInfo table. When the left or right glyph of
+   * a box is an extended shape variant, the (ink) box (and not the default
+   * position defined by values in MathConstants table) should be used for
+   * vertical positioning purposes.  May be NULL.. */
+  OffsetTo<Coverage> extendedShapeCoverage;
+
+   /* Offset to MathKernInfo table -
+    * from the beginning of MathGlyphInfo table. */
+  OffsetTo<MathKernInfo> mathKernInfo;
+
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct MathGlyphVariantRecord
+{
+  friend struct MathGlyphConstruction;
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  GlyphID variantGlyph;       /* Glyph ID for the variant. */
+  HBUINT16  advanceMeasurement; /* Advance width/height, in design units, of the
+				 * variant, in the direction of requested
+				 * glyph extension. */
+
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct PartFlags : HBUINT16
+{
+  enum Flags {
+    Extender	= 0x0001u, /* If set, the part can be skipped or repeated. */
+
+    Defined	= 0x0001u, /* All defined flags. */
+  };
+
+  public:
+  DEFINE_SIZE_STATIC (2);
+};
+
+struct MathGlyphPartRecord
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  void extract (hb_ot_math_glyph_part_t &out,
+		int scale,
+		hb_font_t *font) const
+  {
+    out.glyph			= glyph;
+
+    out.start_connector_length	= font->em_scale (startConnectorLength, scale);
+    out.end_connector_length	= font->em_scale (endConnectorLength, scale);
+    out.full_advance		= font->em_scale (fullAdvance, scale);
+
+    static_assert ((unsigned int) HB_MATH_GLYPH_PART_FLAG_EXTENDER ==
+		   (unsigned int) PartFlags::Extender, "");
+
+    out.flags = (hb_ot_math_glyph_part_flags_t)
+		(unsigned int)
+		(partFlags & PartFlags::Defined);
+  }
+
+  protected:
+  GlyphID   glyph;		  /* Glyph ID for the part. */
+  HBUINT16    startConnectorLength; /* Advance width/ height of the straight bar
+				   * connector material, in design units, is at
+				   * the beginning of the glyph, in the
+				   * direction of the extension. */
+  HBUINT16    endConnectorLength;   /* Advance width/ height of the straight bar
+				   * connector material, in design units, is at
+				   * the end of the glyph, in the direction of
+				   * the extension. */
+  HBUINT16    fullAdvance;	  /* Full advance width/height for this part,
+				   * in the direction of the extension.
+				   * In design units. */
+  PartFlags partFlags;		  /* Part qualifiers. */
+
+  public:
+  DEFINE_SIZE_STATIC (10);
+};
+
+struct MathGlyphAssembly
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  italicsCorrection.sanitize (c, this) &&
+		  partRecords.sanitize (c));
+  }
+
+  unsigned int get_parts (hb_direction_t direction,
+			  hb_font_t *font,
+			  unsigned int start_offset,
+			  unsigned int *parts_count, /* IN/OUT */
+			  hb_ot_math_glyph_part_t *parts /* OUT */,
+			  hb_position_t *italics_correction /* OUT */) const
+  {
+    if (parts_count)
+    {
+      int scale = font->dir_scale (direction);
+      hb_array_t<const MathGlyphPartRecord> arr = partRecords.sub_array (start_offset, parts_count);
+      unsigned int count = arr.length;
+      for (unsigned int i = 0; i < count; i++)
+	arr[i].extract (parts[i], scale, font);
+    }
+
+    if (italics_correction)
+      *italics_correction = italicsCorrection.get_x_value (font, this);
+
+    return partRecords.len;
+  }
+
+  protected:
+  MathValueRecord	   italicsCorrection; /* Italics correction of this
+					       * MathGlyphAssembly. Should not
+					       * depend on the assembly size. */
+  ArrayOf<MathGlyphPartRecord> partRecords;   /* Array of part records, from
+					       * left to right and bottom to
+					       * top. */
+
+  public:
+  DEFINE_SIZE_ARRAY (6, partRecords);
+};
+
+struct MathGlyphConstruction
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  glyphAssembly.sanitize (c, this) &&
+		  mathGlyphVariantRecord.sanitize (c));
+  }
+
+  const MathGlyphAssembly &get_assembly () const { return this+glyphAssembly; }
+
+  unsigned int get_variants (hb_direction_t direction,
+			     hb_font_t *font,
+			     unsigned int start_offset,
+			     unsigned int *variants_count, /* IN/OUT */
+			     hb_ot_math_glyph_variant_t *variants /* OUT */) const
+  {
+    if (variants_count)
+    {
+      int scale = font->dir_scale (direction);
+      hb_array_t<const MathGlyphVariantRecord> arr = mathGlyphVariantRecord.sub_array (start_offset, variants_count);
+      unsigned int count = arr.length;
+      for (unsigned int i = 0; i < count; i++)
+      {
+	variants[i].glyph = arr[i].variantGlyph;
+	variants[i].advance = font->em_scale (arr[i].advanceMeasurement, scale);
+      }
+    }
+    return mathGlyphVariantRecord.len;
+  }
+
+  protected:
+  /* Offset to MathGlyphAssembly table for this shape - from the beginning of
+     MathGlyphConstruction table.  May be NULL. */
+  OffsetTo<MathGlyphAssembly>	  glyphAssembly;
+
+  /* MathGlyphVariantRecords for alternative variants of the glyphs. */
+  ArrayOf<MathGlyphVariantRecord> mathGlyphVariantRecord;
+
+  public:
+  DEFINE_SIZE_ARRAY (4, mathGlyphVariantRecord);
+};
+
+struct MathVariants
+{
+  bool sanitize_offsets (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    unsigned int count = vertGlyphCount + horizGlyphCount;
+    for (unsigned int i = 0; i < count; i++)
+      if (!glyphConstruction.arrayZ[i].sanitize (c, this)) return_trace (false);
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  vertGlyphCoverage.sanitize (c, this) &&
+		  horizGlyphCoverage.sanitize (c, this) &&
+		  c->check_array (glyphConstruction.arrayZ, vertGlyphCount + horizGlyphCount) &&
+		  sanitize_offsets (c));
+  }
+
+  hb_position_t get_min_connector_overlap (hb_direction_t direction,
+						  hb_font_t *font) const
+  { return font->em_scale_dir (minConnectorOverlap, direction); }
+
+  unsigned int get_glyph_variants (hb_codepoint_t glyph,
+				   hb_direction_t direction,
+				   hb_font_t *font,
+				   unsigned int start_offset,
+				   unsigned int *variants_count, /* IN/OUT */
+				   hb_ot_math_glyph_variant_t *variants /* OUT */) const
+  { return get_glyph_construction (glyph, direction, font)
+	   .get_variants (direction, font, start_offset, variants_count, variants); }
+
+  unsigned int get_glyph_parts (hb_codepoint_t glyph,
+				       hb_direction_t direction,
+				       hb_font_t *font,
+				       unsigned int start_offset,
+				       unsigned int *parts_count, /* IN/OUT */
+				       hb_ot_math_glyph_part_t *parts /* OUT */,
+				       hb_position_t *italics_correction /* OUT */) const
+  { return get_glyph_construction (glyph, direction, font)
+	   .get_assembly ()
+	   .get_parts (direction, font,
+		       start_offset, parts_count, parts,
+		       italics_correction); }
+
+  private:
+  const MathGlyphConstruction &
+  get_glyph_construction (hb_codepoint_t glyph,
+			  hb_direction_t direction,
+			  hb_font_t *font HB_UNUSED) const
+  {
+    bool vertical = HB_DIRECTION_IS_VERTICAL (direction);
+    unsigned int count = vertical ? vertGlyphCount : horizGlyphCount;
+    const OffsetTo<Coverage> &coverage = vertical ? vertGlyphCoverage
+						  : horizGlyphCoverage;
+
+    unsigned int index = (this+coverage).get_coverage (glyph);
+    if (unlikely (index >= count)) return Null (MathGlyphConstruction);
+
+    if (!vertical)
+      index += vertGlyphCount;
+
+    return this+glyphConstruction[index];
+  }
+
+  protected:
+  HBUINT16	     minConnectorOverlap; /* Minimum overlap of connecting
+					   * glyphs during glyph construction,
+					   * in design units. */
+  OffsetTo<Coverage> vertGlyphCoverage;   /* Offset to Coverage table -
+					   * from the beginning of MathVariants
+					   * table. */
+  OffsetTo<Coverage> horizGlyphCoverage;  /* Offset to Coverage table -
+					   * from the beginning of MathVariants
+					   * table. */
+  HBUINT16	     vertGlyphCount;      /* Number of glyphs for which
+					   * information is provided for
+					   * vertically growing variants. */
+  HBUINT16	     horizGlyphCount;     /* Number of glyphs for which
+					   * information is provided for
+					   * horizontally growing variants. */
+
+  /* Array of offsets to MathGlyphConstruction tables - from the beginning of
+     the MathVariants table, for shapes growing in vertical/horizontal
+     direction. */
+  UnsizedArrayOf<OffsetTo<MathGlyphConstruction> >
+ 			glyphConstruction;
+
+  public:
+  DEFINE_SIZE_ARRAY (10, glyphConstruction);
+};
+
+
+/*
+ * MATH -- Mathematical typesetting
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/math
+ */
+
+struct MATH
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_MATH;
+
+  bool has_data () const { return version.to_int (); }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (version.sanitize (c) &&
+		  likely (version.major == 1) &&
+		  mathConstants.sanitize (c, this) &&
+		  mathGlyphInfo.sanitize (c, this) &&
+		  mathVariants.sanitize (c, this));
+  }
+
+  hb_position_t get_constant (hb_ot_math_constant_t  constant,
+				     hb_font_t		   *font) const
+  { return (this+mathConstants).get_value (constant, font); }
+
+  const MathGlyphInfo &get_glyph_info () const { return this+mathGlyphInfo; }
+
+  const MathVariants &get_variants () const    { return this+mathVariants; }
+
+  protected:
+  FixedVersion<>version;		/* Version of the MATH table
+					 * initially set to 0x00010000u */
+  OffsetTo<MathConstants> mathConstants;/* MathConstants table */
+  OffsetTo<MathGlyphInfo> mathGlyphInfo;/* MathGlyphInfo table */
+  OffsetTo<MathVariants>  mathVariants;	/* MathVariants table */
+
+  public:
+  DEFINE_SIZE_STATIC (10);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_MATH_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-math.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-math.cc
new file mode 100644
index 0000000..bd31bf5
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-math.cc
@@ -0,0 +1,253 @@
+/*
+ * Copyright © 2016  Igalia S.L.
+ *
+ *  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.
+ *
+ * Igalia Author(s): Frédéric Wang
+ */
+
+#include "hb-open-type.hh"
+
+#include "hb-ot-face.hh"
+#include "hb-ot-math-table.hh"
+
+
+/**
+ * SECTION:hb-ot-math
+ * @title: hb-ot-math
+ * @short_description: OpenType Math information
+ * @include: hb-ot.h
+ *
+ * Functions for fetching mathematics layout data from OpenType fonts.
+ **/
+
+
+/*
+ * OT::MATH
+ */
+
+/**
+ * hb_ot_math_has_data:
+ * @face: #hb_face_t to test
+ *
+ * This function allows to verify the presence of an OpenType MATH table on the
+ * face.
+ *
+ * Return value: true if face has a MATH table, false otherwise
+ *
+ * Since: 1.3.3
+ **/
+hb_bool_t
+hb_ot_math_has_data (hb_face_t *face)
+{
+  return face->table.MATH->has_data ();
+}
+
+/**
+ * hb_ot_math_get_constant:
+ * @font: #hb_font_t from which to retrieve the value
+ * @constant: #hb_ot_math_constant_t the constant to retrieve
+ *
+ * This function returns the requested math constants as a #hb_position_t.
+ * If the request constant is HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN,
+ * HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN or
+ * HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN then the return value is
+ * actually an integer between 0 and 100 representing that percentage.
+ *
+ * Return value: the requested constant or 0
+ *
+ * Since: 1.3.3
+ **/
+hb_position_t
+hb_ot_math_get_constant (hb_font_t *font,
+			 hb_ot_math_constant_t constant)
+{
+  return font->face->table.MATH->get_constant(constant, font);
+}
+
+/**
+ * hb_ot_math_get_glyph_italics_correction:
+ * @font: #hb_font_t from which to retrieve the value
+ * @glyph: glyph index from which to retrieve the value
+ *
+ * Return value: the italics correction of the glyph or 0
+ *
+ * Since: 1.3.3
+ **/
+hb_position_t
+hb_ot_math_get_glyph_italics_correction (hb_font_t *font,
+					 hb_codepoint_t glyph)
+{
+  return font->face->table.MATH->get_glyph_info().get_italics_correction (glyph, font);
+}
+
+/**
+ * hb_ot_math_get_glyph_top_accent_attachment:
+ * @font: #hb_font_t from which to retrieve the value
+ * @glyph: glyph index from which to retrieve the value
+ *
+ * Return value: the top accent attachment of the glyph or 0
+ *
+ * Since: 1.3.3
+ **/
+hb_position_t
+hb_ot_math_get_glyph_top_accent_attachment (hb_font_t *font,
+					    hb_codepoint_t glyph)
+{
+  return font->face->table.MATH->get_glyph_info().get_top_accent_attachment (glyph, font);
+}
+
+/**
+ * hb_ot_math_is_glyph_extended_shape:
+ * @face: a #hb_face_t to test
+ * @glyph: a glyph index to test
+ *
+ * Return value: true if the glyph is an extended shape, false otherwise
+ *
+ * Since: 1.3.3
+ **/
+hb_bool_t
+hb_ot_math_is_glyph_extended_shape (hb_face_t *face,
+				    hb_codepoint_t glyph)
+{
+  return face->table.MATH->get_glyph_info().is_extended_shape (glyph);
+}
+
+/**
+ * hb_ot_math_get_glyph_kerning:
+ * @font: #hb_font_t from which to retrieve the value
+ * @glyph: glyph index from which to retrieve the value
+ * @kern: the #hb_ot_math_kern_t from which to retrieve the value
+ * @correction_height: the correction height to use to determine the kerning.
+ *
+ * This function tries to retrieve the MathKern table for the specified font,
+ * glyph and #hb_ot_math_kern_t. Then it browses the list of heights from the
+ * MathKern table to find one value that is greater or equal to specified
+ * correction_height. If one is found the corresponding value from the list of
+ * kerns is returned and otherwise the last kern value is returned.
+ *
+ * Return value: requested kerning or 0
+ *
+ * Since: 1.3.3
+ **/
+hb_position_t
+hb_ot_math_get_glyph_kerning (hb_font_t *font,
+			      hb_codepoint_t glyph,
+			      hb_ot_math_kern_t kern,
+			      hb_position_t correction_height)
+{
+  return font->face->table.MATH->get_glyph_info().get_kerning (glyph,
+							       kern,
+							       correction_height,
+							       font);
+}
+
+/**
+ * hb_ot_math_get_glyph_variants:
+ * @font: #hb_font_t from which to retrieve the values
+ * @glyph: index of the glyph to stretch
+ * @direction: direction of the stretching
+ * @start_offset: offset of the first variant to retrieve
+ * @variants_count: maximum number of variants to retrieve after start_offset
+ * (IN) and actual number of variants retrieved (OUT)
+ * @variants: array of size at least @variants_count to store the result
+ *
+ * This function tries to retrieve the MathGlyphConstruction for the specified
+ * font, glyph and direction. Note that only the value of
+ * #HB_DIRECTION_IS_HORIZONTAL is considered. It provides the corresponding list
+ * of size variants as an array of hb_ot_math_glyph_variant_t structs.
+ *
+ * Return value: the total number of size variants available or 0
+ *
+ * Since: 1.3.3
+ **/
+unsigned int
+hb_ot_math_get_glyph_variants (hb_font_t *font,
+			       hb_codepoint_t glyph,
+			       hb_direction_t direction,
+			       unsigned int start_offset,
+			       unsigned int *variants_count, /* IN/OUT */
+			       hb_ot_math_glyph_variant_t *variants /* OUT */)
+{
+  return font->face->table.MATH->get_variants().get_glyph_variants (glyph, direction, font,
+								    start_offset,
+								    variants_count,
+								    variants);
+}
+
+/**
+ * hb_ot_math_get_min_connector_overlap:
+ * @font: #hb_font_t from which to retrieve the value
+ * @direction: direction of the stretching
+ *
+ * This function tries to retrieve the MathVariants table for the specified
+ * font and returns the minimum overlap of connecting glyphs to draw a glyph
+ * assembly in the specified direction. Note that only the value of
+ * #HB_DIRECTION_IS_HORIZONTAL is considered.
+ *
+ * Return value: requested min connector overlap or 0
+ *
+ * Since: 1.3.3
+ **/
+hb_position_t
+hb_ot_math_get_min_connector_overlap (hb_font_t *font,
+				      hb_direction_t direction)
+{
+  return font->face->table.MATH->get_variants().get_min_connector_overlap (direction, font);
+}
+
+/**
+ * hb_ot_math_get_glyph_assembly:
+ * @font: #hb_font_t from which to retrieve the values
+ * @glyph: index of the glyph to stretch
+ * @direction: direction of the stretching
+ * @start_offset: offset of the first glyph part to retrieve
+ * @parts_count: maximum number of glyph parts to retrieve after start_offset
+ * (IN) and actual number of parts retrieved (OUT)
+ * @parts: array of size at least @parts_count to store the result
+ * @italics_correction: italic correction of the glyph assembly
+ *
+ * This function tries to retrieve the GlyphAssembly for the specified font,
+ * glyph and direction. Note that only the value of #HB_DIRECTION_IS_HORIZONTAL
+ * is considered. It provides the information necessary to draw the glyph
+ * assembly as an array of #hb_ot_math_glyph_part_t.
+ *
+ * Return value: the total number of parts in the glyph assembly
+ *
+ * Since: 1.3.3
+ **/
+unsigned int
+hb_ot_math_get_glyph_assembly (hb_font_t *font,
+			       hb_codepoint_t glyph,
+			       hb_direction_t direction,
+			       unsigned int start_offset,
+			       unsigned int *parts_count, /* IN/OUT */
+			       hb_ot_math_glyph_part_t *parts, /* OUT */
+			       hb_position_t *italics_correction /* OUT */)
+{
+  return font->face->table.MATH->get_variants().get_glyph_parts (glyph,
+								 direction,
+								 font,
+								 start_offset,
+								 parts_count,
+								 parts,
+								 italics_correction);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-math.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-math.h
new file mode 100644
index 0000000..521a5ca
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-math.h
@@ -0,0 +1,209 @@
+/*
+ * Copyright © 2016  Igalia S.L.
+ *
+ *  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.
+ *
+ * Igalia Author(s): Frédéric Wang
+ */
+
+#ifndef HB_OT_H_IN
+#error "Include <hb-ot.h> instead."
+#endif
+
+#ifndef HB_OT_MATH_H
+#define HB_OT_MATH_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+
+/*
+ * MATH
+ */
+
+#define HB_OT_TAG_MATH HB_TAG('M','A','T','H')
+
+/* Use with hb_buffer_set_script() for math shaping. */
+#define HB_OT_MATH_SCRIPT HB_TAG('m','a','t','h')
+
+/* Types */
+
+/**
+ * hb_ot_math_constant_t:
+ *
+ * Since: 1.3.3
+ */
+typedef enum {
+  HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN = 0,
+  HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN = 1,
+  HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT = 2,
+  HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT = 3,
+  HB_OT_MATH_CONSTANT_MATH_LEADING = 4,
+  HB_OT_MATH_CONSTANT_AXIS_HEIGHT = 5,
+  HB_OT_MATH_CONSTANT_ACCENT_BASE_HEIGHT = 6,
+  HB_OT_MATH_CONSTANT_FLATTENED_ACCENT_BASE_HEIGHT = 7,
+  HB_OT_MATH_CONSTANT_SUBSCRIPT_SHIFT_DOWN = 8,
+  HB_OT_MATH_CONSTANT_SUBSCRIPT_TOP_MAX = 9,
+  HB_OT_MATH_CONSTANT_SUBSCRIPT_BASELINE_DROP_MIN = 10,
+  HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP = 11,
+  HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP_CRAMPED = 12,
+  HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MIN = 13,
+  HB_OT_MATH_CONSTANT_SUPERSCRIPT_BASELINE_DROP_MAX = 14,
+  HB_OT_MATH_CONSTANT_SUB_SUPERSCRIPT_GAP_MIN = 15,
+  HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MAX_WITH_SUBSCRIPT = 16,
+  HB_OT_MATH_CONSTANT_SPACE_AFTER_SCRIPT = 17,
+  HB_OT_MATH_CONSTANT_UPPER_LIMIT_GAP_MIN = 18,
+  HB_OT_MATH_CONSTANT_UPPER_LIMIT_BASELINE_RISE_MIN = 19,
+  HB_OT_MATH_CONSTANT_LOWER_LIMIT_GAP_MIN = 20,
+  HB_OT_MATH_CONSTANT_LOWER_LIMIT_BASELINE_DROP_MIN = 21,
+  HB_OT_MATH_CONSTANT_STACK_TOP_SHIFT_UP = 22,
+  HB_OT_MATH_CONSTANT_STACK_TOP_DISPLAY_STYLE_SHIFT_UP = 23,
+  HB_OT_MATH_CONSTANT_STACK_BOTTOM_SHIFT_DOWN = 24,
+  HB_OT_MATH_CONSTANT_STACK_BOTTOM_DISPLAY_STYLE_SHIFT_DOWN = 25,
+  HB_OT_MATH_CONSTANT_STACK_GAP_MIN = 26,
+  HB_OT_MATH_CONSTANT_STACK_DISPLAY_STYLE_GAP_MIN = 27,
+  HB_OT_MATH_CONSTANT_STRETCH_STACK_TOP_SHIFT_UP = 28,
+  HB_OT_MATH_CONSTANT_STRETCH_STACK_BOTTOM_SHIFT_DOWN = 29,
+  HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_ABOVE_MIN = 30,
+  HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_BELOW_MIN = 31,
+  HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_SHIFT_UP = 32,
+  HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_DISPLAY_STYLE_SHIFT_UP = 33,
+  HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_SHIFT_DOWN = 34,
+  HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_DISPLAY_STYLE_SHIFT_DOWN = 35,
+  HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_GAP_MIN = 36,
+  HB_OT_MATH_CONSTANT_FRACTION_NUM_DISPLAY_STYLE_GAP_MIN = 37,
+  HB_OT_MATH_CONSTANT_FRACTION_RULE_THICKNESS = 38,
+  HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_GAP_MIN = 39,
+  HB_OT_MATH_CONSTANT_FRACTION_DENOM_DISPLAY_STYLE_GAP_MIN = 40,
+  HB_OT_MATH_CONSTANT_SKEWED_FRACTION_HORIZONTAL_GAP = 41,
+  HB_OT_MATH_CONSTANT_SKEWED_FRACTION_VERTICAL_GAP = 42,
+  HB_OT_MATH_CONSTANT_OVERBAR_VERTICAL_GAP = 43,
+  HB_OT_MATH_CONSTANT_OVERBAR_RULE_THICKNESS = 44,
+  HB_OT_MATH_CONSTANT_OVERBAR_EXTRA_ASCENDER = 45,
+  HB_OT_MATH_CONSTANT_UNDERBAR_VERTICAL_GAP = 46,
+  HB_OT_MATH_CONSTANT_UNDERBAR_RULE_THICKNESS = 47,
+  HB_OT_MATH_CONSTANT_UNDERBAR_EXTRA_DESCENDER = 48,
+  HB_OT_MATH_CONSTANT_RADICAL_VERTICAL_GAP = 49,
+  HB_OT_MATH_CONSTANT_RADICAL_DISPLAY_STYLE_VERTICAL_GAP = 50,
+  HB_OT_MATH_CONSTANT_RADICAL_RULE_THICKNESS = 51,
+  HB_OT_MATH_CONSTANT_RADICAL_EXTRA_ASCENDER = 52,
+  HB_OT_MATH_CONSTANT_RADICAL_KERN_BEFORE_DEGREE = 53,
+  HB_OT_MATH_CONSTANT_RADICAL_KERN_AFTER_DEGREE = 54,
+  HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT = 55
+} hb_ot_math_constant_t;
+
+/**
+ * hb_ot_math_kern_t:
+ *
+ * Since: 1.3.3
+ */
+typedef enum {
+  HB_OT_MATH_KERN_TOP_RIGHT = 0,
+  HB_OT_MATH_KERN_TOP_LEFT = 1,
+  HB_OT_MATH_KERN_BOTTOM_RIGHT = 2,
+  HB_OT_MATH_KERN_BOTTOM_LEFT = 3
+} hb_ot_math_kern_t;
+
+/**
+ * hb_ot_math_glyph_variant_t:
+ *
+ * Since: 1.3.3
+ */
+typedef struct hb_ot_math_glyph_variant_t {
+  hb_codepoint_t glyph;
+  hb_position_t advance;
+} hb_ot_math_glyph_variant_t;
+
+/**
+ * hb_ot_math_glyph_part_flags_t:
+ *
+ * Since: 1.3.3
+ */
+typedef enum { /*< flags >*/
+  HB_MATH_GLYPH_PART_FLAG_EXTENDER	= 0x00000001u  /* Extender glyph */
+} hb_ot_math_glyph_part_flags_t;
+
+/**
+ * hb_ot_math_glyph_part_t:
+ *
+ * Since: 1.3.3
+ */
+typedef struct hb_ot_math_glyph_part_t {
+  hb_codepoint_t glyph;
+  hb_position_t start_connector_length;
+  hb_position_t end_connector_length;
+  hb_position_t full_advance;
+  hb_ot_math_glyph_part_flags_t flags;
+} hb_ot_math_glyph_part_t;
+
+/* Methods */
+
+HB_EXTERN hb_bool_t
+hb_ot_math_has_data (hb_face_t *face);
+
+HB_EXTERN hb_position_t
+hb_ot_math_get_constant (hb_font_t *font,
+			 hb_ot_math_constant_t constant);
+
+HB_EXTERN hb_position_t
+hb_ot_math_get_glyph_italics_correction (hb_font_t *font,
+					 hb_codepoint_t glyph);
+
+HB_EXTERN hb_position_t
+hb_ot_math_get_glyph_top_accent_attachment (hb_font_t *font,
+					    hb_codepoint_t glyph);
+
+HB_EXTERN hb_bool_t
+hb_ot_math_is_glyph_extended_shape (hb_face_t *face,
+				    hb_codepoint_t glyph);
+
+HB_EXTERN hb_position_t
+hb_ot_math_get_glyph_kerning (hb_font_t *font,
+			      hb_codepoint_t glyph,
+			      hb_ot_math_kern_t kern,
+			      hb_position_t correction_height);
+
+HB_EXTERN unsigned int
+hb_ot_math_get_glyph_variants (hb_font_t *font,
+			       hb_codepoint_t glyph,
+			       hb_direction_t direction,
+			       unsigned int start_offset,
+			       unsigned int *variants_count, /* IN/OUT */
+			       hb_ot_math_glyph_variant_t *variants /* OUT */);
+
+HB_EXTERN hb_position_t
+hb_ot_math_get_min_connector_overlap (hb_font_t *font,
+				      hb_direction_t direction);
+
+HB_EXTERN unsigned int
+hb_ot_math_get_glyph_assembly (hb_font_t *font,
+			       hb_codepoint_t glyph,
+			       hb_direction_t direction,
+			       unsigned int start_offset,
+			       unsigned int *parts_count, /* IN/OUT */
+			       hb_ot_math_glyph_part_t *parts, /* OUT */
+			       hb_position_t *italics_correction /* OUT */);
+
+
+HB_END_DECLS
+
+#endif /* HB_OT_MATH_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-maxp-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-maxp-table.hh
new file mode 100644
index 0000000..e4b67ab
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-maxp-table.hh
@@ -0,0 +1,145 @@
+/*
+ * Copyright © 2011,2012  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_MAXP_TABLE_HH
+#define HB_OT_MAXP_TABLE_HH
+
+#include "hb-open-type.hh"
+
+namespace OT {
+
+
+/*
+ * maxp -- Maximum Profile
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/maxp
+ */
+
+#define HB_OT_TAG_maxp HB_TAG('m','a','x','p')
+
+struct maxpV1Tail
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT16 maxPoints;		  /* Maximum points in a non-composite glyph. */
+  HBUINT16 maxContours;		  /* Maximum contours in a non-composite glyph. */
+  HBUINT16 maxCompositePoints;	  /* Maximum points in a composite glyph. */
+  HBUINT16 maxCompositeContours;  /* Maximum contours in a composite glyph. */
+  HBUINT16 maxZones;		  /* 1 if instructions do not use the twilight zone (Z0),
+				   * or 2 if instructions do use Z0; should be set to 2 in
+				   * most cases. */
+  HBUINT16 maxTwilightPoints;	  /* Maximum points used in Z0. */
+  HBUINT16 maxStorage;		  /* Number of Storage Area locations. */
+  HBUINT16 maxFunctionDefs;	  /* Number of FDEFs, equal to the highest function number + 1. */
+  HBUINT16 maxInstructionDefs;	  /* Number of IDEFs. */
+  HBUINT16 maxStackElements;	  /* Maximum stack depth. (This includes Font and CVT
+				   * Programs, as well as the instructions for each glyph.) */
+  HBUINT16 maxSizeOfInstructions; /* Maximum byte count for glyph instructions. */
+  HBUINT16 maxComponentElements;  /* Maximum number of components referenced at
+				   * "top level" for any composite glyph. */
+  HBUINT16 maxComponentDepth;	  /* Maximum levels of recursion; 1 for simple components. */
+ public:
+  DEFINE_SIZE_STATIC (26);
+};
+
+
+struct maxp
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_maxp;
+
+  unsigned int get_num_glyphs () const { return numGlyphs; }
+
+  void set_num_glyphs (unsigned int count)
+  {
+    numGlyphs.set (count);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!c->check_struct (this)))
+      return_trace (false);
+
+    if (version.major == 1)
+    {
+      const maxpV1Tail &v1 = StructAfter<maxpV1Tail> (*this);
+      return_trace (v1.sanitize (c));
+    }
+    return_trace (likely (version.major == 0 && version.minor == 0x5000u));
+  }
+
+  bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_blob_t *maxp_blob = hb_sanitize_context_t().reference_table<maxp> (plan->source);
+    hb_blob_t *maxp_prime_blob = hb_blob_copy_writable_or_fail (maxp_blob);
+    hb_blob_destroy (maxp_blob);
+
+    if (unlikely (!maxp_prime_blob)) {
+      return false;
+    }
+    maxp *maxp_prime = (maxp *) hb_blob_get_data (maxp_prime_blob, nullptr);
+
+    maxp_prime->set_num_glyphs (plan->glyphs.length);
+    if (plan->drop_hints)
+      drop_hint_fields (plan, maxp_prime);
+
+    bool result = plan->add_table (HB_OT_TAG_maxp, maxp_prime_blob);
+    hb_blob_destroy (maxp_prime_blob);
+    return result;
+  }
+
+  static void drop_hint_fields (hb_subset_plan_t *plan HB_UNUSED, maxp *maxp_prime)
+  {
+    if (maxp_prime->version.major == 1)
+    {
+      maxpV1Tail &v1 = StructAfter<maxpV1Tail> (*maxp_prime);
+      v1.maxZones.set (1);
+      v1.maxTwilightPoints.set (0);
+      v1.maxStorage.set (0);
+      v1.maxFunctionDefs.set (0);
+      v1.maxInstructionDefs.set (0);
+      v1.maxStackElements.set (0);
+      v1.maxSizeOfInstructions.set (0);
+    }
+  }
+
+  protected:
+  FixedVersion<>version;		/* Version of the maxp table (0.5 or 1.0),
+					 * 0x00005000u or 0x00010000u. */
+  HBUINT16	numGlyphs;		/* The number of glyphs in the font. */
+/*maxpV1Tail	v1Tail[VAR]; */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_MAXP_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name-language.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name-language.cc
new file mode 100644
index 0000000..0e37e0a
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name-language.cc
@@ -0,0 +1,457 @@
+/*
+ * Copyright © 2018  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
+ */
+
+#include "hb-ot-name-language.hh"
+
+/* Following two tables were generated by joining FreeType, FontConfig,
+ * and OpenType specification language lists, then filled in missing
+ * entries using:
+ * https://docs.microsoft.com/en-us/windows/desktop/intl/language-identifier-constants-and-strings
+ */
+
+struct hb_ot_language_map_t
+{
+  static int cmp (const void *key, const void *item)
+  {
+    unsigned int a = * (unsigned int *) key;
+    unsigned int b = ((const hb_ot_language_map_t *) item)->code;
+    return a < b ? -1 : a > b ? +1 : 0;
+  }
+
+  uint16_t	code;
+  char		lang[6];
+};
+
+static const hb_ot_language_map_t
+hb_ms_language_map[] =
+{
+  {0x0001,	"ar"},	/* ??? */
+  {0x0004,	"zh"},	/* ??? */
+  {0x0009,	"en"},	/* ??? */
+  {0x0401,	"ar"},	/* Arabic (Saudi Arabia) */
+  {0x0402,	"bg"},	/* Bulgarian (Bulgaria) */
+  {0x0403,	"ca"},	/* Catalan (Catalan) */
+  {0x0404,	"zh-tw"},	/* Chinese (Taiwan) */
+  {0x0405,	"cs"},	/* Czech (Czech Republic) */
+  {0x0406,	"da"},	/* Danish (Denmark) */
+  {0x0407,	"de"},	/* German (Germany) */
+  {0x0408,	"el"},	/* Greek (Greece) */
+  {0x0409,	"en"},	/* English (United States) */
+  {0x040A,	"es"},	/* Spanish (Traditional Sort) (Spain) */
+  {0x040B,	"fi"},	/* Finnish (Finland) */
+  {0x040C,	"fr"},	/* French (France) */
+  {0x040D,	"he"},	/* Hebrew (Israel) */
+  {0x040E,	"hu"},	/* Hungarian (Hungary) */
+  {0x040F,	"is"},	/* Icelandic (Iceland) */
+  {0x0410,	"it"},	/* Italian (Italy) */
+  {0x0411,	"ja"},	/* Japanese (Japan) */
+  {0x0412,	"ko"},	/* Korean (Korea) */
+  {0x0413,	"nl"},	/* Dutch (Netherlands) */
+  {0x0414,	"no"},	/* Norwegian (Bokmal) (Norway) */
+  {0x0415,	"pl"},	/* Polish (Poland) */
+  {0x0416,	"pt"},	/* Portuguese (Brazil) */
+  {0x0417,	"rm"},	/* Romansh (Switzerland) */
+  {0x0418,	"ro"},	/* Romanian (Romania) */
+  {0x0419,	"ru"},	/* Russian (Russia) */
+  {0x041A,	"hr"},	/* Croatian (Croatia) */
+  {0x041B,	"sk"},	/* Slovak (Slovakia) */
+  {0x041C,	"sq"},	/* Albanian (Albania) */
+  {0x041D,	"sv"},	/* Swedish (Sweden) */
+  {0x041E,	"th"},	/* Thai (Thailand) */
+  {0x041F,	"tr"},	/* Turkish (Turkey) */
+  {0x0420,	"ur"},	/* Urdu (Islamic Republic of Pakistan) */
+  {0x0421,	"id"},	/* Indonesian (Indonesia) */
+  {0x0422,	"uk"},	/* Ukrainian (Ukraine) */
+  {0x0423,	"be"},	/* Belarusian (Belarus) */
+  {0x0424,	"sl"},	/* Slovenian (Slovenia) */
+  {0x0425,	"et"},	/* Estonian (Estonia) */
+  {0x0426,	"lv"},	/* Latvian (Latvia) */
+  {0x0427,	"lt"},	/* Lithuanian (Lithuania) */
+  {0x0428,	"tg"},	/* Tajik (Cyrillic) (Tajikistan) */
+  {0x0429,	"fa"},	/* Persian (Iran) */
+  {0x042A,	"vi"},	/* Vietnamese (Vietnam) */
+  {0x042B,	"hy"},	/* Armenian (Armenia) */
+  {0x042C,	"az"},	/* Azeri (Latin) (Azerbaijan) */
+  {0x042D,	"eu"},	/* Basque (Basque) */
+  {0x042E,	"hsb"},	/* Upper Sorbian (Germany) */
+  {0x042F,	"mk"},	/* Macedonian (FYROM) (Former Yugoslav Republic of Macedonia) */
+  {0x0430,	"st"},	/* ??? */
+  {0x0431,	"ts"},	/* ??? */
+  {0x0432,	"tn"},	/* Setswana (South Africa) */
+  {0x0433,	"ven"},	/* ??? */
+  {0x0434,	"xh"},	/* isiXhosa (South Africa) */
+  {0x0435,	"zu"},	/* isiZulu (South Africa) */
+  {0x0436,	"af"},	/* Afrikaans (South Africa) */
+  {0x0437,	"ka"},	/* Georgian (Georgia) */
+  {0x0438,	"fo"},	/* Faroese (Faroe Islands) */
+  {0x0439,	"hi"},	/* Hindi (India) */
+  {0x043A,	"mt"},	/* Maltese (Malta) */
+  {0x043B,	"se"},	/* Sami (Northern) (Norway) */
+  {0x043C,	"ga"},	/* ??? */
+  {0x043D,	"yi"},	/* ??? */
+  {0x043E,	"ms"},	/* Malay (Malaysia) */
+  {0x043F,	"kk"},	/* Kazakh (Kazakhstan) */
+  {0x0440,	"ky"},	/* Kyrgyz (Kyrgyzstan) */
+  {0x0441,	"sw"},	/* Kiswahili (Kenya) */
+  {0x0442,	"tk"},	/* Turkmen (Turkmenistan) */
+  {0x0443,	"uz"},	/* Uzbek (Latin) (Uzbekistan) */
+  {0x0444,	"tt"},	/* Tatar (Russia) */
+  {0x0445,	"bn"},	/* Bengali (India) */
+  {0x0446,	"pa"},	/* Punjabi (India) */
+  {0x0447,	"gu"},	/* Gujarati (India) */
+  {0x0448,	"or"},	/* Odia (formerly Oriya) (India) */
+  {0x0449,	"ta"},	/* Tamil (India) */
+  {0x044A,	"te"},	/* Telugu (India) */
+  {0x044B,	"kn"},	/* Kannada (India) */
+  {0x044C,	"ml"},	/* Malayalam (India) */
+  {0x044D,	"as"},	/* Assamese (India) */
+  {0x044E,	"mr"},	/* Marathi (India) */
+  {0x044F,	"sa"},	/* Sanskrit (India) */
+  {0x0450,	"mn"},	/* Mongolian (Cyrillic) (Mongolia) */
+  {0x0451,	"bo"},	/* Tibetan (PRC) */
+  {0x0452,	"cy"},	/* Welsh (United Kingdom) */
+  {0x0453,	"km"},	/* Khmer (Cambodia) */
+  {0x0454,	"lo"},	/* Lao (Lao P.D.R.) */
+  {0x0455,	"my"},	/* ??? */
+  {0x0456,	"gl"},	/* Galician (Galician) */
+  {0x0457,	"kok"},	/* Konkani (India) */
+  {0x0458,	"mni"},	/* ??? */
+  {0x0459,	"sd"},	/* ??? */
+  {0x045A,	"syr"},	/* Syriac (Syria) */
+  {0x045B,	"si"},	/* Sinhala (Sri Lanka) */
+  {0x045C,	"chr"},	/* ??? */
+  {0x045D,	"iu"},	/* Inuktitut (Canada) */
+  {0x045E,	"am"},	/* Amharic (Ethiopia) */
+  {0x0460,	"ks"},	/* ??? */
+  {0x0461,	"ne"},	/* Nepali (Nepal) */
+  {0x0462,	"fy"},	/* Frisian (Netherlands) */
+  {0x0463,	"ps"},	/* Pashto (Afghanistan) */
+  {0x0464,	"phi"},	/* Filipino (Philippines) */
+  {0x0465,	"div"},	/* Divehi (Maldives) */
+  {0x0468,	"ha"},	/* Hausa (Latin) (Nigeria) */
+  {0x046A,	"yo"},	/* Yoruba (Nigeria) */
+  {0x046B,	"quz"},	/* Quechua (Bolivia) */
+  {0x046C,	"nso"},	/* Sesotho sa Leboa (South Africa) */
+  {0x046D,	"ba"},	/* Bashkir (Russia) */
+  {0x046E,	"lb"},	/* Luxembourgish (Luxembourg) */
+  {0x046F,	"kl"},	/* Greenlandic (Greenland) */
+  {0x0470,	"ibo"},	/* Igbo (Nigeria) */
+  {0x0471,	"kau"},	/* ??? */
+  {0x0472,	"om"},	/* ??? */
+  {0x0473,	"ti"},	/* ??? */
+  {0x0474,	"gn"},	/* ??? */
+  {0x0475,	"haw"},	/* ??? */
+  {0x0476,	"la"},	/* ??? */
+  {0x0477,	"so"},	/* ??? */
+  {0x0478,	"ii"},	/* Yi (PRC) */
+  {0x0479,	"pap"},	/* ??? */
+  {0x047A,	"arn"},	/* Mapudungun (Chile) */
+  {0x047C,	"moh"},	/* Mohawk (Mohawk) */
+  {0x047E,	"br"},	/* Breton (France) */
+  {0x0480,	"ug"},	/* Uighur (PRC) */
+  {0x0481,	"mi"},	/* Maori (New Zealand) */
+  {0x0482,	"oc"},	/* Occitan (France) */
+  {0x0483,	"co"},	/* Corsican (France) */
+  {0x0484,	"gsw"},	/* Alsatian (France) */
+  {0x0485,	"sah"},	/* Yakut (Russia) */
+  {0x0486,	"qut"},	/* K'iche (Guatemala) */
+  {0x0487,	"rw"},	/* Kinyarwanda (Rwanda) */
+  {0x0488,	"wo"},	/* Wolof (Senegal) */
+  {0x048C,	"fa"},	/* Dari (Afghanistan) */
+  {0x0801,	"ar"},	/* Arabic (Iraq) */
+  {0x0804,	"zh-cn"},	/* Chinese (People’s Republic of China) */
+  {0x0807,	"de"},	/* German (Switzerland) */
+  {0x0809,	"en"},	/* English (United Kingdom) */
+  {0x080A,	"es"},	/* Spanish (Mexico) */
+  {0x080C,	"fr"},	/* French (Belgium) */
+  {0x0810,	"it"},	/* Italian (Switzerland) */
+  {0x0812,	"ko"},	/* ??? */
+  {0x0813,	"nl"},	/* Dutch (Belgium) */
+  {0x0814,	"nn"},	/* Norwegian (Nynorsk) (Norway) */
+  {0x0816,	"pt"},	/* Portuguese (Portugal) */
+  {0x0818,	"mo"},	/* ??? */
+  {0x0819,	"ru"},	/* ??? */
+  {0x081A,	"sr"},	/* Serbian (Latin) (Serbia) */
+  {0x081D,	"sv"},	/* Sweden (Finland) */
+  {0x0820,	"ur"},	/* ??? */
+  {0x0827,	"lt"},	/* ??? */
+  {0x082C,	"az"},	/* Azeri (Cyrillic) (Azerbaijan) */
+  {0x082E,	"dsb"},	/* Lower Sorbian (Germany) */
+//{0x083B,	""},	/* Sami (Northern) (Sweden) */
+  {0x083C,	"gd"},	/* Irish (Ireland) */
+  {0x083E,	"ms"},	/* Malay (Brunei Darussalam) */
+  {0x0843,	"uz"},	/* Uzbek (Cyrillic) (Uzbekistan) */
+  {0x0845,	"bn"},	/* Bengali (Bangladesh) */
+  {0x0846,	"ar"},	/* ??? */
+  {0x0850,	"mn"},	/* Mongolian (Traditional) (People’s Republic of China) */
+  {0x0851,	"dz"},	/* ??? */
+  {0x085D,	"iu"},	/* Inuktitut (Latin) (Canada) */
+  {0x085F,	"tzm"},	/* Tamazight (Latin) (Algeria) */
+  {0x0861,	"ne"},	/* ??? */
+//{0x086B,	""},	/* Quechua (Ecuador) */
+  {0x0873,	"ti"},	/* ??? */
+  {0x0C01,	"ar"},	/* Arabic (Egypt) */
+  {0x0C04,	"zh-hk"},	/* Chinese (Hong Kong S.A.R.) */
+  {0x0C07,	"de"},	/* German (Austria) */
+  {0x0C09,	"en"},	/* English (Australia) */
+  {0x0C0A,	"es"},	/* Spanish (Modern Sort) (Spain) */
+  {0x0C0C,	"fr"},	/* French (Canada) */
+  {0x0C1A,	"sr"},	/* Serbian (Cyrillic) (Serbia) */
+  {0x0C3B,	"se"},	/* Sami (Northern) (Finland) */
+//{0x0C6B,	""},	/* Quechua (Peru) */
+  {0x1001,	"ar"},	/* Arabic (Libya) */
+  {0x1004,	"zh-sg"},	/* Chinese (Singapore) */
+  {0x1007,	"de"},	/* German (Luxembourg) */
+  {0x1009,	"en"},	/* English (Canada) */
+  {0x100A,	"es"},	/* Spanish (Guatemala) */
+  {0x100C,	"fr"},	/* French (Switzerland) */
+  {0x101A,	"hr"},	/* Croatian (Latin) (Bosnia and Herzegovina) */
+  {0x103B,	"smj"},	/* Sami (Lule) (Norway) */
+  {0x1401,	"ar"},	/* Arabic (Algeria) */
+//{0x1404,	""},	/* Chinese (Macao S.A.R.) */
+  {0x1407,	"de"},	/* German (Liechtenstein) */
+  {0x1409,	"en"},	/* English (New Zealand) */
+  {0x140A,	"es"},	/* Spanish (Costa Rica) */
+  {0x140C,	"fr"},	/* French (Luxembourg) */
+  {0x141A,	"bs"},	/* Bosnian (Latin) (Bosnia and Herzegovina) */
+//{0x143B,	""},	/* Sami (Lule) (Sweden) */
+  {0x1801,	"ar"},	/* Arabic (Morocco) */
+  {0x1809,	"en"},	/* English (Ireland) */
+  {0x180A,	"es"},	/* Spanish (Panama) */
+  {0x180C,	"fr"},	/* French (Principality of Monaco) */
+//{0x181A,	""},	/* Serbian (Latin) (Bosnia and Herzegovina) */
+  {0x183B,	"sma"},	/* Sami (Southern) (Norway) */
+  {0x1C01,	"ar"},	/* Arabic (Tunisia) */
+  {0x1C09,	"en"},	/* English (South Africa) */
+  {0x1C0A,	"es"},	/* Spanish (Dominican Republic) */
+  {0x1C0C,	"fr"},	/* ??? */
+//{0x1C1A,	""},	/* Serbian (Cyrillic) (Bosnia and Herzegovina) */
+//{0x1C3B,	""},	/* Sami (Southern) (Sweden) */
+  {0x2001,	"ar"},	/* Arabic (Oman) */
+  {0x2009,	"en"},	/* English (Jamaica) */
+  {0x200A,	"es"},	/* Spanish (Venezuela) */
+  {0x200C,	"fr"},	/* ??? */
+  {0x201A,	"bs"},	/* Bosnian (Cyrillic) (Bosnia and Herzegovina) */
+  {0x203B,	"sms"},	/* Sami (Skolt) (Finland) */
+  {0x2401,	"ar"},	/* Arabic (Yemen) */
+  {0x2409,	"en"},	/* English (Caribbean) */
+  {0x240A,	"es"},	/* Spanish (Colombia) */
+  {0x240C,	"fr"},	/* ??? */
+  {0x243B,	"smn"},	/* Sami (Inari) (Finland) */
+  {0x2801,	"ar"},	/* Arabic (Syria) */
+  {0x2809,	"en"},	/* English (Belize) */
+  {0x280A,	"es"},	/* Spanish (Peru) */
+  {0x280C,	"fr"},	/* ??? */
+  {0x2C01,	"ar"},	/* Arabic (Jordan) */
+  {0x2C09,	"en"},	/* English (Trinidad and Tobago) */
+  {0x2C0A,	"es"},	/* Spanish (Argentina) */
+  {0x2C0C,	"fr"},	/* ??? */
+  {0x3001,	"ar"},	/* Arabic (Lebanon) */
+  {0x3009,	"en"},	/* English (Zimbabwe) */
+  {0x300A,	"es"},	/* Spanish (Ecuador) */
+  {0x300C,	"fr"},	/* ??? */
+  {0x3401,	"ar"},	/* Arabic (Kuwait) */
+  {0x3409,	"en"},	/* English (Republic of the Philippines) */
+  {0x340A,	"es"},	/* Spanish (Chile) */
+  {0x340C,	"fr"},	/* ??? */
+  {0x3801,	"ar"},	/* Arabic (U.A.E.) */
+  {0x380A,	"es"},	/* Spanish (Uruguay) */
+  {0x380C,	"fr"},	/* ??? */
+  {0x3C01,	"ar"},	/* Arabic (Bahrain) */
+  {0x3C09,	"en"},	/* ??? */
+  {0x3C0A,	"es"},	/* Spanish (Paraguay) */
+  {0x3C0C,	"fr"},	/* ??? */
+  {0x4001,	"ar"},	/* Arabic (Qatar) */
+  {0x4009,	"en"},	/* English (India) */
+  {0x400A,	"es"},	/* Spanish (Bolivia) */
+  {0x4409,	"en"},	/* English (Malaysia) */
+  {0x440A,	"es"},	/* Spanish (El Salvador) */
+  {0x4809,	"en"},	/* English (Singapore) */
+  {0x480A,	"es"},	/* Spanish (Honduras) */
+  {0x4C0A,	"es"},	/* Spanish (Nicaragua) */
+  {0x500A,	"es"},	/* Spanish (Puerto Rico) */
+  {0x540A,	"es"},	/* Spanish (United States) */
+  {0xE40A,	"es"},	/* ??? */
+  {0xE40C,	"fr"},	/* ??? */
+};
+
+static const hb_ot_language_map_t
+hb_mac_language_map[] =
+{
+  {  0,	"en"},	/* English */
+  {  1,	"fr"},	/* French */
+  {  2,	"de"},	/* German */
+  {  3,	"it"},	/* Italian */
+  {  4,	"nl"},	/* Dutch */
+  {  5,	"sv"},	/* Swedish */
+  {  6,	"es"},	/* Spanish */
+  {  7,	"da"},	/* Danish */
+  {  8,	"pt"},	/* Portuguese */
+  {  9,	"no"},	/* Norwegian */
+  { 10,	"he"},	/* Hebrew */
+  { 11,	"ja"},	/* Japanese */
+  { 12,	"ar"},	/* Arabic */
+  { 13,	"fi"},	/* Finnish */
+  { 14,	"el"},	/* Greek */
+  { 15,	"is"},	/* Icelandic */
+  { 16,	"mt"},	/* Maltese */
+  { 17,	"tr"},	/* Turkish */
+  { 18,	"hr"},	/* Croatian */
+  { 19,	"zh-tw"},	/* Chinese (Traditional) */
+  { 20,	"ur"},	/* Urdu */
+  { 21,	"hi"},	/* Hindi */
+  { 22,	"th"},	/* Thai */
+  { 23,	"ko"},	/* Korean */
+  { 24,	"lt"},	/* Lithuanian */
+  { 25,	"pl"},	/* Polish */
+  { 26,	"hu"},	/* Hungarian */
+  { 27,	"et"},	/* Estonian */
+  { 28,	"lv"},	/* Latvian */
+//{ 29,	""},	/* Sami */
+  { 30,	"fo"},	/* Faroese */
+  { 31,	"fa"},	/* Farsi/Persian */
+  { 32,	"ru"},	/* Russian */
+  { 33,	"zh-cn"},	/* Chinese (Simplified) */
+  { 34,	"nl"},	/* Flemish */
+  { 35,	"ga"},	/* Irish Gaelic */
+  { 36,	"sq"},	/* Albanian */
+  { 37,	"ro"},	/* Romanian */
+  { 38,	"cs"},	/* Czech */
+  { 39,	"sk"},	/* Slovak */
+  { 40,	"sl"},	/* Slovenian */
+  { 41,	"yi"},	/* Yiddish */
+  { 42,	"sr"},	/* Serbian */
+  { 43,	"mk"},	/* Macedonian */
+  { 44,	"bg"},	/* Bulgarian */
+  { 45,	"uk"},	/* Ukrainian */
+  { 46,	"be"},	/* Byelorussian */
+  { 47,	"uz"},	/* Uzbek */
+  { 48,	"kk"},	/* Kazakh */
+  { 49,	"az"},	/* Azerbaijani (Cyrillic script) */
+  { 50,	"az"},	/* Azerbaijani (Arabic script) */
+  { 51,	"hy"},	/* Armenian */
+  { 52,	"ka"},	/* Georgian */
+  { 53,	"mo"},	/* Moldavian */
+  { 54,	"ky"},	/* Kirghiz */
+  { 55,	"tg"},	/* Tajiki */
+  { 56,	"tk"},	/* Turkmen */
+  { 57,	"mn"},	/* Mongolian (Mongolian script) */
+  { 58,	"mn"},	/* Mongolian (Cyrillic script) */
+  { 59,	"ps"},	/* Pashto */
+  { 60,	"ku"},	/* Kurdish */
+  { 61,	"ks"},	/* Kashmiri */
+  { 62,	"sd"},	/* Sindhi */
+  { 63,	"bo"},	/* Tibetan */
+  { 64,	"ne"},	/* Nepali */
+  { 65,	"sa"},	/* Sanskrit */
+  { 66,	"mr"},	/* Marathi */
+  { 67,	"bn"},	/* Bengali */
+  { 68,	"as"},	/* Assamese */
+  { 69,	"gu"},	/* Gujarati */
+  { 70,	"pa"},	/* Punjabi */
+  { 71,	"or"},	/* Oriya */
+  { 72,	"ml"},	/* Malayalam */
+  { 73,	"kn"},	/* Kannada */
+  { 74,	"ta"},	/* Tamil */
+  { 75,	"te"},	/* Telugu */
+  { 76,	"si"},	/* Sinhalese */
+  { 77,	"my"},	/* Burmese */
+  { 78,	"km"},	/* Khmer */
+  { 79,	"lo"},	/* Lao */
+  { 80,	"vi"},	/* Vietnamese */
+  { 81,	"id"},	/* Indonesian */
+  { 82,	"tl"},	/* Tagalog */
+  { 83,	"ms"},	/* Malay (Roman script) */
+  { 84,	"ms"},	/* Malay (Arabic script) */
+  { 85,	"am"},	/* Amharic */
+  { 86,	"ti"},	/* Tigrinya */
+  { 87,	"om"},	/* Galla */
+  { 88,	"so"},	/* Somali */
+  { 89,	"sw"},	/* Swahili */
+  { 90,	"rw"},	/* Kinyarwanda/Ruanda */
+  { 91,	"rn"},	/* Rundi */
+  { 92,	"ny"},	/* Nyanja/Chewa */
+  { 93,	"mg"},	/* Malagasy */
+  { 94,	"eo"},	/* Esperanto */
+  {128,	"cy"},	/* Welsh */
+  {129,	"eu"},	/* Basque */
+  {130,	"ca"},	/* Catalan */
+  {131,	"la"},	/* Latin */
+  {132,	"qu"},	/* Quechua */
+  {133,	"gn"},	/* Guarani */
+  {134,	"ay"},	/* Aymara */
+  {135,	"tt"},	/* Tatar */
+  {136,	"ug"},	/* Uighur */
+  {137,	"dz"},	/* Dzongkha */
+  {138,	"jw"},	/* Javanese (Roman script) */
+  {139,	"su"},	/* Sundanese (Roman script) */
+  {140,	"gl"},	/* Galician */
+  {141,	"af"},	/* Afrikaans */
+  {142,	"br"},	/* Breton */
+  {143,	"iu"},	/* Inuktitut */
+  {144,	"gd"},	/* Scottish Gaelic */
+  {145,	"gv"},	/* Manx Gaelic */
+  {146,	"ga"},	/* Irish Gaelic (with dot above) */
+  {147,	"to"},	/* Tongan */
+  {148,	"el"},	/* Greek (polytonic) */
+  {149,	"ik"},	/* Greenlandic */
+  {150,	"az"},	/* Azerbaijani (Roman script) */
+};
+
+
+static hb_language_t
+_hb_ot_name_language_for (unsigned int code,
+			  const hb_ot_language_map_t *array,
+			  unsigned int len)
+{
+  const hb_ot_language_map_t *entry = (const hb_ot_language_map_t *)
+				      hb_bsearch (&code,
+						  array,
+						  len,
+						  sizeof (array[0]),
+						  hb_ot_language_map_t::cmp);
+
+  if (entry)
+    return hb_language_from_string (entry->lang, -1);
+
+  return HB_LANGUAGE_INVALID;
+}
+
+hb_language_t
+_hb_ot_name_language_for_ms_code (unsigned int code)
+{
+  return _hb_ot_name_language_for (code,
+				   hb_ms_language_map,
+				   ARRAY_LENGTH (hb_ms_language_map));
+}
+
+hb_language_t
+_hb_ot_name_language_for_mac_code (unsigned int code)
+{
+  return _hb_ot_name_language_for (code,
+				   hb_mac_language_map,
+				   ARRAY_LENGTH (hb_mac_language_map));
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name-language.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name-language.hh
new file mode 100644
index 0000000..903076c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name-language.hh
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2018  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_NAME_LANGUAGE_HH
+#define HB_OT_NAME_LANGUAGE_HH
+
+#include "hb.hh"
+
+
+HB_INTERNAL hb_language_t
+_hb_ot_name_language_for_ms_code (unsigned int code);
+
+HB_INTERNAL hb_language_t
+_hb_ot_name_language_for_mac_code (unsigned int code);
+
+
+#endif /* HB_OT_NAME_LANGUAGE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name-table.hh
new file mode 100644
index 0000000..c8ababd
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name-table.hh
@@ -0,0 +1,279 @@
+/*
+ * Copyright © 2011,2012  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_NAME_TABLE_HH
+#define HB_OT_NAME_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-name-language.hh"
+#include "hb-aat-layout.hh"
+
+
+namespace OT {
+
+
+#define entry_score var.u16[0]
+#define entry_index var.u16[1]
+
+
+/*
+ * name -- Naming
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/name
+ */
+#define HB_OT_TAG_name HB_TAG('n','a','m','e')
+
+#define UNSUPPORTED	42
+
+struct NameRecord
+{
+  hb_language_t language (hb_face_t *face) const
+  {
+    unsigned int p = platformID;
+    unsigned int l = languageID;
+
+    if (p == 3)
+      return _hb_ot_name_language_for_ms_code (l);
+
+    if (p == 1)
+      return _hb_ot_name_language_for_mac_code (l);
+
+    if (p == 0)
+      return _hb_aat_language_get (face, l);
+
+    return HB_LANGUAGE_INVALID;
+  }
+
+  uint16_t score () const
+  {
+    /* Same order as in cmap::find_best_subtable(). */
+    unsigned int p = platformID;
+    unsigned int e = encodingID;
+
+    /* 32-bit. */
+    if (p == 3 && e == 10) return 0;
+    if (p == 0 && e ==  6) return 1;
+    if (p == 0 && e ==  4) return 2;
+
+    /* 16-bit. */
+    if (p == 3 && e ==  1) return 3;
+    if (p == 0 && e ==  3) return 4;
+    if (p == 0 && e ==  2) return 5;
+    if (p == 0 && e ==  1) return 6;
+    if (p == 0 && e ==  0) return 7;
+
+    /* Symbol. */
+    if (p == 3 && e ==  0) return 8;
+
+    /* We treat all Mac Latin names as ASCII only. */
+    if (p == 1 && e ==  0) return 10; /* 10 is magic number :| */
+
+    return UNSUPPORTED;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    /* We can check from base all the way up to the end of string... */
+    return_trace (c->check_struct (this) && c->check_range ((char *) base, (unsigned int) length + offset));
+  }
+
+  HBUINT16	platformID;	/* Platform ID. */
+  HBUINT16	encodingID;	/* Platform-specific encoding ID. */
+  HBUINT16	languageID;	/* Language ID. */
+  HBUINT16	nameID;		/* Name ID. */
+  HBUINT16	length;		/* String length (in bytes). */
+  HBUINT16	offset;		/* String offset from start of storage area (in bytes). */
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+static int
+_hb_ot_name_entry_cmp_key (const void *pa, const void *pb)
+{
+  const hb_ot_name_entry_t *a = (const hb_ot_name_entry_t *) pa;
+  const hb_ot_name_entry_t *b = (const hb_ot_name_entry_t *) pb;
+
+  /* Compare by name_id, then language. */
+
+  if (a->name_id != b->name_id)
+    return a->name_id < b->name_id ? -1 : +1;
+
+  if (a->language == b->language) return 0;
+  if (!a->language) return -1;
+  if (!b->language) return +1;
+  return strcmp (hb_language_to_string (a->language),
+		 hb_language_to_string (b->language));
+}
+
+static int
+_hb_ot_name_entry_cmp (const void *pa, const void *pb)
+{
+  /* Compare by name_id, then language, then score, then index. */
+
+  int v = _hb_ot_name_entry_cmp_key (pa, pb);
+  if (v)
+    return v;
+
+  const hb_ot_name_entry_t *a = (const hb_ot_name_entry_t *) pa;
+  const hb_ot_name_entry_t *b = (const hb_ot_name_entry_t *) pb;
+
+  if (a->entry_score != b->entry_score)
+    return a->entry_score < b->entry_score ? -1 : +1;
+
+  if (a->entry_index != b->entry_index)
+    return a->entry_index < b->entry_index ? -1 : +1;
+
+  return 0;
+}
+
+struct name
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_name;
+
+  unsigned int get_size () const
+  { return min_size + count * nameRecordZ.item_size; }
+
+  bool sanitize_records (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    const void *string_pool = (this+stringOffset).arrayZ;
+    unsigned int _count = count;
+    /* Move to run-time?! */
+    for (unsigned int i = 0; i < _count; i++)
+      if (!nameRecordZ[i].sanitize (c, string_pool)) return_trace (false);
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  likely (format == 0 || format == 1) &&
+		  c->check_array (nameRecordZ.arrayZ, count) &&
+		  c->check_range (this, stringOffset));
+  }
+
+  struct accelerator_t
+  {
+    void init (hb_face_t *face)
+    {
+      this->table = hb_sanitize_context_t().reference_table<name> (face);
+      assert (this->table.get_length () >= this->table->stringOffset);
+      this->pool = (const char *) (const void *) (this->table+this->table->stringOffset);
+      this->pool_len = this->table.get_length () - this->table->stringOffset;
+      const hb_array_t<const NameRecord> all_names (this->table->nameRecordZ.arrayZ,
+						    this->table->count);
+
+      this->names.init ();
+      this->names.alloc (all_names.length);
+
+      for (unsigned int i = 0; i < all_names.length; i++)
+      {
+	hb_ot_name_entry_t *entry = this->names.push ();
+
+	entry->name_id = all_names[i].nameID;
+	entry->language = all_names[i].language (face);
+	entry->entry_score =  all_names[i].score ();
+	entry->entry_index = i;
+      }
+
+      this->names.qsort (_hb_ot_name_entry_cmp);
+      /* Walk and pick best only for each name_id,language pair,
+       * while dropping unsupported encodings. */
+      unsigned int j = 0;
+      for (unsigned int i = 0; i < this->names.length; i++)
+      {
+        if (this->names[i].entry_score == UNSUPPORTED ||
+	    this->names[i].language == HB_LANGUAGE_INVALID)
+	  continue;
+        if (i &&
+	    this->names[i - 1].name_id  == this->names[i].name_id &&
+	    this->names[i - 1].language == this->names[i].language)
+	  continue;
+	this->names[j++] = this->names[i];
+      }
+      this->names.resize (j);
+    }
+
+    void fini ()
+    {
+      this->names.fini ();
+      this->table.destroy ();
+    }
+
+    int get_index (hb_ot_name_id_t   name_id,
+			  hb_language_t     language,
+			  unsigned int     *width=nullptr) const
+    {
+      const hb_ot_name_entry_t key = {name_id, {0}, language};
+      const hb_ot_name_entry_t *entry = (const hb_ot_name_entry_t *)
+					hb_bsearch (&key,
+						    (const hb_ot_name_entry_t *) this->names,
+						    this->names.length,
+						    sizeof (key),
+						    _hb_ot_name_entry_cmp_key);
+      if (!entry)
+        return -1;
+
+      if (width)
+        *width = entry->entry_score < 10 ? 2 : 1;
+
+      return entry->entry_index;
+    }
+
+    hb_bytes_t get_name (unsigned int idx) const
+    {
+      const hb_array_t<const NameRecord> all_names (table->nameRecordZ.arrayZ, table->count);
+      const NameRecord &record = all_names[idx];
+      const hb_bytes_t string_pool (pool, pool_len);
+      return string_pool.sub_array (record.offset, record.length);
+    }
+
+    private:
+    const char *pool;
+    unsigned int pool_len;
+    public:
+    hb_blob_ptr_t<name> table;
+    hb_vector_t<hb_ot_name_entry_t> names;
+  };
+
+  /* We only implement format 0 for now. */
+  HBUINT16	format;			/* Format selector (=0/1). */
+  HBUINT16	count;			/* Number of name records. */
+  NNOffsetTo<UnsizedArrayOf<HBUINT8> >
+		stringOffset;		/* Offset to start of string storage (from start of table). */
+  UnsizedArrayOf<NameRecord>
+		nameRecordZ;		/* The name records where count is the number of records. */
+  public:
+  DEFINE_SIZE_ARRAY (6, nameRecordZ);
+};
+
+struct name_accelerator_t : name::accelerator_t {};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_NAME_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name.cc
new file mode 100644
index 0000000..907ae6a
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name.cc
@@ -0,0 +1,224 @@
+/*
+ * Copyright © 2018  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
+ */
+
+#include "hb.hh"
+
+#include "hb-ot-name-table.hh"
+
+#include "hb-ot-face.hh"
+#include "hb-utf.hh"
+
+
+/**
+ * SECTION:hb-ot-name
+ * @title: hb-ot-name
+ * @short_description: OpenType font name information
+ * @include: hb-ot.h
+ *
+ * Functions for fetching name strings from OpenType fonts.
+ **/
+
+
+/**
+ * hb_ot_name_list_names:
+ * @face: font face.
+ * @num_entries: (out) (allow-none): number of returned entries.
+ *
+ * Enumerates all available name IDs and language combinations. Returned
+ * array is owned by the @face and should not be modified.  It can be
+ * used as long as @face is alive.
+ *
+ * Returns: (out) (transfer none) (array length=num_entries): Array of available name entries.
+ * Since: 2.1.0
+ **/
+const hb_ot_name_entry_t *
+hb_ot_name_list_names (hb_face_t    *face,
+		       unsigned int *num_entries /* OUT */)
+{
+  const OT::name_accelerator_t &name = *face->table.name;
+  if (num_entries) *num_entries = name.names.length;
+  return (const hb_ot_name_entry_t *) name.names;
+}
+
+
+template <typename in_utf_t, typename out_utf_t>
+static inline unsigned int
+hb_ot_name_convert_utf (hb_bytes_t                       bytes,
+			unsigned int                    *text_size /* IN/OUT */,
+			typename out_utf_t::codepoint_t *text /* OUT */)
+{
+  unsigned int src_len = bytes.length / sizeof (typename in_utf_t::codepoint_t);
+  const typename in_utf_t::codepoint_t *src = (const typename in_utf_t::codepoint_t *) bytes.arrayZ;
+  const typename in_utf_t::codepoint_t *src_end = src + src_len;
+
+  typename out_utf_t::codepoint_t *dst = text;
+
+  hb_codepoint_t unicode;
+  const hb_codepoint_t replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT;
+
+  if (text_size && *text_size)
+  {
+    (*text_size)--; /* Same room for NUL-termination. */
+    const typename out_utf_t::codepoint_t *dst_end = text + *text_size;
+
+    while (src < src_end && dst < dst_end)
+    {
+      const typename in_utf_t::codepoint_t *src_next = in_utf_t::next (src, src_end, &unicode, replacement);
+      typename out_utf_t::codepoint_t *dst_next = out_utf_t::encode (dst, dst_end, unicode);
+      if (dst_next == dst)
+        break; /* Out-of-room. */
+
+      dst = dst_next;
+      src = src_next;
+    };
+
+    *text_size = dst - text;
+    *dst = 0; /* NUL-terminate. */
+  }
+
+  /* Accumulate length of rest. */
+  unsigned int dst_len = dst - text;
+  while (src < src_end)
+  {
+    src = in_utf_t::next (src, src_end, &unicode, replacement);
+    dst_len += out_utf_t::encode_len (unicode);
+  };
+  return dst_len;
+}
+
+template <typename utf_t>
+static inline unsigned int
+hb_ot_name_get_utf (hb_face_t       *face,
+		    hb_ot_name_id_t  name_id,
+		    hb_language_t    language,
+		    unsigned int    *text_size /* IN/OUT */,
+		    typename utf_t::codepoint_t *text /* OUT */)
+{
+  const OT::name_accelerator_t &name = *face->table.name;
+
+  if (!language)
+    language = hb_language_from_string ("en", 2);
+
+  unsigned int width;
+  int idx = name.get_index (name_id, language, &width);
+  if (idx != -1)
+  {
+    hb_bytes_t bytes = name.get_name (idx);
+
+    if (width == 2) /* UTF16-BE */
+      return hb_ot_name_convert_utf<hb_utf16_be_t, utf_t> (bytes, text_size, text);
+
+    if (width == 1) /* ASCII */
+      return hb_ot_name_convert_utf<hb_ascii_t, utf_t> (bytes, text_size, text);
+  }
+
+  if (text_size)
+  {
+    if (*text_size)
+      *text = 0;
+    *text_size = 0;
+  }
+  return 0;
+}
+
+/**
+ * hb_ot_name_get_utf8:
+ * @face: font face.
+ * @name_id: OpenType name identifier to fetch.
+ * @language: language to fetch the name for.
+ * @text_size: (inout) (allow-none): input size of @text buffer, and output size of
+ *                                   text written to buffer.
+ * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
+ *
+ * Fetches a font name from the OpenType 'name' table.
+ * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
+ * Returns string in UTF-8 encoding.
+ *
+ * Returns: full length of the requested string, or 0 if not found.
+ * Since: 2.1.0
+ **/
+unsigned int
+hb_ot_name_get_utf8 (hb_face_t       *face,
+		     hb_ot_name_id_t  name_id,
+		     hb_language_t    language,
+		     unsigned int    *text_size /* IN/OUT */,
+		     char            *text      /* OUT */)
+{
+  return hb_ot_name_get_utf<hb_utf8_t> (face, name_id, language, text_size,
+					(hb_utf8_t::codepoint_t *) text);
+}
+
+/**
+ * hb_ot_name_get_utf16:
+ * @face: font face.
+ * @name_id: OpenType name identifier to fetch.
+ * @language: language to fetch the name for.
+ * @text_size: (inout) (allow-none): input size of @text buffer, and output size of
+ *                                   text written to buffer.
+ * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
+ *
+ * Fetches a font name from the OpenType 'name' table.
+ * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
+ * Returns string in UTF-16 encoding.
+ *
+ * Returns: full length of the requested string, or 0 if not found.
+ * Since: 2.1.0
+ **/
+unsigned int
+hb_ot_name_get_utf16 (hb_face_t       *face,
+		      hb_ot_name_id_t  name_id,
+		      hb_language_t    language,
+		      unsigned int    *text_size /* IN/OUT */,
+		      uint16_t        *text      /* OUT */)
+{
+  return hb_ot_name_get_utf<hb_utf16_t> (face, name_id, language, text_size, text);
+}
+
+/**
+ * hb_ot_name_get_utf32:
+ * @face: font face.
+ * @name_id: OpenType name identifier to fetch.
+ * @language: language to fetch the name for.
+ * @text_size: (inout) (allow-none): input size of @text buffer, and output size of
+ *                                   text written to buffer.
+ * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
+ *
+ * Fetches a font name from the OpenType 'name' table.
+ * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
+ * Returns string in UTF-32 encoding.
+ *
+ * Returns: full length of the requested string, or 0 if not found.
+ * Since: 2.1.0
+ **/
+unsigned int
+hb_ot_name_get_utf32 (hb_face_t       *face,
+		      hb_ot_name_id_t  name_id,
+		      hb_language_t    language,
+		      unsigned int    *text_size /* IN/OUT */,
+		      uint32_t        *text      /* OUT */)
+{
+  return hb_ot_name_get_utf<hb_utf32_t> (face, name_id, language, text_size, text);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name.h
new file mode 100644
index 0000000..3b4ad58
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-name.h
@@ -0,0 +1,129 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi.
+ *
+ *  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.
+ */
+
+#ifndef HB_OT_H_IN
+#error "Include <hb-ot.h> instead."
+#endif
+
+#ifndef HB_OT_NAME_H
+#define HB_OT_NAME_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+
+/**
+ * hb_ot_name_id_t:
+ * @HB_OT_NAME_ID_INVALID: Value to represent a nonexistent name ID.
+ *
+ * An integral type representing an OpenType 'name' table name identifier.
+ * There are predefined name IDs, as well as name IDs return from other
+ * API.  These can be used to fetch name strings from a font face.
+ *
+ * Since: 2.0.0
+ **/
+enum
+{
+  HB_OT_NAME_ID_COPYRIGHT		= 0,
+  HB_OT_NAME_ID_FONT_FAMILY		= 1,
+  HB_OT_NAME_ID_FONT_SUBFAMILY		= 2,
+  HB_OT_NAME_ID_UNIQUE_ID		= 3,
+  HB_OT_NAME_ID_FULL_NAME		= 4,
+  HB_OT_NAME_ID_VERSION_STRING		= 5,
+  HB_OT_NAME_ID_POSTSCRIPT_NAME		= 6,
+  HB_OT_NAME_ID_TRADEMARK		= 7,
+  HB_OT_NAME_ID_MANUFACTURER		= 8,
+  HB_OT_NAME_ID_DESIGNER		= 9,
+  HB_OT_NAME_ID_DESCRIPTION		= 10,
+  HB_OT_NAME_ID_VENDOR_URL		= 11,
+  HB_OT_NAME_ID_DESIGNER_URL		= 12,
+  HB_OT_NAME_ID_LICENSE			= 13,
+  HB_OT_NAME_ID_LICENSE_URL		= 14,
+/*HB_OT_NAME_ID_RESERVED		= 15,*/
+  HB_OT_NAME_ID_TYPOGRAPHIC_FAMILY	= 16,
+  HB_OT_NAME_ID_TYPOGRAPHIC_SUBFAMILY	= 17,
+  HB_OT_NAME_ID_MAC_FULL_NAME		= 18,
+  HB_OT_NAME_ID_SAMPLE_TEXT		= 19,
+  HB_OT_NAME_ID_CID_FINDFONT_NAME	= 20,
+  HB_OT_NAME_ID_WWS_FAMILY		= 21,
+  HB_OT_NAME_ID_WWS_SUBFAMILY		= 22,
+  HB_OT_NAME_ID_LIGHT_BACKGROUND	= 23,
+  HB_OT_NAME_ID_DARK_BACKGROUND		= 24,
+  HB_OT_NAME_ID_VARIATIONS_PS_PREFIX	= 25,
+
+  HB_OT_NAME_ID_INVALID			= 0xFFFF
+};
+
+typedef unsigned int hb_ot_name_id_t;
+
+
+/**
+ * hb_ot_name_entry_t:
+ * @name_id: name ID
+ * @language: language
+ *
+ * Structure representing a name ID in a particular language.
+ *
+ * Since: 2.1.0
+ **/
+typedef struct hb_ot_name_entry_t
+{
+  hb_ot_name_id_t name_id;
+  /*< private >*/
+  hb_var_int_t    var;
+  /*< public >*/
+  hb_language_t   language;
+} hb_ot_name_entry_t;
+
+HB_EXTERN const hb_ot_name_entry_t *
+hb_ot_name_list_names (hb_face_t    *face,
+		       unsigned int *num_entries /* OUT */);
+
+
+HB_EXTERN unsigned int
+hb_ot_name_get_utf8 (hb_face_t       *face,
+		     hb_ot_name_id_t  name_id,
+		     hb_language_t    language,
+		     unsigned int    *text_size /* IN/OUT */,
+		     char            *text      /* OUT */);
+
+HB_EXTERN unsigned int
+hb_ot_name_get_utf16 (hb_face_t       *face,
+		      hb_ot_name_id_t  name_id,
+		      hb_language_t    language,
+		      unsigned int    *text_size /* IN/OUT */,
+		      uint16_t        *text      /* OUT */);
+
+HB_EXTERN unsigned int
+hb_ot_name_get_utf32 (hb_face_t       *face,
+		      hb_ot_name_id_t  name_id,
+		      hb_language_t    language,
+		      unsigned int    *text_size /* IN/OUT */,
+		      uint32_t        *text      /* OUT */);
+
+
+HB_END_DECLS
+
+#endif /* HB_OT_NAME_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-os2-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-os2-table.hh
new file mode 100644
index 0000000..68dd63e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-os2-table.hh
@@ -0,0 +1,269 @@
+/*
+ * Copyright © 2011,2012  Google, Inc.
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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_OS2_TABLE_HH
+#define HB_OT_OS2_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-os2-unicode-ranges.hh"
+
+#include "hb-set.hh"
+
+/*
+ * OS/2 and Windows Metrics
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/os2
+ */
+#define HB_OT_TAG_OS2 HB_TAG('O','S','/','2')
+
+
+namespace OT {
+
+struct OS2V1Tail
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT32	ulCodePageRange1;
+  HBUINT32	ulCodePageRange2;
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct OS2V2Tail
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBINT16	sxHeight;
+  HBINT16	sCapHeight;
+  HBUINT16	usDefaultChar;
+  HBUINT16	usBreakChar;
+  HBUINT16	usMaxContext;
+  public:
+  DEFINE_SIZE_STATIC (10);
+};
+
+struct OS2V5Tail
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT16	usLowerOpticalPointSize;
+  HBUINT16	usUpperOpticalPointSize;
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct OS2
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_OS2;
+
+  bool has_data () const { return this != &Null (OS2); }
+
+  const OS2V1Tail &v1 () const { return version >= 1 ? v1X : Null (OS2V1Tail); }
+  const OS2V2Tail &v2 () const { return version >= 2 ? v2X : Null (OS2V2Tail); }
+  const OS2V5Tail &v5 () const { return version >= 5 ? v5X : Null (OS2V5Tail); }
+
+  enum selection_flag_t {
+    ITALIC		= 1u<<0,
+    UNDERSCORE		= 1u<<1,
+    NEGATIVE		= 1u<<2,
+    OUTLINED		= 1u<<3,
+    STRIKEOUT		= 1u<<4,
+    BOLD		= 1u<<5,
+    REGULAR		= 1u<<6,
+    USE_TYPO_METRICS	= 1u<<7,
+    WWS			= 1u<<8,
+    OBLIQUE		= 1u<<9
+  };
+
+  bool is_italic () const       { return fsSelection & ITALIC; }
+  bool is_oblique () const      { return fsSelection & OBLIQUE; }
+  bool is_typo_metrics () const { return fsSelection & USE_TYPO_METRICS; }
+
+  enum width_class_t {
+    FWIDTH_ULTRA_CONDENSED	= 1, /* 50% */
+    FWIDTH_EXTRA_CONDENSED	= 2, /* 62.5% */
+    FWIDTH_CONDENSED		= 3, /* 75% */
+    FWIDTH_SEMI_CONDENSED	= 4, /* 87.5% */
+    FWIDTH_NORMAL		= 5, /* 100% */
+    FWIDTH_SEMI_EXPANDED	= 6, /* 112.5% */
+    FWIDTH_EXPANDED		= 7, /* 125% */
+    FWIDTH_EXTRA_EXPANDED	= 8, /* 150% */
+    FWIDTH_ULTRA_EXPANDED	= 9  /* 200% */
+  };
+
+  float get_width () const
+  {
+    switch (usWidthClass) {
+    case FWIDTH_ULTRA_CONDENSED:return 50.f;
+    case FWIDTH_EXTRA_CONDENSED:return 62.5f;
+    case FWIDTH_CONDENSED:	return 75.f;
+    case FWIDTH_SEMI_CONDENSED:	return 87.5f;
+    default:
+    case FWIDTH_NORMAL:		return 100.f;
+    case FWIDTH_SEMI_EXPANDED:	return 112.5f;
+    case FWIDTH_EXPANDED:	return 125.f;
+    case FWIDTH_EXTRA_EXPANDED:	return 150.f;
+    case FWIDTH_ULTRA_EXPANDED:	return 200.f;
+    }
+  }
+
+  bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_blob_t *os2_blob = hb_sanitize_context_t ().reference_table<OS2> (plan->source);
+    hb_blob_t *os2_prime_blob = hb_blob_create_sub_blob (os2_blob, 0, -1);
+    // TODO(grieger): move to hb_blob_copy_writable_or_fail
+    hb_blob_destroy (os2_blob);
+
+    OS2 *os2_prime = (OS2 *) hb_blob_get_data_writable (os2_prime_blob, nullptr);
+    if (unlikely (!os2_prime)) {
+      hb_blob_destroy (os2_prime_blob);
+      return false;
+    }
+
+    uint16_t min_cp, max_cp;
+    find_min_and_max_codepoint (plan->unicodes, &min_cp, &max_cp);
+    os2_prime->usFirstCharIndex.set (min_cp);
+    os2_prime->usLastCharIndex.set (max_cp);
+
+    _update_unicode_ranges (plan->unicodes, os2_prime->ulUnicodeRange);
+    bool result = plan->add_table (HB_OT_TAG_OS2, os2_prime_blob);
+
+    hb_blob_destroy (os2_prime_blob);
+    return result;
+  }
+
+  void _update_unicode_ranges (const hb_set_t *codepoints,
+			       HBUINT32 ulUnicodeRange[4]) const
+  {
+    for (unsigned int i = 0; i < 4; i++)
+      ulUnicodeRange[i].set (0);
+
+    hb_codepoint_t cp = HB_SET_VALUE_INVALID;
+    while (codepoints->next (&cp)) {
+      unsigned int bit = _hb_ot_os2_get_unicode_range_bit (cp);
+      if (bit < 128)
+      {
+	unsigned int block = bit / 32;
+	unsigned int bit_in_block = bit % 32;
+	unsigned int mask = 1 << bit_in_block;
+	ulUnicodeRange[block].set (ulUnicodeRange[block] | mask);
+      }
+      if (cp >= 0x10000 && cp <= 0x110000)
+      {
+	/* the spec says that bit 57 ("Non Plane 0") implies that there's
+	   at least one codepoint beyond the BMP; so I also include all
+	   the non-BMP codepoints here */
+	ulUnicodeRange[1].set (ulUnicodeRange[1] | (1 << 25));
+      }
+    }
+  }
+
+  static void find_min_and_max_codepoint (const hb_set_t *codepoints,
+						 uint16_t *min_cp, /* OUT */
+						 uint16_t *max_cp  /* OUT */)
+  {
+    *min_cp = codepoints->get_min ();
+    *max_cp = codepoints->get_max ();
+  }
+
+  enum font_page_t {
+    HEBREW_FONT_PAGE		= 0xB100, // Hebrew Windows 3.1 font page
+    SIMP_ARABIC_FONT_PAGE	= 0xB200, // Simplified Arabic Windows 3.1 font page
+    TRAD_ARABIC_FONT_PAGE	= 0xB300, // Traditional Arabic Windows 3.1 font page
+    OEM_ARABIC_FONT_PAGE	= 0xB400, // OEM Arabic Windows 3.1 font page
+    SIMP_FARSI_FONT_PAGE	= 0xBA00, // Simplified Farsi Windows 3.1 font page
+    TRAD_FARSI_FONT_PAGE	= 0xBB00, // Traditional Farsi Windows 3.1 font page
+    THAI_FONT_PAGE		= 0xDE00  // Thai Windows 3.1 font page
+  };
+
+  // https://github.com/Microsoft/Font-Validator/blob/520aaae/OTFontFileVal/val_OS2.cs#L644-L681
+  font_page_t get_font_page () const
+  { return (font_page_t) (version == 0 ? fsSelection & 0xFF00 : 0); }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!c->check_struct (this))) return_trace (false);
+    if (unlikely (version >= 1 && !v1X.sanitize (c))) return_trace (false);
+    if (unlikely (version >= 2 && !v2X.sanitize (c))) return_trace (false);
+    if (unlikely (version >= 5 && !v5X.sanitize (c))) return_trace (false);
+    return_trace (true);
+  }
+
+  public:
+  HBUINT16	version;
+  HBINT16	xAvgCharWidth;
+  HBUINT16	usWeightClass;
+  HBUINT16	usWidthClass;
+  HBUINT16	fsType;
+  HBINT16	ySubscriptXSize;
+  HBINT16	ySubscriptYSize;
+  HBINT16	ySubscriptXOffset;
+  HBINT16	ySubscriptYOffset;
+  HBINT16	ySuperscriptXSize;
+  HBINT16	ySuperscriptYSize;
+  HBINT16	ySuperscriptXOffset;
+  HBINT16	ySuperscriptYOffset;
+  HBINT16	yStrikeoutSize;
+  HBINT16	yStrikeoutPosition;
+  HBINT16	sFamilyClass;
+  HBUINT8	panose[10];
+  HBUINT32	ulUnicodeRange[4];
+  Tag		achVendID;
+  HBUINT16	fsSelection;
+  HBUINT16	usFirstCharIndex;
+  HBUINT16	usLastCharIndex;
+  HBINT16	sTypoAscender;
+  HBINT16	sTypoDescender;
+  HBINT16	sTypoLineGap;
+  HBUINT16	usWinAscent;
+  HBUINT16	usWinDescent;
+  OS2V1Tail	v1X;
+  OS2V2Tail	v2X;
+  OS2V5Tail	v5X;
+  public:
+  DEFINE_SIZE_MIN (78);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_OS2_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-os2-unicode-ranges.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-os2-unicode-ranges.hh
new file mode 100644
index 0000000..b0ccd00
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-os2-unicode-ranges.hh
@@ -0,0 +1,247 @@
+/*
+ * Copyright © 2018  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): Garret Rieger
+ */
+
+#ifndef HB_OT_OS2_UNICODE_RANGES_HH
+#define HB_OT_OS2_UNICODE_RANGES_HH
+
+#include "hb.hh"
+
+namespace OT {
+
+struct OS2Range
+{
+  static int
+  cmp (const void *_key, const void *_item)
+  {
+    hb_codepoint_t cp = *((hb_codepoint_t *) _key);
+    const OS2Range *range = (OS2Range *) _item;
+
+    if (cp < range->start)
+      return -1;
+    else if (cp <= range->end)
+      return 0;
+    else
+      return +1;
+  }
+
+  hb_codepoint_t start;
+  hb_codepoint_t end;
+  unsigned int bit;
+};
+
+/* Note: The contents of this array was generated using gen-os2-unicode-ranges.py. */
+static const OS2Range _hb_os2_unicode_ranges[] =
+{
+  {     0x0,     0x7F,   0}, // Basic Latin
+  {    0x80,     0xFF,   1}, // Latin-1 Supplement
+  {   0x100,    0x17F,   2}, // Latin Extended-A
+  {   0x180,    0x24F,   3}, // Latin Extended-B
+  {   0x250,    0x2AF,   4}, // IPA Extensions
+  {   0x2B0,    0x2FF,   5}, // Spacing Modifier Letters
+  {   0x300,    0x36F,   6}, // Combining Diacritical Marks
+  {   0x370,    0x3FF,   7}, // Greek and Coptic
+  {   0x400,    0x4FF,   9}, // Cyrillic
+  {   0x500,    0x52F,   9}, // Cyrillic Supplement
+  {   0x530,    0x58F,  10}, // Armenian
+  {   0x590,    0x5FF,  11}, // Hebrew
+  {   0x600,    0x6FF,  13}, // Arabic
+  {   0x700,    0x74F,  71}, // Syriac
+  {   0x750,    0x77F,  13}, // Arabic Supplement
+  {   0x780,    0x7BF,  72}, // Thaana
+  {   0x7C0,    0x7FF,  14}, // NKo
+  {   0x900,    0x97F,  15}, // Devanagari
+  {   0x980,    0x9FF,  16}, // Bengali
+  {   0xA00,    0xA7F,  17}, // Gurmukhi
+  {   0xA80,    0xAFF,  18}, // Gujarati
+  {   0xB00,    0xB7F,  19}, // Oriya
+  {   0xB80,    0xBFF,  20}, // Tamil
+  {   0xC00,    0xC7F,  21}, // Telugu
+  {   0xC80,    0xCFF,  22}, // Kannada
+  {   0xD00,    0xD7F,  23}, // Malayalam
+  {   0xD80,    0xDFF,  73}, // Sinhala
+  {   0xE00,    0xE7F,  24}, // Thai
+  {   0xE80,    0xEFF,  25}, // Lao
+  {   0xF00,    0xFFF,  70}, // Tibetan
+  {  0x1000,   0x109F,  74}, // Myanmar
+  {  0x10A0,   0x10FF,  26}, // Georgian
+  {  0x1100,   0x11FF,  28}, // Hangul Jamo
+  {  0x1200,   0x137F,  75}, // Ethiopic
+  {  0x1380,   0x139F,  75}, // Ethiopic Supplement
+  {  0x13A0,   0x13FF,  76}, // Cherokee
+  {  0x1400,   0x167F,  77}, // Unified Canadian Aboriginal Syllabics
+  {  0x1680,   0x169F,  78}, // Ogham
+  {  0x16A0,   0x16FF,  79}, // Runic
+  {  0x1700,   0x171F,  84}, // Tagalog
+  {  0x1720,   0x173F,  84}, // Hanunoo
+  {  0x1740,   0x175F,  84}, // Buhid
+  {  0x1760,   0x177F,  84}, // Tagbanwa
+  {  0x1780,   0x17FF,  80}, // Khmer
+  {  0x1800,   0x18AF,  81}, // Mongolian
+  {  0x1900,   0x194F,  93}, // Limbu
+  {  0x1950,   0x197F,  94}, // Tai Le
+  {  0x1980,   0x19DF,  95}, // New Tai Lue
+  {  0x19E0,   0x19FF,  80}, // Khmer Symbols
+  {  0x1A00,   0x1A1F,  96}, // Buginese
+  {  0x1B00,   0x1B7F,  27}, // Balinese
+  {  0x1B80,   0x1BBF, 112}, // Sundanese
+  {  0x1C00,   0x1C4F, 113}, // Lepcha
+  {  0x1C50,   0x1C7F, 114}, // Ol Chiki
+  {  0x1D00,   0x1D7F,   4}, // Phonetic Extensions
+  {  0x1D80,   0x1DBF,   4}, // Phonetic Extensions Supplement
+  {  0x1DC0,   0x1DFF,   6}, // Combining Diacritical Marks Supplement
+  {  0x1E00,   0x1EFF,  29}, // Latin Extended Additional
+  {  0x1F00,   0x1FFF,  30}, // Greek Extended
+  {  0x2000,   0x206F,  31}, // General Punctuation
+  {  0x2070,   0x209F,  32}, // Superscripts And Subscripts
+  {  0x20A0,   0x20CF,  33}, // Currency Symbols
+  {  0x20D0,   0x20FF,  34}, // Combining Diacritical Marks For Symbols
+  {  0x2100,   0x214F,  35}, // Letterlike Symbols
+  {  0x2150,   0x218F,  36}, // Number Forms
+  {  0x2190,   0x21FF,  37}, // Arrows
+  {  0x2200,   0x22FF,  38}, // Mathematical Operators
+  {  0x2300,   0x23FF,  39}, // Miscellaneous Technical
+  {  0x2400,   0x243F,  40}, // Control Pictures
+  {  0x2440,   0x245F,  41}, // Optical Character Recognition
+  {  0x2460,   0x24FF,  42}, // Enclosed Alphanumerics
+  {  0x2500,   0x257F,  43}, // Box Drawing
+  {  0x2580,   0x259F,  44}, // Block Elements
+  {  0x25A0,   0x25FF,  45}, // Geometric Shapes
+  {  0x2600,   0x26FF,  46}, // Miscellaneous Symbols
+  {  0x2700,   0x27BF,  47}, // Dingbats
+  {  0x27C0,   0x27EF,  38}, // Miscellaneous Mathematical Symbols-A
+  {  0x27F0,   0x27FF,  37}, // Supplemental Arrows-A
+  {  0x2800,   0x28FF,  82}, // Braille Patterns
+  {  0x2900,   0x297F,  37}, // Supplemental Arrows-B
+  {  0x2980,   0x29FF,  38}, // Miscellaneous Mathematical Symbols-B
+  {  0x2A00,   0x2AFF,  38}, // Supplemental Mathematical Operators
+  {  0x2B00,   0x2BFF,  37}, // Miscellaneous Symbols and Arrows
+  {  0x2C00,   0x2C5F,  97}, // Glagolitic
+  {  0x2C60,   0x2C7F,  29}, // Latin Extended-C
+  {  0x2C80,   0x2CFF,   8}, // Coptic
+  {  0x2D00,   0x2D2F,  26}, // Georgian Supplement
+  {  0x2D30,   0x2D7F,  98}, // Tifinagh
+  {  0x2D80,   0x2DDF,  75}, // Ethiopic Extended
+  {  0x2DE0,   0x2DFF,   9}, // Cyrillic Extended-A
+  {  0x2E00,   0x2E7F,  31}, // Supplemental Punctuation
+  {  0x2E80,   0x2EFF,  59}, // CJK Radicals Supplement
+  {  0x2F00,   0x2FDF,  59}, // Kangxi Radicals
+  {  0x2FF0,   0x2FFF,  59}, // Ideographic Description Characters
+  {  0x3000,   0x303F,  48}, // CJK Symbols And Punctuation
+  {  0x3040,   0x309F,  49}, // Hiragana
+  {  0x30A0,   0x30FF,  50}, // Katakana
+  {  0x3100,   0x312F,  51}, // Bopomofo
+  {  0x3130,   0x318F,  52}, // Hangul Compatibility Jamo
+  {  0x3190,   0x319F,  59}, // Kanbun
+  {  0x31A0,   0x31BF,  51}, // Bopomofo Extended
+  {  0x31C0,   0x31EF,  61}, // CJK Strokes
+  {  0x31F0,   0x31FF,  50}, // Katakana Phonetic Extensions
+  {  0x3200,   0x32FF,  54}, // Enclosed CJK Letters And Months
+  {  0x3300,   0x33FF,  55}, // CJK Compatibility
+  {  0x3400,   0x4DBF,  59}, // CJK Unified Ideographs Extension A
+  {  0x4DC0,   0x4DFF,  99}, // Yijing Hexagram Symbols
+  {  0x4E00,   0x9FFF,  59}, // CJK Unified Ideographs
+  {  0xA000,   0xA48F,  83}, // Yi Syllables
+  {  0xA490,   0xA4CF,  83}, // Yi Radicals
+  {  0xA500,   0xA63F,  12}, // Vai
+  {  0xA640,   0xA69F,   9}, // Cyrillic Extended-B
+  {  0xA700,   0xA71F,   5}, // Modifier Tone Letters
+  {  0xA720,   0xA7FF,  29}, // Latin Extended-D
+  {  0xA800,   0xA82F, 100}, // Syloti Nagri
+  {  0xA840,   0xA87F,  53}, // Phags-pa
+  {  0xA880,   0xA8DF, 115}, // Saurashtra
+  {  0xA900,   0xA92F, 116}, // Kayah Li
+  {  0xA930,   0xA95F, 117}, // Rejang
+  {  0xAA00,   0xAA5F, 118}, // Cham
+  {  0xAC00,   0xD7AF,  56}, // Hangul Syllables
+  {  0xD800,   0xDFFF,  57}, // Non-Plane 0 *
+  {  0xE000,   0xF8FF,  60}, // Private Use Area (plane 0)
+  {  0xF900,   0xFAFF,  61}, // CJK Compatibility Ideographs
+  {  0xFB00,   0xFB4F,  62}, // Alphabetic Presentation Forms
+  {  0xFB50,   0xFDFF,  63}, // Arabic Presentation Forms-A
+  {  0xFE00,   0xFE0F,  91}, // Variation Selectors
+  {  0xFE10,   0xFE1F,  65}, // Vertical Forms
+  {  0xFE20,   0xFE2F,  64}, // Combining Half Marks
+  {  0xFE30,   0xFE4F,  65}, // CJK Compatibility Forms
+  {  0xFE50,   0xFE6F,  66}, // Small Form Variants
+  {  0xFE70,   0xFEFF,  67}, // Arabic Presentation Forms-B
+  {  0xFF00,   0xFFEF,  68}, // Halfwidth And Fullwidth Forms
+  {  0xFFF0,   0xFFFF,  69}, // Specials
+  { 0x10000,  0x1007F, 101}, // Linear B Syllabary
+  { 0x10080,  0x100FF, 101}, // Linear B Ideograms
+  { 0x10100,  0x1013F, 101}, // Aegean Numbers
+  { 0x10140,  0x1018F, 102}, // Ancient Greek Numbers
+  { 0x10190,  0x101CF, 119}, // Ancient Symbols
+  { 0x101D0,  0x101FF, 120}, // Phaistos Disc
+  { 0x10280,  0x1029F, 121}, // Lycian
+  { 0x102A0,  0x102DF, 121}, // Carian
+  { 0x10300,  0x1032F,  85}, // Old Italic
+  { 0x10330,  0x1034F,  86}, // Gothic
+  { 0x10380,  0x1039F, 103}, // Ugaritic
+  { 0x103A0,  0x103DF, 104}, // Old Persian
+  { 0x10400,  0x1044F,  87}, // Deseret
+  { 0x10450,  0x1047F, 105}, // Shavian
+  { 0x10480,  0x104AF, 106}, // Osmanya
+  { 0x10800,  0x1083F, 107}, // Cypriot Syllabary
+  { 0x10900,  0x1091F,  58}, // Phoenician
+  { 0x10920,  0x1093F, 121}, // Lydian
+  { 0x10A00,  0x10A5F, 108}, // Kharoshthi
+  { 0x12000,  0x123FF, 110}, // Cuneiform
+  { 0x12400,  0x1247F, 110}, // Cuneiform Numbers and Punctuation
+  { 0x1D000,  0x1D0FF,  88}, // Byzantine Musical Symbols
+  { 0x1D100,  0x1D1FF,  88}, // Musical Symbols
+  { 0x1D200,  0x1D24F,  88}, // Ancient Greek Musical Notation
+  { 0x1D300,  0x1D35F, 109}, // Tai Xuan Jing Symbols
+  { 0x1D360,  0x1D37F, 111}, // Counting Rod Numerals
+  { 0x1D400,  0x1D7FF,  89}, // Mathematical Alphanumeric Symbols
+  { 0x1F000,  0x1F02F, 122}, // Mahjong Tiles
+  { 0x1F030,  0x1F09F, 122}, // Domino Tiles
+  { 0x20000,  0x2A6DF,  59}, // CJK Unified Ideographs Extension B
+  { 0x2F800,  0x2FA1F,  61}, // CJK Compatibility Ideographs Supplement
+  { 0xE0000,  0xE007F,  92}, // Tags
+  { 0xE0100,  0xE01EF,  91}, // Variation Selectors Supplement
+  { 0xF0000,  0xFFFFD,  90}, // Private Use (plane 15)
+  {0x100000, 0x10FFFD,  90}, // Private Use (plane 16)
+};
+
+/**
+ * _hb_ot_os2_get_unicode_range_bit:
+ * Returns the bit to be set in os/2 ulUnicodeOS2Range for a given codepoint.
+ **/
+static unsigned int
+_hb_ot_os2_get_unicode_range_bit (hb_codepoint_t cp)
+{
+  OS2Range *range = (OS2Range*) hb_bsearch (&cp, _hb_os2_unicode_ranges,
+					    ARRAY_LENGTH (_hb_os2_unicode_ranges),
+					    sizeof (OS2Range),
+					    OS2Range::cmp);
+  if (range != nullptr)
+    return range->bit;
+  return -1;
+}
+
+} /* namespace OT */
+
+#endif /* HB_OT_OS2_UNICODE_RANGES_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-post-macroman.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-post-macroman.hh
new file mode 100644
index 0000000..b4df8aaee
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-post-macroman.hh
@@ -0,0 +1,294 @@
+/*
+ * Copyright © 2017  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_MACROMAN_HH
+#if 0 /* Make checks happy. */
+#define HB_OT_POST_MACROMAN_HH
+#include "hb.hh"
+#endif
+
+
+_S(".notdef")
+_S(".null")
+_S("nonmarkingreturn")
+_S("space")
+_S("exclam")
+_S("quotedbl")
+_S("numbersign")
+_S("dollar")
+_S("percent")
+_S("ampersand")
+_S("quotesingle")
+_S("parenleft")
+_S("parenright")
+_S("asterisk")
+_S("plus")
+_S("comma")
+_S("hyphen")
+_S("period")
+_S("slash")
+_S("zero")
+_S("one")
+_S("two")
+_S("three")
+_S("four")
+_S("five")
+_S("six")
+_S("seven")
+_S("eight")
+_S("nine")
+_S("colon")
+_S("semicolon")
+_S("less")
+_S("equal")
+_S("greater")
+_S("question")
+_S("at")
+_S("A")
+_S("B")
+_S("C")
+_S("D")
+_S("E")
+_S("F")
+_S("G")
+_S("H")
+_S("I")
+_S("J")
+_S("K")
+_S("L")
+_S("M")
+_S("N")
+_S("O")
+_S("P")
+_S("Q")
+_S("R")
+_S("S")
+_S("T")
+_S("U")
+_S("V")
+_S("W")
+_S("X")
+_S("Y")
+_S("Z")
+_S("bracketleft")
+_S("backslash")
+_S("bracketright")
+_S("asciicircum")
+_S("underscore")
+_S("grave")
+_S("a")
+_S("b")
+_S("c")
+_S("d")
+_S("e")
+_S("f")
+_S("g")
+_S("h")
+_S("i")
+_S("j")
+_S("k")
+_S("l")
+_S("m")
+_S("n")
+_S("o")
+_S("p")
+_S("q")
+_S("r")
+_S("s")
+_S("t")
+_S("u")
+_S("v")
+_S("w")
+_S("x")
+_S("y")
+_S("z")
+_S("braceleft")
+_S("bar")
+_S("braceright")
+_S("asciitilde")
+_S("Adieresis")
+_S("Aring")
+_S("Ccedilla")
+_S("Eacute")
+_S("Ntilde")
+_S("Odieresis")
+_S("Udieresis")
+_S("aacute")
+_S("agrave")
+_S("acircumflex")
+_S("adieresis")
+_S("atilde")
+_S("aring")
+_S("ccedilla")
+_S("eacute")
+_S("egrave")
+_S("ecircumflex")
+_S("edieresis")
+_S("iacute")
+_S("igrave")
+_S("icircumflex")
+_S("idieresis")
+_S("ntilde")
+_S("oacute")
+_S("ograve")
+_S("ocircumflex")
+_S("odieresis")
+_S("otilde")
+_S("uacute")
+_S("ugrave")
+_S("ucircumflex")
+_S("udieresis")
+_S("dagger")
+_S("degree")
+_S("cent")
+_S("sterling")
+_S("section")
+_S("bullet")
+_S("paragraph")
+_S("germandbls")
+_S("registered")
+_S("copyright")
+_S("trademark")
+_S("acute")
+_S("dieresis")
+_S("notequal")
+_S("AE")
+_S("Oslash")
+_S("infinity")
+_S("plusminus")
+_S("lessequal")
+_S("greaterequal")
+_S("yen")
+_S("mu")
+_S("partialdiff")
+_S("summation")
+_S("product")
+_S("pi")
+_S("integral")
+_S("ordfeminine")
+_S("ordmasculine")
+_S("Omega")
+_S("ae")
+_S("oslash")
+_S("questiondown")
+_S("exclamdown")
+_S("logicalnot")
+_S("radical")
+_S("florin")
+_S("approxequal")
+_S("Delta")
+_S("guillemotleft")
+_S("guillemotright")
+_S("ellipsis")
+_S("nonbreakingspace")
+_S("Agrave")
+_S("Atilde")
+_S("Otilde")
+_S("OE")
+_S("oe")
+_S("endash")
+_S("emdash")
+_S("quotedblleft")
+_S("quotedblright")
+_S("quoteleft")
+_S("quoteright")
+_S("divide")
+_S("lozenge")
+_S("ydieresis")
+_S("Ydieresis")
+_S("fraction")
+_S("currency")
+_S("guilsinglleft")
+_S("guilsinglright")
+_S("fi")
+_S("fl")
+_S("daggerdbl")
+_S("periodcentered")
+_S("quotesinglbase")
+_S("quotedblbase")
+_S("perthousand")
+_S("Acircumflex")
+_S("Ecircumflex")
+_S("Aacute")
+_S("Edieresis")
+_S("Egrave")
+_S("Iacute")
+_S("Icircumflex")
+_S("Idieresis")
+_S("Igrave")
+_S("Oacute")
+_S("Ocircumflex")
+_S("apple")
+_S("Ograve")
+_S("Uacute")
+_S("Ucircumflex")
+_S("Ugrave")
+_S("dotlessi")
+_S("circumflex")
+_S("tilde")
+_S("macron")
+_S("breve")
+_S("dotaccent")
+_S("ring")
+_S("cedilla")
+_S("hungarumlaut")
+_S("ogonek")
+_S("caron")
+_S("Lslash")
+_S("lslash")
+_S("Scaron")
+_S("scaron")
+_S("Zcaron")
+_S("zcaron")
+_S("brokenbar")
+_S("Eth")
+_S("eth")
+_S("Yacute")
+_S("yacute")
+_S("Thorn")
+_S("thorn")
+_S("minus")
+_S("multiply")
+_S("onesuperior")
+_S("twosuperior")
+_S("threesuperior")
+_S("onehalf")
+_S("onequarter")
+_S("threequarters")
+_S("franc")
+_S("Gbreve")
+_S("gbreve")
+_S("Idotaccent")
+_S("Scedilla")
+_S("scedilla")
+_S("Cacute")
+_S("cacute")
+_S("Ccaron")
+_S("ccaron")
+_S("dcroat")
+
+
+#endif /* HB_OT_POST_MACROMAN_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-post-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-post-table.hh
new file mode 100644
index 0000000..43c1143
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-post-table.hh
@@ -0,0 +1,299 @@
+/*
+ * 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.hh"
+
+#define HB_STRING_ARRAY_NAME format1_names
+#define HB_STRING_ARRAY_LIST "hb-ot-post-macroman.hh"
+#include "hb-string-array.hh"
+#undef HB_STRING_ARRAY_LIST
+#undef HB_STRING_ARRAY_NAME
+
+#define NUM_FORMAT1_NAMES 258
+
+/*
+ * post -- PostScript
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/post
+ */
+#define HB_OT_TAG_post HB_TAG('p','o','s','t')
+
+
+namespace OT {
+
+
+struct postV2Tail
+{
+  friend struct post;
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (glyphNameIndex.sanitize (c));
+  }
+
+  protected:
+  ArrayOf<HBUINT16>	glyphNameIndex;	/* This is not an offset, but is the
+					 * ordinal number of the glyph in 'post'
+					 * string tables. */
+/*UnsizedArrayOf<HBUINT8>
+			namesX;*/	/* Glyph names with length bytes [variable]
+					 * (a Pascal string). */
+
+  public:
+  DEFINE_SIZE_ARRAY (2, glyphNameIndex);
+};
+
+struct post
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_post;
+
+  bool subset (hb_subset_plan_t *plan) const
+  {
+    unsigned int post_prime_length;
+    hb_blob_t *post_blob = hb_sanitize_context_t ().reference_table<post>(plan->source);
+    hb_blob_t *post_prime_blob = hb_blob_create_sub_blob (post_blob, 0, post::min_size);
+    post *post_prime = (post *) hb_blob_get_data_writable (post_prime_blob, &post_prime_length);
+    hb_blob_destroy (post_blob);
+
+    if (unlikely (!post_prime || post_prime_length != post::min_size))
+    {
+      hb_blob_destroy (post_prime_blob);
+      DEBUG_MSG(SUBSET, nullptr, "Invalid source post table with length %d.", post_prime_length);
+      return false;
+    }
+
+    post_prime->version.major.set (3); // Version 3 does not have any glyph names.
+    bool result = plan->add_table (HB_OT_TAG_post, post_prime_blob);
+    hb_blob_destroy (post_prime_blob);
+
+    return result;
+  }
+
+  struct accelerator_t
+  {
+    void init (hb_face_t *face)
+    {
+      index_to_offset.init ();
+
+      table = hb_sanitize_context_t ().reference_table<post> (face);
+      unsigned int table_length = table.get_length ();
+
+      version = table->version.to_int ();
+      if (version != 0x00020000) return;
+
+      const postV2Tail &v2 = table->v2X;
+
+      glyphNameIndex = &v2.glyphNameIndex;
+      pool = &StructAfter<uint8_t> (v2.glyphNameIndex);
+
+      const uint8_t *end = (const uint8_t *) (const void *) table + table_length;
+      for (const uint8_t *data = pool;
+	   index_to_offset.length < 65535 && data < end && data + *data < end;
+	   data += 1 + *data)
+	index_to_offset.push (data - pool);
+    }
+    void fini ()
+    {
+      index_to_offset.fini ();
+      free (gids_sorted_by_name.get ());
+      table.destroy ();
+    }
+
+    bool get_glyph_name (hb_codepoint_t glyph,
+			 char *buf, unsigned int buf_len) const
+    {
+      hb_bytes_t s = find_glyph_name (glyph);
+      if (!s.length) return false;
+      if (!buf_len) return true;
+      unsigned int len = MIN (buf_len - 1, s.length);
+      strncpy (buf, s.arrayZ, len);
+      buf[len] = '\0';
+      return true;
+    }
+
+    bool get_glyph_from_name (const char *name, int len,
+			      hb_codepoint_t *glyph) const
+    {
+      unsigned int count = get_glyph_count ();
+      if (unlikely (!count)) return false;
+
+      if (len < 0) len = strlen (name);
+
+      if (unlikely (!len)) return false;
+
+    retry:
+      uint16_t *gids = gids_sorted_by_name.get ();
+
+      if (unlikely (!gids))
+      {
+	gids = (uint16_t *) malloc (count * sizeof (gids[0]));
+	if (unlikely (!gids))
+	  return false; /* Anything better?! */
+
+	for (unsigned int i = 0; i < count; i++)
+	  gids[i] = i;
+	hb_sort_r (gids, count, sizeof (gids[0]), cmp_gids, (void *) this);
+
+	if (unlikely (!gids_sorted_by_name.cmpexch (nullptr, gids)))
+	{
+	  free (gids);
+	  goto retry;
+	}
+      }
+
+      hb_bytes_t st (name, len);
+      const uint16_t *gid = (const uint16_t *) hb_bsearch_r (hb_addressof (st), gids, count,
+							     sizeof (gids[0]), cmp_key, (void *) this);
+      if (gid)
+      {
+	*glyph = *gid;
+	return true;
+      }
+
+      return false;
+    }
+
+    protected:
+
+    unsigned int get_glyph_count () const
+    {
+      if (version == 0x00010000)
+	return NUM_FORMAT1_NAMES;
+
+      if (version == 0x00020000)
+	return glyphNameIndex->len;
+
+      return 0;
+    }
+
+    static int cmp_gids (const void *pa, const void *pb, void *arg)
+    {
+      const accelerator_t *thiz = (const accelerator_t *) arg;
+      uint16_t a = * (const uint16_t *) pa;
+      uint16_t b = * (const uint16_t *) pb;
+      return thiz->find_glyph_name (b).cmp (thiz->find_glyph_name (a));
+    }
+
+    static int cmp_key (const void *pk, const void *po, void *arg)
+    {
+      const accelerator_t *thiz = (const accelerator_t *) arg;
+      const hb_bytes_t *key = (const hb_bytes_t *) pk;
+      uint16_t o = * (const uint16_t *) po;
+      return thiz->find_glyph_name (o).cmp (*key);
+    }
+
+    hb_bytes_t find_glyph_name (hb_codepoint_t glyph) const
+    {
+      if (version == 0x00010000)
+      {
+	if (glyph >= NUM_FORMAT1_NAMES)
+	  return hb_bytes_t ();
+
+	return format1_names (glyph);
+      }
+
+      if (version != 0x00020000 || glyph >= glyphNameIndex->len)
+	return hb_bytes_t ();
+
+      unsigned int index = glyphNameIndex->arrayZ[glyph];
+      if (index < NUM_FORMAT1_NAMES)
+	return format1_names (index);
+      index -= NUM_FORMAT1_NAMES;
+
+      if (index >= index_to_offset.length)
+	return hb_bytes_t ();
+      unsigned int offset = index_to_offset[index];
+
+      const uint8_t *data = pool + offset;
+      unsigned int name_length = *data;
+      data++;
+
+      return hb_bytes_t ((const char *) data, name_length);
+    }
+
+    private:
+    hb_blob_ptr_t<post> table;
+    uint32_t version;
+    const ArrayOf<HBUINT16> *glyphNameIndex;
+    hb_vector_t<uint32_t> index_to_offset;
+    const uint8_t *pool;
+    hb_atomic_ptr_t<uint16_t *> gids_sorted_by_name;
+  };
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  (version.to_int () == 0x00010000 ||
+			   (version.to_int () == 0x00020000 && v2X.sanitize (c)) ||
+			   version.to_int () == 0x00030000)));
+  }
+
+  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. */
+  HBUINT32	isFixedPitch;		/* Set to 0 if the font is proportionally
+					 * spaced, non-zero if the font is not
+					 * proportionally spaced (i.e. monospaced). */
+  HBUINT32	minMemType42;		/* Minimum memory usage when an OpenType font
+					 * is downloaded. */
+  HBUINT32	maxMemType42;		/* Maximum memory usage when an OpenType font
+					 * is downloaded. */
+  HBUINT32	minMemType1;		/* Minimum memory usage when an OpenType font
+					 * is downloaded as a Type 1 font. */
+  HBUINT32	maxMemType1;		/* Maximum memory usage when an OpenType font
+					 * is downloaded as a Type 1 font. */
+  postV2Tail	v2X;
+  DEFINE_SIZE_MIN (32);
+};
+
+struct post_accelerator_t : post::accelerator_t {};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_POST_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic-fallback.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic-fallback.hh
new file mode 100644
index 0000000..2a1f2f8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic-fallback.hh
@@ -0,0 +1,345 @@
+/*
+ * Copyright © 2012  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_SHAPE_COMPLEX_ARABIC_FALLBACK_HH
+#define HB_OT_SHAPE_COMPLEX_ARABIC_FALLBACK_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape.hh"
+#include "hb-ot-layout-gsub-table.hh"
+
+
+/* Features ordered the same as the entries in shaping_table rows,
+ * followed by rlig.  Don't change. */
+static const hb_tag_t arabic_fallback_features[] =
+{
+  HB_TAG('i','n','i','t'),
+  HB_TAG('m','e','d','i'),
+  HB_TAG('f','i','n','a'),
+  HB_TAG('i','s','o','l'),
+  HB_TAG('r','l','i','g'),
+};
+
+static OT::SubstLookup *
+arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUSED,
+					  hb_font_t *font,
+					  unsigned int feature_index)
+{
+  OT::GlyphID glyphs[SHAPING_TABLE_LAST - SHAPING_TABLE_FIRST + 1];
+  OT::GlyphID substitutes[SHAPING_TABLE_LAST - SHAPING_TABLE_FIRST + 1];
+  unsigned int num_glyphs = 0;
+
+  /* Populate arrays */
+  for (hb_codepoint_t u = SHAPING_TABLE_FIRST; u < SHAPING_TABLE_LAST + 1; u++)
+  {
+    hb_codepoint_t s = shaping_table[u - SHAPING_TABLE_FIRST][feature_index];
+    hb_codepoint_t u_glyph, s_glyph;
+
+    if (!s ||
+	!hb_font_get_glyph (font, u, 0, &u_glyph) ||
+	!hb_font_get_glyph (font, s, 0, &s_glyph) ||
+	u_glyph == s_glyph ||
+	u_glyph > 0xFFFFu || s_glyph > 0xFFFFu)
+      continue;
+
+    glyphs[num_glyphs].set (u_glyph);
+    substitutes[num_glyphs].set (s_glyph);
+
+    num_glyphs++;
+  }
+
+  if (!num_glyphs)
+    return nullptr;
+
+  /* Bubble-sort or something equally good!
+   * May not be good-enough for presidential candidate interviews, but good-enough for us... */
+  hb_stable_sort (&glyphs[0], num_glyphs, (int(*)(const OT::GlyphID*, const OT::GlyphID *)) OT::GlyphID::cmp, &substitutes[0]);
+
+
+  /* Each glyph takes four bytes max, and there's some overhead. */
+  char buf[(SHAPING_TABLE_LAST - SHAPING_TABLE_FIRST + 1) * 4 + 128];
+  hb_serialize_context_t c (buf, sizeof (buf));
+  OT::SubstLookup *lookup = c.start_serialize<OT::SubstLookup> ();
+  bool ret = lookup->serialize_single (&c,
+				       OT::LookupFlag::IgnoreMarks,
+				       hb_array (glyphs, num_glyphs),
+				       hb_array (substitutes, num_glyphs));
+  c.end_serialize ();
+  /* TODO sanitize the results? */
+
+  return ret ? c.copy<OT::SubstLookup> () : nullptr;
+}
+
+static OT::SubstLookup *
+arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UNUSED,
+					    hb_font_t *font)
+{
+  OT::GlyphID first_glyphs[ARRAY_LENGTH_CONST (ligature_table)];
+  unsigned int first_glyphs_indirection[ARRAY_LENGTH_CONST (ligature_table)];
+  unsigned int ligature_per_first_glyph_count_list[ARRAY_LENGTH_CONST (first_glyphs)];
+  unsigned int num_first_glyphs = 0;
+
+  /* We know that all our ligatures are 2-component */
+  OT::GlyphID ligature_list[ARRAY_LENGTH_CONST (first_glyphs) * ARRAY_LENGTH_CONST(ligature_table[0].ligatures)];
+  unsigned int component_count_list[ARRAY_LENGTH_CONST (ligature_list)];
+  OT::GlyphID component_list[ARRAY_LENGTH_CONST (ligature_list) * 1/* One extra component per ligature */];
+  unsigned int num_ligatures = 0;
+
+  /* Populate arrays */
+
+  /* Sort out the first-glyphs */
+  for (unsigned int first_glyph_idx = 0; first_glyph_idx < ARRAY_LENGTH (first_glyphs); first_glyph_idx++)
+  {
+    hb_codepoint_t first_u = ligature_table[first_glyph_idx].first;
+    hb_codepoint_t first_glyph;
+    if (!hb_font_get_glyph (font, first_u, 0, &first_glyph))
+      continue;
+    first_glyphs[num_first_glyphs].set (first_glyph);
+    ligature_per_first_glyph_count_list[num_first_glyphs] = 0;
+    first_glyphs_indirection[num_first_glyphs] = first_glyph_idx;
+    num_first_glyphs++;
+  }
+  hb_stable_sort (&first_glyphs[0], num_first_glyphs, (int(*)(const OT::GlyphID*, const OT::GlyphID *)) OT::GlyphID::cmp, &first_glyphs_indirection[0]);
+
+  /* Now that the first-glyphs are sorted, walk again, populate ligatures. */
+  for (unsigned int i = 0; i < num_first_glyphs; i++)
+  {
+    unsigned int first_glyph_idx = first_glyphs_indirection[i];
+
+    for (unsigned int second_glyph_idx = 0; second_glyph_idx < ARRAY_LENGTH (ligature_table[0].ligatures); second_glyph_idx++)
+    {
+      hb_codepoint_t second_u   = ligature_table[first_glyph_idx].ligatures[second_glyph_idx].second;
+      hb_codepoint_t ligature_u = ligature_table[first_glyph_idx].ligatures[second_glyph_idx].ligature;
+      hb_codepoint_t second_glyph, ligature_glyph;
+      if (!second_u ||
+	  !hb_font_get_glyph (font, second_u,   0, &second_glyph) ||
+	  !hb_font_get_glyph (font, ligature_u, 0, &ligature_glyph))
+	continue;
+
+      ligature_per_first_glyph_count_list[i]++;
+
+      ligature_list[num_ligatures].set (ligature_glyph);
+      component_count_list[num_ligatures] = 2;
+      component_list[num_ligatures].set (second_glyph);
+      num_ligatures++;
+    }
+  }
+
+  if (!num_ligatures)
+    return nullptr;
+
+
+  /* 16 bytes per ligature ought to be enough... */
+  char buf[ARRAY_LENGTH_CONST (ligature_list) * 16 + 128];
+  hb_serialize_context_t c (buf, sizeof (buf));
+  OT::SubstLookup *lookup = c.start_serialize<OT::SubstLookup> ();
+  bool ret = lookup->serialize_ligature (&c,
+					 OT::LookupFlag::IgnoreMarks,
+					 hb_array (first_glyphs, num_first_glyphs),
+					 hb_array (ligature_per_first_glyph_count_list, num_first_glyphs),
+					 hb_array (ligature_list, num_ligatures),
+					 hb_array (component_count_list, num_ligatures),
+					 hb_array (component_list, num_ligatures));
+  c.end_serialize ();
+  /* TODO sanitize the results? */
+
+  return ret ? c.copy<OT::SubstLookup> () : nullptr;
+}
+
+static OT::SubstLookup *
+arabic_fallback_synthesize_lookup (const hb_ot_shape_plan_t *plan,
+				   hb_font_t *font,
+				   unsigned int feature_index)
+{
+  if (feature_index < 4)
+    return arabic_fallback_synthesize_lookup_single (plan, font, feature_index);
+  else
+    return arabic_fallback_synthesize_lookup_ligature (plan, font);
+}
+
+#define ARABIC_FALLBACK_MAX_LOOKUPS 5
+
+struct arabic_fallback_plan_t
+{
+  unsigned int num_lookups;
+  bool free_lookups;
+
+  hb_mask_t mask_array[ARABIC_FALLBACK_MAX_LOOKUPS];
+  OT::SubstLookup *lookup_array[ARABIC_FALLBACK_MAX_LOOKUPS];
+  OT::hb_ot_layout_lookup_accelerator_t accel_array[ARABIC_FALLBACK_MAX_LOOKUPS];
+};
+
+#if defined(_WIN32) && !defined(HB_NO_WIN1256)
+#define HB_WITH_WIN1256
+#endif
+
+#ifdef HB_WITH_WIN1256
+#include "hb-ot-shape-complex-arabic-win1256.hh"
+#endif
+
+struct ManifestLookup
+{
+  public:
+  OT::Tag tag;
+  OT::OffsetTo<OT::SubstLookup> lookupOffset;
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+typedef OT::ArrayOf<ManifestLookup> Manifest;
+
+static bool
+arabic_fallback_plan_init_win1256 (arabic_fallback_plan_t *fallback_plan HB_UNUSED,
+				   const hb_ot_shape_plan_t *plan HB_UNUSED,
+				   hb_font_t *font HB_UNUSED)
+{
+#ifdef HB_WITH_WIN1256
+  /* Does this font look like it's Windows-1256-encoded? */
+  hb_codepoint_t g;
+  if (!(hb_font_get_glyph (font, 0x0627u, 0, &g) && g == 199 /* ALEF */ &&
+	hb_font_get_glyph (font, 0x0644u, 0, &g) && g == 225 /* LAM */ &&
+	hb_font_get_glyph (font, 0x0649u, 0, &g) && g == 236 /* ALEF MAKSURA */ &&
+	hb_font_get_glyph (font, 0x064Au, 0, &g) && g == 237 /* YEH */ &&
+	hb_font_get_glyph (font, 0x0652u, 0, &g) && g == 250 /* SUKUN */))
+    return false;
+
+  const Manifest &manifest = reinterpret_cast<const Manifest&> (arabic_win1256_gsub_lookups.manifest);
+  static_assert (sizeof (arabic_win1256_gsub_lookups.manifestData) / sizeof (ManifestLookup)
+		 <= ARABIC_FALLBACK_MAX_LOOKUPS, "");
+  /* TODO sanitize the table? */
+
+  unsigned j = 0;
+  unsigned int count = manifest.len;
+  for (unsigned int i = 0; i < count; i++)
+  {
+    fallback_plan->mask_array[j] = plan->map.get_1_mask (manifest[i].tag);
+    if (fallback_plan->mask_array[j])
+    {
+      fallback_plan->lookup_array[j] = const_cast<OT::SubstLookup*> (&(&manifest+manifest[i].lookupOffset));
+      if (fallback_plan->lookup_array[j])
+      {
+	fallback_plan->accel_array[j].init (*fallback_plan->lookup_array[j]);
+	j++;
+      }
+    }
+  }
+
+  fallback_plan->num_lookups = j;
+  fallback_plan->free_lookups = false;
+
+  return j > 0;
+#else
+  return false;
+#endif
+}
+
+static bool
+arabic_fallback_plan_init_unicode (arabic_fallback_plan_t *fallback_plan,
+				   const hb_ot_shape_plan_t *plan,
+				   hb_font_t *font)
+{
+  static_assert ((ARRAY_LENGTH_CONST(arabic_fallback_features) <= ARABIC_FALLBACK_MAX_LOOKUPS), "");
+  unsigned int j = 0;
+  for (unsigned int i = 0; i < ARRAY_LENGTH(arabic_fallback_features) ; i++)
+  {
+    fallback_plan->mask_array[j] = plan->map.get_1_mask (arabic_fallback_features[i]);
+    if (fallback_plan->mask_array[j])
+    {
+      fallback_plan->lookup_array[j] = arabic_fallback_synthesize_lookup (plan, font, i);
+      if (fallback_plan->lookup_array[j])
+      {
+	fallback_plan->accel_array[j].init (*fallback_plan->lookup_array[j]);
+	j++;
+      }
+    }
+  }
+
+  fallback_plan->num_lookups = j;
+  fallback_plan->free_lookups = true;
+
+  return j > 0;
+}
+
+static arabic_fallback_plan_t *
+arabic_fallback_plan_create (const hb_ot_shape_plan_t *plan,
+			     hb_font_t *font)
+{
+  arabic_fallback_plan_t *fallback_plan = (arabic_fallback_plan_t *) calloc (1, sizeof (arabic_fallback_plan_t));
+  if (unlikely (!fallback_plan))
+    return const_cast<arabic_fallback_plan_t *> (&Null(arabic_fallback_plan_t));
+
+  fallback_plan->num_lookups = 0;
+  fallback_plan->free_lookups = false;
+
+  /* Try synthesizing GSUB table using Unicode Arabic Presentation Forms,
+   * in case the font has cmap entries for the presentation-forms characters. */
+  if (arabic_fallback_plan_init_unicode (fallback_plan, plan, font))
+    return fallback_plan;
+
+  /* See if this looks like a Windows-1256-encoded font.  If it does, use a
+   * hand-coded GSUB table. */
+  if (arabic_fallback_plan_init_win1256 (fallback_plan, plan, font))
+    return fallback_plan;
+
+  assert (fallback_plan->num_lookups == 0);
+  free (fallback_plan);
+  return const_cast<arabic_fallback_plan_t *> (&Null(arabic_fallback_plan_t));
+}
+
+static void
+arabic_fallback_plan_destroy (arabic_fallback_plan_t *fallback_plan)
+{
+  if (!fallback_plan || fallback_plan->num_lookups == 0)
+    return;
+
+  for (unsigned int i = 0; i < fallback_plan->num_lookups; i++)
+    if (fallback_plan->lookup_array[i])
+    {
+      fallback_plan->accel_array[i].fini ();
+      if (fallback_plan->free_lookups)
+	free (fallback_plan->lookup_array[i]);
+    }
+
+  free (fallback_plan);
+}
+
+static void
+arabic_fallback_plan_shape (arabic_fallback_plan_t *fallback_plan,
+			    hb_font_t *font,
+			    hb_buffer_t *buffer)
+{
+  OT::hb_ot_apply_context_t c (0, font, buffer);
+  for (unsigned int i = 0; i < fallback_plan->num_lookups; i++)
+    if (fallback_plan->lookup_array[i]) {
+      c.set_lookup_mask (fallback_plan->mask_array[i]);
+      hb_ot_layout_substitute_lookup (&c,
+				      *fallback_plan->lookup_array[i],
+				      fallback_plan->accel_array[i]);
+    }
+}
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_ARABIC_FALLBACK_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic-table.hh
new file mode 100644
index 0000000..9459aad
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic-table.hh
@@ -0,0 +1,425 @@
+/* == 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-11.0.0.txt
+ * # Date: 2018-02-21, 14:50:00 GMT [KW, RP]
+ * # Blocks-11.0.0.txt
+ * # Date: 2017-10-16, 24:39: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[] =
+{
+
+#define joining_offset_0x0600u 0
+
+  /* Arabic */
+
+  /* 0600 */ U,U,U,U,U,U,X,X,U,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 0620 */ D,U,R,R,R,R,D,R,D,R,D,D,D,D,D,R,R,R,R,D,D,D,D,D,D,D,D,D,D,D,D,D,
+  /* 0640 */ C,D,D,D,D,D,D,D,R,D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 0660 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,D,D,X,R,R,R,U,R,R,R,D,D,D,D,D,D,D,D,
+  /* 0680 */ D,D,D,D,D,D,D,D,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,D,D,D,D,D,D,
+  /* 06A0 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+  /* 06C0 */ R,D,D,R,R,R,R,R,R,R,R,R,D,R,D,R,D,D,R,R,X,R,X,X,X,X,X,X,X,U,X,X,
+  /* 06E0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,R,R,X,X,X,X,X,X,X,X,X,X,D,D,D,X,X,D,
+
+  /* Syriac */
+
+  /* 0700 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,T,A,X,D,D,D,DR,DR,R,R,R,D,D,D,D,R,D,
+  /* 0720 */ D,D,D,D,D,D,D,D,R,D,DR,D,R,D,D,DR,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 0740 */ X,X,X,X,X,X,X,X,X,X,X,X,X,R,D,D,
+
+  /* Arabic Supplement */
+
+  /* 0740 */                                 D,D,D,D,D,D,D,D,D,R,R,R,D,D,D,D,
+  /* 0760 */ D,D,D,D,D,D,D,D,D,D,D,R,R,D,D,D,D,R,D,R,R,D,D,D,R,R,D,D,D,D,D,D,
+
+  /* FILLER */
+
+  /* 0780 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 07A0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+
+  /* NKo */
+
+  /* 07C0 */ X,X,X,X,X,X,X,X,X,X,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+  /* 07E0 */ D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,C,X,X,X,X,X,
+
+  /* FILLER */
+
+  /* 0800 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 0820 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+
+  /* Mandaic */
+
+  /* 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,
+
+  /* Syriac Supplement */
+
+  /* 0860 */ D,U,D,D,D,D,U,R,D,R,R,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,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 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,D,X,X,X,X,X,X,X,
+  /* 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 904
+
+  /* General Punctuation */
+
+  /* 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,
+
+#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 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 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,
+
+#define joining_offset_0x10d00u 1146
+
+  /* Hanifi Rohingya */
+
+  /* 10D00 */ L,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,
+  /* 10D20 */ D,D,R,D,
+
+#define joining_offset_0x10f30u 1182
+
+  /* Sogdian */
+
+  /* 10F20 */                                 D,D,D,R,D,D,D,D,D,D,D,D,D,D,D,D,
+  /* 10F40 */ D,D,D,D,D,U,X,X,X,X,X,X,X,X,X,X,X,D,D,D,R,
+
+#define joining_offset_0x110bdu 1219
+
+  /* Kaithi */
+
+  /* 110A0 */                                                           U,X,X,
+  /* 110C0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,U,
+
+#define joining_offset_0x1e900u 1236
+
+  /* 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: 1304; occupancy: 56% */
+
+
+static unsigned int
+joining_type (hb_codepoint_t u)
+{
+  switch (u >> 12)
+  {
+    case 0x0u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x0600u, 0x08E2u)) return joining_table[u - 0x0600u + joining_offset_0x0600u];
+      break;
+
+    case 0x1u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x1806u, 0x18AAu)) return joining_table[u - 0x1806u + joining_offset_0x1806u];
+      break;
+
+    case 0x2u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x200Cu, 0x2069u)) return joining_table[u - 0x200Cu + joining_offset_0x200cu];
+      break;
+
+    case 0xAu:
+      if (hb_in_range<hb_codepoint_t> (u, 0xA840u, 0xA873u)) return joining_table[u - 0xA840u + joining_offset_0xa840u];
+      break;
+
+    case 0x10u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x10AC0u, 0x10AEFu)) return joining_table[u - 0x10AC0u + joining_offset_0x10ac0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10B80u, 0x10BAFu)) return joining_table[u - 0x10B80u + joining_offset_0x10b80u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10D00u, 0x10D23u)) return joining_table[u - 0x10D00u + joining_offset_0x10d00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10F30u, 0x10F54u)) return joining_table[u - 0x10F30u + joining_offset_0x10f30u];
+      break;
+
+    case 0x11u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x110BDu, 0x110CDu)) return joining_table[u - 0x110BDu + joining_offset_0x110bdu];
+      break;
+
+    case 0x1Eu:
+      if (hb_in_range<hb_codepoint_t> (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
+
+
+static const uint16_t shaping_table[][4] =
+{
+  {0x0000u, 0x0000u, 0x0000u, 0xFE80u}, /* U+0621 ARABIC LETTER HAMZA ISOLATED FORM */
+  {0x0000u, 0x0000u, 0xFE82u, 0xFE81u}, /* U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE */
+  {0x0000u, 0x0000u, 0xFE84u, 0xFE83u}, /* U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE */
+  {0x0000u, 0x0000u, 0xFE86u, 0xFE85u}, /* U+0624 ARABIC LETTER WAW WITH HAMZA ABOVE */
+  {0x0000u, 0x0000u, 0xFE88u, 0xFE87u}, /* U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW */
+  {0xFE8Bu, 0xFE8Cu, 0xFE8Au, 0xFE89u}, /* U+0626 ARABIC LETTER YEH WITH HAMZA ABOVE */
+  {0x0000u, 0x0000u, 0xFE8Eu, 0xFE8Du}, /* U+0627 ARABIC LETTER ALEF */
+  {0xFE91u, 0xFE92u, 0xFE90u, 0xFE8Fu}, /* U+0628 ARABIC LETTER BEH */
+  {0x0000u, 0x0000u, 0xFE94u, 0xFE93u}, /* U+0629 ARABIC LETTER TEH MARBUTA */
+  {0xFE97u, 0xFE98u, 0xFE96u, 0xFE95u}, /* U+062A ARABIC LETTER TEH */
+  {0xFE9Bu, 0xFE9Cu, 0xFE9Au, 0xFE99u}, /* U+062B ARABIC LETTER THEH */
+  {0xFE9Fu, 0xFEA0u, 0xFE9Eu, 0xFE9Du}, /* U+062C ARABIC LETTER JEEM */
+  {0xFEA3u, 0xFEA4u, 0xFEA2u, 0xFEA1u}, /* U+062D ARABIC LETTER HAH */
+  {0xFEA7u, 0xFEA8u, 0xFEA6u, 0xFEA5u}, /* U+062E ARABIC LETTER KHAH */
+  {0x0000u, 0x0000u, 0xFEAAu, 0xFEA9u}, /* U+062F ARABIC LETTER DAL */
+  {0x0000u, 0x0000u, 0xFEACu, 0xFEABu}, /* U+0630 ARABIC LETTER THAL */
+  {0x0000u, 0x0000u, 0xFEAEu, 0xFEADu}, /* U+0631 ARABIC LETTER REH */
+  {0x0000u, 0x0000u, 0xFEB0u, 0xFEAFu}, /* U+0632 ARABIC LETTER ZAIN */
+  {0xFEB3u, 0xFEB4u, 0xFEB2u, 0xFEB1u}, /* U+0633 ARABIC LETTER SEEN */
+  {0xFEB7u, 0xFEB8u, 0xFEB6u, 0xFEB5u}, /* U+0634 ARABIC LETTER SHEEN */
+  {0xFEBBu, 0xFEBCu, 0xFEBAu, 0xFEB9u}, /* U+0635 ARABIC LETTER SAD */
+  {0xFEBFu, 0xFEC0u, 0xFEBEu, 0xFEBDu}, /* U+0636 ARABIC LETTER DAD */
+  {0xFEC3u, 0xFEC4u, 0xFEC2u, 0xFEC1u}, /* U+0637 ARABIC LETTER TAH */
+  {0xFEC7u, 0xFEC8u, 0xFEC6u, 0xFEC5u}, /* U+0638 ARABIC LETTER ZAH */
+  {0xFECBu, 0xFECCu, 0xFECAu, 0xFEC9u}, /* U+0639 ARABIC LETTER AIN */
+  {0xFECFu, 0xFED0u, 0xFECEu, 0xFECDu}, /* U+063A ARABIC LETTER GHAIN */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+063B  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+063C  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+063D  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+063E  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+063F  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0640  */
+  {0xFED3u, 0xFED4u, 0xFED2u, 0xFED1u}, /* U+0641 ARABIC LETTER FEH */
+  {0xFED7u, 0xFED8u, 0xFED6u, 0xFED5u}, /* U+0642 ARABIC LETTER QAF */
+  {0xFEDBu, 0xFEDCu, 0xFEDAu, 0xFED9u}, /* U+0643 ARABIC LETTER KAF */
+  {0xFEDFu, 0xFEE0u, 0xFEDEu, 0xFEDDu}, /* U+0644 ARABIC LETTER LAM */
+  {0xFEE3u, 0xFEE4u, 0xFEE2u, 0xFEE1u}, /* U+0645 ARABIC LETTER MEEM */
+  {0xFEE7u, 0xFEE8u, 0xFEE6u, 0xFEE5u}, /* U+0646 ARABIC LETTER NOON */
+  {0xFEEBu, 0xFEECu, 0xFEEAu, 0xFEE9u}, /* U+0647 ARABIC LETTER HEH */
+  {0x0000u, 0x0000u, 0xFEEEu, 0xFEEDu}, /* U+0648 ARABIC LETTER WAW */
+  {0xFBE8u, 0xFBE9u, 0xFEF0u, 0xFEEFu}, /* U+0649 ARABIC LETTER */
+  {0xFEF3u, 0xFEF4u, 0xFEF2u, 0xFEF1u}, /* U+064A ARABIC LETTER YEH */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+064B  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+064C  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+064D  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+064E  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+064F  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0650  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0651  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0652  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0653  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0654  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0655  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0656  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0657  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0658  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0659  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+065A  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+065B  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+065C  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+065D  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+065E  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+065F  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0660  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0661  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0662  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0663  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0664  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0665  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0666  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0667  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0668  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0669  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+066A  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+066B  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+066C  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+066D  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+066E  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+066F  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0670  */
+  {0x0000u, 0x0000u, 0xFB51u, 0xFB50u}, /* U+0671 ARABIC LETTER ALEF WASLA */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0672  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0673  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0674  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0675  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0676  */
+  {0x0000u, 0x0000u, 0x0000u, 0xFBDDu}, /* U+0677 ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0678  */
+  {0xFB68u, 0xFB69u, 0xFB67u, 0xFB66u}, /* U+0679 ARABIC LETTER TTEH */
+  {0xFB60u, 0xFB61u, 0xFB5Fu, 0xFB5Eu}, /* U+067A ARABIC LETTER TTEHEH */
+  {0xFB54u, 0xFB55u, 0xFB53u, 0xFB52u}, /* U+067B ARABIC LETTER BEEH */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+067C  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+067D  */
+  {0xFB58u, 0xFB59u, 0xFB57u, 0xFB56u}, /* U+067E ARABIC LETTER PEH */
+  {0xFB64u, 0xFB65u, 0xFB63u, 0xFB62u}, /* U+067F ARABIC LETTER TEHEH */
+  {0xFB5Cu, 0xFB5Du, 0xFB5Bu, 0xFB5Au}, /* U+0680 ARABIC LETTER BEHEH */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0681  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0682  */
+  {0xFB78u, 0xFB79u, 0xFB77u, 0xFB76u}, /* U+0683 ARABIC LETTER NYEH */
+  {0xFB74u, 0xFB75u, 0xFB73u, 0xFB72u}, /* U+0684 ARABIC LETTER DYEH */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0685  */
+  {0xFB7Cu, 0xFB7Du, 0xFB7Bu, 0xFB7Au}, /* U+0686 ARABIC LETTER TCHEH */
+  {0xFB80u, 0xFB81u, 0xFB7Fu, 0xFB7Eu}, /* U+0687 ARABIC LETTER TCHEHEH */
+  {0x0000u, 0x0000u, 0xFB89u, 0xFB88u}, /* U+0688 ARABIC LETTER DDAL */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0689  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+068A  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+068B  */
+  {0x0000u, 0x0000u, 0xFB85u, 0xFB84u}, /* U+068C ARABIC LETTER DAHAL */
+  {0x0000u, 0x0000u, 0xFB83u, 0xFB82u}, /* U+068D ARABIC LETTER DDAHAL */
+  {0x0000u, 0x0000u, 0xFB87u, 0xFB86u}, /* U+068E ARABIC LETTER DUL */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+068F  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0690  */
+  {0x0000u, 0x0000u, 0xFB8Du, 0xFB8Cu}, /* U+0691 ARABIC LETTER RREH */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0692  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0693  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0694  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0695  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0696  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0697  */
+  {0x0000u, 0x0000u, 0xFB8Bu, 0xFB8Au}, /* U+0698 ARABIC LETTER JEH */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+0699  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+069A  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+069B  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+069C  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+069D  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+069E  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+069F  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06A0  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06A1  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06A2  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06A3  */
+  {0xFB6Cu, 0xFB6Du, 0xFB6Bu, 0xFB6Au}, /* U+06A4 ARABIC LETTER VEH */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06A5  */
+  {0xFB70u, 0xFB71u, 0xFB6Fu, 0xFB6Eu}, /* U+06A6 ARABIC LETTER PEHEH */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06A7  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06A8  */
+  {0xFB90u, 0xFB91u, 0xFB8Fu, 0xFB8Eu}, /* U+06A9 ARABIC LETTER KEHEH */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06AA  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06AB  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06AC  */
+  {0xFBD5u, 0xFBD6u, 0xFBD4u, 0xFBD3u}, /* U+06AD ARABIC LETTER NG */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06AE  */
+  {0xFB94u, 0xFB95u, 0xFB93u, 0xFB92u}, /* U+06AF ARABIC LETTER GAF */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06B0  */
+  {0xFB9Cu, 0xFB9Du, 0xFB9Bu, 0xFB9Au}, /* U+06B1 ARABIC LETTER NGOEH */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06B2  */
+  {0xFB98u, 0xFB99u, 0xFB97u, 0xFB96u}, /* U+06B3 ARABIC LETTER GUEH */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06B4  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06B5  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06B6  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06B7  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06B8  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06B9  */
+  {0x0000u, 0x0000u, 0xFB9Fu, 0xFB9Eu}, /* U+06BA ARABIC LETTER NOON GHUNNA */
+  {0xFBA2u, 0xFBA3u, 0xFBA1u, 0xFBA0u}, /* U+06BB ARABIC LETTER RNOON */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06BC  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06BD  */
+  {0xFBACu, 0xFBADu, 0xFBABu, 0xFBAAu}, /* U+06BE ARABIC LETTER HEH DOACHASHMEE */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06BF  */
+  {0x0000u, 0x0000u, 0xFBA5u, 0xFBA4u}, /* U+06C0 ARABIC LETTER HEH WITH YEH ABOVE */
+  {0xFBA8u, 0xFBA9u, 0xFBA7u, 0xFBA6u}, /* U+06C1 ARABIC LETTER HEH GOAL */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06C2  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06C3  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06C4  */
+  {0x0000u, 0x0000u, 0xFBE1u, 0xFBE0u}, /* U+06C5 ARABIC LETTER KIRGHIZ OE */
+  {0x0000u, 0x0000u, 0xFBDAu, 0xFBD9u}, /* U+06C6 ARABIC LETTER OE */
+  {0x0000u, 0x0000u, 0xFBD8u, 0xFBD7u}, /* U+06C7 ARABIC LETTER U */
+  {0x0000u, 0x0000u, 0xFBDCu, 0xFBDBu}, /* U+06C8 ARABIC LETTER YU */
+  {0x0000u, 0x0000u, 0xFBE3u, 0xFBE2u}, /* U+06C9 ARABIC LETTER KIRGHIZ YU */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06CA  */
+  {0x0000u, 0x0000u, 0xFBDFu, 0xFBDEu}, /* U+06CB ARABIC LETTER VE */
+  {0xFBFEu, 0xFBFFu, 0xFBFDu, 0xFBFCu}, /* U+06CC ARABIC LETTER FARSI YEH */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06CD  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06CE  */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06CF  */
+  {0xFBE6u, 0xFBE7u, 0xFBE5u, 0xFBE4u}, /* U+06D0 ARABIC LETTER E */
+  {0x0000u, 0x0000u, 0x0000u, 0x0000u}, /* U+06D1  */
+  {0x0000u, 0x0000u, 0xFBAFu, 0xFBAEu}, /* U+06D2 ARABIC LETTER YEH BARREE */
+  {0x0000u, 0x0000u, 0xFBB1u, 0xFBB0u}, /* U+06D3 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE */
+};
+
+#define SHAPING_TABLE_FIRST	0x0621u
+#define SHAPING_TABLE_LAST	0x06D3u
+
+
+static const struct ligature_set_t {
+ uint16_t first;
+ struct ligature_pairs_t {
+   uint16_t second;
+   uint16_t ligature;
+ } ligatures[4];
+} ligature_table[] =
+{
+  { 0xFEDFu, {
+    { 0xFE88u, 0xFEF9u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM */
+    { 0xFE82u, 0xFEF5u }, /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM */
+    { 0xFE8Eu, 0xFEFBu }, /* ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM */
+    { 0xFE84u, 0xFEF7u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM */
+  }},
+  { 0xFEE0u, {
+    { 0xFE88u, 0xFEFAu }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM */
+    { 0xFE82u, 0xFEF6u }, /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM */
+    { 0xFE8Eu, 0xFEFCu }, /* ARABIC LIGATURE LAM WITH ALEF FINAL FORM */
+    { 0xFE84u, 0xFEF8u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM */
+  }},
+};
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_ARABIC_TABLE_HH */
+
+/* == End of generated table == */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic-win1256.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic-win1256.hh
new file mode 100644
index 0000000..b15e145
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic-win1256.hh
@@ -0,0 +1,323 @@
+/*
+ * Copyright © 2014  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_SHAPE_COMPLEX_ARABIC_WIN1256_HH
+
+
+/*
+ * The macros in the first part of this file are generic macros that can
+ * be used to define the bytes for OpenType table data in code in a
+ * readable manner.  We can move the macros to reside with their respective
+ * struct types, but since we only use these to define one data table, the
+ * Windows-1256 Arabic shaping table in this file, we keep them here.
+ */
+
+
+/* First we measure, then we cut. */
+#ifndef OT_MEASURE
+#define OT_MEASURE
+#define OT_TABLE_START			static const struct TABLE_NAME {
+#define OT_TABLE_END			}
+#define OT_LABEL_START(Name)		unsigned char Name[
+#define OT_LABEL_END			];
+#define OT_UINT8(u8)			+1/*byte*/
+#define OT_UINT16(u16)			+2/*bytes*/
+#else
+#undef  OT_MEASURE
+#define OT_TABLE_START			TABLE_NAME = {
+#define OT_TABLE_END			};
+#define OT_LABEL_START(Name)		{
+#define OT_LABEL_END			},
+#define OT_UINT8(u8)			(u8),
+#define OT_UINT16(u16)			(unsigned char)((u16)>>8), (unsigned char)((u16)&0xFFu),
+#define OT_COUNT(Name, ItemSize)	((unsigned int) sizeof(((struct TABLE_NAME*)0)->Name) \
+					 / (unsigned int)(ItemSize) \
+					 /* OT_ASSERT it's divisible (and positive). */)
+#define OT_DISTANCE(From,To)		((unsigned int) \
+					 ((char*)(&((struct TABLE_NAME*)0)->To) - \
+					  (char*)(&((struct TABLE_NAME*)0)->From)) \
+					 /* OT_ASSERT it's positive. */)
+#endif
+
+
+#define OT_LABEL(Name) \
+	OT_LABEL_END \
+	OT_LABEL_START(Name)
+
+/* Whenever we receive an argument that is a list, it will expand to
+ * contain commas.  That cannot be passed to another macro because the
+ * commas will throw off the preprocessor.  The solution is to wrap
+ * the passed-in argument in OT_LIST() before passing to the next macro.
+ * Unfortunately this trick requires vararg macros. */
+#define OT_LIST(...) __VA_ARGS__
+
+
+/*
+ * Basic Types
+ */
+
+#define OT_TAG(a,b,c,d) \
+	OT_UINT8(a) OT_UINT8(b) OT_UINT8(c) OT_UINT8(d)
+
+#define OT_OFFSET(From, To) /* Offset from From to To in bytes */ \
+	OT_UINT16(OT_DISTANCE(From, To))
+
+#define OT_GLYPHID /* GlyphID */ \
+	OT_UINT16
+
+#define OT_UARRAY(Name, Items) \
+	OT_LABEL_START(Name) \
+	OT_UINT16(OT_COUNT(Name##Data, 2)) \
+	OT_LABEL(Name##Data) \
+	Items \
+	OT_LABEL_END
+
+#define OT_UHEADLESSARRAY(Name, Items) \
+	OT_LABEL_START(Name) \
+	OT_UINT16(OT_COUNT(Name##Data, 2) + 1) \
+	OT_LABEL(Name##Data) \
+	Items \
+	OT_LABEL_END
+
+
+/*
+ * Common Types
+ */
+
+#define OT_LOOKUP_FLAG_IGNORE_MARKS	0x08u
+
+#define OT_LOOKUP(Name, LookupType, LookupFlag, SubLookupOffsets) \
+	OT_LABEL_START(Name) \
+	OT_UINT16(LookupType) \
+	OT_UINT16(LookupFlag) \
+	OT_LABEL_END \
+	OT_UARRAY(Name##SubLookupOffsetsArray, OT_LIST(SubLookupOffsets))
+
+#define OT_SUBLOOKUP(Name, SubFormat, Items) \
+	OT_LABEL_START(Name) \
+	OT_UINT16(SubFormat) \
+	Items
+
+#define OT_COVERAGE1(Name, Items) \
+	OT_LABEL_START(Name) \
+	OT_UINT16(1) \
+	OT_LABEL_END \
+	OT_UARRAY(Name##Glyphs, OT_LIST(Items))
+
+
+/*
+ * GSUB
+ */
+
+#define OT_LOOKUP_TYPE_SUBST_SINGLE	1u
+#define OT_LOOKUP_TYPE_SUBST_LIGATURE	4u
+
+#define OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(Name, FromGlyphs, ToGlyphs) \
+	OT_SUBLOOKUP(Name, 2, \
+		OT_OFFSET(Name, Name##Coverage) \
+		OT_LABEL_END \
+		OT_UARRAY(Name##Substitute, OT_LIST(ToGlyphs)) \
+	) \
+	OT_COVERAGE1(Name##Coverage, OT_LIST(FromGlyphs)) \
+	/* ASSERT_STATIC_EXPR_ZERO (len(FromGlyphs) == len(ToGlyphs)) */
+
+#define OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1(Name, FirstGlyphs, LigatureSetOffsets) \
+	OT_SUBLOOKUP(Name, 1, \
+		OT_OFFSET(Name, Name##Coverage) \
+		OT_LABEL_END \
+		OT_UARRAY(Name##LigatureSetOffsetsArray, OT_LIST(LigatureSetOffsets)) \
+	) \
+	OT_COVERAGE1(Name##Coverage, OT_LIST(FirstGlyphs)) \
+	/* ASSERT_STATIC_EXPR_ZERO (len(FirstGlyphs) == len(LigatureSetOffsets)) */
+
+#define OT_LIGATURE_SET(Name, LigatureSetOffsets) \
+	OT_UARRAY(Name, OT_LIST(LigatureSetOffsets))
+
+#define OT_LIGATURE(Name, Components, LigGlyph) \
+	OT_LABEL_START(Name) \
+	LigGlyph \
+	OT_LABEL_END \
+	OT_UHEADLESSARRAY(Name##ComponentsArray, OT_LIST(Components))
+
+/*
+ *
+ * Start of Windows-1256 shaping table.
+ *
+ */
+
+/* Table name. */
+#define TABLE_NAME arabic_win1256_gsub_lookups
+
+/* Table manifest. */
+#define MANIFEST(Items) \
+	OT_LABEL_START(manifest) \
+	OT_UINT16(OT_COUNT(manifestData, 6)) \
+	OT_LABEL(manifestData) \
+	Items \
+	OT_LABEL_END
+
+#define MANIFEST_LOOKUP(Tag, Name) \
+	Tag \
+	OT_OFFSET(manifest, Name)
+
+/* Shorthand. */
+#define G	OT_GLYPHID
+
+/*
+ * Table Start
+ */
+OT_TABLE_START
+
+
+/*
+ * Manifest
+ */
+MANIFEST(
+	MANIFEST_LOOKUP(OT_TAG('r','l','i','g'), rligLookup)
+	MANIFEST_LOOKUP(OT_TAG('i','n','i','t'), initLookup)
+	MANIFEST_LOOKUP(OT_TAG('m','e','d','i'), mediLookup)
+	MANIFEST_LOOKUP(OT_TAG('f','i','n','a'), finaLookup)
+	MANIFEST_LOOKUP(OT_TAG('r','l','i','g'), rligMarksLookup)
+)
+
+/*
+ * Lookups
+ */
+OT_LOOKUP(initLookup, OT_LOOKUP_TYPE_SUBST_SINGLE, OT_LOOKUP_FLAG_IGNORE_MARKS,
+	OT_OFFSET(initLookup, initmediSubLookup)
+	OT_OFFSET(initLookup, initSubLookup)
+)
+OT_LOOKUP(mediLookup, OT_LOOKUP_TYPE_SUBST_SINGLE, OT_LOOKUP_FLAG_IGNORE_MARKS,
+	OT_OFFSET(mediLookup, initmediSubLookup)
+	OT_OFFSET(mediLookup, mediSubLookup)
+	OT_OFFSET(mediLookup, medifinaLamAlefSubLookup)
+)
+OT_LOOKUP(finaLookup, OT_LOOKUP_TYPE_SUBST_SINGLE, OT_LOOKUP_FLAG_IGNORE_MARKS,
+	OT_OFFSET(finaLookup, finaSubLookup)
+	/* We don't need this one currently as the sequence inherits masks
+	 * from the first item.  Just in case we change that in the future
+	 * to be smart about Arabic masks when ligating... */
+	OT_OFFSET(finaLookup, medifinaLamAlefSubLookup)
+)
+OT_LOOKUP(rligLookup, OT_LOOKUP_TYPE_SUBST_LIGATURE, OT_LOOKUP_FLAG_IGNORE_MARKS,
+	OT_OFFSET(rligLookup, lamAlefLigaturesSubLookup)
+)
+OT_LOOKUP(rligMarksLookup, OT_LOOKUP_TYPE_SUBST_LIGATURE, 0,
+	OT_OFFSET(rligMarksLookup, shaddaLigaturesSubLookup)
+)
+
+/*
+ * init/medi/fina forms
+ */
+OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(initmediSubLookup,
+	G(198)	G(200)	G(201)	G(202)	G(203)	G(204)	G(205)	G(206)	G(211)
+	G(212)	G(213)	G(214)	G(223)	G(225)	G(227)	G(228)	G(236)	G(237),
+	G(162)	G(4)	G(5)	G(5)	G(6)	G(7)	G(9)	G(11)	G(13)
+	G(14)	G(15)	G(26)	G(140)	G(141)	G(142)	G(143)	G(154)	G(154)
+)
+OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(initSubLookup,
+	G(218)	G(219)	G(221)	G(222)	G(229),
+	G(27)	G(30)	G(128)	G(131)	G(144)
+)
+OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(mediSubLookup,
+	G(218)	G(219)	G(221)	G(222)	G(229),
+	G(28)	G(31)	G(129)	G(138)	G(149)
+)
+OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(finaSubLookup,
+	G(194)	G(195)	G(197)	G(198)	G(199)	G(201)	G(204)	G(205)	G(206)
+	G(218)	G(219)	G(229)	G(236)	G(237),
+	G(2)	G(1)	G(3)	G(181)	G(0)	G(159)	G(8)	G(10)	G(12)
+	G(29)	G(127)	G(152) G(160)	G(156)
+)
+OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(medifinaLamAlefSubLookup,
+	G(165)	G(178)	G(180)	G(252),
+	G(170)	G(179)	G(185)	G(255)
+)
+
+/*
+ * Lam+Alef ligatures
+ */
+OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1(lamAlefLigaturesSubLookup,
+	G(225),
+	OT_OFFSET(lamAlefLigaturesSubLookup, lamLigatureSet)
+)
+OT_LIGATURE_SET(lamLigatureSet,
+	OT_OFFSET(lamLigatureSet, lamInitLigature1)
+	OT_OFFSET(lamLigatureSet, lamInitLigature2)
+	OT_OFFSET(lamLigatureSet, lamInitLigature3)
+	OT_OFFSET(lamLigatureSet, lamInitLigature4)
+)
+OT_LIGATURE(lamInitLigature1, G(199), G(165))
+OT_LIGATURE(lamInitLigature2, G(195), G(178))
+OT_LIGATURE(lamInitLigature3, G(194), G(180))
+OT_LIGATURE(lamInitLigature4, G(197), G(252))
+
+/*
+ * Shadda ligatures
+ */
+OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1(shaddaLigaturesSubLookup,
+	G(248),
+	OT_OFFSET(shaddaLigaturesSubLookup, shaddaLigatureSet)
+)
+OT_LIGATURE_SET(shaddaLigatureSet,
+	OT_OFFSET(shaddaLigatureSet, shaddaLigature1)
+	OT_OFFSET(shaddaLigatureSet, shaddaLigature2)
+	OT_OFFSET(shaddaLigatureSet, shaddaLigature3)
+)
+OT_LIGATURE(shaddaLigature1, G(243), G(172))
+OT_LIGATURE(shaddaLigature2, G(245), G(173))
+OT_LIGATURE(shaddaLigature3, G(246), G(175))
+
+/*
+ * Table end
+ */
+OT_TABLE_END
+
+
+/*
+ * Clean up
+ */
+#undef OT_TABLE_START
+#undef OT_TABLE_END
+#undef OT_LABEL_START
+#undef OT_LABEL_END
+#undef OT_UINT8
+#undef OT_UINT16
+#undef OT_DISTANCE
+#undef OT_COUNT
+
+/*
+ * Include a second time to get the table data...
+ */
+#if 0
+#include "hb.hh" /* Make check-includes.sh happy. */
+#endif
+#ifdef OT_MEASURE
+#include "hb-ot-shape-complex-arabic-win1256.hh"
+#endif
+
+#define HB_OT_SHAPE_COMPLEX_ARABIC_WIN1256_HH
+#endif /* HB_OT_SHAPE_COMPLEX_ARABIC_WIN1256_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic.cc
new file mode 100644
index 0000000..50a52136
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic.cc
@@ -0,0 +1,708 @@
+/*
+ * Copyright © 2010,2012  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
+ */
+
+#include "hb.hh"
+#include "hb-ot-shape-complex-arabic.hh"
+#include "hb-ot-shape.hh"
+
+
+/* buffer var allocations */
+#define arabic_shaping_action() complex_var_u8_0() /* arabic shaping action */
+
+#define HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH HB_BUFFER_SCRATCH_FLAG_COMPLEX0
+
+/* See:
+ * https://github.com/harfbuzz/harfbuzz/commit/6e6f82b6f3dde0fc6c3c7d991d9ec6cfff57823d#commitcomment-14248516 */
+#define HB_ARABIC_GENERAL_CATEGORY_IS_WORD(gen_cat) \
+	(FLAG_UNSAFE (gen_cat) & \
+	 (FLAG (HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED) | \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE) | \
+	  /*FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) |*/ \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER) | \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER) | \
+	  /*FLAG (HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER) |*/ \
+	  /*FLAG (HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER) |*/ \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) | \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) | \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER) | \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER) | \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL) | \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL) | \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL) | \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL)))
+
+
+/*
+ * Joining types:
+ */
+
+/*
+ * Bits used in the joining tables
+ */
+enum hb_arabic_joining_type_t {
+  JOINING_TYPE_U		= 0,
+  JOINING_TYPE_L		= 1,
+  JOINING_TYPE_R		= 2,
+  JOINING_TYPE_D		= 3,
+  JOINING_TYPE_C		= JOINING_TYPE_D,
+  JOINING_GROUP_ALAPH		= 4,
+  JOINING_GROUP_DALATH_RISH	= 5,
+  NUM_STATE_MACHINE_COLS	= 6,
+
+  JOINING_TYPE_T = 7,
+  JOINING_TYPE_X = 8  /* means: use general-category to choose between U or T. */
+};
+
+#include "hb-ot-shape-complex-arabic-table.hh"
+
+static unsigned int get_joining_type (hb_codepoint_t u, hb_unicode_general_category_t gen_cat)
+{
+  unsigned int j_type = joining_type(u);
+  if (likely (j_type != JOINING_TYPE_X))
+    return j_type;
+
+  return (FLAG_UNSAFE(gen_cat) &
+	  (FLAG(HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) |
+	   FLAG(HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) |
+	   FLAG(HB_UNICODE_GENERAL_CATEGORY_FORMAT))
+	 ) ?  JOINING_TYPE_T : JOINING_TYPE_U;
+}
+
+#define FEATURE_IS_SYRIAC(tag) hb_in_range<unsigned char> ((unsigned char) (tag), '2', '3')
+
+static const hb_tag_t arabic_features[] =
+{
+  HB_TAG('i','s','o','l'),
+  HB_TAG('f','i','n','a'),
+  HB_TAG('f','i','n','2'),
+  HB_TAG('f','i','n','3'),
+  HB_TAG('m','e','d','i'),
+  HB_TAG('m','e','d','2'),
+  HB_TAG('i','n','i','t'),
+  HB_TAG_NONE
+};
+
+
+/* Same order as the feature array */
+enum arabic_action_t {
+  ISOL,
+  FINA,
+  FIN2,
+  FIN3,
+  MEDI,
+  MED2,
+  INIT,
+
+  NONE,
+
+  ARABIC_NUM_FEATURES = NONE,
+
+  /* We abuse the same byte for other things... */
+  STCH_FIXED,
+  STCH_REPEATING,
+};
+
+static const struct arabic_state_table_entry {
+	uint8_t prev_action;
+	uint8_t curr_action;
+	uint16_t next_state;
+} arabic_state_table[][NUM_STATE_MACHINE_COLS] =
+{
+  /*   jt_U,          jt_L,          jt_R,          jt_D,          jg_ALAPH,      jg_DALATH_RISH */
+
+  /* State 0: prev was U, not willing to join. */
+  { {NONE,NONE,0}, {NONE,ISOL,2}, {NONE,ISOL,1}, {NONE,ISOL,2}, {NONE,ISOL,1}, {NONE,ISOL,6}, },
+
+  /* State 1: prev was R or ISOL/ALAPH, not willing to join. */
+  { {NONE,NONE,0}, {NONE,ISOL,2}, {NONE,ISOL,1}, {NONE,ISOL,2}, {NONE,FIN2,5}, {NONE,ISOL,6}, },
+
+  /* State 2: prev was D/L in ISOL form, willing to join. */
+  { {NONE,NONE,0}, {NONE,ISOL,2}, {INIT,FINA,1}, {INIT,FINA,3}, {INIT,FINA,4}, {INIT,FINA,6}, },
+
+  /* State 3: prev was D in FINA form, willing to join. */
+  { {NONE,NONE,0}, {NONE,ISOL,2}, {MEDI,FINA,1}, {MEDI,FINA,3}, {MEDI,FINA,4}, {MEDI,FINA,6}, },
+
+  /* State 4: prev was FINA ALAPH, not willing to join. */
+  { {NONE,NONE,0}, {NONE,ISOL,2}, {MED2,ISOL,1}, {MED2,ISOL,2}, {MED2,FIN2,5}, {MED2,ISOL,6}, },
+
+  /* State 5: prev was FIN2/FIN3 ALAPH, not willing to join. */
+  { {NONE,NONE,0}, {NONE,ISOL,2}, {ISOL,ISOL,1}, {ISOL,ISOL,2}, {ISOL,FIN2,5}, {ISOL,ISOL,6}, },
+
+  /* State 6: prev was DALATH/RISH, not willing to join. */
+  { {NONE,NONE,0}, {NONE,ISOL,2}, {NONE,ISOL,1}, {NONE,ISOL,2}, {NONE,FIN3,5}, {NONE,ISOL,6}, }
+};
+
+
+static void
+arabic_fallback_shape (const hb_ot_shape_plan_t *plan,
+		       hb_font_t *font,
+		       hb_buffer_t *buffer);
+
+static void
+record_stch (const hb_ot_shape_plan_t *plan,
+	     hb_font_t *font,
+	     hb_buffer_t *buffer);
+
+static void
+collect_features_arabic (hb_ot_shape_planner_t *plan)
+{
+  hb_ot_map_builder_t *map = &plan->map;
+
+  /* We apply features according to the Arabic spec, with pauses
+   * in between most.
+   *
+   * The pause between init/medi/... and rlig is required.  See eg:
+   * https://bugzilla.mozilla.org/show_bug.cgi?id=644184
+   *
+   * The pauses between init/medi/... themselves are not necessarily
+   * needed as only one of those features is applied to any character.
+   * The only difference it makes is when fonts have contextual
+   * substitutions.  We now follow the order of the spec, which makes
+   * for better experience if that's what Uniscribe is doing.
+   *
+   * At least for Arabic, looks like Uniscribe has a pause between
+   * rlig and calt.  Otherwise the IranNastaliq's ALLAH ligature won't
+   * work.  However, testing shows that rlig and calt are applied
+   * together for Mongolian in Uniscribe.  As such, we only add a
+   * pause for Arabic, not other scripts.
+   *
+   * A pause after calt is required to make KFGQPC Uthmanic Script HAFS
+   * work correctly.  See https://github.com/harfbuzz/harfbuzz/issues/505
+   */
+
+
+  map->enable_feature (HB_TAG('s','t','c','h'));
+  map->add_gsub_pause (record_stch);
+
+  map->enable_feature (HB_TAG('c','c','m','p'));
+  map->enable_feature (HB_TAG('l','o','c','l'));
+
+  map->add_gsub_pause (nullptr);
+
+  for (unsigned int i = 0; i < ARABIC_NUM_FEATURES; i++)
+  {
+    bool has_fallback = plan->props.script == HB_SCRIPT_ARABIC && !FEATURE_IS_SYRIAC (arabic_features[i]);
+    map->add_feature (arabic_features[i], has_fallback ? F_HAS_FALLBACK : F_NONE);
+    map->add_gsub_pause (nullptr);
+  }
+
+  /* Normally, Unicode says a ZWNJ means "don't ligate".  In Arabic script
+   * however, it says a ZWJ should also mean "don't ligate".  So we run
+   * the main ligating features as MANUAL_ZWJ. */
+
+  map->enable_feature (HB_TAG('r','l','i','g'), F_MANUAL_ZWJ | F_HAS_FALLBACK);
+
+  if (plan->props.script == HB_SCRIPT_ARABIC)
+    map->add_gsub_pause (arabic_fallback_shape);
+
+  /* No pause after rclt.  See 98460779bae19e4d64d29461ff154b3527bf8420. */
+  map->enable_feature (HB_TAG('r','c','l','t'), F_MANUAL_ZWJ);
+  map->enable_feature (HB_TAG('c','a','l','t'), F_MANUAL_ZWJ);
+  map->add_gsub_pause (nullptr);
+
+  /* And undo here. */
+
+  /* The spec includes 'cswh'.  Earlier versions of Windows
+   * used to enable this by default, but testing suggests
+   * that Windows 8 and later do not enable it by default,
+   * and spec now says 'Off by default'.
+   * We disabled this in ae23c24c32.
+   * Note that IranNastaliq uses this feature extensively
+   * to fixup broken glyph sequences.  Oh well...
+   * Test case: U+0643,U+0640,U+0631. */
+  //map->enable_feature (HB_TAG('c','s','w','h'));
+  map->enable_feature (HB_TAG('m','s','e','t'));
+}
+
+#include "hb-ot-shape-complex-arabic-fallback.hh"
+
+struct arabic_shape_plan_t
+{
+  /* The "+ 1" in the next array is to accommodate for the "NONE" command,
+   * which is not an OpenType feature, but this simplifies the code by not
+   * having to do a "if (... < NONE) ..." and just rely on the fact that
+   * mask_array[NONE] == 0. */
+  hb_mask_t mask_array[ARABIC_NUM_FEATURES + 1];
+
+  hb_atomic_ptr_t<arabic_fallback_plan_t> fallback_plan;
+
+  unsigned int do_fallback : 1;
+  unsigned int has_stch : 1;
+};
+
+void *
+data_create_arabic (const hb_ot_shape_plan_t *plan)
+{
+  arabic_shape_plan_t *arabic_plan = (arabic_shape_plan_t *) calloc (1, sizeof (arabic_shape_plan_t));
+  if (unlikely (!arabic_plan))
+    return nullptr;
+
+  arabic_plan->do_fallback = plan->props.script == HB_SCRIPT_ARABIC;
+  arabic_plan->has_stch = !!plan->map.get_1_mask (HB_TAG ('s','t','c','h'));
+  for (unsigned int i = 0; i < ARABIC_NUM_FEATURES; i++) {
+    arabic_plan->mask_array[i] = plan->map.get_1_mask (arabic_features[i]);
+    arabic_plan->do_fallback = arabic_plan->do_fallback &&
+			       (FEATURE_IS_SYRIAC (arabic_features[i]) ||
+			        plan->map.needs_fallback (arabic_features[i]));
+  }
+
+  return arabic_plan;
+}
+
+void
+data_destroy_arabic (void *data)
+{
+  arabic_shape_plan_t *arabic_plan = (arabic_shape_plan_t *) data;
+
+  arabic_fallback_plan_destroy (arabic_plan->fallback_plan);
+
+  free (data);
+}
+
+static void
+arabic_joining (hb_buffer_t *buffer)
+{
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  unsigned int prev = (unsigned int) -1, state = 0;
+
+  /* Check pre-context */
+  for (unsigned int i = 0; i < buffer->context_len[0]; i++)
+  {
+    unsigned int this_type = get_joining_type (buffer->context[0][i], buffer->unicode->general_category (buffer->context[0][i]));
+
+    if (unlikely (this_type == JOINING_TYPE_T))
+      continue;
+
+    const arabic_state_table_entry *entry = &arabic_state_table[state][this_type];
+    state = entry->next_state;
+    break;
+  }
+
+  for (unsigned int i = 0; i < count; i++)
+  {
+    unsigned int this_type = get_joining_type (info[i].codepoint, _hb_glyph_info_get_general_category (&info[i]));
+
+    if (unlikely (this_type == JOINING_TYPE_T)) {
+      info[i].arabic_shaping_action() = NONE;
+      continue;
+    }
+
+    const arabic_state_table_entry *entry = &arabic_state_table[state][this_type];
+
+    if (entry->prev_action != NONE && prev != (unsigned int) -1)
+    {
+      info[prev].arabic_shaping_action() = entry->prev_action;
+      buffer->unsafe_to_break (prev, i + 1);
+    }
+
+    info[i].arabic_shaping_action() = entry->curr_action;
+
+    prev = i;
+    state = entry->next_state;
+  }
+
+  for (unsigned int i = 0; i < buffer->context_len[1]; i++)
+  {
+    unsigned int this_type = get_joining_type (buffer->context[1][i], buffer->unicode->general_category (buffer->context[1][i]));
+
+    if (unlikely (this_type == JOINING_TYPE_T))
+      continue;
+
+    const arabic_state_table_entry *entry = &arabic_state_table[state][this_type];
+    if (entry->prev_action != NONE && prev != (unsigned int) -1)
+      info[prev].arabic_shaping_action() = entry->prev_action;
+    break;
+  }
+}
+
+static void
+mongolian_variation_selectors (hb_buffer_t *buffer)
+{
+  /* Copy arabic_shaping_action() from base to Mongolian variation selectors. */
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 1; i < count; i++)
+    if (unlikely (hb_in_range<hb_codepoint_t> (info[i].codepoint, 0x180Bu, 0x180Du)))
+      info[i].arabic_shaping_action() = info[i - 1].arabic_shaping_action();
+}
+
+void
+setup_masks_arabic_plan (const arabic_shape_plan_t *arabic_plan,
+			 hb_buffer_t               *buffer,
+			 hb_script_t                script)
+{
+  HB_BUFFER_ALLOCATE_VAR (buffer, arabic_shaping_action);
+
+  arabic_joining (buffer);
+  if (script == HB_SCRIPT_MONGOLIAN)
+    mongolian_variation_selectors (buffer);
+
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    info[i].mask |= arabic_plan->mask_array[info[i].arabic_shaping_action()];
+}
+
+static void
+setup_masks_arabic (const hb_ot_shape_plan_t *plan,
+		    hb_buffer_t              *buffer,
+		    hb_font_t                *font HB_UNUSED)
+{
+  const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data;
+  setup_masks_arabic_plan (arabic_plan, buffer, plan->props.script);
+}
+
+static void
+arabic_fallback_shape (const hb_ot_shape_plan_t *plan,
+		       hb_font_t *font,
+		       hb_buffer_t *buffer)
+{
+  const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data;
+
+  if (!arabic_plan->do_fallback)
+    return;
+
+retry:
+  arabic_fallback_plan_t *fallback_plan = arabic_plan->fallback_plan;
+  if (unlikely (!fallback_plan))
+  {
+    /* This sucks.  We need a font to build the fallback plan... */
+    fallback_plan = arabic_fallback_plan_create (plan, font);
+    if (unlikely (!arabic_plan->fallback_plan.cmpexch (nullptr, fallback_plan)))
+    {
+      arabic_fallback_plan_destroy (fallback_plan);
+      goto retry;
+    }
+  }
+
+  arabic_fallback_plan_shape (fallback_plan, font, buffer);
+}
+
+/*
+ * Stretch feature: "stch".
+ * See example here:
+ * https://docs.microsoft.com/en-us/typography/script-development/syriac
+ * We implement this in a generic way, such that the Arabic subtending
+ * marks can use it as well.
+ */
+
+static void
+record_stch (const hb_ot_shape_plan_t *plan,
+	     hb_font_t *font HB_UNUSED,
+	     hb_buffer_t *buffer)
+{
+  const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data;
+  if (!arabic_plan->has_stch)
+    return;
+
+  /* 'stch' feature was just applied.  Look for anything that multiplied,
+   * and record it for stch treatment later.  Note that rtlm, frac, etc
+   * are applied before stch, but we assume that they didn't result in
+   * anything multiplying into 5 pieces, so it's safe-ish... */
+
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    if (unlikely (_hb_glyph_info_multiplied (&info[i])))
+    {
+      unsigned int comp = _hb_glyph_info_get_lig_comp (&info[i]);
+      info[i].arabic_shaping_action() = comp % 2 ? STCH_REPEATING : STCH_FIXED;
+      buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH;
+    }
+}
+
+static void
+apply_stch (const hb_ot_shape_plan_t *plan HB_UNUSED,
+	    hb_buffer_t              *buffer,
+	    hb_font_t                *font)
+{
+  if (likely (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH)))
+    return;
+
+  /* The Arabic shaper currently always processes in RTL mode, so we should
+   * stretch / position the stretched pieces to the left / preceding glyphs. */
+
+  /* We do a two pass implementation:
+   * First pass calculates the exact number of extra glyphs we need,
+   * We then enlarge buffer to have that much room,
+   * Second pass applies the stretch, copying things to the end of buffer.
+   */
+
+  int sign = font->x_scale < 0 ? -1 : +1;
+  unsigned int extra_glyphs_needed = 0; // Set during MEASURE, used during CUT
+  enum { MEASURE, CUT } /* step_t */;
+
+  for (unsigned int step = MEASURE; step <= CUT; step = step + 1)
+  {
+    unsigned int count = buffer->len;
+    hb_glyph_info_t *info = buffer->info;
+    hb_glyph_position_t *pos = buffer->pos;
+    unsigned int new_len = count + extra_glyphs_needed; // write head during CUT
+    unsigned int j = new_len;
+    for (unsigned int i = count; i; i--)
+    {
+      if (!hb_in_range<unsigned> (info[i - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING))
+      {
+        if (step == CUT)
+	{
+	  --j;
+	  info[j] = info[i - 1];
+	  pos[j] = pos[i - 1];
+	}
+        continue;
+      }
+
+      /* Yay, justification! */
+
+      hb_position_t w_total = 0; // Total to be filled
+      hb_position_t w_fixed = 0; // Sum of fixed tiles
+      hb_position_t w_repeating = 0; // Sum of repeating tiles
+      int n_fixed = 0;
+      int n_repeating = 0;
+
+      unsigned int end = i;
+      while (i &&
+	     hb_in_range<unsigned> (info[i - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING))
+      {
+	i--;
+	hb_position_t width = font->get_glyph_h_advance (info[i].codepoint);
+	if (info[i].arabic_shaping_action() == STCH_FIXED)
+	{
+	  w_fixed += width;
+	  n_fixed++;
+	}
+	else
+	{
+	  w_repeating += width;
+	  n_repeating++;
+	}
+      }
+      unsigned int start = i;
+      unsigned int context = i;
+      while (context &&
+	     !hb_in_range<unsigned> (info[context - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING) &&
+	     (_hb_glyph_info_is_default_ignorable (&info[context - 1]) ||
+	      HB_ARABIC_GENERAL_CATEGORY_IS_WORD (_hb_glyph_info_get_general_category (&info[context - 1]))))
+      {
+	context--;
+	w_total += pos[context].x_advance;
+      }
+      i++; // Don't touch i again.
+
+      DEBUG_MSG (ARABIC, nullptr, "%s stretch at (%d,%d,%d)",
+		 step == MEASURE ? "measuring" : "cutting", context, start, end);
+      DEBUG_MSG (ARABIC, nullptr, "rest of word:    count=%d width %d", start - context, w_total);
+      DEBUG_MSG (ARABIC, nullptr, "fixed tiles:     count=%d width=%d", n_fixed, w_fixed);
+      DEBUG_MSG (ARABIC, nullptr, "repeating tiles: count=%d width=%d", n_repeating, w_repeating);
+
+      /* Number of additional times to repeat each repeating tile. */
+      int n_copies = 0;
+
+      hb_position_t w_remaining = w_total - w_fixed;
+      if (sign * w_remaining > sign * w_repeating && sign * w_repeating > 0)
+	n_copies = (sign * w_remaining) / (sign * w_repeating) - 1;
+
+      /* See if we can improve the fit by adding an extra repeat and squeezing them together a bit. */
+      hb_position_t extra_repeat_overlap = 0;
+      hb_position_t shortfall = sign * w_remaining - sign * w_repeating * (n_copies + 1);
+      if (shortfall > 0 && n_repeating > 0)
+      {
+        ++n_copies;
+        hb_position_t excess = (n_copies + 1) * sign * w_repeating - sign * w_remaining;
+        if (excess > 0)
+          extra_repeat_overlap = excess / (n_copies * n_repeating);
+      }
+
+      if (step == MEASURE)
+      {
+	extra_glyphs_needed += n_copies * n_repeating;
+	DEBUG_MSG (ARABIC, nullptr, "will add extra %d copies of repeating tiles", n_copies);
+      }
+      else
+      {
+	buffer->unsafe_to_break (context, end);
+	hb_position_t x_offset = 0;
+	for (unsigned int k = end; k > start; k--)
+	{
+	  hb_position_t width = font->get_glyph_h_advance (info[k - 1].codepoint);
+
+	  unsigned int repeat = 1;
+	  if (info[k - 1].arabic_shaping_action() == STCH_REPEATING)
+	    repeat += n_copies;
+
+	  DEBUG_MSG (ARABIC, nullptr, "appending %d copies of glyph %d; j=%d",
+		     repeat, info[k - 1].codepoint, j);
+	  for (unsigned int n = 0; n < repeat; n++)
+	  {
+	    x_offset -= width;
+	    if (n > 0)
+	      x_offset += extra_repeat_overlap;
+	    pos[k - 1].x_offset = x_offset;
+	    /* Append copy. */
+	    --j;
+	    info[j] = info[k - 1];
+	    pos[j] = pos[k - 1];
+	  }
+	}
+      }
+    }
+
+    if (step == MEASURE)
+    {
+      if (unlikely (!buffer->ensure (count + extra_glyphs_needed)))
+        break;
+    }
+    else
+    {
+      assert (j == 0);
+      buffer->len = new_len;
+    }
+  }
+}
+
+
+static void
+postprocess_glyphs_arabic (const hb_ot_shape_plan_t *plan,
+			   hb_buffer_t              *buffer,
+			   hb_font_t                *font)
+{
+  apply_stch (plan, buffer, font);
+
+  HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action);
+}
+
+/* http://www.unicode.org/reports/tr53/ */
+
+static hb_codepoint_t
+modifier_combining_marks[] =
+{
+  0x0654u, /* ARABIC HAMZA ABOVE */
+  0x0655u, /* ARABIC HAMZA BELOW */
+  0x0658u, /* ARABIC MARK NOON GHUNNA */
+  0x06DCu, /* ARABIC SMALL HIGH SEEN */
+  0x06E3u, /* ARABIC SMALL LOW SEEN */
+  0x06E7u, /* ARABIC SMALL HIGH YEH */
+  0x06E8u, /* ARABIC SMALL HIGH NOON */
+  0x08D3u, /* ARABIC SMALL LOW WAW */
+  0x08F3u, /* ARABIC SMALL HIGH WAW */
+};
+
+static inline bool
+info_is_mcm (const hb_glyph_info_t &info)
+{
+  hb_codepoint_t u = info.codepoint;
+  for (unsigned int i = 0; i < ARRAY_LENGTH (modifier_combining_marks); i++)
+    if (u == modifier_combining_marks[i])
+      return true;
+  return false;
+}
+
+static void
+reorder_marks_arabic (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		      hb_buffer_t              *buffer,
+		      unsigned int              start,
+		      unsigned int              end)
+{
+  hb_glyph_info_t *info = buffer->info;
+
+  DEBUG_MSG (ARABIC, buffer, "Reordering marks from %d to %d", start, end);
+
+  unsigned int i = start;
+  for (unsigned int cc = 220; cc <= 230; cc += 10)
+  {
+    DEBUG_MSG (ARABIC, buffer, "Looking for %d's starting at %d", cc, i);
+    while (i < end && info_cc(info[i]) < cc)
+      i++;
+    DEBUG_MSG (ARABIC, buffer, "Looking for %d's stopped at %d", cc, i);
+
+    if (i == end)
+      break;
+
+    if (info_cc(info[i]) > cc)
+      continue;
+
+    unsigned int j = i;
+    while (j < end && info_cc(info[j]) == cc && info_is_mcm (info[j]))
+      j++;
+
+    if (i == j)
+      continue;
+
+    DEBUG_MSG (ARABIC, buffer, "Found %d's from %d to %d", cc, i, j);
+
+    /* Shift it! */
+    DEBUG_MSG (ARABIC, buffer, "Shifting %d's: %d %d", cc, i, j);
+    hb_glyph_info_t temp[HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS];
+    assert (j - i <= ARRAY_LENGTH (temp));
+    buffer->merge_clusters (start, j);
+    memmove (temp, &info[i], (j - i) * sizeof (hb_glyph_info_t));
+    memmove (&info[start + j - i], &info[start], (i - start) * sizeof (hb_glyph_info_t));
+    memmove (&info[start], temp, (j - i) * sizeof (hb_glyph_info_t));
+
+    /* Renumber CC such that the reordered sequence is still sorted.
+     * 22 and 26 are chosen because they are smaller than all Arabic categories,
+     * and are folded back to 220/230 respectively during fallback mark positioning.
+     *
+     * We do this because the CGJ-handling logic in the normalizer relies on
+     * mark sequences having an increasing order even after this reordering.
+     * https://github.com/harfbuzz/harfbuzz/issues/554
+     * This, however, does break some obscure sequences, where the normalizer
+     * might compose a sequence that it should not.  For example, in the seequence
+     * ALEF, HAMZAH, MADDAH, we should NOT try to compose ALEF+MADDAH, but with this
+     * renumbering, we will.
+     */
+    unsigned int new_start = start + j - i;
+    unsigned int new_cc = cc == 220 ? HB_MODIFIED_COMBINING_CLASS_CCC22 : HB_MODIFIED_COMBINING_CLASS_CCC26;
+    while (start < new_start)
+    {
+      _hb_glyph_info_set_modified_combining_class (&info[start], new_cc);
+      start++;
+    }
+
+    i = j;
+  }
+}
+
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic =
+{
+  collect_features_arabic,
+  nullptr, /* override_features */
+  data_create_arabic,
+  data_destroy_arabic,
+  nullptr, /* preprocess_text */
+  postprocess_glyphs_arabic,
+  HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
+  nullptr, /* decompose */
+  nullptr, /* compose */
+  setup_masks_arabic,
+  HB_TAG_NONE, /* gpos_tag */
+  reorder_marks_arabic,
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
+  true, /* fallback_position */
+};
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic.hh
new file mode 100644
index 0000000..5bf6ff63
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-arabic.hh
@@ -0,0 +1,50 @@
+/*
+ * Copyright © 2015  Mozilla Foundation.
+ * Copyright © 2015  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.
+ *
+ * Mozilla Author(s): Jonathan Kew
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_ARABIC_HH
+#define HB_OT_SHAPE_COMPLEX_ARABIC_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex.hh"
+
+
+struct arabic_shape_plan_t;
+
+HB_INTERNAL void *
+data_create_arabic (const hb_ot_shape_plan_t *plan);
+
+HB_INTERNAL void
+data_destroy_arabic (void *data);
+
+HB_INTERNAL void
+setup_masks_arabic_plan (const arabic_shape_plan_t *arabic_plan,
+			 hb_buffer_t               *buffer,
+			 hb_script_t                script);
+
+#endif /* HB_OT_SHAPE_COMPLEX_ARABIC_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-default.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-default.cc
new file mode 100644
index 0000000..97923ec
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-default.cc
@@ -0,0 +1,46 @@
+/*
+ * Copyright © 2010,2012  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
+ */
+
+#include "hb-ot-shape-complex.hh"
+
+
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
+{
+  nullptr, /* collect_features */
+  nullptr, /* override_features */
+  nullptr, /* data_create */
+  nullptr, /* data_destroy */
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
+  HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
+  nullptr, /* decompose */
+  nullptr, /* compose */
+  nullptr, /* setup_masks */
+  HB_TAG_NONE, /* gpos_tag */
+  nullptr, /* reorder_marks */
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
+  true, /* fallback_position */
+};
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-hangul.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-hangul.cc
new file mode 100644
index 0000000..e143867
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-hangul.cc
@@ -0,0 +1,431 @@
+/*
+ * Copyright © 2013  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
+ */
+
+#include "hb-ot-shape-complex.hh"
+
+
+/* Hangul shaper */
+
+
+/* Same order as the feature array below */
+enum {
+  _JMO,
+
+  LJMO,
+  VJMO,
+  TJMO,
+
+  FIRST_HANGUL_FEATURE = LJMO,
+  HANGUL_FEATURE_COUNT = TJMO + 1
+};
+
+static const hb_tag_t hangul_features[HANGUL_FEATURE_COUNT] =
+{
+  HB_TAG_NONE,
+  HB_TAG('l','j','m','o'),
+  HB_TAG('v','j','m','o'),
+  HB_TAG('t','j','m','o')
+};
+
+static void
+collect_features_hangul (hb_ot_shape_planner_t *plan)
+{
+  hb_ot_map_builder_t *map = &plan->map;
+
+  for (unsigned int i = FIRST_HANGUL_FEATURE; i < HANGUL_FEATURE_COUNT; i++)
+    map->add_feature (hangul_features[i]);
+}
+
+static void
+override_features_hangul (hb_ot_shape_planner_t *plan)
+{
+  /* Uniscribe does not apply 'calt' for Hangul, and certain fonts
+   * (Noto Sans CJK, Source Sans Han, etc) apply all of jamo lookups
+   * in calt, which is not desirable. */
+  plan->map.disable_feature (HB_TAG('c','a','l','t'));
+}
+
+struct hangul_shape_plan_t
+{
+  hb_mask_t mask_array[HANGUL_FEATURE_COUNT];
+};
+
+static void *
+data_create_hangul (const hb_ot_shape_plan_t *plan)
+{
+  hangul_shape_plan_t *hangul_plan = (hangul_shape_plan_t *) calloc (1, sizeof (hangul_shape_plan_t));
+  if (unlikely (!hangul_plan))
+    return nullptr;
+
+  for (unsigned int i = 0; i < HANGUL_FEATURE_COUNT; i++)
+    hangul_plan->mask_array[i] = plan->map.get_1_mask (hangul_features[i]);
+
+  return hangul_plan;
+}
+
+static void
+data_destroy_hangul (void *data)
+{
+  free (data);
+}
+
+/* Constants for algorithmic hangul syllable [de]composition. */
+#define LBase 0x1100u
+#define VBase 0x1161u
+#define TBase 0x11A7u
+#define LCount 19u
+#define VCount 21u
+#define TCount 28u
+#define SBase 0xAC00u
+#define NCount (VCount * TCount)
+#define SCount (LCount * NCount)
+
+#define isCombiningL(u) (hb_in_range<hb_codepoint_t> ((u), LBase, LBase+LCount-1))
+#define isCombiningV(u) (hb_in_range<hb_codepoint_t> ((u), VBase, VBase+VCount-1))
+#define isCombiningT(u) (hb_in_range<hb_codepoint_t> ((u), TBase+1, TBase+TCount-1))
+#define isCombinedS(u) (hb_in_range<hb_codepoint_t> ((u), SBase, SBase+SCount-1))
+
+#define isL(u) (hb_in_ranges<hb_codepoint_t> ((u), 0x1100u, 0x115Fu, 0xA960u, 0xA97Cu))
+#define isV(u) (hb_in_ranges<hb_codepoint_t> ((u), 0x1160u, 0x11A7u, 0xD7B0u, 0xD7C6u))
+#define isT(u) (hb_in_ranges<hb_codepoint_t> ((u), 0x11A8u, 0x11FFu, 0xD7CBu, 0xD7FBu))
+
+#define isHangulTone(u) (hb_in_range<hb_codepoint_t> ((u), 0x302Eu, 0x302Fu))
+
+/* buffer var allocations */
+#define hangul_shaping_feature() complex_var_u8_0() /* hangul jamo shaping feature */
+
+static bool
+is_zero_width_char (hb_font_t *font,
+		    hb_codepoint_t unicode)
+{
+  hb_codepoint_t glyph;
+  return hb_font_get_glyph (font, unicode, 0, &glyph) && hb_font_get_glyph_h_advance (font, glyph) == 0;
+}
+
+static void
+preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
+			hb_buffer_t              *buffer,
+			hb_font_t                *font)
+{
+  HB_BUFFER_ALLOCATE_VAR (buffer, hangul_shaping_feature);
+
+  /* Hangul syllables come in two shapes: LV, and LVT.  Of those:
+   *
+   *   - LV can be precomposed, or decomposed.  Lets call those
+   *     <LV> and <L,V>,
+   *   - LVT can be fully precomposed, partically precomposed, or
+   *     fully decomposed.  Ie. <LVT>, <LV,T>, or <L,V,T>.
+   *
+   * The composition / decomposition is mechanical.  However, not
+   * all <L,V> sequences compose, and not all <LV,T> sequences
+   * compose.
+   *
+   * Here are the specifics:
+   *
+   *   - <L>: U+1100..115F, U+A960..A97F
+   *   - <V>: U+1160..11A7, U+D7B0..D7C7
+   *   - <T>: U+11A8..11FF, U+D7CB..D7FB
+   *
+   *   - Only the <L,V> sequences for some of the U+11xx ranges combine.
+   *   - Only <LV,T> sequences for some of the Ts in U+11xx range combine.
+   *
+   * Here is what we want to accomplish in this shaper:
+   *
+   *   - If the whole syllable can be precomposed, do that,
+   *   - Otherwise, fully decompose and apply ljmo/vjmo/tjmo features.
+   *   - If a valid syllable is followed by a Hangul tone mark, reorder the tone
+   *     mark to precede the whole syllable - unless it is a zero-width glyph, in
+   *     which case we leave it untouched, assuming it's designed to overstrike.
+   *
+   * That is, of the different possible syllables:
+   *
+   *   <L>
+   *   <L,V>
+   *   <L,V,T>
+   *   <LV>
+   *   <LVT>
+   *   <LV, T>
+   *
+   * - <L> needs no work.
+   *
+   * - <LV> and <LVT> can stay the way they are if the font supports them, otherwise we
+   *   should fully decompose them if font supports.
+   *
+   * - <L,V> and <L,V,T> we should compose if the whole thing can be composed.
+   *
+   * - <LV,T> we should compose if the whole thing can be composed, otherwise we should
+   *   decompose.
+   */
+
+  buffer->clear_output ();
+  unsigned int start = 0, end = 0; /* Extent of most recently seen syllable;
+				    * valid only if start < end
+				    */
+  unsigned int count = buffer->len;
+
+  for (buffer->idx = 0; buffer->idx < count && buffer->successful;)
+  {
+    hb_codepoint_t u = buffer->cur().codepoint;
+
+    if (isHangulTone (u))
+    {
+      /*
+       * We could cache the width of the tone marks and the existence of dotted-circle,
+       * but the use of the Hangul tone mark characters seems to be rare enough that
+       * I didn't bother for now.
+       */
+      if (start < end && end == buffer->out_len)
+      {
+	/* Tone mark follows a valid syllable; move it in front, unless it's zero width. */
+        buffer->unsafe_to_break_from_outbuffer (start, buffer->idx);
+	buffer->next_glyph ();
+	if (!is_zero_width_char (font, u))
+	{
+	  buffer->merge_out_clusters (start, end + 1);
+	  hb_glyph_info_t *info = buffer->out_info;
+	  hb_glyph_info_t tone = info[end];
+	  memmove (&info[start + 1], &info[start], (end - start) * sizeof (hb_glyph_info_t));
+	  info[start] = tone;
+	}
+      }
+      else
+      {
+	/* No valid syllable as base for tone mark; try to insert dotted circle. */
+	if (font->has_glyph (0x25CCu))
+	{
+	  hb_codepoint_t chars[2];
+	  if (!is_zero_width_char (font, u)) {
+	    chars[0] = u;
+	    chars[1] = 0x25CCu;
+	  } else {
+	    chars[0] = 0x25CCu;
+	    chars[1] = u;
+	  }
+	  buffer->replace_glyphs (1, 2, chars);
+	}
+	else
+	{
+	  /* No dotted circle available in the font; just leave tone mark untouched. */
+	  buffer->next_glyph ();
+	}
+      }
+      start = end = buffer->out_len;
+      continue;
+    }
+
+    start = buffer->out_len; /* Remember current position as a potential syllable start;
+			      * will only be used if we set end to a later position.
+			      */
+
+    if (isL (u) && buffer->idx + 1 < count)
+    {
+      hb_codepoint_t l = u;
+      hb_codepoint_t v = buffer->cur(+1).codepoint;
+      if (isV (v))
+      {
+	/* Have <L,V> or <L,V,T>. */
+	hb_codepoint_t t = 0;
+	unsigned int tindex = 0;
+	if (buffer->idx + 2 < count)
+	{
+	  t = buffer->cur(+2).codepoint;
+	  if (isT (t))
+	    tindex = t - TBase; /* Only used if isCombiningT (t); otherwise invalid. */
+	  else
+	    t = 0; /* The next character was not a trailing jamo. */
+	}
+	buffer->unsafe_to_break (buffer->idx, buffer->idx + (t ? 3 : 2));
+
+	/* We've got a syllable <L,V,T?>; see if it can potentially be composed. */
+	if (isCombiningL (l) && isCombiningV (v) && (t == 0 || isCombiningT (t)))
+	{
+	  /* Try to compose; if this succeeds, end is set to start+1. */
+	  hb_codepoint_t s = SBase + (l - LBase) * NCount + (v - VBase) * TCount + tindex;
+	  if (font->has_glyph (s))
+	  {
+	    buffer->replace_glyphs (t ? 3 : 2, 1, &s);
+	    if (unlikely (!buffer->successful))
+	      return;
+	    end = start + 1;
+	    continue;
+	  }
+	}
+
+	/* We didn't compose, either because it's an Old Hangul syllable without a
+	 * precomposed character in Unicode, or because the font didn't support the
+	 * necessary precomposed glyph.
+	 * Set jamo features on the individual glyphs, and advance past them.
+	 */
+	buffer->cur().hangul_shaping_feature() = LJMO;
+	buffer->next_glyph ();
+	buffer->cur().hangul_shaping_feature() = VJMO;
+	buffer->next_glyph ();
+	if (t)
+	{
+	  buffer->cur().hangul_shaping_feature() = TJMO;
+	  buffer->next_glyph ();
+	  end = start + 3;
+	}
+	else
+	  end = start + 2;
+	if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
+	  buffer->merge_out_clusters (start, end);
+	continue;
+      }
+    }
+
+    else if (isCombinedS (u))
+    {
+      /* Have <LV>, <LVT>, or <LV,T> */
+      hb_codepoint_t s = u;
+      bool has_glyph = font->has_glyph (s);
+      unsigned int lindex = (s - SBase) / NCount;
+      unsigned int nindex = (s - SBase) % NCount;
+      unsigned int vindex = nindex / TCount;
+      unsigned int tindex = nindex % TCount;
+
+      if (!tindex &&
+	  buffer->idx + 1 < count &&
+	  isCombiningT (buffer->cur(+1).codepoint))
+      {
+	/* <LV,T>, try to combine. */
+	unsigned int new_tindex = buffer->cur(+1).codepoint - TBase;
+	hb_codepoint_t new_s = s + new_tindex;
+	if (font->has_glyph (new_s))
+	{
+	  buffer->replace_glyphs (2, 1, &new_s);
+	  if (unlikely (!buffer->successful))
+	    return;
+	  end = start + 1;
+	  continue;
+	}
+	else
+	  buffer->unsafe_to_break (buffer->idx, buffer->idx + 2); /* Mark unsafe between LV and T. */
+      }
+
+      /* Otherwise, decompose if font doesn't support <LV> or <LVT>,
+       * or if having non-combining <LV,T>.  Note that we already handled
+       * combining <LV,T> above. */
+      if (!has_glyph ||
+	  (!tindex &&
+	   buffer->idx + 1 < count &&
+	   isT (buffer->cur(+1).codepoint)))
+      {
+	hb_codepoint_t decomposed[3] = {LBase + lindex,
+					VBase + vindex,
+					TBase + tindex};
+	if (font->has_glyph (decomposed[0]) &&
+	    font->has_glyph (decomposed[1]) &&
+	    (!tindex || font->has_glyph (decomposed[2])))
+	{
+	  unsigned int s_len = tindex ? 3 : 2;
+	  buffer->replace_glyphs (1, s_len, decomposed);
+
+	  /* If we decomposed an LV because of a non-combining T following,
+	   * we want to include this T in the syllable.
+	   */
+	  if (has_glyph && !tindex)
+	  {
+            buffer->next_glyph ();
+            s_len++;
+          }
+
+	  if (unlikely (!buffer->successful))
+	    return;
+
+	  /* We decomposed S: apply jamo features to the individual glyphs
+	   * that are now in buffer->out_info.
+	   */
+	  hb_glyph_info_t *info = buffer->out_info;
+          end = start + s_len;
+
+	  unsigned int i = start;
+	  info[i++].hangul_shaping_feature() = LJMO;
+	  info[i++].hangul_shaping_feature() = VJMO;
+	  if (i < end)
+	    info[i++].hangul_shaping_feature() = TJMO;
+
+	  if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
+	    buffer->merge_out_clusters (start, end);
+	  continue;
+	}
+	else if ((!tindex && buffer->idx + 1 < count && isT (buffer->cur(+1).codepoint)))
+	  buffer->unsafe_to_break (buffer->idx, buffer->idx + 2); /* Mark unsafe between LV and T. */
+      }
+
+      if (has_glyph)
+      {
+        /* We didn't decompose the S, so just advance past it. */
+	end = start + 1;
+	buffer->next_glyph ();
+	continue;
+      }
+    }
+
+    /* Didn't find a recognizable syllable, so we leave end <= start;
+     * this will prevent tone-mark reordering happening.
+     */
+    buffer->next_glyph ();
+  }
+  buffer->swap_buffers ();
+}
+
+static void
+setup_masks_hangul (const hb_ot_shape_plan_t *plan,
+		    hb_buffer_t              *buffer,
+		    hb_font_t                *font HB_UNUSED)
+{
+  const hangul_shape_plan_t *hangul_plan = (const hangul_shape_plan_t *) plan->data;
+
+  if (likely (hangul_plan))
+  {
+    unsigned int count = buffer->len;
+    hb_glyph_info_t *info = buffer->info;
+    for (unsigned int i = 0; i < count; i++, info++)
+      info->mask |= hangul_plan->mask_array[info->hangul_shaping_feature()];
+  }
+
+  HB_BUFFER_DEALLOCATE_VAR (buffer, hangul_shaping_feature);
+}
+
+
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hangul =
+{
+  collect_features_hangul,
+  override_features_hangul,
+  data_create_hangul,
+  data_destroy_hangul,
+  preprocess_text_hangul,
+  nullptr, /* postprocess_glyphs */
+  HB_OT_SHAPE_NORMALIZATION_MODE_NONE,
+  nullptr, /* decompose */
+  nullptr, /* compose */
+  setup_masks_hangul,
+  HB_TAG_NONE, /* gpos_tag */
+  nullptr, /* reorder_marks */
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
+  false, /* fallback_position */
+};
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-hebrew.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-hebrew.cc
new file mode 100644
index 0000000..90c36c0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-hebrew.cc
@@ -0,0 +1,174 @@
+/*
+ * Copyright © 2010,2012  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
+ */
+
+#include "hb-ot-shape-complex.hh"
+
+
+static bool
+compose_hebrew (const hb_ot_shape_normalize_context_t *c,
+		hb_codepoint_t  a,
+		hb_codepoint_t  b,
+		hb_codepoint_t *ab)
+{
+  /* Hebrew presentation-form shaping.
+   * https://bugzilla.mozilla.org/show_bug.cgi?id=728866
+   * Hebrew presentation forms with dagesh, for characters U+05D0..05EA;
+   * Note that some letters do not have a dagesh presForm encoded.
+   */
+  static const hb_codepoint_t sDageshForms[0x05EAu - 0x05D0u + 1] = {
+    0xFB30u, /* ALEF */
+    0xFB31u, /* BET */
+    0xFB32u, /* GIMEL */
+    0xFB33u, /* DALET */
+    0xFB34u, /* HE */
+    0xFB35u, /* VAV */
+    0xFB36u, /* ZAYIN */
+    0x0000u, /* HET */
+    0xFB38u, /* TET */
+    0xFB39u, /* YOD */
+    0xFB3Au, /* FINAL KAF */
+    0xFB3Bu, /* KAF */
+    0xFB3Cu, /* LAMED */
+    0x0000u, /* FINAL MEM */
+    0xFB3Eu, /* MEM */
+    0x0000u, /* FINAL NUN */
+    0xFB40u, /* NUN */
+    0xFB41u, /* SAMEKH */
+    0x0000u, /* AYIN */
+    0xFB43u, /* FINAL PE */
+    0xFB44u, /* PE */
+    0x0000u, /* FINAL TSADI */
+    0xFB46u, /* TSADI */
+    0xFB47u, /* QOF */
+    0xFB48u, /* RESH */
+    0xFB49u, /* SHIN */
+    0xFB4Au /* TAV */
+  };
+
+  bool found = (bool) c->unicode->compose (a, b, ab);
+
+  if (!found && !c->plan->has_gpos_mark)
+  {
+      /* Special-case Hebrew presentation forms that are excluded from
+       * standard normalization, but wanted for old fonts. */
+      switch (b) {
+      case 0x05B4u: /* HIRIQ */
+	  if (a == 0x05D9u) { /* YOD */
+	      *ab = 0xFB1Du;
+	      found = true;
+	  }
+	  break;
+      case 0x05B7u: /* patah */
+	  if (a == 0x05F2u) { /* YIDDISH YOD YOD */
+	      *ab = 0xFB1Fu;
+	      found = true;
+	  } else if (a == 0x05D0u) { /* ALEF */
+	      *ab = 0xFB2Eu;
+	      found = true;
+	  }
+	  break;
+      case 0x05B8u: /* QAMATS */
+	  if (a == 0x05D0u) { /* ALEF */
+	      *ab = 0xFB2Fu;
+	      found = true;
+	  }
+	  break;
+      case 0x05B9u: /* HOLAM */
+	  if (a == 0x05D5u) { /* VAV */
+	      *ab = 0xFB4Bu;
+	      found = true;
+	  }
+	  break;
+      case 0x05BCu: /* DAGESH */
+	  if (a >= 0x05D0u && a <= 0x05EAu) {
+	      *ab = sDageshForms[a - 0x05D0u];
+	      found = (*ab != 0);
+	  } else if (a == 0xFB2Au) { /* SHIN WITH SHIN DOT */
+	      *ab = 0xFB2Cu;
+	      found = true;
+	  } else if (a == 0xFB2Bu) { /* SHIN WITH SIN DOT */
+	      *ab = 0xFB2Du;
+	      found = true;
+	  }
+	  break;
+      case 0x05BFu: /* RAFE */
+	  switch (a) {
+	  case 0x05D1u: /* BET */
+	      *ab = 0xFB4Cu;
+	      found = true;
+	      break;
+	  case 0x05DBu: /* KAF */
+	      *ab = 0xFB4Du;
+	      found = true;
+	      break;
+	  case 0x05E4u: /* PE */
+	      *ab = 0xFB4Eu;
+	      found = true;
+	      break;
+	  }
+	  break;
+      case 0x05C1u: /* SHIN DOT */
+	  if (a == 0x05E9u) { /* SHIN */
+	      *ab = 0xFB2Au;
+	      found = true;
+	  } else if (a == 0xFB49u) { /* SHIN WITH DAGESH */
+	      *ab = 0xFB2Cu;
+	      found = true;
+	  }
+	  break;
+      case 0x05C2u: /* SIN DOT */
+	  if (a == 0x05E9u) { /* SHIN */
+	      *ab = 0xFB2Bu;
+	      found = true;
+	  } else if (a == 0xFB49u) { /* SHIN WITH DAGESH */
+	      *ab = 0xFB2Du;
+	      found = true;
+	  }
+	  break;
+      }
+  }
+
+  return found;
+}
+
+
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hebrew =
+{
+  nullptr, /* collect_features */
+  nullptr, /* override_features */
+  nullptr, /* data_create */
+  nullptr, /* data_destroy */
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
+  HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
+  nullptr, /* decompose */
+  compose_hebrew,
+  nullptr, /* setup_masks */
+  HB_TAG ('h','e','b','r'), /* gpos_tag. https://github.com/harfbuzz/harfbuzz/issues/347#issuecomment-267838368 */
+  nullptr, /* reorder_marks */
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
+  true, /* fallback_position */
+};
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic-machine.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic-machine.hh
new file mode 100644
index 0000000..e2ecfb8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic-machine.hh
@@ -0,0 +1,1115 @@
+
+#line 1 "hb-ot-shape-complex-indic-machine.rl"
+/*
+ * Copyright © 2011,2012  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_SHAPE_COMPLEX_INDIC_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH
+
+#include "hb.hh"
+
+
+#line 36 "hb-ot-shape-complex-indic-machine.hh"
+static const unsigned char _indic_syllable_machine_trans_keys[] = {
+	8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 
+	4u, 8u, 4u, 13u, 8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 
+	4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, 
+	4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 8u, 8u, 4u, 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, 13u, 4u, 8u, 
+	4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 13u, 
+	5u, 8u, 8u, 8u, 1u, 19u, 3u, 13u, 3u, 10u, 4u, 10u, 1u, 16u, 3u, 13u, 
+	3u, 10u, 4u, 10u, 1u, 16u, 3u, 13u, 3u, 10u, 4u, 10u, 1u, 16u, 3u, 13u, 
+	3u, 10u, 4u, 10u, 1u, 16u, 3u, 13u, 3u, 10u, 4u, 10u, 5u, 10u, 5u, 10u, 
+	5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 3u, 10u, 
+	4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 
+	3u, 10u, 4u, 10u, 3u, 10u, 3u, 13u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 10u, 
+	3u, 13u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 10u, 3u, 13u, 1u, 16u, 1u, 16u, 
+	1u, 16u, 3u, 10u, 3u, 13u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 10u, 3u, 13u, 
+	3u, 13u, 3u, 10u, 4u, 10u, 1u, 16u, 3u, 13u, 3u, 10u, 4u, 10u, 1u, 16u, 
+	3u, 13u, 3u, 10u, 4u, 10u, 1u, 16u, 3u, 13u, 3u, 10u, 4u, 10u, 1u, 16u, 
+	3u, 13u, 3u, 10u, 4u, 10u, 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 
+	10u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 
+	4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 3u, 10u, 
+	3u, 13u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 10u, 3u, 13u, 1u, 16u, 1u, 16u, 
+	1u, 16u, 3u, 10u, 3u, 13u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 10u, 3u, 13u, 
+	1u, 16u, 1u, 16u, 1u, 16u, 4u, 8u, 3u, 10u, 3u, 10u, 4u, 10u, 1u, 16u, 
+	3u, 13u, 3u, 10u, 4u, 10u, 1u, 16u, 3u, 13u, 3u, 10u, 4u, 10u, 1u, 16u, 
+	3u, 13u, 3u, 10u, 4u, 10u, 1u, 16u, 3u, 13u, 3u, 10u, 4u, 10u, 5u, 10u, 
+	5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 
+	3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 
+	5u, 10u, 3u, 10u, 4u, 10u, 3u, 10u, 3u, 13u, 1u, 16u, 1u, 16u, 1u, 16u, 
+	3u, 10u, 3u, 13u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 10u, 3u, 13u, 1u, 16u, 
+	1u, 16u, 1u, 16u, 3u, 10u, 3u, 13u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 13u, 
+	3u, 10u, 4u, 8u, 3u, 13u, 3u, 10u, 4u, 10u, 1u, 16u, 3u, 13u, 3u, 10u, 
+	4u, 10u, 1u, 16u, 3u, 13u, 3u, 10u, 4u, 10u, 1u, 16u, 3u, 13u, 3u, 10u, 
+	4u, 10u, 1u, 16u, 3u, 13u, 3u, 10u, 4u, 10u, 5u, 10u, 5u, 10u, 5u, 10u, 
+	10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 
+	5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 
+	4u, 10u, 3u, 10u, 3u, 13u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 10u, 3u, 13u, 
+	1u, 16u, 1u, 16u, 1u, 16u, 3u, 10u, 3u, 13u, 1u, 16u, 1u, 16u, 1u, 16u, 
+	3u, 10u, 3u, 13u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 10u, 1u, 16u, 3u, 13u, 
+	1u, 16u, 4u, 13u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 
+	3u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 
+	0
+};
+
+static const char _indic_syllable_machine_key_spans[] = {
+	1, 5, 3, 1, 4, 3, 1, 4, 
+	3, 1, 4, 3, 1, 5, 1, 1, 
+	5, 1, 1, 5, 1, 1, 5, 1, 
+	1, 10, 5, 10, 5, 10, 5, 10, 
+	5, 10, 1, 5, 3, 1, 4, 3, 
+	1, 4, 3, 1, 4, 3, 1, 5, 
+	1, 1, 5, 1, 1, 5, 1, 1, 
+	5, 1, 1, 10, 5, 10, 5, 10, 
+	5, 10, 5, 10, 1, 5, 3, 1, 
+	4, 3, 1, 4, 3, 1, 4, 3, 
+	1, 5, 1, 1, 5, 1, 1, 5, 
+	1, 1, 5, 1, 1, 10, 5, 10, 
+	5, 10, 5, 10, 5, 1, 5, 3, 
+	1, 4, 3, 1, 4, 3, 1, 4, 
+	3, 1, 5, 1, 1, 5, 1, 1, 
+	5, 1, 1, 5, 1, 1, 10, 5, 
+	10, 5, 10, 5, 10, 5, 10, 10, 
+	4, 1, 19, 11, 8, 7, 16, 11, 
+	8, 7, 16, 11, 8, 7, 16, 11, 
+	8, 7, 16, 11, 8, 7, 6, 6, 
+	6, 1, 1, 1, 6, 8, 6, 8, 
+	7, 6, 8, 7, 6, 8, 7, 6, 
+	8, 7, 8, 11, 16, 16, 16, 8, 
+	11, 16, 16, 16, 8, 11, 16, 16, 
+	16, 8, 11, 16, 16, 16, 8, 11, 
+	11, 8, 7, 16, 11, 8, 7, 16, 
+	11, 8, 7, 16, 11, 8, 7, 16, 
+	11, 8, 7, 6, 6, 6, 1, 1, 
+	1, 6, 8, 6, 8, 7, 6, 8, 
+	7, 6, 8, 7, 6, 8, 7, 8, 
+	11, 16, 16, 16, 8, 11, 16, 16, 
+	16, 8, 11, 16, 16, 16, 8, 11, 
+	16, 16, 16, 5, 8, 8, 7, 16, 
+	11, 8, 7, 16, 11, 8, 7, 16, 
+	11, 8, 7, 16, 11, 8, 7, 6, 
+	6, 6, 1, 1, 1, 6, 8, 6, 
+	8, 7, 6, 8, 7, 6, 8, 7, 
+	6, 8, 7, 8, 11, 16, 16, 16, 
+	8, 11, 16, 16, 16, 8, 11, 16, 
+	16, 16, 8, 11, 16, 16, 16, 10, 
+	8, 5, 11, 8, 7, 16, 11, 8, 
+	7, 16, 11, 8, 7, 16, 11, 8, 
+	7, 16, 11, 8, 7, 6, 6, 6, 
+	1, 1, 1, 6, 8, 6, 8, 7, 
+	6, 8, 7, 6, 8, 7, 6, 8, 
+	7, 8, 11, 16, 16, 16, 8, 11, 
+	16, 16, 16, 8, 11, 16, 16, 16, 
+	8, 11, 16, 16, 16, 8, 16, 11, 
+	16, 10, 6, 1, 1, 1, 6, 16, 
+	8, 6, 6, 1, 1, 1, 6, 16
+};
+
+static const short _indic_syllable_machine_index_offsets[] = {
+	0, 2, 8, 12, 14, 19, 23, 25, 
+	30, 34, 36, 41, 45, 47, 53, 55, 
+	57, 63, 65, 67, 73, 75, 77, 83, 
+	85, 87, 98, 104, 115, 121, 132, 138, 
+	149, 155, 166, 168, 174, 178, 180, 185, 
+	189, 191, 196, 200, 202, 207, 211, 213, 
+	219, 221, 223, 229, 231, 233, 239, 241, 
+	243, 249, 251, 253, 264, 270, 281, 287, 
+	298, 304, 315, 321, 332, 334, 340, 344, 
+	346, 351, 355, 357, 362, 366, 368, 373, 
+	377, 379, 385, 387, 389, 395, 397, 399, 
+	405, 407, 409, 415, 417, 419, 430, 436, 
+	447, 453, 464, 470, 481, 487, 489, 495, 
+	499, 501, 506, 510, 512, 517, 521, 523, 
+	528, 532, 534, 540, 542, 544, 550, 552, 
+	554, 560, 562, 564, 570, 572, 574, 585, 
+	591, 602, 608, 619, 625, 636, 642, 653, 
+	664, 669, 671, 691, 703, 712, 720, 737, 
+	749, 758, 766, 783, 795, 804, 812, 829, 
+	841, 850, 858, 875, 887, 896, 904, 911, 
+	918, 925, 927, 929, 931, 938, 947, 954, 
+	963, 971, 978, 987, 995, 1002, 1011, 1019, 
+	1026, 1035, 1043, 1052, 1064, 1081, 1098, 1115, 
+	1124, 1136, 1153, 1170, 1187, 1196, 1208, 1225, 
+	1242, 1259, 1268, 1280, 1297, 1314, 1331, 1340, 
+	1352, 1364, 1373, 1381, 1398, 1410, 1419, 1427, 
+	1444, 1456, 1465, 1473, 1490, 1502, 1511, 1519, 
+	1536, 1548, 1557, 1565, 1572, 1579, 1586, 1588, 
+	1590, 1592, 1599, 1608, 1615, 1624, 1632, 1639, 
+	1648, 1656, 1663, 1672, 1680, 1687, 1696, 1704, 
+	1713, 1725, 1742, 1759, 1776, 1785, 1797, 1814, 
+	1831, 1848, 1857, 1869, 1886, 1903, 1920, 1929, 
+	1941, 1958, 1975, 1992, 1998, 2007, 2016, 2024, 
+	2041, 2053, 2062, 2070, 2087, 2099, 2108, 2116, 
+	2133, 2145, 2154, 2162, 2179, 2191, 2200, 2208, 
+	2215, 2222, 2229, 2231, 2233, 2235, 2242, 2251, 
+	2258, 2267, 2275, 2282, 2291, 2299, 2306, 2315, 
+	2323, 2330, 2339, 2347, 2356, 2368, 2385, 2402, 
+	2419, 2428, 2440, 2457, 2474, 2491, 2500, 2512, 
+	2529, 2546, 2563, 2572, 2584, 2601, 2618, 2635, 
+	2646, 2655, 2661, 2673, 2682, 2690, 2707, 2719, 
+	2728, 2736, 2753, 2765, 2774, 2782, 2799, 2811, 
+	2820, 2828, 2845, 2857, 2866, 2874, 2881, 2888, 
+	2895, 2897, 2899, 2901, 2908, 2917, 2924, 2933, 
+	2941, 2948, 2957, 2965, 2972, 2981, 2989, 2996, 
+	3005, 3013, 3022, 3034, 3051, 3068, 3085, 3094, 
+	3106, 3123, 3140, 3157, 3166, 3178, 3195, 3212, 
+	3229, 3238, 3250, 3267, 3284, 3301, 3310, 3327, 
+	3339, 3356, 3367, 3374, 3376, 3378, 3380, 3387, 
+	3404, 3413, 3420, 3427, 3429, 3431, 3433, 3440
+};
+
+static const short _indic_syllable_machine_indicies[] = {
+	1, 0, 2, 3, 3, 4, 1, 0, 
+	5, 5, 4, 0, 4, 0, 6, 6, 
+	7, 1, 0, 8, 8, 7, 0, 7, 
+	0, 9, 9, 10, 1, 0, 11, 11, 
+	10, 0, 10, 0, 12, 12, 13, 1, 
+	0, 14, 14, 13, 0, 13, 0, 15, 
+	0, 0, 0, 1, 0, 16, 0, 17, 
+	0, 18, 12, 12, 13, 1, 0, 19, 
+	0, 20, 0, 21, 9, 9, 10, 1, 
+	0, 22, 0, 23, 0, 24, 6, 6, 
+	7, 1, 0, 25, 0, 26, 0, 2, 
+	3, 3, 4, 1, 0, 0, 0, 0, 
+	27, 0, 28, 3, 3, 4, 1, 0, 
+	28, 3, 3, 4, 1, 0, 0, 0, 
+	0, 29, 0, 30, 3, 3, 4, 1, 
+	0, 30, 3, 3, 4, 1, 0, 0, 
+	0, 0, 31, 0, 32, 3, 3, 4, 
+	1, 0, 32, 3, 3, 4, 1, 0, 
+	0, 0, 0, 33, 0, 34, 3, 3, 
+	4, 1, 0, 34, 3, 3, 4, 1, 
+	0, 0, 0, 0, 35, 0, 37, 36, 
+	38, 39, 39, 40, 37, 36, 41, 41, 
+	40, 36, 40, 36, 42, 42, 43, 37, 
+	36, 44, 44, 43, 36, 43, 36, 45, 
+	45, 46, 37, 36, 47, 47, 46, 36, 
+	46, 36, 48, 48, 49, 37, 36, 50, 
+	50, 49, 36, 49, 36, 51, 36, 36, 
+	36, 37, 36, 52, 36, 53, 36, 54, 
+	48, 48, 49, 37, 36, 55, 36, 56, 
+	36, 57, 45, 45, 46, 37, 36, 58, 
+	36, 59, 36, 60, 42, 42, 43, 37, 
+	36, 61, 36, 62, 36, 38, 39, 39, 
+	40, 37, 36, 36, 36, 36, 63, 36, 
+	64, 39, 39, 40, 37, 36, 64, 39, 
+	39, 40, 37, 36, 36, 36, 36, 65, 
+	36, 66, 39, 39, 40, 37, 36, 66, 
+	39, 39, 40, 37, 36, 36, 36, 36, 
+	67, 36, 68, 39, 39, 40, 37, 36, 
+	68, 39, 39, 40, 37, 36, 36, 36, 
+	36, 69, 36, 70, 39, 39, 40, 37, 
+	36, 70, 39, 39, 40, 37, 36, 36, 
+	36, 36, 71, 36, 73, 72, 74, 75, 
+	75, 76, 73, 72, 78, 78, 76, 77, 
+	76, 77, 79, 79, 80, 73, 72, 81, 
+	81, 80, 72, 80, 72, 82, 82, 83, 
+	73, 72, 84, 84, 83, 72, 83, 72, 
+	85, 85, 86, 73, 72, 87, 87, 86, 
+	72, 86, 72, 88, 72, 72, 72, 73, 
+	72, 89, 72, 90, 72, 91, 85, 85, 
+	86, 73, 72, 92, 72, 93, 72, 94, 
+	82, 82, 83, 73, 72, 95, 72, 96, 
+	72, 97, 79, 79, 80, 73, 72, 98, 
+	72, 99, 72, 74, 75, 75, 76, 73, 
+	72, 72, 72, 72, 100, 72, 101, 75, 
+	75, 76, 73, 72, 101, 75, 75, 76, 
+	73, 72, 72, 72, 72, 102, 72, 103, 
+	75, 75, 76, 73, 72, 103, 75, 75, 
+	76, 73, 72, 72, 72, 72, 104, 72, 
+	105, 75, 75, 76, 73, 72, 105, 75, 
+	75, 76, 73, 72, 72, 72, 72, 106, 
+	72, 107, 75, 75, 76, 73, 72, 109, 
+	108, 110, 111, 111, 112, 109, 108, 113, 
+	113, 112, 108, 112, 108, 114, 114, 115, 
+	109, 108, 116, 116, 115, 108, 115, 108, 
+	117, 117, 118, 109, 108, 119, 119, 118, 
+	108, 118, 108, 120, 120, 121, 109, 108, 
+	122, 122, 121, 108, 121, 108, 123, 108, 
+	108, 108, 109, 108, 124, 108, 125, 108, 
+	126, 120, 120, 121, 109, 108, 127, 108, 
+	128, 108, 129, 117, 117, 118, 109, 108, 
+	130, 108, 131, 108, 132, 114, 114, 115, 
+	109, 108, 133, 108, 134, 108, 110, 111, 
+	111, 112, 109, 108, 108, 108, 108, 135, 
+	108, 136, 111, 111, 112, 109, 108, 136, 
+	111, 111, 112, 109, 108, 108, 108, 108, 
+	137, 108, 138, 111, 111, 112, 109, 108, 
+	138, 111, 111, 112, 109, 108, 108, 108, 
+	108, 139, 108, 140, 111, 111, 112, 109, 
+	108, 140, 111, 111, 112, 109, 108, 108, 
+	108, 108, 141, 108, 142, 111, 111, 112, 
+	109, 108, 142, 111, 111, 112, 109, 108, 
+	108, 108, 108, 143, 108, 107, 75, 75, 
+	76, 73, 72, 72, 72, 72, 144, 72, 
+	78, 78, 76, 1, 0, 146, 145, 148, 
+	149, 150, 151, 152, 153, 76, 73, 147, 
+	154, 155, 155, 144, 147, 156, 157, 147, 
+	158, 159, 147, 161, 162, 163, 164, 4, 
+	1, 160, 165, 160, 160, 35, 160, 166, 
+	162, 167, 167, 4, 1, 160, 165, 160, 
+	162, 167, 167, 4, 1, 160, 165, 160, 
+	168, 160, 160, 160, 17, 169, 160, 1, 
+	160, 165, 160, 160, 160, 160, 160, 168, 
+	160, 170, 171, 172, 173, 4, 1, 160, 
+	165, 160, 160, 33, 160, 174, 171, 175, 
+	175, 4, 1, 160, 165, 160, 171, 175, 
+	175, 4, 1, 160, 165, 160, 176, 160, 
+	160, 160, 17, 177, 160, 1, 160, 165, 
+	160, 160, 160, 160, 160, 176, 160, 178, 
+	179, 180, 181, 4, 1, 160, 165, 160, 
+	160, 31, 160, 182, 179, 183, 183, 4, 
+	1, 160, 165, 160, 179, 183, 183, 4, 
+	1, 160, 165, 160, 184, 160, 160, 160, 
+	17, 185, 160, 1, 160, 165, 160, 160, 
+	160, 160, 160, 184, 160, 186, 187, 188, 
+	189, 4, 1, 160, 165, 160, 160, 29, 
+	160, 190, 187, 191, 191, 4, 1, 160, 
+	165, 160, 187, 191, 191, 4, 1, 160, 
+	165, 160, 192, 160, 160, 160, 17, 193, 
+	160, 1, 160, 165, 160, 160, 160, 160, 
+	160, 192, 160, 194, 195, 196, 197, 4, 
+	1, 160, 165, 160, 160, 27, 160, 198, 
+	195, 199, 199, 4, 1, 160, 165, 160, 
+	195, 199, 199, 4, 1, 160, 165, 160, 
+	17, 200, 160, 1, 160, 165, 160, 201, 
+	201, 160, 1, 160, 165, 160, 202, 160, 
+	160, 203, 160, 165, 160, 165, 160, 204, 
+	160, 205, 160, 202, 160, 160, 160, 160, 
+	165, 160, 17, 160, 201, 201, 160, 1, 
+	160, 165, 160, 201, 200, 160, 1, 160, 
+	165, 160, 206, 26, 207, 208, 7, 1, 
+	160, 165, 160, 26, 207, 208, 7, 1, 
+	160, 165, 160, 207, 207, 7, 1, 160, 
+	165, 160, 209, 23, 210, 211, 10, 1, 
+	160, 165, 160, 23, 210, 211, 10, 1, 
+	160, 165, 160, 210, 210, 10, 1, 160, 
+	165, 160, 212, 20, 213, 214, 13, 1, 
+	160, 165, 160, 20, 213, 214, 13, 1, 
+	160, 165, 160, 213, 213, 13, 1, 160, 
+	165, 160, 215, 17, 201, 216, 160, 1, 
+	160, 165, 160, 17, 201, 216, 160, 1, 
+	160, 165, 160, 194, 195, 199, 199, 4, 
+	1, 160, 165, 160, 194, 195, 196, 199, 
+	4, 1, 160, 165, 160, 160, 27, 160, 
+	192, 160, 217, 160, 201, 201, 160, 1, 
+	160, 165, 160, 160, 160, 160, 160, 192, 
+	160, 192, 160, 160, 160, 201, 201, 160, 
+	1, 160, 165, 160, 160, 160, 160, 160, 
+	192, 160, 192, 160, 160, 160, 201, 193, 
+	160, 1, 160, 165, 160, 160, 160, 160, 
+	160, 192, 160, 186, 187, 191, 191, 4, 
+	1, 160, 165, 160, 186, 187, 188, 191, 
+	4, 1, 160, 165, 160, 160, 29, 160, 
+	184, 160, 218, 160, 201, 201, 160, 1, 
+	160, 165, 160, 160, 160, 160, 160, 184, 
+	160, 184, 160, 160, 160, 201, 201, 160, 
+	1, 160, 165, 160, 160, 160, 160, 160, 
+	184, 160, 184, 160, 160, 160, 201, 185, 
+	160, 1, 160, 165, 160, 160, 160, 160, 
+	160, 184, 160, 178, 179, 183, 183, 4, 
+	1, 160, 165, 160, 178, 179, 180, 183, 
+	4, 1, 160, 165, 160, 160, 31, 160, 
+	176, 160, 219, 160, 201, 201, 160, 1, 
+	160, 165, 160, 160, 160, 160, 160, 176, 
+	160, 176, 160, 160, 160, 201, 201, 160, 
+	1, 160, 165, 160, 160, 160, 160, 160, 
+	176, 160, 176, 160, 160, 160, 201, 177, 
+	160, 1, 160, 165, 160, 160, 160, 160, 
+	160, 176, 160, 170, 171, 175, 175, 4, 
+	1, 160, 165, 160, 170, 171, 172, 175, 
+	4, 1, 160, 165, 160, 160, 33, 160, 
+	168, 160, 220, 160, 201, 201, 160, 1, 
+	160, 165, 160, 160, 160, 160, 160, 168, 
+	160, 168, 160, 160, 160, 201, 201, 160, 
+	1, 160, 165, 160, 160, 160, 160, 160, 
+	168, 160, 168, 160, 160, 160, 201, 169, 
+	160, 1, 160, 165, 160, 160, 160, 160, 
+	160, 168, 160, 161, 162, 167, 167, 4, 
+	1, 160, 165, 160, 161, 162, 163, 167, 
+	4, 1, 160, 165, 160, 160, 35, 160, 
+	222, 223, 224, 225, 40, 37, 221, 226, 
+	221, 221, 71, 221, 227, 223, 228, 225, 
+	40, 37, 221, 226, 221, 223, 228, 225, 
+	40, 37, 221, 226, 221, 229, 221, 221, 
+	221, 53, 230, 221, 37, 221, 226, 221, 
+	221, 221, 221, 221, 229, 221, 231, 232, 
+	233, 234, 40, 37, 221, 226, 221, 221, 
+	69, 221, 235, 232, 236, 236, 40, 37, 
+	221, 226, 221, 232, 236, 236, 40, 37, 
+	221, 226, 221, 237, 221, 221, 221, 53, 
+	238, 221, 37, 221, 226, 221, 221, 221, 
+	221, 221, 237, 221, 239, 240, 241, 242, 
+	40, 37, 221, 226, 221, 221, 67, 221, 
+	243, 240, 244, 244, 40, 37, 221, 226, 
+	221, 240, 244, 244, 40, 37, 221, 226, 
+	221, 245, 221, 221, 221, 53, 246, 221, 
+	37, 221, 226, 221, 221, 221, 221, 221, 
+	245, 221, 247, 248, 249, 250, 40, 37, 
+	221, 226, 221, 221, 65, 221, 251, 248, 
+	252, 252, 40, 37, 221, 226, 221, 248, 
+	252, 252, 40, 37, 221, 226, 221, 253, 
+	221, 221, 221, 53, 254, 221, 37, 221, 
+	226, 221, 221, 221, 221, 221, 253, 221, 
+	255, 256, 257, 258, 40, 37, 221, 226, 
+	221, 221, 63, 221, 259, 256, 260, 260, 
+	40, 37, 221, 226, 221, 256, 260, 260, 
+	40, 37, 221, 226, 221, 53, 261, 221, 
+	37, 221, 226, 221, 262, 262, 221, 37, 
+	221, 226, 221, 263, 221, 221, 264, 221, 
+	226, 221, 226, 221, 265, 221, 266, 221, 
+	263, 221, 221, 221, 221, 226, 221, 53, 
+	221, 262, 262, 221, 37, 221, 226, 221, 
+	262, 261, 221, 37, 221, 226, 221, 267, 
+	62, 268, 269, 43, 37, 221, 226, 221, 
+	62, 268, 269, 43, 37, 221, 226, 221, 
+	268, 268, 43, 37, 221, 226, 221, 270, 
+	59, 271, 272, 46, 37, 221, 226, 221, 
+	59, 271, 272, 46, 37, 221, 226, 221, 
+	271, 271, 46, 37, 221, 226, 221, 273, 
+	56, 274, 275, 49, 37, 221, 226, 221, 
+	56, 274, 275, 49, 37, 221, 226, 221, 
+	274, 274, 49, 37, 221, 226, 221, 276, 
+	53, 262, 277, 221, 37, 221, 226, 221, 
+	53, 262, 277, 221, 37, 221, 226, 221, 
+	255, 256, 260, 260, 40, 37, 221, 226, 
+	221, 255, 256, 257, 260, 40, 37, 221, 
+	226, 221, 221, 63, 221, 253, 221, 278, 
+	221, 262, 262, 221, 37, 221, 226, 221, 
+	221, 221, 221, 221, 253, 221, 253, 221, 
+	221, 221, 262, 262, 221, 37, 221, 226, 
+	221, 221, 221, 221, 221, 253, 221, 253, 
+	221, 221, 221, 262, 254, 221, 37, 221, 
+	226, 221, 221, 221, 221, 221, 253, 221, 
+	247, 248, 252, 252, 40, 37, 221, 226, 
+	221, 247, 248, 249, 252, 40, 37, 221, 
+	226, 221, 221, 65, 221, 245, 221, 279, 
+	221, 262, 262, 221, 37, 221, 226, 221, 
+	221, 221, 221, 221, 245, 221, 245, 221, 
+	221, 221, 262, 262, 221, 37, 221, 226, 
+	221, 221, 221, 221, 221, 245, 221, 245, 
+	221, 221, 221, 262, 246, 221, 37, 221, 
+	226, 221, 221, 221, 221, 221, 245, 221, 
+	239, 240, 244, 244, 40, 37, 221, 226, 
+	221, 239, 240, 241, 244, 40, 37, 221, 
+	226, 221, 221, 67, 221, 237, 221, 280, 
+	221, 262, 262, 221, 37, 221, 226, 221, 
+	221, 221, 221, 221, 237, 221, 237, 221, 
+	221, 221, 262, 262, 221, 37, 221, 226, 
+	221, 221, 221, 221, 221, 237, 221, 237, 
+	221, 221, 221, 262, 238, 221, 37, 221, 
+	226, 221, 221, 221, 221, 221, 237, 221, 
+	231, 232, 236, 236, 40, 37, 221, 226, 
+	221, 231, 232, 233, 236, 40, 37, 221, 
+	226, 221, 221, 69, 221, 229, 221, 281, 
+	221, 262, 262, 221, 37, 221, 226, 221, 
+	221, 221, 221, 221, 229, 221, 229, 221, 
+	221, 221, 262, 262, 221, 37, 221, 226, 
+	221, 221, 221, 221, 221, 229, 221, 229, 
+	221, 221, 221, 262, 230, 221, 37, 221, 
+	226, 221, 221, 221, 221, 221, 229, 221, 
+	70, 39, 39, 40, 37, 221, 222, 223, 
+	228, 225, 40, 37, 221, 226, 221, 283, 
+	151, 284, 284, 76, 73, 282, 154, 282, 
+	151, 284, 284, 76, 73, 282, 154, 282, 
+	285, 282, 282, 282, 90, 286, 282, 73, 
+	282, 154, 282, 282, 282, 282, 282, 285, 
+	282, 287, 288, 289, 290, 76, 73, 282, 
+	154, 282, 282, 106, 282, 291, 288, 292, 
+	292, 76, 73, 282, 154, 282, 288, 292, 
+	292, 76, 73, 282, 154, 282, 293, 282, 
+	282, 282, 90, 294, 282, 73, 282, 154, 
+	282, 282, 282, 282, 282, 293, 282, 295, 
+	296, 297, 298, 76, 73, 282, 154, 282, 
+	282, 104, 282, 299, 296, 300, 300, 76, 
+	73, 282, 154, 282, 296, 300, 300, 76, 
+	73, 282, 154, 282, 301, 282, 282, 282, 
+	90, 302, 282, 73, 282, 154, 282, 282, 
+	282, 282, 282, 301, 282, 303, 304, 305, 
+	306, 76, 73, 282, 154, 282, 282, 102, 
+	282, 307, 304, 308, 308, 76, 73, 282, 
+	154, 282, 304, 308, 308, 76, 73, 282, 
+	154, 282, 309, 282, 282, 282, 90, 310, 
+	282, 73, 282, 154, 282, 282, 282, 282, 
+	282, 309, 282, 311, 312, 313, 314, 76, 
+	73, 282, 154, 282, 282, 100, 282, 315, 
+	312, 316, 316, 76, 73, 282, 154, 282, 
+	312, 316, 316, 76, 73, 282, 154, 282, 
+	90, 317, 282, 73, 282, 154, 282, 318, 
+	318, 282, 73, 282, 154, 282, 319, 282, 
+	282, 320, 282, 154, 282, 154, 282, 321, 
+	282, 322, 282, 319, 282, 282, 282, 282, 
+	154, 282, 90, 282, 318, 318, 282, 73, 
+	282, 154, 282, 318, 317, 282, 73, 282, 
+	154, 282, 323, 99, 324, 325, 80, 73, 
+	282, 154, 282, 99, 324, 325, 80, 73, 
+	282, 154, 282, 324, 324, 80, 73, 282, 
+	154, 282, 326, 96, 327, 328, 83, 73, 
+	282, 154, 282, 96, 327, 328, 83, 73, 
+	282, 154, 282, 327, 327, 83, 73, 282, 
+	154, 282, 329, 93, 330, 331, 86, 73, 
+	282, 154, 282, 93, 330, 331, 86, 73, 
+	282, 154, 282, 330, 330, 86, 73, 282, 
+	154, 282, 332, 90, 318, 333, 282, 73, 
+	282, 154, 282, 90, 318, 333, 282, 73, 
+	282, 154, 282, 311, 312, 316, 316, 76, 
+	73, 282, 154, 282, 311, 312, 313, 316, 
+	76, 73, 282, 154, 282, 282, 100, 282, 
+	309, 282, 334, 282, 318, 318, 282, 73, 
+	282, 154, 282, 282, 282, 282, 282, 309, 
+	282, 309, 282, 282, 282, 318, 318, 282, 
+	73, 282, 154, 282, 282, 282, 282, 282, 
+	309, 282, 309, 282, 282, 282, 318, 310, 
+	282, 73, 282, 154, 282, 282, 282, 282, 
+	282, 309, 282, 303, 304, 308, 308, 76, 
+	73, 282, 154, 282, 303, 304, 305, 308, 
+	76, 73, 282, 154, 282, 282, 102, 282, 
+	301, 282, 335, 282, 318, 318, 282, 73, 
+	282, 154, 282, 282, 282, 282, 282, 301, 
+	282, 301, 282, 282, 282, 318, 318, 282, 
+	73, 282, 154, 282, 282, 282, 282, 282, 
+	301, 282, 301, 282, 282, 282, 318, 302, 
+	282, 73, 282, 154, 282, 282, 282, 282, 
+	282, 301, 282, 295, 296, 300, 300, 76, 
+	73, 282, 154, 282, 295, 296, 297, 300, 
+	76, 73, 282, 154, 282, 282, 104, 282, 
+	293, 282, 336, 282, 318, 318, 282, 73, 
+	282, 154, 282, 282, 282, 282, 282, 293, 
+	282, 293, 282, 282, 282, 318, 318, 282, 
+	73, 282, 154, 282, 282, 282, 282, 282, 
+	293, 282, 293, 282, 282, 282, 318, 294, 
+	282, 73, 282, 154, 282, 282, 282, 282, 
+	282, 293, 282, 287, 288, 292, 292, 76, 
+	73, 282, 154, 282, 287, 288, 289, 292, 
+	76, 73, 282, 154, 282, 282, 106, 282, 
+	285, 282, 337, 282, 318, 318, 282, 73, 
+	282, 154, 282, 282, 282, 282, 282, 285, 
+	282, 285, 282, 282, 282, 318, 318, 282, 
+	73, 282, 154, 282, 282, 282, 282, 282, 
+	285, 282, 285, 282, 282, 282, 318, 286, 
+	282, 73, 282, 154, 282, 282, 282, 282, 
+	282, 285, 282, 107, 75, 75, 76, 73, 
+	338, 338, 338, 338, 144, 338, 150, 151, 
+	284, 284, 76, 73, 282, 154, 282, 107, 
+	75, 75, 76, 73, 338, 340, 341, 342, 
+	343, 112, 109, 339, 344, 339, 339, 143, 
+	339, 345, 341, 343, 343, 112, 109, 339, 
+	344, 339, 341, 343, 343, 112, 109, 339, 
+	344, 339, 346, 339, 339, 339, 125, 347, 
+	339, 109, 339, 344, 339, 339, 339, 339, 
+	339, 346, 339, 348, 349, 350, 351, 112, 
+	109, 339, 344, 339, 339, 141, 339, 352, 
+	349, 353, 353, 112, 109, 339, 344, 339, 
+	349, 353, 353, 112, 109, 339, 344, 339, 
+	354, 339, 339, 339, 125, 355, 339, 109, 
+	339, 344, 339, 339, 339, 339, 339, 354, 
+	339, 356, 357, 358, 359, 112, 109, 339, 
+	344, 339, 339, 139, 339, 360, 357, 361, 
+	361, 112, 109, 339, 344, 339, 357, 361, 
+	361, 112, 109, 339, 344, 339, 362, 339, 
+	339, 339, 125, 363, 339, 109, 339, 344, 
+	339, 339, 339, 339, 339, 362, 339, 364, 
+	365, 366, 367, 112, 109, 339, 344, 339, 
+	339, 137, 339, 368, 365, 369, 369, 112, 
+	109, 339, 344, 339, 365, 369, 369, 112, 
+	109, 339, 344, 339, 370, 339, 339, 339, 
+	125, 371, 339, 109, 339, 344, 339, 339, 
+	339, 339, 339, 370, 339, 372, 373, 374, 
+	375, 112, 109, 339, 344, 339, 339, 135, 
+	339, 376, 373, 377, 377, 112, 109, 339, 
+	344, 339, 373, 377, 377, 112, 109, 339, 
+	344, 339, 125, 378, 339, 109, 339, 344, 
+	339, 379, 379, 339, 109, 339, 344, 339, 
+	380, 339, 339, 381, 339, 344, 339, 344, 
+	339, 382, 339, 383, 339, 380, 339, 339, 
+	339, 339, 344, 339, 125, 339, 379, 379, 
+	339, 109, 339, 344, 339, 379, 378, 339, 
+	109, 339, 344, 339, 384, 134, 385, 386, 
+	115, 109, 339, 344, 339, 134, 385, 386, 
+	115, 109, 339, 344, 339, 385, 385, 115, 
+	109, 339, 344, 339, 387, 131, 388, 389, 
+	118, 109, 339, 344, 339, 131, 388, 389, 
+	118, 109, 339, 344, 339, 388, 388, 118, 
+	109, 339, 344, 339, 390, 128, 391, 392, 
+	121, 109, 339, 344, 339, 128, 391, 392, 
+	121, 109, 339, 344, 339, 391, 391, 121, 
+	109, 339, 344, 339, 393, 125, 379, 394, 
+	339, 109, 339, 344, 339, 125, 379, 394, 
+	339, 109, 339, 344, 339, 372, 373, 377, 
+	377, 112, 109, 339, 344, 339, 372, 373, 
+	374, 377, 112, 109, 339, 344, 339, 339, 
+	135, 339, 370, 339, 395, 339, 379, 379, 
+	339, 109, 339, 344, 339, 339, 339, 339, 
+	339, 370, 339, 370, 339, 339, 339, 379, 
+	379, 339, 109, 339, 344, 339, 339, 339, 
+	339, 339, 370, 339, 370, 339, 339, 339, 
+	379, 371, 339, 109, 339, 344, 339, 339, 
+	339, 339, 339, 370, 339, 364, 365, 369, 
+	369, 112, 109, 339, 344, 339, 364, 365, 
+	366, 369, 112, 109, 339, 344, 339, 339, 
+	137, 339, 362, 339, 396, 339, 379, 379, 
+	339, 109, 339, 344, 339, 339, 339, 339, 
+	339, 362, 339, 362, 339, 339, 339, 379, 
+	379, 339, 109, 339, 344, 339, 339, 339, 
+	339, 339, 362, 339, 362, 339, 339, 339, 
+	379, 363, 339, 109, 339, 344, 339, 339, 
+	339, 339, 339, 362, 339, 356, 357, 361, 
+	361, 112, 109, 339, 344, 339, 356, 357, 
+	358, 361, 112, 109, 339, 344, 339, 339, 
+	139, 339, 354, 339, 397, 339, 379, 379, 
+	339, 109, 339, 344, 339, 339, 339, 339, 
+	339, 354, 339, 354, 339, 339, 339, 379, 
+	379, 339, 109, 339, 344, 339, 339, 339, 
+	339, 339, 354, 339, 354, 339, 339, 339, 
+	379, 355, 339, 109, 339, 344, 339, 339, 
+	339, 339, 339, 354, 339, 348, 349, 353, 
+	353, 112, 109, 339, 344, 339, 348, 349, 
+	350, 353, 112, 109, 339, 344, 339, 339, 
+	141, 339, 346, 339, 398, 339, 379, 379, 
+	339, 109, 339, 344, 339, 339, 339, 339, 
+	339, 346, 339, 346, 339, 339, 339, 379, 
+	379, 339, 109, 339, 344, 339, 339, 339, 
+	339, 339, 346, 339, 346, 339, 339, 339, 
+	379, 347, 339, 109, 339, 344, 339, 339, 
+	339, 339, 339, 346, 339, 340, 341, 343, 
+	343, 112, 109, 339, 344, 339, 148, 149, 
+	150, 151, 399, 284, 76, 73, 282, 154, 
+	155, 155, 144, 282, 282, 148, 282, 161, 
+	400, 163, 164, 4, 1, 160, 165, 160, 
+	160, 35, 160, 168, 149, 150, 151, 401, 
+	402, 76, 403, 160, 404, 160, 155, 144, 
+	160, 160, 168, 160, 107, 405, 405, 76, 
+	403, 160, 165, 160, 160, 144, 160, 406, 
+	160, 160, 407, 160, 404, 160, 404, 160, 
+	408, 160, 205, 160, 406, 160, 160, 160, 
+	160, 404, 160, 168, 160, 220, 107, 405, 
+	405, 76, 403, 160, 165, 160, 160, 160, 
+	160, 160, 168, 160, 410, 409, 411, 411, 
+	409, 146, 409, 412, 409, 411, 411, 409, 
+	146, 409, 412, 409, 413, 409, 409, 414, 
+	409, 412, 409, 412, 409, 415, 409, 416, 
+	409, 413, 409, 409, 409, 409, 412, 409, 
+	148, 338, 338, 338, 338, 338, 338, 338, 
+	338, 338, 155, 338, 338, 338, 338, 148, 
+	338, 0
+};
+
+static const short _indic_syllable_machine_trans_targs[] = {
+	138, 160, 166, 2, 167, 3, 5, 170, 
+	6, 8, 173, 9, 11, 176, 12, 14, 
+	15, 159, 17, 18, 175, 20, 21, 172, 
+	23, 24, 169, 178, 182, 183, 187, 188, 
+	192, 193, 197, 198, 138, 221, 227, 36, 
+	228, 37, 39, 231, 40, 42, 234, 43, 
+	45, 237, 46, 48, 49, 220, 51, 52, 
+	236, 54, 55, 233, 57, 58, 230, 239, 
+	243, 244, 248, 249, 253, 254, 258, 260, 
+	138, 281, 287, 70, 288, 138, 71, 73, 
+	291, 74, 76, 294, 77, 79, 297, 80, 
+	82, 83, 280, 85, 86, 296, 88, 89, 
+	293, 91, 92, 290, 299, 303, 304, 308, 
+	309, 313, 314, 318, 138, 343, 349, 103, 
+	350, 104, 106, 353, 107, 109, 356, 110, 
+	112, 359, 113, 115, 116, 342, 118, 119, 
+	358, 121, 122, 355, 124, 125, 352, 361, 
+	365, 366, 370, 371, 375, 376, 380, 381, 
+	320, 138, 394, 138, 139, 200, 261, 263, 
+	319, 321, 283, 322, 382, 383, 392, 399, 
+	138, 140, 142, 33, 199, 162, 141, 32, 
+	143, 195, 144, 146, 31, 194, 145, 30, 
+	147, 190, 148, 150, 29, 189, 149, 28, 
+	151, 185, 152, 154, 27, 184, 153, 26, 
+	155, 180, 156, 158, 25, 179, 157, 1, 
+	165, 0, 161, 164, 163, 138, 168, 4, 
+	22, 171, 7, 19, 174, 10, 16, 177, 
+	13, 181, 186, 191, 196, 138, 201, 203, 
+	67, 259, 223, 202, 66, 204, 256, 205, 
+	207, 65, 255, 206, 64, 208, 251, 209, 
+	211, 63, 250, 210, 62, 212, 246, 213, 
+	215, 61, 245, 214, 60, 216, 241, 217, 
+	219, 59, 240, 218, 35, 226, 34, 222, 
+	225, 224, 138, 229, 38, 56, 232, 41, 
+	53, 235, 44, 50, 238, 47, 242, 247, 
+	252, 257, 138, 262, 100, 264, 316, 265, 
+	267, 99, 315, 266, 98, 268, 311, 269, 
+	271, 97, 310, 270, 96, 272, 306, 273, 
+	275, 95, 305, 274, 94, 276, 301, 277, 
+	279, 93, 300, 278, 69, 286, 68, 282, 
+	285, 284, 138, 289, 72, 90, 292, 75, 
+	87, 295, 78, 84, 298, 81, 302, 307, 
+	312, 317, 138, 138, 323, 325, 134, 133, 
+	345, 324, 326, 378, 327, 329, 132, 377, 
+	328, 131, 330, 373, 331, 333, 130, 372, 
+	332, 129, 334, 368, 335, 337, 128, 367, 
+	336, 127, 338, 363, 339, 341, 126, 362, 
+	340, 102, 348, 101, 344, 347, 346, 138, 
+	351, 105, 123, 354, 108, 120, 357, 111, 
+	117, 360, 114, 364, 369, 374, 379, 135, 
+	384, 385, 391, 386, 388, 136, 387, 390, 
+	389, 138, 393, 137, 396, 395, 398, 397, 
+	138
+};
+
+static const char _indic_syllable_machine_trans_actions[] = {
+	1, 0, 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, 3, 0, 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, 
+	4, 0, 2, 0, 2, 5, 0, 0, 
+	2, 0, 0, 2, 0, 0, 2, 0, 
+	0, 0, 2, 0, 0, 2, 0, 0, 
+	2, 0, 0, 2, 6, 2, 6, 2, 
+	6, 2, 6, 2, 7, 0, 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, 
+	6, 8, 0, 11, 2, 2, 6, 0, 
+	12, 12, 0, 2, 6, 2, 2, 0, 
+	13, 2, 0, 0, 2, 0, 2, 0, 
+	2, 2, 2, 0, 0, 2, 2, 0, 
+	2, 2, 2, 0, 0, 2, 2, 0, 
+	2, 2, 2, 0, 0, 2, 2, 0, 
+	2, 2, 2, 0, 0, 2, 2, 0, 
+	2, 0, 0, 0, 0, 14, 2, 0, 
+	0, 2, 0, 0, 2, 0, 0, 2, 
+	0, 2, 2, 2, 2, 15, 2, 0, 
+	0, 2, 0, 2, 0, 2, 2, 2, 
+	0, 0, 2, 2, 0, 2, 2, 2, 
+	0, 0, 2, 2, 0, 2, 2, 2, 
+	0, 0, 2, 2, 0, 2, 2, 2, 
+	0, 0, 2, 2, 0, 2, 0, 0, 
+	0, 0, 16, 2, 0, 0, 2, 0, 
+	0, 2, 0, 0, 2, 0, 2, 2, 
+	2, 2, 17, 6, 0, 6, 2, 6, 
+	0, 0, 6, 6, 0, 6, 2, 6, 
+	0, 0, 6, 6, 0, 6, 2, 6, 
+	0, 0, 6, 6, 0, 6, 2, 6, 
+	0, 0, 6, 6, 0, 2, 0, 0, 
+	0, 0, 18, 2, 0, 0, 2, 0, 
+	0, 2, 0, 0, 2, 0, 2, 2, 
+	2, 2, 19, 20, 2, 0, 0, 0, 
+	0, 2, 2, 2, 2, 0, 0, 2, 
+	2, 0, 2, 2, 2, 0, 0, 2, 
+	2, 0, 2, 2, 2, 0, 0, 2, 
+	2, 0, 2, 2, 2, 0, 0, 2, 
+	2, 0, 2, 0, 0, 0, 0, 21, 
+	2, 0, 0, 2, 0, 0, 2, 0, 
+	0, 2, 0, 2, 2, 2, 2, 0, 
+	0, 22, 22, 0, 0, 0, 0, 0, 
+	0, 23, 2, 0, 0, 0, 0, 0, 
+	24
+};
+
+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, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 9, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	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, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 10, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0
+};
+
+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, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 73, 73, 78, 78, 
+	73, 73, 73, 73, 73, 73, 73, 73, 
+	73, 73, 73, 73, 73, 73, 73, 73, 
+	73, 73, 73, 73, 73, 73, 73, 73, 
+	73, 73, 73, 73, 73, 109, 109, 109, 
+	109, 109, 109, 109, 109, 109, 109, 109, 
+	109, 109, 109, 109, 109, 109, 109, 109, 
+	109, 109, 109, 109, 109, 109, 109, 109, 
+	109, 109, 109, 109, 109, 109, 109, 73, 
+	1, 146, 0, 161, 161, 161, 161, 161, 
+	161, 161, 161, 161, 161, 161, 161, 161, 
+	161, 161, 161, 161, 161, 161, 161, 161, 
+	161, 161, 161, 161, 161, 161, 161, 161, 
+	161, 161, 161, 161, 161, 161, 161, 161, 
+	161, 161, 161, 161, 161, 161, 161, 161, 
+	161, 161, 161, 161, 161, 161, 161, 161, 
+	161, 161, 161, 161, 161, 161, 161, 161, 
+	222, 222, 222, 222, 222, 222, 222, 222, 
+	222, 222, 222, 222, 222, 222, 222, 222, 
+	222, 222, 222, 222, 222, 222, 222, 222, 
+	222, 222, 222, 222, 222, 222, 222, 222, 
+	222, 222, 222, 222, 222, 222, 222, 222, 
+	222, 222, 222, 222, 222, 222, 222, 222, 
+	222, 222, 222, 222, 222, 222, 222, 222, 
+	222, 222, 222, 222, 222, 283, 283, 283, 
+	283, 283, 283, 283, 283, 283, 283, 283, 
+	283, 283, 283, 283, 283, 283, 283, 283, 
+	283, 283, 283, 283, 283, 283, 283, 283, 
+	283, 283, 283, 283, 283, 283, 283, 283, 
+	283, 283, 283, 283, 283, 283, 283, 283, 
+	283, 283, 283, 283, 283, 283, 283, 283, 
+	283, 283, 283, 283, 283, 283, 283, 339, 
+	283, 339, 340, 340, 340, 340, 340, 340, 
+	340, 340, 340, 340, 340, 340, 340, 340, 
+	340, 340, 340, 340, 340, 340, 340, 340, 
+	340, 340, 340, 340, 340, 340, 340, 340, 
+	340, 340, 340, 340, 340, 340, 340, 340, 
+	340, 340, 340, 340, 340, 340, 340, 340, 
+	340, 340, 340, 340, 340, 340, 340, 340, 
+	340, 340, 340, 340, 340, 340, 283, 161, 
+	161, 161, 161, 161, 161, 161, 161, 161, 
+	410, 410, 410, 410, 410, 410, 410, 339
+};
+
+static const int indic_syllable_machine_start = 138;
+static const int indic_syllable_machine_first_final = 138;
+static const int indic_syllable_machine_error = -1;
+
+static const int indic_syllable_machine_en_main = 138;
+
+
+#line 36 "hb-ot-shape-complex-indic-machine.rl"
+
+
+
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
+
+
+#define found_syllable(syllable_type) \
+  HB_STMT_START { \
+    if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+    for (unsigned int i = ts; i < te; i++) \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
+    syllable_serial++; \
+    if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+  } HB_STMT_END
+
+static void
+find_syllables (hb_buffer_t *buffer)
+{
+  unsigned int p, pe, eof, ts, te, act;
+  int cs;
+  hb_glyph_info_t *info = buffer->info;
+  
+#line 934 "hb-ot-shape-complex-indic-machine.hh"
+	{
+	cs = indic_syllable_machine_start;
+	ts = 0;
+	te = 0;
+	act = 0;
+	}
+
+#line 112 "hb-ot-shape-complex-indic-machine.rl"
+
+
+  p = 0;
+  pe = eof = buffer->len;
+
+  unsigned int syllable_serial = 1;
+  
+#line 950 "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 10:
+#line 1 "NONE"
+	{ts = p;}
+	break;
+#line 964 "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] ?
+		( info[p].indic_category()) - _keys[0] : _slen ];
+
+_eof_trans:
+	cs = _indic_syllable_machine_trans_targs[_trans];
+
+	if ( _indic_syllable_machine_trans_actions[_trans] == 0 )
+		goto _again;
+
+	switch ( _indic_syllable_machine_trans_actions[_trans] ) {
+	case 2:
+#line 1 "NONE"
+	{te = p+1;}
+	break;
+	case 14:
+#line 83 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p+1;{ found_syllable (consonant_syllable); }}
+	break;
+	case 16:
+#line 84 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p+1;{ found_syllable (vowel_syllable); }}
+	break;
+	case 21:
+#line 85 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p+1;{ found_syllable (standalone_cluster); }}
+	break;
+	case 24:
+#line 86 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p+1;{ found_syllable (symbol_cluster); }}
+	break;
+	case 18:
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p+1;{ found_syllable (broken_cluster); }}
+	break;
+	case 11:
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p+1;{ found_syllable (non_indic_cluster); }}
+	break;
+	case 13:
+#line 83 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p;p--;{ found_syllable (consonant_syllable); }}
+	break;
+	case 15:
+#line 84 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p;p--;{ found_syllable (vowel_syllable); }}
+	break;
+	case 20:
+#line 85 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p;p--;{ found_syllable (standalone_cluster); }}
+	break;
+	case 23:
+#line 86 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p;p--;{ found_syllable (symbol_cluster); }}
+	break;
+	case 17:
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p;p--;{ found_syllable (broken_cluster); }}
+	break;
+	case 19:
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p;p--;{ found_syllable (non_indic_cluster); }}
+	break;
+	case 1:
+#line 83 "hb-ot-shape-complex-indic-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
+	break;
+	case 3:
+#line 84 "hb-ot-shape-complex-indic-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (vowel_syllable); }}
+	break;
+	case 7:
+#line 85 "hb-ot-shape-complex-indic-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (standalone_cluster); }}
+	break;
+	case 8:
+#line 86 "hb-ot-shape-complex-indic-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (symbol_cluster); }}
+	break;
+	case 4:
+#line 87 "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;
+	case 5:
+	{{p = ((te))-1;} found_syllable (broken_cluster); }
+	break;
+	case 6:
+	{{p = ((te))-1;} found_syllable (non_indic_cluster); }
+	break;
+	}
+	}
+	break;
+	case 22:
+#line 1 "NONE"
+	{te = p+1;}
+#line 83 "hb-ot-shape-complex-indic-machine.rl"
+	{act = 1;}
+	break;
+	case 6:
+#line 1 "NONE"
+	{te = p+1;}
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
+	{act = 5;}
+	break;
+	case 12:
+#line 1 "NONE"
+	{te = p+1;}
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
+	{act = 6;}
+	break;
+#line 1087 "hb-ot-shape-complex-indic-machine.hh"
+	}
+
+_again:
+	switch ( _indic_syllable_machine_to_state_actions[cs] ) {
+	case 9:
+#line 1 "NONE"
+	{ts = 0;}
+	break;
+#line 1096 "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 120 "hb-ot-shape-complex-indic-machine.rl"
+
+}
+
+#endif /* HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic-machine.rl b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic-machine.rl
new file mode 100644
index 0000000..c5d945d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic-machine.rl
@@ -0,0 +1,123 @@
+/*
+ * Copyright © 2011,2012  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_SHAPE_COMPLEX_INDIC_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH
+
+#include "hb.hh"
+
+%%{
+  machine indic_syllable_machine;
+  alphtype unsigned char;
+  write data;
+}%%
+
+%%{
+
+# Same order as enum indic_category_t.  Not sure how to avoid duplication.
+C    = 1;
+V    = 2;
+N    = 3;
+H    = 4;
+ZWNJ = 5;
+ZWJ  = 6;
+M    = 7;
+SM   = 8;
+A    = 10;
+PLACEHOLDER = 11;
+DOTTEDCIRCLE = 12;
+RS    = 13;
+Repha = 15;
+Ra    = 16;
+Symbol= 18;
+CS    = 19;
+
+c = (C | Ra);			# is_consonant
+n = ((ZWNJ?.RS)? (N.N?)?);	# is_consonant_modifier
+z = ZWJ|ZWNJ;			# is_joiner
+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}?;
+halant_group = (z?.H.(ZWJ.N?)?);
+final_halant_group = halant_group | H.ZWNJ;
+halant_or_matra_group = (final_halant_group | matra_group{0,4});
+
+complex_syllable_tail = (halant_group.cn){0,4} halant_or_matra_group syllable_tail;
+
+
+consonant_syllable =	(Repha|CS)? cn complex_syllable_tail;
+vowel_syllable =	reph? V.n? (ZWJ | complex_syllable_tail);
+standalone_cluster =	((Repha|CS)? PLACEHOLDER | reph? DOTTEDCIRCLE).n? complex_syllable_tail;
+symbol_cluster = 	symbol syllable_tail;
+broken_cluster =	reph? n? complex_syllable_tail;
+other =			any;
+
+main := |*
+	consonant_syllable	=> { found_syllable (consonant_syllable); };
+	vowel_syllable		=> { found_syllable (vowel_syllable); };
+	standalone_cluster	=> { found_syllable (standalone_cluster); };
+	symbol_cluster		=> { found_syllable (symbol_cluster); };
+	broken_cluster		=> { found_syllable (broken_cluster); };
+	other			=> { found_syllable (non_indic_cluster); };
+*|;
+
+
+}%%
+
+#define found_syllable(syllable_type) \
+  HB_STMT_START { \
+    if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+    for (unsigned int i = ts; i < te; i++) \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
+    syllable_serial++; \
+    if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+  } HB_STMT_END
+
+static void
+find_syllables (hb_buffer_t *buffer)
+{
+  unsigned int p, pe, eof, ts, te, act;
+  int cs;
+  hb_glyph_info_t *info = buffer->info;
+  %%{
+    write init;
+    getkey info[p].indic_category();
+  }%%
+
+  p = 0;
+  pe = eof = buffer->len;
+
+  unsigned int syllable_serial = 1;
+  %%{
+    write exec;
+  }%%
+}
+
+#endif /* HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic-table.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic-table.cc
new file mode 100644
index 0000000..43b5ef8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic-table.cc
@@ -0,0 +1,490 @@
+/* == Start of generated table == */
+/*
+ * The following table is generated by running:
+ *
+ *   ./gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt
+ *
+ * on files with these headers:
+ *
+ * # IndicSyllabicCategory-11.0.0.txt
+ * # Date: 2018-05-21, 18:33:00 GMT [KW, RP]
+ * # IndicPositionalCategory-11.0.0.txt
+ * # Date: 2018-02-05, 16:21:00 GMT [KW, RP]
+ * # Blocks-11.0.0.txt
+ * # Date: 2017-10-16, 24:39:00 GMT [KW]
+ */
+
+#include "hb-ot-shape-complex-indic.hh"
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-macros"
+
+#define ISC_A	INDIC_SYLLABIC_CATEGORY_AVAGRAHA		/*  16 chars; Avagraha */
+#define ISC_Bi	INDIC_SYLLABIC_CATEGORY_BINDU			/*  83 chars; Bindu */
+#define ISC_BJN	INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER	/*  20 chars; Brahmi_Joining_Number */
+#define ISC_Ca	INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK	/*  58 chars; Cantillation_Mark */
+#define ISC_C	INDIC_SYLLABIC_CATEGORY_CONSONANT		/* 2110 chars; Consonant */
+#define ISC_CD	INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD		/*  10 chars; Consonant_Dead */
+#define ISC_CF	INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL		/*  67 chars; Consonant_Final */
+#define ISC_CHL	INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER	/*   5 chars; Consonant_Head_Letter */
+#define ISC_CIP	INDIC_SYLLABIC_CATEGORY_CONSONANT_INITIAL_POSTFIXED	/*   1 chars; Consonant_Initial_Postfixed */
+#define ISC_CK	INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER	/*   2 chars; Consonant_Killer */
+#define ISC_CM	INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL	/*  28 chars; Consonant_Medial */
+#define ISC_CP	INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER	/*  21 chars; Consonant_Placeholder */
+#define ISC_CPR	INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA	/*   2 chars; Consonant_Preceding_Repha */
+#define ISC_CPrf	INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED	/*   7 chars; Consonant_Prefixed */
+#define ISC_CS	INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED	/*  95 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	/*   6 chars; Consonant_With_Stacker */
+#define ISC_GM	INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK		/*   3 chars; Gemination_Mark */
+#define ISC_IS	INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER	/*  11 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			/*  30 chars; Nukta */
+#define ISC_Nd	INDIC_SYLLABIC_CATEGORY_NUMBER			/* 480 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		/*  21 chars; Pure_Killer */
+#define ISC_RS	INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER	/*   2 chars; Register_Shifter */
+#define ISC_SM	INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER	/*  25 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			/*  25 chars; Virama */
+#define ISC_Vs	INDIC_SYLLABIC_CATEGORY_VISARGA			/*  36 chars; Visarga */
+#define ISC_Vo	INDIC_SYLLABIC_CATEGORY_VOWEL			/*  30 chars; Vowel */
+#define ISC_M	INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT		/* 660 chars; Vowel_Dependent */
+#define ISC_VI	INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT	/* 464 chars; Vowel_Independent */
+
+#define IMC_B	INDIC_MATRA_CATEGORY_BOTTOM			/* 340 chars; Bottom */
+#define IMC_BL	INDIC_MATRA_CATEGORY_BOTTOM_AND_LEFT		/*   1 chars; Bottom_And_Left */
+#define IMC_BR	INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT		/*   2 chars; Bottom_And_Right */
+#define IMC_L	INDIC_MATRA_CATEGORY_LEFT			/*  59 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			/* 276 chars; Right */
+#define IMC_T	INDIC_MATRA_CATEGORY_TOP			/* 393 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 */
+#pragma GCC diagnostic pop
+
+#define _(S,M) INDIC_COMBINE_CATEGORIES (ISC_##S, IMC_##M)
+
+
+static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
+
+
+#define indic_offset_0x0028u 0
+
+
+  /* Basic Latin */
+
+  /* 0028 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(CP,x),  _(x,x),  _(x,x),
+  /* 0030 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
+  /* 0038 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+
+#define indic_offset_0x00b0u 24
+
+
+  /* Latin-1 Supplement */
+
+  /* 00B0 */  _(x,x),  _(x,x), _(SM,x), _(SM,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 00B8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 00C0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 00C8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 00D0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(CP,x),
+
+#define indic_offset_0x0900u 64
+
+
+  /* Devanagari */
+
+  /* 0900 */ _(Bi,T), _(Bi,T), _(Bi,T), _(Vs,R), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0908 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0910 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0918 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0920 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0928 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0930 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0938 */  _(C,x),  _(C,x),  _(M,T),  _(M,R),  _(N,B),  _(A,x),  _(M,R),  _(M,L),
+  /* 0940 */  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T),
+  /* 0948 */  _(M,T),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(V,B),  _(M,L),  _(M,R),
+  /* 0950 */  _(x,x), _(Ca,T), _(Ca,B),  _(x,T),  _(x,T),  _(M,T),  _(M,B),  _(M,B),
+  /* 0958 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0960 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
+  /* 0968 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
+  /* 0970 */  _(x,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0978 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+
+  /* Bengali */
+
+  /* 0980 */ _(CP,x), _(Bi,T), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0988 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x), _(VI,x),
+  /* 0990 */ _(VI,x),  _(x,x),  _(x,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0998 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 09A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 09A8 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 09B0 */  _(C,x),  _(x,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),
+  /* 09B8 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,B),  _(A,x),  _(M,R),  _(M,L),
+  /* 09C0 */  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(x,x),  _(x,x),  _(M,L),
+  /* 09C8 */  _(M,L),  _(x,x),  _(x,x), _(M,LR), _(M,LR),  _(V,B), _(CD,x),  _(x,x),
+  /* 09D0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,R),
+  /* 09D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),
+  /* 09E0 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
+  /* 09E8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
+  /* 09F0 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 09F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(Bi,x),  _(x,x), _(SM,T),  _(x,x),
+
+  /* Gurmukhi */
+
+  /* 0A00 */  _(x,x), _(Bi,T), _(Bi,T), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0A08 */ _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(VI,x),
+  /* 0A10 */ _(VI,x),  _(x,x),  _(x,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0A18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0A20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0A28 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0A30 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),
+  /* 0A38 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,B),  _(x,x),  _(M,R),  _(M,L),
+  /* 0A40 */  _(M,R),  _(M,B),  _(M,B),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,T),
+  /* 0A48 */  _(M,T),  _(x,x),  _(x,x),  _(M,T),  _(M,T),  _(V,B),  _(x,x),  _(x,x),
+  /* 0A50 */  _(x,x), _(Ca,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0A58 */  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(x,x),
+  /* 0A60 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
+  /* 0A68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
+  /* 0A70 */ _(Bi,T), _(GM,T), _(CP,x), _(CP,x),  _(x,x), _(CM,B),  _(x,x),  _(x,x),
+  /* 0A78 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+
+  /* Gujarati */
+
+  /* 0A80 */  _(x,x), _(Bi,T), _(Bi,T), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0A88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x), _(VI,x),
+  /* 0A90 */ _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0A98 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0AA0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0AA8 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0AB0 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0AB8 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,B),  _(A,x),  _(M,R),  _(M,L),
+  /* 0AC0 */  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(M,T),  _(x,x),  _(M,T),
+  /* 0AC8 */  _(M,T), _(M,TR),  _(x,x),  _(M,R),  _(M,R),  _(V,B),  _(x,x),  _(x,x),
+  /* 0AD0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0AD8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0AE0 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
+  /* 0AE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
+  /* 0AF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0AF8 */  _(x,x),  _(C,x), _(Ca,T), _(Ca,T), _(Ca,T),  _(N,T),  _(N,T),  _(N,T),
+
+  /* Oriya */
+
+  /* 0B00 */  _(x,x), _(Bi,T), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0B08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x), _(VI,x),
+  /* 0B10 */ _(VI,x),  _(x,x),  _(x,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0B18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0B20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0B28 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0B30 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0B38 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,B),  _(A,x),  _(M,R),  _(M,T),
+  /* 0B40 */  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(x,x),  _(x,x),  _(M,L),
+  /* 0B48 */ _(M,TL),  _(x,x),  _(x,x), _(M,LR),_(M,TLR),  _(V,B),  _(x,x),  _(x,x),
+  /* 0B50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,T), _(M,TR),
+  /* 0B58 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),
+  /* 0B60 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
+  /* 0B68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
+  /* 0B70 */  _(x,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0B78 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+
+  /* Tamil */
+
+  /* 0B80 */  _(x,x),  _(x,x), _(Bi,T), _(ML,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0B88 */ _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x),  _(x,x), _(VI,x), _(VI,x),
+  /* 0B90 */ _(VI,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(x,x),  _(x,x),
+  /* 0B98 */  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),
+  /* 0BA0 */  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0BA8 */  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),
+  /* 0BB0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0BB8 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,R),  _(M,R),
+  /* 0BC0 */  _(M,T),  _(M,R),  _(M,R),  _(x,x),  _(x,x),  _(x,x),  _(M,L),  _(M,L),
+  /* 0BC8 */  _(M,L),  _(x,x), _(M,LR), _(M,LR), _(M,LR),  _(V,T),  _(x,x),  _(x,x),
+  /* 0BD0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,R),
+  /* 0BD8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0BE0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
+  /* 0BE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
+  /* 0BF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0BF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+
+  /* Telugu */
+
+  /* 0C00 */ _(Bi,T), _(Bi,R), _(Bi,R), _(Vs,R), _(Bi,T), _(VI,x), _(VI,x), _(VI,x),
+  /* 0C08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x),
+  /* 0C10 */ _(VI,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0C18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0C20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0C28 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0C30 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0C38 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(A,x),  _(M,T),  _(M,T),
+  /* 0C40 */  _(M,T),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(x,x),  _(M,T),  _(M,T),
+  /* 0C48 */ _(M,TB),  _(x,x),  _(M,T),  _(M,T),  _(M,T),  _(V,T),  _(x,x),  _(x,x),
+  /* 0C50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,T),  _(M,B),  _(x,x),
+  /* 0C58 */  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0C60 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
+  /* 0C68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
+  /* 0C70 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0C78 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+
+  /* Kannada */
+
+  /* 0C80 */  _(x,x), _(Bi,T), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0C88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x),
+  /* 0C90 */ _(VI,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0C98 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0CA0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0CA8 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0CB0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0CB8 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,B),  _(A,x),  _(M,R),  _(M,T),
+  /* 0CC0 */ _(M,TR),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(x,x),  _(M,T), _(M,TR),
+  /* 0CC8 */ _(M,TR),  _(x,x), _(M,TR), _(M,TR),  _(M,T),  _(V,T),  _(x,x),  _(x,x),
+  /* 0CD0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,R),  _(M,R),  _(x,x),
+  /* 0CD8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(x,x),
+  /* 0CE0 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
+  /* 0CE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
+  /* 0CF0 */  _(x,x),_(CWS,x),_(CWS,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0CF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+
+  /* Malayalam */
+
+  /* 0D00 */ _(Bi,T), _(Bi,T), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0D08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x),
+  /* 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), _(PK,T), _(PK,T),  _(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), _(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 */
+
+  /* 0D80 */  _(x,x),  _(x,x), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0D88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0D90 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x),
+  /* 0D98 */  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0DA0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0DA8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0DB0 */  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 0DB8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(x,x),  _(x,x),
+  /* 0DC0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),
+  /* 0DC8 */  _(x,x),  _(x,x),  _(V,T),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,R),
+  /* 0DD0 */  _(M,R),  _(M,R),  _(M,T),  _(M,T),  _(M,B),  _(x,x),  _(M,B),  _(x,x),
+  /* 0DD8 */  _(M,R),  _(M,L), _(M,TL),  _(M,L), _(M,LR),_(M,TLR), _(M,LR),  _(M,R),
+  /* 0DE0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
+  /* 0DE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
+  /* 0DF0 */  _(x,x),  _(x,x),  _(M,R),  _(M,R),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+
+#define indic_offset_0x1000u 1336
+
+
+  /* Myanmar */
+
+  /* 1000 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 1008 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 1010 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 1018 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
+  /* 1020 */  _(C,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 1028 */ _(VI,x), _(VI,x), _(VI,x),  _(M,R),  _(M,R),  _(M,T),  _(M,T),  _(M,B),
+  /* 1030 */  _(M,B),  _(M,L),  _(M,T),  _(M,T),  _(M,T),  _(M,T), _(Bi,T), _(TM,B),
+  /* 1038 */ _(Vs,R), _(IS,x), _(PK,T), _(CM,R), _(CM,x), _(CM,B), _(CM,B),  _(C,x),
+  /* 1040 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
+  /* 1048 */ _(Nd,x), _(Nd,x),  _(x,x), _(CP,x),  _(x,x),  _(x,x), _(CP,x),  _(x,x),
+  /* 1050 */  _(C,x),  _(C,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(M,R),  _(M,R),
+  /* 1058 */  _(M,B),  _(M,B),  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(CM,B), _(CM,B),
+  /* 1060 */ _(CM,B),  _(C,x),  _(M,R), _(TM,R), _(TM,R),  _(C,x),  _(C,x),  _(M,R),
+  /* 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_0x1780u 1496
+
+
+  /* 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), _(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_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),_(CWS,x),_(CWS,x), _(Ca,R),
+  /* 1CF8 */ _(Ca,x), _(Ca,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+
+#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 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_0xa8e0u 1696
+
+
+  /* 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), _(Bi,x), _(Bi,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* A8F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(VI,x),  _(M,T),
+
+#define indic_offset_0xa9e0u 1728
+
+
+  /* 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),
+
+#define indic_offset_0xaa60u 1760
+
+
+  /* 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), _(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),
+
+}; /* Table items: 1792; occupancy: 70% */
+
+INDIC_TABLE_ELEMENT_TYPE
+hb_indic_get_categories (hb_codepoint_t u)
+{
+  switch (u >> 12)
+  {
+    case 0x0u:
+      if (unlikely (u == 0x00A0u)) return _(CP,x);
+      if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return indic_table[u - 0x0028u + indic_offset_0x0028u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x00B0u, 0x00D7u)) return indic_table[u - 0x00B0u + indic_offset_0x00b0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return indic_table[u - 0x0900u + indic_offset_0x0900u];
+      break;
+
+    case 0x1u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x1000u, 0x109Fu)) return indic_table[u - 0x1000u + indic_offset_0x1000u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1780u, 0x17EFu)) return indic_table[u - 0x1780u + indic_offset_0x1780u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1CD0u, 0x1CFFu)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u];
+      break;
+
+    case 0x2u:
+      if (unlikely (u == 0x25CCu)) return _(CP,x);
+      if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return indic_table[u - 0x2008u + indic_offset_0x2008u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x2070u, 0x2087u)) return indic_table[u - 0x2070u + indic_offset_0x2070u];
+      break;
+
+    case 0xAu:
+      if (hb_in_range<hb_codepoint_t> (u, 0xA8E0u, 0xA8FFu)) return indic_table[u - 0xA8E0u + indic_offset_0xa8e0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0xA9E0u, 0xA9FFu)) return indic_table[u - 0xA9E0u + indic_offset_0xa9e0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0xAA60u, 0xAA7Fu)) return indic_table[u - 0xAA60u + indic_offset_0xaa60u];
+      break;
+
+    default:
+      break;
+  }
+  return _(x,x);
+}
+
+#undef _
+#undef ISC_A
+#undef ISC_Bi
+#undef ISC_BJN
+#undef ISC_Ca
+#undef ISC_C
+#undef ISC_CD
+#undef ISC_CF
+#undef ISC_CHL
+#undef ISC_CIP
+#undef ISC_CK
+#undef ISC_CM
+#undef ISC_CP
+#undef ISC_CPR
+#undef ISC_CPrf
+#undef ISC_CS
+#undef ISC_CSR
+#undef ISC_CWS
+#undef ISC_GM
+#undef ISC_IS
+#undef ISC_ZWJ
+#undef ISC_ML
+#undef ISC_ZWNJ
+#undef ISC_N
+#undef ISC_Nd
+#undef ISC_NJ
+#undef ISC_x
+#undef ISC_PK
+#undef ISC_RS
+#undef ISC_SM
+#undef ISC_TL
+#undef ISC_TM
+#undef ISC_V
+#undef ISC_Vs
+#undef ISC_Vo
+#undef ISC_M
+#undef ISC_VI
+#undef IMC_B
+#undef IMC_BL
+#undef IMC_BR
+#undef IMC_L
+#undef IMC_LR
+#undef IMC_x
+#undef IMC_O
+#undef IMC_R
+#undef IMC_T
+#undef IMC_TB
+#undef IMC_TBR
+#undef IMC_TL
+#undef IMC_TLR
+#undef IMC_TR
+#undef IMC_VOL
+
+/* == End of generated table == */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic.cc
new file mode 100644
index 0000000..d2d0a5a
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic.cc
@@ -0,0 +1,1637 @@
+/*
+ * Copyright © 2011,2012  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
+ */
+
+#include "hb-ot-shape-complex-indic.hh"
+#include "hb-ot-shape-complex-vowel-constraints.hh"
+#include "hb-ot-layout.hh"
+
+
+/*
+ * Indic shaper.
+ */
+
+
+/*
+ * Indic configurations.  Note that we do not want to keep every single script-specific
+ * behavior in these tables necessarily.  This should mainly be used for per-script
+ * properties that are cheaper keeping here, than in the code.  Ie. if, say, one and
+ * only one script has an exception, that one script can be if'ed directly in the code,
+ * instead of adding a new flag in these structs.
+ */
+
+enum base_position_t {
+  BASE_POS_LAST_SINHALA,
+  BASE_POS_LAST
+};
+enum reph_position_t {
+  REPH_POS_AFTER_MAIN  = POS_AFTER_MAIN,
+  REPH_POS_BEFORE_SUB  = POS_BEFORE_SUB,
+  REPH_POS_AFTER_SUB   = POS_AFTER_SUB,
+  REPH_POS_BEFORE_POST = POS_BEFORE_POST,
+  REPH_POS_AFTER_POST  = POS_AFTER_POST
+};
+enum reph_mode_t {
+  REPH_MODE_IMPLICIT,  /* Reph formed out of initial Ra,H sequence. */
+  REPH_MODE_EXPLICIT,  /* Reph formed out of initial Ra,H,ZWJ sequence. */
+  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. */
+};
+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;
+};
+
+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},
+  {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_POST, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST},
+};
+
+
+
+/*
+ * Indic shaper.
+ */
+
+static const hb_ot_map_feature_t
+indic_features[] =
+{
+  /*
+   * Basic features.
+   * These features are applied in order, one at a time, after initial_reordering.
+   */
+  {HB_TAG('n','u','k','t'), F_GLOBAL_MANUAL_JOINERS},
+  {HB_TAG('a','k','h','n'), F_GLOBAL_MANUAL_JOINERS},
+  {HB_TAG('r','p','h','f'),        F_MANUAL_JOINERS},
+  {HB_TAG('r','k','r','f'), F_GLOBAL_MANUAL_JOINERS},
+  {HB_TAG('p','r','e','f'),        F_MANUAL_JOINERS},
+  {HB_TAG('b','l','w','f'),        F_MANUAL_JOINERS},
+  {HB_TAG('a','b','v','f'),        F_MANUAL_JOINERS},
+  {HB_TAG('h','a','l','f'),        F_MANUAL_JOINERS},
+  {HB_TAG('p','s','t','f'),        F_MANUAL_JOINERS},
+  {HB_TAG('v','a','t','u'), F_GLOBAL_MANUAL_JOINERS},
+  {HB_TAG('c','j','c','t'), F_GLOBAL_MANUAL_JOINERS},
+  /*
+   * Other features.
+   * These features are applied all at once, after final_reordering
+   * but before clearing syllables.
+   * Default Bengali font in Windows for example has intermixed
+   * lookups for init,pres,abvs,blws features.
+   */
+  {HB_TAG('i','n','i','t'),        F_MANUAL_JOINERS},
+  {HB_TAG('p','r','e','s'), F_GLOBAL_MANUAL_JOINERS},
+  {HB_TAG('a','b','v','s'), F_GLOBAL_MANUAL_JOINERS},
+  {HB_TAG('b','l','w','s'), F_GLOBAL_MANUAL_JOINERS},
+  {HB_TAG('p','s','t','s'), F_GLOBAL_MANUAL_JOINERS},
+  {HB_TAG('h','a','l','n'), F_GLOBAL_MANUAL_JOINERS},
+  /*
+   * Positioning features.
+   * We don't care about the types.
+   */
+  {HB_TAG('d','i','s','t'), F_GLOBAL},
+  {HB_TAG('a','b','v','m'), F_GLOBAL},
+  {HB_TAG('b','l','w','m'), F_GLOBAL},
+};
+
+/*
+ * Must be in the same order as the indic_features array.
+ */
+enum {
+  _NUKT,
+  _AKHN,
+  RPHF,
+  _RKRF,
+  PREF,
+  BLWF,
+  ABVF,
+  HALF,
+  PSTF,
+  _VATU,
+  _CJCT,
+
+  INIT,
+  _PRES,
+  _ABVS,
+  _BLWS,
+  _PSTS,
+  _HALN,
+
+  _DIST,
+  _ABVM,
+  _BLWM,
+
+  INDIC_NUM_FEATURES,
+  INDIC_BASIC_FEATURES = INIT, /* Don't forget to update this! */
+};
+
+static void
+setup_syllables (const hb_ot_shape_plan_t *plan,
+		 hb_font_t *font,
+		 hb_buffer_t *buffer);
+static void
+initial_reordering (const hb_ot_shape_plan_t *plan,
+		    hb_font_t *font,
+		    hb_buffer_t *buffer);
+static void
+final_reordering (const hb_ot_shape_plan_t *plan,
+		  hb_font_t *font,
+		  hb_buffer_t *buffer);
+static void
+clear_syllables (const hb_ot_shape_plan_t *plan,
+		 hb_font_t *font,
+		 hb_buffer_t *buffer);
+
+static void
+collect_features_indic (hb_ot_shape_planner_t *plan)
+{
+  hb_ot_map_builder_t *map = &plan->map;
+
+  /* Do this before any lookups have been applied. */
+  map->add_gsub_pause (setup_syllables);
+
+  map->enable_feature (HB_TAG('l','o','c','l'));
+  /* The Indic specs do not require ccmp, but we apply it here since if
+   * there is a use of it, it's typically at the beginning. */
+  map->enable_feature (HB_TAG('c','c','m','p'));
+
+
+  unsigned int i = 0;
+  map->add_gsub_pause (initial_reordering);
+
+  for (; i < INDIC_BASIC_FEATURES; i++) {
+    map->add_feature (indic_features[i]);
+    map->add_gsub_pause (nullptr);
+  }
+
+  map->add_gsub_pause (final_reordering);
+
+  for (; i < INDIC_NUM_FEATURES; i++)
+    map->add_feature (indic_features[i]);
+
+  map->enable_feature (HB_TAG('c','a','l','t'));
+  map->enable_feature (HB_TAG('c','l','i','g'));
+
+  map->add_gsub_pause (clear_syllables);
+}
+
+static void
+override_features_indic (hb_ot_shape_planner_t *plan)
+{
+  plan->map.disable_feature (HB_TAG('l','i','g','a'));
+}
+
+
+struct would_substitute_feature_t
+{
+  void init (const hb_ot_map_t *map, hb_tag_t feature_tag, bool zero_context_)
+  {
+    zero_context = zero_context_;
+    map->get_stage_lookups (0/*GSUB*/,
+			    map->get_feature_stage (0/*GSUB*/, feature_tag),
+			    &lookups, &count);
+  }
+
+  bool would_substitute (const hb_codepoint_t *glyphs,
+			 unsigned int          glyphs_count,
+			 hb_face_t            *face) const
+  {
+    for (unsigned int i = 0; i < count; i++)
+      if (hb_ot_layout_lookup_would_substitute_fast (face, lookups[i].index, glyphs, glyphs_count, zero_context))
+	return true;
+    return false;
+  }
+
+  private:
+  const hb_ot_map_t::lookup_map_t *lookups;
+  unsigned int count;
+  bool zero_context;
+};
+
+struct indic_shape_plan_t
+{
+  bool load_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const
+  {
+    hb_codepoint_t glyph = virama_glyph.get_relaxed ();
+    if (unlikely (glyph == (hb_codepoint_t) -1))
+    {
+      if (!config->virama || !font->get_nominal_glyph (config->virama, &glyph))
+	glyph = 0;
+      /* Technically speaking, the spec says we should apply 'locl' to virama too.
+       * Maybe one day... */
+
+      /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph
+       * during shape planning...  Instead, overwrite it here. */
+      virama_glyph.set_relaxed ((int) glyph);
+    }
+
+    *pglyph = glyph;
+    return glyph != 0;
+  }
+
+  const indic_config_t *config;
+
+  bool is_old_spec;
+  bool uniscribe_bug_compatible;
+  mutable hb_atomic_int_t virama_glyph;
+
+  would_substitute_feature_t rphf;
+  would_substitute_feature_t pref;
+  would_substitute_feature_t blwf;
+  would_substitute_feature_t pstf;
+
+  hb_mask_t mask_array[INDIC_NUM_FEATURES];
+};
+
+static void *
+data_create_indic (const hb_ot_shape_plan_t *plan)
+{
+  indic_shape_plan_t *indic_plan = (indic_shape_plan_t *) calloc (1, sizeof (indic_shape_plan_t));
+  if (unlikely (!indic_plan))
+    return nullptr;
+
+  indic_plan->config = &indic_configs[0];
+  for (unsigned int i = 1; i < ARRAY_LENGTH (indic_configs); i++)
+    if (plan->props.script == indic_configs[i].script) {
+      indic_plan->config = &indic_configs[i];
+      break;
+    }
+
+  indic_plan->is_old_spec = indic_plan->config->has_old_spec && ((plan->map.chosen_script[0] & 0x000000FFu) != '2');
+  indic_plan->uniscribe_bug_compatible = hb_options ().uniscribe_bug_compatible;
+  indic_plan->virama_glyph.set_relaxed (-1);
+
+  /* Use zero-context would_substitute() matching for new-spec of the main
+   * Indic scripts, and scripts with one spec only, but not for old-specs.
+   * The new-spec for all dual-spec scripts says zero-context matching happens.
+   *
+   * However, testing with Malayalam shows that old and new spec both allow
+   * context.  Testing with Bengali new-spec however shows that it doesn't.
+   * So, the heuristic here is the way it is.  It should *only* be changed,
+   * as we discover more cases of what Windows does.  DON'T TOUCH OTHERWISE.
+   */
+  bool zero_context = !indic_plan->is_old_spec && plan->props.script != HB_SCRIPT_MALAYALAM;
+  indic_plan->rphf.init (&plan->map, HB_TAG('r','p','h','f'), zero_context);
+  indic_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), zero_context);
+  indic_plan->blwf.init (&plan->map, HB_TAG('b','l','w','f'), zero_context);
+  indic_plan->pstf.init (&plan->map, HB_TAG('p','s','t','f'), zero_context);
+
+  for (unsigned int i = 0; i < ARRAY_LENGTH (indic_plan->mask_array); i++)
+    indic_plan->mask_array[i] = (indic_features[i].flags & F_GLOBAL) ?
+				 0 : plan->map.get_1_mask (indic_features[i].tag);
+
+  return indic_plan;
+}
+
+static void
+data_destroy_indic (void *data)
+{
+  free (data);
+}
+
+static indic_position_t
+consonant_position_from_face (const indic_shape_plan_t *indic_plan,
+			      const hb_codepoint_t consonant,
+			      const hb_codepoint_t virama,
+			      hb_face_t *face)
+{
+  /* For old-spec, the order of glyphs is Consonant,Virama,
+   * whereas for new-spec, it's Virama,Consonant.  However,
+   * some broken fonts (like Free Sans) simply copied lookups
+   * from old-spec to new-spec without modification.
+   * And oddly enough, Uniscribe seems to respect those lookups.
+   * Eg. in the sequence U+0924,U+094D,U+0930, Uniscribe finds
+   * base at 0.  The font however, only has lookups matching
+   * 930,94D in 'blwf', not the expected 94D,930 (with new-spec
+   * table).  As such, we simply match both sequences.  Seems
+   * 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;
+  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,
+  standalone_cluster,
+  symbol_cluster,
+  broken_cluster,
+  non_indic_cluster,
+};
+
+#include "hb-ot-shape-complex-indic-machine.hh"
+
+
+static void
+setup_masks_indic (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		   hb_buffer_t              *buffer,
+		   hb_font_t                *font HB_UNUSED)
+{
+  HB_BUFFER_ALLOCATE_VAR (buffer, indic_category);
+  HB_BUFFER_ALLOCATE_VAR (buffer, indic_position);
+
+  /* We cannot setup masks here.  We save information about characters
+   * and setup masks later on in a pause-callback. */
+
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    set_indic_properties (info[i]);
+}
+
+static void
+setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		 hb_font_t *font HB_UNUSED,
+		 hb_buffer_t *buffer)
+{
+  find_syllables (buffer);
+  foreach_syllable (buffer, start, end)
+    buffer->unsafe_to_break (start, end);
+}
+
+static int
+compare_indic_order (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb)
+{
+  int a = pa->indic_position();
+  int b = pb->indic_position();
+
+  return a < b ? -1 : a == b ? 0 : +1;
+}
+
+
+
+static void
+update_consonant_positions (const hb_ot_shape_plan_t *plan,
+			    hb_font_t         *font,
+			    hb_buffer_t       *buffer)
+{
+  const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data;
+
+  if (indic_plan->config->base_pos != BASE_POS_LAST)
+    return;
+
+  hb_codepoint_t virama;
+  if (indic_plan->load_virama_glyph (font, &virama))
+  {
+    hb_face_t *face = font->face;
+    unsigned int count = buffer->len;
+    hb_glyph_info_t *info = buffer->info;
+    for (unsigned int i = 0; i < count; i++)
+      if (info[i].indic_position() == POS_BASE_C)
+      {
+	hb_codepoint_t consonant = info[i].codepoint;
+	info[i].indic_position() = consonant_position_from_face (indic_plan, consonant, virama, face);
+      }
+  }
+}
+
+
+/* Rules from:
+ * https://docs.microsqoft.com/en-us/typography/script-development/devanagari */
+
+static void
+initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
+				       hb_face_t *face,
+				       hb_buffer_t *buffer,
+				       unsigned int start, unsigned int end)
+{
+  const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data;
+  hb_glyph_info_t *info = buffer->info;
+
+  /* https://github.com/harfbuzz/harfbuzz/issues/435#issuecomment-335560167
+   * // For compatibility with legacy usage in Kannada,
+   * // Ra+h+ZWJ must behave like Ra+ZWJ+h...
+   */
+  if (buffer->props.script == HB_SCRIPT_KANNADA &&
+      start + 3 <= end &&
+      is_one_of (info[start  ], FLAG (OT_Ra)) &&
+      is_one_of (info[start+1], FLAG (OT_H)) &&
+      is_one_of (info[start+2], FLAG (OT_ZWJ)))
+  {
+    buffer->merge_clusters (start+1, start+3);
+    hb_glyph_info_t tmp = info[start+1];
+    info[start+1] = info[start+2];
+    info[start+2] = tmp;
+  }
+
+  /* 1. Find base consonant:
+   *
+   * The shaping engine finds the base consonant of the syllable, using the
+   * following algorithm: starting from the end of the syllable, move backwards
+   * until a consonant is found that does not have a below-base or post-base
+   * form (post-base forms have to follow below-base forms), or that is not a
+   * pre-base-reordering Ra, or arrive at the first consonant. The consonant
+   * stopped at will be the base.
+   *
+   *   o If the syllable starts with Ra + Halant (in a script that has Reph)
+   *     and has more than one consonant, Ra is excluded from candidates for
+   *     base consonants.
+   */
+
+  unsigned int base = end;
+  bool has_reph = false;
+
+  {
+    /* -> If the syllable starts with Ra + Halant (in a script that has Reph)
+     *    and has more than one consonant, Ra is excluded from candidates for
+     *    base consonants. */
+    unsigned int limit = start;
+    if (indic_plan->mask_array[RPHF] &&
+	start + 3 <= end &&
+	(
+	 (indic_plan->config->reph_mode == REPH_MODE_IMPLICIT && !is_joiner (info[start + 2])) ||
+	 (indic_plan->config->reph_mode == REPH_MODE_EXPLICIT && info[start + 2].indic_category() == OT_ZWJ)
+	))
+    {
+      /* See if it matches the 'rphf' feature. */
+      hb_codepoint_t glyphs[3] = {info[start].codepoint,
+				  info[start + 1].codepoint,
+				  indic_plan->config->reph_mode == REPH_MODE_EXPLICIT ?
+				    info[start + 2].codepoint : 0};
+      if (indic_plan->rphf.would_substitute (glyphs, 2, face) ||
+	  (indic_plan->config->reph_mode == REPH_MODE_EXPLICIT &&
+	   indic_plan->rphf.would_substitute (glyphs, 3, face)))
+      {
+	limit += 2;
+	while (limit < end && is_joiner (info[limit]))
+	  limit++;
+	base = start;
+	has_reph = true;
+      }
+    } else if (indic_plan->config->reph_mode == REPH_MODE_LOG_REPHA && info[start].indic_category() == OT_Repha)
+    {
+	limit += 1;
+	while (limit < end && is_joiner (info[limit]))
+	  limit++;
+	base = start;
+	has_reph = true;
+    }
+
+    switch (indic_plan->config->base_pos)
+    {
+      case BASE_POS_LAST:
+      {
+	/* -> starting from the end of the syllable, move backwards */
+	unsigned int i = end;
+	bool seen_below = false;
+	do {
+	  i--;
+	  /* -> until a consonant is found */
+	  if (is_consonant (info[i]))
+	  {
+	    /* -> that does not have a below-base or post-base form
+	     * (post-base forms have to follow below-base forms), */
+	    if (info[i].indic_position() != POS_BELOW_C &&
+		(info[i].indic_position() != POS_POST_C || seen_below))
+	    {
+	      base = i;
+	      break;
+	    }
+	    if (info[i].indic_position() == POS_BELOW_C)
+	      seen_below = true;
+
+	    /* -> or that is not a pre-base-reordering Ra,
+	     *
+	     * IMPLEMENTATION NOTES:
+	     *
+	     * Our pre-base-reordering Ra's are marked POS_POST_C, so will be skipped
+	     * by the logic above already.
+	     */
+
+	    /* -> or arrive at the first consonant. The consonant stopped at will
+	     * be the base. */
+	    base = i;
+	  }
+	  else
+	  {
+	    /* A ZWJ after a Halant stops the base search, and requests an explicit
+	     * half form.
+	     * A ZWJ before a Halant, requests a subjoined form instead, and hence
+	     * search continues.  This is particularly important for Bengali
+	     * sequence Ra,H,Ya that should form Ya-Phalaa by subjoining Ya. */
+	    if (start < i &&
+		info[i].indic_category() == OT_ZWJ &&
+		info[i - 1].indic_category() == OT_H)
+	      break;
+	  }
+	} while (i > limit);
+      }
+      break;
+
+      case BASE_POS_LAST_SINHALA:
+      {
+        /* Sinhala base positioning is slightly different from main Indic, in that:
+	 * 1. Its ZWJ behavior is different,
+	 * 2. We don't need to look into the font for consonant positions.
+	 */
+
+	if (!has_reph)
+	  base = limit;
+
+	/* Find the last base consonant that is not blocked by ZWJ.  If there is
+	 * a ZWJ right before a base consonant, that would request a subjoined form. */
+	for (unsigned int i = limit; i < end; i++)
+	  if (is_consonant (info[i]))
+	  {
+	    if (limit < i && info[i - 1].indic_category() == OT_ZWJ)
+	      break;
+	    else
+	      base = i;
+	  }
+
+	/* Mark all subsequent consonants as below. */
+	for (unsigned int i = base + 1; i < end; i++)
+	  if (is_consonant (info[i]))
+	    info[i].indic_position() = POS_BELOW_C;
+      }
+      break;
+    }
+
+    /* -> If the syllable starts with Ra + Halant (in a script that has Reph)
+     *    and has more than one consonant, Ra is excluded from candidates for
+     *    base consonants.
+     *
+     *  Only do this for unforced Reph. (ie. not for Ra,H,ZWJ. */
+    if (has_reph && base == start && limit - base <= 2) {
+      /* Have no other consonant, so Reph is not formed and Ra becomes base. */
+      has_reph = false;
+    }
+  }
+
+
+  /* 2. Decompose and reorder Matras:
+   *
+   * Each matra and any syllable modifier sign in the syllable are moved to the
+   * appropriate position relative to the consonant(s) in the syllable. The
+   * shaping engine decomposes two- or three-part matras into their constituent
+   * parts before any repositioning. Matra characters are classified by which
+   * consonant in a conjunct they have affinity for and are reordered to the
+   * following positions:
+   *
+   *   o Before first half form in the syllable
+   *   o After subjoined consonants
+   *   o After post-form consonant
+   *   o After main consonant (for above marks)
+   *
+   * IMPLEMENTATION NOTES:
+   *
+   * The normalize() routine has already decomposed matras for us, so we don't
+   * need to worry about that.
+   */
+
+
+  /* 3.  Reorder marks to canonical order:
+   *
+   * Adjacent nukta and halant or nukta and vedic sign are always repositioned
+   * if necessary, so that the nukta is first.
+   *
+   * IMPLEMENTATION NOTES:
+   *
+   * We don't need to do this: the normalize() routine already did this for us.
+   */
+
+
+  /* Reorder characters */
+
+  for (unsigned int i = start; i < base; i++)
+    info[i].indic_position() = MIN (POS_PRE_C, (indic_position_t) info[i].indic_position());
+
+  if (base < end)
+    info[base].indic_position() = POS_BASE_C;
+
+  /* Mark final consonants.  A final consonant is one appearing after a matra.
+   * Happens in Sinhala. */
+  for (unsigned int i = base + 1; i < end; i++)
+    if (info[i].indic_category() == OT_M) {
+      for (unsigned int j = i + 1; j < end; j++)
+	if (is_consonant (info[j])) {
+	 info[j].indic_position() = POS_FINAL_C;
+	 break;
+       }
+      break;
+    }
+
+  /* Handle beginning Ra */
+  if (has_reph)
+    info[start].indic_position() = POS_RA_TO_BECOME_REPH;
+
+  /* For old-style Indic script tags, move the first post-base Halant after
+   * last consonant.
+   *
+   * Reports suggest that in some scripts Uniscribe does this only if there
+   * is *not* a Halant after last consonant already.  We know that is the
+   * case for Kannada, while it reorders unconditionally in other scripts,
+   * eg. Malayalam, Bengali, and Devanagari.  We don't currently know about
+   * other scripts, so we blacklist Kannada.
+   *
+   * Kannada test case:
+   * U+0C9A,U+0CCD,U+0C9A,U+0CCD
+   * With some versions of Lohit Kannada.
+   * https://bugs.freedesktop.org/show_bug.cgi?id=59118
+   *
+   * Malayalam test case:
+   * U+0D38,U+0D4D,U+0D31,U+0D4D,U+0D31,U+0D4D
+   * With lohit-ttf-20121122/Lohit-Malayalam.ttf
+   *
+   * Bengali test case:
+   * U+0998,U+09CD,U+09AF,U+09CD
+   * With Windows XP vrinda.ttf
+   * https://github.com/harfbuzz/harfbuzz/issues/1073
+   *
+   * Devanagari test case:
+   * U+091F,U+094D,U+0930,U+094D
+   * With chandas.ttf
+   * https://github.com/harfbuzz/harfbuzz/issues/1071
+   */
+  if (indic_plan->is_old_spec)
+  {
+    bool disallow_double_halants = buffer->props.script == HB_SCRIPT_KANNADA;
+    for (unsigned int i = base + 1; i < end; i++)
+      if (info[i].indic_category() == OT_H)
+      {
+        unsigned int j;
+        for (j = end - 1; j > i; j--)
+	  if (is_consonant (info[j]) ||
+	      (disallow_double_halants && info[j].indic_category() == OT_H))
+	    break;
+	if (info[j].indic_category() != OT_H && j > i) {
+	  /* Move Halant to after last consonant. */
+	  hb_glyph_info_t t = info[i];
+	  memmove (&info[i], &info[i + 1], (j - i) * sizeof (info[0]));
+	  info[j] = t;
+	}
+        break;
+      }
+  }
+
+  /* Attach misc marks to previous char to move with them. */
+  {
+    indic_position_t last_pos = POS_START;
+    for (unsigned int i = start; i < end; i++)
+    {
+      if ((FLAG_UNSAFE (info[i].indic_category()) & (JOINER_FLAGS | FLAG (OT_N) | FLAG (OT_RS) | FLAG (OT_H))))
+      {
+	info[i].indic_position() = last_pos;
+	if (unlikely (info[i].indic_category() == OT_H &&
+		      info[i].indic_position() == POS_PRE_M))
+	{
+	  /*
+	   * Uniscribe doesn't move the Halant with Left Matra.
+	   * TEST: U+092B,U+093F,U+094DE
+	   * We follow.  This is important for the Sinhala
+	   * U+0DDA split matra since it decomposes to U+0DD9,U+0DCA
+	   * where U+0DD9 is a left matra and U+0DCA is the virama.
+	   * We don't want to move the virama with the left matra.
+	   * TEST: U+0D9A,U+0DDA
+	   */
+	  for (unsigned int j = i; j > start; j--)
+	    if (info[j - 1].indic_position() != POS_PRE_M) {
+	      info[i].indic_position() = info[j - 1].indic_position();
+	      break;
+	    }
+	}
+      } else if (info[i].indic_position() != POS_SMVD) {
+        last_pos = (indic_position_t) info[i].indic_position();
+      }
+    }
+  }
+  /* For post-base consonants let them own anything before them
+   * since the last consonant or matra. */
+  {
+    unsigned int last = base;
+    for (unsigned int i = base + 1; i < end; i++)
+      if (is_consonant (info[i]))
+      {
+	for (unsigned int j = last + 1; j < i; j++)
+	  if (info[j].indic_position() < POS_SMVD)
+	    info[j].indic_position() = info[i].indic_position();
+	last = i;
+      } else if (info[i].indic_category() == OT_M)
+        last = i;
+  }
+
+
+  {
+    /* Use syllable() for sort accounting temporarily. */
+    unsigned int syllable = info[start].syllable();
+    for (unsigned int i = start; i < end; i++)
+      info[i].syllable() = i - start;
+
+    /* Sit tight, rock 'n roll! */
+    hb_stable_sort (info + start, end - start, compare_indic_order);
+    /* Find base again */
+    base = end;
+    for (unsigned int i = start; i < end; i++)
+      if (info[i].indic_position() == POS_BASE_C)
+      {
+	base = i;
+	break;
+      }
+    /* Things are out-of-control for post base positions, they may shuffle
+     * around like crazy.  In old-spec mode, we move halants around, so in
+     * that case merge all clusters after base.  Otherwise, check the sort
+     * order and merge as needed.
+     * For pre-base stuff, we handle cluster issues in final reordering.
+     *
+     * We could use buffer->sort() for this, if there was no special
+     * reordering of pre-base stuff happening later...
+     * We don't want to merge_clusters all of that, which buffer->sort()
+     * would.
+     */
+    if (indic_plan->is_old_spec || end - start > 127)
+      buffer->merge_clusters (base, end);
+    else
+    {
+      /* Note!  syllable() is a one-byte field. */
+      for (unsigned int i = base; i < end; i++)
+        if (info[i].syllable() != 255)
+	{
+	  unsigned int max = i;
+	  unsigned int j = start + info[i].syllable();
+	  while (j != i)
+	  {
+	    max = MAX (max, j);
+	    unsigned int next = start + info[j].syllable();
+	    info[j].syllable() = 255; /* So we don't process j later again. */
+	    j = next;
+	  }
+	  if (i != max)
+	    buffer->merge_clusters (i, max + 1);
+	}
+    }
+
+    /* Put syllable back in. */
+    for (unsigned int i = start; i < end; i++)
+      info[i].syllable() = syllable;
+  }
+
+  /* Setup masks now */
+
+  {
+    hb_mask_t mask;
+
+    /* Reph */
+    for (unsigned int i = start; i < end && info[i].indic_position() == POS_RA_TO_BECOME_REPH; i++)
+      info[i].mask |= indic_plan->mask_array[RPHF];
+
+    /* Pre-base */
+    mask = indic_plan->mask_array[HALF];
+    if (!indic_plan->is_old_spec &&
+	indic_plan->config->blwf_mode == BLWF_MODE_PRE_AND_POST)
+      mask |= indic_plan->mask_array[BLWF];
+    for (unsigned int i = start; i < base; i++)
+      info[i].mask  |= mask;
+    /* Base */
+    mask = 0;
+    if (base < end)
+      info[base].mask |= mask;
+    /* Post-base */
+    mask = indic_plan->mask_array[BLWF] | indic_plan->mask_array[ABVF] | indic_plan->mask_array[PSTF];
+    for (unsigned int i = base + 1; i < end; i++)
+      info[i].mask  |= mask;
+  }
+
+  if (indic_plan->is_old_spec &&
+      buffer->props.script == HB_SCRIPT_DEVANAGARI)
+  {
+    /* Old-spec eye-lash Ra needs special handling.  From the
+     * spec:
+     *
+     * "The feature 'below-base form' is applied to consonants
+     * having below-base forms and following the base consonant.
+     * The exception is vattu, which may appear below half forms
+     * as well as below the base glyph. The feature 'below-base
+     * form' will be applied to all such occurrences of Ra as well."
+     *
+     * Test case: U+0924,U+094D,U+0930,U+094d,U+0915
+     * with Sanskrit 2003 font.
+     *
+     * However, note that Ra,Halant,ZWJ is the correct way to
+     * request eyelash form of Ra, so we wouldbn't inhibit it
+     * in that sequence.
+     *
+     * Test case: U+0924,U+094D,U+0930,U+094d,U+200D,U+0915
+     */
+    for (unsigned int i = start; i + 1 < base; i++)
+      if (info[i  ].indic_category() == OT_Ra &&
+	  info[i+1].indic_category() == OT_H  &&
+	  (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 = 2;
+  if (indic_plan->mask_array[PREF] && base + pref_len < end)
+  {
+    /* 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++)
+	  info[i++].mask |= indic_plan->mask_array[PREF];
+	break;
+      }
+    }
+  }
+
+  /* Apply ZWJ/ZWNJ effects */
+  for (unsigned int i = start + 1; i < end; i++)
+    if (is_joiner (info[i])) {
+      bool non_joiner = info[i].indic_category() == OT_ZWNJ;
+      unsigned int j = i;
+
+      do {
+	j--;
+
+	/* ZWJ/ZWNJ should disable CJCT.  They do that by simply
+	 * being there, since we don't skip them for the CJCT
+	 * feature (ie. F_MANUAL_ZWJ) */
+
+	/* A ZWNJ disables HALF. */
+	if (non_joiner)
+	  info[j].mask &= ~indic_plan->mask_array[HALF];
+
+      } while (j > start && !is_consonant (info[j]));
+    }
+}
+
+static void
+initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan,
+				       hb_face_t *face,
+				       hb_buffer_t *buffer,
+				       unsigned int start, unsigned int end)
+{
+  const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data;
+
+  /* We treat placeholder/dotted-circle as if they are consonants, so we
+   * should just chain.  Only if not in compatibility mode that is... */
+
+  if (indic_plan->uniscribe_bug_compatible)
+  {
+    /* For dotted-circle, this is what Uniscribe does:
+     * If dotted-circle is the last glyph, it just does nothing.
+     * Ie. It doesn't form Reph. */
+    if (buffer->info[end - 1].indic_category() == OT_DOTTEDCIRCLE)
+      return;
+  }
+
+  initial_reordering_consonant_syllable (plan, face, buffer, start, end);
+}
+
+static void
+initial_reordering_syllable (const hb_ot_shape_plan_t *plan,
+			     hb_face_t *face,
+			     hb_buffer_t *buffer,
+			     unsigned int start, unsigned int end)
+{
+  syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F);
+  switch (syllable_type)
+  {
+    case vowel_syllable: /* We made the vowels look like consonants.  So let's call the consonant logic! */
+    case consonant_syllable:
+     initial_reordering_consonant_syllable (plan, face, buffer, start, end);
+     break;
+
+    case broken_cluster: /* We already inserted dotted-circles, so just call the standalone_cluster. */
+    case standalone_cluster:
+     initial_reordering_standalone_cluster (plan, face, buffer, start, end);
+     break;
+
+    case symbol_cluster:
+    case non_indic_cluster:
+      break;
+  }
+}
+
+static inline void
+insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		       hb_font_t *font,
+		       hb_buffer_t *buffer)
+{
+  /* Note: This loop is extra overhead, but should not be measurable.
+   * TODO Use a buffer scratch flag to remove the loop. */
+  bool has_broken_syllables = false;
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    if ((info[i].syllable() & 0x0F) == broken_cluster)
+    {
+      has_broken_syllables = true;
+      break;
+    }
+  if (likely (!has_broken_syllables))
+    return;
+
+
+  hb_codepoint_t dottedcircle_glyph;
+  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
+    return;
+
+  hb_glyph_info_t dottedcircle = {0};
+  dottedcircle.codepoint = 0x25CCu;
+  set_indic_properties (dottedcircle);
+  dottedcircle.codepoint = dottedcircle_glyph;
+
+  buffer->clear_output ();
+
+  buffer->idx = 0;
+  unsigned int last_syllable = 0;
+  while (buffer->idx < buffer->len && buffer->successful)
+  {
+    unsigned int syllable = buffer->cur().syllable();
+    syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
+    if (unlikely (last_syllable != syllable && syllable_type == broken_cluster))
+    {
+      last_syllable = syllable;
+
+      hb_glyph_info_t ginfo = dottedcircle;
+      ginfo.cluster = buffer->cur().cluster;
+      ginfo.mask = buffer->cur().mask;
+      ginfo.syllable() = buffer->cur().syllable();
+      /* TODO Set glyph_props? */
+
+      /* Insert dottedcircle after possible Repha. */
+      while (buffer->idx < buffer->len && buffer->successful &&
+	     last_syllable == buffer->cur().syllable() &&
+	     buffer->cur().indic_category() == OT_Repha)
+        buffer->next_glyph ();
+
+      buffer->output_info (ginfo);
+    }
+    else
+      buffer->next_glyph ();
+  }
+  buffer->swap_buffers ();
+}
+
+static void
+initial_reordering (const hb_ot_shape_plan_t *plan,
+		    hb_font_t *font,
+		    hb_buffer_t *buffer)
+{
+  update_consonant_positions (plan, font, buffer);
+  insert_dotted_circles (plan, font, buffer);
+
+  foreach_syllable (buffer, start, end)
+    initial_reordering_syllable (plan, font->face, buffer, start, end);
+}
+
+static void
+final_reordering_syllable (const hb_ot_shape_plan_t *plan,
+			   hb_buffer_t *buffer,
+			   unsigned int start, unsigned int end)
+{
+  const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data;
+  hb_glyph_info_t *info = buffer->info;
+
+
+  /* This function relies heavily on halant glyphs.  Lots of ligation
+   * and possibly multiple substitutions happened prior to this
+   * phase, and that might have messed up our properties.  Recover
+   * from a particular case of that where we're fairly sure that a
+   * class of OT_H is desired but has been lost. */
+  /* We don't call load_virama_glyph(), since we know it's already
+   * loaded. */
+  hb_codepoint_t virama_glyph = indic_plan->virama_glyph.get_relaxed ();
+  if (virama_glyph)
+  {
+    for (unsigned int i = start; i < end; i++)
+      if (info[i].codepoint == virama_glyph &&
+	  _hb_glyph_info_ligated (&info[i]) &&
+	  _hb_glyph_info_multiplied (&info[i]))
+      {
+        /* This will make sure that this glyph passes is_halant() test. */
+	info[i].indic_category() = OT_H;
+	_hb_glyph_info_clear_ligated_and_multiplied (&info[i]);
+      }
+  }
+
+
+  /* 4. Final reordering:
+   *
+   * After the localized forms and basic shaping forms GSUB features have been
+   * applied (see below), the shaping engine performs some final glyph
+   * reordering before applying all the remaining font features to the entire
+   * syllable.
+   */
+
+  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)
+      {
+	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.
+	       * Base is around here... */
+	      base = i;
+	      while (base < end && is_halant (info[base]))
+		base++;
+	      info[base].indic_position() = POS_BASE_C;
+
+	      try_pref = false;
+	    }
+	    break;
+	  }
+      }
+      /* For Malayalam, skip over unformed below- (but NOT post-) forms. */
+      if (buffer->props.script == HB_SCRIPT_MALAYALAM)
+      {
+	for (unsigned int i = base + 1; i < end; i++)
+	{
+	  while (i < end && is_joiner (info[i]))
+	    i++;
+	  if (i == end || !is_halant (info[i]))
+	    break;
+	  i++; /* Skip halant. */
+	  while (i < end && is_joiner (info[i]))
+	    i++;
+	  if (i < end && is_consonant (info[i]) && info[i].indic_position() == POS_BELOW_C)
+	  {
+	    base = i;
+	    info[base].indic_position() = POS_BASE_C;
+	  }
+	}
+      }
+
+      if (start < base && info[base].indic_position() > POS_BASE_C)
+        base--;
+      break;
+    }
+  if (base == end && start < base &&
+      is_one_of (info[base - 1], FLAG (OT_ZWJ)))
+    base--;
+  if (base < end)
+    while (start < base &&
+	   is_one_of (info[base], (FLAG (OT_N) | FLAG (OT_H))))
+      base--;
+
+
+  /*   o Reorder matras:
+   *
+   *     If a pre-base matra character had been reordered before applying basic
+   *     features, the glyph can be moved closer to the main consonant based on
+   *     whether half-forms had been formed. Actual position for the matra is
+   *     defined as “after last standalone halant glyph, after initial matra
+   *     position and before the main consonant”. If ZWJ or ZWNJ follow this
+   *     halant, position is moved after it.
+   *
+   * IMPLEMENTATION NOTES:
+   *
+   * It looks like the last sentence is wrong.  Testing, with Windows 7 Uniscribe
+   * and Devanagari shows that the behavior is best described as:
+   *
+   * "If ZWJ follows this halant, matra is NOT repositioned after this halant.
+   *  If ZWNJ follows this halant, position is moved after it."
+   *
+   * Test case, with Adobe Devanagari or Nirmala UI:
+   *
+   *   U+091F,U+094D,U+200C,U+092F,U+093F
+   *   (Matra moves to the middle, after ZWNJ.)
+   *
+   *   U+091F,U+094D,U+200D,U+092F,U+093F
+   *   (Matra does NOT move, stays to the left.)
+   *
+   * https://github.com/harfbuzz/harfbuzz/issues/1070
+   */
+
+  if (start + 1 < end && start < base) /* Otherwise there can't be any pre-base matra characters. */
+  {
+    /* If we lost track of base, alas, position before last thingy. */
+    unsigned int new_pos = base == end ? base - 2 : base - 1;
+
+    /* Malayalam / Tamil do not have "half" forms or explicit virama forms.
+     * The glyphs formed by 'half' are Chillus or ligated explicit viramas.
+     * We want to position matra after them.
+     */
+    if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL)
+    {
+    search:
+      while (new_pos > start &&
+	     !(is_one_of (info[new_pos], (FLAG (OT_M) | FLAG (OT_H)))))
+	new_pos--;
+
+      /* If we found no Halant we are done.
+       * Otherwise only proceed if the Halant does
+       * not belong to the Matra itself! */
+      if (is_halant (info[new_pos]) &&
+	  info[new_pos].indic_position() != POS_PRE_M)
+      {
+#if 0 // See comment above
+	/* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
+	if (new_pos + 1 < end && is_joiner (info[new_pos + 1]))
+	  new_pos++;
+#endif
+	if (new_pos + 1 < end)
+	{
+	  /* -> If ZWJ follows this halant, matra is NOT repositioned after this halant. */
+	  if (info[new_pos + 1].indic_category() == OT_ZWJ)
+	  {
+	    /* Keep searching. */
+	    if (new_pos > start)
+	    {
+	      new_pos--;
+	      goto search;
+	    }
+	  }
+	  /* -> If ZWNJ follows this halant, position is moved after it. */
+	  if (info[new_pos + 1].indic_category() == OT_ZWNJ)
+	    new_pos++;
+	}
+      }
+      else
+        new_pos = start; /* No move. */
+    }
+
+    if (start < new_pos && info[new_pos].indic_position () != POS_PRE_M)
+    {
+      /* Now go see if there's actually any matras... */
+      for (unsigned int i = new_pos; i > start; i--)
+	if (info[i - 1].indic_position () == POS_PRE_M)
+	{
+	  unsigned int old_pos = i - 1;
+	  if (old_pos < base && base <= new_pos) /* Shouldn't actually happen. */
+	    base--;
+
+	  hb_glyph_info_t tmp = info[old_pos];
+	  memmove (&info[old_pos], &info[old_pos + 1], (new_pos - old_pos) * sizeof (info[0]));
+	  info[new_pos] = tmp;
+
+	  /* Note: this merge_clusters() is intentionally *after* the reordering.
+	   * Indic matra reordering is special and tricky... */
+	  buffer->merge_clusters (new_pos, MIN (end, base + 1));
+
+	  new_pos--;
+	}
+    } else {
+      for (unsigned int i = start; i < base; i++)
+	if (info[i].indic_position () == POS_PRE_M) {
+	  buffer->merge_clusters (i, MIN (end, base + 1));
+	  break;
+	}
+    }
+  }
+
+
+  /*   o Reorder reph:
+   *
+   *     Reph’s original position is always at the beginning of the syllable,
+   *     (i.e. it is not reordered at the character reordering stage). However,
+   *     it will be reordered according to the basic-forms shaping results.
+   *     Possible positions for reph, depending on the script, are; after main,
+   *     before post-base consonant forms, and after post-base consonant forms.
+   */
+
+  /* Two cases:
+   *
+   * - If repha is encoded as a sequence of characters (Ra,H or Ra,H,ZWJ), then
+   *   we should only move it if the sequence ligated to the repha form.
+   *
+   * - If repha is encoded separately and in the logical position, we should only
+   *   move it if it did NOT ligate.  If it ligated, it's probably the font trying
+   *   to make it work without the reordering.
+   */
+  if (start + 1 < end &&
+      info[start].indic_position() == POS_RA_TO_BECOME_REPH &&
+      ((info[start].indic_category() == OT_Repha) ^
+       _hb_glyph_info_ligated_and_didnt_multiply (&info[start])))
+  {
+    unsigned int new_reph_pos;
+    reph_position_t reph_pos = indic_plan->config->reph_pos;
+
+    /*       1. If reph should be positioned after post-base consonant forms,
+     *          proceed to step 5.
+     */
+    if (reph_pos == REPH_POS_AFTER_POST)
+    {
+      goto reph_step_5;
+    }
+
+    /*       2. If the reph repositioning class is not after post-base: target
+     *          position is after the first explicit halant glyph between the
+     *          first post-reph consonant and last main consonant. If ZWJ or ZWNJ
+     *          are following this halant, position is moved after it. If such
+     *          position is found, this is the target position. Otherwise,
+     *          proceed to the next step.
+     *
+     *          Note: in old-implementation fonts, where classifications were
+     *          fixed in shaping engine, there was no case where reph position
+     *          will be found on this step.
+     */
+    {
+      new_reph_pos = start + 1;
+      while (new_reph_pos < base && !is_halant (info[new_reph_pos]))
+	new_reph_pos++;
+
+      if (new_reph_pos < base && is_halant (info[new_reph_pos]))
+      {
+	/* ->If ZWJ or ZWNJ are following this halant, position is moved after it. */
+	if (new_reph_pos + 1 < base && is_joiner (info[new_reph_pos + 1]))
+	  new_reph_pos++;
+	goto reph_move;
+      }
+    }
+
+    /*       3. If reph should be repositioned after the main consonant: find the
+     *          first consonant not ligated with main, or find the first
+     *          consonant that is not a potential pre-base-reordering Ra.
+     */
+    if (reph_pos == REPH_POS_AFTER_MAIN)
+    {
+      new_reph_pos = base;
+      while (new_reph_pos + 1 < end && info[new_reph_pos + 1].indic_position() <= POS_AFTER_MAIN)
+	new_reph_pos++;
+      if (new_reph_pos < end)
+        goto reph_move;
+    }
+
+    /*       4. If reph should be positioned before post-base consonant, find
+     *          first post-base classified consonant not ligated with main. If no
+     *          consonant is found, the target position should be before the
+     *          first matra, syllable modifier sign or vedic sign.
+     */
+    /* This is our take on what step 4 is trying to say (and failing, BADLY). */
+    if (reph_pos == REPH_POS_AFTER_SUB)
+    {
+      new_reph_pos = base;
+      while (new_reph_pos + 1 < end &&
+	     !( FLAG_UNSAFE (info[new_reph_pos + 1].indic_position()) & (FLAG (POS_POST_C) | FLAG (POS_AFTER_POST) | FLAG (POS_SMVD))))
+	new_reph_pos++;
+      if (new_reph_pos < end)
+        goto reph_move;
+    }
+
+    /*       5. If no consonant is found in steps 3 or 4, move reph to a position
+     *          immediately before the first post-base matra, syllable modifier
+     *          sign or vedic sign that has a reordering class after the intended
+     *          reph position. For example, if the reordering position for reph
+     *          is post-main, it will skip above-base matras that also have a
+     *          post-main position.
+     */
+    reph_step_5:
+    {
+      /* Copied from step 2. */
+      new_reph_pos = start + 1;
+      while (new_reph_pos < base && !is_halant (info[new_reph_pos]))
+	new_reph_pos++;
+
+      if (new_reph_pos < base && is_halant (info[new_reph_pos]))
+      {
+	/* ->If ZWJ or ZWNJ are following this halant, position is moved after it. */
+	if (new_reph_pos + 1 < base && is_joiner (info[new_reph_pos + 1]))
+	  new_reph_pos++;
+	goto reph_move;
+      }
+    }
+
+    /*       6. Otherwise, reorder reph to the end of the syllable.
+     */
+    {
+      new_reph_pos = end - 1;
+      while (new_reph_pos > start && info[new_reph_pos].indic_position() == POS_SMVD)
+	new_reph_pos--;
+
+      /*
+       * If the Reph is to be ending up after a Matra,Halant sequence,
+       * position it before that Halant so it can interact with the Matra.
+       * However, if it's a plain Consonant,Halant we shouldn't do that.
+       * Uniscribe doesn't do this.
+       * TEST: U+0930,U+094D,U+0915,U+094B,U+094D
+       */
+      if (!indic_plan->uniscribe_bug_compatible &&
+	  unlikely (is_halant (info[new_reph_pos]))) {
+	for (unsigned int i = base + 1; i < new_reph_pos; i++)
+	  if (info[i].indic_category() == OT_M) {
+	    /* Ok, got it. */
+	    new_reph_pos--;
+	  }
+      }
+      goto reph_move;
+    }
+
+    reph_move:
+    {
+      /* Move */
+      buffer->merge_clusters (start, new_reph_pos + 1);
+      hb_glyph_info_t reph = info[start];
+      memmove (&info[start], &info[start + 1], (new_reph_pos - start) * sizeof (info[0]));
+      info[new_reph_pos] = reph;
+
+      if (start < base && base <= new_reph_pos)
+	base--;
+    }
+  }
+
+
+  /*   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. */
+  {
+    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...
+	 *
+	 * 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.
+	   */
+
+	  unsigned int new_pos = base;
+	  /* Malayalam / Tamil do not have "half" forms or explicit virama forms.
+	   * The glyphs formed by 'half' are Chillus or ligated explicit viramas.
+	   * We want to position matra after them.
+	   */
+	  if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL)
+	  {
+	    while (new_pos > start &&
+		   !(is_one_of (info[new_pos - 1], FLAG(OT_M) | FLAG (OT_H))))
+	      new_pos--;
+	  }
+
+	  if (new_pos > start && is_halant (info[new_pos - 1]))
+	  {
+	    /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
+	    if (new_pos < end && is_joiner (info[new_pos]))
+	      new_pos++;
+	  }
+
+	  {
+	    unsigned int old_pos = i;
+
+	    buffer->merge_clusters (new_pos, old_pos + 1);
+	    hb_glyph_info_t tmp = info[old_pos];
+	    memmove (&info[new_pos + 1], &info[new_pos], (old_pos - new_pos) * sizeof (info[0]));
+	    info[new_pos] = tmp;
+
+	    if (new_pos <= base && base < old_pos)
+	      base++;
+	  }
+	}
+
+        break;
+      }
+  }
+
+
+  /* Apply 'init' to the Left Matra if it's a word start. */
+  if (info[start].indic_position () == POS_PRE_M)
+  {
+    if (!start ||
+	!(FLAG_UNSAFE (_hb_glyph_info_get_general_category (&info[start - 1])) &
+	 FLAG_RANGE (HB_UNICODE_GENERAL_CATEGORY_FORMAT, HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
+      info[start].mask |= indic_plan->mask_array[INIT];
+    else
+      buffer->unsafe_to_break (start - 1, start + 1);
+  }
+
+
+  /*
+   * Finish off the clusters and go home!
+   */
+  if (indic_plan->uniscribe_bug_compatible)
+  {
+    switch ((hb_tag_t) plan->props.script)
+    {
+      case HB_SCRIPT_TAMIL:
+      case HB_SCRIPT_SINHALA:
+        break;
+
+      default:
+	/* Uniscribe merges the entire syllable into a single cluster... Except for Tamil & Sinhala.
+	 * This means, half forms are submerged into the main consonant's cluster.
+	 * This is unnecessary, and makes cursor positioning harder, but that's what
+	 * Uniscribe does. */
+	buffer->merge_clusters (start, end);
+	break;
+    }
+  }
+}
+
+
+static void
+final_reordering (const hb_ot_shape_plan_t *plan,
+		  hb_font_t *font HB_UNUSED,
+		  hb_buffer_t *buffer)
+{
+  unsigned int count = buffer->len;
+  if (unlikely (!count)) return;
+
+  foreach_syllable (buffer, start, end)
+    final_reordering_syllable (plan, buffer, start, end);
+
+  HB_BUFFER_DEALLOCATE_VAR (buffer, indic_category);
+  HB_BUFFER_DEALLOCATE_VAR (buffer, indic_position);
+}
+
+
+static void
+clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		 hb_font_t *font HB_UNUSED,
+		 hb_buffer_t *buffer)
+{
+  hb_glyph_info_t *info = buffer->info;
+  unsigned int count = buffer->len;
+  for (unsigned int i = 0; i < count; i++)
+    info[i].syllable() = 0;
+}
+
+
+static void
+preprocess_text_indic (const hb_ot_shape_plan_t *plan,
+		       hb_buffer_t              *buffer,
+		       hb_font_t                *font)
+{
+  _hb_preprocess_text_vowel_constraints (plan, buffer, font);
+}
+
+static bool
+decompose_indic (const hb_ot_shape_normalize_context_t *c,
+		 hb_codepoint_t  ab,
+		 hb_codepoint_t *a,
+		 hb_codepoint_t *b)
+{
+  switch (ab)
+  {
+    /* Don't decompose these. */
+    case 0x0931u  : return false; /* DEVANAGARI LETTER RRA */
+    // https://github.com/harfbuzz/harfbuzz/issues/779
+    case 0x09DCu  : return false; /* BENGALI LETTER RRA */
+    case 0x09DDu  : return false; /* BENGALI LETTER RHA */
+    case 0x0B94u  : return false; /* TAMIL LETTER AU */
+
+
+    /*
+     * Decompose split matras that don't have Unicode decompositions.
+     */
+
+#if 0
+    /* Gujarati */
+    /* This one has no decomposition in Unicode, but needs no decomposition either. */
+    /* case 0x0AC9u  : return false; */
+
+    /* Oriya */
+    case 0x0B57u  : *a = no decomp, -> RIGHT; return true;
+#endif
+  }
+
+  if ((ab == 0x0DDAu || hb_in_range<hb_codepoint_t> (ab, 0x0DDCu, 0x0DDEu)))
+  {
+    /*
+     * Sinhala split matras...  Let the fun begin.
+     *
+     * These four characters have Unicode decompositions.  However, Uniscribe
+     * decomposes them "Khmer-style", that is, it uses the character itself to
+     * get the second half.  The first half of all four decompositions is always
+     * U+0DD9.
+     *
+     * Now, there are buggy fonts, namely, the widely used lklug.ttf, that are
+     * broken with Uniscribe.  But we need to support them.  As such, we only
+     * do the Uniscribe-style decomposition if the character is transformed into
+     * its "sec.half" form by the 'pstf' feature.  Otherwise, we fall back to
+     * Unicode decomposition.
+     *
+     * Note that we can't unconditionally use Unicode decomposition.  That would
+     * break some other fonts, that are designed to work with Uniscribe, and
+     * don't have positioning features for the Unicode-style decomposition.
+     *
+     * Argh...
+     *
+     * The Uniscribe behavior is now documented in the newly published Sinhala
+     * spec in 2012:
+     *
+     *   https://docs.microsoft.com/en-us/typography/script-development/sinhala#shaping
+     */
+
+    const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) c->plan->data;
+
+    hb_codepoint_t glyph;
+
+    if (hb_options ().uniscribe_bug_compatible ||
+	(c->font->get_nominal_glyph (ab, &glyph) &&
+	 indic_plan->pstf.would_substitute (&glyph, 1, c->font->face)))
+    {
+      /* Ok, safe to use Uniscribe-style decomposition. */
+      *a = 0x0DD9u;
+      *b = ab;
+      return true;
+    }
+  }
+
+  return (bool) c->unicode->decompose (ab, a, b);
+}
+
+static bool
+compose_indic (const hb_ot_shape_normalize_context_t *c,
+	       hb_codepoint_t  a,
+	       hb_codepoint_t  b,
+	       hb_codepoint_t *ab)
+{
+  /* Avoid recomposing split matras. */
+  if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (c->unicode->general_category (a)))
+    return false;
+
+  /* Composition-exclusion exceptions that we want to recompose. */
+  if (a == 0x09AFu && b == 0x09BCu) { *ab = 0x09DFu; return true; }
+
+  return (bool) c->unicode->compose (a, b, ab);
+}
+
+
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic =
+{
+  collect_features_indic,
+  override_features_indic,
+  data_create_indic,
+  data_destroy_indic,
+  preprocess_text_indic,
+  nullptr, /* postprocess_glyphs */
+  HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
+  decompose_indic,
+  compose_indic,
+  setup_masks_indic,
+  HB_TAG_NONE, /* gpos_tag */
+  nullptr, /* reorder_marks */
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
+  false, /* fallback_position */
+};
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic.hh
new file mode 100644
index 0000000..dcc2a7a
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-indic.hh
@@ -0,0 +1,399 @@
+/*
+ * Copyright © 2012  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_SHAPE_COMPLEX_INDIC_HH
+#define HB_OT_SHAPE_COMPLEX_INDIC_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex.hh"
+
+
+/* buffer var allocations */
+#define indic_category() complex_var_u8_0() /* indic_category_t */
+#define indic_position() complex_var_u8_1() /* indic_position_t */
+
+
+#define INDIC_TABLE_ELEMENT_TYPE uint16_t
+
+/* Cateories used in the OpenType spec:
+ * https://docs.microsoft.com/en-us/typography/script-development/devanagari
+ */
+/* Note: This enum is duplicated in the -machine.rl source file.
+ * Not sure how to avoid duplication. */
+enum indic_category_t {
+  OT_X = 0,
+  OT_C = 1,
+  OT_V = 2,
+  OT_N = 3,
+  OT_H = 4,
+  OT_ZWNJ = 5,
+  OT_ZWJ = 6,
+  OT_M = 7,
+  OT_SM = 8,
+  /* OT_VD = 9, UNUSED; we use OT_A instead. */
+  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; Unused by Indic shaper. */
+  OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */
+  OT_CS = 19
+};
+
+/* 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_CS) | FLAG (OT_Ra) | FLAG (OT_V) | FLAG (OT_PLACEHOLDER) | FLAG (OT_DOTTEDCIRCLE))
+#define JOINER_FLAGS (FLAG (OT_ZWJ) | FLAG (OT_ZWNJ))
+
+
+/* Visual positions in a syllable from left to right. */
+enum indic_position_t {
+  POS_START = 0,
+
+  POS_RA_TO_BECOME_REPH = 1,
+  POS_PRE_M = 2,
+  POS_PRE_C = 3,
+
+  POS_BASE_C = 4,
+  POS_AFTER_MAIN = 5,
+
+  POS_ABOVE_C = 6,
+
+  POS_BEFORE_SUB = 7,
+  POS_BELOW_C = 8,
+  POS_AFTER_SUB = 9,
+
+  POS_BEFORE_POST = 10,
+  POS_POST_C = 11,
+  POS_AFTER_POST = 12,
+
+  POS_FINAL_C = 13,
+  POS_SMVD = 14,
+
+  POS_END = 15
+};
+
+/* Categories used in IndicSyllabicCategory.txt from UCD. */
+enum indic_syllabic_category_t {
+  INDIC_SYLLABIC_CATEGORY_OTHER				= OT_X,
+
+  INDIC_SYLLABIC_CATEGORY_AVAGRAHA			= OT_Symbol,
+  INDIC_SYLLABIC_CATEGORY_BINDU				= OT_SM,
+  INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER		= OT_PLACEHOLDER, /* Don't care. */
+  INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK		= OT_A,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT			= OT_C,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD		= OT_C,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL		= OT_CM,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER		= OT_C,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER		= OT_M, /* U+17CD only. */
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL		= OT_CM,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER		= OT_PLACEHOLDER,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA	= OT_Repha,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED		= OT_X, /* Don't care. */
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED		= OT_CM,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA	= OT_CM,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER	= OT_CS,
+  INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK		= OT_SM, /* https://github.com/harfbuzz/harfbuzz/issues/552 */
+  INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER		= OT_Coeng,
+  INDIC_SYLLABIC_CATEGORY_JOINER			= OT_ZWJ,
+  INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER		= OT_X,
+  INDIC_SYLLABIC_CATEGORY_NON_JOINER			= OT_ZWNJ,
+  INDIC_SYLLABIC_CATEGORY_NUKTA				= OT_N,
+  INDIC_SYLLABIC_CATEGORY_NUMBER			= OT_PLACEHOLDER,
+  INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER			= OT_PLACEHOLDER, /* Don't care. */
+  INDIC_SYLLABIC_CATEGORY_PURE_KILLER			= OT_M, /* Is like a vowel matra. */
+  INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER		= OT_RS,
+  INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER		= OT_SM,
+  INDIC_SYLLABIC_CATEGORY_TONE_LETTER			= OT_X,
+  INDIC_SYLLABIC_CATEGORY_TONE_MARK			= OT_N,
+  INDIC_SYLLABIC_CATEGORY_VIRAMA			= OT_H,
+  INDIC_SYLLABIC_CATEGORY_VISARGA			= OT_SM,
+  INDIC_SYLLABIC_CATEGORY_VOWEL				= OT_V,
+  INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT		= OT_M,
+  INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT		= OT_V
+};
+
+/* Categories used in IndicSMatraCategory.txt from UCD */
+enum indic_matra_category_t {
+  INDIC_MATRA_CATEGORY_NOT_APPLICABLE			= POS_END,
+
+  INDIC_MATRA_CATEGORY_LEFT				= POS_PRE_C,
+  INDIC_MATRA_CATEGORY_TOP				= POS_ABOVE_C,
+  INDIC_MATRA_CATEGORY_BOTTOM				= POS_BELOW_C,
+  INDIC_MATRA_CATEGORY_RIGHT				= POS_POST_C,
+
+  /* These should resolve to the position of the last part of the split sequence. */
+  INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT			= INDIC_MATRA_CATEGORY_RIGHT,
+  INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT			= INDIC_MATRA_CATEGORY_RIGHT,
+  INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM			= INDIC_MATRA_CATEGORY_BOTTOM,
+  INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT		= INDIC_MATRA_CATEGORY_RIGHT,
+  INDIC_MATRA_CATEGORY_TOP_AND_LEFT			= INDIC_MATRA_CATEGORY_TOP,
+  INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT		= INDIC_MATRA_CATEGORY_RIGHT,
+  INDIC_MATRA_CATEGORY_TOP_AND_RIGHT			= INDIC_MATRA_CATEGORY_RIGHT,
+
+  INDIC_MATRA_CATEGORY_OVERSTRUCK			= POS_AFTER_MAIN,
+  INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT		= POS_PRE_M
+};
+
+#define INDIC_COMBINE_CATEGORIES(S,M) \
+  ( \
+    ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \
+    ( S | \
+     ( \
+      ( \
+       S == INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL || \
+       S == INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK || \
+       S == INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER || \
+       S == INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA || \
+       S == INDIC_SYLLABIC_CATEGORY_VIRAMA || \
+       S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT || \
+       false \
+       ? M : INDIC_MATRA_CATEGORY_NOT_APPLICABLE \
+      ) << 8 \
+     ) \
+    ) \
+   )
+
+HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE
+hb_indic_get_categories (hb_codepoint_t u);
+
+
+static inline bool
+is_one_of (const hb_glyph_info_t &info, unsigned int flags)
+{
+  /* If it ligated, all bets are off. */
+  if (_hb_glyph_info_ligated (&info)) return false;
+  return !!(FLAG_UNSAFE (info.indic_category()) & flags);
+}
+
+static inline bool
+is_joiner (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, JOINER_FLAGS);
+}
+
+static inline bool
+is_consonant (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, CONSONANT_FLAGS);
+}
+
+static inline bool
+is_halant (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, FLAG (OT_H));
+}
+
+#define IN_HALF_BLOCK(u, Base) (((u) & ~0x7Fu) == (Base))
+
+#define IS_DEVA(u) (IN_HALF_BLOCK (u, 0x0900u))
+#define IS_BENG(u) (IN_HALF_BLOCK (u, 0x0980u))
+#define IS_GURU(u) (IN_HALF_BLOCK (u, 0x0A00u))
+#define IS_GUJR(u) (IN_HALF_BLOCK (u, 0x0A80u))
+#define IS_ORYA(u) (IN_HALF_BLOCK (u, 0x0B00u))
+#define IS_TAML(u) (IN_HALF_BLOCK (u, 0x0B80u))
+#define IS_TELU(u) (IN_HALF_BLOCK (u, 0x0C00u))
+#define IS_KNDA(u) (IN_HALF_BLOCK (u, 0x0C80u))
+#define IS_MLYM(u) (IN_HALF_BLOCK (u, 0x0D00u))
+#define IS_SINH(u) (IN_HALF_BLOCK (u, 0x0D80u))
+
+
+#define MATRA_POS_LEFT(u)	POS_PRE_M
+#define MATRA_POS_RIGHT(u)	( \
+				  IS_DEVA(u) ? POS_AFTER_SUB  : \
+				  IS_BENG(u) ? POS_AFTER_POST : \
+				  IS_GURU(u) ? POS_AFTER_POST : \
+				  IS_GUJR(u) ? POS_AFTER_POST : \
+				  IS_ORYA(u) ? POS_AFTER_POST : \
+				  IS_TAML(u) ? POS_AFTER_POST : \
+				  IS_TELU(u) ? (u <= 0x0C42u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
+				  IS_KNDA(u) ? (u < 0x0CC3u || u > 0xCD6u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
+				  IS_MLYM(u) ? POS_AFTER_POST : \
+				  IS_SINH(u) ? POS_AFTER_SUB  : \
+				  /*default*/  POS_AFTER_SUB    \
+				)
+#define MATRA_POS_TOP(u)	( /* BENG and MLYM don't have top matras. */ \
+				  IS_DEVA(u) ? POS_AFTER_SUB  : \
+				  IS_GURU(u) ? POS_AFTER_POST : /* Deviate from spec */ \
+				  IS_GUJR(u) ? POS_AFTER_SUB  : \
+				  IS_ORYA(u) ? POS_AFTER_MAIN : \
+				  IS_TAML(u) ? POS_AFTER_SUB  : \
+				  IS_TELU(u) ? POS_BEFORE_SUB : \
+				  IS_KNDA(u) ? POS_BEFORE_SUB : \
+				  IS_SINH(u) ? POS_AFTER_SUB  : \
+				  /*default*/  POS_AFTER_SUB    \
+				)
+#define MATRA_POS_BOTTOM(u)	( \
+				  IS_DEVA(u) ? POS_AFTER_SUB  : \
+				  IS_BENG(u) ? POS_AFTER_SUB  : \
+				  IS_GURU(u) ? POS_AFTER_POST : \
+				  IS_GUJR(u) ? POS_AFTER_POST : \
+				  IS_ORYA(u) ? POS_AFTER_SUB  : \
+				  IS_TAML(u) ? POS_AFTER_POST : \
+				  IS_TELU(u) ? POS_BEFORE_SUB : \
+				  IS_KNDA(u) ? POS_BEFORE_SUB : \
+				  IS_MLYM(u) ? POS_AFTER_POST : \
+				  IS_SINH(u) ? POS_AFTER_SUB  : \
+				  /*default*/  POS_AFTER_SUB    \
+				)
+
+static inline indic_position_t
+matra_position_indic (hb_codepoint_t u, indic_position_t side)
+{
+  switch ((int) side)
+  {
+    case POS_PRE_C:	return MATRA_POS_LEFT (u);
+    case POS_POST_C:	return MATRA_POS_RIGHT (u);
+    case POS_ABOVE_C:	return MATRA_POS_TOP (u);
+    case POS_BELOW_C:	return MATRA_POS_BOTTOM (u);
+  };
+  return side;
+}
+
+/* XXX
+ * This is a hack for now.  We should move this data into the main Indic table.
+ * Or completely remove it and just check in the tables.
+ */
+static const hb_codepoint_t ra_chars[] = {
+  0x0930u, /* Devanagari */
+  0x09B0u, /* Bengali */
+  0x09F0u, /* Bengali */
+  0x0A30u, /* Gurmukhi */	/* No Reph */
+  0x0AB0u, /* Gujarati */
+  0x0B30u, /* Oriya */
+  0x0BB0u, /* Tamil */		/* No Reph */
+  0x0C30u, /* Telugu */		/* Reph formed only with ZWJ */
+  0x0CB0u, /* Kannada */
+  0x0D30u, /* Malayalam */	/* No Reph, Logical Repha */
+
+  0x0DBBu, /* Sinhala */	/* Reph formed only with ZWJ */
+
+  0x179Au, /* Khmer */
+};
+
+static inline bool
+is_ra (hb_codepoint_t u)
+{
+  for (unsigned int i = 0; i < ARRAY_LENGTH (ra_chars); i++)
+    if (u == ra_chars[i])
+      return true;
+  return false;
+}
+
+static inline void
+set_indic_properties (hb_glyph_info_t &info)
+{
+  hb_codepoint_t u = info.codepoint;
+  unsigned int type = hb_indic_get_categories (u);
+  indic_category_t cat = (indic_category_t) (type & 0x7Fu);
+  indic_position_t pos = (indic_position_t) (type >> 8);
+
+
+  /*
+   * Re-assign category
+   */
+
+  /* The following act more like the Bindus. */
+  if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x0953u, 0x0954u)))
+    cat = OT_SM;
+  /* The following act like consonants. */
+  else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0x0A72u, 0x0A73u,
+				      0x1CF5u, 0x1CF6u)))
+    cat = OT_C;
+  /* TODO: The following should only be allowed after a Visarga.
+   * For now, just treat them like regular tone marks. */
+  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x1CE2u, 0x1CE8u)))
+    cat = OT_A;
+  /* TODO: The following should only be allowed after some of
+   * the nasalization marks, maybe only for U+1CE9..U+1CF1.
+   * For now, just treat them like tone marks. */
+  else if (unlikely (u == 0x1CEDu))
+    cat = OT_A;
+  /* The following take marks in standalone clusters, similar to Avagraha. */
+  else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0xA8F2u, 0xA8F7u,
+				      0x1CE9u, 0x1CECu,
+				      0x1CEEu, 0x1CF1u)))
+  {
+    cat = OT_Symbol;
+    static_assert (((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol), "");
+  }
+  else if (unlikely (u == 0x0A51u))
+  {
+    /* https://github.com/harfbuzz/harfbuzz/issues/524 */
+    cat = OT_M;
+    pos = POS_BELOW_C;
+  }
+
+  /* According to ScriptExtensions.txt, these Grantha marks may also be used in Tamil,
+   * so the Indic shaper needs to know their categories. */
+  else if (unlikely (u == 0x11301u || u == 0x11303u)) cat = OT_SM;
+  else if (unlikely (u == 0x1133cu)) cat = OT_N;
+
+  else if (unlikely (u == 0x0AFBu)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/552 */
+
+  else if (unlikely (u == 0x0980u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/issues/538 */
+  else if (unlikely (u == 0x0C80u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/pull/623 */
+  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u)))
+				    cat = OT_PLACEHOLDER;
+  else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
+
+
+  /*
+   * Re-assign position.
+   */
+
+  if ((FLAG_UNSAFE (cat) & CONSONANT_FLAGS))
+  {
+    pos = POS_BASE_C;
+    if (is_ra (u))
+      cat = OT_Ra;
+  }
+  else if (cat == OT_M)
+  {
+    pos = matra_position_indic (u, pos);
+  }
+  else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) /* | FLAG (OT_VD) */ | FLAG (OT_A) | FLAG (OT_Symbol))))
+  {
+    pos = POS_SMVD;
+  }
+
+  if (unlikely (u == 0x0B01u)) pos = POS_BEFORE_SUB; /* Oriya Bindu is BeforeSub in the spec. */
+
+
+
+  info.indic_category() = cat;
+  info.indic_position() = pos;
+}
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_INDIC_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-khmer-machine.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-khmer-machine.hh
new file mode 100644
index 0000000..2bc8ca6
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-khmer-machine.hh
@@ -0,0 +1,378 @@
+
+#line 1 "hb-ot-shape-complex-khmer-machine.rl"
+/*
+ * Copyright © 2011,2012  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_SHAPE_COMPLEX_KHMER_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
+
+#include "hb.hh"
+
+
+#line 36 "hb-ot-shape-complex-khmer-machine.hh"
+static const unsigned char _khmer_syllable_machine_trans_keys[] = {
+	5u, 26u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, 5u, 21u, 
+	5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 
+	5u, 26u, 5u, 21u, 5u, 26u, 5u, 21u, 5u, 26u, 1u, 16u, 1u, 29u, 5u, 29u, 
+	5u, 29u, 5u, 29u, 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 5u, 29u, 5u, 26u, 
+	5u, 29u, 5u, 29u, 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 29u, 
+	5u, 29u, 0
+};
+
+static const char _khmer_syllable_machine_key_spans[] = {
+	22, 17, 22, 17, 16, 17, 22, 17, 
+	22, 17, 16, 17, 22, 17, 16, 17, 
+	22, 17, 22, 17, 22, 16, 29, 25, 
+	25, 25, 1, 18, 25, 25, 25, 22, 
+	25, 25, 1, 18, 25, 25, 16, 25, 
+	25
+};
+
+static const short _khmer_syllable_machine_index_offsets[] = {
+	0, 23, 41, 64, 82, 99, 117, 140, 
+	158, 181, 199, 216, 234, 257, 275, 292, 
+	310, 333, 351, 374, 392, 415, 432, 462, 
+	488, 514, 540, 542, 561, 587, 613, 639, 
+	662, 688, 714, 716, 735, 761, 787, 804, 
+	830
+};
+
+static const char _khmer_syllable_machine_indicies[] = {
+	1, 1, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 2, 
+	3, 0, 0, 0, 0, 4, 0, 1, 
+	1, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 3, 
+	0, 1, 1, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 3, 0, 0, 0, 0, 4, 0, 
+	5, 5, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	4, 0, 6, 6, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 6, 0, 7, 7, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 8, 0, 9, 9, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 10, 0, 0, 
+	0, 0, 4, 0, 9, 9, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 10, 0, 11, 11, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 12, 0, 
+	0, 0, 0, 4, 0, 11, 11, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 12, 0, 13, 
+	13, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 13, 0, 
+	15, 15, 14, 14, 14, 14, 14, 14, 
+	14, 14, 14, 14, 14, 14, 14, 14, 
+	16, 14, 15, 15, 17, 17, 17, 17, 
+	17, 17, 17, 17, 17, 17, 17, 17, 
+	17, 17, 16, 17, 17, 17, 17, 18, 
+	17, 19, 19, 17, 17, 17, 17, 17, 
+	17, 17, 17, 17, 17, 17, 17, 17, 
+	17, 18, 17, 20, 20, 17, 17, 17, 
+	17, 17, 17, 17, 17, 17, 17, 17, 
+	17, 17, 20, 17, 21, 21, 17, 17, 
+	17, 17, 17, 17, 17, 17, 17, 17, 
+	17, 17, 17, 17, 22, 17, 23, 23, 
+	17, 17, 17, 17, 17, 17, 17, 17, 
+	17, 17, 17, 17, 17, 17, 24, 17, 
+	17, 17, 17, 18, 17, 23, 23, 17, 
+	17, 17, 17, 17, 17, 17, 17, 17, 
+	17, 17, 17, 17, 17, 24, 17, 25, 
+	25, 17, 17, 17, 17, 17, 17, 17, 
+	17, 17, 17, 17, 17, 17, 17, 26, 
+	17, 17, 17, 17, 18, 17, 25, 25, 
+	17, 17, 17, 17, 17, 17, 17, 17, 
+	17, 17, 17, 17, 17, 17, 26, 17, 
+	15, 15, 17, 17, 17, 17, 17, 17, 
+	17, 17, 17, 17, 17, 17, 17, 27, 
+	16, 17, 17, 17, 17, 18, 17, 28, 
+	28, 17, 17, 17, 17, 17, 17, 17, 
+	17, 17, 17, 17, 17, 17, 28, 17, 
+	13, 13, 29, 29, 30, 30, 29, 29, 
+	29, 29, 2, 2, 29, 31, 29, 13, 
+	29, 29, 29, 29, 16, 20, 29, 29, 
+	29, 18, 24, 26, 22, 29, 33, 33, 
+	32, 32, 32, 32, 32, 32, 32, 34, 
+	32, 32, 32, 32, 32, 2, 3, 6, 
+	32, 32, 32, 4, 10, 12, 8, 32, 
+	35, 35, 32, 32, 32, 32, 32, 32, 
+	32, 36, 32, 32, 32, 32, 32, 32, 
+	3, 6, 32, 32, 32, 4, 10, 12, 
+	8, 32, 5, 5, 32, 32, 32, 32, 
+	32, 32, 32, 36, 32, 32, 32, 32, 
+	32, 32, 4, 6, 32, 32, 32, 32, 
+	32, 32, 8, 32, 6, 32, 7, 7, 
+	32, 32, 32, 32, 32, 32, 32, 36, 
+	32, 32, 32, 32, 32, 32, 8, 6, 
+	32, 37, 37, 32, 32, 32, 32, 32, 
+	32, 32, 36, 32, 32, 32, 32, 32, 
+	32, 10, 6, 32, 32, 32, 4, 32, 
+	32, 8, 32, 38, 38, 32, 32, 32, 
+	32, 32, 32, 32, 36, 32, 32, 32, 
+	32, 32, 32, 12, 6, 32, 32, 32, 
+	4, 10, 32, 8, 32, 35, 35, 32, 
+	32, 32, 32, 32, 32, 32, 34, 32, 
+	32, 32, 32, 32, 32, 3, 6, 32, 
+	32, 32, 4, 10, 12, 8, 32, 15, 
+	15, 39, 39, 39, 39, 39, 39, 39, 
+	39, 39, 39, 39, 39, 39, 39, 16, 
+	39, 39, 39, 39, 18, 39, 41, 41, 
+	40, 40, 40, 40, 40, 40, 40, 42, 
+	40, 40, 40, 40, 40, 40, 16, 20, 
+	40, 40, 40, 18, 24, 26, 22, 40, 
+	19, 19, 40, 40, 40, 40, 40, 40, 
+	40, 42, 40, 40, 40, 40, 40, 40, 
+	18, 20, 40, 40, 40, 40, 40, 40, 
+	22, 40, 20, 40, 21, 21, 40, 40, 
+	40, 40, 40, 40, 40, 42, 40, 40, 
+	40, 40, 40, 40, 22, 20, 40, 43, 
+	43, 40, 40, 40, 40, 40, 40, 40, 
+	42, 40, 40, 40, 40, 40, 40, 24, 
+	20, 40, 40, 40, 18, 40, 40, 22, 
+	40, 44, 44, 40, 40, 40, 40, 40, 
+	40, 40, 42, 40, 40, 40, 40, 40, 
+	40, 26, 20, 40, 40, 40, 18, 24, 
+	40, 22, 40, 28, 28, 39, 39, 39, 
+	39, 39, 39, 39, 39, 39, 39, 39, 
+	39, 39, 28, 39, 45, 45, 40, 40, 
+	40, 40, 40, 40, 40, 46, 40, 40, 
+	40, 40, 40, 27, 16, 20, 40, 40, 
+	40, 18, 24, 26, 22, 40, 41, 41, 
+	40, 40, 40, 40, 40, 40, 40, 46, 
+	40, 40, 40, 40, 40, 40, 16, 20, 
+	40, 40, 40, 18, 24, 26, 22, 40, 
+	0
+};
+
+static const char _khmer_syllable_machine_trans_targs[] = {
+	22, 1, 30, 24, 25, 3, 26, 5, 
+	27, 7, 28, 9, 29, 23, 22, 11, 
+	32, 22, 33, 13, 34, 15, 35, 17, 
+	36, 19, 37, 40, 39, 22, 31, 38, 
+	22, 0, 10, 2, 4, 6, 8, 22, 
+	22, 12, 14, 16, 18, 20, 21
+};
+
+static const char _khmer_syllable_machine_trans_actions[] = {
+	1, 0, 2, 2, 2, 0, 0, 0, 
+	2, 0, 2, 0, 2, 2, 3, 0, 
+	4, 5, 2, 0, 0, 0, 2, 0, 
+	2, 0, 2, 4, 4, 8, 9, 0, 
+	10, 0, 0, 0, 0, 0, 0, 11, 
+	12, 0, 0, 0, 0, 0, 0
+};
+
+static const char _khmer_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, 6, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0
+};
+
+static const char _khmer_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, 7, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0
+};
+
+static const unsigned char _khmer_syllable_machine_eof_trans[] = {
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 15, 18, 18, 18, 18, 
+	18, 18, 18, 18, 18, 18, 0, 33, 
+	33, 33, 33, 33, 33, 33, 33, 40, 
+	41, 41, 41, 41, 41, 41, 40, 41, 
+	41
+};
+
+static const int khmer_syllable_machine_start = 22;
+static const int khmer_syllable_machine_first_final = 22;
+static const int khmer_syllable_machine_error = -1;
+
+static const int khmer_syllable_machine_en_main = 22;
+
+
+#line 36 "hb-ot-shape-complex-khmer-machine.rl"
+
+
+
+#line 80 "hb-ot-shape-complex-khmer-machine.rl"
+
+
+#define found_syllable(syllable_type) \
+  HB_STMT_START { \
+    if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+    for (unsigned int i = ts; i < te; i++) \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
+    syllable_serial++; \
+    if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+  } HB_STMT_END
+
+static void
+find_syllables (hb_buffer_t *buffer)
+{
+  unsigned int p, pe, eof, ts, te, act HB_UNUSED;
+  int cs;
+  hb_glyph_info_t *info = buffer->info;
+  
+#line 250 "hb-ot-shape-complex-khmer-machine.hh"
+	{
+	cs = khmer_syllable_machine_start;
+	ts = 0;
+	te = 0;
+	act = 0;
+	}
+
+#line 100 "hb-ot-shape-complex-khmer-machine.rl"
+
+
+  p = 0;
+  pe = eof = buffer->len;
+
+  unsigned int syllable_serial = 1;
+  
+#line 266 "hb-ot-shape-complex-khmer-machine.hh"
+	{
+	int _slen;
+	int _trans;
+	const unsigned char *_keys;
+	const char *_inds;
+	if ( p == pe )
+		goto _test_eof;
+_resume:
+	switch ( _khmer_syllable_machine_from_state_actions[cs] ) {
+	case 7:
+#line 1 "NONE"
+	{ts = p;}
+	break;
+#line 280 "hb-ot-shape-complex-khmer-machine.hh"
+	}
+
+	_keys = _khmer_syllable_machine_trans_keys + (cs<<1);
+	_inds = _khmer_syllable_machine_indicies + _khmer_syllable_machine_index_offsets[cs];
+
+	_slen = _khmer_syllable_machine_key_spans[cs];
+	_trans = _inds[ _slen > 0 && _keys[0] <=( info[p].khmer_category()) &&
+		( info[p].khmer_category()) <= _keys[1] ?
+		( info[p].khmer_category()) - _keys[0] : _slen ];
+
+_eof_trans:
+	cs = _khmer_syllable_machine_trans_targs[_trans];
+
+	if ( _khmer_syllable_machine_trans_actions[_trans] == 0 )
+		goto _again;
+
+	switch ( _khmer_syllable_machine_trans_actions[_trans] ) {
+	case 2:
+#line 1 "NONE"
+	{te = p+1;}
+	break;
+	case 8:
+#line 76 "hb-ot-shape-complex-khmer-machine.rl"
+	{te = p+1;{ found_syllable (non_khmer_cluster); }}
+	break;
+	case 10:
+#line 74 "hb-ot-shape-complex-khmer-machine.rl"
+	{te = p;p--;{ found_syllable (consonant_syllable); }}
+	break;
+	case 12:
+#line 75 "hb-ot-shape-complex-khmer-machine.rl"
+	{te = p;p--;{ found_syllable (broken_cluster); }}
+	break;
+	case 11:
+#line 76 "hb-ot-shape-complex-khmer-machine.rl"
+	{te = p;p--;{ found_syllable (non_khmer_cluster); }}
+	break;
+	case 1:
+#line 74 "hb-ot-shape-complex-khmer-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
+	break;
+	case 5:
+#line 75 "hb-ot-shape-complex-khmer-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
+	break;
+	case 3:
+#line 1 "NONE"
+	{	switch( act ) {
+	case 2:
+	{{p = ((te))-1;} found_syllable (broken_cluster); }
+	break;
+	case 3:
+	{{p = ((te))-1;} found_syllable (non_khmer_cluster); }
+	break;
+	}
+	}
+	break;
+	case 4:
+#line 1 "NONE"
+	{te = p+1;}
+#line 75 "hb-ot-shape-complex-khmer-machine.rl"
+	{act = 2;}
+	break;
+	case 9:
+#line 1 "NONE"
+	{te = p+1;}
+#line 76 "hb-ot-shape-complex-khmer-machine.rl"
+	{act = 3;}
+	break;
+#line 350 "hb-ot-shape-complex-khmer-machine.hh"
+	}
+
+_again:
+	switch ( _khmer_syllable_machine_to_state_actions[cs] ) {
+	case 6:
+#line 1 "NONE"
+	{ts = 0;}
+	break;
+#line 359 "hb-ot-shape-complex-khmer-machine.hh"
+	}
+
+	if ( ++p != pe )
+		goto _resume;
+	_test_eof: {}
+	if ( p == eof )
+	{
+	if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) {
+		_trans = _khmer_syllable_machine_eof_trans[cs] - 1;
+		goto _eof_trans;
+	}
+	}
+
+	}
+
+#line 108 "hb-ot-shape-complex-khmer-machine.rl"
+
+}
+
+#endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-khmer-machine.rl b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-khmer-machine.rl
new file mode 100644
index 0000000..4c596ab
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-khmer-machine.rl
@@ -0,0 +1,111 @@
+/*
+ * Copyright © 2011,2012  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_SHAPE_COMPLEX_KHMER_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
+
+#include "hb.hh"
+
+%%{
+  machine khmer_syllable_machine;
+  alphtype unsigned char;
+  write data;
+}%%
+
+%%{
+
+# Same order as enum khmer_category_t.  Not sure how to avoid duplication.
+C    = 1;
+V    = 2;
+ZWNJ = 5;
+ZWJ  = 6;
+PLACEHOLDER = 11;
+DOTTEDCIRCLE = 12;
+Coeng= 14;
+Ra   = 16;
+Robatic = 20;
+Xgroup  = 21;
+Ygroup  = 22;
+VAbv = 26;
+VBlw = 27;
+VPre = 28;
+VPst = 29;
+
+c = (C | Ra | V);
+cn = c.((ZWJ|ZWNJ)?.Robatic)?;
+joiner = (ZWJ | ZWNJ);
+xgroup = (joiner*.Xgroup)*;
+ygroup = Ygroup*;
+
+# This grammar was experimentally extracted from what Uniscribe allows.
+
+matra_group = VPre? xgroup VBlw? xgroup (joiner?.VAbv)? xgroup VPst?;
+syllable_tail = xgroup matra_group xgroup (Coeng.c)? ygroup;
+
+
+broken_cluster =	(Coeng.cn)* syllable_tail;
+consonant_syllable =	(cn|PLACEHOLDER|DOTTEDCIRCLE) broken_cluster;
+other =			any;
+
+main := |*
+	consonant_syllable	=> { found_syllable (consonant_syllable); };
+	broken_cluster		=> { found_syllable (broken_cluster); };
+	other			=> { found_syllable (non_khmer_cluster); };
+*|;
+
+
+}%%
+
+#define found_syllable(syllable_type) \
+  HB_STMT_START { \
+    if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+    for (unsigned int i = ts; i < te; i++) \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
+    syllable_serial++; \
+    if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+  } HB_STMT_END
+
+static void
+find_syllables (hb_buffer_t *buffer)
+{
+  unsigned int p, pe, eof, ts, te, act HB_UNUSED;
+  int cs;
+  hb_glyph_info_t *info = buffer->info;
+  %%{
+    write init;
+    getkey info[p].khmer_category();
+  }%%
+
+  p = 0;
+  pe = eof = buffer->len;
+
+  unsigned int syllable_serial = 1;
+  %%{
+    write exec;
+  }%%
+}
+
+#endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-khmer.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-khmer.cc
new file mode 100644
index 0000000..4475ceb
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-khmer.cc
@@ -0,0 +1,501 @@
+/*
+ * Copyright © 2011,2012  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
+ */
+
+#include "hb-ot-shape-complex-khmer.hh"
+#include "hb-ot-layout.hh"
+
+
+/*
+ * Khmer shaper.
+ */
+
+static const hb_ot_map_feature_t
+khmer_features[] =
+{
+  /*
+   * Basic features.
+   * These features are applied in order, one at a time, after reordering.
+   */
+  {HB_TAG('p','r','e','f'), F_MANUAL_JOINERS},
+  {HB_TAG('b','l','w','f'), F_MANUAL_JOINERS},
+  {HB_TAG('a','b','v','f'), F_MANUAL_JOINERS},
+  {HB_TAG('p','s','t','f'), F_MANUAL_JOINERS},
+  {HB_TAG('c','f','a','r'), F_MANUAL_JOINERS},
+  /*
+   * Other features.
+   * These features are applied all at once after clearing syllables.
+   */
+  {HB_TAG('p','r','e','s'), F_GLOBAL_MANUAL_JOINERS},
+  {HB_TAG('a','b','v','s'), F_GLOBAL_MANUAL_JOINERS},
+  {HB_TAG('b','l','w','s'), F_GLOBAL_MANUAL_JOINERS},
+  {HB_TAG('p','s','t','s'), F_GLOBAL_MANUAL_JOINERS},
+  /*
+   * Positioning features.
+   * We don't care about the types.
+   */
+  {HB_TAG('d','i','s','t'), F_GLOBAL},
+  {HB_TAG('a','b','v','m'), F_GLOBAL},
+  {HB_TAG('b','l','w','m'), F_GLOBAL},
+};
+
+/*
+ * Must be in the same order as the khmer_features array.
+ */
+enum {
+  PREF,
+  BLWF,
+  ABVF,
+  PSTF,
+  CFAR,
+
+  _PRES,
+  _ABVS,
+  _BLWS,
+  _PSTS,
+
+  _DIST,
+  _ABVM,
+  _BLWM,
+
+  KHMER_NUM_FEATURES,
+  KHMER_BASIC_FEATURES = _PRES, /* Don't forget to update this! */
+};
+
+static void
+setup_syllables (const hb_ot_shape_plan_t *plan,
+		 hb_font_t *font,
+		 hb_buffer_t *buffer);
+static void
+reorder (const hb_ot_shape_plan_t *plan,
+	 hb_font_t *font,
+	 hb_buffer_t *buffer);
+static void
+clear_syllables (const hb_ot_shape_plan_t *plan,
+		 hb_font_t *font,
+		 hb_buffer_t *buffer);
+
+static void
+collect_features_khmer (hb_ot_shape_planner_t *plan)
+{
+  hb_ot_map_builder_t *map = &plan->map;
+
+  /* Do this before any lookups have been applied. */
+  map->add_gsub_pause (setup_syllables);
+  map->add_gsub_pause (reorder);
+
+  /* Testing suggests that Uniscribe does NOT pause between basic
+   * features.  Test with KhmerUI.ttf and the following three
+   * sequences:
+   *
+   *   U+1789,U+17BC
+   *   U+1789,U+17D2,U+1789
+   *   U+1789,U+17D2,U+1789,U+17BC
+   *
+   * https://github.com/harfbuzz/harfbuzz/issues/974
+   */
+  map->enable_feature (HB_TAG('l','o','c','l'));
+  map->enable_feature (HB_TAG('c','c','m','p'));
+
+  unsigned int i = 0;
+  for (; i < KHMER_BASIC_FEATURES; i++)
+    map->add_feature (khmer_features[i]);
+
+  map->add_gsub_pause (clear_syllables);
+
+  for (; i < KHMER_NUM_FEATURES; i++)
+    map->add_feature (khmer_features[i]);
+}
+
+static void
+override_features_khmer (hb_ot_shape_planner_t *plan)
+{
+  hb_ot_map_builder_t *map = &plan->map;
+
+  /* Khmer spec has 'clig' as part of required shaping features:
+   * "Apply feature 'clig' to form ligatures that are desired for
+   * typographical correctness.", hence in overrides... */
+  map->enable_feature (HB_TAG('c','l','i','g'));
+
+  /* Uniscribe does not apply 'kern' in Khmer. */
+  if (hb_options ().uniscribe_bug_compatible)
+  {
+    map->disable_feature (HB_TAG('k','e','r','n'));
+  }
+
+  map->disable_feature (HB_TAG('l','i','g','a'));
+}
+
+
+struct would_substitute_feature_t
+{
+  void init (const hb_ot_map_t *map, hb_tag_t feature_tag, bool zero_context_)
+  {
+    zero_context = zero_context_;
+    map->get_stage_lookups (0/*GSUB*/,
+			    map->get_feature_stage (0/*GSUB*/, feature_tag),
+			    &lookups, &count);
+  }
+
+  bool would_substitute (const hb_codepoint_t *glyphs,
+			 unsigned int          glyphs_count,
+			 hb_face_t            *face) const
+  {
+    for (unsigned int i = 0; i < count; i++)
+      if (hb_ot_layout_lookup_would_substitute_fast (face, lookups[i].index, glyphs, glyphs_count, zero_context))
+	return true;
+    return false;
+  }
+
+  private:
+  const hb_ot_map_t::lookup_map_t *lookups;
+  unsigned int count;
+  bool zero_context;
+};
+
+struct khmer_shape_plan_t
+{
+  bool get_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const
+  {
+    hb_codepoint_t glyph = virama_glyph;
+    if (unlikely (virama_glyph == (hb_codepoint_t) -1))
+    {
+      if (!font->get_nominal_glyph (0x17D2u, &glyph))
+	glyph = 0;
+      /* Technically speaking, the spec says we should apply 'locl' to virama too.
+       * Maybe one day... */
+
+      /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph
+       * during shape planning...  Instead, overwrite it here.  It's safe.  Don't worry! */
+      virama_glyph = glyph;
+    }
+
+    *pglyph = glyph;
+    return glyph != 0;
+  }
+
+  mutable hb_codepoint_t virama_glyph;
+
+  would_substitute_feature_t pref;
+
+  hb_mask_t mask_array[KHMER_NUM_FEATURES];
+};
+
+static void *
+data_create_khmer (const hb_ot_shape_plan_t *plan)
+{
+  khmer_shape_plan_t *khmer_plan = (khmer_shape_plan_t *) calloc (1, sizeof (khmer_shape_plan_t));
+  if (unlikely (!khmer_plan))
+    return nullptr;
+
+  khmer_plan->virama_glyph = (hb_codepoint_t) -1;
+
+  khmer_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), true);
+
+  for (unsigned int i = 0; i < ARRAY_LENGTH (khmer_plan->mask_array); i++)
+    khmer_plan->mask_array[i] = (khmer_features[i].flags & F_GLOBAL) ?
+				 0 : plan->map.get_1_mask (khmer_features[i].tag);
+
+  return khmer_plan;
+}
+
+static void
+data_destroy_khmer (void *data)
+{
+  free (data);
+}
+
+
+enum syllable_type_t {
+  consonant_syllable,
+  broken_cluster,
+  non_khmer_cluster,
+};
+
+#include "hb-ot-shape-complex-khmer-machine.hh"
+
+static void
+setup_masks_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		   hb_buffer_t              *buffer,
+		   hb_font_t                *font HB_UNUSED)
+{
+  HB_BUFFER_ALLOCATE_VAR (buffer, khmer_category);
+
+  /* We cannot setup masks here.  We save information about characters
+   * and setup masks later on in a pause-callback. */
+
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    set_khmer_properties (info[i]);
+}
+
+static void
+setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		 hb_font_t *font HB_UNUSED,
+		 hb_buffer_t *buffer)
+{
+  find_syllables (buffer);
+  foreach_syllable (buffer, start, end)
+    buffer->unsafe_to_break (start, end);
+}
+
+
+/* Rules from:
+ * https://docs.microsoft.com/en-us/typography/script-development/devanagari */
+
+static void
+reorder_consonant_syllable (const hb_ot_shape_plan_t *plan,
+			    hb_face_t *face HB_UNUSED,
+			    hb_buffer_t *buffer,
+			    unsigned int start, unsigned int end)
+{
+  const khmer_shape_plan_t *khmer_plan = (const khmer_shape_plan_t *) plan->data;
+  hb_glyph_info_t *info = buffer->info;
+
+  /* Setup masks. */
+  {
+    /* Post-base */
+    hb_mask_t mask = khmer_plan->mask_array[BLWF] | khmer_plan->mask_array[ABVF] | khmer_plan->mask_array[PSTF];
+    for (unsigned int i = start + 1; i < end; i++)
+      info[i].mask  |= mask;
+  }
+
+  unsigned int num_coengs = 0;
+  for (unsigned int i = start + 1; i < end; i++)
+  {
+    /* """
+     * When a COENG + (Cons | IndV) combination are found (and subscript count
+     * is less than two) the character combination is handled according to the
+     * subscript type of the character following the COENG.
+     *
+     * ...
+     *
+     * Subscript Type 2 - The COENG + RO characters are reordered to immediately
+     * before the base glyph. Then the COENG + RO characters are assigned to have
+     * the 'pref' OpenType feature applied to them.
+     * """
+     */
+    if (info[i].khmer_category() == OT_Coeng && num_coengs <= 2 && i + 1 < end)
+    {
+      num_coengs++;
+
+      if (info[i + 1].khmer_category() == OT_Ra)
+      {
+	for (unsigned int j = 0; j < 2; j++)
+	  info[i + j].mask |= khmer_plan->mask_array[PREF];
+
+	/* Move the Coeng,Ro sequence to the start. */
+	buffer->merge_clusters (start, i + 2);
+	hb_glyph_info_t t0 = info[i];
+	hb_glyph_info_t t1 = info[i + 1];
+	memmove (&info[start + 2], &info[start], (i - start) * sizeof (info[0]));
+	info[start] = t0;
+	info[start + 1] = t1;
+
+	/* Mark the subsequent stuff with 'cfar'.  Used in Khmer.
+	 * Read the feature spec.
+	 * This allows distinguishing the following cases with MS Khmer fonts:
+	 * U+1784,U+17D2,U+179A,U+17D2,U+1782
+	 * U+1784,U+17D2,U+1782,U+17D2,U+179A
+	 */
+	if (khmer_plan->mask_array[CFAR])
+	  for (unsigned int j = i + 2; j < end; j++)
+	    info[j].mask |= khmer_plan->mask_array[CFAR];
+
+	num_coengs = 2; /* Done. */
+      }
+    }
+
+    /* Reorder left matra piece. */
+    else if (info[i].khmer_category() == OT_VPre)
+    {
+      /* Move to the start. */
+      buffer->merge_clusters (start, i + 1);
+      hb_glyph_info_t t = info[i];
+      memmove (&info[start + 1], &info[start], (i - start) * sizeof (info[0]));
+      info[start] = t;
+    }
+  }
+}
+
+static void
+initial_reordering_syllable (const hb_ot_shape_plan_t *plan,
+			     hb_face_t *face,
+			     hb_buffer_t *buffer,
+			     unsigned int start, unsigned int end)
+{
+  syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F);
+  switch (syllable_type)
+  {
+    case broken_cluster: /* We already inserted dotted-circles, so just call the consonant_syllable. */
+    case consonant_syllable:
+     reorder_consonant_syllable (plan, face, buffer, start, end);
+     break;
+
+    case non_khmer_cluster:
+      break;
+  }
+}
+
+static inline void
+insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		       hb_font_t *font,
+		       hb_buffer_t *buffer)
+{
+  /* Note: This loop is extra overhead, but should not be measurable. */
+  bool has_broken_syllables = false;
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    if ((info[i].syllable() & 0x0F) == broken_cluster)
+    {
+      has_broken_syllables = true;
+      break;
+    }
+  if (likely (!has_broken_syllables))
+    return;
+
+
+  hb_codepoint_t dottedcircle_glyph;
+  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
+    return;
+
+  hb_glyph_info_t dottedcircle = {0};
+  dottedcircle.codepoint = 0x25CCu;
+  set_khmer_properties (dottedcircle);
+  dottedcircle.codepoint = dottedcircle_glyph;
+
+  buffer->clear_output ();
+
+  buffer->idx = 0;
+  unsigned int last_syllable = 0;
+  while (buffer->idx < buffer->len && buffer->successful)
+  {
+    unsigned int syllable = buffer->cur().syllable();
+    syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
+    if (unlikely (last_syllable != syllable && syllable_type == broken_cluster))
+    {
+      last_syllable = syllable;
+
+      hb_glyph_info_t ginfo = dottedcircle;
+      ginfo.cluster = buffer->cur().cluster;
+      ginfo.mask = buffer->cur().mask;
+      ginfo.syllable() = buffer->cur().syllable();
+      /* TODO Set glyph_props? */
+
+      /* Insert dottedcircle after possible Repha. */
+      while (buffer->idx < buffer->len && buffer->successful &&
+	     last_syllable == buffer->cur().syllable() &&
+	     buffer->cur().khmer_category() == OT_Repha)
+        buffer->next_glyph ();
+
+      buffer->output_info (ginfo);
+    }
+    else
+      buffer->next_glyph ();
+  }
+  buffer->swap_buffers ();
+}
+
+static void
+reorder (const hb_ot_shape_plan_t *plan,
+	 hb_font_t *font,
+	 hb_buffer_t *buffer)
+{
+  insert_dotted_circles (plan, font, buffer);
+
+  foreach_syllable (buffer, start, end)
+    initial_reordering_syllable (plan, font->face, buffer, start, end);
+
+  HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_category);
+}
+
+static void
+clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		 hb_font_t *font HB_UNUSED,
+		 hb_buffer_t *buffer)
+{
+  hb_glyph_info_t *info = buffer->info;
+  unsigned int count = buffer->len;
+  for (unsigned int i = 0; i < count; i++)
+    info[i].syllable() = 0;
+}
+
+
+static bool
+decompose_khmer (const hb_ot_shape_normalize_context_t *c,
+		 hb_codepoint_t  ab,
+		 hb_codepoint_t *a,
+		 hb_codepoint_t *b)
+{
+  switch (ab)
+  {
+    /*
+     * Decompose split matras that don't have Unicode decompositions.
+     */
+
+    /* Khmer */
+    case 0x17BEu  : *a = 0x17C1u; *b= 0x17BEu; return true;
+    case 0x17BFu  : *a = 0x17C1u; *b= 0x17BFu; return true;
+    case 0x17C0u  : *a = 0x17C1u; *b= 0x17C0u; return true;
+    case 0x17C4u  : *a = 0x17C1u; *b= 0x17C4u; return true;
+    case 0x17C5u  : *a = 0x17C1u; *b= 0x17C5u; return true;
+  }
+
+  return (bool) c->unicode->decompose (ab, a, b);
+}
+
+static bool
+compose_khmer (const hb_ot_shape_normalize_context_t *c,
+	       hb_codepoint_t  a,
+	       hb_codepoint_t  b,
+	       hb_codepoint_t *ab)
+{
+  /* Avoid recomposing split matras. */
+  if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (c->unicode->general_category (a)))
+    return false;
+
+  return (bool) c->unicode->compose (a, b, ab);
+}
+
+
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_khmer =
+{
+  collect_features_khmer,
+  override_features_khmer,
+  data_create_khmer,
+  data_destroy_khmer,
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
+  HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
+  decompose_khmer,
+  compose_khmer,
+  setup_masks_khmer,
+  HB_TAG_NONE, /* gpos_tag */
+  nullptr, /* reorder_marks */
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
+  false, /* fallback_position */
+};
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-khmer.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-khmer.hh
new file mode 100644
index 0000000..6222945
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-khmer.hh
@@ -0,0 +1,114 @@
+/*
+ * Copyright © 2018  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_SHAPE_COMPLEX_KHMER_HH
+#define HB_OT_SHAPE_COMPLEX_KHMER_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex-indic.hh"
+
+
+/* buffer var allocations */
+#define khmer_category() indic_category() /* khmer_category_t */
+
+
+/* Note: This enum is duplicated in the -machine.rl source file.
+ * Not sure how to avoid duplication. */
+enum khmer_category_t
+{
+  OT_Robatic = 20,
+  OT_Xgroup  = 21,
+  OT_Ygroup  = 22,
+
+  OT_VAbv    = 26,
+  OT_VBlw    = 27,
+  OT_VPre    = 28,
+  OT_VPst    = 29,
+};
+
+static inline void
+set_khmer_properties (hb_glyph_info_t &info)
+{
+  hb_codepoint_t u = info.codepoint;
+  unsigned int type = hb_indic_get_categories (u);
+  khmer_category_t cat = (khmer_category_t) (type & 0x7Fu);
+  indic_position_t pos = (indic_position_t) (type >> 8);
+
+
+  /*
+   * Re-assign category
+   *
+   * These categories are experimentally extracted from what Uniscribe allows.
+   */
+  switch (u)
+  {
+    case 0x179Au:
+      cat = (khmer_category_t) OT_Ra;
+      break;
+
+    case 0x17CCu:
+    case 0x17C9u:
+    case 0x17CAu:
+      cat = OT_Robatic;
+      break;
+
+    case 0x17C6u:
+    case 0x17CBu:
+    case 0x17CDu:
+    case 0x17CEu:
+    case 0x17CFu:
+    case 0x17D0u:
+    case 0x17D1u:
+      cat = OT_Xgroup;
+      break;
+
+    case 0x17C7u:
+    case 0x17C8u:
+    case 0x17DDu:
+    case 0x17D3u: /* Just guessing. Uniscribe doesn't categorize it. */
+      cat = OT_Ygroup;
+      break;
+  }
+
+  /*
+   * Re-assign position.
+   */
+  if (cat == (khmer_category_t) OT_M)
+    switch ((int) pos)
+    {
+      case POS_PRE_C:	cat = OT_VPre; break;
+      case POS_BELOW_C:	cat = OT_VBlw; break;
+      case POS_ABOVE_C:	cat = OT_VAbv; break;
+      case POS_POST_C:	cat = OT_VPst; break;
+      default: assert (0);
+    };
+
+  info.khmer_category() = cat;
+}
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_KHMER_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-myanmar-machine.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-myanmar-machine.hh
new file mode 100644
index 0000000..0c19e4f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-myanmar-machine.hh
@@ -0,0 +1,411 @@
+
+#line 1 "hb-ot-shape-complex-myanmar-machine.rl"
+/*
+ * Copyright © 2011,2012  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_SHAPE_COMPLEX_MYANMAR_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH
+
+#include "hb.hh"
+
+
+#line 36 "hb-ot-shape-complex-myanmar-machine.hh"
+static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
+	1u, 32u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 
+	3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, 
+	3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 5u, 29u, 
+	5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, 
+	3u, 29u, 3u, 30u, 3u, 29u, 1u, 32u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 
+	3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 32u, 8u, 8u, 
+	0
+};
+
+static const char _myanmar_syllable_machine_key_spans[] = {
+	32, 28, 25, 4, 25, 23, 21, 21, 
+	27, 27, 27, 27, 16, 27, 27, 27, 
+	27, 27, 28, 27, 27, 27, 27, 25, 
+	4, 25, 23, 21, 21, 27, 27, 27, 
+	27, 28, 27, 32, 27, 27, 27, 27, 
+	27, 28, 27, 27, 27, 27, 32, 1
+};
+
+static const short _myanmar_syllable_machine_index_offsets[] = {
+	0, 33, 62, 88, 93, 119, 143, 165, 
+	187, 215, 243, 271, 299, 316, 344, 372, 
+	400, 428, 456, 485, 513, 541, 569, 597, 
+	623, 628, 654, 678, 700, 722, 750, 778, 
+	806, 834, 863, 891, 924, 952, 980, 1008, 
+	1036, 1064, 1093, 1121, 1149, 1177, 1205, 1238
+};
+
+static const char _myanmar_syllable_machine_indicies[] = {
+	1, 1, 2, 3, 4, 4, 0, 5, 
+	0, 6, 1, 0, 0, 0, 0, 7, 
+	0, 8, 9, 0, 10, 11, 12, 13, 
+	14, 15, 16, 17, 18, 19, 20, 1, 
+	0, 22, 23, 24, 24, 21, 25, 21, 
+	26, 21, 21, 21, 21, 21, 21, 21, 
+	27, 21, 21, 28, 29, 30, 31, 32, 
+	33, 34, 35, 36, 37, 21, 24, 24, 
+	21, 25, 21, 21, 21, 21, 21, 21, 
+	21, 21, 21, 38, 21, 21, 21, 21, 
+	21, 21, 32, 21, 21, 21, 36, 21, 
+	24, 24, 21, 25, 21, 24, 24, 21, 
+	25, 21, 21, 21, 21, 21, 21, 21, 
+	21, 21, 21, 21, 21, 21, 21, 21, 
+	21, 32, 21, 21, 21, 36, 21, 39, 
+	21, 24, 24, 21, 25, 21, 32, 21, 
+	21, 21, 21, 21, 21, 21, 40, 21, 
+	21, 21, 21, 21, 21, 32, 21, 24, 
+	24, 21, 25, 21, 21, 21, 21, 21, 
+	21, 21, 21, 21, 40, 21, 21, 21, 
+	21, 21, 21, 32, 21, 24, 24, 21, 
+	25, 21, 21, 21, 21, 21, 21, 21, 
+	21, 21, 21, 21, 21, 21, 21, 21, 
+	21, 32, 21, 22, 21, 24, 24, 21, 
+	25, 21, 26, 21, 21, 21, 21, 21, 
+	21, 21, 41, 21, 21, 41, 21, 21, 
+	21, 32, 42, 21, 21, 36, 21, 22, 
+	21, 24, 24, 21, 25, 21, 26, 21, 
+	21, 21, 21, 21, 21, 21, 21, 21, 
+	21, 21, 21, 21, 21, 32, 21, 21, 
+	21, 36, 21, 22, 21, 24, 24, 21, 
+	25, 21, 26, 21, 21, 21, 21, 21, 
+	21, 21, 41, 21, 21, 21, 21, 21, 
+	21, 32, 42, 21, 21, 36, 21, 22, 
+	21, 24, 24, 21, 25, 21, 26, 21, 
+	21, 21, 21, 21, 21, 21, 21, 21, 
+	21, 21, 21, 21, 21, 32, 42, 21, 
+	21, 36, 21, 1, 1, 21, 21, 21, 
+	21, 21, 21, 21, 21, 21, 21, 21, 
+	21, 21, 1, 21, 22, 21, 24, 24, 
+	21, 25, 21, 26, 21, 21, 21, 21, 
+	21, 21, 21, 27, 21, 21, 28, 29, 
+	30, 31, 32, 33, 34, 35, 36, 21, 
+	22, 21, 24, 24, 21, 25, 21, 26, 
+	21, 21, 21, 21, 21, 21, 21, 43, 
+	21, 21, 21, 21, 21, 21, 32, 33, 
+	34, 35, 36, 21, 22, 21, 24, 24, 
+	21, 25, 21, 26, 21, 21, 21, 21, 
+	21, 21, 21, 21, 21, 21, 21, 21, 
+	21, 21, 32, 33, 34, 35, 36, 21, 
+	22, 21, 24, 24, 21, 25, 21, 26, 
+	21, 21, 21, 21, 21, 21, 21, 21, 
+	21, 21, 21, 21, 21, 21, 32, 33, 
+	34, 21, 36, 21, 22, 21, 24, 24, 
+	21, 25, 21, 26, 21, 21, 21, 21, 
+	21, 21, 21, 21, 21, 21, 21, 21, 
+	21, 21, 32, 21, 34, 21, 36, 21, 
+	22, 21, 24, 24, 21, 25, 21, 26, 
+	21, 21, 21, 21, 21, 21, 21, 21, 
+	21, 21, 21, 21, 21, 21, 32, 33, 
+	34, 35, 36, 43, 21, 22, 21, 24, 
+	24, 21, 25, 21, 26, 21, 21, 21, 
+	21, 21, 21, 21, 43, 21, 21, 28, 
+	21, 30, 21, 32, 33, 34, 35, 36, 
+	21, 22, 21, 24, 24, 21, 25, 21, 
+	26, 21, 21, 21, 21, 21, 21, 21, 
+	43, 21, 21, 28, 21, 21, 21, 32, 
+	33, 34, 35, 36, 21, 22, 21, 24, 
+	24, 21, 25, 21, 26, 21, 21, 21, 
+	21, 21, 21, 21, 43, 21, 21, 28, 
+	29, 30, 21, 32, 33, 34, 35, 36, 
+	21, 22, 23, 24, 24, 21, 25, 21, 
+	26, 21, 21, 21, 21, 21, 21, 21, 
+	27, 21, 21, 28, 29, 30, 31, 32, 
+	33, 34, 35, 36, 21, 3, 3, 44, 
+	5, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 45, 44, 44, 44, 44, 44, 
+	44, 14, 44, 44, 44, 18, 44, 3, 
+	3, 44, 5, 44, 3, 3, 44, 5, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	14, 44, 44, 44, 18, 44, 46, 44, 
+	3, 3, 44, 5, 44, 14, 44, 44, 
+	44, 44, 44, 44, 44, 47, 44, 44, 
+	44, 44, 44, 44, 14, 44, 3, 3, 
+	44, 5, 44, 44, 44, 44, 44, 44, 
+	44, 44, 44, 47, 44, 44, 44, 44, 
+	44, 44, 14, 44, 3, 3, 44, 5, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	14, 44, 2, 44, 3, 3, 44, 5, 
+	44, 6, 44, 44, 44, 44, 44, 44, 
+	44, 48, 44, 44, 48, 44, 44, 44, 
+	14, 49, 44, 44, 18, 44, 2, 44, 
+	3, 3, 44, 5, 44, 6, 44, 44, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 44, 44, 14, 44, 44, 44, 
+	18, 44, 2, 44, 3, 3, 44, 5, 
+	44, 6, 44, 44, 44, 44, 44, 44, 
+	44, 48, 44, 44, 44, 44, 44, 44, 
+	14, 49, 44, 44, 18, 44, 2, 44, 
+	3, 3, 44, 5, 44, 6, 44, 44, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 44, 44, 14, 49, 44, 44, 
+	18, 44, 22, 23, 24, 24, 21, 25, 
+	21, 26, 21, 21, 21, 21, 21, 21, 
+	21, 50, 21, 21, 28, 29, 30, 31, 
+	32, 33, 34, 35, 36, 37, 21, 22, 
+	51, 24, 24, 21, 25, 21, 26, 21, 
+	21, 21, 21, 21, 21, 21, 27, 21, 
+	21, 28, 29, 30, 31, 32, 33, 34, 
+	35, 36, 21, 1, 1, 2, 3, 3, 
+	3, 44, 5, 44, 6, 1, 44, 44, 
+	44, 44, 1, 44, 8, 44, 44, 10, 
+	11, 12, 13, 14, 15, 16, 17, 18, 
+	19, 44, 1, 44, 2, 44, 3, 3, 
+	44, 5, 44, 6, 44, 44, 44, 44, 
+	44, 44, 44, 8, 44, 44, 10, 11, 
+	12, 13, 14, 15, 16, 17, 18, 44, 
+	2, 44, 3, 3, 44, 5, 44, 6, 
+	44, 44, 44, 44, 44, 44, 44, 52, 
+	44, 44, 44, 44, 44, 44, 14, 15, 
+	16, 17, 18, 44, 2, 44, 3, 3, 
+	44, 5, 44, 6, 44, 44, 44, 44, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 14, 15, 16, 17, 18, 44, 
+	2, 44, 3, 3, 44, 5, 44, 6, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 44, 44, 44, 44, 14, 15, 
+	16, 44, 18, 44, 2, 44, 3, 3, 
+	44, 5, 44, 6, 44, 44, 44, 44, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 14, 44, 16, 44, 18, 44, 
+	2, 44, 3, 3, 44, 5, 44, 6, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 44, 44, 44, 44, 14, 15, 
+	16, 17, 18, 52, 44, 2, 44, 3, 
+	3, 44, 5, 44, 6, 44, 44, 44, 
+	44, 44, 44, 44, 52, 44, 44, 10, 
+	44, 12, 44, 14, 15, 16, 17, 18, 
+	44, 2, 44, 3, 3, 44, 5, 44, 
+	6, 44, 44, 44, 44, 44, 44, 44, 
+	52, 44, 44, 10, 44, 44, 44, 14, 
+	15, 16, 17, 18, 44, 2, 44, 3, 
+	3, 44, 5, 44, 6, 44, 44, 44, 
+	44, 44, 44, 44, 52, 44, 44, 10, 
+	11, 12, 44, 14, 15, 16, 17, 18, 
+	44, 2, 3, 3, 3, 44, 5, 44, 
+	6, 44, 44, 44, 44, 44, 44, 44, 
+	8, 44, 44, 10, 11, 12, 13, 14, 
+	15, 16, 17, 18, 44, 1, 1, 53, 
+	53, 53, 53, 53, 53, 53, 53, 1, 
+	53, 53, 53, 53, 1, 53, 53, 53, 
+	53, 53, 53, 53, 53, 53, 53, 53, 
+	53, 53, 53, 53, 1, 53, 54, 53, 
+	0
+};
+
+static const char _myanmar_syllable_machine_trans_targs[] = {
+	0, 1, 23, 0, 0, 24, 30, 33, 
+	36, 46, 37, 42, 43, 44, 26, 39, 
+	40, 41, 29, 45, 47, 0, 2, 12, 
+	0, 3, 9, 13, 14, 19, 20, 21, 
+	5, 16, 17, 18, 8, 22, 4, 6, 
+	7, 10, 11, 15, 0, 25, 27, 28, 
+	31, 32, 34, 35, 38, 0, 0
+};
+
+static const char _myanmar_syllable_machine_trans_actions[] = {
+	3, 0, 0, 4, 5, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 6, 0, 0, 
+	7, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 8, 0, 0, 0, 
+	0, 0, 0, 0, 0, 9, 10
+};
+
+static const char _myanmar_syllable_machine_to_state_actions[] = {
+	1, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	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 _myanmar_syllable_machine_from_state_actions[] = {
+	2, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static const short _myanmar_syllable_machine_eof_trans[] = {
+	0, 22, 22, 22, 22, 22, 22, 22, 
+	22, 22, 22, 22, 22, 22, 22, 22, 
+	22, 22, 22, 22, 22, 22, 22, 45, 
+	45, 45, 45, 45, 45, 45, 45, 45, 
+	45, 22, 22, 45, 45, 45, 45, 45, 
+	45, 45, 45, 45, 45, 45, 54, 54
+};
+
+static const int myanmar_syllable_machine_start = 0;
+static const int myanmar_syllable_machine_first_final = 0;
+static const int myanmar_syllable_machine_error = -1;
+
+static const int myanmar_syllable_machine_en_main = 0;
+
+
+#line 36 "hb-ot-shape-complex-myanmar-machine.rl"
+
+
+
+#line 94 "hb-ot-shape-complex-myanmar-machine.rl"
+
+
+#define found_syllable(syllable_type) \
+  HB_STMT_START { \
+    if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+    for (unsigned int i = ts; i < te; i++) \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
+    syllable_serial++; \
+    if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+  } HB_STMT_END
+
+static void
+find_syllables (hb_buffer_t *buffer)
+{
+  unsigned int p, pe, eof, ts, te, act HB_UNUSED;
+  int cs;
+  hb_glyph_info_t *info = buffer->info;
+  
+#line 301 "hb-ot-shape-complex-myanmar-machine.hh"
+	{
+	cs = myanmar_syllable_machine_start;
+	ts = 0;
+	te = 0;
+	act = 0;
+	}
+
+#line 114 "hb-ot-shape-complex-myanmar-machine.rl"
+
+
+  p = 0;
+  pe = eof = buffer->len;
+
+  unsigned int syllable_serial = 1;
+  
+#line 317 "hb-ot-shape-complex-myanmar-machine.hh"
+	{
+	int _slen;
+	int _trans;
+	const unsigned char *_keys;
+	const char *_inds;
+	if ( p == pe )
+		goto _test_eof;
+_resume:
+	switch ( _myanmar_syllable_machine_from_state_actions[cs] ) {
+	case 2:
+#line 1 "NONE"
+	{ts = p;}
+	break;
+#line 331 "hb-ot-shape-complex-myanmar-machine.hh"
+	}
+
+	_keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
+	_inds = _myanmar_syllable_machine_indicies + _myanmar_syllable_machine_index_offsets[cs];
+
+	_slen = _myanmar_syllable_machine_key_spans[cs];
+	_trans = _inds[ _slen > 0 && _keys[0] <=( info[p].myanmar_category()) &&
+		( info[p].myanmar_category()) <= _keys[1] ?
+		( info[p].myanmar_category()) - _keys[0] : _slen ];
+
+_eof_trans:
+	cs = _myanmar_syllable_machine_trans_targs[_trans];
+
+	if ( _myanmar_syllable_machine_trans_actions[_trans] == 0 )
+		goto _again;
+
+	switch ( _myanmar_syllable_machine_trans_actions[_trans] ) {
+	case 7:
+#line 86 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p+1;{ found_syllable (consonant_syllable); }}
+	break;
+	case 5:
+#line 87 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p+1;{ found_syllable (non_myanmar_cluster); }}
+	break;
+	case 10:
+#line 88 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p+1;{ found_syllable (punctuation_cluster); }}
+	break;
+	case 4:
+#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p+1;{ found_syllable (broken_cluster); }}
+	break;
+	case 3:
+#line 90 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p+1;{ found_syllable (non_myanmar_cluster); }}
+	break;
+	case 6:
+#line 86 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p;p--;{ found_syllable (consonant_syllable); }}
+	break;
+	case 8:
+#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p;p--;{ found_syllable (broken_cluster); }}
+	break;
+	case 9:
+#line 90 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p;p--;{ found_syllable (non_myanmar_cluster); }}
+	break;
+#line 381 "hb-ot-shape-complex-myanmar-machine.hh"
+	}
+
+_again:
+	switch ( _myanmar_syllable_machine_to_state_actions[cs] ) {
+	case 1:
+#line 1 "NONE"
+	{ts = 0;}
+	break;
+#line 390 "hb-ot-shape-complex-myanmar-machine.hh"
+	}
+
+	if ( ++p != pe )
+		goto _resume;
+	_test_eof: {}
+	if ( p == eof )
+	{
+	if ( _myanmar_syllable_machine_eof_trans[cs] > 0 ) {
+		_trans = _myanmar_syllable_machine_eof_trans[cs] - 1;
+		goto _eof_trans;
+	}
+	}
+
+	}
+
+#line 122 "hb-ot-shape-complex-myanmar-machine.rl"
+
+}
+
+#undef found_syllable
+
+#endif /* HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-myanmar-machine.rl b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-myanmar-machine.rl
new file mode 100644
index 0000000..7845a86
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-myanmar-machine.rl
@@ -0,0 +1,127 @@
+/*
+ * Copyright © 2011,2012  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_SHAPE_COMPLEX_MYANMAR_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH
+
+#include "hb.hh"
+
+%%{
+  machine myanmar_syllable_machine;
+  alphtype unsigned char;
+  write data;
+}%%
+
+%%{
+
+# Same order as enum myanmar_category_t.  Not sure how to avoid duplication.
+A    = 10;
+As   = 18;
+C    = 1;
+D    = 32;
+D0   = 20;
+DB   = 3;
+GB   = 11;
+H    = 4;
+IV   = 2;
+MH   = 21;
+MR   = 22;
+MW   = 23;
+MY   = 24;
+PT   = 25;
+V    = 8;
+VAbv = 26;
+VBlw = 27;
+VPre = 28;
+VPst = 29;
+VS   = 30;
+ZWJ  = 6;
+ZWNJ = 5;
+Ra   = 16;
+P    = 31;
+CS   = 19;
+
+j = ZWJ|ZWNJ;			# Joiners
+k = (Ra As H);			# Kinzi
+
+c = C|Ra;			# is_consonant
+
+medial_group = MY? MR? MW? MH? As?;
+main_vowel_group = (VPre.VS?)* VAbv* VBlw* A* (DB As?)?;
+post_vowel_group = VPst MH? As* VAbv* A* (DB As?)?;
+pwo_tone_group = PT A* DB? As?;
+
+complex_syllable_tail = As* medial_group main_vowel_group post_vowel_group* pwo_tone_group* V* j?;
+syllable_tail = (H | complex_syllable_tail);
+
+consonant_syllable =	(k|CS)? (c|IV|D|GB).VS? (H (c|IV).VS?)* syllable_tail;
+punctuation_cluster = 	P V;
+broken_cluster =	k? VS? syllable_tail;
+other =			any;
+
+main := |*
+	consonant_syllable	=> { found_syllable (consonant_syllable); };
+	j			=> { found_syllable (non_myanmar_cluster); };
+	punctuation_cluster	=> { found_syllable (punctuation_cluster); };
+	broken_cluster		=> { found_syllable (broken_cluster); };
+	other			=> { found_syllable (non_myanmar_cluster); };
+*|;
+
+
+}%%
+
+#define found_syllable(syllable_type) \
+  HB_STMT_START { \
+    if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+    for (unsigned int i = ts; i < te; i++) \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
+    syllable_serial++; \
+    if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+  } HB_STMT_END
+
+static void
+find_syllables (hb_buffer_t *buffer)
+{
+  unsigned int p, pe, eof, ts, te, act HB_UNUSED;
+  int cs;
+  hb_glyph_info_t *info = buffer->info;
+  %%{
+    write init;
+    getkey info[p].myanmar_category();
+  }%%
+
+  p = 0;
+  pe = eof = buffer->len;
+
+  unsigned int syllable_serial = 1;
+  %%{
+    write exec;
+  }%%
+}
+
+#undef found_syllable
+
+#endif /* HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-myanmar.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-myanmar.cc
new file mode 100644
index 0000000..8fdf2f4b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-myanmar.cc
@@ -0,0 +1,413 @@
+/*
+ * Copyright © 2011,2012,2013  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
+ */
+
+#include "hb-ot-shape-complex-myanmar.hh"
+
+
+/*
+ * Myanmar shaper.
+ */
+
+static const hb_tag_t
+basic_features[] =
+{
+  /*
+   * Basic features.
+   * These features are applied in order, one at a time, after reordering.
+   */
+  HB_TAG('r','p','h','f'),
+  HB_TAG('p','r','e','f'),
+  HB_TAG('b','l','w','f'),
+  HB_TAG('p','s','t','f'),
+};
+static const hb_tag_t
+other_features[] =
+{
+  /*
+   * Other features.
+   * These features are applied all at once, after clearing syllables.
+   */
+  HB_TAG('p','r','e','s'),
+  HB_TAG('a','b','v','s'),
+  HB_TAG('b','l','w','s'),
+  HB_TAG('p','s','t','s'),
+};
+static const hb_tag_t
+positioning_features[] =
+{
+  /*
+   * Positioning features.
+   * We don't care about the types.
+   */
+  HB_TAG('d','i','s','t'),
+  /* Pre-release version of Windows 8 Myanmar font had abvm,blwm
+   * features.  The released Windows 8 version of the font (as well
+   * as the released spec) used 'mark' instead.  The Windows 8
+   * shaper however didn't apply 'mark' but did apply 'mkmk'.
+   * Perhaps it applied abvm/blwm.  This was fixed in a Windows 8
+   * update, so now it applies mark/mkmk.  We are guessing that
+   * it still applies abvm/blwm too.
+   */
+  HB_TAG('a','b','v','m'),
+  HB_TAG('b','l','w','m'),
+};
+
+static void
+setup_syllables (const hb_ot_shape_plan_t *plan,
+		 hb_font_t *font,
+		 hb_buffer_t *buffer);
+static void
+reorder (const hb_ot_shape_plan_t *plan,
+	 hb_font_t *font,
+	 hb_buffer_t *buffer);
+static void
+clear_syllables (const hb_ot_shape_plan_t *plan,
+		 hb_font_t *font,
+		 hb_buffer_t *buffer);
+
+static void
+collect_features_myanmar (hb_ot_shape_planner_t *plan)
+{
+  hb_ot_map_builder_t *map = &plan->map;
+
+  /* Do this before any lookups have been applied. */
+  map->add_gsub_pause (setup_syllables);
+
+  map->enable_feature (HB_TAG('l','o','c','l'));
+  /* The Indic specs do not require ccmp, but we apply it here since if
+   * there is a use of it, it's typically at the beginning. */
+  map->enable_feature (HB_TAG('c','c','m','p'));
+
+
+  map->add_gsub_pause (reorder);
+
+  for (unsigned int i = 0; i < ARRAY_LENGTH (basic_features); i++)
+  {
+    map->enable_feature (basic_features[i], F_MANUAL_ZWJ);
+    map->add_gsub_pause (nullptr);
+  }
+
+  map->add_gsub_pause (clear_syllables);
+
+  for (unsigned int i = 0; i < ARRAY_LENGTH (other_features); i++)
+    map->enable_feature (other_features[i], F_MANUAL_ZWJ);
+
+  for (unsigned int i = 0; i < ARRAY_LENGTH (positioning_features); i++)
+    map->enable_feature (positioning_features[i]);
+}
+
+static void
+override_features_myanmar (hb_ot_shape_planner_t *plan)
+{
+  plan->map.disable_feature (HB_TAG('l','i','g','a'));
+}
+
+
+enum syllable_type_t {
+  consonant_syllable,
+  punctuation_cluster,
+  broken_cluster,
+  non_myanmar_cluster,
+};
+
+#include "hb-ot-shape-complex-myanmar-machine.hh"
+
+
+static void
+setup_masks_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		   hb_buffer_t              *buffer,
+		   hb_font_t                *font HB_UNUSED)
+{
+  HB_BUFFER_ALLOCATE_VAR (buffer, myanmar_category);
+  HB_BUFFER_ALLOCATE_VAR (buffer, myanmar_position);
+
+  /* We cannot setup masks here.  We save information about characters
+   * and setup masks later on in a pause-callback. */
+
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    set_myanmar_properties (info[i]);
+}
+
+static void
+setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		 hb_font_t *font HB_UNUSED,
+		 hb_buffer_t *buffer)
+{
+  find_syllables (buffer);
+  foreach_syllable (buffer, start, end)
+    buffer->unsafe_to_break (start, end);
+}
+
+static int
+compare_myanmar_order (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb)
+{
+  int a = pa->myanmar_position();
+  int b = pb->myanmar_position();
+
+  return a < b ? -1 : a == b ? 0 : +1;
+}
+
+
+/* Rules from:
+ * https://docs.microsoft.com/en-us/typography/script-development/myanmar */
+
+static void
+initial_reordering_consonant_syllable (hb_buffer_t *buffer,
+				       unsigned int start, unsigned int end)
+{
+  hb_glyph_info_t *info = buffer->info;
+
+  unsigned int base = end;
+  bool has_reph = false;
+
+  {
+    unsigned int limit = start;
+    if (start + 3 <= end &&
+	info[start  ].myanmar_category() == OT_Ra &&
+	info[start+1].myanmar_category() == OT_As &&
+	info[start+2].myanmar_category() == OT_H)
+    {
+      limit += 3;
+      base = start;
+      has_reph = true;
+    }
+
+    {
+      if (!has_reph)
+	base = limit;
+
+      for (unsigned int i = limit; i < end; i++)
+	if (is_consonant (info[i]))
+	{
+	  base = i;
+	  break;
+	}
+    }
+  }
+
+  /* Reorder! */
+  {
+    unsigned int i = start;
+    for (; i < start + (has_reph ? 3 : 0); i++)
+      info[i].myanmar_position() = POS_AFTER_MAIN;
+    for (; i < base; i++)
+      info[i].myanmar_position() = POS_PRE_C;
+    if (i < end)
+    {
+      info[i].myanmar_position() = POS_BASE_C;
+      i++;
+    }
+    indic_position_t pos = POS_AFTER_MAIN;
+    /* The following loop may be ugly, but it implements all of
+     * Myanmar reordering! */
+    for (; i < end; i++)
+    {
+      if (info[i].myanmar_category() == OT_MR) /* Pre-base reordering */
+      {
+	info[i].myanmar_position() = POS_PRE_C;
+	continue;
+      }
+      if (info[i].myanmar_position() < POS_BASE_C) /* Left matra */
+      {
+	continue;
+      }
+      if (info[i].myanmar_category() == OT_VS)
+      {
+	info[i].myanmar_position() = info[i - 1].myanmar_position();
+	continue;
+      }
+
+      if (pos == POS_AFTER_MAIN && info[i].myanmar_category() == OT_VBlw)
+      {
+	pos = POS_BELOW_C;
+	info[i].myanmar_position() = pos;
+	continue;
+      }
+
+      if (pos == POS_BELOW_C && info[i].myanmar_category() == OT_A)
+      {
+	info[i].myanmar_position() = POS_BEFORE_SUB;
+	continue;
+      }
+      if (pos == POS_BELOW_C && info[i].myanmar_category() == OT_VBlw)
+      {
+	info[i].myanmar_position() = pos;
+	continue;
+      }
+      if (pos == POS_BELOW_C && info[i].myanmar_category() != OT_A)
+      {
+        pos = POS_AFTER_SUB;
+	info[i].myanmar_position() = pos;
+	continue;
+      }
+      info[i].myanmar_position() = pos;
+    }
+  }
+
+  /* Sit tight, rock 'n roll! */
+  buffer->sort (start, end, compare_myanmar_order);
+}
+
+static void
+initial_reordering_syllable (const hb_ot_shape_plan_t *plan HB_UNUSED,
+			     hb_face_t *face HB_UNUSED,
+			     hb_buffer_t *buffer,
+			     unsigned int start, unsigned int end)
+{
+  syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F);
+  switch (syllable_type) {
+
+    case broken_cluster: /* We already inserted dotted-circles, so just call the consonant_syllable. */
+    case consonant_syllable:
+      initial_reordering_consonant_syllable  (buffer, start, end);
+      break;
+
+    case punctuation_cluster:
+    case non_myanmar_cluster:
+      break;
+  }
+}
+
+static inline void
+insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		       hb_font_t *font,
+		       hb_buffer_t *buffer)
+{
+  /* Note: This loop is extra overhead, but should not be measurable. */
+  bool has_broken_syllables = false;
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    if ((info[i].syllable() & 0x0F) == broken_cluster)
+    {
+      has_broken_syllables = true;
+      break;
+    }
+  if (likely (!has_broken_syllables))
+    return;
+
+
+  hb_codepoint_t dottedcircle_glyph;
+  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
+    return;
+
+  hb_glyph_info_t dottedcircle = {0};
+  dottedcircle.codepoint = 0x25CCu;
+  set_myanmar_properties (dottedcircle);
+  dottedcircle.codepoint = dottedcircle_glyph;
+
+  buffer->clear_output ();
+
+  buffer->idx = 0;
+  unsigned int last_syllable = 0;
+  while (buffer->idx < buffer->len && buffer->successful)
+  {
+    unsigned int syllable = buffer->cur().syllable();
+    syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
+    if (unlikely (last_syllable != syllable && syllable_type == broken_cluster))
+    {
+      last_syllable = syllable;
+
+      hb_glyph_info_t ginfo = dottedcircle;
+      ginfo.cluster = buffer->cur().cluster;
+      ginfo.mask = buffer->cur().mask;
+      ginfo.syllable() = buffer->cur().syllable();
+
+      buffer->output_info (ginfo);
+    }
+    else
+      buffer->next_glyph ();
+  }
+  buffer->swap_buffers ();
+}
+
+static void
+reorder (const hb_ot_shape_plan_t *plan,
+	 hb_font_t *font,
+	 hb_buffer_t *buffer)
+{
+  insert_dotted_circles (plan, font, buffer);
+
+  foreach_syllable (buffer, start, end)
+    initial_reordering_syllable (plan, font->face, buffer, start, end);
+
+  HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_category);
+  HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_position);
+}
+
+static void
+clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		 hb_font_t *font HB_UNUSED,
+		 hb_buffer_t *buffer)
+{
+  hb_glyph_info_t *info = buffer->info;
+  unsigned int count = buffer->len;
+  for (unsigned int i = 0; i < count; i++)
+    info[i].syllable() = 0;
+}
+
+
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar =
+{
+  collect_features_myanmar,
+  override_features_myanmar,
+  nullptr, /* data_create */
+  nullptr, /* data_destroy */
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
+  HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
+  nullptr, /* decompose */
+  nullptr, /* compose */
+  setup_masks_myanmar,
+  HB_TAG_NONE, /* gpos_tag */
+  nullptr, /* reorder_marks */
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
+  false, /* fallback_position */
+};
+
+
+/* Ugly Zawgyi encoding.
+ * Disable all auto processing.
+ * https://github.com/harfbuzz/harfbuzz/issues/1162 */
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar_zawgyi =
+{
+  nullptr, /* collect_features */
+  nullptr, /* override_features */
+  nullptr, /* data_create */
+  nullptr, /* data_destroy */
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
+  HB_OT_SHAPE_NORMALIZATION_MODE_NONE,
+  nullptr, /* decompose */
+  nullptr, /* compose */
+  nullptr, /* setup_masks */
+  HB_TAG_NONE, /* gpos_tag */
+  nullptr, /* reorder_marks */
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
+  false, /* fallback_position */
+};
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-myanmar.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-myanmar.hh
new file mode 100644
index 0000000..3e9537a
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-myanmar.hh
@@ -0,0 +1,171 @@
+/*
+ * Copyright © 2018  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_SHAPE_COMPLEX_MYANMAR_HH
+#define HB_OT_SHAPE_COMPLEX_MYANMAR_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex-indic.hh"
+
+
+/* buffer var allocations */
+#define myanmar_category() indic_category() /* myanmar_category_t */
+#define myanmar_position() indic_position() /* myanmar_position_t */
+
+
+/* Note: This enum is duplicated in the -machine.rl source file.
+ * Not sure how to avoid duplication. */
+enum myanmar_category_t {
+  OT_As  = 18,  /* Asat */
+  OT_D0  = 20, /* Digit zero */
+  OT_DB  = OT_N, /* Dot below */
+  OT_GB  = OT_PLACEHOLDER,
+  OT_MH  = 21, /* Various consonant medial types */
+  OT_MR  = 22, /* Various consonant medial types */
+  OT_MW  = 23, /* Various consonant medial types */
+  OT_MY  = 24, /* Various consonant medial types */
+  OT_PT  = 25, /* Pwo and other tones */
+  OT_VAbv = 26,
+  OT_VBlw = 27,
+  OT_VPre = 28,
+  OT_VPst = 29,
+  OT_VS   = 30, /* Variation selectors */
+  OT_P    = 31, /* Punctuation */
+  OT_D    = 32, /* Digits except zero */
+};
+
+
+static inline void
+set_myanmar_properties (hb_glyph_info_t &info)
+{
+  hb_codepoint_t u = info.codepoint;
+  unsigned int type = hb_indic_get_categories (u);
+  unsigned int cat = type & 0x7Fu;
+  indic_position_t pos = (indic_position_t) (type >> 8);
+
+  /* Myanmar
+   * https://docs.microsoft.com/en-us/typography/script-development/myanmar#analyze
+   */
+  if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xFE00u, 0xFE0Fu)))
+    cat = OT_VS;
+
+  switch (u)
+  {
+    case 0x104Eu:
+      cat = OT_C; /* The spec says C, IndicSyllableCategory doesn't have. */
+      break;
+
+    case 0x002Du: case 0x00A0u: case 0x00D7u: case 0x2012u:
+    case 0x2013u: case 0x2014u: case 0x2015u: case 0x2022u:
+    case 0x25CCu: case 0x25FBu: case 0x25FCu: case 0x25FDu:
+    case 0x25FEu:
+      cat = OT_GB;
+      break;
+
+    case 0x1004u: case 0x101Bu: case 0x105Au:
+      cat = OT_Ra;
+      break;
+
+    case 0x1032u: case 0x1036u:
+      cat = OT_A;
+      break;
+
+    case 0x1039u:
+      cat = OT_H;
+      break;
+
+    case 0x103Au:
+      cat = OT_As;
+      break;
+
+    case 0x1041u: case 0x1042u: case 0x1043u: case 0x1044u:
+    case 0x1045u: case 0x1046u: case 0x1047u: case 0x1048u:
+    case 0x1049u: case 0x1090u: case 0x1091u: case 0x1092u:
+    case 0x1093u: case 0x1094u: case 0x1095u: case 0x1096u:
+    case 0x1097u: case 0x1098u: case 0x1099u:
+      cat = OT_D;
+      break;
+
+    case 0x1040u:
+      cat = OT_D; /* XXX The spec says D0, but Uniscribe doesn't seem to do. */
+      break;
+
+    case 0x103Eu: case 0x1060u:
+      cat = OT_MH;
+      break;
+
+    case 0x103Cu:
+      cat = OT_MR;
+      break;
+
+    case 0x103Du: case 0x1082u:
+      cat = OT_MW;
+      break;
+
+    case 0x103Bu: case 0x105Eu: case 0x105Fu:
+      cat = OT_MY;
+      break;
+
+    case 0x1063u: case 0x1064u: case 0x1069u: case 0x106Au:
+    case 0x106Bu: case 0x106Cu: case 0x106Du: case 0xAA7Bu:
+      cat = OT_PT;
+      break;
+
+    case 0x1038u: case 0x1087u: case 0x1088u: case 0x1089u:
+    case 0x108Au: case 0x108Bu: case 0x108Cu: case 0x108Du:
+    case 0x108Fu: case 0x109Au: case 0x109Bu: case 0x109Cu:
+      cat = OT_SM;
+      break;
+
+    case 0x104Au: case 0x104Bu:
+      cat = OT_P;
+      break;
+
+    case 0xAA74u: case 0xAA75u: case 0xAA76u:
+      /* https://github.com/roozbehp/unicode-data/issues/3 */
+      cat = OT_C;
+      break;
+  }
+
+  if (cat == OT_M)
+  {
+    switch ((int) pos)
+    {
+      case POS_PRE_C:	cat = OT_VPre;
+			pos = POS_PRE_M; break;
+      case POS_ABOVE_C:	cat = OT_VAbv;   break;
+      case POS_BELOW_C:	cat = OT_VBlw;   break;
+      case POS_POST_C:	cat = OT_VPst;   break;
+    }
+  }
+
+  info.myanmar_category() = cat;
+  info.myanmar_position() = pos;
+}
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_MYANMAR_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-thai.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-thai.cc
new file mode 100644
index 0000000..650c980
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-thai.cc
@@ -0,0 +1,383 @@
+/*
+ * Copyright © 2010,2012  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
+ */
+
+#include "hb-ot-shape-complex.hh"
+
+
+/* Thai / Lao shaper */
+
+
+/* PUA shaping */
+
+
+enum thai_consonant_type_t
+{
+  NC,
+  AC,
+  RC,
+  DC,
+  NOT_CONSONANT,
+  NUM_CONSONANT_TYPES = NOT_CONSONANT
+};
+
+static thai_consonant_type_t
+get_consonant_type (hb_codepoint_t u)
+{
+  if (u == 0x0E1Bu || u == 0x0E1Du || u == 0x0E1Fu/* || u == 0x0E2Cu*/)
+    return AC;
+  if (u == 0x0E0Du || u == 0x0E10u)
+    return RC;
+  if (u == 0x0E0Eu || u == 0x0E0Fu)
+    return DC;
+  if (hb_in_range<hb_codepoint_t> (u, 0x0E01u, 0x0E2Eu))
+    return NC;
+  return NOT_CONSONANT;
+}
+
+
+enum thai_mark_type_t
+{
+  AV,
+  BV,
+  T,
+  NOT_MARK,
+  NUM_MARK_TYPES = NOT_MARK
+};
+
+static thai_mark_type_t
+get_mark_type (hb_codepoint_t u)
+{
+  if (u == 0x0E31u || hb_in_range<hb_codepoint_t> (u, 0x0E34u, 0x0E37u) ||
+      u == 0x0E47u || hb_in_range<hb_codepoint_t> (u, 0x0E4Du, 0x0E4Eu))
+    return AV;
+  if (hb_in_range<hb_codepoint_t> (u, 0x0E38u, 0x0E3Au))
+    return BV;
+  if (hb_in_range<hb_codepoint_t> (u, 0x0E48u, 0x0E4Cu))
+    return T;
+  return NOT_MARK;
+}
+
+
+enum thai_action_t
+{
+  NOP,
+  SD,  /* Shift combining-mark down */
+  SL,  /* Shift combining-mark left */
+  SDL, /* Shift combining-mark down-left */
+  RD   /* Remove descender from base */
+};
+
+static hb_codepoint_t
+thai_pua_shape (hb_codepoint_t u, thai_action_t action, hb_font_t *font)
+{
+  struct thai_pua_mapping_t {
+    hb_codepoint_t u;
+    hb_codepoint_t win_pua;
+    hb_codepoint_t mac_pua;
+  } const *pua_mappings = nullptr;
+  static const thai_pua_mapping_t SD_mappings[] = {
+    {0x0E48u, 0xF70Au, 0xF88Bu}, /* MAI EK */
+    {0x0E49u, 0xF70Bu, 0xF88Eu}, /* MAI THO */
+    {0x0E4Au, 0xF70Cu, 0xF891u}, /* MAI TRI */
+    {0x0E4Bu, 0xF70Du, 0xF894u}, /* MAI CHATTAWA */
+    {0x0E4Cu, 0xF70Eu, 0xF897u}, /* THANTHAKHAT */
+    {0x0E38u, 0xF718u, 0xF89Bu}, /* SARA U */
+    {0x0E39u, 0xF719u, 0xF89Cu}, /* SARA UU */
+    {0x0E3Au, 0xF71Au, 0xF89Du}, /* PHINTHU */
+    {0x0000u, 0x0000u, 0x0000u}
+  };
+  static const thai_pua_mapping_t SDL_mappings[] = {
+    {0x0E48u, 0xF705u, 0xF88Cu}, /* MAI EK */
+    {0x0E49u, 0xF706u, 0xF88Fu}, /* MAI THO */
+    {0x0E4Au, 0xF707u, 0xF892u}, /* MAI TRI */
+    {0x0E4Bu, 0xF708u, 0xF895u}, /* MAI CHATTAWA */
+    {0x0E4Cu, 0xF709u, 0xF898u}, /* THANTHAKHAT */
+    {0x0000u, 0x0000u, 0x0000u}
+  };
+  static const thai_pua_mapping_t SL_mappings[] = {
+    {0x0E48u, 0xF713u, 0xF88Au}, /* MAI EK */
+    {0x0E49u, 0xF714u, 0xF88Du}, /* MAI THO */
+    {0x0E4Au, 0xF715u, 0xF890u}, /* MAI TRI */
+    {0x0E4Bu, 0xF716u, 0xF893u}, /* MAI CHATTAWA */
+    {0x0E4Cu, 0xF717u, 0xF896u}, /* THANTHAKHAT */
+    {0x0E31u, 0xF710u, 0xF884u}, /* MAI HAN-AKAT */
+    {0x0E34u, 0xF701u, 0xF885u}, /* SARA I */
+    {0x0E35u, 0xF702u, 0xF886u}, /* SARA II */
+    {0x0E36u, 0xF703u, 0xF887u}, /* SARA UE */
+    {0x0E37u, 0xF704u, 0xF888u}, /* SARA UEE */
+    {0x0E47u, 0xF712u, 0xF889u}, /* MAITAIKHU */
+    {0x0E4Du, 0xF711u, 0xF899u}, /* NIKHAHIT */
+    {0x0000u, 0x0000u, 0x0000u}
+  };
+  static const thai_pua_mapping_t RD_mappings[] = {
+    {0x0E0Du, 0xF70Fu, 0xF89Au}, /* YO YING */
+    {0x0E10u, 0xF700u, 0xF89Eu}, /* THO THAN */
+    {0x0000u, 0x0000u, 0x0000u}
+  };
+
+  switch (action) {
+    case NOP: return u;
+    case SD:  pua_mappings = SD_mappings; break;
+    case SDL: pua_mappings = SDL_mappings; break;
+    case SL:  pua_mappings = SL_mappings; break;
+    case RD:  pua_mappings = RD_mappings; break;
+  }
+  for (; pua_mappings->u; pua_mappings++)
+    if (pua_mappings->u == u)
+    {
+      hb_codepoint_t glyph;
+      if (hb_font_get_glyph (font, pua_mappings->win_pua, 0, &glyph))
+	return pua_mappings->win_pua;
+      if (hb_font_get_glyph (font, pua_mappings->mac_pua, 0, &glyph))
+	return pua_mappings->mac_pua;
+      break;
+    }
+  return u;
+}
+
+
+static enum thai_above_state_t
+{     /* Cluster above looks like: */
+  T0, /*  ⣤                      */
+  T1, /*     ⣼                   */
+  T2, /*        ⣾                */
+  T3, /*           ⣿             */
+  NUM_ABOVE_STATES
+} thai_above_start_state[NUM_CONSONANT_TYPES + 1/* For NOT_CONSONANT */] =
+{
+  T0, /* NC */
+  T1, /* AC */
+  T0, /* RC */
+  T0, /* DC */
+  T3, /* NOT_CONSONANT */
+};
+
+static const struct thai_above_state_machine_edge_t {
+  thai_action_t action;
+  thai_above_state_t next_state;
+} thai_above_state_machine[NUM_ABOVE_STATES][NUM_MARK_TYPES] =
+{        /*AV*/    /*BV*/    /*T*/
+/*T0*/ {{NOP,T3}, {NOP,T0}, {SD, T3}},
+/*T1*/ {{SL, T2}, {NOP,T1}, {SDL,T2}},
+/*T2*/ {{NOP,T3}, {NOP,T2}, {SL, T3}},
+/*T3*/ {{NOP,T3}, {NOP,T3}, {NOP,T3}},
+};
+
+
+static enum thai_below_state_t
+{
+  B0, /* No descender */
+  B1, /* Removable descender */
+  B2, /* Strict descender */
+  NUM_BELOW_STATES
+} thai_below_start_state[NUM_CONSONANT_TYPES + 1/* For NOT_CONSONANT */] =
+{
+  B0, /* NC */
+  B0, /* AC */
+  B1, /* RC */
+  B2, /* DC */
+  B2, /* NOT_CONSONANT */
+};
+
+static const struct thai_below_state_machine_edge_t {
+  thai_action_t action;
+  thai_below_state_t next_state;
+} thai_below_state_machine[NUM_BELOW_STATES][NUM_MARK_TYPES] =
+{        /*AV*/    /*BV*/    /*T*/
+/*B0*/ {{NOP,B0}, {NOP,B2}, {NOP, B0}},
+/*B1*/ {{NOP,B1}, {RD, B2}, {NOP, B1}},
+/*B2*/ {{NOP,B2}, {SD, B2}, {NOP, B2}},
+};
+
+
+static void
+do_thai_pua_shaping (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		     hb_buffer_t              *buffer,
+		     hb_font_t                *font)
+{
+  thai_above_state_t above_state = thai_above_start_state[NOT_CONSONANT];
+  thai_below_state_t below_state = thai_below_start_state[NOT_CONSONANT];
+  unsigned int base = 0;
+
+  hb_glyph_info_t *info = buffer->info;
+  unsigned int count = buffer->len;
+  for (unsigned int i = 0; i < count; i++)
+  {
+    thai_mark_type_t mt = get_mark_type (info[i].codepoint);
+
+    if (mt == NOT_MARK) {
+      thai_consonant_type_t ct = get_consonant_type (info[i].codepoint);
+      above_state = thai_above_start_state[ct];
+      below_state = thai_below_start_state[ct];
+      base = i;
+      continue;
+    }
+
+    const thai_above_state_machine_edge_t &above_edge = thai_above_state_machine[above_state][mt];
+    const thai_below_state_machine_edge_t &below_edge = thai_below_state_machine[below_state][mt];
+    above_state = above_edge.next_state;
+    below_state = below_edge.next_state;
+
+    /* At least one of the above/below actions is NOP. */
+    thai_action_t action = above_edge.action != NOP ? above_edge.action : below_edge.action;
+
+    buffer->unsafe_to_break (base, i);
+    if (action == RD)
+      info[base].codepoint = thai_pua_shape (info[base].codepoint, action, font);
+    else
+      info[i].codepoint = thai_pua_shape (info[i].codepoint, action, font);
+  }
+}
+
+
+static void
+preprocess_text_thai (const hb_ot_shape_plan_t *plan,
+		      hb_buffer_t              *buffer,
+		      hb_font_t                *font)
+{
+  /* This function implements the shaping logic documented here:
+   *
+   *   https://linux.thai.net/~thep/th-otf/shaping.html
+   *
+   * The first shaping rule listed there is needed even if the font has Thai
+   * OpenType tables.  The rest do fallback positioning based on PUA codepoints.
+   * We implement that only if there exist no Thai GSUB in the font.
+   */
+
+  /* The following is NOT specified in the MS OT Thai spec, however, it seems
+   * to be what Uniscribe and other engines implement.  According to Eric Muller:
+   *
+   * When you have a SARA AM, decompose it in NIKHAHIT + SARA AA, *and* move the
+   * NIKHAHIT backwards over any tone mark (0E48-0E4B).
+   *
+   * <0E14, 0E4B, 0E33> -> <0E14, 0E4D, 0E4B, 0E32>
+   *
+   * This reordering is legit only when the NIKHAHIT comes from a SARA AM, not
+   * when it's there to start with. The string <0E14, 0E4B, 0E4D> is probably
+   * not what a user wanted, but the rendering is nevertheless nikhahit above
+   * chattawa.
+   *
+   * Same for Lao.
+   *
+   * Note:
+   *
+   * Uniscribe also does some below-marks reordering.  Namely, it positions U+0E3A
+   * after U+0E38 and U+0E39.  We do that by modifying the ccc for U+0E3A.
+   * See unicode->modified_combining_class ().  Lao does NOT have a U+0E3A
+   * equivalent.
+   */
+
+
+  /*
+   * Here are the characters of significance:
+   *
+   *			Thai	Lao
+   * SARA AM:		U+0E33	U+0EB3
+   * SARA AA:		U+0E32	U+0EB2
+   * Nikhahit:		U+0E4D	U+0ECD
+   *
+   * Testing shows that Uniscribe reorder the following marks:
+   * Thai:	<0E31,0E34..0E37,0E47..0E4E>
+   * Lao:	<0EB1,0EB4..0EB7,0EC7..0ECE>
+   *
+   * Note how the Lao versions are the same as Thai + 0x80.
+   */
+
+  /* We only get one script at a time, so a script-agnostic implementation
+   * is adequate here. */
+#define IS_SARA_AM(x) (((x) & ~0x0080u) == 0x0E33u)
+#define NIKHAHIT_FROM_SARA_AM(x) ((x) - 0x0E33u + 0x0E4Du)
+#define SARA_AA_FROM_SARA_AM(x) ((x) - 1)
+#define IS_TONE_MARK(x) (hb_in_ranges<hb_codepoint_t> ((x) & ~0x0080u, 0x0E34u, 0x0E37u, 0x0E47u, 0x0E4Eu, 0x0E31u, 0x0E31u))
+
+  buffer->clear_output ();
+  unsigned int count = buffer->len;
+  for (buffer->idx = 0; buffer->idx < count && buffer->successful;)
+  {
+    hb_codepoint_t u = buffer->cur().codepoint;
+    if (likely (!IS_SARA_AM (u))) {
+      buffer->next_glyph ();
+      continue;
+    }
+
+    /* Is SARA AM. Decompose and reorder. */
+    hb_glyph_info_t &nikhahit = buffer->output_glyph (NIKHAHIT_FROM_SARA_AM (u));
+    _hb_glyph_info_set_continuation (&nikhahit);
+    buffer->replace_glyph (SARA_AA_FROM_SARA_AM (u));
+    if (unlikely (!buffer->successful))
+      return;
+
+    /* Make Nikhahit be recognized as a ccc=0 mark when zeroing widths. */
+    unsigned int end = buffer->out_len;
+    _hb_glyph_info_set_general_category (&buffer->out_info[end - 2], HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK);
+
+    /* Ok, let's see... */
+    unsigned int start = end - 2;
+    while (start > 0 && IS_TONE_MARK (buffer->out_info[start - 1].codepoint))
+      start--;
+
+    if (start + 2 < end)
+    {
+      /* Move Nikhahit (end-2) to the beginning */
+      buffer->merge_out_clusters (start, end);
+      hb_glyph_info_t t = buffer->out_info[end - 2];
+      memmove (buffer->out_info + start + 1,
+	       buffer->out_info + start,
+	       sizeof (buffer->out_info[0]) * (end - start - 2));
+      buffer->out_info[start] = t;
+    }
+    else
+    {
+      /* Since we decomposed, and NIKHAHIT is combining, merge clusters with the
+       * previous cluster. */
+      if (start && buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
+	buffer->merge_out_clusters (start - 1, end);
+    }
+  }
+  buffer->swap_buffers ();
+
+  /* If font has Thai GSUB, we are done. */
+  if (plan->props.script == HB_SCRIPT_THAI && !plan->map.found_script[0])
+    do_thai_pua_shaping (plan, buffer, font);
+}
+
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai =
+{
+  nullptr, /* collect_features */
+  nullptr, /* override_features */
+  nullptr, /* data_create */
+  nullptr, /* data_destroy */
+  preprocess_text_thai,
+  nullptr, /* postprocess_glyphs */
+  HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
+  nullptr, /* decompose */
+  nullptr, /* compose */
+  nullptr, /* setup_masks */
+  HB_TAG_NONE, /* gpos_tag */
+  nullptr, /* reorder_marks */
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
+  false,/* fallback_position */
+};
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use-machine.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use-machine.hh
new file mode 100644
index 0000000..c9410e4
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use-machine.hh
@@ -0,0 +1,540 @@
+
+#line 1 "hb-ot-shape-complex-use-machine.rl"
+/*
+ * Copyright © 2015  Mozilla Foundation.
+ * Copyright © 2015  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.
+ *
+ * Mozilla Author(s): Jonathan Kew
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
+
+#include "hb.hh"
+
+
+#line 38 "hb-ot-shape-complex-use-machine.hh"
+static const unsigned char _use_syllable_machine_trans_keys[] = {
+	12u, 44u, 1u, 15u, 1u, 1u, 12u, 44u, 0u, 44u, 21u, 21u, 8u, 44u, 8u, 44u,
+	1u, 15u, 1u, 1u, 8u, 44u, 8u, 44u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u,
+	8u, 39u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u,
+	8u, 44u, 8u, 44u, 8u, 44u, 1u, 39u, 8u, 44u, 13u, 21u, 4u, 4u, 13u, 13u,
+	8u, 44u, 8u, 44u, 8u, 44u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u,
+	8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u,
+	8u, 44u, 8u, 44u, 1u, 39u, 1u, 15u, 12u, 44u, 1u, 44u, 8u, 44u, 21u, 42u,
+	41u, 42u, 42u, 42u, 1u, 5u, 0
+};
+
+static const char _use_syllable_machine_key_spans[] = {
+	33, 15, 1, 33, 45, 1, 37, 37,
+	15, 1, 37, 37, 32, 19, 19, 19,
+	32, 32, 32, 37, 37, 37, 37, 37,
+	37, 37, 37, 39, 37, 9, 1, 1,
+	37, 37, 37, 32, 19, 19, 19, 32,
+	32, 32, 37, 37, 37, 37, 37, 37,
+	37, 37, 39, 15, 33, 44, 37, 22,
+	2, 1, 5
+};
+
+static const short _use_syllable_machine_index_offsets[] = {
+	0, 34, 50, 52, 86, 132, 134, 172,
+	210, 226, 228, 266, 304, 337, 357, 377,
+	397, 430, 463, 496, 534, 572, 610, 648,
+	686, 724, 762, 800, 840, 878, 888, 890,
+	892, 930, 968, 1006, 1039, 1059, 1079, 1099,
+	1132, 1165, 1198, 1236, 1274, 1312, 1350, 1388,
+	1426, 1464, 1502, 1542, 1558, 1592, 1637, 1675,
+	1698, 1701, 1703
+};
+
+static const char _use_syllable_machine_indicies[] = {
+	1, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	1, 0, 3, 2, 2, 2, 2, 2, 
+	2, 2, 2, 2, 2, 2, 2, 2, 
+	4, 2, 3, 2, 6, 5, 5, 5,
+	5, 5, 5, 5, 5, 5, 5, 5,
+	5, 5, 5, 5, 5, 5, 5, 5,
+	5, 5, 5, 5, 5, 5, 5, 5,
+	5, 5, 5, 5, 6, 5, 7, 8,
+	9, 7, 10, 8, 9, 9, 11, 9, 
+	9, 3, 12, 9, 9, 13, 7, 7, 
+	14, 15, 9, 9, 16, 17, 18, 19, 
+	20, 21, 22, 16, 23, 24, 25, 26, 
+	27, 28, 9, 29, 30, 31, 9, 9, 
+	9, 32, 33, 9, 35, 34, 37, 36,
+	36, 38, 1, 36, 36, 39, 36, 36,
+	36, 36, 36, 40, 41, 42, 43, 44,
+	45, 46, 47, 41, 48, 40, 49, 50,
+	51, 52, 36, 53, 54, 55, 36, 36,
+	36, 36, 56, 36, 37, 36, 36, 38,
+	1, 36, 36, 39, 36, 36, 36, 36,
+	36, 57, 41, 42, 43, 44, 45, 46,
+	47, 41, 48, 49, 49, 50, 51, 52,
+	36, 53, 54, 55, 36, 36, 36, 36,
+	56, 36, 38, 58, 58, 58, 58, 58,
+	58, 58, 58, 58, 58, 58, 58, 58,
+	59, 58, 38, 58, 37, 36, 36, 38,
+	1, 36, 36, 39, 36, 36, 36, 36,
+	36, 36, 41, 42, 43, 44, 45, 46,
+	47, 41, 48, 49, 49, 50, 51, 52,
+	36, 53, 54, 55, 36, 36, 36, 36,
+	56, 36, 37, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 36, 36, 36, 36,
+	41, 42, 43, 44, 45, 36, 36, 36,
+	36, 36, 36, 50, 51, 52, 36, 53,
+	54, 55, 36, 36, 36, 36, 42, 36,
+	37, 36, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 36, 36, 36, 42,
+	43, 44, 45, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 36, 53, 54, 55,
+	36, 37, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 36, 36, 36, 36,
+	36, 43, 44, 45, 36, 37, 36, 36,
+	36, 36, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 36, 36, 44, 45,
+	36, 37, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 45, 36, 37, 36, 36,
+	36, 36, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 36, 43, 44, 45,
+	36, 36, 36, 36, 36, 36, 36, 36,
+	36, 36, 53, 54, 55, 36, 37, 36,
+	36, 36, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 36, 36, 43, 44,
+	45, 36, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 54, 55, 36, 37,
+	36, 36, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 36, 36, 36, 43,
+	44, 45, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 36, 36, 55, 36,
+	37, 36, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 36, 36, 36, 42,
+	43, 44, 45, 36, 36, 36, 36, 36,
+	36, 50, 51, 52, 36, 53, 54, 55,
+	36, 36, 36, 36, 42, 36, 37, 36,
+	36, 36, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 36, 42, 43, 44,
+	45, 36, 36, 36, 36, 36, 36, 36,
+	51, 52, 36, 53, 54, 55, 36, 36,
+	36, 36, 42, 36, 37, 36, 36, 36,
+	36, 36, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 42, 43, 44, 45, 36,
+	36, 36, 36, 36, 36, 36, 36, 52,
+	36, 53, 54, 55, 36, 36, 36, 36,
+	42, 36, 37, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 36, 36, 36, 36,
+	41, 42, 43, 44, 45, 36, 47, 41,
+	36, 36, 36, 50, 51, 52, 36, 53,
+	54, 55, 36, 36, 36, 36, 42, 36,
+	37, 36, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 36, 36, 41, 42,
+	43, 44, 45, 36, 60, 41, 36, 36,
+	36, 50, 51, 52, 36, 53, 54, 55,
+	36, 36, 36, 36, 42, 36, 37, 36,
+	36, 36, 36, 36, 36, 36, 36, 36,
+	36, 36, 36, 36, 41, 42, 43, 44,
+	45, 36, 36, 41, 36, 36, 36, 50,
+	51, 52, 36, 53, 54, 55, 36, 36,
+	36, 36, 42, 36, 37, 36, 36, 36,
+	36, 36, 36, 36, 36, 36, 36, 36,
+	36, 36, 41, 42, 43, 44, 45, 46,
+	47, 41, 36, 36, 36, 50, 51, 52,
+	36, 53, 54, 55, 36, 36, 36, 36,
+	42, 36, 37, 36, 36, 38, 1, 36,
+	36, 39, 36, 36, 36, 36, 36, 36,
+	41, 42, 43, 44, 45, 46, 47, 41,
+	48, 36, 49, 50, 51, 52, 36, 53,
+	54, 55, 36, 36, 36, 36, 56, 36,
+	38, 58, 58, 58, 58, 58, 58, 37,
+	58, 58, 58, 58, 58, 58, 59, 58,
+	58, 58, 58, 58, 58, 58, 42, 43,
+	44, 45, 58, 58, 58, 58, 58, 58,
+	58, 58, 58, 58, 53, 54, 55, 58,
+	37, 36, 36, 38, 1, 36, 36, 39,
+	36, 36, 36, 36, 36, 36, 41, 42,
+	43, 44, 45, 46, 47, 41, 48, 40,
+	49, 50, 51, 52, 36, 53, 54, 55,
+	36, 36, 36, 36, 56, 36, 62, 61,
+	61, 61, 61, 61, 61, 61, 63, 61,
+	10, 64, 62, 61, 11, 65, 65, 3,
+	6, 65, 65, 66, 65, 65, 65, 65,
+	65, 67, 16, 17, 18, 19, 20, 21,
+	22, 16, 23, 25, 25, 26, 27, 28,
+	65, 29, 30, 31, 65, 65, 65, 65,
+	33, 65, 11, 65, 65, 3, 6, 65,
+	65, 66, 65, 65, 65, 65, 65, 65,
+	16, 17, 18, 19, 20, 21, 22, 16, 
+	23, 25, 25, 26, 27, 28, 65, 29,
+	30, 31, 65, 65, 65, 65, 33, 65,
+	11, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 65, 65, 65, 65, 16, 17,
+	18, 19, 20, 65, 65, 65, 65, 65,
+	65, 26, 27, 28, 65, 29, 30, 31,
+	65, 65, 65, 65, 17, 65, 11, 65,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 65, 65, 65, 17, 18, 19,
+	20, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 65, 29, 30, 31, 65, 11,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 65, 65, 65, 65, 65, 18,
+	19, 20, 65, 11, 65, 65, 65, 65,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 65, 65, 19, 20, 65, 11,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 20, 65, 11, 65, 65, 65, 65,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 65, 18, 19, 20, 65, 65,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	29, 30, 31, 65, 11, 65, 65, 65,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 65, 65, 18, 19, 20, 65,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 30, 31, 65, 11, 65, 65,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 65, 65, 65, 18, 19, 20,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 65, 65, 31, 65, 11, 65,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 65, 65, 65, 17, 18, 19,
+	20, 65, 65, 65, 65, 65, 65, 26,
+	27, 28, 65, 29, 30, 31, 65, 65,
+	65, 65, 17, 65, 11, 65, 65, 65,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 65, 17, 18, 19, 20, 65,
+	65, 65, 65, 65, 65, 65, 27, 28,
+	65, 29, 30, 31, 65, 65, 65, 65,
+	17, 65, 11, 65, 65, 65, 65, 65,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 17, 18, 19, 20, 65, 65, 65,
+	65, 65, 65, 65, 65, 28, 65, 29,
+	30, 31, 65, 65, 65, 65, 17, 65,
+	11, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 65, 65, 65, 65, 16, 17,
+	18, 19, 20, 65, 22, 16, 65, 65,
+	65, 26, 27, 28, 65, 29, 30, 31,
+	65, 65, 65, 65, 17, 65, 11, 65,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 65, 65, 16, 17, 18, 19,
+	20, 65, 68, 16, 65, 65, 65, 26,
+	27, 28, 65, 29, 30, 31, 65, 65,
+	65, 65, 17, 65, 11, 65, 65, 65,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 16, 17, 18, 19, 20, 65,
+	65, 16, 65, 65, 65, 26, 27, 28,
+	65, 29, 30, 31, 65, 65, 65, 65,
+	17, 65, 11, 65, 65, 65, 65, 65,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	16, 17, 18, 19, 20, 21, 22, 16,
+	65, 65, 65, 26, 27, 28, 65, 29,
+	30, 31, 65, 65, 65, 65, 17, 65,
+	11, 65, 65, 3, 6, 65, 65, 66,
+	65, 65, 65, 65, 65, 65, 16, 17,
+	18, 19, 20, 21, 22, 16, 23, 65,
+	25, 26, 27, 28, 65, 29, 30, 31,
+	65, 65, 65, 65, 33, 65, 3, 65,
+	65, 65, 65, 65, 65, 11, 65, 65,
+	65, 65, 65, 65, 4, 65, 65, 65,
+	65, 65, 65, 65, 17, 18, 19, 20,
+	65, 65, 65, 65, 65, 65, 65, 65,
+	65, 65, 29, 30, 31, 65, 3, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 69, 4, 69, 6, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 69, 69, 69, 6, 69,
+	8, 65, 65, 65, 8, 65, 65, 11,
+	65, 65, 3, 6, 65, 65, 66, 65,
+	65, 65, 65, 65, 65, 16, 17, 18,
+	19, 20, 21, 22, 16, 23, 24, 25, 
+	26, 27, 28, 65, 29, 30, 31, 65,
+	65, 65, 65, 33, 65, 11, 65, 65,
+	3, 6, 65, 65, 66, 65, 65, 65,
+	65, 65, 65, 16, 17, 18, 19, 20,
+	21, 22, 16, 23, 24, 25, 26, 27,
+	28, 65, 29, 30, 31, 65, 65, 65,
+	65, 33, 65, 71, 70, 70, 70, 70,
+	70, 70, 70, 70, 70, 70, 70, 70,
+	70, 70, 70, 70, 70, 70, 70, 71,
+	72, 70, 71, 72, 70, 72, 70, 8,
+	69, 69, 69, 8, 69, 0
+};
+
+static const char _use_syllable_machine_trans_targs[] = {
+	4, 8, 4, 32, 2, 4, 1, 5,
+	6, 4, 29, 4, 51, 52, 53, 55,
+	34, 35, 36, 37, 38, 45, 46, 48,
+	54, 49, 42, 43, 44, 39, 40, 41,
+	58, 50, 4, 4, 4, 4, 7, 0,
+	28, 11, 12, 13, 14, 15, 22, 23,
+	25, 26, 19, 20, 21, 16, 17, 18,
+	27, 10, 4, 9, 24, 4, 30, 31,
+	4, 4, 3, 33, 47, 4, 4, 56,
+	57
+};
+
+static const char _use_syllable_machine_trans_actions[] = {
+	1, 0, 2, 3, 0, 4, 0, 0, 
+	7, 8, 0, 9, 10, 10, 3, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	3, 3, 0, 0, 0, 0, 0, 0, 
+	0, 3, 11, 12, 13, 14, 7, 0,
+	7, 0, 0, 0, 0, 0, 0, 0,
+	0, 7, 0, 0, 0, 0, 0, 0,
+	0, 7, 15, 0, 0, 16, 0, 0,
+	17, 18, 0, 3, 0, 19, 20, 0,
+	0
+};
+
+static const char _use_syllable_machine_to_state_actions[] = {
+	0, 0, 0, 0, 5, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0
+};
+
+static const char _use_syllable_machine_from_state_actions[] = {
+	0, 0, 0, 0, 6, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0
+};
+
+static const short _use_syllable_machine_eof_trans[] = {
+	1, 3, 3, 6, 0, 35, 37, 37,
+	59, 59, 37, 37, 37, 37, 37, 37,
+	37, 37, 37, 37, 37, 37, 37, 37,
+	37, 37, 37, 59, 37, 62, 65, 62,
+	66, 66, 66, 66, 66, 66, 66, 66,
+	66, 66, 66, 66, 66, 66, 66, 66,
+	66, 66, 66, 70, 70, 66, 66, 71,
+	71, 71, 70
+};
+
+static const int use_syllable_machine_start = 4;
+static const int use_syllable_machine_first_final = 4;
+static const int use_syllable_machine_error = -1;
+
+static const int use_syllable_machine_en_main = 4;
+
+
+#line 38 "hb-ot-shape-complex-use-machine.rl"
+
+
+
+#line 143 "hb-ot-shape-complex-use-machine.rl"
+
+
+#define found_syllable(syllable_type) \
+  HB_STMT_START { \
+    if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+    for (unsigned int i = ts; i < te; i++) \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
+    syllable_serial++; \
+    if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+  } HB_STMT_END
+
+static void
+find_syllables (hb_buffer_t *buffer)
+{
+  unsigned int p, pe, eof, ts, te, act;
+  int cs;
+  hb_glyph_info_t *info = buffer->info;
+  
+#line 378 "hb-ot-shape-complex-use-machine.hh"
+	{
+	cs = use_syllable_machine_start;
+	ts = 0;
+	te = 0;
+	act = 0;
+	}
+
+#line 163 "hb-ot-shape-complex-use-machine.rl"
+
+
+  p = 0;
+  pe = eof = buffer->len;
+
+  unsigned int syllable_serial = 1;
+  
+#line 394 "hb-ot-shape-complex-use-machine.hh"
+	{
+	int _slen;
+	int _trans;
+	const unsigned char *_keys;
+	const char *_inds;
+	if ( p == pe )
+		goto _test_eof;
+_resume:
+	switch ( _use_syllable_machine_from_state_actions[cs] ) {
+	case 6:
+#line 1 "NONE"
+	{ts = p;}
+	break;
+#line 408 "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] ?
+		( info[p].use_category()) - _keys[0] : _slen ];
+
+_eof_trans:
+	cs = _use_syllable_machine_trans_targs[_trans];
+
+	if ( _use_syllable_machine_trans_actions[_trans] == 0 )
+		goto _again;
+
+	switch ( _use_syllable_machine_trans_actions[_trans] ) {
+	case 7:
+#line 1 "NONE"
+	{te = p+1;}
+	break;
+	case 12:
+#line 132 "hb-ot-shape-complex-use-machine.rl"
+	{te = p+1;{ found_syllable (independent_cluster); }}
+	break;
+	case 14:
+#line 134 "hb-ot-shape-complex-use-machine.rl"
+	{te = p+1;{ found_syllable (standard_cluster); }}
+	break;
+	case 9:
+#line 138 "hb-ot-shape-complex-use-machine.rl"
+	{te = p+1;{ found_syllable (broken_cluster); }}
+	break;
+	case 8:
+#line 139 "hb-ot-shape-complex-use-machine.rl"
+	{te = p+1;{ found_syllable (non_cluster); }}
+	break;
+	case 11:
+#line 132 "hb-ot-shape-complex-use-machine.rl"
+	{te = p;p--;{ found_syllable (independent_cluster); }}
+	break;
+	case 15:
+#line 133 "hb-ot-shape-complex-use-machine.rl"
+	{te = p;p--;{ found_syllable (virama_terminated_cluster); }}
+	break;
+	case 13:
+#line 134 "hb-ot-shape-complex-use-machine.rl"
+	{te = p;p--;{ found_syllable (standard_cluster); }}
+	break;
+	case 17:
+#line 135 "hb-ot-shape-complex-use-machine.rl"
+	{te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
+	break;
+	case 16:
+#line 136 "hb-ot-shape-complex-use-machine.rl"
+	{te = p;p--;{ found_syllable (numeral_cluster); }}
+	break;
+	case 20:
+#line 137 "hb-ot-shape-complex-use-machine.rl"
+	{te = p;p--;{ found_syllable (symbol_cluster); }}
+	break;
+	case 18:
+#line 138 "hb-ot-shape-complex-use-machine.rl"
+	{te = p;p--;{ found_syllable (broken_cluster); }}
+	break;
+	case 19:
+#line 139 "hb-ot-shape-complex-use-machine.rl"
+	{te = p;p--;{ found_syllable (non_cluster); }}
+	break;
+	case 1:
+#line 134 "hb-ot-shape-complex-use-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (standard_cluster); }}
+	break;
+	case 4:
+#line 138 "hb-ot-shape-complex-use-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
+	break;
+	case 2:
+#line 1 "NONE"
+	{	switch( act ) {
+	case 7:
+	{{p = ((te))-1;} found_syllable (broken_cluster); }
+	break;
+	case 8:
+	{{p = ((te))-1;} found_syllable (non_cluster); }
+	break;
+	}
+	}
+	break;
+	case 3:
+#line 1 "NONE"
+	{te = p+1;}
+#line 138 "hb-ot-shape-complex-use-machine.rl"
+	{act = 7;}
+	break;
+	case 10:
+#line 1 "NONE"
+	{te = p+1;}
+#line 139 "hb-ot-shape-complex-use-machine.rl"
+	{act = 8;}
+	break;
+#line 510 "hb-ot-shape-complex-use-machine.hh"
+	}
+
+_again:
+	switch ( _use_syllable_machine_to_state_actions[cs] ) {
+	case 5:
+#line 1 "NONE"
+	{ts = 0;}
+	break;
+#line 519 "hb-ot-shape-complex-use-machine.hh"
+	}
+
+	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;
+	}
+	}
+
+	}
+
+#line 171 "hb-ot-shape-complex-use-machine.rl"
+
+}
+
+#undef found_syllable
+
+#endif /* HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use-machine.rl b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use-machine.rl
new file mode 100644
index 0000000..7702cd9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use-machine.rl
@@ -0,0 +1,176 @@
+/*
+ * Copyright © 2015  Mozilla Foundation.
+ * Copyright © 2015  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.
+ *
+ * Mozilla Author(s): Jonathan Kew
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
+
+#include "hb.hh"
+
+%%{
+  machine use_syllable_machine;
+  alphtype unsigned char;
+  write data;
+}%%
+
+%%{
+
+# Same order as enum use_category_t.  Not sure how to avoid duplication.
+
+O	= 0; # OTHER
+
+B	= 1; # BASE
+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
+SUB	= 11; # CONS_SUB
+H	= 12; # HALANT
+
+HN	= 13; # HALANT_NUM
+ZWNJ	= 14; # Zero width non-joiner
+ZWJ	= 15; # Zero width joiner
+WJ	= 16; # Word joiner
+Rsv	= 17; # Reserved characters
+R	= 18; # REPHA
+S	= 19; # SYM
+#SM	= 20; # SYM_MOD
+VS	= 21; # VARIATION_SELECTOR
+#V	= 36; # VOWEL
+#VM	= 40; # VOWEL_MOD
+
+FAbv	= 24; # CONS_FINAL_ABOVE
+FBlw	= 25; # CONS_FINAL_BELOW
+FPst	= 26; # CONS_FINAL_POST
+MAbv	= 27; # CONS_MED_ABOVE
+MBlw	= 28; # CONS_MED_BELOW
+MPst	= 29; # CONS_MED_POST
+MPre	= 30; # CONS_MED_PRE
+CMAbv	= 31; # CONS_MOD_ABOVE
+CMBlw	= 32; # CONS_MOD_BELOW
+VAbv	= 33; # VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST
+VBlw	= 34; # VOWEL_BELOW / VOWEL_BELOW_POST
+VPst	= 35; # VOWEL_POST	UIPC = Right
+VPre	= 22; # VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST
+VMAbv	= 37; # VOWEL_MOD_ABOVE
+VMBlw	= 38; # VOWEL_MOD_BELOW
+VMPst	= 39; # VOWEL_MOD_POST
+VMPre	= 23; # VOWEL_MOD_PRE
+SMAbv	= 41; # SYM_MOD_ABOVE
+SMBlw	= 42; # SYM_MOD_BELOW
+CS	= 43; # CONS_WITH_STACKER
+
+HVM	= 44; # HALANT_OR_VOWEL_MODIFIER
+
+h = H | HVM; # https://github.com/harfbuzz/harfbuzz/issues/1102
+
+# Override: Adhoc ZWJ placement. https://github.com/harfbuzz/harfbuzz/issues/542#issuecomment-353169729
+consonant_modifiers = CMAbv* CMBlw* ((ZWJ?.h.ZWJ? B | SUB) VS? CMAbv? CMBlw*)*;
+# Override: Allow two MBlw. https://github.com/harfbuzz/harfbuzz/issues/376
+medial_consonants = MPre? MAbv? MBlw?.MBlw? MPst?;
+dependent_vowels = VPre* VAbv* VBlw* VPst*;
+vowel_modifiers = HVM? VMPre* VMAbv* VMBlw* VMPst*;
+final_consonants = FAbv* FBlw* FPst* FM?;
+
+complex_syllable_tail =
+	consonant_modifiers
+	medial_consonants
+	dependent_vowels
+	vowel_modifiers
+	final_consonants
+;
+
+virama_terminated_cluster =
+	(R|CS)? (B | GB) VS?
+	consonant_modifiers
+	ZWJ?.h.ZWJ?
+;
+standard_cluster =
+	(R|CS)? (B | GB) VS?
+	complex_syllable_tail
+;
+broken_cluster =
+	R?
+	complex_syllable_tail
+;
+
+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); };
+	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", ts, te, #syllable_type); \
+    for (unsigned int i = ts; i < te; i++) \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
+    syllable_serial++; \
+    if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+  } HB_STMT_END
+
+static void
+find_syllables (hb_buffer_t *buffer)
+{
+  unsigned int p, pe, eof, ts, te, act;
+  int cs;
+  hb_glyph_info_t *info = buffer->info;
+  %%{
+    write init;
+    getkey info[p].use_category();
+  }%%
+
+  p = 0;
+  pe = eof = buffer->len;
+
+  unsigned int syllable_serial = 1;
+  %%{
+    write exec;
+  }%%
+}
+
+#undef found_syllable
+
+#endif /* HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use-table.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use-table.cc
new file mode 100644
index 0000000..835b95b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use-table.cc
@@ -0,0 +1,839 @@
+/* == 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-11.0.0.txt
+ * # Date: 2018-05-21, 18:33:00 GMT [KW, RP]
+ * # IndicPositionalCategory-11.0.0.txt
+ * # Date: 2018-02-05, 16:21:00 GMT [KW, RP]
+ * # Blocks-11.0.0.txt
+ * # Date: 2017-10-16, 24:39:00 GMT [KW]
+ * UnicodeData.txt does not have a header.
+ */
+
+#include "hb-ot-shape-complex-use.hh"
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-macros"
+#define B	USE_B	/* BASE */
+#define CGJ	USE_CGJ	/* CGJ */
+#define CS	USE_CS	/* CONS_WITH_STACKER */
+#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 HVM	USE_HVM	/* HALANT_OR_VOWEL_MODIFIER */
+#define IND	USE_IND	/* BASE_IND */
+#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 */
+#define ZWJ	USE_ZWJ	/* ZWJ */
+#define ZWNJ	USE_ZWNJ	/* ZWNJ */
+#define CMBlw	USE_CMBlw
+#define CMAbv	USE_CMAbv
+#define FBlw	USE_FBlw
+#define FPst	USE_FPst
+#define FAbv	USE_FAbv
+#define MPre	USE_MPre
+#define MBlw	USE_MBlw
+#define MPst	USE_MPst
+#define MAbv	USE_MAbv
+#define SMBlw	USE_SMBlw
+#define SMAbv	USE_SMAbv
+#define VPre	USE_VPre
+#define VBlw	USE_VBlw
+#define VPst	USE_VPst
+#define VAbv	USE_VAbv
+#define VMPre	USE_VMPre
+#define VMBlw	USE_VMBlw
+#define VMPst	USE_VMPst
+#define VMAbv	USE_VMAbv
+#pragma GCC diagnostic pop
+
+static const USE_TABLE_ELEMENT_TYPE use_table[] = {
+
+
+#define use_offset_0x0028u 0
+
+
+  /* Basic Latin */
+                                                                         O,     O,     O,     O,     O,    GB,     O,     O,
+  /* 0030 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x00a0u 24
+
+
+  /* Latin-1 Supplement */
+
+  /* 00A0 */    GB,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 00B0 */     O,     O,    FM,    FM,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 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_0x0348u 80
+
+
+  /* Combining Diacritical Marks */
+                                                                         O,     O,     O,     O,     O,     O,     O,   CGJ,
+
+#define use_offset_0x0900u 88
+
+
+  /* Devanagari */
+
+  /* 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 */     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 */    GB, 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,  VPst,  VPst,     H,   IND,     O,
+  /* 09D0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     B,     B,     O,     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,     B,     O,    FM,     O,
+
+  /* Gurmukhi */
+
+  /* 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, VMBlw,     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,     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 */     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, VMAbv, VMAbv, VMAbv, CMAbv, CMAbv, CMAbv,
+
+  /* Oriya */
+
+  /* 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,  VPst,     O,     O,  VPst,  VPst,     H,     O,     O,
+  /* 0B50 */     O,     O,     O,     O,     O,     O,  VAbv,  VAbv,     O,     O,     O,     O,     B,     B,     O,     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,     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,  VPst,  VPst,  VPst,     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, VMAbv,     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 */     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,     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 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0CF0 */     O,    CS,    CS,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Malayalam */
+
+  /* 0D00 */ VMAbv, 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,  VAbv,  VAbv,     B,  VPst,  VPst,
+  /* 0D40 */  VPst,  VPst,  VPst,  VBlw,  VBlw,     O,  VPre,  VPre,  VPre,     O,  VPst,  VPst,  VPst,     H,     R,     O,
+  /* 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,     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,  VPst,  VPre,  VPst,  VPst,  VPst,  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_0x0f18u 1360
+
+
+  /* Tibetan */
+                                                                      VBlw,  VBlw,     O,     O,     O,     O,     O,     O,
+  /* 0F20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0F30 */     B,     B,     B,     B,     O,    FM,     O,    FM,     O, CMAbv,     O,     O,     O,     O,  VPst,  VPre,
+  /* 0F40 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
+  /* 0F50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0F60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
+  /* 0F70 */     O,  VBlw,  VBlw,  VAbv,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw, VMAbv, VMPst,
+  /* 0F80 */  VBlw,  VAbv, VMAbv, VMAbv,  VBlw,   IND, VMAbv, VMAbv,     B,     B,     B,     B,     B,   SUB,   SUB,   SUB,
+  /* 0F90 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
+  /* 0FA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
+  /* 0FB0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,     O,     O,
+  /* 0FC0 */     O,     O,     O,     O,     O,     O,    FM,     O,
+
+#define use_offset_0x1000u 1536
+
+
+  /* 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,     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,    GB,     O,     O,    GB,     O,
+  /* 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 1696
+
+
+  /* Tagalog */
+
+  /* 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 */     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 */     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 */     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,     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,  VPst,  VPst,
+  /* 17C0 */  VPst,  VPre,  VPre,  VPre,  VPst,  VPst, 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 1936
+
+
+  /* Limbu */
+
+  /* 1900 */    GB,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,
+  /* 1920 */  VAbv,  VAbv,  VBlw,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,   SUB,   SUB,   SUB,     O,     O,     O,     O,
+  /* 1930 */  FPst,  FPst, VMBlw,  FPst,  FPst,  FPst,  FPst,  FPst,  FPst,  FBlw,  VAbv,    FM,     O,     O,     O,     O,
+  /* 1940 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+
+  /* Tai Le */
+
+  /* 1950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1960 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,
+  /* 1970 */     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* New Tai Lue */
+
+  /* 1980 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1990 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 19A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
+  /* 19B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 19C0 */     B,     B,     B,     B,     B,     B,     B,     B, VMPst, VMPst,     O,     O,     O,     O,     O,     O,
+  /* 19D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+  /* 19E0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 19F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Buginese */
+
+  /* 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,     B,     B,     B,
+  /* 1A50 */     B,     B,     B,     B,     B,  MPre,  MBlw,   SUB,  FAbv,  FAbv,  FAbv,   SUB,   SUB,   SUB,   SUB,     O,
+  /* 1A60 */     H,  VPst,  VAbv,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VAbv,  VBlw,  VPst,  VPre,  VPre,
+  /* 1A70 */  VPre,  VPre,  VPre,  VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,  VAbv,    FM,    FM,     O,     O,  FBlw,
+  /* 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 2352
+
+
+  /* Balinese */
+
+  /* 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 */  VPst,  VPst,  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,     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,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VAbv,  VPst,  VAbv,
+  /* 1BF0 */  FAbv,  FAbv, CMBlw, CMBlw,     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,  VPst,  VPst,  VPst,  VBlw,  FAbv,  FAbv,  FAbv,
+  /* 1C30 */  FAbv,  FAbv,  FAbv,  FAbv, VMPre, VMPre,    FM, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 1C40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,
+
+#define use_offset_0x1cd0u 2688
+
+
+  /* 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,    CS,    CS, VMPst, VMAbv, VMAbv,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x1df8u 2736
+
+
+  /* Combining Diacritical Marks Supplement */
+                                                                         O,     O,     O,    FM,     O,     O,     O,     O,
+
+#define use_offset_0x2008u 2744
+
+
+  /* General Punctuation */
+                                                                         O,     O,     O,     O,  ZWNJ,   ZWJ,     O,     O,
+  /* 2010 */    GB,    GB,    GB,    GB,    GB,     O,     O,     O,
+
+#define use_offset_0x2060u 2760
+
+  /* 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_0x20f0u 2800
+
+
+  /* Combining Diacritical Marks for Symbols */
+
+  /* 20F0 */ VMAbv,     O,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x25c8u 2808
+
+
+  /* Geometric Shapes */
+                                                                         O,     O,     O,     O,    GB,     O,     O,     O,
+
+#define use_offset_0xa800u 2816
+
+
+  /* Syloti Nagri */
+
+  /* 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,     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,  MPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,
+  /* 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,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,  VAbv,
+
+  /* Kayah Li */
+
+  /* A900 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A920 */     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VAbv,  VAbv, VMBlw, VMBlw, VMBlw,     O,     O,
+
+  /* Rejang */
+
+  /* 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,     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,  MBlw,
+  /* 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 */     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, VMAbv,  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,    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 */     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 3576
+
+
+  /* Meetei Mayek */
+
+  /* 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 3640
+
+
+  /* Variation Selectors */
+
+  /* FE00 */    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,
+
+#define use_offset_0x10a00u 3656
+
+
+  /* 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,     B,     B,     O,     O, CMAbv, CMBlw, CMBlw,     O,     O,     O,     O,     H,
+  /* 10A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x11000u 3736
+
+
+  /* Brahmi */
+
+  /* 11000 */ VMPst, VMAbv, VMPst,    CS,    CS,     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,   HVM,     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,    HN,
+
+  /* Kaithi */
+
+  /* 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 3928
+
+
+  /* Chakma */
+
+  /* 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,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VBlw,  VAbv,  VAbv,
+  /* 11130 */  VBlw,  VAbv,  VAbv,     H, CMBlw,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11140 */     O,     O,     O,     O,     B,  VPst,  VPst,     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,     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,    GB,  FBlw, 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 */     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,     O,     O,     O,     O,     O,     O, VMAbv,     O,
+
+#define use_offset_0x11280u 4248
+
+
+  /* Multani */
+
+  /* 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 */     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, VMAbv, 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, CMBlw, CMBlw,     B,  VPst,  VPst,
+  /* 11340 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,     O,  VPre,  VPre,     O,     O,  VPst,  VPst,   HVM,     O,     O,
+  /* 11350 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     B,     B,
+  /* 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_0x11400u 4496
+
+
+  /* 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,    FM,     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,     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,  VPst,  VPst,  VPst,  VPst, 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 4720
+
+
+  /* Siddham */
+
+  /* 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,  VPst,  VPst,  VPst, 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,     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 */     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 */     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,     B,     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,
+
+#define use_offset_0x11800u 5168
+
+
+  /* Dogra */
+
+  /* 11800 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11810 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11820 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,
+  /* 11830 */  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMPst,     H, CMBlw,     O,     O,     O,     O,     O,
+
+#define use_offset_0x11a00u 5232
+
+
+  /* Zanabazar Square */
+
+  /* 11A00 */     B,  VAbv,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,     B,     B,     B,     B,     B,
+  /* 11A10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11A30 */     B,     B,     B,    FM,  VBlw, VMAbv, VMAbv, VMAbv, VMAbv, VMPst,     R,  MBlw,  MBlw,  MBlw,  MBlw,    GB,
+  /* 11A40 */     O,     O,     O,     O,     O,    GB,     O,     H,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Soyombo */
+
+  /* 11A50 */     B,  VAbv,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VPst,  VPst,  VBlw,  VBlw,  VBlw,     B,     B,     B,     B,
+  /* 11A60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11A70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11A80 */     B,     B,     B,     B,     O,     O,     R,     R,     R,     R,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,
+  /* 11A90 */  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw, VMAbv, VMPst, CMAbv,     H,     O,     O,     O,     B,     O,     O,
+
+#define use_offset_0x11c00u 5392
+
+
+  /* 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,    GB,    GB,     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,
+
+#define use_offset_0x11d00u 5576
+
+
+  /* Masaram Gondi */
+
+  /* 11D00 */     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,
+  /* 11D10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11D20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11D30 */     B,  VAbv,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,     O,     O,     O,  VAbv,     O,  VAbv,  VAbv,     O,  VAbv,
+  /* 11D40 */ VMAbv, VMAbv, CMBlw,  VAbv,  VBlw,     H,     R,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11D50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+  /* Gunjala Gondi */
+
+  /* 11D60 */     B,     B,     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 11D70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11D80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VPst,  VPst,     O,
+  /* 11D90 */  VAbv,  VAbv,     O,  VPst,  VPst, VMAbv, VMPst,     H,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x11ee0u 5752
+
+
+  /* Makasar */
+
+  /* 11EE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11EF0 */     B,     B,    GB,  VAbv,  VBlw,  VPre,  VPst,     O,
+
+}; /* Table items: 5776; occupancy: 74% */
+
+USE_TABLE_ELEMENT_TYPE
+hb_use_get_category (hb_codepoint_t u)
+{
+  switch (u >> 12)
+  {
+    case 0x0u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return use_table[u - 0x0028u + use_offset_0x0028u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x00A0u, 0x00D7u)) return use_table[u - 0x00A0u + use_offset_0x00a0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0348u, 0x034Fu)) return use_table[u - 0x0348u + use_offset_0x0348u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return use_table[u - 0x0900u + use_offset_0x0900u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0F18u, 0x0FC7u)) return use_table[u - 0x0F18u + use_offset_0x0f18u];
+      break;
+
+    case 0x1u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x1000u, 0x109Fu)) return use_table[u - 0x1000u + use_offset_0x1000u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1700u, 0x17EFu)) return use_table[u - 0x1700u + use_offset_0x1700u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1900u, 0x1A9Fu)) return use_table[u - 0x1900u + use_offset_0x1900u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1B00u, 0x1C4Fu)) return use_table[u - 0x1B00u + use_offset_0x1b00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1CD0u, 0x1CFFu)) return use_table[u - 0x1CD0u + use_offset_0x1cd0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1DF8u, 0x1DFFu)) return use_table[u - 0x1DF8u + use_offset_0x1df8u];
+      break;
+
+    case 0x2u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return use_table[u - 0x2008u + use_offset_0x2008u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x2060u, 0x2087u)) return use_table[u - 0x2060u + use_offset_0x2060u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x20F0u, 0x20F7u)) return use_table[u - 0x20F0u + use_offset_0x20f0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x25C8u, 0x25CFu)) return use_table[u - 0x25C8u + use_offset_0x25c8u];
+      break;
+
+    case 0xAu:
+      if (hb_in_range<hb_codepoint_t> (u, 0xA800u, 0xAAF7u)) return use_table[u - 0xA800u + use_offset_0xa800u];
+      if (hb_in_range<hb_codepoint_t> (u, 0xABC0u, 0xABFFu)) return use_table[u - 0xABC0u + use_offset_0xabc0u];
+      break;
+
+    case 0xFu:
+      if (hb_in_range<hb_codepoint_t> (u, 0xFE00u, 0xFE0Fu)) return use_table[u - 0xFE00u + use_offset_0xfe00u];
+      break;
+
+    case 0x10u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x10A00u, 0x10A4Fu)) return use_table[u - 0x10A00u + use_offset_0x10a00u];
+      break;
+
+    case 0x11u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x11000u, 0x110BFu)) return use_table[u - 0x11000u + use_offset_0x11000u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11100u, 0x1123Fu)) return use_table[u - 0x11100u + use_offset_0x11100u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11280u, 0x11377u)) return use_table[u - 0x11280u + use_offset_0x11280u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11580u, 0x1173Fu)) return use_table[u - 0x11580u + use_offset_0x11580u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11800u, 0x1183Fu)) return use_table[u - 0x11800u + use_offset_0x11800u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11A00u, 0x11A9Fu)) return use_table[u - 0x11A00u + use_offset_0x11a00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11C00u, 0x11CB7u)) return use_table[u - 0x11C00u + use_offset_0x11c00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11D00u, 0x11DAFu)) return use_table[u - 0x11D00u + use_offset_0x11d00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11EE0u, 0x11EF7u)) return use_table[u - 0x11EE0u + use_offset_0x11ee0u];
+      break;
+
+    default:
+      break;
+  }
+  return USE_O;
+}
+
+#undef B
+#undef CGJ
+#undef CS
+#undef FM
+#undef GB
+#undef H
+#undef HN
+#undef HVM
+#undef IND
+#undef N
+#undef O
+#undef R
+#undef Rsv
+#undef S
+#undef SUB
+#undef VS
+#undef WJ
+#undef ZWJ
+#undef ZWNJ
+#undef CMBlw
+#undef CMAbv
+#undef FBlw
+#undef FPst
+#undef FAbv
+#undef MPre
+#undef MBlw
+#undef MPst
+#undef MAbv
+#undef SMBlw
+#undef SMAbv
+#undef VPre
+#undef VBlw
+#undef VPst
+#undef VAbv
+#undef VMPre
+#undef VMBlw
+#undef VMPst
+#undef VMAbv
+
+/* == End of generated table == */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use.cc
new file mode 100644
index 0000000..2e3f202
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use.cc
@@ -0,0 +1,639 @@
+/*
+ * Copyright © 2015  Mozilla Foundation.
+ * Copyright © 2015  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.
+ *
+ * Mozilla Author(s): Jonathan Kew
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-ot-shape-complex-use.hh"
+#include "hb-ot-shape-complex-arabic.hh"
+#include "hb-ot-shape-complex-vowel-constraints.hh"
+
+/* buffer var allocations */
+#define use_category() complex_var_u8_0()
+
+
+/*
+ * Universal Shaping Engine.
+ * https://docs.microsoft.com/en-us/typography/script-development/use
+ */
+
+static const hb_tag_t
+basic_features[] =
+{
+  /*
+   * Basic features.
+   * These features are applied all at once, before reordering.
+   */
+  HB_TAG('r','k','r','f'),
+  HB_TAG('a','b','v','f'),
+  HB_TAG('b','l','w','f'),
+  HB_TAG('h','a','l','f'),
+  HB_TAG('p','s','t','f'),
+  HB_TAG('v','a','t','u'),
+  HB_TAG('c','j','c','t'),
+};
+static const hb_tag_t
+arabic_features[] =
+{
+  HB_TAG('i','s','o','l'),
+  HB_TAG('i','n','i','t'),
+  HB_TAG('m','e','d','i'),
+  HB_TAG('f','i','n','a'),
+  /* The spec doesn't specify these but we apply anyway, since our Arabic shaper
+   * does.  These are only used in Syriac spec. */
+  HB_TAG('m','e','d','2'),
+  HB_TAG('f','i','n','2'),
+  HB_TAG('f','i','n','3'),
+};
+/* Same order as arabic_features.  Don't need Syriac stuff.*/
+enum joining_form_t {
+  ISOL,
+  INIT,
+  MEDI,
+  FINA,
+  _NONE
+};
+static const hb_tag_t
+other_features[] =
+{
+  /*
+   * Other features.
+   * These features are applied all at once, after reordering and
+   * clearing syllables.
+   */
+  HB_TAG('a','b','v','s'),
+  HB_TAG('b','l','w','s'),
+  HB_TAG('h','a','l','n'),
+  HB_TAG('p','r','e','s'),
+  HB_TAG('p','s','t','s'),
+};
+static const hb_tag_t
+positioning_features[] =
+{
+  /*
+   * Positioning features.
+   * We don't care about the types.
+   */
+  HB_TAG('d','i','s','t'),
+  HB_TAG('a','b','v','m'),
+  HB_TAG('b','l','w','m'),
+};
+
+static void
+setup_syllables (const hb_ot_shape_plan_t *plan,
+		 hb_font_t *font,
+		 hb_buffer_t *buffer);
+static void
+clear_substitution_flags (const hb_ot_shape_plan_t *plan,
+			  hb_font_t *font,
+			  hb_buffer_t *buffer);
+static void
+record_rphf (const hb_ot_shape_plan_t *plan,
+	     hb_font_t *font,
+	     hb_buffer_t *buffer);
+static void
+record_pref (const hb_ot_shape_plan_t *plan,
+	     hb_font_t *font,
+	     hb_buffer_t *buffer);
+static void
+reorder (const hb_ot_shape_plan_t *plan,
+	 hb_font_t *font,
+	 hb_buffer_t *buffer);
+static void
+clear_syllables (const hb_ot_shape_plan_t *plan,
+		 hb_font_t *font,
+		 hb_buffer_t *buffer);
+
+static void
+collect_features_use (hb_ot_shape_planner_t *plan)
+{
+  hb_ot_map_builder_t *map = &plan->map;
+
+  /* Do this before any lookups have been applied. */
+  map->add_gsub_pause (setup_syllables);
+
+  /* "Default glyph pre-processing group" */
+  map->enable_feature (HB_TAG('l','o','c','l'));
+  map->enable_feature (HB_TAG('c','c','m','p'));
+  map->enable_feature (HB_TAG('n','u','k','t'));
+  map->enable_feature (HB_TAG('a','k','h','n'), F_MANUAL_ZWJ);
+
+  /* "Reordering group" */
+  map->add_gsub_pause (clear_substitution_flags);
+  map->add_feature (HB_TAG('r','p','h','f'), F_MANUAL_ZWJ);
+  map->add_gsub_pause (record_rphf);
+  map->add_gsub_pause (clear_substitution_flags);
+  map->enable_feature (HB_TAG('p','r','e','f'), F_MANUAL_ZWJ);
+  map->add_gsub_pause (record_pref);
+
+  /* "Orthographic unit shaping group" */
+  for (unsigned int i = 0; i < ARRAY_LENGTH (basic_features); i++)
+    map->enable_feature (basic_features[i], F_MANUAL_ZWJ);
+
+  map->add_gsub_pause (reorder);
+  map->add_gsub_pause (clear_syllables);
+
+  /* "Topographical features" */
+  for (unsigned int i = 0; i < ARRAY_LENGTH (arabic_features); i++)
+    map->add_feature (arabic_features[i]);
+  map->add_gsub_pause (nullptr);
+
+  /* "Standard typographic presentation" */
+  for (unsigned int i = 0; i < ARRAY_LENGTH (other_features); i++)
+    map->enable_feature (other_features[i], F_MANUAL_ZWJ);
+
+  /* "Positional feature application" */
+  for (unsigned int i = 0; i < ARRAY_LENGTH (positioning_features); i++)
+    map->enable_feature (positioning_features[i]);
+}
+
+struct use_shape_plan_t
+{
+  hb_mask_t rphf_mask;
+
+  arabic_shape_plan_t *arabic_plan;
+};
+
+static bool
+has_arabic_joining (hb_script_t script)
+{
+  /* List of scripts that have data in arabic-table. */
+  switch ((int) script)
+  {
+    /* Unicode-1.1 additions */
+    case HB_SCRIPT_ARABIC:
+
+    /* Unicode-3.0 additions */
+    case HB_SCRIPT_MONGOLIAN:
+    case HB_SCRIPT_SYRIAC:
+
+    /* Unicode-5.0 additions */
+    case HB_SCRIPT_NKO:
+    case HB_SCRIPT_PHAGS_PA:
+
+    /* 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 *
+data_create_use (const hb_ot_shape_plan_t *plan)
+{
+  use_shape_plan_t *use_plan = (use_shape_plan_t *) calloc (1, sizeof (use_shape_plan_t));
+  if (unlikely (!use_plan))
+    return nullptr;
+
+  use_plan->rphf_mask = plan->map.get_1_mask (HB_TAG('r','p','h','f'));
+
+  if (has_arabic_joining (plan->props.script))
+  {
+    use_plan->arabic_plan = (arabic_shape_plan_t *) data_create_arabic (plan);
+    if (unlikely (!use_plan->arabic_plan))
+    {
+      free (use_plan);
+      return nullptr;
+    }
+  }
+
+  return use_plan;
+}
+
+static void
+data_destroy_use (void *data)
+{
+  use_shape_plan_t *use_plan = (use_shape_plan_t *) data;
+
+  if (use_plan->arabic_plan)
+    data_destroy_arabic (use_plan->arabic_plan);
+
+  free (data);
+}
+
+enum syllable_type_t {
+  independent_cluster,
+  virama_terminated_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,
+		 hb_font_t                *font HB_UNUSED)
+{
+  const use_shape_plan_t *use_plan = (const use_shape_plan_t *) plan->data;
+
+  /* Do this before allocating use_category(). */
+  if (use_plan->arabic_plan)
+  {
+    setup_masks_arabic_plan (use_plan->arabic_plan, buffer, plan->props.script);
+  }
+
+  HB_BUFFER_ALLOCATE_VAR (buffer, use_category);
+
+  /* We cannot setup masks here.  We save information about characters
+   * and setup masks later on in a pause-callback. */
+
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    info[i].use_category() = hb_use_get_category (info[i].codepoint);
+}
+
+static void
+setup_rphf_mask (const hb_ot_shape_plan_t *plan,
+		 hb_buffer_t *buffer)
+{
+  const use_shape_plan_t *use_plan = (const use_shape_plan_t *) plan->data;
+
+  hb_mask_t mask = use_plan->rphf_mask;
+  if (!mask) return;
+
+  hb_glyph_info_t *info = buffer->info;
+
+  foreach_syllable (buffer, start, end)
+  {
+    unsigned int limit = info[start].use_category() == USE_R ? 1 : MIN (3u, end - start);
+    for (unsigned int i = start; i < start + limit; i++)
+      info[i].mask |= mask;
+  }
+}
+
+static void
+setup_topographical_masks (const hb_ot_shape_plan_t *plan,
+			   hb_buffer_t *buffer)
+{
+  const use_shape_plan_t *use_plan = (const use_shape_plan_t *) plan->data;
+  if (use_plan->arabic_plan)
+    return;
+
+  static_assert ((INIT < 4 && ISOL < 4 && MEDI < 4 && FINA < 4), "");
+  hb_mask_t masks[4], all_masks = 0;
+  for (unsigned int i = 0; i < 4; i++)
+  {
+    masks[i] = plan->map.get_1_mask (arabic_features[i]);
+    if (masks[i] == plan->map.get_global_mask ())
+      masks[i] = 0;
+    all_masks |= masks[i];
+  }
+  if (!all_masks)
+    return;
+  hb_mask_t other_masks = ~all_masks;
+
+  unsigned int last_start = 0;
+  joining_form_t last_form = _NONE;
+  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 standard_cluster:
+      case number_joiner_terminated_cluster:
+      case numeral_cluster:
+      case broken_cluster:
+
+	bool join = last_form == FINA || last_form == ISOL;
+
+	if (join)
+	{
+	  /* Fixup previous syllable's form. */
+	  last_form = last_form == FINA ? MEDI : INIT;
+	  for (unsigned int i = last_start; i < start; i++)
+	    info[i].mask = (info[i].mask & other_masks) | masks[last_form];
+	}
+
+	/* Form for this syllable. */
+	last_form = join ? FINA : ISOL;
+	for (unsigned int i = start; i < end; i++)
+	  info[i].mask = (info[i].mask & other_masks) | masks[last_form];
+
+	break;
+    }
+
+    last_start = start;
+  }
+}
+
+static void
+setup_syllables (const hb_ot_shape_plan_t *plan,
+		 hb_font_t *font HB_UNUSED,
+		 hb_buffer_t *buffer)
+{
+  find_syllables (buffer);
+  foreach_syllable (buffer, start, end)
+    buffer->unsafe_to_break (start, end);
+  setup_rphf_mask (plan, buffer);
+  setup_topographical_masks (plan, buffer);
+}
+
+static void
+clear_substitution_flags (const hb_ot_shape_plan_t *plan HB_UNUSED,
+			  hb_font_t *font HB_UNUSED,
+			  hb_buffer_t *buffer)
+{
+  hb_glyph_info_t *info = buffer->info;
+  unsigned int count = buffer->len;
+  for (unsigned int i = 0; i < count; i++)
+    _hb_glyph_info_clear_substituted (&info[i]);
+}
+
+static void
+record_rphf (const hb_ot_shape_plan_t *plan,
+	     hb_font_t *font HB_UNUSED,
+	     hb_buffer_t *buffer)
+{
+  const use_shape_plan_t *use_plan = (const use_shape_plan_t *) plan->data;
+
+  hb_mask_t mask = use_plan->rphf_mask;
+  if (!mask) return;
+  hb_glyph_info_t *info = buffer->info;
+
+  foreach_syllable (buffer, start, end)
+  {
+    /* Mark a substituted repha as USE_R. */
+    for (unsigned int i = start; i < end && (info[i].mask & mask); i++)
+      if (_hb_glyph_info_substituted (&info[i]))
+      {
+	info[i].use_category() = USE_R;
+	break;
+      }
+  }
+}
+
+static void
+record_pref (const hb_ot_shape_plan_t *plan HB_UNUSED,
+	     hb_font_t *font HB_UNUSED,
+	     hb_buffer_t *buffer)
+{
+  hb_glyph_info_t *info = buffer->info;
+
+  foreach_syllable (buffer, start, end)
+  {
+    /* Mark a substituted pref as VPre, as they behave the same way. */
+    for (unsigned int i = start; i < end; i++)
+      if (_hb_glyph_info_substituted (&info[i]))
+      {
+	info[i].use_category() = USE_VPre;
+	break;
+      }
+  }
+}
+
+static inline bool
+is_halant (const hb_glyph_info_t &info)
+{
+  return (info.use_category() == USE_H || info.use_category() == USE_HVM) &&
+	 !_hb_glyph_info_ligated (&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_UNSAFE (syllable_type) &
+		  (FLAG (virama_terminated_cluster) |
+		   FLAG (standard_cluster) |
+		   FLAG (broken_cluster) |
+		   0))))
+    return;
+
+  hb_glyph_info_t *info = buffer->info;
+
+#define POST_BASE_FLAGS64 (FLAG64 (USE_FM) | \
+			   FLAG64 (USE_FAbv) | \
+			   FLAG64 (USE_FBlw) | \
+			   FLAG64 (USE_FPst) | \
+			   FLAG64 (USE_MAbv) | \
+			   FLAG64 (USE_MBlw) | \
+			   FLAG64 (USE_MPst) | \
+			   FLAG64 (USE_MPre) | \
+			   FLAG64 (USE_VAbv) | \
+			   FLAG64 (USE_VBlw) | \
+			   FLAG64 (USE_VPst) | \
+			   FLAG64 (USE_VPre) | \
+			   FLAG64 (USE_VMAbv) | \
+			   FLAG64 (USE_VMBlw) | \
+			   FLAG64 (USE_VMPst) | \
+			   FLAG64 (USE_VMPre))
+
+  /* Move things forward. */
+  if (info[start].use_category() == USE_R && end - start > 1)
+  {
+    /* Got a repha.  Reorder it towards the end, but before the first post-base
+     * glyph. */
+    for (unsigned int i = start + 1; i < end; i++)
+    {
+      bool is_post_base_glyph = (FLAG64_UNSAFE (info[i].use_category()) & POST_BASE_FLAGS64) ||
+				is_halant (info[i]);
+      if (is_post_base_glyph || i == end - 1)
+      {
+	/* If we hit a post-base glyph, move before it; otherwise move to the
+	 * end. Shift things in between backward. */
+
+	if (is_post_base_glyph)
+	  i--;
+
+	buffer->merge_clusters (start, i + 1);
+	hb_glyph_info_t t = info[start];
+	memmove (&info[start], &info[start + 1], (i - start) * sizeof (info[0]));
+	info[i] = t;
+
+	break;
+      }
+    }
+  }
+
+  /* Move things back. */
+  unsigned int j = start;
+  for (unsigned int i = start; i < end; i++)
+  {
+    uint32_t flag = FLAG_UNSAFE (info[i].use_category());
+    if (is_halant (info[i]))
+    {
+      /* If we hit a halant, move after it; otherwise move to the beginning, and
+       * shift things in between forward. */
+      j = i + 1;
+    }
+    else if (((flag) & (FLAG (USE_VPre) | FLAG (USE_VMPre))) &&
+	     /* Only move the first component of a MultipleSubst. */
+	     0 == _hb_glyph_info_get_lig_comp (&info[i]) &&
+	     j < i)
+    {
+      buffer->merge_clusters (j, i + 1);
+      hb_glyph_info_t t = info[i];
+      memmove (&info[j + 1], &info[j], (i - j) * sizeof (info[0]));
+      info[j] = t;
+    }
+  }
+}
+
+static inline void
+insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		       hb_font_t *font,
+		       hb_buffer_t *buffer)
+{
+  /* Note: This loop is extra overhead, but should not be measurable. */
+  bool has_broken_syllables = false;
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    if ((info[i].syllable() & 0x0F) == broken_cluster)
+    {
+      has_broken_syllables = true;
+      break;
+    }
+  if (likely (!has_broken_syllables))
+    return;
+
+  hb_glyph_info_t dottedcircle = {0};
+  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle.codepoint))
+    return;
+  dottedcircle.use_category() = hb_use_get_category (0x25CC);
+
+  buffer->clear_output ();
+
+  buffer->idx = 0;
+  unsigned int last_syllable = 0;
+  while (buffer->idx < buffer->len && buffer->successful)
+  {
+    unsigned int syllable = buffer->cur().syllable();
+    syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
+    if (unlikely (last_syllable != syllable && syllable_type == broken_cluster))
+    {
+      last_syllable = syllable;
+
+      hb_glyph_info_t ginfo = dottedcircle;
+      ginfo.cluster = buffer->cur().cluster;
+      ginfo.mask = buffer->cur().mask;
+      ginfo.syllable() = buffer->cur().syllable();
+      /* TODO Set glyph_props? */
+
+      /* Insert dottedcircle after possible Repha. */
+      while (buffer->idx < buffer->len && buffer->successful &&
+	     last_syllable == buffer->cur().syllable() &&
+	     buffer->cur().use_category() == USE_R)
+        buffer->next_glyph ();
+
+      buffer->output_info (ginfo);
+    }
+    else
+      buffer->next_glyph ();
+  }
+  buffer->swap_buffers ();
+}
+
+static void
+reorder (const hb_ot_shape_plan_t *plan,
+	 hb_font_t *font,
+	 hb_buffer_t *buffer)
+{
+  insert_dotted_circles (plan, font, buffer);
+
+  foreach_syllable (buffer, start, end)
+    reorder_syllable (buffer, start, end);
+
+  HB_BUFFER_DEALLOCATE_VAR (buffer, use_category);
+}
+
+static void
+clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		 hb_font_t *font HB_UNUSED,
+		 hb_buffer_t *buffer)
+{
+  hb_glyph_info_t *info = buffer->info;
+  unsigned int count = buffer->len;
+  for (unsigned int i = 0; i < count; i++)
+    info[i].syllable() = 0;
+}
+
+
+static void
+preprocess_text_use (const hb_ot_shape_plan_t *plan,
+		     hb_buffer_t              *buffer,
+		     hb_font_t                *font)
+{
+  _hb_preprocess_text_vowel_constraints (plan, buffer, font);
+}
+
+static bool
+compose_use (const hb_ot_shape_normalize_context_t *c,
+	     hb_codepoint_t  a,
+	     hb_codepoint_t  b,
+	     hb_codepoint_t *ab)
+{
+  /* Avoid recomposing split matras. */
+  if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (c->unicode->general_category (a)))
+    return false;
+
+  return (bool)c->unicode->compose (a, b, ab);
+}
+
+
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_use =
+{
+  collect_features_use,
+  nullptr, /* override_features */
+  data_create_use,
+  data_destroy_use,
+  preprocess_text_use,
+  nullptr, /* postprocess_glyphs */
+  HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
+  nullptr, /* decompose */
+  compose_use,
+  setup_masks_use,
+  HB_TAG_NONE, /* gpos_tag */
+  nullptr, /* reorder_marks */
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
+  false, /* fallback_position */
+};
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use.hh
new file mode 100644
index 0000000..ab56e1b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-use.hh
@@ -0,0 +1,100 @@
+/*
+ * Copyright © 2015  Mozilla Foundation.
+ * Copyright © 2015  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.
+ *
+ * Mozilla Author(s): Jonathan Kew
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_USE_HH
+#define HB_OT_SHAPE_COMPLEX_USE_HH
+
+#include "hb.hh"
+
+
+#include "hb-ot-shape-complex.hh"
+
+
+#define USE_TABLE_ELEMENT_TYPE uint8_t
+
+/* Cateories used in the Universal Shaping Engine spec:
+ * https://docs.microsoft.com/en-us/typography/script-development/use
+ */
+/* 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_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 */
+  USE_SUB	= 11,	/* CONS_SUB */
+  USE_H		= 12,	/* HALANT */
+
+  USE_HN	= 13,	/* HALANT_NUM */
+  USE_ZWNJ	= 14,	/* Zero width non-joiner */
+  USE_ZWJ	= 15,	/* Zero width joiner */
+  USE_WJ	= 16,	/* Word joiner */
+  USE_Rsv	= 17,	/* Reserved characters */
+  USE_R		= 18,	/* REPHA */
+  USE_S		= 19,	/* SYM */
+//  USE_SM	= 20,	/* SYM_MOD */
+  USE_VS	= 21,	/* VARIATION_SELECTOR */
+//  USE_V	= 36,	/* VOWEL */
+//  USE_VM	= 40,	/* VOWEL_MOD */
+
+  USE_FAbv	= 24,	/* CONS_FINAL_ABOVE */
+  USE_FBlw	= 25,	/* CONS_FINAL_BELOW */
+  USE_FPst	= 26,	/* CONS_FINAL_POST */
+  USE_MAbv	= 27,	/* CONS_MED_ABOVE */
+  USE_MBlw	= 28,	/* CONS_MED_BELOW */
+  USE_MPst	= 29,	/* CONS_MED_POST */
+  USE_MPre	= 30,	/* CONS_MED_PRE */
+  USE_CMAbv	= 31,	/* CONS_MOD_ABOVE */
+  USE_CMBlw	= 32,	/* CONS_MOD_BELOW */
+  USE_VAbv	= 33,	/* VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST */
+  USE_VBlw	= 34,	/* VOWEL_BELOW / VOWEL_BELOW_POST */
+  USE_VPst	= 35,	/* VOWEL_POST	UIPC = Right */
+  USE_VPre	= 22,	/* VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST */
+  USE_VMAbv	= 37,	/* VOWEL_MOD_ABOVE */
+  USE_VMBlw	= 38,	/* VOWEL_MOD_BELOW */
+  USE_VMPst	= 39,	/* VOWEL_MOD_POST */
+  USE_VMPre	= 23,	/* VOWEL_MOD_PRE */
+  USE_SMAbv	= 41,	/* SYM_MOD_ABOVE */
+  USE_SMBlw	= 42,	/* SYM_MOD_BELOW */
+  USE_CS	= 43,	/* CONS_WITH_STACKER */
+
+  /* https://github.com/harfbuzz/harfbuzz/issues/1102 */
+  USE_HVM	= 44,	/* HALANT_OR_VOWEL_MODIFIER */
+};
+
+HB_INTERNAL USE_TABLE_ELEMENT_TYPE
+hb_use_get_category (hb_codepoint_t u);
+
+#endif /* HB_OT_SHAPE_COMPLEX_USE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-vowel-constraints.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-vowel-constraints.cc
new file mode 100644
index 0000000..0e53258
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-vowel-constraints.cc
@@ -0,0 +1,437 @@
+/* == Start of generated functions == */
+/*
+ * The following functions are generated by running:
+ *
+ *   ./gen-vowel-constraints.py use Scripts.txt
+ *
+ * on files with these headers:
+ *
+ * # Copied from https://docs.microsoft.com/en-us/typography/script-development/use
+ * # On October 23, 2018; with documentd dated 02/07/2018.
+ *
+ * # Scripts-11.0.0.txt
+ * # Date: 2018-02-21, 05:34:31 GMT
+ */
+
+#include "hb-ot-shape-complex-vowel-constraints.hh"
+
+static void
+_output_dotted_circle (hb_buffer_t *buffer)
+{
+  hb_glyph_info_t &dottedcircle = buffer->output_glyph (0x25CCu);
+  _hb_glyph_info_reset_continuation (&dottedcircle);
+}
+
+static void
+_output_with_dotted_circle (hb_buffer_t *buffer)
+{
+  _output_dotted_circle (buffer);
+  buffer->next_glyph ();
+}
+
+void
+_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
+				       hb_buffer_t              *buffer,
+				       hb_font_t                *font HB_UNUSED)
+{
+  /* UGLY UGLY UGLY business of adding dotted-circle in the middle of
+   * vowel-sequences that look like another vowel.  Data for each script
+   * collected from the USE script development spec.
+   *
+   * https://github.com/harfbuzz/harfbuzz/issues/1019
+   */
+  bool processed = false;
+  buffer->clear_output ();
+  unsigned int count = buffer->len;
+  switch ((unsigned) buffer->props.script)
+  {
+    case HB_SCRIPT_DEVANAGARI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0905u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x093Au: case 0x093Bu: case 0x093Eu: case 0x0945u:
+	      case 0x0946u: case 0x0949u: case 0x094Au: case 0x094Bu:
+	      case 0x094Cu: case 0x094Fu: case 0x0956u: case 0x0957u:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0906u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x093Au: case 0x0945u: case 0x0946u: case 0x0947u:
+	      case 0x0948u:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0909u:
+	    matched = 0x0941u == buffer->cur (1).codepoint;
+	    break;
+	  case 0x090Fu:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0945u: case 0x0946u: case 0x0947u:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0930u:
+	    if (0x094Du == buffer->cur (1).codepoint &&
+		buffer->idx + 2 < count &&
+		0x0907u == buffer->cur (2).codepoint)
+	    {
+	      buffer->next_glyph ();
+	      buffer->next_glyph ();
+	      _output_dotted_circle (buffer);
+	    }
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_BENGALI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0985u:
+	    matched = 0x09BEu == buffer->cur (1).codepoint;
+	    break;
+	  case 0x098Bu:
+	    matched = 0x09C3u == buffer->cur (1).codepoint;
+	    break;
+	  case 0x098Cu:
+	    matched = 0x09E2u == buffer->cur (1).codepoint;
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_GURMUKHI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0A05u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0A3Eu: case 0x0A48u: case 0x0A4Cu:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0A72u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0A3Fu: case 0x0A40u: case 0x0A47u:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0A73u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0A41u: case 0x0A42u: case 0x0A4Bu:
+		matched = true;
+		break;
+	    }
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_GUJARATI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0A85u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0ABEu: case 0x0AC5u: case 0x0AC7u: case 0x0AC8u:
+	      case 0x0AC9u: case 0x0ACBu: case 0x0ACCu:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0AC5u:
+	    matched = 0x0ABEu == buffer->cur (1).codepoint;
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_ORIYA:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0B05u:
+	    matched = 0x0B3Eu == buffer->cur (1).codepoint;
+	    break;
+	  case 0x0B0Fu: case 0x0B13u:
+	    matched = 0x0B57u == buffer->cur (1).codepoint;
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_TELUGU:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0C12u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0C4Cu: case 0x0C55u:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0C3Fu: case 0x0C46u: case 0x0C4Au:
+	    matched = 0x0C55u == buffer->cur (1).codepoint;
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_KANNADA:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0C89u: case 0x0C8Bu:
+	    matched = 0x0CBEu == buffer->cur (1).codepoint;
+	    break;
+	  case 0x0C92u:
+	    matched = 0x0CCCu == buffer->cur (1).codepoint;
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_MALAYALAM:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0D07u: case 0x0D09u:
+	    matched = 0x0D57u == buffer->cur (1).codepoint;
+	    break;
+	  case 0x0D0Eu:
+	    matched = 0x0D46u == buffer->cur (1).codepoint;
+	    break;
+	  case 0x0D12u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0D3Eu: case 0x0D57u:
+		matched = true;
+		break;
+	    }
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_SINHALA:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0D85u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0DCFu: case 0x0DD0u: case 0x0DD1u:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0D8Bu: case 0x0D8Fu: case 0x0D94u:
+	    matched = 0x0DDFu == buffer->cur (1).codepoint;
+	    break;
+	  case 0x0D8Du:
+	    matched = 0x0DD8u == buffer->cur (1).codepoint;
+	    break;
+	  case 0x0D91u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0DCAu: case 0x0DD9u: case 0x0DDAu: case 0x0DDCu:
+	      case 0x0DDDu:
+		matched = true;
+		break;
+	    }
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_BRAHMI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x11005u:
+	    matched = 0x11038u == buffer->cur (1).codepoint;
+	    break;
+	  case 0x1100Bu:
+	    matched = 0x1103Eu == buffer->cur (1).codepoint;
+	    break;
+	  case 0x1100Fu:
+	    matched = 0x11042u == buffer->cur (1).codepoint;
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_KHUDAWADI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x112B0u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x112E0u: case 0x112E5u: case 0x112E6u: case 0x112E7u:
+	      case 0x112E8u:
+		matched = true;
+		break;
+	    }
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_TIRHUTA:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x11481u:
+	    matched = 0x114B0u == buffer->cur (1).codepoint;
+	    break;
+	  case 0x1148Bu: case 0x1148Du:
+	    matched = 0x114BAu == buffer->cur (1).codepoint;
+	    break;
+	  case 0x114AAu:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x114B5u: case 0x114B6u:
+		matched = true;
+		break;
+	    }
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_MODI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x11600u: case 0x11601u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x11639u: case 0x1163Au:
+		matched = true;
+		break;
+	    }
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_TAKRI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x11680u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x116ADu: case 0x116B4u: case 0x116B5u:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x11686u:
+	    matched = 0x116B2u == buffer->cur (1).codepoint;
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    default:
+      break;
+  }
+  if (processed)
+  {
+    if (buffer->idx < count)
+      buffer->next_glyph ();
+    buffer->swap_buffers ();
+  }
+}
+
+/* == End of generated functions == */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-vowel-constraints.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-vowel-constraints.hh
new file mode 100644
index 0000000..d9082d4
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex-vowel-constraints.hh
@@ -0,0 +1,39 @@
+/*
+ * Copyright © 2018  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_SHAPE_COMPLEX_VOWEL_CONSTRAINTS_HH
+#define HB_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex.hh"
+
+HB_INTERNAL void
+_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan,
+				       hb_buffer_t              *buffer,
+				       hb_font_t                *font);
+
+#endif /* HB_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex.hh
new file mode 100644
index 0000000..a2499de
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-complex.hh
@@ -0,0 +1,394 @@
+/*
+ * Copyright © 2010,2011,2012  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_SHAPE_COMPLEX_HH
+#define HB_OT_SHAPE_COMPLEX_HH
+
+#include "hb.hh"
+
+#include "hb-ot-layout.hh"
+#include "hb-ot-shape.hh"
+#include "hb-ot-shape-normalize.hh"
+
+
+/* buffer var allocations, used by complex shapers */
+#define complex_var_u8_0()	var2.u8[2]
+#define complex_var_u8_1()	var2.u8[3]
+
+
+#define HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS 32
+
+enum hb_ot_shape_zero_width_marks_type_t {
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE
+};
+
+
+/* Master OT shaper list */
+#define HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS \
+  HB_COMPLEX_SHAPER_IMPLEMENT (default) /* should be first */ \
+  HB_COMPLEX_SHAPER_IMPLEMENT (arabic) \
+  HB_COMPLEX_SHAPER_IMPLEMENT (hangul) \
+  HB_COMPLEX_SHAPER_IMPLEMENT (hebrew) \
+  HB_COMPLEX_SHAPER_IMPLEMENT (indic) \
+  HB_COMPLEX_SHAPER_IMPLEMENT (khmer) \
+  HB_COMPLEX_SHAPER_IMPLEMENT (myanmar) \
+  HB_COMPLEX_SHAPER_IMPLEMENT (myanmar_zawgyi) \
+  HB_COMPLEX_SHAPER_IMPLEMENT (thai) \
+  HB_COMPLEX_SHAPER_IMPLEMENT (use) \
+  /* ^--- Add new shapers here */
+
+
+struct hb_ot_complex_shaper_t
+{
+  /* collect_features()
+   * Called during shape_plan().
+   * Shapers should use plan->map to add their features and callbacks.
+   * May be NULL.
+   */
+  void (*collect_features) (hb_ot_shape_planner_t *plan);
+
+  /* override_features()
+   * Called during shape_plan().
+   * Shapers should use plan->map to override features and add callbacks after
+   * common features are added.
+   * May be NULL.
+   */
+  void (*override_features) (hb_ot_shape_planner_t *plan);
+
+
+  /* data_create()
+   * Called at the end of shape_plan().
+   * Whatever shapers return will be accessible through plan->data later.
+   * If nullptr is returned, means a plan failure.
+   */
+  void *(*data_create) (const hb_ot_shape_plan_t *plan);
+
+  /* data_destroy()
+   * Called when the shape_plan is being destroyed.
+   * plan->data is passed here for destruction.
+   * If nullptr is returned, means a plan failure.
+   * May be NULL.
+   */
+  void (*data_destroy) (void *data);
+
+
+  /* preprocess_text()
+   * Called during shape().
+   * Shapers can use to modify text before shaping starts.
+   * May be NULL.
+   */
+  void (*preprocess_text) (const hb_ot_shape_plan_t *plan,
+			   hb_buffer_t              *buffer,
+			   hb_font_t                *font);
+
+  /* postprocess_glyphs()
+   * Called during shape().
+   * Shapers can use to modify glyphs after shaping ends.
+   * May be NULL.
+   */
+  void (*postprocess_glyphs) (const hb_ot_shape_plan_t *plan,
+			      hb_buffer_t              *buffer,
+			      hb_font_t                *font);
+
+
+  hb_ot_shape_normalization_mode_t normalization_preference;
+
+  /* decompose()
+   * Called during shape()'s normalization.
+   * May be NULL.
+   */
+  bool (*decompose) (const hb_ot_shape_normalize_context_t *c,
+		     hb_codepoint_t  ab,
+		     hb_codepoint_t *a,
+		     hb_codepoint_t *b);
+
+  /* compose()
+   * Called during shape()'s normalization.
+   * May be NULL.
+   */
+  bool (*compose) (const hb_ot_shape_normalize_context_t *c,
+		   hb_codepoint_t  a,
+		   hb_codepoint_t  b,
+		   hb_codepoint_t *ab);
+
+  /* setup_masks()
+   * Called during shape().
+   * Shapers should use map to get feature masks and set on buffer.
+   * Shapers may NOT modify characters.
+   * May be NULL.
+   */
+  void (*setup_masks) (const hb_ot_shape_plan_t *plan,
+		       hb_buffer_t              *buffer,
+		       hb_font_t                *font);
+
+  /* gpos_tag()
+   * If not HB_TAG_NONE, then must match found GPOS script tag for
+   * GPOS to be applied.  Otherwise, fallback positioning will be used.
+   */
+  hb_tag_t gpos_tag;
+
+  /* reorder_marks()
+   * Called during shape().
+   * Shapers can use to modify ordering of combining marks.
+   * May be NULL.
+   */
+  void (*reorder_marks) (const hb_ot_shape_plan_t *plan,
+			 hb_buffer_t              *buffer,
+			 unsigned int              start,
+			 unsigned int              end);
+
+  hb_ot_shape_zero_width_marks_type_t zero_width_marks;
+
+  bool fallback_position;
+};
+
+#define HB_COMPLEX_SHAPER_IMPLEMENT(name) extern HB_INTERNAL const hb_ot_complex_shaper_t _hb_ot_complex_shaper_##name;
+HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
+#undef HB_COMPLEX_SHAPER_IMPLEMENT
+
+
+static inline const hb_ot_complex_shaper_t *
+hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
+{
+  switch ((hb_tag_t) planner->props.script)
+  {
+    default:
+      return &_hb_ot_complex_shaper_default;
+
+
+    /* Unicode-1.1 additions */
+    case HB_SCRIPT_ARABIC:
+
+    /* Unicode-3.0 additions */
+    case HB_SCRIPT_MONGOLIAN:
+    case HB_SCRIPT_SYRIAC:
+
+    /* Unicode-5.0 additions */
+    case HB_SCRIPT_NKO:
+    case HB_SCRIPT_PHAGS_PA:
+
+    /* 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:
+
+    /* Unicode-11.0 additions */
+    case HB_SCRIPT_HANIFI_ROHINGYA:
+    case HB_SCRIPT_SOGDIAN:
+
+      /* For Arabic script, use the Arabic shaper even if no OT script tag was found.
+       * This is because we do fallback shaping for Arabic script (and not others).
+       * But note that Arabic shaping is applicable only to horizontal layout; for
+       * vertical text, just use the generic shaper instead. */
+      if ((planner->map.chosen_script[0] != HB_OT_TAG_DEFAULT_SCRIPT ||
+	   planner->props.script == HB_SCRIPT_ARABIC) &&
+	  HB_DIRECTION_IS_HORIZONTAL(planner->props.direction))
+	return &_hb_ot_complex_shaper_arabic;
+      else
+	return &_hb_ot_complex_shaper_default;
+
+
+    /* Unicode-1.1 additions */
+    case HB_SCRIPT_THAI:
+    case HB_SCRIPT_LAO:
+
+      return &_hb_ot_complex_shaper_thai;
+
+
+    /* Unicode-1.1 additions */
+    case HB_SCRIPT_HANGUL:
+
+      return &_hb_ot_complex_shaper_hangul;
+
+
+    /* Unicode-1.1 additions */
+    case HB_SCRIPT_HEBREW:
+
+      return &_hb_ot_complex_shaper_hebrew;
+
+
+    /* Unicode-1.1 additions */
+    case HB_SCRIPT_BENGALI:
+    case HB_SCRIPT_DEVANAGARI:
+    case HB_SCRIPT_GUJARATI:
+    case HB_SCRIPT_GURMUKHI:
+    case HB_SCRIPT_KANNADA:
+    case HB_SCRIPT_MALAYALAM:
+    case HB_SCRIPT_ORIYA:
+    case HB_SCRIPT_TAMIL:
+    case HB_SCRIPT_TELUGU:
+
+    /* Unicode-3.0 additions */
+    case HB_SCRIPT_SINHALA:
+
+      /* If the designer designed the font for the 'DFLT' script,
+       * (or we ended up arbitrarily pick 'latn'), use the default shaper.
+       * Otherwise, use the specific shaper.
+       *
+       * If it's indy3 tag, send to USE. */
+      if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') ||
+	  planner->map.chosen_script[0] == HB_TAG ('l','a','t','n'))
+	return &_hb_ot_complex_shaper_default;
+      else if ((planner->map.chosen_script[0] & 0x000000FF) == '3')
+	return &_hb_ot_complex_shaper_use;
+      else
+	return &_hb_ot_complex_shaper_indic;
+
+    case HB_SCRIPT_KHMER:
+	return &_hb_ot_complex_shaper_khmer;
+
+    case HB_SCRIPT_MYANMAR:
+      /* If the designer designed the font for the 'DFLT' script,
+       * (or we ended up arbitrarily pick 'latn'), use the default shaper.
+       * Otherwise, use the specific shaper.
+       *
+       * If designer designed for 'mymr' tag, also send to default
+       * shaper.  That's tag used from before Myanmar shaping spec
+       * was developed.  The shaping spec uses 'mym2' tag. */
+      if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') ||
+	  planner->map.chosen_script[0] == HB_TAG ('l','a','t','n') ||
+	  planner->map.chosen_script[0] == HB_TAG ('m','y','m','r'))
+	return &_hb_ot_complex_shaper_default;
+      else
+	return &_hb_ot_complex_shaper_myanmar;
+
+
+    /* https://github.com/harfbuzz/harfbuzz/issues/1162 */
+    case HB_SCRIPT_MYANMAR_ZAWGYI:
+
+      return &_hb_ot_complex_shaper_myanmar_zawgyi;
+
+
+    /* Unicode-2.0 additions */
+    case HB_SCRIPT_TIBETAN:
+
+    /* Unicode-3.0 additions */
+    //case HB_SCRIPT_MONGOLIAN:
+    //case HB_SCRIPT_SINHALA:
+
+    /* Unicode-3.2 additions */
+    case HB_SCRIPT_BUHID:
+    case HB_SCRIPT_HANUNOO:
+    case HB_SCRIPT_TAGALOG:
+    case HB_SCRIPT_TAGBANWA:
+
+    /* Unicode-4.0 additions */
+    case HB_SCRIPT_LIMBU:
+    case HB_SCRIPT_TAI_LE:
+
+    /* Unicode-4.1 additions */
+    case HB_SCRIPT_BUGINESE:
+    case HB_SCRIPT_KHAROSHTHI:
+    case HB_SCRIPT_SYLOTI_NAGRI:
+    case HB_SCRIPT_TIFINAGH:
+
+    /* Unicode-5.0 additions */
+    case HB_SCRIPT_BALINESE:
+    //case HB_SCRIPT_NKO:
+    //case HB_SCRIPT_PHAGS_PA:
+
+    /* Unicode-5.1 additions */
+    case HB_SCRIPT_CHAM:
+    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_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:
+    //case HB_SCRIPT_MANDAIC:
+
+    /* Unicode-6.1 additions */
+    case HB_SCRIPT_CHAKMA:
+    case HB_SCRIPT_SHARADA:
+    case HB_SCRIPT_TAKRI:
+
+    /* Unicode-7.0 additions */
+    case HB_SCRIPT_DUPLOYAN:
+    case HB_SCRIPT_GRANTHA:
+    case HB_SCRIPT_KHOJKI:
+    case HB_SCRIPT_KHUDAWADI:
+    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:
+
+    /* Unicode-9.0 additions */
+    //case HB_SCRIPT_ADLAM:
+    case HB_SCRIPT_BHAIKSUKI:
+    case HB_SCRIPT_MARCHEN:
+    case HB_SCRIPT_NEWA:
+
+    /* Unicode-10.0 additions */
+    case HB_SCRIPT_MASARAM_GONDI:
+    case HB_SCRIPT_SOYOMBO:
+    case HB_SCRIPT_ZANABAZAR_SQUARE:
+
+    /* Unicode-11.0 additions */
+    case HB_SCRIPT_DOGRA:
+    case HB_SCRIPT_GUNJALA_GONDI:
+    //case HB_SCRIPT_HANIFI_ROHINGYA:
+    case HB_SCRIPT_MAKASAR:
+    //case HB_SCRIPT_SOGDIAN:
+
+      /* If the designer designed the font for the 'DFLT' script,
+       * (or we ended up arbitrarily pick 'latn'), 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') ||
+	  planner->map.chosen_script[0] == HB_TAG ('l','a','t','n'))
+	return &_hb_ot_complex_shaper_default;
+      else
+	return &_hb_ot_complex_shaper_use;
+  }
+}
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-fallback.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-fallback.cc
new file mode 100644
index 0000000..f9d4a75
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-fallback.cc
@@ -0,0 +1,573 @@
+/*
+ * Copyright © 2011,2012  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
+ */
+
+#include "hb-ot-shape-fallback.hh"
+#include "hb-kern.hh"
+
+static unsigned int
+recategorize_combining_class (hb_codepoint_t u,
+			      unsigned int klass)
+{
+  if (klass >= 200)
+    return klass;
+
+  /* Thai / Lao need some per-character work. */
+  if ((u & ~0xFF) == 0x0E00u)
+  {
+    if (unlikely (klass == 0))
+    {
+      switch (u)
+      {
+        case 0x0E31u:
+        case 0x0E34u:
+        case 0x0E35u:
+        case 0x0E36u:
+        case 0x0E37u:
+        case 0x0E47u:
+        case 0x0E4Cu:
+        case 0x0E4Du:
+        case 0x0E4Eu:
+	  klass = HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT;
+	  break;
+
+        case 0x0EB1u:
+        case 0x0EB4u:
+        case 0x0EB5u:
+        case 0x0EB6u:
+        case 0x0EB7u:
+        case 0x0EBBu:
+        case 0x0ECCu:
+        case 0x0ECDu:
+	  klass = HB_UNICODE_COMBINING_CLASS_ABOVE;
+	  break;
+
+        case 0x0EBCu:
+	  klass = HB_UNICODE_COMBINING_CLASS_BELOW;
+	  break;
+      }
+    } else {
+      /* Thai virama is below-right */
+      if (u == 0x0E3Au)
+	klass = HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT;
+    }
+  }
+
+  switch (klass)
+  {
+
+    /* Hebrew */
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC10: /* sheva */
+    case HB_MODIFIED_COMBINING_CLASS_CCC11: /* hataf segol */
+    case HB_MODIFIED_COMBINING_CLASS_CCC12: /* hataf patah */
+    case HB_MODIFIED_COMBINING_CLASS_CCC13: /* hataf qamats */
+    case HB_MODIFIED_COMBINING_CLASS_CCC14: /* hiriq */
+    case HB_MODIFIED_COMBINING_CLASS_CCC15: /* tsere */
+    case HB_MODIFIED_COMBINING_CLASS_CCC16: /* segol */
+    case HB_MODIFIED_COMBINING_CLASS_CCC17: /* patah */
+    case HB_MODIFIED_COMBINING_CLASS_CCC18: /* qamats */
+    case HB_MODIFIED_COMBINING_CLASS_CCC20: /* qubuts */
+    case HB_MODIFIED_COMBINING_CLASS_CCC22: /* meteg */
+      return HB_UNICODE_COMBINING_CLASS_BELOW;
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC23: /* rafe */
+      return HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE;
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC24: /* shin dot */
+      return HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT;
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC25: /* sin dot */
+    case HB_MODIFIED_COMBINING_CLASS_CCC19: /* holam */
+      return HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT;
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC26: /* point varika */
+      return HB_UNICODE_COMBINING_CLASS_ABOVE;
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC21: /* dagesh */
+      break;
+
+
+    /* Arabic and Syriac */
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC27: /* fathatan */
+    case HB_MODIFIED_COMBINING_CLASS_CCC28: /* dammatan */
+    case HB_MODIFIED_COMBINING_CLASS_CCC30: /* fatha */
+    case HB_MODIFIED_COMBINING_CLASS_CCC31: /* damma */
+    case HB_MODIFIED_COMBINING_CLASS_CCC33: /* shadda */
+    case HB_MODIFIED_COMBINING_CLASS_CCC34: /* sukun */
+    case HB_MODIFIED_COMBINING_CLASS_CCC35: /* superscript alef */
+    case HB_MODIFIED_COMBINING_CLASS_CCC36: /* superscript alaph */
+      return HB_UNICODE_COMBINING_CLASS_ABOVE;
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC29: /* kasratan */
+    case HB_MODIFIED_COMBINING_CLASS_CCC32: /* kasra */
+      return HB_UNICODE_COMBINING_CLASS_BELOW;
+
+
+    /* Thai */
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC103: /* sara u / sara uu */
+      return HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT;
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC107: /* mai */
+      return HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT;
+
+
+    /* Lao */
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC118: /* sign u / sign uu */
+      return HB_UNICODE_COMBINING_CLASS_BELOW;
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC122: /* mai */
+      return HB_UNICODE_COMBINING_CLASS_ABOVE;
+
+
+    /* Tibetan */
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC129: /* sign aa */
+      return HB_UNICODE_COMBINING_CLASS_BELOW;
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC130: /* sign i*/
+      return HB_UNICODE_COMBINING_CLASS_ABOVE;
+
+    case HB_MODIFIED_COMBINING_CLASS_CCC132: /* sign u */
+      return HB_UNICODE_COMBINING_CLASS_BELOW;
+
+  }
+
+  return klass;
+}
+
+void
+_hb_ot_shape_fallback_mark_position_recategorize_marks (const hb_ot_shape_plan_t *plan HB_UNUSED,
+						        hb_font_t *font HB_UNUSED,
+						        hb_buffer_t  *buffer)
+{
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    if (_hb_glyph_info_get_general_category (&info[i]) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) {
+      unsigned int combining_class = _hb_glyph_info_get_modified_combining_class (&info[i]);
+      combining_class = recategorize_combining_class (info[i].codepoint, combining_class);
+      _hb_glyph_info_set_modified_combining_class (&info[i], combining_class);
+    }
+}
+
+
+static void
+zero_mark_advances (hb_buffer_t *buffer,
+		    unsigned int start,
+		    unsigned int end,
+		    bool adjust_offsets_when_zeroing)
+{
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = start; i < end; i++)
+    if (_hb_glyph_info_get_general_category (&info[i]) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
+    {
+      if (adjust_offsets_when_zeroing)
+      {
+	buffer->pos[i].x_offset -= buffer->pos[i].x_advance;
+	buffer->pos[i].y_offset -= buffer->pos[i].y_advance;
+      }
+      buffer->pos[i].x_advance = 0;
+      buffer->pos[i].y_advance = 0;
+    }
+}
+
+static inline void
+position_mark (const hb_ot_shape_plan_t *plan HB_UNUSED,
+	       hb_font_t *font,
+	       hb_buffer_t  *buffer,
+	       hb_glyph_extents_t &base_extents,
+	       unsigned int i,
+	       unsigned int combining_class)
+{
+  hb_glyph_extents_t mark_extents;
+  if (!font->get_glyph_extents (buffer->info[i].codepoint, &mark_extents))
+    return;
+
+  hb_position_t y_gap = font->y_scale / 16;
+
+  hb_glyph_position_t &pos = buffer->pos[i];
+  pos.x_offset = pos.y_offset = 0;
+
+
+  /* We don't position LEFT and RIGHT marks. */
+
+  /* X positioning */
+  switch (combining_class)
+  {
+    case HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW:
+    case HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE:
+      if (buffer->props.direction == HB_DIRECTION_LTR) {
+	pos.x_offset += base_extents.x_bearing + base_extents.width - mark_extents.width / 2 - mark_extents.x_bearing;
+        break;
+      } else if (buffer->props.direction == HB_DIRECTION_RTL) {
+	pos.x_offset += base_extents.x_bearing - mark_extents.width / 2 - mark_extents.x_bearing;
+        break;
+      }
+      HB_FALLTHROUGH;
+
+    default:
+    case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW:
+    case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE:
+    case HB_UNICODE_COMBINING_CLASS_BELOW:
+    case HB_UNICODE_COMBINING_CLASS_ABOVE:
+      /* Center align. */
+      pos.x_offset += base_extents.x_bearing + (base_extents.width - mark_extents.width) / 2 - mark_extents.x_bearing;
+      break;
+
+    case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT:
+    case HB_UNICODE_COMBINING_CLASS_BELOW_LEFT:
+    case HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT:
+      /* Left align. */
+      pos.x_offset += base_extents.x_bearing - mark_extents.x_bearing;
+      break;
+
+    case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT:
+    case HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT:
+    case HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT:
+      /* Right align. */
+      pos.x_offset += base_extents.x_bearing + base_extents.width - mark_extents.width - mark_extents.x_bearing;
+      break;
+  }
+
+  /* Y positioning */
+  switch (combining_class)
+  {
+    case HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW:
+    case HB_UNICODE_COMBINING_CLASS_BELOW_LEFT:
+    case HB_UNICODE_COMBINING_CLASS_BELOW:
+    case HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT:
+      /* Add gap, fall-through. */
+      base_extents.height -= y_gap;
+      HB_FALLTHROUGH;
+
+    case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT:
+    case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW:
+      pos.y_offset = base_extents.y_bearing + base_extents.height - mark_extents.y_bearing;
+      /* Never shift up "below" marks. */
+      if ((y_gap > 0) == (pos.y_offset > 0))
+      {
+	base_extents.height -= pos.y_offset;
+	pos.y_offset = 0;
+      }
+      base_extents.height += mark_extents.height;
+      break;
+
+    case HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE:
+    case HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT:
+    case HB_UNICODE_COMBINING_CLASS_ABOVE:
+    case HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT:
+      /* Add gap, fall-through. */
+      base_extents.y_bearing += y_gap;
+      base_extents.height -= y_gap;
+      HB_FALLTHROUGH;
+
+    case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE:
+    case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT:
+      pos.y_offset = base_extents.y_bearing - (mark_extents.y_bearing + mark_extents.height);
+      /* Don't shift down "above" marks too much. */
+      if ((y_gap > 0) != (pos.y_offset > 0))
+      {
+	unsigned int correction = -pos.y_offset / 2;
+	base_extents.y_bearing += correction;
+	base_extents.height -= correction;
+	pos.y_offset += correction;
+      }
+      base_extents.y_bearing -= mark_extents.height;
+      base_extents.height += mark_extents.height;
+      break;
+  }
+}
+
+static inline void
+position_around_base (const hb_ot_shape_plan_t *plan,
+		      hb_font_t *font,
+		      hb_buffer_t  *buffer,
+		      unsigned int base,
+		      unsigned int end,
+		      bool adjust_offsets_when_zeroing)
+{
+  hb_direction_t horiz_dir = HB_DIRECTION_INVALID;
+
+  buffer->unsafe_to_break (base, end);
+
+  hb_glyph_extents_t base_extents;
+  if (!font->get_glyph_extents (buffer->info[base].codepoint,
+				&base_extents))
+  {
+    /* If extents don't work, zero marks and go home. */
+    zero_mark_advances (buffer, base + 1, end, adjust_offsets_when_zeroing);
+    return;
+  }
+  base_extents.y_bearing += buffer->pos[base].y_offset;
+  /* Use horizontal advance for horizontal positioning.
+   * Generally a better idea.  Also works for zero-ink glyphs.  See:
+   * https://github.com/harfbuzz/harfbuzz/issues/1532 */
+  base_extents.x_bearing = 0;
+  base_extents.width = font->get_glyph_h_advance (buffer->info[base].codepoint);
+
+  unsigned int lig_id = _hb_glyph_info_get_lig_id (&buffer->info[base]);
+  /* Use integer for num_lig_components such that it doesn't convert to unsigned
+   * when we divide or multiply by it. */
+  int num_lig_components = _hb_glyph_info_get_lig_num_comps (&buffer->info[base]);
+
+  hb_position_t x_offset = 0, y_offset = 0;
+  if (HB_DIRECTION_IS_FORWARD (buffer->props.direction)) {
+    x_offset -= buffer->pos[base].x_advance;
+    y_offset -= buffer->pos[base].y_advance;
+  }
+
+  hb_glyph_extents_t component_extents = base_extents;
+  int last_lig_component = -1;
+  unsigned int last_combining_class = 255;
+  hb_glyph_extents_t cluster_extents = base_extents; /* Initialization is just to shut gcc up. */
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = base + 1; i < end; i++)
+    if (_hb_glyph_info_get_modified_combining_class (&info[i]))
+    {
+      if (num_lig_components > 1) {
+	unsigned int this_lig_id = _hb_glyph_info_get_lig_id (&info[i]);
+	int this_lig_component = _hb_glyph_info_get_lig_comp (&info[i]) - 1;
+	/* Conditions for attaching to the last component. */
+	if (!lig_id || lig_id != this_lig_id || this_lig_component >= num_lig_components)
+	  this_lig_component = num_lig_components - 1;
+	if (last_lig_component != this_lig_component)
+	{
+	  last_lig_component = this_lig_component;
+	  last_combining_class = 255;
+	  component_extents = base_extents;
+	  if (unlikely (horiz_dir == HB_DIRECTION_INVALID)) {
+	    if (HB_DIRECTION_IS_HORIZONTAL (plan->props.direction))
+	      horiz_dir = plan->props.direction;
+	    else
+	      horiz_dir = hb_script_get_horizontal_direction (plan->props.script);
+	  }
+	  if (horiz_dir == HB_DIRECTION_LTR)
+	    component_extents.x_bearing += (this_lig_component * component_extents.width) / num_lig_components;
+	  else
+	    component_extents.x_bearing += ((num_lig_components - 1 - this_lig_component) * component_extents.width) / num_lig_components;
+	  component_extents.width /= num_lig_components;
+	}
+      }
+
+      unsigned int this_combining_class = _hb_glyph_info_get_modified_combining_class (&info[i]);
+      if (last_combining_class != this_combining_class)
+      {
+	last_combining_class = this_combining_class;
+        cluster_extents = component_extents;
+      }
+
+      position_mark (plan, font, buffer, cluster_extents, i, this_combining_class);
+
+      buffer->pos[i].x_advance = 0;
+      buffer->pos[i].y_advance = 0;
+      buffer->pos[i].x_offset += x_offset;
+      buffer->pos[i].y_offset += y_offset;
+
+    } else {
+      if (HB_DIRECTION_IS_FORWARD (buffer->props.direction)) {
+	x_offset -= buffer->pos[i].x_advance;
+	y_offset -= buffer->pos[i].y_advance;
+      } else {
+	x_offset += buffer->pos[i].x_advance;
+	y_offset += buffer->pos[i].y_advance;
+      }
+    }
+}
+
+static inline void
+position_cluster (const hb_ot_shape_plan_t *plan,
+		  hb_font_t *font,
+		  hb_buffer_t  *buffer,
+		  unsigned int start,
+		  unsigned int end,
+		  bool adjust_offsets_when_zeroing)
+{
+  if (end - start < 2)
+    return;
+
+  /* Find the base glyph */
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = start; i < end; i++)
+    if (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])))
+    {
+      /* Find mark glyphs */
+      unsigned int j;
+      for (j = i + 1; j < end; j++)
+	if (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[j])))
+	  break;
+
+      position_around_base (plan, font, buffer, i, j, adjust_offsets_when_zeroing);
+
+      i = j - 1;
+    }
+}
+
+void
+_hb_ot_shape_fallback_mark_position (const hb_ot_shape_plan_t *plan,
+				     hb_font_t *font,
+				     hb_buffer_t  *buffer,
+				     bool adjust_offsets_when_zeroing)
+{
+  _hb_buffer_assert_gsubgpos_vars (buffer);
+
+  unsigned int start = 0;
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 1; i < count; i++)
+    if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])))) {
+      position_cluster (plan, font, buffer, start, i, adjust_offsets_when_zeroing);
+      start = i;
+    }
+  position_cluster (plan, font, buffer, start, count, adjust_offsets_when_zeroing);
+}
+
+
+struct hb_ot_shape_fallback_kern_driver_t
+{
+  hb_ot_shape_fallback_kern_driver_t (hb_font_t   *font_,
+				      hb_buffer_t *buffer) :
+    font (font_), direction (buffer->props.direction) {}
+
+  hb_position_t get_kerning (hb_codepoint_t first, hb_codepoint_t second) const
+  {
+    hb_position_t kern = 0;
+    font->get_glyph_kerning_for_direction (first, second,
+					   direction,
+					   &kern, &kern);
+    return kern;
+  }
+
+  hb_font_t *font;
+  hb_direction_t direction;
+};
+
+/* Performs font-assisted kerning. */
+void
+_hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
+			    hb_font_t *font,
+			    hb_buffer_t *buffer)
+{
+  if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction) ?
+      !font->has_glyph_h_kerning_func () :
+      !font->has_glyph_v_kerning_func ())
+    return;
+
+  bool reverse = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
+
+  if (reverse)
+    buffer->reverse ();
+
+  hb_ot_shape_fallback_kern_driver_t driver (font, buffer);
+  OT::hb_kern_machine_t<hb_ot_shape_fallback_kern_driver_t> machine (driver);
+  machine.kern (font, buffer, plan->kern_mask, false);
+
+  if (reverse)
+    buffer->reverse ();
+}
+
+
+/* Adjusts width of various spaces. */
+void
+_hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan HB_UNUSED,
+			      hb_font_t *font,
+			      hb_buffer_t  *buffer)
+{
+  hb_glyph_info_t *info = buffer->info;
+  hb_glyph_position_t *pos = buffer->pos;
+  bool horizontal = HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction);
+  unsigned int count = buffer->len;
+  for (unsigned int i = 0; i < count; i++)
+    if (_hb_glyph_info_is_unicode_space (&info[i]) && !_hb_glyph_info_ligated (&info[i]))
+    {
+      hb_unicode_funcs_t::space_t space_type = _hb_glyph_info_get_unicode_space_fallback_type (&info[i]);
+      hb_codepoint_t glyph;
+      typedef hb_unicode_funcs_t t;
+      switch (space_type)
+      {
+	case t::NOT_SPACE: /* Shouldn't happen. */
+	case t::SPACE:
+	  break;
+
+	case t::SPACE_EM:
+	case t::SPACE_EM_2:
+	case t::SPACE_EM_3:
+	case t::SPACE_EM_4:
+	case t::SPACE_EM_5:
+	case t::SPACE_EM_6:
+	case t::SPACE_EM_16:
+	  if (horizontal)
+	    pos[i].x_advance = +(font->x_scale + ((int) space_type)/2) / (int) space_type;
+	  else
+	    pos[i].y_advance = -(font->y_scale + ((int) space_type)/2) / (int) space_type;
+	  break;
+
+	case t::SPACE_4_EM_18:
+	  if (horizontal)
+	    pos[i].x_advance = (int64_t) +font->x_scale * 4 / 18;
+	  else
+	    pos[i].y_advance = (int64_t) -font->y_scale * 4 / 18;
+	  break;
+
+	case t::SPACE_FIGURE:
+	  for (char u = '0'; u <= '9'; u++)
+	    if (font->get_nominal_glyph (u, &glyph))
+	    {
+	      if (horizontal)
+		pos[i].x_advance = font->get_glyph_h_advance (glyph);
+	      else
+		pos[i].y_advance = font->get_glyph_v_advance (glyph);
+	      break;
+	    }
+	  break;
+
+	case t::SPACE_PUNCTUATION:
+	  if (font->get_nominal_glyph ('.', &glyph) ||
+	      font->get_nominal_glyph (',', &glyph))
+	  {
+	    if (horizontal)
+	      pos[i].x_advance = font->get_glyph_h_advance (glyph);
+	    else
+	      pos[i].y_advance = font->get_glyph_v_advance (glyph);
+	  }
+	  break;
+
+	case t::SPACE_NARROW:
+	  /* Half-space?
+	   * Unicode doc https://unicode.org/charts/PDF/U2000.pdf says ~1/4 or 1/5 of EM.
+	   * However, in my testing, many fonts have their regular space being about that
+	   * size.  To me, a percentage of the space width makes more sense.  Half is as
+	   * good as any. */
+	  if (horizontal)
+	    pos[i].x_advance /= 2;
+	  else
+	    pos[i].y_advance /= 2;
+	  break;
+      }
+    }
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-fallback.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-fallback.hh
new file mode 100644
index 0000000..5faf5f2
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-fallback.hh
@@ -0,0 +1,54 @@
+/*
+ * Copyright © 2012  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_SHAPE_FALLBACK_HH
+#define HB_OT_SHAPE_FALLBACK_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape.hh"
+
+
+HB_INTERNAL void _hb_ot_shape_fallback_mark_position (const hb_ot_shape_plan_t *plan,
+						      hb_font_t *font,
+						      hb_buffer_t  *buffer,
+						      bool adjust_offsets_when_zeroing);
+
+HB_INTERNAL void _hb_ot_shape_fallback_mark_position_recategorize_marks (const hb_ot_shape_plan_t *plan,
+									 hb_font_t *font,
+									 hb_buffer_t  *buffer);
+
+
+HB_INTERNAL void _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
+					     hb_font_t *font,
+					     hb_buffer_t  *buffer);
+
+HB_INTERNAL void _hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan,
+					       hb_font_t *font,
+					       hb_buffer_t  *buffer);
+
+
+#endif /* HB_OT_SHAPE_FALLBACK_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-normalize.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-normalize.cc
new file mode 100644
index 0000000..82bb24b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-normalize.cc
@@ -0,0 +1,471 @@
+/*
+ * Copyright © 2011,2012  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
+ */
+
+#include "hb-ot-shape-normalize.hh"
+#include "hb-ot-shape-complex.hh"
+#include "hb-ot-shape.hh"
+
+
+/*
+ * HIGHLEVEL DESIGN:
+ *
+ * This file exports one main function: _hb_ot_shape_normalize().
+ *
+ * This function closely reflects the Unicode Normalization Algorithm,
+ * yet it's different.
+ *
+ * Each shaper specifies whether it prefers decomposed (NFD) or composed (NFC).
+ * The logic however tries to use whatever the font can support.
+ *
+ * In general what happens is that: each grapheme is decomposed in a chain
+ * of 1:2 decompositions, marks reordered, and then recomposed if desired,
+ * so far it's like Unicode Normalization.  However, the decomposition and
+ * recomposition only happens if the font supports the resulting characters.
+ *
+ * The goals are:
+ *
+ *   - Try to render all canonically equivalent strings similarly.  To really
+ *     achieve this we have to always do the full decomposition and then
+ *     selectively recompose from there.  It's kinda too expensive though, so
+ *     we skip some cases.  For example, if composed is desired, we simply
+ *     don't touch 1-character clusters that are supported by the font, even
+ *     though their NFC may be different.
+ *
+ *   - When a font has a precomposed character for a sequence but the 'ccmp'
+ *     feature in the font is not adequate, use the precomposed character
+ *     which typically has better mark positioning.
+ *
+ *   - When a font does not support a combining mark, but supports it precomposed
+ *     with previous base, use that.  This needs the itemizer to have this
+ *     knowledge too.  We need to provide assistance to the itemizer.
+ *
+ *   - When a font does not support a character but supports its canonical
+ *     decomposition, well, use the decomposition.
+ *
+ *   - The complex shapers can customize the compose and decompose functions to
+ *     offload some of their requirements to the normalizer.  For example, the
+ *     Indic shaper may want to disallow recomposing of two matras.
+ */
+
+static bool
+decompose_unicode (const hb_ot_shape_normalize_context_t *c,
+		   hb_codepoint_t  ab,
+		   hb_codepoint_t *a,
+		   hb_codepoint_t *b)
+{
+  return (bool) c->unicode->decompose (ab, a, b);
+}
+
+static bool
+compose_unicode (const hb_ot_shape_normalize_context_t *c,
+		 hb_codepoint_t  a,
+		 hb_codepoint_t  b,
+		 hb_codepoint_t *ab)
+{
+  return (bool) c->unicode->compose (a, b, ab);
+}
+
+static inline void
+set_glyph (hb_glyph_info_t &info, hb_font_t *font)
+{
+  (void) font->get_nominal_glyph (info.codepoint, &info.glyph_index());
+}
+
+static inline void
+output_char (hb_buffer_t *buffer, hb_codepoint_t unichar, hb_codepoint_t glyph)
+{
+  buffer->cur().glyph_index() = glyph;
+  buffer->output_glyph (unichar); /* This is very confusing indeed. */
+  _hb_glyph_info_set_unicode_props (&buffer->prev(), buffer);
+}
+
+static inline void
+next_char (hb_buffer_t *buffer, hb_codepoint_t glyph)
+{
+  buffer->cur().glyph_index() = glyph;
+  buffer->next_glyph ();
+}
+
+static inline void
+skip_char (hb_buffer_t *buffer)
+{
+  buffer->skip_glyph ();
+}
+
+/* Returns 0 if didn't decompose, number of resulting characters otherwise. */
+static inline unsigned int
+decompose (const hb_ot_shape_normalize_context_t *c, bool shortest, hb_codepoint_t ab)
+{
+  hb_codepoint_t a = 0, b = 0, a_glyph = 0, b_glyph = 0;
+  hb_buffer_t * const buffer = c->buffer;
+  hb_font_t * const font = c->font;
+
+  if (!c->decompose (c, ab, &a, &b) ||
+      (b && !font->get_nominal_glyph (b, &b_glyph)))
+    return 0;
+
+  bool has_a = (bool) font->get_nominal_glyph (a, &a_glyph);
+  if (shortest && has_a) {
+    /* Output a and b */
+    output_char (buffer, a, a_glyph);
+    if (likely (b)) {
+      output_char (buffer, b, b_glyph);
+      return 2;
+    }
+    return 1;
+  }
+
+  unsigned int ret;
+  if ((ret = decompose (c, shortest, a))) {
+    if (b) {
+      output_char (buffer, b, b_glyph);
+      return ret + 1;
+    }
+    return ret;
+  }
+
+  if (has_a) {
+    output_char (buffer, a, a_glyph);
+    if (likely (b)) {
+      output_char (buffer, b, b_glyph);
+      return 2;
+    }
+    return 1;
+  }
+
+  return 0;
+}
+
+static inline void
+decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shortest)
+{
+  hb_buffer_t * const buffer = c->buffer;
+  hb_codepoint_t u = buffer->cur().codepoint;
+  hb_codepoint_t glyph = 0;
+
+  if (shortest && c->font->get_nominal_glyph (u, &glyph))
+  {
+    next_char (buffer, glyph);
+    return;
+  }
+
+  if (decompose (c, shortest, u))
+  {
+    skip_char (buffer);
+    return;
+  }
+
+  if (!shortest && c->font->get_nominal_glyph (u, &glyph))
+  {
+    next_char (buffer, glyph);
+    return;
+  }
+
+  if (_hb_glyph_info_is_unicode_space (&buffer->cur()))
+  {
+    hb_codepoint_t space_glyph;
+    hb_unicode_funcs_t::space_t space_type = buffer->unicode->space_fallback_type (u);
+    if (space_type != hb_unicode_funcs_t::NOT_SPACE && c->font->get_nominal_glyph (0x0020u, &space_glyph))
+    {
+      _hb_glyph_info_set_unicode_space_fallback_type (&buffer->cur(), space_type);
+      next_char (buffer, space_glyph);
+      buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK;
+      return;
+    }
+  }
+
+  if (u == 0x2011u)
+  {
+    /* U+2011 is the only sensible character that is a no-break version of another character
+     * and not a space.  The space ones are handled already.  Handle this lone one. */
+    hb_codepoint_t other_glyph;
+    if (c->font->get_nominal_glyph (0x2010u, &other_glyph))
+    {
+      next_char (buffer, other_glyph);
+      return;
+    }
+  }
+
+  next_char (buffer, glyph); /* glyph is initialized in earlier branches. */
+}
+
+static inline void
+handle_variation_selector_cluster (const hb_ot_shape_normalize_context_t *c,
+				   unsigned int end,
+				   bool short_circuit HB_UNUSED)
+{
+  /* TODO Currently if there's a variation-selector we give-up, it's just too hard. */
+  hb_buffer_t * const buffer = c->buffer;
+  hb_font_t * const font = c->font;
+  for (; buffer->idx < end - 1 && buffer->successful;) {
+    if (unlikely (buffer->unicode->is_variation_selector (buffer->cur(+1).codepoint))) {
+      if (font->get_variation_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index()))
+      {
+	hb_codepoint_t unicode = buffer->cur().codepoint;
+	buffer->replace_glyphs (2, 1, &unicode);
+      }
+      else
+      {
+        /* Just pass on the two characters separately, let GSUB do its magic. */
+	set_glyph (buffer->cur(), font);
+	buffer->next_glyph ();
+	set_glyph (buffer->cur(), font);
+	buffer->next_glyph ();
+      }
+      /* Skip any further variation selectors. */
+      while (buffer->idx < end && unlikely (buffer->unicode->is_variation_selector (buffer->cur().codepoint)))
+      {
+	set_glyph (buffer->cur(), font);
+	buffer->next_glyph ();
+      }
+    } else {
+      set_glyph (buffer->cur(), font);
+      buffer->next_glyph ();
+    }
+  }
+  if (likely (buffer->idx < end)) {
+    set_glyph (buffer->cur(), font);
+    buffer->next_glyph ();
+  }
+}
+
+static inline void
+decompose_multi_char_cluster (const hb_ot_shape_normalize_context_t *c, unsigned int end, bool short_circuit)
+{
+  hb_buffer_t * const buffer = c->buffer;
+  for (unsigned int i = buffer->idx; i < end && buffer->successful; i++)
+    if (unlikely (buffer->unicode->is_variation_selector (buffer->info[i].codepoint))) {
+      handle_variation_selector_cluster (c, end, short_circuit);
+      return;
+    }
+
+  while (buffer->idx < end && buffer->successful)
+    decompose_current_character (c, short_circuit);
+}
+
+
+static int
+compare_combining_class (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb)
+{
+  unsigned int a = _hb_glyph_info_get_modified_combining_class (pa);
+  unsigned int b = _hb_glyph_info_get_modified_combining_class (pb);
+
+  return a < b ? -1 : a == b ? 0 : +1;
+}
+
+
+void
+_hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
+			hb_buffer_t *buffer,
+			hb_font_t *font)
+{
+  if (unlikely (!buffer->len)) return;
+
+  _hb_buffer_assert_unicode_vars (buffer);
+
+  hb_ot_shape_normalization_mode_t mode = plan->shaper->normalization_preference;
+  if (mode == HB_OT_SHAPE_NORMALIZATION_MODE_AUTO)
+  {
+    if (plan->has_gpos_mark)
+      // https://github.com/harfbuzz/harfbuzz/issues/653#issuecomment-423905920
+      //mode = HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED;
+      mode = HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS;
+    else
+      mode = HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS;
+  }
+
+  const hb_ot_shape_normalize_context_t c = {
+    plan,
+    buffer,
+    font,
+    buffer->unicode,
+    plan->shaper->decompose ? plan->shaper->decompose : decompose_unicode,
+    plan->shaper->compose   ? plan->shaper->compose   : compose_unicode
+  };
+
+  bool always_short_circuit = mode == HB_OT_SHAPE_NORMALIZATION_MODE_NONE;
+  bool might_short_circuit = always_short_circuit ||
+			     (mode != HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED &&
+			      mode != HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT);
+  unsigned int count;
+
+  /* We do a fairly straightforward yet custom normalization process in three
+   * separate rounds: decompose, reorder, recompose (if desired).  Currently
+   * this makes two buffer swaps.  We can make it faster by moving the last
+   * two rounds into the inner loop for the first round, but it's more readable
+   * this way. */
+
+
+  /* First round, decompose */
+
+  bool all_simple = true;
+  {
+    buffer->clear_output ();
+    count = buffer->len;
+    buffer->idx = 0;
+    do
+    {
+      unsigned int end;
+      for (end = buffer->idx + 1; end < count; end++)
+	if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&buffer->info[end]))))
+	  break;
+
+      if (end < count)
+	end--; /* Leave one base for the marks to cluster with. */
+
+      /* From idx to end are simple clusters. */
+      if (might_short_circuit)
+      {
+        unsigned int done = font->get_nominal_glyphs (end - buffer->idx,
+						      &buffer->cur().codepoint,
+						      sizeof (buffer->info[0]),
+						      &buffer->cur().glyph_index(),
+						      sizeof (buffer->info[0]));
+	buffer->next_glyphs (done);
+      }
+      while (buffer->idx < end && buffer->successful)
+	decompose_current_character (&c, might_short_circuit);
+
+      if (buffer->idx == count || !buffer->successful)
+	break;
+
+      all_simple = false;
+
+      /* Find all the marks now. */
+      for (end = buffer->idx + 1; end < count; end++)
+	if (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&buffer->info[end])))
+	  break;
+
+      /* idx to end is one non-simple cluster. */
+      decompose_multi_char_cluster (&c, end, always_short_circuit);
+    }
+    while (buffer->idx < count && buffer->successful);
+    buffer->swap_buffers ();
+  }
+
+
+  /* Second round, reorder (inplace) */
+
+  if (!all_simple)
+  {
+    count = buffer->len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (_hb_glyph_info_get_modified_combining_class (&buffer->info[i]) == 0)
+	continue;
+
+      unsigned int end;
+      for (end = i + 1; end < count; end++)
+	if (_hb_glyph_info_get_modified_combining_class (&buffer->info[end]) == 0)
+	  break;
+
+      /* We are going to do a O(n^2).  Only do this if the sequence is short. */
+      if (end - i > HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS) {
+	i = end;
+	continue;
+      }
+
+      buffer->sort (i, end, compare_combining_class);
+
+      if (plan->shaper->reorder_marks)
+	plan->shaper->reorder_marks (plan, buffer, i, end);
+
+      i = end;
+    }
+  }
+  if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_CGJ)
+  {
+    /* For all CGJ, check if it prevented any reordering at all.
+     * If it did NOT, then make it skippable.
+     * https://github.com/harfbuzz/harfbuzz/issues/554
+     */
+    for (unsigned int i = 1; i + 1 < buffer->len; i++)
+      if (buffer->info[i].codepoint == 0x034Fu/*CGJ*/ &&
+	  info_cc(buffer->info[i-1]) <= info_cc(buffer->info[i+1]))
+      {
+	_hb_glyph_info_unhide (&buffer->info[i]);
+      }
+  }
+
+
+  /* Third round, recompose */
+
+  if (!all_simple &&
+      (mode == HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS ||
+       mode == HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT))
+  {
+    /* As noted in the comment earlier, we don't try to combine
+     * ccc=0 chars with their previous Starter. */
+
+    buffer->clear_output ();
+    count = buffer->len;
+    unsigned int starter = 0;
+    buffer->next_glyph ();
+    while (buffer->idx < count && buffer->successful)
+    {
+      hb_codepoint_t composed, glyph;
+      if (/* We don't try to compose a non-mark character with it's preceding starter.
+	   * This is both an optimization to avoid trying to compose every two neighboring
+	   * glyphs in most scripts AND a desired feature for Hangul.  Apparently Hangul
+	   * fonts are not designed to mix-and-match pre-composed syllables and Jamo. */
+	  HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&buffer->cur())))
+      {
+	if (/* If there's anything between the starter and this char, they should have CCC
+	     * smaller than this character's. */
+	    (starter == buffer->out_len - 1 ||
+	     info_cc (buffer->prev()) < info_cc (buffer->cur())) &&
+	    /* And compose. */
+	    c.compose (&c,
+		       buffer->out_info[starter].codepoint,
+		       buffer->cur().codepoint,
+		       &composed) &&
+	    /* And the font has glyph for the composite. */
+	    font->get_nominal_glyph (composed, &glyph))
+	{
+	  /* Composes. */
+	  buffer->next_glyph (); /* Copy to out-buffer. */
+	  if (unlikely (!buffer->successful))
+	    return;
+	  buffer->merge_out_clusters (starter, buffer->out_len);
+	  buffer->out_len--; /* Remove the second composable. */
+	  /* Modify starter and carry on. */
+	  buffer->out_info[starter].codepoint = composed;
+	  buffer->out_info[starter].glyph_index() = glyph;
+	  _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer);
+
+	  continue;
+	}
+      }
+
+      /* Blocked, or doesn't compose. */
+      buffer->next_glyph ();
+
+      if (info_cc (buffer->prev()) == 0)
+	starter = buffer->out_len - 1;
+    }
+    buffer->swap_buffers ();
+  }
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-normalize.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-normalize.hh
new file mode 100644
index 0000000..04f1a80
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape-normalize.hh
@@ -0,0 +1,70 @@
+/*
+ * Copyright © 2012  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_SHAPE_NORMALIZE_HH
+#define HB_OT_SHAPE_NORMALIZE_HH
+
+#include "hb.hh"
+
+
+/* buffer var allocations, used during the normalization process */
+#define glyph_index()	var1.u32
+
+struct hb_ot_shape_plan_t;
+
+enum hb_ot_shape_normalization_mode_t {
+  HB_OT_SHAPE_NORMALIZATION_MODE_NONE,
+  HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED,
+  HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS, /* Never composes base-to-base */
+  HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, /* Always fully decomposes and then recompose back */
+
+  HB_OT_SHAPE_NORMALIZATION_MODE_AUTO, /* See hb-ot-shape-normalize.cc for logic. */
+  HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT = HB_OT_SHAPE_NORMALIZATION_MODE_AUTO
+};
+
+HB_INTERNAL void _hb_ot_shape_normalize (const hb_ot_shape_plan_t *shaper,
+					 hb_buffer_t *buffer,
+					 hb_font_t *font);
+
+
+struct hb_ot_shape_normalize_context_t
+{
+  const hb_ot_shape_plan_t *plan;
+  hb_buffer_t *buffer;
+  hb_font_t *font;
+  hb_unicode_funcs_t *unicode;
+  bool (*decompose) (const hb_ot_shape_normalize_context_t *c,
+		     hb_codepoint_t  ab,
+		     hb_codepoint_t *a,
+		     hb_codepoint_t *b);
+  bool (*compose) (const hb_ot_shape_normalize_context_t *c,
+		   hb_codepoint_t  a,
+		   hb_codepoint_t  b,
+		   hb_codepoint_t *ab);
+};
+
+
+#endif /* HB_OT_SHAPE_NORMALIZE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape.cc
new file mode 100644
index 0000000..e9d97c9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape.cc
@@ -0,0 +1,1083 @@
+/*
+ * Copyright © 2009,2010  Red Hat, Inc.
+ * Copyright © 2010,2011,2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-shaper-impl.hh"
+
+#include "hb-ot-shape.hh"
+#include "hb-ot-shape-complex.hh"
+#include "hb-ot-shape-fallback.hh"
+#include "hb-ot-shape-normalize.hh"
+
+#include "hb-ot-face.hh"
+
+#include "hb-set.hh"
+
+#include "hb-aat-layout.hh"
+
+
+/**
+ * SECTION:hb-ot-shape
+ * @title: hb-ot-shape
+ * @short_description: OpenType shaping support
+ * @include: hb-ot.h
+ *
+ * Support functions for OpenType shaping related queries.
+ **/
+
+
+static void
+hb_ot_shape_collect_features (hb_ot_shape_planner_t          *planner,
+			      const hb_feature_t             *user_features,
+			      unsigned int                    num_user_features);
+
+static bool
+_hb_apply_morx (hb_face_t *face)
+{
+  if (hb_options ().aat &&
+      hb_aat_layout_has_substitution (face))
+    return true;
+
+  /* Ignore empty GSUB tables. */
+  return (!hb_ot_layout_has_substitution (face) ||
+	  !hb_ot_layout_table_get_script_tags (face,
+					       HB_OT_TAG_GSUB,
+					       0, nullptr, nullptr)) &&
+	 hb_aat_layout_has_substitution (face);
+}
+
+hb_ot_shape_planner_t::hb_ot_shape_planner_t (hb_face_t                     *face,
+					      const hb_segment_properties_t *props) :
+						face (face),
+						props (*props),
+						map (face, props),
+						aat_map (face, props),
+						apply_morx (_hb_apply_morx (face))
+{
+  shaper = hb_ot_shape_complex_categorize (this);
+
+  script_zero_marks = shaper->zero_width_marks != HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE;
+  script_fallback_mark_positioning = shaper->fallback_position;
+
+  if (apply_morx)
+    shaper = &_hb_ot_complex_shaper_default;
+}
+
+void
+hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t           &plan,
+				const hb_ot_shape_plan_key_t &key)
+{
+  plan.props = props;
+  plan.shaper = shaper;
+  map.compile (plan.map, key);
+  if (apply_morx)
+    aat_map.compile (plan.aat_map);
+
+  plan.frac_mask = plan.map.get_1_mask (HB_TAG ('f','r','a','c'));
+  plan.numr_mask = plan.map.get_1_mask (HB_TAG ('n','u','m','r'));
+  plan.dnom_mask = plan.map.get_1_mask (HB_TAG ('d','n','o','m'));
+  plan.has_frac = plan.frac_mask || (plan.numr_mask && plan.dnom_mask);
+  plan.rtlm_mask = plan.map.get_1_mask (HB_TAG ('r','t','l','m'));
+  hb_tag_t kern_tag = HB_DIRECTION_IS_HORIZONTAL (props.direction) ?
+		      HB_TAG ('k','e','r','n') : HB_TAG ('v','k','r','n');
+  plan.kern_mask = plan.map.get_mask (kern_tag);
+  plan.trak_mask = plan.map.get_mask (HB_TAG ('t','r','a','k'));
+
+  plan.requested_kerning = !!plan.kern_mask;
+  plan.requested_tracking = !!plan.trak_mask;
+  bool has_gpos_kern = plan.map.get_feature_index (1, kern_tag) != HB_OT_LAYOUT_NO_FEATURE_INDEX;
+  bool disable_gpos = plan.shaper->gpos_tag &&
+		      plan.shaper->gpos_tag != plan.map.chosen_script[1];
+
+  /*
+   * Decide who provides glyph classes. GDEF or Unicode.
+   */
+
+  if (!hb_ot_layout_has_glyph_classes (face))
+    plan.fallback_glyph_classes = true;
+
+  /*
+   * Decide who does substitutions. GSUB, morx, or fallback.
+   */
+
+  plan.apply_morx = apply_morx;
+
+  /*
+   * Decide who does positioning. GPOS, kerx, kern, or fallback.
+   */
+
+  if (hb_options ().aat && hb_aat_layout_has_positioning (face))
+    plan.apply_kerx = true;
+  else if (!apply_morx && !disable_gpos && hb_ot_layout_has_positioning (face))
+    plan.apply_gpos = true;
+  else if (hb_aat_layout_has_positioning (face))
+    plan.apply_kerx = true;
+
+  if (!plan.apply_kerx && !has_gpos_kern)
+  {
+    /* Apparently Apple applies kerx if GPOS kern was not applied. */
+    if (hb_aat_layout_has_positioning (face))
+      plan.apply_kerx = true;
+    else if (hb_ot_layout_has_kerning (face))
+      plan.apply_kern = true;
+  }
+
+  plan.zero_marks = script_zero_marks &&
+		    !plan.apply_kerx &&
+		    (!plan.apply_kern || !hb_ot_layout_has_machine_kerning (face));
+  plan.has_gpos_mark = !!plan.map.get_1_mask (HB_TAG ('m','a','r','k'));
+
+  plan.adjust_mark_positioning_when_zeroing = !plan.apply_gpos &&
+					      !plan.apply_kerx &&
+					      (!plan.apply_kern || !hb_ot_layout_has_cross_kerning (face));
+
+  plan.fallback_mark_positioning = plan.adjust_mark_positioning_when_zeroing &&
+				   script_fallback_mark_positioning;
+
+  /* Currently we always apply trak. */
+  plan.apply_trak = plan.requested_tracking && hb_aat_layout_has_tracking (face);
+}
+
+bool
+hb_ot_shape_plan_t::init0 (hb_face_t                     *face,
+			   const hb_shape_plan_key_t     *key)
+{
+  map.init ();
+  aat_map.init ();
+
+  hb_ot_shape_planner_t planner (face,
+				 &key->props);
+
+  hb_ot_shape_collect_features (&planner,
+				key->user_features,
+				key->num_user_features);
+
+  planner.compile (*this, key->ot);
+
+  if (shaper->data_create)
+  {
+    data = shaper->data_create (this);
+    if (unlikely (!data))
+      return false;
+  }
+
+  return true;
+}
+
+void
+hb_ot_shape_plan_t::fini ()
+{
+  if (shaper->data_destroy)
+    shaper->data_destroy (const_cast<void *> (data));
+
+  map.fini ();
+  aat_map.fini ();
+}
+
+void
+hb_ot_shape_plan_t::substitute (hb_font_t   *font,
+				hb_buffer_t *buffer) const
+{
+  if (unlikely (apply_morx))
+    hb_aat_layout_substitute (this, font, buffer);
+  else
+    map.substitute (this, font, buffer);
+}
+
+void
+hb_ot_shape_plan_t::position (hb_font_t   *font,
+			      hb_buffer_t *buffer) const
+{
+  if (this->apply_gpos)
+    map.position (this, font, buffer);
+  else if (this->apply_kerx)
+    hb_aat_layout_position (this, font, buffer);
+  else if (this->apply_kern)
+    hb_ot_layout_kern (this, font, buffer);
+  else
+    _hb_ot_shape_fallback_kern (this, font, buffer);
+
+  if (this->apply_trak)
+    hb_aat_layout_track (this, font, buffer);
+}
+
+
+static const hb_ot_map_feature_t
+common_features[] =
+{
+  {HB_TAG('c','c','m','p'), F_GLOBAL},
+  {HB_TAG('l','o','c','l'), F_GLOBAL},
+  {HB_TAG('m','a','r','k'), F_GLOBAL_MANUAL_JOINERS},
+  {HB_TAG('m','k','m','k'), F_GLOBAL_MANUAL_JOINERS},
+  {HB_TAG('r','l','i','g'), F_GLOBAL},
+};
+
+
+static const hb_ot_map_feature_t
+horizontal_features[] =
+{
+  {HB_TAG('c','a','l','t'), F_GLOBAL},
+  {HB_TAG('c','l','i','g'), F_GLOBAL},
+  {HB_TAG('c','u','r','s'), F_GLOBAL},
+  {HB_TAG('k','e','r','n'), F_GLOBAL_HAS_FALLBACK},
+  {HB_TAG('l','i','g','a'), F_GLOBAL},
+  {HB_TAG('r','c','l','t'), F_GLOBAL},
+};
+
+static void
+hb_ot_shape_collect_features (hb_ot_shape_planner_t          *planner,
+			      const hb_feature_t             *user_features,
+			      unsigned int                    num_user_features)
+{
+  hb_ot_map_builder_t *map = &planner->map;
+
+  map->enable_feature (HB_TAG('r','v','r','n'));
+  map->add_gsub_pause (nullptr);
+
+  switch (planner->props.direction) {
+    case HB_DIRECTION_LTR:
+      map->enable_feature (HB_TAG ('l','t','r','a'));
+      map->enable_feature (HB_TAG ('l','t','r','m'));
+      break;
+    case HB_DIRECTION_RTL:
+      map->enable_feature (HB_TAG ('r','t','l','a'));
+      map->add_feature (HB_TAG ('r','t','l','m'));
+      break;
+    case HB_DIRECTION_TTB:
+    case HB_DIRECTION_BTT:
+    case HB_DIRECTION_INVALID:
+    default:
+      break;
+  }
+
+  /* Automatic fractions. */
+  map->add_feature (HB_TAG ('f','r','a','c'));
+  map->add_feature (HB_TAG ('n','u','m','r'));
+  map->add_feature (HB_TAG ('d','n','o','m'));
+
+  /* Random! */
+  map->enable_feature (HB_TAG ('r','a','n','d'), F_RANDOM, HB_OT_MAP_MAX_VALUE);
+
+  /* Tracking.  We enable dummy feature here just to allow disabling
+   * AAT 'trak' table using features.
+   * https://github.com/harfbuzz/harfbuzz/issues/1303 */
+  map->enable_feature (HB_TAG ('t','r','a','k'), F_HAS_FALLBACK);
+
+  map->enable_feature (HB_TAG ('H','A','R','F'));
+
+  if (planner->shaper->collect_features)
+    planner->shaper->collect_features (planner);
+
+  map->enable_feature (HB_TAG ('B','U','Z','Z'));
+
+  for (unsigned int i = 0; i < ARRAY_LENGTH (common_features); i++)
+    map->add_feature (common_features[i]);
+
+  if (HB_DIRECTION_IS_HORIZONTAL (planner->props.direction))
+    for (unsigned int i = 0; i < ARRAY_LENGTH (horizontal_features); i++)
+      map->add_feature (horizontal_features[i]);
+  else
+  {
+    /* We really want to find a 'vert' feature if there's any in the font, no
+     * matter which script/langsys it is listed (or not) under.
+     * See various bugs referenced from:
+     * https://github.com/harfbuzz/harfbuzz/issues/63 */
+    map->enable_feature (HB_TAG ('v','e','r','t'), F_GLOBAL_SEARCH);
+  }
+
+  for (unsigned int i = 0; i < num_user_features; i++)
+  {
+    const hb_feature_t *feature = &user_features[i];
+    map->add_feature (feature->tag,
+		      (feature->start == HB_FEATURE_GLOBAL_START &&
+		       feature->end == HB_FEATURE_GLOBAL_END) ?  F_GLOBAL : F_NONE,
+		      feature->value);
+  }
+
+  if (planner->apply_morx)
+  {
+    hb_aat_map_builder_t *aat_map = &planner->aat_map;
+    for (unsigned int i = 0; i < num_user_features; i++)
+    {
+      const hb_feature_t *feature = &user_features[i];
+      aat_map->add_feature (feature->tag, feature->value);
+    }
+  }
+
+  if (planner->shaper->override_features)
+    planner->shaper->override_features (planner);
+}
+
+
+/*
+ * shaper face data
+ */
+
+struct hb_ot_face_data_t {};
+
+hb_ot_face_data_t *
+_hb_ot_shaper_face_data_create (hb_face_t *face)
+{
+  return (hb_ot_face_data_t *) HB_SHAPER_DATA_SUCCEEDED;
+}
+
+void
+_hb_ot_shaper_face_data_destroy (hb_ot_face_data_t *data)
+{
+}
+
+
+/*
+ * shaper font data
+ */
+
+struct hb_ot_font_data_t {};
+
+hb_ot_font_data_t *
+_hb_ot_shaper_font_data_create (hb_font_t *font HB_UNUSED)
+{
+  return (hb_ot_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
+}
+
+void
+_hb_ot_shaper_font_data_destroy (hb_ot_font_data_t *data HB_UNUSED)
+{
+}
+
+
+/*
+ * shaper
+ */
+
+struct hb_ot_shape_context_t
+{
+  hb_ot_shape_plan_t *plan;
+  hb_font_t *font;
+  hb_face_t *face;
+  hb_buffer_t  *buffer;
+  const hb_feature_t *user_features;
+  unsigned int        num_user_features;
+
+  /* Transient stuff */
+  hb_direction_t target_direction;
+};
+
+
+
+/* Main shaper */
+
+
+/* Prepare */
+
+static void
+hb_set_unicode_props (hb_buffer_t *buffer)
+{
+  /* Implement enough of Unicode Graphemes here that shaping
+   * in reverse-direction wouldn't break graphemes.  Namely,
+   * we mark all marks and ZWJ and ZWJ,Extended_Pictographic
+   * sequences as continuations.  The foreach_grapheme()
+   * macro uses this bit.
+   *
+   * https://www.unicode.org/reports/tr29/#Regex_Definitions
+   */
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+  {
+    _hb_glyph_info_set_unicode_props (&info[i], buffer);
+
+    /* Marks are already set as continuation by the above line.
+     * Handle Emoji_Modifier and ZWJ-continuation. */
+    if (unlikely (_hb_glyph_info_get_general_category (&info[i]) == HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL &&
+		  hb_in_range<hb_codepoint_t> (info[i].codepoint, 0x1F3FBu, 0x1F3FFu)))
+    {
+	_hb_glyph_info_set_continuation (&info[i]);
+    }
+    else if (unlikely (_hb_glyph_info_is_zwj (&info[i])))
+    {
+      _hb_glyph_info_set_continuation (&info[i]);
+      if (i + 1 < count &&
+	  _hb_unicode_is_emoji_Extended_Pictographic (info[i + 1].codepoint))
+      {
+        i++;
+	_hb_glyph_info_set_unicode_props (&info[i], buffer);
+	_hb_glyph_info_set_continuation (&info[i]);
+      }
+    }
+    /* Or part of the Other_Grapheme_Extend that is not marks.
+     * As of Unicode 11 that is just:
+     *
+     * 200C          ; Other_Grapheme_Extend # Cf       ZERO WIDTH NON-JOINER
+     * FF9E..FF9F    ; Other_Grapheme_Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+     * E0020..E007F  ; Other_Grapheme_Extend # Cf  [96] TAG SPACE..CANCEL TAG
+     *
+     * ZWNJ is special, we don't want to merge it as there's no need, and keeping
+     * it separate results in more granular clusters.  Ignore Katakana for now.
+     * Tags are used for Emoji sub-region flag sequences:
+     * https://github.com/harfbuzz/harfbuzz/issues/1556
+     */
+    else if (unlikely (hb_in_range<hb_codepoint_t> (info[i].codepoint, 0xE0020u, 0xE007Fu)))
+      _hb_glyph_info_set_continuation (&info[i]);
+  }
+}
+
+static void
+hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
+{
+  if (!(buffer->flags & HB_BUFFER_FLAG_BOT) ||
+      buffer->context_len[0] ||
+      !_hb_glyph_info_is_unicode_mark (&buffer->info[0]))
+    return;
+
+  if (!font->has_glyph (0x25CCu))
+    return;
+
+  hb_glyph_info_t dottedcircle = {0};
+  dottedcircle.codepoint = 0x25CCu;
+  _hb_glyph_info_set_unicode_props (&dottedcircle, buffer);
+
+  buffer->clear_output ();
+
+  buffer->idx = 0;
+  hb_glyph_info_t info = dottedcircle;
+  info.cluster = buffer->cur().cluster;
+  info.mask = buffer->cur().mask;
+  buffer->output_info (info);
+  while (buffer->idx < buffer->len && buffer->successful)
+    buffer->next_glyph ();
+  buffer->swap_buffers ();
+}
+
+static void
+hb_form_clusters (hb_buffer_t *buffer)
+{
+  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII))
+    return;
+
+  if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
+    foreach_grapheme (buffer, start, end)
+      buffer->merge_clusters (start, end);
+  else
+    foreach_grapheme (buffer, start, end)
+      buffer->unsafe_to_break (start, end);
+}
+
+static void
+hb_ensure_native_direction (hb_buffer_t *buffer)
+{
+  hb_direction_t direction = buffer->props.direction;
+  hb_direction_t horiz_dir = hb_script_get_horizontal_direction (buffer->props.script);
+
+  /* TODO vertical:
+   * The only BTT vertical script is Ogham, but it's not clear to me whether OpenType
+   * Ogham fonts are supposed to be implemented BTT or not.  Need to research that
+   * first. */
+  if ((HB_DIRECTION_IS_HORIZONTAL (direction) &&
+       direction != horiz_dir && horiz_dir != HB_DIRECTION_INVALID) ||
+      (HB_DIRECTION_IS_VERTICAL   (direction) &&
+       direction != HB_DIRECTION_TTB))
+  {
+
+    if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
+      foreach_grapheme (buffer, start, end)
+      {
+	buffer->merge_clusters (start, end);
+	buffer->reverse_range (start, end);
+      }
+    else
+      foreach_grapheme (buffer, start, end)
+	/* form_clusters() merged clusters already, we don't merge. */
+	buffer->reverse_range (start, end);
+
+    buffer->reverse ();
+
+    buffer->props.direction = HB_DIRECTION_REVERSE (buffer->props.direction);
+  }
+}
+
+
+/*
+ * Substitute
+ */
+
+static inline void
+hb_ot_mirror_chars (const hb_ot_shape_context_t *c)
+{
+  if (HB_DIRECTION_IS_FORWARD (c->target_direction))
+    return;
+
+  hb_buffer_t *buffer = c->buffer;
+  hb_unicode_funcs_t *unicode = buffer->unicode;
+  hb_mask_t rtlm_mask = c->plan->rtlm_mask;
+
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++) {
+    hb_codepoint_t codepoint = unicode->mirroring (info[i].codepoint);
+    if (likely (codepoint == info[i].codepoint || !c->font->has_glyph (codepoint)))
+      info[i].mask |= rtlm_mask;
+    else
+      info[i].codepoint = codepoint;
+  }
+}
+
+static inline void
+hb_ot_shape_setup_masks_fraction (const hb_ot_shape_context_t *c)
+{
+  if (!(c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) ||
+      !c->plan->has_frac)
+    return;
+
+  hb_buffer_t *buffer = c->buffer;
+
+  hb_mask_t pre_mask, post_mask;
+  if (HB_DIRECTION_IS_FORWARD (buffer->props.direction))
+  {
+    pre_mask = c->plan->numr_mask | c->plan->frac_mask;
+    post_mask = c->plan->frac_mask | c->plan->dnom_mask;
+  }
+  else
+  {
+    pre_mask = c->plan->frac_mask | c->plan->dnom_mask;
+    post_mask = c->plan->numr_mask | c->plan->frac_mask;
+  }
+
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+  {
+    if (info[i].codepoint == 0x2044u) /* FRACTION SLASH */
+    {
+      unsigned int start = i, end = i + 1;
+      while (start &&
+	     _hb_glyph_info_get_general_category (&info[start - 1]) ==
+	     HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER)
+        start--;
+      while (end < count &&
+	     _hb_glyph_info_get_general_category (&info[end]) ==
+	     HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER)
+        end++;
+
+      buffer->unsafe_to_break (start, end);
+
+      for (unsigned int j = start; j < i; j++)
+        info[j].mask |= pre_mask;
+      info[i].mask |= c->plan->frac_mask;
+      for (unsigned int j = i + 1; j < end; j++)
+        info[j].mask |= post_mask;
+
+      i = end - 1;
+    }
+  }
+}
+
+static inline void
+hb_ot_shape_initialize_masks (const hb_ot_shape_context_t *c)
+{
+  hb_ot_map_t *map = &c->plan->map;
+  hb_buffer_t *buffer = c->buffer;
+
+  hb_mask_t global_mask = map->get_global_mask ();
+  buffer->reset_masks (global_mask);
+}
+
+static inline void
+hb_ot_shape_setup_masks (const hb_ot_shape_context_t *c)
+{
+  hb_ot_map_t *map = &c->plan->map;
+  hb_buffer_t *buffer = c->buffer;
+
+  hb_ot_shape_setup_masks_fraction (c);
+
+  if (c->plan->shaper->setup_masks)
+    c->plan->shaper->setup_masks (c->plan, buffer, c->font);
+
+  for (unsigned int i = 0; i < c->num_user_features; i++)
+  {
+    const hb_feature_t *feature = &c->user_features[i];
+    if (!(feature->start == 0 && feature->end == (unsigned int)-1)) {
+      unsigned int shift;
+      hb_mask_t mask = map->get_mask (feature->tag, &shift);
+      buffer->set_masks (feature->value << shift, mask, feature->start, feature->end);
+    }
+  }
+}
+
+static void
+hb_ot_zero_width_default_ignorables (const hb_buffer_t *buffer)
+{
+  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
+      (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES) ||
+      (buffer->flags & HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES))
+    return;
+
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  hb_glyph_position_t *pos = buffer->pos;
+  unsigned int i = 0;
+  for (i = 0; i < count; i++)
+    if (unlikely (_hb_glyph_info_is_default_ignorable (&info[i])))
+      pos[i].x_advance = pos[i].y_advance = pos[i].x_offset = pos[i].y_offset = 0;
+}
+
+static void
+hb_ot_hide_default_ignorables (hb_buffer_t *buffer,
+			       hb_font_t   *font)
+{
+  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
+      (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES))
+    return;
+
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+
+  hb_codepoint_t invisible = buffer->invisible;
+  if (!(buffer->flags & HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES) &&
+      (invisible || font->get_nominal_glyph (' ', &invisible)))
+  {
+    /* Replace default-ignorables with a zero-advance invisible glyph. */
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (_hb_glyph_info_is_default_ignorable (&info[i]))
+	info[i].codepoint = invisible;
+    }
+  }
+  else
+    hb_ot_layout_delete_glyphs_inplace (buffer, _hb_glyph_info_is_default_ignorable);
+}
+
+
+static inline void
+hb_ot_map_glyphs_fast (hb_buffer_t  *buffer)
+{
+  /* Normalization process sets up glyph_index(), we just copy it. */
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    info[i].codepoint = info[i].glyph_index();
+
+  buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
+}
+
+static inline void
+hb_synthesize_glyph_classes (hb_buffer_t *buffer)
+{
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+  {
+    hb_ot_layout_glyph_props_flags_t klass;
+
+    /* Never mark default-ignorables as marks.
+     * They won't get in the way of lookups anyway,
+     * but having them as mark will cause them to be skipped
+     * over if the lookup-flag says so, but at least for the
+     * Mongolian variation selectors, looks like Uniscribe
+     * marks them as non-mark.  Some Mongolian fonts without
+     * GDEF rely on this.  Another notable character that
+     * this applies to is COMBINING GRAPHEME JOINER. */
+    klass = (_hb_glyph_info_get_general_category (&info[i]) !=
+	     HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK ||
+	     _hb_glyph_info_is_default_ignorable (&info[i])) ?
+	    HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH :
+	    HB_OT_LAYOUT_GLYPH_PROPS_MARK;
+    _hb_glyph_info_set_glyph_props (&info[i], klass);
+  }
+}
+
+static inline void
+hb_ot_substitute_default (const hb_ot_shape_context_t *c)
+{
+  hb_buffer_t *buffer = c->buffer;
+
+  hb_ot_mirror_chars (c);
+
+  HB_BUFFER_ALLOCATE_VAR (buffer, glyph_index);
+
+  _hb_ot_shape_normalize (c->plan, buffer, c->font);
+
+  hb_ot_shape_setup_masks (c);
+
+  /* This is unfortunate to go here, but necessary... */
+  if (c->plan->fallback_mark_positioning)
+    _hb_ot_shape_fallback_mark_position_recategorize_marks (c->plan, c->font, buffer);
+
+  hb_ot_map_glyphs_fast (buffer);
+
+  HB_BUFFER_DEALLOCATE_VAR (buffer, glyph_index);
+}
+
+static inline void
+hb_ot_substitute_complex (const hb_ot_shape_context_t *c)
+{
+  hb_buffer_t *buffer = c->buffer;
+
+  hb_ot_layout_substitute_start (c->font, buffer);
+
+  if (c->plan->fallback_glyph_classes)
+    hb_synthesize_glyph_classes (c->buffer);
+
+  c->plan->substitute (c->font, buffer);
+}
+
+static inline void
+hb_ot_substitute_pre (const hb_ot_shape_context_t *c)
+{
+  hb_ot_substitute_default (c);
+
+  _hb_buffer_allocate_gsubgpos_vars (c->buffer);
+
+  hb_ot_substitute_complex (c);
+}
+
+static inline void
+hb_ot_substitute_post (const hb_ot_shape_context_t *c)
+{
+  hb_ot_hide_default_ignorables (c->buffer, c->font);
+  if (c->plan->apply_morx)
+    hb_aat_layout_remove_deleted_glyphs (c->buffer);
+
+  if (c->plan->shaper->postprocess_glyphs)
+    c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font);
+}
+
+
+/*
+ * Position
+ */
+
+static inline void
+adjust_mark_offsets (hb_glyph_position_t *pos)
+{
+  pos->x_offset -= pos->x_advance;
+  pos->y_offset -= pos->y_advance;
+}
+
+static inline void
+zero_mark_width (hb_glyph_position_t *pos)
+{
+  pos->x_advance = 0;
+  pos->y_advance = 0;
+}
+
+static inline void
+zero_mark_widths_by_gdef (hb_buffer_t *buffer, bool adjust_offsets)
+{
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    if (_hb_glyph_info_is_mark (&info[i]))
+    {
+      if (adjust_offsets)
+        adjust_mark_offsets (&buffer->pos[i]);
+      zero_mark_width (&buffer->pos[i]);
+    }
+}
+
+static inline void
+hb_ot_position_default (const hb_ot_shape_context_t *c)
+{
+  hb_direction_t direction = c->buffer->props.direction;
+  unsigned int count = c->buffer->len;
+  hb_glyph_info_t *info = c->buffer->info;
+  hb_glyph_position_t *pos = c->buffer->pos;
+
+  if (HB_DIRECTION_IS_HORIZONTAL (direction))
+  {
+    c->font->get_glyph_h_advances (count, &info[0].codepoint, sizeof(info[0]),
+                                   &pos[0].x_advance, sizeof(pos[0]));
+    /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
+    if (c->font->has_glyph_h_origin_func ())
+      for (unsigned int i = 0; i < count; i++)
+	c->font->subtract_glyph_h_origin (info[i].codepoint,
+					  &pos[i].x_offset,
+					  &pos[i].y_offset);
+  }
+  else
+  {
+    c->font->get_glyph_v_advances (count, &info[0].codepoint, sizeof(info[0]),
+                                   &pos[0].y_advance, sizeof(pos[0]));
+    for (unsigned int i = 0; i < count; i++)
+    {
+      c->font->subtract_glyph_v_origin (info[i].codepoint,
+					&pos[i].x_offset,
+					&pos[i].y_offset);
+    }
+  }
+  if (c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK)
+    _hb_ot_shape_fallback_spaces (c->plan, c->font, c->buffer);
+}
+
+static inline void
+hb_ot_position_complex (const hb_ot_shape_context_t *c)
+{
+  unsigned int count = c->buffer->len;
+  hb_glyph_info_t *info = c->buffer->info;
+  hb_glyph_position_t *pos = c->buffer->pos;
+
+  /* If the font has no GPOS and direction is forward, then when
+   * zeroing mark widths, we shift the mark with it, such that the
+   * mark is positioned hanging over the previous glyph.  When
+   * direction is backward we don't shift and it will end up
+   * hanging over the next glyph after the final reordering.
+   *
+   * Note: If fallback positinoing happens, we don't care about
+   * this as it will be overriden.
+   */
+  bool adjust_offsets_when_zeroing = c->plan->adjust_mark_positioning_when_zeroing &&
+				     HB_DIRECTION_IS_FORWARD (c->buffer->props.direction);
+
+  /* We change glyph origin to what GPOS expects (horizontal), apply GPOS, change it back. */
+
+  /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
+  if (c->font->has_glyph_h_origin_func ())
+    for (unsigned int i = 0; i < count; i++)
+      c->font->add_glyph_h_origin (info[i].codepoint,
+				   &pos[i].x_offset,
+				   &pos[i].y_offset);
+
+  hb_ot_layout_position_start (c->font, c->buffer);
+
+  if (c->plan->zero_marks)
+    switch (c->plan->shaper->zero_width_marks)
+    {
+      case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY:
+	zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing);
+	break;
+
+      default:
+      case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE:
+      case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
+	break;
+    }
+
+  c->plan->position (c->font, c->buffer);
+
+  if (c->plan->zero_marks)
+    switch (c->plan->shaper->zero_width_marks)
+    {
+      case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
+	zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing);
+	break;
+
+      default:
+      case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE:
+      case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY:
+	break;
+    }
+
+  /* Finish off.  Has to follow a certain order. */
+  hb_ot_layout_position_finish_advances (c->font, c->buffer);
+  hb_ot_zero_width_default_ignorables (c->buffer);
+  if (c->plan->apply_morx)
+    hb_aat_layout_zero_width_deleted_glyphs (c->buffer);
+  hb_ot_layout_position_finish_offsets (c->font, c->buffer);
+
+  /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
+  if (c->font->has_glyph_h_origin_func ())
+    for (unsigned int i = 0; i < count; i++)
+      c->font->subtract_glyph_h_origin (info[i].codepoint,
+					&pos[i].x_offset,
+					&pos[i].y_offset);
+
+  if (c->plan->fallback_mark_positioning)
+    _hb_ot_shape_fallback_mark_position (c->plan, c->font, c->buffer,
+					 adjust_offsets_when_zeroing);
+}
+
+static inline void
+hb_ot_position (const hb_ot_shape_context_t *c)
+{
+  c->buffer->clear_positions ();
+
+  hb_ot_position_default (c);
+
+  hb_ot_position_complex (c);
+
+  if (HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction))
+    hb_buffer_reverse (c->buffer);
+
+  _hb_buffer_deallocate_gsubgpos_vars (c->buffer);
+}
+
+static inline void
+hb_propagate_flags (hb_buffer_t *buffer)
+{
+  /* Propagate cluster-level glyph flags to be the same on all cluster glyphs.
+   * Simplifies using them. */
+
+  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK))
+    return;
+
+  hb_glyph_info_t *info = buffer->info;
+
+  foreach_cluster (buffer, start, end)
+  {
+    unsigned int mask = 0;
+    for (unsigned int i = start; i < end; i++)
+      if (info[i].mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
+      {
+	 mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+	 break;
+      }
+    if (mask)
+      for (unsigned int i = start; i < end; i++)
+	info[i].mask |= mask;
+  }
+}
+
+/* Pull it all together! */
+
+static void
+hb_ot_shape_internal (hb_ot_shape_context_t *c)
+{
+  c->buffer->deallocate_var_all ();
+  c->buffer->scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
+  if (likely (!hb_unsigned_mul_overflows (c->buffer->len, HB_BUFFER_MAX_LEN_FACTOR)))
+  {
+    c->buffer->max_len = MAX (c->buffer->len * HB_BUFFER_MAX_LEN_FACTOR,
+			      (unsigned) HB_BUFFER_MAX_LEN_MIN);
+  }
+  if (likely (!hb_unsigned_mul_overflows (c->buffer->len, HB_BUFFER_MAX_OPS_FACTOR)))
+  {
+    c->buffer->max_ops = MAX (c->buffer->len * HB_BUFFER_MAX_OPS_FACTOR,
+			      (unsigned) HB_BUFFER_MAX_OPS_MIN);
+  }
+
+  /* Save the original direction, we use it later. */
+  c->target_direction = c->buffer->props.direction;
+
+  _hb_buffer_allocate_unicode_vars (c->buffer);
+
+  c->buffer->clear_output ();
+
+  hb_ot_shape_initialize_masks (c);
+  hb_set_unicode_props (c->buffer);
+  hb_insert_dotted_circle (c->buffer, c->font);
+
+  hb_form_clusters (c->buffer);
+
+  hb_ensure_native_direction (c->buffer);
+
+  if (c->plan->shaper->preprocess_text)
+    c->plan->shaper->preprocess_text (c->plan, c->buffer, c->font);
+
+  hb_ot_substitute_pre (c);
+  hb_ot_position (c);
+  hb_ot_substitute_post (c);
+
+  hb_propagate_flags (c->buffer);
+
+  _hb_buffer_deallocate_unicode_vars (c->buffer);
+
+  c->buffer->props.direction = c->target_direction;
+
+  c->buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
+  c->buffer->max_ops = HB_BUFFER_MAX_OPS_DEFAULT;
+  c->buffer->deallocate_var_all ();
+}
+
+
+hb_bool_t
+_hb_ot_shape (hb_shape_plan_t    *shape_plan,
+	      hb_font_t          *font,
+	      hb_buffer_t        *buffer,
+	      const hb_feature_t *features,
+	      unsigned int        num_features)
+{
+  hb_ot_shape_context_t c = {&shape_plan->ot, font, font->face, buffer, features, num_features};
+  hb_ot_shape_internal (&c);
+
+  return true;
+}
+
+
+/**
+ * hb_ot_shape_plan_collect_lookups:
+ *
+ * Since: 0.9.7
+ **/
+void
+hb_ot_shape_plan_collect_lookups (hb_shape_plan_t *shape_plan,
+				  hb_tag_t         table_tag,
+				  hb_set_t        *lookup_indexes /* OUT */)
+{
+  shape_plan->ot.collect_lookups (table_tag, lookup_indexes);
+}
+
+
+/* TODO Move this to hb-ot-shape-normalize, make it do decompose, and make it public. */
+static void
+add_char (hb_font_t          *font,
+	  hb_unicode_funcs_t *unicode,
+	  hb_bool_t           mirror,
+	  hb_codepoint_t      u,
+	  hb_set_t           *glyphs)
+{
+  hb_codepoint_t glyph;
+  if (font->get_nominal_glyph (u, &glyph))
+    glyphs->add (glyph);
+  if (mirror)
+  {
+    hb_codepoint_t m = unicode->mirroring (u);
+    if (m != u && font->get_nominal_glyph (m, &glyph))
+      glyphs->add (glyph);
+  }
+}
+
+
+/**
+ * hb_ot_shape_glyphs_closure:
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_ot_shape_glyphs_closure (hb_font_t          *font,
+			    hb_buffer_t        *buffer,
+			    const hb_feature_t *features,
+			    unsigned int        num_features,
+			    hb_set_t           *glyphs)
+{
+  const char *shapers[] = {"ot", nullptr};
+  hb_shape_plan_t *shape_plan = hb_shape_plan_create_cached (font->face, &buffer->props,
+							     features, num_features, shapers);
+
+  bool mirror = hb_script_get_horizontal_direction (buffer->props.script) == HB_DIRECTION_RTL;
+
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    add_char (font, buffer->unicode, mirror, info[i].codepoint, glyphs);
+
+  hb_set_t *lookups = hb_set_create ();
+  hb_ot_shape_plan_collect_lookups (shape_plan, HB_OT_TAG_GSUB, lookups);
+  hb_ot_layout_lookups_substitute_closure (font->face, lookups, glyphs);
+
+  hb_set_destroy (lookups);
+
+  hb_shape_plan_destroy (shape_plan);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape.h
new file mode 100644
index 0000000..7b1bcc0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright © 2013  Red Hat, 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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_H_IN
+#error "Include <hb-ot.h> instead."
+#endif
+
+#ifndef HB_OT_SHAPE_H
+#define HB_OT_SHAPE_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+/* TODO port to shape-plan / set. */
+HB_EXTERN void
+hb_ot_shape_glyphs_closure (hb_font_t          *font,
+			    hb_buffer_t        *buffer,
+			    const hb_feature_t *features,
+			    unsigned int        num_features,
+			    hb_set_t           *glyphs);
+
+HB_EXTERN void
+hb_ot_shape_plan_collect_lookups (hb_shape_plan_t *shape_plan,
+				  hb_tag_t         table_tag,
+				  hb_set_t        *lookup_indexes /* OUT */);
+
+HB_END_DECLS
+
+#endif /* HB_OT_SHAPE_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape.hh
new file mode 100644
index 0000000..73a11e1
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-shape.hh
@@ -0,0 +1,129 @@
+/*
+ * Copyright © 2010  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_SHAPE_HH
+#define HB_OT_SHAPE_HH
+
+#include "hb.hh"
+
+#include "hb-ot-map.hh"
+#include "hb-aat-map.hh"
+
+
+struct hb_ot_shape_plan_key_t
+{
+  unsigned int variations_index[2];
+
+  void init (hb_face_t   *face,
+		    const int   *coords,
+		    unsigned int num_coords)
+  {
+    for (unsigned int table_index = 0; table_index < 2; table_index++)
+      hb_ot_layout_table_find_feature_variations (face,
+						  table_tags[table_index],
+						  coords,
+						  num_coords,
+						  &variations_index[table_index]);
+  }
+
+  bool equal (const hb_ot_shape_plan_key_t *other)
+  {
+    return 0 == memcmp (this, other, sizeof (*this));
+  }
+};
+
+
+struct hb_shape_plan_key_t;
+
+struct hb_ot_shape_plan_t
+{
+  hb_segment_properties_t props;
+  const struct hb_ot_complex_shaper_t *shaper;
+  hb_ot_map_t map;
+  hb_aat_map_t aat_map;
+  const void *data;
+  hb_mask_t frac_mask, numr_mask, dnom_mask;
+  hb_mask_t rtlm_mask;
+  hb_mask_t kern_mask;
+  hb_mask_t trak_mask;
+
+  bool requested_kerning : 1;
+  bool requested_tracking : 1;
+  bool has_frac : 1;
+  bool has_gpos_mark : 1;
+  bool zero_marks : 1;
+  bool fallback_glyph_classes : 1;
+  bool fallback_mark_positioning : 1;
+  bool adjust_mark_positioning_when_zeroing : 1;
+
+  bool apply_gpos : 1;
+  bool apply_kerx : 1;
+  bool apply_kern : 1;
+  bool apply_morx : 1;
+  bool apply_trak : 1;
+
+  void collect_lookups (hb_tag_t table_tag, hb_set_t *lookups) const
+  {
+    unsigned int table_index;
+    switch (table_tag) {
+      case HB_OT_TAG_GSUB: table_index = 0; break;
+      case HB_OT_TAG_GPOS: table_index = 1; break;
+      default: return;
+    }
+    map.collect_lookups (table_index, lookups);
+  }
+
+  HB_INTERNAL bool init0 (hb_face_t                     *face,
+			  const hb_shape_plan_key_t     *key);
+  HB_INTERNAL void fini ();
+
+  HB_INTERNAL void substitute (hb_font_t *font, hb_buffer_t *buffer) const;
+  HB_INTERNAL void position (hb_font_t *font, hb_buffer_t *buffer) const;
+};
+
+struct hb_shape_plan_t;
+
+struct hb_ot_shape_planner_t
+{
+  /* In the order that they are filled in. */
+  hb_face_t *face;
+  hb_segment_properties_t props;
+  hb_ot_map_builder_t map;
+  hb_aat_map_builder_t aat_map;
+  bool apply_morx : 1;
+  bool script_zero_marks : 1;
+  bool script_fallback_mark_positioning : 1;
+  const struct hb_ot_complex_shaper_t *shaper;
+
+  HB_INTERNAL hb_ot_shape_planner_t (hb_face_t                     *face,
+				     const hb_segment_properties_t *props);
+
+  HB_INTERNAL void compile (hb_ot_shape_plan_t           &plan,
+			    const hb_ot_shape_plan_key_t &key);
+};
+
+
+#endif /* HB_OT_SHAPE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-stat-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-stat-table.hh
new file mode 100644
index 0000000..04a2ee9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-stat-table.hh
@@ -0,0 +1,280 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_OT_STAT_TABLE_HH
+#define HB_OT_STAT_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-layout-common.hh"
+
+/*
+ * STAT -- Style Attributes
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/stat
+ */
+#define HB_OT_TAG_STAT HB_TAG('S','T','A','T')
+
+
+namespace OT {
+
+enum
+{
+  OLDER_SIBLING_FONT_ATTRIBUTE = 0x0001,	/* If set, this axis value table
+						 * provides axis value information
+						 * that is applicable to other fonts
+						 * within the same font family. This
+						 * is used if the other fonts were
+						 * released earlier and did not include
+						 * information about values for some axis.
+						 * If newer versions of the other
+						 * fonts include the information
+						 * themselves and are present,
+						 * then this record is ignored. */
+  ELIDABLE_AXIS_VALUE_NAME = 0x0002		/* If set, it indicates that the axis
+						 * value represents the “normal” value
+						 * for the axis and may be omitted when
+						 * composing name strings. */
+  // Reserved = 0xFFFC				/* Reserved for future use — set to zero. */
+};
+
+struct AxisValueFormat1
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier — set to 1. */
+  HBUINT16	axisIndex;	/* Zero-base index into the axis record array
+				 * identifying the axis of design variation
+				 * to which the axis value record applies.
+				 * Must be less than designAxisCount. */
+  HBUINT16	flags;		/* Flags — see below for details. */
+  NameID	valueNameID;	/* The name ID for entries in the 'name' table
+				 * that provide a display string for this
+				 * attribute value. */
+  Fixed		value;		/* A numeric value for this attribute value. */
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+struct AxisValueFormat2
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier — set to 2. */
+  HBUINT16	axisIndex;	/* Zero-base index into the axis record array
+				 * identifying the axis of design variation
+				 * to which the axis value record applies.
+				 * Must be less than designAxisCount. */
+  HBUINT16	flags;		/* Flags — see below for details. */
+  NameID	valueNameID;	/* The name ID for entries in the 'name' table
+				 * that provide a display string for this
+				 * attribute value. */
+  Fixed		nominalValue;	/* A numeric value for this attribute value. */
+  Fixed		rangeMinValue;	/* The minimum value for a range associated
+				 * with the specified name ID. */
+  Fixed		rangeMaxValue;	/* The maximum value for a range associated
+				 * with the specified name ID. */
+  public:
+  DEFINE_SIZE_STATIC (20);
+};
+
+struct AxisValueFormat3
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier — set to 3. */
+  HBUINT16	axisIndex;	/* Zero-base index into the axis record array
+				 * identifying the axis of design variation
+				 * to which the axis value record applies.
+				 * Must be less than designAxisCount. */
+  HBUINT16	flags;		/* Flags — see below for details. */
+  NameID	valueNameID;	/* The name ID for entries in the 'name' table
+				 * that provide a display string for this
+				 * attribute value. */
+  Fixed		value;		/* A numeric value for this attribute value. */
+  Fixed		linkedValue;	/* The numeric value for a style-linked mapping
+				 * from this value. */
+  public:
+  DEFINE_SIZE_STATIC (16);
+};
+
+struct AxisValueRecord
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  HBUINT16	axisIndex;	/* Zero-base index into the axis record array
+				 * identifying the axis to which this value
+				 * applies. Must be less than designAxisCount. */
+  Fixed		value;		/* A numeric value for this attribute value. */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct AxisValueFormat4
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier — set to 4. */
+  HBUINT16	axisCount;	/* The total number of axes contributing to
+				 * this axis-values combination. */
+  HBUINT16	flags;		/* Flags — see below for details. */
+  NameID	valueNameID;	/* The name ID for entries in the 'name' table
+				 * that provide a display string for this
+				 * attribute value. */
+  UnsizedArrayOf<AxisValueRecord>
+		axisValues;	/* Array of AxisValue records that provide the
+				 * combination of axis values, one for each
+				 * contributing axis. */
+  public:
+  DEFINE_SIZE_ARRAY (8, axisValues);
+};
+
+struct AxisValue
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (c->check_struct (this)))
+      return_trace (false);
+
+    switch (u.format)
+    {
+    case 1:  return_trace (likely (u.format1.sanitize (c)));
+    case 2:  return_trace (likely (u.format2.sanitize (c)));
+    case 3:  return_trace (likely (u.format3.sanitize (c)));
+    case 4:  return_trace (likely (u.format4.sanitize (c)));
+    default: return_trace (true);
+    }
+  }
+
+  protected:
+  union
+  {
+  HBUINT16		format;
+  AxisValueFormat1	format1;
+  AxisValueFormat2	format2;
+  AxisValueFormat3	format3;
+  AxisValueFormat4	format4;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+struct StatAxisRecord
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  Tag		tag;		/* A tag identifying the axis of design variation. */
+  NameID	nameID;		/* The name ID for entries in the 'name' table that
+				 * provide a display string for this axis. */
+  HBUINT16	ordering;	/* A value that applications can use to determine
+				 * primary sorting of face names, or for ordering
+				 * of descriptors when composing family or face names. */
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct STAT
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_STAT;
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  majorVersion == 1 &&
+			  minorVersion > 0 &&
+			  designAxesOffset.sanitize (c, this, designAxisCount) &&
+			  offsetToAxisValueOffsets.sanitize (c, this, axisValueCount, &(this+offsetToAxisValueOffsets))));
+  }
+
+  protected:
+  HBUINT16	majorVersion;	/* Major version number of the style attributes
+				 * table — set to 1. */
+  HBUINT16	minorVersion;	/* Minor version number of the style attributes
+				 * table — set to 2. */
+  HBUINT16	designAxisSize;	/* The size in bytes of each axis record. */
+  HBUINT16	designAxisCount;/* The number of design axis records. In a
+				 * font with an 'fvar' table, this value must be
+				 * greater than or equal to the axisCount value
+				 * in the 'fvar' table. In all fonts, must
+				 * be greater than zero if axisValueCount
+				 * is greater than zero. */
+  LNNOffsetTo<UnsizedArrayOf<StatAxisRecord> >
+		designAxesOffset;
+				/* Offset in bytes from the beginning of
+				 * the STAT table to the start of the design
+				 * axes array. If designAxisCount is zero,
+				 * set to zero; if designAxisCount is greater
+				 * than zero, must be greater than zero. */
+  HBUINT16	axisValueCount;	/* The number of axis value tables. */
+  LNNOffsetTo<UnsizedArrayOf<OffsetTo<AxisValue> > >
+		offsetToAxisValueOffsets;
+				/* Offset in bytes from the beginning of
+				 * the STAT table to the start of the design
+				 * axes value offsets array. If axisValueCount
+				 * is zero, set to zero; if axisValueCount is
+				 * greater than zero, must be greater than zero. */
+  NameID	elidedFallbackNameID;
+				/* Name ID used as fallback when projection of
+				 * names into a particular font model produces
+				 * a subfamily name containing only elidable
+				 * elements. */
+  public:
+  DEFINE_SIZE_STATIC (20);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_STAT_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-tag-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-tag-table.hh
new file mode 100644
index 0000000..b7090a0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-tag-table.hh
@@ -0,0 +1,2064 @@
+/* == Start of generated table == */
+/*
+ * The following table is generated by running:
+ *
+ *   ./gen-tag-table.py languagetags language-subtag-registry
+ *
+ * on files with these headers:
+ *
+ * <meta name="updated_at" content="2018-09-07 07:45 PM" />
+ * File-Date: 2018-08-08
+ */
+
+#ifndef HB_OT_TAG_TABLE_HH
+#define HB_OT_TAG_TABLE_HH
+
+static const LangTag ot_languages[] = {
+  {"aa",	{HB_TAG('A','F','R',' ')}},	/* Afar */
+  {"aae",	{HB_TAG('S','Q','I',' ')}},	/* Arbëreshë Albanian -> Albanian */
+  {"aao",	{HB_TAG('A','R','A',' ')}},	/* Algerian Saharan Arabic -> Arabic */
+  {"aat",	{HB_TAG('S','Q','I',' ')}},	/* Arvanitika Albanian -> Albanian */
+  {"ab",	{HB_TAG('A','B','K',' ')}},	/* Abkhazian */
+  {"abh",	{HB_TAG('A','R','A',' ')}},	/* Tajiki Arabic -> Arabic */
+  {"abq",	{HB_TAG('A','B','A',' ')}},	/* Abaza */
+  {"abv",	{HB_TAG('A','R','A',' ')}},	/* Baharna Arabic -> Arabic */
+  {"acf",	{HB_TAG('F','A','N',' ')}},	/* Saint Lucian Creole French -> French Antillean */
+  {"ach",	{HB_TAG('A','C','H',' ')}},	/* Acoli -> Acholi */
+  {"acm",	{HB_TAG('A','R','A',' ')}},	/* Mesopotamian Arabic -> Arabic */
+  {"acq",	{HB_TAG('A','R','A',' ')}},	/* Ta'izzi-Adeni Arabic -> Arabic */
+  {"acr",	{HB_TAG('A','C','R',' ')}},	/* Achi */
+  {"acw",	{HB_TAG('A','R','A',' ')}},	/* Hijazi Arabic -> Arabic */
+  {"acx",	{HB_TAG('A','R','A',' ')}},	/* Omani Arabic -> Arabic */
+  {"acy",	{HB_TAG('A','R','A',' ')}},	/* Cypriot Arabic -> Arabic */
+  {"ada",	{HB_TAG('D','N','G',' ')}},	/* Adangme -> Dangme */
+  {"adf",	{HB_TAG('A','R','A',' ')}},	/* Dhofari Arabic -> Arabic */
+  {"adp",	{HB_TAG('D','Z','N',' ')}},	/* Adap (retired code) -> Dzongkha */
+  {"ady",	{HB_TAG('A','D','Y',' ')}},	/* Adyghe */
+  {"aeb",	{HB_TAG('A','R','A',' ')}},	/* Tunisian Arabic -> Arabic */
+  {"aec",	{HB_TAG('A','R','A',' ')}},	/* Saidi Arabic -> Arabic */
+  {"af",	{HB_TAG('A','F','K',' ')}},	/* Afrikaans */
+  {"afb",	{HB_TAG('A','R','A',' ')}},	/* Gulf Arabic -> Arabic */
+  {"ahg",	{HB_TAG('A','G','W',' ')}},	/* Qimant -> Agaw */
+  {"aht",	{HB_TAG('A','T','H',' ')}},	/* Ahtena -> Athapaskan */
+  {"aii",	{HB_TAG('S','W','A',' '),	/* Assyrian Neo-Aramaic -> Swadaya Aramaic */
+		 HB_TAG('S','Y','R',' ')}},	/* Assyrian Neo-Aramaic -> Syriac */
+  {"aio",	{HB_TAG('A','I','O',' ')}},	/* Aiton */
+  {"aiw",	{HB_TAG('A','R','I',' ')}},	/* Aari */
+  {"ajp",	{HB_TAG('A','R','A',' ')}},	/* South Levantine Arabic -> Arabic */
+  {"ak",	{HB_TAG('A','K','A',' '),	/* Akan [macrolanguage] */
+		 HB_TAG('T','W','I',' ')}},	/* Akan [macrolanguage] -> Twi */
+  {"aln",	{HB_TAG('S','Q','I',' ')}},	/* Gheg Albanian -> Albanian */
+  {"als",	{HB_TAG('S','Q','I',' ')}},	/* Tosk Albanian -> Albanian */
+  {"alt",	{HB_TAG('A','L','T',' ')}},	/* Southern Altai -> Altai */
+  {"am",	{HB_TAG('A','M','H',' ')}},	/* Amharic */
+  {"amf",	{HB_TAG('H','B','N',' ')}},	/* Hamer-Banna -> Hammer-Banna */
+  {"amw",	{HB_TAG('S','Y','R',' ')}},	/* Western Neo-Aramaic -> Syriac */
+  {"an",	{HB_TAG('A','R','G',' ')}},	/* Aragonese */
+  {"ang",	{HB_TAG('A','N','G',' ')}},	/* Old English (ca. 450-1100) -> Anglo-Saxon */
+  {"apc",	{HB_TAG('A','R','A',' ')}},	/* North Levantine Arabic -> Arabic */
+  {"apd",	{HB_TAG('A','R','A',' ')}},	/* Sudanese Arabic -> Arabic */
+  {"apj",	{HB_TAG('A','T','H',' ')}},	/* Jicarilla Apache -> Athapaskan */
+  {"apk",	{HB_TAG('A','T','H',' ')}},	/* Kiowa Apache -> Athapaskan */
+  {"apl",	{HB_TAG('A','T','H',' ')}},	/* Lipan Apache -> Athapaskan */
+  {"apm",	{HB_TAG('A','T','H',' ')}},	/* Mescalero-Chiricahua Apache -> Athapaskan */
+  {"apw",	{HB_TAG('A','T','H',' ')}},	/* Western Apache -> Athapaskan */
+  {"ar",	{HB_TAG('A','R','A',' ')}},	/* Arabic [macrolanguage] */
+  {"arb",	{HB_TAG('A','R','A',' ')}},	/* Standard Arabic -> Arabic */
+  {"arn",	{HB_TAG('M','A','P',' ')}},	/* Mapudungun */
+  {"arq",	{HB_TAG('A','R','A',' ')}},	/* Algerian Arabic -> Arabic */
+  {"ars",	{HB_TAG('A','R','A',' ')}},	/* Najdi Arabic -> Arabic */
+  {"ary",	{HB_TAG('M','O','R',' ')}},	/* Moroccan Arabic -> Moroccan */
+  {"arz",	{HB_TAG('A','R','A',' ')}},	/* Egyptian Arabic -> Arabic */
+  {"as",	{HB_TAG('A','S','M',' ')}},	/* Assamese */
+  {"ast",	{HB_TAG('A','S','T',' ')}},	/* Asturian */
+  {"ath",	{HB_TAG('A','T','H',' ')}},	/* Athapascan [family] -> Athapaskan */
+  {"atj",	{HB_TAG('R','C','R',' ')}},	/* Atikamekw -> R-Cree */
+  {"atv",	{HB_TAG('A','L','T',' ')}},	/* Northern Altai -> Altai */
+  {"auz",	{HB_TAG('A','R','A',' ')}},	/* Uzbeki Arabic -> Arabic */
+  {"av",	{HB_TAG('A','V','R',' ')}},	/* Avaric -> Avar */
+  {"avl",	{HB_TAG('A','R','A',' ')}},	/* Eastern Egyptian Bedawi Arabic -> Arabic */
+  {"awa",	{HB_TAG('A','W','A',' ')}},	/* Awadhi */
+  {"ay",	{HB_TAG('A','Y','M',' ')}},	/* Aymara [macrolanguage] */
+  {"ayc",	{HB_TAG('A','Y','M',' ')}},	/* Southern Aymara -> Aymara */
+  {"ayh",	{HB_TAG('A','R','A',' ')}},	/* Hadrami Arabic -> Arabic */
+  {"ayl",	{HB_TAG('A','R','A',' ')}},	/* Libyan Arabic -> Arabic */
+  {"ayn",	{HB_TAG('A','R','A',' ')}},	/* Sanaani Arabic -> Arabic */
+  {"ayp",	{HB_TAG('A','R','A',' ')}},	/* North Mesopotamian Arabic -> Arabic */
+  {"ayr",	{HB_TAG('A','Y','M',' ')}},	/* Central Aymara -> Aymara */
+  {"az",	{HB_TAG('A','Z','E',' ')}},	/* Azerbaijani [macrolanguage] */
+  {"azb",	{HB_TAG('A','Z','B',' ')}},	/* South Azerbaijani -> Torki */
+  {"azj",	{HB_TAG('A','Z','E',' ')}},	/* North Azerbaijani -> Azerbaijani */
+  {"ba",	{HB_TAG('B','S','H',' ')}},	/* Bashkir */
+  {"bad",	{HB_TAG('B','A','D','0')}},	/* Banda [family] */
+  {"bai",	{HB_TAG('B','M','L',' ')}},	/* Bamileke [family] */
+  {"bal",	{HB_TAG('B','L','I',' ')}},	/* Baluchi [macrolanguage] */
+  {"ban",	{HB_TAG('B','A','N',' ')}},	/* Balinese */
+  {"bar",	{HB_TAG('B','A','R',' ')}},	/* Bavarian */
+  {"bbc",	{HB_TAG('B','B','C',' ')}},	/* Batak Toba */
+  {"bbz",	{HB_TAG('A','R','A',' ')}},	/* Babalia Creole Arabic -> Arabic */
+  {"bcc",	{HB_TAG('B','L','I',' ')}},	/* Southern Balochi -> Baluchi */
+  {"bci",	{HB_TAG('B','A','U',' ')}},	/* Baoulé -> Baulé */
+  {"bcl",	{HB_TAG('B','I','K',' ')}},	/* Central Bikol -> Bikol */
+  {"bcq",	{HB_TAG('B','C','H',' ')}},	/* Bench */
+  {"bcr",	{HB_TAG('A','T','H',' ')}},	/* Babine -> Athapaskan */
+  {"bdy",	{HB_TAG('B','D','Y',' ')}},	/* Bandjalang */
+  {"be",	{HB_TAG('B','E','L',' ')}},	/* Belarusian -> Belarussian */
+  {"bea",	{HB_TAG('A','T','H',' ')}},	/* Beaver -> Athapaskan */
+  {"beb",	{HB_TAG('B','T','I',' ')}},	/* Bebele -> Beti */
+  {"bem",	{HB_TAG('B','E','M',' ')}},	/* Bemba (Zambia) */
+  {"ber",	{HB_TAG('B','B','R',' ')}},	/* Berber [family] */
+  {"bfq",	{HB_TAG('B','A','D',' ')}},	/* Badaga */
+  {"bft",	{HB_TAG('B','L','T',' ')}},	/* Balti */
+  {"bfu",	{HB_TAG('L','A','H',' ')}},	/* Gahri -> Lahuli */
+  {"bfy",	{HB_TAG('B','A','G',' ')}},	/* Bagheli -> Baghelkhandi */
+  {"bg",	{HB_TAG('B','G','R',' ')}},	/* Bulgarian */
+  {"bgc",	{HB_TAG('B','G','C',' ')}},	/* Haryanvi */
+  {"bgn",	{HB_TAG('B','L','I',' ')}},	/* Western Balochi -> Baluchi */
+  {"bgp",	{HB_TAG('B','L','I',' ')}},	/* Eastern Balochi -> Baluchi */
+  {"bgq",	{HB_TAG('B','G','Q',' ')}},	/* Bagri */
+  {"bgr",	{HB_TAG('Q','I','N',' ')}},	/* Bawm Chin -> Chin */
+  {"bhb",	{HB_TAG('B','H','I',' ')}},	/* Bhili */
+  {"bhi",	{HB_TAG('B','H','I',' ')}},	/* Bhilali -> Bhili */
+  {"bhk",	{HB_TAG('B','I','K',' ')}},	/* Albay Bicolano (retired code) -> Bikol */
+  {"bho",	{HB_TAG('B','H','O',' ')}},	/* Bhojpuri */
+  {"bhr",	{HB_TAG('M','L','G',' ')}},	/* Bara Malagasy -> Malagasy */
+  {"bi",	{HB_TAG('B','I','S',' ')}},	/* Bislama */
+  {"bik",	{HB_TAG('B','I','K',' ')}},	/* Bikol [macrolanguage] */
+  {"bin",	{HB_TAG('E','D','O',' ')}},	/* Edo */
+  {"bjj",	{HB_TAG('B','J','J',' ')}},	/* Kanauji */
+  {"bjn",	{HB_TAG('M','L','Y',' ')}},	/* Banjar -> Malay */
+  {"bjq",	{HB_TAG('M','L','G',' ')}},	/* Southern Betsimisaraka Malagasy (retired code) -> Malagasy */
+  {"bjt",	{HB_TAG('B','L','N',' ')}},	/* Balanta-Ganja -> Balante */
+  {"bla",	{HB_TAG('B','K','F',' ')}},	/* Siksika -> Blackfoot */
+  {"ble",	{HB_TAG('B','L','N',' ')}},	/* Balanta-Kentohe -> Balante */
+  {"blk",	{HB_TAG('B','L','K',' ')}},	/* Pa'o Karen */
+  {"bln",	{HB_TAG('B','I','K',' ')}},	/* Southern Catanduanes Bikol -> Bikol */
+  {"bm",	{HB_TAG('B','M','B',' ')}},	/* Bambara (Bamanankan) */
+  {"bmm",	{HB_TAG('M','L','G',' ')}},	/* Northern Betsimisaraka Malagasy -> Malagasy */
+  {"bn",	{HB_TAG('B','E','N',' ')}},	/* Bengali */
+  {"bo",	{HB_TAG('T','I','B',' ')}},	/* Tibetan */
+  {"bpy",	{HB_TAG('B','P','Y',' ')}},	/* Bishnupriya -> Bishnupriya Manipuri */
+  {"bqi",	{HB_TAG('L','R','C',' ')}},	/* Bakhtiari -> Luri */
+  {"br",	{HB_TAG('B','R','E',' ')}},	/* Breton */
+  {"bra",	{HB_TAG('B','R','I',' ')}},	/* Braj -> Braj Bhasha */
+  {"brh",	{HB_TAG('B','R','H',' ')}},	/* Brahui */
+  {"brx",	{HB_TAG('B','R','X',' ')}},	/* Bodo (India) */
+  {"bs",	{HB_TAG('B','O','S',' ')}},	/* Bosnian */
+  {"bsk",	{HB_TAG('B','S','K',' ')}},	/* Burushaski */
+  {"btb",	{HB_TAG('B','T','I',' ')}},	/* Beti (Cameroon) (retired code) */
+  {"btj",	{HB_TAG('M','L','Y',' ')}},	/* Bacanese Malay -> Malay */
+  {"bto",	{HB_TAG('B','I','K',' ')}},	/* Rinconada Bikol -> Bikol */
+  {"bts",	{HB_TAG('B','T','S',' ')}},	/* Batak Simalungun */
+  {"bug",	{HB_TAG('B','U','G',' ')}},	/* Buginese -> Bugis */
+  {"bum",	{HB_TAG('B','T','I',' ')}},	/* Bulu (Cameroon) -> Beti */
+  {"bve",	{HB_TAG('M','L','Y',' ')}},	/* Berau Malay -> Malay */
+  {"bvu",	{HB_TAG('M','L','Y',' ')}},	/* Bukit Malay -> Malay */
+  {"bxk",	{HB_TAG('L','U','H',' ')}},	/* Bukusu -> Luyia */
+  {"bxp",	{HB_TAG('B','T','I',' ')}},	/* Bebil -> Beti */
+  {"bxr",	{HB_TAG('R','B','U',' ')}},	/* Russia Buriat -> Russian Buriat */
+  {"byn",	{HB_TAG('B','I','L',' ')}},	/* Bilin -> Bilen */
+  {"byv",	{HB_TAG('B','Y','V',' ')}},	/* Medumba */
+  {"bzc",	{HB_TAG('M','L','G',' ')}},	/* Southern Betsimisaraka Malagasy -> Malagasy */
+  {"ca",	{HB_TAG('C','A','T',' ')}},	/* Catalan */
+  {"caf",	{HB_TAG('C','R','R',' '),	/* Southern Carrier -> Carrier */
+		 HB_TAG('A','T','H',' ')}},	/* Southern Carrier -> Athapaskan */
+  {"cak",	{HB_TAG('C','A','K',' ')}},	/* Kaqchikel */
+  {"cbk",	{HB_TAG('C','B','K',' ')}},	/* Chavacano -> Zamboanga Chavacano */
+  {"cbl",	{HB_TAG('Q','I','N',' ')}},	/* Bualkhaw Chin -> Chin */
+  {"cco",	{HB_TAG('C','C','H','N')}},	/* Comaltepec Chinantec -> Chinantec */
+  {"ccq",	{HB_TAG('A','R','K',' ')}},	/* Chaungtha (retired code) -> Rakhine */
+  {"cdo",	{HB_TAG('Z','H','S',' ')}},	/* Min Dong Chinese -> Chinese Simplified */
+  {"ce",	{HB_TAG('C','H','E',' ')}},	/* Chechen */
+  {"ceb",	{HB_TAG('C','E','B',' ')}},	/* Cebuano */
+  {"cfm",	{HB_TAG('H','A','L',' ')}},	/* Halam (Falam Chin) */
+  {"cgg",	{HB_TAG('C','G','G',' ')}},	/* Chiga */
+  {"ch",	{HB_TAG('C','H','A',' ')}},	/* Chamorro */
+  {"chj",	{HB_TAG('C','C','H','N')}},	/* Ojitlán Chinantec -> Chinantec */
+  {"chk",	{HB_TAG('C','H','K','0')}},	/* Chuukese */
+  {"cho",	{HB_TAG('C','H','O',' ')}},	/* Choctaw */
+  {"chp",	{HB_TAG('C','H','P',' '),	/* Chipewyan */
+		 HB_TAG('S','A','Y',' '),	/* Chipewyan -> Sayisi */
+		 HB_TAG('A','T','H',' ')}},	/* Chipewyan -> Athapaskan */
+  {"chq",	{HB_TAG('C','C','H','N')}},	/* Quiotepec Chinantec -> Chinantec */
+  {"chr",	{HB_TAG('C','H','R',' ')}},	/* Cherokee */
+  {"chy",	{HB_TAG('C','H','Y',' ')}},	/* Cheyenne */
+  {"chz",	{HB_TAG('C','C','H','N')}},	/* Ozumacín Chinantec -> Chinantec */
+  {"ciw",	{HB_TAG('O','J','B',' ')}},	/* Chippewa -> Ojibway */
+  {"cja",	{HB_TAG('C','J','A',' ')}},	/* Western Cham */
+  {"cjm",	{HB_TAG('C','J','M',' ')}},	/* Eastern Cham */
+  {"cjy",	{HB_TAG('Z','H','S',' ')}},	/* Jinyu Chinese -> Chinese Simplified */
+  {"cka",	{HB_TAG('Q','I','N',' ')}},	/* Khumi Awa Chin (retired code) -> Chin */
+  {"ckb",	{HB_TAG('K','U','R',' ')}},	/* Central Kurdish -> Kurdish */
+  {"ckt",	{HB_TAG('C','H','K',' ')}},	/* Chukot -> Chukchi */
+  {"clc",	{HB_TAG('A','T','H',' ')}},	/* Chilcotin -> Athapaskan */
+  {"cld",	{HB_TAG('S','Y','R',' ')}},	/* Chaldean Neo-Aramaic -> Syriac */
+  {"cle",	{HB_TAG('C','C','H','N')}},	/* Lealao Chinantec -> Chinantec */
+  {"cmn",	{HB_TAG('Z','H','S',' ')}},	/* Mandarin Chinese -> Chinese Simplified */
+  {"cmr",	{HB_TAG('Q','I','N',' ')}},	/* Mro-Khimi Chin -> Chin */
+  {"cnb",	{HB_TAG('Q','I','N',' ')}},	/* Chinbon Chin -> Chin */
+  {"cnh",	{HB_TAG('Q','I','N',' ')}},	/* Hakha Chin -> Chin */
+  {"cnk",	{HB_TAG('Q','I','N',' ')}},	/* Khumi Chin -> Chin */
+  {"cnl",	{HB_TAG('C','C','H','N')}},	/* Lalana Chinantec -> Chinantec */
+  {"cnt",	{HB_TAG('C','C','H','N')}},	/* Tepetotutla Chinantec -> Chinantec */
+  {"cnw",	{HB_TAG('Q','I','N',' ')}},	/* Ngawn Chin -> Chin */
+  {"co",	{HB_TAG('C','O','S',' ')}},	/* Corsican */
+  {"coa",	{HB_TAG('M','L','Y',' ')}},	/* Cocos Islands Malay -> Malay */
+  {"cop",	{HB_TAG('C','O','P',' ')}},	/* Coptic */
+  {"coq",	{HB_TAG('A','T','H',' ')}},	/* Coquille -> Athapaskan */
+  {"cpa",	{HB_TAG('C','C','H','N')}},	/* Palantla Chinantec -> Chinantec */
+  {"cpe",	{HB_TAG('C','P','P',' ')}},	/* English-based creoles and pidgins [family] -> Creoles */
+  {"cpf",	{HB_TAG('C','P','P',' ')}},	/* French-based creoles and pidgins [family] -> Creoles */
+  {"cpp",	{HB_TAG('C','P','P',' ')}},	/* Portuguese-based creoles and pidgins [family] -> Creoles */
+  {"cpx",	{HB_TAG('Z','H','S',' ')}},	/* Pu-Xian Chinese -> Chinese Simplified */
+  {"cqd",	{HB_TAG('H','M','N',' ')}},	/* Chuanqiandian Cluster Miao -> Hmong */
+  {"cqu",	{HB_TAG('Q','U','H',' ')}},	/* Chilean Quechua (retired code) -> Quechua (Bolivia) */
+  {"cr",	{HB_TAG('C','R','E',' '),	/* Cree [macrolanguage] */
+		 HB_TAG('Y','C','R',' ')}},	/* Cree [macrolanguage] -> Y-Cree */
+  {"crh",	{HB_TAG('C','R','T',' ')}},	/* Crimean Tatar */
+  {"crj",	{HB_TAG('E','C','R',' ')}},	/* Southern East Cree -> Eastern Cree */
+  {"crk",	{HB_TAG('W','C','R',' ')}},	/* Plains Cree -> West-Cree */
+  {"crl",	{HB_TAG('E','C','R',' ')}},	/* Northern East Cree -> Eastern Cree */
+  {"crm",	{HB_TAG('M','C','R',' '),	/* Moose Cree */
+		 HB_TAG('L','C','R',' ')}},	/* Moose Cree -> L-Cree */
+  {"crp",	{HB_TAG('C','P','P',' ')}},	/* Creoles and pidgins [family] -> Creoles */
+  {"crx",	{HB_TAG('C','R','R',' '),	/* Carrier */
+		 HB_TAG('A','T','H',' ')}},	/* Carrier -> Athapaskan */
+  {"cs",	{HB_TAG('C','S','Y',' ')}},	/* Czech */
+  {"csa",	{HB_TAG('C','C','H','N')}},	/* Chiltepec Chinantec -> Chinantec */
+  {"csb",	{HB_TAG('C','S','B',' ')}},	/* Kashubian */
+  {"csh",	{HB_TAG('Q','I','N',' ')}},	/* Asho Chin -> Chin */
+  {"cso",	{HB_TAG('C','C','H','N')}},	/* Sochiapam Chinantec -> Chinantec */
+  {"csw",	{HB_TAG('N','C','R',' '),	/* Swampy Cree -> N-Cree */
+		 HB_TAG('N','H','C',' ')}},	/* Swampy Cree -> Norway House Cree */
+  {"csy",	{HB_TAG('Q','I','N',' ')}},	/* Siyin Chin -> Chin */
+  {"ctc",	{HB_TAG('A','T','H',' ')}},	/* Chetco -> Athapaskan */
+  {"ctd",	{HB_TAG('Q','I','N',' ')}},	/* Tedim Chin -> Chin */
+  {"cte",	{HB_TAG('C','C','H','N')}},	/* Tepinapa Chinantec -> Chinantec */
+  {"ctg",	{HB_TAG('C','T','G',' ')}},	/* Chittagonian */
+  {"ctl",	{HB_TAG('C','C','H','N')}},	/* Tlacoatzintepec Chinantec -> Chinantec */
+  {"cts",	{HB_TAG('B','I','K',' ')}},	/* Northern Catanduanes Bikol -> Bikol */
+  {"cu",	{HB_TAG('C','S','L',' ')}},	/* Church Slavonic */
+  {"cuc",	{HB_TAG('C','C','H','N')}},	/* Usila Chinantec -> Chinantec */
+  {"cuk",	{HB_TAG('C','U','K',' ')}},	/* San Blas Kuna */
+  {"cv",	{HB_TAG('C','H','U',' ')}},	/* Chuvash */
+  {"cvn",	{HB_TAG('C','C','H','N')}},	/* Valle Nacional Chinantec -> Chinantec */
+  {"cwd",	{HB_TAG('D','C','R',' '),	/* Woods Cree */
+		 HB_TAG('T','C','R',' ')}},	/* Woods Cree -> TH-Cree */
+  {"cy",	{HB_TAG('W','E','L',' ')}},	/* Welsh */
+  {"czh",	{HB_TAG('Z','H','S',' ')}},	/* Huizhou Chinese -> Chinese Simplified */
+  {"czo",	{HB_TAG('Z','H','S',' ')}},	/* Min Zhong Chinese -> Chinese Simplified */
+  {"czt",	{HB_TAG('Q','I','N',' ')}},	/* Zotung Chin -> Chin */
+  {"da",	{HB_TAG('D','A','N',' ')}},	/* Danish */
+  {"dao",	{HB_TAG('Q','I','N',' ')}},	/* Daai Chin -> Chin */
+  {"dap",	{HB_TAG('N','I','S',' ')}},	/* Nisi (India) (retired code) */
+  {"dar",	{HB_TAG('D','A','R',' ')}},	/* Dargwa */
+  {"dax",	{HB_TAG('D','A','X',' ')}},	/* Dayi */
+  {"de",	{HB_TAG('D','E','U',' ')}},	/* German */
+  {"den",	{HB_TAG('S','L','A',' '),	/* Slave (Athapascan) [macrolanguage] -> Slavey */
+		 HB_TAG('A','T','H',' ')}},	/* Slave (Athapascan) [macrolanguage] -> Athapaskan */
+  {"dgo",	{HB_TAG('D','G','O',' ')}},	/* Dogri */
+  {"dgr",	{HB_TAG('A','T','H',' ')}},	/* Dogrib -> Athapaskan */
+  {"dhd",	{HB_TAG('M','A','W',' ')}},	/* Dhundari -> Marwari */
+  {"dhg",	{HB_TAG('D','H','G',' ')}},	/* Dhangu */
+  {"dib",	{HB_TAG('D','N','K',' ')}},	/* South Central Dinka -> Dinka */
+  {"dik",	{HB_TAG('D','N','K',' ')}},	/* Southwestern Dinka -> Dinka */
+  {"din",	{HB_TAG('D','N','K',' ')}},	/* Dinka [macrolanguage] */
+  {"dip",	{HB_TAG('D','N','K',' ')}},	/* Northeastern Dinka -> Dinka */
+  {"diq",	{HB_TAG('D','I','Q',' ')}},	/* Dimli */
+  {"diw",	{HB_TAG('D','N','K',' ')}},	/* Northwestern Dinka -> Dinka */
+  {"dje",	{HB_TAG('D','J','R',' ')}},	/* Zarma */
+  {"djr",	{HB_TAG('D','J','R','0')}},	/* Djambarrpuyngu */
+  {"dks",	{HB_TAG('D','N','K',' ')}},	/* Southeastern Dinka -> Dinka */
+  {"dng",	{HB_TAG('D','U','N',' ')}},	/* Dungan */
+  {"dnj",	{HB_TAG('D','N','J',' ')}},	/* Dan */
+  {"doi",	{HB_TAG('D','G','R',' ')}},	/* Dogri [macrolanguage] */
+  {"drh",	{HB_TAG('M','N','G',' ')}},	/* Darkhat (retired code) -> Mongolian */
+  {"drw",	{HB_TAG('D','R','I',' ')}},	/* Darwazi (retired code) -> Dari */
+  {"dsb",	{HB_TAG('L','S','B',' ')}},	/* Lower Sorbian */
+  {"dty",	{HB_TAG('N','E','P',' ')}},	/* Dotyali -> Nepali */
+  {"duj",	{HB_TAG('D','U','J',' ')}},	/* Dhuwal (retired code) */
+  {"dup",	{HB_TAG('M','L','Y',' ')}},	/* Duano -> Malay */
+  {"dv",	{HB_TAG('D','I','V',' '),	/* Divehi (Dhivehi, Maldivian) */
+		 HB_TAG('D','H','V',' ')}},	/* Divehi (Dhivehi, Maldivian) (deprecated) */
+  {"dwu",	{HB_TAG('D','U','J',' ')}},	/* Dhuwal */
+  {"dwy",	{HB_TAG('D','U','J',' ')}},	/* Dhuwaya -> Dhuwal */
+  {"dyu",	{HB_TAG('J','U','L',' ')}},	/* Dyula -> 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 -> Estonian */
+  {"el",	{HB_TAG('E','L','L',' ')}},	/* Modern Greek (1453-) -> Greek */
+  {"emk",	{HB_TAG('E','M','K',' '),	/* Eastern Maninkakan */
+		 HB_TAG('M','N','K',' ')}},	/* Eastern Maninkakan -> Maninka */
+  {"en",	{HB_TAG('E','N','G',' ')}},	/* English */
+  {"enb",	{HB_TAG('K','A','L',' ')}},	/* Markweeta -> Kalenjin */
+  {"enf",	{HB_TAG('F','N','E',' ')}},	/* Forest Enets -> Forest Nenets */
+  {"enh",	{HB_TAG('T','N','E',' ')}},	/* Tundra Enets -> Tundra Nenets */
+  {"eo",	{HB_TAG('N','T','O',' ')}},	/* Esperanto */
+  {"es",	{HB_TAG('E','S','P',' ')}},	/* Spanish */
+  {"esg",	{HB_TAG('G','O','N',' ')}},	/* Aheri Gondi -> Gondi */
+  {"esi",	{HB_TAG('I','P','K',' ')}},	/* North Alaskan Inupiatun -> Inupiat */
+  {"esk",	{HB_TAG('I','P','K',' ')}},	/* Northwest Alaska Inupiatun -> Inupiat */
+  {"esu",	{HB_TAG('E','S','U',' ')}},	/* Central Yupik */
+  {"et",	{HB_TAG('E','T','I',' ')}},	/* Estonian [macrolanguage] */
+  {"eto",	{HB_TAG('B','T','I',' ')}},	/* Eton (Cameroon) -> Beti */
+  {"eu",	{HB_TAG('E','U','Q',' ')}},	/* Basque */
+  {"eve",	{HB_TAG('E','V','N',' ')}},	/* Even */
+  {"evn",	{HB_TAG('E','V','K',' ')}},	/* Evenki */
+  {"ewo",	{HB_TAG('B','T','I',' ')}},	/* Ewondo -> Beti */
+  {"eyo",	{HB_TAG('K','A','L',' ')}},	/* Keiyo -> Kalenjin */
+  {"fa",	{HB_TAG('F','A','R',' ')}},	/* Persian [macrolanguage] */
+  {"fan",	{HB_TAG('F','A','N','0')}},	/* Fang (Equatorial Guinea) */
+  {"fat",	{HB_TAG('F','A','T',' ')}},	/* Fanti */
+  {"fbl",	{HB_TAG('B','I','K',' ')}},	/* West Albay Bikol -> Bikol */
+  {"ff",	{HB_TAG('F','U','L',' ')}},	/* Fulah [macrolanguage] */
+  {"ffm",	{HB_TAG('F','U','L',' ')}},	/* Maasina Fulfulde -> Fulah */
+  {"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 (Falam Chin) (retired code) */
+		 HB_TAG('Q','I','N',' ')}},	/* Falam Chin (retired code) -> Chin */
+  {"fmp",	{HB_TAG('F','M','P',' ')}},	/* Fe'fe' */
+  {"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 */
+  {"fub",	{HB_TAG('F','U','L',' ')}},	/* Adamawa Fulfulde -> Fulah */
+  {"fuc",	{HB_TAG('F','U','L',' ')}},	/* Pulaar -> Fulah */
+  {"fue",	{HB_TAG('F','U','L',' ')}},	/* Borgu Fulfulde -> Fulah */
+  {"fuf",	{HB_TAG('F','T','A',' ')}},	/* Pular -> Futa */
+  {"fuh",	{HB_TAG('F','U','L',' ')}},	/* Western Niger Fulfulde -> Fulah */
+  {"fui",	{HB_TAG('F','U','L',' ')}},	/* Bagirmi Fulfulde -> Fulah */
+  {"fuq",	{HB_TAG('F','U','L',' ')}},	/* Central-Eastern Niger Fulfulde -> Fulah */
+  {"fur",	{HB_TAG('F','R','L',' ')}},	/* Friulian */
+  {"fuv",	{HB_TAG('F','U','V',' ')}},	/* Nigerian Fulfulde */
+  {"fy",	{HB_TAG('F','R','I',' ')}},	/* Western Frisian -> Frisian */
+  {"ga",	{HB_TAG('I','R','I',' ')}},	/* Irish */
+  {"gaa",	{HB_TAG('G','A','D',' ')}},	/* Ga */
+  {"gag",	{HB_TAG('G','A','G',' ')}},	/* Gagauz */
+  {"gan",	{HB_TAG('Z','H','S',' ')}},	/* Gan Chinese -> Chinese Simplified */
+  {"gax",	{HB_TAG('O','R','O',' ')}},	/* Borana-Arsi-Guji Oromo -> Oromo */
+  {"gaz",	{HB_TAG('O','R','O',' ')}},	/* West Central Oromo -> Oromo */
+  {"gbm",	{HB_TAG('G','A','W',' ')}},	/* Garhwali */
+  {"gce",	{HB_TAG('A','T','H',' ')}},	/* Galice -> Athapaskan */
+  {"gd",	{HB_TAG('G','A','E',' ')}},	/* Scottish Gaelic (Gaelic) */
+  {"gda",	{HB_TAG('R','A','J',' ')}},	/* Gade Lohar -> Rajasthani */
+  {"gez",	{HB_TAG('G','E','Z',' ')}},	/* Geez */
+  {"ggo",	{HB_TAG('G','O','N',' ')}},	/* Southern Gondi (retired code) -> Gondi */
+  {"gih",	{HB_TAG('G','I','H',' ')}},	/* Githabul */
+  {"gil",	{HB_TAG('G','I','L','0')}},	/* Kiribati (Gilbertese) */
+  {"gju",	{HB_TAG('R','A','J',' ')}},	/* Gujari -> Rajasthani */
+  {"gkp",	{HB_TAG('G','K','P',' ')}},	/* Guinea Kpelle -> Kpelle (Guinea) */
+  {"gl",	{HB_TAG('G','A','L',' ')}},	/* Galician */
+  {"gld",	{HB_TAG('N','A','N',' ')}},	/* Nanai */
+  {"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 -> Gondi */
+  {"gnw",	{HB_TAG('G','U','A',' ')}},	/* Western Bolivian Guaraní -> Guarani */
+  {"gog",	{HB_TAG('G','O','G',' ')}},	/* Gogo */
+  {"gom",	{HB_TAG('K','O','K',' ')}},	/* Goan Konkani -> Konkani */
+  {"gon",	{HB_TAG('G','O','N',' ')}},	/* Gondi [macrolanguage] */
+  {"grt",	{HB_TAG('G','R','O',' ')}},	/* Garo */
+  {"gru",	{HB_TAG('S','O','G',' ')}},	/* Kistane -> 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 */
+  {"gug",	{HB_TAG('G','U','A',' ')}},	/* Paraguayan Guaraní -> Guarani */
+  {"gui",	{HB_TAG('G','U','A',' ')}},	/* Eastern Bolivian Guaraní -> Guarani */
+  {"guk",	{HB_TAG('G','M','Z',' '),	/* Gumuz */
+		 HB_TAG('G','U','K',' ')}},	/* Gumuz (SIL fonts) */
+  {"gun",	{HB_TAG('G','U','A',' ')}},	/* Mbyá Guaraní -> Guarani */
+  {"guz",	{HB_TAG('G','U','Z',' ')}},	/* Gusii */
+  {"gv",	{HB_TAG('M','N','X',' ')}},	/* Manx */
+  {"gwi",	{HB_TAG('A','T','H',' ')}},	/* Gwichʼin -> Athapaskan */
+  {"ha",	{HB_TAG('H','A','U',' ')}},	/* Hausa */
+  {"haa",	{HB_TAG('A','T','H',' ')}},	/* Han -> Athapaskan */
+  {"hae",	{HB_TAG('O','R','O',' ')}},	/* Eastern Oromo -> Oromo */
+  {"hak",	{HB_TAG('Z','H','S',' ')}},	/* Hakka Chinese -> Chinese Simplified */
+  {"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 */
+  {"hea",	{HB_TAG('H','M','N',' ')}},	/* Northern Qiandong Miao -> Hmong */
+  {"hi",	{HB_TAG('H','I','N',' ')}},	/* Hindi */
+  {"hil",	{HB_TAG('H','I','L',' ')}},	/* Hiligaynon */
+  {"hji",	{HB_TAG('M','L','Y',' ')}},	/* Haji -> Malay */
+  {"hlt",	{HB_TAG('Q','I','N',' ')}},	/* Matu Chin -> Chin */
+  {"hma",	{HB_TAG('H','M','N',' ')}},	/* Southern Mashan Hmong -> Hmong */
+  {"hmc",	{HB_TAG('H','M','N',' ')}},	/* Central Huishui Hmong -> Hmong */
+  {"hmd",	{HB_TAG('H','M','N',' ')}},	/* Large Flowery Miao -> Hmong */
+  {"hme",	{HB_TAG('H','M','N',' ')}},	/* Eastern Huishui Hmong -> Hmong */
+  {"hmg",	{HB_TAG('H','M','N',' ')}},	/* Southwestern Guiyang Hmong -> Hmong */
+  {"hmh",	{HB_TAG('H','M','N',' ')}},	/* Southwestern Huishui Hmong -> Hmong */
+  {"hmi",	{HB_TAG('H','M','N',' ')}},	/* Northern Huishui Hmong -> Hmong */
+  {"hmj",	{HB_TAG('H','M','N',' ')}},	/* Ge -> Hmong */
+  {"hml",	{HB_TAG('H','M','N',' ')}},	/* Luopohe Hmong -> Hmong */
+  {"hmm",	{HB_TAG('H','M','N',' ')}},	/* Central Mashan Hmong -> Hmong */
+  {"hmn",	{HB_TAG('H','M','N',' ')}},	/* Hmong [macrolanguage] */
+  {"hmp",	{HB_TAG('H','M','N',' ')}},	/* Northern Mashan Hmong -> Hmong */
+  {"hmq",	{HB_TAG('H','M','N',' ')}},	/* Eastern Qiandong Miao -> Hmong */
+  {"hms",	{HB_TAG('H','M','N',' ')}},	/* Southern Qiandong Miao -> Hmong */
+  {"hmw",	{HB_TAG('H','M','N',' ')}},	/* Western Mashan Hmong -> Hmong */
+  {"hmy",	{HB_TAG('H','M','N',' ')}},	/* Southern Guiyang Hmong -> Hmong */
+  {"hmz",	{HB_TAG('H','M','N',' ')}},	/* Hmong Shua -> Hmong */
+  {"hnd",	{HB_TAG('H','N','D',' ')}},	/* Southern Hindko -> Hindko */
+  {"hne",	{HB_TAG('C','H','H',' ')}},	/* Chhattisgarhi -> Chattisgarhi */
+  {"hnj",	{HB_TAG('H','M','N',' ')}},	/* Hmong Njua -> Hmong */
+  {"hno",	{HB_TAG('H','N','D',' ')}},	/* Northern Hindko -> Hindko */
+  {"ho",	{HB_TAG('H','M','O',' ')}},	/* Hiri Motu */
+  {"hoc",	{HB_TAG('H','O',' ',' ')}},	/* Ho */
+  {"hoi",	{HB_TAG('A','T','H',' ')}},	/* Holikachuk -> Athapaskan */
+  {"hoj",	{HB_TAG('H','A','R',' ')}},	/* Hadothi -> Harauti */
+  {"hr",	{HB_TAG('H','R','V',' ')}},	/* Croatian */
+  {"hrm",	{HB_TAG('H','M','N',' ')}},	/* Horned Miao -> Hmong */
+  {"hsb",	{HB_TAG('U','S','B',' ')}},	/* Upper Sorbian */
+  {"hsn",	{HB_TAG('Z','H','S',' ')}},	/* Xiang Chinese -> Chinese Simplified */
+  {"ht",	{HB_TAG('H','A','I',' ')}},	/* Haitian (Haitian Creole) */
+  {"hu",	{HB_TAG('H','U','N',' ')}},	/* Hungarian */
+  {"huj",	{HB_TAG('H','M','N',' ')}},	/* Northern Guiyang Hmong -> Hmong */
+  {"hup",	{HB_TAG('A','T','H',' ')}},	/* Hupa -> Athapaskan */
+  {"hy",	{HB_TAG('H','Y','E','0'),	/* Armenian -> Armenian East */
+		 HB_TAG('H','Y','E',' ')}},	/* Armenian */
+  {"hyw",	{HB_TAG('H','Y','E',' ')}},	/* Western Armenian -> 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 */
+  {"ida",	{HB_TAG('L','U','H',' ')}},	/* Idakho-Isukha-Tiriki -> Luyia */
+  {"ie",	{HB_TAG('I','L','E',' ')}},	/* Interlingue */
+  {"ig",	{HB_TAG('I','B','O',' ')}},	/* Igbo */
+  {"igb",	{HB_TAG('E','B','I',' ')}},	/* Ebira */
+  {"ii",	{HB_TAG('Y','I','M',' ')}},	/* Sichuan Yi -> Yi Modern */
+  {"ijc",	{HB_TAG('I','J','O',' ')}},	/* Izon -> Ijo */
+  {"ijo",	{HB_TAG('I','J','O',' ')}},	/* Ijo [family] */
+  {"ik",	{HB_TAG('I','P','K',' ')}},	/* Inupiaq [macrolanguage] -> Inupiat */
+  {"ike",	{HB_TAG('I','N','U',' ')}},	/* Eastern Canadian Inuktitut -> Inuktitut */
+  {"ikt",	{HB_TAG('I','N','U',' ')}},	/* Inuinnaqtun -> Inuktitut */
+  {"ilo",	{HB_TAG('I','L','O',' ')}},	/* Iloko -> Ilokano */
+  {"in",	{HB_TAG('I','N','D',' ')}},	/* Indonesian (retired code) */
+  {"ing",	{HB_TAG('A','T','H',' ')}},	/* Degexit'an -> Athapaskan */
+  {"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] */
+  {"iw",	{HB_TAG('I','W','R',' ')}},	/* Hebrew (retired code) */
+  {"ja",	{HB_TAG('J','A','N',' ')}},	/* Japanese */
+  {"jak",	{HB_TAG('M','L','Y',' ')}},	/* Jakun -> Malay */
+  {"jam",	{HB_TAG('J','A','M',' ')}},	/* Jamaican Creole English -> Jamaican Creole */
+  {"jax",	{HB_TAG('M','L','Y',' ')}},	/* Jambi Malay -> Malay */
+  {"jbo",	{HB_TAG('J','B','O',' ')}},	/* Lojban */
+  {"jct",	{HB_TAG('J','C','T',' ')}},	/* Krymchak */
+  {"ji",	{HB_TAG('J','I','I',' ')}},	/* Yiddish (retired code) */
+  {"jv",	{HB_TAG('J','A','V',' ')}},	/* Javanese */
+  {"jw",	{HB_TAG('J','A','V',' ')}},	/* Javanese (retired code) */
+  {"ka",	{HB_TAG('K','A','T',' ')}},	/* Georgian */
+  {"kaa",	{HB_TAG('K','R','K',' ')}},	/* Kara-Kalpak -> Karakalpak */
+  {"kab",	{HB_TAG('K','A','B','0')}},	/* Kabyle */
+  {"kam",	{HB_TAG('K','M','B',' ')}},	/* Kamba (Kenya) */
+  {"kar",	{HB_TAG('K','R','N',' ')}},	/* Karen [family] */
+  {"kbd",	{HB_TAG('K','A','B',' ')}},	/* Kabardian */
+  {"kby",	{HB_TAG('K','N','R',' ')}},	/* Manga Kanuri -> Kanuri */
+  {"kca",	{HB_TAG('K','H','K',' '),	/* Khanty -> Khanty-Kazim */
+		 HB_TAG('K','H','S',' '),	/* Khanty -> Khanty-Shurishkar */
+		 HB_TAG('K','H','V',' ')}},	/* Khanty -> Khanty-Vakhi */
+  {"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',' ')}},	/* Kukna -> Kokni */
+  {"kfa",	{HB_TAG('K','O','D',' ')}},	/* Kodava -> Kodagu */
+  {"kfr",	{HB_TAG('K','A','C',' ')}},	/* Kachhi -> Kachchi */
+  {"kfx",	{HB_TAG('K','U','L',' ')}},	/* Kullu Pahari -> Kulvi */
+  {"kfy",	{HB_TAG('K','M','N',' ')}},	/* Kumaoni */
+  {"kg",	{HB_TAG('K','O','N','0')}},	/* Kongo [macrolanguage] */
+  {"kha",	{HB_TAG('K','S','I',' ')}},	/* Khasi */
+  {"khb",	{HB_TAG('X','B','D',' ')}},	/* Lü */
+  {"khk",	{HB_TAG('M','N','G',' ')}},	/* Halh Mongolian -> Mongolian */
+  {"kht",	{HB_TAG('K','H','N',' '),	/* Khamti -> Khamti Shan (Microsoft fonts) */
+		 HB_TAG('K','H','T',' ')}},	/* Khamti -> Khamti Shan (OpenType spec and SIL fonts) */
+  {"khw",	{HB_TAG('K','H','W',' ')}},	/* Khowar */
+  {"ki",	{HB_TAG('K','I','K',' ')}},	/* Kikuyu (Gikuyu) */
+  {"kiu",	{HB_TAG('K','I','U',' ')}},	/* Kirmanjki */
+  {"kj",	{HB_TAG('K','U','A',' ')}},	/* Kuanyama */
+  {"kjd",	{HB_TAG('K','J','D',' ')}},	/* Southern Kiwai */
+  {"kjh",	{HB_TAG('K','H','A',' ')}},	/* Khakas -> Khakass */
+  {"kjp",	{HB_TAG('K','J','P',' ')}},	/* Pwo Eastern Karen -> Eastern Pwo Karen */
+  {"kjz",	{HB_TAG('K','J','Z',' ')}},	/* Bumthangkha */
+  {"kk",	{HB_TAG('K','A','Z',' ')}},	/* Kazakh */
+  {"kkz",	{HB_TAG('A','T','H',' ')}},	/* Kaska -> Athapaskan */
+  {"kl",	{HB_TAG('G','R','N',' ')}},	/* Greenlandic */
+  {"kln",	{HB_TAG('K','A','L',' ')}},	/* Kalenjin [macrolanguage] */
+  {"km",	{HB_TAG('K','H','M',' ')}},	/* Khmer */
+  {"kmb",	{HB_TAG('M','B','N',' ')}},	/* Kimbundu -> Mbundu */
+  {"kmr",	{HB_TAG('K','U','R',' ')}},	/* Northern Kurdish -> Kurdish */
+  {"kmw",	{HB_TAG('K','M','O',' ')}},	/* Komo (Democratic Republic of Congo) */
+  {"kmz",	{HB_TAG('K','M','Z',' ')}},	/* Khorasani Turkish -> Khorasani Turkic */
+  {"kn",	{HB_TAG('K','A','N',' ')}},	/* Kannada */
+  {"knc",	{HB_TAG('K','N','R',' ')}},	/* Central Kanuri -> Kanuri */
+  {"kng",	{HB_TAG('K','O','N','0')}},	/* Koongo -> Kongo */
+  {"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] */
+  {"kos",	{HB_TAG('K','O','S',' ')}},	/* Kosraean */
+  {"koy",	{HB_TAG('A','T','H',' ')}},	/* Koyukon -> Athapaskan */
+  {"kpe",	{HB_TAG('K','P','L',' ')}},	/* Kpelle [macrolanguage] */
+  {"kpv",	{HB_TAG('K','O','Z',' ')}},	/* Komi-Zyrian */
+  {"kpy",	{HB_TAG('K','Y','K',' ')}},	/* Koryak */
+  {"kqs",	{HB_TAG('K','I','S',' ')}},	/* Northern Kissi -> Kisii */
+  {"kqy",	{HB_TAG('K','R','T',' ')}},	/* Koorete */
+  {"kr",	{HB_TAG('K','N','R',' ')}},	/* Kanuri [macrolanguage] */
+  {"krc",	{HB_TAG('K','A','R',' '),	/* Karachay-Balkar -> Karachay */
+		 HB_TAG('B','A','L',' ')}},	/* Karachay-Balkar -> Balkar */
+  {"kri",	{HB_TAG('K','R','I',' ')}},	/* Krio */
+  {"krl",	{HB_TAG('K','R','L',' ')}},	/* Karelian */
+  {"krt",	{HB_TAG('K','N','R',' ')}},	/* Tumari Kanuri -> Kanuri */
+  {"kru",	{HB_TAG('K','U','U',' ')}},	/* Kurukh */
+  {"ks",	{HB_TAG('K','S','H',' ')}},	/* Kashmiri */
+  {"ksh",	{HB_TAG('K','S','H','0')}},	/* Kölsch -> Ripuarian */
+  {"kss",	{HB_TAG('K','I','S',' ')}},	/* Southern Kisi -> Kisii */
+  {"ksw",	{HB_TAG('K','S','W',' ')}},	/* S’gaw Karen */
+  {"ktb",	{HB_TAG('K','E','B',' ')}},	/* Kambaata -> Kebena */
+  {"ktu",	{HB_TAG('K','O','N',' ')}},	/* Kituba (Democratic Republic of Congo) -> Kikongo */
+  {"ktw",	{HB_TAG('A','T','H',' ')}},	/* Kato -> Athapaskan */
+  {"ku",	{HB_TAG('K','U','R',' ')}},	/* Kurdish [macrolanguage] */
+  {"kum",	{HB_TAG('K','U','M',' ')}},	/* Kumyk */
+  {"kuu",	{HB_TAG('A','T','H',' ')}},	/* Upper Kuskokwim -> Athapaskan */
+  {"kv",	{HB_TAG('K','O','M',' ')}},	/* Komi [macrolanguage] */
+  {"kvb",	{HB_TAG('M','L','Y',' ')}},	/* Kubu -> Malay */
+  {"kvr",	{HB_TAG('M','L','Y',' ')}},	/* Kerinci -> Malay */
+  {"kw",	{HB_TAG('C','O','R',' ')}},	/* Cornish */
+  {"kwy",	{HB_TAG('K','O','N','0')}},	/* San Salvador Kongo -> Kongo */
+  {"kxc",	{HB_TAG('K','M','S',' ')}},	/* Konso -> Komso */
+  {"kxd",	{HB_TAG('M','L','Y',' ')}},	/* Brunei -> Malay */
+  {"kxu",	{HB_TAG('K','U','I',' ')}},	/* Kui (India) */
+  {"ky",	{HB_TAG('K','I','R',' ')}},	/* Kirghiz (Kyrgyz) */
+  {"kyu",	{HB_TAG('K','Y','U',' ')}},	/* Western Kayah */
+  {"la",	{HB_TAG('L','A','T',' ')}},	/* Latin */
+  {"lad",	{HB_TAG('J','U','D',' ')}},	/* Ladino */
+  {"lb",	{HB_TAG('L','T','Z',' ')}},	/* Luxembourgish */
+  {"lbe",	{HB_TAG('L','A','K',' ')}},	/* Lak */
+  {"lbj",	{HB_TAG('L','D','K',' ')}},	/* Ladakhi */
+  {"lbl",	{HB_TAG('B','I','K',' ')}},	/* Libon Bikol -> Bikol */
+  {"lce",	{HB_TAG('M','L','Y',' ')}},	/* Loncong -> Malay */
+  {"lcf",	{HB_TAG('M','L','Y',' ')}},	/* Lubu -> Malay */
+  {"ldi",	{HB_TAG('K','O','N','0')}},	/* Laari -> Kongo */
+  {"lez",	{HB_TAG('L','E','Z',' ')}},	/* Lezghian -> Lezgi */
+  {"lg",	{HB_TAG('L','U','G',' ')}},	/* Ganda */
+  {"li",	{HB_TAG('L','I','M',' ')}},	/* Limburgish */
+  {"lif",	{HB_TAG('L','M','B',' ')}},	/* Limbu */
+  {"lij",	{HB_TAG('L','I','J',' ')}},	/* Ligurian */
+  {"lis",	{HB_TAG('L','I','S',' ')}},	/* Lisu */
+  {"liw",	{HB_TAG('M','L','Y',' ')}},	/* Col -> Malay */
+  {"ljp",	{HB_TAG('L','J','P',' ')}},	/* Lampung Api -> Lampung */
+  {"lkb",	{HB_TAG('L','U','H',' ')}},	/* Kabras -> Luyia */
+  {"lki",	{HB_TAG('L','K','I',' ')}},	/* Laki */
+  {"lko",	{HB_TAG('L','U','H',' ')}},	/* Khayo -> Luyia */
+  {"lks",	{HB_TAG('L','U','H',' ')}},	/* Kisa -> Luyia */
+  {"lld",	{HB_TAG('L','A','D',' ')}},	/* Ladin */
+  {"lmn",	{HB_TAG('L','A','M',' ')}},	/* Lambadi -> 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 (Liberia) */
+  {"lrc",	{HB_TAG('L','R','C',' ')}},	/* Northern Luri -> Luri */
+  {"lri",	{HB_TAG('L','U','H',' ')}},	/* Marachi -> Luyia */
+  {"lrm",	{HB_TAG('L','U','H',' ')}},	/* Marama -> Luyia */
+  {"lsm",	{HB_TAG('L','U','H',' ')}},	/* Saamia -> Luyia */
+  {"lt",	{HB_TAG('L','T','H',' ')}},	/* Lithuanian */
+  {"ltg",	{HB_TAG('L','V','I',' ')}},	/* Latgalian -> Latvian */
+  {"lto",	{HB_TAG('L','U','H',' ')}},	/* Tsotso -> Luyia */
+  {"lts",	{HB_TAG('L','U','H',' ')}},	/* Tachoni -> Luyia */
+  {"lu",	{HB_TAG('L','U','B',' ')}},	/* Luba-Katanga */
+  {"lua",	{HB_TAG('L','U','A',' ')}},	/* Luba-Lulua */
+  {"luo",	{HB_TAG('L','U','O',' ')}},	/* Luo (Kenya and Tanzania) */
+  {"lus",	{HB_TAG('M','I','Z',' ')}},	/* Lushai -> Mizo */
+  {"luy",	{HB_TAG('L','U','H',' ')}},	/* Luyia [macrolanguage] */
+  {"luz",	{HB_TAG('L','R','C',' ')}},	/* Southern Luri -> Luri */
+  {"lv",	{HB_TAG('L','V','I',' ')}},	/* Latvian [macrolanguage] */
+  {"lvs",	{HB_TAG('L','V','I',' ')}},	/* Standard Latvian -> Latvian */
+  {"lwg",	{HB_TAG('L','U','H',' ')}},	/* Wanga -> Luyia */
+  {"lzh",	{HB_TAG('Z','H','T',' ')}},	/* Literary Chinese -> Chinese Traditional */
+  {"lzz",	{HB_TAG('L','A','Z',' ')}},	/* Laz */
+  {"mad",	{HB_TAG('M','A','D',' ')}},	/* Madurese -> Madura */
+  {"mag",	{HB_TAG('M','A','G',' ')}},	/* Magahi */
+  {"mai",	{HB_TAG('M','T','H',' ')}},	/* Maithili */
+  {"mak",	{HB_TAG('M','K','R',' ')}},	/* Makasar */
+  {"mam",	{HB_TAG('M','A','M',' ')}},	/* Mam */
+  {"man",	{HB_TAG('M','N','K',' ')}},	/* Mandingo [macrolanguage] -> Maninka */
+  {"max",	{HB_TAG('M','L','Y',' ')}},	/* North Moluccan Malay -> Malay */
+  {"mbo",	{HB_TAG('M','B','O',' ')}},	/* Mbo (Cameroon) */
+  {"mct",	{HB_TAG('B','T','I',' ')}},	/* Mengisa -> Beti */
+  {"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) */
+  {"meo",	{HB_TAG('M','L','Y',' ')}},	/* Kedah Malay -> Malay */
+  {"mer",	{HB_TAG('M','E','R',' ')}},	/* Meru */
+  {"mfa",	{HB_TAG('M','F','A',' ')}},	/* Pattani Malay */
+  {"mfb",	{HB_TAG('M','L','Y',' ')}},	/* Bangka -> Malay */
+  {"mfe",	{HB_TAG('M','F','E',' ')}},	/* Morisyen */
+  {"mg",	{HB_TAG('M','L','G',' ')}},	/* Malagasy [macrolanguage] */
+  {"mh",	{HB_TAG('M','A','H',' ')}},	/* Marshallese */
+  {"mhr",	{HB_TAG('L','M','A',' ')}},	/* Eastern Mari -> Low Mari */
+  {"mhv",	{HB_TAG('A','R','K',' ')}},	/* Arakanese (retired code) -> Rakhine */
+  {"mi",	{HB_TAG('M','R','I',' ')}},	/* Maori */
+  {"min",	{HB_TAG('M','I','N',' ')}},	/* Minangkabau */
+  {"mk",	{HB_TAG('M','K','D',' ')}},	/* Macedonian */
+  {"mku",	{HB_TAG('M','N','K',' ')}},	/* Konyanka Maninka -> Maninka */
+  {"mkw",	{HB_TAG('M','K','W',' ')}},	/* Kituba (Congo) */
+  {"ml",	{HB_TAG('M','A','L',' '),	/* Malayalam -> Malayalam Traditional */
+		 HB_TAG('M','L','R',' ')}},	/* Malayalam -> Malayalam Reformed */
+  {"mlq",	{HB_TAG('M','L','N',' '),	/* Western Maninkakan -> Malinke */
+		 HB_TAG('M','N','K',' ')}},	/* Western Maninkakan -> Maninka */
+  {"mmr",	{HB_TAG('H','M','N',' ')}},	/* Western Xiangxi Miao -> Hmong */
+  {"mn",	{HB_TAG('M','N','G',' ')}},	/* Mongolian [macrolanguage] */
+  {"mnc",	{HB_TAG('M','C','H',' ')}},	/* Manchu */
+  {"mni",	{HB_TAG('M','N','I',' ')}},	/* Manipuri */
+  {"mnk",	{HB_TAG('M','N','D',' '),	/* Mandinka */
+		 HB_TAG('M','N','K',' ')}},	/* Mandinka -> Maninka */
+  {"mnp",	{HB_TAG('Z','H','S',' ')}},	/* Min Bei Chinese -> Chinese Simplified */
+  {"mns",	{HB_TAG('M','A','N',' ')}},	/* Mansi */
+  {"mnw",	{HB_TAG('M','O','N',' ')}},	/* Mon */
+  {"mo",	{HB_TAG('M','O','L',' ')}},	/* Moldavian (retired code) */
+  {"moh",	{HB_TAG('M','O','H',' ')}},	/* Mohawk */
+  {"mos",	{HB_TAG('M','O','S',' ')}},	/* Mossi */
+  {"mpe",	{HB_TAG('M','A','J',' ')}},	/* Majang */
+  {"mqg",	{HB_TAG('M','L','Y',' ')}},	/* Kota Bangun Kutai Malay -> Malay */
+  {"mr",	{HB_TAG('M','A','R',' ')}},	/* Marathi */
+  {"mrh",	{HB_TAG('Q','I','N',' ')}},	/* Mara Chin -> Chin */
+  {"mrj",	{HB_TAG('H','M','A',' ')}},	/* Western Mari -> High Mari */
+  {"ms",	{HB_TAG('M','L','Y',' ')}},	/* Malay [macrolanguage] */
+  {"msc",	{HB_TAG('M','N','K',' ')}},	/* Sankaran Maninka -> Maninka */
+  {"msh",	{HB_TAG('M','L','G',' ')}},	/* Masikoro Malagasy -> Malagasy */
+  {"msi",	{HB_TAG('M','L','Y',' ')}},	/* Sabah Malay -> Malay */
+  {"mt",	{HB_TAG('M','T','S',' ')}},	/* Maltese */
+  {"mtr",	{HB_TAG('M','A','W',' ')}},	/* Mewari -> Marwari */
+  {"mui",	{HB_TAG('M','L','Y',' ')}},	/* Musi -> Malay */
+  {"mup",	{HB_TAG('R','A','J',' ')}},	/* Malvi -> Rajasthani */
+  {"muq",	{HB_TAG('H','M','N',' ')}},	/* Eastern Xiangxi Miao -> Hmong */
+  {"mus",	{HB_TAG('M','U','S',' ')}},	/* Creek -> Muscogee */
+  {"mvb",	{HB_TAG('A','T','H',' ')}},	/* Mattole -> Athapaskan */
+  {"mve",	{HB_TAG('M','A','W',' ')}},	/* Marwari (Pakistan) */
+  {"mvf",	{HB_TAG('M','N','G',' ')}},	/* Peripheral Mongolian -> Mongolian */
+  {"mwk",	{HB_TAG('M','N','K',' ')}},	/* Kita Maninkakan -> Maninka */
+  {"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 [family] */
+  {"myq",	{HB_TAG('M','N','K',' ')}},	/* Forest Maninka (retired code) -> Maninka */
+  {"myv",	{HB_TAG('E','R','Z',' ')}},	/* Erzya */
+  {"mzn",	{HB_TAG('M','Z','N',' ')}},	/* Mazanderani */
+  {"na",	{HB_TAG('N','A','U',' ')}},	/* Nauru -> Nauruan */
+  {"nag",	{HB_TAG('N','A','G',' ')}},	/* Naga Pidgin -> Naga-Assamese */
+  {"nah",	{HB_TAG('N','A','H',' ')}},	/* Nahuatl [family] */
+  {"nan",	{HB_TAG('Z','H','S',' ')}},	/* Min Nan Chinese -> Chinese Simplified */
+  {"nap",	{HB_TAG('N','A','P',' ')}},	/* Neapolitan */
+  {"nb",	{HB_TAG('N','O','R',' ')}},	/* Norwegian Bokmål -> Norwegian */
+  {"nd",	{HB_TAG('N','D','B',' ')}},	/* North Ndebele -> Ndebele */
+  {"ndc",	{HB_TAG('N','D','C',' ')}},	/* Ndau */
+  {"nds",	{HB_TAG('N','D','S',' ')}},	/* Low Saxon */
+  {"ne",	{HB_TAG('N','E','P',' ')}},	/* Nepali [macrolanguage] */
+  {"new",	{HB_TAG('N','E','W',' ')}},	/* Newari */
+  {"ng",	{HB_TAG('N','D','G',' ')}},	/* Ndonga */
+  {"nga",	{HB_TAG('N','G','A',' ')}},	/* Ngbaka */
+  {"ngl",	{HB_TAG('L','M','W',' ')}},	/* Lomwe */
+  {"ngo",	{HB_TAG('S','X','T',' ')}},	/* Ngoni -> Sutu */
+  {"nhd",	{HB_TAG('G','U','A',' ')}},	/* Chiripá -> Guarani */
+  {"niq",	{HB_TAG('K','A','L',' ')}},	/* Nandi -> Kalenjin */
+  {"niu",	{HB_TAG('N','I','U',' ')}},	/* Niuean */
+  {"niv",	{HB_TAG('G','I','L',' ')}},	/* Gilyak */
+  {"njz",	{HB_TAG('N','I','S',' ')}},	/* Nyishi -> Nisi */
+  {"nl",	{HB_TAG('N','L','D',' ')}},	/* Dutch */
+  {"nle",	{HB_TAG('L','U','H',' ')}},	/* East Nyala -> Luyia */
+  {"nn",	{HB_TAG('N','Y','N',' ')}},	/* Norwegian Nynorsk (Nynorsk, Norwegian) */
+  {"no",	{HB_TAG('N','O','R',' ')}},	/* Norwegian [macrolanguage] */
+  {"nod",	{HB_TAG('N','T','A',' ')}},	/* Northern Thai -> Northern Tai */
+  {"noe",	{HB_TAG('N','O','E',' ')}},	/* Nimadi */
+  {"nog",	{HB_TAG('N','O','G',' ')}},	/* Nogai */
+  {"nov",	{HB_TAG('N','O','V',' ')}},	/* Novial */
+  {"npi",	{HB_TAG('N','E','P',' ')}},	/* Nepali */
+  {"nqo",	{HB_TAG('N','K','O',' ')}},	/* N'Ko */
+  {"nr",	{HB_TAG('N','D','B',' ')}},	/* South Ndebele -> Ndebele */
+  {"nsk",	{HB_TAG('N','A','S',' ')}},	/* Naskapi */
+  {"nso",	{HB_TAG('N','S','O',' ')}},	/* Pedi -> Sotho, Northern */
+  {"nv",	{HB_TAG('N','A','V',' '),	/* Navajo */
+		 HB_TAG('A','T','H',' ')}},	/* Navajo -> Athapaskan */
+  {"ny",	{HB_TAG('C','H','I',' ')}},	/* Chichewa (Chewa, Nyanja) */
+  {"nyd",	{HB_TAG('L','U','H',' ')}},	/* Nyore -> Luyia */
+  {"nym",	{HB_TAG('N','Y','M',' ')}},	/* Nyamwezi */
+  {"nyn",	{HB_TAG('N','K','L',' ')}},	/* Nyankole */
+  {"nza",	{HB_TAG('N','Z','A',' ')}},	/* Tigon Mbembe -> Mbembe Tigon */
+  {"oc",	{HB_TAG('O','C','I',' ')}},	/* Occitan (post 1500) */
+  {"oj",	{HB_TAG('O','J','B',' ')}},	/* Ojibwa [macrolanguage] -> Ojibway */
+  {"ojb",	{HB_TAG('O','J','B',' ')}},	/* Northwestern Ojibwa -> Ojibway */
+  {"ojc",	{HB_TAG('O','J','B',' ')}},	/* Central Ojibwa -> Ojibway */
+  {"ojg",	{HB_TAG('O','J','B',' ')}},	/* Eastern Ojibwa -> Ojibway */
+  {"ojs",	{HB_TAG('O','C','R',' ')}},	/* Severn Ojibwa -> Oji-Cree */
+  {"ojw",	{HB_TAG('O','J','B',' ')}},	/* Western Ojibwa -> Ojibway */
+  {"oki",	{HB_TAG('K','A','L',' ')}},	/* Okiek -> Kalenjin */
+  {"okm",	{HB_TAG('K','O','H',' ')}},	/* Middle Korean (10th-16th cent.) -> Korean Old Hangul */
+  {"om",	{HB_TAG('O','R','O',' ')}},	/* Oromo [macrolanguage] */
+  {"or",	{HB_TAG('O','R','I',' ')}},	/* Odia (formerly Oriya) [macrolanguage] */
+  {"orc",	{HB_TAG('O','R','O',' ')}},	/* Orma -> Oromo */
+  {"orn",	{HB_TAG('M','L','Y',' ')}},	/* Orang Kanaq -> Malay */
+  {"ors",	{HB_TAG('M','L','Y',' ')}},	/* Orang Seletar -> Malay */
+  {"ory",	{HB_TAG('O','R','I',' ')}},	/* Odia (formerly Oriya) */
+  {"os",	{HB_TAG('O','S','S',' ')}},	/* Ossetian */
+  {"otw",	{HB_TAG('O','J','B',' ')}},	/* Ottawa -> Ojibway */
+  {"pa",	{HB_TAG('P','A','N',' ')}},	/* Punjabi */
+  {"pag",	{HB_TAG('P','A','G',' ')}},	/* Pangasinan */
+  {"pam",	{HB_TAG('P','A','M',' ')}},	/* Pampanga -> Pampangan */
+  {"pap",	{HB_TAG('P','A','P','0')}},	/* Papiamento -> Papiamentu */
+  {"pau",	{HB_TAG('P','A','U',' ')}},	/* Palauan */
+  {"pbt",	{HB_TAG('P','A','S',' ')}},	/* Southern Pashto -> Pashto */
+  {"pbu",	{HB_TAG('P','A','S',' ')}},	/* Northern Pashto -> Pashto */
+  {"pcc",	{HB_TAG('P','C','C',' ')}},	/* Bouyei */
+  {"pcd",	{HB_TAG('P','C','D',' ')}},	/* Picard */
+  {"pce",	{HB_TAG('P','L','G',' ')}},	/* Ruching Palaung -> Palaung */
+  {"pck",	{HB_TAG('Q','I','N',' ')}},	/* Paite Chin -> Chin */
+  {"pdc",	{HB_TAG('P','D','C',' ')}},	/* Pennsylvania German */
+  {"pel",	{HB_TAG('M','L','Y',' ')}},	/* Pekal -> Malay */
+  {"pes",	{HB_TAG('F','A','R',' ')}},	/* Iranian Persian -> Persian */
+  {"pga",	{HB_TAG('A','R','A',' ')}},	/* Sudanese Creole Arabic -> Arabic */
+  {"phk",	{HB_TAG('P','H','K',' ')}},	/* Phake */
+  {"pi",	{HB_TAG('P','A','L',' ')}},	/* Pali */
+  {"pih",	{HB_TAG('P','I','H',' ')}},	/* Pitcairn-Norfolk -> Norfolk */
+  {"pko",	{HB_TAG('K','A','L',' ')}},	/* Pökoot -> Kalenjin */
+  {"pl",	{HB_TAG('P','L','K',' ')}},	/* Polish */
+  {"pll",	{HB_TAG('P','L','G',' ')}},	/* Shwe Palaung -> Palaung */
+  {"plp",	{HB_TAG('P','A','P',' ')}},	/* Palpa */
+  {"plt",	{HB_TAG('M','L','G',' ')}},	/* Plateau Malagasy -> Malagasy */
+  {"pms",	{HB_TAG('P','M','S',' ')}},	/* Piemontese */
+  {"pnb",	{HB_TAG('P','N','B',' ')}},	/* Western Panjabi */
+  {"poh",	{HB_TAG('P','O','H',' ')}},	/* Poqomchi' -> Pocomchi */
+  {"pon",	{HB_TAG('P','O','N',' ')}},	/* Pohnpeian */
+  {"ppa",	{HB_TAG('B','A','G',' ')}},	/* Pao (retired code) -> Baghelkhandi */
+  {"pro",	{HB_TAG('P','R','O',' ')}},	/* Old Provençal (to 1500) -> Provençal / Old Provençal */
+  {"prs",	{HB_TAG('D','R','I',' ')}},	/* Dari */
+  {"ps",	{HB_TAG('P','A','S',' ')}},	/* Pashto [macrolanguage] */
+  {"pse",	{HB_TAG('M','L','Y',' ')}},	/* Central Malay -> Malay */
+  {"pst",	{HB_TAG('P','A','S',' ')}},	/* Central Pashto -> Pashto */
+  {"pt",	{HB_TAG('P','T','G',' ')}},	/* Portuguese */
+  {"pwo",	{HB_TAG('P','W','O',' ')}},	/* Pwo Western Karen -> Western Pwo Karen */
+  {"qu",	{HB_TAG('Q','U','Z',' ')}},	/* Quechua [macrolanguage] */
+  {"qub",	{HB_TAG('Q','W','H',' ')}},	/* Huallaga Huánuco Quechua -> Quechua (Peru) */
+  {"quc",	{HB_TAG('Q','U','C',' ')}},	/* K’iche’ */
+  {"qud",	{HB_TAG('Q','V','I',' ')}},	/* Calderón Highland Quichua -> Quechua (Ecuador) */
+  {"quf",	{HB_TAG('Q','U','Z',' ')}},	/* Lambayeque Quechua -> Quechua */
+  {"qug",	{HB_TAG('Q','V','I',' ')}},	/* Chimborazo Highland Quichua -> Quechua (Ecuador) */
+  {"quh",	{HB_TAG('Q','U','H',' ')}},	/* South Bolivian Quechua -> Quechua (Bolivia) */
+  {"quk",	{HB_TAG('Q','U','Z',' ')}},	/* Chachapoyas Quechua -> Quechua */
+  {"qul",	{HB_TAG('Q','U','Z',' ')}},	/* North Bolivian Quechua -> Quechua */
+  {"qup",	{HB_TAG('Q','V','I',' ')}},	/* Southern Pastaza Quechua -> Quechua (Ecuador) */
+  {"qur",	{HB_TAG('Q','W','H',' ')}},	/* Yanahuanca Pasco Quechua -> Quechua (Peru) */
+  {"qus",	{HB_TAG('Q','U','H',' ')}},	/* Santiago del Estero Quichua -> Quechua (Bolivia) */
+  {"quw",	{HB_TAG('Q','V','I',' ')}},	/* Tena Lowland Quichua -> Quechua (Ecuador) */
+  {"qux",	{HB_TAG('Q','W','H',' ')}},	/* Yauyos Quechua -> Quechua (Peru) */
+  {"quy",	{HB_TAG('Q','U','Z',' ')}},	/* Ayacucho Quechua -> Quechua */
+  {"quz",	{HB_TAG('Q','U','Z',' ')}},	/* Cusco Quechua -> Quechua */
+  {"qva",	{HB_TAG('Q','W','H',' ')}},	/* Ambo-Pasco Quechua -> Quechua (Peru) */
+  {"qvc",	{HB_TAG('Q','U','Z',' ')}},	/* Cajamarca Quechua -> Quechua */
+  {"qve",	{HB_TAG('Q','U','Z',' ')}},	/* Eastern Apurímac Quechua -> Quechua */
+  {"qvh",	{HB_TAG('Q','W','H',' ')}},	/* Huamalíes-Dos de Mayo Huánuco Quechua -> Quechua (Peru) */
+  {"qvi",	{HB_TAG('Q','V','I',' ')}},	/* Imbabura Highland Quichua -> Quechua (Ecuador) */
+  {"qvj",	{HB_TAG('Q','V','I',' ')}},	/* Loja Highland Quichua -> Quechua (Ecuador) */
+  {"qvl",	{HB_TAG('Q','W','H',' ')}},	/* Cajatambo North Lima Quechua -> Quechua (Peru) */
+  {"qvm",	{HB_TAG('Q','W','H',' ')}},	/* Margos-Yarowilca-Lauricocha Quechua -> Quechua (Peru) */
+  {"qvn",	{HB_TAG('Q','W','H',' ')}},	/* North Junín Quechua -> Quechua (Peru) */
+  {"qvo",	{HB_TAG('Q','V','I',' ')}},	/* Napo Lowland Quechua -> Quechua (Ecuador) */
+  {"qvp",	{HB_TAG('Q','W','H',' ')}},	/* Pacaraos Quechua -> Quechua (Peru) */
+  {"qvs",	{HB_TAG('Q','U','Z',' ')}},	/* San Martín Quechua -> Quechua */
+  {"qvw",	{HB_TAG('Q','W','H',' ')}},	/* Huaylla Wanca Quechua -> Quechua (Peru) */
+  {"qvz",	{HB_TAG('Q','V','I',' ')}},	/* Northern Pastaza Quichua -> Quechua (Ecuador) */
+  {"qwa",	{HB_TAG('Q','W','H',' ')}},	/* Corongo Ancash Quechua -> Quechua (Peru) */
+  {"qwc",	{HB_TAG('Q','U','Z',' ')}},	/* Classical Quechua -> Quechua */
+  {"qwh",	{HB_TAG('Q','W','H',' ')}},	/* Huaylas Ancash Quechua -> Quechua (Peru) */
+  {"qws",	{HB_TAG('Q','W','H',' ')}},	/* Sihuas Ancash Quechua -> Quechua (Peru) */
+  {"qxa",	{HB_TAG('Q','W','H',' ')}},	/* Chiquián Ancash Quechua -> Quechua (Peru) */
+  {"qxc",	{HB_TAG('Q','W','H',' ')}},	/* Chincha Quechua -> Quechua (Peru) */
+  {"qxh",	{HB_TAG('Q','W','H',' ')}},	/* Panao Huánuco Quechua -> Quechua (Peru) */
+  {"qxl",	{HB_TAG('Q','V','I',' ')}},	/* Salasaca Highland Quichua -> Quechua (Ecuador) */
+  {"qxn",	{HB_TAG('Q','W','H',' ')}},	/* Northern Conchucos Ancash Quechua -> Quechua (Peru) */
+  {"qxo",	{HB_TAG('Q','W','H',' ')}},	/* Southern Conchucos Ancash Quechua -> Quechua (Peru) */
+  {"qxp",	{HB_TAG('Q','U','Z',' ')}},	/* Puno Quechua -> Quechua */
+  {"qxr",	{HB_TAG('Q','V','I',' ')}},	/* Cañar Highland Quichua -> Quechua (Ecuador) */
+  {"qxt",	{HB_TAG('Q','W','H',' ')}},	/* Santa Ana de Tusi Pasco Quechua -> Quechua (Peru) */
+  {"qxu",	{HB_TAG('Q','U','Z',' ')}},	/* Arequipa-La Unión Quechua -> Quechua */
+  {"qxw",	{HB_TAG('Q','W','H',' ')}},	/* Jauja Wanca Quechua -> Quechua (Peru) */
+  {"rag",	{HB_TAG('L','U','H',' ')}},	/* Logooli -> Luyia */
+  {"raj",	{HB_TAG('R','A','J',' ')}},	/* Rajasthani [macrolanguage] */
+  {"rar",	{HB_TAG('R','A','R',' ')}},	/* Rarotongan */
+  {"rbb",	{HB_TAG('P','L','G',' ')}},	/* Rumai Palaung -> Palaung */
+  {"rbl",	{HB_TAG('B','I','K',' ')}},	/* Miraya Bikol -> Bikol */
+  {"rej",	{HB_TAG('R','E','J',' ')}},	/* Rejang */
+  {"ria",	{HB_TAG('R','I','A',' ')}},	/* Riang (India) */
+  {"rif",	{HB_TAG('R','I','F',' ')}},	/* Tarifit */
+  {"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 */
+  {"rmc",	{HB_TAG('R','O','Y',' ')}},	/* Carpathian Romani -> Romany */
+  {"rmf",	{HB_TAG('R','O','Y',' ')}},	/* Kalo Finnish Romani -> Romany */
+  {"rml",	{HB_TAG('R','O','Y',' ')}},	/* Baltic Romani -> Romany */
+  {"rmn",	{HB_TAG('R','O','Y',' ')}},	/* Balkan Romani -> Romany */
+  {"rmo",	{HB_TAG('R','O','Y',' ')}},	/* Sinte Romani -> Romany */
+  {"rmw",	{HB_TAG('R','O','Y',' ')}},	/* Welsh Romani -> Romany */
+  {"rmy",	{HB_TAG('R','M','Y',' ')}},	/* Vlax Romani */
+  {"rmz",	{HB_TAG('A','R','K',' ')}},	/* Marma -> Rakhine */
+  {"rn",	{HB_TAG('R','U','N',' ')}},	/* Rundi */
+  {"rnl",	{HB_TAG('H','A','L',' ')}},	/* Ranglong -> Halam (Falam Chin) */
+  {"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 */
+  {"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 -> Sakha */
+  {"sam",	{HB_TAG('P','A','A',' ')}},	/* Samaritan Aramaic -> 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','C','S',' '),	/* North Slavey */
+		 HB_TAG('S','L','A',' '),	/* North Slavey -> Slavey */
+		 HB_TAG('A','T','H',' ')}},	/* North Slavey -> Athapaskan */
+  {"sd",	{HB_TAG('S','N','D',' ')}},	/* Sindhi */
+  {"sdc",	{HB_TAG('S','R','D',' ')}},	/* Sassarese Sardinian -> Sardinian */
+  {"sdh",	{HB_TAG('K','U','R',' ')}},	/* Southern Kurdish -> Kurdish */
+  {"sdn",	{HB_TAG('S','R','D',' ')}},	/* Gallurese Sardinian -> Sardinian */
+  {"se",	{HB_TAG('N','S','M',' ')}},	/* Northern Sami */
+  {"seh",	{HB_TAG('S','N','A',' ')}},	/* Sena */
+  {"sek",	{HB_TAG('A','T','H',' ')}},	/* Sekani -> Athapaskan */
+  {"sel",	{HB_TAG('S','E','L',' ')}},	/* Selkup */
+  {"sez",	{HB_TAG('Q','I','N',' ')}},	/* Senthang Chin -> Chin */
+  {"sfm",	{HB_TAG('H','M','N',' ')}},	/* Small Flowery Miao -> Hmong */
+  {"sg",	{HB_TAG('S','G','O',' ')}},	/* Sango */
+  {"sga",	{HB_TAG('S','G','A',' ')}},	/* Old Irish (to 900) */
+  {"sgc",	{HB_TAG('K','A','L',' ')}},	/* Kipsigis -> Kalenjin */
+  {"sgs",	{HB_TAG('S','G','S',' ')}},	/* Samogitian */
+  {"sgw",	{HB_TAG('C','H','G',' '),	/* Sebat Bet Gurage -> Chaha Gurage */
+		 HB_TAG('S','G','W',' ')}},	/* Sebat Bet Gurage -> Chaha Gurage (SIL fonts) */
+  {"shi",	{HB_TAG('S','H','I',' ')}},	/* Tachelhit */
+  {"shn",	{HB_TAG('S','H','N',' ')}},	/* Shan */
+  {"shu",	{HB_TAG('A','R','A',' ')}},	/* Chadian Arabic -> Arabic */
+  {"si",	{HB_TAG('S','N','H',' ')}},	/* Sinhala (Sinhalese) */
+  {"sid",	{HB_TAG('S','I','D',' ')}},	/* Sidamo */
+  {"sjd",	{HB_TAG('K','S','M',' ')}},	/* Kildin Sami */
+  {"sjo",	{HB_TAG('S','I','B',' ')}},	/* Xibe -> Sibe */
+  {"sk",	{HB_TAG('S','K','Y',' ')}},	/* Slovak */
+  {"skg",	{HB_TAG('M','L','G',' ')}},	/* Sakalava Malagasy -> Malagasy */
+  {"skr",	{HB_TAG('S','R','K',' ')}},	/* Saraiki */
+  {"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','0')}},	/* Shona */
+  {"snk",	{HB_TAG('S','N','K',' ')}},	/* Soninke */
+  {"so",	{HB_TAG('S','M','L',' ')}},	/* Somali */
+  {"sop",	{HB_TAG('S','O','P',' ')}},	/* Songe */
+  {"spv",	{HB_TAG('O','R','I',' ')}},	/* Sambalpuri -> Odia (formerly Oriya) */
+  {"spy",	{HB_TAG('K','A','L',' ')}},	/* Sabaot -> Kalenjin */
+  {"sq",	{HB_TAG('S','Q','I',' ')}},	/* Albanian [macrolanguage] */
+  {"sr",	{HB_TAG('S','R','B',' ')}},	/* Serbian */
+  {"src",	{HB_TAG('S','R','D',' ')}},	/* Logudorese Sardinian -> Sardinian */
+  {"sro",	{HB_TAG('S','R','D',' ')}},	/* Campidanese Sardinian -> Sardinian */
+  {"srr",	{HB_TAG('S','R','R',' ')}},	/* Serer */
+  {"srs",	{HB_TAG('A','T','H',' ')}},	/* Sarsi -> Athapaskan */
+  {"ss",	{HB_TAG('S','W','Z',' ')}},	/* Swati */
+  {"ssh",	{HB_TAG('A','R','A',' ')}},	/* Shihhi Arabic -> Arabic */
+  {"st",	{HB_TAG('S','O','T',' ')}},	/* Southern Sotho -> Sotho, Southern */
+  {"stq",	{HB_TAG('S','T','Q',' ')}},	/* Saterfriesisch -> Saterland Frisian */
+  {"stv",	{HB_TAG('S','I','G',' ')}},	/* Silt'e -> Silte Gurage */
+  {"su",	{HB_TAG('S','U','N',' ')}},	/* Sundanese */
+  {"suk",	{HB_TAG('S','U','K',' ')}},	/* Sukuma */
+  {"suq",	{HB_TAG('S','U','R',' ')}},	/* Suri */
+  {"sv",	{HB_TAG('S','V','E',' ')}},	/* Swedish */
+  {"sva",	{HB_TAG('S','V','A',' ')}},	/* Svan */
+  {"sw",	{HB_TAG('S','W','K',' ')}},	/* Swahili [macrolanguage] */
+  {"swb",	{HB_TAG('C','M','R',' ')}},	/* Maore Comorian -> Comorian */
+  {"swc",	{HB_TAG('S','W','K',' ')}},	/* Congo Swahili -> Swahili */
+  {"swh",	{HB_TAG('S','W','K',' ')}},	/* Swahili */
+  {"swv",	{HB_TAG('M','A','W',' ')}},	/* Shekhawati -> Marwari */
+  {"sxu",	{HB_TAG('S','X','U',' ')}},	/* Upper Saxon */
+  {"syc",	{HB_TAG('S','Y','R',' ')}},	/* Classical Syriac -> Syriac */
+  {"syl",	{HB_TAG('S','Y','L',' ')}},	/* Sylheti */
+  {"syr",	{HB_TAG('S','Y','R',' ')}},	/* Syriac [macrolanguage] */
+  {"szl",	{HB_TAG('S','Z','L',' ')}},	/* Silesian */
+  {"ta",	{HB_TAG('T','A','M',' ')}},	/* Tamil */
+  {"taa",	{HB_TAG('A','T','H',' ')}},	/* Lower Tanana -> Athapaskan */
+  {"tab",	{HB_TAG('T','A','B',' ')}},	/* Tabassaran -> Tabasaran */
+  {"taq",	{HB_TAG('T','M','H',' ')}},	/* Tamasheq -> Tamashek */
+  {"tau",	{HB_TAG('A','T','H',' ')}},	/* Upper Tanana -> Athapaskan */
+  {"tcb",	{HB_TAG('A','T','H',' ')}},	/* Tanacross -> Athapaskan */
+  {"tce",	{HB_TAG('A','T','H',' ')}},	/* Southern Tutchone -> Athapaskan */
+  {"tcp",	{HB_TAG('Q','I','N',' ')}},	/* Tawr Chin -> Chin */
+  {"tcy",	{HB_TAG('T','U','L',' ')}},	/* Tulu -> Tumbuka */
+  {"tcz",	{HB_TAG('Q','I','N',' ')}},	/* Thado Chin -> Chin */
+  {"tdd",	{HB_TAG('T','D','D',' ')}},	/* Tai Nüa -> Dehong Dai */
+  {"tdx",	{HB_TAG('M','L','G',' ')}},	/* Tandroy-Mahafaly Malagasy -> Malagasy */
+  {"te",	{HB_TAG('T','E','L',' ')}},	/* Telugu */
+  {"tec",	{HB_TAG('K','A','L',' ')}},	/* Terik -> Kalenjin */
+  {"tem",	{HB_TAG('T','M','N',' ')}},	/* Timne -> Temne */
+  {"tet",	{HB_TAG('T','E','T',' ')}},	/* Tetum */
+  {"tfn",	{HB_TAG('A','T','H',' ')}},	/* Tanaina -> Athapaskan */
+  {"tg",	{HB_TAG('T','A','J',' ')}},	/* Tajik -> Tajiki */
+  {"tgj",	{HB_TAG('N','I','S',' ')}},	/* Tagin -> Nisi */
+  {"tgx",	{HB_TAG('A','T','H',' ')}},	/* Tagish -> Athapaskan */
+  {"th",	{HB_TAG('T','H','A',' ')}},	/* Thai */
+  {"tht",	{HB_TAG('A','T','H',' ')}},	/* Tahltan -> Athapaskan */
+  {"thv",	{HB_TAG('T','M','H',' ')}},	/* Tahaggart Tamahaq -> Tamashek */
+  {"thz",	{HB_TAG('T','M','H',' ')}},	/* Tayart Tamajeq -> Tamashek */
+  {"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 */
+  {"tkg",	{HB_TAG('M','L','G',' ')}},	/* Tesaka Malagasy -> Malagasy */
+  {"tl",	{HB_TAG('T','G','L',' ')}},	/* Tagalog */
+  {"tmh",	{HB_TAG('T','M','H',' ')}},	/* Tamashek [macrolanguage] */
+  {"tmw",	{HB_TAG('M','L','Y',' ')}},	/* Temuan -> Malay */
+  {"tn",	{HB_TAG('T','N','A',' ')}},	/* Tswana */
+  {"tnf",	{HB_TAG('D','R','I',' ')}},	/* Tangshewi (retired code) -> Dari */
+  {"to",	{HB_TAG('T','G','N',' ')}},	/* Tonga (Tonga Islands) -> Tongan */
+  {"tod",	{HB_TAG('T','O','D','0')}},	/* Toma */
+  {"toi",	{HB_TAG('T','N','G',' ')}},	/* Tonga (Zambia) */
+  {"tol",	{HB_TAG('A','T','H',' ')}},	/* Tolowa -> Athapaskan */
+  {"tpi",	{HB_TAG('T','P','I',' ')}},	/* Tok Pisin */
+  {"tr",	{HB_TAG('T','R','K',' ')}},	/* Turkish */
+  {"tru",	{HB_TAG('T','U','A',' '),	/* Turoyo -> Turoyo Aramaic */
+		 HB_TAG('S','Y','R',' ')}},	/* Turoyo -> Syriac */
+  {"ts",	{HB_TAG('T','S','G',' ')}},	/* Tsonga */
+  {"tsj",	{HB_TAG('T','S','J',' ')}},	/* Tshangla */
+  {"tt",	{HB_TAG('T','A','T',' ')}},	/* Tatar */
+  {"ttm",	{HB_TAG('A','T','H',' ')}},	/* Northern Tutchone -> Athapaskan */
+  {"ttq",	{HB_TAG('T','M','H',' ')}},	/* Tawallammat Tamajaq -> Tamashek */
+  {"tum",	{HB_TAG('T','U','M',' ')}},	/* Tumbuka -> Tulu */
+  {"tuu",	{HB_TAG('A','T','H',' ')}},	/* Tututni -> Athapaskan */
+  {"tuy",	{HB_TAG('K','A','L',' ')}},	/* Tugen -> Kalenjin */
+  {"tvl",	{HB_TAG('T','V','L',' ')}},	/* Tuvalu */
+  {"tw",	{HB_TAG('T','W','I',' '),	/* Twi */
+		 HB_TAG('A','K','A',' ')}},	/* Twi -> Akan */
+  {"txc",	{HB_TAG('A','T','H',' ')}},	/* Tsetsaut -> Athapaskan */
+  {"txy",	{HB_TAG('M','L','G',' ')}},	/* Tanosy Malagasy -> Malagasy */
+  {"ty",	{HB_TAG('T','H','T',' ')}},	/* Tahitian */
+  {"tyv",	{HB_TAG('T','U','V',' ')}},	/* Tuvinian -> Tuvin */
+  {"tyz",	{HB_TAG('T','Y','Z',' ')}},	/* Tày */
+  {"tzm",	{HB_TAG('T','Z','M',' ')}},	/* Central Atlas Tamazight -> Tamazight */
+  {"tzo",	{HB_TAG('T','Z','O',' ')}},	/* Tzotzil */
+  {"ubl",	{HB_TAG('B','I','K',' ')}},	/* Buhi'non Bikol -> Bikol */
+  {"udm",	{HB_TAG('U','D','M',' ')}},	/* Udmurt */
+  {"ug",	{HB_TAG('U','Y','G',' ')}},	/* Uyghur */
+  {"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 */
+  {"urk",	{HB_TAG('M','L','Y',' ')}},	/* Urak Lawoi' -> Malay */
+  {"uz",	{HB_TAG('U','Z','B',' ')}},	/* Uzbek [macrolanguage] */
+  {"uzn",	{HB_TAG('U','Z','B',' ')}},	/* Northern Uzbek -> Uzbek */
+  {"uzs",	{HB_TAG('U','Z','B',' ')}},	/* Southern Uzbek -> Uzbek */
+  {"ve",	{HB_TAG('V','E','N',' ')}},	/* Venda */
+  {"vec",	{HB_TAG('V','E','C',' ')}},	/* Venetian */
+  {"vi",	{HB_TAG('V','I','T',' ')}},	/* Vietnamese */
+  {"vkk",	{HB_TAG('M','L','Y',' ')}},	/* Kaur -> Malay */
+  {"vkt",	{HB_TAG('M','L','Y',' ')}},	/* Tenggarong Kutai Malay -> Malay */
+  {"vls",	{HB_TAG('F','L','E',' ')}},	/* Vlaams -> Dutch (Flemish) */
+  {"vmw",	{HB_TAG('M','A','K',' ')}},	/* Makhuwa */
+  {"vo",	{HB_TAG('V','O','L',' ')}},	/* Volapük */
+  {"vro",	{HB_TAG('V','R','O',' ')}},	/* Võro */
+  {"wa",	{HB_TAG('W','L','N',' ')}},	/* Walloon */
+  {"war",	{HB_TAG('W','A','R',' ')}},	/* Waray (Philippines) -> Waray-Waray */
+  {"wbm",	{HB_TAG('W','A',' ',' ')}},	/* Wa */
+  {"wbr",	{HB_TAG('W','A','G',' ')}},	/* Wagdi */
+  {"wlc",	{HB_TAG('C','M','R',' ')}},	/* Mwali Comorian -> Comorian */
+  {"wle",	{HB_TAG('S','I','G',' ')}},	/* Wolane -> Silte Gurage */
+  {"wlk",	{HB_TAG('A','T','H',' ')}},	/* Wailaki -> Athapaskan */
+  {"wni",	{HB_TAG('C','M','R',' ')}},	/* Ndzwani Comorian -> Comorian */
+  {"wo",	{HB_TAG('W','L','F',' ')}},	/* Wolof */
+  {"wry",	{HB_TAG('M','A','W',' ')}},	/* Merwari -> Marwari */
+  {"wsg",	{HB_TAG('G','O','N',' ')}},	/* Adilabad Gondi -> Gondi */
+  {"wtm",	{HB_TAG('W','T','M',' ')}},	/* Mewati */
+  {"wuu",	{HB_TAG('Z','H','S',' ')}},	/* Wu Chinese -> Chinese Simplified */
+  {"xal",	{HB_TAG('K','L','M',' '),	/* Kalmyk */
+		 HB_TAG('T','O','D',' ')}},	/* Kalmyk -> Todo */
+  {"xan",	{HB_TAG('S','E','K',' ')}},	/* Xamtanga -> Sekota */
+  {"xh",	{HB_TAG('X','H','S',' ')}},	/* Xhosa */
+  {"xjb",	{HB_TAG('X','J','B',' ')}},	/* Minjungbal -> Minjangbal */
+  {"xkf",	{HB_TAG('X','K','F',' ')}},	/* Khengkha */
+  {"xmm",	{HB_TAG('M','L','Y',' ')}},	/* Manado Malay -> Malay */
+  {"xmv",	{HB_TAG('M','L','G',' ')}},	/* Antankarana Malagasy -> Malagasy */
+  {"xmw",	{HB_TAG('M','L','G',' ')}},	/* Tsimihety Malagasy -> Malagasy */
+  {"xnr",	{HB_TAG('D','G','R',' ')}},	/* Kangri -> Dogri */
+  {"xog",	{HB_TAG('X','O','G',' ')}},	/* Soga */
+  {"xpe",	{HB_TAG('X','P','E',' ')}},	/* Liberia Kpelle -> Kpelle (Liberia) */
+  {"xsl",	{HB_TAG('S','S','L',' '),	/* South Slavey */
+		 HB_TAG('S','L','A',' '),	/* South Slavey -> Slavey */
+		 HB_TAG('A','T','H',' ')}},	/* South Slavey -> Athapaskan */
+  {"xst",	{HB_TAG('S','I','G',' ')}},	/* Silt'e (retired code) -> Silte Gurage */
+  {"xwo",	{HB_TAG('T','O','D',' ')}},	/* Written Oirat -> Todo */
+  {"yao",	{HB_TAG('Y','A','O',' ')}},	/* Yao */
+  {"yap",	{HB_TAG('Y','A','P',' ')}},	/* Yapese */
+  {"ybd",	{HB_TAG('A','R','K',' ')}},	/* Yangbye (retired code) -> Rakhine */
+  {"ydd",	{HB_TAG('J','I','I',' ')}},	/* Eastern Yiddish -> Yiddish */
+  {"yi",	{HB_TAG('J','I','I',' ')}},	/* Yiddish [macrolanguage] */
+  {"yih",	{HB_TAG('J','I','I',' ')}},	/* Western Yiddish -> Yiddish */
+  {"yo",	{HB_TAG('Y','B','A',' ')}},	/* Yoruba */
+  {"yos",	{HB_TAG('Q','I','N',' ')}},	/* Yos (retired code) -> Chin */
+  {"yrk",	{HB_TAG('T','N','E',' '),	/* Nenets -> Tundra Nenets */
+		 HB_TAG('F','N','E',' ')}},	/* Nenets -> Forest Nenets */
+  {"yue",	{HB_TAG('Z','H','H',' ')}},	/* Yue Chinese -> Chinese, Hong Kong SAR */
+  {"za",	{HB_TAG('Z','H','A',' ')}},	/* Zhuang [macrolanguage] */
+  {"zch",	{HB_TAG('Z','H','A',' ')}},	/* Central Hongshuihe Zhuang -> Zhuang */
+  {"zdj",	{HB_TAG('C','M','R',' ')}},	/* Ngazidja Comorian -> Comorian */
+  {"zea",	{HB_TAG('Z','E','A',' ')}},	/* Zeeuws -> Zealandic */
+  {"zeh",	{HB_TAG('Z','H','A',' ')}},	/* Eastern Hongshuihe Zhuang -> Zhuang */
+  {"zgb",	{HB_TAG('Z','H','A',' ')}},	/* Guibei Zhuang -> Zhuang */
+  {"zgh",	{HB_TAG('Z','G','H',' ')}},	/* Standard Moroccan Tamazight */
+  {"zgm",	{HB_TAG('Z','H','A',' ')}},	/* Minz Zhuang -> Zhuang */
+  {"zgn",	{HB_TAG('Z','H','A',' ')}},	/* Guibian Zhuang -> Zhuang */
+  {"zh",	{HB_TAG('Z','H','S',' ')}},	/* Chinese [macrolanguage] -> Chinese Simplified */
+  {"zhd",	{HB_TAG('Z','H','A',' ')}},	/* Dai Zhuang -> Zhuang */
+  {"zhn",	{HB_TAG('Z','H','A',' ')}},	/* Nong Zhuang -> Zhuang */
+  {"zlj",	{HB_TAG('Z','H','A',' ')}},	/* Liujiang Zhuang -> Zhuang */
+  {"zlm",	{HB_TAG('M','L','Y',' ')}},	/* Malay */
+  {"zln",	{HB_TAG('Z','H','A',' ')}},	/* Lianshan Zhuang -> Zhuang */
+  {"zlq",	{HB_TAG('Z','H','A',' ')}},	/* Liuqian Zhuang -> Zhuang */
+  {"zmi",	{HB_TAG('M','L','Y',' ')}},	/* Negeri Sembilan Malay -> Malay */
+  {"zne",	{HB_TAG('Z','N','D',' ')}},	/* Zande */
+  {"zom",	{HB_TAG('Q','I','N',' ')}},	/* Zou -> Chin */
+  {"zqe",	{HB_TAG('Z','H','A',' ')}},	/* Qiubei Zhuang -> Zhuang */
+  {"zsm",	{HB_TAG('M','L','Y',' ')}},	/* Standard Malay -> Malay */
+  {"zu",	{HB_TAG('Z','U','L',' ')}},	/* Zulu */
+  {"zum",	{HB_TAG('L','R','C',' ')}},	/* Kumzari -> Luri */
+  {"zyb",	{HB_TAG('Z','H','A',' ')}},	/* Yongbei Zhuang -> Zhuang */
+  {"zyg",	{HB_TAG('Z','H','A',' ')}},	/* Yang Zhuang -> Zhuang */
+  {"zyj",	{HB_TAG('Z','H','A',' ')}},	/* Youjiang Zhuang -> Zhuang */
+  {"zyn",	{HB_TAG('Z','H','A',' ')}},	/* Yongnan Zhuang -> Zhuang */
+  {"zza",	{HB_TAG('Z','Z','A',' ')}},	/* Zazaki [macrolanguage] */
+  {"zzj",	{HB_TAG('Z','H','A',' ')}},	/* Zuojiang Zhuang -> Zhuang */
+};
+
+static_assert (HB_OT_MAX_TAGS_PER_LANGUAGE == 3u, "");
+
+/**
+ * hb_ot_tags_from_complex_language:
+ * @lang_str: a BCP 47 language tag to convert.
+ * @limit: a pointer to the end of the substring of @lang_str to consider for
+ * conversion.
+ * @count: maximum number of language tags to retrieve (IN) and actual number of
+ * language tags retrieved (OUT). If no tags are retrieved, it is not modified.
+ * @tags: array of size at least @language_count to store the language tag
+ * results
+ *
+ * Converts a multi-subtag BCP 47 language tag to language tags.
+ *
+ * Return value: Whether any language systems were retrieved.
+ **/
+static bool
+hb_ot_tags_from_complex_language (const char   *lang_str,
+				  const char   *limit,
+				  unsigned int *count /* IN/OUT */,
+				  hb_tag_t     *tags /* OUT */)
+{
+  if (subtag_matches (lang_str, limit, "-fonnapa"))
+  {
+    /* Undetermined; North American Phonetic Alphabet */
+    tags[0] = HB_TAG('A','P','P','H');  /* Phonetic transcription—Americanist conventions */
+    *count = 1;
+    return true;
+  }
+  if (subtag_matches (lang_str, limit, "-polyton"))
+  {
+    /* Modern Greek (1453-); Polytonic Greek */
+    tags[0] = HB_TAG('P','G','R',' ');  /* Polytonic Greek */
+    *count = 1;
+    return true;
+  }
+  if (subtag_matches (lang_str, limit, "-provenc"))
+  {
+    /* Occitan (post 1500); Provençal */
+    tags[0] = HB_TAG('P','R','O',' ');  /* Provençal / Old Provençal */
+    *count = 1;
+    return true;
+  }
+  if (subtag_matches (lang_str, limit, "-fonipa"))
+  {
+    /* Undetermined; International Phonetic Alphabet */
+    tags[0] = HB_TAG('I','P','P','H');  /* Phonetic transcription—IPA conventions */
+    *count = 1;
+    return true;
+  }
+  if (subtag_matches (lang_str, limit, "-geok"))
+  {
+    /* Undetermined; Khutsuri (Asomtavruli and Nuskhuri) */
+    tags[0] = HB_TAG('K','G','E',' ');  /* Khutsuri Georgian */
+    *count = 1;
+    return true;
+  }
+  if (subtag_matches (lang_str, limit, "-syre"))
+  {
+    /* Undetermined; Syriac (Estrangelo variant) */
+    tags[0] = HB_TAG('S','Y','R','E');  /* Syriac, Estrangela script-variant (equivalent to ISO 15924 'Syre') */
+    *count = 1;
+    return true;
+  }
+  if (subtag_matches (lang_str, limit, "-syrj"))
+  {
+    /* Undetermined; Syriac (Western variant) */
+    tags[0] = HB_TAG('S','Y','R','J');  /* Syriac, Western script-variant (equivalent to ISO 15924 'Syrj') */
+    *count = 1;
+    return true;
+  }
+  if (subtag_matches (lang_str, limit, "-syrn"))
+  {
+    /* Undetermined; Syriac (Eastern variant) */
+    tags[0] = HB_TAG('S','Y','R','N');  /* Syriac, Eastern script-variant (equivalent to ISO 15924 'Syrn') */
+    *count = 1;
+    return true;
+  }
+  switch (lang_str[0])
+  {
+  case 'a':
+    if (0 == strcmp (&lang_str[1], "rt-lojban"))
+    {
+      /* Lojban */
+      tags[0] = HB_TAG('J','B','O',' ');  /* Lojban */
+      *count = 1;
+      return true;
+    }
+    break;
+  case 'c':
+    if (lang_matches (&lang_str[1], "do-hant-hk"))
+    {
+      /* Min Dong Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "do-hant-mo"))
+    {
+      /* Min Dong Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "jy-hant-hk"))
+    {
+      /* Jinyu Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "jy-hant-mo"))
+    {
+      /* Jinyu Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "mn-hant-hk"))
+    {
+      /* Mandarin Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "mn-hant-mo"))
+    {
+      /* Mandarin Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "px-hant-hk"))
+    {
+      /* Pu-Xian Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "px-hant-mo"))
+    {
+      /* Pu-Xian Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "zh-hant-hk"))
+    {
+      /* Huizhou Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "zh-hant-mo"))
+    {
+      /* Huizhou Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "zo-hant-hk"))
+    {
+      /* Min Zhong Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "zo-hant-mo"))
+    {
+      /* Min Zhong Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "do-hans"))
+    {
+      /* Min Dong Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "do-hant"))
+    {
+      /* Min Dong Chinese */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "jy-hans"))
+    {
+      /* Jinyu Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "jy-hant"))
+    {
+      /* Jinyu Chinese */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "mn-hans"))
+    {
+      /* Mandarin Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "mn-hant"))
+    {
+      /* Mandarin Chinese */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "px-hans"))
+    {
+      /* Pu-Xian Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "px-hant"))
+    {
+      /* Pu-Xian Chinese */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "zh-hans"))
+    {
+      /* Huizhou Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "zh-hant"))
+    {
+      /* Huizhou Chinese */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "zo-hans"))
+    {
+      /* Min Zhong Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "zo-hant"))
+    {
+      /* Min Zhong Chinese */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "do-", 3)
+	&& subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Min Dong Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "do-", 3)
+	&& subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Min Dong Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "do-", 3)
+	&& subtag_matches (lang_str, limit, "-tw"))
+    {
+      /* Min Dong Chinese; Taiwan, Province of China */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "jy-", 3)
+	&& subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Jinyu Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "jy-", 3)
+	&& subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Jinyu Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "jy-", 3)
+	&& subtag_matches (lang_str, limit, "-tw"))
+    {
+      /* Jinyu Chinese; Taiwan, Province of China */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "mn-", 3)
+	&& subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Mandarin Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "mn-", 3)
+	&& subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Mandarin Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "mn-", 3)
+	&& subtag_matches (lang_str, limit, "-tw"))
+    {
+      /* Mandarin Chinese; Taiwan, Province of China */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "px-", 3)
+	&& subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Pu-Xian Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "px-", 3)
+	&& subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Pu-Xian Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "px-", 3)
+	&& subtag_matches (lang_str, limit, "-tw"))
+    {
+      /* Pu-Xian Chinese; Taiwan, Province of China */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "zh-", 3)
+	&& subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Huizhou Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "zh-", 3)
+	&& subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Huizhou Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "zh-", 3)
+	&& subtag_matches (lang_str, limit, "-tw"))
+    {
+      /* Huizhou Chinese; Taiwan, Province of China */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "zo-", 3)
+	&& subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Min Zhong Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "zo-", 3)
+	&& subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Min Zhong Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "zo-", 3)
+	&& subtag_matches (lang_str, limit, "-tw"))
+    {
+      /* Min Zhong Chinese; Taiwan, Province of China */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    break;
+  case 'g':
+    if (lang_matches (&lang_str[1], "an-hant-hk"))
+    {
+      /* Gan Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "an-hant-mo"))
+    {
+      /* Gan Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "an-hans"))
+    {
+      /* Gan Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "an-hant"))
+    {
+      /* Gan Chinese */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "a-latg"))
+    {
+      /* Irish */
+      tags[0] = HB_TAG('I','R','T',' ');  /* Irish Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "an-", 3)
+	&& subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Gan Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "an-", 3)
+	&& subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Gan Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "an-", 3)
+	&& subtag_matches (lang_str, limit, "-tw"))
+    {
+      /* Gan Chinese; Taiwan, Province of China */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    break;
+  case 'h':
+    if (lang_matches (&lang_str[1], "ak-hant-hk"))
+    {
+      /* Hakka Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "ak-hant-mo"))
+    {
+      /* Hakka Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "sn-hant-hk"))
+    {
+      /* Xiang Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "sn-hant-mo"))
+    {
+      /* Xiang Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "ak-hans"))
+    {
+      /* Hakka Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "ak-hant"))
+    {
+      /* Hakka Chinese */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "sn-hans"))
+    {
+      /* Xiang Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "sn-hant"))
+    {
+      /* Xiang Chinese */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "ak-", 3)
+	&& subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Hakka Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "ak-", 3)
+	&& subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Hakka Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "ak-", 3)
+	&& subtag_matches (lang_str, limit, "-tw"))
+    {
+      /* Hakka Chinese; Taiwan, Province of China */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "sn-", 3)
+	&& subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Xiang Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "sn-", 3)
+	&& subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Xiang Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "sn-", 3)
+	&& subtag_matches (lang_str, limit, "-tw"))
+    {
+      /* Xiang Chinese; Taiwan, Province of China */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    break;
+  case 'i':
+    if (0 == strcmp (&lang_str[1], "-navajo"))
+    {
+      /* Navajo */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+	HB_TAG('N','A','V',' '),  /* Navajo */
+	HB_TAG('A','T','H',' '),  /* Athapaskan */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+	tags[i] = possible_tags[i];
+      *count = i;
+      return true;
+    }
+    if (0 == strcmp (&lang_str[1], "-hak"))
+    {
+      /* Hakka */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (0 == strcmp (&lang_str[1], "-lux"))
+    {
+      /* Luxembourgish */
+      tags[0] = HB_TAG('L','T','Z',' ');  /* Luxembourgish */
+      *count = 1;
+      return true;
+    }
+    break;
+  case 'l':
+    if (lang_matches (&lang_str[1], "zh-hans"))
+    {
+      /* Literary Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    break;
+  case 'm':
+    if (lang_matches (&lang_str[1], "np-hant-hk"))
+    {
+      /* Min Bei Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "np-hant-mo"))
+    {
+      /* Min Bei Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "np-hans"))
+    {
+      /* Min Bei Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "np-hant"))
+    {
+      /* Min Bei Chinese */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "np-", 3)
+	&& subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Min Bei Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "np-", 3)
+	&& subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Min Bei Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "np-", 3)
+	&& subtag_matches (lang_str, limit, "-tw"))
+    {
+      /* Min Bei Chinese; Taiwan, Province of China */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    break;
+  case 'n':
+    if (lang_matches (&lang_str[1], "an-hant-hk"))
+    {
+      /* Min Nan Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "an-hant-mo"))
+    {
+      /* Min Nan Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "an-hans"))
+    {
+      /* Min Nan Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "an-hant"))
+    {
+      /* Min Nan Chinese */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "an-", 3)
+	&& subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Min Nan Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "an-", 3)
+	&& subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Min Nan Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "an-", 3)
+	&& subtag_matches (lang_str, limit, "-tw"))
+    {
+      /* Min Nan Chinese; Taiwan, Province of China */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strcmp (&lang_str[1], "o-bok"))
+    {
+      /* Norwegian Bokmal */
+      tags[0] = HB_TAG('N','O','R',' ');  /* Norwegian */
+      *count = 1;
+      return true;
+    }
+    if (0 == strcmp (&lang_str[1], "o-nyn"))
+    {
+      /* Norwegian Nynorsk */
+      tags[0] = HB_TAG('N','Y','N',' ');  /* Norwegian Nynorsk (Nynorsk, Norwegian) */
+      *count = 1;
+      return true;
+    }
+    break;
+  case 'r':
+    if (0 == strncmp (&lang_str[1], "o-", 2)
+	&& subtag_matches (lang_str, limit, "-md"))
+    {
+      /* Romanian; Moldova */
+      tags[0] = HB_TAG('M','O','L',' ');  /* Moldavian */
+      *count = 1;
+      return true;
+    }
+    break;
+  case 'w':
+    if (lang_matches (&lang_str[1], "uu-hant-hk"))
+    {
+      /* Wu Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "uu-hant-mo"))
+    {
+      /* Wu Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "uu-hans"))
+    {
+      /* Wu Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "uu-hant"))
+    {
+      /* Wu Chinese */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "uu-", 3)
+	&& subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Wu Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "uu-", 3)
+	&& subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Wu Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "uu-", 3)
+	&& subtag_matches (lang_str, limit, "-tw"))
+    {
+      /* Wu Chinese; Taiwan, Province of China */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    break;
+  case 'y':
+    if (lang_matches (&lang_str[1], "ue-hans"))
+    {
+      /* Yue Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    break;
+  case 'z':
+    if (lang_matches (&lang_str[1], "h-hant-hk"))
+    {
+      /* Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "h-hant-mo"))
+    {
+      /* Chinese */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strcmp (&lang_str[1], "h-min-nan"))
+    {
+      /* Minnan, Hokkien, Amoy, Taiwanese, Southern Min, Southern Fujian, Hoklo, Southern Fukien, Ho-lo */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "h-hans"))
+    {
+      /* Chinese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (lang_matches (&lang_str[1], "h-hant"))
+    {
+      /* Chinese */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strcmp (&lang_str[1], "h-min"))
+    {
+      /* Min, Fuzhou, Hokkien, Amoy, or Taiwanese */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "h-", 2)
+	&& subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "h-", 2)
+	&& subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "h-", 2)
+	&& subtag_matches (lang_str, limit, "-tw"))
+    {
+      /* Chinese; Taiwan, Province of China */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      *count = 1;
+      return true;
+    }
+    break;
+  }
+  return false;
+}
+
+/**
+ * hb_ot_ambiguous_tag_to_language
+ * @tag: A language tag.
+ *
+ * Converts @tag to a BCP 47 language tag if it is ambiguous (it corresponds to
+ * many language tags) and the best tag is not the alphabetically first, or if
+ * the best tag consists of multiple subtags.
+ *
+ * Return value: The #hb_language_t corresponding to the BCP 47 language tag,
+ * or #HB_LANGUAGE_INVALID if @tag is not ambiguous.
+ **/
+static hb_language_t
+hb_ot_ambiguous_tag_to_language (hb_tag_t tag)
+{
+  switch (tag)
+  {
+  case HB_TAG('A','P','P','H'):  /* Phonetic transcription—Americanist conventions */
+    return hb_language_from_string ("und-fonnapa", -1);  /* Undetermined; North American Phonetic Alphabet */
+  case HB_TAG('A','R','A',' '):  /* Arabic */
+    return hb_language_from_string ("ar", -1);  /* Arabic */
+  case HB_TAG('A','R','K',' '):  /* Rakhine */
+    return hb_language_from_string ("rki", -1);  /* Rakhine */
+  case HB_TAG('A','T','H',' '):  /* Athapaskan */
+    return hb_language_from_string ("ath", -1);  /* Athapascan */
+  case HB_TAG('B','I','K',' '):  /* Bikol */
+    return hb_language_from_string ("bik", -1);  /* Bikol */
+  case HB_TAG('C','P','P',' '):  /* Creoles */
+    return hb_language_from_string ("crp", -1);  /* Creoles and pidgins */
+  case HB_TAG('C','R','R',' '):  /* Carrier */
+    return hb_language_from_string ("crx", -1);  /* Carrier */
+  case HB_TAG('D','N','K',' '):  /* Dinka */
+    return hb_language_from_string ("din", -1);  /* Dinka */
+  case HB_TAG('D','R','I',' '):  /* Dari */
+    return hb_language_from_string ("prs", -1);  /* Dari */
+  case HB_TAG('D','U','J',' '):  /* Dhuwal */
+    return hb_language_from_string ("dwu", -1);  /* Dhuwal */
+  case HB_TAG('D','Z','N',' '):  /* Dzongkha */
+    return hb_language_from_string ("dz", -1);  /* Dzongkha */
+  case HB_TAG('E','T','I',' '):  /* Estonian */
+    return hb_language_from_string ("et", -1);  /* Estonian */
+  case HB_TAG('G','O','N',' '):  /* Gondi */
+    return hb_language_from_string ("gon", -1);  /* Gondi */
+  case HB_TAG('H','M','N',' '):  /* Hmong */
+    return hb_language_from_string ("hmn", -1);  /* Hmong */
+  case HB_TAG('I','J','O',' '):  /* Ijo */
+    return hb_language_from_string ("ijo", -1);  /* Ijo */
+  case HB_TAG('I','N','U',' '):  /* Inuktitut */
+    return hb_language_from_string ("iu", -1);  /* Inuktitut */
+  case HB_TAG('I','P','K',' '):  /* Inupiat */
+    return hb_language_from_string ("ik", -1);  /* Inupiaq */
+  case HB_TAG('I','P','P','H'):  /* Phonetic transcription—IPA conventions */
+    return hb_language_from_string ("und-fonipa", -1);  /* Undetermined; International Phonetic Alphabet */
+  case HB_TAG('I','R','T',' '):  /* Irish Traditional */
+    return hb_language_from_string ("ga-Latg", -1);  /* Irish; Latin (Gaelic variant) */
+  case HB_TAG('J','I','I',' '):  /* Yiddish */
+    return hb_language_from_string ("yi", -1);  /* Yiddish */
+  case HB_TAG('K','A','L',' '):  /* Kalenjin */
+    return hb_language_from_string ("kln", -1);  /* Kalenjin */
+  case HB_TAG('K','G','E',' '):  /* Khutsuri Georgian */
+    return hb_language_from_string ("und-Geok", -1);  /* Undetermined; Khutsuri (Asomtavruli and Nuskhuri) */
+  case HB_TAG('K','N','R',' '):  /* Kanuri */
+    return hb_language_from_string ("kr", -1);  /* Kanuri */
+  case HB_TAG('K','O','K',' '):  /* Konkani */
+    return hb_language_from_string ("kok", -1);  /* Konkani */
+  case HB_TAG('K','U','R',' '):  /* Kurdish */
+    return hb_language_from_string ("ku", -1);  /* Kurdish */
+  case HB_TAG('L','U','H',' '):  /* Luyia */
+    return hb_language_from_string ("luy", -1);  /* Luyia */
+  case HB_TAG('L','V','I',' '):  /* Latvian */
+    return hb_language_from_string ("lv", -1);  /* Latvian */
+  case HB_TAG('M','A','W',' '):  /* Marwari */
+    return hb_language_from_string ("mwr", -1);  /* Marwari */
+  case HB_TAG('M','L','G',' '):  /* Malagasy */
+    return hb_language_from_string ("mg", -1);  /* Malagasy */
+  case HB_TAG('M','L','Y',' '):  /* Malay */
+    return hb_language_from_string ("ms", -1);  /* Malay */
+  case HB_TAG('M','N','G',' '):  /* Mongolian */
+    return hb_language_from_string ("mn", -1);  /* Mongolian */
+  case HB_TAG('M','O','L',' '):  /* Moldavian */
+    return hb_language_from_string ("ro-MD", -1);  /* Romanian; Moldova */
+  case HB_TAG('N','E','P',' '):  /* Nepali */
+    return hb_language_from_string ("ne", -1);  /* Nepali */
+  case HB_TAG('N','I','S',' '):  /* Nisi */
+    return hb_language_from_string ("njz", -1);  /* Nyishi */
+  case HB_TAG('N','O','R',' '):  /* Norwegian */
+    return hb_language_from_string ("no", -1);  /* Norwegian */
+  case HB_TAG('O','J','B',' '):  /* Ojibway */
+    return hb_language_from_string ("oj", -1);  /* Ojibwa */
+  case HB_TAG('O','R','O',' '):  /* Oromo */
+    return hb_language_from_string ("om", -1);  /* Oromo */
+  case HB_TAG('P','A','S',' '):  /* Pashto */
+    return hb_language_from_string ("ps", -1);  /* Pashto */
+  case HB_TAG('P','G','R',' '):  /* Polytonic Greek */
+    return hb_language_from_string ("el-polyton", -1);  /* Modern Greek (1453-); Polytonic Greek */
+  case HB_TAG('P','R','O',' '):  /* Provençal / Old Provençal */
+    return hb_language_from_string ("pro", -1);  /* Old Provençal (to 1500) */
+  case HB_TAG('Q','U','H',' '):  /* Quechua (Bolivia) */
+    return hb_language_from_string ("quh", -1);  /* South Bolivian Quechua */
+  case HB_TAG('Q','V','I',' '):  /* Quechua (Ecuador) */
+    return hb_language_from_string ("qvi", -1);  /* Imbabura Highland Quichua */
+  case HB_TAG('Q','W','H',' '):  /* Quechua (Peru) */
+    return hb_language_from_string ("qwh", -1);  /* Huaylas Ancash Quechua */
+  case HB_TAG('R','A','J',' '):  /* Rajasthani */
+    return hb_language_from_string ("raj", -1);  /* Rajasthani */
+  case HB_TAG('R','O','Y',' '):  /* Romany */
+    return hb_language_from_string ("rom", -1);  /* Romany */
+  case HB_TAG('S','Q','I',' '):  /* Albanian */
+    return hb_language_from_string ("sq", -1);  /* Albanian */
+  case HB_TAG('S','Y','R',' '):  /* Syriac */
+    return hb_language_from_string ("syr", -1);  /* Syriac */
+  case HB_TAG('S','Y','R','E'):  /* Syriac, Estrangela script-variant (equivalent to ISO 15924 'Syre') */
+    return hb_language_from_string ("und-Syre", -1);  /* Undetermined; Syriac (Estrangelo variant) */
+  case HB_TAG('S','Y','R','J'):  /* Syriac, Western script-variant (equivalent to ISO 15924 'Syrj') */
+    return hb_language_from_string ("und-Syrj", -1);  /* Undetermined; Syriac (Western variant) */
+  case HB_TAG('S','Y','R','N'):  /* Syriac, Eastern script-variant (equivalent to ISO 15924 'Syrn') */
+    return hb_language_from_string ("und-Syrn", -1);  /* Undetermined; Syriac (Eastern variant) */
+  case HB_TAG('T','M','H',' '):  /* Tamashek */
+    return hb_language_from_string ("tmh", -1);  /* Tamashek */
+  case HB_TAG('T','N','E',' '):  /* Tundra Nenets */
+    return hb_language_from_string ("yrk", -1);  /* Nenets */
+  case HB_TAG('Z','H','H',' '):  /* Chinese, Hong Kong SAR */
+    return hb_language_from_string ("zh-HK", -1);  /* Chinese; Hong Kong */
+  case HB_TAG('Z','H','S',' '):  /* Chinese Simplified */
+    return hb_language_from_string ("zh-Hans", -1);  /* Chinese; Han (Simplified variant) */
+  case HB_TAG('Z','H','T',' '):  /* Chinese Traditional */
+    return hb_language_from_string ("zh-Hant", -1);  /* Chinese; Han (Traditional variant) */
+  default:
+    return HB_LANGUAGE_INVALID;
+  }
+}
+
+#endif /* HB_OT_TAG_TABLE_HH */
+
+/* == End of generated table == */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-tag.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-tag.cc
new file mode 100644
index 0000000..d04e532
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-tag.cc
@@ -0,0 +1,527 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2011  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod, Roozbeh Pournader
+ */
+
+#include "hb.hh"
+
+
+/* hb_script_t */
+
+static hb_tag_t
+hb_ot_old_tag_from_script (hb_script_t script)
+{
+  /* This seems to be accurate as of end of 2012. */
+
+  switch ((hb_tag_t) script)
+  {
+    case HB_SCRIPT_INVALID:		return HB_OT_TAG_DEFAULT_SCRIPT;
+
+    /* KATAKANA and HIRAGANA both map to 'kana' */
+    case HB_SCRIPT_HIRAGANA:		return HB_TAG('k','a','n','a');
+
+    /* Spaces at the end are preserved, unlike ISO 15924 */
+    case HB_SCRIPT_LAO:			return HB_TAG('l','a','o',' ');
+    case HB_SCRIPT_YI:			return HB_TAG('y','i',' ',' ');
+    /* Unicode-5.0 additions */
+    case HB_SCRIPT_NKO:			return HB_TAG('n','k','o',' ');
+    /* Unicode-5.1 additions */
+    case HB_SCRIPT_VAI:			return HB_TAG('v','a','i',' ');
+  }
+
+  /* Else, just change first char to lowercase and return */
+  return ((hb_tag_t) script) | 0x20000000u;
+}
+
+static hb_script_t
+hb_ot_old_tag_to_script (hb_tag_t tag)
+{
+  if (unlikely (tag == HB_OT_TAG_DEFAULT_SCRIPT))
+    return HB_SCRIPT_INVALID;
+
+  /* This side of the conversion is fully algorithmic. */
+
+  /* Any spaces at the end of the tag are replaced by repeating the last
+   * letter.  Eg 'nko ' -> 'Nkoo' */
+  if (unlikely ((tag & 0x0000FF00u) == 0x00002000u))
+    tag |= (tag >> 8) & 0x0000FF00u; /* Copy second letter to third */
+  if (unlikely ((tag & 0x000000FFu) == 0x00000020u))
+    tag |= (tag >> 8) & 0x000000FFu; /* Copy third letter to fourth */
+
+  /* Change first char to uppercase and return */
+  return (hb_script_t) (tag & ~0x20000000u);
+}
+
+static hb_tag_t
+hb_ot_new_tag_from_script (hb_script_t script)
+{
+  switch ((hb_tag_t) script) {
+    case HB_SCRIPT_BENGALI:		return HB_TAG('b','n','g','2');
+    case HB_SCRIPT_DEVANAGARI:		return HB_TAG('d','e','v','2');
+    case HB_SCRIPT_GUJARATI:		return HB_TAG('g','j','r','2');
+    case HB_SCRIPT_GURMUKHI:		return HB_TAG('g','u','r','2');
+    case HB_SCRIPT_KANNADA:		return HB_TAG('k','n','d','2');
+    case HB_SCRIPT_MALAYALAM:		return HB_TAG('m','l','m','2');
+    case HB_SCRIPT_ORIYA:		return HB_TAG('o','r','y','2');
+    case HB_SCRIPT_TAMIL:		return HB_TAG('t','m','l','2');
+    case HB_SCRIPT_TELUGU:		return HB_TAG('t','e','l','2');
+    case HB_SCRIPT_MYANMAR:		return HB_TAG('m','y','m','2');
+  }
+
+  return HB_OT_TAG_DEFAULT_SCRIPT;
+}
+
+static hb_script_t
+hb_ot_new_tag_to_script (hb_tag_t tag)
+{
+  switch (tag) {
+    case HB_TAG('b','n','g','2'):	return HB_SCRIPT_BENGALI;
+    case HB_TAG('d','e','v','2'):	return HB_SCRIPT_DEVANAGARI;
+    case HB_TAG('g','j','r','2'):	return HB_SCRIPT_GUJARATI;
+    case HB_TAG('g','u','r','2'):	return HB_SCRIPT_GURMUKHI;
+    case HB_TAG('k','n','d','2'):	return HB_SCRIPT_KANNADA;
+    case HB_TAG('m','l','m','2'):	return HB_SCRIPT_MALAYALAM;
+    case HB_TAG('o','r','y','2'):	return HB_SCRIPT_ORIYA;
+    case HB_TAG('t','m','l','2'):	return HB_SCRIPT_TAMIL;
+    case HB_TAG('t','e','l','2'):	return HB_SCRIPT_TELUGU;
+    case HB_TAG('m','y','m','2'):	return HB_SCRIPT_MYANMAR;
+  }
+
+  return HB_SCRIPT_UNKNOWN;
+}
+
+void
+hb_ot_tags_from_script (hb_script_t  script,
+			hb_tag_t    *script_tag_1,
+			hb_tag_t    *script_tag_2)
+{
+  unsigned int count = 2;
+  hb_tag_t tags[2];
+  hb_ot_tags_from_script_and_language (script, HB_LANGUAGE_INVALID, &count, tags, nullptr, nullptr);
+  *script_tag_1 = count > 0 ? tags[0] : HB_OT_TAG_DEFAULT_SCRIPT;
+  *script_tag_2 = count > 1 ? tags[1] : HB_OT_TAG_DEFAULT_SCRIPT;
+}
+
+/*
+ * Complete list at:
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/scripttags
+ *
+ * Most of the script tags are the same as the ISO 15924 tag but lowercased.
+ * So we just do that, and handle the exceptional cases in a switch.
+ */
+
+static void
+hb_ot_all_tags_from_script (hb_script_t   script,
+			    unsigned int *count /* IN/OUT */,
+			    hb_tag_t     *tags /* OUT */)
+{
+  unsigned int i = 0;
+
+  hb_tag_t new_tag = hb_ot_new_tag_from_script (script);
+  if (unlikely (new_tag != HB_OT_TAG_DEFAULT_SCRIPT))
+  {
+    tags[i++] = new_tag | '3';
+    if (*count > i)
+      tags[i++] = new_tag;
+  }
+
+  if (*count > i)
+  {
+    hb_tag_t old_tag = hb_ot_old_tag_from_script (script);
+    if (old_tag != HB_OT_TAG_DEFAULT_SCRIPT)
+      tags[i++] = old_tag;
+  }
+
+  *count = i;
+}
+
+hb_script_t
+hb_ot_tag_to_script (hb_tag_t tag)
+{
+  unsigned char digit = tag & 0x000000FFu;
+  if (unlikely (digit == '2' || digit == '3'))
+    return hb_ot_new_tag_to_script (tag & 0xFFFFFF32);
+
+  return hb_ot_old_tag_to_script (tag);
+}
+
+
+/* hb_language_t */
+
+static int
+lang_compare_first_component (const void *pa,
+			      const void *pb)
+{
+  const char *a = (const char *) pa;
+  const char *b = (const char *) pb;
+  unsigned int da, db;
+  const char *p;
+
+  p = strchr (a, '-');
+  da = p ? (unsigned int) (p - a) : strlen (a);
+
+  p = strchr (b, '-');
+  db = p ? (unsigned int) (p - b) : strlen (b);
+
+  return strncmp (a, b, MAX (da, db));
+}
+
+static bool
+subtag_matches (const char *lang_str,
+		const char *limit,
+		const char *subtag)
+{
+  do {
+    const char *s = strstr (lang_str, subtag);
+    if (!s || s >= limit)
+      return false;
+    if (!ISALNUM (s[strlen (subtag)]))
+      return true;
+    lang_str = s + strlen (subtag);
+  } while (true);
+}
+
+static hb_bool_t
+lang_matches (const char *lang_str, const char *spec)
+{
+  unsigned int len = strlen (spec);
+
+  return strncmp (lang_str, spec, len) == 0 &&
+	 (lang_str[len] == '\0' || lang_str[len] == '-');
+}
+
+typedef struct {
+  char language[4];
+  hb_tag_t tags[HB_OT_MAX_TAGS_PER_LANGUAGE];
+} LangTag;
+
+#include "hb-ot-tag-table.hh"
+
+/* The corresponding languages IDs for the following IDs are unclear,
+ * overlap, or are architecturally weird. Needs more research. */
+
+/*{"??",	{HB_TAG('B','C','R',' ')}},*/	/* Bible Cree */
+/*{"zh?",	{HB_TAG('C','H','N',' ')}},*/	/* Chinese (seen in Microsoft fonts) */
+/*{"ar-Syrc?",	{HB_TAG('G','A','R',' ')}},*/	/* Garshuni */
+/*{"??",	{HB_TAG('N','G','R',' ')}},*/	/* Nagari */
+/*{"??",	{HB_TAG('Y','I','C',' ')}},*/	/* Yi Classic */
+/*{"zh?",	{HB_TAG('Z','H','P',' ')}},*/	/* Chinese Phonetic */
+
+hb_tag_t
+hb_ot_tag_from_language (hb_language_t language)
+{
+  unsigned int count = 1;
+  hb_tag_t tags[1];
+  hb_ot_tags_from_script_and_language (HB_SCRIPT_UNKNOWN, language, nullptr, nullptr, &count, tags);
+  return count > 0 ? tags[0] : HB_OT_TAG_DEFAULT_LANGUAGE;
+}
+
+static void
+hb_ot_tags_from_language (const char   *lang_str,
+			  const char   *limit,
+			  unsigned int *count,
+			  hb_tag_t     *tags)
+{
+  const char *s;
+
+  /* Check for matches of multiple subtags. */
+  if (hb_ot_tags_from_complex_language (lang_str, limit, count, tags))
+    return;
+
+  /* Find a language matching in the first component. */
+  s = strchr (lang_str, '-');
+  {
+    const LangTag *lang_tag;
+    if (s && limit - lang_str >= 6)
+    {
+      const char *extlang_end = strchr (s + 1, '-');
+      /* If there is an extended language tag, use it. */
+      if (3 == (extlang_end ? extlang_end - s - 1 : strlen (s + 1)) &&
+	  ISALPHA (s[1]))
+	lang_str = s + 1;
+    }
+    lang_tag = (LangTag *) bsearch (lang_str, ot_languages,
+				    ARRAY_LENGTH (ot_languages), sizeof (LangTag),
+				    lang_compare_first_component);
+    if (lang_tag)
+    {
+      unsigned int i;
+      for (i = 0; i < *count && lang_tag->tags[i] != HB_TAG_NONE; i++)
+	tags[i] = lang_tag->tags[i];
+      *count = i;
+      return;
+    }
+  }
+
+  if (!s)
+    s = lang_str + strlen (lang_str);
+  if (s - lang_str == 3) {
+    /* Assume it's ISO-639-3 and upper-case and use it. */
+    tags[0] = hb_tag_from_string (lang_str, s - lang_str) & ~0x20202000u;
+    *count = 1;
+    return;
+  }
+
+  *count = 0;
+}
+
+static bool
+parse_private_use_subtag (const char     *private_use_subtag,
+			  unsigned int   *count,
+			  hb_tag_t       *tags,
+			  const char     *prefix,
+			  unsigned char (*normalize) (unsigned char))
+{
+  if (private_use_subtag && count && tags && *count)
+  {
+    const char *s = strstr (private_use_subtag, prefix);
+    if (s)
+    {
+      char tag[4];
+      int i;
+      s += strlen (prefix);
+      for (i = 0; i < 4 && ISALNUM (s[i]); i++)
+	tag[i] = normalize (s[i]);
+      if (i)
+      {
+	for (; i < 4; i++)
+	  tag[i] = ' ';
+	tags[0] = HB_TAG (tag[0], tag[1], tag[2], tag[3]);
+	if ((tags[0] & 0xDFDFDFDF) == HB_OT_TAG_DEFAULT_SCRIPT)
+	  tags[0] ^= ~0xDFDFDFDF;
+	*count = 1;
+	return false;
+      }
+    }
+  }
+  return true;
+}
+
+/**
+ * hb_ot_tags_from_script_and_language:
+ * @script: an #hb_script_t to convert.
+ * @language: an #hb_language_t to convert.
+ * @script_count: (allow-none): maximum number of script tags to retrieve (IN)
+ * and actual number of script tags retrieved (OUT)
+ * @script_tags: (out) (allow-none): array of size at least @script_count to store the
+ * script tag results
+ * @language_count: (allow-none): maximum number of language tags to retrieve
+ * (IN) and actual number of language tags retrieved (OUT)
+ * @language_tags: (out) (allow-none): array of size at least @language_count to store
+ * the language tag results
+ *
+ * Converts an #hb_script_t and an #hb_language_t to script and language tags.
+ *
+ * Since: 2.0.0
+ **/
+void
+hb_ot_tags_from_script_and_language (hb_script_t   script,
+				     hb_language_t language,
+				     unsigned int *script_count /* IN/OUT */,
+				     hb_tag_t     *script_tags /* OUT */,
+				     unsigned int *language_count /* IN/OUT */,
+				     hb_tag_t     *language_tags /* OUT */)
+{
+  bool needs_script = true;
+
+  if (language == HB_LANGUAGE_INVALID)
+  {
+    if (language_count && language_tags && *language_count)
+      *language_count = 0;
+  }
+  else
+  {
+    const char *lang_str, *s, *limit, *private_use_subtag;
+    bool needs_language;
+
+    lang_str = hb_language_to_string (language);
+    limit = nullptr;
+    private_use_subtag = nullptr;
+    if (lang_str[0] == 'x' && lang_str[1] == '-')
+    {
+      private_use_subtag = lang_str;
+    } else {
+      for (s = lang_str + 1; *s; s++)
+      {
+	if (s[-1] == '-' && s[1] == '-')
+	{
+	  if (s[0] == 'x')
+	  {
+	    private_use_subtag = s;
+	    if (!limit)
+	      limit = s - 1;
+	    break;
+	  } else if (!limit)
+	  {
+	    limit = s - 1;
+	  }
+	}
+      }
+      if (!limit)
+	limit = s;
+    }
+
+    needs_script = parse_private_use_subtag (private_use_subtag, script_count, script_tags, "-hbsc", TOLOWER);
+    needs_language = parse_private_use_subtag (private_use_subtag, language_count, language_tags, "-hbot", TOUPPER);
+
+    if (needs_language && language_count && language_tags && *language_count)
+      hb_ot_tags_from_language (lang_str, limit, language_count, language_tags);
+  }
+
+  if (needs_script && script_count && script_tags && *script_count)
+    hb_ot_all_tags_from_script (script, script_count, script_tags);
+}
+
+/**
+ * hb_ot_tag_to_language:
+ *
+ *
+ *
+ * Return value: (transfer none):
+ *
+ * Since: 0.9.2
+ **/
+hb_language_t
+hb_ot_tag_to_language (hb_tag_t tag)
+{
+  unsigned int i;
+
+  if (tag == HB_OT_TAG_DEFAULT_LANGUAGE)
+    return nullptr;
+
+  {
+    hb_language_t disambiguated_tag = hb_ot_ambiguous_tag_to_language (tag);
+    if (disambiguated_tag != HB_LANGUAGE_INVALID)
+      return disambiguated_tag;
+  }
+
+  for (i = 0; i < ARRAY_LENGTH (ot_languages); i++)
+    if (ot_languages[i].tags[0] == tag)
+      return hb_language_from_string (ot_languages[i].language, -1);
+
+  /* Else return a custom language in the form of "x-hbotABCD" */
+  {
+    unsigned char buf[11] = "x-hbot";
+    buf[6] = tag >> 24;
+    buf[7] = (tag >> 16) & 0xFF;
+    buf[8] = (tag >> 8) & 0xFF;
+    buf[9] = tag & 0xFF;
+    if (buf[9] == 0x20)
+      buf[9] = '\0';
+    buf[10] = '\0';
+    return hb_language_from_string ((char *) buf, -1);
+  }
+}
+
+/**
+ * hb_ot_tags_to_script_and_language:
+ * @script_tag: a script tag
+ * @language_tag: a language tag
+ * @script: (allow-none): the #hb_script_t corresponding to @script_tag (OUT).
+ * @language: (allow-none): the #hb_language_t corresponding to @script_tag and
+ * @language_tag (OUT).
+ *
+ * Converts a script tag and a language tag to an #hb_script_t and an
+ * #hb_language_t.
+ *
+ * Since: 2.0.0
+ **/
+void
+hb_ot_tags_to_script_and_language (hb_tag_t       script_tag,
+				   hb_tag_t       language_tag,
+				   hb_script_t   *script /* OUT */,
+				   hb_language_t *language /* OUT */)
+{
+  hb_script_t script_out = hb_ot_tag_to_script (script_tag);
+  if (script)
+    *script = script_out;
+  if (language)
+  {
+    unsigned int script_count = 1;
+    hb_tag_t primary_script_tag[1];
+    hb_ot_tags_from_script_and_language (script_out,
+					 HB_LANGUAGE_INVALID,
+					 &script_count,
+					 primary_script_tag,
+					 nullptr, nullptr);
+    *language = hb_ot_tag_to_language (language_tag);
+    if (script_count == 0 || primary_script_tag[0] != script_tag)
+    {
+      unsigned char *buf;
+      const char *lang_str = hb_language_to_string (*language);
+      size_t len = strlen (lang_str);
+      buf = (unsigned char *) malloc (len + 11);
+      if (unlikely (!buf))
+      {
+	*language = nullptr;
+      }
+      else
+      {
+	memcpy (buf, lang_str, len);
+	if (lang_str[0] != 'x' || lang_str[1] != '-') {
+	  buf[len++] = '-';
+	  buf[len++] = 'x';
+	}
+	buf[len++] = '-';
+	buf[len++] = 'h';
+	buf[len++] = 'b';
+	buf[len++] = 's';
+	buf[len++] = 'c';
+	buf[len++] = script_tag >> 24;
+	buf[len++] = (script_tag >> 16) & 0xFF;
+	buf[len++] = (script_tag >> 8) & 0xFF;
+	buf[len++] = script_tag & 0xFF;
+	*language = hb_language_from_string ((char *) buf, len);
+	free (buf);
+      }
+    }
+  }
+}
+
+#ifdef MAIN
+static inline void
+test_langs_sorted ()
+{
+  for (unsigned int i = 1; i < ARRAY_LENGTH (ot_languages); i++)
+  {
+    int c = lang_compare_first_component (ot_languages[i-1].language, ot_languages[i].language);
+    if (c >= 0)
+    {
+      fprintf (stderr, "ot_languages not sorted at index %d: %s %d %s\n",
+	       i, ot_languages[i-1].language, c, ot_languages[i].language);
+      abort();
+    }
+  }
+}
+
+int
+main ()
+{
+  test_langs_sorted ();
+  return 0;
+}
+
+#endif
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var-avar-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var-avar-table.hh
new file mode 100644
index 0000000..c4a192d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var-avar-table.hh
@@ -0,0 +1,152 @@
+/*
+ * Copyright © 2017  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_VAR_AVAR_TABLE_HH
+#define HB_OT_VAR_AVAR_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * avar -- Axis Variations
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/avar
+ */
+
+#define HB_OT_TAG_avar HB_TAG('a','v','a','r')
+
+
+namespace OT {
+
+
+struct AxisValueMap
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  F2DOT14	fromCoord;	/* A normalized coordinate value obtained using
+				 * default normalization. */
+  F2DOT14	toCoord;	/* The modified, normalized coordinate value. */
+
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct SegmentMaps : ArrayOf<AxisValueMap>
+{
+  int map (int value) const
+  {
+    /* The following special-cases are not part of OpenType, which requires
+     * that at least -1, 0, and +1 must be mapped. But we include these as
+     * part of a better error recovery scheme. */
+
+    if (len < 2)
+    {
+      if (!len)
+	return value;
+      else /* len == 1*/
+	return value - arrayZ[0].fromCoord + arrayZ[0].toCoord;
+    }
+
+    if (value <= arrayZ[0].fromCoord)
+      return value - arrayZ[0].fromCoord + arrayZ[0].toCoord;
+
+    unsigned int i;
+    unsigned int count = len;
+    for (i = 1; i < count && value > arrayZ[i].fromCoord; i++)
+      ;
+
+    if (value >= arrayZ[i].fromCoord)
+      return value - arrayZ[i].fromCoord + arrayZ[i].toCoord;
+
+    if (unlikely (arrayZ[i-1].fromCoord == arrayZ[i].fromCoord))
+      return arrayZ[i-1].toCoord;
+
+    int denom = arrayZ[i].fromCoord - arrayZ[i-1].fromCoord;
+    return arrayZ[i-1].toCoord +
+	   ((arrayZ[i].toCoord - arrayZ[i-1].toCoord) *
+	    (value - arrayZ[i-1].fromCoord) + denom/2) / denom;
+  }
+
+  public:
+  DEFINE_SIZE_ARRAY (2, *this);
+};
+
+struct avar
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_avar;
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!(version.sanitize (c) &&
+		    version.major == 1 &&
+		    c->check_struct (this))))
+      return_trace (false);
+
+    const SegmentMaps *map = &firstAxisSegmentMaps;
+    unsigned int count = axisCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (unlikely (!map->sanitize (c)))
+        return_trace (false);
+      map = &StructAfter<SegmentMaps> (*map);
+    }
+
+    return_trace (true);
+  }
+
+  void map_coords (int *coords, unsigned int coords_length) const
+  {
+    unsigned int count = MIN<unsigned int> (coords_length, axisCount);
+
+    const SegmentMaps *map = &firstAxisSegmentMaps;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      coords[i] = map->map (coords[i]);
+      map = &StructAfter<SegmentMaps> (*map);
+    }
+  }
+
+  protected:
+  FixedVersion<>version;	/* Version of the avar table
+				 * initially set to 0x00010000u */
+  HBUINT16	reserved;	/* This field is permanently reserved. Set to 0. */
+  HBUINT16	axisCount;	/* The number of variation axes in the font. This
+				 * must be the same number as axisCount in the
+				 * 'fvar' table. */
+  SegmentMaps   firstAxisSegmentMaps;
+
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_VAR_AVAR_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var-fvar-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var-fvar-table.hh
new file mode 100644
index 0000000..78cb3c8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var-fvar-table.hh
@@ -0,0 +1,312 @@
+/*
+ * Copyright © 2017  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_VAR_FVAR_TABLE_HH
+#define HB_OT_VAR_FVAR_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * fvar -- Font Variations
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/fvar
+ */
+
+#define HB_OT_TAG_fvar HB_TAG('f','v','a','r')
+
+
+namespace OT {
+
+
+struct InstanceRecord
+{
+  friend struct fvar;
+
+  hb_array_t<const Fixed> get_coordinates (unsigned int axis_count) const
+  { return coordinatesZ.as_array (axis_count); }
+
+  bool sanitize (hb_sanitize_context_t *c, unsigned int axis_count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  c->check_array (coordinatesZ.arrayZ, axis_count));
+  }
+
+  protected:
+  NameID	subfamilyNameID;/* The name ID for entries in the 'name' table
+				 * that provide subfamily names for this instance. */
+  HBUINT16	flags;		/* Reserved for future use — set to 0. */
+  UnsizedArrayOf<Fixed>
+		coordinatesZ;	/* The coordinates array for this instance. */
+  //NameID	postScriptNameIDX;/*Optional. The name ID for entries in the 'name'
+  //				  * table that provide PostScript names for this
+  //				  * instance. */
+
+  public:
+  DEFINE_SIZE_UNBOUNDED (4);
+};
+
+struct AxisRecord
+{
+  enum
+  {
+    AXIS_FLAG_HIDDEN	= 0x0001,
+  };
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  Tag		axisTag;	/* Tag identifying the design variation for the axis. */
+  Fixed		minValue;	/* The minimum coordinate value for the axis. */
+  Fixed		defaultValue;	/* The default coordinate value for the axis. */
+  Fixed		maxValue;	/* The maximum coordinate value for the axis. */
+  HBUINT16	flags;		/* Axis flags. */
+  NameID	axisNameID;	/* The name ID for entries in the 'name' table that
+				 * provide a display name for this axis. */
+
+  public:
+  DEFINE_SIZE_STATIC (20);
+};
+
+struct fvar
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_fvar;
+
+  bool has_data () const { return version.to_int (); }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (version.sanitize (c) &&
+		  likely (version.major == 1) &&
+		  c->check_struct (this) &&
+		  axisSize == 20 && /* Assumed in our code. */
+		  instanceSize >= axisCount * 4 + 4 &&
+		  get_axes ().sanitize (c) &&
+		  c->check_range (get_instance (0), instanceCount, instanceSize));
+  }
+
+  unsigned int get_axis_count () const { return axisCount; }
+
+  void get_axis_deprecated (unsigned int axis_index,
+				   hb_ot_var_axis_t *info) const
+  {
+    const AxisRecord &axis = get_axes ()[axis_index];
+    info->tag = axis.axisTag;
+    info->name_id =  axis.axisNameID;
+    info->default_value = axis.defaultValue / 65536.;
+    /* Ensure order, to simplify client math. */
+    info->min_value = MIN<float> (info->default_value, axis.minValue / 65536.);
+    info->max_value = MAX<float> (info->default_value, axis.maxValue / 65536.);
+  }
+
+  void get_axis_info (unsigned int axis_index,
+		      hb_ot_var_axis_info_t *info) const
+  {
+    const AxisRecord &axis = get_axes ()[axis_index];
+    info->axis_index = axis_index;
+    info->tag = axis.axisTag;
+    info->name_id =  axis.axisNameID;
+    info->flags = (hb_ot_var_axis_flags_t) (unsigned int) axis.flags;
+    info->default_value = axis.defaultValue / 65536.;
+    /* Ensure order, to simplify client math. */
+    info->min_value = MIN<float> (info->default_value, axis.minValue / 65536.);
+    info->max_value = MAX<float> (info->default_value, axis.maxValue / 65536.);
+    info->reserved = 0;
+  }
+
+  unsigned int get_axes_deprecated (unsigned int      start_offset,
+				    unsigned int     *axes_count /* IN/OUT */,
+				    hb_ot_var_axis_t *axes_array /* OUT */) const
+  {
+    if (axes_count)
+    {
+      /* TODO Rewrite as hb_array_t<>::sub-array() */
+      unsigned int count = axisCount;
+      start_offset = MIN (start_offset, count);
+
+      count -= start_offset;
+      axes_array += start_offset;
+
+      count = MIN (count, *axes_count);
+      *axes_count = count;
+
+      for (unsigned int i = 0; i < count; i++)
+	get_axis_deprecated (start_offset + i, axes_array + i);
+    }
+    return axisCount;
+  }
+
+  unsigned int get_axis_infos (unsigned int           start_offset,
+			       unsigned int          *axes_count /* IN/OUT */,
+			       hb_ot_var_axis_info_t *axes_array /* OUT */) const
+  {
+    if (axes_count)
+    {
+      /* TODO Rewrite as hb_array_t<>::sub-array() */
+      unsigned int count = axisCount;
+      start_offset = MIN (start_offset, count);
+
+      count -= start_offset;
+      axes_array += start_offset;
+
+      count = MIN (count, *axes_count);
+      *axes_count = count;
+
+      for (unsigned int i = 0; i < count; i++)
+	get_axis_info (start_offset + i, axes_array + i);
+    }
+    return axisCount;
+  }
+
+  bool find_axis_deprecated (hb_tag_t tag,
+			     unsigned int *axis_index,
+			     hb_ot_var_axis_t *info) const
+  {
+    const AxisRecord *axes = get_axes ();
+    unsigned int count = get_axis_count ();
+    for (unsigned int i = 0; i < count; i++)
+      if (axes[i].axisTag == tag)
+      {
+        if (axis_index)
+	  *axis_index = i;
+	get_axis_deprecated (i, info);
+	return true;
+      }
+    if (axis_index)
+      *axis_index = HB_OT_VAR_NO_AXIS_INDEX;
+    return false;
+  }
+
+  bool find_axis_info (hb_tag_t tag,
+		       hb_ot_var_axis_info_t *info) const
+  {
+    const AxisRecord *axes = get_axes ();
+    unsigned int count = get_axis_count ();
+    for (unsigned int i = 0; i < count; i++)
+      if (axes[i].axisTag == tag)
+      {
+	get_axis_info (i, info);
+	return true;
+      }
+    return false;
+  }
+
+  int normalize_axis_value (unsigned int axis_index, float v) const
+  {
+    hb_ot_var_axis_info_t axis;
+    get_axis_info (axis_index, &axis);
+
+    v = MAX (MIN (v, axis.max_value), axis.min_value); /* Clamp. */
+
+    if (v == axis.default_value)
+      return 0;
+    else if (v < axis.default_value)
+      v = (v - axis.default_value) / (axis.default_value - axis.min_value);
+    else
+      v = (v - axis.default_value) / (axis.max_value - axis.default_value);
+    return (int) (v * 16384.f + (v >= 0.f ? .5f : -.5f));
+  }
+
+  unsigned int get_instance_count () const { return instanceCount; }
+
+  hb_ot_name_id_t get_instance_subfamily_name_id (unsigned int instance_index) const
+  {
+    const InstanceRecord *instance = get_instance (instance_index);
+    if (unlikely (!instance)) return HB_OT_NAME_ID_INVALID;
+    return instance->subfamilyNameID;
+  }
+
+  hb_ot_name_id_t get_instance_postscript_name_id (unsigned int instance_index) const
+  {
+    const InstanceRecord *instance = get_instance (instance_index);
+    if (unlikely (!instance)) return HB_OT_NAME_ID_INVALID;
+    if (instanceSize >= axisCount * 4 + 6)
+      return StructAfter<NameID> (instance->get_coordinates (axisCount));
+    return HB_OT_NAME_ID_INVALID;
+  }
+
+  unsigned int get_instance_coords (unsigned int  instance_index,
+					   unsigned int *coords_length, /* IN/OUT */
+					   float        *coords         /* OUT */) const
+  {
+    const InstanceRecord *instance = get_instance (instance_index);
+    if (unlikely (!instance))
+    {
+      if (coords_length)
+        *coords_length = 0;
+      return 0;
+    }
+
+    if (coords_length && *coords_length)
+    {
+      hb_array_t<const Fixed> instanceCoords = instance->get_coordinates (axisCount)
+							 .sub_array (0, *coords_length);
+      for (unsigned int i = 0; i < instanceCoords.length; i++)
+        coords[i] = instanceCoords.arrayZ[i].to_float ();
+    }
+    return axisCount;
+  }
+
+  protected:
+  hb_array_t<const AxisRecord> get_axes () const
+  { return hb_array (&(this+firstAxis), axisCount); }
+
+  const InstanceRecord *get_instance (unsigned int i) const
+  {
+    if (unlikely (i >= instanceCount)) return nullptr;
+   return &StructAtOffset<InstanceRecord> (&StructAfter<InstanceRecord> (get_axes ()),
+					   i * instanceSize);
+  }
+
+  protected:
+  FixedVersion<>version;	/* Version of the fvar table
+				 * initially set to 0x00010000u */
+  OffsetTo<AxisRecord>
+		firstAxis;	/* Offset in bytes from the beginning of the table
+				 * to the start of the AxisRecord array. */
+  HBUINT16	reserved;	/* This field is permanently reserved. Set to 2. */
+  HBUINT16	axisCount;	/* The number of variation axes in the font (the
+				 * number of records in the axes array). */
+  HBUINT16	axisSize;	/* The size in bytes of each VariationAxisRecord —
+				 * set to 20 (0x0014) for this version. */
+  HBUINT16	instanceCount;	/* The number of named instances defined in the font
+				 * (the number of records in the instances array). */
+  HBUINT16	instanceSize;	/* The size in bytes of each InstanceRecord — set
+				 * to either axisCount * sizeof(Fixed) + 4, or to
+				 * axisCount * sizeof(Fixed) + 6. */
+
+  public:
+  DEFINE_SIZE_STATIC (16);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_VAR_FVAR_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var-hvar-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var-hvar-table.hh
new file mode 100644
index 0000000..a8d9fe3
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var-hvar-table.hh
@@ -0,0 +1,166 @@
+/*
+ * Copyright © 2017  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_VAR_HVAR_TABLE_HH
+#define HB_OT_VAR_HVAR_TABLE_HH
+
+#include "hb-ot-layout-common.hh"
+
+
+namespace OT {
+
+
+struct DeltaSetIndexMap
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  c->check_range (mapDataZ.arrayZ,
+				  mapCount,
+				  get_width ()));
+  }
+
+  unsigned int map (unsigned int v) const /* Returns 16.16 outer.inner. */
+  {
+    /* If count is zero, pass value unchanged.  This takes
+     * care of direct mapping for advance map. */
+    if (!mapCount)
+      return v;
+
+    if (v >= mapCount)
+      v = mapCount - 1;
+
+    unsigned int u = 0;
+    { /* Fetch it. */
+      unsigned int w = get_width ();
+      const HBUINT8 *p = mapDataZ.arrayZ + w * v;
+      for (; w; w--)
+	u = (u << 8) + *p++;
+    }
+
+    { /* Repack it. */
+      unsigned int n = get_inner_bitcount ();
+      unsigned int outer = u >> n;
+      unsigned int inner = u & ((1 << n) - 1);
+      u = (outer<<16) | inner;
+    }
+
+    return u;
+  }
+
+  protected:
+  unsigned int get_width () const          { return ((format >> 4) & 3) + 1; }
+
+  unsigned int get_inner_bitcount () const { return (format & 0xF) + 1; }
+
+  protected:
+  HBUINT16	format;		/* A packed field that describes the compressed
+				 * representation of delta-set indices. */
+  HBUINT16	mapCount;	/* The number of mapping entries. */
+  UnsizedArrayOf<HBUINT8>
+ 		mapDataZ;	/* The delta-set index mapping data. */
+
+  public:
+  DEFINE_SIZE_ARRAY (4, mapDataZ);
+};
+
+
+/*
+ * HVAR -- Horizontal Metrics Variations
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/hvar
+ * VVAR -- Vertical Metrics Variations
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/vvar
+ */
+#define HB_OT_TAG_HVAR HB_TAG('H','V','A','R')
+#define HB_OT_TAG_VVAR HB_TAG('V','V','A','R')
+
+struct HVARVVAR
+{
+  static constexpr hb_tag_t HVARTag = HB_OT_TAG_HVAR;
+  static constexpr hb_tag_t VVARTag = HB_OT_TAG_VVAR;
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (version.sanitize (c) &&
+		  likely (version.major == 1) &&
+		  varStore.sanitize (c, this) &&
+		  advMap.sanitize (c, this) &&
+		  lsbMap.sanitize (c, this) &&
+		  rsbMap.sanitize (c, this));
+  }
+
+  float get_advance_var (hb_codepoint_t glyph,
+			 const int *coords, unsigned int coord_count) const
+  {
+    unsigned int varidx = (this+advMap).map (glyph);
+    return (this+varStore).get_delta (varidx, coords, coord_count);
+  }
+
+  bool has_sidebearing_deltas () const { return lsbMap && rsbMap; }
+
+  protected:
+  FixedVersion<>version;	/* Version of the metrics variation table
+				 * initially set to 0x00010000u */
+  LOffsetTo<VariationStore>
+		varStore;	/* Offset to item variation store table. */
+  LOffsetTo<DeltaSetIndexMap>
+		advMap;		/* Offset to advance var-idx mapping. */
+  LOffsetTo<DeltaSetIndexMap>
+		lsbMap;		/* Offset to lsb/tsb var-idx mapping. */
+  LOffsetTo<DeltaSetIndexMap>
+		rsbMap;		/* Offset to rsb/bsb var-idx mapping. */
+
+  public:
+  DEFINE_SIZE_STATIC (20);
+};
+
+struct HVAR : HVARVVAR {
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_HVAR;
+};
+struct VVAR : HVARVVAR {
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_VVAR;
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (static_cast<const HVARVVAR *> (this)->sanitize (c) &&
+		  vorgMap.sanitize (c, this));
+  }
+
+  protected:
+  LOffsetTo<DeltaSetIndexMap>
+		vorgMap;	/* Offset to vertical-origin var-idx mapping. */
+
+  public:
+  DEFINE_SIZE_STATIC (24);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_VAR_HVAR_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var-mvar-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var-mvar-table.hh
new file mode 100644
index 0000000..0dd63e5
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var-mvar-table.hh
@@ -0,0 +1,117 @@
+/*
+ * Copyright © 2017  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_VAR_MVAR_TABLE_HH
+#define HB_OT_VAR_MVAR_TABLE_HH
+
+#include "hb-ot-layout-common.hh"
+
+
+namespace OT {
+
+
+struct VariationValueRecord
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  Tag		valueTag;	/* Four-byte tag identifying a font-wide measure. */
+  HBUINT32		varIdx;		/* Outer/inner index into VariationStore item. */
+
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+
+/*
+ * MVAR -- Metrics Variations
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/mvar
+ */
+#define HB_OT_TAG_MVAR HB_TAG('M','V','A','R')
+
+struct MVAR
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_MVAR;
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (version.sanitize (c) &&
+		  likely (version.major == 1) &&
+		  c->check_struct (this) &&
+		  valueRecordSize >= VariationValueRecord::static_size &&
+		  varStore.sanitize (c, this) &&
+		  c->check_range (valuesZ.arrayZ,
+				  valueRecordCount,
+				  valueRecordSize));
+  }
+
+  float get_var (hb_tag_t tag,
+		 const int *coords, unsigned int coord_count) const
+  {
+    const VariationValueRecord *record;
+    record = (VariationValueRecord *) bsearch (&tag, valuesZ.arrayZ,
+					       valueRecordCount, valueRecordSize,
+					       tag_compare);
+    if (!record)
+      return 0.;
+
+    return (this+varStore).get_delta (record->varIdx, coords, coord_count);
+  }
+
+protected:
+  static int tag_compare (const void *pa, const void *pb)
+  {
+    const hb_tag_t *a = (const hb_tag_t *) pa;
+    const Tag *b = (const Tag *) pb;
+    return b->cmp (*a);
+  }
+
+  protected:
+  FixedVersion<>version;	/* Version of the metrics variation table
+				 * initially set to 0x00010000u */
+  HBUINT16	reserved;	/* Not used; set to 0. */
+  HBUINT16	valueRecordSize;/* The size in bytes of each value record —
+				 * must be greater than zero. */
+  HBUINT16	valueRecordCount;/* The number of value records — may be zero. */
+  OffsetTo<VariationStore>
+		varStore;	/* Offset to item variation store table. */
+  UnsizedArrayOf<HBUINT8>
+		valuesZ;	/* Array of value records. The records must be
+				 * in binary order of their valueTag field. */
+
+  public:
+  DEFINE_SIZE_ARRAY (12, valuesZ);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_VAR_MVAR_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var.cc
new file mode 100644
index 0000000..e327fb7
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var.cc
@@ -0,0 +1,213 @@
+/*
+ * Copyright © 2017  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
+ */
+
+#include "hb-open-type.hh"
+
+#include "hb-ot-face.hh"
+#include "hb-ot-var-avar-table.hh"
+#include "hb-ot-var-fvar-table.hh"
+#include "hb-ot-var-mvar-table.hh"
+#include "hb-ot-var.h"
+
+
+/**
+ * SECTION:hb-ot-var
+ * @title: hb-ot-var
+ * @short_description: OpenType Font Variations
+ * @include: hb-ot.h
+ *
+ * Functions for fetching information about OpenType Variable Fonts.
+ **/
+
+
+/*
+ * fvar/avar
+ */
+
+
+/**
+ * hb_ot_var_has_data:
+ * @face: #hb_face_t to test
+ *
+ * This function allows to verify the presence of OpenType variation data on the face.
+ *
+ * Return value: true if face has a `fvar' table and false otherwise
+ *
+ * Since: 1.4.2
+ **/
+hb_bool_t
+hb_ot_var_has_data (hb_face_t *face)
+{
+  return face->table.fvar->has_data ();
+}
+
+/**
+ * hb_ot_var_get_axis_count:
+ *
+ * Since: 1.4.2
+ **/
+unsigned int
+hb_ot_var_get_axis_count (hb_face_t *face)
+{
+  return face->table.fvar->get_axis_count ();
+}
+
+/**
+ * hb_ot_var_get_axes:
+ *
+ * Since: 1.4.2
+ * Deprecated: 2.2.0
+ **/
+unsigned int
+hb_ot_var_get_axes (hb_face_t        *face,
+		    unsigned int      start_offset,
+		    unsigned int     *axes_count /* IN/OUT */,
+		    hb_ot_var_axis_t *axes_array /* OUT */)
+{
+  return face->table.fvar->get_axes_deprecated (start_offset, axes_count, axes_array);
+}
+
+/**
+ * hb_ot_var_find_axis:
+ *
+ * Since: 1.4.2
+ * Deprecated: 2.2.0
+ **/
+hb_bool_t
+hb_ot_var_find_axis (hb_face_t        *face,
+		     hb_tag_t          axis_tag,
+		     unsigned int     *axis_index,
+		     hb_ot_var_axis_t *axis_info)
+{
+  return face->table.fvar->find_axis_deprecated (axis_tag, axis_index, axis_info);
+}
+
+/**
+ * hb_ot_var_get_axis_infos:
+ *
+ * Since: 2.2.0
+ **/
+HB_EXTERN unsigned int
+hb_ot_var_get_axis_infos (hb_face_t             *face,
+			  unsigned int           start_offset,
+			  unsigned int          *axes_count /* IN/OUT */,
+			  hb_ot_var_axis_info_t *axes_array /* OUT */)
+{
+  return face->table.fvar->get_axis_infos (start_offset, axes_count, axes_array);
+}
+
+/**
+ * hb_ot_var_find_axis_info:
+ *
+ * Since: 2.2.0
+ **/
+HB_EXTERN hb_bool_t
+hb_ot_var_find_axis_info (hb_face_t             *face,
+			  hb_tag_t               axis_tag,
+			  hb_ot_var_axis_info_t *axis_info)
+{
+  return face->table.fvar->find_axis_info (axis_tag, axis_info);
+}
+
+
+/*
+ * Named instances.
+ */
+
+unsigned int
+hb_ot_var_get_named_instance_count (hb_face_t *face)
+{
+  return face->table.fvar->get_instance_count ();
+}
+
+hb_ot_name_id_t
+hb_ot_var_named_instance_get_subfamily_name_id (hb_face_t   *face,
+						unsigned int instance_index)
+{
+  return face->table.fvar->get_instance_subfamily_name_id (instance_index);
+}
+
+hb_ot_name_id_t
+hb_ot_var_named_instance_get_postscript_name_id (hb_face_t  *face,
+						unsigned int instance_index)
+{
+  return face->table.fvar->get_instance_postscript_name_id (instance_index);
+}
+
+unsigned int
+hb_ot_var_named_instance_get_design_coords (hb_face_t    *face,
+					    unsigned int  instance_index,
+					    unsigned int *coords_length, /* IN/OUT */
+					    float        *coords         /* OUT */)
+{
+  return face->table.fvar->get_instance_coords (instance_index, coords_length, coords);
+}
+
+
+/**
+ * hb_ot_var_normalize_variations:
+ *
+ * Since: 1.4.2
+ **/
+void
+hb_ot_var_normalize_variations (hb_face_t            *face,
+				const hb_variation_t *variations, /* IN */
+				unsigned int          variations_length,
+				int                  *coords, /* OUT */
+				unsigned int          coords_length)
+{
+  for (unsigned int i = 0; i < coords_length; i++)
+    coords[i] = 0;
+
+  const OT::fvar &fvar = *face->table.fvar;
+  for (unsigned int i = 0; i < variations_length; i++)
+  {
+    hb_ot_var_axis_info_t info;
+    if (hb_ot_var_find_axis_info (face, variations[i].tag, &info) &&
+	info.axis_index < coords_length)
+      coords[info.axis_index] = fvar.normalize_axis_value (info.axis_index, variations[i].value);
+  }
+
+  face->table.avar->map_coords (coords, coords_length);
+}
+
+/**
+ * hb_ot_var_normalize_coords:
+ *
+ * Since: 1.4.2
+ **/
+void
+hb_ot_var_normalize_coords (hb_face_t    *face,
+			    unsigned int coords_length,
+			    const float *design_coords, /* IN */
+			    int *normalized_coords /* OUT */)
+{
+  const OT::fvar &fvar = *face->table.fvar;
+  for (unsigned int i = 0; i < coords_length; i++)
+    normalized_coords[i] = fvar.normalize_axis_value (i, design_coords[i]);
+
+  face->table.avar->map_coords (normalized_coords, coords_length);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var.h
new file mode 100644
index 0000000..cf6f0c95
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-var.h
@@ -0,0 +1,146 @@
+/*
+ * Copyright © 2017  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_H_IN
+#error "Include <hb-ot.h> instead."
+#endif
+
+#ifndef HB_OT_VAR_H
+#define HB_OT_VAR_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+
+#define HB_OT_TAG_VAR_AXIS_ITALIC	HB_TAG('i','t','a','l')
+#define HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE	HB_TAG('o','p','s','z')
+#define HB_OT_TAG_VAR_AXIS_SLANT	HB_TAG('s','l','n','t')
+#define HB_OT_TAG_VAR_AXIS_WIDTH	HB_TAG('w','d','t','h')
+#define HB_OT_TAG_VAR_AXIS_WEIGHT	HB_TAG('w','g','h','t')
+
+
+/*
+ * fvar / avar
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_var_has_data (hb_face_t *face);
+
+
+/*
+ * Variation axes.
+ */
+
+
+HB_EXTERN unsigned int
+hb_ot_var_get_axis_count (hb_face_t *face);
+
+/**
+ * hb_ot_var_axis_flags_t:
+ * @HB_OT_VAR_AXIS_FLAG_HIDDEN: The axis should not be exposed directly in user interfaces.
+ *
+ * Since: 2.2.0
+ */
+typedef enum { /*< flags >*/
+  HB_OT_VAR_AXIS_FLAG_HIDDEN	= 0x00000001u,
+
+  _HB_OT_VAR_AXIS_FLAG_MAX_VALUE= 0x7FFFFFFFu /*< skip >*/
+} hb_ot_var_axis_flags_t;
+
+/**
+ * hb_ot_var_axis_info_t:
+ *
+ * Since: 2.2.0
+ */
+typedef struct hb_ot_var_axis_info_t
+{
+  unsigned int			axis_index;
+  hb_tag_t			tag;
+  hb_ot_name_id_t		name_id;
+  hb_ot_var_axis_flags_t	flags;
+  float				min_value;
+  float				default_value;
+  float				max_value;
+  /*< private >*/
+  unsigned int			reserved;
+} hb_ot_var_axis_info_t;
+
+HB_EXTERN unsigned int
+hb_ot_var_get_axis_infos (hb_face_t             *face,
+			  unsigned int           start_offset,
+			  unsigned int          *axes_count /* IN/OUT */,
+			  hb_ot_var_axis_info_t *axes_array /* OUT */);
+
+HB_EXTERN hb_bool_t
+hb_ot_var_find_axis_info (hb_face_t             *face,
+			  hb_tag_t               axis_tag,
+			  hb_ot_var_axis_info_t *axis_info);
+
+
+/*
+ * Named instances.
+ */
+
+HB_EXTERN unsigned int
+hb_ot_var_get_named_instance_count (hb_face_t *face);
+
+HB_EXTERN hb_ot_name_id_t
+hb_ot_var_named_instance_get_subfamily_name_id (hb_face_t   *face,
+						unsigned int instance_index);
+
+HB_EXTERN hb_ot_name_id_t
+hb_ot_var_named_instance_get_postscript_name_id (hb_face_t  *face,
+						unsigned int instance_index);
+
+HB_EXTERN unsigned int
+hb_ot_var_named_instance_get_design_coords (hb_face_t    *face,
+					    unsigned int  instance_index,
+					    unsigned int *coords_length, /* IN/OUT */
+					    float        *coords         /* OUT */);
+
+
+/*
+ * Conversions.
+ */
+
+HB_EXTERN void
+hb_ot_var_normalize_variations (hb_face_t            *face,
+				const hb_variation_t *variations, /* IN */
+				unsigned int          variations_length,
+				int                  *coords, /* OUT */
+				unsigned int          coords_length);
+
+HB_EXTERN void
+hb_ot_var_normalize_coords (hb_face_t    *face,
+			    unsigned int coords_length,
+			    const float *design_coords, /* IN */
+			    int *normalized_coords /* OUT */);
+
+
+HB_END_DECLS
+
+#endif /* HB_OT_VAR_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-vorg-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-vorg-table.hh
new file mode 100644
index 0000000..0202fcc
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot-vorg-table.hh
@@ -0,0 +1,181 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_OT_VORG_TABLE_HH
+#define HB_OT_VORG_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * VORG -- Vertical Origin Table
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/vorg
+ */
+#define HB_OT_TAG_VORG HB_TAG('V','O','R','G')
+
+namespace OT {
+
+struct VertOriginMetric
+{
+  int cmp (hb_codepoint_t g) const { return glyph.cmp (g); }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  GlyphID	glyph;
+  FWORD		vertOriginY;
+
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct VORG
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_VORG;
+
+  bool has_data () const { return version.to_int (); }
+
+  int get_y_origin (hb_codepoint_t glyph) const
+  {
+    unsigned int i;
+    if (!vertYOrigins.bfind (glyph, &i))
+      return defaultVertOriginY;
+    return vertYOrigins[i].vertOriginY;
+  }
+
+  bool _subset (const hb_subset_plan_t *plan HB_UNUSED,
+		const VORG *vorg_table,
+		const hb_vector_t<VertOriginMetric> &subset_metrics,
+		unsigned int dest_sz,
+		void *dest) const
+  {
+    hb_serialize_context_t c (dest, dest_sz);
+
+    VORG *subset_table = c.start_serialize<VORG> ();
+    if (unlikely (!c.extend_min (*subset_table)))
+      return false;
+
+    subset_table->version.major.set (1);
+    subset_table->version.minor.set (0);
+
+    subset_table->defaultVertOriginY.set (vorg_table->defaultVertOriginY);
+    subset_table->vertYOrigins.len.set (subset_metrics.length);
+
+    bool success = true;
+    if (subset_metrics.length > 0)
+    {
+      unsigned int  size = VertOriginMetric::static_size * subset_metrics.length;
+      VertOriginMetric  *metrics = c.allocate_size<VertOriginMetric> (size);
+      if (likely (metrics != nullptr))
+        memcpy (metrics, &subset_metrics[0], size);
+      else
+        success = false;
+    }
+    c.end_serialize ();
+
+    return success;
+  }
+
+  bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_blob_t *vorg_blob = hb_sanitize_context_t().reference_table<VORG> (plan->source);
+    const VORG *vorg_table = vorg_blob->as<VORG> ();
+
+    /* count the number of glyphs to be included in the subset table */
+    hb_vector_t<VertOriginMetric> subset_metrics;
+    subset_metrics.init ();
+    unsigned int glyph = 0;
+    unsigned int i = 0;
+    while ((glyph < plan->glyphs.length) && (i < vertYOrigins.len))
+    {
+      if (plan->glyphs[glyph] > vertYOrigins[i].glyph)
+        i++;
+      else if (plan->glyphs[glyph] < vertYOrigins[i].glyph)
+        glyph++;
+      else
+      {
+        VertOriginMetric *metrics = subset_metrics.push ();
+        metrics->glyph.set (glyph);
+        metrics->vertOriginY.set (vertYOrigins[i].vertOriginY);
+        glyph++;
+        i++;
+      }
+    }
+
+    /* alloc the new table */
+    unsigned int dest_sz = VORG::min_size + VertOriginMetric::static_size * subset_metrics.length;
+    void *dest = (void *) malloc (dest_sz);
+    if (unlikely (!dest))
+    {
+      subset_metrics.fini ();
+      hb_blob_destroy (vorg_blob);
+      return false;
+    }
+
+    /* serialize the new table */
+    if (!_subset (plan, vorg_table, subset_metrics, dest_sz, dest))
+    {
+      subset_metrics.fini ();
+      free (dest);
+      hb_blob_destroy (vorg_blob);
+      return false;
+    }
+
+    hb_blob_t *result = hb_blob_create ((const char *)dest,
+                                        dest_sz,
+                                        HB_MEMORY_MODE_READONLY,
+                                        dest,
+                                        free);
+    bool success = plan->add_table (HB_OT_TAG_VORG, result);
+    hb_blob_destroy (result);
+    subset_metrics.fini ();
+    hb_blob_destroy (vorg_blob);
+    return success;
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                  version.major == 1 &&
+                  vertYOrigins.sanitize (c));
+  }
+
+  protected:
+  FixedVersion<>	version;		/* Version of VORG table. Set to 0x00010000u. */
+  FWORD			defaultVertOriginY;	/* The default vertical origin. */
+  SortedArrayOf<VertOriginMetric>
+			vertYOrigins;		/* The array of vertical origins. */
+
+  public:
+  DEFINE_SIZE_ARRAY(8, vertYOrigins);
+};
+} /* namespace OT */
+
+#endif /* HB_OT_VORG_TABLE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot.h
new file mode 100644
index 0000000..db78469
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ot.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright © 2009  Red Hat, 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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_H
+#define HB_OT_H
+#define HB_OT_H_IN
+
+#include "hb.h"
+
+#include "hb-ot-color.h"
+#include "hb-ot-deprecated.h"
+#include "hb-ot-font.h"
+#include "hb-ot-layout.h"
+#include "hb-ot-math.h"
+#include "hb-ot-name.h"
+#include "hb-ot-shape.h"
+#include "hb-ot-var.h"
+
+HB_BEGIN_DECLS
+
+HB_END_DECLS
+
+#undef HB_OT_H_IN
+#endif /* HB_OT_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-set-digest.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-set-digest.hh
new file mode 100644
index 0000000..b97526f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-set-digest.hh
@@ -0,0 +1,174 @@
+/*
+ * Copyright © 2012  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_SET_DIGEST_HH
+#define HB_SET_DIGEST_HH
+
+#include "hb.hh"
+
+/*
+ * The set digests here implement various "filters" that support
+ * "approximate member query".  Conceptually these are like Bloom
+ * Filter and Quotient Filter, however, much smaller, faster, and
+ * designed to fit the requirements of our uses for glyph coverage
+ * queries.
+ *
+ * Our filters are highly accurate if the lookup covers fairly local
+ * set of glyphs, but fully flooded and ineffective if coverage is
+ * all over the place.
+ *
+ * The frozen-set can be used instead of a digest, to trade more
+ * memory for 100% accuracy, but in practice, that doesn't look like
+ * an attractive trade-off.
+ */
+
+template <typename mask_t, unsigned int shift>
+struct hb_set_digest_lowest_bits_t
+{
+  static constexpr unsigned mask_bytes = sizeof (mask_t);
+  static constexpr unsigned mask_bits = sizeof (mask_t) * 8;
+  static constexpr unsigned num_bits = 0
+				     + (mask_bytes >= 1 ? 3 : 0)
+				     + (mask_bytes >= 2 ? 1 : 0)
+				     + (mask_bytes >= 4 ? 1 : 0)
+				     + (mask_bytes >= 8 ? 1 : 0)
+				     + (mask_bytes >= 16? 1 : 0)
+				     + 0;
+
+  static_assert ((shift < sizeof (hb_codepoint_t) * 8), "");
+  static_assert ((shift + num_bits <= sizeof (hb_codepoint_t) * 8), "");
+
+  void init () { mask = 0; }
+
+  void add (hb_codepoint_t g) { mask |= mask_for (g); }
+
+  bool add_range (hb_codepoint_t a, hb_codepoint_t b)
+  {
+    if ((b >> shift) - (a >> shift) >= mask_bits - 1)
+      mask = (mask_t) -1;
+    else {
+      mask_t ma = mask_for (a);
+      mask_t mb = mask_for (b);
+      mask |= mb + (mb - ma) - (mb < ma);
+    }
+    return true;
+  }
+
+  template <typename T>
+  void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  {
+    for (unsigned int i = 0; i < count; i++)
+    {
+      add (*array);
+      array = (const T *) (stride + (const char *) array);
+    }
+  }
+  template <typename T>
+  bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  {
+    for (unsigned int i = 0; i < count; i++)
+    {
+      add (*array);
+      array = (const T *) (stride + (const char *) array);
+    }
+    return true;
+  }
+
+  bool may_have (hb_codepoint_t g) const
+  { return !!(mask & mask_for (g)); }
+
+  private:
+
+  static mask_t mask_for (hb_codepoint_t g)
+  { return ((mask_t) 1) << ((g >> shift) & (mask_bits - 1)); }
+  mask_t mask;
+};
+
+template <typename head_t, typename tail_t>
+struct hb_set_digest_combiner_t
+{
+  void init ()
+  {
+    head.init ();
+    tail.init ();
+  }
+
+  void add (hb_codepoint_t g)
+  {
+    head.add (g);
+    tail.add (g);
+  }
+
+  bool add_range (hb_codepoint_t a, hb_codepoint_t b)
+  {
+    head.add_range (a, b);
+    tail.add_range (a, b);
+    return true;
+  }
+  template <typename T>
+  void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  {
+    head.add_array (array, count, stride);
+    tail.add_array (array, count, stride);
+  }
+  template <typename T>
+  bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  {
+    head.add_sorted_array (array, count, stride);
+    tail.add_sorted_array (array, count, stride);
+    return true;
+  }
+
+  bool may_have (hb_codepoint_t g) const
+  {
+    return head.may_have (g) && tail.may_have (g);
+  }
+
+  private:
+  head_t head;
+  tail_t tail;
+};
+
+
+/*
+ * hb_set_digest_t
+ *
+ * This is a combination of digests that performs "best".
+ * There is not much science to this: it's a result of intuition
+ * and testing.
+ */
+typedef hb_set_digest_combiner_t
+<
+  hb_set_digest_lowest_bits_t<unsigned long, 4>,
+  hb_set_digest_combiner_t
+  <
+    hb_set_digest_lowest_bits_t<unsigned long, 0>,
+    hb_set_digest_lowest_bits_t<unsigned long, 9>
+  >
+> hb_set_digest_t;
+
+
+#endif /* HB_SET_DIGEST_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-set.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-set.cc
new file mode 100644
index 0000000..0682362
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-set.cc
@@ -0,0 +1,539 @@
+/*
+ * Copyright © 2012  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
+ */
+
+#include "hb-set.hh"
+
+
+/**
+ * SECTION:hb-set
+ * @title: hb-set
+ * @short_description: Object representing a set of integers
+ * @include: hb.h
+ *
+ * Set objects represent a mathematical set of integer values.  They are
+ * used in non-shaping API to query certain set of characters or glyphs,
+ * or other integer values.
+ **/
+
+
+/**
+ * hb_set_create: (Xconstructor)
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.2
+ **/
+hb_set_t *
+hb_set_create ()
+{
+  hb_set_t *set;
+
+  if (!(set = hb_object_create<hb_set_t> ()))
+    return hb_set_get_empty ();
+
+  set->init_shallow ();
+
+  return set;
+}
+
+/**
+ * hb_set_get_empty:
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.2
+ **/
+hb_set_t *
+hb_set_get_empty ()
+{
+  return const_cast<hb_set_t *> (&Null(hb_set_t));
+}
+
+/**
+ * hb_set_reference: (skip)
+ * @set: a set.
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.2
+ **/
+hb_set_t *
+hb_set_reference (hb_set_t *set)
+{
+  return hb_object_reference (set);
+}
+
+/**
+ * hb_set_destroy: (skip)
+ * @set: a set.
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_set_destroy (hb_set_t *set)
+{
+  if (!hb_object_destroy (set)) return;
+
+  set->fini_shallow ();
+
+  free (set);
+}
+
+/**
+ * hb_set_set_user_data: (skip)
+ * @set: a set.
+ * @key:
+ * @data:
+ * @destroy:
+ * @replace:
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_set_set_user_data (hb_set_t           *set,
+		      hb_user_data_key_t *key,
+		      void *              data,
+		      hb_destroy_func_t   destroy,
+		      hb_bool_t           replace)
+{
+  return hb_object_set_user_data (set, key, data, destroy, replace);
+}
+
+/**
+ * hb_set_get_user_data: (skip)
+ * @set: a set.
+ * @key:
+ *
+ * Return value: (transfer none):
+ *
+ * Since: 0.9.2
+ **/
+void *
+hb_set_get_user_data (hb_set_t           *set,
+		      hb_user_data_key_t *key)
+{
+  return hb_object_get_user_data (set, key);
+}
+
+
+/**
+ * hb_set_allocation_successful:
+ * @set: a set.
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_set_allocation_successful (const hb_set_t  *set)
+{
+  return set->successful;
+}
+
+/**
+ * hb_set_clear:
+ * @set: a set.
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_set_clear (hb_set_t *set)
+{
+  set->clear ();
+}
+
+/**
+ * hb_set_is_empty:
+ * @set: a set.
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.7
+ **/
+hb_bool_t
+hb_set_is_empty (const hb_set_t *set)
+{
+  return set->is_empty ();
+}
+
+/**
+ * hb_set_has:
+ * @set: a set.
+ * @codepoint: 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_set_has (const hb_set_t *set,
+	    hb_codepoint_t  codepoint)
+{
+  return set->has (codepoint);
+}
+
+/**
+ * hb_set_add:
+ * @set: a set.
+ * @codepoint: 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_set_add (hb_set_t       *set,
+	    hb_codepoint_t  codepoint)
+{
+  set->add (codepoint);
+}
+
+/**
+ * hb_set_add_range:
+ * @set: a set.
+ * @first: 
+ * @last: 
+ *
+ * 
+ *
+ * Since: 0.9.7
+ **/
+void
+hb_set_add_range (hb_set_t       *set,
+		  hb_codepoint_t  first,
+		  hb_codepoint_t  last)
+{
+  set->add_range (first, last);
+}
+
+/**
+ * hb_set_del:
+ * @set: a set.
+ * @codepoint: 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_set_del (hb_set_t       *set,
+	    hb_codepoint_t  codepoint)
+{
+  set->del (codepoint);
+}
+
+/**
+ * hb_set_del_range:
+ * @set: a set.
+ * @first: 
+ * @last: 
+ *
+ * 
+ *
+ * Since: 0.9.7
+ **/
+void
+hb_set_del_range (hb_set_t       *set,
+		  hb_codepoint_t  first,
+		  hb_codepoint_t  last)
+{
+  set->del_range (first, last);
+}
+
+/**
+ * hb_set_is_equal:
+ * @set: a set.
+ * @other: other set.
+ *
+ * 
+ *
+ * Return value: %TRUE if the two sets are equal, %FALSE otherwise.
+ *
+ * Since: 0.9.7
+ **/
+hb_bool_t
+hb_set_is_equal (const hb_set_t *set,
+		 const hb_set_t *other)
+{
+  return set->is_equal (other);
+}
+
+/**
+ * hb_set_is_subset:
+ * @set: a set.
+ * @larger_set: other set.
+ *
+ *
+ *
+ * Return value: %TRUE if the @set is a subset of (or equal to) @larger_set, %FALSE otherwise.
+ *
+ * Since: 1.8.1
+ **/
+hb_bool_t
+hb_set_is_subset (const hb_set_t *set,
+		  const hb_set_t *larger_set)
+{
+  return set->is_subset (larger_set);
+}
+
+/**
+ * hb_set_set:
+ * @set: a set.
+ * @other: 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_set_set (hb_set_t       *set,
+	    const hb_set_t *other)
+{
+  set->set (other);
+}
+
+/**
+ * hb_set_union:
+ * @set: a set.
+ * @other: 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_set_union (hb_set_t       *set,
+	      const hb_set_t *other)
+{
+  set->union_ (other);
+}
+
+/**
+ * hb_set_intersect:
+ * @set: a set.
+ * @other: 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_set_intersect (hb_set_t       *set,
+		  const hb_set_t *other)
+{
+  set->intersect (other);
+}
+
+/**
+ * hb_set_subtract:
+ * @set: a set.
+ * @other: 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_set_subtract (hb_set_t       *set,
+		 const hb_set_t *other)
+{
+  set->subtract (other);
+}
+
+/**
+ * hb_set_symmetric_difference:
+ * @set: a set.
+ * @other: 
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_set_symmetric_difference (hb_set_t       *set,
+			     const hb_set_t *other)
+{
+  set->symmetric_difference (other);
+}
+
+/**
+ * hb_set_invert:
+ * @set: a set.
+ *
+ * 
+ *
+ * Since: 0.9.10
+ *
+ * Deprecated: 1.6.1
+ **/
+void
+hb_set_invert (hb_set_t *set HB_UNUSED)
+{
+}
+
+/**
+ * hb_set_get_population:
+ * @set: a set.
+ *
+ * Returns the number of numbers in the set.
+ *
+ * Return value: set population.
+ *
+ * Since: 0.9.7
+ **/
+unsigned int
+hb_set_get_population (const hb_set_t *set)
+{
+  return set->get_population ();
+}
+
+/**
+ * hb_set_get_min:
+ * @set: a set.
+ *
+ * Finds the minimum number in the set.
+ *
+ * Return value: minimum of the set, or %HB_SET_VALUE_INVALID if set is empty.
+ *
+ * Since: 0.9.7
+ **/
+hb_codepoint_t
+hb_set_get_min (const hb_set_t *set)
+{
+  return set->get_min ();
+}
+
+/**
+ * hb_set_get_max:
+ * @set: a set.
+ *
+ * Finds the maximum number in the set.
+ *
+ * Return value: minimum of the set, or %HB_SET_VALUE_INVALID if set is empty.
+ *
+ * Since: 0.9.7
+ **/
+hb_codepoint_t
+hb_set_get_max (const hb_set_t *set)
+{
+  return set->get_max ();
+}
+
+/**
+ * hb_set_next:
+ * @set: a set.
+ * @codepoint: (inout):
+ *
+ * Gets the next number in @set that is greater than current value of @codepoint.
+ *
+ * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
+ *
+ * Return value: whether there was a next value.
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_set_next (const hb_set_t *set,
+	     hb_codepoint_t *codepoint)
+{
+  return set->next (codepoint);
+}
+
+/**
+ * hb_set_previous:
+ * @set: a set.
+ * @codepoint: (inout):
+ *
+ * Gets the previous number in @set that is slower than current value of @codepoint.
+ *
+ * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
+ *
+ * Return value: whether there was a previous value.
+ *
+ * Since: 1.8.0
+ **/
+hb_bool_t
+hb_set_previous (const hb_set_t *set,
+		 hb_codepoint_t *codepoint)
+{
+  return set->previous (codepoint);
+}
+
+/**
+ * hb_set_next_range:
+ * @set: a set.
+ * @first: (out): output first codepoint in the range.
+ * @last: (inout): input current last and output last codepoint in the range.
+ *
+ * Gets the next consecutive range of numbers in @set that
+ * are greater than current value of @last.
+ *
+ * Set @last to %HB_SET_VALUE_INVALID to get started.
+ *
+ * Return value: whether there was a next range.
+ *
+ * Since: 0.9.7
+ **/
+hb_bool_t
+hb_set_next_range (const hb_set_t *set,
+		   hb_codepoint_t *first,
+		   hb_codepoint_t *last)
+{
+  return set->next_range (first, last);
+}
+
+/**
+ * hb_set_previous_range:
+ * @set: a set.
+ * @first: (inout): input current first and output first codepoint in the range.
+ * @last: (out): output last codepoint in the range.
+ *
+ * Gets the previous consecutive range of numbers in @set that
+ * are greater than current value of @last.
+ *
+ * Set @first to %HB_SET_VALUE_INVALID to get started.
+ *
+ * Return value: whether there was a previous range.
+ *
+ * Since: 1.8.0
+ **/
+hb_bool_t
+hb_set_previous_range (const hb_set_t *set,
+		       hb_codepoint_t *first,
+		       hb_codepoint_t *last)
+{
+  return set->previous_range (first, last);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-set.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-set.h
new file mode 100644
index 0000000..ed0e05d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-set.h
@@ -0,0 +1,167 @@
+/*
+ * Copyright © 2012  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_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_SET_H
+#define HB_SET_H
+
+#include "hb-common.h"
+
+HB_BEGIN_DECLS
+
+
+/*
+ * Since: 0.9.21
+ */
+#define HB_SET_VALUE_INVALID ((hb_codepoint_t) -1)
+
+typedef struct hb_set_t hb_set_t;
+
+
+HB_EXTERN hb_set_t *
+hb_set_create (void);
+
+HB_EXTERN hb_set_t *
+hb_set_get_empty (void);
+
+HB_EXTERN hb_set_t *
+hb_set_reference (hb_set_t *set);
+
+HB_EXTERN void
+hb_set_destroy (hb_set_t *set);
+
+HB_EXTERN hb_bool_t
+hb_set_set_user_data (hb_set_t           *set,
+		      hb_user_data_key_t *key,
+		      void *              data,
+		      hb_destroy_func_t   destroy,
+		      hb_bool_t           replace);
+
+HB_EXTERN void *
+hb_set_get_user_data (hb_set_t           *set,
+		      hb_user_data_key_t *key);
+
+
+/* Returns false if allocation has failed before */
+HB_EXTERN hb_bool_t
+hb_set_allocation_successful (const hb_set_t *set);
+
+HB_EXTERN void
+hb_set_clear (hb_set_t *set);
+
+HB_EXTERN hb_bool_t
+hb_set_is_empty (const hb_set_t *set);
+
+HB_EXTERN hb_bool_t
+hb_set_has (const hb_set_t *set,
+	    hb_codepoint_t  codepoint);
+
+HB_EXTERN void
+hb_set_add (hb_set_t       *set,
+	    hb_codepoint_t  codepoint);
+
+HB_EXTERN void
+hb_set_add_range (hb_set_t       *set,
+		  hb_codepoint_t  first,
+		  hb_codepoint_t  last);
+
+HB_EXTERN void
+hb_set_del (hb_set_t       *set,
+	    hb_codepoint_t  codepoint);
+
+HB_EXTERN void
+hb_set_del_range (hb_set_t       *set,
+		  hb_codepoint_t  first,
+		  hb_codepoint_t  last);
+
+HB_EXTERN hb_bool_t
+hb_set_is_equal (const hb_set_t *set,
+		 const hb_set_t *other);
+
+HB_EXTERN hb_bool_t
+hb_set_is_subset (const hb_set_t *set,
+		  const hb_set_t *larger_set);
+
+HB_EXTERN void
+hb_set_set (hb_set_t       *set,
+	    const hb_set_t *other);
+
+HB_EXTERN void
+hb_set_union (hb_set_t       *set,
+	      const hb_set_t *other);
+
+HB_EXTERN void
+hb_set_intersect (hb_set_t       *set,
+		  const hb_set_t *other);
+
+HB_EXTERN void
+hb_set_subtract (hb_set_t       *set,
+		 const hb_set_t *other);
+
+HB_EXTERN void
+hb_set_symmetric_difference (hb_set_t       *set,
+			     const hb_set_t *other);
+
+HB_EXTERN unsigned int
+hb_set_get_population (const hb_set_t *set);
+
+/* Returns HB_SET_VALUE_INVALID if set empty. */
+HB_EXTERN hb_codepoint_t
+hb_set_get_min (const hb_set_t *set);
+
+/* Returns HB_SET_VALUE_INVALID if set empty. */
+HB_EXTERN hb_codepoint_t
+hb_set_get_max (const hb_set_t *set);
+
+/* Pass HB_SET_VALUE_INVALID in to get started. */
+HB_EXTERN hb_bool_t
+hb_set_next (const hb_set_t *set,
+	     hb_codepoint_t *codepoint);
+
+/* Pass HB_SET_VALUE_INVALID in to get started. */
+HB_EXTERN hb_bool_t
+hb_set_previous (const hb_set_t *set,
+		 hb_codepoint_t *codepoint);
+
+/* Pass HB_SET_VALUE_INVALID for first and last to get started. */
+HB_EXTERN hb_bool_t
+hb_set_next_range (const hb_set_t *set,
+		   hb_codepoint_t *first,
+		   hb_codepoint_t *last);
+
+/* Pass HB_SET_VALUE_INVALID for first and last to get started. */
+HB_EXTERN hb_bool_t
+hb_set_previous_range (const hb_set_t *set,
+		       hb_codepoint_t *first,
+		       hb_codepoint_t *last);
+
+
+HB_END_DECLS
+
+#endif /* HB_SET_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-set.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-set.hh
new file mode 100644
index 0000000..64a1363
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-set.hh
@@ -0,0 +1,738 @@
+/*
+ * Copyright © 2012,2017  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_SET_HH
+#define HB_SET_HH
+
+#include "hb.hh"
+
+
+/*
+ * hb_set_t
+ */
+
+/* TODO Keep a free-list so we can free pages that are completely zeroed.  At that
+ * point maybe also use a sentinel value for "all-1" pages? */
+
+struct hb_set_t
+{
+  HB_NO_COPY_ASSIGN (hb_set_t);
+  hb_set_t ()  { init (); }
+  ~hb_set_t () { fini (); }
+
+  struct page_map_t
+  {
+    int cmp (const page_map_t &o) const { return (int) o.major - (int) major; }
+
+    uint32_t major;
+    uint32_t index;
+  };
+
+  struct page_t
+  {
+    void init0 () { v.clear (); }
+    void init1 () { v.clear (0xFF); }
+
+    unsigned int len () const
+    { return ARRAY_LENGTH_CONST (v); }
+
+    bool is_empty () const
+    {
+      for (unsigned int i = 0; i < len (); i++)
+        if (v[i])
+	  return false;
+      return true;
+    }
+
+    void add (hb_codepoint_t g) { elt (g) |= mask (g); }
+    void del (hb_codepoint_t g) { elt (g) &= ~mask (g); }
+    bool has (hb_codepoint_t g) const { return !!(elt (g) & mask (g)); }
+
+    void add_range (hb_codepoint_t a, hb_codepoint_t b)
+    {
+      elt_t *la = &elt (a);
+      elt_t *lb = &elt (b);
+      if (la == lb)
+        *la |= (mask (b) << 1) - mask(a);
+      else
+      {
+	*la |= ~(mask (a) - 1);
+	la++;
+
+	memset (la, 0xff, (char *) lb - (char *) la);
+
+	*lb |= ((mask (b) << 1) - 1);
+      }
+    }
+
+    bool is_equal (const page_t *other) const
+    {
+      return 0 == hb_memcmp (&v, &other->v, sizeof (v));
+    }
+
+    unsigned int get_population () const
+    {
+      unsigned int pop = 0;
+      for (unsigned int i = 0; i < len (); i++)
+        pop += hb_popcount (v[i]);
+      return pop;
+    }
+
+    bool next (hb_codepoint_t *codepoint) const
+    {
+      unsigned int m = (*codepoint + 1) & MASK;
+      if (!m)
+      {
+	*codepoint = INVALID;
+	return false;
+      }
+      unsigned int i = m / ELT_BITS;
+      unsigned int j = m & ELT_MASK;
+
+      const elt_t vv = v[i] & ~((elt_t (1) << j) - 1);
+      for (const elt_t *p = &vv; i < len (); p = &v[++i])
+	if (*p)
+	{
+	  *codepoint = i * ELT_BITS + elt_get_min (*p);
+	  return true;
+	}
+
+      *codepoint = INVALID;
+      return false;
+    }
+    bool previous (hb_codepoint_t *codepoint) const
+    {
+      unsigned int m = (*codepoint - 1) & MASK;
+      if (m == MASK)
+      {
+	*codepoint = INVALID;
+	return false;
+      }
+      unsigned int i = m / ELT_BITS;
+      unsigned int j = m & ELT_MASK;
+
+      const elt_t vv = v[i] & ((elt_t (1) << (j + 1)) - 1);
+      for (const elt_t *p = &vv; (int) i >= 0; p = &v[--i])
+	if (*p)
+	{
+	  *codepoint = i * ELT_BITS + elt_get_max (*p);
+	  return true;
+	}
+
+      *codepoint = INVALID;
+      return false;
+    }
+    hb_codepoint_t get_min () const
+    {
+      for (unsigned int i = 0; i < len (); i++)
+        if (v[i])
+	  return i * ELT_BITS + elt_get_min (v[i]);
+      return INVALID;
+    }
+    hb_codepoint_t get_max () const
+    {
+      for (int i = len () - 1; i >= 0; i--)
+        if (v[i])
+	  return i * ELT_BITS + elt_get_max (v[i]);
+      return 0;
+    }
+
+    typedef unsigned long long elt_t;
+    static constexpr unsigned PAGE_BITS = 512;
+    static_assert ((PAGE_BITS & ((PAGE_BITS) - 1)) == 0, "");
+
+    static unsigned int elt_get_min (const elt_t &elt) { return hb_ctz (elt); }
+    static unsigned int elt_get_max (const elt_t &elt) { return hb_bit_storage (elt) - 1; }
+
+    typedef hb_vector_size_t<elt_t, PAGE_BITS / 8> vector_t;
+
+    static constexpr unsigned ELT_BITS = sizeof (elt_t) * 8;
+    static constexpr unsigned ELT_MASK = ELT_BITS - 1;
+    static constexpr unsigned BITS = sizeof (vector_t) * 8;
+    static constexpr unsigned MASK = BITS - 1;
+    static_assert ((unsigned) PAGE_BITS == (unsigned) BITS, "");
+
+    elt_t &elt (hb_codepoint_t g) { return v[(g & MASK) / ELT_BITS]; }
+    elt_t const &elt (hb_codepoint_t g) const { return v[(g & MASK) / ELT_BITS]; }
+    elt_t mask (hb_codepoint_t g) const { return elt_t (1) << (g & ELT_MASK); }
+
+    vector_t v;
+  };
+  static_assert (page_t::PAGE_BITS == sizeof (page_t) * 8, "");
+
+  hb_object_header_t header;
+  bool successful; /* Allocations successful */
+  mutable unsigned int population;
+  hb_vector_t<page_map_t> page_map;
+  hb_vector_t<page_t> pages;
+
+  void init_shallow ()
+  {
+    successful = true;
+    population = 0;
+    page_map.init ();
+    pages.init ();
+  }
+  void init ()
+  {
+    hb_object_init (this);
+    init_shallow ();
+  }
+  void fini_shallow ()
+  {
+    population = 0;
+    page_map.fini ();
+    pages.fini ();
+  }
+  void fini ()
+  {
+    hb_object_fini (this);
+    fini_shallow ();
+  }
+
+  bool in_error () const { return !successful; }
+
+  bool resize (unsigned int count)
+  {
+    if (unlikely (!successful)) return false;
+    if (!pages.resize (count) || !page_map.resize (count))
+    {
+      pages.resize (page_map.length);
+      successful = false;
+      return false;
+    }
+    return true;
+  }
+
+  void clear ()
+  {
+    if (unlikely (hb_object_is_immutable (this)))
+      return;
+    successful = true;
+    population = 0;
+    page_map.resize (0);
+    pages.resize (0);
+  }
+  bool is_empty () const
+  {
+    unsigned int count = pages.length;
+    for (unsigned int i = 0; i < count; i++)
+      if (!pages[i].is_empty ())
+        return false;
+    return true;
+  }
+
+  void dirty () { population = (unsigned int) -1; }
+
+  void add (hb_codepoint_t g)
+  {
+    if (unlikely (!successful)) return;
+    if (unlikely (g == INVALID)) return;
+    dirty ();
+    page_t *page = page_for_insert (g); if (unlikely (!page)) return;
+    page->add (g);
+  }
+  bool add_range (hb_codepoint_t a, hb_codepoint_t b)
+  {
+    if (unlikely (!successful)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
+    if (unlikely (a > b || a == INVALID || b == INVALID)) return false;
+    dirty ();
+    unsigned int ma = get_major (a);
+    unsigned int mb = get_major (b);
+    if (ma == mb)
+    {
+      page_t *page = page_for_insert (a); if (unlikely (!page)) return false;
+      page->add_range (a, b);
+    }
+    else
+    {
+      page_t *page = page_for_insert (a); if (unlikely (!page)) return false;
+      page->add_range (a, major_start (ma + 1) - 1);
+
+      for (unsigned int m = ma + 1; m < mb; m++)
+      {
+	page = page_for_insert (major_start (m)); if (unlikely (!page)) return false;
+	page->init1 ();
+      }
+
+      page = page_for_insert (b); if (unlikely (!page)) return false;
+      page->add_range (major_start (mb), b);
+    }
+    return true;
+  }
+
+  template <typename T>
+  void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  {
+    if (unlikely (!successful)) return;
+    if (!count) return;
+    dirty ();
+    hb_codepoint_t g = *array;
+    while (count)
+    {
+      unsigned int m = get_major (g);
+      page_t *page = page_for_insert (g); if (unlikely (!page)) return;
+      unsigned int start = major_start (m);
+      unsigned int end = major_start (m + 1);
+      do
+      {
+	page->add (g);
+
+	array = (const T *) ((const char *) array + stride);
+	count--;
+      }
+      while (count && (g = *array, start <= g && g < end));
+    }
+  }
+
+  /* Might return false if array looks unsorted.
+   * Used for faster rejection of corrupt data. */
+  template <typename T>
+  bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  {
+    if (unlikely (!successful)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
+    if (!count) return true;
+    dirty ();
+    hb_codepoint_t g = *array;
+    hb_codepoint_t last_g = g;
+    while (count)
+    {
+      unsigned int m = get_major (g);
+      page_t *page = page_for_insert (g); if (unlikely (!page)) return false;
+      unsigned int end = major_start (m + 1);
+      do
+      {
+        /* If we try harder we can change the following comparison to <=;
+	 * Not sure if it's worth it. */
+        if (g < last_g) return false;
+	last_g = g;
+	page->add (g);
+
+	array = (const T *) ((const char *) array + stride);
+	count--;
+      }
+      while (count && (g = *array, g < end));
+    }
+    return true;
+  }
+
+  void del (hb_codepoint_t g)
+  {
+    /* TODO perform op even if !successful. */
+    if (unlikely (!successful)) return;
+    page_t *page = page_for (g);
+    if (!page)
+      return;
+    dirty ();
+    page->del (g);
+  }
+  void del_range (hb_codepoint_t a, hb_codepoint_t b)
+  {
+    /* TODO perform op even if !successful. */
+    /* TODO Optimize, like add_range(). */
+    if (unlikely (!successful)) return;
+    for (unsigned int i = a; i < b + 1; i++)
+      del (i);
+  }
+  bool has (hb_codepoint_t g) const
+  {
+    const page_t *page = page_for (g);
+    if (!page)
+      return false;
+    return page->has (g);
+  }
+  bool intersects (hb_codepoint_t first,
+			  hb_codepoint_t last) const
+  {
+    hb_codepoint_t c = first - 1;
+    return next (&c) && c <= last;
+  }
+  void set (const hb_set_t *other)
+  {
+    if (unlikely (!successful)) return;
+    unsigned int count = other->pages.length;
+    if (!resize (count))
+      return;
+    population = other->population;
+    memcpy ((void *) pages, (const void *) other->pages, count * pages.item_size);
+    memcpy ((void *) page_map, (const void *) other->page_map, count * page_map.item_size);
+  }
+
+  bool is_equal (const hb_set_t *other) const
+  {
+    if (get_population () != other->get_population ())
+      return false;
+
+    unsigned int na = pages.length;
+    unsigned int nb = other->pages.length;
+
+    unsigned int a = 0, b = 0;
+    for (; a < na && b < nb; )
+    {
+      if (page_at (a).is_empty ()) { a++; continue; }
+      if (other->page_at (b).is_empty ()) { b++; continue; }
+      if (page_map[a].major != other->page_map[b].major ||
+	  !page_at (a).is_equal (&other->page_at (b)))
+        return false;
+      a++;
+      b++;
+    }
+    for (; a < na; a++)
+      if (!page_at (a).is_empty ()) { return false; }
+    for (; b < nb; b++)
+      if (!other->page_at (b).is_empty ()) { return false; }
+
+    return true;
+  }
+
+  bool is_subset (const hb_set_t *larger_set) const
+  {
+    if (get_population () > larger_set->get_population ())
+      return false;
+
+    /* TODO Optimize to use pages. */
+    hb_codepoint_t c = INVALID;
+    while (next (&c))
+      if (!larger_set->has (c))
+        return false;
+
+    return true;
+  }
+
+  template <class Op>
+  void process (const hb_set_t *other)
+  {
+    if (unlikely (!successful)) return;
+
+    dirty ();
+
+    unsigned int na = pages.length;
+    unsigned int nb = other->pages.length;
+    unsigned int next_page = na;
+
+    unsigned int count = 0, newCount = 0;
+    unsigned int a = 0, b = 0;
+    for (; a < na && b < nb; )
+    {
+      if (page_map[a].major == other->page_map[b].major)
+      {
+        count++;
+	a++;
+	b++;
+      }
+      else if (page_map[a].major < other->page_map[b].major)
+      {
+        if (Op::passthru_left)
+	  count++;
+        a++;
+      }
+      else
+      {
+        if (Op::passthru_right)
+	  count++;
+        b++;
+      }
+    }
+    if (Op::passthru_left)
+      count += na - a;
+    if (Op::passthru_right)
+      count += nb - b;
+
+    if (count > pages.length)
+      if (!resize (count))
+        return;
+    newCount = count;
+
+    /* Process in-place backward. */
+    a = na;
+    b = nb;
+    for (; a && b; )
+    {
+      if (page_map[a - 1].major == other->page_map[b - 1].major)
+      {
+	a--;
+	b--;
+	count--;
+	page_map[count] = page_map[a];
+	Op::process (page_at (count).v, page_at (a).v, other->page_at (b).v);
+      }
+      else if (page_map[a - 1].major > other->page_map[b - 1].major)
+      {
+	a--;
+	if (Op::passthru_left)
+	{
+	  count--;
+	  page_map[count] = page_map[a];
+	}
+      }
+      else
+      {
+	b--;
+	if (Op::passthru_right)
+	{
+	  count--;
+	  page_map[count].major = other->page_map[b].major;
+	  page_map[count].index = next_page++;
+	  page_at (count).v = other->page_at (b).v;
+	}
+      }
+    }
+    if (Op::passthru_left)
+      while (a)
+      {
+	a--;
+	count--;
+	page_map[count] = page_map [a];
+      }
+    if (Op::passthru_right)
+      while (b)
+      {
+	b--;
+	count--;
+	page_map[count].major = other->page_map[b].major;
+	page_map[count].index = next_page++;
+	page_at (count).v = other->page_at (b).v;
+      }
+    assert (!count);
+    if (pages.length > newCount)
+      resize (newCount);
+  }
+
+  void union_ (const hb_set_t *other)
+  {
+    process<HbOpOr> (other);
+  }
+  void intersect (const hb_set_t *other)
+  {
+    process<HbOpAnd> (other);
+  }
+  void subtract (const hb_set_t *other)
+  {
+    process<HbOpMinus> (other);
+  }
+  void symmetric_difference (const hb_set_t *other)
+  {
+    process<HbOpXor> (other);
+  }
+  bool next (hb_codepoint_t *codepoint) const
+  {
+    if (unlikely (*codepoint == INVALID)) {
+      *codepoint = get_min ();
+      return *codepoint != INVALID;
+    }
+
+    page_map_t map = {get_major (*codepoint), 0};
+    unsigned int i;
+    page_map.bfind (map, &i, HB_BFIND_NOT_FOUND_STORE_CLOSEST);
+    if (i < page_map.length && page_map[i].major == map.major)
+    {
+      if (pages[page_map[i].index].next (codepoint))
+      {
+	*codepoint += page_map[i].major * page_t::PAGE_BITS;
+	return true;
+      }
+      i++;
+    }
+    for (; i < page_map.length; i++)
+    {
+      hb_codepoint_t m = pages[page_map[i].index].get_min ();
+      if (m != INVALID)
+      {
+	*codepoint = page_map[i].major * page_t::PAGE_BITS + m;
+	return true;
+      }
+    }
+    *codepoint = INVALID;
+    return false;
+  }
+  bool previous (hb_codepoint_t *codepoint) const
+  {
+    if (unlikely (*codepoint == INVALID)) {
+      *codepoint = get_max ();
+      return *codepoint != INVALID;
+    }
+
+    page_map_t map = {get_major (*codepoint), 0};
+    unsigned int i;
+    page_map.bfind (map, &i, HB_BFIND_NOT_FOUND_STORE_CLOSEST);
+    if (i < page_map.length && page_map[i].major == map.major)
+    {
+      if (pages[page_map[i].index].previous (codepoint))
+      {
+	*codepoint += page_map[i].major * page_t::PAGE_BITS;
+	return true;
+      }
+    }
+    i--;
+    for (; (int) i >= 0; i--)
+    {
+      hb_codepoint_t m = pages[page_map[i].index].get_max ();
+      if (m != INVALID)
+      {
+	*codepoint = page_map[i].major * page_t::PAGE_BITS + m;
+	return true;
+      }
+    }
+    *codepoint = INVALID;
+    return false;
+  }
+  bool next_range (hb_codepoint_t *first, hb_codepoint_t *last) const
+  {
+    hb_codepoint_t i;
+
+    i = *last;
+    if (!next (&i))
+    {
+      *last = *first = INVALID;
+      return false;
+    }
+
+    /* TODO Speed up. */
+    *last = *first = i;
+    while (next (&i) && i == *last + 1)
+      (*last)++;
+
+    return true;
+  }
+  bool previous_range (hb_codepoint_t *first, hb_codepoint_t *last) const
+  {
+    hb_codepoint_t i;
+
+    i = *first;
+    if (!previous (&i))
+    {
+      *last = *first = INVALID;
+      return false;
+    }
+
+    /* TODO Speed up. */
+    *last = *first = i;
+    while (previous (&i) && i == *first - 1)
+      (*first)--;
+
+    return true;
+  }
+
+  unsigned int get_population () const
+  {
+    if (population != (unsigned int) -1)
+      return population;
+
+    unsigned int pop = 0;
+    unsigned int count = pages.length;
+    for (unsigned int i = 0; i < count; i++)
+      pop += pages[i].get_population ();
+
+    population = pop;
+    return pop;
+  }
+  hb_codepoint_t get_min () const
+  {
+    unsigned int count = pages.length;
+    for (unsigned int i = 0; i < count; i++)
+      if (!page_at (i).is_empty ())
+        return page_map[i].major * page_t::PAGE_BITS + page_at (i).get_min ();
+    return INVALID;
+  }
+  hb_codepoint_t get_max () const
+  {
+    unsigned int count = pages.length;
+    for (int i = count - 1; i >= 0; i++)
+      if (!page_at (i).is_empty ())
+        return page_map[(unsigned) i].major * page_t::PAGE_BITS + page_at (i).get_max ();
+    return INVALID;
+  }
+
+  static constexpr hb_codepoint_t INVALID = HB_SET_VALUE_INVALID;
+
+  /*
+   * Iterator implementation.
+   */
+  struct const_iter_t : hb_sorted_iter_t<const_iter_t, const hb_codepoint_t>
+  {
+    const_iter_t (const hb_set_t &s_) :
+      s (s_), v (INVALID), l (s.get_population () + 1) { __next__ (); }
+
+    typedef hb_codepoint_t __item_type__;
+    hb_codepoint_t __item__ () const { return v; }
+    bool __more__ () const { return v != INVALID; }
+    void __next__ () { s.next (&v); if (l) l--; }
+    void __prev__ () { s.previous (&v); }
+    unsigned __len__ () { return l; }
+
+    protected:
+    const hb_set_t &s;
+    hb_codepoint_t v;
+    unsigned l;
+  };
+  const_iter_t const_iter () const { return const_iter_t (*this); }
+  operator const_iter_t () const { return const_iter (); }
+  typedef const_iter_t iter_t;
+  iter_t iter () const { return const_iter (); }
+
+  protected:
+
+  page_t *page_for_insert (hb_codepoint_t g)
+  {
+    page_map_t map = {get_major (g), pages.length};
+    unsigned int i;
+    if (!page_map.bfind (map, &i, HB_BFIND_NOT_FOUND_STORE_CLOSEST))
+    {
+      if (!resize (pages.length + 1))
+	return nullptr;
+
+      pages[map.index].init0 ();
+      memmove (page_map + i + 1,
+	       page_map + i,
+	       (page_map.length - 1 - i) * page_map.item_size);
+      page_map[i] = map;
+    }
+    return &pages[page_map[i].index];
+  }
+  page_t *page_for (hb_codepoint_t g)
+  {
+    page_map_t key = {get_major (g)};
+    const page_map_t *found = page_map.bsearch (key);
+    if (found)
+      return &pages[found->index];
+    return nullptr;
+  }
+  const page_t *page_for (hb_codepoint_t g) const
+  {
+    page_map_t key = {get_major (g)};
+    const page_map_t *found = page_map.bsearch (key);
+    if (found)
+      return &pages[found->index];
+    return nullptr;
+  }
+  page_t &page_at (unsigned int i) { return pages[page_map[i].index]; }
+  const page_t &page_at (unsigned int i) const { return pages[page_map[i].index]; }
+  unsigned int get_major (hb_codepoint_t g) const { return g / page_t::PAGE_BITS; }
+  hb_codepoint_t major_start (unsigned int major) const { return major * page_t::PAGE_BITS; }
+};
+
+
+#endif /* HB_SET_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape-plan.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape-plan.cc
new file mode 100644
index 0000000..61ea8d0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape-plan.cc
@@ -0,0 +1,503 @@
+/*
+ * Copyright © 2012  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
+ */
+
+#include "hb.hh"
+#include "hb-shape-plan.hh"
+#include "hb-shaper.hh"
+#include "hb-font.hh"
+#include "hb-buffer.hh"
+
+
+/**
+ * SECTION:hb-shape-plan
+ * @title: hb-shape-plan
+ * @short_description: Object representing a shaping plan
+ * @include: hb.h
+ *
+ * Shape plans are not used for shaping directly, but can be access to query
+ * certain information about how shaping will perform given a set of input
+ * parameters (script, language, direction, features, etc.)
+ * Most client would not need to deal with shape plans directly.
+ **/
+
+
+/*
+ * hb_shape_plan_key_t
+ */
+
+bool
+hb_shape_plan_key_t::init (bool                           copy,
+			   hb_face_t                     *face,
+			   const hb_segment_properties_t *props,
+			   const hb_feature_t            *user_features,
+			   unsigned int                   num_user_features,
+			   const int                     *coords,
+			   unsigned int                   num_coords,
+			   const char * const            *shaper_list)
+{
+  hb_feature_t *features = nullptr;
+  if (copy && num_user_features && !(features = (hb_feature_t *) calloc (num_user_features, sizeof (hb_feature_t))))
+    goto bail;
+
+  this->props = *props;
+  this->num_user_features = num_user_features;
+  this->user_features = copy ? features : user_features;
+  if (copy && num_user_features)
+  {
+    memcpy (features, user_features, num_user_features * sizeof (hb_feature_t));
+    /* Make start/end uniform to easier catch bugs. */
+    for (unsigned int i = 0; i < num_user_features; i++)
+    {
+      if (features[0].start != HB_FEATURE_GLOBAL_START)
+	features[0].start = 1;
+      if (features[0].end   != HB_FEATURE_GLOBAL_END)
+	features[0].end   = 2;
+    }
+  }
+  this->shaper_func = nullptr;
+  this->shaper_name = nullptr;
+  this->ot.init (face, coords, num_coords);
+
+  /*
+   * Choose shaper.
+   */
+
+#define HB_SHAPER_PLAN(shaper) \
+	HB_STMT_START { \
+	  if (face->data.shaper) \
+	  { \
+	    this->shaper_func = _hb_##shaper##_shape; \
+	    this->shaper_name = #shaper; \
+	    return true; \
+	  } \
+	} HB_STMT_END
+
+  if (unlikely (shaper_list))
+  {
+    for (; *shaper_list; shaper_list++)
+      if (false)
+	;
+#define HB_SHAPER_IMPLEMENT(shaper) \
+      else if (0 == strcmp (*shaper_list, #shaper)) \
+	HB_SHAPER_PLAN (shaper);
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+  }
+  else
+  {
+    const hb_shaper_entry_t *shapers = _hb_shapers_get ();
+    for (unsigned int i = 0; i < HB_SHAPERS_COUNT; i++)
+      if (false)
+	;
+#define HB_SHAPER_IMPLEMENT(shaper) \
+      else if (shapers[i].func == _hb_##shaper##_shape) \
+	HB_SHAPER_PLAN (shaper);
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+  }
+#undef HB_SHAPER_PLAN
+
+bail:
+  ::free (features);
+  return false;
+}
+
+bool
+hb_shape_plan_key_t::user_features_match (const hb_shape_plan_key_t *other)
+{
+  if (this->num_user_features != other->num_user_features)
+    return false;
+  for (unsigned int i = 0; i < num_user_features; i++)
+  {
+    if (this->user_features[i].tag   != other->user_features[i].tag   ||
+	this->user_features[i].value != other->user_features[i].value ||
+	(this->user_features[i].start == HB_FEATURE_GLOBAL_START &&
+	 this->user_features[i].end   == HB_FEATURE_GLOBAL_END) !=
+	(other->user_features[i].start == HB_FEATURE_GLOBAL_START &&
+	 other->user_features[i].end   == HB_FEATURE_GLOBAL_END))
+      return false;
+  }
+  return true;
+}
+
+bool
+hb_shape_plan_key_t::equal (const hb_shape_plan_key_t *other)
+{
+  return hb_segment_properties_equal (&this->props, &other->props) &&
+	 this->user_features_match (other) &&
+	 this->ot.equal (&other->ot) &&
+	 this->shaper_func == other->shaper_func;
+}
+
+
+/*
+ * hb_shape_plan_t
+ */
+
+
+/**
+ * hb_shape_plan_create: (Xconstructor)
+ * @face: 
+ * @props: 
+ * @user_features: (array length=num_user_features):
+ * @num_user_features: 
+ * @shaper_list: (array zero-terminated=1):
+ *
+ * 
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.7
+ **/
+hb_shape_plan_t *
+hb_shape_plan_create (hb_face_t                     *face,
+		      const hb_segment_properties_t *props,
+		      const hb_feature_t            *user_features,
+		      unsigned int                   num_user_features,
+		      const char * const            *shaper_list)
+{
+  return hb_shape_plan_create2 (face, props,
+				user_features, num_user_features,
+				nullptr, 0,
+				shaper_list);
+}
+
+hb_shape_plan_t *
+hb_shape_plan_create2 (hb_face_t                     *face,
+		       const hb_segment_properties_t *props,
+		       const hb_feature_t            *user_features,
+		       unsigned int                   num_user_features,
+		       const int                     *coords,
+		       unsigned int                   num_coords,
+		       const char * const            *shaper_list)
+{
+  DEBUG_MSG_FUNC (SHAPE_PLAN, nullptr,
+		  "face=%p num_features=%d num_coords=%d shaper_list=%p",
+		  face,
+		  num_user_features,
+		  num_coords,
+		  shaper_list);
+
+  assert (props->direction != HB_DIRECTION_INVALID);
+
+  hb_shape_plan_t *shape_plan;
+
+  if (unlikely (!props))
+    goto bail;
+  if (!(shape_plan = hb_object_create<hb_shape_plan_t> ()))
+    goto bail;
+
+  if (unlikely (!face))
+    face = hb_face_get_empty ();
+  hb_face_make_immutable (face);
+  shape_plan->face_unsafe = face;
+
+  if (unlikely (!shape_plan->key.init (true,
+				       face,
+				       props,
+				       user_features,
+				       num_user_features,
+				       coords,
+				       num_coords,
+				       shaper_list)))
+    goto bail2;
+  if (unlikely (!shape_plan->ot.init0 (face, &shape_plan->key)))
+    goto bail3;
+
+  return shape_plan;
+
+bail3:
+  shape_plan->key.free ();
+bail2:
+  free (shape_plan);
+bail:
+  return hb_shape_plan_get_empty ();
+}
+
+/**
+ * hb_shape_plan_get_empty:
+ *
+ * 
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.7
+ **/
+hb_shape_plan_t *
+hb_shape_plan_get_empty ()
+{
+  return const_cast<hb_shape_plan_t *> (&Null(hb_shape_plan_t));
+}
+
+/**
+ * hb_shape_plan_reference: (skip)
+ * @shape_plan: a shape plan.
+ *
+ * 
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.7
+ **/
+hb_shape_plan_t *
+hb_shape_plan_reference (hb_shape_plan_t *shape_plan)
+{
+  return hb_object_reference (shape_plan);
+}
+
+/**
+ * hb_shape_plan_destroy: (skip)
+ * @shape_plan: a shape plan.
+ *
+ * 
+ *
+ * Since: 0.9.7
+ **/
+void
+hb_shape_plan_destroy (hb_shape_plan_t *shape_plan)
+{
+  if (!hb_object_destroy (shape_plan)) return;
+
+  shape_plan->ot.fini ();
+  shape_plan->key.free ();
+  free (shape_plan);
+}
+
+/**
+ * hb_shape_plan_set_user_data: (skip)
+ * @shape_plan: a shape plan.
+ * @key: 
+ * @data: 
+ * @destroy: 
+ * @replace: 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.7
+ **/
+hb_bool_t
+hb_shape_plan_set_user_data (hb_shape_plan_t    *shape_plan,
+			     hb_user_data_key_t *key,
+			     void *              data,
+			     hb_destroy_func_t   destroy,
+			     hb_bool_t           replace)
+{
+  return hb_object_set_user_data (shape_plan, key, data, destroy, replace);
+}
+
+/**
+ * hb_shape_plan_get_user_data: (skip)
+ * @shape_plan: a shape plan.
+ * @key: 
+ *
+ * 
+ *
+ * Return value: (transfer none):
+ *
+ * Since: 0.9.7
+ **/
+void *
+hb_shape_plan_get_user_data (hb_shape_plan_t    *shape_plan,
+			     hb_user_data_key_t *key)
+{
+  return hb_object_get_user_data (shape_plan, key);
+}
+
+/**
+ * hb_shape_plan_get_shaper:
+ * @shape_plan: a shape plan.
+ *
+ * 
+ *
+ * Return value: (transfer none):
+ *
+ * Since: 0.9.7
+ **/
+const char *
+hb_shape_plan_get_shaper (hb_shape_plan_t *shape_plan)
+{
+  return shape_plan->key.shaper_name;
+}
+
+
+/**
+ * hb_shape_plan_execute:
+ * @shape_plan: a shape plan.
+ * @font: a font.
+ * @buffer: a buffer.
+ * @features: (array length=num_features):
+ * @num_features: 
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 0.9.7
+ **/
+hb_bool_t
+hb_shape_plan_execute (hb_shape_plan_t    *shape_plan,
+		       hb_font_t          *font,
+		       hb_buffer_t        *buffer,
+		       const hb_feature_t *features,
+		       unsigned int        num_features)
+{
+  DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan,
+		  "num_features=%d shaper_func=%p, shaper_name=%s",
+		  num_features,
+		  shape_plan->key.shaper_func,
+		  shape_plan->key.shaper_name);
+
+  if (unlikely (!buffer->len))
+    return true;
+
+  assert (!hb_object_is_immutable (buffer));
+  assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE);
+
+  if (unlikely (hb_object_is_inert (shape_plan)))
+    return false;
+
+  assert (shape_plan->face_unsafe == font->face);
+  assert (hb_segment_properties_equal (&shape_plan->key.props, &buffer->props));
+
+#define HB_SHAPER_EXECUTE(shaper) \
+	HB_STMT_START { \
+	  return font->data.shaper && \
+		 _hb_##shaper##_shape (shape_plan, font, buffer, features, num_features); \
+	} HB_STMT_END
+
+  if (false)
+    ;
+#define HB_SHAPER_IMPLEMENT(shaper) \
+  else if (shape_plan->key.shaper_func == _hb_##shaper##_shape) \
+    HB_SHAPER_EXECUTE (shaper);
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+
+#undef HB_SHAPER_EXECUTE
+
+  return false;
+}
+
+
+/*
+ * Caching
+ */
+
+/**
+ * hb_shape_plan_create_cached:
+ * @face: 
+ * @props: 
+ * @user_features: (array length=num_user_features):
+ * @num_user_features: 
+ * @shaper_list: (array zero-terminated=1):
+ *
+ * 
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.7
+ **/
+hb_shape_plan_t *
+hb_shape_plan_create_cached (hb_face_t                     *face,
+			     const hb_segment_properties_t *props,
+			     const hb_feature_t            *user_features,
+			     unsigned int                   num_user_features,
+			     const char * const            *shaper_list)
+{
+  return hb_shape_plan_create_cached2 (face, props,
+				       user_features, num_user_features,
+				       nullptr, 0,
+				       shaper_list);
+}
+
+hb_shape_plan_t *
+hb_shape_plan_create_cached2 (hb_face_t                     *face,
+			      const hb_segment_properties_t *props,
+			      const hb_feature_t            *user_features,
+			      unsigned int                   num_user_features,
+			      const int                     *coords,
+			      unsigned int                   num_coords,
+			      const char * const            *shaper_list)
+{
+  DEBUG_MSG_FUNC (SHAPE_PLAN, nullptr,
+		  "face=%p num_features=%d shaper_list=%p",
+		  face,
+		  num_user_features,
+		  shaper_list);
+
+retry:
+  hb_face_t::plan_node_t *cached_plan_nodes = face->shape_plans;
+
+  bool dont_cache = hb_object_is_inert (face);
+
+  if (likely (!dont_cache))
+  {
+    hb_shape_plan_key_t key;
+    if (!key.init (false,
+		   face,
+		   props,
+		   user_features,
+		   num_user_features,
+		   coords,
+		   num_coords,
+		   shaper_list))
+      return hb_shape_plan_get_empty ();
+
+    for (hb_face_t::plan_node_t *node = cached_plan_nodes; node; node = node->next)
+      if (node->shape_plan->key.equal (&key))
+      {
+        DEBUG_MSG_FUNC (SHAPE_PLAN, node->shape_plan, "fulfilled from cache");
+        return hb_shape_plan_reference (node->shape_plan);
+      }
+  }
+
+  hb_shape_plan_t *shape_plan = hb_shape_plan_create2 (face, props,
+						       user_features, num_user_features,
+						       coords, num_coords,
+						       shaper_list);
+
+  if (unlikely (dont_cache))
+    return shape_plan;
+
+  hb_face_t::plan_node_t *node = (hb_face_t::plan_node_t *) calloc (1, sizeof (hb_face_t::plan_node_t));
+  if (unlikely (!node))
+    return shape_plan;
+
+  node->shape_plan = shape_plan;
+  node->next = cached_plan_nodes;
+
+  if (unlikely (!face->shape_plans.cmpexch (cached_plan_nodes, node)))
+  {
+    hb_shape_plan_destroy (shape_plan);
+    free (node);
+    goto retry;
+  }
+  DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan, "inserted into cache");
+
+  return hb_shape_plan_reference (shape_plan);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape-plan.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape-plan.h
new file mode 100644
index 0000000..b62ae7c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape-plan.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright © 2012  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_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_SHAPE_PLAN_H
+#define HB_SHAPE_PLAN_H
+
+#include "hb-common.h"
+#include "hb-font.h"
+
+HB_BEGIN_DECLS
+
+typedef struct hb_shape_plan_t hb_shape_plan_t;
+
+HB_EXTERN hb_shape_plan_t *
+hb_shape_plan_create (hb_face_t                     *face,
+		      const hb_segment_properties_t *props,
+		      const hb_feature_t            *user_features,
+		      unsigned int                   num_user_features,
+		      const char * const            *shaper_list);
+
+HB_EXTERN hb_shape_plan_t *
+hb_shape_plan_create_cached (hb_face_t                     *face,
+			     const hb_segment_properties_t *props,
+			     const hb_feature_t            *user_features,
+			     unsigned int                   num_user_features,
+			     const char * const            *shaper_list);
+
+HB_EXTERN hb_shape_plan_t *
+hb_shape_plan_create2 (hb_face_t                     *face,
+		       const hb_segment_properties_t *props,
+		       const hb_feature_t            *user_features,
+		       unsigned int                   num_user_features,
+		       const int                     *coords,
+		       unsigned int                   num_coords,
+		       const char * const            *shaper_list);
+
+HB_EXTERN hb_shape_plan_t *
+hb_shape_plan_create_cached2 (hb_face_t                     *face,
+			      const hb_segment_properties_t *props,
+			      const hb_feature_t            *user_features,
+			      unsigned int                   num_user_features,
+			      const int                     *coords,
+			      unsigned int                   num_coords,
+			      const char * const            *shaper_list);
+
+
+HB_EXTERN hb_shape_plan_t *
+hb_shape_plan_get_empty (void);
+
+HB_EXTERN hb_shape_plan_t *
+hb_shape_plan_reference (hb_shape_plan_t *shape_plan);
+
+HB_EXTERN void
+hb_shape_plan_destroy (hb_shape_plan_t *shape_plan);
+
+HB_EXTERN hb_bool_t
+hb_shape_plan_set_user_data (hb_shape_plan_t    *shape_plan,
+			     hb_user_data_key_t *key,
+			     void *              data,
+			     hb_destroy_func_t   destroy,
+			     hb_bool_t           replace);
+
+HB_EXTERN void *
+hb_shape_plan_get_user_data (hb_shape_plan_t    *shape_plan,
+			     hb_user_data_key_t *key);
+
+
+HB_EXTERN hb_bool_t
+hb_shape_plan_execute (hb_shape_plan_t    *shape_plan,
+		       hb_font_t          *font,
+		       hb_buffer_t        *buffer,
+		       const hb_feature_t *features,
+		       unsigned int        num_features);
+
+HB_EXTERN const char *
+hb_shape_plan_get_shaper (hb_shape_plan_t *shape_plan);
+
+
+HB_END_DECLS
+
+#endif /* HB_SHAPE_PLAN_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape-plan.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape-plan.hh
new file mode 100644
index 0000000..3a057fd
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape-plan.hh
@@ -0,0 +1,72 @@
+/*
+ * Copyright © 2012,2018  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_SHAPE_PLAN_HH
+#define HB_SHAPE_PLAN_HH
+
+#include "hb.hh"
+#include "hb-shaper.hh"
+#include "hb-ot-shape.hh"
+
+
+struct hb_shape_plan_key_t
+{
+  hb_segment_properties_t  props;
+
+  const hb_feature_t      *user_features;
+  unsigned int             num_user_features;
+
+  hb_ot_shape_plan_key_t   ot;
+
+  hb_shape_func_t         *shaper_func;
+  const char              *shaper_name;
+
+  HB_INTERNAL inline bool init (bool                           copy,
+				hb_face_t                     *face,
+				const hb_segment_properties_t *props,
+				const hb_feature_t            *user_features,
+				unsigned int                   num_user_features,
+				const int                     *coords,
+				unsigned int                   num_coords,
+				const char * const            *shaper_list);
+
+  HB_INTERNAL inline void free () { ::free ((void *) user_features); }
+
+  HB_INTERNAL bool user_features_match (const hb_shape_plan_key_t *other);
+
+  HB_INTERNAL bool equal (const hb_shape_plan_key_t *other);
+};
+
+struct hb_shape_plan_t
+{
+  hb_object_header_t header;
+  hb_face_t *face_unsafe; /* We don't carry a reference to face. */
+  hb_shape_plan_key_t key;
+  hb_ot_shape_plan_t ot;
+};
+
+
+#endif /* HB_SHAPE_PLAN_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape.cc
new file mode 100644
index 0000000..deff77b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape.cc
@@ -0,0 +1,168 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#include "hb-shaper.hh"
+#include "hb-shape-plan.hh"
+#include "hb-buffer.hh"
+#include "hb-font.hh"
+#include "hb-machinery.hh"
+
+
+/**
+ * SECTION:hb-shape
+ * @title: hb-shape
+ * @short_description: Conversion of text strings into positioned glyphs
+ * @include: hb.h
+ *
+ * Shaping is the central operation of HarfBuzz. Shaping operates on buffers,
+ * which are sequences of Unicode characters that use the same font and have
+ * the same text direction, script, and language. After shaping the buffer
+ * contains the output glyphs and their positions.
+ **/
+
+
+#if HB_USE_ATEXIT
+static void free_static_shaper_list ();
+#endif
+
+static const char *nil_shaper_list[] = {nullptr};
+
+static struct hb_shaper_list_lazy_loader_t : hb_lazy_loader_t<const char *,
+							      hb_shaper_list_lazy_loader_t>
+{
+  static const char ** create ()
+  {
+    const char **shaper_list = (const char **) calloc (1 + HB_SHAPERS_COUNT, sizeof (const char *));
+    if (unlikely (!shaper_list))
+      return nullptr;
+
+    const hb_shaper_entry_t *shapers = _hb_shapers_get ();
+    unsigned int i;
+    for (i = 0; i < HB_SHAPERS_COUNT; i++)
+      shaper_list[i] = shapers[i].name;
+    shaper_list[i] = nullptr;
+
+#if HB_USE_ATEXIT
+    atexit (free_static_shaper_list);
+#endif
+
+    return shaper_list;
+  }
+  static void destroy (const char **l)
+  { free (l); }
+  static const char ** get_null ()
+  { return nil_shaper_list; }
+} static_shaper_list;
+
+#if HB_USE_ATEXIT
+static
+void free_static_shaper_list ()
+{
+  static_shaper_list.free_instance ();
+}
+#endif
+
+
+/**
+ * hb_shape_list_shapers:
+ *
+ * Retrieves the list of shapers supported by HarfBuzz.
+ *
+ * Return value: (transfer none) (array zero-terminated=1): an array of
+ *    constant strings
+ *
+ * Since: 0.9.2
+ **/
+const char **
+hb_shape_list_shapers ()
+{
+  return static_shaper_list.get_unconst ();
+}
+
+
+/**
+ * hb_shape_full:
+ * @font: an #hb_font_t to use for shaping
+ * @buffer: an #hb_buffer_t to shape
+ * @features: (array length=num_features) (allow-none): an array of user
+ *    specified #hb_feature_t or %NULL
+ * @num_features: the length of @features array
+ * @shaper_list: (array zero-terminated=1) (allow-none): a %NULL-terminated
+ *    array of shapers to use or %NULL
+ *
+ * See hb_shape() for details. If @shaper_list is not %NULL, the specified
+ * shapers will be used in the given order, otherwise the default shapers list
+ * will be used.
+ *
+ * Return value: false if all shapers failed, true otherwise
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_shape_full (hb_font_t          *font,
+	       hb_buffer_t        *buffer,
+	       const hb_feature_t *features,
+	       unsigned int        num_features,
+	       const char * const *shaper_list)
+{
+  hb_shape_plan_t *shape_plan = hb_shape_plan_create_cached2 (font->face, &buffer->props,
+							      features, num_features,
+							      font->coords, font->num_coords,
+							      shaper_list);
+  hb_bool_t res = hb_shape_plan_execute (shape_plan, font, buffer, features, num_features);
+  hb_shape_plan_destroy (shape_plan);
+
+  if (res)
+    buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
+  return res;
+}
+
+/**
+ * hb_shape:
+ * @font: an #hb_font_t to use for shaping
+ * @buffer: an #hb_buffer_t to shape
+ * @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.
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_shape (hb_font_t           *font,
+	  hb_buffer_t         *buffer,
+	  const hb_feature_t  *features,
+	  unsigned int         num_features)
+{
+  hb_shape_full (font, buffer, features, num_features, nullptr);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape.h
new file mode 100644
index 0000000..39507ff
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shape.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_SHAPE_H
+#define HB_SHAPE_H
+
+#include "hb-common.h"
+#include "hb-buffer.h"
+#include "hb-font.h"
+
+HB_BEGIN_DECLS
+
+
+HB_EXTERN void
+hb_shape (hb_font_t           *font,
+	  hb_buffer_t         *buffer,
+	  const hb_feature_t  *features,
+	  unsigned int         num_features);
+
+HB_EXTERN hb_bool_t
+hb_shape_full (hb_font_t          *font,
+	       hb_buffer_t        *buffer,
+	       const hb_feature_t *features,
+	       unsigned int        num_features,
+	       const char * const *shaper_list);
+
+HB_EXTERN const char **
+hb_shape_list_shapers (void);
+
+
+HB_END_DECLS
+
+#endif /* HB_SHAPE_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shaper-impl.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shaper-impl.hh
new file mode 100644
index 0000000..b674fceb
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shaper-impl.hh
@@ -0,0 +1,38 @@
+/*
+ * Copyright © 2012  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_SHAPER_IMPL_HH
+#define HB_SHAPER_IMPL_HH
+
+#include "hb.hh"
+
+#include "hb-shaper.hh"
+#include "hb-face.hh"
+#include "hb-font.hh"
+#include "hb-shape-plan.hh"
+#include "hb-buffer.hh"
+
+#endif /* HB_SHAPER_IMPL_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shaper-list.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shaper-list.hh
new file mode 100644
index 0000000..36d8fc7
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shaper-list.hh
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2012  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_SHAPER_LIST_HH
+#define HB_SHAPER_LIST_HH
+#endif /* HB_SHAPER_LIST_HH */ /* Dummy header guards */
+
+/* v--- Add new shapers in the right place here. */
+
+#ifdef HAVE_GRAPHITE2
+/* Only picks up fonts that have a "Silf" table. */
+HB_SHAPER_IMPLEMENT (graphite2)
+#endif
+
+HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main OpenType shaper. */
+
+#ifdef HAVE_UNISCRIBE
+HB_SHAPER_IMPLEMENT (uniscribe)
+#endif
+#ifdef HAVE_DIRECTWRITE
+HB_SHAPER_IMPLEMENT (directwrite)
+#endif
+#ifdef HAVE_CORETEXT
+HB_SHAPER_IMPLEMENT (coretext)
+
+/* Only picks up fonts that have a "mort" or "morx" table.
+   Probably going to be removed https://github.com/harfbuzz/harfbuzz/issues/1478 */
+HB_SHAPER_IMPLEMENT (coretext_aat)
+#endif
+
+#ifdef HAVE_FALLBACK
+HB_SHAPER_IMPLEMENT (fallback) /* <--- This should be last. */
+#endif
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shaper.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shaper.cc
new file mode 100644
index 0000000..575ab1f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shaper.cc
@@ -0,0 +1,105 @@
+/*
+ * Copyright © 2012  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
+ */
+
+#include "hb.hh"
+#include "hb-shaper.hh"
+#include "hb-machinery.hh"
+
+
+static const hb_shaper_entry_t all_shapers[] = {
+#define HB_SHAPER_IMPLEMENT(name) {#name, _hb_##name##_shape},
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+};
+
+#if HB_USE_ATEXIT
+static void free_static_shapers ();
+#endif
+
+static struct hb_shapers_lazy_loader_t : hb_lazy_loader_t<const hb_shaper_entry_t,
+							  hb_shapers_lazy_loader_t>
+{
+  static hb_shaper_entry_t *create ()
+  {
+    char *env = getenv ("HB_SHAPER_LIST");
+    if (!env || !*env)
+      return nullptr;
+
+    hb_shaper_entry_t *shapers = (hb_shaper_entry_t *) calloc (1, sizeof (all_shapers));
+    if (unlikely (!shapers))
+      return nullptr;
+
+    memcpy (shapers, all_shapers, sizeof (all_shapers));
+
+     /* Reorder shaper list to prefer requested shapers. */
+    unsigned int i = 0;
+    char *end, *p = env;
+    for (;;)
+    {
+      end = strchr (p, ',');
+      if (!end)
+	end = p + strlen (p);
+
+      for (unsigned int j = i; j < ARRAY_LENGTH (all_shapers); j++)
+	if (end - p == (int) strlen (shapers[j].name) &&
+	    0 == strncmp (shapers[j].name, p, end - p))
+	{
+	  /* Reorder this shaper to position i */
+	 struct hb_shaper_entry_t t = shapers[j];
+	 memmove (&shapers[i + 1], &shapers[i], sizeof (shapers[i]) * (j - i));
+	 shapers[i] = t;
+	 i++;
+	}
+
+      if (!*end)
+	break;
+      else
+	p = end + 1;
+    }
+
+#if HB_USE_ATEXIT
+    atexit (free_static_shapers);
+#endif
+
+    return shapers;
+  }
+  static void destroy (const hb_shaper_entry_t *p) { free ((void *) p); }
+  static const hb_shaper_entry_t *get_null ()      { return all_shapers; }
+} static_shapers;
+
+#if HB_USE_ATEXIT
+static
+void free_static_shapers ()
+{
+  static_shapers.free_instance ();
+}
+#endif
+
+const hb_shaper_entry_t *
+_hb_shapers_get ()
+{
+  return static_shapers.get_unconst ();
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shaper.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shaper.hh
new file mode 100644
index 0000000..79dc5d0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-shaper.hh
@@ -0,0 +1,134 @@
+/*
+ * Copyright © 2012  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_SHAPER_HH
+#define HB_SHAPER_HH
+
+#include "hb.hh"
+#include "hb-machinery.hh"
+
+typedef hb_bool_t hb_shape_func_t (hb_shape_plan_t    *shape_plan,
+				   hb_font_t          *font,
+				   hb_buffer_t        *buffer,
+				   const hb_feature_t *features,
+				   unsigned int        num_features);
+
+#define HB_SHAPER_IMPLEMENT(name) \
+	extern "C" HB_INTERNAL hb_shape_func_t _hb_##name##_shape;
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+
+struct hb_shaper_entry_t {
+  char name[16];
+  hb_shape_func_t *func;
+};
+
+HB_INTERNAL const hb_shaper_entry_t *
+_hb_shapers_get ();
+
+
+template <typename Data, unsigned int WheresData, typename T>
+struct hb_shaper_lazy_loader_t;
+
+#define HB_SHAPER_ORDER(Shaper) \
+  HB_PASTE (HB_SHAPER_ORDER_, Shaper)
+enum hb_shaper_order_t
+{
+  _HB_SHAPER_ORDER_ORDER_ZERO,
+#define HB_SHAPER_IMPLEMENT(Shaper) \
+      HB_SHAPER_ORDER (Shaper),
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+  _HB_SHAPERS_COUNT_PLUS_ONE,
+  HB_SHAPERS_COUNT = _HB_SHAPERS_COUNT_PLUS_ONE - 1,
+};
+
+template <enum hb_shaper_order_t order, typename Object> struct hb_shaper_object_data_type_t;
+
+#define HB_SHAPER_DATA_SUCCEEDED ((void *) +1)
+#define HB_SHAPER_DATA_TYPE(shaper, object)		hb_##shaper##_##object##_data_t
+#define HB_SHAPER_DATA_CREATE_FUNC(shaper, object)	_hb_##shaper##_shaper_##object##_data_create
+#define HB_SHAPER_DATA_DESTROY_FUNC(shaper, object)	_hb_##shaper##_shaper_##object##_data_destroy
+
+#define HB_SHAPER_DATA_INSTANTIATE_SHAPERS(shaper, object) \
+	\
+	struct HB_SHAPER_DATA_TYPE (shaper, object); /* Type forward declaration. */ \
+	extern "C" HB_INTERNAL HB_SHAPER_DATA_TYPE (shaper, object) * \
+	HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (hb_##object##_t *object); \
+	extern "C" HB_INTERNAL void \
+	HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA_TYPE (shaper, object) *shaper##_##object); \
+	\
+	template <> \
+	struct hb_shaper_object_data_type_t<HB_SHAPER_ORDER (shaper), hb_##object##_t> \
+	{ \
+	  typedef HB_SHAPER_DATA_TYPE(shaper, object) value; \
+	}; \
+	\
+	template <unsigned int WheresData> \
+	struct hb_shaper_lazy_loader_t<hb_##object##_t, WheresData, HB_SHAPER_DATA_TYPE(shaper, object)> \
+		: hb_lazy_loader_t<HB_SHAPER_DATA_TYPE(shaper, object), \
+				   hb_shaper_lazy_loader_t<hb_##object##_t, \
+							   WheresData, \
+							   HB_SHAPER_DATA_TYPE(shaper, object)>, \
+				   hb_##object##_t, WheresData> \
+	{ \
+	  typedef HB_SHAPER_DATA_TYPE(shaper, object) Type; \
+	  static Type* create (hb_##object##_t *data) \
+	  { return HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (data); } \
+	  static Type *get_null () { return nullptr; } \
+	  static void destroy (Type *p) { HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (p); } \
+	}; \
+	\
+	static_assert (true, "") /* Require semicolon. */
+
+
+template <typename Object>
+struct hb_shaper_object_dataset_t
+{
+  void init0 (Object *parent_data)
+  {
+    this->parent_data = parent_data;
+#define HB_SHAPER_IMPLEMENT(shaper) shaper.init0 ();
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+  }
+  void fini ()
+  {
+#define HB_SHAPER_IMPLEMENT(shaper) shaper.fini ();
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+  }
+
+  Object *parent_data; /* MUST be JUST before the lazy loaders. */
+#define HB_SHAPER_IMPLEMENT(shaper) \
+	hb_shaper_lazy_loader_t<Object, HB_SHAPER_ORDER(shaper), \
+				typename hb_shaper_object_data_type_t<HB_SHAPER_ORDER(shaper), Object>::value \
+			       > shaper;
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+};
+
+#endif /* HB_SHAPER_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-static.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-static.cc
new file mode 100644
index 0000000..4c51588
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-static.cc
@@ -0,0 +1,75 @@
+/*
+ * Copyright © 2018  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
+ */
+
+#include "hb.hh"
+
+#include "hb-open-type.hh"
+#include "hb-face.hh"
+
+#include "hb-aat-layout-common.hh"
+#include "hb-aat-layout-feat-table.hh"
+#include "hb-ot-layout-common.hh"
+#include "hb-ot-cmap-table.hh"
+#include "hb-ot-head-table.hh"
+#include "hb-ot-maxp-table.hh"
+
+#ifndef HB_NO_VISIBILITY
+
+hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)] = {};
+/*thread_local*/ hb_vector_size_impl_t _hb_CrapPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)] = {};
+
+DEFINE_NULL_NAMESPACE_BYTES (OT, Index) =  {0xFF,0xFF};
+DEFINE_NULL_NAMESPACE_BYTES (OT, LangSys) = {0x00,0x00, 0xFF,0xFF, 0x00,0x00};
+DEFINE_NULL_NAMESPACE_BYTES (OT, RangeRecord) = {0x00,0x01, 0x00,0x00, 0x00, 0x00};
+DEFINE_NULL_NAMESPACE_BYTES (OT, CmapSubtableLongGroup) = {0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00};
+DEFINE_NULL_NAMESPACE_BYTES (AAT, SettingName) = {0xFF,0xFF, 0xFF,0xFF};
+/* Hand-coded because Lookup is a template.  Sad. */
+const unsigned char _hb_Null_AAT_Lookup[2] = {0xFF, 0xFF};
+
+
+unsigned int
+hb_face_t::load_num_glyphs () const
+{
+  hb_sanitize_context_t c = hb_sanitize_context_t ();
+  c.set_num_glyphs (0); /* So we don't recurse ad infinitum. */
+  hb_blob_t *maxp_blob = c.reference_table<OT::maxp> (this);
+  const OT::maxp *maxp_table = maxp_blob->as<OT::maxp> ();
+
+  unsigned int ret = maxp_table->get_num_glyphs ();
+  num_glyphs.set_relaxed (ret);
+  hb_blob_destroy (maxp_blob);
+  return ret;
+}
+
+unsigned int
+hb_face_t::load_upem () const
+{
+  unsigned int ret = table.head->get_upem ();
+  upem.set_relaxed (ret);
+  return ret;
+}
+
+#endif
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-string-array.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-string-array.hh
new file mode 100644
index 0000000..c4cf666d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-string-array.hh
@@ -0,0 +1,81 @@
+/*
+ * Copyright © 2017  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_STRING_ARRAY_HH
+#if 0 /* Make checks happy. */
+#define HB_STRING_ARRAY_HH
+#endif
+
+#include "hb.hh"
+
+/* Based on Bruno Haible's code in Appendix B of Ulrich Drepper's dsohowto.pdf:
+ * https://software.intel.com/sites/default/files/m/a/1/e/dsohowto.pdf */
+
+#define HB_STRING_ARRAY_TYPE_NAME	HB_PASTE(HB_STRING_ARRAY_NAME, _msgstr_t)
+#define HB_STRING_ARRAY_POOL_NAME	HB_PASTE(HB_STRING_ARRAY_NAME, _msgstr)
+#define HB_STRING_ARRAY_OFFS_NAME	HB_PASTE(HB_STRING_ARRAY_NAME, _msgidx)
+
+static const union HB_STRING_ARRAY_TYPE_NAME {
+  struct {
+/* I like to avoid storing the nul-termination byte since we don't need it,
+ * but C++ does not allow that.
+ * https://stackoverflow.com/q/28433862
+ */
+#define _S(s) char HB_PASTE (str, __LINE__)[sizeof (s)];
+#include HB_STRING_ARRAY_LIST
+#undef _S
+  } st;
+  char str[VAR];
+}
+HB_STRING_ARRAY_POOL_NAME =
+{
+  {
+#define _S(s) s,
+#include HB_STRING_ARRAY_LIST
+#undef _S
+  }
+};
+static const unsigned int HB_STRING_ARRAY_OFFS_NAME[] =
+{
+#define _S(s) offsetof (union HB_STRING_ARRAY_TYPE_NAME, st.HB_PASTE(str, __LINE__)),
+#include HB_STRING_ARRAY_LIST
+#undef _S
+  sizeof (HB_STRING_ARRAY_TYPE_NAME)
+};
+
+static inline hb_bytes_t
+HB_STRING_ARRAY_NAME (unsigned int i)
+{
+  assert (i < ARRAY_LENGTH (HB_STRING_ARRAY_OFFS_NAME) - 1);
+  return hb_bytes_t (HB_STRING_ARRAY_POOL_NAME.str + HB_STRING_ARRAY_OFFS_NAME[i],
+		     HB_STRING_ARRAY_OFFS_NAME[i + 1] - HB_STRING_ARRAY_OFFS_NAME[i] - 1);
+}
+
+#undef HB_STRING_ARRAY_TYPE_NAME
+#undef HB_STRING_ARRAY_POOL_NAME
+#undef HB_STRING_ARRAY_OFFS_NAME
+
+#endif /* HB_STRING_ARRAY_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff-common.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff-common.cc
new file mode 100644
index 0000000..3e617d5
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff-common.cc
@@ -0,0 +1,226 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb-ot-cff-common.hh"
+#include "hb-ot-cff2-table.hh"
+#include "hb-subset-cff-common.hh"
+
+/* Disable FDSelect format 0 for compatibility with fonttools which doesn't seem choose it.
+ * Rarely any/much smaller than format 3 anyway. */
+#define CFF_SERIALIZE_FDSELECT_0  0
+
+using namespace CFF;
+
+/**
+ * hb_plan_subset_cff_fdselect
+ * Determine an optimal FDSelect format according to a provided plan.
+ *
+ * Return value: FDSelect format, size, and ranges for the most compact subset FDSelect
+ * along with a font index remapping table
+ **/
+
+bool
+hb_plan_subset_cff_fdselect (const hb_vector_t<hb_codepoint_t> &glyphs,
+			    unsigned int fdCount,
+			    const FDSelect &src, /* IN */
+			    unsigned int &subset_fd_count /* OUT */,
+			    unsigned int &subset_fdselect_size /* OUT */,
+			    unsigned int &subset_fdselect_format /* OUT */,
+			    hb_vector_t<code_pair_t> &fdselect_ranges /* OUT */,
+			    remap_t &fdmap /* OUT */)
+{
+  subset_fd_count = 0;
+  subset_fdselect_size = 0;
+  subset_fdselect_format = 0;
+  unsigned int  num_ranges = 0;
+
+  unsigned int subset_num_glyphs = glyphs.length;
+  if (subset_num_glyphs == 0)
+    return true;
+
+  {
+    /* use hb_set to determine the subset of font dicts */
+    hb_set_t  *set = hb_set_create ();
+    if (set == &Null (hb_set_t))
+      return false;
+    hb_codepoint_t  prev_fd = CFF_UNDEF_CODE;
+    for (hb_codepoint_t i = 0; i < subset_num_glyphs; i++)
+    {
+      hb_codepoint_t  fd = src.get_fd (glyphs[i]);
+      set->add (fd);
+
+      if (fd != prev_fd)
+      {
+	num_ranges++;
+	prev_fd = fd;
+	code_pair_t pair = { fd, i };
+	fdselect_ranges.push (pair);
+      }
+    }
+
+    subset_fd_count = set->get_population ();
+    if (subset_fd_count == fdCount)
+    {
+      /* all font dicts belong to the subset. no need to subset FDSelect & FDArray */
+      fdmap.identity (fdCount);
+      hb_set_destroy (set);
+    }
+    else
+    {
+      /* create a fdmap */
+      if (!fdmap.reset (fdCount))
+      {
+	hb_set_destroy (set);
+	return false;
+      }
+
+      hb_codepoint_t  fd = CFF_UNDEF_CODE;
+      while (set->next (&fd))
+	fdmap.add (fd);
+      hb_set_destroy (set);
+      if (unlikely (fdmap.get_count () != subset_fd_count))
+      	return false;
+    }
+
+    /* update each font dict index stored as "code" in fdselect_ranges */
+    for (unsigned int i = 0; i < fdselect_ranges.length; i++)
+      fdselect_ranges[i].code = fdmap[fdselect_ranges[i].code];
+  }
+
+  /* determine which FDSelect format is most compact */
+  if (subset_fd_count > 0xFF)
+  {
+    if (unlikely (src.format != 4))
+      return false;
+    subset_fdselect_format = 4;
+    subset_fdselect_size = FDSelect::min_size + FDSelect4::min_size + FDSelect4_Range::static_size * num_ranges + HBUINT32::static_size;
+  }
+  else
+  {
+#if CFF_SERIALIZE_FDSELECT_0
+    unsigned int format0_size = FDSelect::min_size + FDSelect0::min_size + HBUINT8::static_size * subset_num_glyphs;
+#endif
+    unsigned int format3_size = FDSelect::min_size + FDSelect3::min_size + FDSelect3_Range::static_size * num_ranges + HBUINT16::static_size;
+
+#if CFF_SERIALIZE_FDSELECT_0
+    if (format0_size <= format3_size)
+    {
+      // subset_fdselect_format = 0;
+      subset_fdselect_size = format0_size;
+    }
+    else
+#endif
+    {
+      subset_fdselect_format = 3;
+      subset_fdselect_size = format3_size;
+    }
+  }
+
+  return true;
+}
+
+template <typename FDSELECT3_4>
+static inline bool
+serialize_fdselect_3_4 (hb_serialize_context_t *c,
+			  const unsigned int num_glyphs,
+			  const FDSelect &src,
+			  unsigned int size,
+			  const hb_vector_t<code_pair_t> &fdselect_ranges)
+{
+  TRACE_SERIALIZE (this);
+  FDSELECT3_4 *p = c->allocate_size<FDSELECT3_4> (size);
+  if (unlikely (p == nullptr)) return_trace (false);
+  p->nRanges ().set (fdselect_ranges.length);
+  for (unsigned int i = 0; i < fdselect_ranges.length; i++)
+  {
+    p->ranges[i].first.set (fdselect_ranges[i].glyph);
+    p->ranges[i].fd.set (fdselect_ranges[i].code);
+  }
+  p->sentinel().set (num_glyphs);
+  return_trace (true);
+}
+
+/**
+ * hb_serialize_cff_fdselect
+ * Serialize a subset FDSelect format planned above.
+ **/
+bool
+hb_serialize_cff_fdselect (hb_serialize_context_t *c,
+			  const unsigned int num_glyphs,
+			  const FDSelect &src,
+			  unsigned int fd_count,
+			  unsigned int fdselect_format,
+			  unsigned int size,
+			  const hb_vector_t<code_pair_t> &fdselect_ranges)
+{
+  TRACE_SERIALIZE (this);
+  FDSelect  *p = c->allocate_min<FDSelect> ();
+  if (unlikely (p == nullptr)) return_trace (false);
+  p->format.set (fdselect_format);
+  size -= FDSelect::min_size;
+
+  switch (fdselect_format)
+  {
+#if CFF_SERIALIZE_FDSELECT_0
+    case 0:
+    {
+      FDSelect0 *p = c->allocate_size<FDSelect0> (size);
+      if (unlikely (p == nullptr)) return_trace (false);
+      unsigned int range_index = 0;
+      unsigned int  fd = fdselect_ranges[range_index++].code;
+      for (unsigned int i = 0; i < num_glyphs; i++)
+      {
+	if ((range_index < fdselect_ranges.len) &&
+	    (i >= fdselect_ranges[range_index].glyph))
+	{
+	  fd = fdselect_ranges[range_index++].code;
+	}
+	p->fds[i].set (fd);
+      }
+      break;
+    }
+#endif /* CFF_SERIALIZE_FDSELECT_0 */
+
+    case 3:
+      return serialize_fdselect_3_4<FDSelect3> (c,
+						num_glyphs,
+						src,
+						size,
+						fdselect_ranges);
+
+    case 4:
+      return serialize_fdselect_3_4<FDSelect4> (c,
+						num_glyphs,
+						src,
+						size,
+						fdselect_ranges);
+
+    default:
+      assert(false);
+  }
+
+  return_trace (true);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff-common.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff-common.hh
new file mode 100644
index 0000000..915b4c4
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff-common.hh
@@ -0,0 +1,990 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_SUBSET_CFF_COMMON_HH
+#define HB_SUBSET_CFF_COMMON_HH
+
+#include "hb.hh"
+
+#include "hb-subset-plan.hh"
+#include "hb-cff-interp-cs-common.hh"
+
+namespace CFF {
+
+/* Used for writing a temporary charstring */
+struct str_encoder_t
+{
+  str_encoder_t (str_buff_t &buff_)
+    : buff (buff_), error (false) {}
+
+  void reset () { buff.resize (0); }
+
+  void encode_byte (unsigned char b)
+  {
+    if (unlikely (buff.push (b) == &Crap(unsigned char)))
+      set_error ();
+  }
+
+  void encode_int (int v)
+  {
+    if ((-1131 <= v) && (v <= 1131))
+    {
+      if ((-107 <= v) && (v <= 107))
+	encode_byte (v + 139);
+      else if (v > 0)
+      {
+	v -= 108;
+	encode_byte ((v >> 8) + OpCode_TwoBytePosInt0);
+	encode_byte (v & 0xFF);
+      }
+      else
+      {
+	v = -v - 108;
+	encode_byte ((v >> 8) + OpCode_TwoByteNegInt0);
+	encode_byte (v & 0xFF);
+      }
+    }
+    else
+    {
+      if (unlikely (v < -32768))
+	v = -32768;
+      else if (unlikely (v > 32767))
+	v = 32767;
+      encode_byte (OpCode_shortint);
+      encode_byte ((v >> 8) & 0xFF);
+      encode_byte (v & 0xFF);
+    }
+  }
+
+  void encode_num (const number_t& n)
+  {
+    if (n.in_int_range ())
+    {
+      encode_int (n.to_int ());
+    }
+    else
+    {
+      int32_t v = n.to_fixed ();
+      encode_byte (OpCode_fixedcs);
+      encode_byte ((v >> 24) & 0xFF);
+      encode_byte ((v >> 16) & 0xFF);
+      encode_byte ((v >> 8) & 0xFF);
+      encode_byte (v & 0xFF);
+    }
+  }
+
+  void encode_op (op_code_t op)
+  {
+    if (Is_OpCode_ESC (op))
+    {
+      encode_byte (OpCode_escape);
+      encode_byte (Unmake_OpCode_ESC (op));
+    }
+    else
+      encode_byte (op);
+  }
+
+  void copy_str (const byte_str_t &str)
+  {
+    unsigned int  offset = buff.length;
+    buff.resize (offset + str.length);
+    if (unlikely (buff.length < offset + str.length))
+    {
+      set_error ();
+      return;
+    }
+    memcpy (&buff[offset], &str[0], str.length);
+  }
+
+  bool is_error () const { return error; }
+
+  protected:
+  void set_error () { error = true; }
+
+  str_buff_t &buff;
+  bool    error;
+};
+
+struct cff_sub_table_offsets_t {
+  cff_sub_table_offsets_t () : privateDictsOffset (0)
+  {
+    topDictInfo.init ();
+    FDSelectInfo.init ();
+    FDArrayInfo.init ();
+    charStringsInfo.init ();
+    globalSubrsInfo.init ();
+    localSubrsInfos.init ();
+  }
+
+  ~cff_sub_table_offsets_t () { localSubrsInfos.fini (); }
+
+  table_info_t     topDictInfo;
+  table_info_t     FDSelectInfo;
+  table_info_t     FDArrayInfo;
+  table_info_t     charStringsInfo;
+  unsigned int  privateDictsOffset;
+  table_info_t     globalSubrsInfo;
+  hb_vector_t<table_info_t>  localSubrsInfos;
+};
+
+template <typename OPSTR=op_str_t>
+struct cff_top_dict_op_serializer_t : op_serializer_t
+{
+  bool serialize (hb_serialize_context_t *c,
+		  const OPSTR &opstr,
+		  const cff_sub_table_offsets_t &offsets) const
+  {
+    TRACE_SERIALIZE (this);
+
+    switch (opstr.op)
+    {
+      case OpCode_CharStrings:
+	return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.charStringsInfo.offset));
+
+      case OpCode_FDArray:
+	return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.FDArrayInfo.offset));
+
+      case OpCode_FDSelect:
+	return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.FDSelectInfo.offset));
+
+      default:
+	return_trace (copy_opstr (c, opstr));
+    }
+    return_trace (true);
+  }
+
+  unsigned int calculate_serialized_size (const OPSTR &opstr) const
+  {
+    switch (opstr.op)
+    {
+      case OpCode_CharStrings:
+      case OpCode_FDArray:
+      case OpCode_FDSelect:
+	return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (opstr.op);
+
+      default:
+	return opstr.str.length;
+    }
+  }
+};
+
+struct cff_font_dict_op_serializer_t : op_serializer_t
+{
+  bool serialize (hb_serialize_context_t *c,
+		  const op_str_t &opstr,
+		  const table_info_t &privateDictInfo) const
+  {
+    TRACE_SERIALIZE (this);
+
+    if (opstr.op == OpCode_Private)
+    {
+      /* serialize the private dict size & offset as 2-byte & 4-byte integers */
+      if (unlikely (!UnsizedByteStr::serialize_int2 (c, privateDictInfo.size) ||
+		    !UnsizedByteStr::serialize_int4 (c, privateDictInfo.offset)))
+	return_trace (false);
+
+      /* serialize the opcode */
+      HBUINT8 *p = c->allocate_size<HBUINT8> (1);
+      if (unlikely (p == nullptr)) return_trace (false);
+      p->set (OpCode_Private);
+
+      return_trace (true);
+    }
+    else
+    {
+      HBUINT8 *d = c->allocate_size<HBUINT8> (opstr.str.length);
+      if (unlikely (d == nullptr)) return_trace (false);
+      memcpy (d, &opstr.str[0], opstr.str.length);
+    }
+    return_trace (true);
+  }
+
+  unsigned int calculate_serialized_size (const op_str_t &opstr) const
+  {
+    if (opstr.op == OpCode_Private)
+      return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Private);
+    else
+      return opstr.str.length;
+  }
+};
+
+struct cff_private_dict_op_serializer_t : op_serializer_t
+{
+  cff_private_dict_op_serializer_t (bool desubroutinize_, bool drop_hints_)
+    : desubroutinize (desubroutinize_), drop_hints (drop_hints_) {}
+
+  bool serialize (hb_serialize_context_t *c,
+		  const op_str_t &opstr,
+		  const unsigned int subrsOffset) const
+  {
+    TRACE_SERIALIZE (this);
+
+    if (drop_hints && dict_opset_t::is_hint_op (opstr.op))
+      return true;
+    if (opstr.op == OpCode_Subrs)
+    {
+      if (desubroutinize || (subrsOffset == 0))
+	return_trace (true);
+      else
+	return_trace (FontDict::serialize_offset2_op (c, opstr.op, subrsOffset));
+    }
+    else
+      return_trace (copy_opstr (c, opstr));
+  }
+
+  unsigned int calculate_serialized_size (const op_str_t &opstr,
+					  bool has_localsubr=true) const
+  {
+    if (drop_hints && dict_opset_t::is_hint_op (opstr.op))
+      return 0;
+    if (opstr.op == OpCode_Subrs)
+    {
+      if (desubroutinize || !has_localsubr)
+	return 0;
+      else
+	return OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (opstr.op);
+    }
+    else
+      return opstr.str.length;
+  }
+
+  protected:
+  const bool  desubroutinize;
+  const bool  drop_hints;
+};
+
+struct flatten_param_t
+{
+  str_buff_t     &flatStr;
+  bool	drop_hints;
+};
+
+template <typename ACC, typename ENV, typename OPSET>
+struct subr_flattener_t
+{
+  subr_flattener_t (const ACC &acc_,
+		    const hb_vector_t<hb_codepoint_t> &glyphs_,
+		    bool drop_hints_) : acc (acc_), glyphs (glyphs_),
+					drop_hints (drop_hints_) {}
+
+  bool flatten (str_buff_vec_t &flat_charstrings)
+  {
+    if (!flat_charstrings.resize (glyphs.length))
+      return false;
+    for (unsigned int i = 0; i < glyphs.length; i++)
+      flat_charstrings[i].init ();
+    for (unsigned int i = 0; i < glyphs.length; i++)
+    {
+      hb_codepoint_t  glyph = glyphs[i];
+      const byte_str_t str = (*acc.charStrings)[glyph];
+      unsigned int fd = acc.fdSelect->get_fd (glyph);
+      if (unlikely (fd >= acc.fdCount))
+      	return false;
+      cs_interpreter_t<ENV, OPSET, flatten_param_t> interp;
+      interp.env.init (str, acc, fd);
+      flatten_param_t  param = { flat_charstrings[i], drop_hints };
+      if (unlikely (!interp.interpret (param)))
+	return false;
+    }
+    return true;
+  }
+
+  const ACC &acc;
+  const hb_vector_t<hb_codepoint_t> &glyphs;
+  bool  drop_hints;
+};
+
+struct subr_closures_t
+{
+  subr_closures_t () : valid (false), global_closure (nullptr)
+  { local_closures.init (); }
+
+  void init (unsigned int fd_count)
+  {
+    valid = true;
+    global_closure = hb_set_create ();
+    if (global_closure == hb_set_get_empty ())
+      valid = false;
+    if (!local_closures.resize (fd_count))
+      valid = false;
+
+    for (unsigned int i = 0; i < local_closures.length; i++)
+    {
+      local_closures[i] = hb_set_create ();
+      if (local_closures[i] == hb_set_get_empty ())
+	valid = false;
+    }
+  }
+
+  void fini ()
+  {
+    hb_set_destroy (global_closure);
+    for (unsigned int i = 0; i < local_closures.length; i++)
+      hb_set_destroy (local_closures[i]);
+    local_closures.fini ();
+  }
+
+  void reset ()
+  {
+    hb_set_clear (global_closure);
+    for (unsigned int i = 0; i < local_closures.length; i++)
+      hb_set_clear (local_closures[i]);
+  }
+
+  bool is_valid () const { return valid; }
+  bool  valid;
+  hb_set_t  *global_closure;
+  hb_vector_t<hb_set_t *> local_closures;
+};
+
+struct parsed_cs_op_t : op_str_t
+{
+  void init (unsigned int subr_num_ = 0)
+  {
+    op_str_t::init ();
+    subr_num = subr_num_;
+    drop_flag = false;
+    keep_flag = false;
+    skip_flag = false;
+  }
+
+  void fini () { op_str_t::fini (); }
+
+  bool for_drop () const { return drop_flag; }
+  void set_drop ()       { if (!for_keep ()) drop_flag = true; }
+
+  bool for_keep () const { return keep_flag; }
+  void set_keep ()       { keep_flag = true; }
+
+  bool for_skip () const { return skip_flag; }
+  void set_skip ()       { skip_flag = true; }
+
+  unsigned int  subr_num;
+
+  protected:
+  bool	  drop_flag : 1;
+  bool	  keep_flag : 1;
+  bool	  skip_flag : 1;
+};
+
+struct parsed_cs_str_t : parsed_values_t<parsed_cs_op_t>
+{
+  void init ()
+  {
+    SUPER::init ();
+    parsed = false;
+    hint_dropped = false;
+    has_prefix_ = false;
+  }
+
+  void add_op (op_code_t op, const byte_str_ref_t& str_ref)
+  {
+    if (!is_parsed ())
+      SUPER::add_op (op, str_ref);
+  }
+
+  void add_call_op (op_code_t op, const byte_str_ref_t& str_ref, unsigned int subr_num)
+  {
+    if (!is_parsed ())
+    {
+      unsigned int parsed_len = get_count ();
+      if (likely (parsed_len > 0))
+	values[parsed_len-1].set_skip ();
+
+      parsed_cs_op_t val;
+      val.init (subr_num);
+      SUPER::add_op (op, str_ref, val);
+    }
+  }
+
+  void set_prefix (const number_t &num, op_code_t op = OpCode_Invalid)
+  {
+    has_prefix_ = true;
+    prefix_op_ = op;
+    prefix_num_ = num;
+  }
+
+  bool at_end (unsigned int pos) const
+  {
+    return ((pos + 1 >= values.length) /* CFF2 */
+	|| (values[pos + 1].op == OpCode_return));
+  }
+
+  bool is_parsed () const { return parsed; }
+  void set_parsed ()      { parsed = true; }
+
+  bool is_hint_dropped () const { return hint_dropped; }
+  void set_hint_dropped ()      { hint_dropped = true; }
+
+  bool is_vsindex_dropped () const { return vsindex_dropped; }
+  void set_vsindex_dropped ()      { vsindex_dropped = true; }
+
+  bool has_prefix () const          { return has_prefix_; }
+  op_code_t prefix_op () const         { return prefix_op_; }
+  const number_t &prefix_num () const { return prefix_num_; }
+
+  protected:
+  bool    parsed;
+  bool    hint_dropped;
+  bool    vsindex_dropped;
+  bool    has_prefix_;
+  op_code_t	prefix_op_;
+  number_t 	prefix_num_;
+
+  private:
+  typedef parsed_values_t<parsed_cs_op_t> SUPER;
+};
+
+struct parsed_cs_str_vec_t : hb_vector_t<parsed_cs_str_t>
+{
+  void init (unsigned int len_ = 0)
+  {
+    SUPER::init ();
+    resize (len_);
+    for (unsigned int i = 0; i < length; i++)
+      (*this)[i].init ();
+  }
+  void fini () { SUPER::fini_deep (); }
+
+  private:
+  typedef hb_vector_t<parsed_cs_str_t> SUPER;
+};
+
+struct subr_subset_param_t
+{
+  void init (parsed_cs_str_t *parsed_charstring_,
+	     parsed_cs_str_vec_t *parsed_global_subrs_, parsed_cs_str_vec_t *parsed_local_subrs_,
+	     hb_set_t *global_closure_, hb_set_t *local_closure_,
+	     bool drop_hints_)
+  {
+    parsed_charstring = parsed_charstring_;
+    current_parsed_str = parsed_charstring;
+    parsed_global_subrs = parsed_global_subrs_;
+    parsed_local_subrs = parsed_local_subrs_;
+    global_closure = global_closure_;
+    local_closure = local_closure_;
+    drop_hints = drop_hints_;
+  }
+
+  parsed_cs_str_t *get_parsed_str_for_context (call_context_t &context)
+  {
+    switch (context.type)
+    {
+      case CSType_CharString:
+	return parsed_charstring;
+
+      case CSType_LocalSubr:
+	if (likely (context.subr_num < parsed_local_subrs->length))
+	  return &(*parsed_local_subrs)[context.subr_num];
+	break;
+
+      case CSType_GlobalSubr:
+	if (likely (context.subr_num < parsed_global_subrs->length))
+	  return &(*parsed_global_subrs)[context.subr_num];
+	break;
+    }
+    return nullptr;
+  }
+
+  template <typename ENV>
+  void set_current_str (ENV &env, bool calling)
+  {
+    parsed_cs_str_t  *parsed_str = get_parsed_str_for_context (env.context);
+    if (likely (parsed_str != nullptr))
+    {
+      /* If the called subroutine is parsed partially but not completely yet,
+       * it must be because we are calling it recursively.
+       * Handle it as an error. */
+      if (unlikely (calling && !parsed_str->is_parsed () && (parsed_str->values.length > 0)))
+      	env.set_error ();
+      else
+      	current_parsed_str = parsed_str;
+    }
+    else
+      env.set_error ();
+  }
+
+  parsed_cs_str_t	*current_parsed_str;
+
+  parsed_cs_str_t	*parsed_charstring;
+  parsed_cs_str_vec_t	*parsed_global_subrs;
+  parsed_cs_str_vec_t	*parsed_local_subrs;
+  hb_set_t      *global_closure;
+  hb_set_t      *local_closure;
+  bool	  drop_hints;
+};
+
+struct subr_remap_t : remap_t
+{
+  void create (hb_set_t *closure)
+  {
+    /* create a remapping of subroutine numbers from old to new.
+     * no optimization based on usage counts. fonttools doesn't appear doing that either.
+     */
+    reset (closure->get_max () + 1);
+    for (hb_codepoint_t old_num = 0; old_num < length; old_num++)
+    {
+      if (hb_set_has (closure, old_num))
+	add (old_num);
+    }
+
+    if (get_count () < 1240)
+      bias = 107;
+    else if (get_count () < 33900)
+      bias = 1131;
+    else
+      bias = 32768;
+  }
+
+  hb_codepoint_t operator[] (unsigned int old_num) const
+  {
+    if (old_num >= length)
+      return CFF_UNDEF_CODE;
+    else
+      return remap_t::operator[] (old_num);
+  }
+
+  int biased_num (unsigned int old_num) const
+  {
+    hb_codepoint_t new_num = (*this)[old_num];
+    return (int)new_num - bias;
+  }
+
+  protected:
+  int bias;
+};
+
+struct subr_remap_ts
+{
+  subr_remap_ts ()
+  {
+    global_remap.init ();
+    local_remaps.init ();
+  }
+
+  ~subr_remap_ts () { fini (); }
+
+  void init (unsigned int fdCount)
+  {
+    local_remaps.resize (fdCount);
+    for (unsigned int i = 0; i < fdCount; i++)
+      local_remaps[i].init ();
+  }
+
+  void create (subr_closures_t& closures)
+  {
+    global_remap.create (closures.global_closure);
+    for (unsigned int i = 0; i < local_remaps.length; i++)
+      local_remaps[i].create (closures.local_closures[i]);
+  }
+
+  void fini ()
+  {
+    global_remap.fini ();
+    local_remaps.fini_deep ();
+  }
+
+  subr_remap_t	       global_remap;
+  hb_vector_t<subr_remap_t>  local_remaps;
+};
+
+template <typename SUBSETTER, typename SUBRS, typename ACC, typename ENV, typename OPSET>
+struct subr_subsetter_t
+{
+  subr_subsetter_t ()
+  {
+    parsed_charstrings.init ();
+    parsed_global_subrs.init ();
+    parsed_local_subrs.init ();
+  }
+
+  ~subr_subsetter_t ()
+  {
+    closures.fini ();
+    remaps.fini ();
+    parsed_charstrings.fini_deep ();
+    parsed_global_subrs.fini_deep ();
+    parsed_local_subrs.fini_deep ();
+  }
+
+  /* Subroutine subsetting with --no-desubroutinize runs in phases:
+   *
+   * 1. execute charstrings/subroutines to determine subroutine closures
+   * 2. parse out all operators and numbers
+   * 3. mark hint operators and operands for removal if --no-hinting
+   * 4. re-encode all charstrings and subroutines with new subroutine numbers
+   *
+   * Phases #1 and #2 are done at the same time in collect_subrs ().
+   * Phase #3 walks charstrings/subroutines forward then backward (hence parsing required),
+   * because we can't tell if a number belongs to a hint op until we see the first moveto.
+   *
+   * Assumption: a callsubr/callgsubr operator must immediately follow a (biased) subroutine number
+   * within the same charstring/subroutine, e.g., not split across a charstring and a subroutine.
+   */
+  bool subset (ACC &acc, const hb_vector_t<hb_codepoint_t> &glyphs, bool drop_hints)
+  {
+    closures.init (acc.fdCount);
+    remaps.init (acc.fdCount);
+
+    parsed_charstrings.init (glyphs.length);
+    parsed_global_subrs.init (acc.globalSubrs->count);
+    parsed_local_subrs.resize (acc.fdCount);
+    for (unsigned int i = 0; i < acc.fdCount; i++)
+    {
+      parsed_local_subrs[i].init (acc.privateDicts[i].localSubrs->count);
+    }
+    if (unlikely (!closures.valid))
+      return false;
+
+    /* phase 1 & 2 */
+    for (unsigned int i = 0; i < glyphs.length; i++)
+    {
+      hb_codepoint_t  glyph = glyphs[i];
+      const byte_str_t str = (*acc.charStrings)[glyph];
+      unsigned int fd = acc.fdSelect->get_fd (glyph);
+      if (unlikely (fd >= acc.fdCount))
+      	return false;
+
+      cs_interpreter_t<ENV, OPSET, subr_subset_param_t> interp;
+      interp.env.init (str, acc, fd);
+
+      subr_subset_param_t  param;
+      param.init (&parsed_charstrings[i],
+		  &parsed_global_subrs,  &parsed_local_subrs[fd],
+		  closures.global_closure, closures.local_closures[fd],
+		  drop_hints);
+
+      if (unlikely (!interp.interpret (param)))
+	return false;
+
+      /* finalize parsed string esp. copy CFF1 width or CFF2 vsindex to the parsed charstring for encoding */
+      SUBSETTER::finalize_parsed_str (interp.env, param, parsed_charstrings[i]);
+    }
+
+    if (drop_hints)
+    {
+      /* mark hint ops and arguments for drop */
+      for (unsigned int i = 0; i < glyphs.length; i++)
+      {
+	unsigned int fd = acc.fdSelect->get_fd (glyphs[i]);
+	if (unlikely (fd >= acc.fdCount))
+	  return false;
+	subr_subset_param_t  param;
+	param.init (&parsed_charstrings[i],
+		    &parsed_global_subrs,  &parsed_local_subrs[fd],
+		    closures.global_closure, closures.local_closures[fd],
+		    drop_hints);
+
+	drop_hints_param_t  drop;
+	if (drop_hints_in_str (parsed_charstrings[i], param, drop))
+	{
+	  parsed_charstrings[i].set_hint_dropped ();
+	  if (drop.vsindex_dropped)
+	    parsed_charstrings[i].set_vsindex_dropped ();
+	}
+      }
+
+      /* after dropping hints recreate closures of actually used subrs */
+      closures.reset ();
+      for (unsigned int i = 0; i < glyphs.length; i++)
+      {
+	unsigned int fd = acc.fdSelect->get_fd (glyphs[i]);
+	if (unlikely (fd >= acc.fdCount))
+	  return false;
+	subr_subset_param_t  param;
+	param.init (&parsed_charstrings[i],
+		    &parsed_global_subrs,  &parsed_local_subrs[fd],
+		    closures.global_closure, closures.local_closures[fd],
+		    drop_hints);
+	collect_subr_refs_in_str (parsed_charstrings[i], param);
+      }
+    }
+
+    remaps.create (closures);
+
+    return true;
+  }
+
+  bool encode_charstrings (ACC &acc, const hb_vector_t<hb_codepoint_t> &glyphs, str_buff_vec_t &buffArray) const
+  {
+    if (unlikely (!buffArray.resize (glyphs.length)))
+      return false;
+    for (unsigned int i = 0; i < glyphs.length; i++)
+    {
+      unsigned int  fd = acc.fdSelect->get_fd (glyphs[i]);
+      if (unlikely (fd >= acc.fdCount))
+      	return false;
+      if (unlikely (!encode_str (parsed_charstrings[i], fd, buffArray[i])))
+	return false;
+    }
+    return true;
+  }
+
+  bool encode_subrs (const parsed_cs_str_vec_t &subrs, const subr_remap_t& remap, unsigned int fd, str_buff_vec_t &buffArray) const
+  {
+    unsigned int  count = remap.get_count ();
+
+    if (unlikely (!buffArray.resize (count)))
+      return false;
+    for (unsigned int old_num = 0; old_num < subrs.length; old_num++)
+    {
+      hb_codepoint_t new_num = remap[old_num];
+      if (new_num != CFF_UNDEF_CODE)
+      {
+	if (unlikely (!encode_str (subrs[old_num], fd, buffArray[new_num])))
+	  return false;
+      }
+    }
+    return true;
+  }
+
+  bool encode_globalsubrs (str_buff_vec_t &buffArray)
+  {
+    return encode_subrs (parsed_global_subrs, remaps.global_remap, 0, buffArray);
+  }
+
+  bool encode_localsubrs (unsigned int fd, str_buff_vec_t &buffArray) const
+  {
+    return encode_subrs (parsed_local_subrs[fd], remaps.local_remaps[fd], fd, buffArray);
+  }
+
+  protected:
+  struct drop_hints_param_t
+  {
+    drop_hints_param_t ()
+      : seen_moveto (false),
+	ends_in_hint (false),
+	vsindex_dropped (false) {}
+
+    bool  seen_moveto;
+    bool  ends_in_hint;
+    bool  vsindex_dropped;
+  };
+
+  bool drop_hints_in_subr (parsed_cs_str_t &str, unsigned int pos,
+			   parsed_cs_str_vec_t &subrs, unsigned int subr_num,
+			   const subr_subset_param_t &param, drop_hints_param_t &drop)
+  {
+    drop.ends_in_hint = false;
+    bool has_hint = drop_hints_in_str (subrs[subr_num], param, drop);
+
+    /* if this subr ends with a stem hint (i.e., not a number a potential argument for moveto),
+     * then this entire subroutine must be a hint. drop its call. */
+    if (drop.ends_in_hint)
+    {
+      str.values[pos].set_drop ();
+      /* if this subr call is at the end of the parent subr, propagate the flag
+       * otherwise reset the flag */
+      if (!str.at_end (pos))
+	drop.ends_in_hint = false;
+    }
+
+    return has_hint;
+  }
+
+  /* returns true if it sees a hint op before the first moveto */
+  bool drop_hints_in_str (parsed_cs_str_t &str, const subr_subset_param_t &param, drop_hints_param_t &drop)
+  {
+    bool  seen_hint = false;
+
+    for (unsigned int pos = 0; pos < str.values.length; pos++)
+    {
+      bool  has_hint = false;
+      switch (str.values[pos].op)
+      {
+	case OpCode_callsubr:
+	  has_hint = drop_hints_in_subr (str, pos,
+					*param.parsed_local_subrs, str.values[pos].subr_num,
+					param, drop);
+
+	  break;
+
+	case OpCode_callgsubr:
+	  has_hint = drop_hints_in_subr (str, pos,
+					*param.parsed_global_subrs, str.values[pos].subr_num,
+					param, drop);
+	  break;
+
+	case OpCode_rmoveto:
+	case OpCode_hmoveto:
+	case OpCode_vmoveto:
+	  drop.seen_moveto = true;
+	  break;
+
+	case OpCode_hintmask:
+	case OpCode_cntrmask:
+	  if (drop.seen_moveto)
+	  {
+	    str.values[pos].set_drop ();
+	    break;
+	  }
+	  HB_FALLTHROUGH;
+
+	case OpCode_hstemhm:
+	case OpCode_vstemhm:
+	case OpCode_hstem:
+	case OpCode_vstem:
+	  has_hint = true;
+	  str.values[pos].set_drop ();
+	  if (str.at_end (pos))
+	    drop.ends_in_hint = true;
+	  break;
+
+	case OpCode_dotsection:
+	  str.values[pos].set_drop ();
+	  break;
+
+	default:
+	  /* NONE */
+	  break;
+      }
+      if (has_hint)
+      {
+	for (int i = pos - 1; i >= 0; i--)
+	{
+	  parsed_cs_op_t  &csop = str.values[(unsigned)i];
+	  if (csop.for_drop ())
+	    break;
+	  csop.set_drop ();
+	  if (csop.op == OpCode_vsindexcs)
+	    drop.vsindex_dropped = true;
+	}
+	seen_hint |= has_hint;
+      }
+    }
+
+    return seen_hint;
+  }
+
+  void collect_subr_refs_in_subr (parsed_cs_str_t &str, unsigned int pos,
+				  unsigned int subr_num, parsed_cs_str_vec_t &subrs,
+				  hb_set_t *closure,
+				  const subr_subset_param_t &param)
+  {
+    hb_set_add (closure, subr_num);
+    collect_subr_refs_in_str (subrs[subr_num], param);
+  }
+
+  void collect_subr_refs_in_str (parsed_cs_str_t &str, const subr_subset_param_t &param)
+  {
+    for (unsigned int pos = 0; pos < str.values.length; pos++)
+    {
+      if (!str.values[pos].for_drop ())
+      {
+	switch (str.values[pos].op)
+	{
+	  case OpCode_callsubr:
+	    collect_subr_refs_in_subr (str, pos,
+				       str.values[pos].subr_num, *param.parsed_local_subrs,
+				       param.local_closure, param);
+	    break;
+
+	  case OpCode_callgsubr:
+	    collect_subr_refs_in_subr (str, pos,
+				       str.values[pos].subr_num, *param.parsed_global_subrs,
+				       param.global_closure, param);
+	    break;
+
+	  default: break;
+	}
+      }
+    }
+  }
+
+  bool encode_str (const parsed_cs_str_t &str, const unsigned int fd, str_buff_t &buff) const
+  {
+    buff.init ();
+    str_encoder_t  encoder (buff);
+    encoder.reset ();
+    /* if a prefix (CFF1 width or CFF2 vsindex) has been removed along with hints,
+     * re-insert it at the beginning of charstreing */
+    if (str.has_prefix () && str.is_hint_dropped ())
+    {
+      encoder.encode_num (str.prefix_num ());
+      if (str.prefix_op () != OpCode_Invalid)
+	encoder.encode_op (str.prefix_op ());
+    }
+    for (unsigned int i = 0; i < str.get_count(); i++)
+    {
+      const parsed_cs_op_t  &opstr = str.values[i];
+      if (!opstr.for_drop () && !opstr.for_skip ())
+      {
+	switch (opstr.op)
+	{
+	  case OpCode_callsubr:
+	    encoder.encode_int (remaps.local_remaps[fd].biased_num (opstr.subr_num));
+	    encoder.encode_op (OpCode_callsubr);
+	    break;
+
+	  case OpCode_callgsubr:
+	    encoder.encode_int (remaps.global_remap.biased_num (opstr.subr_num));
+	    encoder.encode_op (OpCode_callgsubr);
+	    break;
+
+	  default:
+	    encoder.copy_str (opstr.str);
+	    break;
+	}
+      }
+    }
+    return !encoder.is_error ();
+  }
+
+  protected:
+  subr_closures_t	      closures;
+
+  parsed_cs_str_vec_t	       parsed_charstrings;
+  parsed_cs_str_vec_t	       parsed_global_subrs;
+  hb_vector_t<parsed_cs_str_vec_t>  parsed_local_subrs;
+
+  subr_remap_ts		remaps;
+
+  private:
+  typedef typename SUBRS::count_type subr_count_type;
+};
+
+} /* namespace CFF */
+
+HB_INTERNAL bool
+hb_plan_subset_cff_fdselect (const hb_vector_t<hb_codepoint_t> &glyphs,
+			    unsigned int fdCount,
+			    const CFF::FDSelect &src, /* IN */
+			    unsigned int &subset_fd_count /* OUT */,
+			    unsigned int &subset_fdselect_size /* OUT */,
+			    unsigned int &subset_fdselect_format /* OUT */,
+			    hb_vector_t<CFF::code_pair_t> &fdselect_ranges /* OUT */,
+			    CFF::remap_t &fdmap /* OUT */);
+
+HB_INTERNAL bool
+hb_serialize_cff_fdselect (hb_serialize_context_t *c,
+			  unsigned int num_glyphs,
+			  const CFF::FDSelect &src,
+			  unsigned int fd_count,
+			  unsigned int fdselect_format,
+			  unsigned int size,
+			  const hb_vector_t<CFF::code_pair_t> &fdselect_ranges);
+
+#endif /* HB_SUBSET_CFF_COMMON_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff1.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff1.cc
new file mode 100644
index 0000000..5133a4de
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff1.cc
@@ -0,0 +1,1103 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb-open-type.hh"
+#include "hb-ot-cff1-table.hh"
+#include "hb-set.h"
+#include "hb-subset-cff1.hh"
+#include "hb-subset-plan.hh"
+#include "hb-subset-cff-common.hh"
+#include "hb-cff1-interp-cs.hh"
+
+using namespace CFF;
+
+struct remap_sid_t : remap_t
+{
+  unsigned int add (unsigned int sid)
+  {
+    if ((sid != CFF_UNDEF_SID) && !is_std_std (sid))
+      return offset_sid (remap_t::add (unoffset_sid (sid)));
+    else
+      return sid;
+  }
+
+  unsigned int operator[] (unsigned int sid) const
+  {
+    if (is_std_std (sid) || (sid == CFF_UNDEF_SID))
+      return sid;
+    else
+      return offset_sid (remap_t::operator [] (unoffset_sid (sid)));
+  }
+
+  static const unsigned int num_std_strings = 391;
+
+  static bool is_std_std (unsigned int sid) { return sid < num_std_strings; }
+  static unsigned int offset_sid (unsigned int sid) { return sid + num_std_strings; }
+  static unsigned int unoffset_sid (unsigned int sid) { return sid - num_std_strings; }
+};
+
+struct cff1_sub_table_offsets_t : cff_sub_table_offsets_t
+{
+  cff1_sub_table_offsets_t ()
+    : cff_sub_table_offsets_t (),
+      nameIndexOffset (0),
+      encodingOffset (0)
+  {
+    stringIndexInfo.init ();
+    charsetInfo.init ();
+    privateDictInfo.init ();
+  }
+
+  unsigned int  nameIndexOffset;
+  table_info_t	stringIndexInfo;
+  unsigned int  encodingOffset;
+  table_info_t	charsetInfo;
+  table_info_t	privateDictInfo;
+};
+
+/* a copy of a parsed out cff1_top_dict_values_t augmented with additional operators */
+struct cff1_top_dict_values_mod_t : cff1_top_dict_values_t
+{
+  void init (const cff1_top_dict_values_t *base_= &Null(cff1_top_dict_values_t))
+  {
+    SUPER::init ();
+    base = base_;
+  }
+
+  void fini () { SUPER::fini (); }
+
+  unsigned get_count () const { return base->get_count () + SUPER::get_count (); }
+  const cff1_top_dict_val_t &get_value (unsigned int i) const
+  {
+    if (i < base->get_count ())
+      return (*base)[i];
+    else
+      return SUPER::values[i - base->get_count ()];
+  }
+  const cff1_top_dict_val_t &operator [] (unsigned int i) const { return get_value (i); }
+
+  void reassignSIDs (const remap_sid_t& sidmap)
+  {
+    for (unsigned int i = 0; i < name_dict_values_t::ValCount; i++)
+      nameSIDs[i] = sidmap[base->nameSIDs[i]];
+  }
+
+  protected:
+  typedef cff1_top_dict_values_t SUPER;
+  const cff1_top_dict_values_t *base;
+};
+
+struct top_dict_modifiers_t
+{
+  top_dict_modifiers_t (const cff1_sub_table_offsets_t &offsets_,
+			   const unsigned int (&nameSIDs_)[name_dict_values_t::ValCount])
+    : offsets (offsets_),
+      nameSIDs (nameSIDs_)
+  {}
+
+  const cff1_sub_table_offsets_t &offsets;
+  const unsigned int	(&nameSIDs)[name_dict_values_t::ValCount];
+};
+
+struct cff1_top_dict_op_serializer_t : cff_top_dict_op_serializer_t<cff1_top_dict_val_t>
+{
+  bool serialize (hb_serialize_context_t *c,
+		  const cff1_top_dict_val_t &opstr,
+		  const top_dict_modifiers_t &mod) const
+  {
+    TRACE_SERIALIZE (this);
+
+    op_code_t op = opstr.op;
+    switch (op)
+    {
+      case OpCode_charset:
+	return_trace (FontDict::serialize_offset4_op(c, op, mod.offsets.charsetInfo.offset));
+
+      case OpCode_Encoding:
+	return_trace (FontDict::serialize_offset4_op(c, op, mod.offsets.encodingOffset));
+
+      case OpCode_Private:
+	{
+	  if (unlikely (!UnsizedByteStr::serialize_int2 (c, mod.offsets.privateDictInfo.size)))
+	    return_trace (false);
+	  if (unlikely (!UnsizedByteStr::serialize_int4 (c, mod.offsets.privateDictInfo.offset)))
+	    return_trace (false);
+	  HBUINT8 *p = c->allocate_size<HBUINT8> (1);
+	  if (unlikely (p == nullptr)) return_trace (false);
+	  p->set (OpCode_Private);
+	}
+	break;
+
+      case OpCode_version:
+      case OpCode_Notice:
+      case OpCode_Copyright:
+      case OpCode_FullName:
+      case OpCode_FamilyName:
+      case OpCode_Weight:
+      case OpCode_PostScript:
+      case OpCode_BaseFontName:
+      case OpCode_FontName:
+	return_trace (FontDict::serialize_offset2_op(c, op, mod.nameSIDs[name_dict_values_t::name_op_to_index (op)]));
+
+      case OpCode_ROS:
+	{
+	  /* for registry & ordering, reassigned SIDs are serialized
+	   * for supplement, the original byte string is copied along with the op code */
+	  op_str_t supp_op;
+	  supp_op.op = op;
+	  if ( unlikely (!(opstr.str.length >= opstr.last_arg_offset + 3)))
+	    return_trace (false);
+	  supp_op.str = byte_str_t (&opstr.str + opstr.last_arg_offset, opstr.str.length - opstr.last_arg_offset);
+	  return_trace (UnsizedByteStr::serialize_int2 (c, mod.nameSIDs[name_dict_values_t::registry]) &&
+			UnsizedByteStr::serialize_int2 (c, mod.nameSIDs[name_dict_values_t::ordering]) &&
+			copy_opstr (c, supp_op));
+	}
+      default:
+	return_trace (cff_top_dict_op_serializer_t<cff1_top_dict_val_t>::serialize (c, opstr, mod.offsets));
+    }
+    return_trace (true);
+  }
+
+  unsigned int calculate_serialized_size (const cff1_top_dict_val_t &opstr) const
+  {
+    op_code_t op = opstr.op;
+    switch (op)
+    {
+      case OpCode_charset:
+      case OpCode_Encoding:
+	return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (op);
+
+      case OpCode_Private:
+	return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Private);
+
+      case OpCode_version:
+      case OpCode_Notice:
+      case OpCode_Copyright:
+      case OpCode_FullName:
+      case OpCode_FamilyName:
+      case OpCode_Weight:
+      case OpCode_PostScript:
+      case OpCode_BaseFontName:
+      case OpCode_FontName:
+	return OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (op);
+
+      case OpCode_ROS:
+	return ((OpCode_Size (OpCode_shortint) + 2) * 2) + (opstr.str.length - opstr.last_arg_offset)/* supplement + op */;
+
+      default:
+	return cff_top_dict_op_serializer_t<cff1_top_dict_val_t>::calculate_serialized_size (opstr);
+    }
+  }
+};
+
+struct font_dict_values_mod_t
+{
+  void init (const cff1_font_dict_values_t *base_,
+	     unsigned int fontName_,
+	     const table_info_t &privateDictInfo_)
+  {
+    base = base_;
+    fontName = fontName_;
+    privateDictInfo = privateDictInfo_;
+  }
+
+  unsigned get_count () const { return base->get_count (); }
+
+  const op_str_t &operator [] (unsigned int i) const { return (*base)[i]; }
+
+  const cff1_font_dict_values_t    *base;
+  table_info_t		   privateDictInfo;
+  unsigned int		fontName;
+};
+
+struct cff1_font_dict_op_serializer_t : cff_font_dict_op_serializer_t
+{
+  bool serialize (hb_serialize_context_t *c,
+		  const op_str_t &opstr,
+		  const font_dict_values_mod_t &mod) const
+  {
+    TRACE_SERIALIZE (this);
+
+    if (opstr.op == OpCode_FontName)
+      return_trace (FontDict::serialize_uint2_op (c, opstr.op, mod.fontName));
+    else
+      return_trace (SUPER::serialize (c, opstr, mod.privateDictInfo));
+  }
+
+  unsigned int calculate_serialized_size (const op_str_t &opstr) const
+  {
+    if (opstr.op == OpCode_FontName)
+      return OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_FontName);
+    else
+      return SUPER::calculate_serialized_size (opstr);
+  }
+
+  private:
+  typedef cff_font_dict_op_serializer_t SUPER;
+};
+
+struct cff1_cs_opset_flatten_t : cff1_cs_opset_t<cff1_cs_opset_flatten_t, flatten_param_t>
+{
+  static void flush_args_and_op (op_code_t op, cff1_cs_interp_env_t &env, flatten_param_t& param)
+  {
+    if (env.arg_start > 0)
+      flush_width (env, param);
+
+    switch (op)
+    {
+      case OpCode_hstem:
+      case OpCode_hstemhm:
+      case OpCode_vstem:
+      case OpCode_vstemhm:
+      case OpCode_hintmask:
+      case OpCode_cntrmask:
+      case OpCode_dotsection:
+	if (param.drop_hints)
+	{
+	  env.clear_args ();
+	  return;
+	}
+	HB_FALLTHROUGH;
+
+      default:
+	SUPER::flush_args_and_op (op, env, param);
+	break;
+    }
+  }
+  static void flush_args (cff1_cs_interp_env_t &env, flatten_param_t& param)
+  {
+    str_encoder_t  encoder (param.flatStr);
+    for (unsigned int i = env.arg_start; i < env.argStack.get_count (); i++)
+      encoder.encode_num (env.eval_arg (i));
+    SUPER::flush_args (env, param);
+  }
+
+  static void flush_op (op_code_t op, cff1_cs_interp_env_t &env, flatten_param_t& param)
+  {
+    str_encoder_t  encoder (param.flatStr);
+    encoder.encode_op (op);
+  }
+
+  static void flush_width (cff1_cs_interp_env_t &env, flatten_param_t& param)
+  {
+    assert (env.has_width);
+    str_encoder_t  encoder (param.flatStr);
+    encoder.encode_num (env.width);
+  }
+
+  static void flush_hintmask (op_code_t op, cff1_cs_interp_env_t &env, flatten_param_t& param)
+  {
+    SUPER::flush_hintmask (op, env, param);
+    if (!param.drop_hints)
+    {
+      str_encoder_t  encoder (param.flatStr);
+      for (unsigned int i = 0; i < env.hintmask_size; i++)
+	encoder.encode_byte (env.str_ref[i]);
+    }
+  }
+
+  private:
+  typedef cff1_cs_opset_t<cff1_cs_opset_flatten_t, flatten_param_t> SUPER;
+};
+
+struct range_list_t : hb_vector_t<code_pair_t>
+{
+  /* replace the first glyph ID in the "glyph" field each range with a nLeft value */
+  bool finalize (unsigned int last_glyph)
+  {
+    bool  two_byte = false;
+    for (unsigned int i = (*this).length; i > 0; i--)
+    {
+      code_pair_t &pair = (*this)[i - 1];
+      unsigned int  nLeft = last_glyph - pair.glyph - 1;
+      if (nLeft >= 0x100)
+	two_byte = true;
+      last_glyph = pair.glyph;
+      pair.glyph = nLeft;
+    }
+    return two_byte;
+  }
+};
+
+struct cff1_cs_opset_subr_subset_t : cff1_cs_opset_t<cff1_cs_opset_subr_subset_t, subr_subset_param_t>
+{
+  static void process_op (op_code_t op, cff1_cs_interp_env_t &env, subr_subset_param_t& param)
+  {
+    switch (op) {
+
+      case OpCode_return:
+	param.current_parsed_str->add_op (op, env.str_ref);
+	param.current_parsed_str->set_parsed ();
+	env.returnFromSubr ();
+	param.set_current_str (env, false);
+	break;
+
+      case OpCode_endchar:
+	param.current_parsed_str->add_op (op, env.str_ref);
+	param.current_parsed_str->set_parsed ();
+	SUPER::process_op (op, env, param);
+	break;
+
+      case OpCode_callsubr:
+	process_call_subr (op, CSType_LocalSubr, env, param, env.localSubrs, param.local_closure);
+	break;
+
+      case OpCode_callgsubr:
+	process_call_subr (op, CSType_GlobalSubr, env, param, env.globalSubrs, param.global_closure);
+	break;
+
+      default:
+	SUPER::process_op (op, env, param);
+	param.current_parsed_str->add_op (op, env.str_ref);
+	break;
+    }
+  }
+
+  protected:
+  static void process_call_subr (op_code_t op, cs_type_t type,
+				 cff1_cs_interp_env_t &env, subr_subset_param_t& param,
+				 cff1_biased_subrs_t& subrs, hb_set_t *closure)
+  {
+    byte_str_ref_t    str_ref = env.str_ref;
+    env.callSubr (subrs, type);
+    param.current_parsed_str->add_call_op (op, str_ref, env.context.subr_num);
+    hb_set_add (closure, env.context.subr_num);
+    param.set_current_str (env, true);
+  }
+
+  private:
+  typedef cff1_cs_opset_t<cff1_cs_opset_subr_subset_t, subr_subset_param_t> SUPER;
+};
+
+struct cff1_subr_subsetter_t : subr_subsetter_t<cff1_subr_subsetter_t, CFF1Subrs, const OT::cff1::accelerator_subset_t, cff1_cs_interp_env_t, cff1_cs_opset_subr_subset_t>
+{
+  static void finalize_parsed_str (cff1_cs_interp_env_t &env, subr_subset_param_t& param, parsed_cs_str_t &charstring)
+  {
+    /* insert width at the beginning of the charstring as necessary */
+    if (env.has_width)
+      charstring.set_prefix (env.width);
+
+    /* subroutines/charstring left on the call stack are legally left unmarked
+     * unmarked when a subroutine terminates with endchar. mark them.
+     */
+    param.current_parsed_str->set_parsed ();
+    for (unsigned int i = 0; i < env.callStack.get_count (); i++)
+    {
+      parsed_cs_str_t  *parsed_str = param.get_parsed_str_for_context (env.callStack[i]);
+      if (likely (parsed_str != nullptr))
+	parsed_str->set_parsed ();
+      else
+	env.set_error ();
+    }
+  }
+};
+
+struct cff_subset_plan {
+  cff_subset_plan ()
+    : final_size (0),
+      offsets (),
+      orig_fdcount (0),
+      subset_fdcount (1),
+      subset_fdselect_format (0),
+      drop_hints (false),
+      desubroutinize(false)
+  {
+    topdict_sizes.init ();
+    topdict_sizes.resize (1);
+    topdict_mod.init ();
+    subset_fdselect_ranges.init ();
+    fdmap.init ();
+    subset_charstrings.init ();
+    subset_globalsubrs.init ();
+    subset_localsubrs.init ();
+    fontdicts_mod.init ();
+    subset_enc_code_ranges.init ();
+    subset_enc_supp_codes.init ();
+    subset_charset_ranges.init ();
+    sidmap.init ();
+    for (unsigned int i = 0; i < name_dict_values_t::ValCount; i++)
+      topDictModSIDs[i] = CFF_UNDEF_SID;
+  }
+
+  ~cff_subset_plan ()
+  {
+    topdict_sizes.fini ();
+    topdict_mod.fini ();
+    subset_fdselect_ranges.fini ();
+    fdmap.fini ();
+    subset_charstrings.fini_deep ();
+    subset_globalsubrs.fini_deep ();
+    subset_localsubrs.fini_deep ();
+    fontdicts_mod.fini ();
+    subset_enc_code_ranges.fini ();
+    subset_enc_supp_codes.fini ();
+    subset_charset_ranges.fini ();
+    sidmap.fini ();
+  }
+
+  unsigned int plan_subset_encoding (const OT::cff1::accelerator_subset_t &acc, hb_subset_plan_t *plan)
+  {
+    const Encoding *encoding = acc.encoding;
+    unsigned int  size0, size1, supp_size;
+    hb_codepoint_t  code, last_code = CFF_UNDEF_CODE;
+    hb_vector_t<hb_codepoint_t> supp_codes;
+
+    subset_enc_code_ranges.resize (0);
+    supp_size = 0;
+    supp_codes.init ();
+
+    subset_enc_num_codes = plan->glyphs.length - 1;
+    unsigned int glyph;
+    for (glyph = 1; glyph < plan->glyphs.length; glyph++)
+    {
+      hb_codepoint_t  orig_glyph = plan->glyphs[glyph];
+      code = acc.glyph_to_code (orig_glyph);
+      if (code == CFF_UNDEF_CODE)
+      {
+	subset_enc_num_codes = glyph - 1;
+	break;
+      }
+
+      if (code != last_code + 1)
+      {
+	code_pair_t pair = { code, glyph };
+	subset_enc_code_ranges.push (pair);
+      }
+      last_code = code;
+
+      if (encoding != &Null(Encoding))
+      {
+	hb_codepoint_t  sid = acc.glyph_to_sid (orig_glyph);
+	encoding->get_supplement_codes (sid, supp_codes);
+	for (unsigned int i = 0; i < supp_codes.length; i++)
+	{
+	  code_pair_t pair = { supp_codes[i], sid };
+	  subset_enc_supp_codes.push (pair);
+	}
+	supp_size += SuppEncoding::static_size * supp_codes.length;
+      }
+    }
+    supp_codes.fini ();
+
+    subset_enc_code_ranges.finalize (glyph);
+
+    assert (subset_enc_num_codes <= 0xFF);
+    size0 = Encoding0::min_size + HBUINT8::static_size * subset_enc_num_codes;
+    size1 = Encoding1::min_size + Encoding1_Range::static_size * subset_enc_code_ranges.length;
+
+    if (size0 < size1)
+      subset_enc_format = 0;
+    else
+      subset_enc_format = 1;
+
+    return Encoding::calculate_serialized_size (
+			subset_enc_format,
+			subset_enc_format? subset_enc_code_ranges.length: subset_enc_num_codes,
+			subset_enc_supp_codes.length);
+  }
+
+  unsigned int plan_subset_charset (const OT::cff1::accelerator_subset_t &acc, hb_subset_plan_t *plan)
+  {
+    unsigned int  size0, size_ranges;
+    hb_codepoint_t  sid, last_sid = CFF_UNDEF_CODE;
+
+    subset_charset_ranges.resize (0);
+    unsigned int glyph;
+    for (glyph = 1; glyph < plan->glyphs.length; glyph++)
+    {
+      hb_codepoint_t  orig_glyph = plan->glyphs[glyph];
+      sid = acc.glyph_to_sid (orig_glyph);
+
+      if (!acc.is_CID ())
+	sid = sidmap.add (sid);
+
+      if (sid != last_sid + 1)
+      {
+	code_pair_t pair = { sid, glyph };
+	subset_charset_ranges.push (pair);
+      }
+      last_sid = sid;
+    }
+
+    bool two_byte = subset_charset_ranges.finalize (glyph);
+
+    size0 = Charset0::min_size + HBUINT16::static_size * (plan->glyphs.length - 1);
+    if (!two_byte)
+      size_ranges = Charset1::min_size + Charset1_Range::static_size * subset_charset_ranges.length;
+    else
+      size_ranges = Charset2::min_size + Charset2_Range::static_size * subset_charset_ranges.length;
+
+    if (size0 < size_ranges)
+      subset_charset_format = 0;
+    else if (!two_byte)
+      subset_charset_format = 1;
+    else
+      subset_charset_format = 2;
+
+    return Charset::calculate_serialized_size (
+			subset_charset_format,
+			subset_charset_format? subset_charset_ranges.length: plan->glyphs.length);
+  }
+
+  bool collect_sids_in_dicts (const OT::cff1::accelerator_subset_t &acc)
+  {
+    if (unlikely (!sidmap.reset (acc.stringIndex->count)))
+      return false;
+
+    for (unsigned int i = 0; i < name_dict_values_t::ValCount; i++)
+    {
+      unsigned int sid = acc.topDict.nameSIDs[i];
+      if (sid != CFF_UNDEF_SID)
+      {
+	(void)sidmap.add (sid);
+	topDictModSIDs[i] = sidmap[sid];
+      }
+    }
+
+    if (acc.fdArray != &Null(CFF1FDArray))
+      for (unsigned int i = 0; i < orig_fdcount; i++)
+	if (fdmap.includes (i))
+	  (void)sidmap.add (acc.fontDicts[i].fontName);
+
+    return true;
+  }
+
+  bool create (const OT::cff1::accelerator_subset_t &acc,
+		      hb_subset_plan_t *plan)
+  {
+     /* make sure notdef is first */
+    if ((plan->glyphs.length == 0) || (plan->glyphs[0] != 0)) return false;
+
+    final_size = 0;
+    num_glyphs = plan->glyphs.length;
+    orig_fdcount = acc.fdCount;
+    drop_hints = plan->drop_hints;
+    desubroutinize = plan->desubroutinize;
+
+    /* check whether the subset renumbers any glyph IDs */
+    gid_renum = false;
+    for (unsigned int glyph = 0; glyph < plan->glyphs.length; glyph++)
+    {
+      if (plan->glyphs[glyph] != glyph) {
+	gid_renum = true;
+	break;
+      }
+    }
+
+    subset_charset = gid_renum || !acc.is_predef_charset ();
+    subset_encoding = !acc.is_CID() && !acc.is_predef_encoding ();
+
+    /* CFF header */
+    final_size += OT::cff1::static_size;
+
+    /* Name INDEX */
+    offsets.nameIndexOffset = final_size;
+    final_size += acc.nameIndex->get_size ();
+
+    /* top dict INDEX */
+    {
+      /* Add encoding/charset to a (copy of) top dict as necessary */
+      topdict_mod.init (&acc.topDict);
+      bool need_to_add_enc = (subset_encoding && !acc.topDict.has_op (OpCode_Encoding));
+      bool need_to_add_set = (subset_charset && !acc.topDict.has_op (OpCode_charset));
+      if (need_to_add_enc || need_to_add_set)
+      {
+	if (need_to_add_enc)
+	  topdict_mod.add_op (OpCode_Encoding);
+	if (need_to_add_set)
+	  topdict_mod.add_op (OpCode_charset);
+      }
+      offsets.topDictInfo.offset = final_size;
+      cff1_top_dict_op_serializer_t topSzr;
+      unsigned int topDictSize = TopDict::calculate_serialized_size (topdict_mod, topSzr);
+      offsets.topDictInfo.offSize = calcOffSize(topDictSize);
+      if (unlikely (offsets.topDictInfo.offSize > 4))
+      	return false;
+      final_size += CFF1IndexOf<TopDict>::calculate_serialized_size<cff1_top_dict_values_mod_t>
+						(offsets.topDictInfo.offSize,
+						 &topdict_mod, 1, topdict_sizes, topSzr);
+    }
+
+    /* Determine re-mapping of font index as fdmap among other info */
+    if (acc.fdSelect != &Null(CFF1FDSelect))
+    {
+	if (unlikely (!hb_plan_subset_cff_fdselect (plan->glyphs,
+				  orig_fdcount,
+				  *acc.fdSelect,
+				  subset_fdcount,
+				  offsets.FDSelectInfo.size,
+				  subset_fdselect_format,
+				  subset_fdselect_ranges,
+				  fdmap)))
+	return false;
+    }
+    else
+      fdmap.identity (1);
+
+    /* remove unused SIDs & reassign SIDs */
+    {
+      /* SIDs for name strings in dicts are added before glyph names so they fit in 16-bit int range */
+      if (unlikely (!collect_sids_in_dicts (acc)))
+	return false;
+      if (unlikely (sidmap.get_count () > 0x8000))	/* assumption: a dict won't reference that many strings */
+      	return false;
+      if (subset_charset)
+	offsets.charsetInfo.size = plan_subset_charset (acc, plan);
+
+      topdict_mod.reassignSIDs (sidmap);
+    }
+
+    /* String INDEX */
+    {
+      offsets.stringIndexInfo.offset = final_size;
+      offsets.stringIndexInfo.size = acc.stringIndex->calculate_serialized_size (offsets.stringIndexInfo.offSize, sidmap);
+      final_size += offsets.stringIndexInfo.size;
+    }
+
+    if (desubroutinize)
+    {
+      /* Flatten global & local subrs */
+      subr_flattener_t<const OT::cff1::accelerator_subset_t, cff1_cs_interp_env_t, cff1_cs_opset_flatten_t>
+		    flattener(acc, plan->glyphs, plan->drop_hints);
+      if (!flattener.flatten (subset_charstrings))
+	return false;
+
+      /* no global/local subroutines */
+      offsets.globalSubrsInfo.size = CFF1Subrs::calculate_serialized_size (1, 0, 0);
+    }
+    else
+    {
+      /* Subset subrs: collect used subroutines, leaving all unused ones behind */
+      if (!subr_subsetter.subset (acc, plan->glyphs, plan->drop_hints))
+	return false;
+
+      /* encode charstrings, global subrs, local subrs with new subroutine numbers */
+      if (!subr_subsetter.encode_charstrings (acc, plan->glyphs, subset_charstrings))
+	return false;
+
+      if (!subr_subsetter.encode_globalsubrs (subset_globalsubrs))
+	return false;
+
+      /* global subrs */
+      unsigned int dataSize = subset_globalsubrs.total_size ();
+      offsets.globalSubrsInfo.offSize = calcOffSize (dataSize);
+      if (unlikely (offsets.globalSubrsInfo.offSize > 4))
+      	return false;
+      offsets.globalSubrsInfo.size = CFF1Subrs::calculate_serialized_size (offsets.globalSubrsInfo.offSize, subset_globalsubrs.length, dataSize);
+
+      /* local subrs */
+      if (!offsets.localSubrsInfos.resize (orig_fdcount))
+	return false;
+      if (!subset_localsubrs.resize (orig_fdcount))
+	return false;
+      for (unsigned int fd = 0; fd < orig_fdcount; fd++)
+      {
+	subset_localsubrs[fd].init ();
+	offsets.localSubrsInfos[fd].init ();
+	if (fdmap.includes (fd))
+	{
+	  if (!subr_subsetter.encode_localsubrs (fd, subset_localsubrs[fd]))
+	    return false;
+
+	  unsigned int dataSize = subset_localsubrs[fd].total_size ();
+	  if (dataSize > 0)
+	  {
+	    offsets.localSubrsInfos[fd].offset = final_size;
+	    offsets.localSubrsInfos[fd].offSize = calcOffSize (dataSize);
+	    if (unlikely (offsets.localSubrsInfos[fd].offSize > 4))
+	      return false;
+	    offsets.localSubrsInfos[fd].size = CFF1Subrs::calculate_serialized_size (offsets.localSubrsInfos[fd].offSize, subset_localsubrs[fd].length, dataSize);
+	  }
+	}
+      }
+    }
+
+    /* global subrs */
+    offsets.globalSubrsInfo.offset = final_size;
+    final_size += offsets.globalSubrsInfo.size;
+
+    /* Encoding */
+    if (!subset_encoding)
+      offsets.encodingOffset = acc.topDict.EncodingOffset;
+    else
+    {
+      offsets.encodingOffset = final_size;
+      final_size += plan_subset_encoding (acc, plan);
+    }
+
+    /* Charset */
+    if (!subset_charset && acc.is_predef_charset ())
+      offsets.charsetInfo.offset = acc.topDict.CharsetOffset;
+    else
+      offsets.charsetInfo.offset = final_size;
+    final_size += offsets.charsetInfo.size;
+
+    /* FDSelect */
+    if (acc.fdSelect != &Null(CFF1FDSelect))
+    {
+      offsets.FDSelectInfo.offset = final_size;
+      final_size += offsets.FDSelectInfo.size;
+    }
+
+    /* FDArray (FDIndex) */
+    if (acc.fdArray != &Null(CFF1FDArray)) {
+      offsets.FDArrayInfo.offset = final_size;
+      cff1_font_dict_op_serializer_t fontSzr;
+      unsigned int dictsSize = 0;
+      for (unsigned int i = 0; i < acc.fontDicts.length; i++)
+	if (fdmap.includes (i))
+	  dictsSize += FontDict::calculate_serialized_size (acc.fontDicts[i], fontSzr);
+
+      offsets.FDArrayInfo.offSize = calcOffSize (dictsSize);
+      if (unlikely (offsets.FDArrayInfo.offSize > 4))
+      	return false;
+      final_size += CFF1Index::calculate_serialized_size (offsets.FDArrayInfo.offSize, subset_fdcount, dictsSize);
+    }
+
+    /* CharStrings */
+    {
+      offsets.charStringsInfo.offset = final_size;
+      unsigned int dataSize = subset_charstrings.total_size ();
+      offsets.charStringsInfo.offSize = calcOffSize (dataSize);
+      if (unlikely (offsets.charStringsInfo.offSize > 4))
+      	return false;
+      final_size += CFF1CharStrings::calculate_serialized_size (offsets.charStringsInfo.offSize, plan->glyphs.length, dataSize);
+    }
+
+    /* private dicts & local subrs */
+    offsets.privateDictInfo.offset = final_size;
+    for (unsigned int i = 0; i < orig_fdcount; i++)
+    {
+      if (fdmap.includes (i))
+      {
+	bool  has_localsubrs = offsets.localSubrsInfos[i].size > 0;
+	cff_private_dict_op_serializer_t privSzr (desubroutinize, plan->drop_hints);
+	unsigned int  priv_size = PrivateDict::calculate_serialized_size (acc.privateDicts[i], privSzr, has_localsubrs);
+	table_info_t  privInfo = { final_size, priv_size, 0 };
+	font_dict_values_mod_t fontdict_mod;
+	if (!acc.is_CID ())
+	  fontdict_mod.init ( &Null(cff1_font_dict_values_t), CFF_UNDEF_SID, privInfo );
+	else
+	  fontdict_mod.init ( &acc.fontDicts[i], sidmap[acc.fontDicts[i].fontName], privInfo );
+	fontdicts_mod.push (fontdict_mod);
+	final_size += privInfo.size;
+
+	if (!plan->desubroutinize && has_localsubrs)
+	{
+	  offsets.localSubrsInfos[i].offset = final_size;
+	  final_size += offsets.localSubrsInfos[i].size;
+	}
+      }
+    }
+
+    if (!acc.is_CID ())
+      offsets.privateDictInfo = fontdicts_mod[0].privateDictInfo;
+
+    return ((subset_charstrings.length == plan->glyphs.length)
+	   && (fontdicts_mod.length == subset_fdcount));
+  }
+
+  unsigned int get_final_size () const  { return final_size; }
+
+  unsigned int	      final_size;
+  hb_vector_t<unsigned int>	topdict_sizes;
+  cff1_top_dict_values_mod_t	topdict_mod;
+  cff1_sub_table_offsets_t	offsets;
+
+  unsigned int    num_glyphs;
+  unsigned int    orig_fdcount;
+  unsigned int    subset_fdcount;
+  unsigned int    subset_fdselect_format;
+  hb_vector_t<code_pair_t>   subset_fdselect_ranges;
+
+  /* font dict index remap table from fullset FDArray to subset FDArray.
+   * set to CFF_UNDEF_CODE if excluded from subset */
+  remap_t   fdmap;
+
+  str_buff_vec_t		subset_charstrings;
+  str_buff_vec_t		subset_globalsubrs;
+  hb_vector_t<str_buff_vec_t>	subset_localsubrs;
+  hb_vector_t<font_dict_values_mod_t>  fontdicts_mod;
+
+  bool		drop_hints;
+
+  bool		gid_renum;
+  bool		subset_encoding;
+  uint8_t	subset_enc_format;
+  unsigned int	subset_enc_num_codes;
+  range_list_t	subset_enc_code_ranges;
+  hb_vector_t<code_pair_t>  subset_enc_supp_codes;
+
+  uint8_t	subset_charset_format;
+  range_list_t	subset_charset_ranges;
+  bool		subset_charset;
+
+  remap_sid_t	sidmap;
+  unsigned int	topDictModSIDs[name_dict_values_t::ValCount];
+
+  bool		desubroutinize;
+  cff1_subr_subsetter_t       subr_subsetter;
+};
+
+static inline bool _write_cff1 (const cff_subset_plan &plan,
+				const OT::cff1::accelerator_subset_t  &acc,
+				const hb_vector_t<hb_codepoint_t>& glyphs,
+				unsigned int dest_sz,
+				void *dest)
+{
+  hb_serialize_context_t c (dest, dest_sz);
+
+  OT::cff1 *cff = c.start_serialize<OT::cff1> ();
+  if (unlikely (!c.extend_min (*cff)))
+    return false;
+
+  /* header */
+  cff->version.major.set (0x01);
+  cff->version.minor.set (0x00);
+  cff->nameIndex.set (cff->min_size);
+  cff->offSize.set (4); /* unused? */
+
+  /* name INDEX */
+  {
+    assert (cff->nameIndex == (unsigned) (c.head - c.start));
+    CFF1NameIndex *dest = c.start_embed<CFF1NameIndex> ();
+    if (unlikely (dest == nullptr)) return false;
+    if (unlikely (!dest->serialize (&c, *acc.nameIndex)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF name INDEX");
+      return false;
+    }
+  }
+
+  /* top dict INDEX */
+  {
+    assert (plan.offsets.topDictInfo.offset == (unsigned) (c.head - c.start));
+    CFF1IndexOf<TopDict> *dest = c.start_embed< CFF1IndexOf<TopDict> > ();
+    if (dest == nullptr) return false;
+    cff1_top_dict_op_serializer_t topSzr;
+    top_dict_modifiers_t  modifier (plan.offsets, plan.topDictModSIDs);
+    if (unlikely (!dest->serialize (&c, plan.offsets.topDictInfo.offSize,
+				    &plan.topdict_mod, 1,
+				    plan.topdict_sizes, topSzr, modifier)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF top dict");
+      return false;
+    }
+  }
+
+  /* String INDEX */
+  {
+    assert (plan.offsets.stringIndexInfo.offset == (unsigned) (c.head - c.start));
+    CFF1StringIndex *dest = c.start_embed<CFF1StringIndex> ();
+    if (unlikely (dest == nullptr)) return false;
+    if (unlikely (!dest->serialize (&c, *acc.stringIndex, plan.offsets.stringIndexInfo.offSize, plan.sidmap)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF string INDEX");
+      return false;
+    }
+  }
+
+  /* global subrs */
+  {
+    assert (plan.offsets.globalSubrsInfo.offset != 0);
+    assert (plan.offsets.globalSubrsInfo.offset == (unsigned) (c.head - c.start));
+
+    CFF1Subrs *dest = c.start_embed <CFF1Subrs> ();
+    if (unlikely (dest == nullptr)) return false;
+    if (unlikely (!dest->serialize (&c, plan.offsets.globalSubrsInfo.offSize, plan.subset_globalsubrs)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize global subroutines");
+      return false;
+    }
+  }
+
+  /* Encoding */
+  if (plan.subset_encoding)
+  {
+    assert (plan.offsets.encodingOffset == (unsigned) (c.head - c.start));
+    Encoding *dest = c.start_embed<Encoding> ();
+    if (unlikely (dest == nullptr)) return false;
+    if (unlikely (!dest->serialize (&c,
+				    plan.subset_enc_format,
+				    plan.subset_enc_num_codes,
+				    plan.subset_enc_code_ranges,
+				    plan.subset_enc_supp_codes)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize Encoding");
+      return false;
+    }
+  }
+
+  /* Charset */
+  if (plan.subset_charset)
+  {
+    assert (plan.offsets.charsetInfo.offset == (unsigned) (c.head - c.start));
+    Charset *dest = c.start_embed<Charset> ();
+    if (unlikely (dest == nullptr)) return false;
+    if (unlikely (!dest->serialize (&c,
+				    plan.subset_charset_format,
+				    plan.num_glyphs,
+				    plan.subset_charset_ranges)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize Charset");
+      return false;
+    }
+  }
+
+  /* FDSelect */
+  if (acc.fdSelect != &Null(CFF1FDSelect))
+  {
+    assert (plan.offsets.FDSelectInfo.offset == (unsigned) (c.head - c.start));
+
+    if (unlikely (!hb_serialize_cff_fdselect (&c, glyphs.length, *acc.fdSelect, acc.fdCount,
+					      plan.subset_fdselect_format, plan.offsets.FDSelectInfo.size,
+					      plan.subset_fdselect_ranges)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF subset FDSelect");
+      return false;
+    }
+  }
+
+  /* FDArray (FD Index) */
+  if (acc.fdArray != &Null(CFF1FDArray))
+  {
+    assert (plan.offsets.FDArrayInfo.offset == (unsigned) (c.head - c.start));
+    CFF1FDArray  *fda = c.start_embed<CFF1FDArray> ();
+    if (unlikely (fda == nullptr)) return false;
+    cff1_font_dict_op_serializer_t  fontSzr;
+    if (unlikely (!fda->serialize (&c, plan.offsets.FDArrayInfo.offSize,
+				   plan.fontdicts_mod,
+				   fontSzr)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF FDArray");
+      return false;
+    }
+  }
+
+  /* CharStrings */
+  {
+    assert (plan.offsets.charStringsInfo.offset == (unsigned) (c.head - c.start));
+    CFF1CharStrings  *cs = c.start_embed<CFF1CharStrings> ();
+    if (unlikely (cs == nullptr)) return false;
+    if (unlikely (!cs->serialize (&c, plan.offsets.charStringsInfo.offSize, plan.subset_charstrings)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF CharStrings");
+      return false;
+    }
+  }
+
+  /* private dicts & local subrs */
+  assert (plan.offsets.privateDictInfo.offset == (unsigned) (c.head - c.start));
+  for (unsigned int i = 0; i < acc.privateDicts.length; i++)
+  {
+    if (plan.fdmap.includes (i))
+    {
+      PrivateDict  *pd = c.start_embed<PrivateDict> ();
+      if (unlikely (pd == nullptr)) return false;
+      unsigned int priv_size = plan.fontdicts_mod[plan.fdmap[i]].privateDictInfo.size;
+      bool result;
+      cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints);
+      /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */
+      unsigned int  subroffset = (plan.offsets.localSubrsInfos[i].size > 0)? priv_size: 0;
+      result = pd->serialize (&c, acc.privateDicts[i], privSzr, subroffset);
+      if (unlikely (!result))
+      {
+	DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF Private Dict[%d]", i);
+	return false;
+      }
+      if (plan.offsets.localSubrsInfos[i].size > 0)
+      {
+	CFF1Subrs *dest = c.start_embed <CFF1Subrs> ();
+	if (unlikely (dest == nullptr)) return false;
+	if (unlikely (!dest->serialize (&c, plan.offsets.localSubrsInfos[i].offSize, plan.subset_localsubrs[i])))
+	{
+	  DEBUG_MSG (SUBSET, nullptr, "failed to serialize local subroutines");
+	  return false;
+	}
+      }
+    }
+  }
+
+  assert (c.head == c.end);
+  c.end_serialize ();
+
+  return true;
+}
+
+static bool
+_hb_subset_cff1 (const OT::cff1::accelerator_subset_t  &acc,
+		const char		*data,
+		hb_subset_plan_t	*plan,
+		hb_blob_t		**prime /* OUT */)
+{
+  cff_subset_plan cff_plan;
+
+  if (unlikely (!cff_plan.create (acc, plan)))
+  {
+    DEBUG_MSG(SUBSET, nullptr, "Failed to generate a cff subsetting plan.");
+    return false;
+  }
+
+  unsigned int  cff_prime_size = cff_plan.get_final_size ();
+  char *cff_prime_data = (char *) calloc (1, cff_prime_size);
+
+  if (unlikely (!_write_cff1 (cff_plan, acc, plan->glyphs,
+			      cff_prime_size, cff_prime_data))) {
+    DEBUG_MSG(SUBSET, nullptr, "Failed to write a subset cff.");
+    free (cff_prime_data);
+    return false;
+  }
+
+  *prime = hb_blob_create (cff_prime_data,
+			   cff_prime_size,
+			   HB_MEMORY_MODE_READONLY,
+			   cff_prime_data,
+			   free);
+  return true;
+}
+
+/**
+ * hb_subset_cff1:
+ * Subsets the CFF table according to a provided plan.
+ *
+ * Return value: subsetted cff table.
+ **/
+bool
+hb_subset_cff1 (hb_subset_plan_t *plan,
+		hb_blob_t       **prime /* OUT */)
+{
+  hb_blob_t *cff_blob = hb_sanitize_context_t().reference_table<CFF::cff1> (plan->source);
+  const char *data = hb_blob_get_data(cff_blob, nullptr);
+
+  OT::cff1::accelerator_subset_t acc;
+  acc.init(plan->source);
+  bool result = likely (acc.is_valid ()) &&
+			_hb_subset_cff1 (acc, data, plan, prime);
+  hb_blob_destroy (cff_blob);
+  acc.fini ();
+
+  return result;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff1.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff1.hh
new file mode 100644
index 0000000..1ec8678
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff1.hh
@@ -0,0 +1,38 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_SUBSET_CFF1_HH
+#define HB_SUBSET_CFF1_HH
+
+#include "hb.hh"
+
+#include "hb-subset-plan.hh"
+
+HB_INTERNAL bool
+hb_subset_cff1 (hb_subset_plan_t *plan,
+	       hb_blob_t	**cff_prime /* OUT */);
+
+#endif /* HB_SUBSET_CFF1_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff2.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff2.cc
new file mode 100644
index 0000000..73a292d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff2.cc
@@ -0,0 +1,624 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb-open-type.hh"
+#include "hb-ot-cff2-table.hh"
+#include "hb-set.h"
+#include "hb-subset-cff2.hh"
+#include "hb-subset-plan.hh"
+#include "hb-subset-cff-common.hh"
+#include "hb-cff2-interp-cs.hh"
+
+using namespace CFF;
+
+struct cff2_sub_table_offsets_t : cff_sub_table_offsets_t
+{
+  cff2_sub_table_offsets_t ()
+    : cff_sub_table_offsets_t (),
+      varStoreOffset (0)
+  {}
+
+  unsigned int  varStoreOffset;
+};
+
+struct cff2_top_dict_op_serializer_t : cff_top_dict_op_serializer_t<>
+{
+  bool serialize (hb_serialize_context_t *c,
+		  const op_str_t &opstr,
+		  const cff2_sub_table_offsets_t &offsets) const
+  {
+    TRACE_SERIALIZE (this);
+
+    switch (opstr.op)
+    {
+      case OpCode_vstore:
+	return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.varStoreOffset));
+
+      default:
+	return_trace (cff_top_dict_op_serializer_t<>::serialize (c, opstr, offsets));
+    }
+  }
+
+  unsigned int calculate_serialized_size (const op_str_t &opstr) const
+  {
+    switch (opstr.op)
+    {
+      case OpCode_vstore:
+	return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (opstr.op);
+
+      default:
+	return cff_top_dict_op_serializer_t<>::calculate_serialized_size (opstr);
+    }
+  }
+};
+
+struct cff2_cs_opset_flatten_t : cff2_cs_opset_t<cff2_cs_opset_flatten_t, flatten_param_t>
+{
+  static void flush_args_and_op (op_code_t op, cff2_cs_interp_env_t &env, flatten_param_t& param)
+  {
+    switch (op)
+    {
+      case OpCode_return:
+      case OpCode_endchar:
+	/* dummy opcodes in CFF2. ignore */
+	break;
+
+      case OpCode_hstem:
+      case OpCode_hstemhm:
+      case OpCode_vstem:
+      case OpCode_vstemhm:
+      case OpCode_hintmask:
+      case OpCode_cntrmask:
+	if (param.drop_hints)
+	{
+	  env.clear_args ();
+	  return;
+	}
+	HB_FALLTHROUGH;
+
+      default:
+	SUPER::flush_args_and_op (op, env, param);
+	break;
+    }
+  }
+
+  static void flush_args (cff2_cs_interp_env_t &env, flatten_param_t& param)
+  {
+    for (unsigned int i = 0; i < env.argStack.get_count ();)
+    {
+      const blend_arg_t &arg = env.argStack[i];
+      if (arg.blending ())
+      {
+      	if (unlikely (!((arg.numValues > 0) && (env.argStack.get_count () >= arg.numValues))))
+      	{
+	  env.set_error ();
+	  return;
+	}
+	flatten_blends (arg, i, env, param);
+	i += arg.numValues;
+      }
+      else
+      {
+	str_encoder_t  encoder (param.flatStr);
+	encoder.encode_num (arg);
+	i++;
+      }
+    }
+    SUPER::flush_args (env, param);
+  }
+
+  static void flatten_blends (const blend_arg_t &arg, unsigned int i, cff2_cs_interp_env_t &env, flatten_param_t& param)
+  {
+    /* flatten the default values */
+    str_encoder_t  encoder (param.flatStr);
+    for (unsigned int j = 0; j < arg.numValues; j++)
+    {
+      const blend_arg_t &arg1 = env.argStack[i + j];
+      if (unlikely (!((arg1.blending () && (arg.numValues == arg1.numValues) && (arg1.valueIndex == j) &&
+	      (arg1.deltas.length == env.get_region_count ())))))
+      {
+      	env.set_error ();
+      	return;
+      }
+      encoder.encode_num (arg1);
+    }
+    /* flatten deltas for each value */
+    for (unsigned int j = 0; j < arg.numValues; j++)
+    {
+      const blend_arg_t &arg1 = env.argStack[i + j];
+      for (unsigned int k = 0; k < arg1.deltas.length; k++)
+	encoder.encode_num (arg1.deltas[k]);
+    }
+    /* flatten the number of values followed by blend operator */
+    encoder.encode_int (arg.numValues);
+    encoder.encode_op (OpCode_blendcs);
+  }
+
+  static void flush_op (op_code_t op, cff2_cs_interp_env_t &env, flatten_param_t& param)
+  {
+    switch (op)
+    {
+      case OpCode_return:
+      case OpCode_endchar:
+	return;
+      default:
+	str_encoder_t  encoder (param.flatStr);
+	encoder.encode_op (op);
+    }
+  }
+
+  private:
+  typedef cff2_cs_opset_t<cff2_cs_opset_flatten_t, flatten_param_t> SUPER;
+  typedef cs_opset_t<blend_arg_t, cff2_cs_opset_flatten_t, cff2_cs_opset_flatten_t, cff2_cs_interp_env_t, flatten_param_t> CSOPSET;
+};
+
+struct cff2_cs_opset_subr_subset_t : cff2_cs_opset_t<cff2_cs_opset_subr_subset_t, subr_subset_param_t>
+{
+  static void process_op (op_code_t op, cff2_cs_interp_env_t &env, subr_subset_param_t& param)
+  {
+    switch (op) {
+
+      case OpCode_return:
+	param.current_parsed_str->set_parsed ();
+	env.returnFromSubr ();
+	param.set_current_str (env, false);
+	break;
+
+      case OpCode_endchar:
+	param.current_parsed_str->set_parsed ();
+	SUPER::process_op (op, env, param);
+	break;
+
+      case OpCode_callsubr:
+	process_call_subr (op, CSType_LocalSubr, env, param, env.localSubrs, param.local_closure);
+	break;
+
+      case OpCode_callgsubr:
+	process_call_subr (op, CSType_GlobalSubr, env, param, env.globalSubrs, param.global_closure);
+	break;
+
+      default:
+	SUPER::process_op (op, env, param);
+	param.current_parsed_str->add_op (op, env.str_ref);
+	break;
+    }
+  }
+
+  protected:
+  static void process_call_subr (op_code_t op, cs_type_t type,
+				 cff2_cs_interp_env_t &env, subr_subset_param_t& param,
+				 cff2_biased_subrs_t& subrs, hb_set_t *closure)
+  {
+    byte_str_ref_t    str_ref = env.str_ref;
+    env.callSubr (subrs, type);
+    param.current_parsed_str->add_call_op (op, str_ref, env.context.subr_num);
+    hb_set_add (closure, env.context.subr_num);
+    param.set_current_str (env, true);
+  }
+
+  private:
+  typedef cff2_cs_opset_t<cff2_cs_opset_subr_subset_t, subr_subset_param_t> SUPER;
+};
+
+struct cff2_subr_subsetter_t : subr_subsetter_t<cff2_subr_subsetter_t, CFF2Subrs, const OT::cff2::accelerator_subset_t, cff2_cs_interp_env_t, cff2_cs_opset_subr_subset_t>
+{
+  static void finalize_parsed_str (cff2_cs_interp_env_t &env, subr_subset_param_t& param, parsed_cs_str_t &charstring)
+  {
+    /* vsindex is inserted at the beginning of the charstring as necessary */
+    if (env.seen_vsindex ())
+    {
+      number_t  ivs;
+      ivs.set_int ((int)env.get_ivs ());
+      charstring.set_prefix (ivs, OpCode_vsindexcs);
+    }
+  }
+};
+
+struct cff2_subset_plan {
+  cff2_subset_plan ()
+    : final_size (0),
+      orig_fdcount (0),
+      subset_fdcount(1),
+      subset_fdselect_format (0),
+      drop_hints (false),
+      desubroutinize (false)
+  {
+    subset_fdselect_ranges.init ();
+    fdmap.init ();
+    subset_charstrings.init ();
+    subset_globalsubrs.init ();
+    subset_localsubrs.init ();
+    privateDictInfos.init ();
+  }
+
+  ~cff2_subset_plan ()
+  {
+    subset_fdselect_ranges.fini ();
+    fdmap.fini ();
+    subset_charstrings.fini_deep ();
+    subset_globalsubrs.fini_deep ();
+    subset_localsubrs.fini_deep ();
+    privateDictInfos.fini ();
+  }
+
+  bool create (const OT::cff2::accelerator_subset_t &acc,
+	      hb_subset_plan_t *plan)
+  {
+    final_size = 0;
+    orig_fdcount = acc.fdArray->count;
+
+    drop_hints = plan->drop_hints;
+    desubroutinize = plan->desubroutinize;
+
+    /* CFF2 header */
+    final_size += OT::cff2::static_size;
+
+    /* top dict */
+    {
+      cff2_top_dict_op_serializer_t topSzr;
+      offsets.topDictInfo.size = TopDict::calculate_serialized_size (acc.topDict, topSzr);
+      final_size += offsets.topDictInfo.size;
+    }
+
+    if (desubroutinize)
+    {
+      /* Flatten global & local subrs */
+      subr_flattener_t<const OT::cff2::accelerator_subset_t, cff2_cs_interp_env_t, cff2_cs_opset_flatten_t>
+		    flattener(acc, plan->glyphs, plan->drop_hints);
+      if (!flattener.flatten (subset_charstrings))
+	return false;
+
+      /* no global/local subroutines */
+      offsets.globalSubrsInfo.size = CFF2Subrs::calculate_serialized_size (1, 0, 0);
+    }
+    else
+    {
+      /* Subset subrs: collect used subroutines, leaving all unused ones behind */
+      if (!subr_subsetter.subset (acc, plan->glyphs, plan->drop_hints))
+	return false;
+
+      /* encode charstrings, global subrs, local subrs with new subroutine numbers */
+      if (!subr_subsetter.encode_charstrings (acc, plan->glyphs, subset_charstrings))
+	return false;
+
+      if (!subr_subsetter.encode_globalsubrs (subset_globalsubrs))
+	return false;
+
+      /* global subrs */
+      unsigned int dataSize = subset_globalsubrs.total_size ();
+      offsets.globalSubrsInfo.offSize = calcOffSize (dataSize);
+      offsets.globalSubrsInfo.size = CFF2Subrs::calculate_serialized_size (offsets.globalSubrsInfo.offSize, subset_globalsubrs.length, dataSize);
+
+      /* local subrs */
+      if (!offsets.localSubrsInfos.resize (orig_fdcount))
+	return false;
+      if (!subset_localsubrs.resize (orig_fdcount))
+	return false;
+      for (unsigned int fd = 0; fd < orig_fdcount; fd++)
+      {
+	subset_localsubrs[fd].init ();
+	offsets.localSubrsInfos[fd].init ();
+	if (fdmap.includes (fd))
+	{
+	  if (!subr_subsetter.encode_localsubrs (fd, subset_localsubrs[fd]))
+	    return false;
+
+	  unsigned int dataSize = subset_localsubrs[fd].total_size ();
+	  if (dataSize > 0)
+	  {
+	    offsets.localSubrsInfos[fd].offset = final_size;
+	    offsets.localSubrsInfos[fd].offSize = calcOffSize (dataSize);
+	    offsets.localSubrsInfos[fd].size = CFF2Subrs::calculate_serialized_size (offsets.localSubrsInfos[fd].offSize, subset_localsubrs[fd].length, dataSize);
+	  }
+	}
+      }
+    }
+
+    /* global subrs */
+    offsets.globalSubrsInfo.offset = final_size;
+    final_size += offsets.globalSubrsInfo.size;
+
+    /* variation store */
+    if (acc.varStore != &Null(CFF2VariationStore))
+    {
+      offsets.varStoreOffset = final_size;
+      final_size += acc.varStore->get_size ();
+    }
+
+    /* FDSelect */
+    if (acc.fdSelect != &Null(CFF2FDSelect))
+    {
+      offsets.FDSelectInfo.offset = final_size;
+      if (unlikely (!hb_plan_subset_cff_fdselect (plan->glyphs,
+				  orig_fdcount,
+				  *(const FDSelect *)acc.fdSelect,
+				  subset_fdcount,
+				  offsets.FDSelectInfo.size,
+				  subset_fdselect_format,
+				  subset_fdselect_ranges,
+				  fdmap)))
+	return false;
+
+      final_size += offsets.FDSelectInfo.size;
+    }
+    else
+      fdmap.identity (1);
+
+    /* FDArray (FDIndex) */
+    {
+      offsets.FDArrayInfo.offset = final_size;
+      cff_font_dict_op_serializer_t fontSzr;
+      unsigned int dictsSize = 0;
+      for (unsigned int i = 0; i < acc.fontDicts.length; i++)
+	if (fdmap.includes (i))
+	  dictsSize += FontDict::calculate_serialized_size (acc.fontDicts[i], fontSzr);
+
+      offsets.FDArrayInfo.offSize = calcOffSize (dictsSize);
+      final_size += CFF2Index::calculate_serialized_size (offsets.FDArrayInfo.offSize, subset_fdcount, dictsSize);
+    }
+
+    /* CharStrings */
+    {
+      offsets.charStringsInfo.offset = final_size;
+      unsigned int dataSize = subset_charstrings.total_size ();
+      offsets.charStringsInfo.offSize = calcOffSize (dataSize);
+      final_size += CFF2CharStrings::calculate_serialized_size (offsets.charStringsInfo.offSize, plan->glyphs.length, dataSize);
+    }
+
+    /* private dicts & local subrs */
+    offsets.privateDictsOffset = final_size;
+    for (unsigned int i = 0; i < orig_fdcount; i++)
+    {
+      if (fdmap.includes (i))
+      {
+	bool  has_localsubrs = offsets.localSubrsInfos[i].size > 0;
+	cff_private_dict_op_serializer_t privSzr (desubroutinize, drop_hints);
+	unsigned int  priv_size = PrivateDict::calculate_serialized_size (acc.privateDicts[i], privSzr, has_localsubrs);
+	table_info_t  privInfo = { final_size, priv_size, 0 };
+	privateDictInfos.push (privInfo);
+	final_size += privInfo.size;
+
+	if (!plan->desubroutinize && has_localsubrs)
+	{
+	  offsets.localSubrsInfos[i].offset = final_size;
+	  final_size += offsets.localSubrsInfos[i].size;
+	}
+      }
+    }
+
+    return true;
+  }
+
+  unsigned int get_final_size () const  { return final_size; }
+
+  unsigned int	final_size;
+  cff2_sub_table_offsets_t offsets;
+
+  unsigned int    orig_fdcount;
+  unsigned int    subset_fdcount;
+  unsigned int    subset_fdselect_format;
+  hb_vector_t<code_pair_t>   subset_fdselect_ranges;
+
+  remap_t   fdmap;
+
+  str_buff_vec_t	    subset_charstrings;
+  str_buff_vec_t	    subset_globalsubrs;
+  hb_vector_t<str_buff_vec_t> subset_localsubrs;
+  hb_vector_t<table_info_t>  privateDictInfos;
+
+  bool	    drop_hints;
+  bool	    desubroutinize;
+  cff2_subr_subsetter_t       subr_subsetter;
+};
+
+static inline bool _write_cff2 (const cff2_subset_plan &plan,
+				const OT::cff2::accelerator_subset_t  &acc,
+				const hb_vector_t<hb_codepoint_t>& glyphs,
+				unsigned int dest_sz,
+				void *dest)
+{
+  hb_serialize_context_t c (dest, dest_sz);
+
+  OT::cff2 *cff2 = c.start_serialize<OT::cff2> ();
+  if (unlikely (!c.extend_min (*cff2)))
+    return false;
+
+  /* header */
+  cff2->version.major.set (0x02);
+  cff2->version.minor.set (0x00);
+  cff2->topDict.set (OT::cff2::static_size);
+
+  /* top dict */
+  {
+    assert (cff2->topDict == (unsigned) (c.head - c.start));
+    cff2->topDictSize.set (plan.offsets.topDictInfo.size);
+    TopDict &dict = cff2 + cff2->topDict;
+    cff2_top_dict_op_serializer_t topSzr;
+    if (unlikely (!dict.serialize (&c, acc.topDict, topSzr, plan.offsets)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 top dict");
+      return false;
+    }
+  }
+
+  /* global subrs */
+  {
+    assert (cff2->topDict + plan.offsets.topDictInfo.size == (unsigned) (c.head - c.start));
+    CFF2Subrs *dest = c.start_embed <CFF2Subrs> ();
+    if (unlikely (dest == nullptr)) return false;
+    if (unlikely (!dest->serialize (&c, plan.offsets.globalSubrsInfo.offSize, plan.subset_globalsubrs)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize global subroutines");
+      return false;
+    }
+  }
+
+  /* variation store */
+  if (acc.varStore != &Null(CFF2VariationStore))
+  {
+    assert (plan.offsets.varStoreOffset == (unsigned) (c.head - c.start));
+    CFF2VariationStore *dest = c.start_embed<CFF2VariationStore> ();
+    if (unlikely (!dest->serialize (&c, acc.varStore)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 Variation Store");
+      return false;
+    }
+  }
+
+  /* FDSelect */
+  if (acc.fdSelect != &Null(CFF2FDSelect))
+  {
+    assert (plan.offsets.FDSelectInfo.offset == (unsigned) (c.head - c.start));
+
+    if (unlikely (!hb_serialize_cff_fdselect (&c, glyphs.length, *(const FDSelect *)acc.fdSelect, acc.fdArray->count,
+					      plan.subset_fdselect_format, plan.offsets.FDSelectInfo.size,
+					      plan.subset_fdselect_ranges)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 subset FDSelect");
+      return false;
+    }
+  }
+
+  /* FDArray (FD Index) */
+  {
+    assert (plan.offsets.FDArrayInfo.offset == (unsigned) (c.head - c.start));
+    CFF2FDArray  *fda = c.start_embed<CFF2FDArray> ();
+    if (unlikely (fda == nullptr)) return false;
+    cff_font_dict_op_serializer_t  fontSzr;
+    if (unlikely (!fda->serialize (&c, plan.offsets.FDArrayInfo.offSize,
+				   acc.fontDicts, plan.subset_fdcount, plan.fdmap,
+				   fontSzr, plan.privateDictInfos)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 FDArray");
+      return false;
+    }
+  }
+
+  /* CharStrings */
+  {
+    assert (plan.offsets.charStringsInfo.offset == (unsigned) (c.head - c.start));
+    CFF2CharStrings  *cs = c.start_embed<CFF2CharStrings> ();
+    if (unlikely (cs == nullptr)) return false;
+    if (unlikely (!cs->serialize (&c, plan.offsets.charStringsInfo.offSize, plan.subset_charstrings)))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 CharStrings");
+      return false;
+    }
+  }
+
+  /* private dicts & local subrs */
+  assert (plan.offsets.privateDictsOffset == (unsigned) (c.head - c.start));
+  for (unsigned int i = 0; i < acc.privateDicts.length; i++)
+  {
+    if (plan.fdmap.includes (i))
+    {
+      PrivateDict  *pd = c.start_embed<PrivateDict> ();
+      if (unlikely (pd == nullptr)) return false;
+      unsigned int priv_size = plan.privateDictInfos[plan.fdmap[i]].size;
+      bool result;
+      cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints);
+      /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */
+      unsigned int  subroffset = (plan.offsets.localSubrsInfos[i].size > 0)? priv_size: 0;
+      result = pd->serialize (&c, acc.privateDicts[i], privSzr, subroffset);
+      if (unlikely (!result))
+      {
+	DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF Private Dict[%d]", i);
+	return false;
+      }
+      if (plan.offsets.localSubrsInfos[i].size > 0)
+      {
+	CFF2Subrs *dest = c.start_embed <CFF2Subrs> ();
+	if (unlikely (dest == nullptr)) return false;
+	if (unlikely (!dest->serialize (&c, plan.offsets.localSubrsInfos[i].offSize, plan.subset_localsubrs[i])))
+	{
+	  DEBUG_MSG (SUBSET, nullptr, "failed to serialize local subroutines");
+	  return false;
+	}
+      }
+    }
+  }
+
+  assert (c.head == c.end);
+  c.end_serialize ();
+
+  return true;
+}
+
+static bool
+_hb_subset_cff2 (const OT::cff2::accelerator_subset_t  &acc,
+		const char		      *data,
+		hb_subset_plan_t		*plan,
+		hb_blob_t		       **prime /* OUT */)
+{
+  cff2_subset_plan cff2_plan;
+
+  if (unlikely (!cff2_plan.create (acc, plan)))
+  {
+    DEBUG_MSG(SUBSET, nullptr, "Failed to generate a cff2 subsetting plan.");
+    return false;
+  }
+
+  unsigned int  cff2_prime_size = cff2_plan.get_final_size ();
+  char *cff2_prime_data = (char *) calloc (1, cff2_prime_size);
+
+  if (unlikely (!_write_cff2 (cff2_plan, acc, plan->glyphs,
+			      cff2_prime_size, cff2_prime_data))) {
+    DEBUG_MSG(SUBSET, nullptr, "Failed to write a subset cff2.");
+    free (cff2_prime_data);
+    return false;
+  }
+
+  *prime = hb_blob_create (cff2_prime_data,
+				cff2_prime_size,
+				HB_MEMORY_MODE_READONLY,
+				cff2_prime_data,
+				free);
+  return true;
+}
+
+/**
+ * hb_subset_cff2:
+ * Subsets the CFF2 table according to a provided plan.
+ *
+ * Return value: subsetted cff2 table.
+ **/
+bool
+hb_subset_cff2 (hb_subset_plan_t *plan,
+		hb_blob_t       **prime /* OUT */)
+{
+  hb_blob_t *cff2_blob = hb_sanitize_context_t().reference_table<CFF::cff2> (plan->source);
+  const char *data = hb_blob_get_data(cff2_blob, nullptr);
+
+  OT::cff2::accelerator_subset_t acc;
+  acc.init(plan->source);
+  bool result = likely (acc.is_valid ()) &&
+		_hb_subset_cff2 (acc, data, plan, prime);
+
+  hb_blob_destroy (cff2_blob);
+  acc.fini ();
+
+  return result;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff2.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff2.hh
new file mode 100644
index 0000000..a07dc29
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-cff2.hh
@@ -0,0 +1,38 @@
+/*
+ * Copyright © 2018 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_SUBSET_CFF2_HH
+#define HB_SUBSET_CFF2_HH
+
+#include "hb.hh"
+
+#include "hb-subset-plan.hh"
+
+HB_INTERNAL bool
+hb_subset_cff2 (hb_subset_plan_t *plan,
+	       hb_blob_t       **cff2_prime /* OUT */);
+
+#endif /* HB_SUBSET_CFF2_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-glyf.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-glyf.cc
new file mode 100644
index 0000000..cca364d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-glyf.cc
@@ -0,0 +1,310 @@
+/*
+ * Copyright © 2018  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): Garret Rieger, Roderick Sheeter
+ */
+
+#include "hb-open-type.hh"
+#include "hb-ot-glyf-table.hh"
+#include "hb-set.h"
+#include "hb-subset-glyf.hh"
+
+static bool
+_calculate_glyf_and_loca_prime_size (const OT::glyf::accelerator_t &glyf,
+				     hb_vector_t<hb_codepoint_t> &glyph_ids,
+				     hb_bool_t drop_hints,
+				     bool *use_short_loca /* OUT */,
+				     unsigned int *glyf_size /* OUT */,
+				     unsigned int *loca_size /* OUT */,
+				     hb_vector_t<unsigned int> *instruction_ranges /* OUT */)
+{
+  unsigned int total = 0;
+  for (unsigned int i = 0; i < glyph_ids.length; i++)
+  {
+    hb_codepoint_t next_glyph = glyph_ids[i];
+    if (!instruction_ranges->resize (instruction_ranges->length + 2))
+    {
+      DEBUG_MSG(SUBSET, nullptr, "Failed to resize instruction_ranges.");
+      return false;
+    }
+    unsigned int *instruction_start = &(*instruction_ranges)[instruction_ranges->length - 2];
+    *instruction_start = 0;
+    unsigned int *instruction_end = &(*instruction_ranges)[instruction_ranges->length - 1];
+    *instruction_end = 0;
+
+    unsigned int start_offset, end_offset;
+    if (unlikely (!(glyf.get_offsets (next_glyph, &start_offset, &end_offset) &&
+		    glyf.remove_padding (start_offset, &end_offset))))
+    {
+      DEBUG_MSG(SUBSET, nullptr, "Invalid gid %d", next_glyph);
+      continue;
+    }
+    if (end_offset - start_offset < OT::glyf::GlyphHeader::static_size)
+      continue; /* 0-length glyph */
+
+    if (drop_hints)
+    {
+      if (unlikely (!glyf.get_instruction_offsets (start_offset, end_offset,
+						   instruction_start, instruction_end)))
+      {
+	DEBUG_MSG(SUBSET, nullptr, "Unable to get instruction offsets for %d", next_glyph);
+	return false;
+      }
+    }
+
+    total += end_offset - start_offset - (*instruction_end - *instruction_start);
+    /* round2 so short loca will work */
+    total += total % 2;
+  }
+
+  *glyf_size = total;
+  *use_short_loca = (total <= 131070);
+  *loca_size = (glyph_ids.length + 1)
+      * (*use_short_loca ? sizeof (OT::HBUINT16) : sizeof (OT::HBUINT32));
+
+  DEBUG_MSG(SUBSET, nullptr, "preparing to subset glyf: final size %d, loca size %d, using %s loca",
+	    total,
+	    *loca_size,
+	    *use_short_loca ? "short" : "long");
+  return true;
+}
+
+static bool
+_write_loca_entry (unsigned int  id,
+		   unsigned int  offset,
+		   bool          is_short,
+		   void         *loca_prime,
+		   unsigned int  loca_size)
+{
+  unsigned int entry_size = is_short ? sizeof (OT::HBUINT16) : sizeof (OT::HBUINT32);
+  if ((id + 1) * entry_size <= loca_size)
+  {
+    if (is_short) {
+      ((OT::HBUINT16*) loca_prime) [id].set (offset / 2);
+    } else {
+      ((OT::HBUINT32*) loca_prime) [id].set (offset);
+    }
+    return true;
+  }
+
+  // Offset was not written because the write is out of bounds.
+  DEBUG_MSG(SUBSET,
+	    nullptr,
+	    "WARNING: Attempted to write an out of bounds loca entry at index %d. Loca size is %d.",
+	    id,
+	    loca_size);
+  return false;
+}
+
+static void
+_update_components (hb_subset_plan_t * plan,
+		    char * glyph_start,
+		    unsigned int length)
+{
+  OT::glyf::CompositeGlyphHeader::Iterator iterator;
+  if (OT::glyf::CompositeGlyphHeader::get_iterator (glyph_start,
+						    length,
+						    &iterator))
+  {
+    do
+    {
+      hb_codepoint_t new_gid;
+      if (!plan->new_gid_for_old_gid (iterator.current->glyphIndex,
+				      &new_gid))
+	continue;
+
+      ((OT::glyf::CompositeGlyphHeader *) iterator.current)->glyphIndex.set (new_gid);
+    } while (iterator.move_to_next ());
+  }
+}
+
+static bool _remove_composite_instruction_flag (char *glyf_prime, unsigned int length)
+{
+  /* remove WE_HAVE_INSTRUCTIONS from flags in dest */
+  OT::glyf::CompositeGlyphHeader::Iterator composite_it;
+  if (unlikely (!OT::glyf::CompositeGlyphHeader::get_iterator (glyf_prime, length, &composite_it))) return false;
+  const OT::glyf::CompositeGlyphHeader *glyph;
+  do {
+    glyph = composite_it.current;
+    OT::HBUINT16 *flags = const_cast<OT::HBUINT16 *> (&glyph->flags);
+    flags->set ( (uint16_t) *flags & ~OT::glyf::CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS);
+  } while (composite_it.move_to_next ());
+  return true;
+}
+
+static bool
+_write_glyf_and_loca_prime (hb_subset_plan_t              *plan,
+			    const OT::glyf::accelerator_t &glyf,
+			    const char                    *glyf_data,
+			    bool                           use_short_loca,
+			    hb_vector_t<unsigned int> &instruction_ranges,
+			    unsigned int                   glyf_prime_size,
+			    char                          *glyf_prime_data /* OUT */,
+			    unsigned int                   loca_prime_size,
+			    char                          *loca_prime_data /* OUT */)
+{
+  hb_vector_t<hb_codepoint_t> &glyph_ids = plan->glyphs;
+  char *glyf_prime_data_next = glyf_prime_data;
+
+  bool success = true;
+  for (unsigned int i = 0; i < glyph_ids.length; i++)
+  {
+    unsigned int start_offset, end_offset;
+    if (unlikely (!(glyf.get_offsets (glyph_ids[i], &start_offset, &end_offset) &&
+		    glyf.remove_padding (start_offset, &end_offset))))
+      end_offset = start_offset = 0;
+
+    unsigned int instruction_start = instruction_ranges[i * 2];
+    unsigned int instruction_end = instruction_ranges[i * 2 + 1];
+
+    int length = end_offset - start_offset - (instruction_end - instruction_start);
+
+    if (glyf_prime_data_next + length > glyf_prime_data + glyf_prime_size)
+    {
+      DEBUG_MSG(SUBSET,
+		 nullptr,
+		 "WARNING: Attempted to write an out of bounds glyph entry for gid %d (length %d)",
+		 i, length);
+      return false;
+    }
+
+    if (instruction_start == instruction_end)
+      memcpy (glyf_prime_data_next, glyf_data + start_offset, length);
+    else
+    {
+      memcpy (glyf_prime_data_next, glyf_data + start_offset, instruction_start - start_offset);
+      memcpy (glyf_prime_data_next + instruction_start - start_offset, glyf_data + instruction_end, end_offset - instruction_end);
+      /* if the instructions end at the end this was a composite glyph, else simple */
+      if (instruction_end == end_offset)
+      {
+	if (unlikely (!_remove_composite_instruction_flag (glyf_prime_data_next, length))) return false;
+      }
+      else
+	/* zero instruction length, which is just before instruction_start */
+	memset (glyf_prime_data_next + instruction_start - start_offset - 2, 0, 2);
+    }
+
+    success = success && _write_loca_entry (i,
+					    glyf_prime_data_next - glyf_prime_data,
+					    use_short_loca,
+					    loca_prime_data,
+					    loca_prime_size);
+    _update_components (plan, glyf_prime_data_next, length);
+
+    // TODO: don't align to two bytes if using long loca.
+    glyf_prime_data_next += length + (length % 2); // Align to 2 bytes for short loca.
+  }
+
+  success = success && _write_loca_entry (glyph_ids.length,
+					  glyf_prime_data_next - glyf_prime_data,
+					  use_short_loca,
+					  loca_prime_data,
+					  loca_prime_size);
+  return success;
+}
+
+static bool
+_hb_subset_glyf_and_loca (const OT::glyf::accelerator_t  &glyf,
+			  const char                     *glyf_data,
+			  hb_subset_plan_t               *plan,
+			  bool                           *use_short_loca,
+			  hb_blob_t                     **glyf_prime /* OUT */,
+			  hb_blob_t                     **loca_prime /* OUT */)
+{
+  // TODO(grieger): Sanity check allocation size for the new table.
+  hb_vector_t<hb_codepoint_t> &glyphs_to_retain = plan->glyphs;
+
+  unsigned int glyf_prime_size;
+  unsigned int loca_prime_size;
+  hb_vector_t<unsigned int> instruction_ranges;
+  instruction_ranges.init ();
+
+  if (unlikely (!_calculate_glyf_and_loca_prime_size (glyf,
+						      glyphs_to_retain,
+						      plan->drop_hints,
+						      use_short_loca,
+						      &glyf_prime_size,
+						      &loca_prime_size,
+						      &instruction_ranges))) {
+    instruction_ranges.fini ();
+    return false;
+  }
+
+  char *glyf_prime_data = (char *) calloc (1, glyf_prime_size);
+  char *loca_prime_data = (char *) calloc (1, loca_prime_size);
+  if (unlikely (!_write_glyf_and_loca_prime (plan, glyf, glyf_data,
+					     *use_short_loca,
+					     instruction_ranges,
+					     glyf_prime_size, glyf_prime_data,
+					     loca_prime_size, loca_prime_data))) {
+    free (glyf_prime_data);
+    free (loca_prime_data);
+    instruction_ranges.fini ();
+    return false;
+  }
+  instruction_ranges.fini ();
+
+  *glyf_prime = hb_blob_create (glyf_prime_data,
+				glyf_prime_size,
+				HB_MEMORY_MODE_READONLY,
+				glyf_prime_data,
+				free);
+  *loca_prime = hb_blob_create (loca_prime_data,
+				loca_prime_size,
+				HB_MEMORY_MODE_READONLY,
+				loca_prime_data,
+				free);
+  return true;
+}
+
+/**
+ * hb_subset_glyf:
+ * Subsets the glyph table according to a provided plan.
+ *
+ * Return value: subsetted glyf table.
+ *
+ * Since: 1.7.5
+ **/
+bool
+hb_subset_glyf_and_loca (hb_subset_plan_t *plan,
+			 bool             *use_short_loca, /* OUT */
+			 hb_blob_t       **glyf_prime, /* OUT */
+			 hb_blob_t       **loca_prime /* OUT */)
+{
+  hb_blob_t *glyf_blob = hb_sanitize_context_t ().reference_table<OT::glyf> (plan->source);
+  const char *glyf_data = hb_blob_get_data (glyf_blob, nullptr);
+
+  OT::glyf::accelerator_t glyf;
+  glyf.init (plan->source);
+  bool result = _hb_subset_glyf_and_loca (glyf,
+					  glyf_data,
+					  plan,
+					  use_short_loca,
+					  glyf_prime,
+					  loca_prime);
+
+  hb_blob_destroy (glyf_blob);
+  glyf.fini ();
+
+  return result;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-glyf.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-glyf.hh
new file mode 100644
index 0000000..99cf8f0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-glyf.hh
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2018  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): Garret Rieger
+ */
+
+#ifndef HB_SUBSET_GLYF_HH
+#define HB_SUBSET_GLYF_HH
+
+#include "hb.hh"
+
+#include "hb-subset.hh"
+
+HB_INTERNAL bool
+hb_subset_glyf_and_loca (hb_subset_plan_t *plan,
+			 bool             *use_short_loca, /* OUT */
+			 hb_blob_t       **glyf_prime      /* OUT */,
+			 hb_blob_t       **loca_prime      /* OUT */);
+
+#endif /* HB_SUBSET_GLYF_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-input.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-input.cc
new file mode 100644
index 0000000..f718a56
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-input.cc
@@ -0,0 +1,146 @@
+/*
+ * Copyright © 2018  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): Garret Rieger, Rod Sheeter, Behdad Esfahbod
+ */
+
+#include "hb-subset.hh"
+#include "hb-set.hh"
+
+/**
+ * hb_subset_input_create_or_fail:
+ *
+ * Return value: New subset input.
+ *
+ * Since: 1.8.0
+ **/
+hb_subset_input_t *
+hb_subset_input_create_or_fail ()
+{
+  hb_subset_input_t *input = hb_object_create<hb_subset_input_t>();
+
+  if (unlikely (!input))
+    return nullptr;
+
+  input->unicodes = hb_set_create ();
+  input->glyphs = hb_set_create ();
+  input->drop_layout = true;
+
+  return input;
+}
+
+/**
+ * hb_subset_input_reference: (skip)
+ * @subset_input: a subset_input.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.8.0
+ **/
+hb_subset_input_t *
+hb_subset_input_reference (hb_subset_input_t *subset_input)
+{
+  return hb_object_reference (subset_input);
+}
+
+/**
+ * hb_subset_input_destroy:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+void
+hb_subset_input_destroy (hb_subset_input_t *subset_input)
+{
+  if (!hb_object_destroy (subset_input)) return;
+
+  hb_set_destroy (subset_input->unicodes);
+  hb_set_destroy (subset_input->glyphs);
+
+  free (subset_input);
+}
+
+/**
+ * hb_subset_input_unicode_set:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+HB_EXTERN hb_set_t *
+hb_subset_input_unicode_set (hb_subset_input_t *subset_input)
+{
+  return subset_input->unicodes;
+}
+
+/**
+ * hb_subset_input_glyph_set:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+HB_EXTERN hb_set_t *
+hb_subset_input_glyph_set (hb_subset_input_t *subset_input)
+{
+  return subset_input->glyphs;
+}
+
+HB_EXTERN void
+hb_subset_input_set_drop_hints (hb_subset_input_t *subset_input,
+				hb_bool_t drop_hints)
+{
+  subset_input->drop_hints = drop_hints;
+}
+
+HB_EXTERN hb_bool_t
+hb_subset_input_get_drop_hints (hb_subset_input_t *subset_input)
+{
+  return subset_input->drop_hints;
+}
+
+HB_EXTERN void
+hb_subset_input_set_drop_layout (hb_subset_input_t *subset_input,
+				 hb_bool_t drop_layout)
+{
+  subset_input->drop_layout = drop_layout;
+}
+
+HB_EXTERN hb_bool_t
+hb_subset_input_get_drop_layout (hb_subset_input_t *subset_input)
+{
+  return subset_input->drop_layout;
+}
+
+HB_EXTERN void
+hb_subset_input_set_desubroutinize (hb_subset_input_t *subset_input,
+        hb_bool_t desubroutinize)
+{
+  subset_input->desubroutinize = desubroutinize;
+}
+
+HB_EXTERN hb_bool_t
+hb_subset_input_get_desubroutinize (hb_subset_input_t *subset_input)
+{
+  return subset_input->desubroutinize;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-input.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-input.hh
new file mode 100644
index 0000000..8dad94f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-input.hh
@@ -0,0 +1,57 @@
+/*
+ * Copyright © 2018  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): Garret Rieger, Roderick Sheeter
+ */
+
+#ifndef HB_SUBSET_INPUT_HH
+#define HB_SUBSET_INPUT_HH
+
+
+#include "hb.hh"
+
+#include "hb-subset.h"
+
+#include "hb-font.hh"
+
+struct hb_subset_input_t
+{
+  hb_object_header_t header;
+
+  hb_set_t *unicodes;
+  hb_set_t *glyphs;
+
+  bool drop_hints : 1;
+  bool drop_layout : 1;
+  bool desubroutinize : 1;
+  /* TODO
+   *
+   * features
+   * lookups
+   * nameIDs
+   * ...
+   */
+};
+
+
+#endif /* HB_SUBSET_INPUT_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-plan.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-plan.cc
new file mode 100644
index 0000000..cff3426
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-plan.cc
@@ -0,0 +1,223 @@
+/*
+ * Copyright © 2018  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): Garret Rieger, Roderick Sheeter
+ */
+
+#include "hb-subset-plan.hh"
+#include "hb-map.hh"
+#include "hb-set.hh"
+
+#include "hb-ot-cmap-table.hh"
+#include "hb-ot-glyf-table.hh"
+#include "hb-ot-cff1-table.hh"
+
+static void
+_add_gid_and_children (const OT::glyf::accelerator_t &glyf,
+		       hb_codepoint_t gid,
+		       hb_set_t *gids_to_retain)
+{
+  if (hb_set_has (gids_to_retain, gid))
+    // Already visited this gid, ignore.
+    return;
+
+  hb_set_add (gids_to_retain, gid);
+
+  OT::glyf::CompositeGlyphHeader::Iterator composite;
+  if (glyf.get_composite (gid, &composite))
+  {
+    do
+    {
+      _add_gid_and_children (glyf, (hb_codepoint_t) composite.current->glyphIndex, gids_to_retain);
+    } while (composite.move_to_next());
+  }
+}
+
+static void
+_add_cff_seac_components (const OT::cff1::accelerator_t &cff,
+           hb_codepoint_t gid,
+           hb_set_t *gids_to_retain)
+{
+  hb_codepoint_t base_gid, accent_gid;
+  if (cff.get_seac_components (gid, &base_gid, &accent_gid))
+  {
+    hb_set_add (gids_to_retain, base_gid);
+    hb_set_add (gids_to_retain, accent_gid);
+  }
+}
+
+static void
+_gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain)
+{
+  hb_set_t lookup_indices;
+  hb_ot_layout_collect_lookups (face,
+				HB_OT_TAG_GSUB,
+				nullptr,
+				nullptr,
+				nullptr,
+				&lookup_indices);
+  hb_ot_layout_lookups_substitute_closure (face,
+					   &lookup_indices,
+					   gids_to_retain);
+}
+
+static void
+_remove_invalid_gids (hb_set_t *glyphs,
+		      unsigned int num_glyphs)
+{
+  hb_codepoint_t gid = HB_SET_VALUE_INVALID;
+  while (glyphs->next (&gid))
+  {
+    if (gid >= num_glyphs)
+      glyphs->del (gid);
+  }
+}
+
+static hb_set_t *
+_populate_gids_to_retain (hb_face_t *face,
+			  const hb_set_t *unicodes,
+			  bool close_over_gsub,
+			  hb_set_t *unicodes_to_retain,
+			  hb_map_t *codepoint_to_glyph,
+			  hb_vector_t<hb_codepoint_t> *glyphs)
+{
+  OT::cmap::accelerator_t cmap;
+  OT::glyf::accelerator_t glyf;
+  OT::cff1::accelerator_t cff;
+  cmap.init (face);
+  glyf.init (face);
+  cff.init (face);
+
+  hb_set_t *initial_gids_to_retain = hb_set_create ();
+  initial_gids_to_retain->add (0); // Not-def
+
+  hb_codepoint_t cp = HB_SET_VALUE_INVALID;
+  while (unicodes->next (&cp))
+  {
+    hb_codepoint_t gid;
+    if (!cmap.get_nominal_glyph (cp, &gid))
+    {
+      DEBUG_MSG(SUBSET, nullptr, "Drop U+%04X; no gid", cp);
+      continue;
+    }
+    unicodes_to_retain->add (cp);
+    codepoint_to_glyph->set (cp, gid);
+    initial_gids_to_retain->add (gid);
+  }
+
+  if (close_over_gsub)
+    // Add all glyphs needed for GSUB substitutions.
+    _gsub_closure (face, initial_gids_to_retain);
+
+  // Populate a full set of glyphs to retain by adding all referenced
+  // composite glyphs.
+  hb_codepoint_t gid = HB_SET_VALUE_INVALID;
+  hb_set_t *all_gids_to_retain = hb_set_create ();
+  while (initial_gids_to_retain->next (&gid))
+  {
+    _add_gid_and_children (glyf, gid, all_gids_to_retain);
+    if (cff.is_valid ())
+      _add_cff_seac_components (cff, gid, all_gids_to_retain);
+  }
+  hb_set_destroy (initial_gids_to_retain);
+
+  _remove_invalid_gids (all_gids_to_retain, face->get_num_glyphs ());
+
+  glyphs->alloc (all_gids_to_retain->get_population ());
+  gid = HB_SET_VALUE_INVALID;
+  while (all_gids_to_retain->next (&gid))
+    glyphs->push (gid);
+
+  cff.fini ();
+  glyf.fini ();
+  cmap.fini ();
+
+  return all_gids_to_retain;
+}
+
+static void
+_create_old_gid_to_new_gid_map (const hb_vector_t<hb_codepoint_t> &glyphs,
+				hb_map_t *glyph_map)
+{
+  for (unsigned int i = 0; i < glyphs.length; i++) {
+    glyph_map->set (glyphs[i], i);
+  }
+}
+
+/**
+ * hb_subset_plan_create:
+ * Computes a plan for subsetting the supplied face according
+ * to a provided input. The plan describes
+ * which tables and glyphs should be retained.
+ *
+ * Return value: New subset plan.
+ *
+ * Since: 1.7.5
+ **/
+hb_subset_plan_t *
+hb_subset_plan_create (hb_face_t           *face,
+		       hb_subset_input_t   *input)
+{
+  hb_subset_plan_t *plan = hb_object_create<hb_subset_plan_t> ();
+
+  plan->drop_hints = input->drop_hints;
+  plan->drop_layout = input->drop_layout;
+  plan->desubroutinize = input->desubroutinize;
+  plan->unicodes = hb_set_create();
+  plan->glyphs.init();
+  plan->source = hb_face_reference (face);
+  plan->dest = hb_face_builder_create ();
+  plan->codepoint_to_glyph = hb_map_create();
+  plan->glyph_map = hb_map_create();
+  plan->glyphset = _populate_gids_to_retain (face,
+					     input->unicodes,
+					     !plan->drop_layout,
+					     plan->unicodes,
+					     plan->codepoint_to_glyph,
+					     &plan->glyphs);
+  _create_old_gid_to_new_gid_map (plan->glyphs,
+				  plan->glyph_map);
+
+  return plan;
+}
+
+/**
+ * hb_subset_plan_destroy:
+ *
+ * Since: 1.7.5
+ **/
+void
+hb_subset_plan_destroy (hb_subset_plan_t *plan)
+{
+  if (!hb_object_destroy (plan)) return;
+
+  hb_set_destroy (plan->unicodes);
+  plan->glyphs.fini ();
+  hb_face_destroy (plan->source);
+  hb_face_destroy (plan->dest);
+  hb_map_destroy (plan->codepoint_to_glyph);
+  hb_map_destroy (plan->glyph_map);
+  hb_set_destroy (plan->glyphset);
+
+  free (plan);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-plan.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-plan.hh
new file mode 100644
index 0000000..a710a4d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset-plan.hh
@@ -0,0 +1,102 @@
+/*
+ * Copyright © 2018  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): Garret Rieger, Roderick Sheeter
+ */
+
+#ifndef HB_SUBSET_PLAN_HH
+#define HB_SUBSET_PLAN_HH
+
+#include "hb.hh"
+
+#include "hb-subset.h"
+#include "hb-subset-input.hh"
+
+#include "hb-map.hh"
+
+struct hb_subset_plan_t
+{
+  hb_object_header_t header;
+
+  bool drop_hints : 1;
+  bool drop_layout : 1;
+  bool desubroutinize : 1;
+
+  // For each cp that we'd like to retain maps to the corresponding gid.
+  hb_set_t *unicodes;
+
+  hb_vector_t<hb_codepoint_t> glyphs;
+  hb_set_t *glyphset;
+
+  hb_map_t *codepoint_to_glyph;
+  hb_map_t *glyph_map;
+
+  // Plan is only good for a specific source/dest so keep them with it
+  hb_face_t *source;
+  hb_face_t *dest;
+
+  bool new_gid_for_codepoint (hb_codepoint_t codepoint,
+			      hb_codepoint_t *new_gid) const
+  {
+    hb_codepoint_t old_gid = codepoint_to_glyph->get (codepoint);
+    if (old_gid == HB_MAP_VALUE_INVALID)
+      return false;
+
+    return new_gid_for_old_gid (old_gid, new_gid);
+  }
+
+  bool new_gid_for_old_gid (hb_codepoint_t old_gid,
+			    hb_codepoint_t *new_gid) const
+  {
+    hb_codepoint_t gid = glyph_map->get (old_gid);
+    if (gid == HB_MAP_VALUE_INVALID)
+      return false;
+
+    *new_gid = gid;
+    return true;
+  }
+
+  bool
+  add_table (hb_tag_t tag,
+	     hb_blob_t *contents)
+  {
+    hb_blob_t *source_blob = source->reference_table (tag);
+    DEBUG_MSG(SUBSET, nullptr, "add table %c%c%c%c, dest %d bytes, source %d bytes",
+	      HB_UNTAG(tag),
+	      hb_blob_get_length (contents),
+	      hb_blob_get_length (source_blob));
+    hb_blob_destroy (source_blob);
+    return hb_face_builder_add_table (dest, tag, contents);
+  }
+};
+
+typedef struct hb_subset_plan_t hb_subset_plan_t;
+
+HB_INTERNAL hb_subset_plan_t *
+hb_subset_plan_create (hb_face_t           *face,
+                       hb_subset_input_t   *input);
+
+HB_INTERNAL void
+hb_subset_plan_destroy (hb_subset_plan_t *plan);
+
+#endif /* HB_SUBSET_PLAN_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset.cc
new file mode 100644
index 0000000..37e7cec
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset.cc
@@ -0,0 +1,293 @@
+/*
+ * Copyright © 2018  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): Garret Rieger, Rod Sheeter, Behdad Esfahbod
+ */
+
+#include "hb.hh"
+#include "hb-open-type.hh"
+
+#include "hb-subset.hh"
+#include "hb-subset-glyf.hh"
+
+#include "hb-open-file.hh"
+#include "hb-ot-cmap-table.hh"
+#include "hb-ot-glyf-table.hh"
+#include "hb-ot-hdmx-table.hh"
+#include "hb-ot-head-table.hh"
+#include "hb-ot-hhea-table.hh"
+#include "hb-ot-hmtx-table.hh"
+#include "hb-ot-maxp-table.hh"
+#include "hb-ot-os2-table.hh"
+#include "hb-ot-post-table.hh"
+#include "hb-ot-cff1-table.hh"
+#include "hb-ot-cff2-table.hh"
+#include "hb-ot-vorg-table.hh"
+#include "hb-ot-layout-gsub-table.hh"
+#include "hb-ot-layout-gpos-table.hh"
+
+
+static unsigned int
+_plan_estimate_subset_table_size (hb_subset_plan_t *plan,
+				  unsigned int table_len)
+{
+  unsigned int src_glyphs = plan->source->get_num_glyphs ();
+  unsigned int dst_glyphs = plan->glyphset->get_population ();
+
+  if (unlikely (!src_glyphs))
+    return 512 + table_len;
+
+  return 512 + (unsigned int) (table_len * sqrt ((double) dst_glyphs / src_glyphs));
+}
+
+template<typename TableType>
+static bool
+_subset2 (hb_subset_plan_t *plan)
+{
+  hb_blob_t *source_blob = hb_sanitize_context_t ().reference_table<TableType> (plan->source);
+  const TableType *table = source_blob->as<TableType> ();
+
+  hb_tag_t tag = TableType::tableTag;
+  hb_bool_t result = false;
+  if (source_blob->data)
+  {
+    hb_vector_t<char> buf;
+    unsigned int buf_size = _plan_estimate_subset_table_size (plan, source_blob->length);
+    DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c initial estimated table size: %u bytes.", HB_UNTAG (tag), buf_size);
+    if (unlikely (!buf.alloc (buf_size)))
+    {
+      DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c failed to allocate %u bytes.", HB_UNTAG (tag), buf_size);
+      return false;
+    }
+  retry:
+    hb_serialize_context_t serializer ((void *) buf, buf_size);
+    hb_subset_context_t c (plan, &serializer);
+    result = table->subset (&c);
+    if (serializer.in_error ())
+    {
+      buf_size += (buf_size >> 1) + 32;
+      DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c ran out of room; reallocating to %u bytes.", HB_UNTAG (tag), buf_size);
+      if (unlikely (!buf.alloc (buf_size)))
+      {
+	DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c failed to reallocate %u bytes.", HB_UNTAG (tag), buf_size);
+	return false;
+      }
+      goto retry;
+    }
+    if (result)
+    {
+      hb_blob_t *dest_blob = serializer.copy_blob ();
+      DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c final subset table size: %u bytes.", HB_UNTAG (tag), dest_blob->length);
+      result = c.plan->add_table (tag, dest_blob);
+      hb_blob_destroy (dest_blob);
+    }
+    else
+    {
+      DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset table subsetted to empty.", HB_UNTAG (tag));
+      result = true;
+    }
+  }
+  else
+    DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset sanitize failed on source table.", HB_UNTAG (tag));
+
+  hb_blob_destroy (source_blob);
+  DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset %s", HB_UNTAG (tag), result ? "success" : "FAILED!");
+  return result;
+}
+
+template<typename TableType>
+static bool
+_subset (hb_subset_plan_t *plan)
+{
+  hb_blob_t *source_blob = hb_sanitize_context_t ().reference_table<TableType> (plan->source);
+  const TableType *table = source_blob->as<TableType> ();
+
+  hb_tag_t tag = TableType::tableTag;
+  hb_bool_t result = false;
+  if (source_blob->data)
+    result = table->subset (plan);
+  else
+    DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset sanitize failed on source table.", HB_UNTAG (tag));
+
+  hb_blob_destroy (source_blob);
+  DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset %s", HB_UNTAG (tag), result ? "success" : "FAILED!");
+  return result;
+}
+
+
+static bool
+_subset_table (hb_subset_plan_t *plan,
+	       hb_tag_t          tag)
+{
+  DEBUG_MSG(SUBSET, nullptr, "begin subset %c%c%c%c", HB_UNTAG (tag));
+  bool result = true;
+  switch (tag) {
+    case HB_OT_TAG_glyf:
+      result = _subset<const OT::glyf> (plan);
+      break;
+    case HB_OT_TAG_hdmx:
+      result = _subset<const OT::hdmx> (plan);
+      break;
+    case HB_OT_TAG_head:
+      // TODO that won't work well if there is no glyf
+      DEBUG_MSG(SUBSET, nullptr, "skip head, handled by glyf");
+      result = true;
+      break;
+    case HB_OT_TAG_hhea:
+      DEBUG_MSG(SUBSET, nullptr, "skip hhea handled by hmtx");
+      return true;
+    case HB_OT_TAG_hmtx:
+      result = _subset<const OT::hmtx> (plan);
+      break;
+    case HB_OT_TAG_vhea:
+      DEBUG_MSG(SUBSET, nullptr, "skip vhea handled by vmtx");
+      return true;
+    case HB_OT_TAG_vmtx:
+      result = _subset<const OT::vmtx> (plan);
+      break;
+    case HB_OT_TAG_maxp:
+      result = _subset<const OT::maxp> (plan);
+      break;
+    case HB_OT_TAG_loca:
+      DEBUG_MSG(SUBSET, nullptr, "skip loca handled by glyf");
+      return true;
+    case HB_OT_TAG_cmap:
+      result = _subset<const OT::cmap> (plan);
+      break;
+    case HB_OT_TAG_OS2:
+      result = _subset<const OT::OS2> (plan);
+      break;
+    case HB_OT_TAG_post:
+      result = _subset<const OT::post> (plan);
+      break;
+    case HB_OT_TAG_cff1:
+      result = _subset<const OT::cff1> (plan);
+      break;
+    case HB_OT_TAG_cff2:
+      result = _subset<const OT::cff2> (plan);
+      break;
+    case HB_OT_TAG_VORG:
+      result = _subset<const OT::VORG> (plan);
+      break;
+    case HB_OT_TAG_GDEF:
+      result = _subset2<const OT::GDEF> (plan);
+      break;
+    case HB_OT_TAG_GSUB:
+      result = _subset2<const OT::GSUB> (plan);
+      break;
+    case HB_OT_TAG_GPOS:
+      result = _subset2<const OT::GPOS> (plan);
+      break;
+
+    default:
+      hb_blob_t *source_table = hb_face_reference_table (plan->source, tag);
+      if (likely (source_table))
+	result = plan->add_table (tag, source_table);
+      else
+	result = false;
+      hb_blob_destroy (source_table);
+      break;
+  }
+  DEBUG_MSG(SUBSET, nullptr, "subset %c%c%c%c %s", HB_UNTAG (tag), result ? "ok" : "FAILED");
+  return result;
+}
+
+static bool
+_should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag)
+{
+  switch (tag) {
+    case HB_TAG ('c', 'v', 'a', 'r'): /* hint table, fallthrough */
+    case HB_TAG ('c', 'v', 't', ' '): /* hint table, fallthrough */
+    case HB_TAG ('f', 'p', 'g', 'm'): /* hint table, fallthrough */
+    case HB_TAG ('p', 'r', 'e', 'p'): /* hint table, fallthrough */
+    case HB_TAG ('h', 'd', 'm', 'x'): /* hint table, fallthrough */
+    case HB_TAG ('V', 'D', 'M', 'X'): /* hint table, fallthrough */
+      return plan->drop_hints;
+    // Drop Layout Tables if requested.
+    case HB_OT_TAG_GDEF:
+    case HB_OT_TAG_GPOS:
+    case HB_OT_TAG_GSUB:
+      return plan->drop_layout;
+    // Drop these tables below by default, list pulled
+    // from fontTools:
+    case HB_TAG ('B', 'A', 'S', 'E'):
+    case HB_TAG ('J', 'S', 'T', 'F'):
+    case HB_TAG ('D', 'S', 'I', 'G'):
+    case HB_TAG ('E', 'B', 'D', 'T'):
+    case HB_TAG ('E', 'B', 'L', 'C'):
+    case HB_TAG ('E', 'B', 'S', 'C'):
+    case HB_TAG ('S', 'V', 'G', ' '):
+    case HB_TAG ('P', 'C', 'L', 'T'):
+    case HB_TAG ('L', 'T', 'S', 'H'):
+    // Graphite tables:
+    case HB_TAG ('F', 'e', 'a', 't'):
+    case HB_TAG ('G', 'l', 'a', 't'):
+    case HB_TAG ('G', 'l', 'o', 'c'):
+    case HB_TAG ('S', 'i', 'l', 'f'):
+    case HB_TAG ('S', 'i', 'l', 'l'):
+    // Colour
+    case HB_TAG ('s', 'b', 'i', 'x'):
+      return true;
+    default:
+      return false;
+  }
+}
+
+/**
+ * hb_subset:
+ * @source: font face data to be subset.
+ * @input: input to use for the subsetting.
+ *
+ * Subsets a font according to provided input.
+ **/
+hb_face_t *
+hb_subset (hb_face_t *source,
+	   hb_subset_input_t *input)
+{
+  if (unlikely (!input || !source)) return hb_face_get_empty ();
+
+  hb_subset_plan_t *plan = hb_subset_plan_create (source, input);
+
+  hb_tag_t table_tags[32];
+  unsigned int offset = 0, count;
+  bool success = true;
+  do {
+    count = ARRAY_LENGTH (table_tags);
+    hb_face_get_table_tags (source, offset, &count, table_tags);
+    for (unsigned int i = 0; i < count; i++)
+    {
+      hb_tag_t tag = table_tags[i];
+      if (_should_drop_table (plan, tag))
+      {
+	DEBUG_MSG(SUBSET, nullptr, "drop %c%c%c%c", HB_UNTAG (tag));
+	continue;
+      }
+      success = success && _subset_table (plan, tag);
+    }
+    offset += count;
+  } while (success && count == ARRAY_LENGTH (table_tags));
+
+  hb_face_t *result = success ? hb_face_reference (plan->dest) : hb_face_get_empty ();
+  hb_subset_plan_destroy (plan);
+  return result;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset.h
new file mode 100644
index 0000000..f582e46
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright © 2018  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): Rod Sheeter
+ */
+
+#ifndef HB_SUBSET_H
+#define HB_SUBSET_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+/*
+ * hb_subset_input_t
+ *
+ * Things that change based on the input. Characters to keep, etc.
+ */
+
+typedef struct hb_subset_input_t hb_subset_input_t;
+
+HB_EXTERN hb_subset_input_t *
+hb_subset_input_create_or_fail (void);
+
+HB_EXTERN hb_subset_input_t *
+hb_subset_input_reference (hb_subset_input_t *subset_input);
+
+HB_EXTERN void
+hb_subset_input_destroy (hb_subset_input_t *subset_input);
+
+HB_EXTERN hb_set_t *
+hb_subset_input_unicode_set (hb_subset_input_t *subset_input);
+
+HB_EXTERN hb_set_t *
+hb_subset_input_glyph_set (hb_subset_input_t *subset_input);
+
+HB_EXTERN void
+hb_subset_input_set_drop_hints (hb_subset_input_t *subset_input,
+				hb_bool_t drop_hints);
+HB_EXTERN hb_bool_t
+hb_subset_input_get_drop_hints (hb_subset_input_t *subset_input);
+
+HB_EXTERN void
+hb_subset_input_set_drop_layout (hb_subset_input_t *subset_input,
+				 hb_bool_t drop_layout);
+HB_EXTERN hb_bool_t
+hb_subset_input_get_drop_layout (hb_subset_input_t *subset_input);
+
+HB_EXTERN void
+hb_subset_input_set_desubroutinize (hb_subset_input_t *subset_input,
+        hb_bool_t desubroutinize);
+HB_EXTERN hb_bool_t
+hb_subset_input_get_desubroutinize (hb_subset_input_t *subset_input);
+
+/* hb_subset () */
+HB_EXTERN hb_face_t *
+hb_subset (hb_face_t *source, hb_subset_input_t *input);
+
+
+HB_END_DECLS
+
+#endif /* HB_SUBSET_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset.hh
new file mode 100644
index 0000000..45cb763
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-subset.hh
@@ -0,0 +1,59 @@
+/*
+ * Copyright © 2018  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): Garret Rieger, Roderick Sheeter
+ */
+
+#ifndef HB_SUBSET_HH
+#define HB_SUBSET_HH
+
+
+#include "hb.hh"
+
+#include "hb-subset.h"
+
+#include "hb-machinery.hh"
+#include "hb-subset-input.hh"
+#include "hb-subset-plan.hh"
+
+struct hb_subset_context_t :
+       hb_dispatch_context_t<hb_subset_context_t, bool, HB_DEBUG_SUBSET>
+{
+  const char *get_name () { return "SUBSET"; }
+  template <typename T>
+  bool dispatch (const T &obj) { return obj.subset (this); }
+  static bool default_return_value () { return true; }
+
+  hb_subset_plan_t *plan;
+  hb_serialize_context_t *serializer;
+  unsigned int debug_depth;
+
+  hb_subset_context_t (hb_subset_plan_t *plan_,
+		       hb_serialize_context_t *serializer_) :
+			plan (plan_),
+			serializer (serializer_),
+			debug_depth (0) {}
+};
+
+
+#endif /* HB_SUBSET_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn.cc
new file mode 100644
index 0000000..534935f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn.cc
@@ -0,0 +1,268 @@
+/*
+ * Copyright (C) 2012 Grigori Goronzy <greg@kinoho.net>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "hb.hh"
+
+#include "hb-machinery.hh"
+
+#include "ucdn.h"
+
+static const hb_script_t ucdn_script_translate[] =
+{
+    HB_SCRIPT_COMMON,
+    HB_SCRIPT_LATIN,
+    HB_SCRIPT_GREEK,
+    HB_SCRIPT_CYRILLIC,
+    HB_SCRIPT_ARMENIAN,
+    HB_SCRIPT_HEBREW,
+    HB_SCRIPT_ARABIC,
+    HB_SCRIPT_SYRIAC,
+    HB_SCRIPT_THAANA,
+    HB_SCRIPT_DEVANAGARI,
+    HB_SCRIPT_BENGALI,
+    HB_SCRIPT_GURMUKHI,
+    HB_SCRIPT_GUJARATI,
+    HB_SCRIPT_ORIYA,
+    HB_SCRIPT_TAMIL,
+    HB_SCRIPT_TELUGU,
+    HB_SCRIPT_KANNADA,
+    HB_SCRIPT_MALAYALAM,
+    HB_SCRIPT_SINHALA,
+    HB_SCRIPT_THAI,
+    HB_SCRIPT_LAO,
+    HB_SCRIPT_TIBETAN,
+    HB_SCRIPT_MYANMAR,
+    HB_SCRIPT_GEORGIAN,
+    HB_SCRIPT_HANGUL,
+    HB_SCRIPT_ETHIOPIC,
+    HB_SCRIPT_CHEROKEE,
+    HB_SCRIPT_CANADIAN_SYLLABICS,
+    HB_SCRIPT_OGHAM,
+    HB_SCRIPT_RUNIC,
+    HB_SCRIPT_KHMER,
+    HB_SCRIPT_MONGOLIAN,
+    HB_SCRIPT_HIRAGANA,
+    HB_SCRIPT_KATAKANA,
+    HB_SCRIPT_BOPOMOFO,
+    HB_SCRIPT_HAN,
+    HB_SCRIPT_YI,
+    HB_SCRIPT_OLD_ITALIC,
+    HB_SCRIPT_GOTHIC,
+    HB_SCRIPT_DESERET,
+    HB_SCRIPT_INHERITED,
+    HB_SCRIPT_TAGALOG,
+    HB_SCRIPT_HANUNOO,
+    HB_SCRIPT_BUHID,
+    HB_SCRIPT_TAGBANWA,
+    HB_SCRIPT_LIMBU,
+    HB_SCRIPT_TAI_LE,
+    HB_SCRIPT_LINEAR_B,
+    HB_SCRIPT_UGARITIC,
+    HB_SCRIPT_SHAVIAN,
+    HB_SCRIPT_OSMANYA,
+    HB_SCRIPT_CYPRIOT,
+    HB_SCRIPT_BRAILLE,
+    HB_SCRIPT_BUGINESE,
+    HB_SCRIPT_COPTIC,
+    HB_SCRIPT_NEW_TAI_LUE,
+    HB_SCRIPT_GLAGOLITIC,
+    HB_SCRIPT_TIFINAGH,
+    HB_SCRIPT_SYLOTI_NAGRI,
+    HB_SCRIPT_OLD_PERSIAN,
+    HB_SCRIPT_KHAROSHTHI,
+    HB_SCRIPT_BALINESE,
+    HB_SCRIPT_CUNEIFORM,
+    HB_SCRIPT_PHOENICIAN,
+    HB_SCRIPT_PHAGS_PA,
+    HB_SCRIPT_NKO,
+    HB_SCRIPT_SUNDANESE,
+    HB_SCRIPT_LEPCHA,
+    HB_SCRIPT_OL_CHIKI,
+    HB_SCRIPT_VAI,
+    HB_SCRIPT_SAURASHTRA,
+    HB_SCRIPT_KAYAH_LI,
+    HB_SCRIPT_REJANG,
+    HB_SCRIPT_LYCIAN,
+    HB_SCRIPT_CARIAN,
+    HB_SCRIPT_LYDIAN,
+    HB_SCRIPT_CHAM,
+    HB_SCRIPT_TAI_THAM,
+    HB_SCRIPT_TAI_VIET,
+    HB_SCRIPT_AVESTAN,
+    HB_SCRIPT_EGYPTIAN_HIEROGLYPHS,
+    HB_SCRIPT_SAMARITAN,
+    HB_SCRIPT_LISU,
+    HB_SCRIPT_BAMUM,
+    HB_SCRIPT_JAVANESE,
+    HB_SCRIPT_MEETEI_MAYEK,
+    HB_SCRIPT_IMPERIAL_ARAMAIC,
+    HB_SCRIPT_OLD_SOUTH_ARABIAN,
+    HB_SCRIPT_INSCRIPTIONAL_PARTHIAN,
+    HB_SCRIPT_INSCRIPTIONAL_PAHLAVI,
+    HB_SCRIPT_OLD_TURKIC,
+    HB_SCRIPT_KAITHI,
+    HB_SCRIPT_BATAK,
+    HB_SCRIPT_BRAHMI,
+    HB_SCRIPT_MANDAIC,
+    HB_SCRIPT_CHAKMA,
+    HB_SCRIPT_MEROITIC_CURSIVE,
+    HB_SCRIPT_MEROITIC_HIEROGLYPHS,
+    HB_SCRIPT_MIAO,
+    HB_SCRIPT_SHARADA,
+    HB_SCRIPT_SORA_SOMPENG,
+    HB_SCRIPT_TAKRI,
+    HB_SCRIPT_UNKNOWN,
+    HB_SCRIPT_BASSA_VAH,
+    HB_SCRIPT_CAUCASIAN_ALBANIAN,
+    HB_SCRIPT_DUPLOYAN,
+    HB_SCRIPT_ELBASAN,
+    HB_SCRIPT_GRANTHA,
+    HB_SCRIPT_KHOJKI,
+    HB_SCRIPT_KHUDAWADI,
+    HB_SCRIPT_LINEAR_A,
+    HB_SCRIPT_MAHAJANI,
+    HB_SCRIPT_MANICHAEAN,
+    HB_SCRIPT_MENDE_KIKAKUI,
+    HB_SCRIPT_MODI,
+    HB_SCRIPT_MRO,
+    HB_SCRIPT_NABATAEAN,
+    HB_SCRIPT_OLD_NORTH_ARABIAN,
+    HB_SCRIPT_OLD_PERMIC,
+    HB_SCRIPT_PAHAWH_HMONG,
+    HB_SCRIPT_PALMYRENE,
+    HB_SCRIPT_PAU_CIN_HAU,
+    HB_SCRIPT_PSALTER_PAHLAVI,
+    HB_SCRIPT_SIDDHAM,
+    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,
+    HB_SCRIPT_MASARAM_GONDI,
+    HB_SCRIPT_NUSHU,
+    HB_SCRIPT_SOYOMBO,
+    HB_SCRIPT_ZANABAZAR_SQUARE,
+    HB_SCRIPT_DOGRA,
+    HB_SCRIPT_GUNJALA_GONDI,
+    HB_SCRIPT_HANIFI_ROHINGYA,
+    HB_SCRIPT_MAKASAR,
+    HB_SCRIPT_MEDEFAIDRIN,
+    HB_SCRIPT_OLD_SOGDIAN,
+    HB_SCRIPT_SOGDIAN,
+};
+
+static hb_unicode_combining_class_t
+hb_ucdn_combining_class(hb_unicode_funcs_t *ufuncs HB_UNUSED,
+			hb_codepoint_t unicode,
+			void *user_data HB_UNUSED)
+{
+    return (hb_unicode_combining_class_t) ucdn_get_combining_class(unicode);
+}
+
+static hb_unicode_general_category_t
+hb_ucdn_general_category(hb_unicode_funcs_t *ufuncs HB_UNUSED,
+			 hb_codepoint_t unicode,
+			 void *user_data HB_UNUSED)
+{
+    return (hb_unicode_general_category_t)ucdn_get_general_category(unicode);
+}
+
+static hb_codepoint_t
+hb_ucdn_mirroring(hb_unicode_funcs_t *ufuncs HB_UNUSED,
+		  hb_codepoint_t unicode,
+		  void *user_data HB_UNUSED)
+{
+    return ucdn_mirror(unicode);
+}
+
+static hb_script_t
+hb_ucdn_script(hb_unicode_funcs_t *ufuncs HB_UNUSED,
+	       hb_codepoint_t unicode,
+	       void *user_data HB_UNUSED)
+{
+    return ucdn_script_translate[ucdn_get_script(unicode)];
+}
+
+static hb_bool_t
+hb_ucdn_compose(hb_unicode_funcs_t *ufuncs HB_UNUSED,
+		hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab,
+		void *user_data HB_UNUSED)
+{
+    return ucdn_compose(ab, a, b);
+}
+
+static hb_bool_t
+hb_ucdn_decompose(hb_unicode_funcs_t *ufuncs HB_UNUSED,
+		  hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b,
+		  void *user_data HB_UNUSED)
+{
+    return ucdn_decompose(ab, a, b);
+}
+
+
+#if HB_USE_ATEXIT
+static void free_static_ucdn_funcs ();
+#endif
+
+static struct hb_ucdn_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t<hb_ucdn_unicode_funcs_lazy_loader_t>
+{
+  static hb_unicode_funcs_t *create ()
+  {
+    hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr);
+
+    hb_unicode_funcs_set_combining_class_func (funcs, hb_ucdn_combining_class, nullptr, nullptr);
+    hb_unicode_funcs_set_general_category_func (funcs, hb_ucdn_general_category, nullptr, nullptr);
+    hb_unicode_funcs_set_mirroring_func (funcs, hb_ucdn_mirroring, nullptr, nullptr);
+    hb_unicode_funcs_set_script_func (funcs, hb_ucdn_script, nullptr, nullptr);
+    hb_unicode_funcs_set_compose_func (funcs, hb_ucdn_compose, nullptr, nullptr);
+    hb_unicode_funcs_set_decompose_func (funcs, hb_ucdn_decompose, nullptr, nullptr);
+
+    hb_unicode_funcs_make_immutable (funcs);
+
+#if HB_USE_ATEXIT
+    atexit (free_static_ucdn_funcs);
+#endif
+
+    return funcs;
+  }
+} static_ucdn_funcs;
+
+#if HB_USE_ATEXIT
+static
+void free_static_ucdn_funcs ()
+{
+  static_ucdn_funcs.free_instance ();
+}
+#endif
+
+extern "C" HB_INTERNAL
+hb_unicode_funcs_t *
+hb_ucdn_get_unicode_funcs ();
+
+hb_unicode_funcs_t *
+hb_ucdn_get_unicode_funcs ()
+{
+  return static_ucdn_funcs.get_unconst ();
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/COPYING b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/COPYING
new file mode 100644
index 0000000..be5205c
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/COPYING
@@ -0,0 +1,13 @@
+The contents of this directory are licensed under the following terms:
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/Makefile.am b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/Makefile.am
new file mode 100644
index 0000000..73b5502
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/Makefile.am
@@ -0,0 +1,16 @@
+## Process this file with automake to produce Makefile.in
+
+noinst_LTLIBRARIES = libhb-ucdn.la
+
+include Makefile.sources
+
+libhb_ucdn_la_SOURCES = $(LIBHB_UCDN_sources)
+libhb_ucdn_la_CPPFLAGS = \
+	-I$(top_srcdir) \
+	-I$(top_srcdir)/src \
+	-I$(top_builddir)/src
+libhb_ucdn_la_LIBADD =
+
+EXTRA_DIST = README COPYING
+
+-include $(top_srcdir)/git.mk
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/Makefile.in b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/Makefile.in
new file mode 100644
index 0000000..9529940
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/Makefile.in
@@ -0,0 +1,683 @@
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = src/hb-ucdn
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
+	$(top_srcdir)/m4/ax_code_coverage.m4 \
+	$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libhb_ucdn_la_DEPENDENCIES =
+am__objects_1 =
+am__objects_2 = libhb_ucdn_la-ucdn.lo $(am__objects_1)
+am_libhb_ucdn_la_OBJECTS = $(am__objects_2)
+libhb_ucdn_la_OBJECTS = $(am_libhb_ucdn_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libhb_ucdn_la_SOURCES)
+DIST_SOURCES = $(libhb_ucdn_la_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
+	$(top_srcdir)/depcomp COPYING README
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_CONFIG = @ICU_CONFIG@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+noinst_LTLIBRARIES = libhb-ucdn.la
+NULL = 
+LIBHB_UCDN_sources = \
+	ucdn.h \
+	ucdn.c \
+	ucdn_db.h \
+	$(NULL)
+
+libhb_ucdn_la_SOURCES = $(LIBHB_UCDN_sources)
+libhb_ucdn_la_CPPFLAGS = \
+	-I$(top_srcdir) \
+	-I$(top_srcdir)/src \
+	-I$(top_builddir)/src
+
+libhb_ucdn_la_LIBADD = 
+EXTRA_DIST = README COPYING
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits src/hb-ucdn/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnits src/hb-ucdn/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+$(srcdir)/Makefile.sources $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libhb-ucdn.la: $(libhb_ucdn_la_OBJECTS) $(libhb_ucdn_la_DEPENDENCIES) $(EXTRA_libhb_ucdn_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK)  $(libhb_ucdn_la_OBJECTS) $(libhb_ucdn_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhb_ucdn_la-ucdn.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+libhb_ucdn_la-ucdn.lo: ucdn.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhb_ucdn_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhb_ucdn_la-ucdn.lo -MD -MP -MF $(DEPDIR)/libhb_ucdn_la-ucdn.Tpo -c -o libhb_ucdn_la-ucdn.lo `test -f 'ucdn.c' || echo '$(srcdir)/'`ucdn.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libhb_ucdn_la-ucdn.Tpo $(DEPDIR)/libhb_ucdn_la-ucdn.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ucdn.c' object='libhb_ucdn_la-ucdn.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhb_ucdn_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhb_ucdn_la-ucdn.lo `test -f 'ucdn.c' || echo '$(srcdir)/'`ucdn.c
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+	clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/Makefile.sources b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/Makefile.sources
new file mode 100644
index 0000000..cb823b6
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/Makefile.sources
@@ -0,0 +1,7 @@
+NULL =
+
+LIBHB_UCDN_sources = \
+	ucdn.h \
+	ucdn.c \
+	ucdn_db.h \
+	$(NULL)
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/README b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/README
new file mode 100644
index 0000000..2203ae6
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/README
@@ -0,0 +1,40 @@
+Contents of this directory are derived from UCDN:
+
+  https://github.com/grigorig/ucdn
+
+The original README follows:
+
+
+UCDN - Unicode Database and Normalization
+
+UCDN is a Unicode support library. Currently, it provides access
+to basic character properties contained in the Unicode Character
+Database and low-level normalization functions (pairwise canonical
+composition/decomposition and compatibility decomposition). More
+functionality might be provided in the future, such as additional
+properties, string normalization and encoding conversion.
+
+UCDN uses standard C89 with no particular dependencies or requirements
+except for stdint.h, and can be easily integrated into existing
+projects. However, it can also be used as a standalone library,
+and a CMake build script is provided for this. The first motivation
+behind UCDN development was to provide a standalone set of Unicode
+functions for the HarfBuzz OpenType shaping library. For this purpose,
+a HarfBuzz-specific wrapper is shipped along with it (hb-ucdn.h).
+
+UCDN is published under the ISC license, please see the license header
+in the C source code for more information. The makeunicodata.py script
+required for parsing Unicode database files is licensed under the
+PSF license, please see PYTHON-LICENSE for more information.
+
+UCDN was written by Grigori Goronzy <greg@kinoho.net>.
+
+How to Use
+
+Include ucdn.c, ucdn.h and ucdn_db.h in your project. Now, just use the
+functions as documented in ucdn.h.
+
+In some cases, it might be necessary to regenerate the Unicode
+database file. The script makeunicodedata.py (Python 3.x required)
+fetches the appropriate files and dumps the compressed database into
+ucdn_db.h.
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/ucdn.c b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/ucdn.c
new file mode 100644
index 0000000..30747fe
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/ucdn.c
@@ -0,0 +1,360 @@
+/*
+ * Copyright (C) 2012 Grigori Goronzy <greg@kinoho.net>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include "ucdn.h"
+
+typedef struct {
+    unsigned char category;
+    unsigned char combining;
+    unsigned char bidi_class;
+    unsigned char east_asian_width;
+    unsigned char script;
+    unsigned char linebreak_class;
+} UCDRecord;
+
+typedef struct {
+    unsigned short from, to;
+} MirrorPair;
+
+typedef struct {
+  unsigned short from, to;
+  unsigned char type;
+} BracketPair;
+
+typedef struct {
+    unsigned int start;
+    short count, index;
+} Reindex;
+
+#include "ucdn_db.h"
+
+/* constants required for Hangul (de)composition */
+#define SBASE 0xAC00
+#define LBASE 0x1100
+#define VBASE 0x1161
+#define TBASE 0x11A7
+#define SCOUNT 11172
+#define LCOUNT 19
+#define VCOUNT 21
+#define TCOUNT 28
+#define NCOUNT (VCOUNT * TCOUNT)
+
+static const UCDRecord *get_ucd_record(uint32_t code)
+{
+    int index, offset;
+
+    if (code >= 0x110000)
+        index = 0;
+    else {
+        index  = index0[code >> (SHIFT1+SHIFT2)] << SHIFT1;
+        offset = (code >> SHIFT2) & ((1<<SHIFT1) - 1);
+        index  = index1[index + offset] << SHIFT2;
+        offset = code & ((1<<SHIFT2) - 1);
+        index  = index2[index + offset];
+    }
+
+    return &ucd_records[index];
+}
+
+static const unsigned short *get_decomp_record(uint32_t code)
+{
+    int index, offset;
+
+    if (code >= 0x110000)
+        index = 0;
+    else {
+        index  = decomp_index0[code >> (DECOMP_SHIFT1+DECOMP_SHIFT2)]
+            << DECOMP_SHIFT1;
+        offset = (code >> DECOMP_SHIFT2) & ((1<<DECOMP_SHIFT1) - 1);
+        index  = decomp_index1[index + offset] << DECOMP_SHIFT2;
+        offset = code & ((1<<DECOMP_SHIFT2) - 1);
+        index  = decomp_index2[index + offset];
+    }
+
+    return &decomp_data[index];
+}
+
+static int compare_reindex(const void *a, const void *b)
+{
+    Reindex *ra = (Reindex *)a;
+    Reindex *rb = (Reindex *)b;
+
+    if (ra->start < rb->start)
+        return -1;
+    else if (ra->start > (rb->start + rb->count))
+        return 1;
+    else
+        return 0;
+}
+
+static int get_comp_index(uint32_t code, const Reindex *idx, size_t len)
+{
+    Reindex *res;
+    Reindex r = {0, 0, 0};
+    r.start = code;
+    res = (Reindex *) bsearch(&r, idx, len, sizeof(Reindex), compare_reindex);
+
+    if (res != NULL)
+        return res->index + (code - res->start);
+    else
+        return -1;
+}
+
+static int compare_mp(const void *a, const void *b)
+{
+    MirrorPair *mpa = (MirrorPair *)a;
+    MirrorPair *mpb = (MirrorPair *)b;
+    return mpa->from - mpb->from;
+}
+
+static int compare_bp(const void *a, const void *b)
+{
+    BracketPair *bpa = (BracketPair *)a;
+    BracketPair *bpb = (BracketPair *)b;
+    return bpa->from - bpb->from;
+}
+
+static BracketPair *search_bp(uint32_t code)
+{
+    BracketPair bp = {0,0,2};
+    BracketPair *res;
+
+    bp.from = code;
+    res = (BracketPair *) bsearch(&bp, bracket_pairs, BIDI_BRACKET_LEN,
+                                 sizeof(BracketPair), compare_bp);
+    return res;
+}
+
+static int hangul_pair_decompose(uint32_t code, uint32_t *a, uint32_t *b)
+{
+    int si = code - SBASE;
+
+    if (si < 0 || si >= SCOUNT)
+        return 0;
+
+    if (si % TCOUNT) {
+        /* LV,T */
+        *a = SBASE + (si / TCOUNT) * TCOUNT;
+        *b = TBASE + (si % TCOUNT);
+        return 3;
+    } else {
+        /* L,V */
+        *a = LBASE + (si / NCOUNT);
+        *b = VBASE + (si % NCOUNT) / TCOUNT;
+        return 2;
+    }
+}
+
+static int hangul_pair_compose(uint32_t *code, uint32_t a, uint32_t b)
+{
+    if (a >= SBASE && a < (SBASE + SCOUNT) && b >= TBASE && b < (TBASE + TCOUNT)) {
+        /* LV,T */
+        *code = a + (b - TBASE);
+        return 3;
+    } else if (a >= LBASE && a < (LBASE + LCOUNT) && b >= VBASE && b < (VBASE + VCOUNT)) {
+        /* L,V */
+        int li = a - LBASE;
+        int vi = b - VBASE;
+        *code = SBASE + li * NCOUNT + vi * TCOUNT;
+        return 2;
+    } else {
+        return 0;
+    }
+}
+
+static uint32_t decode_utf16(const unsigned short **code_ptr)
+{
+    const unsigned short *code = *code_ptr;
+
+    if (code[0] < 0xd800 || code[0] > 0xdc00) {
+        *code_ptr += 1;
+        return (uint32_t)code[0];
+    } else {
+        *code_ptr += 2;
+        return 0x10000 + ((uint32_t)code[1] - 0xdc00) +
+            (((uint32_t)code[0] - 0xd800) << 10);
+    }
+}
+
+const char *ucdn_get_unicode_version(void)
+{
+    return UNIDATA_VERSION;
+}
+
+int ucdn_get_combining_class(uint32_t code)
+{
+    return get_ucd_record(code)->combining;
+}
+
+int ucdn_get_east_asian_width(uint32_t code)
+{
+    return get_ucd_record(code)->east_asian_width;
+}
+
+int ucdn_get_general_category(uint32_t code)
+{
+    return get_ucd_record(code)->category;
+}
+
+int ucdn_get_bidi_class(uint32_t code)
+{
+    return get_ucd_record(code)->bidi_class;
+}
+
+int ucdn_get_mirrored(uint32_t code)
+{
+    return ucdn_mirror(code) != code;
+}
+
+int ucdn_get_script(uint32_t code)
+{
+    return get_ucd_record(code)->script;
+}
+
+int ucdn_get_linebreak_class(uint32_t code)
+{
+    return get_ucd_record(code)->linebreak_class;
+}
+
+int ucdn_get_resolved_linebreak_class(uint32_t code)
+{
+    const UCDRecord *record = get_ucd_record(code);
+
+    switch (record->linebreak_class)
+    {
+    case UCDN_LINEBREAK_CLASS_AI:
+    case UCDN_LINEBREAK_CLASS_SG:
+    case UCDN_LINEBREAK_CLASS_XX:
+        return UCDN_LINEBREAK_CLASS_AL;
+
+    case UCDN_LINEBREAK_CLASS_SA:
+        if (record->category == UCDN_GENERAL_CATEGORY_MC ||
+                record->category == UCDN_GENERAL_CATEGORY_MN)
+            return UCDN_LINEBREAK_CLASS_CM;
+        return UCDN_LINEBREAK_CLASS_AL;
+
+    case UCDN_LINEBREAK_CLASS_CJ:
+        return UCDN_LINEBREAK_CLASS_NS;
+
+    case UCDN_LINEBREAK_CLASS_CB:
+        return UCDN_LINEBREAK_CLASS_B2;
+
+    case UCDN_LINEBREAK_CLASS_NL:
+        return UCDN_LINEBREAK_CLASS_BK;
+
+    default:
+        return record->linebreak_class;
+    }
+}
+
+uint32_t ucdn_mirror(uint32_t code)
+{
+    MirrorPair mp = {0};
+    MirrorPair *res;
+
+    mp.from = code;
+    res = (MirrorPair *) bsearch(&mp, mirror_pairs, BIDI_MIRROR_LEN,
+                                sizeof(MirrorPair), compare_mp);
+
+    if (res == NULL)
+        return code;
+    else
+        return res->to;
+}
+
+uint32_t ucdn_paired_bracket(uint32_t code)
+{
+    BracketPair *res = search_bp(code);
+    if (res == NULL)
+        return code;
+    else
+        return res->to;
+}
+
+int ucdn_paired_bracket_type(uint32_t code)
+{
+    BracketPair *res = search_bp(code);
+    if (res == NULL)
+        return UCDN_BIDI_PAIRED_BRACKET_TYPE_NONE;
+    else
+        return res->type;
+}
+
+int ucdn_decompose(uint32_t code, uint32_t *a, uint32_t *b)
+{
+    const unsigned short *rec;
+    int len;
+
+    if (hangul_pair_decompose(code, a, b))
+        return 1;
+
+    rec = get_decomp_record(code);
+    len = rec[0] >> 8;
+
+    if ((rec[0] & 0xff) != 0 || len == 0)
+        return 0;
+
+    rec++;
+    *a = decode_utf16(&rec);
+    if (len > 1)
+        *b = decode_utf16(&rec);
+    else
+        *b = 0;
+
+    return 1;
+}
+
+int ucdn_compose(uint32_t *code, uint32_t a, uint32_t b)
+{
+    int l, r, index, indexi, offset;
+
+    if (hangul_pair_compose(code, a, b))
+        return 1;
+
+    l = get_comp_index(a, nfc_first, sizeof(nfc_first) / sizeof(Reindex));
+    r = get_comp_index(b, nfc_last, sizeof(nfc_last) / sizeof(Reindex));
+
+    if (l < 0 || r < 0)
+        return 0;
+
+    indexi = l * TOTAL_LAST + r;
+    index  = comp_index0[indexi >> (COMP_SHIFT1+COMP_SHIFT2)] << COMP_SHIFT1;
+    offset = (indexi >> COMP_SHIFT2) & ((1<<COMP_SHIFT1) - 1);
+    index  = comp_index1[index + offset] << COMP_SHIFT2;
+    offset = indexi & ((1<<COMP_SHIFT2) - 1);
+    *code  = comp_data[index + offset];
+
+    return *code != 0;
+}
+
+int ucdn_compat_decompose(uint32_t code, uint32_t *decomposed)
+{
+    int i, len;
+    const unsigned short *rec = get_decomp_record(code);
+    len = rec[0] >> 8;
+
+    if (len == 0)
+        return 0;
+
+    rec++;
+    for (i = 0; i < len; i++)
+        decomposed[i] = decode_utf16(&rec);
+
+    return len;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/ucdn.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/ucdn.h
new file mode 100644
index 0000000..05d46d2
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/ucdn.h
@@ -0,0 +1,461 @@
+/*
+ * Copyright (C) 2012 Grigori Goronzy <greg@kinoho.net>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef UCDN_H
+#define UCDN_H
+
+
+
+#if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__)
+# define HB_BEGIN_VISIBILITY _Pragma ("GCC visibility push(hidden)")
+# define HB_END_VISIBILITY _Pragma ("GCC visibility pop")
+#else
+# define HB_BEGIN_VISIBILITY
+# define HB_END_VISIBILITY
+#endif
+#ifdef __cplusplus
+# define HB_BEGIN_HEADER  extern "C" { HB_BEGIN_VISIBILITY
+# define HB_END_HEADER  HB_END_VISIBILITY }
+#else
+# define HB_BEGIN_HEADER  HB_BEGIN_VISIBILITY
+# define HB_END_HEADER  HB_END_VISIBILITY
+#endif
+
+HB_BEGIN_HEADER
+
+#if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || \
+    defined (_sgi) || defined (__sun) || defined (sun) || \
+    defined (__digital__) || defined (__HP_cc)
+#  include <inttypes.h>
+#elif defined (_AIX)
+#  include <sys/inttypes.h>
+#elif defined (_MSC_VER) && _MSC_VER < 1600
+/* VS 2010 (_MSC_VER 1600) has stdint.h */
+typedef __int8 int8_t;
+typedef unsigned __int8 uint8_t;
+typedef __int16 int16_t;
+typedef unsigned __int16 uint16_t;
+typedef __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+#else
+#  include <stdint.h>
+#endif
+
+
+#define UCDN_EAST_ASIAN_F 0
+#define UCDN_EAST_ASIAN_H 1
+#define UCDN_EAST_ASIAN_W 2
+#define UCDN_EAST_ASIAN_NA 3
+#define UCDN_EAST_ASIAN_A 4
+#define UCDN_EAST_ASIAN_N 5
+
+#define UCDN_SCRIPT_COMMON 0
+#define UCDN_SCRIPT_LATIN 1
+#define UCDN_SCRIPT_GREEK 2
+#define UCDN_SCRIPT_CYRILLIC 3
+#define UCDN_SCRIPT_ARMENIAN 4
+#define UCDN_SCRIPT_HEBREW 5
+#define UCDN_SCRIPT_ARABIC 6
+#define UCDN_SCRIPT_SYRIAC 7
+#define UCDN_SCRIPT_THAANA 8
+#define UCDN_SCRIPT_DEVANAGARI 9
+#define UCDN_SCRIPT_BENGALI 10
+#define UCDN_SCRIPT_GURMUKHI 11
+#define UCDN_SCRIPT_GUJARATI 12
+#define UCDN_SCRIPT_ORIYA 13
+#define UCDN_SCRIPT_TAMIL 14
+#define UCDN_SCRIPT_TELUGU 15
+#define UCDN_SCRIPT_KANNADA 16
+#define UCDN_SCRIPT_MALAYALAM 17
+#define UCDN_SCRIPT_SINHALA 18
+#define UCDN_SCRIPT_THAI 19
+#define UCDN_SCRIPT_LAO 20
+#define UCDN_SCRIPT_TIBETAN 21
+#define UCDN_SCRIPT_MYANMAR 22
+#define UCDN_SCRIPT_GEORGIAN 23
+#define UCDN_SCRIPT_HANGUL 24
+#define UCDN_SCRIPT_ETHIOPIC 25
+#define UCDN_SCRIPT_CHEROKEE 26
+#define UCDN_SCRIPT_CANADIAN_ABORIGINAL 27
+#define UCDN_SCRIPT_OGHAM 28
+#define UCDN_SCRIPT_RUNIC 29
+#define UCDN_SCRIPT_KHMER 30
+#define UCDN_SCRIPT_MONGOLIAN 31
+#define UCDN_SCRIPT_HIRAGANA 32
+#define UCDN_SCRIPT_KATAKANA 33
+#define UCDN_SCRIPT_BOPOMOFO 34
+#define UCDN_SCRIPT_HAN 35
+#define UCDN_SCRIPT_YI 36
+#define UCDN_SCRIPT_OLD_ITALIC 37
+#define UCDN_SCRIPT_GOTHIC 38
+#define UCDN_SCRIPT_DESERET 39
+#define UCDN_SCRIPT_INHERITED 40
+#define UCDN_SCRIPT_TAGALOG 41
+#define UCDN_SCRIPT_HANUNOO 42
+#define UCDN_SCRIPT_BUHID 43
+#define UCDN_SCRIPT_TAGBANWA 44
+#define UCDN_SCRIPT_LIMBU 45
+#define UCDN_SCRIPT_TAI_LE 46
+#define UCDN_SCRIPT_LINEAR_B 47
+#define UCDN_SCRIPT_UGARITIC 48
+#define UCDN_SCRIPT_SHAVIAN 49
+#define UCDN_SCRIPT_OSMANYA 50
+#define UCDN_SCRIPT_CYPRIOT 51
+#define UCDN_SCRIPT_BRAILLE 52
+#define UCDN_SCRIPT_BUGINESE 53
+#define UCDN_SCRIPT_COPTIC 54
+#define UCDN_SCRIPT_NEW_TAI_LUE 55
+#define UCDN_SCRIPT_GLAGOLITIC 56
+#define UCDN_SCRIPT_TIFINAGH 57
+#define UCDN_SCRIPT_SYLOTI_NAGRI 58
+#define UCDN_SCRIPT_OLD_PERSIAN 59
+#define UCDN_SCRIPT_KHAROSHTHI 60
+#define UCDN_SCRIPT_BALINESE 61
+#define UCDN_SCRIPT_CUNEIFORM 62
+#define UCDN_SCRIPT_PHOENICIAN 63
+#define UCDN_SCRIPT_PHAGS_PA 64
+#define UCDN_SCRIPT_NKO 65
+#define UCDN_SCRIPT_SUNDANESE 66
+#define UCDN_SCRIPT_LEPCHA 67
+#define UCDN_SCRIPT_OL_CHIKI 68
+#define UCDN_SCRIPT_VAI 69
+#define UCDN_SCRIPT_SAURASHTRA 70
+#define UCDN_SCRIPT_KAYAH_LI 71
+#define UCDN_SCRIPT_REJANG 72
+#define UCDN_SCRIPT_LYCIAN 73
+#define UCDN_SCRIPT_CARIAN 74
+#define UCDN_SCRIPT_LYDIAN 75
+#define UCDN_SCRIPT_CHAM 76
+#define UCDN_SCRIPT_TAI_THAM 77
+#define UCDN_SCRIPT_TAI_VIET 78
+#define UCDN_SCRIPT_AVESTAN 79
+#define UCDN_SCRIPT_EGYPTIAN_HIEROGLYPHS 80
+#define UCDN_SCRIPT_SAMARITAN 81
+#define UCDN_SCRIPT_LISU 82
+#define UCDN_SCRIPT_BAMUM 83
+#define UCDN_SCRIPT_JAVANESE 84
+#define UCDN_SCRIPT_MEETEI_MAYEK 85
+#define UCDN_SCRIPT_IMPERIAL_ARAMAIC 86
+#define UCDN_SCRIPT_OLD_SOUTH_ARABIAN 87
+#define UCDN_SCRIPT_INSCRIPTIONAL_PARTHIAN 88
+#define UCDN_SCRIPT_INSCRIPTIONAL_PAHLAVI 89
+#define UCDN_SCRIPT_OLD_TURKIC 90
+#define UCDN_SCRIPT_KAITHI 91
+#define UCDN_SCRIPT_BATAK 92
+#define UCDN_SCRIPT_BRAHMI 93
+#define UCDN_SCRIPT_MANDAIC 94
+#define UCDN_SCRIPT_CHAKMA 95
+#define UCDN_SCRIPT_MEROITIC_CURSIVE 96
+#define UCDN_SCRIPT_MEROITIC_HIEROGLYPHS 97
+#define UCDN_SCRIPT_MIAO 98
+#define UCDN_SCRIPT_SHARADA 99
+#define UCDN_SCRIPT_SORA_SOMPENG 100
+#define UCDN_SCRIPT_TAKRI 101
+#define UCDN_SCRIPT_UNKNOWN 102
+#define UCDN_SCRIPT_BASSA_VAH 103
+#define UCDN_SCRIPT_CAUCASIAN_ALBANIAN 104
+#define UCDN_SCRIPT_DUPLOYAN 105
+#define UCDN_SCRIPT_ELBASAN 106
+#define UCDN_SCRIPT_GRANTHA 107
+#define UCDN_SCRIPT_KHOJKI 108
+#define UCDN_SCRIPT_KHUDAWADI 109
+#define UCDN_SCRIPT_LINEAR_A 110
+#define UCDN_SCRIPT_MAHAJANI 111
+#define UCDN_SCRIPT_MANICHAEAN 112
+#define UCDN_SCRIPT_MENDE_KIKAKUI 113
+#define UCDN_SCRIPT_MODI 114
+#define UCDN_SCRIPT_MRO 115
+#define UCDN_SCRIPT_NABATAEAN 116
+#define UCDN_SCRIPT_OLD_NORTH_ARABIAN 117
+#define UCDN_SCRIPT_OLD_PERMIC 118
+#define UCDN_SCRIPT_PAHAWH_HMONG 119
+#define UCDN_SCRIPT_PALMYRENE 120
+#define UCDN_SCRIPT_PAU_CIN_HAU 121
+#define UCDN_SCRIPT_PSALTER_PAHLAVI 122
+#define UCDN_SCRIPT_SIDDHAM 123
+#define UCDN_SCRIPT_TIRHUTA 124
+#define UCDN_SCRIPT_WARANG_CITI 125
+#define UCDN_SCRIPT_AHOM 126
+#define UCDN_SCRIPT_ANATOLIAN_HIEROGLYPHS 127
+#define UCDN_SCRIPT_HATRAN 128
+#define UCDN_SCRIPT_MULTANI 129
+#define UCDN_SCRIPT_OLD_HUNGARIAN 130
+#define UCDN_SCRIPT_SIGNWRITING 131
+#define UCDN_SCRIPT_ADLAM 132
+#define UCDN_SCRIPT_BHAIKSUKI 133
+#define UCDN_SCRIPT_MARCHEN 134
+#define UCDN_SCRIPT_NEWA 135
+#define UCDN_SCRIPT_OSAGE 136
+#define UCDN_SCRIPT_TANGUT 137
+#define UCDN_SCRIPT_MASARAM_GONDI 138
+#define UCDN_SCRIPT_NUSHU 139
+#define UCDN_SCRIPT_SOYOMBO 140
+#define UCDN_SCRIPT_ZANABAZAR_SQUARE 141
+
+#define UCDN_LINEBREAK_CLASS_OP 0
+#define UCDN_LINEBREAK_CLASS_CL 1
+#define UCDN_LINEBREAK_CLASS_CP 2
+#define UCDN_LINEBREAK_CLASS_QU 3
+#define UCDN_LINEBREAK_CLASS_GL 4
+#define UCDN_LINEBREAK_CLASS_NS 5
+#define UCDN_LINEBREAK_CLASS_EX 6
+#define UCDN_LINEBREAK_CLASS_SY 7
+#define UCDN_LINEBREAK_CLASS_IS 8
+#define UCDN_LINEBREAK_CLASS_PR 9
+#define UCDN_LINEBREAK_CLASS_PO 10
+#define UCDN_LINEBREAK_CLASS_NU 11
+#define UCDN_LINEBREAK_CLASS_AL 12
+#define UCDN_LINEBREAK_CLASS_HL 13
+#define UCDN_LINEBREAK_CLASS_ID 14
+#define UCDN_LINEBREAK_CLASS_IN 15
+#define UCDN_LINEBREAK_CLASS_HY 16
+#define UCDN_LINEBREAK_CLASS_BA 17
+#define UCDN_LINEBREAK_CLASS_BB 18
+#define UCDN_LINEBREAK_CLASS_B2 19
+#define UCDN_LINEBREAK_CLASS_ZW 20
+#define UCDN_LINEBREAK_CLASS_CM 21
+#define UCDN_LINEBREAK_CLASS_WJ 22
+#define UCDN_LINEBREAK_CLASS_H2 23
+#define UCDN_LINEBREAK_CLASS_H3 24
+#define UCDN_LINEBREAK_CLASS_JL 25
+#define UCDN_LINEBREAK_CLASS_JV 26
+#define UCDN_LINEBREAK_CLASS_JT 27
+#define UCDN_LINEBREAK_CLASS_RI 28
+#define UCDN_LINEBREAK_CLASS_AI 29
+#define UCDN_LINEBREAK_CLASS_BK 30
+#define UCDN_LINEBREAK_CLASS_CB 31
+#define UCDN_LINEBREAK_CLASS_CJ 32
+#define UCDN_LINEBREAK_CLASS_CR 33
+#define UCDN_LINEBREAK_CLASS_LF 34
+#define UCDN_LINEBREAK_CLASS_NL 35
+#define UCDN_LINEBREAK_CLASS_SA 36
+#define UCDN_LINEBREAK_CLASS_SG 37
+#define UCDN_LINEBREAK_CLASS_SP 38
+#define UCDN_LINEBREAK_CLASS_XX 39
+#define UCDN_LINEBREAK_CLASS_ZWJ 40
+#define UCDN_LINEBREAK_CLASS_EB 41
+#define UCDN_LINEBREAK_CLASS_EM 42
+
+#define UCDN_GENERAL_CATEGORY_CC 0
+#define UCDN_GENERAL_CATEGORY_CF 1
+#define UCDN_GENERAL_CATEGORY_CN 2
+#define UCDN_GENERAL_CATEGORY_CO 3
+#define UCDN_GENERAL_CATEGORY_CS 4
+#define UCDN_GENERAL_CATEGORY_LL 5
+#define UCDN_GENERAL_CATEGORY_LM 6
+#define UCDN_GENERAL_CATEGORY_LO 7
+#define UCDN_GENERAL_CATEGORY_LT 8
+#define UCDN_GENERAL_CATEGORY_LU 9
+#define UCDN_GENERAL_CATEGORY_MC 10
+#define UCDN_GENERAL_CATEGORY_ME 11
+#define UCDN_GENERAL_CATEGORY_MN 12
+#define UCDN_GENERAL_CATEGORY_ND 13
+#define UCDN_GENERAL_CATEGORY_NL 14
+#define UCDN_GENERAL_CATEGORY_NO 15
+#define UCDN_GENERAL_CATEGORY_PC 16
+#define UCDN_GENERAL_CATEGORY_PD 17
+#define UCDN_GENERAL_CATEGORY_PE 18
+#define UCDN_GENERAL_CATEGORY_PF 19
+#define UCDN_GENERAL_CATEGORY_PI 20
+#define UCDN_GENERAL_CATEGORY_PO 21
+#define UCDN_GENERAL_CATEGORY_PS 22
+#define UCDN_GENERAL_CATEGORY_SC 23
+#define UCDN_GENERAL_CATEGORY_SK 24
+#define UCDN_GENERAL_CATEGORY_SM 25
+#define UCDN_GENERAL_CATEGORY_SO 26
+#define UCDN_GENERAL_CATEGORY_ZL 27
+#define UCDN_GENERAL_CATEGORY_ZP 28
+#define UCDN_GENERAL_CATEGORY_ZS 29
+
+#define UCDN_BIDI_CLASS_L 0
+#define UCDN_BIDI_CLASS_LRE 1
+#define UCDN_BIDI_CLASS_LRO 2
+#define UCDN_BIDI_CLASS_R 3
+#define UCDN_BIDI_CLASS_AL 4
+#define UCDN_BIDI_CLASS_RLE 5
+#define UCDN_BIDI_CLASS_RLO 6
+#define UCDN_BIDI_CLASS_PDF 7
+#define UCDN_BIDI_CLASS_EN 8
+#define UCDN_BIDI_CLASS_ES 9
+#define UCDN_BIDI_CLASS_ET 10
+#define UCDN_BIDI_CLASS_AN 11
+#define UCDN_BIDI_CLASS_CS 12
+#define UCDN_BIDI_CLASS_NSM 13
+#define UCDN_BIDI_CLASS_BN 14
+#define UCDN_BIDI_CLASS_B 15
+#define UCDN_BIDI_CLASS_S 16
+#define UCDN_BIDI_CLASS_WS 17
+#define UCDN_BIDI_CLASS_ON 18
+#define UCDN_BIDI_CLASS_LRI 19
+#define UCDN_BIDI_CLASS_RLI 20
+#define UCDN_BIDI_CLASS_FSI 21
+#define UCDN_BIDI_CLASS_PDI 22
+
+#define UCDN_BIDI_PAIRED_BRACKET_TYPE_OPEN 0
+#define UCDN_BIDI_PAIRED_BRACKET_TYPE_CLOSE 1
+#define UCDN_BIDI_PAIRED_BRACKET_TYPE_NONE 2
+
+/**
+ * Return version of the Unicode database.
+ *
+ * @return Unicode database version
+ */
+const char *ucdn_get_unicode_version(void);
+
+/**
+ * Get combining class of a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @return combining class value, as defined in UAX#44
+ */
+int ucdn_get_combining_class(uint32_t code);
+
+/**
+ * Get east-asian width of a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_EAST_ASIAN_* and as defined in UAX#11.
+ */
+int ucdn_get_east_asian_width(uint32_t code);
+
+/**
+ * Get general category of a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_GENERAL_CATEGORY_* and as defined in
+ * UAX#44.
+ */
+int ucdn_get_general_category(uint32_t code);
+
+/**
+ * Get bidirectional class of a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_BIDI_CLASS_* and as defined in UAX#44.
+ */
+int ucdn_get_bidi_class(uint32_t code);
+
+/**
+ * Get script of a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_SCRIPT_* and as defined in UAX#24.
+ */
+int ucdn_get_script(uint32_t code);
+
+/**
+ * Get unresolved linebreak class of a codepoint. This does not take
+ * rule LB1 of UAX#14 into account. See ucdn_get_resolved_linebreak_class()
+ * for resolved linebreak classes.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_LINEBREAK_* and as defined in UAX#14.
+ */
+int ucdn_get_linebreak_class(uint32_t code);
+
+/**
+ * Get resolved linebreak class of a codepoint. This resolves characters
+ * in the AI, SG, XX, SA and CJ classes according to rule LB1 of UAX#14.
+ * In addition the CB class is resolved as the equivalent B2 class and
+ * the NL class is resolved as the equivalent BK class.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_LINEBREAK_* and as defined in UAX#14.
+ */
+int ucdn_get_resolved_linebreak_class(uint32_t code);
+
+/**
+ * Check if codepoint can be mirrored.
+ *
+ * @param code Unicode codepoint
+ * @return 1 if mirrored character exists, otherwise 0
+ */
+int ucdn_get_mirrored(uint32_t code);
+
+/**
+ * Mirror a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @return mirrored codepoint or the original codepoint if no
+ * mirrored character exists
+ */
+uint32_t ucdn_mirror(uint32_t code);
+
+/**
+ * Get paired bracket for a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @return paired bracket codepoint or the original codepoint if no
+ * paired bracket character exists
+ */
+uint32_t ucdn_paired_bracket(uint32_t code);
+
+/**
+ * Get paired bracket type for a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_BIDI_PAIRED_BRACKET_TYPE_* and as defined
+ * in UAX#9.
+ *
+ */
+int ucdn_paired_bracket_type(uint32_t code);
+
+/**
+ * Pairwise canonical decomposition of a codepoint. This includes
+ * Hangul Jamo decomposition (see chapter 3.12 of the Unicode core
+ * specification).
+ *
+ * Hangul is decomposed into L and V jamos for LV forms, and an
+ * LV precomposed syllable and a T jamo for LVT forms.
+ *
+ * @param code Unicode codepoint
+ * @param a filled with first codepoint of decomposition
+ * @param b filled with second codepoint of decomposition, or 0
+ * @return success
+ */
+int ucdn_decompose(uint32_t code, uint32_t *a, uint32_t *b);
+
+/**
+ * Compatibility decomposition of a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @param decomposed filled with decomposition, must be able to hold 18
+ * characters
+ * @return length of decomposition or 0 in case none exists
+ */
+int ucdn_compat_decompose(uint32_t code, uint32_t *decomposed);
+
+/**
+ * Pairwise canonical composition of two codepoints. This includes
+ * Hangul Jamo composition (see chapter 3.12 of the Unicode core
+ * specification).
+ *
+ * Hangul composition expects either L and V jamos, or an LV
+ * precomposed syllable and a T jamo. This is exactly the inverse
+ * of pairwise Hangul decomposition.
+ *
+ * @param code filled with composition
+ * @param a first codepoint
+ * @param b second codepoint
+ * @return success
+ */
+int ucdn_compose(uint32_t *code, uint32_t a, uint32_t b);
+
+HB_END_HEADER
+
+#endif
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/ucdn_db.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/ucdn_db.h
new file mode 100644
index 0000000..87872b7
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-ucdn/ucdn_db.h
@@ -0,0 +1,5730 @@
+/* this file was generated by makeunicodedata.py 3.2 */
+
+#define UNIDATA_VERSION "11.0.0"
+/* a list of unique database records */
+static const UCDRecord ucd_records[] = {
+    {2, 0, 18, 5, 102, 39},
+    {0, 0, 14, 5, 0, 21},
+    {0, 0, 16, 5, 0, 17},
+    {0, 0, 15, 5, 0, 34},
+    {0, 0, 16, 5, 0, 30},
+    {0, 0, 17, 5, 0, 30},
+    {0, 0, 15, 5, 0, 33},
+    {0, 0, 15, 5, 0, 21},
+    {0, 0, 16, 5, 0, 21},
+    {29, 0, 17, 3, 0, 38},
+    {21, 0, 18, 3, 0, 6},
+    {21, 0, 18, 3, 0, 3},
+    {21, 0, 10, 3, 0, 12},
+    {23, 0, 10, 3, 0, 9},
+    {21, 0, 10, 3, 0, 10},
+    {21, 0, 18, 3, 0, 12},
+    {22, 0, 18, 3, 0, 0},
+    {18, 0, 18, 3, 0, 2},
+    {25, 0, 9, 3, 0, 9},
+    {21, 0, 12, 3, 0, 8},
+    {17, 0, 9, 3, 0, 16},
+    {21, 0, 12, 3, 0, 7},
+    {13, 0, 8, 3, 0, 11},
+    {21, 0, 18, 3, 0, 8},
+    {25, 0, 18, 3, 0, 12},
+    {9, 0, 0, 3, 1, 12},
+    {21, 0, 18, 3, 0, 9},
+    {24, 0, 18, 3, 0, 12},
+    {16, 0, 18, 3, 0, 12},
+    {5, 0, 0, 3, 1, 12},
+    {25, 0, 18, 3, 0, 17},
+    {18, 0, 18, 3, 0, 1},
+    {0, 0, 15, 5, 0, 35},
+    {29, 0, 12, 5, 0, 4},
+    {21, 0, 18, 4, 0, 0},
+    {23, 0, 10, 3, 0, 10},
+    {23, 0, 10, 4, 0, 9},
+    {26, 0, 18, 3, 0, 12},
+    {21, 0, 18, 4, 0, 29},
+    {24, 0, 18, 4, 0, 29},
+    {26, 0, 18, 5, 0, 12},
+    {7, 0, 0, 4, 1, 29},
+    {20, 0, 18, 5, 0, 3},
+    {1, 0, 14, 4, 0, 17},
+    {26, 0, 18, 4, 0, 12},
+    {26, 0, 10, 4, 0, 10},
+    {25, 0, 10, 4, 0, 9},
+    {15, 0, 8, 4, 0, 29},
+    {24, 0, 18, 4, 0, 18},
+    {5, 0, 0, 5, 0, 12},
+    {19, 0, 18, 5, 0, 3},
+    {15, 0, 18, 4, 0, 29},
+    {9, 0, 0, 5, 1, 12},
+    {9, 0, 0, 4, 1, 12},
+    {25, 0, 18, 4, 0, 29},
+    {5, 0, 0, 4, 1, 12},
+    {5, 0, 0, 5, 1, 12},
+    {7, 0, 0, 5, 1, 12},
+    {8, 0, 0, 5, 1, 12},
+    {6, 0, 0, 5, 1, 12},
+    {6, 0, 18, 5, 0, 12},
+    {6, 0, 0, 5, 0, 12},
+    {24, 0, 18, 5, 0, 12},
+    {24, 0, 18, 4, 0, 12},
+    {6, 0, 18, 4, 0, 29},
+    {6, 0, 18, 5, 0, 18},
+    {6, 0, 0, 4, 0, 29},
+    {24, 0, 18, 5, 34, 12},
+    {12, 230, 13, 4, 40, 21},
+    {12, 232, 13, 4, 40, 21},
+    {12, 220, 13, 4, 40, 21},
+    {12, 216, 13, 4, 40, 21},
+    {12, 202, 13, 4, 40, 21},
+    {12, 1, 13, 4, 40, 21},
+    {12, 240, 13, 4, 40, 21},
+    {12, 0, 13, 4, 40, 4},
+    {12, 233, 13, 4, 40, 4},
+    {12, 234, 13, 4, 40, 4},
+    {9, 0, 0, 5, 2, 12},
+    {5, 0, 0, 5, 2, 12},
+    {24, 0, 18, 5, 2, 12},
+    {2, 0, 18, 5, 102, 39},
+    {6, 0, 0, 5, 2, 12},
+    {21, 0, 18, 5, 0, 8},
+    {21, 0, 18, 5, 0, 12},
+    {9, 0, 0, 4, 2, 12},
+    {5, 0, 0, 4, 2, 12},
+    {9, 0, 0, 5, 54, 12},
+    {5, 0, 0, 5, 54, 12},
+    {25, 0, 18, 5, 2, 12},
+    {9, 0, 0, 5, 3, 12},
+    {9, 0, 0, 4, 3, 12},
+    {5, 0, 0, 4, 3, 12},
+    {5, 0, 0, 5, 3, 12},
+    {26, 0, 0, 5, 3, 12},
+    {12, 230, 13, 5, 3, 21},
+    {12, 230, 13, 5, 40, 21},
+    {11, 0, 13, 5, 3, 21},
+    {9, 0, 0, 5, 4, 12},
+    {6, 0, 0, 5, 4, 12},
+    {21, 0, 0, 5, 4, 12},
+    {5, 0, 0, 5, 4, 12},
+    {21, 0, 0, 5, 0, 8},
+    {17, 0, 18, 5, 4, 17},
+    {26, 0, 18, 5, 4, 12},
+    {23, 0, 10, 5, 4, 9},
+    {12, 220, 13, 5, 5, 21},
+    {12, 230, 13, 5, 5, 21},
+    {12, 222, 13, 5, 5, 21},
+    {12, 228, 13, 5, 5, 21},
+    {12, 10, 13, 5, 5, 21},
+    {12, 11, 13, 5, 5, 21},
+    {12, 12, 13, 5, 5, 21},
+    {12, 13, 13, 5, 5, 21},
+    {12, 14, 13, 5, 5, 21},
+    {12, 15, 13, 5, 5, 21},
+    {12, 16, 13, 5, 5, 21},
+    {12, 17, 13, 5, 5, 21},
+    {12, 18, 13, 5, 5, 21},
+    {12, 19, 13, 5, 5, 21},
+    {12, 20, 13, 5, 5, 21},
+    {12, 21, 13, 5, 5, 21},
+    {12, 22, 13, 5, 5, 21},
+    {17, 0, 3, 5, 5, 17},
+    {12, 23, 13, 5, 5, 21},
+    {21, 0, 3, 5, 5, 12},
+    {12, 24, 13, 5, 5, 21},
+    {12, 25, 13, 5, 5, 21},
+    {21, 0, 3, 5, 5, 6},
+    {7, 0, 3, 5, 5, 13},
+    {1, 0, 11, 5, 6, 12},
+    {1, 0, 11, 5, 0, 12},
+    {25, 0, 18, 5, 6, 12},
+    {25, 0, 4, 5, 6, 12},
+    {21, 0, 10, 5, 6, 10},
+    {23, 0, 4, 5, 6, 10},
+    {21, 0, 12, 5, 0, 8},
+    {21, 0, 4, 5, 6, 8},
+    {26, 0, 18, 5, 6, 12},
+    {12, 230, 13, 5, 6, 21},
+    {12, 30, 13, 5, 6, 21},
+    {12, 31, 13, 5, 6, 21},
+    {12, 32, 13, 5, 6, 21},
+    {21, 0, 4, 5, 0, 6},
+    {1, 0, 4, 5, 6, 21},
+    {21, 0, 4, 5, 6, 6},
+    {7, 0, 4, 5, 6, 12},
+    {6, 0, 4, 5, 0, 12},
+    {12, 27, 13, 5, 40, 21},
+    {12, 28, 13, 5, 40, 21},
+    {12, 29, 13, 5, 40, 21},
+    {12, 30, 13, 5, 40, 21},
+    {12, 31, 13, 5, 40, 21},
+    {12, 32, 13, 5, 40, 21},
+    {12, 33, 13, 5, 40, 21},
+    {12, 34, 13, 5, 40, 21},
+    {12, 220, 13, 5, 40, 21},
+    {12, 220, 13, 5, 6, 21},
+    {13, 0, 11, 5, 6, 11},
+    {21, 0, 11, 5, 6, 11},
+    {21, 0, 4, 5, 6, 12},
+    {12, 35, 13, 5, 40, 21},
+    {6, 0, 4, 5, 6, 12},
+    {13, 0, 8, 5, 6, 11},
+    {26, 0, 4, 5, 6, 12},
+    {21, 0, 4, 5, 7, 12},
+    {1, 0, 4, 5, 7, 12},
+    {7, 0, 4, 5, 7, 12},
+    {12, 36, 13, 5, 7, 21},
+    {12, 230, 13, 5, 7, 21},
+    {12, 220, 13, 5, 7, 21},
+    {7, 0, 4, 5, 8, 12},
+    {12, 0, 13, 5, 8, 21},
+    {13, 0, 3, 5, 65, 11},
+    {7, 0, 3, 5, 65, 12},
+    {12, 230, 13, 5, 65, 21},
+    {12, 220, 13, 5, 65, 21},
+    {6, 0, 3, 5, 65, 12},
+    {26, 0, 18, 5, 65, 12},
+    {21, 0, 18, 5, 65, 12},
+    {21, 0, 18, 5, 65, 8},
+    {21, 0, 18, 5, 65, 6},
+    {23, 0, 3, 5, 65, 9},
+    {7, 0, 3, 5, 81, 12},
+    {12, 230, 13, 5, 81, 21},
+    {6, 0, 3, 5, 81, 12},
+    {21, 0, 3, 5, 81, 12},
+    {7, 0, 3, 5, 94, 12},
+    {12, 220, 13, 5, 94, 21},
+    {21, 0, 3, 5, 94, 12},
+    {12, 27, 13, 5, 6, 21},
+    {12, 28, 13, 5, 6, 21},
+    {12, 29, 13, 5, 6, 21},
+    {12, 0, 13, 5, 9, 21},
+    {10, 0, 0, 5, 9, 21},
+    {7, 0, 0, 5, 9, 12},
+    {12, 7, 13, 5, 9, 21},
+    {12, 9, 13, 5, 9, 21},
+    {12, 230, 13, 5, 9, 21},
+    {21, 0, 0, 5, 0, 17},
+    {13, 0, 0, 5, 9, 11},
+    {21, 0, 0, 5, 9, 12},
+    {6, 0, 0, 5, 9, 12},
+    {7, 0, 0, 5, 10, 12},
+    {12, 0, 13, 5, 10, 21},
+    {10, 0, 0, 5, 10, 21},
+    {12, 7, 13, 5, 10, 21},
+    {12, 9, 13, 5, 10, 21},
+    {13, 0, 0, 5, 10, 11},
+    {23, 0, 10, 5, 10, 10},
+    {15, 0, 0, 5, 10, 12},
+    {15, 0, 0, 5, 10, 10},
+    {26, 0, 0, 5, 10, 12},
+    {23, 0, 10, 5, 10, 9},
+    {21, 0, 0, 5, 10, 12},
+    {12, 230, 13, 5, 10, 21},
+    {12, 0, 13, 5, 11, 21},
+    {10, 0, 0, 5, 11, 21},
+    {7, 0, 0, 5, 11, 12},
+    {12, 7, 13, 5, 11, 21},
+    {12, 9, 13, 5, 11, 21},
+    {13, 0, 0, 5, 11, 11},
+    {21, 0, 0, 5, 11, 12},
+    {12, 0, 13, 5, 12, 21},
+    {10, 0, 0, 5, 12, 21},
+    {7, 0, 0, 5, 12, 12},
+    {12, 7, 13, 5, 12, 21},
+    {12, 9, 13, 5, 12, 21},
+    {13, 0, 0, 5, 12, 11},
+    {21, 0, 0, 5, 12, 12},
+    {23, 0, 10, 5, 12, 9},
+    {12, 0, 13, 5, 13, 21},
+    {10, 0, 0, 5, 13, 21},
+    {7, 0, 0, 5, 13, 12},
+    {12, 7, 13, 5, 13, 21},
+    {12, 9, 13, 5, 13, 21},
+    {13, 0, 0, 5, 13, 11},
+    {26, 0, 0, 5, 13, 12},
+    {15, 0, 0, 5, 13, 12},
+    {12, 0, 13, 5, 14, 21},
+    {7, 0, 0, 5, 14, 12},
+    {10, 0, 0, 5, 14, 21},
+    {12, 9, 13, 5, 14, 21},
+    {13, 0, 0, 5, 14, 11},
+    {15, 0, 0, 5, 14, 12},
+    {26, 0, 18, 5, 14, 12},
+    {23, 0, 10, 5, 14, 9},
+    {12, 0, 13, 5, 15, 21},
+    {10, 0, 0, 5, 15, 21},
+    {7, 0, 0, 5, 15, 12},
+    {12, 9, 13, 5, 15, 21},
+    {12, 84, 13, 5, 15, 21},
+    {12, 91, 13, 5, 15, 21},
+    {13, 0, 0, 5, 15, 11},
+    {15, 0, 18, 5, 15, 12},
+    {26, 0, 0, 5, 15, 12},
+    {7, 0, 0, 5, 16, 12},
+    {12, 0, 13, 5, 16, 21},
+    {10, 0, 0, 5, 16, 21},
+    {21, 0, 0, 5, 16, 18},
+    {12, 7, 13, 5, 16, 21},
+    {12, 0, 0, 5, 16, 21},
+    {12, 9, 13, 5, 16, 21},
+    {13, 0, 0, 5, 16, 11},
+    {12, 0, 13, 5, 17, 21},
+    {10, 0, 0, 5, 17, 21},
+    {7, 0, 0, 5, 17, 12},
+    {12, 9, 13, 5, 17, 21},
+    {26, 0, 0, 5, 17, 12},
+    {15, 0, 0, 5, 17, 12},
+    {13, 0, 0, 5, 17, 11},
+    {26, 0, 0, 5, 17, 10},
+    {10, 0, 0, 5, 18, 21},
+    {7, 0, 0, 5, 18, 12},
+    {12, 9, 13, 5, 18, 21},
+    {12, 0, 13, 5, 18, 21},
+    {13, 0, 0, 5, 18, 11},
+    {21, 0, 0, 5, 18, 12},
+    {7, 0, 0, 5, 19, 36},
+    {12, 0, 13, 5, 19, 36},
+    {12, 103, 13, 5, 19, 36},
+    {12, 9, 13, 5, 19, 36},
+    {23, 0, 10, 5, 0, 9},
+    {6, 0, 0, 5, 19, 36},
+    {12, 107, 13, 5, 19, 36},
+    {21, 0, 0, 5, 19, 12},
+    {13, 0, 0, 5, 19, 11},
+    {21, 0, 0, 5, 19, 17},
+    {7, 0, 0, 5, 20, 36},
+    {12, 0, 13, 5, 20, 36},
+    {12, 118, 13, 5, 20, 36},
+    {6, 0, 0, 5, 20, 36},
+    {12, 122, 13, 5, 20, 36},
+    {13, 0, 0, 5, 20, 11},
+    {7, 0, 0, 5, 21, 12},
+    {26, 0, 0, 5, 21, 18},
+    {21, 0, 0, 5, 21, 18},
+    {21, 0, 0, 5, 21, 12},
+    {21, 0, 0, 5, 21, 4},
+    {21, 0, 0, 5, 21, 17},
+    {21, 0, 0, 5, 21, 6},
+    {26, 0, 0, 5, 21, 12},
+    {12, 220, 13, 5, 21, 21},
+    {13, 0, 0, 5, 21, 11},
+    {15, 0, 0, 5, 21, 12},
+    {26, 0, 0, 5, 21, 17},
+    {12, 216, 13, 5, 21, 21},
+    {22, 0, 18, 5, 21, 0},
+    {18, 0, 18, 5, 21, 1},
+    {10, 0, 0, 5, 21, 21},
+    {12, 129, 13, 5, 21, 21},
+    {12, 130, 13, 5, 21, 21},
+    {12, 0, 13, 5, 21, 21},
+    {12, 132, 13, 5, 21, 21},
+    {10, 0, 0, 5, 21, 17},
+    {12, 230, 13, 5, 21, 21},
+    {12, 9, 13, 5, 21, 21},
+    {26, 0, 0, 5, 0, 12},
+    {7, 0, 0, 5, 22, 36},
+    {10, 0, 0, 5, 22, 36},
+    {12, 0, 13, 5, 22, 36},
+    {12, 7, 13, 5, 22, 36},
+    {12, 9, 13, 5, 22, 36},
+    {13, 0, 0, 5, 22, 11},
+    {21, 0, 0, 5, 22, 17},
+    {21, 0, 0, 5, 22, 12},
+    {12, 220, 13, 5, 22, 36},
+    {26, 0, 0, 5, 22, 36},
+    {9, 0, 0, 5, 23, 12},
+    {5, 0, 0, 5, 23, 12},
+    {21, 0, 0, 5, 0, 12},
+    {6, 0, 0, 5, 23, 12},
+    {7, 0, 0, 2, 24, 25},
+    {7, 0, 0, 5, 24, 26},
+    {7, 0, 0, 5, 24, 27},
+    {7, 0, 0, 5, 25, 12},
+    {12, 230, 13, 5, 25, 21},
+    {21, 0, 0, 5, 25, 12},
+    {21, 0, 0, 5, 25, 17},
+    {15, 0, 0, 5, 25, 12},
+    {26, 0, 18, 5, 25, 12},
+    {9, 0, 0, 5, 26, 12},
+    {5, 0, 0, 5, 26, 12},
+    {17, 0, 18, 5, 27, 17},
+    {7, 0, 0, 5, 27, 12},
+    {21, 0, 0, 5, 27, 12},
+    {29, 0, 17, 5, 28, 17},
+    {7, 0, 0, 5, 28, 12},
+    {22, 0, 18, 5, 28, 0},
+    {18, 0, 18, 5, 28, 1},
+    {7, 0, 0, 5, 29, 12},
+    {14, 0, 0, 5, 29, 12},
+    {7, 0, 0, 5, 41, 12},
+    {12, 0, 13, 5, 41, 21},
+    {12, 9, 13, 5, 41, 21},
+    {7, 0, 0, 5, 42, 12},
+    {12, 0, 13, 5, 42, 21},
+    {12, 9, 13, 5, 42, 21},
+    {7, 0, 0, 5, 43, 12},
+    {12, 0, 13, 5, 43, 21},
+    {7, 0, 0, 5, 44, 12},
+    {12, 0, 13, 5, 44, 21},
+    {7, 0, 0, 5, 30, 36},
+    {12, 0, 13, 5, 30, 36},
+    {10, 0, 0, 5, 30, 36},
+    {12, 9, 13, 5, 30, 36},
+    {21, 0, 0, 5, 30, 17},
+    {21, 0, 0, 5, 30, 5},
+    {6, 0, 0, 5, 30, 36},
+    {21, 0, 0, 5, 30, 12},
+    {23, 0, 10, 5, 30, 9},
+    {12, 230, 13, 5, 30, 36},
+    {13, 0, 0, 5, 30, 11},
+    {15, 0, 18, 5, 30, 12},
+    {21, 0, 18, 5, 31, 12},
+    {21, 0, 18, 5, 0, 6},
+    {21, 0, 18, 5, 31, 17},
+    {21, 0, 18, 5, 0, 17},
+    {17, 0, 18, 5, 31, 18},
+    {21, 0, 18, 5, 31, 6},
+    {12, 0, 13, 5, 31, 21},
+    {1, 0, 14, 5, 31, 4},
+    {13, 0, 0, 5, 31, 11},
+    {7, 0, 0, 5, 31, 12},
+    {6, 0, 0, 5, 31, 12},
+    {12, 228, 13, 5, 31, 21},
+    {7, 0, 0, 5, 45, 12},
+    {12, 0, 13, 5, 45, 21},
+    {10, 0, 0, 5, 45, 21},
+    {12, 222, 13, 5, 45, 21},
+    {12, 230, 13, 5, 45, 21},
+    {12, 220, 13, 5, 45, 21},
+    {26, 0, 18, 5, 45, 12},
+    {21, 0, 18, 5, 45, 6},
+    {13, 0, 0, 5, 45, 11},
+    {7, 0, 0, 5, 46, 36},
+    {7, 0, 0, 5, 55, 36},
+    {13, 0, 0, 5, 55, 11},
+    {15, 0, 0, 5, 55, 36},
+    {26, 0, 18, 5, 55, 36},
+    {26, 0, 18, 5, 30, 12},
+    {7, 0, 0, 5, 53, 12},
+    {12, 230, 13, 5, 53, 21},
+    {12, 220, 13, 5, 53, 21},
+    {10, 0, 0, 5, 53, 21},
+    {12, 0, 13, 5, 53, 21},
+    {21, 0, 0, 5, 53, 12},
+    {7, 0, 0, 5, 77, 36},
+    {10, 0, 0, 5, 77, 36},
+    {12, 0, 13, 5, 77, 36},
+    {12, 9, 13, 5, 77, 36},
+    {12, 230, 13, 5, 77, 36},
+    {12, 220, 13, 5, 77, 21},
+    {13, 0, 0, 5, 77, 11},
+    {21, 0, 0, 5, 77, 36},
+    {6, 0, 0, 5, 77, 36},
+    {11, 0, 13, 5, 40, 21},
+    {12, 0, 13, 5, 61, 21},
+    {10, 0, 0, 5, 61, 21},
+    {7, 0, 0, 5, 61, 12},
+    {12, 7, 13, 5, 61, 21},
+    {10, 9, 0, 5, 61, 21},
+    {13, 0, 0, 5, 61, 11},
+    {21, 0, 0, 5, 61, 17},
+    {21, 0, 0, 5, 61, 12},
+    {26, 0, 0, 5, 61, 12},
+    {12, 230, 13, 5, 61, 21},
+    {12, 220, 13, 5, 61, 21},
+    {12, 0, 13, 5, 66, 21},
+    {10, 0, 0, 5, 66, 21},
+    {7, 0, 0, 5, 66, 12},
+    {10, 9, 0, 5, 66, 21},
+    {12, 9, 13, 5, 66, 21},
+    {13, 0, 0, 5, 66, 11},
+    {7, 0, 0, 5, 92, 12},
+    {12, 7, 13, 5, 92, 21},
+    {10, 0, 0, 5, 92, 21},
+    {12, 0, 13, 5, 92, 21},
+    {10, 9, 0, 5, 92, 21},
+    {21, 0, 0, 5, 92, 12},
+    {7, 0, 0, 5, 67, 12},
+    {10, 0, 0, 5, 67, 21},
+    {12, 0, 13, 5, 67, 21},
+    {12, 7, 13, 5, 67, 21},
+    {21, 0, 0, 5, 67, 17},
+    {13, 0, 0, 5, 67, 11},
+    {13, 0, 0, 5, 68, 11},
+    {7, 0, 0, 5, 68, 12},
+    {6, 0, 0, 5, 68, 12},
+    {21, 0, 0, 5, 68, 17},
+    {21, 0, 0, 5, 66, 12},
+    {12, 1, 13, 5, 40, 21},
+    {10, 0, 0, 5, 0, 21},
+    {7, 0, 0, 5, 0, 12},
+    {6, 0, 0, 5, 3, 12},
+    {12, 234, 13, 5, 40, 21},
+    {12, 214, 13, 5, 40, 21},
+    {12, 202, 13, 5, 40, 21},
+    {12, 232, 13, 5, 40, 21},
+    {12, 228, 13, 5, 40, 21},
+    {12, 233, 13, 5, 40, 21},
+    {8, 0, 0, 5, 2, 12},
+    {24, 0, 18, 5, 2, 18},
+    {29, 0, 17, 5, 0, 17},
+    {29, 0, 17, 5, 0, 4},
+    {1, 0, 14, 5, 0, 20},
+    {1, 0, 14, 5, 40, 21},
+    {1, 0, 14, 5, 40, 40},
+    {1, 0, 0, 5, 0, 21},
+    {1, 0, 3, 5, 0, 21},
+    {17, 0, 18, 4, 0, 17},
+    {17, 0, 18, 5, 0, 4},
+    {17, 0, 18, 5, 0, 17},
+    {17, 0, 18, 4, 0, 19},
+    {17, 0, 18, 4, 0, 29},
+    {20, 0, 18, 4, 0, 3},
+    {19, 0, 18, 4, 0, 3},
+    {22, 0, 18, 5, 0, 0},
+    {21, 0, 18, 4, 0, 12},
+    {21, 0, 18, 4, 0, 15},
+    {21, 0, 18, 4, 0, 17},
+    {27, 0, 17, 5, 0, 30},
+    {28, 0, 15, 5, 0, 30},
+    {1, 0, 1, 5, 0, 21},
+    {1, 0, 5, 5, 0, 21},
+    {1, 0, 7, 5, 0, 21},
+    {1, 0, 2, 5, 0, 21},
+    {1, 0, 6, 5, 0, 21},
+    {21, 0, 10, 4, 0, 10},
+    {21, 0, 10, 5, 0, 10},
+    {21, 0, 18, 4, 0, 10},
+    {21, 0, 18, 5, 0, 10},
+    {21, 0, 18, 5, 0, 5},
+    {16, 0, 18, 5, 0, 12},
+    {25, 0, 12, 5, 0, 8},
+    {18, 0, 18, 5, 0, 1},
+    {25, 0, 18, 5, 0, 12},
+    {1, 0, 14, 5, 0, 22},
+    {1, 0, 14, 5, 0, 12},
+    {1, 0, 19, 5, 0, 21},
+    {1, 0, 20, 5, 0, 21},
+    {1, 0, 21, 5, 0, 21},
+    {1, 0, 22, 5, 0, 21},
+    {1, 0, 14, 5, 0, 21},
+    {15, 0, 8, 5, 0, 12},
+    {25, 0, 9, 5, 0, 12},
+    {6, 0, 0, 4, 1, 29},
+    {23, 0, 10, 5, 0, 10},
+    {23, 0, 10, 1, 0, 9},
+    {2, 0, 18, 5, 102, 9},
+    {9, 0, 0, 5, 0, 12},
+    {26, 0, 18, 4, 0, 10},
+    {26, 0, 18, 4, 0, 29},
+    {5, 0, 0, 4, 0, 29},
+    {26, 0, 18, 4, 0, 9},
+    {9, 0, 0, 4, 1, 29},
+    {26, 0, 10, 5, 0, 12},
+    {15, 0, 18, 5, 0, 12},
+    {15, 0, 18, 4, 0, 12},
+    {15, 0, 18, 5, 0, 29},
+    {14, 0, 0, 4, 1, 29},
+    {14, 0, 0, 5, 1, 12},
+    {25, 0, 9, 5, 0, 9},
+    {25, 0, 10, 5, 0, 9},
+    {25, 0, 18, 5, 0, 15},
+    {26, 0, 18, 2, 0, 14},
+    {22, 0, 18, 2, 0, 0},
+    {18, 0, 18, 2, 0, 1},
+    {26, 0, 18, 2, 0, 12},
+    {26, 0, 18, 5, 0, 14},
+    {26, 0, 0, 4, 0, 29},
+    {26, 0, 18, 5, 0, 29},
+    {25, 0, 18, 2, 0, 12},
+    {26, 0, 18, 4, 0, 14},
+    {26, 0, 18, 5, 0, 41},
+    {26, 0, 18, 4, 0, 41},
+    {26, 0, 18, 2, 0, 41},
+    {26, 0, 18, 2, 0, 29},
+    {26, 0, 18, 5, 0, 3},
+    {26, 0, 18, 5, 0, 6},
+    {26, 0, 0, 5, 52, 12},
+    {9, 0, 0, 5, 56, 12},
+    {5, 0, 0, 5, 56, 12},
+    {26, 0, 18, 5, 54, 12},
+    {12, 230, 13, 5, 54, 21},
+    {21, 0, 18, 5, 54, 6},
+    {21, 0, 18, 5, 54, 17},
+    {15, 0, 18, 5, 54, 12},
+    {7, 0, 0, 5, 57, 12},
+    {6, 0, 0, 5, 57, 12},
+    {21, 0, 0, 5, 57, 17},
+    {12, 9, 13, 5, 57, 21},
+    {21, 0, 18, 5, 0, 3},
+    {21, 0, 18, 5, 0, 0},
+    {17, 0, 18, 5, 0, 12},
+    {17, 0, 18, 5, 0, 19},
+    {26, 0, 18, 2, 35, 14},
+    {29, 0, 17, 0, 0, 17},
+    {21, 0, 18, 2, 0, 1},
+    {21, 0, 18, 2, 0, 14},
+    {6, 0, 0, 2, 35, 5},
+    {7, 0, 0, 2, 0, 14},
+    {14, 0, 0, 2, 35, 14},
+    {17, 0, 18, 2, 0, 5},
+    {12, 218, 13, 2, 40, 21},
+    {12, 228, 13, 2, 40, 21},
+    {12, 232, 13, 2, 40, 21},
+    {12, 222, 13, 2, 40, 21},
+    {10, 224, 0, 2, 24, 21},
+    {17, 0, 18, 2, 0, 14},
+    {6, 0, 0, 2, 0, 14},
+    {6, 0, 0, 2, 0, 21},
+    {7, 0, 0, 2, 0, 5},
+    {7, 0, 0, 2, 32, 32},
+    {7, 0, 0, 2, 32, 14},
+    {12, 8, 13, 2, 40, 21},
+    {24, 0, 18, 2, 0, 5},
+    {6, 0, 0, 2, 32, 5},
+    {7, 0, 0, 2, 33, 32},
+    {7, 0, 0, 2, 33, 14},
+    {21, 0, 18, 2, 0, 5},
+    {6, 0, 0, 2, 0, 32},
+    {6, 0, 0, 2, 33, 5},
+    {7, 0, 0, 2, 34, 14},
+    {7, 0, 0, 2, 24, 14},
+    {26, 0, 0, 2, 0, 14},
+    {15, 0, 0, 2, 0, 14},
+    {26, 0, 0, 2, 24, 14},
+    {26, 0, 18, 2, 24, 14},
+    {15, 0, 0, 4, 0, 29},
+    {15, 0, 18, 2, 0, 14},
+    {26, 0, 0, 2, 33, 14},
+    {7, 0, 0, 2, 35, 14},
+    {2, 0, 18, 2, 102, 14},
+    {7, 0, 0, 2, 36, 14},
+    {6, 0, 0, 2, 36, 5},
+    {26, 0, 18, 2, 36, 14},
+    {7, 0, 0, 5, 82, 12},
+    {6, 0, 0, 5, 82, 12},
+    {21, 0, 0, 5, 82, 17},
+    {7, 0, 0, 5, 69, 12},
+    {6, 0, 0, 5, 69, 12},
+    {21, 0, 18, 5, 69, 17},
+    {21, 0, 18, 5, 69, 6},
+    {13, 0, 0, 5, 69, 11},
+    {7, 0, 0, 5, 3, 12},
+    {21, 0, 18, 5, 3, 12},
+    {6, 0, 18, 5, 3, 12},
+    {7, 0, 0, 5, 83, 12},
+    {14, 0, 0, 5, 83, 12},
+    {12, 230, 13, 5, 83, 21},
+    {21, 0, 0, 5, 83, 12},
+    {21, 0, 0, 5, 83, 17},
+    {24, 0, 0, 5, 0, 12},
+    {7, 0, 0, 5, 58, 12},
+    {12, 0, 13, 5, 58, 21},
+    {12, 9, 13, 5, 58, 21},
+    {10, 0, 0, 5, 58, 21},
+    {26, 0, 18, 5, 58, 12},
+    {15, 0, 0, 5, 0, 12},
+    {7, 0, 0, 5, 64, 12},
+    {21, 0, 18, 5, 64, 18},
+    {21, 0, 18, 5, 64, 6},
+    {10, 0, 0, 5, 70, 21},
+    {7, 0, 0, 5, 70, 12},
+    {12, 9, 13, 5, 70, 21},
+    {12, 0, 13, 5, 70, 21},
+    {21, 0, 0, 5, 70, 17},
+    {13, 0, 0, 5, 70, 11},
+    {21, 0, 0, 5, 9, 18},
+    {13, 0, 0, 5, 71, 11},
+    {7, 0, 0, 5, 71, 12},
+    {12, 0, 13, 5, 71, 21},
+    {12, 220, 13, 5, 71, 21},
+    {21, 0, 0, 5, 71, 17},
+    {7, 0, 0, 5, 72, 12},
+    {12, 0, 13, 5, 72, 21},
+    {10, 0, 0, 5, 72, 21},
+    {10, 9, 0, 5, 72, 21},
+    {21, 0, 0, 5, 72, 12},
+    {12, 0, 13, 5, 84, 21},
+    {10, 0, 0, 5, 84, 21},
+    {7, 0, 0, 5, 84, 12},
+    {12, 7, 13, 5, 84, 21},
+    {10, 9, 0, 5, 84, 21},
+    {21, 0, 0, 5, 84, 12},
+    {21, 0, 0, 5, 84, 17},
+    {13, 0, 0, 5, 84, 11},
+    {6, 0, 0, 5, 22, 36},
+    {7, 0, 0, 5, 76, 12},
+    {12, 0, 13, 5, 76, 21},
+    {10, 0, 0, 5, 76, 21},
+    {13, 0, 0, 5, 76, 11},
+    {21, 0, 0, 5, 76, 12},
+    {21, 0, 0, 5, 76, 17},
+    {7, 0, 0, 5, 78, 36},
+    {12, 230, 13, 5, 78, 36},
+    {12, 220, 13, 5, 78, 36},
+    {6, 0, 0, 5, 78, 36},
+    {21, 0, 0, 5, 78, 36},
+    {7, 0, 0, 5, 85, 12},
+    {10, 0, 0, 5, 85, 21},
+    {12, 0, 13, 5, 85, 21},
+    {21, 0, 0, 5, 85, 17},
+    {6, 0, 0, 5, 85, 12},
+    {12, 9, 13, 5, 85, 21},
+    {13, 0, 0, 5, 85, 11},
+    {7, 0, 0, 2, 24, 23},
+    {7, 0, 0, 2, 24, 24},
+    {4, 0, 0, 5, 102, 37},
+    {3, 0, 0, 4, 102, 39},
+    {12, 26, 13, 5, 5, 21},
+    {25, 0, 9, 5, 5, 12},
+    {24, 0, 4, 5, 6, 12},
+    {12, 0, 13, 4, 40, 21},
+    {21, 0, 18, 2, 0, 8},
+    {21, 0, 18, 2, 0, 6},
+    {21, 0, 18, 2, 0, 15},
+    {16, 0, 18, 2, 0, 14},
+    {21, 0, 12, 2, 0, 1},
+    {21, 0, 12, 2, 0, 5},
+    {21, 0, 10, 2, 0, 14},
+    {25, 0, 9, 2, 0, 14},
+    {17, 0, 9, 2, 0, 14},
+    {25, 0, 18, 2, 0, 14},
+    {23, 0, 10, 2, 0, 9},
+    {21, 0, 10, 2, 0, 10},
+    {21, 0, 18, 0, 0, 6},
+    {21, 0, 18, 0, 0, 14},
+    {21, 0, 10, 0, 0, 14},
+    {23, 0, 10, 0, 0, 9},
+    {21, 0, 10, 0, 0, 10},
+    {22, 0, 18, 0, 0, 0},
+    {18, 0, 18, 0, 0, 1},
+    {25, 0, 9, 0, 0, 14},
+    {21, 0, 12, 0, 0, 1},
+    {17, 0, 9, 0, 0, 14},
+    {21, 0, 12, 0, 0, 14},
+    {13, 0, 8, 0, 0, 14},
+    {21, 0, 12, 0, 0, 5},
+    {21, 0, 18, 0, 0, 5},
+    {25, 0, 18, 0, 0, 14},
+    {9, 0, 0, 0, 1, 14},
+    {24, 0, 18, 0, 0, 14},
+    {16, 0, 18, 0, 0, 14},
+    {5, 0, 0, 0, 1, 14},
+    {21, 0, 18, 1, 0, 1},
+    {22, 0, 18, 1, 0, 0},
+    {18, 0, 18, 1, 0, 1},
+    {21, 0, 18, 1, 0, 5},
+    {7, 0, 0, 1, 33, 14},
+    {7, 0, 0, 1, 33, 32},
+    {6, 0, 0, 1, 0, 32},
+    {6, 0, 0, 1, 0, 5},
+    {7, 0, 0, 1, 24, 14},
+    {23, 0, 10, 0, 0, 10},
+    {26, 0, 18, 0, 0, 14},
+    {26, 0, 18, 1, 0, 12},
+    {25, 0, 18, 1, 0, 12},
+    {1, 0, 18, 5, 0, 21},
+    {26, 0, 18, 5, 0, 31},
+    {7, 0, 0, 5, 47, 12},
+    {14, 0, 18, 5, 2, 12},
+    {15, 0, 18, 5, 2, 12},
+    {26, 0, 18, 5, 2, 12},
+    {26, 0, 0, 5, 2, 12},
+    {7, 0, 0, 5, 73, 12},
+    {7, 0, 0, 5, 74, 12},
+    {7, 0, 0, 5, 37, 12},
+    {15, 0, 0, 5, 37, 12},
+    {7, 0, 0, 5, 38, 12},
+    {14, 0, 0, 5, 38, 12},
+    {7, 0, 0, 5, 118, 12},
+    {12, 230, 13, 5, 118, 21},
+    {7, 0, 0, 5, 48, 12},
+    {21, 0, 0, 5, 48, 17},
+    {7, 0, 0, 5, 59, 12},
+    {21, 0, 0, 5, 59, 17},
+    {14, 0, 0, 5, 59, 12},
+    {9, 0, 0, 5, 39, 12},
+    {5, 0, 0, 5, 39, 12},
+    {7, 0, 0, 5, 49, 12},
+    {7, 0, 0, 5, 50, 12},
+    {13, 0, 0, 5, 50, 11},
+    {9, 0, 0, 5, 136, 12},
+    {5, 0, 0, 5, 136, 12},
+    {7, 0, 0, 5, 106, 12},
+    {7, 0, 0, 5, 104, 12},
+    {21, 0, 0, 5, 104, 12},
+    {7, 0, 0, 5, 110, 12},
+    {7, 0, 3, 5, 51, 12},
+    {7, 0, 3, 5, 86, 12},
+    {21, 0, 3, 5, 86, 17},
+    {15, 0, 3, 5, 86, 12},
+    {7, 0, 3, 5, 120, 12},
+    {26, 0, 3, 5, 120, 12},
+    {15, 0, 3, 5, 120, 12},
+    {7, 0, 3, 5, 116, 12},
+    {15, 0, 3, 5, 116, 12},
+    {7, 0, 3, 5, 128, 12},
+    {15, 0, 3, 5, 128, 12},
+    {7, 0, 3, 5, 63, 12},
+    {15, 0, 3, 5, 63, 12},
+    {21, 0, 18, 5, 63, 17},
+    {7, 0, 3, 5, 75, 12},
+    {21, 0, 3, 5, 75, 12},
+    {7, 0, 3, 5, 97, 12},
+    {7, 0, 3, 5, 96, 12},
+    {15, 0, 3, 5, 96, 12},
+    {7, 0, 3, 5, 60, 12},
+    {12, 0, 13, 5, 60, 21},
+    {12, 220, 13, 5, 60, 21},
+    {12, 230, 13, 5, 60, 21},
+    {12, 1, 13, 5, 60, 21},
+    {12, 9, 13, 5, 60, 21},
+    {15, 0, 3, 5, 60, 12},
+    {21, 0, 3, 5, 60, 17},
+    {21, 0, 3, 5, 60, 12},
+    {7, 0, 3, 5, 87, 12},
+    {15, 0, 3, 5, 87, 12},
+    {21, 0, 3, 5, 87, 12},
+    {7, 0, 3, 5, 117, 12},
+    {15, 0, 3, 5, 117, 12},
+    {7, 0, 3, 5, 112, 12},
+    {26, 0, 3, 5, 112, 12},
+    {12, 230, 13, 5, 112, 21},
+    {12, 220, 13, 5, 112, 21},
+    {15, 0, 3, 5, 112, 12},
+    {21, 0, 3, 5, 112, 17},
+    {21, 0, 3, 5, 112, 15},
+    {7, 0, 3, 5, 79, 12},
+    {21, 0, 18, 5, 79, 17},
+    {7, 0, 3, 5, 88, 12},
+    {15, 0, 3, 5, 88, 12},
+    {7, 0, 3, 5, 89, 12},
+    {15, 0, 3, 5, 89, 12},
+    {7, 0, 3, 5, 122, 12},
+    {21, 0, 3, 5, 122, 12},
+    {15, 0, 3, 5, 122, 12},
+    {7, 0, 3, 5, 90, 12},
+    {9, 0, 3, 5, 130, 12},
+    {5, 0, 3, 5, 130, 12},
+    {15, 0, 3, 5, 130, 12},
+    {7, 0, 4, 5, 144, 12},
+    {12, 230, 13, 5, 144, 21},
+    {13, 0, 11, 5, 144, 11},
+    {15, 0, 11, 5, 6, 12},
+    {7, 0, 3, 5, 147, 12},
+    {15, 0, 3, 5, 147, 12},
+    {7, 0, 4, 5, 148, 12},
+    {12, 220, 13, 5, 148, 21},
+    {12, 230, 13, 5, 148, 21},
+    {15, 0, 4, 5, 148, 12},
+    {21, 0, 4, 5, 148, 12},
+    {10, 0, 0, 5, 93, 21},
+    {12, 0, 13, 5, 93, 21},
+    {7, 0, 0, 5, 93, 12},
+    {12, 9, 13, 5, 93, 21},
+    {21, 0, 0, 5, 93, 17},
+    {21, 0, 0, 5, 93, 12},
+    {15, 0, 18, 5, 93, 12},
+    {13, 0, 0, 5, 93, 11},
+    {12, 0, 13, 5, 91, 21},
+    {10, 0, 0, 5, 91, 21},
+    {7, 0, 0, 5, 91, 12},
+    {12, 9, 13, 5, 91, 21},
+    {12, 7, 13, 5, 91, 21},
+    {21, 0, 0, 5, 91, 12},
+    {1, 0, 0, 5, 91, 12},
+    {21, 0, 0, 5, 91, 17},
+    {7, 0, 0, 5, 100, 12},
+    {13, 0, 0, 5, 100, 11},
+    {12, 230, 13, 5, 95, 21},
+    {7, 0, 0, 5, 95, 12},
+    {12, 0, 13, 5, 95, 21},
+    {10, 0, 0, 5, 95, 21},
+    {12, 9, 13, 5, 95, 21},
+    {13, 0, 0, 5, 95, 11},
+    {21, 0, 0, 5, 95, 17},
+    {7, 0, 0, 5, 111, 12},
+    {12, 7, 13, 5, 111, 21},
+    {21, 0, 0, 5, 111, 12},
+    {21, 0, 0, 5, 111, 18},
+    {12, 0, 13, 5, 99, 21},
+    {10, 0, 0, 5, 99, 21},
+    {7, 0, 0, 5, 99, 12},
+    {10, 9, 0, 5, 99, 21},
+    {21, 0, 0, 5, 99, 17},
+    {21, 0, 0, 5, 99, 12},
+    {12, 7, 13, 5, 99, 21},
+    {13, 0, 0, 5, 99, 11},
+    {21, 0, 0, 5, 99, 18},
+    {15, 0, 0, 5, 18, 12},
+    {7, 0, 0, 5, 108, 12},
+    {10, 0, 0, 5, 108, 21},
+    {12, 0, 13, 5, 108, 21},
+    {10, 9, 0, 5, 108, 21},
+    {12, 7, 13, 5, 108, 21},
+    {21, 0, 0, 5, 108, 17},
+    {21, 0, 0, 5, 108, 12},
+    {7, 0, 0, 5, 129, 12},
+    {21, 0, 0, 5, 129, 17},
+    {7, 0, 0, 5, 109, 12},
+    {12, 0, 13, 5, 109, 21},
+    {10, 0, 0, 5, 109, 21},
+    {12, 7, 13, 5, 109, 21},
+    {12, 9, 13, 5, 109, 21},
+    {13, 0, 0, 5, 109, 11},
+    {12, 0, 13, 5, 107, 21},
+    {10, 0, 0, 5, 107, 21},
+    {7, 0, 0, 5, 107, 12},
+    {12, 7, 13, 5, 40, 21},
+    {12, 7, 13, 5, 107, 21},
+    {10, 9, 0, 5, 107, 21},
+    {12, 230, 13, 5, 107, 21},
+    {7, 0, 0, 5, 135, 12},
+    {10, 0, 0, 5, 135, 21},
+    {12, 0, 13, 5, 135, 21},
+    {12, 9, 13, 5, 135, 21},
+    {12, 7, 13, 5, 135, 21},
+    {21, 0, 0, 5, 135, 17},
+    {21, 0, 0, 5, 135, 12},
+    {13, 0, 0, 5, 135, 11},
+    {12, 230, 13, 5, 135, 21},
+    {7, 0, 0, 5, 124, 12},
+    {10, 0, 0, 5, 124, 21},
+    {12, 0, 13, 5, 124, 21},
+    {12, 9, 13, 5, 124, 21},
+    {12, 7, 13, 5, 124, 21},
+    {21, 0, 0, 5, 124, 12},
+    {13, 0, 0, 5, 124, 11},
+    {7, 0, 0, 5, 123, 12},
+    {10, 0, 0, 5, 123, 21},
+    {12, 0, 13, 5, 123, 21},
+    {12, 9, 13, 5, 123, 21},
+    {12, 7, 13, 5, 123, 21},
+    {21, 0, 0, 5, 123, 18},
+    {21, 0, 0, 5, 123, 17},
+    {21, 0, 0, 5, 123, 6},
+    {21, 0, 0, 5, 123, 12},
+    {7, 0, 0, 5, 114, 12},
+    {10, 0, 0, 5, 114, 21},
+    {12, 0, 13, 5, 114, 21},
+    {12, 9, 13, 5, 114, 21},
+    {21, 0, 0, 5, 114, 17},
+    {21, 0, 0, 5, 114, 12},
+    {13, 0, 0, 5, 114, 11},
+    {21, 0, 18, 5, 31, 18},
+    {7, 0, 0, 5, 101, 12},
+    {12, 0, 13, 5, 101, 21},
+    {10, 0, 0, 5, 101, 21},
+    {10, 9, 0, 5, 101, 21},
+    {12, 7, 13, 5, 101, 21},
+    {13, 0, 0, 5, 101, 11},
+    {7, 0, 0, 5, 126, 36},
+    {12, 0, 13, 5, 126, 36},
+    {10, 0, 0, 5, 126, 36},
+    {12, 9, 13, 5, 126, 36},
+    {13, 0, 0, 5, 126, 11},
+    {15, 0, 0, 5, 126, 36},
+    {21, 0, 0, 5, 126, 17},
+    {26, 0, 0, 5, 126, 36},
+    {7, 0, 0, 5, 142, 12},
+    {10, 0, 0, 5, 142, 21},
+    {12, 0, 13, 5, 142, 21},
+    {12, 9, 13, 5, 142, 21},
+    {12, 7, 13, 5, 142, 21},
+    {21, 0, 0, 5, 142, 12},
+    {9, 0, 0, 5, 125, 12},
+    {5, 0, 0, 5, 125, 12},
+    {13, 0, 0, 5, 125, 11},
+    {15, 0, 0, 5, 125, 12},
+    {7, 0, 0, 5, 125, 12},
+    {7, 0, 0, 5, 141, 12},
+    {12, 0, 13, 5, 141, 21},
+    {12, 0, 0, 5, 141, 21},
+    {12, 9, 13, 5, 141, 21},
+    {10, 0, 0, 5, 141, 21},
+    {21, 0, 0, 5, 141, 18},
+    {21, 0, 0, 5, 141, 12},
+    {21, 0, 0, 5, 141, 17},
+    {7, 0, 0, 5, 140, 12},
+    {12, 0, 13, 5, 140, 21},
+    {10, 0, 0, 5, 140, 21},
+    {12, 9, 13, 5, 140, 21},
+    {21, 0, 0, 5, 140, 17},
+    {21, 0, 0, 5, 140, 18},
+    {7, 0, 0, 5, 121, 12},
+    {7, 0, 0, 5, 133, 12},
+    {10, 0, 0, 5, 133, 21},
+    {12, 0, 13, 5, 133, 21},
+    {12, 9, 0, 5, 133, 21},
+    {21, 0, 0, 5, 133, 17},
+    {13, 0, 0, 5, 133, 11},
+    {15, 0, 0, 5, 133, 12},
+    {21, 0, 0, 5, 134, 18},
+    {21, 0, 0, 5, 134, 6},
+    {7, 0, 0, 5, 134, 12},
+    {12, 0, 13, 5, 134, 21},
+    {10, 0, 0, 5, 134, 21},
+    {7, 0, 0, 5, 138, 12},
+    {12, 0, 13, 5, 138, 21},
+    {12, 7, 13, 5, 138, 21},
+    {12, 9, 13, 5, 138, 21},
+    {13, 0, 0, 5, 138, 11},
+    {7, 0, 0, 5, 143, 12},
+    {10, 0, 0, 5, 143, 21},
+    {12, 0, 13, 5, 143, 21},
+    {12, 9, 13, 5, 143, 21},
+    {13, 0, 0, 5, 143, 11},
+    {7, 0, 0, 5, 145, 12},
+    {12, 0, 13, 5, 145, 21},
+    {10, 0, 0, 5, 145, 21},
+    {21, 0, 0, 5, 145, 12},
+    {7, 0, 0, 5, 62, 12},
+    {14, 0, 0, 5, 62, 12},
+    {21, 0, 0, 5, 62, 17},
+    {7, 0, 0, 5, 80, 12},
+    {7, 0, 0, 5, 80, 0},
+    {7, 0, 0, 5, 80, 1},
+    {7, 0, 0, 5, 127, 12},
+    {7, 0, 0, 5, 127, 0},
+    {7, 0, 0, 5, 127, 1},
+    {7, 0, 0, 5, 115, 12},
+    {13, 0, 0, 5, 115, 11},
+    {21, 0, 0, 5, 115, 17},
+    {7, 0, 0, 5, 103, 12},
+    {12, 1, 13, 5, 103, 21},
+    {21, 0, 0, 5, 103, 17},
+    {7, 0, 0, 5, 119, 12},
+    {12, 230, 13, 5, 119, 21},
+    {21, 0, 0, 5, 119, 17},
+    {21, 0, 0, 5, 119, 12},
+    {26, 0, 0, 5, 119, 12},
+    {6, 0, 0, 5, 119, 12},
+    {13, 0, 0, 5, 119, 11},
+    {15, 0, 0, 5, 119, 12},
+    {9, 0, 0, 5, 146, 12},
+    {5, 0, 0, 5, 146, 12},
+    {15, 0, 0, 5, 146, 12},
+    {21, 0, 0, 5, 146, 17},
+    {21, 0, 0, 5, 146, 12},
+    {7, 0, 0, 5, 98, 12},
+    {10, 0, 0, 5, 98, 21},
+    {12, 0, 13, 5, 98, 21},
+    {6, 0, 0, 5, 98, 12},
+    {6, 0, 0, 2, 137, 5},
+    {6, 0, 0, 2, 139, 5},
+    {7, 0, 0, 2, 137, 14},
+    {7, 0, 0, 2, 139, 14},
+    {7, 0, 0, 5, 105, 12},
+    {26, 0, 0, 5, 105, 12},
+    {12, 0, 13, 5, 105, 21},
+    {12, 1, 13, 5, 105, 21},
+    {21, 0, 0, 5, 105, 17},
+    {10, 216, 0, 5, 0, 21},
+    {10, 226, 0, 5, 0, 21},
+    {12, 230, 13, 5, 2, 21},
+    {25, 0, 0, 5, 0, 12},
+    {13, 0, 8, 5, 0, 11},
+    {26, 0, 0, 5, 131, 12},
+    {12, 0, 13, 5, 131, 21},
+    {21, 0, 0, 5, 131, 17},
+    {21, 0, 0, 5, 131, 12},
+    {12, 230, 13, 5, 56, 21},
+    {7, 0, 3, 5, 113, 12},
+    {15, 0, 3, 5, 113, 12},
+    {12, 220, 13, 5, 113, 21},
+    {9, 0, 3, 5, 132, 12},
+    {5, 0, 3, 5, 132, 12},
+    {12, 230, 13, 5, 132, 21},
+    {12, 7, 13, 5, 132, 21},
+    {13, 0, 3, 5, 132, 11},
+    {21, 0, 3, 5, 132, 0},
+    {15, 0, 4, 5, 0, 12},
+    {26, 0, 4, 5, 0, 10},
+    {23, 0, 4, 5, 0, 10},
+    {2, 0, 18, 5, 102, 14},
+    {26, 0, 0, 2, 0, 29},
+    {26, 0, 0, 5, 0, 28},
+    {26, 0, 0, 2, 32, 14},
+    {24, 0, 18, 2, 0, 42},
+    {26, 0, 18, 5, 0, 5},
+};
+
+#define BIDI_MIRROR_LEN 420
+static const MirrorPair mirror_pairs[] = {
+    {40, 41},
+    {41, 40},
+    {60, 62},
+    {62, 60},
+    {91, 93},
+    {93, 91},
+    {123, 125},
+    {125, 123},
+    {171, 187},
+    {187, 171},
+    {3898, 3899},
+    {3899, 3898},
+    {3900, 3901},
+    {3901, 3900},
+    {5787, 5788},
+    {5788, 5787},
+    {8249, 8250},
+    {8250, 8249},
+    {8261, 8262},
+    {8262, 8261},
+    {8317, 8318},
+    {8318, 8317},
+    {8333, 8334},
+    {8334, 8333},
+    {8712, 8715},
+    {8713, 8716},
+    {8714, 8717},
+    {8715, 8712},
+    {8716, 8713},
+    {8717, 8714},
+    {8725, 10741},
+    {8735, 11262},
+    {8736, 10659},
+    {8737, 10651},
+    {8738, 10656},
+    {8740, 10990},
+    {8764, 8765},
+    {8765, 8764},
+    {8771, 8909},
+    {8773, 8780},
+    {8780, 8773},
+    {8786, 8787},
+    {8787, 8786},
+    {8788, 8789},
+    {8789, 8788},
+    {8804, 8805},
+    {8805, 8804},
+    {8806, 8807},
+    {8807, 8806},
+    {8808, 8809},
+    {8809, 8808},
+    {8810, 8811},
+    {8811, 8810},
+    {8814, 8815},
+    {8815, 8814},
+    {8816, 8817},
+    {8817, 8816},
+    {8818, 8819},
+    {8819, 8818},
+    {8820, 8821},
+    {8821, 8820},
+    {8822, 8823},
+    {8823, 8822},
+    {8824, 8825},
+    {8825, 8824},
+    {8826, 8827},
+    {8827, 8826},
+    {8828, 8829},
+    {8829, 8828},
+    {8830, 8831},
+    {8831, 8830},
+    {8832, 8833},
+    {8833, 8832},
+    {8834, 8835},
+    {8835, 8834},
+    {8836, 8837},
+    {8837, 8836},
+    {8838, 8839},
+    {8839, 8838},
+    {8840, 8841},
+    {8841, 8840},
+    {8842, 8843},
+    {8843, 8842},
+    {8847, 8848},
+    {8848, 8847},
+    {8849, 8850},
+    {8850, 8849},
+    {8856, 10680},
+    {8866, 8867},
+    {8867, 8866},
+    {8870, 10974},
+    {8872, 10980},
+    {8873, 10979},
+    {8875, 10981},
+    {8880, 8881},
+    {8881, 8880},
+    {8882, 8883},
+    {8883, 8882},
+    {8884, 8885},
+    {8885, 8884},
+    {8886, 8887},
+    {8887, 8886},
+    {8888, 10204},
+    {8905, 8906},
+    {8906, 8905},
+    {8907, 8908},
+    {8908, 8907},
+    {8909, 8771},
+    {8912, 8913},
+    {8913, 8912},
+    {8918, 8919},
+    {8919, 8918},
+    {8920, 8921},
+    {8921, 8920},
+    {8922, 8923},
+    {8923, 8922},
+    {8924, 8925},
+    {8925, 8924},
+    {8926, 8927},
+    {8927, 8926},
+    {8928, 8929},
+    {8929, 8928},
+    {8930, 8931},
+    {8931, 8930},
+    {8932, 8933},
+    {8933, 8932},
+    {8934, 8935},
+    {8935, 8934},
+    {8936, 8937},
+    {8937, 8936},
+    {8938, 8939},
+    {8939, 8938},
+    {8940, 8941},
+    {8941, 8940},
+    {8944, 8945},
+    {8945, 8944},
+    {8946, 8954},
+    {8947, 8955},
+    {8948, 8956},
+    {8950, 8957},
+    {8951, 8958},
+    {8954, 8946},
+    {8955, 8947},
+    {8956, 8948},
+    {8957, 8950},
+    {8958, 8951},
+    {8968, 8969},
+    {8969, 8968},
+    {8970, 8971},
+    {8971, 8970},
+    {9001, 9002},
+    {9002, 9001},
+    {10088, 10089},
+    {10089, 10088},
+    {10090, 10091},
+    {10091, 10090},
+    {10092, 10093},
+    {10093, 10092},
+    {10094, 10095},
+    {10095, 10094},
+    {10096, 10097},
+    {10097, 10096},
+    {10098, 10099},
+    {10099, 10098},
+    {10100, 10101},
+    {10101, 10100},
+    {10179, 10180},
+    {10180, 10179},
+    {10181, 10182},
+    {10182, 10181},
+    {10184, 10185},
+    {10185, 10184},
+    {10187, 10189},
+    {10189, 10187},
+    {10197, 10198},
+    {10198, 10197},
+    {10204, 8888},
+    {10205, 10206},
+    {10206, 10205},
+    {10210, 10211},
+    {10211, 10210},
+    {10212, 10213},
+    {10213, 10212},
+    {10214, 10215},
+    {10215, 10214},
+    {10216, 10217},
+    {10217, 10216},
+    {10218, 10219},
+    {10219, 10218},
+    {10220, 10221},
+    {10221, 10220},
+    {10222, 10223},
+    {10223, 10222},
+    {10627, 10628},
+    {10628, 10627},
+    {10629, 10630},
+    {10630, 10629},
+    {10631, 10632},
+    {10632, 10631},
+    {10633, 10634},
+    {10634, 10633},
+    {10635, 10636},
+    {10636, 10635},
+    {10637, 10640},
+    {10638, 10639},
+    {10639, 10638},
+    {10640, 10637},
+    {10641, 10642},
+    {10642, 10641},
+    {10643, 10644},
+    {10644, 10643},
+    {10645, 10646},
+    {10646, 10645},
+    {10647, 10648},
+    {10648, 10647},
+    {10651, 8737},
+    {10656, 8738},
+    {10659, 8736},
+    {10660, 10661},
+    {10661, 10660},
+    {10664, 10665},
+    {10665, 10664},
+    {10666, 10667},
+    {10667, 10666},
+    {10668, 10669},
+    {10669, 10668},
+    {10670, 10671},
+    {10671, 10670},
+    {10680, 8856},
+    {10688, 10689},
+    {10689, 10688},
+    {10692, 10693},
+    {10693, 10692},
+    {10703, 10704},
+    {10704, 10703},
+    {10705, 10706},
+    {10706, 10705},
+    {10708, 10709},
+    {10709, 10708},
+    {10712, 10713},
+    {10713, 10712},
+    {10714, 10715},
+    {10715, 10714},
+    {10728, 10729},
+    {10729, 10728},
+    {10741, 8725},
+    {10744, 10745},
+    {10745, 10744},
+    {10748, 10749},
+    {10749, 10748},
+    {10795, 10796},
+    {10796, 10795},
+    {10797, 10798},
+    {10798, 10797},
+    {10804, 10805},
+    {10805, 10804},
+    {10812, 10813},
+    {10813, 10812},
+    {10852, 10853},
+    {10853, 10852},
+    {10873, 10874},
+    {10874, 10873},
+    {10875, 10876},
+    {10876, 10875},
+    {10877, 10878},
+    {10878, 10877},
+    {10879, 10880},
+    {10880, 10879},
+    {10881, 10882},
+    {10882, 10881},
+    {10883, 10884},
+    {10884, 10883},
+    {10885, 10886},
+    {10886, 10885},
+    {10887, 10888},
+    {10888, 10887},
+    {10889, 10890},
+    {10890, 10889},
+    {10891, 10892},
+    {10892, 10891},
+    {10893, 10894},
+    {10894, 10893},
+    {10895, 10896},
+    {10896, 10895},
+    {10897, 10898},
+    {10898, 10897},
+    {10899, 10900},
+    {10900, 10899},
+    {10901, 10902},
+    {10902, 10901},
+    {10903, 10904},
+    {10904, 10903},
+    {10905, 10906},
+    {10906, 10905},
+    {10907, 10908},
+    {10908, 10907},
+    {10909, 10910},
+    {10910, 10909},
+    {10911, 10912},
+    {10912, 10911},
+    {10913, 10914},
+    {10914, 10913},
+    {10918, 10919},
+    {10919, 10918},
+    {10920, 10921},
+    {10921, 10920},
+    {10922, 10923},
+    {10923, 10922},
+    {10924, 10925},
+    {10925, 10924},
+    {10927, 10928},
+    {10928, 10927},
+    {10929, 10930},
+    {10930, 10929},
+    {10931, 10932},
+    {10932, 10931},
+    {10933, 10934},
+    {10934, 10933},
+    {10935, 10936},
+    {10936, 10935},
+    {10937, 10938},
+    {10938, 10937},
+    {10939, 10940},
+    {10940, 10939},
+    {10941, 10942},
+    {10942, 10941},
+    {10943, 10944},
+    {10944, 10943},
+    {10945, 10946},
+    {10946, 10945},
+    {10947, 10948},
+    {10948, 10947},
+    {10949, 10950},
+    {10950, 10949},
+    {10951, 10952},
+    {10952, 10951},
+    {10953, 10954},
+    {10954, 10953},
+    {10955, 10956},
+    {10956, 10955},
+    {10957, 10958},
+    {10958, 10957},
+    {10959, 10960},
+    {10960, 10959},
+    {10961, 10962},
+    {10962, 10961},
+    {10963, 10964},
+    {10964, 10963},
+    {10965, 10966},
+    {10966, 10965},
+    {10974, 8870},
+    {10979, 8873},
+    {10980, 8872},
+    {10981, 8875},
+    {10988, 10989},
+    {10989, 10988},
+    {10990, 8740},
+    {10999, 11000},
+    {11000, 10999},
+    {11001, 11002},
+    {11002, 11001},
+    {11262, 8735},
+    {11778, 11779},
+    {11779, 11778},
+    {11780, 11781},
+    {11781, 11780},
+    {11785, 11786},
+    {11786, 11785},
+    {11788, 11789},
+    {11789, 11788},
+    {11804, 11805},
+    {11805, 11804},
+    {11808, 11809},
+    {11809, 11808},
+    {11810, 11811},
+    {11811, 11810},
+    {11812, 11813},
+    {11813, 11812},
+    {11814, 11815},
+    {11815, 11814},
+    {11816, 11817},
+    {11817, 11816},
+    {12296, 12297},
+    {12297, 12296},
+    {12298, 12299},
+    {12299, 12298},
+    {12300, 12301},
+    {12301, 12300},
+    {12302, 12303},
+    {12303, 12302},
+    {12304, 12305},
+    {12305, 12304},
+    {12308, 12309},
+    {12309, 12308},
+    {12310, 12311},
+    {12311, 12310},
+    {12312, 12313},
+    {12313, 12312},
+    {12314, 12315},
+    {12315, 12314},
+    {65113, 65114},
+    {65114, 65113},
+    {65115, 65116},
+    {65116, 65115},
+    {65117, 65118},
+    {65118, 65117},
+    {65124, 65125},
+    {65125, 65124},
+    {65288, 65289},
+    {65289, 65288},
+    {65308, 65310},
+    {65310, 65308},
+    {65339, 65341},
+    {65341, 65339},
+    {65371, 65373},
+    {65373, 65371},
+    {65375, 65376},
+    {65376, 65375},
+    {65378, 65379},
+    {65379, 65378},
+};
+
+#define BIDI_BRACKET_LEN 120
+static const BracketPair bracket_pairs[] = {
+    {40, 41, 0},
+    {41, 40, 1},
+    {91, 93, 0},
+    {93, 91, 1},
+    {123, 125, 0},
+    {125, 123, 1},
+    {3898, 3899, 0},
+    {3899, 3898, 1},
+    {3900, 3901, 0},
+    {3901, 3900, 1},
+    {5787, 5788, 0},
+    {5788, 5787, 1},
+    {8261, 8262, 0},
+    {8262, 8261, 1},
+    {8317, 8318, 0},
+    {8318, 8317, 1},
+    {8333, 8334, 0},
+    {8334, 8333, 1},
+    {8968, 8969, 0},
+    {8969, 8968, 1},
+    {8970, 8971, 0},
+    {8971, 8970, 1},
+    {9001, 9002, 0},
+    {9002, 9001, 1},
+    {10088, 10089, 0},
+    {10089, 10088, 1},
+    {10090, 10091, 0},
+    {10091, 10090, 1},
+    {10092, 10093, 0},
+    {10093, 10092, 1},
+    {10094, 10095, 0},
+    {10095, 10094, 1},
+    {10096, 10097, 0},
+    {10097, 10096, 1},
+    {10098, 10099, 0},
+    {10099, 10098, 1},
+    {10100, 10101, 0},
+    {10101, 10100, 1},
+    {10181, 10182, 0},
+    {10182, 10181, 1},
+    {10214, 10215, 0},
+    {10215, 10214, 1},
+    {10216, 10217, 0},
+    {10217, 10216, 1},
+    {10218, 10219, 0},
+    {10219, 10218, 1},
+    {10220, 10221, 0},
+    {10221, 10220, 1},
+    {10222, 10223, 0},
+    {10223, 10222, 1},
+    {10627, 10628, 0},
+    {10628, 10627, 1},
+    {10629, 10630, 0},
+    {10630, 10629, 1},
+    {10631, 10632, 0},
+    {10632, 10631, 1},
+    {10633, 10634, 0},
+    {10634, 10633, 1},
+    {10635, 10636, 0},
+    {10636, 10635, 1},
+    {10637, 10640, 0},
+    {10638, 10639, 1},
+    {10639, 10638, 0},
+    {10640, 10637, 1},
+    {10641, 10642, 0},
+    {10642, 10641, 1},
+    {10643, 10644, 0},
+    {10644, 10643, 1},
+    {10645, 10646, 0},
+    {10646, 10645, 1},
+    {10647, 10648, 0},
+    {10648, 10647, 1},
+    {10712, 10713, 0},
+    {10713, 10712, 1},
+    {10714, 10715, 0},
+    {10715, 10714, 1},
+    {10748, 10749, 0},
+    {10749, 10748, 1},
+    {11810, 11811, 0},
+    {11811, 11810, 1},
+    {11812, 11813, 0},
+    {11813, 11812, 1},
+    {11814, 11815, 0},
+    {11815, 11814, 1},
+    {11816, 11817, 0},
+    {11817, 11816, 1},
+    {12296, 12297, 0},
+    {12297, 12296, 1},
+    {12298, 12299, 0},
+    {12299, 12298, 1},
+    {12300, 12301, 0},
+    {12301, 12300, 1},
+    {12302, 12303, 0},
+    {12303, 12302, 1},
+    {12304, 12305, 0},
+    {12305, 12304, 1},
+    {12308, 12309, 0},
+    {12309, 12308, 1},
+    {12310, 12311, 0},
+    {12311, 12310, 1},
+    {12312, 12313, 0},
+    {12313, 12312, 1},
+    {12314, 12315, 0},
+    {12315, 12314, 1},
+    {65113, 65114, 0},
+    {65114, 65113, 1},
+    {65115, 65116, 0},
+    {65116, 65115, 1},
+    {65117, 65118, 0},
+    {65118, 65117, 1},
+    {65288, 65289, 0},
+    {65289, 65288, 1},
+    {65339, 65341, 0},
+    {65341, 65339, 1},
+    {65371, 65373, 0},
+    {65373, 65371, 1},
+    {65375, 65376, 0},
+    {65376, 65375, 1},
+    {65378, 65379, 0},
+    {65379, 65378, 1},
+};
+
+/* Reindexing of NFC first characters. */
+#define TOTAL_FIRST 376
+#define TOTAL_LAST 62
+static const Reindex nfc_first[] = {
+  { 60, 2, 0},
+  { 65, 15, 3},
+  { 82, 8, 19},
+  { 97, 15, 28},
+  { 114, 8, 44},
+  { 168, 0, 53},
+  { 194, 0, 54},
+  { 196, 3, 55},
+  { 202, 0, 59},
+  { 207, 0, 60},
+  { 212, 2, 61},
+  { 216, 0, 64},
+  { 220, 0, 65},
+  { 226, 0, 66},
+  { 228, 3, 67},
+  { 234, 0, 71},
+  { 239, 0, 72},
+  { 244, 2, 73},
+  { 248, 0, 76},
+  { 252, 0, 77},
+  { 258, 1, 78},
+  { 274, 1, 80},
+  { 332, 1, 82},
+  { 346, 1, 84},
+  { 352, 1, 86},
+  { 360, 3, 88},
+  { 383, 0, 92},
+  { 416, 1, 93},
+  { 431, 1, 95},
+  { 439, 0, 97},
+  { 490, 1, 98},
+  { 550, 3, 100},
+  { 558, 1, 104},
+  { 658, 0, 106},
+  { 913, 0, 107},
+  { 917, 0, 108},
+  { 919, 0, 109},
+  { 921, 0, 110},
+  { 927, 0, 111},
+  { 929, 0, 112},
+  { 933, 0, 113},
+  { 937, 0, 114},
+  { 940, 0, 115},
+  { 942, 0, 116},
+  { 945, 0, 117},
+  { 949, 0, 118},
+  { 951, 0, 119},
+  { 953, 0, 120},
+  { 959, 0, 121},
+  { 961, 0, 122},
+  { 965, 0, 123},
+  { 969, 2, 124},
+  { 974, 0, 127},
+  { 978, 0, 128},
+  { 1030, 0, 129},
+  { 1040, 0, 130},
+  { 1043, 0, 131},
+  { 1045, 3, 132},
+  { 1050, 0, 136},
+  { 1054, 0, 137},
+  { 1059, 0, 138},
+  { 1063, 0, 139},
+  { 1067, 0, 140},
+  { 1069, 0, 141},
+  { 1072, 0, 142},
+  { 1075, 0, 143},
+  { 1077, 3, 144},
+  { 1082, 0, 148},
+  { 1086, 0, 149},
+  { 1091, 0, 150},
+  { 1095, 0, 151},
+  { 1099, 0, 152},
+  { 1101, 0, 153},
+  { 1110, 0, 154},
+  { 1140, 1, 155},
+  { 1240, 1, 157},
+  { 1256, 1, 159},
+  { 1575, 0, 161},
+  { 1608, 0, 162},
+  { 1610, 0, 163},
+  { 1729, 0, 164},
+  { 1746, 0, 165},
+  { 1749, 0, 166},
+  { 2344, 0, 167},
+  { 2352, 0, 168},
+  { 2355, 0, 169},
+  { 2503, 0, 170},
+  { 2887, 0, 171},
+  { 2962, 0, 172},
+  { 3014, 1, 173},
+  { 3142, 0, 175},
+  { 3263, 0, 176},
+  { 3270, 0, 177},
+  { 3274, 0, 178},
+  { 3398, 1, 179},
+  { 3545, 0, 181},
+  { 3548, 0, 182},
+  { 4133, 0, 183},
+  { 6917, 0, 184},
+  { 6919, 0, 185},
+  { 6921, 0, 186},
+  { 6923, 0, 187},
+  { 6925, 0, 188},
+  { 6929, 0, 189},
+  { 6970, 0, 190},
+  { 6972, 0, 191},
+  { 6974, 1, 192},
+  { 6978, 0, 194},
+  { 7734, 1, 195},
+  { 7770, 1, 197},
+  { 7778, 1, 199},
+  { 7840, 1, 201},
+  { 7864, 1, 203},
+  { 7884, 1, 205},
+  { 7936, 17, 207},
+  { 7960, 1, 225},
+  { 7968, 17, 227},
+  { 7992, 1, 245},
+  { 8000, 1, 247},
+  { 8008, 1, 249},
+  { 8016, 1, 251},
+  { 8025, 0, 253},
+  { 8032, 16, 254},
+  { 8052, 0, 271},
+  { 8060, 0, 272},
+  { 8118, 0, 273},
+  { 8127, 0, 274},
+  { 8134, 0, 275},
+  { 8182, 0, 276},
+  { 8190, 0, 277},
+  { 8592, 0, 278},
+  { 8594, 0, 279},
+  { 8596, 0, 280},
+  { 8656, 0, 281},
+  { 8658, 0, 282},
+  { 8660, 0, 283},
+  { 8707, 0, 284},
+  { 8712, 0, 285},
+  { 8715, 0, 286},
+  { 8739, 0, 287},
+  { 8741, 0, 288},
+  { 8764, 0, 289},
+  { 8771, 0, 290},
+  { 8773, 0, 291},
+  { 8776, 0, 292},
+  { 8781, 0, 293},
+  { 8801, 0, 294},
+  { 8804, 1, 295},
+  { 8818, 1, 297},
+  { 8822, 1, 299},
+  { 8826, 3, 301},
+  { 8834, 1, 305},
+  { 8838, 1, 307},
+  { 8849, 1, 309},
+  { 8866, 0, 311},
+  { 8872, 1, 312},
+  { 8875, 0, 314},
+  { 8882, 3, 315},
+  { 12358, 0, 319},
+  { 12363, 0, 320},
+  { 12365, 0, 321},
+  { 12367, 0, 322},
+  { 12369, 0, 323},
+  { 12371, 0, 324},
+  { 12373, 0, 325},
+  { 12375, 0, 326},
+  { 12377, 0, 327},
+  { 12379, 0, 328},
+  { 12381, 0, 329},
+  { 12383, 0, 330},
+  { 12385, 0, 331},
+  { 12388, 0, 332},
+  { 12390, 0, 333},
+  { 12392, 0, 334},
+  { 12399, 0, 335},
+  { 12402, 0, 336},
+  { 12405, 0, 337},
+  { 12408, 0, 338},
+  { 12411, 0, 339},
+  { 12445, 0, 340},
+  { 12454, 0, 341},
+  { 12459, 0, 342},
+  { 12461, 0, 343},
+  { 12463, 0, 344},
+  { 12465, 0, 345},
+  { 12467, 0, 346},
+  { 12469, 0, 347},
+  { 12471, 0, 348},
+  { 12473, 0, 349},
+  { 12475, 0, 350},
+  { 12477, 0, 351},
+  { 12479, 0, 352},
+  { 12481, 0, 353},
+  { 12484, 0, 354},
+  { 12486, 0, 355},
+  { 12488, 0, 356},
+  { 12495, 0, 357},
+  { 12498, 0, 358},
+  { 12501, 0, 359},
+  { 12504, 0, 360},
+  { 12507, 0, 361},
+  { 12527, 3, 362},
+  { 12541, 0, 366},
+  { 69785, 0, 367},
+  { 69787, 0, 368},
+  { 69797, 0, 369},
+  { 69937, 1, 370},
+  { 70471, 0, 372},
+  { 70841, 0, 373},
+  { 71096, 1, 374},
+  {0,0,0}
+};
+
+static const Reindex nfc_last[] = {
+  { 768, 4, 0},
+  { 774, 6, 5},
+  { 783, 0, 12},
+  { 785, 0, 13},
+  { 787, 1, 14},
+  { 795, 0, 16},
+  { 803, 5, 17},
+  { 813, 1, 23},
+  { 816, 1, 25},
+  { 824, 0, 27},
+  { 834, 0, 28},
+  { 837, 0, 29},
+  { 1619, 2, 30},
+  { 2364, 0, 33},
+  { 2494, 0, 34},
+  { 2519, 0, 35},
+  { 2878, 0, 36},
+  { 2902, 1, 37},
+  { 3006, 0, 39},
+  { 3031, 0, 40},
+  { 3158, 0, 41},
+  { 3266, 0, 42},
+  { 3285, 1, 43},
+  { 3390, 0, 45},
+  { 3415, 0, 46},
+  { 3530, 0, 47},
+  { 3535, 0, 48},
+  { 3551, 0, 49},
+  { 4142, 0, 50},
+  { 6965, 0, 51},
+  { 12441, 1, 52},
+  { 69818, 0, 54},
+  { 69927, 0, 55},
+  { 70462, 0, 56},
+  { 70487, 0, 57},
+  { 70832, 0, 58},
+  { 70842, 0, 59},
+  { 70845, 0, 60},
+  { 71087, 0, 61},
+  {0,0,0}
+};
+
+#define UCDN_EAST_ASIAN_F 0
+#define UCDN_EAST_ASIAN_H 1
+#define UCDN_EAST_ASIAN_W 2
+#define UCDN_EAST_ASIAN_NA 3
+#define UCDN_EAST_ASIAN_A 4
+#define UCDN_EAST_ASIAN_N 5
+
+#define UCDN_SCRIPT_COMMON 0
+#define UCDN_SCRIPT_LATIN 1
+#define UCDN_SCRIPT_GREEK 2
+#define UCDN_SCRIPT_CYRILLIC 3
+#define UCDN_SCRIPT_ARMENIAN 4
+#define UCDN_SCRIPT_HEBREW 5
+#define UCDN_SCRIPT_ARABIC 6
+#define UCDN_SCRIPT_SYRIAC 7
+#define UCDN_SCRIPT_THAANA 8
+#define UCDN_SCRIPT_DEVANAGARI 9
+#define UCDN_SCRIPT_BENGALI 10
+#define UCDN_SCRIPT_GURMUKHI 11
+#define UCDN_SCRIPT_GUJARATI 12
+#define UCDN_SCRIPT_ORIYA 13
+#define UCDN_SCRIPT_TAMIL 14
+#define UCDN_SCRIPT_TELUGU 15
+#define UCDN_SCRIPT_KANNADA 16
+#define UCDN_SCRIPT_MALAYALAM 17
+#define UCDN_SCRIPT_SINHALA 18
+#define UCDN_SCRIPT_THAI 19
+#define UCDN_SCRIPT_LAO 20
+#define UCDN_SCRIPT_TIBETAN 21
+#define UCDN_SCRIPT_MYANMAR 22
+#define UCDN_SCRIPT_GEORGIAN 23
+#define UCDN_SCRIPT_HANGUL 24
+#define UCDN_SCRIPT_ETHIOPIC 25
+#define UCDN_SCRIPT_CHEROKEE 26
+#define UCDN_SCRIPT_CANADIAN_ABORIGINAL 27
+#define UCDN_SCRIPT_OGHAM 28
+#define UCDN_SCRIPT_RUNIC 29
+#define UCDN_SCRIPT_KHMER 30
+#define UCDN_SCRIPT_MONGOLIAN 31
+#define UCDN_SCRIPT_HIRAGANA 32
+#define UCDN_SCRIPT_KATAKANA 33
+#define UCDN_SCRIPT_BOPOMOFO 34
+#define UCDN_SCRIPT_HAN 35
+#define UCDN_SCRIPT_YI 36
+#define UCDN_SCRIPT_OLD_ITALIC 37
+#define UCDN_SCRIPT_GOTHIC 38
+#define UCDN_SCRIPT_DESERET 39
+#define UCDN_SCRIPT_INHERITED 40
+#define UCDN_SCRIPT_TAGALOG 41
+#define UCDN_SCRIPT_HANUNOO 42
+#define UCDN_SCRIPT_BUHID 43
+#define UCDN_SCRIPT_TAGBANWA 44
+#define UCDN_SCRIPT_LIMBU 45
+#define UCDN_SCRIPT_TAI_LE 46
+#define UCDN_SCRIPT_LINEAR_B 47
+#define UCDN_SCRIPT_UGARITIC 48
+#define UCDN_SCRIPT_SHAVIAN 49
+#define UCDN_SCRIPT_OSMANYA 50
+#define UCDN_SCRIPT_CYPRIOT 51
+#define UCDN_SCRIPT_BRAILLE 52
+#define UCDN_SCRIPT_BUGINESE 53
+#define UCDN_SCRIPT_COPTIC 54
+#define UCDN_SCRIPT_NEW_TAI_LUE 55
+#define UCDN_SCRIPT_GLAGOLITIC 56
+#define UCDN_SCRIPT_TIFINAGH 57
+#define UCDN_SCRIPT_SYLOTI_NAGRI 58
+#define UCDN_SCRIPT_OLD_PERSIAN 59
+#define UCDN_SCRIPT_KHAROSHTHI 60
+#define UCDN_SCRIPT_BALINESE 61
+#define UCDN_SCRIPT_CUNEIFORM 62
+#define UCDN_SCRIPT_PHOENICIAN 63
+#define UCDN_SCRIPT_PHAGS_PA 64
+#define UCDN_SCRIPT_NKO 65
+#define UCDN_SCRIPT_SUNDANESE 66
+#define UCDN_SCRIPT_LEPCHA 67
+#define UCDN_SCRIPT_OL_CHIKI 68
+#define UCDN_SCRIPT_VAI 69
+#define UCDN_SCRIPT_SAURASHTRA 70
+#define UCDN_SCRIPT_KAYAH_LI 71
+#define UCDN_SCRIPT_REJANG 72
+#define UCDN_SCRIPT_LYCIAN 73
+#define UCDN_SCRIPT_CARIAN 74
+#define UCDN_SCRIPT_LYDIAN 75
+#define UCDN_SCRIPT_CHAM 76
+#define UCDN_SCRIPT_TAI_THAM 77
+#define UCDN_SCRIPT_TAI_VIET 78
+#define UCDN_SCRIPT_AVESTAN 79
+#define UCDN_SCRIPT_EGYPTIAN_HIEROGLYPHS 80
+#define UCDN_SCRIPT_SAMARITAN 81
+#define UCDN_SCRIPT_LISU 82
+#define UCDN_SCRIPT_BAMUM 83
+#define UCDN_SCRIPT_JAVANESE 84
+#define UCDN_SCRIPT_MEETEI_MAYEK 85
+#define UCDN_SCRIPT_IMPERIAL_ARAMAIC 86
+#define UCDN_SCRIPT_OLD_SOUTH_ARABIAN 87
+#define UCDN_SCRIPT_INSCRIPTIONAL_PARTHIAN 88
+#define UCDN_SCRIPT_INSCRIPTIONAL_PAHLAVI 89
+#define UCDN_SCRIPT_OLD_TURKIC 90
+#define UCDN_SCRIPT_KAITHI 91
+#define UCDN_SCRIPT_BATAK 92
+#define UCDN_SCRIPT_BRAHMI 93
+#define UCDN_SCRIPT_MANDAIC 94
+#define UCDN_SCRIPT_CHAKMA 95
+#define UCDN_SCRIPT_MEROITIC_CURSIVE 96
+#define UCDN_SCRIPT_MEROITIC_HIEROGLYPHS 97
+#define UCDN_SCRIPT_MIAO 98
+#define UCDN_SCRIPT_SHARADA 99
+#define UCDN_SCRIPT_SORA_SOMPENG 100
+#define UCDN_SCRIPT_TAKRI 101
+#define UCDN_SCRIPT_UNKNOWN 102
+#define UCDN_SCRIPT_BASSA_VAH 103
+#define UCDN_SCRIPT_CAUCASIAN_ALBANIAN 104
+#define UCDN_SCRIPT_DUPLOYAN 105
+#define UCDN_SCRIPT_ELBASAN 106
+#define UCDN_SCRIPT_GRANTHA 107
+#define UCDN_SCRIPT_KHOJKI 108
+#define UCDN_SCRIPT_KHUDAWADI 109
+#define UCDN_SCRIPT_LINEAR_A 110
+#define UCDN_SCRIPT_MAHAJANI 111
+#define UCDN_SCRIPT_MANICHAEAN 112
+#define UCDN_SCRIPT_MENDE_KIKAKUI 113
+#define UCDN_SCRIPT_MODI 114
+#define UCDN_SCRIPT_MRO 115
+#define UCDN_SCRIPT_NABATAEAN 116
+#define UCDN_SCRIPT_OLD_NORTH_ARABIAN 117
+#define UCDN_SCRIPT_OLD_PERMIC 118
+#define UCDN_SCRIPT_PAHAWH_HMONG 119
+#define UCDN_SCRIPT_PALMYRENE 120
+#define UCDN_SCRIPT_PAU_CIN_HAU 121
+#define UCDN_SCRIPT_PSALTER_PAHLAVI 122
+#define UCDN_SCRIPT_SIDDHAM 123
+#define UCDN_SCRIPT_TIRHUTA 124
+#define UCDN_SCRIPT_WARANG_CITI 125
+#define UCDN_SCRIPT_AHOM 126
+#define UCDN_SCRIPT_ANATOLIAN_HIEROGLYPHS 127
+#define UCDN_SCRIPT_HATRAN 128
+#define UCDN_SCRIPT_MULTANI 129
+#define UCDN_SCRIPT_OLD_HUNGARIAN 130
+#define UCDN_SCRIPT_SIGNWRITING 131
+#define UCDN_SCRIPT_ADLAM 132
+#define UCDN_SCRIPT_BHAIKSUKI 133
+#define UCDN_SCRIPT_MARCHEN 134
+#define UCDN_SCRIPT_NEWA 135
+#define UCDN_SCRIPT_OSAGE 136
+#define UCDN_SCRIPT_TANGUT 137
+#define UCDN_SCRIPT_MASARAM_GONDI 138
+#define UCDN_SCRIPT_NUSHU 139
+#define UCDN_SCRIPT_SOYOMBO 140
+#define UCDN_SCRIPT_ZANABAZAR_SQUARE 141
+#define UCDN_SCRIPT_DOGRA 142
+#define UCDN_SCRIPT_GUNJALA_GONDI 143
+#define UCDN_SCRIPT_HANIFI_ROHINGYA 144
+#define UCDN_SCRIPT_MAKASAR 145
+#define UCDN_SCRIPT_MEDEFAIDRIN 146
+#define UCDN_SCRIPT_OLD_SOGDIAN 147
+#define UCDN_SCRIPT_SOGDIAN 148
+
+#define UCDN_GENERAL_CATEGORY_CC 0
+#define UCDN_GENERAL_CATEGORY_CF 1
+#define UCDN_GENERAL_CATEGORY_CN 2
+#define UCDN_GENERAL_CATEGORY_CO 3
+#define UCDN_GENERAL_CATEGORY_CS 4
+#define UCDN_GENERAL_CATEGORY_LL 5
+#define UCDN_GENERAL_CATEGORY_LM 6
+#define UCDN_GENERAL_CATEGORY_LO 7
+#define UCDN_GENERAL_CATEGORY_LT 8
+#define UCDN_GENERAL_CATEGORY_LU 9
+#define UCDN_GENERAL_CATEGORY_MC 10
+#define UCDN_GENERAL_CATEGORY_ME 11
+#define UCDN_GENERAL_CATEGORY_MN 12
+#define UCDN_GENERAL_CATEGORY_ND 13
+#define UCDN_GENERAL_CATEGORY_NL 14
+#define UCDN_GENERAL_CATEGORY_NO 15
+#define UCDN_GENERAL_CATEGORY_PC 16
+#define UCDN_GENERAL_CATEGORY_PD 17
+#define UCDN_GENERAL_CATEGORY_PE 18
+#define UCDN_GENERAL_CATEGORY_PF 19
+#define UCDN_GENERAL_CATEGORY_PI 20
+#define UCDN_GENERAL_CATEGORY_PO 21
+#define UCDN_GENERAL_CATEGORY_PS 22
+#define UCDN_GENERAL_CATEGORY_SC 23
+#define UCDN_GENERAL_CATEGORY_SK 24
+#define UCDN_GENERAL_CATEGORY_SM 25
+#define UCDN_GENERAL_CATEGORY_SO 26
+#define UCDN_GENERAL_CATEGORY_ZL 27
+#define UCDN_GENERAL_CATEGORY_ZP 28
+#define UCDN_GENERAL_CATEGORY_ZS 29
+
+#define UCDN_BIDI_CLASS_L 0
+#define UCDN_BIDI_CLASS_LRE 1
+#define UCDN_BIDI_CLASS_LRO 2
+#define UCDN_BIDI_CLASS_R 3
+#define UCDN_BIDI_CLASS_AL 4
+#define UCDN_BIDI_CLASS_RLE 5
+#define UCDN_BIDI_CLASS_RLO 6
+#define UCDN_BIDI_CLASS_PDF 7
+#define UCDN_BIDI_CLASS_EN 8
+#define UCDN_BIDI_CLASS_ES 9
+#define UCDN_BIDI_CLASS_ET 10
+#define UCDN_BIDI_CLASS_AN 11
+#define UCDN_BIDI_CLASS_CS 12
+#define UCDN_BIDI_CLASS_NSM 13
+#define UCDN_BIDI_CLASS_BN 14
+#define UCDN_BIDI_CLASS_B 15
+#define UCDN_BIDI_CLASS_S 16
+#define UCDN_BIDI_CLASS_WS 17
+#define UCDN_BIDI_CLASS_ON 18
+#define UCDN_BIDI_CLASS_LRI 19
+#define UCDN_BIDI_CLASS_RLI 20
+#define UCDN_BIDI_CLASS_FSI 21
+#define UCDN_BIDI_CLASS_PDI 22
+
+/* index tables for the database records */
+#define SHIFT1 5
+#define SHIFT2 3
+static const unsigned char index0[] = {
+    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 
+    39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 53, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 55, 56, 56, 56, 57, 
+    58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 65, 66, 67, 68, 
+    69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, 
+    66, 67, 68, 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, 72, 73, 73, 73, 
+    73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 52, 75, 76, 77, 78, 79, 
+    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 
+    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 106, 108, 109, 110, 106, 
+    111, 111, 111, 112, 113, 114, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 115, 115, 116, 117, 118, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 119, 120, 121, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 122, 122, 123, 124, 106, 106, 125, 126, 127, 127, 127, 127, 
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 
+    127, 127, 127, 127, 127, 128, 127, 127, 129, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 130, 131, 132, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 133, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 134, 135, 136, 137, 138, 139, 
+    140, 141, 142, 142, 143, 106, 106, 106, 106, 106, 144, 106, 106, 106, 
+    106, 106, 106, 106, 145, 146, 106, 106, 147, 106, 148, 106, 149, 150, 
+    151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 160, 160, 160, 161, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 162, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 163, 164, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 165, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    166, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 52, 52, 
+    168, 167, 167, 167, 167, 169, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 169, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 170, 171, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    172, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 172, 
+};
+
+static const unsigned short index1[] = {
+    0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 0, 0, 0, 14, 15, 
+    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 29, 31, 32, 
+    33, 34, 35, 27, 30, 29, 27, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 
+    47, 48, 27, 27, 49, 27, 27, 27, 27, 27, 27, 27, 50, 51, 52, 27, 53, 54, 
+    53, 54, 54, 54, 54, 54, 55, 54, 54, 54, 56, 57, 58, 59, 60, 61, 62, 63, 
+    64, 64, 65, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 65, 77, 78, 
+    79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 
+    97, 97, 97, 97, 98, 98, 98, 98, 99, 100, 101, 101, 101, 101, 102, 103, 
+    101, 101, 101, 101, 101, 101, 104, 105, 101, 101, 101, 101, 101, 101, 
+    101, 101, 101, 101, 101, 101, 106, 107, 107, 107, 108, 109, 110, 110, 
+    110, 110, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 120, 
+    120, 121, 122, 119, 123, 124, 125, 126, 127, 127, 127, 127, 128, 129, 
+    130, 131, 132, 133, 134, 127, 127, 127, 127, 127, 127, 127, 127, 127, 
+    127, 127, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 144, 
+    145, 146, 147, 148, 127, 127, 127, 127, 127, 127, 149, 149, 149, 149, 
+    150, 151, 152, 119, 153, 154, 155, 155, 155, 156, 157, 158, 159, 159, 
+    160, 161, 162, 163, 164, 165, 166, 166, 166, 167, 144, 168, 119, 119, 
+    119, 119, 119, 119, 127, 127, 169, 170, 119, 119, 171, 125, 172, 173, 
+    174, 175, 176, 177, 177, 177, 177, 177, 177, 178, 179, 180, 181, 177, 
+    182, 183, 184, 177, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 
+    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206, 
+    207, 208, 209, 210, 211, 212, 213, 119, 214, 215, 216, 217, 217, 218, 
+    219, 220, 221, 222, 223, 119, 224, 225, 226, 227, 228, 229, 230, 231, 
+    231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 119, 242, 243, 
+    244, 245, 246, 243, 247, 248, 249, 250, 251, 119, 252, 253, 254, 255, 
+    256, 257, 258, 259, 259, 258, 259, 260, 261, 262, 263, 264, 265, 266, 
+    119, 267, 268, 269, 270, 271, 271, 270, 272, 273, 274, 275, 276, 277, 
+    278, 279, 280, 119, 281, 282, 283, 284, 284, 284, 284, 285, 286, 287, 
+    288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 295, 295, 298, 299, 
+    296, 300, 301, 302, 303, 304, 305, 119, 306, 307, 307, 307, 307, 307, 
+    308, 309, 310, 311, 312, 313, 119, 119, 119, 119, 314, 315, 316, 317, 
+    318, 319, 320, 321, 322, 323, 324, 325, 119, 119, 119, 119, 326, 327, 
+    328, 329, 330, 331, 332, 333, 334, 335, 334, 334, 334, 336, 337, 338, 
+    339, 340, 341, 342, 341, 341, 341, 343, 344, 345, 346, 347, 119, 119, 
+    119, 119, 348, 348, 348, 348, 348, 349, 350, 351, 352, 353, 354, 355, 
+    356, 357, 358, 348, 359, 360, 352, 361, 362, 362, 362, 362, 363, 364, 
+    365, 365, 365, 365, 365, 366, 367, 367, 367, 367, 367, 367, 367, 367, 
+    367, 367, 367, 367, 368, 368, 368, 368, 368, 368, 368, 368, 368, 369, 
+    369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 370, 370, 370, 370, 
+    370, 370, 370, 370, 370, 371, 372, 371, 370, 370, 370, 370, 370, 371, 
+    370, 370, 370, 370, 371, 372, 371, 370, 372, 370, 370, 370, 370, 370, 
+    370, 370, 371, 370, 370, 370, 370, 370, 370, 370, 370, 373, 374, 375, 
+    376, 377, 370, 370, 378, 379, 380, 380, 380, 380, 380, 380, 380, 380, 
+    380, 380, 381, 382, 383, 384, 384, 384, 384, 384, 384, 384, 384, 384, 
+    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 
+    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 
+    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 
+    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 
+    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 384, 384, 
+    386, 387, 387, 388, 389, 389, 389, 389, 389, 389, 389, 389, 389, 390, 
+    391, 392, 393, 394, 395, 119, 396, 396, 397, 119, 398, 398, 399, 119, 
+    400, 401, 402, 119, 403, 403, 403, 403, 403, 403, 404, 405, 406, 407, 
+    408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 418, 418, 418, 
+    419, 418, 418, 418, 418, 418, 418, 420, 421, 418, 418, 418, 418, 422, 
+    384, 384, 384, 384, 384, 384, 384, 384, 423, 119, 424, 424, 424, 425, 
+    426, 427, 428, 429, 430, 431, 432, 432, 432, 433, 434, 119, 435, 435, 
+    435, 435, 435, 436, 435, 435, 435, 437, 438, 439, 440, 440, 440, 440, 
+    441, 441, 442, 443, 444, 444, 444, 444, 444, 444, 445, 446, 447, 448, 
+    449, 450, 451, 452, 451, 452, 453, 454, 455, 456, 119, 119, 119, 119, 
+    119, 119, 119, 119, 457, 458, 458, 458, 458, 458, 459, 460, 461, 462, 
+    463, 464, 465, 466, 467, 468, 469, 470, 470, 470, 471, 472, 473, 474, 
+    475, 475, 475, 475, 476, 477, 478, 479, 480, 480, 480, 480, 481, 482, 
+    483, 484, 485, 486, 487, 488, 489, 489, 489, 490, 100, 491, 362, 362, 
+    362, 362, 362, 492, 493, 119, 494, 495, 496, 497, 498, 499, 54, 54, 54, 
+    54, 500, 501, 56, 56, 56, 56, 56, 502, 503, 504, 54, 505, 54, 54, 54, 
+    506, 56, 56, 56, 507, 508, 509, 510, 511, 511, 511, 512, 513, 27, 27, 27, 
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 514, 515, 27, 
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 516, 517, 518, 519, 516, 517, 
+    516, 517, 518, 519, 516, 520, 516, 517, 516, 518, 516, 521, 516, 521, 
+    516, 521, 522, 523, 524, 525, 526, 527, 516, 528, 529, 530, 531, 532, 
+    533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 
+    547, 548, 56, 549, 550, 551, 552, 553, 554, 554, 555, 556, 557, 558, 559, 
+    119, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 
+    573, 572, 574, 575, 576, 577, 578, 579, 580, 581, 582, 581, 583, 584, 
+    581, 585, 581, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 587, 
+    596, 597, 587, 598, 599, 587, 587, 599, 587, 600, 601, 600, 587, 587, 
+    602, 587, 587, 587, 587, 587, 603, 587, 587, 581, 604, 605, 606, 607, 
+    608, 609, 610, 610, 610, 610, 610, 610, 610, 610, 611, 581, 581, 612, 
+    613, 587, 587, 614, 581, 581, 581, 581, 586, 607, 615, 616, 581, 581, 
+    581, 581, 581, 617, 119, 119, 119, 581, 618, 119, 119, 619, 619, 619, 
+    619, 619, 620, 620, 621, 622, 622, 622, 622, 622, 622, 622, 622, 622, 
+    623, 619, 624, 625, 625, 625, 625, 625, 625, 625, 625, 625, 626, 625, 
+    625, 625, 625, 627, 581, 625, 625, 628, 581, 629, 630, 631, 632, 633, 
+    634, 630, 581, 628, 635, 581, 636, 637, 638, 639, 640, 581, 581, 581, 
+    641, 642, 643, 644, 581, 645, 646, 581, 647, 581, 581, 648, 649, 650, 
+    651, 581, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 581, 
+    581, 581, 663, 581, 664, 581, 665, 666, 667, 668, 669, 670, 619, 671, 
+    671, 672, 581, 581, 581, 663, 673, 674, 587, 587, 587, 675, 676, 587, 
+    587, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 
+    677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 
+    677, 677, 677, 677, 677, 587, 587, 587, 587, 587, 587, 587, 587, 587, 
+    587, 587, 587, 587, 587, 587, 587, 678, 679, 679, 680, 587, 587, 587, 
+    587, 587, 587, 587, 681, 587, 587, 587, 682, 587, 587, 587, 587, 587, 
+    587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 
+    587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 581, 
+    581, 581, 683, 581, 581, 587, 587, 684, 685, 686, 630, 581, 581, 687, 
+    581, 581, 581, 688, 581, 581, 581, 581, 581, 581, 689, 581, 581, 581, 
+    581, 581, 617, 690, 690, 690, 690, 690, 691, 692, 692, 692, 692, 692, 
+    693, 694, 695, 696, 697, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 
+    698, 699, 700, 701, 365, 365, 365, 365, 702, 703, 704, 704, 704, 704, 
+    704, 704, 704, 705, 706, 707, 370, 370, 372, 119, 372, 372, 372, 372, 
+    372, 372, 372, 372, 708, 708, 708, 708, 709, 710, 711, 712, 713, 714, 
+    715, 716, 717, 718, 119, 119, 119, 119, 119, 119, 719, 719, 719, 720, 
+    719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 721, 119, 719, 719, 
+    719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 
+    719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 722, 119, 119, 119, 
+    723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 735, 
+    736, 735, 735, 735, 737, 738, 739, 740, 741, 742, 743, 743, 744, 743, 
+    743, 743, 745, 746, 747, 748, 749, 750, 750, 750, 750, 750, 751, 752, 
+    752, 752, 752, 752, 752, 752, 752, 752, 752, 753, 754, 755, 750, 750, 
+    750, 756, 723, 723, 723, 723, 724, 119, 757, 757, 758, 758, 758, 759, 
+    760, 761, 755, 755, 755, 762, 763, 764, 758, 758, 758, 765, 760, 761, 
+    755, 755, 755, 755, 766, 764, 755, 767, 768, 768, 768, 768, 768, 769, 
+    768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 755, 755, 755, 
+    770, 771, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 772, 
+    755, 755, 755, 770, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 774, 775, 581, 581, 581, 581, 581, 581, 581, 581, 773, 773, 
+    773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 
+    775, 775, 776, 776, 777, 776, 776, 776, 776, 776, 776, 776, 776, 776, 
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 778, 
+    779, 779, 779, 779, 779, 779, 780, 119, 781, 781, 781, 781, 781, 782, 
+    783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 
+    783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 
+    783, 783, 783, 783, 783, 784, 783, 783, 785, 786, 119, 119, 101, 101, 
+    101, 101, 101, 787, 788, 789, 101, 101, 101, 790, 791, 791, 791, 791, 
+    791, 791, 791, 791, 792, 793, 794, 119, 64, 64, 795, 796, 797, 27, 798, 
+    27, 27, 27, 27, 27, 27, 27, 799, 800, 27, 801, 802, 27, 27, 803, 804, 
+    805, 119, 119, 119, 119, 119, 119, 806, 807, 808, 809, 810, 810, 811, 
+    812, 813, 814, 815, 815, 815, 815, 815, 815, 816, 119, 817, 818, 818, 
+    818, 818, 818, 819, 820, 821, 822, 823, 824, 825, 825, 826, 827, 828, 
+    829, 830, 830, 831, 832, 833, 833, 834, 835, 836, 837, 367, 367, 367, 
+    838, 839, 840, 840, 840, 840, 840, 841, 842, 843, 844, 845, 846, 847, 
+    348, 352, 848, 849, 849, 849, 849, 849, 850, 851, 119, 852, 853, 854, 
+    855, 348, 348, 856, 857, 858, 858, 858, 858, 858, 858, 859, 860, 861, 
+    119, 119, 862, 863, 864, 865, 119, 866, 866, 866, 119, 372, 372, 54, 54, 
+    54, 54, 54, 867, 868, 119, 869, 869, 869, 869, 869, 869, 869, 869, 869, 
+    869, 863, 863, 863, 863, 870, 871, 872, 873, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 
+    875, 875, 874, 875, 875, 876, 875, 875, 875, 875, 875, 875, 874, 875, 
+    875, 876, 875, 875, 875, 874, 875, 875, 876, 875, 875, 875, 874, 875, 
+    875, 877, 119, 368, 368, 878, 879, 369, 369, 369, 369, 369, 880, 881, 
+    881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 
+    881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 
+    881, 881, 881, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 
+    882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 
+    882, 882, 882, 882, 882, 882, 882, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 774, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 883, 775, 775, 775, 775, 884, 119, 885, 
+    886, 120, 887, 888, 889, 890, 120, 127, 127, 127, 127, 127, 127, 127, 
+    127, 127, 127, 127, 127, 891, 892, 893, 119, 894, 127, 127, 127, 127, 
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 895, 119, 
+    119, 127, 127, 127, 127, 127, 127, 127, 127, 896, 127, 127, 127, 127, 
+    127, 127, 119, 119, 119, 119, 119, 127, 897, 898, 898, 899, 900, 901, 
+    902, 903, 904, 905, 906, 907, 908, 909, 910, 169, 127, 127, 127, 127, 
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 911, 912, 
+    913, 914, 915, 916, 917, 917, 918, 919, 920, 920, 921, 922, 923, 924, 
+    925, 925, 925, 925, 926, 927, 927, 927, 928, 929, 929, 929, 930, 931, 
+    932, 119, 933, 934, 935, 934, 934, 936, 934, 934, 937, 934, 938, 934, 
+    938, 119, 119, 119, 119, 934, 934, 934, 934, 934, 934, 934, 934, 934, 
+    934, 934, 934, 934, 934, 934, 939, 940, 941, 941, 941, 941, 941, 942, 
+    610, 943, 943, 943, 943, 943, 943, 944, 945, 946, 947, 581, 948, 949, 
+    119, 119, 119, 119, 119, 610, 610, 610, 610, 610, 950, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 951, 
+    951, 951, 952, 953, 953, 953, 953, 953, 953, 954, 119, 955, 956, 956, 
+    957, 958, 958, 958, 958, 959, 960, 961, 961, 962, 963, 964, 964, 964, 
+    964, 965, 966, 967, 967, 967, 968, 969, 969, 969, 969, 970, 969, 971, 
+    119, 119, 119, 119, 119, 972, 972, 972, 972, 972, 973, 973, 973, 973, 
+    973, 974, 974, 974, 974, 974, 974, 975, 975, 975, 976, 977, 978, 979, 
+    979, 979, 979, 980, 981, 981, 981, 981, 982, 983, 983, 983, 983, 983, 
+    119, 984, 984, 984, 984, 984, 984, 985, 986, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 987, 
+    987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 
+    987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 
+    987, 987, 987, 987, 987, 987, 987, 987, 987, 988, 119, 987, 987, 989, 
+    119, 987, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 990, 991, 992, 992, 992, 992, 993, 
+    994, 995, 995, 996, 997, 998, 998, 999, 1000, 1001, 1001, 1001, 1002, 
+    1003, 1004, 119, 119, 119, 119, 119, 119, 1005, 1005, 1006, 1007, 1008, 
+    1008, 1009, 1010, 1011, 1011, 1011, 1012, 119, 119, 119, 119, 119, 119, 
+    119, 119, 1013, 1013, 1013, 1013, 1014, 1014, 1014, 1015, 1016, 1016, 
+    1017, 1016, 1016, 1016, 1016, 1016, 1018, 1019, 1020, 1021, 1022, 1022, 
+    1023, 1024, 1025, 1026, 1027, 1028, 1029, 1029, 1029, 1030, 1031, 1031, 
+    1031, 1032, 119, 119, 119, 119, 1033, 1034, 1033, 1033, 1035, 1036, 1037, 
+    119, 1038, 1038, 1038, 1038, 1038, 1038, 1039, 1040, 1041, 1041, 1042, 
+    1043, 1044, 1044, 1045, 1046, 1047, 1047, 1048, 1049, 119, 1050, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 1051, 1051, 1051, 1051, 
+    1051, 1051, 1051, 1051, 1051, 1052, 119, 119, 119, 119, 119, 119, 1053, 
+    1053, 1053, 1053, 1053, 1053, 1054, 119, 1055, 1055, 1055, 1055, 1055, 
+    1055, 1056, 1057, 1058, 1058, 1058, 1058, 1059, 119, 1060, 1061, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 1062, 1062, 1062, 1063, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 1064, 
+    1064, 1064, 1065, 1066, 119, 1067, 1067, 1068, 1069, 1070, 1071, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 1072, 1073, 1073, 1073, 1073, 1073, 1073, 1074, 
+    1075, 1076, 1077, 1078, 1079, 1080, 119, 1081, 1082, 1083, 1083, 1083, 
+    1083, 1083, 1084, 1085, 1086, 1087, 1088, 1088, 1088, 1089, 1090, 1091, 
+    1092, 1093, 1093, 1093, 1094, 1095, 1096, 1097, 1098, 119, 1099, 1099, 
+    1099, 1099, 1100, 119, 1101, 1102, 1102, 1102, 1102, 1102, 1103, 1104, 
+    1105, 1106, 1107, 1108, 1109, 1110, 1111, 119, 1112, 1112, 1113, 1112, 
+    1112, 1114, 1115, 1116, 119, 119, 119, 119, 119, 119, 119, 119, 1117, 
+    1118, 1119, 1120, 1119, 1121, 1122, 1122, 1122, 1122, 1122, 1123, 1124, 
+    1125, 1126, 1127, 1128, 1129, 1130, 1131, 1131, 1132, 1133, 1134, 1135, 
+    1136, 1137, 1138, 1139, 1140, 1140, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 1141, 1141, 1141, 1141, 
+    1141, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 119, 119, 119, 119, 1148, 
+    1148, 1148, 1148, 1148, 1148, 1149, 1150, 1151, 119, 1152, 1153, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 1154, 1154, 1154, 1154, 1154, 1155, 1156, 1157, 
+    1158, 1159, 1160, 1161, 119, 119, 119, 119, 1162, 1162, 1162, 1162, 1162, 
+    1162, 1163, 1164, 1165, 119, 1166, 1167, 1168, 1169, 119, 119, 1170, 
+    1170, 1170, 1170, 1170, 1171, 1172, 119, 1173, 1174, 119, 119, 119, 119, 
+    119, 119, 1175, 1175, 1175, 1176, 1177, 1178, 1179, 1180, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 1181, 1181, 1181, 1181, 1181, 1182, 
+    1183, 1184, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    1185, 1185, 1185, 1185, 1186, 1186, 1186, 1186, 1187, 1188, 1189, 1190, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 1191, 1192, 1193, 1193, 1193, 1193, 1194, 1195, 1196, 
+    119, 1197, 1198, 1199, 1199, 1199, 1199, 1200, 1201, 1202, 1203, 1204, 
+    119, 119, 119, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1206, 1207, 
+    1208, 1207, 1207, 1207, 1209, 1210, 1211, 1212, 119, 1213, 1214, 1215, 
+    1216, 1217, 1218, 1218, 1218, 1219, 1220, 1220, 1221, 1222, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 1223, 1224, 1225, 1225, 1225, 1225, 
+    1226, 1227, 1228, 119, 1229, 1230, 1231, 1232, 1233, 1233, 1233, 1234, 
+    1235, 1236, 1237, 1238, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    1239, 1239, 1240, 1241, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 
+    1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 
+    1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 
+    1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 
+    1242, 1242, 1242, 1242, 1242, 1242, 1242, 1243, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 1244, 1244, 1244, 1244, 1244, 1244, 
+    1244, 1244, 1244, 1244, 1244, 1244, 1244, 1245, 1246, 119, 1242, 1242, 
+    1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 
+    1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1247, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 1248, 1248, 1248, 1248, 1248, 
+    1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 
+    1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 
+    1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 
+    1248, 1248, 1249, 1248, 1248, 1248, 1248, 1250, 1251, 1248, 1248, 1248, 
+    1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 
+    1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 
+    1248, 1248, 1252, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 
+    1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 
+    1253, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 1254, 
+    1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 
+    1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 
+    1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 
+    1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 
+    1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1255, 1254, 1254, 1254, 
+    1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1256, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 791, 791, 791, 791, 791, 
+    791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 
+    791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 
+    791, 791, 791, 791, 791, 791, 1257, 1258, 1258, 1258, 1259, 1260, 1261, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 1262, 1262, 
+    1262, 1263, 1264, 119, 1265, 1265, 1265, 1265, 1265, 1265, 1266, 1267, 
+    1268, 119, 1269, 1270, 1271, 1265, 1265, 1272, 1265, 1265, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 1273, 1273, 1273, 1273, 1274, 1274, 1274, 1274, 
+    1275, 1275, 1276, 1277, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1279, 119, 
+    1280, 1281, 1281, 1281, 1281, 1282, 119, 1283, 1284, 1285, 119, 119, 119, 
+    119, 119, 119, 119, 119, 1286, 119, 119, 119, 1287, 1287, 1287, 1287, 
+    1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 
+    1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 
+    1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 
+    1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 
+    1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1288, 119, 
+    1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 
+    1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 
+    1287, 1287, 1287, 1287, 1287, 1287, 1289, 119, 1290, 735, 735, 735, 735, 
+    735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 
+    735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 
+    735, 735, 1291, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 1292, 
+    1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 
+    1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 
+    1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 
+    1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 
+    1293, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 
+    1294, 1294, 1295, 1294, 1296, 1294, 1297, 1294, 1298, 1299, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 610, 610, 610, 610, 610, 
+    610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 
+    610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 1300, 119, 610, 
+    610, 610, 610, 1301, 1302, 610, 610, 610, 610, 610, 610, 1303, 1304, 
+    1305, 1306, 1307, 1308, 610, 610, 610, 1309, 610, 610, 610, 610, 610, 
+    610, 610, 1310, 119, 119, 946, 946, 946, 946, 946, 946, 946, 946, 1311, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 941, 941, 1312, 119, 581, 581, 581, 581, 581, 
+    581, 581, 581, 581, 581, 617, 119, 941, 941, 941, 1313, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 1314, 
+    1314, 1314, 1315, 1316, 1316, 1317, 1314, 1314, 1318, 1319, 1316, 1316, 
+    1314, 1314, 1314, 1315, 1316, 1316, 1320, 1321, 1322, 1318, 1323, 1324, 
+    1316, 1314, 1314, 1314, 1315, 1316, 1316, 1325, 1326, 1327, 1328, 1316, 
+    1316, 1316, 1329, 1330, 1331, 1332, 1316, 1316, 1317, 1314, 1314, 1318, 
+    1316, 1316, 1316, 1314, 1314, 1314, 1315, 1316, 1316, 1317, 1314, 1314, 
+    1318, 1316, 1316, 1316, 1314, 1314, 1314, 1315, 1316, 1316, 1317, 1314, 
+    1314, 1318, 1316, 1316, 1316, 1314, 1314, 1314, 1315, 1316, 1316, 1333, 
+    1314, 1314, 1314, 1334, 1316, 1316, 1335, 1336, 1314, 1314, 1337, 1316, 
+    1316, 1338, 1317, 1314, 1314, 1339, 1316, 1316, 1340, 1341, 1314, 1314, 
+    1342, 1316, 1316, 1316, 1343, 1314, 1314, 1314, 1334, 1316, 1316, 1335, 
+    1344, 1345, 1345, 1345, 1345, 1345, 1345, 1346, 1346, 1346, 1346, 1346, 
+    1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 
+    1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 
+    1346, 1346, 1346, 1347, 1347, 1347, 1347, 1347, 1347, 1348, 1349, 1347, 
+    1347, 1347, 1347, 1347, 1350, 1351, 1346, 1352, 1353, 119, 1354, 1355, 
+    1347, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 1356, 1357, 1357, 
+    1358, 1359, 1360, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 
+    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 
+    1361, 1362, 1363, 1364, 119, 119, 119, 119, 119, 1365, 1365, 1365, 1365, 
+    1366, 1367, 1367, 1367, 1368, 1369, 1370, 1371, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 1372, 1373, 1373, 1373, 1373, 1373, 1373, 1374, 1375, 119, 119, 119, 
+    119, 119, 119, 119, 119, 119, 1376, 127, 127, 127, 1377, 1378, 1379, 
+    1380, 1381, 1382, 1377, 1383, 1377, 1379, 1379, 1384, 127, 1385, 127, 
+    1386, 1387, 1385, 127, 1386, 119, 119, 119, 119, 119, 119, 1388, 119, 
+    1389, 1390, 1390, 1390, 1390, 1391, 1390, 1390, 1390, 1390, 1390, 1390, 
+    1390, 1390, 1390, 1390, 1390, 1390, 1391, 1392, 1390, 1393, 1394, 1390, 
+    1394, 1395, 1394, 1390, 1390, 1390, 1396, 1392, 620, 1397, 622, 622, 622, 
+    1398, 622, 622, 622, 622, 622, 622, 622, 1399, 622, 622, 622, 1400, 1401, 
+    1402, 622, 1403, 1392, 1392, 1392, 1392, 1392, 1392, 1404, 1405, 1405, 
+    1405, 1406, 1392, 755, 755, 755, 755, 755, 1407, 755, 1408, 1409, 1392, 
+    1410, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 
+    1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 723, 723, 723, 723, 1411, 
+    1412, 1413, 723, 723, 723, 723, 723, 723, 723, 723, 1414, 1415, 723, 
+    1416, 1417, 723, 723, 1418, 1419, 1420, 1421, 1416, 1390, 723, 723, 1422, 
+    1423, 723, 723, 723, 723, 723, 723, 723, 1424, 1425, 1426, 1427, 723, 
+    1428, 1429, 1426, 1430, 1431, 723, 723, 723, 1432, 1433, 1434, 723, 723, 
+    723, 723, 723, 723, 723, 723, 1435, 1436, 723, 1437, 643, 1438, 723, 
+    1439, 1440, 581, 1441, 723, 723, 723, 1390, 1442, 1443, 1390, 1390, 1444, 
+    1390, 1389, 1390, 1390, 1390, 1390, 1390, 1445, 1446, 1390, 1390, 1445, 
+    1447, 723, 723, 723, 723, 723, 723, 723, 723, 1448, 1449, 581, 581, 581, 
+    581, 1450, 1451, 723, 723, 723, 723, 1452, 723, 1453, 723, 1454, 1455, 
+    1456, 1392, 1390, 1457, 1458, 1459, 581, 581, 581, 581, 581, 581, 581, 
+    581, 581, 581, 581, 581, 581, 581, 1460, 1392, 581, 581, 581, 581, 581, 
+    581, 581, 581, 581, 581, 1461, 1462, 1392, 1392, 1392, 1392, 581, 1460, 
+    581, 581, 581, 581, 581, 581, 581, 1392, 581, 1463, 581, 581, 581, 581, 
+    581, 1392, 581, 581, 581, 1464, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 
+    1392, 1392, 1392, 581, 1460, 723, 1465, 1466, 723, 1426, 1467, 723, 723, 
+    723, 723, 723, 723, 1468, 1469, 723, 723, 723, 723, 1470, 1392, 1471, 
+    1472, 1470, 1392, 1473, 1474, 723, 723, 723, 723, 1392, 1392, 1392, 1392, 
+    1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1390, 1396, 1392, 1392, 
+    1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 
+    1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 
+    1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 
+    1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 
+    1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 
+    1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 
+    1392, 1392, 1392, 1392, 1392, 1392, 1392, 1475, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 773, 1476, 775, 775, 775, 775, 775, 773, 
+    773, 773, 773, 773, 773, 1477, 775, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 774, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 883, 
+    775, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 
+    773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 1478, 775, 775, 
+    775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 
+    775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 
+    775, 775, 775, 775, 775, 773, 773, 773, 774, 775, 775, 775, 775, 775, 
+    775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 
+    775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 
+    775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 
+    775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 1479, 1480, 
+    119, 119, 119, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 
+    1481, 1481, 1481, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 
+    119, 119, 119, 119, 119, 898, 898, 898, 898, 898, 898, 898, 898, 898, 
+    898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 
+    898, 898, 898, 898, 898, 898, 898, 119, 119, 882, 882, 882, 882, 882, 
+    882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 
+    882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 1482, 
+};
+
+static const unsigned short index2[] = {
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, 7, 7, 7, 8, 
+    9, 10, 11, 12, 13, 14, 15, 11, 16, 17, 15, 18, 19, 20, 19, 21, 22, 22, 
+    22, 22, 22, 22, 22, 22, 22, 22, 19, 23, 24, 24, 24, 10, 15, 25, 25, 25, 
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 16, 26, 17, 
+    27, 28, 27, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 
+    29, 29, 29, 16, 30, 31, 24, 1, 1, 1, 1, 1, 1, 32, 1, 1, 33, 34, 35, 13, 
+    36, 13, 37, 38, 39, 40, 41, 42, 24, 43, 44, 27, 45, 46, 47, 47, 48, 49, 
+    38, 38, 39, 47, 41, 50, 51, 51, 51, 34, 52, 52, 52, 52, 52, 52, 53, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 53, 52, 52, 52, 52, 52, 52, 54, 53, 52, 
+    52, 52, 52, 52, 53, 55, 55, 55, 56, 56, 56, 56, 55, 56, 55, 55, 55, 56, 
+    55, 55, 56, 56, 55, 56, 55, 55, 56, 56, 56, 54, 55, 55, 55, 56, 55, 56, 
+    55, 56, 52, 55, 52, 56, 52, 56, 52, 56, 52, 56, 52, 56, 52, 56, 52, 56, 
+    52, 55, 52, 55, 52, 56, 52, 56, 52, 56, 52, 55, 52, 56, 52, 56, 52, 56, 
+    52, 56, 52, 56, 53, 55, 52, 55, 53, 55, 52, 56, 52, 56, 55, 52, 56, 52, 
+    56, 52, 56, 53, 55, 53, 55, 52, 55, 52, 56, 52, 55, 55, 53, 55, 52, 55, 
+    52, 56, 52, 56, 53, 55, 52, 56, 52, 56, 52, 52, 56, 52, 56, 52, 56, 56, 
+    56, 52, 52, 56, 52, 56, 52, 52, 56, 52, 52, 52, 56, 56, 52, 52, 52, 52, 
+    56, 52, 52, 56, 52, 52, 52, 56, 56, 56, 52, 52, 56, 52, 52, 56, 52, 56, 
+    52, 56, 52, 52, 56, 52, 56, 56, 52, 56, 52, 52, 56, 52, 52, 52, 56, 52, 
+    56, 52, 52, 56, 56, 57, 52, 56, 56, 56, 57, 57, 57, 57, 52, 58, 56, 52, 
+    58, 56, 52, 58, 56, 52, 55, 52, 55, 52, 55, 52, 55, 52, 55, 52, 55, 52, 
+    55, 52, 55, 56, 52, 56, 56, 52, 58, 56, 52, 56, 52, 52, 52, 56, 52, 56, 
+    56, 56, 56, 56, 56, 56, 52, 52, 56, 52, 52, 56, 56, 52, 56, 52, 52, 52, 
+    52, 56, 56, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 
+    56, 56, 56, 56, 57, 56, 56, 56, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 
+    60, 61, 61, 61, 61, 61, 61, 61, 62, 62, 63, 62, 60, 64, 65, 64, 64, 64, 
+    65, 64, 60, 60, 66, 61, 62, 62, 62, 62, 62, 62, 39, 39, 39, 39, 62, 39, 
+    62, 48, 59, 59, 59, 59, 59, 62, 62, 62, 62, 62, 67, 67, 60, 62, 61, 62, 
+    62, 62, 62, 62, 62, 62, 62, 62, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 
+    68, 68, 68, 69, 70, 70, 70, 70, 69, 71, 70, 70, 70, 70, 70, 72, 72, 70, 
+    70, 70, 70, 72, 72, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 73, 73, 
+    73, 73, 73, 70, 70, 70, 70, 68, 68, 68, 68, 68, 68, 68, 68, 74, 68, 70, 
+    70, 70, 68, 68, 68, 70, 70, 75, 68, 68, 68, 70, 70, 70, 70, 68, 69, 70, 
+    70, 68, 76, 77, 77, 76, 77, 77, 76, 68, 68, 68, 68, 68, 78, 79, 78, 79, 
+    60, 80, 78, 79, 81, 81, 82, 79, 79, 79, 83, 78, 81, 81, 81, 81, 80, 62, 
+    78, 84, 78, 78, 78, 81, 78, 81, 78, 78, 79, 85, 85, 85, 85, 85, 85, 85, 
+    85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 81, 85, 85, 85, 85, 85, 85, 85, 
+    78, 78, 79, 79, 79, 79, 79, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 
+    86, 86, 86, 86, 86, 86, 79, 86, 86, 86, 86, 86, 86, 86, 79, 79, 79, 79, 
+    79, 78, 79, 79, 78, 78, 78, 79, 79, 79, 78, 79, 78, 79, 78, 79, 78, 79, 
+    78, 79, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 79, 79, 
+    79, 79, 78, 79, 89, 78, 79, 78, 78, 79, 79, 78, 78, 78, 90, 91, 90, 90, 
+    90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 
+    91, 91, 92, 92, 92, 92, 92, 92, 92, 92, 93, 92, 93, 93, 93, 93, 93, 93, 
+    93, 93, 93, 93, 93, 93, 93, 93, 90, 93, 90, 93, 90, 93, 90, 93, 90, 93, 
+    94, 95, 95, 96, 96, 95, 97, 97, 90, 93, 90, 93, 90, 93, 90, 90, 93, 90, 
+    93, 90, 93, 90, 93, 90, 93, 90, 93, 90, 93, 93, 81, 98, 98, 98, 98, 98, 
+    98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 81, 
+    81, 99, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 
+    101, 101, 102, 103, 81, 81, 104, 104, 105, 81, 106, 107, 107, 107, 107, 
+    106, 107, 107, 107, 108, 106, 107, 107, 107, 107, 107, 107, 106, 106, 
+    106, 106, 106, 106, 107, 107, 106, 107, 107, 108, 109, 107, 110, 111, 
+    112, 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, 122, 123, 124, 
+    125, 126, 127, 125, 107, 106, 128, 118, 81, 81, 81, 81, 81, 81, 81, 81, 
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 81, 81, 81, 81, 
+    129, 129, 129, 129, 125, 125, 81, 81, 81, 130, 130, 130, 130, 130, 131, 
+    132, 132, 133, 134, 134, 135, 136, 137, 138, 138, 139, 139, 139, 139, 
+    139, 139, 139, 139, 140, 141, 142, 143, 144, 81, 145, 143, 146, 146, 146, 
+    146, 146, 146, 146, 146, 147, 146, 146, 146, 146, 146, 146, 146, 146, 
+    146, 146, 148, 149, 150, 151, 152, 153, 154, 155, 96, 96, 156, 157, 139, 
+    139, 139, 139, 139, 157, 139, 139, 157, 158, 158, 158, 158, 158, 158, 
+    158, 158, 158, 158, 134, 159, 159, 160, 146, 146, 161, 146, 146, 146, 
+    146, 146, 146, 146, 146, 146, 146, 146, 145, 146, 139, 139, 139, 139, 
+    139, 139, 139, 131, 138, 139, 139, 139, 139, 157, 139, 162, 162, 139, 
+    139, 138, 157, 139, 139, 157, 146, 146, 163, 163, 163, 163, 163, 163, 
+    163, 163, 163, 163, 146, 146, 146, 164, 164, 146, 165, 165, 165, 165, 
+    165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 81, 166, 167, 168, 167, 
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 169, 
+    170, 169, 169, 170, 169, 169, 170, 170, 170, 169, 170, 170, 169, 170, 
+    169, 169, 169, 170, 169, 170, 169, 170, 169, 170, 169, 169, 81, 81, 167, 
+    167, 167, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 
+    171, 171, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 171, 81, 
+    81, 81, 81, 81, 81, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 
+    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 
+    174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 176, 175, 177, 177, 
+    178, 179, 180, 181, 177, 81, 81, 176, 182, 182, 183, 183, 183, 183, 183, 
+    183, 183, 183, 183, 183, 183, 183, 183, 183, 184, 184, 184, 184, 185, 
+    184, 184, 184, 184, 184, 184, 184, 184, 184, 185, 184, 184, 184, 185, 
+    184, 184, 184, 184, 184, 81, 81, 186, 186, 186, 186, 186, 186, 186, 186, 
+    186, 186, 186, 186, 186, 186, 186, 81, 187, 187, 187, 187, 187, 187, 187, 
+    187, 187, 188, 188, 188, 81, 81, 189, 81, 167, 167, 167, 81, 81, 81, 81, 
+    81, 146, 146, 146, 146, 146, 81, 146, 146, 146, 146, 146, 146, 146, 146, 
+    81, 81, 81, 81, 81, 157, 139, 139, 139, 139, 139, 139, 131, 157, 139, 
+    139, 157, 139, 139, 157, 139, 139, 139, 157, 157, 157, 190, 191, 192, 
+    139, 139, 139, 157, 139, 139, 157, 157, 139, 139, 139, 139, 139, 193, 
+    193, 193, 194, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 
+    195, 195, 195, 193, 194, 196, 195, 194, 194, 194, 193, 193, 193, 193, 
+    193, 193, 193, 193, 194, 194, 194, 194, 197, 194, 194, 195, 96, 156, 198, 
+    198, 193, 193, 193, 195, 195, 193, 193, 199, 199, 200, 200, 200, 200, 
+    200, 200, 200, 200, 200, 200, 201, 202, 195, 195, 195, 195, 195, 195, 
+    203, 204, 205, 205, 81, 203, 203, 203, 203, 203, 203, 203, 203, 81, 81, 
+    203, 203, 81, 81, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 
+    203, 203, 203, 81, 203, 203, 203, 203, 203, 203, 203, 81, 203, 81, 81, 
+    81, 203, 203, 203, 203, 81, 81, 206, 203, 205, 205, 205, 204, 204, 204, 
+    204, 81, 81, 205, 205, 81, 81, 205, 205, 207, 203, 81, 81, 81, 81, 81, 
+    81, 81, 81, 205, 81, 81, 81, 81, 203, 203, 81, 203, 203, 203, 204, 204, 
+    81, 81, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 203, 203, 209, 
+    209, 210, 210, 210, 210, 210, 211, 212, 213, 203, 214, 215, 81, 81, 216, 
+    216, 217, 81, 218, 218, 218, 218, 218, 218, 81, 81, 81, 81, 218, 218, 81, 
+    81, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 
+    81, 218, 218, 218, 218, 218, 218, 218, 81, 218, 218, 81, 218, 218, 81, 
+    218, 218, 81, 81, 219, 81, 217, 217, 217, 216, 216, 81, 81, 81, 81, 216, 
+    216, 81, 81, 216, 216, 220, 81, 81, 81, 216, 81, 81, 81, 81, 81, 81, 81, 
+    218, 218, 218, 218, 81, 218, 81, 81, 81, 81, 81, 81, 81, 221, 221, 221, 
+    221, 221, 221, 221, 221, 221, 221, 216, 216, 218, 218, 218, 216, 222, 81, 
+    81, 223, 223, 224, 81, 225, 225, 225, 225, 225, 225, 225, 225, 225, 81, 
+    225, 225, 225, 81, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 
+    225, 225, 225, 81, 225, 225, 225, 225, 225, 225, 225, 81, 225, 225, 81, 
+    225, 225, 225, 225, 225, 81, 81, 226, 225, 224, 224, 224, 223, 223, 223, 
+    223, 223, 81, 223, 223, 224, 81, 224, 224, 227, 81, 81, 225, 81, 81, 81, 
+    81, 81, 81, 81, 225, 225, 223, 223, 81, 81, 228, 228, 228, 228, 228, 228, 
+    228, 228, 228, 228, 229, 230, 81, 81, 81, 81, 81, 81, 81, 225, 223, 223, 
+    223, 223, 223, 223, 81, 231, 232, 232, 81, 233, 233, 233, 233, 233, 233, 
+    233, 233, 81, 81, 233, 233, 81, 81, 233, 233, 233, 233, 233, 233, 233, 
+    233, 233, 233, 233, 233, 233, 233, 81, 233, 233, 233, 233, 233, 233, 233, 
+    81, 233, 233, 81, 233, 233, 233, 233, 233, 81, 81, 234, 233, 232, 231, 
+    232, 231, 231, 231, 231, 81, 81, 232, 232, 81, 81, 232, 232, 235, 81, 81, 
+    81, 81, 81, 81, 81, 81, 231, 232, 81, 81, 81, 81, 233, 233, 81, 233, 233, 
+    233, 231, 231, 81, 81, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 
+    237, 233, 238, 238, 238, 238, 238, 238, 81, 81, 239, 240, 81, 240, 240, 
+    240, 240, 240, 240, 81, 81, 81, 240, 240, 240, 81, 240, 240, 240, 240, 
+    81, 81, 81, 240, 240, 81, 240, 81, 240, 240, 81, 81, 81, 240, 240, 81, 
+    81, 81, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 81, 81, 81, 81, 
+    241, 241, 239, 241, 241, 81, 81, 81, 241, 241, 241, 81, 241, 241, 241, 
+    242, 81, 81, 240, 81, 81, 81, 81, 81, 81, 241, 81, 81, 81, 81, 81, 81, 
+    243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 244, 244, 244, 245, 
+    245, 245, 245, 245, 245, 246, 245, 81, 81, 81, 81, 81, 247, 248, 248, 
+    248, 247, 249, 249, 249, 249, 249, 249, 249, 249, 81, 249, 249, 249, 81, 
+    249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 
+    249, 249, 81, 81, 81, 249, 247, 247, 247, 248, 248, 248, 248, 81, 247, 
+    247, 247, 81, 247, 247, 247, 250, 81, 81, 81, 81, 81, 81, 81, 251, 252, 
+    81, 249, 249, 249, 81, 81, 81, 81, 81, 249, 249, 247, 247, 81, 81, 253, 
+    253, 253, 253, 253, 253, 253, 253, 253, 253, 254, 254, 254, 254, 254, 
+    254, 254, 255, 256, 257, 258, 258, 259, 256, 256, 256, 256, 256, 256, 
+    256, 256, 81, 256, 256, 256, 81, 256, 256, 256, 256, 256, 256, 256, 256, 
+    256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 81, 256, 256, 256, 256, 
+    256, 81, 81, 260, 256, 258, 261, 258, 258, 258, 258, 258, 81, 261, 258, 
+    258, 81, 258, 258, 257, 262, 81, 81, 81, 81, 81, 81, 81, 258, 258, 81, 
+    81, 81, 81, 81, 81, 81, 256, 81, 256, 256, 257, 257, 81, 81, 263, 263, 
+    263, 263, 263, 263, 263, 263, 263, 263, 81, 256, 256, 81, 81, 81, 81, 81, 
+    264, 264, 265, 265, 81, 266, 266, 266, 266, 266, 266, 266, 266, 81, 266, 
+    266, 266, 81, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 
+    266, 266, 266, 266, 266, 267, 267, 266, 265, 265, 265, 264, 264, 264, 
+    264, 81, 265, 265, 265, 81, 265, 265, 265, 267, 266, 268, 81, 81, 81, 81, 
+    266, 266, 266, 265, 269, 269, 269, 269, 269, 269, 269, 266, 266, 266, 
+    264, 264, 81, 81, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 269, 
+    269, 269, 269, 269, 269, 269, 269, 269, 271, 266, 266, 266, 266, 266, 
+    266, 81, 81, 272, 272, 81, 273, 273, 273, 273, 273, 273, 273, 273, 273, 
+    273, 273, 273, 273, 273, 273, 273, 273, 273, 81, 81, 81, 273, 273, 273, 
+    273, 273, 273, 273, 273, 81, 273, 273, 273, 273, 273, 273, 273, 273, 273, 
+    81, 273, 81, 81, 81, 81, 274, 81, 81, 81, 81, 272, 272, 272, 275, 275, 
+    275, 81, 275, 81, 272, 272, 272, 272, 272, 272, 272, 272, 81, 81, 81, 81, 
+    81, 81, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 81, 81, 272, 
+    272, 277, 81, 81, 81, 81, 278, 278, 278, 278, 278, 278, 278, 278, 278, 
+    278, 278, 278, 278, 278, 278, 278, 279, 278, 278, 279, 279, 279, 279, 
+    280, 280, 281, 81, 81, 81, 81, 282, 278, 278, 278, 278, 278, 278, 283, 
+    279, 284, 284, 284, 284, 279, 279, 279, 285, 286, 286, 286, 286, 286, 
+    286, 286, 286, 286, 286, 287, 287, 81, 81, 81, 81, 81, 288, 288, 81, 288, 
+    81, 81, 288, 288, 81, 288, 81, 81, 288, 81, 81, 81, 81, 81, 81, 288, 288, 
+    288, 288, 81, 288, 288, 288, 288, 288, 288, 288, 81, 288, 288, 288, 81, 
+    288, 81, 288, 81, 81, 288, 288, 81, 288, 288, 288, 288, 289, 288, 288, 
+    289, 289, 289, 289, 290, 290, 81, 289, 289, 288, 81, 81, 288, 288, 288, 
+    288, 288, 81, 291, 81, 292, 292, 292, 292, 289, 289, 81, 81, 293, 293, 
+    293, 293, 293, 293, 293, 293, 293, 293, 81, 81, 288, 288, 288, 288, 294, 
+    295, 295, 295, 296, 297, 296, 296, 298, 296, 296, 299, 298, 300, 300, 
+    300, 300, 300, 298, 301, 300, 301, 301, 301, 302, 302, 301, 301, 301, 
+    301, 301, 301, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 304, 
+    304, 304, 304, 304, 304, 304, 304, 304, 304, 305, 302, 301, 302, 301, 
+    306, 307, 308, 307, 308, 309, 309, 294, 294, 294, 294, 294, 294, 294, 
+    294, 81, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 81, 
+    81, 81, 81, 310, 311, 312, 313, 312, 312, 312, 312, 312, 311, 311, 311, 
+    311, 312, 314, 311, 312, 315, 315, 316, 299, 315, 315, 294, 294, 294, 
+    294, 294, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 81, 312, 
+    312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 81, 305, 305, 301, 
+    301, 301, 301, 301, 301, 302, 301, 301, 301, 301, 301, 301, 81, 301, 301, 
+    296, 296, 299, 296, 297, 317, 317, 317, 317, 298, 298, 81, 81, 81, 81, 
+    81, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 319, 319, 320, 
+    320, 320, 320, 319, 320, 320, 320, 320, 320, 321, 319, 322, 322, 319, 
+    319, 320, 320, 318, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 
+    324, 324, 325, 325, 325, 325, 318, 318, 318, 318, 318, 318, 319, 319, 
+    320, 320, 318, 318, 318, 318, 320, 320, 320, 318, 319, 319, 319, 318, 
+    318, 319, 319, 319, 319, 319, 319, 319, 318, 318, 318, 320, 320, 320, 
+    320, 318, 318, 318, 318, 318, 320, 319, 319, 320, 320, 319, 319, 319, 
+    319, 319, 319, 326, 318, 319, 323, 323, 319, 319, 319, 320, 327, 327, 
+    328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 81, 
+    328, 81, 81, 81, 81, 81, 328, 81, 81, 329, 329, 329, 329, 329, 329, 329, 
+    329, 329, 329, 329, 330, 331, 329, 329, 329, 332, 332, 332, 332, 332, 
+    332, 332, 332, 333, 333, 333, 333, 333, 333, 333, 333, 334, 334, 334, 
+    334, 334, 334, 334, 334, 335, 335, 335, 335, 335, 335, 335, 335, 335, 81, 
+    335, 335, 335, 335, 81, 81, 335, 335, 335, 335, 335, 335, 335, 81, 335, 
+    335, 335, 81, 81, 336, 336, 336, 337, 338, 337, 337, 337, 337, 337, 337, 
+    337, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 
+    339, 339, 339, 339, 339, 339, 339, 81, 81, 81, 340, 340, 340, 340, 340, 
+    340, 340, 340, 340, 340, 81, 81, 81, 81, 81, 81, 341, 341, 341, 341, 341, 
+    341, 341, 341, 341, 341, 341, 341, 341, 341, 81, 81, 342, 342, 342, 342, 
+    342, 342, 81, 81, 343, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 
+    344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 345, 345, 344, 346, 
+    347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 
+    347, 347, 347, 347, 348, 349, 81, 81, 81, 350, 350, 350, 350, 350, 350, 
+    350, 350, 350, 350, 350, 199, 199, 199, 351, 351, 351, 350, 350, 350, 
+    350, 350, 350, 350, 350, 81, 81, 81, 81, 81, 81, 81, 352, 352, 352, 352, 
+    352, 352, 352, 352, 352, 352, 352, 352, 352, 81, 352, 352, 352, 352, 353, 
+    353, 354, 81, 81, 81, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 
+    356, 356, 357, 199, 199, 81, 358, 358, 358, 358, 358, 358, 358, 358, 358, 
+    358, 359, 359, 81, 81, 81, 81, 360, 360, 360, 360, 360, 360, 360, 360, 
+    360, 360, 360, 360, 360, 81, 360, 360, 360, 81, 361, 361, 81, 81, 81, 81, 
+    362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 363, 363, 
+    364, 363, 363, 363, 363, 363, 363, 363, 364, 364, 364, 364, 364, 364, 
+    364, 364, 363, 364, 364, 363, 363, 363, 363, 363, 363, 363, 363, 363, 
+    365, 363, 366, 366, 367, 368, 366, 369, 366, 370, 362, 371, 81, 81, 372, 
+    372, 372, 372, 372, 372, 372, 372, 372, 372, 81, 81, 81, 81, 81, 81, 373, 
+    373, 373, 373, 373, 373, 373, 373, 373, 373, 81, 81, 81, 81, 81, 81, 374, 
+    374, 375, 375, 376, 377, 378, 374, 379, 379, 374, 380, 380, 380, 381, 81, 
+    382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 81, 81, 81, 81, 81, 81, 
+    383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 384, 383, 383, 
+    383, 383, 383, 81, 81, 81, 81, 81, 81, 81, 383, 383, 383, 383, 383, 380, 
+    380, 383, 383, 385, 383, 81, 81, 81, 81, 81, 344, 344, 344, 344, 344, 
+    344, 81, 81, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 
+    386, 386, 386, 81, 387, 387, 387, 388, 388, 388, 388, 387, 387, 388, 388, 
+    388, 81, 81, 81, 81, 388, 388, 387, 388, 388, 388, 388, 388, 388, 389, 
+    390, 391, 81, 81, 81, 81, 392, 81, 81, 81, 393, 393, 394, 394, 394, 394, 
+    394, 394, 394, 394, 394, 394, 395, 395, 395, 395, 395, 395, 395, 395, 
+    395, 395, 395, 395, 395, 395, 81, 81, 395, 395, 395, 395, 395, 81, 81, 
+    81, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 81, 81, 
+    81, 81, 396, 396, 81, 81, 81, 81, 81, 81, 397, 397, 397, 397, 397, 397, 
+    397, 397, 397, 397, 398, 81, 81, 81, 399, 399, 400, 400, 400, 400, 400, 
+    400, 400, 400, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 
+    401, 401, 401, 401, 402, 403, 404, 404, 405, 81, 81, 406, 406, 407, 407, 
+    407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 408, 409, 408, 
+    409, 409, 409, 409, 409, 409, 409, 81, 410, 408, 409, 408, 408, 409, 409, 
+    409, 409, 409, 409, 409, 409, 408, 408, 408, 408, 408, 408, 409, 409, 
+    411, 411, 411, 411, 411, 411, 411, 411, 81, 81, 412, 413, 413, 413, 413, 
+    413, 413, 413, 413, 413, 413, 81, 81, 81, 81, 81, 81, 414, 414, 414, 414, 
+    414, 414, 414, 415, 414, 414, 414, 414, 414, 414, 81, 81, 96, 96, 96, 96, 
+    96, 156, 156, 156, 156, 156, 156, 96, 96, 156, 416, 81, 417, 417, 417, 
+    417, 418, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 
+    419, 419, 419, 420, 418, 417, 417, 417, 417, 417, 418, 417, 418, 418, 
+    418, 418, 418, 417, 418, 421, 419, 419, 419, 419, 419, 419, 419, 81, 81, 
+    81, 81, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 423, 423, 424, 
+    423, 423, 423, 423, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 
+    426, 427, 426, 426, 426, 426, 426, 426, 426, 425, 425, 425, 425, 425, 
+    425, 425, 425, 425, 81, 81, 81, 428, 428, 429, 430, 430, 430, 430, 430, 
+    430, 430, 430, 430, 430, 430, 430, 430, 430, 429, 428, 428, 428, 428, 
+    429, 429, 428, 428, 431, 432, 428, 428, 430, 430, 433, 433, 433, 433, 
+    433, 433, 433, 433, 433, 433, 430, 430, 430, 430, 430, 430, 434, 434, 
+    434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 435, 436, 
+    437, 437, 436, 436, 436, 437, 436, 437, 437, 437, 438, 438, 81, 81, 81, 
+    81, 81, 81, 81, 81, 439, 439, 439, 439, 440, 440, 440, 440, 440, 440, 
+    440, 440, 440, 440, 440, 440, 441, 441, 441, 441, 441, 441, 441, 441, 
+    442, 442, 442, 442, 442, 442, 442, 442, 441, 441, 442, 443, 81, 81, 81, 
+    444, 444, 444, 444, 444, 445, 445, 445, 445, 445, 445, 445, 445, 445, 
+    445, 81, 81, 81, 440, 440, 440, 446, 446, 446, 446, 446, 446, 446, 446, 
+    446, 446, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 
+    447, 447, 448, 448, 448, 448, 448, 448, 449, 449, 93, 81, 81, 81, 81, 81, 
+    81, 81, 328, 328, 328, 81, 81, 328, 328, 328, 450, 450, 450, 450, 450, 
+    450, 450, 450, 96, 96, 96, 330, 451, 156, 156, 156, 156, 156, 96, 96, 
+    156, 156, 156, 156, 96, 452, 451, 451, 451, 451, 451, 451, 451, 453, 453, 
+    453, 453, 156, 453, 453, 453, 453, 452, 452, 96, 453, 453, 452, 96, 96, 
+    81, 81, 81, 81, 81, 81, 56, 56, 56, 56, 56, 56, 79, 79, 79, 79, 79, 93, 
+    59, 59, 59, 59, 59, 59, 59, 59, 59, 82, 82, 82, 82, 82, 59, 59, 59, 59, 
+    82, 82, 82, 82, 82, 56, 56, 56, 56, 56, 454, 56, 56, 56, 56, 56, 56, 56, 
+    56, 56, 56, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 82, 96, 96, 
+    156, 96, 96, 96, 96, 96, 96, 96, 156, 96, 96, 455, 456, 156, 457, 96, 96, 
+    96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 
+    96, 458, 459, 459, 156, 81, 96, 460, 156, 96, 156, 52, 56, 52, 56, 52, 
+    56, 56, 56, 56, 56, 56, 56, 56, 56, 52, 56, 79, 79, 79, 79, 79, 79, 79, 
+    79, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 81, 81, 78, 
+    78, 78, 78, 78, 78, 81, 81, 81, 78, 81, 78, 81, 78, 81, 78, 461, 461, 
+    461, 461, 461, 461, 461, 461, 79, 79, 79, 79, 79, 81, 79, 79, 78, 78, 78, 
+    78, 461, 80, 79, 80, 80, 80, 79, 79, 79, 81, 79, 79, 78, 78, 78, 78, 461, 
+    80, 80, 80, 79, 79, 79, 79, 81, 81, 79, 79, 78, 78, 78, 78, 81, 80, 80, 
+    80, 78, 78, 78, 78, 78, 80, 80, 80, 81, 81, 79, 79, 79, 81, 79, 79, 78, 
+    78, 78, 78, 461, 462, 80, 81, 463, 463, 463, 463, 463, 463, 463, 464, 
+    463, 463, 463, 465, 466, 467, 468, 469, 470, 471, 472, 470, 473, 474, 38, 
+    84, 475, 476, 477, 42, 475, 476, 477, 42, 38, 38, 478, 84, 479, 479, 479, 
+    480, 481, 482, 483, 484, 485, 486, 487, 33, 488, 489, 488, 488, 489, 490, 
+    491, 491, 84, 42, 50, 38, 492, 492, 478, 493, 493, 84, 84, 84, 494, 477, 
+    495, 492, 492, 492, 84, 84, 84, 84, 84, 84, 84, 84, 496, 84, 493, 84, 
+    377, 84, 377, 377, 377, 377, 84, 377, 377, 463, 497, 498, 498, 498, 498, 
+    81, 499, 500, 501, 502, 503, 503, 503, 503, 503, 503, 504, 59, 81, 81, 
+    47, 504, 504, 504, 504, 504, 505, 505, 496, 477, 495, 506, 504, 47, 47, 
+    47, 47, 504, 504, 504, 504, 504, 505, 505, 496, 477, 495, 81, 59, 59, 59, 
+    59, 59, 81, 81, 81, 282, 282, 282, 282, 282, 282, 282, 507, 282, 508, 
+    282, 282, 36, 282, 282, 282, 282, 282, 282, 282, 282, 282, 507, 282, 282, 
+    282, 282, 507, 282, 282, 507, 282, 509, 509, 509, 509, 509, 509, 509, 
+    509, 96, 96, 451, 451, 96, 96, 96, 96, 451, 451, 451, 96, 96, 416, 416, 
+    416, 416, 96, 416, 416, 416, 451, 451, 96, 156, 96, 451, 451, 156, 156, 
+    156, 156, 96, 81, 81, 81, 81, 81, 81, 81, 40, 40, 510, 511, 40, 512, 40, 
+    510, 40, 511, 49, 510, 510, 510, 49, 49, 510, 510, 510, 513, 40, 510, 
+    514, 40, 496, 510, 510, 510, 510, 510, 40, 40, 40, 512, 512, 40, 510, 40, 
+    85, 40, 510, 40, 52, 515, 510, 510, 516, 49, 510, 510, 52, 510, 49, 453, 
+    453, 453, 453, 49, 40, 40, 49, 49, 510, 510, 496, 496, 496, 496, 496, 
+    510, 49, 49, 49, 49, 40, 496, 40, 40, 56, 317, 517, 517, 517, 518, 51, 
+    519, 517, 517, 517, 517, 517, 51, 518, 518, 51, 517, 520, 520, 520, 520, 
+    520, 520, 520, 520, 520, 520, 520, 520, 521, 521, 521, 521, 520, 520, 
+    521, 521, 521, 521, 521, 521, 521, 521, 521, 52, 56, 521, 521, 521, 521, 
+    51, 40, 40, 81, 81, 81, 81, 54, 54, 54, 54, 54, 512, 512, 512, 512, 512, 
+    496, 496, 40, 40, 40, 40, 496, 40, 40, 496, 40, 40, 496, 40, 40, 40, 40, 
+    40, 40, 40, 496, 40, 40, 40, 40, 40, 40, 40, 40, 40, 44, 44, 40, 40, 40, 
+    40, 40, 40, 40, 40, 40, 40, 40, 40, 496, 496, 40, 40, 54, 40, 54, 40, 40, 
+    40, 40, 40, 40, 40, 40, 40, 40, 44, 40, 40, 40, 40, 496, 496, 496, 496, 
+    496, 496, 496, 496, 496, 496, 496, 496, 54, 496, 54, 54, 496, 496, 496, 
+    54, 54, 496, 496, 54, 496, 496, 496, 54, 496, 54, 522, 523, 496, 54, 496, 
+    496, 496, 496, 54, 496, 496, 54, 54, 54, 54, 496, 496, 54, 496, 54, 496, 
+    54, 54, 54, 54, 54, 54, 496, 54, 496, 496, 496, 496, 496, 54, 54, 54, 54, 
+    496, 496, 496, 496, 54, 54, 496, 496, 54, 496, 496, 496, 54, 496, 496, 
+    496, 496, 496, 54, 496, 496, 496, 496, 496, 54, 54, 496, 496, 54, 54, 54, 
+    54, 496, 496, 54, 54, 496, 496, 54, 54, 496, 496, 496, 496, 496, 54, 496, 
+    496, 496, 54, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 
+    496, 54, 496, 496, 496, 496, 496, 496, 496, 524, 477, 495, 477, 495, 40, 
+    40, 40, 40, 40, 40, 512, 40, 40, 40, 40, 40, 40, 40, 525, 525, 40, 40, 
+    40, 40, 496, 496, 40, 40, 40, 40, 40, 40, 40, 526, 527, 40, 40, 40, 40, 
+    40, 40, 40, 40, 40, 40, 40, 317, 317, 317, 317, 317, 317, 317, 317, 317, 
+    317, 317, 317, 317, 40, 496, 40, 40, 40, 40, 40, 40, 40, 40, 317, 40, 40, 
+    40, 40, 40, 496, 496, 496, 496, 496, 496, 496, 496, 496, 40, 40, 40, 40, 
+    40, 528, 528, 528, 528, 40, 40, 40, 525, 529, 529, 525, 40, 40, 40, 40, 
+    40, 40, 40, 40, 40, 40, 40, 81, 40, 40, 40, 81, 81, 81, 81, 81, 51, 51, 
+    51, 51, 51, 51, 51, 51, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 
+    530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 
+    519, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 518, 512, 512, 512, 
+    512, 512, 512, 512, 512, 512, 512, 512, 512, 40, 40, 40, 40, 512, 512, 
+    512, 512, 531, 40, 40, 40, 40, 40, 512, 512, 512, 512, 40, 40, 512, 512, 
+    40, 512, 512, 512, 512, 512, 512, 512, 40, 40, 40, 40, 40, 40, 40, 40, 
+    512, 512, 40, 40, 512, 54, 40, 40, 40, 40, 512, 512, 40, 40, 512, 54, 40, 
+    40, 40, 40, 512, 512, 512, 40, 40, 512, 40, 40, 512, 512, 40, 40, 40, 40, 
+    40, 40, 40, 512, 496, 496, 496, 496, 496, 532, 532, 496, 529, 529, 529, 
+    529, 40, 512, 512, 40, 40, 512, 40, 40, 40, 40, 512, 512, 40, 40, 40, 40, 
+    525, 525, 531, 531, 529, 40, 529, 529, 533, 534, 533, 529, 40, 529, 529, 
+    529, 40, 40, 40, 40, 512, 40, 512, 40, 40, 40, 40, 40, 528, 528, 528, 
+    528, 528, 528, 528, 528, 528, 528, 528, 528, 40, 40, 40, 40, 512, 512, 
+    40, 512, 512, 512, 40, 512, 533, 512, 512, 40, 512, 512, 40, 54, 40, 40, 
+    40, 40, 40, 40, 40, 525, 40, 40, 40, 528, 40, 40, 40, 40, 40, 40, 40, 40, 
+    40, 40, 512, 512, 40, 528, 40, 40, 40, 40, 40, 40, 40, 40, 528, 528, 317, 
+    40, 40, 40, 40, 40, 40, 40, 40, 525, 525, 533, 529, 529, 529, 529, 525, 
+    525, 533, 533, 533, 512, 512, 512, 512, 533, 528, 533, 533, 533, 512, 
+    533, 525, 512, 512, 512, 533, 533, 512, 512, 533, 512, 512, 533, 533, 
+    533, 40, 512, 40, 40, 40, 40, 512, 512, 525, 512, 512, 512, 512, 512, 
+    512, 533, 525, 525, 533, 525, 512, 533, 533, 535, 525, 512, 512, 525, 
+    533, 533, 529, 529, 529, 529, 529, 528, 40, 40, 529, 529, 536, 536, 534, 
+    534, 40, 40, 528, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 44, 40, 
+    40, 40, 40, 40, 40, 528, 40, 528, 40, 40, 40, 40, 528, 528, 528, 40, 537, 
+    40, 40, 40, 538, 538, 538, 538, 538, 538, 40, 539, 539, 529, 40, 40, 40, 
+    477, 495, 477, 495, 477, 495, 477, 495, 477, 495, 477, 495, 477, 495, 51, 
+    51, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 40, 528, 
+    528, 528, 40, 40, 40, 40, 40, 40, 40, 528, 496, 496, 496, 496, 496, 477, 
+    495, 496, 496, 496, 496, 496, 496, 496, 16, 31, 16, 31, 16, 31, 16, 31, 
+    477, 495, 540, 540, 540, 540, 540, 540, 540, 540, 496, 496, 496, 477, 
+    495, 16, 31, 477, 495, 477, 495, 477, 495, 477, 495, 477, 495, 496, 496, 
+    496, 496, 496, 496, 496, 477, 495, 477, 495, 496, 496, 496, 496, 496, 
+    496, 496, 496, 477, 495, 496, 496, 40, 40, 40, 528, 528, 40, 40, 40, 496, 
+    496, 496, 496, 496, 40, 40, 496, 496, 496, 496, 496, 496, 40, 40, 40, 
+    528, 40, 40, 40, 40, 537, 512, 512, 40, 40, 40, 40, 81, 81, 40, 40, 40, 
+    40, 40, 40, 40, 40, 81, 81, 40, 81, 40, 40, 40, 40, 40, 40, 541, 541, 
+    541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 81, 542, 
+    542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 81, 
+    52, 56, 52, 52, 52, 56, 56, 52, 56, 52, 56, 52, 56, 52, 52, 52, 52, 56, 
+    52, 56, 56, 52, 56, 56, 56, 56, 56, 56, 59, 59, 52, 52, 87, 88, 87, 88, 
+    88, 543, 543, 543, 543, 543, 543, 87, 88, 87, 88, 544, 544, 544, 87, 88, 
+    81, 81, 81, 81, 81, 545, 546, 546, 546, 547, 545, 546, 329, 329, 329, 
+    329, 329, 329, 81, 329, 81, 81, 81, 81, 81, 329, 81, 81, 548, 548, 548, 
+    548, 548, 548, 548, 548, 81, 81, 81, 81, 81, 81, 81, 549, 550, 81, 81, 
+    81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 551, 95, 95, 95, 95, 95, 
+    95, 95, 95, 552, 552, 42, 50, 42, 50, 552, 552, 552, 42, 50, 552, 42, 50, 
+    377, 377, 377, 377, 377, 377, 377, 377, 84, 472, 553, 377, 554, 84, 42, 
+    50, 84, 84, 42, 50, 477, 495, 477, 495, 477, 495, 477, 495, 377, 377, 
+    377, 377, 375, 60, 377, 377, 84, 377, 377, 84, 84, 84, 84, 84, 555, 555, 
+    377, 377, 377, 84, 472, 377, 477, 377, 377, 377, 377, 377, 377, 377, 377, 
+    84, 377, 84, 377, 81, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 
+    81, 556, 556, 556, 556, 556, 556, 556, 556, 556, 81, 81, 81, 81, 556, 
+    556, 556, 556, 556, 556, 81, 81, 525, 525, 525, 525, 525, 525, 525, 525, 
+    525, 525, 525, 525, 81, 81, 81, 81, 557, 558, 558, 559, 525, 560, 561, 
+    562, 526, 527, 526, 527, 526, 527, 526, 527, 526, 527, 525, 525, 526, 
+    527, 526, 527, 526, 527, 526, 527, 563, 526, 527, 527, 525, 562, 562, 
+    562, 562, 562, 562, 562, 562, 562, 564, 565, 566, 567, 568, 568, 569, 
+    570, 570, 570, 570, 571, 525, 525, 562, 562, 562, 560, 572, 559, 525, 
+    529, 81, 573, 574, 573, 574, 573, 574, 573, 574, 573, 574, 574, 574, 574, 
+    574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 573, 
+    574, 574, 574, 574, 574, 574, 574, 573, 574, 573, 574, 573, 574, 574, 
+    574, 574, 574, 574, 573, 574, 574, 574, 574, 574, 574, 573, 573, 81, 81, 
+    575, 575, 576, 576, 577, 577, 574, 563, 578, 579, 578, 579, 578, 579, 
+    578, 579, 578, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 
+    579, 579, 579, 579, 579, 579, 578, 579, 579, 579, 579, 579, 579, 579, 
+    578, 579, 578, 579, 578, 579, 579, 579, 579, 579, 579, 578, 579, 579, 
+    579, 579, 579, 579, 578, 578, 579, 579, 579, 579, 580, 581, 582, 582, 
+    579, 81, 81, 81, 81, 81, 583, 583, 583, 583, 583, 583, 583, 583, 583, 
+    583, 583, 81, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 
+    584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 81, 585, 585, 586, 586, 
+    586, 586, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 583, 583, 
+    583, 81, 81, 81, 81, 81, 578, 578, 578, 578, 578, 578, 578, 578, 587, 
+    587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 588, 588, 81, 
+    586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 585, 585, 585, 585, 
+    585, 585, 589, 589, 589, 589, 589, 589, 589, 589, 525, 590, 590, 590, 
+    590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 587, 587, 
+    587, 587, 588, 588, 588, 585, 585, 590, 590, 590, 590, 590, 590, 590, 
+    585, 585, 585, 585, 525, 525, 525, 525, 591, 591, 591, 591, 591, 591, 
+    591, 591, 591, 591, 591, 591, 591, 591, 591, 81, 585, 585, 585, 585, 585, 
+    585, 585, 525, 525, 525, 525, 585, 585, 585, 585, 585, 585, 585, 585, 
+    585, 585, 585, 525, 525, 592, 592, 592, 592, 592, 592, 592, 592, 592, 
+    592, 592, 592, 592, 592, 593, 593, 593, 593, 593, 593, 593, 593, 593, 
+    593, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 
+    595, 594, 594, 594, 594, 594, 594, 594, 81, 81, 81, 596, 596, 596, 596, 
+    596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 81, 597, 597, 597, 
+    597, 597, 597, 597, 597, 598, 598, 598, 598, 598, 598, 599, 599, 600, 
+    600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 601, 602, 603, 
+    602, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 600, 600, 81, 81, 
+    81, 81, 90, 93, 90, 93, 90, 93, 605, 95, 97, 97, 97, 606, 95, 95, 95, 95, 
+    95, 95, 95, 95, 95, 95, 606, 607, 90, 93, 90, 93, 454, 454, 95, 95, 608, 
+    608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 609, 
+    609, 609, 609, 609, 609, 609, 609, 609, 609, 610, 610, 611, 612, 612, 
+    612, 612, 612, 62, 62, 62, 62, 62, 62, 62, 60, 60, 60, 60, 60, 60, 60, 
+    60, 60, 62, 62, 52, 56, 52, 56, 52, 56, 56, 56, 52, 56, 52, 56, 52, 56, 
+    59, 56, 56, 56, 56, 56, 56, 56, 56, 52, 56, 52, 56, 52, 52, 56, 60, 613, 
+    613, 52, 56, 52, 56, 57, 52, 56, 52, 56, 56, 56, 52, 56, 52, 56, 52, 52, 
+    52, 52, 52, 56, 52, 52, 52, 52, 52, 56, 52, 56, 52, 56, 81, 81, 81, 81, 
+    81, 81, 81, 81, 81, 81, 81, 81, 81, 57, 59, 59, 56, 57, 57, 57, 57, 57, 
+    614, 614, 615, 614, 614, 614, 616, 614, 614, 614, 614, 615, 614, 614, 
+    614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 617, 
+    617, 615, 615, 617, 618, 618, 618, 618, 81, 81, 81, 81, 619, 619, 619, 
+    619, 619, 619, 317, 317, 507, 516, 81, 81, 81, 81, 81, 81, 620, 620, 620, 
+    620, 620, 620, 620, 620, 620, 620, 620, 620, 621, 621, 622, 622, 623, 
+    623, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 
+    624, 624, 624, 624, 624, 623, 623, 623, 623, 623, 623, 623, 623, 623, 
+    623, 623, 623, 623, 623, 623, 623, 625, 626, 81, 81, 81, 81, 81, 81, 81, 
+    81, 627, 627, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 81, 81, 
+    81, 81, 81, 81, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 195, 
+    195, 195, 195, 195, 195, 201, 201, 201, 195, 629, 195, 195, 193, 630, 
+    630, 630, 630, 630, 630, 630, 630, 630, 630, 631, 631, 631, 631, 631, 
+    631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 
+    631, 632, 632, 632, 632, 632, 633, 633, 633, 199, 634, 635, 635, 635, 
+    635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 636, 636, 
+    636, 636, 636, 636, 636, 636, 636, 636, 636, 637, 638, 81, 81, 81, 81, 
+    81, 81, 81, 81, 81, 81, 81, 639, 332, 332, 332, 332, 332, 81, 81, 81, 
+    640, 640, 640, 641, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 
+    642, 642, 642, 642, 642, 643, 641, 641, 640, 640, 640, 640, 641, 641, 
+    640, 641, 641, 641, 644, 645, 645, 645, 645, 645, 645, 646, 646, 646, 
+    645, 645, 645, 645, 81, 61, 647, 647, 647, 647, 647, 647, 647, 647, 647, 
+    647, 81, 81, 81, 81, 645, 645, 318, 318, 318, 318, 318, 320, 648, 318, 
+    323, 323, 318, 318, 318, 318, 318, 81, 649, 649, 649, 649, 649, 649, 649, 
+    649, 649, 650, 650, 650, 650, 650, 650, 651, 651, 650, 650, 651, 651, 
+    650, 650, 81, 649, 649, 649, 650, 649, 649, 649, 649, 649, 649, 649, 649, 
+    650, 651, 81, 81, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 81, 
+    81, 653, 654, 654, 654, 648, 318, 318, 318, 318, 318, 318, 327, 327, 327, 
+    318, 319, 320, 319, 318, 318, 655, 655, 655, 655, 655, 655, 655, 655, 
+    656, 655, 656, 656, 657, 655, 655, 656, 656, 655, 655, 655, 655, 655, 
+    656, 656, 655, 656, 655, 81, 81, 81, 81, 81, 81, 81, 81, 655, 655, 658, 
+    659, 659, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 661, 
+    662, 662, 661, 661, 663, 663, 660, 664, 664, 661, 665, 81, 81, 335, 335, 
+    335, 335, 335, 335, 81, 56, 56, 56, 613, 59, 59, 59, 59, 56, 56, 56, 56, 
+    56, 79, 81, 81, 342, 342, 342, 342, 342, 342, 342, 342, 660, 660, 660, 
+    661, 661, 662, 661, 661, 662, 661, 661, 663, 661, 665, 81, 81, 666, 666, 
+    666, 666, 666, 666, 666, 666, 666, 666, 81, 81, 81, 81, 81, 81, 667, 668, 
+    668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 
+    668, 668, 668, 668, 667, 668, 668, 668, 668, 668, 668, 668, 81, 81, 81, 
+    81, 333, 333, 333, 333, 333, 333, 333, 81, 81, 81, 81, 334, 334, 334, 
+    334, 334, 334, 334, 334, 334, 81, 81, 81, 81, 669, 669, 669, 669, 669, 
+    669, 669, 669, 670, 670, 670, 670, 670, 670, 670, 670, 592, 592, 593, 
+    593, 593, 593, 593, 593, 56, 56, 56, 56, 56, 56, 56, 81, 81, 81, 81, 101, 
+    101, 101, 101, 101, 81, 81, 81, 81, 81, 129, 671, 129, 129, 672, 129, 
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 81, 129, 129, 
+    129, 129, 129, 81, 129, 81, 129, 129, 81, 129, 129, 81, 129, 129, 146, 
+    146, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 
+    673, 673, 673, 81, 81, 81, 81, 81, 81, 81, 81, 81, 146, 146, 146, 146, 
+    146, 146, 146, 146, 146, 146, 146, 495, 477, 81, 81, 146, 146, 146, 146, 
+    146, 146, 146, 146, 146, 146, 135, 138, 81, 81, 674, 674, 674, 674, 674, 
+    674, 674, 674, 675, 558, 558, 675, 675, 676, 676, 526, 527, 677, 81, 81, 
+    81, 81, 81, 81, 96, 96, 96, 96, 96, 96, 96, 156, 156, 156, 156, 156, 156, 
+    156, 95, 95, 559, 569, 569, 678, 678, 526, 527, 526, 527, 526, 527, 526, 
+    527, 526, 527, 526, 527, 526, 527, 526, 527, 559, 559, 526, 527, 559, 
+    559, 559, 559, 678, 678, 678, 679, 559, 679, 81, 580, 680, 676, 676, 569, 
+    526, 527, 526, 527, 526, 527, 681, 559, 559, 682, 683, 684, 684, 684, 81, 
+    559, 685, 686, 559, 81, 81, 81, 81, 146, 146, 146, 146, 146, 81, 81, 497, 
+    81, 687, 688, 689, 690, 691, 688, 688, 692, 693, 688, 694, 695, 696, 695, 
+    697, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 699, 700, 701, 
+    701, 701, 687, 688, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 
+    702, 702, 702, 702, 702, 702, 702, 702, 692, 688, 693, 703, 704, 703, 
+    705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 
+    705, 705, 705, 705, 692, 701, 693, 701, 692, 693, 706, 707, 708, 706, 
+    709, 710, 711, 711, 711, 711, 711, 711, 711, 711, 711, 712, 710, 710, 
+    710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 
+    710, 710, 710, 710, 710, 713, 713, 714, 714, 714, 714, 714, 714, 714, 
+    714, 714, 714, 714, 714, 714, 714, 714, 81, 81, 81, 714, 714, 714, 714, 
+    714, 714, 81, 81, 714, 714, 714, 81, 81, 81, 715, 690, 701, 703, 716, 
+    690, 690, 81, 717, 718, 718, 718, 718, 717, 717, 81, 81, 719, 719, 719, 
+    720, 512, 81, 81, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 
+    721, 81, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 81, 721, 721, 
+    721, 81, 721, 721, 81, 721, 721, 721, 721, 721, 721, 721, 81, 81, 721, 
+    721, 721, 81, 81, 81, 81, 81, 199, 377, 199, 81, 81, 81, 81, 619, 619, 
+    619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 81, 81, 81, 317, 
+    722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 723, 
+    723, 723, 723, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 
+    724, 724, 724, 724, 724, 724, 723, 723, 724, 725, 725, 81, 40, 40, 40, 
+    40, 81, 81, 81, 81, 724, 81, 81, 81, 81, 81, 81, 81, 317, 317, 317, 317, 
+    317, 156, 81, 81, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 
+    726, 726, 81, 81, 81, 727, 727, 727, 727, 727, 727, 727, 727, 727, 81, 
+    81, 81, 81, 81, 81, 81, 156, 504, 504, 504, 504, 504, 504, 504, 504, 504, 
+    504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 81, 81, 81, 81, 728, 
+    728, 728, 728, 728, 728, 728, 728, 729, 729, 729, 729, 81, 81, 81, 81, 
+    81, 81, 81, 81, 81, 728, 728, 728, 730, 730, 730, 730, 730, 730, 730, 
+    730, 730, 731, 730, 730, 730, 730, 730, 730, 730, 730, 731, 81, 81, 81, 
+    81, 81, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 
+    732, 733, 733, 733, 733, 733, 81, 81, 81, 81, 81, 734, 734, 734, 734, 
+    734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 81, 735, 736, 736, 736, 
+    736, 736, 736, 736, 736, 736, 736, 736, 736, 81, 81, 81, 81, 737, 738, 
+    738, 738, 738, 738, 81, 81, 739, 739, 739, 739, 739, 739, 739, 739, 740, 
+    740, 740, 740, 740, 740, 740, 740, 741, 741, 741, 741, 741, 741, 741, 
+    741, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 
+    742, 81, 81, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 81, 81, 
+    81, 81, 81, 81, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 
+    744, 81, 81, 81, 81, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 
+    745, 745, 81, 81, 81, 81, 746, 746, 746, 746, 746, 746, 746, 746, 747, 
+    747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 81, 81, 81, 81, 
+    81, 81, 81, 81, 81, 81, 81, 748, 749, 749, 749, 749, 749, 749, 749, 749, 
+    749, 749, 749, 749, 749, 749, 749, 81, 749, 749, 749, 749, 749, 749, 81, 
+    81, 750, 750, 750, 750, 750, 750, 81, 81, 750, 81, 750, 750, 750, 750, 
+    750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 
+    750, 750, 81, 750, 750, 81, 81, 81, 750, 81, 81, 750, 751, 751, 751, 751, 
+    751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 81, 752, 753, 753, 753, 
+    753, 753, 753, 753, 753, 754, 754, 754, 754, 754, 754, 754, 754, 754, 
+    754, 754, 754, 754, 754, 754, 755, 755, 756, 756, 756, 756, 756, 756, 
+    756, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 
+    757, 757, 81, 81, 81, 81, 81, 81, 81, 81, 758, 758, 758, 758, 758, 758, 
+    758, 758, 758, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 81, 
+    759, 759, 81, 81, 81, 81, 81, 760, 760, 760, 760, 760, 761, 761, 761, 
+    761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 762, 762, 762, 
+    762, 762, 762, 81, 81, 81, 763, 764, 764, 764, 764, 764, 764, 764, 764, 
+    764, 764, 81, 81, 81, 81, 81, 765, 766, 766, 766, 766, 766, 766, 766, 
+    766, 767, 767, 767, 767, 767, 767, 767, 767, 81, 81, 81, 81, 768, 768, 
+    767, 767, 768, 768, 768, 768, 768, 768, 768, 768, 81, 81, 768, 768, 768, 
+    768, 768, 768, 769, 770, 770, 770, 81, 770, 770, 81, 81, 81, 81, 81, 770, 
+    771, 770, 772, 769, 769, 769, 769, 81, 769, 769, 769, 81, 769, 769, 769, 
+    769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 
+    769, 769, 769, 769, 81, 81, 772, 773, 771, 81, 81, 81, 81, 774, 775, 775, 
+    775, 775, 775, 775, 775, 775, 775, 81, 81, 81, 81, 81, 81, 81, 776, 776, 
+    776, 776, 776, 776, 776, 776, 777, 81, 81, 81, 81, 81, 81, 81, 778, 778, 
+    778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 779, 779, 780, 
+    781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 782, 
+    782, 782, 783, 783, 783, 783, 783, 783, 783, 783, 784, 783, 783, 783, 
+    783, 783, 783, 783, 783, 783, 783, 783, 783, 785, 786, 81, 81, 81, 81, 
+    787, 787, 787, 787, 787, 788, 788, 788, 788, 788, 788, 789, 81, 790, 790, 
+    790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 81, 81, 81, 
+    791, 791, 791, 791, 791, 791, 791, 792, 792, 792, 792, 792, 792, 792, 
+    792, 792, 792, 792, 792, 792, 792, 81, 81, 793, 793, 793, 793, 793, 793, 
+    793, 793, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 81, 81, 
+    81, 81, 81, 795, 795, 795, 795, 795, 795, 795, 795, 796, 796, 796, 796, 
+    796, 796, 796, 796, 796, 796, 81, 81, 81, 81, 81, 81, 81, 797, 797, 797, 
+    797, 81, 81, 81, 81, 798, 798, 798, 798, 798, 798, 798, 799, 799, 799, 
+    799, 799, 799, 799, 799, 799, 81, 81, 81, 81, 81, 81, 81, 800, 800, 800, 
+    800, 800, 800, 800, 800, 800, 800, 800, 81, 81, 81, 81, 81, 801, 801, 
+    801, 801, 801, 801, 801, 801, 801, 801, 801, 81, 81, 81, 81, 81, 81, 81, 
+    802, 802, 802, 802, 802, 802, 803, 803, 803, 803, 803, 803, 803, 803, 
+    803, 803, 803, 803, 804, 804, 804, 804, 805, 805, 805, 805, 805, 805, 
+    805, 805, 805, 805, 81, 81, 81, 81, 81, 81, 806, 806, 806, 806, 806, 806, 
+    806, 806, 806, 806, 806, 806, 806, 806, 806, 81, 807, 807, 807, 807, 807, 
+    807, 807, 807, 807, 807, 807, 807, 807, 808, 808, 808, 808, 808, 808, 
+    808, 808, 808, 808, 807, 809, 809, 809, 809, 809, 809, 809, 809, 809, 
+    809, 809, 809, 809, 809, 810, 810, 811, 811, 811, 810, 811, 810, 810, 
+    810, 810, 812, 812, 812, 812, 813, 813, 813, 813, 813, 81, 81, 81, 81, 
+    81, 81, 814, 815, 814, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 
+    816, 816, 816, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 
+    815, 815, 815, 817, 818, 818, 819, 819, 819, 819, 819, 81, 81, 81, 81, 
+    820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 
+    820, 820, 820, 820, 820, 820, 821, 821, 821, 821, 821, 821, 821, 821, 
+    821, 821, 81, 81, 81, 81, 81, 81, 81, 817, 822, 822, 823, 824, 824, 824, 
+    824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 823, 823, 823, 822, 
+    822, 822, 822, 823, 823, 825, 826, 827, 827, 828, 829, 829, 829, 829, 81, 
+    81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 828, 81, 81, 830, 830, 830, 830, 
+    830, 830, 830, 830, 830, 81, 81, 81, 81, 81, 81, 81, 831, 831, 831, 831, 
+    831, 831, 831, 831, 831, 831, 81, 81, 81, 81, 81, 81, 832, 832, 832, 833, 
+    833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 
+    833, 833, 833, 833, 833, 834, 834, 834, 834, 834, 835, 834, 834, 834, 
+    834, 834, 834, 836, 836, 81, 837, 837, 837, 837, 837, 837, 837, 837, 837, 
+    837, 838, 838, 838, 838, 833, 835, 835, 81, 839, 839, 839, 839, 839, 839, 
+    839, 839, 839, 839, 839, 840, 841, 842, 839, 81, 843, 843, 844, 845, 845, 
+    845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 
+    844, 844, 844, 843, 843, 843, 843, 843, 843, 843, 843, 843, 844, 846, 
+    845, 845, 845, 845, 847, 847, 848, 847, 843, 849, 843, 843, 848, 81, 81, 
+    850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 845, 851, 845, 847, 
+    847, 847, 81, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 
+    852, 852, 852, 852, 852, 852, 852, 852, 81, 81, 81, 853, 853, 853, 853, 
+    853, 853, 853, 853, 853, 853, 81, 853, 853, 853, 853, 853, 853, 853, 853, 
+    853, 854, 854, 854, 855, 855, 855, 854, 854, 855, 856, 857, 855, 858, 
+    858, 859, 858, 858, 859, 855, 81, 860, 860, 860, 860, 860, 860, 860, 81, 
+    860, 81, 860, 860, 860, 860, 81, 860, 860, 860, 860, 860, 860, 860, 860, 
+    860, 860, 860, 860, 860, 860, 860, 81, 860, 860, 861, 81, 81, 81, 81, 81, 
+    81, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 
+    862, 863, 864, 864, 864, 863, 863, 863, 863, 863, 863, 865, 866, 81, 81, 
+    81, 81, 81, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 81, 81, 81, 
+    81, 81, 81, 868, 868, 869, 869, 81, 870, 870, 870, 870, 870, 870, 870, 
+    870, 81, 81, 870, 870, 81, 81, 870, 870, 870, 870, 870, 870, 870, 870, 
+    870, 870, 870, 870, 870, 870, 81, 870, 870, 870, 870, 870, 870, 870, 81, 
+    870, 870, 81, 870, 870, 870, 870, 870, 81, 871, 872, 870, 869, 869, 868, 
+    869, 869, 869, 869, 81, 81, 869, 869, 81, 81, 869, 869, 873, 81, 81, 870, 
+    81, 81, 81, 81, 81, 81, 869, 81, 81, 81, 81, 81, 870, 870, 870, 870, 870, 
+    869, 869, 81, 81, 874, 874, 874, 874, 874, 874, 874, 81, 81, 81, 875, 
+    875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 876, 876, 
+    876, 877, 877, 877, 877, 877, 877, 877, 877, 876, 876, 878, 877, 877, 
+    876, 879, 875, 875, 875, 875, 880, 880, 880, 880, 881, 882, 882, 882, 
+    882, 882, 882, 882, 882, 882, 882, 81, 880, 81, 881, 883, 81, 884, 884, 
+    884, 884, 884, 884, 884, 884, 885, 885, 885, 886, 886, 886, 886, 886, 
+    886, 885, 886, 885, 885, 885, 885, 886, 886, 885, 887, 888, 884, 884, 
+    889, 884, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 81, 81, 81, 
+    81, 81, 81, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 
+    891, 891, 891, 892, 892, 892, 893, 893, 893, 893, 81, 81, 892, 892, 892, 
+    892, 893, 893, 892, 894, 895, 896, 897, 897, 898, 898, 899, 899, 899, 
+    897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 
+    897, 891, 891, 891, 891, 893, 893, 81, 81, 900, 900, 900, 900, 900, 900, 
+    900, 900, 901, 901, 901, 902, 902, 902, 902, 902, 902, 902, 902, 901, 
+    901, 902, 901, 903, 902, 904, 904, 905, 900, 81, 81, 81, 906, 906, 906, 
+    906, 906, 906, 906, 906, 906, 906, 81, 81, 81, 81, 81, 81, 907, 907, 907, 
+    907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 81, 81, 81, 908, 908, 
+    908, 908, 908, 908, 908, 908, 908, 908, 908, 909, 910, 909, 910, 910, 
+    909, 909, 909, 909, 909, 909, 911, 912, 913, 913, 913, 913, 913, 913, 
+    913, 913, 913, 913, 81, 81, 81, 81, 81, 81, 914, 914, 914, 914, 914, 914, 
+    914, 914, 914, 914, 914, 81, 81, 915, 915, 915, 916, 916, 915, 915, 915, 
+    915, 916, 915, 915, 915, 915, 917, 81, 81, 81, 81, 918, 918, 918, 918, 
+    918, 918, 918, 918, 918, 918, 919, 919, 920, 920, 920, 921, 922, 922, 
+    922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 923, 923, 923, 924, 
+    924, 924, 924, 924, 924, 924, 924, 924, 923, 925, 926, 927, 81, 81, 81, 
+    81, 928, 928, 928, 928, 928, 928, 928, 928, 929, 929, 929, 929, 929, 929, 
+    929, 929, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 931, 931, 
+    931, 931, 931, 931, 931, 931, 931, 81, 81, 81, 81, 81, 81, 81, 81, 81, 
+    81, 81, 81, 932, 933, 934, 934, 934, 934, 934, 934, 935, 935, 934, 934, 
+    933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 
+    933, 933, 934, 936, 934, 934, 934, 934, 937, 933, 934, 934, 934, 934, 
+    938, 939, 940, 940, 940, 940, 938, 939, 936, 941, 942, 942, 942, 942, 
+    942, 942, 943, 943, 942, 942, 942, 941, 941, 941, 941, 941, 941, 941, 
+    941, 941, 941, 941, 941, 941, 941, 941, 941, 81, 81, 941, 941, 941, 941, 
+    942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 943, 
+    942, 944, 945, 945, 945, 941, 946, 946, 946, 945, 945, 81, 81, 81, 81, 
+    81, 947, 947, 947, 947, 947, 947, 947, 947, 947, 81, 81, 81, 81, 81, 81, 
+    81, 948, 948, 948, 948, 948, 948, 948, 948, 948, 81, 948, 948, 948, 948, 
+    948, 948, 948, 948, 948, 948, 948, 948, 948, 949, 950, 950, 950, 950, 
+    950, 950, 950, 81, 950, 950, 950, 950, 950, 950, 949, 951, 948, 952, 952, 
+    952, 952, 952, 81, 81, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 
+    954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 
+    954, 954, 954, 954, 954, 81, 81, 81, 955, 956, 957, 957, 957, 957, 957, 
+    957, 957, 957, 957, 957, 957, 957, 957, 957, 81, 81, 958, 958, 958, 958, 
+    958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 81, 959, 958, 958, 958, 
+    958, 958, 958, 958, 959, 958, 958, 959, 958, 958, 81, 960, 960, 960, 960, 
+    960, 960, 960, 81, 960, 960, 81, 960, 960, 960, 960, 960, 960, 960, 960, 
+    960, 960, 960, 960, 960, 960, 961, 961, 961, 961, 961, 961, 81, 81, 81, 
+    961, 81, 961, 961, 81, 961, 961, 961, 962, 961, 963, 963, 960, 961, 964, 
+    964, 964, 964, 964, 964, 964, 964, 964, 964, 81, 81, 81, 81, 81, 81, 965, 
+    965, 965, 965, 965, 965, 81, 965, 965, 81, 965, 965, 965, 965, 965, 965, 
+    965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 966, 966, 966, 966, 
+    966, 81, 967, 967, 81, 966, 966, 967, 966, 968, 965, 81, 81, 81, 81, 81, 
+    81, 81, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 81, 81, 81, 81, 
+    81, 81, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 971, 971, 
+    972, 972, 973, 973, 81, 81, 81, 81, 81, 81, 81, 974, 974, 974, 974, 974, 
+    974, 974, 974, 974, 974, 81, 81, 81, 81, 81, 81, 975, 975, 975, 975, 975, 
+    975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 81, 976, 976, 976, 976, 
+    976, 81, 81, 81, 974, 974, 974, 974, 81, 81, 81, 81, 977, 977, 977, 977, 
+    977, 977, 977, 977, 978, 978, 978, 979, 979, 979, 977, 977, 977, 977, 
+    979, 977, 977, 977, 978, 979, 978, 979, 977, 977, 977, 977, 977, 977, 
+    977, 978, 979, 979, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 
+    977, 81, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 
+    980, 981, 982, 980, 980, 980, 980, 980, 980, 980, 81, 608, 81, 81, 81, 
+    81, 81, 81, 81, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 
+    983, 983, 983, 983, 81, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 
+    81, 81, 81, 81, 985, 985, 986, 986, 986, 986, 986, 986, 986, 986, 986, 
+    986, 986, 986, 986, 986, 81, 81, 987, 987, 987, 987, 987, 988, 81, 81, 
+    989, 989, 989, 989, 989, 989, 989, 989, 990, 990, 990, 990, 990, 990, 
+    990, 991, 991, 991, 992, 992, 993, 993, 993, 993, 994, 994, 994, 994, 
+    991, 993, 81, 81, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 81, 
+    996, 996, 996, 996, 996, 996, 996, 81, 989, 989, 989, 989, 989, 81, 81, 
+    81, 81, 81, 989, 989, 989, 997, 997, 997, 997, 997, 997, 997, 997, 998, 
+    998, 998, 998, 998, 998, 998, 998, 999, 999, 999, 999, 999, 999, 999, 
+    999, 999, 999, 999, 999, 999, 999, 999, 1000, 1000, 1001, 1001, 81, 81, 
+    81, 81, 81, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 
+    1002, 1002, 1002, 81, 81, 81, 1002, 1003, 1003, 1003, 1003, 1003, 1003, 
+    1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 
+    1003, 1003, 1003, 1003, 81, 81, 81, 81, 81, 81, 81, 81, 1004, 1004, 1004, 
+    1004, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 
+    1005, 1005, 1006, 1007, 81, 81, 81, 81, 81, 81, 1008, 1008, 1008, 1008, 
+    1008, 1008, 1008, 1008, 1008, 1008, 81, 81, 81, 81, 81, 81, 1008, 1008, 
+    1008, 81, 81, 81, 81, 81, 579, 574, 574, 574, 574, 574, 574, 574, 574, 
+    574, 574, 574, 574, 574, 574, 81, 1009, 1009, 1009, 1009, 1009, 1009, 
+    1009, 1009, 1009, 1009, 1009, 1009, 81, 81, 81, 81, 1010, 1010, 1010, 
+    1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 81, 81, 81, 81, 81, 1010, 
+    1010, 1010, 1010, 1010, 81, 81, 81, 1010, 81, 81, 81, 81, 81, 81, 81, 
+    1010, 1010, 81, 81, 1011, 1012, 1013, 1014, 503, 503, 503, 503, 81, 81, 
+    81, 81, 317, 317, 317, 317, 317, 317, 81, 81, 317, 317, 317, 317, 317, 
+    317, 317, 81, 81, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 
+    317, 1015, 1015, 451, 451, 451, 317, 317, 317, 1016, 1015, 1015, 1015, 
+    1015, 1015, 503, 503, 503, 503, 503, 503, 503, 503, 156, 156, 156, 156, 
+    156, 156, 156, 156, 317, 317, 96, 96, 96, 96, 96, 156, 156, 317, 317, 
+    317, 317, 317, 317, 96, 96, 96, 96, 317, 317, 317, 81, 81, 81, 81, 81, 
+    81, 81, 724, 724, 1017, 1017, 1017, 724, 81, 81, 619, 619, 619, 619, 81, 
+    81, 81, 81, 619, 81, 81, 81, 81, 81, 81, 81, 510, 510, 510, 510, 510, 
+    510, 510, 510, 510, 510, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 
+    49, 49, 49, 49, 49, 49, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 
+    49, 49, 49, 49, 49, 49, 49, 81, 49, 49, 49, 49, 49, 49, 510, 81, 510, 
+    510, 81, 81, 510, 81, 81, 510, 510, 81, 81, 510, 510, 510, 510, 81, 510, 
+    510, 49, 49, 81, 49, 81, 49, 49, 49, 49, 49, 49, 49, 81, 49, 49, 49, 49, 
+    49, 49, 49, 510, 510, 81, 510, 510, 510, 510, 81, 81, 510, 510, 510, 510, 
+    510, 510, 510, 510, 81, 510, 510, 510, 510, 510, 510, 510, 81, 49, 49, 
+    510, 510, 81, 510, 510, 510, 510, 81, 510, 510, 510, 510, 510, 81, 510, 
+    81, 81, 81, 510, 510, 510, 510, 510, 510, 510, 81, 49, 49, 49, 49, 49, 
+    49, 49, 49, 49, 49, 49, 49, 81, 81, 510, 1018, 49, 49, 49, 49, 49, 49, 
+    49, 49, 49, 496, 49, 49, 49, 49, 49, 49, 510, 510, 510, 510, 510, 510, 
+    510, 510, 510, 1018, 49, 49, 49, 49, 49, 49, 49, 49, 49, 496, 49, 49, 
+    510, 510, 510, 510, 510, 1018, 49, 49, 49, 49, 49, 49, 49, 49, 49, 496, 
+    49, 49, 49, 49, 49, 49, 510, 510, 510, 510, 510, 510, 510, 510, 510, 
+    1018, 49, 496, 49, 49, 49, 49, 49, 49, 49, 49, 510, 49, 81, 81, 1019, 
+    1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1020, 1020, 1020, 
+    1020, 1020, 1020, 1020, 1020, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 
+    1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1020, 1020, 1020, 1020, 
+    1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1020, 1020, 
+    1020, 1020, 1020, 1020, 1020, 1020, 1021, 1020, 1020, 1020, 1020, 1020, 
+    1020, 1021, 1020, 1020, 1022, 1022, 1022, 1022, 1023, 81, 81, 81, 81, 81, 
+    81, 81, 1021, 1021, 1021, 1021, 1021, 81, 1021, 1021, 1021, 1021, 1021, 
+    1021, 1021, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 81, 1024, 1024, 
+    1024, 1024, 1024, 1024, 1024, 1024, 1024, 81, 81, 1024, 1024, 1024, 1024, 
+    1024, 1024, 1024, 81, 1024, 1024, 81, 1024, 1024, 1024, 1024, 1024, 81, 
+    81, 81, 81, 81, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 
+    1025, 1025, 1025, 1025, 81, 81, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 
+    1026, 1026, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 81, 1028, 1028, 
+    1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1029, 1029, 1029, 1029, 
+    1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 
+    1029, 1029, 1030, 1030, 1030, 1030, 1030, 1030, 1031, 81, 81, 81, 81, 81, 
+    1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 81, 81, 81, 
+    81, 1033, 1033, 81, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 
+    1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1035, 1034, 
+    1034, 1034, 1036, 1034, 1034, 1034, 1034, 81, 81, 81, 146, 146, 146, 146, 
+    81, 146, 146, 146, 81, 146, 146, 81, 146, 81, 81, 146, 81, 146, 146, 146, 
+    146, 146, 146, 146, 146, 146, 146, 81, 146, 146, 146, 146, 81, 146, 81, 
+    146, 81, 81, 81, 81, 81, 81, 146, 81, 81, 81, 81, 146, 81, 146, 81, 146, 
+    81, 146, 146, 146, 81, 146, 81, 146, 81, 146, 81, 146, 81, 146, 146, 146, 
+    146, 81, 146, 81, 146, 146, 81, 146, 146, 146, 146, 146, 146, 146, 146, 
+    146, 81, 81, 81, 81, 81, 146, 146, 146, 81, 146, 146, 146, 132, 132, 81, 
+    81, 81, 81, 81, 81, 529, 529, 529, 529, 525, 529, 529, 529, 529, 529, 
+    529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 1037, 1037, 1037, 1037, 
+    1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 529, 529, 529, 529, 529, 
+    529, 529, 1037, 1037, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 
+    529, 529, 529, 529, 525, 529, 529, 529, 529, 529, 529, 1037, 1037, 47, 
+    47, 47, 519, 519, 1037, 1037, 1037, 530, 530, 530, 530, 530, 530, 317, 
+    40, 530, 530, 40, 40, 1037, 1037, 1037, 1037, 530, 530, 530, 530, 530, 
+    530, 1038, 530, 530, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 
+    1038, 1038, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 1037, 1037, 
+    1037, 1037, 1037, 1037, 1037, 1037, 1037, 1039, 1039, 1039, 1039, 1039, 
+    1039, 1039, 1039, 1039, 1039, 1040, 585, 585, 1037, 1037, 1037, 1037, 
+    1037, 585, 585, 585, 585, 1037, 1037, 1037, 1037, 585, 1037, 1037, 1037, 
+    1037, 1037, 1037, 1037, 585, 585, 1037, 1037, 1037, 1037, 1037, 1037, 
+    525, 525, 525, 525, 525, 525, 1037, 1037, 525, 529, 529, 529, 529, 529, 
+    529, 529, 529, 529, 529, 529, 529, 525, 525, 525, 525, 525, 525, 525, 
+    525, 525, 529, 525, 525, 525, 525, 525, 525, 529, 525, 525, 525, 525, 
+    525, 525, 525, 536, 525, 525, 525, 525, 525, 525, 529, 529, 529, 529, 
+    529, 529, 529, 529, 40, 40, 529, 529, 525, 525, 525, 525, 525, 528, 528, 
+    525, 525, 525, 525, 525, 528, 525, 525, 525, 525, 525, 536, 536, 536, 
+    525, 525, 536, 525, 525, 536, 534, 534, 529, 529, 525, 525, 529, 529, 
+    529, 525, 529, 529, 529, 525, 525, 525, 1041, 1041, 1041, 1041, 1041, 
+    525, 525, 525, 525, 525, 525, 525, 529, 525, 529, 536, 536, 525, 525, 
+    536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 525, 525, 525, 
+    525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 536, 536, 536, 536, 
+    525, 525, 525, 525, 536, 525, 536, 525, 525, 525, 536, 525, 525, 525, 
+    525, 536, 536, 536, 525, 536, 536, 536, 528, 525, 528, 525, 528, 525, 
+    525, 525, 525, 525, 536, 525, 525, 525, 525, 528, 525, 528, 528, 525, 
+    525, 525, 525, 525, 525, 525, 525, 525, 525, 529, 529, 525, 528, 528, 
+    528, 528, 528, 528, 528, 525, 525, 525, 525, 525, 525, 525, 525, 528, 
+    528, 528, 528, 528, 528, 525, 525, 525, 525, 525, 528, 528, 528, 528, 
+    528, 528, 528, 528, 528, 528, 528, 528, 40, 40, 40, 40, 529, 525, 525, 
+    525, 525, 529, 529, 529, 529, 529, 534, 534, 529, 529, 529, 529, 536, 
+    529, 529, 529, 529, 529, 534, 529, 529, 529, 529, 536, 536, 529, 529, 
+    529, 529, 529, 40, 40, 40, 40, 40, 40, 40, 40, 529, 529, 529, 529, 40, 
+    40, 529, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 536, 536, 536, 
+    525, 525, 525, 536, 536, 536, 536, 536, 40, 40, 40, 40, 40, 40, 538, 538, 
+    538, 1042, 1042, 1042, 40, 40, 40, 40, 525, 525, 525, 536, 525, 525, 525, 
+    525, 525, 525, 525, 525, 536, 536, 536, 525, 536, 525, 525, 525, 525, 
+    525, 529, 529, 529, 529, 529, 529, 536, 529, 529, 529, 525, 525, 525, 
+    529, 529, 1037, 1037, 1037, 529, 529, 529, 525, 525, 1037, 1037, 1037, 
+    529, 529, 529, 529, 525, 525, 525, 525, 525, 525, 1037, 1037, 1037, 1037, 
+    1037, 1037, 40, 40, 40, 40, 1037, 1037, 1037, 1037, 40, 40, 40, 40, 40, 
+    529, 529, 529, 529, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 40, 40, 
+    1037, 1037, 1037, 1037, 1037, 1037, 40, 40, 40, 40, 40, 40, 1037, 1037, 
+    536, 536, 536, 536, 536, 525, 536, 536, 525, 525, 525, 525, 525, 525, 
+    536, 525, 536, 536, 525, 525, 525, 536, 536, 1037, 525, 1037, 1037, 525, 
+    525, 525, 525, 1037, 1037, 1037, 525, 1037, 525, 525, 525, 525, 525, 525, 
+    525, 1037, 1037, 1037, 1037, 1037, 525, 525, 525, 525, 525, 536, 536, 
+    525, 536, 536, 1037, 1037, 1037, 1037, 1037, 1037, 525, 536, 536, 536, 
+    536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 525, 525, 1037, 1037, 
+    1037, 1037, 1037, 1037, 81, 81, 592, 592, 592, 592, 592, 592, 592, 593, 
+    592, 592, 592, 592, 592, 593, 593, 593, 592, 593, 593, 593, 593, 593, 
+    593, 593, 593, 593, 593, 593, 593, 593, 81, 81, 81, 503, 81, 81, 81, 81, 
+    81, 81, 503, 503, 503, 503, 503, 503, 503, 503, 670, 670, 670, 670, 670, 
+    670, 81, 81, 
+};
+
+/* decomposition data */
+static const unsigned short decomp_data[] = {
+    0, 257, 32, 514, 32, 776, 259, 97, 514, 32, 772, 259, 50, 259, 51, 514, 
+    32, 769, 258, 956, 514, 32, 807, 259, 49, 259, 111, 772, 49, 8260, 52, 
+    772, 49, 8260, 50, 772, 51, 8260, 52, 512, 65, 768, 512, 65, 769, 512, 
+    65, 770, 512, 65, 771, 512, 65, 776, 512, 65, 778, 512, 67, 807, 512, 69, 
+    768, 512, 69, 769, 512, 69, 770, 512, 69, 776, 512, 73, 768, 512, 73, 
+    769, 512, 73, 770, 512, 73, 776, 512, 78, 771, 512, 79, 768, 512, 79, 
+    769, 512, 79, 770, 512, 79, 771, 512, 79, 776, 512, 85, 768, 512, 85, 
+    769, 512, 85, 770, 512, 85, 776, 512, 89, 769, 512, 97, 768, 512, 97, 
+    769, 512, 97, 770, 512, 97, 771, 512, 97, 776, 512, 97, 778, 512, 99, 
+    807, 512, 101, 768, 512, 101, 769, 512, 101, 770, 512, 101, 776, 512, 
+    105, 768, 512, 105, 769, 512, 105, 770, 512, 105, 776, 512, 110, 771, 
+    512, 111, 768, 512, 111, 769, 512, 111, 770, 512, 111, 771, 512, 111, 
+    776, 512, 117, 768, 512, 117, 769, 512, 117, 770, 512, 117, 776, 512, 
+    121, 769, 512, 121, 776, 512, 65, 772, 512, 97, 772, 512, 65, 774, 512, 
+    97, 774, 512, 65, 808, 512, 97, 808, 512, 67, 769, 512, 99, 769, 512, 67, 
+    770, 512, 99, 770, 512, 67, 775, 512, 99, 775, 512, 67, 780, 512, 99, 
+    780, 512, 68, 780, 512, 100, 780, 512, 69, 772, 512, 101, 772, 512, 69, 
+    774, 512, 101, 774, 512, 69, 775, 512, 101, 775, 512, 69, 808, 512, 101, 
+    808, 512, 69, 780, 512, 101, 780, 512, 71, 770, 512, 103, 770, 512, 71, 
+    774, 512, 103, 774, 512, 71, 775, 512, 103, 775, 512, 71, 807, 512, 103, 
+    807, 512, 72, 770, 512, 104, 770, 512, 73, 771, 512, 105, 771, 512, 73, 
+    772, 512, 105, 772, 512, 73, 774, 512, 105, 774, 512, 73, 808, 512, 105, 
+    808, 512, 73, 775, 514, 73, 74, 514, 105, 106, 512, 74, 770, 512, 106, 
+    770, 512, 75, 807, 512, 107, 807, 512, 76, 769, 512, 108, 769, 512, 76, 
+    807, 512, 108, 807, 512, 76, 780, 512, 108, 780, 514, 76, 183, 514, 108, 
+    183, 512, 78, 769, 512, 110, 769, 512, 78, 807, 512, 110, 807, 512, 78, 
+    780, 512, 110, 780, 514, 700, 110, 512, 79, 772, 512, 111, 772, 512, 79, 
+    774, 512, 111, 774, 512, 79, 779, 512, 111, 779, 512, 82, 769, 512, 114, 
+    769, 512, 82, 807, 512, 114, 807, 512, 82, 780, 512, 114, 780, 512, 83, 
+    769, 512, 115, 769, 512, 83, 770, 512, 115, 770, 512, 83, 807, 512, 115, 
+    807, 512, 83, 780, 512, 115, 780, 512, 84, 807, 512, 116, 807, 512, 84, 
+    780, 512, 116, 780, 512, 85, 771, 512, 117, 771, 512, 85, 772, 512, 117, 
+    772, 512, 85, 774, 512, 117, 774, 512, 85, 778, 512, 117, 778, 512, 85, 
+    779, 512, 117, 779, 512, 85, 808, 512, 117, 808, 512, 87, 770, 512, 119, 
+    770, 512, 89, 770, 512, 121, 770, 512, 89, 776, 512, 90, 769, 512, 122, 
+    769, 512, 90, 775, 512, 122, 775, 512, 90, 780, 512, 122, 780, 258, 115, 
+    512, 79, 795, 512, 111, 795, 512, 85, 795, 512, 117, 795, 514, 68, 381, 
+    514, 68, 382, 514, 100, 382, 514, 76, 74, 514, 76, 106, 514, 108, 106, 
+    514, 78, 74, 514, 78, 106, 514, 110, 106, 512, 65, 780, 512, 97, 780, 
+    512, 73, 780, 512, 105, 780, 512, 79, 780, 512, 111, 780, 512, 85, 780, 
+    512, 117, 780, 512, 220, 772, 512, 252, 772, 512, 220, 769, 512, 252, 
+    769, 512, 220, 780, 512, 252, 780, 512, 220, 768, 512, 252, 768, 512, 
+    196, 772, 512, 228, 772, 512, 550, 772, 512, 551, 772, 512, 198, 772, 
+    512, 230, 772, 512, 71, 780, 512, 103, 780, 512, 75, 780, 512, 107, 780, 
+    512, 79, 808, 512, 111, 808, 512, 490, 772, 512, 491, 772, 512, 439, 780, 
+    512, 658, 780, 512, 106, 780, 514, 68, 90, 514, 68, 122, 514, 100, 122, 
+    512, 71, 769, 512, 103, 769, 512, 78, 768, 512, 110, 768, 512, 197, 769, 
+    512, 229, 769, 512, 198, 769, 512, 230, 769, 512, 216, 769, 512, 248, 
+    769, 512, 65, 783, 512, 97, 783, 512, 65, 785, 512, 97, 785, 512, 69, 
+    783, 512, 101, 783, 512, 69, 785, 512, 101, 785, 512, 73, 783, 512, 105, 
+    783, 512, 73, 785, 512, 105, 785, 512, 79, 783, 512, 111, 783, 512, 79, 
+    785, 512, 111, 785, 512, 82, 783, 512, 114, 783, 512, 82, 785, 512, 114, 
+    785, 512, 85, 783, 512, 117, 783, 512, 85, 785, 512, 117, 785, 512, 83, 
+    806, 512, 115, 806, 512, 84, 806, 512, 116, 806, 512, 72, 780, 512, 104, 
+    780, 512, 65, 775, 512, 97, 775, 512, 69, 807, 512, 101, 807, 512, 214, 
+    772, 512, 246, 772, 512, 213, 772, 512, 245, 772, 512, 79, 775, 512, 111, 
+    775, 512, 558, 772, 512, 559, 772, 512, 89, 772, 512, 121, 772, 259, 104, 
+    259, 614, 259, 106, 259, 114, 259, 633, 259, 635, 259, 641, 259, 119, 
+    259, 121, 514, 32, 774, 514, 32, 775, 514, 32, 778, 514, 32, 808, 514, 
+    32, 771, 514, 32, 779, 259, 611, 259, 108, 259, 115, 259, 120, 259, 661, 
+    256, 768, 256, 769, 256, 787, 512, 776, 769, 256, 697, 514, 32, 837, 256, 
+    59, 514, 32, 769, 512, 168, 769, 512, 913, 769, 256, 183, 512, 917, 769, 
+    512, 919, 769, 512, 921, 769, 512, 927, 769, 512, 933, 769, 512, 937, 
+    769, 512, 970, 769, 512, 921, 776, 512, 933, 776, 512, 945, 769, 512, 
+    949, 769, 512, 951, 769, 512, 953, 769, 512, 971, 769, 512, 953, 776, 
+    512, 965, 776, 512, 959, 769, 512, 965, 769, 512, 969, 769, 258, 946, 
+    258, 952, 258, 933, 512, 978, 769, 512, 978, 776, 258, 966, 258, 960, 
+    258, 954, 258, 961, 258, 962, 258, 920, 258, 949, 258, 931, 512, 1045, 
+    768, 512, 1045, 776, 512, 1043, 769, 512, 1030, 776, 512, 1050, 769, 512, 
+    1048, 768, 512, 1059, 774, 512, 1048, 774, 512, 1080, 774, 512, 1077, 
+    768, 512, 1077, 776, 512, 1075, 769, 512, 1110, 776, 512, 1082, 769, 512, 
+    1080, 768, 512, 1091, 774, 512, 1140, 783, 512, 1141, 783, 512, 1046, 
+    774, 512, 1078, 774, 512, 1040, 774, 512, 1072, 774, 512, 1040, 776, 512, 
+    1072, 776, 512, 1045, 774, 512, 1077, 774, 512, 1240, 776, 512, 1241, 
+    776, 512, 1046, 776, 512, 1078, 776, 512, 1047, 776, 512, 1079, 776, 512, 
+    1048, 772, 512, 1080, 772, 512, 1048, 776, 512, 1080, 776, 512, 1054, 
+    776, 512, 1086, 776, 512, 1256, 776, 512, 1257, 776, 512, 1069, 776, 512, 
+    1101, 776, 512, 1059, 772, 512, 1091, 772, 512, 1059, 776, 512, 1091, 
+    776, 512, 1059, 779, 512, 1091, 779, 512, 1063, 776, 512, 1095, 776, 512, 
+    1067, 776, 512, 1099, 776, 514, 1381, 1410, 512, 1575, 1619, 512, 1575, 
+    1620, 512, 1608, 1620, 512, 1575, 1621, 512, 1610, 1620, 514, 1575, 1652, 
+    514, 1608, 1652, 514, 1735, 1652, 514, 1610, 1652, 512, 1749, 1620, 512, 
+    1729, 1620, 512, 1746, 1620, 512, 2344, 2364, 512, 2352, 2364, 512, 2355, 
+    2364, 512, 2325, 2364, 512, 2326, 2364, 512, 2327, 2364, 512, 2332, 2364, 
+    512, 2337, 2364, 512, 2338, 2364, 512, 2347, 2364, 512, 2351, 2364, 512, 
+    2503, 2494, 512, 2503, 2519, 512, 2465, 2492, 512, 2466, 2492, 512, 2479, 
+    2492, 512, 2610, 2620, 512, 2616, 2620, 512, 2582, 2620, 512, 2583, 2620, 
+    512, 2588, 2620, 512, 2603, 2620, 512, 2887, 2902, 512, 2887, 2878, 512, 
+    2887, 2903, 512, 2849, 2876, 512, 2850, 2876, 512, 2962, 3031, 512, 3014, 
+    3006, 512, 3015, 3006, 512, 3014, 3031, 512, 3142, 3158, 512, 3263, 3285, 
+    512, 3270, 3285, 512, 3270, 3286, 512, 3270, 3266, 512, 3274, 3285, 512, 
+    3398, 3390, 512, 3399, 3390, 512, 3398, 3415, 512, 3545, 3530, 512, 3545, 
+    3535, 512, 3548, 3530, 512, 3545, 3551, 514, 3661, 3634, 514, 3789, 3762, 
+    514, 3755, 3737, 514, 3755, 3745, 257, 3851, 512, 3906, 4023, 512, 3916, 
+    4023, 512, 3921, 4023, 512, 3926, 4023, 512, 3931, 4023, 512, 3904, 4021, 
+    512, 3953, 3954, 512, 3953, 3956, 512, 4018, 3968, 514, 4018, 3969, 512, 
+    4019, 3968, 514, 4019, 3969, 512, 3953, 3968, 512, 3986, 4023, 512, 3996, 
+    4023, 512, 4001, 4023, 512, 4006, 4023, 512, 4011, 4023, 512, 3984, 4021, 
+    512, 4133, 4142, 259, 4316, 512, 6917, 6965, 512, 6919, 6965, 512, 6921, 
+    6965, 512, 6923, 6965, 512, 6925, 6965, 512, 6929, 6965, 512, 6970, 6965, 
+    512, 6972, 6965, 512, 6974, 6965, 512, 6975, 6965, 512, 6978, 6965, 259, 
+    65, 259, 198, 259, 66, 259, 68, 259, 69, 259, 398, 259, 71, 259, 72, 259, 
+    73, 259, 74, 259, 75, 259, 76, 259, 77, 259, 78, 259, 79, 259, 546, 259, 
+    80, 259, 82, 259, 84, 259, 85, 259, 87, 259, 97, 259, 592, 259, 593, 259, 
+    7426, 259, 98, 259, 100, 259, 101, 259, 601, 259, 603, 259, 604, 259, 
+    103, 259, 107, 259, 109, 259, 331, 259, 111, 259, 596, 259, 7446, 259, 
+    7447, 259, 112, 259, 116, 259, 117, 259, 7453, 259, 623, 259, 118, 259, 
+    7461, 259, 946, 259, 947, 259, 948, 259, 966, 259, 967, 261, 105, 261, 
+    114, 261, 117, 261, 118, 261, 946, 261, 947, 261, 961, 261, 966, 261, 
+    967, 259, 1085, 259, 594, 259, 99, 259, 597, 259, 240, 259, 604, 259, 
+    102, 259, 607, 259, 609, 259, 613, 259, 616, 259, 617, 259, 618, 259, 
+    7547, 259, 669, 259, 621, 259, 7557, 259, 671, 259, 625, 259, 624, 259, 
+    626, 259, 627, 259, 628, 259, 629, 259, 632, 259, 642, 259, 643, 259, 
+    427, 259, 649, 259, 650, 259, 7452, 259, 651, 259, 652, 259, 122, 259, 
+    656, 259, 657, 259, 658, 259, 952, 512, 65, 805, 512, 97, 805, 512, 66, 
+    775, 512, 98, 775, 512, 66, 803, 512, 98, 803, 512, 66, 817, 512, 98, 
+    817, 512, 199, 769, 512, 231, 769, 512, 68, 775, 512, 100, 775, 512, 68, 
+    803, 512, 100, 803, 512, 68, 817, 512, 100, 817, 512, 68, 807, 512, 100, 
+    807, 512, 68, 813, 512, 100, 813, 512, 274, 768, 512, 275, 768, 512, 274, 
+    769, 512, 275, 769, 512, 69, 813, 512, 101, 813, 512, 69, 816, 512, 101, 
+    816, 512, 552, 774, 512, 553, 774, 512, 70, 775, 512, 102, 775, 512, 71, 
+    772, 512, 103, 772, 512, 72, 775, 512, 104, 775, 512, 72, 803, 512, 104, 
+    803, 512, 72, 776, 512, 104, 776, 512, 72, 807, 512, 104, 807, 512, 72, 
+    814, 512, 104, 814, 512, 73, 816, 512, 105, 816, 512, 207, 769, 512, 239, 
+    769, 512, 75, 769, 512, 107, 769, 512, 75, 803, 512, 107, 803, 512, 75, 
+    817, 512, 107, 817, 512, 76, 803, 512, 108, 803, 512, 7734, 772, 512, 
+    7735, 772, 512, 76, 817, 512, 108, 817, 512, 76, 813, 512, 108, 813, 512, 
+    77, 769, 512, 109, 769, 512, 77, 775, 512, 109, 775, 512, 77, 803, 512, 
+    109, 803, 512, 78, 775, 512, 110, 775, 512, 78, 803, 512, 110, 803, 512, 
+    78, 817, 512, 110, 817, 512, 78, 813, 512, 110, 813, 512, 213, 769, 512, 
+    245, 769, 512, 213, 776, 512, 245, 776, 512, 332, 768, 512, 333, 768, 
+    512, 332, 769, 512, 333, 769, 512, 80, 769, 512, 112, 769, 512, 80, 775, 
+    512, 112, 775, 512, 82, 775, 512, 114, 775, 512, 82, 803, 512, 114, 803, 
+    512, 7770, 772, 512, 7771, 772, 512, 82, 817, 512, 114, 817, 512, 83, 
+    775, 512, 115, 775, 512, 83, 803, 512, 115, 803, 512, 346, 775, 512, 347, 
+    775, 512, 352, 775, 512, 353, 775, 512, 7778, 775, 512, 7779, 775, 512, 
+    84, 775, 512, 116, 775, 512, 84, 803, 512, 116, 803, 512, 84, 817, 512, 
+    116, 817, 512, 84, 813, 512, 116, 813, 512, 85, 804, 512, 117, 804, 512, 
+    85, 816, 512, 117, 816, 512, 85, 813, 512, 117, 813, 512, 360, 769, 512, 
+    361, 769, 512, 362, 776, 512, 363, 776, 512, 86, 771, 512, 118, 771, 512, 
+    86, 803, 512, 118, 803, 512, 87, 768, 512, 119, 768, 512, 87, 769, 512, 
+    119, 769, 512, 87, 776, 512, 119, 776, 512, 87, 775, 512, 119, 775, 512, 
+    87, 803, 512, 119, 803, 512, 88, 775, 512, 120, 775, 512, 88, 776, 512, 
+    120, 776, 512, 89, 775, 512, 121, 775, 512, 90, 770, 512, 122, 770, 512, 
+    90, 803, 512, 122, 803, 512, 90, 817, 512, 122, 817, 512, 104, 817, 512, 
+    116, 776, 512, 119, 778, 512, 121, 778, 514, 97, 702, 512, 383, 775, 512, 
+    65, 803, 512, 97, 803, 512, 65, 777, 512, 97, 777, 512, 194, 769, 512, 
+    226, 769, 512, 194, 768, 512, 226, 768, 512, 194, 777, 512, 226, 777, 
+    512, 194, 771, 512, 226, 771, 512, 7840, 770, 512, 7841, 770, 512, 258, 
+    769, 512, 259, 769, 512, 258, 768, 512, 259, 768, 512, 258, 777, 512, 
+    259, 777, 512, 258, 771, 512, 259, 771, 512, 7840, 774, 512, 7841, 774, 
+    512, 69, 803, 512, 101, 803, 512, 69, 777, 512, 101, 777, 512, 69, 771, 
+    512, 101, 771, 512, 202, 769, 512, 234, 769, 512, 202, 768, 512, 234, 
+    768, 512, 202, 777, 512, 234, 777, 512, 202, 771, 512, 234, 771, 512, 
+    7864, 770, 512, 7865, 770, 512, 73, 777, 512, 105, 777, 512, 73, 803, 
+    512, 105, 803, 512, 79, 803, 512, 111, 803, 512, 79, 777, 512, 111, 777, 
+    512, 212, 769, 512, 244, 769, 512, 212, 768, 512, 244, 768, 512, 212, 
+    777, 512, 244, 777, 512, 212, 771, 512, 244, 771, 512, 7884, 770, 512, 
+    7885, 770, 512, 416, 769, 512, 417, 769, 512, 416, 768, 512, 417, 768, 
+    512, 416, 777, 512, 417, 777, 512, 416, 771, 512, 417, 771, 512, 416, 
+    803, 512, 417, 803, 512, 85, 803, 512, 117, 803, 512, 85, 777, 512, 117, 
+    777, 512, 431, 769, 512, 432, 769, 512, 431, 768, 512, 432, 768, 512, 
+    431, 777, 512, 432, 777, 512, 431, 771, 512, 432, 771, 512, 431, 803, 
+    512, 432, 803, 512, 89, 768, 512, 121, 768, 512, 89, 803, 512, 121, 803, 
+    512, 89, 777, 512, 121, 777, 512, 89, 771, 512, 121, 771, 512, 945, 787, 
+    512, 945, 788, 512, 7936, 768, 512, 7937, 768, 512, 7936, 769, 512, 7937, 
+    769, 512, 7936, 834, 512, 7937, 834, 512, 913, 787, 512, 913, 788, 512, 
+    7944, 768, 512, 7945, 768, 512, 7944, 769, 512, 7945, 769, 512, 7944, 
+    834, 512, 7945, 834, 512, 949, 787, 512, 949, 788, 512, 7952, 768, 512, 
+    7953, 768, 512, 7952, 769, 512, 7953, 769, 512, 917, 787, 512, 917, 788, 
+    512, 7960, 768, 512, 7961, 768, 512, 7960, 769, 512, 7961, 769, 512, 951, 
+    787, 512, 951, 788, 512, 7968, 768, 512, 7969, 768, 512, 7968, 769, 512, 
+    7969, 769, 512, 7968, 834, 512, 7969, 834, 512, 919, 787, 512, 919, 788, 
+    512, 7976, 768, 512, 7977, 768, 512, 7976, 769, 512, 7977, 769, 512, 
+    7976, 834, 512, 7977, 834, 512, 953, 787, 512, 953, 788, 512, 7984, 768, 
+    512, 7985, 768, 512, 7984, 769, 512, 7985, 769, 512, 7984, 834, 512, 
+    7985, 834, 512, 921, 787, 512, 921, 788, 512, 7992, 768, 512, 7993, 768, 
+    512, 7992, 769, 512, 7993, 769, 512, 7992, 834, 512, 7993, 834, 512, 959, 
+    787, 512, 959, 788, 512, 8000, 768, 512, 8001, 768, 512, 8000, 769, 512, 
+    8001, 769, 512, 927, 787, 512, 927, 788, 512, 8008, 768, 512, 8009, 768, 
+    512, 8008, 769, 512, 8009, 769, 512, 965, 787, 512, 965, 788, 512, 8016, 
+    768, 512, 8017, 768, 512, 8016, 769, 512, 8017, 769, 512, 8016, 834, 512, 
+    8017, 834, 512, 933, 788, 512, 8025, 768, 512, 8025, 769, 512, 8025, 834, 
+    512, 969, 787, 512, 969, 788, 512, 8032, 768, 512, 8033, 768, 512, 8032, 
+    769, 512, 8033, 769, 512, 8032, 834, 512, 8033, 834, 512, 937, 787, 512, 
+    937, 788, 512, 8040, 768, 512, 8041, 768, 512, 8040, 769, 512, 8041, 769, 
+    512, 8040, 834, 512, 8041, 834, 512, 945, 768, 256, 940, 512, 949, 768, 
+    256, 941, 512, 951, 768, 256, 942, 512, 953, 768, 256, 943, 512, 959, 
+    768, 256, 972, 512, 965, 768, 256, 973, 512, 969, 768, 256, 974, 512, 
+    7936, 837, 512, 7937, 837, 512, 7938, 837, 512, 7939, 837, 512, 7940, 
+    837, 512, 7941, 837, 512, 7942, 837, 512, 7943, 837, 512, 7944, 837, 512, 
+    7945, 837, 512, 7946, 837, 512, 7947, 837, 512, 7948, 837, 512, 7949, 
+    837, 512, 7950, 837, 512, 7951, 837, 512, 7968, 837, 512, 7969, 837, 512, 
+    7970, 837, 512, 7971, 837, 512, 7972, 837, 512, 7973, 837, 512, 7974, 
+    837, 512, 7975, 837, 512, 7976, 837, 512, 7977, 837, 512, 7978, 837, 512, 
+    7979, 837, 512, 7980, 837, 512, 7981, 837, 512, 7982, 837, 512, 7983, 
+    837, 512, 8032, 837, 512, 8033, 837, 512, 8034, 837, 512, 8035, 837, 512, 
+    8036, 837, 512, 8037, 837, 512, 8038, 837, 512, 8039, 837, 512, 8040, 
+    837, 512, 8041, 837, 512, 8042, 837, 512, 8043, 837, 512, 8044, 837, 512, 
+    8045, 837, 512, 8046, 837, 512, 8047, 837, 512, 945, 774, 512, 945, 772, 
+    512, 8048, 837, 512, 945, 837, 512, 940, 837, 512, 945, 834, 512, 8118, 
+    837, 512, 913, 774, 512, 913, 772, 512, 913, 768, 256, 902, 512, 913, 
+    837, 514, 32, 787, 256, 953, 514, 32, 787, 514, 32, 834, 512, 168, 834, 
+    512, 8052, 837, 512, 951, 837, 512, 942, 837, 512, 951, 834, 512, 8134, 
+    837, 512, 917, 768, 256, 904, 512, 919, 768, 256, 905, 512, 919, 837, 
+    512, 8127, 768, 512, 8127, 769, 512, 8127, 834, 512, 953, 774, 512, 953, 
+    772, 512, 970, 768, 256, 912, 512, 953, 834, 512, 970, 834, 512, 921, 
+    774, 512, 921, 772, 512, 921, 768, 256, 906, 512, 8190, 768, 512, 8190, 
+    769, 512, 8190, 834, 512, 965, 774, 512, 965, 772, 512, 971, 768, 256, 
+    944, 512, 961, 787, 512, 961, 788, 512, 965, 834, 512, 971, 834, 512, 
+    933, 774, 512, 933, 772, 512, 933, 768, 256, 910, 512, 929, 788, 512, 
+    168, 768, 256, 901, 256, 96, 512, 8060, 837, 512, 969, 837, 512, 974, 
+    837, 512, 969, 834, 512, 8182, 837, 512, 927, 768, 256, 908, 512, 937, 
+    768, 256, 911, 512, 937, 837, 256, 180, 514, 32, 788, 256, 8194, 256, 
+    8195, 258, 32, 258, 32, 258, 32, 258, 32, 258, 32, 257, 32, 258, 32, 258, 
+    32, 258, 32, 257, 8208, 514, 32, 819, 258, 46, 514, 46, 46, 770, 46, 46, 
+    46, 257, 32, 514, 8242, 8242, 770, 8242, 8242, 8242, 514, 8245, 8245, 
+    770, 8245, 8245, 8245, 514, 33, 33, 514, 32, 773, 514, 63, 63, 514, 63, 
+    33, 514, 33, 63, 1026, 8242, 8242, 8242, 8242, 258, 32, 259, 48, 259, 
+    105, 259, 52, 259, 53, 259, 54, 259, 55, 259, 56, 259, 57, 259, 43, 259, 
+    8722, 259, 61, 259, 40, 259, 41, 259, 110, 261, 48, 261, 49, 261, 50, 
+    261, 51, 261, 52, 261, 53, 261, 54, 261, 55, 261, 56, 261, 57, 261, 43, 
+    261, 8722, 261, 61, 261, 40, 261, 41, 261, 97, 261, 101, 261, 111, 261, 
+    120, 261, 601, 261, 104, 261, 107, 261, 108, 261, 109, 261, 110, 261, 
+    112, 261, 115, 261, 116, 514, 82, 115, 770, 97, 47, 99, 770, 97, 47, 115, 
+    262, 67, 514, 176, 67, 770, 99, 47, 111, 770, 99, 47, 117, 258, 400, 514, 
+    176, 70, 262, 103, 262, 72, 262, 72, 262, 72, 262, 104, 262, 295, 262, 
+    73, 262, 73, 262, 76, 262, 108, 262, 78, 514, 78, 111, 262, 80, 262, 81, 
+    262, 82, 262, 82, 262, 82, 515, 83, 77, 770, 84, 69, 76, 515, 84, 77, 
+    262, 90, 256, 937, 262, 90, 256, 75, 256, 197, 262, 66, 262, 67, 262, 
+    101, 262, 69, 262, 70, 262, 77, 262, 111, 258, 1488, 258, 1489, 258, 
+    1490, 258, 1491, 262, 105, 770, 70, 65, 88, 262, 960, 262, 947, 262, 915, 
+    262, 928, 262, 8721, 262, 68, 262, 100, 262, 101, 262, 105, 262, 106, 
+    772, 49, 8260, 55, 772, 49, 8260, 57, 1028, 49, 8260, 49, 48, 772, 49, 
+    8260, 51, 772, 50, 8260, 51, 772, 49, 8260, 53, 772, 50, 8260, 53, 772, 
+    51, 8260, 53, 772, 52, 8260, 53, 772, 49, 8260, 54, 772, 53, 8260, 54, 
+    772, 49, 8260, 56, 772, 51, 8260, 56, 772, 53, 8260, 56, 772, 55, 8260, 
+    56, 516, 49, 8260, 258, 73, 514, 73, 73, 770, 73, 73, 73, 514, 73, 86, 
+    258, 86, 514, 86, 73, 770, 86, 73, 73, 1026, 86, 73, 73, 73, 514, 73, 88, 
+    258, 88, 514, 88, 73, 770, 88, 73, 73, 258, 76, 258, 67, 258, 68, 258, 
+    77, 258, 105, 514, 105, 105, 770, 105, 105, 105, 514, 105, 118, 258, 118, 
+    514, 118, 105, 770, 118, 105, 105, 1026, 118, 105, 105, 105, 514, 105, 
+    120, 258, 120, 514, 120, 105, 770, 120, 105, 105, 258, 108, 258, 99, 258, 
+    100, 258, 109, 772, 48, 8260, 51, 512, 8592, 824, 512, 8594, 824, 512, 
+    8596, 824, 512, 8656, 824, 512, 8660, 824, 512, 8658, 824, 512, 8707, 
+    824, 512, 8712, 824, 512, 8715, 824, 512, 8739, 824, 512, 8741, 824, 514, 
+    8747, 8747, 770, 8747, 8747, 8747, 514, 8750, 8750, 770, 8750, 8750, 
+    8750, 512, 8764, 824, 512, 8771, 824, 512, 8773, 824, 512, 8776, 824, 
+    512, 61, 824, 512, 8801, 824, 512, 8781, 824, 512, 60, 824, 512, 62, 824, 
+    512, 8804, 824, 512, 8805, 824, 512, 8818, 824, 512, 8819, 824, 512, 
+    8822, 824, 512, 8823, 824, 512, 8826, 824, 512, 8827, 824, 512, 8834, 
+    824, 512, 8835, 824, 512, 8838, 824, 512, 8839, 824, 512, 8866, 824, 512, 
+    8872, 824, 512, 8873, 824, 512, 8875, 824, 512, 8828, 824, 512, 8829, 
+    824, 512, 8849, 824, 512, 8850, 824, 512, 8882, 824, 512, 8883, 824, 512, 
+    8884, 824, 512, 8885, 824, 256, 12296, 256, 12297, 263, 49, 263, 50, 263, 
+    51, 263, 52, 263, 53, 263, 54, 263, 55, 263, 56, 263, 57, 519, 49, 48, 
+    519, 49, 49, 519, 49, 50, 519, 49, 51, 519, 49, 52, 519, 49, 53, 519, 49, 
+    54, 519, 49, 55, 519, 49, 56, 519, 49, 57, 519, 50, 48, 770, 40, 49, 41, 
+    770, 40, 50, 41, 770, 40, 51, 41, 770, 40, 52, 41, 770, 40, 53, 41, 770, 
+    40, 54, 41, 770, 40, 55, 41, 770, 40, 56, 41, 770, 40, 57, 41, 1026, 40, 
+    49, 48, 41, 1026, 40, 49, 49, 41, 1026, 40, 49, 50, 41, 1026, 40, 49, 51, 
+    41, 1026, 40, 49, 52, 41, 1026, 40, 49, 53, 41, 1026, 40, 49, 54, 41, 
+    1026, 40, 49, 55, 41, 1026, 40, 49, 56, 41, 1026, 40, 49, 57, 41, 1026, 
+    40, 50, 48, 41, 514, 49, 46, 514, 50, 46, 514, 51, 46, 514, 52, 46, 514, 
+    53, 46, 514, 54, 46, 514, 55, 46, 514, 56, 46, 514, 57, 46, 770, 49, 48, 
+    46, 770, 49, 49, 46, 770, 49, 50, 46, 770, 49, 51, 46, 770, 49, 52, 46, 
+    770, 49, 53, 46, 770, 49, 54, 46, 770, 49, 55, 46, 770, 49, 56, 46, 770, 
+    49, 57, 46, 770, 50, 48, 46, 770, 40, 97, 41, 770, 40, 98, 41, 770, 40, 
+    99, 41, 770, 40, 100, 41, 770, 40, 101, 41, 770, 40, 102, 41, 770, 40, 
+    103, 41, 770, 40, 104, 41, 770, 40, 105, 41, 770, 40, 106, 41, 770, 40, 
+    107, 41, 770, 40, 108, 41, 770, 40, 109, 41, 770, 40, 110, 41, 770, 40, 
+    111, 41, 770, 40, 112, 41, 770, 40, 113, 41, 770, 40, 114, 41, 770, 40, 
+    115, 41, 770, 40, 116, 41, 770, 40, 117, 41, 770, 40, 118, 41, 770, 40, 
+    119, 41, 770, 40, 120, 41, 770, 40, 121, 41, 770, 40, 122, 41, 263, 65, 
+    263, 66, 263, 67, 263, 68, 263, 69, 263, 70, 263, 71, 263, 72, 263, 73, 
+    263, 74, 263, 75, 263, 76, 263, 77, 263, 78, 263, 79, 263, 80, 263, 81, 
+    263, 82, 263, 83, 263, 84, 263, 85, 263, 86, 263, 87, 263, 88, 263, 89, 
+    263, 90, 263, 97, 263, 98, 263, 99, 263, 100, 263, 101, 263, 102, 263, 
+    103, 263, 104, 263, 105, 263, 106, 263, 107, 263, 108, 263, 109, 263, 
+    110, 263, 111, 263, 112, 263, 113, 263, 114, 263, 115, 263, 116, 263, 
+    117, 263, 118, 263, 119, 263, 120, 263, 121, 263, 122, 263, 48, 1026, 
+    8747, 8747, 8747, 8747, 770, 58, 58, 61, 514, 61, 61, 770, 61, 61, 61, 
+    512, 10973, 824, 261, 106, 259, 86, 259, 11617, 258, 27597, 258, 40863, 
+    258, 19968, 258, 20008, 258, 20022, 258, 20031, 258, 20057, 258, 20101, 
+    258, 20108, 258, 20128, 258, 20154, 258, 20799, 258, 20837, 258, 20843, 
+    258, 20866, 258, 20886, 258, 20907, 258, 20960, 258, 20981, 258, 20992, 
+    258, 21147, 258, 21241, 258, 21269, 258, 21274, 258, 21304, 258, 21313, 
+    258, 21340, 258, 21353, 258, 21378, 258, 21430, 258, 21448, 258, 21475, 
+    258, 22231, 258, 22303, 258, 22763, 258, 22786, 258, 22794, 258, 22805, 
+    258, 22823, 258, 22899, 258, 23376, 258, 23424, 258, 23544, 258, 23567, 
+    258, 23586, 258, 23608, 258, 23662, 258, 23665, 258, 24027, 258, 24037, 
+    258, 24049, 258, 24062, 258, 24178, 258, 24186, 258, 24191, 258, 24308, 
+    258, 24318, 258, 24331, 258, 24339, 258, 24400, 258, 24417, 258, 24435, 
+    258, 24515, 258, 25096, 258, 25142, 258, 25163, 258, 25903, 258, 25908, 
+    258, 25991, 258, 26007, 258, 26020, 258, 26041, 258, 26080, 258, 26085, 
+    258, 26352, 258, 26376, 258, 26408, 258, 27424, 258, 27490, 258, 27513, 
+    258, 27571, 258, 27595, 258, 27604, 258, 27611, 258, 27663, 258, 27668, 
+    258, 27700, 258, 28779, 258, 29226, 258, 29238, 258, 29243, 258, 29247, 
+    258, 29255, 258, 29273, 258, 29275, 258, 29356, 258, 29572, 258, 29577, 
+    258, 29916, 258, 29926, 258, 29976, 258, 29983, 258, 29992, 258, 30000, 
+    258, 30091, 258, 30098, 258, 30326, 258, 30333, 258, 30382, 258, 30399, 
+    258, 30446, 258, 30683, 258, 30690, 258, 30707, 258, 31034, 258, 31160, 
+    258, 31166, 258, 31348, 258, 31435, 258, 31481, 258, 31859, 258, 31992, 
+    258, 32566, 258, 32593, 258, 32650, 258, 32701, 258, 32769, 258, 32780, 
+    258, 32786, 258, 32819, 258, 32895, 258, 32905, 258, 33251, 258, 33258, 
+    258, 33267, 258, 33276, 258, 33292, 258, 33307, 258, 33311, 258, 33390, 
+    258, 33394, 258, 33400, 258, 34381, 258, 34411, 258, 34880, 258, 34892, 
+    258, 34915, 258, 35198, 258, 35211, 258, 35282, 258, 35328, 258, 35895, 
+    258, 35910, 258, 35925, 258, 35960, 258, 35997, 258, 36196, 258, 36208, 
+    258, 36275, 258, 36523, 258, 36554, 258, 36763, 258, 36784, 258, 36789, 
+    258, 37009, 258, 37193, 258, 37318, 258, 37324, 258, 37329, 258, 38263, 
+    258, 38272, 258, 38428, 258, 38582, 258, 38585, 258, 38632, 258, 38737, 
+    258, 38750, 258, 38754, 258, 38761, 258, 38859, 258, 38893, 258, 38899, 
+    258, 38913, 258, 39080, 258, 39131, 258, 39135, 258, 39318, 258, 39321, 
+    258, 39340, 258, 39592, 258, 39640, 258, 39647, 258, 39717, 258, 39727, 
+    258, 39730, 258, 39740, 258, 39770, 258, 40165, 258, 40565, 258, 40575, 
+    258, 40613, 258, 40635, 258, 40643, 258, 40653, 258, 40657, 258, 40697, 
+    258, 40701, 258, 40718, 258, 40723, 258, 40736, 258, 40763, 258, 40778, 
+    258, 40786, 258, 40845, 258, 40860, 258, 40864, 264, 32, 258, 12306, 258, 
+    21313, 258, 21316, 258, 21317, 512, 12363, 12441, 512, 12365, 12441, 512, 
+    12367, 12441, 512, 12369, 12441, 512, 12371, 12441, 512, 12373, 12441, 
+    512, 12375, 12441, 512, 12377, 12441, 512, 12379, 12441, 512, 12381, 
+    12441, 512, 12383, 12441, 512, 12385, 12441, 512, 12388, 12441, 512, 
+    12390, 12441, 512, 12392, 12441, 512, 12399, 12441, 512, 12399, 12442, 
+    512, 12402, 12441, 512, 12402, 12442, 512, 12405, 12441, 512, 12405, 
+    12442, 512, 12408, 12441, 512, 12408, 12442, 512, 12411, 12441, 512, 
+    12411, 12442, 512, 12358, 12441, 514, 32, 12441, 514, 32, 12442, 512, 
+    12445, 12441, 521, 12424, 12426, 512, 12459, 12441, 512, 12461, 12441, 
+    512, 12463, 12441, 512, 12465, 12441, 512, 12467, 12441, 512, 12469, 
+    12441, 512, 12471, 12441, 512, 12473, 12441, 512, 12475, 12441, 512, 
+    12477, 12441, 512, 12479, 12441, 512, 12481, 12441, 512, 12484, 12441, 
+    512, 12486, 12441, 512, 12488, 12441, 512, 12495, 12441, 512, 12495, 
+    12442, 512, 12498, 12441, 512, 12498, 12442, 512, 12501, 12441, 512, 
+    12501, 12442, 512, 12504, 12441, 512, 12504, 12442, 512, 12507, 12441, 
+    512, 12507, 12442, 512, 12454, 12441, 512, 12527, 12441, 512, 12528, 
+    12441, 512, 12529, 12441, 512, 12530, 12441, 512, 12541, 12441, 521, 
+    12467, 12488, 258, 4352, 258, 4353, 258, 4522, 258, 4354, 258, 4524, 258, 
+    4525, 258, 4355, 258, 4356, 258, 4357, 258, 4528, 258, 4529, 258, 4530, 
+    258, 4531, 258, 4532, 258, 4533, 258, 4378, 258, 4358, 258, 4359, 258, 
+    4360, 258, 4385, 258, 4361, 258, 4362, 258, 4363, 258, 4364, 258, 4365, 
+    258, 4366, 258, 4367, 258, 4368, 258, 4369, 258, 4370, 258, 4449, 258, 
+    4450, 258, 4451, 258, 4452, 258, 4453, 258, 4454, 258, 4455, 258, 4456, 
+    258, 4457, 258, 4458, 258, 4459, 258, 4460, 258, 4461, 258, 4462, 258, 
+    4463, 258, 4464, 258, 4465, 258, 4466, 258, 4467, 258, 4468, 258, 4469, 
+    258, 4448, 258, 4372, 258, 4373, 258, 4551, 258, 4552, 258, 4556, 258, 
+    4558, 258, 4563, 258, 4567, 258, 4569, 258, 4380, 258, 4573, 258, 4575, 
+    258, 4381, 258, 4382, 258, 4384, 258, 4386, 258, 4387, 258, 4391, 258, 
+    4393, 258, 4395, 258, 4396, 258, 4397, 258, 4398, 258, 4399, 258, 4402, 
+    258, 4406, 258, 4416, 258, 4423, 258, 4428, 258, 4593, 258, 4594, 258, 
+    4439, 258, 4440, 258, 4441, 258, 4484, 258, 4485, 258, 4488, 258, 4497, 
+    258, 4498, 258, 4500, 258, 4510, 258, 4513, 259, 19968, 259, 20108, 259, 
+    19977, 259, 22235, 259, 19978, 259, 20013, 259, 19979, 259, 30002, 259, 
+    20057, 259, 19993, 259, 19969, 259, 22825, 259, 22320, 259, 20154, 770, 
+    40, 4352, 41, 770, 40, 4354, 41, 770, 40, 4355, 41, 770, 40, 4357, 41, 
+    770, 40, 4358, 41, 770, 40, 4359, 41, 770, 40, 4361, 41, 770, 40, 4363, 
+    41, 770, 40, 4364, 41, 770, 40, 4366, 41, 770, 40, 4367, 41, 770, 40, 
+    4368, 41, 770, 40, 4369, 41, 770, 40, 4370, 41, 1026, 40, 4352, 4449, 41, 
+    1026, 40, 4354, 4449, 41, 1026, 40, 4355, 4449, 41, 1026, 40, 4357, 4449, 
+    41, 1026, 40, 4358, 4449, 41, 1026, 40, 4359, 4449, 41, 1026, 40, 4361, 
+    4449, 41, 1026, 40, 4363, 4449, 41, 1026, 40, 4364, 4449, 41, 1026, 40, 
+    4366, 4449, 41, 1026, 40, 4367, 4449, 41, 1026, 40, 4368, 4449, 41, 1026, 
+    40, 4369, 4449, 41, 1026, 40, 4370, 4449, 41, 1026, 40, 4364, 4462, 41, 
+    1794, 40, 4363, 4457, 4364, 4453, 4523, 41, 1538, 40, 4363, 4457, 4370, 
+    4462, 41, 770, 40, 19968, 41, 770, 40, 20108, 41, 770, 40, 19977, 41, 
+    770, 40, 22235, 41, 770, 40, 20116, 41, 770, 40, 20845, 41, 770, 40, 
+    19971, 41, 770, 40, 20843, 41, 770, 40, 20061, 41, 770, 40, 21313, 41, 
+    770, 40, 26376, 41, 770, 40, 28779, 41, 770, 40, 27700, 41, 770, 40, 
+    26408, 41, 770, 40, 37329, 41, 770, 40, 22303, 41, 770, 40, 26085, 41, 
+    770, 40, 26666, 41, 770, 40, 26377, 41, 770, 40, 31038, 41, 770, 40, 
+    21517, 41, 770, 40, 29305, 41, 770, 40, 36001, 41, 770, 40, 31069, 41, 
+    770, 40, 21172, 41, 770, 40, 20195, 41, 770, 40, 21628, 41, 770, 40, 
+    23398, 41, 770, 40, 30435, 41, 770, 40, 20225, 41, 770, 40, 36039, 41, 
+    770, 40, 21332, 41, 770, 40, 31085, 41, 770, 40, 20241, 41, 770, 40, 
+    33258, 41, 770, 40, 33267, 41, 263, 21839, 263, 24188, 263, 25991, 263, 
+    31631, 778, 80, 84, 69, 519, 50, 49, 519, 50, 50, 519, 50, 51, 519, 50, 
+    52, 519, 50, 53, 519, 50, 54, 519, 50, 55, 519, 50, 56, 519, 50, 57, 519, 
+    51, 48, 519, 51, 49, 519, 51, 50, 519, 51, 51, 519, 51, 52, 519, 51, 53, 
+    263, 4352, 263, 4354, 263, 4355, 263, 4357, 263, 4358, 263, 4359, 263, 
+    4361, 263, 4363, 263, 4364, 263, 4366, 263, 4367, 263, 4368, 263, 4369, 
+    263, 4370, 519, 4352, 4449, 519, 4354, 4449, 519, 4355, 4449, 519, 4357, 
+    4449, 519, 4358, 4449, 519, 4359, 4449, 519, 4361, 4449, 519, 4363, 4449, 
+    519, 4364, 4449, 519, 4366, 4449, 519, 4367, 4449, 519, 4368, 4449, 519, 
+    4369, 4449, 519, 4370, 4449, 1287, 4366, 4449, 4535, 4352, 4457, 1031, 
+    4364, 4462, 4363, 4468, 519, 4363, 4462, 263, 19968, 263, 20108, 263, 
+    19977, 263, 22235, 263, 20116, 263, 20845, 263, 19971, 263, 20843, 263, 
+    20061, 263, 21313, 263, 26376, 263, 28779, 263, 27700, 263, 26408, 263, 
+    37329, 263, 22303, 263, 26085, 263, 26666, 263, 26377, 263, 31038, 263, 
+    21517, 263, 29305, 263, 36001, 263, 31069, 263, 21172, 263, 31192, 263, 
+    30007, 263, 22899, 263, 36969, 263, 20778, 263, 21360, 263, 27880, 263, 
+    38917, 263, 20241, 263, 20889, 263, 27491, 263, 19978, 263, 20013, 263, 
+    19979, 263, 24038, 263, 21491, 263, 21307, 263, 23447, 263, 23398, 263, 
+    30435, 263, 20225, 263, 36039, 263, 21332, 263, 22812, 519, 51, 54, 519, 
+    51, 55, 519, 51, 56, 519, 51, 57, 519, 52, 48, 519, 52, 49, 519, 52, 50, 
+    519, 52, 51, 519, 52, 52, 519, 52, 53, 519, 52, 54, 519, 52, 55, 519, 52, 
+    56, 519, 52, 57, 519, 53, 48, 514, 49, 26376, 514, 50, 26376, 514, 51, 
+    26376, 514, 52, 26376, 514, 53, 26376, 514, 54, 26376, 514, 55, 26376, 
+    514, 56, 26376, 514, 57, 26376, 770, 49, 48, 26376, 770, 49, 49, 26376, 
+    770, 49, 50, 26376, 522, 72, 103, 778, 101, 114, 103, 522, 101, 86, 778, 
+    76, 84, 68, 263, 12450, 263, 12452, 263, 12454, 263, 12456, 263, 12458, 
+    263, 12459, 263, 12461, 263, 12463, 263, 12465, 263, 12467, 263, 12469, 
+    263, 12471, 263, 12473, 263, 12475, 263, 12477, 263, 12479, 263, 12481, 
+    263, 12484, 263, 12486, 263, 12488, 263, 12490, 263, 12491, 263, 12492, 
+    263, 12493, 263, 12494, 263, 12495, 263, 12498, 263, 12501, 263, 12504, 
+    263, 12507, 263, 12510, 263, 12511, 263, 12512, 263, 12513, 263, 12514, 
+    263, 12516, 263, 12518, 263, 12520, 263, 12521, 263, 12522, 263, 12523, 
+    263, 12524, 263, 12525, 263, 12527, 263, 12528, 263, 12529, 263, 12530, 
+    1034, 12450, 12497, 12540, 12488, 1034, 12450, 12523, 12501, 12449, 1034, 
+    12450, 12531, 12506, 12450, 778, 12450, 12540, 12523, 1034, 12452, 12491, 
+    12531, 12464, 778, 12452, 12531, 12481, 778, 12454, 12457, 12531, 1290, 
+    12456, 12473, 12463, 12540, 12489, 1034, 12456, 12540, 12459, 12540, 778, 
+    12458, 12531, 12473, 778, 12458, 12540, 12512, 778, 12459, 12452, 12522, 
+    1034, 12459, 12521, 12483, 12488, 1034, 12459, 12525, 12522, 12540, 778, 
+    12460, 12525, 12531, 778, 12460, 12531, 12510, 522, 12462, 12460, 778, 
+    12462, 12491, 12540, 1034, 12461, 12517, 12522, 12540, 1034, 12462, 
+    12523, 12480, 12540, 522, 12461, 12525, 1290, 12461, 12525, 12464, 12521, 
+    12512, 1546, 12461, 12525, 12513, 12540, 12488, 12523, 1290, 12461, 
+    12525, 12527, 12483, 12488, 778, 12464, 12521, 12512, 1290, 12464, 12521, 
+    12512, 12488, 12531, 1290, 12463, 12523, 12476, 12452, 12525, 1034, 
+    12463, 12525, 12540, 12493, 778, 12465, 12540, 12473, 778, 12467, 12523, 
+    12490, 778, 12467, 12540, 12509, 1034, 12469, 12452, 12463, 12523, 1290, 
+    12469, 12531, 12481, 12540, 12512, 1034, 12471, 12522, 12531, 12464, 778, 
+    12475, 12531, 12481, 778, 12475, 12531, 12488, 778, 12480, 12540, 12473, 
+    522, 12487, 12471, 522, 12489, 12523, 522, 12488, 12531, 522, 12490, 
+    12494, 778, 12494, 12483, 12488, 778, 12495, 12452, 12484, 1290, 12497, 
+    12540, 12475, 12531, 12488, 778, 12497, 12540, 12484, 1034, 12496, 12540, 
+    12524, 12523, 1290, 12500, 12450, 12473, 12488, 12523, 778, 12500, 12463, 
+    12523, 522, 12500, 12467, 522, 12499, 12523, 1290, 12501, 12449, 12521, 
+    12483, 12489, 1034, 12501, 12451, 12540, 12488, 1290, 12502, 12483, 
+    12471, 12455, 12523, 778, 12501, 12521, 12531, 1290, 12504, 12463, 12479, 
+    12540, 12523, 522, 12506, 12477, 778, 12506, 12491, 12498, 778, 12504, 
+    12523, 12484, 778, 12506, 12531, 12473, 778, 12506, 12540, 12472, 778, 
+    12505, 12540, 12479, 1034, 12509, 12452, 12531, 12488, 778, 12508, 12523, 
+    12488, 522, 12507, 12531, 778, 12509, 12531, 12489, 778, 12507, 12540, 
+    12523, 778, 12507, 12540, 12531, 1034, 12510, 12452, 12463, 12525, 778, 
+    12510, 12452, 12523, 778, 12510, 12483, 12495, 778, 12510, 12523, 12463, 
+    1290, 12510, 12531, 12471, 12519, 12531, 1034, 12511, 12463, 12525, 
+    12531, 522, 12511, 12522, 1290, 12511, 12522, 12496, 12540, 12523, 522, 
+    12513, 12460, 1034, 12513, 12460, 12488, 12531, 1034, 12513, 12540, 
+    12488, 12523, 778, 12516, 12540, 12489, 778, 12516, 12540, 12523, 778, 
+    12518, 12450, 12531, 1034, 12522, 12483, 12488, 12523, 522, 12522, 12521, 
+    778, 12523, 12500, 12540, 1034, 12523, 12540, 12502, 12523, 522, 12524, 
+    12512, 1290, 12524, 12531, 12488, 12466, 12531, 778, 12527, 12483, 12488, 
+    514, 48, 28857, 514, 49, 28857, 514, 50, 28857, 514, 51, 28857, 514, 52, 
+    28857, 514, 53, 28857, 514, 54, 28857, 514, 55, 28857, 514, 56, 28857, 
+    514, 57, 28857, 770, 49, 48, 28857, 770, 49, 49, 28857, 770, 49, 50, 
+    28857, 770, 49, 51, 28857, 770, 49, 52, 28857, 770, 49, 53, 28857, 770, 
+    49, 54, 28857, 770, 49, 55, 28857, 770, 49, 56, 28857, 770, 49, 57, 
+    28857, 770, 50, 48, 28857, 770, 50, 49, 28857, 770, 50, 50, 28857, 770, 
+    50, 51, 28857, 770, 50, 52, 28857, 778, 104, 80, 97, 522, 100, 97, 522, 
+    65, 85, 778, 98, 97, 114, 522, 111, 86, 522, 112, 99, 522, 100, 109, 778, 
+    100, 109, 178, 778, 100, 109, 179, 522, 73, 85, 522, 24179, 25104, 522, 
+    26157, 21644, 522, 22823, 27491, 522, 26126, 27835, 1034, 26666, 24335, 
+    20250, 31038, 522, 112, 65, 522, 110, 65, 522, 956, 65, 522, 109, 65, 
+    522, 107, 65, 522, 75, 66, 522, 77, 66, 522, 71, 66, 778, 99, 97, 108, 
+    1034, 107, 99, 97, 108, 522, 112, 70, 522, 110, 70, 522, 956, 70, 522, 
+    956, 103, 522, 109, 103, 522, 107, 103, 522, 72, 122, 778, 107, 72, 122, 
+    778, 77, 72, 122, 778, 71, 72, 122, 778, 84, 72, 122, 522, 956, 8467, 
+    522, 109, 8467, 522, 100, 8467, 522, 107, 8467, 522, 102, 109, 522, 110, 
+    109, 522, 956, 109, 522, 109, 109, 522, 99, 109, 522, 107, 109, 778, 109, 
+    109, 178, 778, 99, 109, 178, 522, 109, 178, 778, 107, 109, 178, 778, 109, 
+    109, 179, 778, 99, 109, 179, 522, 109, 179, 778, 107, 109, 179, 778, 109, 
+    8725, 115, 1034, 109, 8725, 115, 178, 522, 80, 97, 778, 107, 80, 97, 778, 
+    77, 80, 97, 778, 71, 80, 97, 778, 114, 97, 100, 1290, 114, 97, 100, 8725, 
+    115, 1546, 114, 97, 100, 8725, 115, 178, 522, 112, 115, 522, 110, 115, 
+    522, 956, 115, 522, 109, 115, 522, 112, 86, 522, 110, 86, 522, 956, 86, 
+    522, 109, 86, 522, 107, 86, 522, 77, 86, 522, 112, 87, 522, 110, 87, 522, 
+    956, 87, 522, 109, 87, 522, 107, 87, 522, 77, 87, 522, 107, 937, 522, 77, 
+    937, 1034, 97, 46, 109, 46, 522, 66, 113, 522, 99, 99, 522, 99, 100, 
+    1034, 67, 8725, 107, 103, 778, 67, 111, 46, 522, 100, 66, 522, 71, 121, 
+    522, 104, 97, 522, 72, 80, 522, 105, 110, 522, 75, 75, 522, 75, 77, 522, 
+    107, 116, 522, 108, 109, 522, 108, 110, 778, 108, 111, 103, 522, 108, 
+    120, 522, 109, 98, 778, 109, 105, 108, 778, 109, 111, 108, 522, 80, 72, 
+    1034, 112, 46, 109, 46, 778, 80, 80, 77, 522, 80, 82, 522, 115, 114, 522, 
+    83, 118, 522, 87, 98, 778, 86, 8725, 109, 778, 65, 8725, 109, 514, 49, 
+    26085, 514, 50, 26085, 514, 51, 26085, 514, 52, 26085, 514, 53, 26085, 
+    514, 54, 26085, 514, 55, 26085, 514, 56, 26085, 514, 57, 26085, 770, 49, 
+    48, 26085, 770, 49, 49, 26085, 770, 49, 50, 26085, 770, 49, 51, 26085, 
+    770, 49, 52, 26085, 770, 49, 53, 26085, 770, 49, 54, 26085, 770, 49, 55, 
+    26085, 770, 49, 56, 26085, 770, 49, 57, 26085, 770, 50, 48, 26085, 770, 
+    50, 49, 26085, 770, 50, 50, 26085, 770, 50, 51, 26085, 770, 50, 52, 
+    26085, 770, 50, 53, 26085, 770, 50, 54, 26085, 770, 50, 55, 26085, 770, 
+    50, 56, 26085, 770, 50, 57, 26085, 770, 51, 48, 26085, 770, 51, 49, 
+    26085, 778, 103, 97, 108, 259, 1098, 259, 1100, 259, 42863, 259, 294, 
+    259, 339, 259, 42791, 259, 43831, 259, 619, 259, 43858, 256, 35912, 256, 
+    26356, 256, 36554, 256, 36040, 256, 28369, 256, 20018, 256, 21477, 256, 
+    40860, 256, 40860, 256, 22865, 256, 37329, 256, 21895, 256, 22856, 256, 
+    25078, 256, 30313, 256, 32645, 256, 34367, 256, 34746, 256, 35064, 256, 
+    37007, 256, 27138, 256, 27931, 256, 28889, 256, 29662, 256, 33853, 256, 
+    37226, 256, 39409, 256, 20098, 256, 21365, 256, 27396, 256, 29211, 256, 
+    34349, 256, 40478, 256, 23888, 256, 28651, 256, 34253, 256, 35172, 256, 
+    25289, 256, 33240, 256, 34847, 256, 24266, 256, 26391, 256, 28010, 256, 
+    29436, 256, 37070, 256, 20358, 256, 20919, 256, 21214, 256, 25796, 256, 
+    27347, 256, 29200, 256, 30439, 256, 32769, 256, 34310, 256, 34396, 256, 
+    36335, 256, 38706, 256, 39791, 256, 40442, 256, 30860, 256, 31103, 256, 
+    32160, 256, 33737, 256, 37636, 256, 40575, 256, 35542, 256, 22751, 256, 
+    24324, 256, 31840, 256, 32894, 256, 29282, 256, 30922, 256, 36034, 256, 
+    38647, 256, 22744, 256, 23650, 256, 27155, 256, 28122, 256, 28431, 256, 
+    32047, 256, 32311, 256, 38475, 256, 21202, 256, 32907, 256, 20956, 256, 
+    20940, 256, 31260, 256, 32190, 256, 33777, 256, 38517, 256, 35712, 256, 
+    25295, 256, 27138, 256, 35582, 256, 20025, 256, 23527, 256, 24594, 256, 
+    29575, 256, 30064, 256, 21271, 256, 30971, 256, 20415, 256, 24489, 256, 
+    19981, 256, 27852, 256, 25976, 256, 32034, 256, 21443, 256, 22622, 256, 
+    30465, 256, 33865, 256, 35498, 256, 27578, 256, 36784, 256, 27784, 256, 
+    25342, 256, 33509, 256, 25504, 256, 30053, 256, 20142, 256, 20841, 256, 
+    20937, 256, 26753, 256, 31975, 256, 33391, 256, 35538, 256, 37327, 256, 
+    21237, 256, 21570, 256, 22899, 256, 24300, 256, 26053, 256, 28670, 256, 
+    31018, 256, 38317, 256, 39530, 256, 40599, 256, 40654, 256, 21147, 256, 
+    26310, 256, 27511, 256, 36706, 256, 24180, 256, 24976, 256, 25088, 256, 
+    25754, 256, 28451, 256, 29001, 256, 29833, 256, 31178, 256, 32244, 256, 
+    32879, 256, 36646, 256, 34030, 256, 36899, 256, 37706, 256, 21015, 256, 
+    21155, 256, 21693, 256, 28872, 256, 35010, 256, 35498, 256, 24265, 256, 
+    24565, 256, 25467, 256, 27566, 256, 31806, 256, 29557, 256, 20196, 256, 
+    22265, 256, 23527, 256, 23994, 256, 24604, 256, 29618, 256, 29801, 256, 
+    32666, 256, 32838, 256, 37428, 256, 38646, 256, 38728, 256, 38936, 256, 
+    20363, 256, 31150, 256, 37300, 256, 38584, 256, 24801, 256, 20102, 256, 
+    20698, 256, 23534, 256, 23615, 256, 26009, 256, 27138, 256, 29134, 256, 
+    30274, 256, 34044, 256, 36988, 256, 40845, 256, 26248, 256, 38446, 256, 
+    21129, 256, 26491, 256, 26611, 256, 27969, 256, 28316, 256, 29705, 256, 
+    30041, 256, 30827, 256, 32016, 256, 39006, 256, 20845, 256, 25134, 256, 
+    38520, 256, 20523, 256, 23833, 256, 28138, 256, 36650, 256, 24459, 256, 
+    24900, 256, 26647, 256, 29575, 256, 38534, 256, 21033, 256, 21519, 256, 
+    23653, 256, 26131, 256, 26446, 256, 26792, 256, 27877, 256, 29702, 256, 
+    30178, 256, 32633, 256, 35023, 256, 35041, 256, 37324, 256, 38626, 256, 
+    21311, 256, 28346, 256, 21533, 256, 29136, 256, 29848, 256, 34298, 256, 
+    38563, 256, 40023, 256, 40607, 256, 26519, 256, 28107, 256, 33256, 256, 
+    31435, 256, 31520, 256, 31890, 256, 29376, 256, 28825, 256, 35672, 256, 
+    20160, 256, 33590, 256, 21050, 256, 20999, 256, 24230, 256, 25299, 256, 
+    31958, 256, 23429, 256, 27934, 256, 26292, 256, 36667, 256, 34892, 256, 
+    38477, 256, 35211, 256, 24275, 256, 20800, 256, 21952, 256, 22618, 256, 
+    26228, 256, 20958, 256, 29482, 256, 30410, 256, 31036, 256, 31070, 256, 
+    31077, 256, 31119, 256, 38742, 256, 31934, 256, 32701, 256, 34322, 256, 
+    35576, 256, 36920, 256, 37117, 256, 39151, 256, 39164, 256, 39208, 256, 
+    40372, 256, 37086, 256, 38583, 256, 20398, 256, 20711, 256, 20813, 256, 
+    21193, 256, 21220, 256, 21329, 256, 21917, 256, 22022, 256, 22120, 256, 
+    22592, 256, 22696, 256, 23652, 256, 23662, 256, 24724, 256, 24936, 256, 
+    24974, 256, 25074, 256, 25935, 256, 26082, 256, 26257, 256, 26757, 256, 
+    28023, 256, 28186, 256, 28450, 256, 29038, 256, 29227, 256, 29730, 256, 
+    30865, 256, 31038, 256, 31049, 256, 31048, 256, 31056, 256, 31062, 256, 
+    31069, 256, 31117, 256, 31118, 256, 31296, 256, 31361, 256, 31680, 256, 
+    32244, 256, 32265, 256, 32321, 256, 32626, 256, 32773, 256, 33261, 256, 
+    33401, 256, 33401, 256, 33879, 256, 35088, 256, 35222, 256, 35585, 256, 
+    35641, 256, 36051, 256, 36104, 256, 36790, 256, 36920, 256, 38627, 256, 
+    38911, 256, 38971, 256, 24693, 256, 55376, 57070, 256, 33304, 256, 20006, 
+    256, 20917, 256, 20840, 256, 20352, 256, 20805, 256, 20864, 256, 21191, 
+    256, 21242, 256, 21917, 256, 21845, 256, 21913, 256, 21986, 256, 22618, 
+    256, 22707, 256, 22852, 256, 22868, 256, 23138, 256, 23336, 256, 24274, 
+    256, 24281, 256, 24425, 256, 24493, 256, 24792, 256, 24910, 256, 24840, 
+    256, 24974, 256, 24928, 256, 25074, 256, 25140, 256, 25540, 256, 25628, 
+    256, 25682, 256, 25942, 256, 26228, 256, 26391, 256, 26395, 256, 26454, 
+    256, 27513, 256, 27578, 256, 27969, 256, 28379, 256, 28363, 256, 28450, 
+    256, 28702, 256, 29038, 256, 30631, 256, 29237, 256, 29359, 256, 29482, 
+    256, 29809, 256, 29958, 256, 30011, 256, 30237, 256, 30239, 256, 30410, 
+    256, 30427, 256, 30452, 256, 30538, 256, 30528, 256, 30924, 256, 31409, 
+    256, 31680, 256, 31867, 256, 32091, 256, 32244, 256, 32574, 256, 32773, 
+    256, 33618, 256, 33775, 256, 34681, 256, 35137, 256, 35206, 256, 35222, 
+    256, 35519, 256, 35576, 256, 35531, 256, 35585, 256, 35582, 256, 35565, 
+    256, 35641, 256, 35722, 256, 36104, 256, 36664, 256, 36978, 256, 37273, 
+    256, 37494, 256, 38524, 256, 38627, 256, 38742, 256, 38875, 256, 38911, 
+    256, 38923, 256, 38971, 256, 39698, 256, 40860, 256, 55370, 56394, 256, 
+    55370, 56388, 256, 55372, 57301, 256, 15261, 256, 16408, 256, 16441, 256, 
+    55380, 56905, 256, 55383, 56528, 256, 55391, 57043, 256, 40771, 256, 
+    40846, 514, 102, 102, 514, 102, 105, 514, 102, 108, 770, 102, 102, 105, 
+    770, 102, 102, 108, 514, 383, 116, 514, 115, 116, 514, 1396, 1398, 514, 
+    1396, 1381, 514, 1396, 1387, 514, 1406, 1398, 514, 1396, 1389, 512, 1497, 
+    1460, 512, 1522, 1463, 262, 1506, 262, 1488, 262, 1491, 262, 1492, 262, 
+    1499, 262, 1500, 262, 1501, 262, 1512, 262, 1514, 262, 43, 512, 1513, 
+    1473, 512, 1513, 1474, 512, 64329, 1473, 512, 64329, 1474, 512, 1488, 
+    1463, 512, 1488, 1464, 512, 1488, 1468, 512, 1489, 1468, 512, 1490, 1468, 
+    512, 1491, 1468, 512, 1492, 1468, 512, 1493, 1468, 512, 1494, 1468, 512, 
+    1496, 1468, 512, 1497, 1468, 512, 1498, 1468, 512, 1499, 1468, 512, 1500, 
+    1468, 512, 1502, 1468, 512, 1504, 1468, 512, 1505, 1468, 512, 1507, 1468, 
+    512, 1508, 1468, 512, 1510, 1468, 512, 1511, 1468, 512, 1512, 1468, 512, 
+    1513, 1468, 512, 1514, 1468, 512, 1493, 1465, 512, 1489, 1471, 512, 1499, 
+    1471, 512, 1508, 1471, 514, 1488, 1500, 267, 1649, 268, 1649, 267, 1659, 
+    268, 1659, 269, 1659, 270, 1659, 267, 1662, 268, 1662, 269, 1662, 270, 
+    1662, 267, 1664, 268, 1664, 269, 1664, 270, 1664, 267, 1658, 268, 1658, 
+    269, 1658, 270, 1658, 267, 1663, 268, 1663, 269, 1663, 270, 1663, 267, 
+    1657, 268, 1657, 269, 1657, 270, 1657, 267, 1700, 268, 1700, 269, 1700, 
+    270, 1700, 267, 1702, 268, 1702, 269, 1702, 270, 1702, 267, 1668, 268, 
+    1668, 269, 1668, 270, 1668, 267, 1667, 268, 1667, 269, 1667, 270, 1667, 
+    267, 1670, 268, 1670, 269, 1670, 270, 1670, 267, 1671, 268, 1671, 269, 
+    1671, 270, 1671, 267, 1677, 268, 1677, 267, 1676, 268, 1676, 267, 1678, 
+    268, 1678, 267, 1672, 268, 1672, 267, 1688, 268, 1688, 267, 1681, 268, 
+    1681, 267, 1705, 268, 1705, 269, 1705, 270, 1705, 267, 1711, 268, 1711, 
+    269, 1711, 270, 1711, 267, 1715, 268, 1715, 269, 1715, 270, 1715, 267, 
+    1713, 268, 1713, 269, 1713, 270, 1713, 267, 1722, 268, 1722, 267, 1723, 
+    268, 1723, 269, 1723, 270, 1723, 267, 1728, 268, 1728, 267, 1729, 268, 
+    1729, 269, 1729, 270, 1729, 267, 1726, 268, 1726, 269, 1726, 270, 1726, 
+    267, 1746, 268, 1746, 267, 1747, 268, 1747, 267, 1709, 268, 1709, 269, 
+    1709, 270, 1709, 267, 1735, 268, 1735, 267, 1734, 268, 1734, 267, 1736, 
+    268, 1736, 267, 1655, 267, 1739, 268, 1739, 267, 1733, 268, 1733, 267, 
+    1737, 268, 1737, 267, 1744, 268, 1744, 269, 1744, 270, 1744, 269, 1609, 
+    270, 1609, 523, 1574, 1575, 524, 1574, 1575, 523, 1574, 1749, 524, 1574, 
+    1749, 523, 1574, 1608, 524, 1574, 1608, 523, 1574, 1735, 524, 1574, 1735, 
+    523, 1574, 1734, 524, 1574, 1734, 523, 1574, 1736, 524, 1574, 1736, 523, 
+    1574, 1744, 524, 1574, 1744, 525, 1574, 1744, 523, 1574, 1609, 524, 1574, 
+    1609, 525, 1574, 1609, 267, 1740, 268, 1740, 269, 1740, 270, 1740, 523, 
+    1574, 1580, 523, 1574, 1581, 523, 1574, 1605, 523, 1574, 1609, 523, 1574, 
+    1610, 523, 1576, 1580, 523, 1576, 1581, 523, 1576, 1582, 523, 1576, 1605, 
+    523, 1576, 1609, 523, 1576, 1610, 523, 1578, 1580, 523, 1578, 1581, 523, 
+    1578, 1582, 523, 1578, 1605, 523, 1578, 1609, 523, 1578, 1610, 523, 1579, 
+    1580, 523, 1579, 1605, 523, 1579, 1609, 523, 1579, 1610, 523, 1580, 1581, 
+    523, 1580, 1605, 523, 1581, 1580, 523, 1581, 1605, 523, 1582, 1580, 523, 
+    1582, 1581, 523, 1582, 1605, 523, 1587, 1580, 523, 1587, 1581, 523, 1587, 
+    1582, 523, 1587, 1605, 523, 1589, 1581, 523, 1589, 1605, 523, 1590, 1580, 
+    523, 1590, 1581, 523, 1590, 1582, 523, 1590, 1605, 523, 1591, 1581, 523, 
+    1591, 1605, 523, 1592, 1605, 523, 1593, 1580, 523, 1593, 1605, 523, 1594, 
+    1580, 523, 1594, 1605, 523, 1601, 1580, 523, 1601, 1581, 523, 1601, 1582, 
+    523, 1601, 1605, 523, 1601, 1609, 523, 1601, 1610, 523, 1602, 1581, 523, 
+    1602, 1605, 523, 1602, 1609, 523, 1602, 1610, 523, 1603, 1575, 523, 1603, 
+    1580, 523, 1603, 1581, 523, 1603, 1582, 523, 1603, 1604, 523, 1603, 1605, 
+    523, 1603, 1609, 523, 1603, 1610, 523, 1604, 1580, 523, 1604, 1581, 523, 
+    1604, 1582, 523, 1604, 1605, 523, 1604, 1609, 523, 1604, 1610, 523, 1605, 
+    1580, 523, 1605, 1581, 523, 1605, 1582, 523, 1605, 1605, 523, 1605, 1609, 
+    523, 1605, 1610, 523, 1606, 1580, 523, 1606, 1581, 523, 1606, 1582, 523, 
+    1606, 1605, 523, 1606, 1609, 523, 1606, 1610, 523, 1607, 1580, 523, 1607, 
+    1605, 523, 1607, 1609, 523, 1607, 1610, 523, 1610, 1580, 523, 1610, 1581, 
+    523, 1610, 1582, 523, 1610, 1605, 523, 1610, 1609, 523, 1610, 1610, 523, 
+    1584, 1648, 523, 1585, 1648, 523, 1609, 1648, 779, 32, 1612, 1617, 779, 
+    32, 1613, 1617, 779, 32, 1614, 1617, 779, 32, 1615, 1617, 779, 32, 1616, 
+    1617, 779, 32, 1617, 1648, 524, 1574, 1585, 524, 1574, 1586, 524, 1574, 
+    1605, 524, 1574, 1606, 524, 1574, 1609, 524, 1574, 1610, 524, 1576, 1585, 
+    524, 1576, 1586, 524, 1576, 1605, 524, 1576, 1606, 524, 1576, 1609, 524, 
+    1576, 1610, 524, 1578, 1585, 524, 1578, 1586, 524, 1578, 1605, 524, 1578, 
+    1606, 524, 1578, 1609, 524, 1578, 1610, 524, 1579, 1585, 524, 1579, 1586, 
+    524, 1579, 1605, 524, 1579, 1606, 524, 1579, 1609, 524, 1579, 1610, 524, 
+    1601, 1609, 524, 1601, 1610, 524, 1602, 1609, 524, 1602, 1610, 524, 1603, 
+    1575, 524, 1603, 1604, 524, 1603, 1605, 524, 1603, 1609, 524, 1603, 1610, 
+    524, 1604, 1605, 524, 1604, 1609, 524, 1604, 1610, 524, 1605, 1575, 524, 
+    1605, 1605, 524, 1606, 1585, 524, 1606, 1586, 524, 1606, 1605, 524, 1606, 
+    1606, 524, 1606, 1609, 524, 1606, 1610, 524, 1609, 1648, 524, 1610, 1585, 
+    524, 1610, 1586, 524, 1610, 1605, 524, 1610, 1606, 524, 1610, 1609, 524, 
+    1610, 1610, 525, 1574, 1580, 525, 1574, 1581, 525, 1574, 1582, 525, 1574, 
+    1605, 525, 1574, 1607, 525, 1576, 1580, 525, 1576, 1581, 525, 1576, 1582, 
+    525, 1576, 1605, 525, 1576, 1607, 525, 1578, 1580, 525, 1578, 1581, 525, 
+    1578, 1582, 525, 1578, 1605, 525, 1578, 1607, 525, 1579, 1605, 525, 1580, 
+    1581, 525, 1580, 1605, 525, 1581, 1580, 525, 1581, 1605, 525, 1582, 1580, 
+    525, 1582, 1605, 525, 1587, 1580, 525, 1587, 1581, 525, 1587, 1582, 525, 
+    1587, 1605, 525, 1589, 1581, 525, 1589, 1582, 525, 1589, 1605, 525, 1590, 
+    1580, 525, 1590, 1581, 525, 1590, 1582, 525, 1590, 1605, 525, 1591, 1581, 
+    525, 1592, 1605, 525, 1593, 1580, 525, 1593, 1605, 525, 1594, 1580, 525, 
+    1594, 1605, 525, 1601, 1580, 525, 1601, 1581, 525, 1601, 1582, 525, 1601, 
+    1605, 525, 1602, 1581, 525, 1602, 1605, 525, 1603, 1580, 525, 1603, 1581, 
+    525, 1603, 1582, 525, 1603, 1604, 525, 1603, 1605, 525, 1604, 1580, 525, 
+    1604, 1581, 525, 1604, 1582, 525, 1604, 1605, 525, 1604, 1607, 525, 1605, 
+    1580, 525, 1605, 1581, 525, 1605, 1582, 525, 1605, 1605, 525, 1606, 1580, 
+    525, 1606, 1581, 525, 1606, 1582, 525, 1606, 1605, 525, 1606, 1607, 525, 
+    1607, 1580, 525, 1607, 1605, 525, 1607, 1648, 525, 1610, 1580, 525, 1610, 
+    1581, 525, 1610, 1582, 525, 1610, 1605, 525, 1610, 1607, 526, 1574, 1605, 
+    526, 1574, 1607, 526, 1576, 1605, 526, 1576, 1607, 526, 1578, 1605, 526, 
+    1578, 1607, 526, 1579, 1605, 526, 1579, 1607, 526, 1587, 1605, 526, 1587, 
+    1607, 526, 1588, 1605, 526, 1588, 1607, 526, 1603, 1604, 526, 1603, 1605, 
+    526, 1604, 1605, 526, 1606, 1605, 526, 1606, 1607, 526, 1610, 1605, 526, 
+    1610, 1607, 782, 1600, 1614, 1617, 782, 1600, 1615, 1617, 782, 1600, 
+    1616, 1617, 523, 1591, 1609, 523, 1591, 1610, 523, 1593, 1609, 523, 1593, 
+    1610, 523, 1594, 1609, 523, 1594, 1610, 523, 1587, 1609, 523, 1587, 1610, 
+    523, 1588, 1609, 523, 1588, 1610, 523, 1581, 1609, 523, 1581, 1610, 523, 
+    1580, 1609, 523, 1580, 1610, 523, 1582, 1609, 523, 1582, 1610, 523, 1589, 
+    1609, 523, 1589, 1610, 523, 1590, 1609, 523, 1590, 1610, 523, 1588, 1580, 
+    523, 1588, 1581, 523, 1588, 1582, 523, 1588, 1605, 523, 1588, 1585, 523, 
+    1587, 1585, 523, 1589, 1585, 523, 1590, 1585, 524, 1591, 1609, 524, 1591, 
+    1610, 524, 1593, 1609, 524, 1593, 1610, 524, 1594, 1609, 524, 1594, 1610, 
+    524, 1587, 1609, 524, 1587, 1610, 524, 1588, 1609, 524, 1588, 1610, 524, 
+    1581, 1609, 524, 1581, 1610, 524, 1580, 1609, 524, 1580, 1610, 524, 1582, 
+    1609, 524, 1582, 1610, 524, 1589, 1609, 524, 1589, 1610, 524, 1590, 1609, 
+    524, 1590, 1610, 524, 1588, 1580, 524, 1588, 1581, 524, 1588, 1582, 524, 
+    1588, 1605, 524, 1588, 1585, 524, 1587, 1585, 524, 1589, 1585, 524, 1590, 
+    1585, 525, 1588, 1580, 525, 1588, 1581, 525, 1588, 1582, 525, 1588, 1605, 
+    525, 1587, 1607, 525, 1588, 1607, 525, 1591, 1605, 526, 1587, 1580, 526, 
+    1587, 1581, 526, 1587, 1582, 526, 1588, 1580, 526, 1588, 1581, 526, 1588, 
+    1582, 526, 1591, 1605, 526, 1592, 1605, 524, 1575, 1611, 523, 1575, 1611, 
+    781, 1578, 1580, 1605, 780, 1578, 1581, 1580, 781, 1578, 1581, 1580, 781, 
+    1578, 1581, 1605, 781, 1578, 1582, 1605, 781, 1578, 1605, 1580, 781, 
+    1578, 1605, 1581, 781, 1578, 1605, 1582, 780, 1580, 1605, 1581, 781, 
+    1580, 1605, 1581, 780, 1581, 1605, 1610, 780, 1581, 1605, 1609, 781, 
+    1587, 1581, 1580, 781, 1587, 1580, 1581, 780, 1587, 1580, 1609, 780, 
+    1587, 1605, 1581, 781, 1587, 1605, 1581, 781, 1587, 1605, 1580, 780, 
+    1587, 1605, 1605, 781, 1587, 1605, 1605, 780, 1589, 1581, 1581, 781, 
+    1589, 1581, 1581, 780, 1589, 1605, 1605, 780, 1588, 1581, 1605, 781, 
+    1588, 1581, 1605, 780, 1588, 1580, 1610, 780, 1588, 1605, 1582, 781, 
+    1588, 1605, 1582, 780, 1588, 1605, 1605, 781, 1588, 1605, 1605, 780, 
+    1590, 1581, 1609, 780, 1590, 1582, 1605, 781, 1590, 1582, 1605, 780, 
+    1591, 1605, 1581, 781, 1591, 1605, 1581, 781, 1591, 1605, 1605, 780, 
+    1591, 1605, 1610, 780, 1593, 1580, 1605, 780, 1593, 1605, 1605, 781, 
+    1593, 1605, 1605, 780, 1593, 1605, 1609, 780, 1594, 1605, 1605, 780, 
+    1594, 1605, 1610, 780, 1594, 1605, 1609, 780, 1601, 1582, 1605, 781, 
+    1601, 1582, 1605, 780, 1602, 1605, 1581, 780, 1602, 1605, 1605, 780, 
+    1604, 1581, 1605, 780, 1604, 1581, 1610, 780, 1604, 1581, 1609, 781, 
+    1604, 1580, 1580, 780, 1604, 1580, 1580, 780, 1604, 1582, 1605, 781, 
+    1604, 1582, 1605, 780, 1604, 1605, 1581, 781, 1604, 1605, 1581, 781, 
+    1605, 1581, 1580, 781, 1605, 1581, 1605, 780, 1605, 1581, 1610, 781, 
+    1605, 1580, 1581, 781, 1605, 1580, 1605, 781, 1605, 1582, 1580, 781, 
+    1605, 1582, 1605, 781, 1605, 1580, 1582, 781, 1607, 1605, 1580, 781, 
+    1607, 1605, 1605, 781, 1606, 1581, 1605, 780, 1606, 1581, 1609, 780, 
+    1606, 1580, 1605, 781, 1606, 1580, 1605, 780, 1606, 1580, 1609, 780, 
+    1606, 1605, 1610, 780, 1606, 1605, 1609, 780, 1610, 1605, 1605, 781, 
+    1610, 1605, 1605, 780, 1576, 1582, 1610, 780, 1578, 1580, 1610, 780, 
+    1578, 1580, 1609, 780, 1578, 1582, 1610, 780, 1578, 1582, 1609, 780, 
+    1578, 1605, 1610, 780, 1578, 1605, 1609, 780, 1580, 1605, 1610, 780, 
+    1580, 1581, 1609, 780, 1580, 1605, 1609, 780, 1587, 1582, 1609, 780, 
+    1589, 1581, 1610, 780, 1588, 1581, 1610, 780, 1590, 1581, 1610, 780, 
+    1604, 1580, 1610, 780, 1604, 1605, 1610, 780, 1610, 1581, 1610, 780, 
+    1610, 1580, 1610, 780, 1610, 1605, 1610, 780, 1605, 1605, 1610, 780, 
+    1602, 1605, 1610, 780, 1606, 1581, 1610, 781, 1602, 1605, 1581, 781, 
+    1604, 1581, 1605, 780, 1593, 1605, 1610, 780, 1603, 1605, 1610, 781, 
+    1606, 1580, 1581, 780, 1605, 1582, 1610, 781, 1604, 1580, 1605, 780, 
+    1603, 1605, 1605, 780, 1604, 1580, 1605, 780, 1606, 1580, 1581, 780, 
+    1580, 1581, 1610, 780, 1581, 1580, 1610, 780, 1605, 1580, 1610, 780, 
+    1601, 1605, 1610, 780, 1576, 1581, 1610, 781, 1603, 1605, 1605, 781, 
+    1593, 1580, 1605, 781, 1589, 1605, 1605, 780, 1587, 1582, 1610, 780, 
+    1606, 1580, 1610, 779, 1589, 1604, 1746, 779, 1602, 1604, 1746, 1035, 
+    1575, 1604, 1604, 1607, 1035, 1575, 1603, 1576, 1585, 1035, 1605, 1581, 
+    1605, 1583, 1035, 1589, 1604, 1593, 1605, 1035, 1585, 1587, 1608, 1604, 
+    1035, 1593, 1604, 1610, 1607, 1035, 1608, 1587, 1604, 1605, 779, 1589, 
+    1604, 1609, 4619, 1589, 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, 
+    1604, 1610, 1607, 32, 1608, 1587, 1604, 1605, 2059, 1580, 1604, 32, 1580, 
+    1604, 1575, 1604, 1607, 1035, 1585, 1740, 1575, 1604, 265, 44, 265, 
+    12289, 265, 12290, 265, 58, 265, 59, 265, 33, 265, 63, 265, 12310, 265, 
+    12311, 265, 8230, 265, 8229, 265, 8212, 265, 8211, 265, 95, 265, 95, 265, 
+    40, 265, 41, 265, 123, 265, 125, 265, 12308, 265, 12309, 265, 12304, 265, 
+    12305, 265, 12298, 265, 12299, 265, 12296, 265, 12297, 265, 12300, 265, 
+    12301, 265, 12302, 265, 12303, 265, 91, 265, 93, 258, 8254, 258, 8254, 
+    258, 8254, 258, 8254, 258, 95, 258, 95, 258, 95, 271, 44, 271, 12289, 
+    271, 46, 271, 59, 271, 58, 271, 63, 271, 33, 271, 8212, 271, 40, 271, 41, 
+    271, 123, 271, 125, 271, 12308, 271, 12309, 271, 35, 271, 38, 271, 42, 
+    271, 43, 271, 45, 271, 60, 271, 62, 271, 61, 271, 92, 271, 36, 271, 37, 
+    271, 64, 523, 32, 1611, 526, 1600, 1611, 523, 32, 1612, 523, 32, 1613, 
+    523, 32, 1614, 526, 1600, 1614, 523, 32, 1615, 526, 1600, 1615, 523, 32, 
+    1616, 526, 1600, 1616, 523, 32, 1617, 526, 1600, 1617, 523, 32, 1618, 
+    526, 1600, 1618, 267, 1569, 267, 1570, 268, 1570, 267, 1571, 268, 1571, 
+    267, 1572, 268, 1572, 267, 1573, 268, 1573, 267, 1574, 268, 1574, 269, 
+    1574, 270, 1574, 267, 1575, 268, 1575, 267, 1576, 268, 1576, 269, 1576, 
+    270, 1576, 267, 1577, 268, 1577, 267, 1578, 268, 1578, 269, 1578, 270, 
+    1578, 267, 1579, 268, 1579, 269, 1579, 270, 1579, 267, 1580, 268, 1580, 
+    269, 1580, 270, 1580, 267, 1581, 268, 1581, 269, 1581, 270, 1581, 267, 
+    1582, 268, 1582, 269, 1582, 270, 1582, 267, 1583, 268, 1583, 267, 1584, 
+    268, 1584, 267, 1585, 268, 1585, 267, 1586, 268, 1586, 267, 1587, 268, 
+    1587, 269, 1587, 270, 1587, 267, 1588, 268, 1588, 269, 1588, 270, 1588, 
+    267, 1589, 268, 1589, 269, 1589, 270, 1589, 267, 1590, 268, 1590, 269, 
+    1590, 270, 1590, 267, 1591, 268, 1591, 269, 1591, 270, 1591, 267, 1592, 
+    268, 1592, 269, 1592, 270, 1592, 267, 1593, 268, 1593, 269, 1593, 270, 
+    1593, 267, 1594, 268, 1594, 269, 1594, 270, 1594, 267, 1601, 268, 1601, 
+    269, 1601, 270, 1601, 267, 1602, 268, 1602, 269, 1602, 270, 1602, 267, 
+    1603, 268, 1603, 269, 1603, 270, 1603, 267, 1604, 268, 1604, 269, 1604, 
+    270, 1604, 267, 1605, 268, 1605, 269, 1605, 270, 1605, 267, 1606, 268, 
+    1606, 269, 1606, 270, 1606, 267, 1607, 268, 1607, 269, 1607, 270, 1607, 
+    267, 1608, 268, 1608, 267, 1609, 268, 1609, 267, 1610, 268, 1610, 269, 
+    1610, 270, 1610, 523, 1604, 1570, 524, 1604, 1570, 523, 1604, 1571, 524, 
+    1604, 1571, 523, 1604, 1573, 524, 1604, 1573, 523, 1604, 1575, 524, 1604, 
+    1575, 264, 33, 264, 34, 264, 35, 264, 36, 264, 37, 264, 38, 264, 39, 264, 
+    40, 264, 41, 264, 42, 264, 43, 264, 44, 264, 45, 264, 46, 264, 47, 264, 
+    48, 264, 49, 264, 50, 264, 51, 264, 52, 264, 53, 264, 54, 264, 55, 264, 
+    56, 264, 57, 264, 58, 264, 59, 264, 60, 264, 61, 264, 62, 264, 63, 264, 
+    64, 264, 65, 264, 66, 264, 67, 264, 68, 264, 69, 264, 70, 264, 71, 264, 
+    72, 264, 73, 264, 74, 264, 75, 264, 76, 264, 77, 264, 78, 264, 79, 264, 
+    80, 264, 81, 264, 82, 264, 83, 264, 84, 264, 85, 264, 86, 264, 87, 264, 
+    88, 264, 89, 264, 90, 264, 91, 264, 92, 264, 93, 264, 94, 264, 95, 264, 
+    96, 264, 97, 264, 98, 264, 99, 264, 100, 264, 101, 264, 102, 264, 103, 
+    264, 104, 264, 105, 264, 106, 264, 107, 264, 108, 264, 109, 264, 110, 
+    264, 111, 264, 112, 264, 113, 264, 114, 264, 115, 264, 116, 264, 117, 
+    264, 118, 264, 119, 264, 120, 264, 121, 264, 122, 264, 123, 264, 124, 
+    264, 125, 264, 126, 264, 10629, 264, 10630, 272, 12290, 272, 12300, 272, 
+    12301, 272, 12289, 272, 12539, 272, 12530, 272, 12449, 272, 12451, 272, 
+    12453, 272, 12455, 272, 12457, 272, 12515, 272, 12517, 272, 12519, 272, 
+    12483, 272, 12540, 272, 12450, 272, 12452, 272, 12454, 272, 12456, 272, 
+    12458, 272, 12459, 272, 12461, 272, 12463, 272, 12465, 272, 12467, 272, 
+    12469, 272, 12471, 272, 12473, 272, 12475, 272, 12477, 272, 12479, 272, 
+    12481, 272, 12484, 272, 12486, 272, 12488, 272, 12490, 272, 12491, 272, 
+    12492, 272, 12493, 272, 12494, 272, 12495, 272, 12498, 272, 12501, 272, 
+    12504, 272, 12507, 272, 12510, 272, 12511, 272, 12512, 272, 12513, 272, 
+    12514, 272, 12516, 272, 12518, 272, 12520, 272, 12521, 272, 12522, 272, 
+    12523, 272, 12524, 272, 12525, 272, 12527, 272, 12531, 272, 12441, 272, 
+    12442, 272, 12644, 272, 12593, 272, 12594, 272, 12595, 272, 12596, 272, 
+    12597, 272, 12598, 272, 12599, 272, 12600, 272, 12601, 272, 12602, 272, 
+    12603, 272, 12604, 272, 12605, 272, 12606, 272, 12607, 272, 12608, 272, 
+    12609, 272, 12610, 272, 12611, 272, 12612, 272, 12613, 272, 12614, 272, 
+    12615, 272, 12616, 272, 12617, 272, 12618, 272, 12619, 272, 12620, 272, 
+    12621, 272, 12622, 272, 12623, 272, 12624, 272, 12625, 272, 12626, 272, 
+    12627, 272, 12628, 272, 12629, 272, 12630, 272, 12631, 272, 12632, 272, 
+    12633, 272, 12634, 272, 12635, 272, 12636, 272, 12637, 272, 12638, 272, 
+    12639, 272, 12640, 272, 12641, 272, 12642, 272, 12643, 264, 162, 264, 
+    163, 264, 172, 264, 175, 264, 166, 264, 165, 264, 8361, 272, 9474, 272, 
+    8592, 272, 8593, 272, 8594, 272, 8595, 272, 9632, 272, 9675, 512, 55300, 
+    56473, 55300, 56506, 512, 55300, 56475, 55300, 56506, 512, 55300, 56485, 
+    55300, 56506, 512, 55300, 56625, 55300, 56615, 512, 55300, 56626, 55300, 
+    56615, 512, 55300, 57159, 55300, 57150, 512, 55300, 57159, 55300, 57175, 
+    512, 55301, 56505, 55301, 56506, 512, 55301, 56505, 55301, 56496, 512, 
+    55301, 56505, 55301, 56509, 512, 55301, 56760, 55301, 56751, 512, 55301, 
+    56761, 55301, 56751, 512, 55348, 56663, 55348, 56677, 512, 55348, 56664, 
+    55348, 56677, 512, 55348, 56671, 55348, 56686, 512, 55348, 56671, 55348, 
+    56687, 512, 55348, 56671, 55348, 56688, 512, 55348, 56671, 55348, 56689, 
+    512, 55348, 56671, 55348, 56690, 512, 55348, 56761, 55348, 56677, 512, 
+    55348, 56762, 55348, 56677, 512, 55348, 56763, 55348, 56686, 512, 55348, 
+    56764, 55348, 56686, 512, 55348, 56763, 55348, 56687, 512, 55348, 56764, 
+    55348, 56687, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 
+    71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 
+    79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 
+    87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 
+    101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 
+    108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 
+    115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 
+    122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 
+    72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 
+    80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 
+    88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 
+    102, 262, 103, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 
+    110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 
+    117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 
+    262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 
+    262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 
+    262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 
+    262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 
+    104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 
+    111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 
+    118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 67, 262, 68, 
+    262, 71, 262, 74, 262, 75, 262, 78, 262, 79, 262, 80, 262, 81, 262, 83, 
+    262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 
+    262, 98, 262, 99, 262, 100, 262, 102, 262, 104, 262, 105, 262, 106, 262, 
+    107, 262, 108, 262, 109, 262, 110, 262, 112, 262, 113, 262, 114, 262, 
+    115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 
+    122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 
+    72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 
+    80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 
+    88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 
+    102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 
+    109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 
+    116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 
+    262, 66, 262, 68, 262, 69, 262, 70, 262, 71, 262, 74, 262, 75, 262, 76, 
+    262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 83, 262, 84, 262, 85, 
+    262, 86, 262, 87, 262, 88, 262, 89, 262, 97, 262, 98, 262, 99, 262, 100, 
+    262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 
+    262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 
+    262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 
+    262, 122, 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, 262, 71, 262, 73, 
+    262, 74, 262, 75, 262, 76, 262, 77, 262, 79, 262, 83, 262, 84, 262, 85, 
+    262, 86, 262, 87, 262, 88, 262, 89, 262, 97, 262, 98, 262, 99, 262, 100, 
+    262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 
+    262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 
+    262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 
+    262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 
+    262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 
+    262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 
+    262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 
+    262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 
+    262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 
+    262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 
+    262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 
+    262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 
+    262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 
+    262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 
+    102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 
+    109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 
+    116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 
+    262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 
+    262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 
+    262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 
+    262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 
+    103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 
+    110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 
+    117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 
+    262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 
+    262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 
+    262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 
+    262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 
+    104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 
+    111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 
+    118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 
+    262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 
+    262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 
+    262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 
+    262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 
+    105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 
+    112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 
+    119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 
+    262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 
+    262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 
+    262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 
+    262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 
+    106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 
+    113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 
+    120, 262, 121, 262, 122, 262, 305, 262, 567, 262, 913, 262, 914, 262, 
+    915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, 
+    922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, 
+    929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, 
+    936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, 
+    949, 262, 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, 
+    956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, 
+    963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, 
+    8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 
+    913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 
+    920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 
+    927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 
+    934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, 
+    947, 262, 948, 262, 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, 
+    954, 262, 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 
+    961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 
+    968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 
+    1009, 262, 982, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 
+    918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 
+    925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 
+    932, 262, 933, 262, 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, 
+    945, 262, 946, 262, 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, 
+    952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, 
+    959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 
+    966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, 
+    1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, 914, 262, 915, 262, 
+    916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 
+    923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 
+    1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, 
+    937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, 
+    950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 
+    957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 
+    964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 
+    1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, 
+    914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 
+    921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 
+    928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 
+    935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 
+    948, 262, 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 
+    955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 
+    962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 
+    969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 
+    982, 262, 988, 262, 989, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 
+    262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 
+    262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 
+    262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 
+    262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 
+    262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 
+    262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 1575, 262, 1576, 262, 
+    1580, 262, 1583, 262, 1608, 262, 1586, 262, 1581, 262, 1591, 262, 1610, 
+    262, 1603, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, 
+    1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, 262, 1579, 
+    262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, 262, 1646, 262, 
+    1722, 262, 1697, 262, 1647, 262, 1576, 262, 1580, 262, 1607, 262, 1581, 
+    262, 1610, 262, 1603, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, 
+    1593, 262, 1601, 262, 1589, 262, 1602, 262, 1588, 262, 1578, 262, 1579, 
+    262, 1582, 262, 1590, 262, 1594, 262, 1580, 262, 1581, 262, 1610, 262, 
+    1604, 262, 1606, 262, 1587, 262, 1593, 262, 1589, 262, 1602, 262, 1588, 
+    262, 1582, 262, 1590, 262, 1594, 262, 1722, 262, 1647, 262, 1576, 262, 
+    1580, 262, 1607, 262, 1581, 262, 1591, 262, 1610, 262, 1603, 262, 1605, 
+    262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, 
+    1588, 262, 1578, 262, 1579, 262, 1582, 262, 1590, 262, 1592, 262, 1594, 
+    262, 1646, 262, 1697, 262, 1575, 262, 1576, 262, 1580, 262, 1583, 262, 
+    1607, 262, 1608, 262, 1586, 262, 1581, 262, 1591, 262, 1610, 262, 1604, 
+    262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, 
+    1602, 262, 1585, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1584, 
+    262, 1590, 262, 1592, 262, 1594, 262, 1576, 262, 1580, 262, 1583, 262, 
+    1608, 262, 1586, 262, 1581, 262, 1591, 262, 1610, 262, 1604, 262, 1605, 
+    262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, 
+    1585, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1584, 262, 1590, 
+    262, 1592, 262, 1594, 514, 48, 46, 514, 48, 44, 514, 49, 44, 514, 50, 44, 
+    514, 51, 44, 514, 52, 44, 514, 53, 44, 514, 54, 44, 514, 55, 44, 514, 56, 
+    44, 514, 57, 44, 770, 40, 65, 41, 770, 40, 66, 41, 770, 40, 67, 41, 770, 
+    40, 68, 41, 770, 40, 69, 41, 770, 40, 70, 41, 770, 40, 71, 41, 770, 40, 
+    72, 41, 770, 40, 73, 41, 770, 40, 74, 41, 770, 40, 75, 41, 770, 40, 76, 
+    41, 770, 40, 77, 41, 770, 40, 78, 41, 770, 40, 79, 41, 770, 40, 80, 41, 
+    770, 40, 81, 41, 770, 40, 82, 41, 770, 40, 83, 41, 770, 40, 84, 41, 770, 
+    40, 85, 41, 770, 40, 86, 41, 770, 40, 87, 41, 770, 40, 88, 41, 770, 40, 
+    89, 41, 770, 40, 90, 41, 770, 12308, 83, 12309, 263, 67, 263, 82, 519, 
+    67, 68, 519, 87, 90, 266, 65, 266, 66, 266, 67, 266, 68, 266, 69, 266, 
+    70, 266, 71, 266, 72, 266, 73, 266, 74, 266, 75, 266, 76, 266, 77, 266, 
+    78, 266, 79, 266, 80, 266, 81, 266, 82, 266, 83, 266, 84, 266, 85, 266, 
+    86, 266, 87, 266, 88, 266, 89, 266, 90, 522, 72, 86, 522, 77, 86, 522, 
+    83, 68, 522, 83, 83, 778, 80, 80, 86, 522, 87, 67, 515, 77, 67, 515, 77, 
+    68, 522, 68, 74, 522, 12411, 12363, 522, 12467, 12467, 266, 12469, 266, 
+    25163, 266, 23383, 266, 21452, 266, 12487, 266, 20108, 266, 22810, 266, 
+    35299, 266, 22825, 266, 20132, 266, 26144, 266, 28961, 266, 26009, 266, 
+    21069, 266, 24460, 266, 20877, 266, 26032, 266, 21021, 266, 32066, 266, 
+    29983, 266, 36009, 266, 22768, 266, 21561, 266, 28436, 266, 25237, 266, 
+    25429, 266, 19968, 266, 19977, 266, 36938, 266, 24038, 266, 20013, 266, 
+    21491, 266, 25351, 266, 36208, 266, 25171, 266, 31105, 266, 31354, 266, 
+    21512, 266, 28288, 266, 26377, 266, 26376, 266, 30003, 266, 21106, 266, 
+    21942, 266, 37197, 770, 12308, 26412, 12309, 770, 12308, 19977, 12309, 
+    770, 12308, 20108, 12309, 770, 12308, 23433, 12309, 770, 12308, 28857, 
+    12309, 770, 12308, 25171, 12309, 770, 12308, 30423, 12309, 770, 12308, 
+    21213, 12309, 770, 12308, 25943, 12309, 263, 24471, 263, 21487, 256, 
+    20029, 256, 20024, 256, 20033, 256, 55360, 56610, 256, 20320, 256, 20398, 
+    256, 20411, 256, 20482, 256, 20602, 256, 20633, 256, 20711, 256, 20687, 
+    256, 13470, 256, 55361, 56890, 256, 20813, 256, 20820, 256, 20836, 256, 
+    20855, 256, 55361, 56604, 256, 13497, 256, 20839, 256, 20877, 256, 55361, 
+    56651, 256, 20887, 256, 20900, 256, 20172, 256, 20908, 256, 20917, 256, 
+    55396, 56799, 256, 20981, 256, 20995, 256, 13535, 256, 21051, 256, 21062, 
+    256, 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, 256, 21220, 
+    256, 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, 256, 21329, 
+    256, 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, 256, 21375, 
+    256, 55362, 56876, 256, 28784, 256, 21450, 256, 21471, 256, 55362, 57187, 
+    256, 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, 
+    256, 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, 
+    256, 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, 
+    256, 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, 
+    256, 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, 
+    256, 22577, 256, 22700, 256, 55365, 56548, 256, 22770, 256, 22775, 256, 
+    22790, 256, 22810, 256, 22818, 256, 22882, 256, 55365, 57000, 256, 55365, 
+    57066, 256, 23020, 256, 23067, 256, 23079, 256, 23000, 256, 23142, 256, 
+    14062, 256, 14076, 256, 23304, 256, 23358, 256, 23358, 256, 55366, 56776, 
+    256, 23491, 256, 23512, 256, 23527, 256, 23539, 256, 55366, 57112, 256, 
+    23551, 256, 23558, 256, 24403, 256, 23586, 256, 14209, 256, 23648, 256, 
+    23662, 256, 23744, 256, 23693, 256, 55367, 56804, 256, 23875, 256, 55367, 
+    56806, 256, 23918, 256, 23915, 256, 23932, 256, 24033, 256, 24034, 256, 
+    14383, 256, 24061, 256, 24104, 256, 24125, 256, 24169, 256, 14434, 256, 
+    55368, 56707, 256, 14460, 256, 24240, 256, 24243, 256, 24246, 256, 24266, 
+    256, 55400, 57234, 256, 24318, 256, 55368, 57137, 256, 55368, 57137, 256, 
+    33281, 256, 24354, 256, 24354, 256, 14535, 256, 55372, 57016, 256, 55384, 
+    56794, 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, 
+    24535, 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, 
+    55369, 57044, 256, 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, 
+    256, 24954, 256, 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, 
+    256, 25074, 256, 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, 
+    256, 25300, 256, 25424, 256, 55370, 57100, 256, 25405, 256, 25340, 256, 
+    25448, 256, 25475, 256, 25572, 256, 55370, 57329, 256, 25634, 256, 25541, 
+    256, 25513, 256, 14894, 256, 25705, 256, 25726, 256, 25757, 256, 25719, 
+    256, 14956, 256, 25935, 256, 25964, 256, 55372, 56330, 256, 26083, 256, 
+    26360, 256, 26185, 256, 15129, 256, 26257, 256, 15112, 256, 15076, 256, 
+    20882, 256, 20885, 256, 26368, 256, 26268, 256, 32941, 256, 17369, 256, 
+    26391, 256, 26395, 256, 26401, 256, 26462, 256, 26451, 256, 55372, 57283, 
+    256, 15177, 256, 26618, 256, 26501, 256, 26706, 256, 26757, 256, 55373, 
+    56429, 256, 26766, 256, 26655, 256, 26900, 256, 15261, 256, 26946, 256, 
+    27043, 256, 27114, 256, 27304, 256, 55373, 56995, 256, 27355, 256, 15384, 
+    256, 27425, 256, 55374, 56487, 256, 27476, 256, 15438, 256, 27506, 256, 
+    27551, 256, 27578, 256, 27579, 256, 55374, 56973, 256, 55367, 56587, 256, 
+    55374, 57082, 256, 27726, 256, 55375, 56508, 256, 27839, 256, 27853, 256, 
+    27751, 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256, 
+    28024, 256, 28037, 256, 55375, 56606, 256, 27956, 256, 28207, 256, 28270, 
+    256, 15667, 256, 28363, 256, 28359, 256, 55375, 57041, 256, 28153, 256, 
+    28526, 256, 55375, 57182, 256, 55375, 57230, 256, 28614, 256, 28729, 256, 
+    28702, 256, 28699, 256, 15766, 256, 28746, 256, 28797, 256, 28791, 256, 
+    28845, 256, 55361, 56613, 256, 28997, 256, 55376, 56931, 256, 29084, 256, 
+    55376, 57259, 256, 29224, 256, 29237, 256, 29264, 256, 55377, 56840, 256, 
+    29312, 256, 29333, 256, 55377, 57141, 256, 55378, 56340, 256, 29562, 256, 
+    29579, 256, 16044, 256, 29605, 256, 16056, 256, 16056, 256, 29767, 256, 
+    29788, 256, 29809, 256, 29829, 256, 29898, 256, 16155, 256, 29988, 256, 
+    55379, 56374, 256, 30014, 256, 55379, 56466, 256, 30064, 256, 55368, 
+    56735, 256, 30224, 256, 55379, 57249, 256, 55379, 57272, 256, 55380, 
+    56388, 256, 16380, 256, 16392, 256, 30452, 256, 55380, 56563, 256, 55380, 
+    56562, 256, 55380, 56601, 256, 55380, 56627, 256, 30494, 256, 30495, 256, 
+    30495, 256, 30538, 256, 16441, 256, 30603, 256, 16454, 256, 16534, 256, 
+    55381, 56349, 256, 30798, 256, 30860, 256, 30924, 256, 16611, 256, 55381, 
+    56870, 256, 31062, 256, 55381, 56986, 256, 55381, 57029, 256, 31119, 256, 
+    31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, 256, 55382, 56700, 
+    256, 55382, 56999, 256, 55382, 56999, 256, 31470, 256, 16898, 256, 55382, 
+    57259, 256, 31686, 256, 31689, 256, 16935, 256, 55383, 56448, 256, 31954, 
+    256, 17056, 256, 31976, 256, 31971, 256, 32000, 256, 55383, 57222, 256, 
+    32099, 256, 17153, 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, 
+    55384, 56872, 256, 55384, 56903, 256, 17241, 256, 55384, 57049, 256, 
+    32634, 256, 55384, 57150, 256, 32661, 256, 32762, 256, 32773, 256, 55385, 
+    56538, 256, 55385, 56611, 256, 32864, 256, 55385, 56744, 256, 32880, 256, 
+    55372, 57183, 256, 17365, 256, 32946, 256, 33027, 256, 17419, 256, 33086, 
+    256, 23221, 256, 55385, 57255, 256, 55385, 57269, 256, 55372, 57235, 256, 
+    55372, 57244, 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, 
+    256, 33419, 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, 
+    256, 33510, 256, 55386, 57148, 256, 33509, 256, 33565, 256, 33635, 256, 
+    33709, 256, 33571, 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, 
+    33738, 256, 33740, 256, 33756, 256, 55387, 56374, 256, 55387, 56683, 256, 
+    55387, 56533, 256, 17707, 256, 34033, 256, 34035, 256, 34070, 256, 55388, 
+    57290, 256, 34148, 256, 55387, 57132, 256, 17757, 256, 17761, 256, 55387, 
+    57265, 256, 55388, 56530, 256, 17771, 256, 34384, 256, 34396, 256, 34407, 
+    256, 34409, 256, 34473, 256, 34440, 256, 34574, 256, 34530, 256, 34681, 
+    256, 34600, 256, 34667, 256, 34694, 256, 17879, 256, 34785, 256, 34817, 
+    256, 17913, 256, 34912, 256, 34915, 256, 55389, 56935, 256, 35031, 256, 
+    35038, 256, 17973, 256, 35066, 256, 13499, 256, 55390, 56494, 256, 55390, 
+    56678, 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256, 
+    35925, 256, 55391, 56488, 256, 36011, 256, 36033, 256, 36123, 256, 36215, 
+    256, 55391, 57135, 256, 55362, 56324, 256, 36299, 256, 36284, 256, 36336, 
+    256, 55362, 56542, 256, 36564, 256, 36664, 256, 55393, 56786, 256, 55393, 
+    56813, 256, 37012, 256, 37105, 256, 37137, 256, 55393, 57134, 256, 37147, 
+    256, 37432, 256, 37591, 256, 37592, 256, 37500, 256, 37881, 256, 37909, 
+    256, 55394, 57338, 256, 38283, 256, 18837, 256, 38327, 256, 55395, 56695, 
+    256, 18918, 256, 38595, 256, 23986, 256, 38691, 256, 55396, 56645, 256, 
+    55396, 56858, 256, 19054, 256, 19062, 256, 38880, 256, 55397, 56330, 256, 
+    19122, 256, 55397, 56470, 256, 38923, 256, 38923, 256, 38953, 256, 55397, 
+    56758, 256, 39138, 256, 19251, 256, 39209, 256, 39335, 256, 39362, 256, 
+    39422, 256, 19406, 256, 55398, 57136, 256, 39698, 256, 40000, 256, 40189, 
+    256, 19662, 256, 19693, 256, 40295, 256, 55400, 56526, 256, 19704, 256, 
+    55400, 56581, 256, 55400, 56846, 256, 55400, 56977, 256, 40635, 256, 
+    19798, 256, 40697, 256, 40702, 256, 40709, 256, 40719, 256, 40726, 256, 
+    40763, 256, 55401, 56832, 
+};
+
+/* index tables for the decomposition data */
+#define DECOMP_SHIFT1 6
+#define DECOMP_SHIFT2 4
+static const unsigned char decomp_index0[] = {
+    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 14, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 16, 5, 5, 5, 5, 17, 18, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 19, 20, 
+    5, 5, 5, 5, 5, 21, 22, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    23, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+};
+
+static const unsigned short decomp_index1[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
+    14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 0, 0, 0, 0, 0, 0, 0, 
+    25, 0, 26, 27, 0, 0, 0, 0, 0, 28, 0, 0, 29, 30, 31, 32, 33, 34, 35, 0, 
+    36, 37, 38, 0, 39, 0, 40, 0, 41, 0, 0, 0, 0, 42, 43, 44, 45, 0, 0, 0, 0, 
+    0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 48, 0, 0, 0, 
+    0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 0, 0, 0, 
+    0, 0, 54, 55, 0, 0, 0, 0, 0, 56, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 58, 59, 0, 0, 0, 60, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 
+    0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 
+    0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 67, 0, 68, 0, 0, 69, 0, 0, 0, 70, 
+    71, 72, 73, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 81, 0, 
+    82, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 0, 
+    93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 
+    109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 
+    123, 124, 125, 126, 127, 128, 129, 130, 0, 131, 132, 133, 134, 0, 0, 0, 
+    0, 0, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 0, 146, 0, 
+    0, 0, 147, 0, 148, 149, 150, 0, 151, 152, 153, 0, 154, 0, 0, 0, 155, 0, 
+    0, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 157, 
+    158, 159, 160, 161, 162, 163, 164, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 0, 
+    0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    171, 0, 0, 0, 0, 0, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 
+    182, 183, 184, 185, 186, 0, 0, 187, 0, 0, 188, 189, 190, 191, 192, 0, 
+    193, 194, 195, 196, 197, 0, 198, 0, 0, 0, 199, 200, 201, 202, 203, 204, 
+    205, 0, 0, 0, 0, 0, 0, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 
+    216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 
+    230, 231, 232, 233, 234, 235, 236, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 0, 0, 
+    0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 243, 244, 245, 246, 247, 
+    248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 
+    262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 0, 0, 272, 273, 274, 
+    275, 276, 277, 278, 279, 280, 281, 282, 283, 0, 284, 285, 286, 287, 288, 
+    289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 
+    303, 304, 305, 306, 0, 307, 308, 309, 310, 311, 312, 313, 314, 0, 0, 315, 
+    0, 316, 0, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 
+    329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 
+    343, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 345, 346, 0, 0, 0, 0, 0, 0, 0, 
+    347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 351, 352, 0, 0, 0, 0, 353, 354, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 
+    365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 
+    379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 
+    393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 
+    407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 431, 432, 433, 434, 435, 0, 436, 0, 
+    0, 437, 0, 0, 0, 0, 0, 0, 438, 439, 440, 441, 442, 443, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 444, 445, 
+    446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 
+    460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 
+    474, 475, 476, 477, 0, 0, 0, 0, 0, 0, 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 unsigned short decomp_index2[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
+    3, 0, 6, 0, 0, 0, 0, 8, 0, 0, 11, 13, 15, 18, 0, 0, 20, 23, 25, 0, 27, 
+    31, 35, 0, 39, 42, 45, 48, 51, 54, 0, 57, 60, 63, 66, 69, 72, 75, 78, 81, 
+    0, 84, 87, 90, 93, 96, 99, 0, 0, 102, 105, 108, 111, 114, 0, 0, 117, 120, 
+    123, 126, 129, 132, 0, 135, 138, 141, 144, 147, 150, 153, 156, 159, 0, 
+    162, 165, 168, 171, 174, 177, 0, 0, 180, 183, 186, 189, 192, 0, 195, 198, 
+    201, 204, 207, 210, 213, 216, 219, 222, 225, 228, 231, 234, 237, 240, 
+    243, 0, 0, 246, 249, 252, 255, 258, 261, 264, 267, 270, 273, 276, 279, 
+    282, 285, 288, 291, 294, 297, 300, 303, 0, 0, 306, 309, 312, 315, 318, 
+    321, 324, 327, 330, 0, 333, 336, 339, 342, 345, 348, 0, 351, 354, 357, 
+    360, 363, 366, 369, 372, 0, 0, 375, 378, 381, 384, 387, 390, 393, 0, 0, 
+    396, 399, 402, 405, 408, 411, 0, 0, 414, 417, 420, 423, 426, 429, 432, 
+    435, 438, 441, 444, 447, 450, 453, 456, 459, 462, 465, 0, 0, 468, 471, 
+    474, 477, 480, 483, 486, 489, 492, 495, 498, 501, 504, 507, 510, 513, 
+    516, 519, 522, 525, 528, 531, 534, 537, 539, 542, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 545, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 551, 554, 557, 560, 563, 566, 569, 572, 575, 578, 581, 584, 587, 
+    590, 593, 596, 599, 602, 605, 608, 611, 614, 617, 620, 623, 0, 626, 629, 
+    632, 635, 638, 641, 0, 0, 644, 647, 650, 653, 656, 659, 662, 665, 668, 
+    671, 674, 677, 680, 683, 686, 689, 0, 0, 692, 695, 698, 701, 704, 707, 
+    710, 713, 716, 719, 722, 725, 728, 731, 734, 737, 740, 743, 746, 749, 
+    752, 755, 758, 761, 764, 767, 770, 773, 776, 779, 782, 785, 788, 791, 
+    794, 797, 0, 0, 800, 803, 0, 0, 0, 0, 0, 0, 806, 809, 812, 815, 818, 821, 
+    824, 827, 830, 833, 836, 839, 842, 845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 848, 850, 852, 854, 856, 858, 860, 862, 864, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 866, 869, 872, 875, 878, 881, 0, 0, 884, 886, 888, 
+    890, 892, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 894, 896, 0, 898, 900, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 903, 0, 0, 0, 0, 0, 905, 0, 0, 0, 
+    908, 0, 0, 0, 0, 0, 910, 913, 916, 919, 921, 924, 927, 0, 930, 0, 933, 
+    936, 939, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 942, 945, 948, 951, 954, 957, 960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 963, 966, 969, 972, 975, 
+    0, 978, 980, 982, 984, 987, 990, 992, 0, 0, 0, 0, 0, 0, 0, 0, 0, 994, 
+    996, 998, 0, 1000, 1002, 0, 0, 0, 1004, 0, 0, 0, 0, 0, 0, 1006, 1009, 0, 
+    1012, 0, 0, 0, 1015, 0, 0, 0, 0, 1018, 1021, 1024, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 1027, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1030, 0, 0, 
+    0, 0, 0, 0, 1033, 1036, 0, 1039, 0, 0, 0, 1042, 0, 0, 0, 0, 1045, 1048, 
+    1051, 0, 0, 0, 0, 0, 0, 0, 1054, 1057, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1060, 
+    1063, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1066, 1069, 1072, 1075, 0, 
+    0, 1078, 1081, 0, 0, 1084, 1087, 1090, 1093, 1096, 1099, 0, 0, 1102, 
+    1105, 1108, 1111, 1114, 1117, 0, 0, 1120, 1123, 1126, 1129, 1132, 1135, 
+    1138, 1141, 1144, 1147, 1150, 1153, 0, 0, 1156, 1159, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 1162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1165, 1168, 
+    1171, 1174, 1177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1180, 1183, 
+    1186, 1189, 0, 0, 0, 0, 0, 0, 0, 1192, 0, 1195, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 1198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 1201, 0, 0, 0, 0, 0, 0, 0, 1204, 0, 0, 1207, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1210, 1213, 1216, 
+    1219, 1222, 1225, 1228, 1231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1234, 
+    1237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1240, 1243, 0, 1246, 
+    0, 0, 0, 1249, 0, 0, 1252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 1255, 1258, 1261, 0, 0, 1264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1267, 
+    0, 0, 1270, 1273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1276, 
+    1279, 0, 0, 0, 0, 0, 0, 1282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 1285, 1288, 1291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    1294, 0, 0, 0, 0, 0, 0, 0, 1297, 0, 0, 0, 0, 0, 0, 1300, 1303, 0, 1306, 
+    1309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1312, 1315, 1318, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1321, 0, 1324, 1327, 1330, 0, 0, 0, 0, 
+    1333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1336, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1339, 1342, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1345, 0, 0, 0, 0, 0, 0, 1347, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 1350, 0, 0, 0, 0, 1353, 0, 0, 0, 0, 1356, 0, 0, 
+    0, 0, 1359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1362, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 1365, 0, 1368, 1371, 1374, 1377, 1380, 0, 0, 0, 0, 0, 0, 0, 
+    1383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1386, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 1389, 0, 0, 0, 0, 1392, 0, 0, 0, 0, 1395, 0, 0, 0, 0, 
+    1398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1401, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 1404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 1407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1409, 0, 1412, 0, 1415, 0, 
+    1418, 0, 1421, 0, 0, 0, 1424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1427, 0, 1430, 0, 0, 1433, 1436, 0, 1439, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    1442, 1444, 1446, 0, 1448, 1450, 1452, 1454, 1456, 1458, 1460, 1462, 
+    1464, 1466, 1468, 0, 1470, 1472, 1474, 1476, 1478, 1480, 1482, 1484, 
+    1486, 1488, 1490, 1492, 1494, 1496, 1498, 1500, 1502, 1504, 0, 1506, 
+    1508, 1510, 1512, 1514, 1516, 1518, 1520, 1522, 1524, 1526, 1528, 1530, 
+    1532, 1534, 1536, 1538, 1540, 1542, 1544, 1546, 1548, 1550, 1552, 1554, 
+    1556, 1558, 1560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1562, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1564, 1566, 1568, 1570, 
+    1572, 1574, 1576, 1578, 1580, 1582, 1584, 1586, 1588, 1590, 1592, 1594, 
+    1596, 1598, 1600, 1602, 1604, 1606, 1608, 1610, 1612, 1614, 1616, 1618, 
+    1620, 1622, 1624, 1626, 1628, 1630, 1632, 1634, 1636, 1638, 1641, 1644, 
+    1647, 1650, 1653, 1656, 1659, 1662, 1665, 1668, 1671, 1674, 1677, 1680, 
+    1683, 1686, 1689, 1692, 1695, 1698, 1701, 1704, 1707, 1710, 1713, 1716, 
+    1719, 1722, 1725, 1728, 1731, 1734, 1737, 1740, 1743, 1746, 1749, 1752, 
+    1755, 1758, 1761, 1764, 1767, 1770, 1773, 1776, 1779, 1782, 1785, 1788, 
+    1791, 1794, 1797, 1800, 1803, 1806, 1809, 1812, 1815, 1818, 1821, 1824, 
+    1827, 1830, 1833, 1836, 1839, 1842, 1845, 1848, 1851, 1854, 1857, 1860, 
+    1863, 1866, 1869, 1872, 1875, 1878, 1881, 1884, 1887, 1890, 1893, 1896, 
+    1899, 1902, 1905, 1908, 1911, 1914, 1917, 1920, 1923, 1926, 1929, 1932, 
+    1935, 1938, 1941, 1944, 1947, 1950, 1953, 1956, 1959, 1962, 1965, 1968, 
+    1971, 1974, 1977, 1980, 1983, 1986, 1989, 1992, 1995, 1998, 2001, 2004, 
+    2007, 2010, 2013, 2016, 2019, 2022, 2025, 2028, 2031, 2034, 2037, 2040, 
+    2043, 2046, 2049, 2052, 2055, 2058, 2061, 2064, 2067, 2070, 2073, 2076, 
+    2079, 2082, 2085, 2088, 2091, 2094, 2097, 2100, 2103, 0, 0, 0, 0, 2106, 
+    2109, 2112, 2115, 2118, 2121, 2124, 2127, 2130, 2133, 2136, 2139, 2142, 
+    2145, 2148, 2151, 2154, 2157, 2160, 2163, 2166, 2169, 2172, 2175, 2178, 
+    2181, 2184, 2187, 2190, 2193, 2196, 2199, 2202, 2205, 2208, 2211, 2214, 
+    2217, 2220, 2223, 2226, 2229, 2232, 2235, 2238, 2241, 2244, 2247, 2250, 
+    2253, 2256, 2259, 2262, 2265, 2268, 2271, 2274, 2277, 2280, 2283, 2286, 
+    2289, 2292, 2295, 2298, 2301, 2304, 2307, 2310, 2313, 2316, 2319, 2322, 
+    2325, 2328, 2331, 2334, 2337, 2340, 2343, 2346, 2349, 2352, 2355, 2358, 
+    2361, 2364, 2367, 2370, 2373, 0, 0, 0, 0, 0, 0, 2376, 2379, 2382, 2385, 
+    2388, 2391, 2394, 2397, 2400, 2403, 2406, 2409, 2412, 2415, 2418, 2421, 
+    2424, 2427, 2430, 2433, 2436, 2439, 0, 0, 2442, 2445, 2448, 2451, 2454, 
+    2457, 0, 0, 2460, 2463, 2466, 2469, 2472, 2475, 2478, 2481, 2484, 2487, 
+    2490, 2493, 2496, 2499, 2502, 2505, 2508, 2511, 2514, 2517, 2520, 2523, 
+    2526, 2529, 2532, 2535, 2538, 2541, 2544, 2547, 2550, 2553, 2556, 2559, 
+    2562, 2565, 2568, 2571, 0, 0, 2574, 2577, 2580, 2583, 2586, 2589, 0, 0, 
+    2592, 2595, 2598, 2601, 2604, 2607, 2610, 2613, 0, 2616, 0, 2619, 0, 
+    2622, 0, 2625, 2628, 2631, 2634, 2637, 2640, 2643, 2646, 2649, 2652, 
+    2655, 2658, 2661, 2664, 2667, 2670, 2673, 2676, 2679, 2681, 2684, 2686, 
+    2689, 2691, 2694, 2696, 2699, 2701, 2704, 2706, 2709, 0, 0, 2711, 2714, 
+    2717, 2720, 2723, 2726, 2729, 2732, 2735, 2738, 2741, 2744, 2747, 2750, 
+    2753, 2756, 2759, 2762, 2765, 2768, 2771, 2774, 2777, 2780, 2783, 2786, 
+    2789, 2792, 2795, 2798, 2801, 2804, 2807, 2810, 2813, 2816, 2819, 2822, 
+    2825, 2828, 2831, 2834, 2837, 2840, 2843, 2846, 2849, 2852, 2855, 2858, 
+    2861, 2864, 2867, 0, 2870, 2873, 2876, 2879, 2882, 2885, 2887, 2890, 
+    2893, 2895, 2898, 2901, 2904, 2907, 2910, 0, 2913, 2916, 2919, 2922, 
+    2924, 2927, 2929, 2932, 2935, 2938, 2941, 2944, 2947, 2950, 0, 0, 2952, 
+    2955, 2958, 2961, 2964, 2967, 0, 2969, 2972, 2975, 2978, 2981, 2984, 
+    2987, 2989, 2992, 2995, 2998, 3001, 3004, 3007, 3010, 3012, 3015, 3018, 
+    3020, 0, 0, 3022, 3025, 3028, 0, 3031, 3034, 3037, 3040, 3042, 3045, 
+    3047, 3050, 3052, 0, 3055, 3057, 3059, 3061, 3063, 3065, 3067, 3069, 
+    3071, 3073, 3075, 0, 0, 0, 0, 0, 0, 3077, 0, 0, 0, 0, 0, 3079, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3082, 3084, 3087, 0, 0, 0, 0, 0, 0, 0, 0, 
+    3091, 0, 0, 0, 3093, 3096, 0, 3100, 3103, 0, 0, 0, 0, 3107, 0, 3110, 0, 
+    0, 0, 0, 0, 0, 0, 0, 3113, 3116, 3119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 3122, 0, 0, 0, 0, 0, 0, 0, 3127, 3129, 3131, 0, 0, 3133, 3135, 
+    3137, 3139, 3141, 3143, 3145, 3147, 3149, 3151, 3153, 3155, 3157, 3159, 
+    3161, 3163, 3165, 3167, 3169, 3171, 3173, 3175, 3177, 3179, 3181, 3183, 
+    3185, 0, 3187, 3189, 3191, 3193, 3195, 3197, 3199, 3201, 3203, 3205, 
+    3207, 3209, 3211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3213, 0, 0, 0, 0, 0, 
+    0, 0, 3216, 3220, 3224, 3226, 0, 3229, 3233, 3237, 0, 3239, 3242, 3244, 
+    3246, 3248, 3250, 3252, 3254, 3256, 3258, 3260, 0, 3262, 3264, 0, 0, 
+    3267, 3269, 3271, 3273, 3275, 0, 0, 3277, 3280, 3284, 0, 3287, 0, 3289, 
+    0, 3291, 0, 3293, 3295, 3297, 3299, 0, 3301, 3303, 3305, 0, 3307, 3309, 
+    3311, 3313, 3315, 3317, 3319, 0, 3321, 3325, 3327, 3329, 3331, 3333, 0, 
+    0, 0, 0, 3335, 3337, 3339, 3341, 3343, 0, 0, 0, 0, 0, 0, 3345, 3349, 
+    3353, 3358, 3362, 3366, 3370, 3374, 3378, 3382, 3386, 3390, 3394, 3398, 
+    3402, 3406, 3409, 3411, 3414, 3418, 3421, 3423, 3426, 3430, 3435, 3438, 
+    3440, 3443, 3447, 3449, 3451, 3453, 3455, 3457, 3460, 3464, 3467, 3469, 
+    3472, 3476, 3481, 3484, 3486, 3489, 3493, 3495, 3497, 3499, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 3501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    3505, 3508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3511, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3514, 3517, 3520, 0, 0, 0, 0, 
+    3523, 0, 0, 0, 0, 3526, 0, 0, 3529, 0, 0, 0, 0, 0, 0, 0, 3532, 0, 3535, 
+    0, 0, 0, 0, 0, 3538, 3541, 0, 3545, 3548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 3552, 0, 0, 3555, 0, 0, 3558, 0, 3561, 0, 0, 0, 0, 0, 
+    0, 3564, 0, 3567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3570, 3573, 3576, 3579, 
+    3582, 0, 0, 3585, 3588, 0, 0, 3591, 3594, 0, 0, 0, 0, 0, 0, 3597, 3600, 
+    0, 0, 3603, 3606, 0, 0, 3609, 3612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 3615, 3618, 3621, 3624, 3627, 3630, 3633, 3636, 0, 0, 
+    0, 0, 0, 0, 3639, 3642, 3645, 3648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    3651, 3653, 0, 0, 0, 0, 0, 3655, 3657, 3659, 3661, 3663, 3665, 3667, 
+    3669, 3671, 3673, 3676, 3679, 3682, 3685, 3688, 3691, 3694, 3697, 3700, 
+    3703, 3706, 3710, 3714, 3718, 3722, 3726, 3730, 3734, 3738, 3742, 3747, 
+    3752, 3757, 3762, 3767, 3772, 3777, 3782, 3787, 3792, 3797, 3800, 3803, 
+    3806, 3809, 3812, 3815, 3818, 3821, 3824, 3828, 3832, 3836, 3840, 3844, 
+    3848, 3852, 3856, 3860, 3864, 3868, 3872, 3876, 3880, 3884, 3888, 3892, 
+    3896, 3900, 3904, 3908, 3912, 3916, 3920, 3924, 3928, 3932, 3936, 3940, 
+    3944, 3948, 3952, 3956, 3960, 3964, 3968, 3972, 3974, 3976, 3978, 3980, 
+    3982, 3984, 3986, 3988, 3990, 3992, 3994, 3996, 3998, 4000, 4002, 4004, 
+    4006, 4008, 4010, 4012, 4014, 4016, 4018, 4020, 4022, 4024, 4026, 4028, 
+    4030, 4032, 4034, 4036, 4038, 4040, 4042, 4044, 4046, 4048, 4050, 4052, 
+    4054, 4056, 4058, 4060, 4062, 4064, 4066, 4068, 4070, 4072, 4074, 4076, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4078, 0, 0, 0, 0, 0, 
+    0, 0, 4083, 4087, 4090, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 4094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4097, 
+    4099, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4101, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4103, 0, 0, 0, 4105, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 4107, 4109, 4111, 4113, 4115, 4117, 4119, 4121, 
+    4123, 4125, 4127, 4129, 4131, 4133, 4135, 4137, 4139, 4141, 4143, 4145, 
+    4147, 4149, 4151, 4153, 4155, 4157, 4159, 4161, 4163, 4165, 4167, 4169, 
+    4171, 4173, 4175, 4177, 4179, 4181, 4183, 4185, 4187, 4189, 4191, 4193, 
+    4195, 4197, 4199, 4201, 4203, 4205, 4207, 4209, 4211, 4213, 4215, 4217, 
+    4219, 4221, 4223, 4225, 4227, 4229, 4231, 4233, 4235, 4237, 4239, 4241, 
+    4243, 4245, 4247, 4249, 4251, 4253, 4255, 4257, 4259, 4261, 4263, 4265, 
+    4267, 4269, 4271, 4273, 4275, 4277, 4279, 4281, 4283, 4285, 4287, 4289, 
+    4291, 4293, 4295, 4297, 4299, 4301, 4303, 4305, 4307, 4309, 4311, 4313, 
+    4315, 4317, 4319, 4321, 4323, 4325, 4327, 4329, 4331, 4333, 4335, 4337, 
+    4339, 4341, 4343, 4345, 4347, 4349, 4351, 4353, 4355, 4357, 4359, 4361, 
+    4363, 4365, 4367, 4369, 4371, 4373, 4375, 4377, 4379, 4381, 4383, 4385, 
+    4387, 4389, 4391, 4393, 4395, 4397, 4399, 4401, 4403, 4405, 4407, 4409, 
+    4411, 4413, 4415, 4417, 4419, 4421, 4423, 4425, 4427, 4429, 4431, 4433, 
+    4435, 4437, 4439, 4441, 4443, 4445, 4447, 4449, 4451, 4453, 4455, 4457, 
+    4459, 4461, 4463, 4465, 4467, 4469, 4471, 4473, 4475, 4477, 4479, 4481, 
+    4483, 4485, 4487, 4489, 4491, 4493, 4495, 4497, 4499, 4501, 4503, 4505, 
+    4507, 4509, 4511, 4513, 4515, 4517, 4519, 4521, 4523, 4525, 4527, 4529, 
+    4531, 4533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4535, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4537, 0, 4539, 4541, 4543, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4545, 0, 4548, 0, 4551, 0, 
+    4554, 0, 4557, 0, 4560, 0, 4563, 0, 4566, 0, 4569, 0, 4572, 0, 4575, 0, 
+    4578, 0, 0, 4581, 0, 4584, 0, 4587, 0, 0, 0, 0, 0, 0, 4590, 4593, 0, 
+    4596, 4599, 0, 4602, 4605, 0, 4608, 4611, 0, 4614, 4617, 0, 0, 0, 0, 0, 
+    0, 4620, 0, 0, 0, 0, 0, 0, 4623, 4626, 0, 4629, 4632, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 4635, 0, 4638, 0, 4641, 0, 4644, 0, 4647, 0, 4650, 0, 
+    4653, 0, 4656, 0, 4659, 0, 4662, 0, 4665, 0, 4668, 0, 0, 4671, 0, 4674, 
+    0, 4677, 0, 0, 0, 0, 0, 0, 4680, 4683, 0, 4686, 4689, 0, 4692, 4695, 0, 
+    4698, 4701, 0, 4704, 4707, 0, 0, 0, 0, 0, 0, 4710, 0, 0, 4713, 4716, 
+    4719, 4722, 0, 0, 0, 4725, 4728, 0, 4731, 4733, 4735, 4737, 4739, 4741, 
+    4743, 4745, 4747, 4749, 4751, 4753, 4755, 4757, 4759, 4761, 4763, 4765, 
+    4767, 4769, 4771, 4773, 4775, 4777, 4779, 4781, 4783, 4785, 4787, 4789, 
+    4791, 4793, 4795, 4797, 4799, 4801, 4803, 4805, 4807, 4809, 4811, 4813, 
+    4815, 4817, 4819, 4821, 4823, 4825, 4827, 4829, 4831, 4833, 4835, 4837, 
+    4839, 4841, 4843, 4845, 4847, 4849, 4851, 4853, 4855, 4857, 4859, 4861, 
+    4863, 4865, 4867, 4869, 4871, 4873, 4875, 4877, 4879, 4881, 4883, 4885, 
+    4887, 4889, 4891, 4893, 4895, 4897, 4899, 4901, 4903, 4905, 4907, 4909, 
+    4911, 4913, 4915, 4917, 0, 0, 0, 4919, 4921, 4923, 4925, 4927, 4929, 
+    4931, 4933, 4935, 4937, 4939, 4941, 4943, 4945, 4947, 4951, 4955, 4959, 
+    4963, 4967, 4971, 4975, 4979, 4983, 4987, 4991, 4995, 4999, 5003, 5008, 
+    5013, 5018, 5023, 5028, 5033, 5038, 5043, 5048, 5053, 5058, 5063, 5068, 
+    5073, 5078, 5086, 0, 5093, 5097, 5101, 5105, 5109, 5113, 5117, 5121, 
+    5125, 5129, 5133, 5137, 5141, 5145, 5149, 5153, 5157, 5161, 5165, 5169, 
+    5173, 5177, 5181, 5185, 5189, 5193, 5197, 5201, 5205, 5209, 5213, 5217, 
+    5221, 5225, 5229, 5233, 5237, 5239, 5241, 5243, 0, 0, 0, 0, 0, 0, 0, 0, 
+    5245, 5249, 5252, 5255, 5258, 5261, 5264, 5267, 5270, 5273, 5276, 5279, 
+    5282, 5285, 5288, 5291, 5294, 5296, 5298, 5300, 5302, 5304, 5306, 5308, 
+    5310, 5312, 5314, 5316, 5318, 5320, 5322, 5325, 5328, 5331, 5334, 5337, 
+    5340, 5343, 5346, 5349, 5352, 5355, 5358, 5361, 5364, 5370, 5375, 0, 
+    5378, 5380, 5382, 5384, 5386, 5388, 5390, 5392, 5394, 5396, 5398, 5400, 
+    5402, 5404, 5406, 5408, 5410, 5412, 5414, 5416, 5418, 5420, 5422, 5424, 
+    5426, 5428, 5430, 5432, 5434, 5436, 5438, 5440, 5442, 5444, 5446, 5448, 
+    5450, 5452, 5454, 5456, 5458, 5460, 5462, 5464, 5466, 5468, 5470, 5472, 
+    5474, 5476, 5479, 5482, 5485, 5488, 5491, 5494, 5497, 5500, 5503, 5506, 
+    5509, 5512, 5515, 5518, 5521, 5524, 5527, 5530, 5533, 5536, 5539, 5542, 
+    5545, 5548, 5552, 5556, 5560, 5563, 5567, 5570, 5574, 5576, 5578, 5580, 
+    5582, 5584, 5586, 5588, 5590, 5592, 5594, 5596, 5598, 5600, 5602, 5604, 
+    5606, 5608, 5610, 5612, 5614, 5616, 5618, 5620, 5622, 5624, 5626, 5628, 
+    5630, 5632, 5634, 5636, 5638, 5640, 5642, 5644, 5646, 5648, 5650, 5652, 
+    5654, 5656, 5658, 5660, 5662, 5664, 5666, 0, 5668, 5673, 5678, 5683, 
+    5687, 5692, 5696, 5700, 5706, 5711, 5715, 5719, 5723, 5728, 5733, 5737, 
+    5741, 5744, 5748, 5753, 5758, 5761, 5767, 5774, 5780, 5784, 5790, 5796, 
+    5801, 5805, 5809, 5813, 5818, 5824, 5829, 5833, 5837, 5841, 5844, 5847, 
+    5850, 5853, 5857, 5861, 5867, 5871, 5876, 5882, 5886, 5889, 5892, 5898, 
+    5903, 5909, 5913, 5919, 5922, 5926, 5930, 5934, 5938, 5942, 5947, 5951, 
+    5954, 5958, 5962, 5966, 5971, 5975, 5979, 5983, 5989, 5994, 5997, 6003, 
+    6006, 6011, 6016, 6020, 6024, 6028, 6033, 6036, 6040, 6045, 6048, 6054, 
+    6058, 6061, 6064, 6067, 6070, 6073, 6076, 6079, 6082, 6085, 6088, 6092, 
+    6096, 6100, 6104, 6108, 6112, 6116, 6120, 6124, 6128, 6132, 6136, 6140, 
+    6144, 6148, 6152, 6155, 6158, 6162, 6165, 6168, 6171, 6175, 6179, 6182, 
+    6185, 6188, 6191, 6194, 6199, 6202, 6205, 6208, 6211, 6214, 6217, 6220, 
+    6223, 6227, 6232, 6235, 6238, 6241, 6244, 6247, 6250, 6253, 6257, 6261, 
+    6265, 6269, 6272, 6275, 6278, 6281, 6284, 6287, 6290, 6293, 6296, 6299, 
+    6303, 6307, 6310, 6314, 6318, 6322, 6325, 6329, 6333, 6338, 6341, 6345, 
+    6349, 6353, 6357, 6363, 6370, 6373, 6376, 6379, 6382, 6385, 6388, 6391, 
+    6394, 6397, 6400, 6403, 6406, 6409, 6412, 6415, 6418, 6421, 6424, 6429, 
+    6432, 6435, 6438, 6443, 6447, 6450, 6453, 6456, 6459, 6462, 6465, 6468, 
+    6471, 6474, 6477, 6481, 6484, 6487, 6491, 6495, 6498, 6503, 6507, 6510, 
+    6513, 6516, 6519, 6523, 6527, 6530, 6533, 6536, 6539, 6542, 6545, 6548, 
+    6551, 6554, 6558, 6562, 6566, 6570, 6574, 6578, 6582, 6586, 6590, 6594, 
+    6598, 6602, 6606, 6610, 6614, 6618, 6622, 6626, 6630, 6634, 6638, 6642, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6646, 6648, 0, 0, 6650, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6652, 6654, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6656, 6658, 6660, 
+    6662, 6664, 6666, 6668, 6670, 6672, 6674, 6676, 6678, 6680, 6682, 6684, 
+    6686, 6688, 6690, 6692, 6694, 6696, 6698, 6700, 6702, 6704, 6706, 6708, 
+    6710, 6712, 6714, 6716, 6718, 6720, 6722, 6724, 6726, 6728, 6730, 6732, 
+    6734, 6736, 6738, 6740, 6742, 6744, 6746, 6748, 6750, 6752, 6754, 6756, 
+    6758, 6760, 6762, 6764, 6766, 6768, 6770, 6772, 6774, 6776, 6778, 6780, 
+    6782, 6784, 6786, 6788, 6790, 6792, 6794, 6796, 6798, 6800, 6802, 6804, 
+    6806, 6808, 6810, 6812, 6814, 6816, 6818, 6820, 6822, 6824, 6826, 6828, 
+    6830, 6832, 6834, 6836, 6838, 6840, 6842, 6844, 6846, 6848, 6850, 6852, 
+    6854, 6856, 6858, 6860, 6862, 6864, 6866, 6868, 6870, 6872, 6874, 6876, 
+    6878, 6880, 6882, 6884, 6886, 6888, 6890, 6892, 6894, 6896, 6898, 6900, 
+    6902, 6904, 6906, 6908, 6910, 6912, 6914, 6916, 6918, 6920, 6922, 6924, 
+    6926, 6928, 6930, 6932, 6934, 6936, 6938, 6940, 6942, 6944, 6946, 6948, 
+    6950, 6952, 6954, 6956, 6958, 6960, 6962, 6964, 6966, 6968, 6970, 6972, 
+    6974, 6976, 6978, 6980, 6982, 6984, 6986, 6988, 6990, 6992, 6994, 6996, 
+    6998, 7000, 7002, 7004, 7006, 7008, 7010, 7012, 7014, 7016, 7018, 7020, 
+    7022, 7024, 7026, 7028, 7030, 7032, 7034, 7036, 7038, 7040, 7042, 7044, 
+    7046, 7048, 7050, 7052, 7054, 7056, 7058, 7060, 7062, 7064, 7066, 7068, 
+    7070, 7072, 7074, 7076, 7078, 7080, 7082, 7084, 7086, 7088, 7090, 7092, 
+    7094, 7096, 7098, 7100, 7102, 7104, 7106, 7108, 7110, 7112, 7114, 7116, 
+    7118, 7120, 7122, 7124, 7126, 7128, 7130, 7132, 7134, 7136, 7138, 7140, 
+    7142, 7144, 7146, 7148, 7150, 7152, 7154, 7156, 7158, 7160, 7162, 7164, 
+    7166, 7168, 7170, 7172, 7174, 7176, 7178, 7180, 7182, 7184, 7186, 7188, 
+    7190, 7192, 7194, 7196, 7198, 7200, 7202, 0, 0, 7204, 0, 7206, 0, 0, 
+    7208, 7210, 7212, 7214, 7216, 7218, 7220, 7222, 7224, 7226, 0, 7228, 0, 
+    7230, 0, 0, 7232, 7234, 0, 0, 0, 7236, 7238, 7240, 7242, 7244, 7246, 
+    7248, 7250, 7252, 7254, 7256, 7258, 7260, 7262, 7264, 7266, 7268, 7270, 
+    7272, 7274, 7276, 7278, 7280, 7282, 7284, 7286, 7288, 7290, 7292, 7294, 
+    7296, 7298, 7300, 7302, 7304, 7306, 7308, 7310, 7312, 7314, 7316, 7318, 
+    7320, 7322, 7324, 7326, 7328, 7330, 7332, 7334, 7336, 7338, 7340, 7342, 
+    7344, 7346, 7348, 7350, 7352, 7354, 7356, 7358, 7360, 7362, 7364, 7366, 
+    7368, 7371, 0, 0, 7373, 7375, 7377, 7379, 7381, 7383, 7385, 7387, 7389, 
+    7391, 7393, 7395, 7397, 7399, 7401, 7403, 7405, 7407, 7409, 7411, 7413, 
+    7415, 7417, 7419, 7421, 7423, 7425, 7427, 7429, 7431, 7433, 7435, 7437, 
+    7439, 7441, 7443, 7445, 7447, 7449, 7451, 7453, 7455, 7457, 7459, 7461, 
+    7463, 7465, 7467, 7469, 7471, 7473, 7475, 7477, 7479, 7481, 7483, 7485, 
+    7487, 7489, 7491, 7493, 7495, 7497, 7499, 7501, 7503, 7505, 7507, 7509, 
+    7511, 7513, 7515, 7517, 7519, 7521, 7523, 7525, 7527, 7529, 7531, 7533, 
+    7535, 7537, 7539, 7541, 7543, 7545, 7547, 7549, 7551, 7553, 7555, 7557, 
+    7559, 7561, 7563, 7566, 7569, 7572, 7574, 7576, 7578, 7581, 7584, 7587, 
+    7589, 0, 0, 0, 0, 0, 0, 7591, 7594, 7597, 7600, 7604, 7608, 7611, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7614, 7617, 7620, 7623, 7626, 0, 0, 0, 0, 
+    0, 7629, 0, 7632, 7635, 7637, 7639, 7641, 7643, 7645, 7647, 7649, 7651, 
+    7653, 7655, 7658, 7661, 7664, 7667, 7670, 7673, 7676, 7679, 7682, 7685, 
+    7688, 7691, 0, 7694, 7697, 7700, 7703, 7706, 0, 7709, 0, 7712, 7715, 0, 
+    7718, 7721, 0, 7724, 7727, 7730, 7733, 7736, 7739, 7742, 7745, 7748, 
+    7751, 7754, 7756, 7758, 7760, 7762, 7764, 7766, 7768, 7770, 7772, 7774, 
+    7776, 7778, 7780, 7782, 7784, 7786, 7788, 7790, 7792, 7794, 7796, 7798, 
+    7800, 7802, 7804, 7806, 7808, 7810, 7812, 7814, 7816, 7818, 7820, 7822, 
+    7824, 7826, 7828, 7830, 7832, 7834, 7836, 7838, 7840, 7842, 7844, 7846, 
+    7848, 7850, 7852, 7854, 7856, 7858, 7860, 7862, 7864, 7866, 7868, 7870, 
+    7872, 7874, 7876, 7878, 7880, 7882, 7884, 7886, 7888, 7890, 7892, 7894, 
+    7896, 7898, 7900, 7902, 7904, 7906, 7908, 7910, 7912, 7914, 7916, 7918, 
+    7920, 7922, 7924, 7926, 7928, 7930, 7932, 7934, 7936, 7938, 7940, 7942, 
+    7944, 7946, 7948, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    7950, 7952, 7954, 7956, 7958, 7960, 7962, 7964, 7966, 7968, 7970, 7972, 
+    7974, 7976, 7978, 7980, 7982, 7984, 7986, 7988, 7990, 7992, 7994, 7996, 
+    7999, 8002, 8005, 8008, 8011, 8014, 8017, 8020, 8023, 8026, 8029, 8032, 
+    8035, 8038, 8041, 8044, 8047, 8050, 8052, 8054, 8056, 8058, 8061, 8064, 
+    8067, 8070, 8073, 8076, 8079, 8082, 8085, 8088, 8091, 8094, 8097, 8100, 
+    8103, 8106, 8109, 8112, 8115, 8118, 8121, 8124, 8127, 8130, 8133, 8136, 
+    8139, 8142, 8145, 8148, 8151, 8154, 8157, 8160, 8163, 8166, 8169, 8172, 
+    8175, 8178, 8181, 8184, 8187, 8190, 8193, 8196, 8199, 8202, 8205, 8208, 
+    8211, 8214, 8217, 8220, 8223, 8226, 8229, 8232, 8235, 8238, 8241, 8244, 
+    8247, 8250, 8253, 8256, 8259, 8262, 8265, 8268, 8271, 8274, 8277, 8280, 
+    8283, 8286, 8289, 8292, 8295, 8298, 8301, 8304, 8307, 8310, 8313, 8316, 
+    8319, 8322, 8325, 8328, 8331, 8334, 8337, 8340, 8344, 8348, 8352, 8356, 
+    8360, 8364, 8367, 8370, 8373, 8376, 8379, 8382, 8385, 8388, 8391, 8394, 
+    8397, 8400, 8403, 8406, 8409, 8412, 8415, 8418, 8421, 8424, 8427, 8430, 
+    8433, 8436, 8439, 8442, 8445, 8448, 8451, 8454, 8457, 8460, 8463, 8466, 
+    8469, 8472, 8475, 8478, 8481, 8484, 8487, 8490, 8493, 8496, 8499, 8502, 
+    8505, 8508, 8511, 8514, 8517, 8520, 8523, 8526, 8529, 8532, 8535, 8538, 
+    8541, 8544, 8547, 8550, 8553, 8556, 8559, 8562, 8565, 8568, 8571, 8574, 
+    8577, 8580, 8583, 8586, 8589, 8592, 8595, 8598, 8601, 8604, 8607, 8610, 
+    8613, 8616, 8619, 8622, 8625, 8628, 8631, 8634, 8637, 8640, 8643, 8646, 
+    8649, 8652, 8655, 8658, 8661, 8664, 8667, 8670, 8673, 8676, 8679, 8682, 
+    8685, 8688, 8691, 8694, 8697, 8700, 8703, 8706, 8709, 8712, 8715, 8718, 
+    8721, 8724, 8727, 8730, 8733, 8736, 8739, 8742, 8745, 8748, 8751, 8754, 
+    8757, 8760, 8763, 8766, 8769, 8772, 8775, 8778, 8781, 8784, 8787, 8790, 
+    8794, 8798, 8802, 8805, 8808, 8811, 8814, 8817, 8820, 8823, 8826, 8829, 
+    8832, 8835, 8838, 8841, 8844, 8847, 8850, 8853, 8856, 8859, 8862, 8865, 
+    8868, 8871, 8874, 8877, 8880, 8883, 8886, 8889, 8892, 8895, 8898, 8901, 
+    8904, 8907, 8910, 8913, 8916, 8919, 8922, 8925, 8928, 8931, 8934, 8937, 
+    8940, 8943, 8946, 8949, 8952, 8955, 8958, 8961, 8964, 8967, 8970, 8973, 
+    8976, 8979, 8982, 8985, 8988, 8991, 8994, 8997, 9000, 9003, 9006, 9009, 
+    9012, 9015, 9018, 0, 0, 9021, 9025, 9029, 9033, 9037, 9041, 9045, 9049, 
+    9053, 9057, 9061, 9065, 9069, 9073, 9077, 9081, 9085, 9089, 9093, 9097, 
+    9101, 9105, 9109, 9113, 9117, 9121, 9125, 9129, 9133, 9137, 9141, 9145, 
+    9149, 9153, 9157, 9161, 9165, 9169, 9173, 9177, 9181, 9185, 9189, 9193, 
+    9197, 9201, 9205, 9209, 9213, 9217, 9221, 9225, 9229, 9233, 9237, 9241, 
+    9245, 9249, 9253, 9257, 9261, 9265, 9269, 9273, 0, 0, 9277, 9281, 9285, 
+    9289, 9293, 9297, 9301, 9305, 9309, 9313, 9317, 9321, 9325, 9329, 9333, 
+    9337, 9341, 9345, 9349, 9353, 9357, 9361, 9365, 9369, 9373, 9377, 9381, 
+    9385, 9389, 9393, 9397, 9401, 9405, 9409, 9413, 9417, 9421, 9425, 9429, 
+    9433, 9437, 9441, 9445, 9449, 9453, 9457, 9461, 9465, 9469, 9473, 9477, 
+    9481, 9485, 9489, 0, 0, 0, 0, 0, 0, 0, 0, 9493, 9497, 9501, 9506, 9511, 
+    9516, 9521, 9526, 9531, 9536, 9540, 9559, 9568, 0, 0, 0, 9573, 9575, 
+    9577, 9579, 9581, 9583, 9585, 9587, 9589, 9591, 0, 0, 0, 0, 0, 0, 9593, 
+    9595, 9597, 9599, 9601, 9603, 9605, 9607, 9609, 9611, 9613, 9615, 9617, 
+    9619, 9621, 9623, 9625, 9627, 9629, 9631, 9633, 0, 0, 9635, 9637, 9639, 
+    9641, 9643, 9645, 9647, 9649, 9651, 9653, 9655, 9657, 0, 9659, 9661, 
+    9663, 9665, 9667, 9669, 9671, 9673, 9675, 9677, 9679, 9681, 9683, 9685, 
+    9687, 9689, 9691, 9693, 9695, 0, 9697, 9699, 9701, 9703, 0, 0, 0, 0, 
+    9705, 9708, 9711, 0, 9714, 0, 9717, 9720, 9723, 9726, 9729, 9732, 9735, 
+    9738, 9741, 9744, 9747, 9749, 9751, 9753, 9755, 9757, 9759, 9761, 9763, 
+    9765, 9767, 9769, 9771, 9773, 9775, 9777, 9779, 9781, 9783, 9785, 9787, 
+    9789, 9791, 9793, 9795, 9797, 9799, 9801, 9803, 9805, 9807, 9809, 9811, 
+    9813, 9815, 9817, 9819, 9821, 9823, 9825, 9827, 9829, 9831, 9833, 9835, 
+    9837, 9839, 9841, 9843, 9845, 9847, 9849, 9851, 9853, 9855, 9857, 9859, 
+    9861, 9863, 9865, 9867, 9869, 9871, 9873, 9875, 9877, 9879, 9881, 9883, 
+    9885, 9887, 9889, 9891, 9893, 9895, 9897, 9899, 9901, 9903, 9905, 9907, 
+    9909, 9911, 9913, 9915, 9917, 9919, 9921, 9923, 9925, 9927, 9929, 9931, 
+    9933, 9935, 9937, 9939, 9941, 9943, 9945, 9947, 9949, 9951, 9953, 9955, 
+    9957, 9959, 9961, 9963, 9965, 9967, 9969, 9971, 9973, 9975, 9977, 9979, 
+    9981, 9984, 9987, 9990, 9993, 9996, 9999, 10002, 0, 0, 0, 0, 10005, 
+    10007, 10009, 10011, 10013, 10015, 10017, 10019, 10021, 10023, 10025, 
+    10027, 10029, 10031, 10033, 10035, 10037, 10039, 10041, 10043, 10045, 
+    10047, 10049, 10051, 10053, 10055, 10057, 10059, 10061, 10063, 10065, 
+    10067, 10069, 10071, 10073, 10075, 10077, 10079, 10081, 10083, 10085, 
+    10087, 10089, 10091, 10093, 10095, 10097, 10099, 10101, 10103, 10105, 
+    10107, 10109, 10111, 10113, 10115, 10117, 10119, 10121, 10123, 10125, 
+    10127, 10129, 10131, 10133, 10135, 10137, 10139, 10141, 10143, 10145, 
+    10147, 10149, 10151, 10153, 10155, 10157, 10159, 10161, 10163, 10165, 
+    10167, 10169, 10171, 10173, 10175, 10177, 10179, 10181, 10183, 10185, 
+    10187, 10189, 10191, 10193, 10195, 10197, 10199, 10201, 10203, 10205, 
+    10207, 10209, 10211, 10213, 10215, 10217, 10219, 10221, 10223, 10225, 
+    10227, 10229, 10231, 10233, 10235, 10237, 10239, 10241, 10243, 10245, 
+    10247, 10249, 10251, 10253, 10255, 10257, 10259, 10261, 10263, 10265, 
+    10267, 10269, 10271, 10273, 10275, 10277, 10279, 10281, 10283, 10285, 
+    10287, 10289, 10291, 10293, 10295, 10297, 10299, 10301, 10303, 10305, 
+    10307, 10309, 10311, 10313, 10315, 10317, 10319, 10321, 10323, 10325, 
+    10327, 10329, 10331, 10333, 10335, 10337, 10339, 10341, 10343, 10345, 
+    10347, 10349, 10351, 10353, 10355, 10357, 10359, 10361, 10363, 10365, 
+    10367, 10369, 10371, 10373, 10375, 10377, 10379, 10381, 10383, 0, 0, 0, 
+    10385, 10387, 10389, 10391, 10393, 10395, 0, 0, 10397, 10399, 10401, 
+    10403, 10405, 10407, 0, 0, 10409, 10411, 10413, 10415, 10417, 10419, 0, 
+    0, 10421, 10423, 10425, 0, 0, 0, 10427, 10429, 10431, 10433, 10435, 
+    10437, 10439, 0, 10441, 10443, 10445, 10447, 10449, 10451, 10453, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 10455, 0, 10460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 10465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    10470, 10475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10480, 10485, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10490, 10495, 0, 10500, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 10505, 10510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 10515, 10520, 10525, 10530, 10535, 10540, 10545, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10550, 10555, 10560, 
+    10565, 10570, 10575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10580, 
+    10582, 10584, 10586, 10588, 10590, 10592, 10594, 10596, 10598, 10600, 
+    10602, 10604, 10606, 10608, 10610, 10612, 10614, 10616, 10618, 10620, 
+    10622, 10624, 10626, 10628, 10630, 10632, 10634, 10636, 10638, 10640, 
+    10642, 10644, 10646, 10648, 10650, 10652, 10654, 10656, 10658, 10660, 
+    10662, 10664, 10666, 10668, 10670, 10672, 10674, 10676, 10678, 10680, 
+    10682, 10684, 10686, 10688, 10690, 10692, 10694, 10696, 10698, 10700, 
+    10702, 10704, 10706, 10708, 10710, 10712, 10714, 10716, 10718, 10720, 
+    10722, 10724, 10726, 10728, 10730, 10732, 10734, 10736, 10738, 10740, 
+    10742, 10744, 10746, 10748, 0, 10750, 10752, 10754, 10756, 10758, 10760, 
+    10762, 10764, 10766, 10768, 10770, 10772, 10774, 10776, 10778, 10780, 
+    10782, 10784, 10786, 10788, 10790, 10792, 10794, 10796, 10798, 10800, 
+    10802, 10804, 10806, 10808, 10810, 10812, 10814, 10816, 10818, 10820, 
+    10822, 10824, 10826, 10828, 10830, 10832, 10834, 10836, 10838, 10840, 
+    10842, 10844, 10846, 10848, 10850, 10852, 10854, 10856, 10858, 10860, 
+    10862, 10864, 10866, 10868, 10870, 10872, 10874, 10876, 10878, 10880, 
+    10882, 10884, 10886, 10888, 10890, 0, 10892, 10894, 0, 0, 10896, 0, 0, 
+    10898, 10900, 0, 0, 10902, 10904, 10906, 10908, 0, 10910, 10912, 10914, 
+    10916, 10918, 10920, 10922, 10924, 10926, 10928, 10930, 10932, 0, 10934, 
+    0, 10936, 10938, 10940, 10942, 10944, 10946, 10948, 0, 10950, 10952, 
+    10954, 10956, 10958, 10960, 10962, 10964, 10966, 10968, 10970, 10972, 
+    10974, 10976, 10978, 10980, 10982, 10984, 10986, 10988, 10990, 10992, 
+    10994, 10996, 10998, 11000, 11002, 11004, 11006, 11008, 11010, 11012, 
+    11014, 11016, 11018, 11020, 11022, 11024, 11026, 11028, 11030, 11032, 
+    11034, 11036, 11038, 11040, 11042, 11044, 11046, 11048, 11050, 11052, 
+    11054, 11056, 11058, 11060, 11062, 11064, 11066, 11068, 11070, 11072, 
+    11074, 11076, 11078, 0, 11080, 11082, 11084, 11086, 0, 0, 11088, 11090, 
+    11092, 11094, 11096, 11098, 11100, 11102, 0, 11104, 11106, 11108, 11110, 
+    11112, 11114, 11116, 0, 11118, 11120, 11122, 11124, 11126, 11128, 11130, 
+    11132, 11134, 11136, 11138, 11140, 11142, 11144, 11146, 11148, 11150, 
+    11152, 11154, 11156, 11158, 11160, 11162, 11164, 11166, 11168, 11170, 
+    11172, 0, 11174, 11176, 11178, 11180, 0, 11182, 11184, 11186, 11188, 
+    11190, 0, 11192, 0, 0, 0, 11194, 11196, 11198, 11200, 11202, 11204, 
+    11206, 0, 11208, 11210, 11212, 11214, 11216, 11218, 11220, 11222, 11224, 
+    11226, 11228, 11230, 11232, 11234, 11236, 11238, 11240, 11242, 11244, 
+    11246, 11248, 11250, 11252, 11254, 11256, 11258, 11260, 11262, 11264, 
+    11266, 11268, 11270, 11272, 11274, 11276, 11278, 11280, 11282, 11284, 
+    11286, 11288, 11290, 11292, 11294, 11296, 11298, 11300, 11302, 11304, 
+    11306, 11308, 11310, 11312, 11314, 11316, 11318, 11320, 11322, 11324, 
+    11326, 11328, 11330, 11332, 11334, 11336, 11338, 11340, 11342, 11344, 
+    11346, 11348, 11350, 11352, 11354, 11356, 11358, 11360, 11362, 11364, 
+    11366, 11368, 11370, 11372, 11374, 11376, 11378, 11380, 11382, 11384, 
+    11386, 11388, 11390, 11392, 11394, 11396, 11398, 11400, 11402, 11404, 
+    11406, 11408, 11410, 11412, 11414, 11416, 11418, 11420, 11422, 11424, 
+    11426, 11428, 11430, 11432, 11434, 11436, 11438, 11440, 11442, 11444, 
+    11446, 11448, 11450, 11452, 11454, 11456, 11458, 11460, 11462, 11464, 
+    11466, 11468, 11470, 11472, 11474, 11476, 11478, 11480, 11482, 11484, 
+    11486, 11488, 11490, 11492, 11494, 11496, 11498, 11500, 11502, 11504, 
+    11506, 11508, 11510, 11512, 11514, 11516, 11518, 11520, 11522, 11524, 
+    11526, 11528, 11530, 11532, 11534, 11536, 11538, 11540, 11542, 11544, 
+    11546, 11548, 11550, 11552, 11554, 11556, 11558, 11560, 11562, 11564, 
+    11566, 11568, 11570, 11572, 11574, 11576, 11578, 11580, 11582, 11584, 
+    11586, 11588, 11590, 11592, 11594, 11596, 11598, 11600, 11602, 11604, 
+    11606, 11608, 11610, 11612, 11614, 11616, 11618, 11620, 11622, 11624, 
+    11626, 11628, 11630, 11632, 11634, 11636, 11638, 11640, 11642, 11644, 
+    11646, 11648, 11650, 11652, 11654, 11656, 11658, 11660, 11662, 11664, 
+    11666, 11668, 11670, 11672, 11674, 11676, 11678, 11680, 11682, 11684, 
+    11686, 11688, 11690, 11692, 11694, 11696, 11698, 11700, 11702, 11704, 
+    11706, 11708, 11710, 11712, 11714, 11716, 11718, 11720, 11722, 11724, 
+    11726, 11728, 11730, 11732, 11734, 11736, 11738, 11740, 11742, 11744, 
+    11746, 11748, 11750, 11752, 11754, 11756, 11758, 11760, 11762, 11764, 
+    11766, 11768, 11770, 11772, 11774, 11776, 11778, 11780, 11782, 11784, 
+    11786, 11788, 11790, 11792, 11794, 11796, 11798, 11800, 11802, 11804, 
+    11806, 11808, 11810, 11812, 11814, 11816, 11818, 11820, 11822, 11824, 
+    11826, 11828, 11830, 11832, 11834, 11836, 11838, 11840, 11842, 11844, 
+    11846, 11848, 11850, 11852, 11854, 11856, 11858, 11860, 11862, 11864, 
+    11866, 11868, 11870, 11872, 11874, 11876, 11878, 11880, 11882, 11884, 
+    11886, 0, 0, 11888, 11890, 11892, 11894, 11896, 11898, 11900, 11902, 
+    11904, 11906, 11908, 11910, 11912, 11914, 11916, 11918, 11920, 11922, 
+    11924, 11926, 11928, 11930, 11932, 11934, 11936, 11938, 11940, 11942, 
+    11944, 11946, 11948, 11950, 11952, 11954, 11956, 11958, 11960, 11962, 
+    11964, 11966, 11968, 11970, 11972, 11974, 11976, 11978, 11980, 11982, 
+    11984, 11986, 11988, 11990, 11992, 11994, 11996, 11998, 12000, 12002, 
+    12004, 12006, 12008, 12010, 12012, 12014, 12016, 12018, 12020, 12022, 
+    12024, 12026, 12028, 12030, 12032, 12034, 12036, 12038, 12040, 12042, 
+    12044, 12046, 12048, 12050, 12052, 12054, 12056, 12058, 12060, 12062, 
+    12064, 12066, 12068, 12070, 12072, 12074, 12076, 12078, 12080, 12082, 
+    12084, 12086, 12088, 12090, 12092, 12094, 12096, 12098, 12100, 12102, 
+    12104, 12106, 12108, 12110, 12112, 12114, 12116, 12118, 12120, 12122, 
+    12124, 12126, 12128, 12130, 12132, 12134, 12136, 12138, 12140, 12142, 
+    12144, 12146, 12148, 12150, 12152, 12154, 12156, 12158, 12160, 12162, 
+    12164, 12166, 12168, 12170, 12172, 12174, 12176, 12178, 12180, 12182, 
+    12184, 12186, 12188, 12190, 12192, 12194, 12196, 12198, 12200, 12202, 
+    12204, 12206, 12208, 12210, 12212, 12214, 12216, 12218, 12220, 12222, 
+    12224, 12226, 12228, 12230, 12232, 12234, 12236, 12238, 12240, 12242, 
+    12244, 12246, 12248, 12250, 12252, 12254, 12256, 12258, 12260, 12262, 
+    12264, 12266, 12268, 12270, 12272, 12274, 12276, 12278, 12280, 12282, 
+    12284, 12286, 12288, 12290, 12292, 12294, 12296, 12298, 12300, 12302, 
+    12304, 12306, 12308, 12310, 12312, 12314, 12316, 12318, 12320, 12322, 
+    12324, 12326, 12328, 12330, 12332, 12334, 12336, 12338, 12340, 12342, 
+    12344, 12346, 12348, 12350, 12352, 12354, 12356, 12358, 12360, 12362, 
+    12364, 12366, 12368, 12370, 12372, 12374, 12376, 12378, 12380, 12382, 
+    12384, 12386, 12388, 12390, 12392, 12394, 12396, 12398, 12400, 12402, 
+    12404, 12406, 12408, 12410, 12412, 12414, 12416, 12418, 12420, 12422, 
+    12424, 12426, 12428, 12430, 12432, 12434, 12436, 12438, 12440, 12442, 
+    12444, 12446, 12448, 12450, 12452, 12454, 12456, 12458, 12460, 12462, 
+    12464, 12466, 12468, 12470, 0, 0, 12472, 12474, 12476, 12478, 12480, 
+    12482, 12484, 12486, 12488, 12490, 12492, 12494, 12496, 12498, 12500, 
+    12502, 12504, 12506, 12508, 12510, 12512, 12514, 12516, 12518, 12520, 
+    12522, 12524, 12526, 12528, 12530, 12532, 12534, 12536, 12538, 12540, 
+    12542, 12544, 12546, 12548, 12550, 12552, 12554, 12556, 12558, 12560, 
+    12562, 12564, 12566, 12568, 12570, 12572, 12574, 12576, 12578, 0, 12580, 
+    12582, 12584, 12586, 12588, 12590, 12592, 12594, 12596, 12598, 12600, 
+    12602, 12604, 12606, 12608, 12610, 12612, 12614, 12616, 12618, 12620, 
+    12622, 12624, 12626, 12628, 12630, 12632, 0, 12634, 12636, 0, 12638, 0, 
+    0, 12640, 0, 12642, 12644, 12646, 12648, 12650, 12652, 12654, 12656, 
+    12658, 12660, 0, 12662, 12664, 12666, 12668, 0, 12670, 0, 12672, 0, 0, 0, 
+    0, 0, 0, 12674, 0, 0, 0, 0, 12676, 0, 12678, 0, 12680, 0, 12682, 12684, 
+    12686, 0, 12688, 12690, 0, 12692, 0, 0, 12694, 0, 12696, 0, 12698, 0, 
+    12700, 0, 12702, 0, 12704, 12706, 0, 12708, 0, 0, 12710, 12712, 12714, 
+    12716, 0, 12718, 12720, 12722, 12724, 12726, 12728, 12730, 0, 12732, 
+    12734, 12736, 12738, 0, 12740, 12742, 12744, 12746, 0, 12748, 0, 12750, 
+    12752, 12754, 12756, 12758, 12760, 12762, 12764, 12766, 12768, 0, 12770, 
+    12772, 12774, 12776, 12778, 12780, 12782, 12784, 12786, 12788, 12790, 
+    12792, 12794, 12796, 12798, 12800, 12802, 0, 0, 0, 0, 0, 12804, 12806, 
+    12808, 0, 12810, 12812, 12814, 12816, 12818, 0, 12820, 12822, 12824, 
+    12826, 12828, 12830, 12832, 12834, 12836, 12838, 12840, 12842, 12844, 
+    12846, 12848, 12850, 12852, 0, 0, 0, 0, 12854, 12857, 12860, 12863, 
+    12866, 12869, 12872, 12875, 12878, 12881, 12884, 0, 0, 0, 0, 0, 12887, 
+    12891, 12895, 12899, 12903, 12907, 12911, 12915, 12919, 12923, 12927, 
+    12931, 12935, 12939, 12943, 12947, 12951, 12955, 12959, 12963, 12967, 
+    12971, 12975, 12979, 12983, 12987, 12991, 12995, 12997, 12999, 13002, 0, 
+    13005, 13007, 13009, 13011, 13013, 13015, 13017, 13019, 13021, 13023, 
+    13025, 13027, 13029, 13031, 13033, 13035, 13037, 13039, 13041, 13043, 
+    13045, 13047, 13049, 13051, 13053, 13055, 13057, 13060, 13063, 13066, 
+    13069, 13073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13076, 13079, 0, 0, 0, 0, 
+    13082, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13085, 13088, 13091, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13093, 13095, 13097, 13099, 13101, 
+    13103, 13105, 13107, 13109, 13111, 13113, 13115, 13117, 13119, 13121, 
+    13123, 13125, 13127, 13129, 13131, 13133, 13135, 13137, 13139, 13141, 
+    13143, 13145, 13147, 13149, 13151, 13153, 13155, 13157, 13159, 13161, 
+    13163, 13165, 13167, 13169, 13171, 13173, 13175, 13177, 13179, 0, 0, 0, 
+    0, 13181, 13185, 13189, 13193, 13197, 13201, 13205, 13209, 13213, 0, 0, 
+    0, 0, 0, 0, 0, 13217, 13219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    13221, 13223, 13225, 13227, 13230, 13232, 13234, 13236, 13238, 13240, 
+    13242, 13244, 13246, 13248, 13251, 13253, 13255, 13257, 13259, 13262, 
+    13264, 13266, 13268, 13271, 13273, 13275, 13277, 13279, 13281, 13284, 
+    13286, 13288, 13290, 13292, 13294, 13296, 13298, 13300, 13302, 13304, 
+    13306, 13308, 13310, 13312, 13314, 13316, 13318, 13320, 13322, 13324, 
+    13326, 13328, 13330, 13333, 13335, 13337, 13339, 13342, 13344, 13346, 
+    13348, 13350, 13352, 13354, 13356, 13358, 13360, 13362, 13364, 13366, 
+    13368, 13370, 13372, 13374, 13376, 13378, 13380, 13382, 13384, 13386, 
+    13388, 13390, 13392, 13394, 13396, 13398, 13400, 13402, 13404, 13406, 
+    13409, 13411, 13413, 13415, 13417, 13419, 13421, 13424, 13427, 13429, 
+    13431, 13433, 13435, 13437, 13439, 13441, 13443, 13445, 13447, 13450, 
+    13452, 13454, 13456, 13458, 13461, 13463, 13465, 13467, 13469, 13471, 
+    13473, 13475, 13477, 13479, 13482, 13484, 13487, 13489, 13491, 13493, 
+    13495, 13497, 13499, 13501, 13503, 13505, 13507, 13509, 13512, 13514, 
+    13516, 13518, 13520, 13522, 13525, 13527, 13530, 13533, 13535, 13537, 
+    13539, 13541, 13544, 13547, 13549, 13551, 13553, 13555, 13557, 13559, 
+    13561, 13563, 13565, 13567, 13569, 13572, 13574, 13576, 13578, 13580, 
+    13582, 13584, 13586, 13588, 13590, 13592, 13594, 13596, 13598, 13600, 
+    13602, 13604, 13606, 13608, 13610, 13613, 13615, 13617, 13619, 13621, 
+    13623, 13626, 13628, 13630, 13632, 13634, 13636, 13638, 13640, 13642, 
+    13644, 13646, 13648, 13651, 13653, 13655, 13657, 13659, 13661, 13663, 
+    13665, 13667, 13669, 13671, 13673, 13675, 13677, 13679, 13681, 13683, 
+    13685, 13687, 13690, 13692, 13694, 13696, 13698, 13700, 13703, 13705, 
+    13707, 13709, 13711, 13713, 13715, 13717, 13719, 13722, 13724, 13726, 
+    13728, 13731, 13733, 13735, 13737, 13739, 13741, 13743, 13746, 13749, 
+    13752, 13754, 13757, 13759, 13761, 13763, 13765, 13767, 13769, 13771, 
+    13773, 13775, 13777, 13780, 13782, 13784, 13786, 13788, 13790, 13792, 
+    13795, 13797, 13799, 13802, 13805, 13807, 13809, 13811, 13813, 13815, 
+    13817, 13819, 13821, 13823, 13826, 13828, 13831, 13833, 13836, 13838, 
+    13840, 13842, 13845, 13847, 13849, 13852, 13855, 13857, 13859, 13861, 
+    13863, 13865, 13867, 13869, 13871, 13873, 13875, 13877, 13879, 13881, 
+    13884, 13886, 13889, 13891, 13894, 13896, 13899, 13902, 13905, 13907, 
+    13909, 13911, 13914, 13917, 13920, 13923, 13925, 13927, 13929, 13931, 
+    13933, 13935, 13937, 13939, 13942, 13944, 13946, 13948, 13950, 13953, 
+    13955, 13958, 13961, 13963, 13965, 13967, 13969, 13971, 13973, 13976, 
+    13979, 13982, 13984, 13986, 13989, 13991, 13993, 13995, 13998, 14000, 
+    14002, 14004, 14006, 14008, 14011, 14013, 14015, 14017, 14019, 14021, 
+    14023, 14026, 14029, 14031, 14034, 14036, 14039, 14041, 14043, 14045, 
+    14048, 14051, 14053, 14056, 14058, 14061, 14063, 14065, 14067, 14069, 
+    14071, 14073, 14076, 14079, 14082, 14085, 14087, 14089, 14091, 14093, 
+    14095, 14097, 14099, 14101, 14103, 14105, 14107, 14109, 14112, 14114, 
+    14116, 14118, 14120, 14122, 14124, 14126, 14128, 14130, 14132, 14134, 
+    14136, 14139, 14142, 14145, 14147, 14149, 14151, 14153, 14156, 14158, 
+    14161, 14163, 14165, 14168, 14171, 14173, 14175, 14177, 14179, 14181, 
+    14183, 14185, 14187, 14189, 14191, 14193, 14195, 14197, 14199, 14201, 
+    14203, 14205, 14207, 14209, 14212, 14214, 14216, 14218, 14220, 14222, 
+    14225, 14228, 14230, 14232, 14234, 14236, 14238, 14240, 14243, 14245, 
+    14247, 14249, 14251, 14254, 14257, 14259, 14261, 14263, 14266, 14268, 
+    14270, 14273, 14276, 14278, 14280, 14282, 14285, 14287, 14289, 14291, 
+    14293, 14295, 14297, 14299, 14302, 14304, 14306, 14308, 14311, 14313, 
+    14315, 14317, 14319, 14322, 14325, 14327, 14329, 14331, 14334, 14336, 
+    14339, 14341, 14343, 14345, 14348, 14350, 14352, 14354, 14356, 14358, 
+    14360, 14362, 14365, 14367, 14369, 14371, 14373, 14375, 14377, 14380, 
+    14382, 14385, 14388, 14391, 14393, 14395, 14397, 14399, 14401, 14403, 
+    14405, 14407, 0, 0, 
+};
+
+/* NFC pairs */
+#define COMP_SHIFT1 2
+#define COMP_SHIFT2 1
+static const unsigned short comp_index0[] = {
+    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 
+    5, 6, 7, 0, 0, 0, 0, 8, 0, 9, 10, 0, 0, 0, 11, 12, 13, 14, 0, 0, 0, 0, 0, 
+    15, 16, 17, 0, 0, 0, 0, 18, 19, 20, 21, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 
+    23, 24, 25, 26, 0, 0, 0, 0, 27, 28, 29, 30, 0, 0, 0, 0, 31, 32, 33, 34, 
+    0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 36, 0, 37, 38, 39, 0, 0, 0, 40, 41, 42, 
+    43, 0, 0, 0, 0, 44, 45, 46, 0, 0, 0, 0, 0, 47, 48, 49, 50, 0, 0, 0, 51, 
+    52, 53, 54, 0, 0, 0, 0, 55, 56, 0, 0, 0, 0, 0, 0, 57, 58, 59, 60, 0, 0, 
+    0, 0, 61, 62, 63, 0, 0, 0, 0, 0, 64, 65, 66, 67, 0, 0, 0, 68, 69, 70, 71, 
+    0, 0, 0, 0, 72, 0, 73, 0, 0, 0, 0, 0, 74, 0, 75, 0, 0, 0, 0, 0, 76, 0, 0, 
+    0, 0, 0, 0, 77, 78, 79, 0, 0, 0, 0, 0, 80, 81, 82, 83, 0, 0, 0, 0, 84, 
+    85, 86, 0, 0, 0, 0, 0, 87, 88, 0, 89, 0, 0, 0, 90, 91, 0, 92, 0, 0, 0, 0, 
+    0, 93, 94, 95, 0, 0, 0, 0, 96, 97, 98, 99, 0, 0, 0, 0, 100, 0, 0, 0, 0, 
+    0, 0, 101, 102, 0, 103, 0, 0, 0, 0, 104, 105, 106, 107, 0, 0, 0, 0, 108, 
+    109, 110, 111, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 114, 115, 116, 117, 
+    0, 0, 0, 0, 118, 119, 120, 121, 0, 0, 0, 0, 122, 0, 123, 0, 0, 0, 0, 124, 
+    125, 126, 127, 128, 0, 0, 0, 129, 130, 131, 132, 0, 0, 0, 0, 133, 134, 0, 
+    0, 0, 0, 0, 0, 135, 136, 137, 138, 0, 0, 0, 139, 140, 141, 142, 0, 0, 0, 
+    0, 0, 143, 144, 145, 0, 0, 0, 0, 146, 147, 148, 149, 0, 0, 0, 0, 150, 0, 
+    151, 0, 0, 0, 0, 152, 153, 154, 0, 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 
+    156, 157, 158, 0, 0, 0, 0, 0, 159, 160, 161, 162, 0, 0, 0, 163, 0, 0, 0, 
+    164, 0, 0, 0, 165, 166, 0, 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 168, 
+    0, 0, 0, 0, 0, 0, 169, 170, 0, 0, 0, 0, 0, 0, 171, 0, 0, 0, 0, 0, 0, 0, 
+    172, 173, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 175, 176, 0, 0, 0, 0, 
+    0, 0, 177, 178, 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 
+    0, 0, 0, 181, 182, 183, 0, 0, 0, 0, 0, 184, 185, 0, 0, 0, 0, 0, 0, 186, 
+    0, 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 188, 189, 0, 0, 0, 0, 0, 0, 
+    190, 0, 0, 0, 0, 0, 0, 0, 191, 192, 0, 0, 0, 0, 0, 0, 193, 0, 0, 0, 0, 0, 
+    0, 194, 195, 0, 0, 0, 0, 0, 0, 196, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 
+    0, 0, 0, 0, 199, 0, 0, 0, 0, 0, 0, 200, 201, 202, 0, 0, 0, 0, 0, 203, 
+    204, 0, 0, 0, 0, 0, 0, 205, 206, 0, 0, 0, 0, 0, 0, 207, 0, 0, 0, 0, 0, 0, 
+    208, 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 0, 0, 0, 0, 210, 0, 0, 0, 0, 0, 
+    0, 0, 211, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 
+    0, 0, 0, 0, 214, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 
+    0, 0, 0, 0, 0, 217, 0, 0, 0, 0, 0, 0, 0, 218, 0, 0, 0, 0, 0, 0, 219, 0, 
+    0, 0, 0, 0, 0, 220, 221, 222, 0, 0, 0, 0, 0, 223, 224, 225, 0, 0, 0, 0, 
+    0, 226, 227, 228, 0, 0, 0, 0, 0, 229, 230, 231, 0, 0, 0, 0, 0, 0, 232, 0, 
+    0, 0, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 235, 0, 
+    0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, 0, 0, 0, 0, 238, 
+    0, 0, 0, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 
+    241, 0, 0, 0, 0, 0, 0, 242, 0, 243, 244, 0, 0, 0, 0, 245, 246, 0, 0, 0, 
+    0, 0, 247, 0, 248, 0, 249, 0, 0, 0, 250, 251, 252, 0, 0, 0, 0, 0, 253, 0, 
+    254, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 256, 257, 258, 0, 0, 0, 0, 0, 
+    259, 0, 260, 0, 261, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 263, 0, 
+    0, 0, 264, 265, 266, 0, 267, 0, 0, 0, 268, 0, 269, 0, 0, 0, 0, 0, 270, 0, 
+    271, 272, 0, 0, 0, 0, 273, 274, 0, 275, 0, 0, 0, 276, 0, 277, 0, 0, 0, 0, 
+    0, 0, 0, 278, 0, 0, 0, 0, 0, 279, 280, 281, 282, 0, 0, 0, 0, 283, 284, 0, 
+    285, 0, 0, 0, 286, 0, 0, 0, 287, 0, 0, 0, 288, 0, 0, 0, 289, 0, 0, 0, 0, 
+    0, 0, 290, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 
+    0, 293, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 295, 0, 0, 0, 0, 0, 
+    0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, 298, 299, 0, 0, 0, 
+    0, 0, 0, 300, 0, 0, 0, 0, 0, 0, 0, 301, 0, 0, 0, 0, 0, 0, 0, 302, 0, 0, 
+    0, 0, 0, 0, 0, 303, 0, 0, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 305, 0, 
+    0, 0, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 0, 307, 0, 0, 0, 0, 0, 0, 0, 308, 
+    0, 0, 0, 0, 0, 0, 0, 309, 0, 0, 0, 0, 0, 0, 0, 310, 0, 0, 0, 0, 0, 0, 
+    311, 312, 0, 0, 0, 0, 0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 314, 0, 0, 0, 0, 0, 
+    0, 0, 315, 0, 0, 0, 0, 0, 0, 0, 316, 0, 0, 0, 0, 0, 0, 317, 0, 0, 0, 0, 
+    0, 0, 0, 318, 0, 0, 0, 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 320, 0, 0, 
+    0, 0, 0, 0, 0, 321, 0, 0, 0, 0, 0, 0, 322, 0, 0, 0, 0, 0, 0, 0, 323, 0, 
+    0, 0, 0, 0, 0, 0, 324, 0, 0, 0, 0, 0, 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 326, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 
+    0, 0, 329, 0, 0, 0, 0, 0, 0, 0, 330, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 
+    0, 0, 0, 0, 332, 0, 0, 0, 0, 0, 0, 0, 333, 0, 0, 0, 0, 0, 0, 334, 0, 0, 
+    0, 0, 0, 0, 0, 335, 0, 0, 0, 0, 0, 0, 0, 336, 337, 0, 0, 0, 0, 0, 0, 0, 
+    338, 0, 0, 0, 0, 0, 0, 339, 0, 0, 0, 0, 0, 0, 0, 340, 0, 0, 0, 0, 0, 0, 
+    0, 341, 0, 0, 0, 0, 0, 0, 0, 342, 0, 0, 0, 0, 0, 0, 0, 343, 0, 0, 0, 0, 
+    0, 0, 344, 0, 0, 0, 0, 0, 0, 0, 345, 346, 0, 0, 0, 0, 0, 0, 347, 0, 0, 0, 
+    0, 0, 0, 0, 348, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 350, 0, 
+    0, 0, 0, 0, 0, 0, 351, 0, 0, 0, 0, 0, 0, 0, 352, 0, 0, 0, 0, 0, 0, 353, 
+    0, 0, 0, 0, 0, 0, 0, 354, 0, 0, 0, 0, 0, 0, 0, 355, 0, 0, 0, 0, 0, 0, 0, 
+    356, 0, 0, 0, 0, 0, 0, 357, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 
+    0, 359, 0, 0, 0, 0, 0, 0, 0, 360, 0, 0, 0, 0, 0, 0, 361, 0, 362, 0, 0, 0, 
+    0, 0, 0, 0, 363, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 365, 0, 
+    0, 0, 0, 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, 367, 0, 0, 0, 0, 0, 0, 0, 368, 
+    0, 0, 0, 0, 0, 0, 369, 370, 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, 0, 0, 0, 0, 
+    372, 0, 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, 0, 0, 
+    0, 375, 0, 0, 376, 0, 0, 0, 0, 377, 0, 0, 378, 0, 0, 0, 0, 0, 0, 0, 379, 
+    0, 0, 0, 0, 0, 0, 0, 380, 0, 0, 0, 0, 0, 0, 381, 0, 0, 0, 0, 0, 0, 0, 
+    382, 0, 0, 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, 0, 0, 0, 384, 0, 0, 0, 385, 0, 
+    0, 386, 0, 0, 0, 0, 387, 0, 0, 388, 0, 0, 0, 0, 0, 0, 0, 389, 0, 0, 0, 0, 
+    0, 0, 0, 390, 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0, 0, 392, 0, 0, 0, 
+    0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, 394, 0, 0, 0, 395, 0, 0, 0, 0, 0, 
+    0, 0, 396, 0, 0, 0, 0, 0, 0, 397, 0, 0, 0, 0, 0, 0, 0, 398, 0, 0, 0, 0, 
+    0, 0, 0, 399, 0, 0, 400, 0, 0, 0, 0, 401, 0, 0, 402, 0, 0, 0, 0, 0, 0, 0, 
+    403, 0, 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 0, 405, 0, 0, 0, 0, 0, 0, 
+    0, 406, 0, 0, 0, 0, 0, 0, 0, 407, 0, 0, 0, 0, 0, 0, 0, 408, 0, 0, 0, 409, 
+    0, 0, 410, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 0, 0, 0, 0, 413, 0, 0, 0, 
+    0, 0, 0, 0, 414, 0, 0, 0, 0, 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, 
+    0, 0, 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, 419, 0, 0, 420, 0, 
+    0, 0, 0, 421, 0, 0, 422, 0, 0, 0, 423, 0, 0, 0, 424, 0, 0, 0, 425, 0, 0, 
+    0, 426, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 428, 0, 0, 0, 0, 0, 0, 429, 0, 
+    0, 0, 0, 0, 0, 0, 430, 0, 0, 0, 0, 0, 0, 0, 431, 0, 0, 432, 0, 0, 0, 0, 
+    433, 0, 0, 434, 0, 0, 0, 435, 0, 0, 0, 436, 0, 0, 0, 437, 0, 0, 0, 438, 
+    0, 0, 0, 439, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 441, 0, 0, 0, 0, 0, 0, 0, 
+    442, 0, 0, 0, 0, 0, 0, 0, 443, 0, 0, 0, 0, 0, 0, 444, 0, 0, 0, 0, 0, 0, 
+    0, 445, 0, 0, 0, 0, 0, 0, 0, 446, 0, 0, 0, 447, 0, 0, 0, 448, 0, 0, 0, 
+    449, 0, 0, 450, 0, 0, 0, 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, 0, 0, 452, 0, 0, 
+    0, 0, 0, 0, 0, 453, 0, 0, 0, 0, 0, 0, 454, 0, 0, 0, 0, 0, 0, 0, 455, 0, 
+    0, 0, 0, 0, 0, 0, 456, 0, 0, 0, 0, 0, 0, 0, 457, 0, 0, 0, 0, 0, 0, 458, 
+    0, 0, 0, 0, 0, 0, 0, 459, 0, 0, 0, 0, 0, 0, 0, 460, 0, 0, 0, 461, 0, 0, 
+    0, 462, 0, 0, 0, 0, 0, 0, 463, 0, 0, 0, 0, 0, 0, 0, 464, 0, 0, 0, 465, 0, 
+    0, 0, 466, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 0, 468, 0, 0, 0, 0, 
+    0, 0, 0, 469, 0, 0, 0, 0, 0, 0, 0, 470, 0, 0, 0, 0, 0, 0, 471, 0, 0, 0, 
+    0, 0, 0, 0, 472, 0, 0, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, 0, 0, 0, 474, 0, 
+    0, 0, 0, 0, 0, 475, 0, 0, 0, 0, 0, 0, 0, 476, 0, 0, 0, 0, 0, 0, 0, 477, 
+    0, 0, 0, 0, 0, 0, 0, 478, 0, 0, 0, 0, 0, 0, 479, 0, 0, 0, 0, 0, 0, 0, 
+    480, 0, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, 
+    0, 483, 0, 0, 0, 0, 0, 0, 0, 484, 0, 0, 0, 0, 0, 0, 0, 485, 0, 0, 0, 0, 
+    0, 0, 0, 486, 0, 0, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 488, 0, 0, 0, 
+    0, 0, 0, 0, 489, 0, 0, 0, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 0, 491, 0, 0, 
+    0, 0, 0, 0, 0, 492, 0, 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, 0, 494, 
+    0, 0, 0, 0, 0, 0, 495, 0, 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0, 0, 
+    497, 0, 0, 0, 0, 0, 0, 0, 498, 0, 0, 0, 0, 0, 0, 499, 0, 0, 0, 0, 0, 0, 
+    0, 500, 0, 0, 0, 0, 0, 0, 0, 501, 0, 0, 0, 0, 0, 0, 0, 502, 0, 0, 0, 0, 
+    0, 0, 503, 0, 0, 0, 0, 0, 0, 0, 504, 0, 0, 0, 0, 0, 0, 0, 505, 0, 0, 0, 
+    0, 0, 0, 0, 506, 0, 0, 0, 0, 0, 0, 507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    508, 0, 0, 0, 0, 0, 0, 0, 509, 0, 0, 0, 0, 0, 0, 0, 510, 0, 0, 0, 0, 0, 
+    0, 0, 511, 0, 0, 0, 0, 0, 0, 512, 0, 0, 0, 0, 0, 0, 0, 513, 0, 0, 0, 0, 
+    0, 0, 0, 514, 0, 0, 0, 0, 0, 0, 0, 515, 0, 0, 0, 0, 0, 0, 516, 0, 0, 0, 
+    0, 0, 0, 0, 517, 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, 0, 0, 0, 0, 0, 519, 0, 
+    0, 0, 0, 0, 0, 520, 0, 0, 0, 0, 0, 0, 0, 521, 0, 0, 0, 0, 0, 0, 0, 522, 
+    0, 0, 0, 0, 0, 0, 0, 523, 0, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 0, 0, 
+    525, 0, 0, 0, 0, 0, 0, 0, 526, 0, 0, 0, 0, 0, 0, 0, 527, 0, 0, 0, 0, 0, 
+    0, 528, 0, 0, 0, 0, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 0, 530, 0, 0, 0, 0, 
+    0, 0, 0, 531, 0, 0, 0, 0, 0, 0, 532, 0, 0, 0, 0, 0, 0, 0, 533, 0, 0, 0, 
+    0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 535, 0, 0, 0, 0, 0, 0, 536, 0, 0, 
+    0, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 538, 0, 0, 0, 0, 0, 0, 0, 539, 
+    0, 0, 0, 0, 0, 0, 540, 0, 0, 0, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 
+    542, 0, 0, 0, 0, 0, 0, 0, 543, 0, 0, 0, 0, 0, 0, 544, 0, 0, 0, 0, 0, 0, 
+    0, 545, 0, 0, 0, 0, 0, 0, 0, 546, 0, 0, 0, 0, 0, 0, 0, 547, 0, 0, 0, 0, 
+    0, 0, 548, 0, 0, 0, 0, 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, 550, 0, 0, 0, 
+    0, 0, 0, 0, 551, 0, 0, 0, 0, 0, 0, 552, 0, 0, 0, 0, 0, 0, 0, 553, 0, 0, 
+    0, 0, 0, 0, 0, 554, 0, 0, 0, 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, 556, 
+    0, 0, 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 
+    559, 0, 0, 0, 0, 0, 0, 0, 560, 0, 0, 0, 0, 0, 0, 0, 561, 0, 0, 0, 0, 0, 
+    0, 0, 562, 0, 0, 0, 0, 0, 0, 0, 563, 0, 0, 0, 0, 0, 0, 564, 
+};
+
+static const unsigned short comp_index1[] = {
+    0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, 
+    0, 11, 12, 0, 13, 0, 0, 0, 0, 0, 0, 14, 15, 0, 0, 0, 0, 16, 0, 0, 0, 0, 
+    0, 17, 18, 0, 19, 0, 20, 0, 0, 0, 0, 21, 0, 0, 0, 22, 0, 23, 0, 0, 24, 0, 
+    25, 26, 0, 27, 0, 28, 29, 30, 31, 32, 33, 34, 0, 35, 0, 36, 37, 38, 0, 0, 
+    0, 0, 0, 39, 0, 0, 0, 40, 41, 42, 43, 0, 44, 0, 0, 0, 0, 45, 0, 0, 0, 0, 
+    0, 46, 0, 47, 0, 48, 0, 0, 49, 0, 50, 0, 51, 0, 0, 52, 53, 54, 55, 56, 
+    57, 58, 0, 59, 0, 0, 60, 61, 0, 0, 0, 62, 0, 0, 0, 0, 0, 63, 64, 0, 0, 
+    65, 0, 66, 0, 0, 67, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 69, 0, 0, 70, 0, 71, 
+    72, 0, 73, 0, 74, 0, 0, 75, 0, 0, 0, 0, 76, 0, 0, 77, 78, 0, 79, 0, 80, 
+    0, 0, 81, 0, 82, 83, 0, 84, 0, 0, 0, 0, 0, 85, 86, 87, 88, 89, 90, 91, 0, 
+    92, 0, 0, 93, 0, 0, 0, 94, 0, 0, 95, 0, 0, 0, 96, 0, 0, 97, 0, 98, 99, 0, 
+    100, 0, 101, 0, 0, 102, 0, 103, 104, 0, 105, 0, 106, 0, 0, 107, 0, 108, 
+    0, 0, 0, 109, 0, 110, 0, 0, 111, 0, 112, 113, 0, 114, 0, 0, 0, 0, 0, 115, 
+    116, 117, 118, 119, 120, 121, 0, 122, 123, 0, 124, 125, 0, 0, 0, 126, 0, 
+    0, 127, 0, 0, 128, 129, 0, 130, 131, 0, 0, 0, 0, 0, 132, 0, 0, 0, 133, 
+    134, 135, 136, 137, 0, 0, 0, 138, 0, 0, 139, 140, 0, 141, 0, 142, 0, 0, 
+    143, 0, 0, 0, 0, 144, 0, 145, 146, 147, 148, 149, 150, 151, 0, 152, 153, 
+    0, 154, 0, 0, 155, 0, 0, 0, 0, 156, 157, 0, 0, 0, 0, 0, 158, 159, 0, 160, 
+    0, 161, 162, 0, 0, 0, 163, 0, 164, 0, 0, 165, 0, 166, 167, 0, 168, 0, 
+    169, 170, 171, 172, 173, 174, 175, 0, 176, 0, 177, 178, 179, 0, 0, 0, 0, 
+    0, 180, 0, 0, 0, 181, 182, 183, 184, 0, 185, 186, 0, 0, 0, 0, 0, 187, 0, 
+    188, 0, 189, 0, 0, 190, 0, 191, 0, 192, 193, 0, 194, 195, 196, 197, 198, 
+    199, 200, 0, 201, 0, 0, 202, 203, 0, 0, 0, 204, 0, 0, 0, 205, 0, 0, 0, 0, 
+    0, 206, 0, 0, 0, 0, 207, 0, 0, 208, 0, 209, 0, 0, 210, 0, 211, 0, 0, 0, 
+    0, 212, 0, 0, 213, 0, 214, 215, 0, 216, 0, 217, 0, 0, 218, 219, 0, 0, 0, 
+    0, 0, 0, 220, 221, 0, 222, 0, 223, 0, 0, 224, 0, 225, 226, 0, 227, 0, 0, 
+    0, 0, 0, 228, 229, 230, 231, 232, 233, 234, 0, 235, 0, 0, 236, 0, 0, 0, 
+    237, 0, 0, 238, 0, 0, 0, 239, 0, 0, 240, 0, 241, 242, 0, 243, 0, 244, 0, 
+    0, 245, 0, 0, 0, 0, 0, 246, 247, 0, 248, 0, 249, 0, 0, 250, 0, 251, 0, 0, 
+    0, 252, 0, 253, 0, 0, 254, 0, 255, 256, 0, 257, 0, 258, 259, 260, 261, 
+    262, 263, 264, 0, 265, 266, 0, 267, 268, 0, 0, 0, 269, 0, 0, 270, 0, 0, 
+    0, 0, 0, 0, 271, 272, 0, 273, 274, 0, 0, 0, 275, 0, 276, 0, 0, 0, 277, 
+    278, 279, 280, 281, 0, 0, 0, 282, 0, 0, 283, 284, 0, 285, 0, 286, 0, 0, 
+    287, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 289, 0, 290, 0, 0, 0, 0, 291, 292, 
+    0, 0, 293, 0, 0, 0, 0, 294, 295, 0, 0, 0, 0, 0, 0, 296, 0, 297, 0, 0, 0, 
+    0, 298, 0, 0, 299, 300, 0, 0, 301, 0, 0, 302, 0, 0, 0, 0, 0, 0, 303, 304, 
+    0, 0, 305, 0, 0, 306, 0, 307, 308, 0, 0, 0, 0, 0, 309, 310, 0, 0, 0, 0, 
+    0, 0, 311, 0, 312, 0, 0, 313, 0, 0, 0, 0, 0, 314, 315, 0, 0, 316, 0, 0, 
+    0, 0, 317, 318, 0, 0, 0, 0, 0, 0, 319, 0, 320, 0, 0, 0, 0, 321, 0, 0, 
+    322, 323, 0, 0, 324, 0, 0, 325, 0, 0, 0, 0, 0, 0, 326, 327, 0, 0, 328, 0, 
+    0, 329, 0, 330, 331, 0, 0, 0, 0, 0, 332, 333, 0, 0, 0, 0, 0, 0, 334, 0, 
+    335, 0, 0, 336, 0, 0, 0, 0, 0, 337, 338, 0, 0, 339, 0, 0, 340, 341, 0, 0, 
+    342, 0, 0, 343, 0, 0, 0, 0, 0, 0, 344, 0, 0, 345, 0, 0, 346, 0, 0, 0, 0, 
+    0, 347, 0, 0, 348, 0, 0, 349, 0, 0, 350, 0, 0, 0, 351, 0, 0, 0, 0, 0, 0, 
+    352, 0, 353, 0, 0, 354, 0, 0, 0, 0, 0, 0, 355, 0, 0, 0, 356, 357, 0, 0, 
+    358, 0, 0, 0, 359, 0, 0, 360, 361, 0, 0, 362, 0, 0, 0, 363, 0, 0, 364, 
+    365, 0, 0, 366, 0, 0, 0, 367, 0, 0, 368, 369, 0, 0, 370, 0, 0, 0, 371, 0, 
+    0, 0, 372, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 374, 0, 0, 375, 0, 0, 376, 0, 
+    0, 377, 0, 0, 0, 0, 0, 0, 378, 0, 0, 379, 0, 0, 380, 0, 0, 0, 0, 0, 381, 
+    0, 382, 0, 383, 384, 0, 0, 0, 0, 0, 0, 385, 386, 0, 0, 0, 0, 0, 0, 387, 
+    0, 0, 0, 388, 0, 0, 389, 0, 0, 390, 0, 0, 0, 0, 391, 0, 392, 393, 0, 0, 
+    0, 394, 0, 0, 0, 395, 0, 0, 396, 0, 0, 0, 0, 0, 0, 397, 0, 0, 0, 398, 0, 
+    399, 400, 0, 0, 0, 401, 0, 0, 0, 402, 0, 0, 403, 0, 0, 404, 0, 0, 0, 0, 
+    0, 0, 405, 0, 0, 406, 0, 0, 0, 0, 407, 0, 408, 0, 0, 0, 0, 409, 0, 0, 
+    410, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 414, 0, 0, 0, 0, 0, 
+    0, 415, 416, 0, 417, 418, 0, 0, 0, 419, 0, 0, 420, 0, 0, 0, 0, 421, 0, 0, 
+    422, 0, 0, 423, 0, 0, 0, 424, 0, 425, 426, 0, 0, 0, 427, 0, 0, 0, 0, 0, 
+    0, 428, 429, 0, 0, 0, 0, 0, 0, 430, 0, 0, 431, 0, 0, 0, 0, 432, 0, 433, 
+    0, 0, 0, 0, 434, 0, 435, 0, 0, 0, 0, 0, 0, 436, 437, 0, 0, 438, 0, 0, 
+    439, 0, 440, 441, 0, 0, 0, 442, 0, 0, 443, 0, 444, 445, 0, 446, 447, 0, 
+    0, 448, 0, 0, 0, 449, 0, 450, 451, 0, 0, 0, 452, 0, 0, 0, 0, 0, 453, 0, 
+    454, 455, 0, 456, 457, 0, 0, 0, 0, 0, 0, 458, 0, 0, 459, 0, 460, 461, 0, 
+    0, 0, 462, 0, 0, 463, 0, 464, 465, 0, 466, 467, 0, 0, 468, 0, 0, 0, 469, 
+    0, 470, 471, 0, 0, 0, 472, 0, 0, 0, 0, 0, 473, 0, 474, 475, 0, 476, 477, 
+    0, 0, 0, 0, 0, 0, 478, 0, 0, 479, 0, 0, 480, 0, 0, 0, 0, 0, 481, 0, 0, 
+    482, 0, 0, 0, 483, 0, 0, 484, 0, 0, 485, 0, 0, 0, 0, 0, 0, 486, 0, 0, 
+    487, 488, 0, 489, 0, 0, 490, 0, 0, 0, 0, 0, 0, 491, 0, 0, 492, 0, 0, 493, 
+    0, 0, 0, 494, 0, 0, 495, 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 497, 0, 0, 0, 
+    498, 499, 0, 0, 0, 500, 0, 0, 0, 0, 0, 501, 502, 0, 503, 0, 0, 0, 504, 0, 
+    0, 0, 505, 0, 0, 506, 507, 0, 0, 0, 0, 0, 508, 0, 0, 0, 509, 510, 0, 0, 
+    0, 0, 0, 511, 0, 0, 0, 512, 513, 0, 514, 0, 0, 0, 0, 515, 0, 0, 516, 0, 
+    0, 517, 0, 0, 0, 0, 0, 0, 518, 0, 0, 519, 0, 0, 520, 0, 0, 521, 0, 0, 0, 
+    0, 0, 0, 522, 0, 0, 523, 0, 0, 524, 0, 0, 525, 0, 0, 0, 0, 0, 0, 526, 0, 
+    0, 0, 527, 0, 0, 528, 0, 0, 529, 0, 0, 530, 0, 0, 0, 531, 0, 0, 0, 0, 0, 
+    0, 532, 533, 534, 0, 0, 0, 0, 0, 535, 536, 0, 0, 0, 0, 0, 537, 0, 0, 538, 
+    0, 0, 539, 0, 0, 0, 0, 0, 0, 540, 0, 541, 0, 0, 0, 0, 0, 542, 543, 0, 0, 
+    0, 0, 0, 544, 0, 0, 545, 0, 0, 546, 0, 0, 0, 0, 0, 0, 547, 0, 0, 548, 0, 
+    0, 549, 0, 0, 550, 0, 0, 0, 0, 551, 0, 0, 0, 0, 0, 552, 553, 0, 0, 0, 0, 
+    0, 554, 0, 0, 555, 0, 0, 556, 0, 0, 0, 0, 0, 0, 557, 0, 0, 558, 0, 0, 
+    559, 0, 0, 560, 0, 0, 0, 0, 561, 0, 0, 562, 0, 0, 0, 0, 0, 0, 563, 0, 0, 
+    564, 0, 0, 565, 0, 0, 0, 0, 0, 566, 567, 0, 0, 0, 0, 0, 568, 0, 0, 569, 
+    0, 0, 570, 0, 0, 0, 0, 0, 0, 571, 0, 0, 572, 0, 0, 573, 0, 0, 574, 0, 0, 
+    0, 0, 575, 0, 0, 0, 0, 0, 576, 577, 0, 0, 0, 0, 0, 578, 0, 0, 579, 0, 0, 
+    580, 0, 0, 0, 0, 0, 0, 581, 0, 0, 582, 0, 0, 583, 0, 0, 584, 0, 0, 0, 0, 
+    585, 0, 0, 0, 0, 0, 586, 587, 0, 0, 0, 0, 0, 588, 0, 0, 0, 0, 589, 0, 
+    590, 0, 0, 0, 0, 591, 0, 592, 0, 0, 0, 0, 593, 0, 0, 594, 0, 0, 0, 0, 0, 
+    0, 595, 0, 0, 596, 0, 0, 597, 0, 0, 0, 0, 0, 598, 599, 0, 0, 0, 0, 0, 
+    600, 0, 0, 0, 0, 601, 0, 602, 0, 0, 0, 0, 603, 0, 604, 0, 0, 0, 0, 605, 
+    0, 0, 0, 0, 0, 606, 0, 0, 607, 0, 0, 608, 0, 0, 609, 0, 0, 0, 0, 0, 0, 
+    610, 0, 0, 611, 0, 0, 612, 0, 0, 0, 0, 613, 0, 614, 0, 0, 0, 0, 615, 0, 
+    0, 0, 0, 0, 616, 0, 0, 617, 0, 0, 618, 0, 0, 619, 0, 0, 0, 0, 0, 0, 620, 
+    0, 0, 621, 0, 0, 622, 0, 0, 623, 0, 0, 0, 0, 0, 0, 624, 0, 0, 625, 0, 0, 
+    626, 0, 0, 0, 0, 627, 0, 628, 0, 0, 0, 0, 0, 0, 629, 0, 0, 630, 0, 0, 0, 
+    0, 631, 0, 632, 0, 0, 0, 0, 0, 633, 0, 0, 634, 0, 0, 635, 0, 0, 636, 0, 
+    0, 0, 0, 0, 0, 637, 0, 0, 638, 0, 0, 639, 0, 0, 640, 0, 0, 0, 0, 0, 0, 
+    641, 0, 0, 642, 0, 0, 643, 0, 0, 644, 0, 0, 0, 0, 0, 0, 645, 0, 0, 646, 
+    0, 0, 647, 0, 0, 648, 0, 0, 0, 0, 0, 0, 649, 0, 0, 650, 0, 0, 651, 0, 0, 
+    652, 0, 0, 0, 0, 0, 0, 653, 0, 0, 654, 0, 0, 655, 0, 0, 656, 0, 0, 0, 0, 
+    0, 0, 657, 0, 0, 658, 0, 0, 659, 0, 0, 660, 0, 0, 0, 0, 0, 0, 661, 0, 0, 
+    662, 0, 0, 663, 0, 0, 664, 0, 0, 0, 0, 0, 0, 665, 0, 0, 666, 0, 0, 667, 
+    0, 0, 668, 0, 0, 0, 0, 0, 0, 669, 0, 0, 670, 0, 0, 671, 0, 0, 672, 0, 0, 
+    0, 0, 0, 0, 673, 0, 0, 0, 674, 0, 0, 675, 0, 0, 676, 0, 0, 677, 0, 0, 0, 
+    0, 0, 0, 678, 0, 0, 679, 0, 0, 680, 0, 0, 681, 0, 0, 0, 0, 0, 0, 682, 0, 
+    0, 683, 0, 0, 684, 0, 0, 685, 0, 0, 0, 0, 0, 0, 686, 0, 0, 687, 0, 0, 
+    688, 0, 0, 689, 0, 0, 0, 0, 0, 0, 690, 0, 0, 691, 0, 0, 692, 0, 0, 693, 
+    0, 0, 0, 0, 0, 0, 694, 0, 0, 695, 0, 0, 696, 0, 0, 697, 0, 0, 0, 0, 0, 0, 
+    698, 0, 0, 699, 0, 0, 700, 0, 0, 701, 0, 0, 0, 0, 0, 0, 702, 0, 0, 703, 
+    0, 0, 704, 0, 0, 705, 0, 0, 0, 0, 0, 0, 706, 0, 0, 707, 0, 0, 708, 0, 0, 
+    709, 0, 0, 0, 0, 0, 0, 710, 0, 0, 711, 0, 0, 712, 0, 0, 713, 0, 0, 0, 0, 
+    0, 0, 714, 0, 0, 715, 0, 0, 716, 0, 0, 717, 0, 0, 0, 0, 0, 0, 718, 0, 0, 
+    719, 0, 0, 720, 0, 0, 721, 0, 0, 0, 722, 0, 0, 0, 0, 0, 0, 723, 0, 0, 
+    724, 0, 0, 725, 0, 0, 726, 0, 0, 0, 727, 0, 0, 0, 728, 729, 0, 0, 730, 0, 
+    0, 0, 0, 0, 0, 731, 
+};
+
+static const unsigned int comp_data[] = {
+    0, 0, 0, 8814, 0, 8800, 0, 8815, 192, 193, 194, 195, 256, 258, 550, 196, 
+    7842, 197, 0, 461, 512, 514, 0, 7840, 0, 7680, 260, 0, 7682, 0, 0, 7684, 
+    7686, 0, 0, 262, 264, 0, 266, 0, 0, 268, 0, 199, 7690, 0, 0, 270, 0, 
+    7692, 0, 7696, 0, 7698, 7694, 0, 200, 201, 202, 7868, 274, 276, 278, 203, 
+    7866, 0, 0, 282, 516, 518, 0, 7864, 0, 552, 280, 7704, 0, 7706, 7710, 0, 
+    0, 500, 284, 0, 7712, 286, 288, 0, 0, 486, 0, 290, 292, 0, 7714, 7718, 0, 
+    542, 0, 7716, 0, 7720, 7722, 0, 204, 205, 206, 296, 298, 300, 304, 207, 
+    7880, 0, 0, 463, 520, 522, 0, 7882, 302, 0, 0, 7724, 308, 0, 0, 7728, 0, 
+    488, 0, 7730, 0, 310, 7732, 0, 0, 313, 0, 317, 0, 7734, 0, 315, 0, 7740, 
+    7738, 0, 0, 7742, 7744, 0, 0, 7746, 504, 323, 0, 209, 7748, 0, 0, 327, 0, 
+    7750, 0, 325, 0, 7754, 7752, 0, 210, 211, 212, 213, 332, 334, 558, 214, 
+    7886, 0, 336, 465, 524, 526, 416, 7884, 490, 0, 0, 7764, 7766, 0, 0, 340, 
+    7768, 0, 0, 344, 528, 530, 0, 7770, 0, 342, 7774, 0, 0, 346, 348, 0, 
+    7776, 0, 0, 352, 0, 7778, 536, 350, 7786, 0, 0, 356, 0, 7788, 538, 354, 
+    0, 7792, 7790, 0, 217, 218, 219, 360, 362, 364, 0, 220, 7910, 366, 368, 
+    467, 532, 534, 431, 7908, 7794, 0, 370, 7798, 0, 7796, 0, 7804, 0, 7806, 
+    7808, 7810, 372, 0, 7814, 7812, 0, 7816, 7818, 7820, 7922, 221, 374, 
+    7928, 562, 0, 7822, 376, 7926, 0, 0, 7924, 0, 377, 7824, 0, 379, 0, 0, 
+    381, 0, 7826, 7828, 0, 224, 225, 226, 227, 257, 259, 551, 228, 7843, 229, 
+    0, 462, 513, 515, 0, 7841, 0, 7681, 261, 0, 7683, 0, 0, 7685, 7687, 0, 0, 
+    263, 265, 0, 267, 0, 0, 269, 0, 231, 7691, 0, 0, 271, 0, 7693, 0, 7697, 
+    0, 7699, 7695, 0, 232, 233, 234, 7869, 275, 277, 279, 235, 7867, 0, 0, 
+    283, 517, 519, 0, 7865, 0, 553, 281, 7705, 0, 7707, 7711, 0, 0, 501, 285, 
+    0, 7713, 287, 289, 0, 0, 487, 0, 291, 293, 0, 7715, 7719, 0, 543, 0, 
+    7717, 0, 7721, 7723, 0, 7830, 0, 236, 237, 238, 297, 299, 301, 0, 239, 
+    7881, 0, 0, 464, 521, 523, 0, 7883, 303, 0, 0, 7725, 309, 0, 0, 496, 0, 
+    7729, 0, 489, 0, 7731, 0, 311, 7733, 0, 0, 314, 0, 318, 0, 7735, 0, 316, 
+    0, 7741, 7739, 0, 0, 7743, 7745, 0, 0, 7747, 505, 324, 0, 241, 7749, 0, 
+    0, 328, 0, 7751, 0, 326, 0, 7755, 7753, 0, 242, 243, 244, 245, 333, 335, 
+    559, 246, 7887, 0, 337, 466, 525, 527, 417, 7885, 491, 0, 0, 7765, 7767, 
+    0, 0, 341, 7769, 0, 0, 345, 529, 531, 0, 7771, 0, 343, 7775, 0, 0, 347, 
+    349, 0, 7777, 0, 0, 353, 0, 7779, 537, 351, 7787, 7831, 0, 357, 0, 7789, 
+    539, 355, 0, 7793, 7791, 0, 249, 250, 251, 361, 363, 365, 0, 252, 7911, 
+    367, 369, 468, 533, 535, 432, 7909, 7795, 0, 371, 7799, 0, 7797, 0, 7805, 
+    0, 7807, 7809, 7811, 373, 0, 7815, 7813, 0, 7832, 0, 7817, 7819, 7821, 
+    7923, 253, 375, 7929, 563, 0, 7823, 255, 7927, 7833, 0, 7925, 0, 378, 
+    7825, 0, 380, 0, 0, 382, 0, 7827, 7829, 0, 8173, 901, 8129, 0, 7846, 
+    7844, 0, 7850, 7848, 0, 478, 0, 0, 506, 0, 508, 482, 0, 0, 7688, 7872, 
+    7870, 0, 7876, 7874, 0, 0, 7726, 7890, 7888, 0, 7894, 7892, 0, 0, 7756, 
+    556, 0, 0, 7758, 554, 0, 0, 510, 475, 471, 469, 0, 0, 473, 7847, 7845, 0, 
+    7851, 7849, 0, 479, 0, 0, 507, 0, 509, 483, 0, 0, 7689, 7873, 7871, 0, 
+    7877, 7875, 0, 0, 7727, 7891, 7889, 0, 7895, 7893, 0, 0, 7757, 557, 0, 0, 
+    7759, 555, 0, 0, 511, 476, 472, 470, 0, 0, 474, 7856, 7854, 0, 7860, 
+    7858, 0, 7857, 7855, 0, 7861, 7859, 0, 7700, 7702, 7701, 7703, 7760, 
+    7762, 7761, 7763, 7780, 0, 7781, 0, 7782, 0, 7783, 0, 0, 7800, 0, 7801, 
+    0, 7802, 0, 7803, 7835, 0, 7900, 7898, 0, 7904, 7902, 0, 0, 7906, 7901, 
+    7899, 0, 7905, 7903, 0, 0, 7907, 7914, 7912, 0, 7918, 7916, 0, 0, 7920, 
+    7915, 7913, 0, 7919, 7917, 0, 0, 7921, 0, 494, 492, 0, 493, 0, 480, 0, 
+    481, 0, 0, 7708, 0, 7709, 560, 0, 561, 0, 0, 495, 8122, 902, 8121, 8120, 
+    7944, 7945, 0, 8124, 8136, 904, 7960, 7961, 8138, 905, 7976, 7977, 0, 
+    8140, 8154, 906, 8153, 8152, 0, 938, 7992, 7993, 8184, 908, 8008, 8009, 
+    0, 8172, 8170, 910, 8169, 8168, 0, 939, 0, 8025, 8186, 911, 8040, 8041, 
+    0, 8188, 0, 8116, 0, 8132, 8048, 940, 8113, 8112, 7936, 7937, 8118, 8115, 
+    8050, 941, 7952, 7953, 8052, 942, 7968, 7969, 8134, 8131, 8054, 943, 
+    8145, 8144, 0, 970, 7984, 7985, 8150, 0, 8056, 972, 8000, 8001, 8164, 
+    8165, 8058, 973, 8161, 8160, 0, 971, 8016, 8017, 8166, 0, 8060, 974, 
+    8032, 8033, 8182, 8179, 8146, 912, 8151, 0, 8162, 944, 8167, 0, 0, 8180, 
+    0, 979, 0, 980, 0, 1031, 0, 1232, 0, 1234, 0, 1027, 1024, 0, 0, 1238, 0, 
+    1025, 0, 1217, 0, 1244, 0, 1246, 1037, 0, 1250, 1049, 0, 1252, 0, 1036, 
+    0, 1254, 1262, 1038, 0, 1264, 1266, 0, 0, 1268, 0, 1272, 0, 1260, 0, 
+    1233, 0, 1235, 0, 1107, 1104, 0, 0, 1239, 0, 1105, 0, 1218, 0, 1245, 0, 
+    1247, 1117, 0, 1251, 1081, 0, 1253, 0, 1116, 0, 1255, 1263, 1118, 0, 
+    1265, 1267, 0, 0, 1269, 0, 1273, 0, 1261, 0, 1111, 1142, 0, 1143, 0, 0, 
+    1242, 0, 1243, 0, 1258, 0, 1259, 1570, 1571, 1573, 0, 0, 1572, 0, 1574, 
+    0, 1730, 0, 1747, 0, 1728, 0, 2345, 0, 2353, 0, 2356, 2507, 2508, 2891, 
+    2888, 2892, 0, 2964, 0, 0, 3018, 3020, 0, 0, 3019, 0, 3144, 0, 3264, 
+    3274, 3271, 3272, 0, 0, 3275, 0, 3402, 3404, 0, 0, 3403, 0, 3546, 3548, 
+    3550, 0, 3549, 4134, 0, 0, 6918, 0, 6920, 0, 6922, 0, 6924, 0, 6926, 0, 
+    6930, 0, 6971, 0, 6973, 0, 6976, 0, 6977, 0, 6979, 7736, 0, 7737, 0, 
+    7772, 0, 7773, 0, 7784, 0, 7785, 0, 7852, 0, 0, 7862, 7853, 0, 0, 7863, 
+    7878, 0, 7879, 0, 7896, 0, 7897, 0, 7938, 7940, 7942, 8064, 7939, 7941, 
+    7943, 8065, 0, 8066, 0, 8067, 0, 8068, 0, 8069, 0, 8070, 0, 8071, 7946, 
+    7948, 7950, 8072, 7947, 7949, 7951, 8073, 0, 8074, 0, 8075, 0, 8076, 0, 
+    8077, 0, 8078, 0, 8079, 7954, 7956, 7955, 7957, 7962, 7964, 7963, 7965, 
+    7970, 7972, 7974, 8080, 7971, 7973, 7975, 8081, 0, 8082, 0, 8083, 0, 
+    8084, 0, 8085, 0, 8086, 0, 8087, 7978, 7980, 7982, 8088, 7979, 7981, 
+    7983, 8089, 0, 8090, 0, 8091, 0, 8092, 0, 8093, 0, 8094, 0, 8095, 7986, 
+    7988, 7990, 0, 7987, 7989, 7991, 0, 7994, 7996, 7998, 0, 7995, 7997, 
+    7999, 0, 8002, 8004, 8003, 8005, 8010, 8012, 8011, 8013, 8018, 8020, 
+    8022, 0, 8019, 8021, 8023, 0, 8027, 8029, 8031, 0, 8034, 8036, 8038, 
+    8096, 8035, 8037, 8039, 8097, 0, 8098, 0, 8099, 0, 8100, 0, 8101, 0, 
+    8102, 0, 8103, 8042, 8044, 8046, 8104, 8043, 8045, 8047, 8105, 0, 8106, 
+    0, 8107, 0, 8108, 0, 8109, 0, 8110, 0, 8111, 0, 8114, 0, 8130, 0, 8178, 
+    0, 8119, 8141, 8142, 8143, 0, 0, 8135, 0, 8183, 8157, 8158, 8159, 0, 0, 
+    8602, 0, 8603, 0, 8622, 0, 8653, 0, 8655, 0, 8654, 0, 8708, 0, 8713, 0, 
+    8716, 0, 8740, 0, 8742, 0, 8769, 0, 8772, 0, 8775, 0, 8777, 0, 8813, 0, 
+    8802, 0, 8816, 0, 8817, 0, 8820, 0, 8821, 0, 8824, 0, 8825, 0, 8832, 0, 
+    8833, 0, 8928, 0, 8929, 0, 8836, 0, 8837, 0, 8840, 0, 8841, 0, 8930, 0, 
+    8931, 0, 8876, 0, 8877, 0, 8878, 0, 8879, 0, 8938, 0, 8939, 0, 8940, 0, 
+    8941, 12436, 0, 12364, 0, 12366, 0, 12368, 0, 12370, 0, 12372, 0, 12374, 
+    0, 12376, 0, 12378, 0, 12380, 0, 12382, 0, 12384, 0, 12386, 0, 12389, 0, 
+    12391, 0, 12393, 0, 12400, 12401, 12403, 12404, 12406, 12407, 12409, 
+    12410, 12412, 12413, 12446, 0, 12532, 0, 12460, 0, 12462, 0, 12464, 0, 
+    12466, 0, 12468, 0, 12470, 0, 12472, 0, 12474, 0, 12476, 0, 12478, 0, 
+    12480, 0, 12482, 0, 12485, 0, 12487, 0, 12489, 0, 12496, 12497, 12499, 
+    12500, 12502, 12503, 12505, 12506, 12508, 12509, 12535, 0, 12536, 0, 
+    12537, 0, 12538, 0, 12542, 0, 69786, 0, 69788, 0, 69803, 0, 0, 69934, 0, 
+    69935, 70475, 70476, 70844, 70843, 70846, 0, 0, 71098, 0, 71099, 
+};
+
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-unicode-emoji-table.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-unicode-emoji-table.hh
new file mode 100644
index 0000000..1dd0b32
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-unicode-emoji-table.hh
@@ -0,0 +1,110 @@
+/* == Start of generated table == */
+/*
+ * The following tables are generated by running:
+ *
+ *   ./gen-emoji-table.py emoji-data.txt
+ *
+ * on file with this header:
+ *
+ * # emoji-data.txt
+ * # Date: 2018-02-07, 07:55:18 GMT
+ * # © 2018 Unicode®, Inc.
+ * # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+ * # For terms of use, see http://www.unicode.org/terms_of_use.html
+ * #
+ * # Emoji Data for UTS #51
+ * # Version: 11.0
+ * #
+ * # For documentation and usage, see http://www.unicode.org/reports/tr51
+ */
+
+#ifndef HB_UNICODE_EMOJI_TABLE_HH
+#define HB_UNICODE_EMOJI_TABLE_HH
+
+#include "hb-unicode.hh"
+
+
+static const struct hb_unicode_range_t _hb_unicode_emoji_Extended_Pictographic_table[] =
+{
+  {0x00A9, 0x00A9},
+  {0x00AE, 0x00AE},
+  {0x203C, 0x203C},
+  {0x2049, 0x2049},
+  {0x2122, 0x2122},
+  {0x2139, 0x2139},
+  {0x2194, 0x2199},
+  {0x21A9, 0x21AA},
+  {0x231A, 0x231B},
+  {0x2328, 0x2328},
+  {0x2388, 0x2388},
+  {0x23CF, 0x23CF},
+  {0x23E9, 0x23F3},
+  {0x23F8, 0x23FA},
+  {0x24C2, 0x24C2},
+  {0x25AA, 0x25AB},
+  {0x25B6, 0x25B6},
+  {0x25C0, 0x25C0},
+  {0x25FB, 0x25FE},
+  {0x2600, 0x2605},
+  {0x2607, 0x2612},
+  {0x2614, 0x2685},
+  {0x2690, 0x2705},
+  {0x2708, 0x2712},
+  {0x2714, 0x2714},
+  {0x2716, 0x2716},
+  {0x271D, 0x271D},
+  {0x2721, 0x2721},
+  {0x2728, 0x2728},
+  {0x2733, 0x2734},
+  {0x2744, 0x2744},
+  {0x2747, 0x2747},
+  {0x274C, 0x274C},
+  {0x274E, 0x274E},
+  {0x2753, 0x2755},
+  {0x2757, 0x2757},
+  {0x2763, 0x2767},
+  {0x2795, 0x2797},
+  {0x27A1, 0x27A1},
+  {0x27B0, 0x27B0},
+  {0x27BF, 0x27BF},
+  {0x2934, 0x2935},
+  {0x2B05, 0x2B07},
+  {0x2B1B, 0x2B1C},
+  {0x2B50, 0x2B50},
+  {0x2B55, 0x2B55},
+  {0x3030, 0x3030},
+  {0x303D, 0x303D},
+  {0x3297, 0x3297},
+  {0x3299, 0x3299},
+  {0x1F000, 0x1F0FF},
+  {0x1F10D, 0x1F10F},
+  {0x1F12F, 0x1F12F},
+  {0x1F16C, 0x1F171},
+  {0x1F17E, 0x1F17F},
+  {0x1F18E, 0x1F18E},
+  {0x1F191, 0x1F19A},
+  {0x1F1AD, 0x1F1E5},
+  {0x1F201, 0x1F20F},
+  {0x1F21A, 0x1F21A},
+  {0x1F22F, 0x1F22F},
+  {0x1F232, 0x1F23A},
+  {0x1F23C, 0x1F23F},
+  {0x1F249, 0x1F3FA},
+  {0x1F400, 0x1F53D},
+  {0x1F546, 0x1F64F},
+  {0x1F680, 0x1F6FF},
+  {0x1F774, 0x1F77F},
+  {0x1F7D5, 0x1F7FF},
+  {0x1F80C, 0x1F80F},
+  {0x1F848, 0x1F84F},
+  {0x1F85A, 0x1F85F},
+  {0x1F888, 0x1F88F},
+  {0x1F8AE, 0x1F8FF},
+  {0x1F90C, 0x1F93A},
+  {0x1F93C, 0x1F945},
+  {0x1F947, 0x1FFFD},
+};
+
+#endif /* HB_UNICODE_EMOJI_TABLE_HH */
+
+/* == End of generated table == */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-unicode.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-unicode.cc
new file mode 100644
index 0000000..4ac521d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-unicode.cc
@@ -0,0 +1,577 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2011  Codethink Limited
+ * Copyright © 2010,2011,2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Codethink Author(s): Ryan Lortie
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#include "hb-unicode.hh"
+
+
+/**
+ * SECTION: hb-unicode
+ * @title: hb-unicode
+ * @short_description: Unicode character property access
+ * @include: hb.h
+ *
+ * Unicode functions are used to access Unicode character properties.
+ * Client can pass its own Unicode functions to HarfBuzz, or access
+ * the built-in Unicode functions that come with HarfBuzz.
+ *
+ * With the Unicode functions, one can query variour Unicode character
+ * properties, such as General Category, Script, Combining Class, etc.
+ **/
+
+
+/*
+ * hb_unicode_funcs_t
+ */
+
+static hb_unicode_combining_class_t
+hb_unicode_combining_class_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
+				hb_codepoint_t      unicode   HB_UNUSED,
+				void               *user_data HB_UNUSED)
+{
+  return HB_UNICODE_COMBINING_CLASS_NOT_REORDERED;
+}
+
+static unsigned int
+hb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
+				hb_codepoint_t      unicode   HB_UNUSED,
+				void               *user_data HB_UNUSED)
+{
+  return 1;
+}
+
+static hb_unicode_general_category_t
+hb_unicode_general_category_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
+				 hb_codepoint_t      unicode   HB_UNUSED,
+				 void               *user_data HB_UNUSED)
+{
+  return HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER;
+}
+
+static hb_codepoint_t
+hb_unicode_mirroring_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
+			  hb_codepoint_t      unicode,
+			  void               *user_data HB_UNUSED)
+{
+  return unicode;
+}
+
+static hb_script_t
+hb_unicode_script_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
+		       hb_codepoint_t      unicode   HB_UNUSED,
+		       void               *user_data HB_UNUSED)
+{
+  return HB_SCRIPT_UNKNOWN;
+}
+
+static hb_bool_t
+hb_unicode_compose_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
+			hb_codepoint_t      a         HB_UNUSED,
+			hb_codepoint_t      b         HB_UNUSED,
+			hb_codepoint_t     *ab        HB_UNUSED,
+			void               *user_data HB_UNUSED)
+{
+  return false;
+}
+
+static hb_bool_t
+hb_unicode_decompose_nil (hb_unicode_funcs_t *ufuncs    HB_UNUSED,
+			  hb_codepoint_t      ab        HB_UNUSED,
+			  hb_codepoint_t     *a         HB_UNUSED,
+			  hb_codepoint_t     *b         HB_UNUSED,
+			  void               *user_data HB_UNUSED)
+{
+  return false;
+}
+
+
+static unsigned int
+hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs     HB_UNUSED,
+					hb_codepoint_t      u          HB_UNUSED,
+					hb_codepoint_t     *decomposed HB_UNUSED,
+					void               *user_data  HB_UNUSED)
+{
+  return 0;
+}
+
+
+extern "C" hb_unicode_funcs_t *hb_glib_get_unicode_funcs ();
+extern "C" hb_unicode_funcs_t *hb_icu_get_unicode_funcs ();
+extern "C" hb_unicode_funcs_t *hb_ucdn_get_unicode_funcs ();
+
+hb_unicode_funcs_t *
+hb_unicode_funcs_get_default ()
+{
+#if defined(HAVE_UCDN)
+  return hb_ucdn_get_unicode_funcs ();
+#elif defined(HAVE_GLIB)
+  return hb_glib_get_unicode_funcs ();
+#elif defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN)
+  return hb_icu_get_unicode_funcs ();
+#else
+#define HB_UNICODE_FUNCS_NIL 1
+  return hb_unicode_funcs_get_empty ();
+#endif
+}
+
+#if !defined(HB_NO_UNICODE_FUNCS) && defined(HB_UNICODE_FUNCS_NIL)
+#error "Could not find any Unicode functions implementation, you have to provide your own"
+#error "Consider building hb-ucdn.c.  If you absolutely want to build without any, check the code."
+#endif
+
+/**
+ * hb_unicode_funcs_create: (Xconstructor)
+ * @parent: (nullable):
+ *
+ *
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.2
+ **/
+hb_unicode_funcs_t *
+hb_unicode_funcs_create (hb_unicode_funcs_t *parent)
+{
+  hb_unicode_funcs_t *ufuncs;
+
+  if (!(ufuncs = hb_object_create<hb_unicode_funcs_t> ()))
+    return hb_unicode_funcs_get_empty ();
+
+  if (!parent)
+    parent = hb_unicode_funcs_get_empty ();
+
+  hb_unicode_funcs_make_immutable (parent);
+  ufuncs->parent = hb_unicode_funcs_reference (parent);
+
+  ufuncs->func = parent->func;
+
+  /* We can safely copy user_data from parent since we hold a reference
+   * onto it and it's immutable.  We should not copy the destroy notifiers
+   * though. */
+  ufuncs->user_data = parent->user_data;
+
+  return ufuncs;
+}
+
+
+DEFINE_NULL_INSTANCE (hb_unicode_funcs_t) =
+{
+  HB_OBJECT_HEADER_STATIC,
+
+  nullptr, /* parent */
+  {
+#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_nil,
+    HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_UNICODE_FUNC_IMPLEMENT
+  }
+};
+
+/**
+ * hb_unicode_funcs_get_empty:
+ *
+ *
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.2
+ **/
+hb_unicode_funcs_t *
+hb_unicode_funcs_get_empty ()
+{
+  return const_cast<hb_unicode_funcs_t *> (&Null(hb_unicode_funcs_t));
+}
+
+/**
+ * hb_unicode_funcs_reference: (skip)
+ * @ufuncs: Unicode functions.
+ *
+ *
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.2
+ **/
+hb_unicode_funcs_t *
+hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs)
+{
+  return hb_object_reference (ufuncs);
+}
+
+/**
+ * hb_unicode_funcs_destroy: (skip)
+ * @ufuncs: Unicode functions.
+ *
+ *
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs)
+{
+  if (!hb_object_destroy (ufuncs)) return;
+
+#define HB_UNICODE_FUNC_IMPLEMENT(name) \
+  if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name);
+    HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_UNICODE_FUNC_IMPLEMENT
+
+  hb_unicode_funcs_destroy (ufuncs->parent);
+
+  free (ufuncs);
+}
+
+/**
+ * hb_unicode_funcs_set_user_data: (skip)
+ * @ufuncs: Unicode functions.
+ * @key:
+ * @data:
+ * @destroy:
+ * @replace:
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
+			        hb_user_data_key_t *key,
+			        void *              data,
+			        hb_destroy_func_t   destroy,
+				hb_bool_t           replace)
+{
+  return hb_object_set_user_data (ufuncs, key, data, destroy, replace);
+}
+
+/**
+ * hb_unicode_funcs_get_user_data: (skip)
+ * @ufuncs: Unicode functions.
+ * @key:
+ *
+ *
+ *
+ * Return value: (transfer none):
+ *
+ * Since: 0.9.2
+ **/
+void *
+hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
+			        hb_user_data_key_t *key)
+{
+  return hb_object_get_user_data (ufuncs, key);
+}
+
+
+/**
+ * hb_unicode_funcs_make_immutable:
+ * @ufuncs: Unicode functions.
+ *
+ *
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs)
+{
+  if (hb_object_is_immutable (ufuncs))
+    return;
+
+  hb_object_make_immutable (ufuncs);
+}
+
+/**
+ * hb_unicode_funcs_is_immutable:
+ * @ufuncs: Unicode functions.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs)
+{
+  return hb_object_is_immutable (ufuncs);
+}
+
+/**
+ * hb_unicode_funcs_get_parent:
+ * @ufuncs: Unicode functions.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_unicode_funcs_t *
+hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs)
+{
+  return ufuncs->parent ? ufuncs->parent : hb_unicode_funcs_get_empty ();
+}
+
+
+#define HB_UNICODE_FUNC_IMPLEMENT(name)						\
+										\
+void										\
+hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t		   *ufuncs,	\
+				    hb_unicode_##name##_func_t	    func,	\
+				    void			   *user_data,	\
+				    hb_destroy_func_t		    destroy)	\
+{										\
+  if (hb_object_is_immutable (ufuncs))						\
+    return;									\
+										\
+  if (ufuncs->destroy.name)							\
+    ufuncs->destroy.name (ufuncs->user_data.name);				\
+										\
+  if (func) {									\
+    ufuncs->func.name = func;							\
+    ufuncs->user_data.name = user_data;						\
+    ufuncs->destroy.name = destroy;						\
+  } else {									\
+    ufuncs->func.name = ufuncs->parent->func.name;				\
+    ufuncs->user_data.name = ufuncs->parent->user_data.name;			\
+    ufuncs->destroy.name = nullptr;						\
+  }										\
+}
+
+HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_UNICODE_FUNC_IMPLEMENT
+
+
+#define HB_UNICODE_FUNC_IMPLEMENT(return_type, name)				\
+										\
+return_type									\
+hb_unicode_##name (hb_unicode_funcs_t *ufuncs,					\
+		   hb_codepoint_t      unicode)					\
+{										\
+  return ufuncs->name (unicode);						\
+}
+HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
+#undef HB_UNICODE_FUNC_IMPLEMENT
+
+/**
+ * hb_unicode_compose:
+ * @ufuncs: Unicode functions.
+ * @a:
+ * @b:
+ * @ab: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
+		    hb_codepoint_t      a,
+		    hb_codepoint_t      b,
+		    hb_codepoint_t     *ab)
+{
+  return ufuncs->compose (a, b, ab);
+}
+
+/**
+ * hb_unicode_decompose:
+ * @ufuncs: Unicode functions.
+ * @ab:
+ * @a: (out):
+ * @b: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ **/
+hb_bool_t
+hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
+		      hb_codepoint_t      ab,
+		      hb_codepoint_t     *a,
+		      hb_codepoint_t     *b)
+{
+  return ufuncs->decompose (ab, a, b);
+}
+
+/**
+ * hb_unicode_decompose_compatibility:
+ * @ufuncs: Unicode functions.
+ * @u:
+ * @decomposed: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 0.9.2
+ * Deprecated: 2.0.0
+ **/
+unsigned int
+hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
+				    hb_codepoint_t      u,
+				    hb_codepoint_t     *decomposed)
+{
+  return ufuncs->decompose_compatibility (u, decomposed);
+}
+
+
+/* See hb-unicode.hh for details. */
+const uint8_t
+_hb_modified_combining_class[256] =
+{
+  0, /* HB_UNICODE_COMBINING_CLASS_NOT_REORDERED */
+  1, /* HB_UNICODE_COMBINING_CLASS_OVERLAY */
+  2, 3, 4, 5, 6,
+  7, /* HB_UNICODE_COMBINING_CLASS_NUKTA */
+  8, /* HB_UNICODE_COMBINING_CLASS_KANA_VOICING */
+  9, /* HB_UNICODE_COMBINING_CLASS_VIRAMA */
+
+  /* Hebrew */
+  HB_MODIFIED_COMBINING_CLASS_CCC10,
+  HB_MODIFIED_COMBINING_CLASS_CCC11,
+  HB_MODIFIED_COMBINING_CLASS_CCC12,
+  HB_MODIFIED_COMBINING_CLASS_CCC13,
+  HB_MODIFIED_COMBINING_CLASS_CCC14,
+  HB_MODIFIED_COMBINING_CLASS_CCC15,
+  HB_MODIFIED_COMBINING_CLASS_CCC16,
+  HB_MODIFIED_COMBINING_CLASS_CCC17,
+  HB_MODIFIED_COMBINING_CLASS_CCC18,
+  HB_MODIFIED_COMBINING_CLASS_CCC19,
+  HB_MODIFIED_COMBINING_CLASS_CCC20,
+  HB_MODIFIED_COMBINING_CLASS_CCC21,
+  HB_MODIFIED_COMBINING_CLASS_CCC22,
+  HB_MODIFIED_COMBINING_CLASS_CCC23,
+  HB_MODIFIED_COMBINING_CLASS_CCC24,
+  HB_MODIFIED_COMBINING_CLASS_CCC25,
+  HB_MODIFIED_COMBINING_CLASS_CCC26,
+
+  /* Arabic */
+  HB_MODIFIED_COMBINING_CLASS_CCC27,
+  HB_MODIFIED_COMBINING_CLASS_CCC28,
+  HB_MODIFIED_COMBINING_CLASS_CCC29,
+  HB_MODIFIED_COMBINING_CLASS_CCC30,
+  HB_MODIFIED_COMBINING_CLASS_CCC31,
+  HB_MODIFIED_COMBINING_CLASS_CCC32,
+  HB_MODIFIED_COMBINING_CLASS_CCC33,
+  HB_MODIFIED_COMBINING_CLASS_CCC34,
+  HB_MODIFIED_COMBINING_CLASS_CCC35,
+
+  /* Syriac */
+  HB_MODIFIED_COMBINING_CLASS_CCC36,
+
+  37, 38, 39,
+  40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+  60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+  80, 81, 82, 83,
+
+  /* Telugu */
+  HB_MODIFIED_COMBINING_CLASS_CCC84,
+  85, 86, 87, 88, 89, 90,
+  HB_MODIFIED_COMBINING_CLASS_CCC91,
+  92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
+
+  /* Thai */
+  HB_MODIFIED_COMBINING_CLASS_CCC103,
+  104, 105, 106,
+  HB_MODIFIED_COMBINING_CLASS_CCC107,
+  108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
+
+  /* Lao */
+  HB_MODIFIED_COMBINING_CLASS_CCC118,
+  119, 120, 121,
+  HB_MODIFIED_COMBINING_CLASS_CCC122,
+  123, 124, 125, 126, 127, 128,
+
+  /* Tibetan */
+  HB_MODIFIED_COMBINING_CLASS_CCC129,
+  HB_MODIFIED_COMBINING_CLASS_CCC130,
+  131,
+  HB_MODIFIED_COMBINING_CLASS_CCC132,
+  133, 134, 135, 136, 137, 138, 139,
+
+
+  140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+  150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
+  160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
+  170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
+  180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
+  190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
+
+  200, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT */
+  201,
+  202, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW */
+  203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213,
+  214, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE */
+  215,
+  216, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT */
+  217,
+  218, /* HB_UNICODE_COMBINING_CLASS_BELOW_LEFT */
+  219,
+  220, /* HB_UNICODE_COMBINING_CLASS_BELOW */
+  221,
+  222, /* HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT */
+  223,
+  224, /* HB_UNICODE_COMBINING_CLASS_LEFT */
+  225,
+  226, /* HB_UNICODE_COMBINING_CLASS_RIGHT */
+  227,
+  228, /* HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT */
+  229,
+  230, /* HB_UNICODE_COMBINING_CLASS_ABOVE */
+  231,
+  232, /* HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT */
+  233, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW */
+  234, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE */
+  235, 236, 237, 238, 239,
+  240, /* HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT */
+  241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
+  255, /* HB_UNICODE_COMBINING_CLASS_INVALID */
+};
+
+
+/*
+ * Emoji
+ */
+
+#include "hb-unicode-emoji-table.hh"
+
+bool
+_hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp)
+{
+  return hb_bsearch (&cp, _hb_unicode_emoji_Extended_Pictographic_table,
+		     ARRAY_LENGTH (_hb_unicode_emoji_Extended_Pictographic_table),
+		     sizeof (hb_unicode_range_t),
+		     hb_unicode_range_t::cmp);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-unicode.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-unicode.h
new file mode 100644
index 0000000..df0b91f
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-unicode.h
@@ -0,0 +1,404 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2011  Codethink Limited
+ * Copyright © 2011,2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Codethink Author(s): Ryan Lortie
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_UNICODE_H
+#define HB_UNICODE_H
+
+#include "hb-common.h"
+
+HB_BEGIN_DECLS
+
+
+/**
+ * HB_UNICODE_MAX
+ *
+ * Since: 1.9.0
+ **/
+#define HB_UNICODE_MAX 0x10FFFFu
+
+
+/* hb_unicode_general_category_t */
+
+/* Unicode Character Database property: General_Category (gc) */
+typedef enum
+{
+  HB_UNICODE_GENERAL_CATEGORY_CONTROL,			/* Cc */
+  HB_UNICODE_GENERAL_CATEGORY_FORMAT,			/* Cf */
+  HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED,		/* Cn */
+  HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE,		/* Co */
+  HB_UNICODE_GENERAL_CATEGORY_SURROGATE,		/* Cs */
+  HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER,		/* Ll */
+  HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER,		/* Lm */
+  HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER,		/* Lo */
+  HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER,		/* Lt */
+  HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER,		/* Lu */
+  HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK,		/* Mc */
+  HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK,		/* Me */
+  HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK,		/* Mn */
+  HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER,		/* Nd */
+  HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER,		/* Nl */
+  HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER,		/* No */
+  HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION,	/* Pc */
+  HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION,		/* Pd */
+  HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION,	/* Pe */
+  HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION,	/* Pf */
+  HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION,	/* Pi */
+  HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION,	/* Po */
+  HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION,		/* Ps */
+  HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL,		/* Sc */
+  HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL,		/* Sk */
+  HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL,		/* Sm */
+  HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL,		/* So */
+  HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR,		/* Zl */
+  HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR,	/* Zp */
+  HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR		/* Zs */
+} hb_unicode_general_category_t;
+
+/* hb_unicode_combining_class_t */
+
+/* Note: newer versions of Unicode may add new values.  Clients should be ready to handle
+ * any value in the 0..254 range being returned from hb_unicode_combining_class().
+ */
+
+/* Unicode Character Database property: Canonical_Combining_Class (ccc) */
+typedef enum
+{
+  HB_UNICODE_COMBINING_CLASS_NOT_REORDERED	= 0,
+  HB_UNICODE_COMBINING_CLASS_OVERLAY		= 1,
+  HB_UNICODE_COMBINING_CLASS_NUKTA		= 7,
+  HB_UNICODE_COMBINING_CLASS_KANA_VOICING	= 8,
+  HB_UNICODE_COMBINING_CLASS_VIRAMA		= 9,
+
+  /* Hebrew */
+  HB_UNICODE_COMBINING_CLASS_CCC10	=  10,
+  HB_UNICODE_COMBINING_CLASS_CCC11	=  11,
+  HB_UNICODE_COMBINING_CLASS_CCC12	=  12,
+  HB_UNICODE_COMBINING_CLASS_CCC13	=  13,
+  HB_UNICODE_COMBINING_CLASS_CCC14	=  14,
+  HB_UNICODE_COMBINING_CLASS_CCC15	=  15,
+  HB_UNICODE_COMBINING_CLASS_CCC16	=  16,
+  HB_UNICODE_COMBINING_CLASS_CCC17	=  17,
+  HB_UNICODE_COMBINING_CLASS_CCC18	=  18,
+  HB_UNICODE_COMBINING_CLASS_CCC19	=  19,
+  HB_UNICODE_COMBINING_CLASS_CCC20	=  20,
+  HB_UNICODE_COMBINING_CLASS_CCC21	=  21,
+  HB_UNICODE_COMBINING_CLASS_CCC22	=  22,
+  HB_UNICODE_COMBINING_CLASS_CCC23	=  23,
+  HB_UNICODE_COMBINING_CLASS_CCC24	=  24,
+  HB_UNICODE_COMBINING_CLASS_CCC25	=  25,
+  HB_UNICODE_COMBINING_CLASS_CCC26	=  26,
+
+  /* Arabic */
+  HB_UNICODE_COMBINING_CLASS_CCC27	=  27,
+  HB_UNICODE_COMBINING_CLASS_CCC28	=  28,
+  HB_UNICODE_COMBINING_CLASS_CCC29	=  29,
+  HB_UNICODE_COMBINING_CLASS_CCC30	=  30,
+  HB_UNICODE_COMBINING_CLASS_CCC31	=  31,
+  HB_UNICODE_COMBINING_CLASS_CCC32	=  32,
+  HB_UNICODE_COMBINING_CLASS_CCC33	=  33,
+  HB_UNICODE_COMBINING_CLASS_CCC34	=  34,
+  HB_UNICODE_COMBINING_CLASS_CCC35	=  35,
+
+  /* Syriac */
+  HB_UNICODE_COMBINING_CLASS_CCC36	=  36,
+
+  /* Telugu */
+  HB_UNICODE_COMBINING_CLASS_CCC84	=  84,
+  HB_UNICODE_COMBINING_CLASS_CCC91	=  91,
+
+  /* Thai */
+  HB_UNICODE_COMBINING_CLASS_CCC103	= 103,
+  HB_UNICODE_COMBINING_CLASS_CCC107	= 107,
+
+  /* Lao */
+  HB_UNICODE_COMBINING_CLASS_CCC118	= 118,
+  HB_UNICODE_COMBINING_CLASS_CCC122	= 122,
+
+  /* Tibetan */
+  HB_UNICODE_COMBINING_CLASS_CCC129	= 129,
+  HB_UNICODE_COMBINING_CLASS_CCC130	= 130,
+  HB_UNICODE_COMBINING_CLASS_CCC133	= 132,
+
+
+  HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT	= 200,
+  HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW		= 202,
+  HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE		= 214,
+  HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT	= 216,
+  HB_UNICODE_COMBINING_CLASS_BELOW_LEFT			= 218,
+  HB_UNICODE_COMBINING_CLASS_BELOW			= 220,
+  HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT		= 222,
+  HB_UNICODE_COMBINING_CLASS_LEFT			= 224,
+  HB_UNICODE_COMBINING_CLASS_RIGHT			= 226,
+  HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT			= 228,
+  HB_UNICODE_COMBINING_CLASS_ABOVE			= 230,
+  HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT		= 232,
+  HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW		= 233,
+  HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE		= 234,
+
+  HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT		= 240,
+
+  HB_UNICODE_COMBINING_CLASS_INVALID	= 255
+} hb_unicode_combining_class_t;
+
+
+/*
+ * hb_unicode_funcs_t
+ */
+
+typedef struct hb_unicode_funcs_t hb_unicode_funcs_t;
+
+
+/*
+ * just give me the best implementation you've got there.
+ */
+HB_EXTERN hb_unicode_funcs_t *
+hb_unicode_funcs_get_default (void);
+
+
+HB_EXTERN hb_unicode_funcs_t *
+hb_unicode_funcs_create (hb_unicode_funcs_t *parent);
+
+HB_EXTERN hb_unicode_funcs_t *
+hb_unicode_funcs_get_empty (void);
+
+HB_EXTERN hb_unicode_funcs_t *
+hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs);
+
+HB_EXTERN void
+hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs);
+
+HB_EXTERN hb_bool_t
+hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
+			        hb_user_data_key_t *key,
+			        void *              data,
+			        hb_destroy_func_t   destroy,
+				hb_bool_t           replace);
+
+
+HB_EXTERN void *
+hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
+			        hb_user_data_key_t *key);
+
+
+HB_EXTERN void
+hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs);
+
+HB_EXTERN hb_bool_t
+hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs);
+
+HB_EXTERN hb_unicode_funcs_t *
+hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs);
+
+
+/*
+ * funcs
+ */
+
+/* typedefs */
+
+typedef hb_unicode_combining_class_t	(*hb_unicode_combining_class_func_t)	(hb_unicode_funcs_t *ufuncs,
+										 hb_codepoint_t      unicode,
+										 void               *user_data);
+typedef hb_unicode_general_category_t	(*hb_unicode_general_category_func_t)	(hb_unicode_funcs_t *ufuncs,
+										 hb_codepoint_t      unicode,
+										 void               *user_data);
+typedef hb_codepoint_t			(*hb_unicode_mirroring_func_t)		(hb_unicode_funcs_t *ufuncs,
+										 hb_codepoint_t      unicode,
+										 void               *user_data);
+typedef hb_script_t			(*hb_unicode_script_func_t)		(hb_unicode_funcs_t *ufuncs,
+										 hb_codepoint_t      unicode,
+										 void               *user_data);
+
+typedef hb_bool_t			(*hb_unicode_compose_func_t)		(hb_unicode_funcs_t *ufuncs,
+										 hb_codepoint_t      a,
+										 hb_codepoint_t      b,
+										 hb_codepoint_t     *ab,
+										 void               *user_data);
+typedef hb_bool_t			(*hb_unicode_decompose_func_t)		(hb_unicode_funcs_t *ufuncs,
+										 hb_codepoint_t      ab,
+										 hb_codepoint_t     *a,
+										 hb_codepoint_t     *b,
+										 void               *user_data);
+
+/* setters */
+
+/**
+ * hb_unicode_funcs_set_combining_class_func:
+ * @ufuncs: a Unicode function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN void
+hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs,
+					   hb_unicode_combining_class_func_t func,
+					   void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_unicode_funcs_set_general_category_func:
+ * @ufuncs: a Unicode function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN void
+hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs,
+					    hb_unicode_general_category_func_t func,
+					    void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_unicode_funcs_set_mirroring_func:
+ * @ufuncs: a Unicode function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN void
+hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs,
+				     hb_unicode_mirroring_func_t func,
+				     void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_unicode_funcs_set_script_func:
+ * @ufuncs: a Unicode function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN void
+hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs,
+				  hb_unicode_script_func_t func,
+				  void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_unicode_funcs_set_compose_func:
+ * @ufuncs: a Unicode function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN void
+hb_unicode_funcs_set_compose_func (hb_unicode_funcs_t *ufuncs,
+				   hb_unicode_compose_func_t func,
+				   void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_unicode_funcs_set_decompose_func:
+ * @ufuncs: a Unicode function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * 
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN void
+hb_unicode_funcs_set_decompose_func (hb_unicode_funcs_t *ufuncs,
+				     hb_unicode_decompose_func_t func,
+				     void *user_data, hb_destroy_func_t destroy);
+
+/* accessors */
+
+/**
+ * hb_unicode_combining_class:
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN hb_unicode_combining_class_t
+hb_unicode_combining_class (hb_unicode_funcs_t *ufuncs,
+			    hb_codepoint_t unicode);
+
+/**
+ * hb_unicode_general_category:
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN hb_unicode_general_category_t
+hb_unicode_general_category (hb_unicode_funcs_t *ufuncs,
+			     hb_codepoint_t unicode);
+
+/**
+ * hb_unicode_mirroring:
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN hb_codepoint_t
+hb_unicode_mirroring (hb_unicode_funcs_t *ufuncs,
+		      hb_codepoint_t unicode);
+
+/**
+ * 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_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_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_END_DECLS
+
+#endif /* HB_UNICODE_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-unicode.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-unicode.hh
new file mode 100644
index 0000000..82ebb10
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-unicode.hh
@@ -0,0 +1,394 @@
+/*
+ * Copyright © 2009  Red Hat, Inc.
+ * Copyright © 2011  Codethink Limited
+ * Copyright © 2010,2011,2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Codethink Author(s): Ryan Lortie
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_UNICODE_HH
+#define HB_UNICODE_HH
+
+#include "hb.hh"
+
+
+extern HB_INTERNAL const uint8_t _hb_modified_combining_class[256];
+
+/*
+ * hb_unicode_funcs_t
+ */
+
+#define HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS \
+  HB_UNICODE_FUNC_IMPLEMENT (combining_class) \
+  HB_UNICODE_FUNC_IMPLEMENT (eastasian_width) \
+  HB_UNICODE_FUNC_IMPLEMENT (general_category) \
+  HB_UNICODE_FUNC_IMPLEMENT (mirroring) \
+  HB_UNICODE_FUNC_IMPLEMENT (script) \
+  HB_UNICODE_FUNC_IMPLEMENT (compose) \
+  HB_UNICODE_FUNC_IMPLEMENT (decompose) \
+  HB_UNICODE_FUNC_IMPLEMENT (decompose_compatibility) \
+  /* ^--- Add new callbacks here */
+
+/* Simple callbacks are those taking a hb_codepoint_t and returning a hb_codepoint_t */
+#define HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE \
+  HB_UNICODE_FUNC_IMPLEMENT (hb_unicode_combining_class_t, combining_class) \
+  HB_UNICODE_FUNC_IMPLEMENT (unsigned int, eastasian_width) \
+  HB_UNICODE_FUNC_IMPLEMENT (hb_unicode_general_category_t, general_category) \
+  HB_UNICODE_FUNC_IMPLEMENT (hb_codepoint_t, mirroring) \
+  HB_UNICODE_FUNC_IMPLEMENT (hb_script_t, script) \
+  /* ^--- Add new simple callbacks here */
+
+struct hb_unicode_funcs_t
+{
+  hb_object_header_t header;
+
+  hb_unicode_funcs_t *parent;
+
+#define HB_UNICODE_FUNC_IMPLEMENT(return_type, name) \
+  return_type name (hb_codepoint_t unicode) { return func.name (this, unicode, user_data.name); }
+HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
+#undef HB_UNICODE_FUNC_IMPLEMENT
+
+  hb_bool_t compose (hb_codepoint_t a, hb_codepoint_t b,
+		     hb_codepoint_t *ab)
+  {
+    *ab = 0;
+    if (unlikely (!a || !b)) return false;
+    return func.compose (this, a, b, ab, user_data.compose);
+  }
+
+  hb_bool_t decompose (hb_codepoint_t ab,
+		       hb_codepoint_t *a, hb_codepoint_t *b)
+  {
+    *a = ab; *b = 0;
+    return func.decompose (this, ab, a, b, user_data.decompose);
+  }
+
+  unsigned int decompose_compatibility (hb_codepoint_t  u,
+					hb_codepoint_t *decomposed)
+  {
+    unsigned int ret = func.decompose_compatibility (this, u, decomposed, user_data.decompose_compatibility);
+    if (ret == 1 && u == decomposed[0]) {
+      decomposed[0] = 0;
+      return 0;
+    }
+    decomposed[ret] = 0;
+    return ret;
+  }
+
+  unsigned int
+  modified_combining_class (hb_codepoint_t u)
+  {
+    /* XXX This hack belongs to the Myanmar shaper. */
+    if (unlikely (u == 0x1037u)) u = 0x103Au;
+
+    /* XXX This hack belongs to the USE shaper (for Tai Tham):
+     * Reorder SAKOT to ensure it comes after any tone marks. */
+    if (unlikely (u == 0x1A60u)) return 254;
+
+    /* XXX This hack belongs to the Tibetan shaper:
+     * Reorder PADMA to ensure it comes after any vowel marks. */
+    if (unlikely (u == 0x0FC6u)) return 254;
+    /* Reorder TSA -PHRU to reorder before U+0F74 */
+    if (unlikely (u == 0x0F39u)) return 127;
+
+    return _hb_modified_combining_class[combining_class (u)];
+  }
+
+  static hb_bool_t
+  is_variation_selector (hb_codepoint_t unicode)
+  {
+    /* U+180B..180D MONGOLIAN FREE VARIATION SELECTORs are handled in the
+     * Arabic shaper.  No need to match them here. */
+    return unlikely (hb_in_ranges<hb_codepoint_t> (unicode,
+						   0xFE00u, 0xFE0Fu, /* VARIATION SELECTOR-1..16 */
+						   0xE0100u, 0xE01EFu));  /* VARIATION SELECTOR-17..256 */
+  }
+
+  /* Default_Ignorable codepoints:
+   *
+   * Note: While U+115F, U+1160, U+3164 and U+FFA0 are Default_Ignorable,
+   * we do NOT want to hide them, as the way Uniscribe has implemented them
+   * is with regular spacing glyphs, and that's the way fonts are made to work.
+   * As such, we make exceptions for those four.
+   * Also ignoring U+1BCA0..1BCA3. https://github.com/harfbuzz/harfbuzz/issues/503
+   *
+   * Unicode 7.0:
+   * $ grep '; Default_Ignorable_Code_Point ' DerivedCoreProperties.txt | sed 's/;.*#/#/'
+   * 00AD          # Cf       SOFT HYPHEN
+   * 034F          # Mn       COMBINING GRAPHEME JOINER
+   * 061C          # Cf       ARABIC LETTER MARK
+   * 115F..1160    # Lo   [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER
+   * 17B4..17B5    # Mn   [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+   * 180B..180D    # Mn   [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+   * 180E          # Cf       MONGOLIAN VOWEL SEPARATOR
+   * 200B..200F    # Cf   [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK
+   * 202A..202E    # Cf   [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+   * 2060..2064    # Cf   [5] WORD JOINER..INVISIBLE PLUS
+   * 2065          # Cn       <reserved-2065>
+   * 2066..206F    # Cf  [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES
+   * 3164          # Lo       HANGUL FILLER
+   * FE00..FE0F    # Mn  [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+   * FEFF          # Cf       ZERO WIDTH NO-BREAK SPACE
+   * FFA0          # Lo       HALFWIDTH HANGUL FILLER
+   * FFF0..FFF8    # Cn   [9] <reserved-FFF0>..<reserved-FFF8>
+   * 1BCA0..1BCA3  # Cf   [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP
+   * 1D173..1D17A  # Cf   [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+   * E0000         # Cn       <reserved-E0000>
+   * E0001         # Cf       LANGUAGE TAG
+   * E0002..E001F  # Cn  [30] <reserved-E0002>..<reserved-E001F>
+   * E0020..E007F  # Cf  [96] TAG SPACE..CANCEL TAG
+   * E0080..E00FF  # Cn [128] <reserved-E0080>..<reserved-E00FF>
+   * E0100..E01EF  # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+   * E01F0..E0FFF  # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
+   */
+  static hb_bool_t
+  is_default_ignorable (hb_codepoint_t ch)
+  {
+    hb_codepoint_t plane = ch >> 16;
+    if (likely (plane == 0))
+    {
+      /* BMP */
+      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<hb_codepoint_t> (ch, 0x17B4u, 0x17B5u);
+	case 0x18: return hb_in_range<hb_codepoint_t> (ch, 0x180Bu, 0x180Eu);
+	case 0x20: return hb_in_ranges<hb_codepoint_t> (ch, 0x200Bu, 0x200Fu,
+					    0x202Au, 0x202Eu,
+					    0x2060u, 0x206Fu);
+	case 0xFE: return hb_in_range<hb_codepoint_t> (ch, 0xFE00u, 0xFE0Fu) || ch == 0xFEFFu;
+	case 0xFF: return hb_in_range<hb_codepoint_t> (ch, 0xFFF0u, 0xFFF8u);
+	default: return false;
+      }
+    }
+    else
+    {
+      /* Other planes */
+      switch (plane) {
+	case 0x01: return hb_in_range<hb_codepoint_t> (ch, 0x1D173u, 0x1D17Au);
+	case 0x0E: return hb_in_range<hb_codepoint_t> (ch, 0xE0000u, 0xE0FFFu);
+	default: return false;
+      }
+    }
+  }
+
+  /* Space estimates based on:
+   * https://unicode.org/charts/PDF/U2000.pdf
+   * https://docs.microsoft.com/en-us/typography/develop/character-design-standards/whitespace
+   */
+  enum space_t {
+    NOT_SPACE = 0,
+    SPACE_EM   = 1,
+    SPACE_EM_2 = 2,
+    SPACE_EM_3 = 3,
+    SPACE_EM_4 = 4,
+    SPACE_EM_5 = 5,
+    SPACE_EM_6 = 6,
+    SPACE_EM_16 = 16,
+    SPACE_4_EM_18,	/* 4/18th of an EM! */
+    SPACE,
+    SPACE_FIGURE,
+    SPACE_PUNCTUATION,
+    SPACE_NARROW,
+  };
+  static space_t
+  space_fallback_type (hb_codepoint_t u)
+  {
+    switch (u)
+    {
+      /* All GC=Zs chars that can use a fallback. */
+      default:	    return NOT_SPACE;	/* U+1680 OGHAM SPACE MARK */
+      case 0x0020u: return SPACE;	/* U+0020 SPACE */
+      case 0x00A0u: return SPACE;	/* U+00A0 NO-BREAK SPACE */
+      case 0x2000u: return SPACE_EM_2;	/* U+2000 EN QUAD */
+      case 0x2001u: return SPACE_EM;	/* U+2001 EM QUAD */
+      case 0x2002u: return SPACE_EM_2;	/* U+2002 EN SPACE */
+      case 0x2003u: return SPACE_EM;	/* U+2003 EM SPACE */
+      case 0x2004u: return SPACE_EM_3;	/* U+2004 THREE-PER-EM SPACE */
+      case 0x2005u: return SPACE_EM_4;	/* U+2005 FOUR-PER-EM SPACE */
+      case 0x2006u: return SPACE_EM_6;	/* U+2006 SIX-PER-EM SPACE */
+      case 0x2007u: return SPACE_FIGURE;	/* U+2007 FIGURE SPACE */
+      case 0x2008u: return SPACE_PUNCTUATION;	/* U+2008 PUNCTUATION SPACE */
+      case 0x2009u: return SPACE_EM_5;		/* U+2009 THIN SPACE */
+      case 0x200Au: return SPACE_EM_16;		/* U+200A HAIR SPACE */
+      case 0x202Fu: return SPACE_NARROW;	/* U+202F NARROW NO-BREAK SPACE */
+      case 0x205Fu: return SPACE_4_EM_18;	/* U+205F MEDIUM MATHEMATICAL SPACE */
+      case 0x3000u: return SPACE_EM;		/* U+3000 IDEOGRAPHIC SPACE */
+    }
+  }
+
+  struct {
+#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_func_t name;
+    HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_UNICODE_FUNC_IMPLEMENT
+  } func;
+
+  struct {
+#define HB_UNICODE_FUNC_IMPLEMENT(name) void *name;
+    HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_UNICODE_FUNC_IMPLEMENT
+  } user_data;
+
+  struct {
+#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_destroy_func_t name;
+    HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_UNICODE_FUNC_IMPLEMENT
+  } destroy;
+};
+DECLARE_NULL_INSTANCE (hb_unicode_funcs_t);
+
+
+/*
+ * Modified combining marks
+ */
+
+/* Hebrew
+ *
+ * We permute the "fixed-position" classes 10-26 into the order
+ * described in the SBL Hebrew manual:
+ *
+ * https://www.sbl-site.org/Fonts/SBLHebrewUserManual1.5x.pdf
+ *
+ * (as recommended by:
+ *  https://forum.fontlab.com/archive-old-microsoft-volt-group/vista-and-diacritic-ordering/msg22823/)
+ *
+ * More details here:
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=662055
+ */
+#define HB_MODIFIED_COMBINING_CLASS_CCC10 22 /* sheva */
+#define HB_MODIFIED_COMBINING_CLASS_CCC11 15 /* hataf segol */
+#define HB_MODIFIED_COMBINING_CLASS_CCC12 16 /* hataf patah */
+#define HB_MODIFIED_COMBINING_CLASS_CCC13 17 /* hataf qamats */
+#define HB_MODIFIED_COMBINING_CLASS_CCC14 23 /* hiriq */
+#define HB_MODIFIED_COMBINING_CLASS_CCC15 18 /* tsere */
+#define HB_MODIFIED_COMBINING_CLASS_CCC16 19 /* segol */
+#define HB_MODIFIED_COMBINING_CLASS_CCC17 20 /* patah */
+#define HB_MODIFIED_COMBINING_CLASS_CCC18 21 /* qamats */
+#define HB_MODIFIED_COMBINING_CLASS_CCC19 14 /* holam */
+#define HB_MODIFIED_COMBINING_CLASS_CCC20 24 /* qubuts */
+#define HB_MODIFIED_COMBINING_CLASS_CCC21 12 /* dagesh */
+#define HB_MODIFIED_COMBINING_CLASS_CCC22 25 /* meteg */
+#define HB_MODIFIED_COMBINING_CLASS_CCC23 13 /* rafe */
+#define HB_MODIFIED_COMBINING_CLASS_CCC24 10 /* shin dot */
+#define HB_MODIFIED_COMBINING_CLASS_CCC25 11 /* sin dot */
+#define HB_MODIFIED_COMBINING_CLASS_CCC26 26 /* point varika */
+
+/*
+ * Arabic
+ *
+ * Modify to move Shadda (ccc=33) before other marks.  See:
+ * https://unicode.org/faq/normalization.html#8
+ * https://unicode.org/faq/normalization.html#9
+ */
+#define HB_MODIFIED_COMBINING_CLASS_CCC27 28 /* fathatan */
+#define HB_MODIFIED_COMBINING_CLASS_CCC28 29 /* dammatan */
+#define HB_MODIFIED_COMBINING_CLASS_CCC29 30 /* kasratan */
+#define HB_MODIFIED_COMBINING_CLASS_CCC30 31 /* fatha */
+#define HB_MODIFIED_COMBINING_CLASS_CCC31 32 /* damma */
+#define HB_MODIFIED_COMBINING_CLASS_CCC32 33 /* kasra */
+#define HB_MODIFIED_COMBINING_CLASS_CCC33 27 /* shadda */
+#define HB_MODIFIED_COMBINING_CLASS_CCC34 34 /* sukun */
+#define HB_MODIFIED_COMBINING_CLASS_CCC35 35 /* superscript alef */
+
+/* Syriac */
+#define HB_MODIFIED_COMBINING_CLASS_CCC36 36 /* superscript alaph */
+
+/* Telugu
+ *
+ * Modify Telugu length marks (ccc=84, ccc=91).
+ * These are the only matras in the main Indic scripts range that have
+ * a non-zero ccc.  That makes them reorder with the Halant that is
+ * ccc=9.  Just zero them, we don't need them in our Indic shaper.
+ */
+#define HB_MODIFIED_COMBINING_CLASS_CCC84 0 /* length mark */
+#define HB_MODIFIED_COMBINING_CLASS_CCC91 0 /* ai length mark */
+
+/* Thai
+ *
+ * Modify U+0E38 and U+0E39 (ccc=103) to be reordered before U+0E3A (ccc=9).
+ * Assign 3, which is unassigned otherwise.
+ * Uniscribe does this reordering too.
+ */
+#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
+ *
+ * In case of multiple vowel-signs, use u first (but after achung)
+ * this allows Dzongkha multi-vowel shortcuts to render correctly
+ */
+#define HB_MODIFIED_COMBINING_CLASS_CCC129 129 /* sign aa */
+#define HB_MODIFIED_COMBINING_CLASS_CCC130 132 /* sign i */
+#define HB_MODIFIED_COMBINING_CLASS_CCC132 131 /* sign u */
+
+/* Misc */
+
+#define HB_UNICODE_GENERAL_CATEGORY_IS_MARK(gen_cat) \
+	(FLAG_UNSAFE (gen_cat) & \
+	 (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
+	  FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
+
+
+/*
+ * Ranges, used for bsearch tables.
+ */
+
+struct hb_unicode_range_t
+{
+  static int
+  cmp (const void *_key, const void *_item)
+  {
+    hb_codepoint_t cp = *((hb_codepoint_t *) _key);
+    const hb_unicode_range_t *range = (hb_unicode_range_t *) _item;
+
+    if (cp < range->start)
+      return -1;
+    else if (cp <= range->end)
+      return 0;
+    else
+      return +1;
+  }
+
+  hb_codepoint_t start;
+  hb_codepoint_t end;
+};
+
+/*
+ * Emoji.
+ */
+
+HB_INTERNAL bool
+_hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp);
+
+
+#endif /* HB_UNICODE_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-uniscribe.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-uniscribe.cc
new file mode 100644
index 0000000..31c50df
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-uniscribe.cc
@@ -0,0 +1,1021 @@
+/*
+ * Copyright © 2011,2012,2013  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
+ */
+
+#include "hb.hh"
+#include "hb-shaper-impl.hh"
+
+#include <windows.h>
+#include <usp10.h>
+#include <rpc.h>
+
+#include "hb-uniscribe.h"
+
+#include "hb-open-file.hh"
+#include "hb-ot-name-table.hh"
+#include "hb-ot-layout.h"
+
+
+/**
+ * SECTION:hb-uniscribe
+ * @title: hb-uniscribe
+ * @short_description: Windows integration
+ * @include: hb-uniscribe.h
+ *
+ * Functions for using HarfBuzz with the Windows fonts.
+ **/
+
+
+static inline uint16_t hb_uint16_swap (const uint16_t v)
+{ return (v >> 8) | (v << 8); }
+static inline uint32_t hb_uint32_swap (const uint32_t v)
+{ return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); }
+
+
+typedef HRESULT (WINAPI *SIOT) /*ScriptItemizeOpenType*/(
+  const WCHAR *pwcInChars,
+  int cInChars,
+  int cMaxItems,
+  const SCRIPT_CONTROL *psControl,
+  const SCRIPT_STATE *psState,
+  SCRIPT_ITEM *pItems,
+  OPENTYPE_TAG *pScriptTags,
+  int *pcItems
+);
+
+typedef HRESULT (WINAPI *SSOT) /*ScriptShapeOpenType*/(
+  HDC hdc,
+  SCRIPT_CACHE *psc,
+  SCRIPT_ANALYSIS *psa,
+  OPENTYPE_TAG tagScript,
+  OPENTYPE_TAG tagLangSys,
+  int *rcRangeChars,
+  TEXTRANGE_PROPERTIES **rpRangeProperties,
+  int cRanges,
+  const WCHAR *pwcChars,
+  int cChars,
+  int cMaxGlyphs,
+  WORD *pwLogClust,
+  SCRIPT_CHARPROP *pCharProps,
+  WORD *pwOutGlyphs,
+  SCRIPT_GLYPHPROP *pOutGlyphProps,
+  int *pcGlyphs
+);
+
+typedef HRESULT (WINAPI *SPOT) /*ScriptPlaceOpenType*/(
+  HDC hdc,
+  SCRIPT_CACHE *psc,
+  SCRIPT_ANALYSIS *psa,
+  OPENTYPE_TAG tagScript,
+  OPENTYPE_TAG tagLangSys,
+  int *rcRangeChars,
+  TEXTRANGE_PROPERTIES **rpRangeProperties,
+  int cRanges,
+  const WCHAR *pwcChars,
+  WORD *pwLogClust,
+  SCRIPT_CHARPROP *pCharProps,
+  int cChars,
+  const WORD *pwGlyphs,
+  const SCRIPT_GLYPHPROP *pGlyphProps,
+  int cGlyphs,
+  int *piAdvance,
+  GOFFSET *pGoffset,
+  ABC *pABC
+);
+
+
+/* Fallback implementations. */
+
+static HRESULT WINAPI
+hb_ScriptItemizeOpenType(
+  const WCHAR *pwcInChars,
+  int cInChars,
+  int cMaxItems,
+  const SCRIPT_CONTROL *psControl,
+  const SCRIPT_STATE *psState,
+  SCRIPT_ITEM *pItems,
+  OPENTYPE_TAG *pScriptTags,
+  int *pcItems
+)
+{
+{
+  return ScriptItemize (pwcInChars,
+			cInChars,
+			cMaxItems,
+			psControl,
+			psState,
+			pItems,
+			pcItems);
+}
+}
+
+static HRESULT WINAPI
+hb_ScriptShapeOpenType(
+  HDC hdc,
+  SCRIPT_CACHE *psc,
+  SCRIPT_ANALYSIS *psa,
+  OPENTYPE_TAG tagScript,
+  OPENTYPE_TAG tagLangSys,
+  int *rcRangeChars,
+  TEXTRANGE_PROPERTIES **rpRangeProperties,
+  int cRanges,
+  const WCHAR *pwcChars,
+  int cChars,
+  int cMaxGlyphs,
+  WORD *pwLogClust,
+  SCRIPT_CHARPROP *pCharProps,
+  WORD *pwOutGlyphs,
+  SCRIPT_GLYPHPROP *pOutGlyphProps,
+  int *pcGlyphs
+)
+{
+  SCRIPT_VISATTR *psva = (SCRIPT_VISATTR *) pOutGlyphProps;
+  return ScriptShape (hdc,
+		      psc,
+		      pwcChars,
+		      cChars,
+		      cMaxGlyphs,
+		      psa,
+		      pwOutGlyphs,
+		      pwLogClust,
+		      psva,
+		      pcGlyphs);
+}
+
+static HRESULT WINAPI
+hb_ScriptPlaceOpenType(
+  HDC hdc,
+  SCRIPT_CACHE *psc,
+  SCRIPT_ANALYSIS *psa,
+  OPENTYPE_TAG tagScript,
+  OPENTYPE_TAG tagLangSys,
+  int *rcRangeChars,
+  TEXTRANGE_PROPERTIES **rpRangeProperties,
+  int cRanges,
+  const WCHAR *pwcChars,
+  WORD *pwLogClust,
+  SCRIPT_CHARPROP *pCharProps,
+  int cChars,
+  const WORD *pwGlyphs,
+  const SCRIPT_GLYPHPROP *pGlyphProps,
+  int cGlyphs,
+  int *piAdvance,
+  GOFFSET *pGoffset,
+  ABC *pABC
+)
+{
+  SCRIPT_VISATTR *psva = (SCRIPT_VISATTR *) pGlyphProps;
+  return ScriptPlace (hdc,
+		      psc,
+		      pwGlyphs,
+		      cGlyphs,
+		      psva,
+		      psa,
+		      piAdvance,
+		      pGoffset,
+		      pABC);
+}
+
+
+struct hb_uniscribe_shaper_funcs_t
+{
+  SIOT ScriptItemizeOpenType;
+  SSOT ScriptShapeOpenType;
+  SPOT ScriptPlaceOpenType;
+
+  void init ()
+  {
+    HMODULE hinstLib;
+    this->ScriptItemizeOpenType = nullptr;
+    this->ScriptShapeOpenType   = nullptr;
+    this->ScriptPlaceOpenType   = nullptr;
+
+    hinstLib = GetModuleHandle (TEXT ("usp10.dll"));
+    if (hinstLib)
+    {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-function-type"
+      this->ScriptItemizeOpenType = (SIOT) GetProcAddress (hinstLib, "ScriptItemizeOpenType");
+      this->ScriptShapeOpenType   = (SSOT) GetProcAddress (hinstLib, "ScriptShapeOpenType");
+      this->ScriptPlaceOpenType   = (SPOT) GetProcAddress (hinstLib, "ScriptPlaceOpenType");
+#pragma GCC diagnostic pop
+    }
+    if (!this->ScriptItemizeOpenType ||
+	!this->ScriptShapeOpenType   ||
+	!this->ScriptPlaceOpenType)
+    {
+      DEBUG_MSG (UNISCRIBE, nullptr, "OpenType versions of functions not found; falling back.");
+      this->ScriptItemizeOpenType = hb_ScriptItemizeOpenType;
+      this->ScriptShapeOpenType   = hb_ScriptShapeOpenType;
+      this->ScriptPlaceOpenType   = hb_ScriptPlaceOpenType;
+    }
+  }
+};
+
+
+static void free_static_uniscribe_shaper_funcs ();
+
+static struct hb_uniscribe_shaper_funcs_lazy_loader_t : hb_lazy_loader_t<hb_uniscribe_shaper_funcs_t,
+									 hb_uniscribe_shaper_funcs_lazy_loader_t>
+{
+  static hb_uniscribe_shaper_funcs_t *create ()
+  {
+    hb_uniscribe_shaper_funcs_t *funcs = (hb_uniscribe_shaper_funcs_t *) calloc (1, sizeof (hb_uniscribe_shaper_funcs_t));
+    if (unlikely (!funcs))
+      return nullptr;
+
+    funcs->init ();
+
+#if HB_USE_ATEXIT
+    atexit (free_static_uniscribe_shaper_funcs);
+#endif
+
+    return funcs;
+  }
+  static void destroy (hb_uniscribe_shaper_funcs_t *p)
+  {
+    free ((void *) p);
+  }
+  static hb_uniscribe_shaper_funcs_t *get_null ()
+  {
+    return nullptr;
+  }
+} static_uniscribe_shaper_funcs;
+
+#if HB_USE_ATEXIT
+static
+void free_static_uniscribe_shaper_funcs ()
+{
+  static_uniscribe_shaper_funcs.free_instance ();
+}
+#endif
+
+static hb_uniscribe_shaper_funcs_t *
+hb_uniscribe_shaper_get_funcs ()
+{
+  return static_uniscribe_shaper_funcs.get_unconst ();
+}
+
+
+struct active_feature_t {
+  OPENTYPE_FEATURE_RECORD rec;
+  unsigned int order;
+
+  static int cmp (const void *pa, const void *pb) {
+    const active_feature_t *a = (const active_feature_t *) pa;
+    const active_feature_t *b = (const active_feature_t *) pb;
+    return a->rec.tagFeature < b->rec.tagFeature ? -1 : a->rec.tagFeature > b->rec.tagFeature ? 1 :
+	   a->order < b->order ? -1 : a->order > b->order ? 1 :
+	   a->rec.lParameter < b->rec.lParameter ? -1 : a->rec.lParameter > b->rec.lParameter ? 1 :
+	   0;
+  }
+  bool operator== (const active_feature_t *f)
+  { return cmp (this, f) == 0; }
+};
+
+struct feature_event_t {
+  unsigned int index;
+  bool start;
+  active_feature_t feature;
+
+  static int cmp (const void *pa, const void *pb)
+  {
+    const feature_event_t *a = (const feature_event_t *) pa;
+    const feature_event_t *b = (const feature_event_t *) pb;
+    return a->index < b->index ? -1 : a->index > b->index ? 1 :
+	   a->start < b->start ? -1 : a->start > b->start ? 1 :
+	   active_feature_t::cmp (&a->feature, &b->feature);
+  }
+};
+
+struct range_record_t {
+  TEXTRANGE_PROPERTIES props;
+  unsigned int index_first; /* == start */
+  unsigned int index_last;  /* == end - 1 */
+};
+
+
+/*
+ * shaper face data
+ */
+
+struct hb_uniscribe_face_data_t {
+  HANDLE fh;
+  hb_uniscribe_shaper_funcs_t *funcs;
+  wchar_t face_name[LF_FACESIZE];
+};
+
+/* 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);
+  static_assert ((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 = hb_sanitize_context_t ().sanitize_blob<OT::OpenTypeFontFile> (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 padded_name_table_length = ((name_table_length + 3) & ~3);
+  unsigned int name_table_offset = (length + 3) & ~3;
+
+  new_length = name_table_offset + padded_name_table_length;
+  void *new_sfnt_data = calloc (1, new_length);
+  if (!new_sfnt_data)
+  {
+    hb_blob_destroy (blob);
+    return nullptr;
+  }
+
+  memcpy(new_sfnt_data, orig_sfnt_data, length);
+
+  OT::name &name = 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.nameRecordZ[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 = &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, padded_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 nullptr;
+    }
+  }
+
+  /* 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, nullptr, free);
+}
+
+hb_uniscribe_face_data_t *
+_hb_uniscribe_shaper_face_data_create (hb_face_t *face)
+{
+  hb_uniscribe_face_data_t *data = (hb_uniscribe_face_data_t *) calloc (1, sizeof (hb_uniscribe_face_data_t));
+  if (unlikely (!data))
+    return nullptr;
+
+  data->funcs = hb_uniscribe_shaper_get_funcs ();
+  if (unlikely (!data->funcs))
+  {
+    free (data);
+    return nullptr;
+  }
+
+  hb_blob_t *blob = hb_face_reference_blob (face);
+  if (unlikely (!hb_blob_get_length (blob)))
+    DEBUG_MSG (UNISCRIBE, face, "Face has empty blob");
+
+  blob = _hb_rename_font (blob, data->face_name);
+  if (unlikely (!blob))
+  {
+    free (data);
+    return nullptr;
+  }
+
+  DWORD num_fonts_installed;
+  data->fh = AddFontMemResourceEx ((void *) hb_blob_get_data (blob, nullptr),
+				   hb_blob_get_length (blob),
+				   0, &num_fonts_installed);
+  if (unlikely (!data->fh))
+  {
+    DEBUG_MSG (UNISCRIBE, face, "Face AddFontMemResourceEx() failed");
+    free (data);
+    return nullptr;
+  }
+
+  return data;
+}
+
+void
+_hb_uniscribe_shaper_face_data_destroy (hb_uniscribe_face_data_t *data)
+{
+  RemoveFontMemResourceEx (data->fh);
+  free (data);
+}
+
+
+/*
+ * shaper font data
+ */
+
+struct hb_uniscribe_font_data_t
+{
+  HDC hdc;
+  mutable LOGFONTW log_font;
+  HFONT hfont;
+  mutable SCRIPT_CACHE script_cache;
+  double x_mult, y_mult; /* From LOGFONT space to HB space. */
+};
+
+static bool
+populate_log_font (LOGFONTW  *lf,
+		   hb_font_t *font,
+		   unsigned int font_size)
+{
+  memset (lf, 0, sizeof (*lf));
+  lf->lfHeight = - (int) font_size;
+  lf->lfCharSet = DEFAULT_CHARSET;
+
+  memcpy (lf->lfFaceName, font->face->data.uniscribe->face_name, sizeof (lf->lfFaceName));
+
+  return true;
+}
+
+hb_uniscribe_font_data_t *
+_hb_uniscribe_shaper_font_data_create (hb_font_t *font)
+{
+  hb_uniscribe_font_data_t *data = (hb_uniscribe_font_data_t *) calloc (1, sizeof (hb_uniscribe_font_data_t));
+  if (unlikely (!data))
+    return nullptr;
+
+  int font_size = font->face->get_upem (); /* Default... */
+  /* No idea if the following is even a good idea. */
+  if (font->y_ppem)
+    font_size = font->y_ppem;
+
+  if (font_size < 0)
+    font_size = -font_size;
+  data->x_mult = (double) font->x_scale / font_size;
+  data->y_mult = (double) font->y_scale / font_size;
+
+  data->hdc = GetDC (nullptr);
+
+  if (unlikely (!populate_log_font (&data->log_font, font, font_size))) {
+    DEBUG_MSG (UNISCRIBE, font, "Font populate_log_font() failed");
+    _hb_uniscribe_shaper_font_data_destroy (data);
+    return nullptr;
+  }
+
+  data->hfont = CreateFontIndirectW (&data->log_font);
+  if (unlikely (!data->hfont)) {
+    DEBUG_MSG (UNISCRIBE, font, "Font CreateFontIndirectW() failed");
+    _hb_uniscribe_shaper_font_data_destroy (data);
+     return nullptr;
+  }
+
+  if (!SelectObject (data->hdc, data->hfont)) {
+    DEBUG_MSG (UNISCRIBE, font, "Font SelectObject() failed");
+    _hb_uniscribe_shaper_font_data_destroy (data);
+     return nullptr;
+  }
+
+  return data;
+}
+
+void
+_hb_uniscribe_shaper_font_data_destroy (hb_uniscribe_font_data_t *data)
+{
+  if (data->hdc)
+    ReleaseDC (nullptr, data->hdc);
+  if (data->hfont)
+    DeleteObject (data->hfont);
+  if (data->script_cache)
+    ScriptFreeCache (&data->script_cache);
+  free (data);
+}
+
+LOGFONTW *
+hb_uniscribe_font_get_logfontw (hb_font_t *font)
+{
+  const hb_uniscribe_font_data_t *data =  font->data.uniscribe;
+  return data ? &data->log_font : nullptr;
+}
+
+HFONT
+hb_uniscribe_font_get_hfont (hb_font_t *font)
+{
+  const hb_uniscribe_font_data_t *data =  font->data.uniscribe;
+  return data ? data->hfont : nullptr;
+}
+
+
+/*
+ * shaper
+ */
+
+
+hb_bool_t
+_hb_uniscribe_shape (hb_shape_plan_t    *shape_plan,
+		     hb_font_t          *font,
+		     hb_buffer_t        *buffer,
+		     const hb_feature_t *features,
+		     unsigned int        num_features)
+{
+  hb_face_t *face = font->face;
+  const hb_uniscribe_face_data_t *face_data = face->data.uniscribe;
+  const hb_uniscribe_font_data_t *font_data = font->data.uniscribe;
+  hb_uniscribe_shaper_funcs_t *funcs = face_data->funcs;
+
+  /*
+   * Set up features.
+   */
+  hb_vector_t<OPENTYPE_FEATURE_RECORD> feature_records;
+  hb_vector_t<range_record_t> range_records;
+  if (num_features)
+  {
+    /* Sort features by start/end events. */
+    hb_vector_t<feature_event_t> feature_events;
+    for (unsigned int i = 0; i < num_features; i++)
+    {
+      active_feature_t feature;
+      feature.rec.tagFeature = hb_uint32_swap (features[i].tag);
+      feature.rec.lParameter = features[i].value;
+      feature.order = i;
+
+      feature_event_t *event;
+
+      event = feature_events.push ();
+      event->index = features[i].start;
+      event->start = true;
+      event->feature = feature;
+
+      event = feature_events.push ();
+      event->index = features[i].end;
+      event->start = false;
+      event->feature = feature;
+    }
+    feature_events.qsort ();
+    /* Add a strategic final event. */
+    {
+      active_feature_t feature;
+      feature.rec.tagFeature = 0;
+      feature.rec.lParameter = 0;
+      feature.order = num_features + 1;
+
+      feature_event_t *event = feature_events.push ();
+      event->index = 0; /* This value does magic. */
+      event->start = false;
+      event->feature = feature;
+    }
+
+    /* Scan events and save features for each range. */
+    hb_vector_t<active_feature_t> active_features;
+    unsigned int last_index = 0;
+    for (unsigned int i = 0; i < feature_events.length; i++)
+    {
+      feature_event_t *event = &feature_events[i];
+
+      if (event->index != last_index)
+      {
+        /* Save a snapshot of active features and the range. */
+	range_record_t *range = range_records.push ();
+
+	unsigned int offset = feature_records.length;
+
+	active_features.qsort ();
+	for (unsigned int j = 0; j < active_features.length; j++)
+	{
+	  if (!j || active_features[j].rec.tagFeature != feature_records[feature_records.length - 1].tagFeature)
+	  {
+	    feature_records.push (active_features[j].rec);
+	  }
+	  else
+	  {
+	    /* Overrides value for existing feature. */
+	    feature_records[feature_records.length - 1].lParameter = active_features[j].rec.lParameter;
+	  }
+	}
+
+	/* Will convert to pointer after all is ready, since feature_records.array
+	 * may move as we grow it. */
+	range->props.potfRecords = reinterpret_cast<OPENTYPE_FEATURE_RECORD *> (offset);
+	range->props.cotfRecords = feature_records.length - offset;
+	range->index_first = last_index;
+	range->index_last  = event->index - 1;
+
+	last_index = event->index;
+      }
+
+      if (event->start)
+      {
+	active_features.push (event->feature);
+      }
+      else
+      {
+        active_feature_t *feature = active_features.find (&event->feature);
+	if (feature)
+	  active_features.remove (feature - active_features.arrayZ ());
+      }
+    }
+
+    if (!range_records.length) /* No active feature found. */
+      num_features = 0;
+
+    /* Fixup the pointers. */
+    for (unsigned int i = 0; i < range_records.length; i++)
+    {
+      range_record_t *range = &range_records[i];
+      range->props.potfRecords = (OPENTYPE_FEATURE_RECORD *) feature_records + reinterpret_cast<uintptr_t> (range->props.potfRecords);
+    }
+  }
+
+#define FAIL(...) \
+  HB_STMT_START { \
+    DEBUG_MSG (UNISCRIBE, nullptr, __VA_ARGS__); \
+    return false; \
+  } HB_STMT_END;
+
+  HRESULT hr;
+
+retry:
+
+  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); \
+    scratch += _consumed; \
+    scratch_size -= _consumed; \
+  }
+
+#define utf16_index() var1.u32
+
+  ALLOCATE_ARRAY (WCHAR, pchars, buffer->len * 2);
+
+  unsigned int chars_len = 0;
+  for (unsigned int i = 0; i < buffer->len; i++)
+  {
+    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) & ((1u << 10) - 1));
+    }
+  }
+
+  ALLOCATE_ARRAY (WORD, log_clusters, chars_len);
+  ALLOCATE_ARRAY (SCRIPT_CHARPROP, char_props, chars_len);
+
+  if (num_features)
+  {
+    /* Need log_clusters to assign features. */
+    chars_len = 0;
+    for (unsigned int i = 0; i < buffer->len; i++)
+    {
+      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. */
+    }
+  }
+
+  /* The -2 in the following is to compensate for possible
+   * alignment needed after the WORD array.  sizeof(WORD) == 2. */
+  unsigned int glyphs_size = (scratch_size * sizeof (int) - 2)
+			   / (sizeof (WORD) +
+			      sizeof (SCRIPT_GLYPHPROP) +
+			      sizeof (int) +
+			      sizeof (GOFFSET) +
+			      sizeof (uint32_t));
+
+  ALLOCATE_ARRAY (WORD, glyphs, glyphs_size);
+  ALLOCATE_ARRAY (SCRIPT_GLYPHPROP, glyph_props, glyphs_size);
+  ALLOCATE_ARRAY (int, advances, glyphs_size);
+  ALLOCATE_ARRAY (GOFFSET, offsets, glyphs_size);
+  ALLOCATE_ARRAY (uint32_t, vis_clusters, glyphs_size);
+
+  /* Note:
+   * We can't touch the contents of glyph_props.  Our fallback
+   * implementations of Shape and Place functions use that buffer
+   * by casting it to a different type.  It works because they
+   * both agree about it, but if we want to access it here we
+   * need address that issue first.
+   */
+
+#undef ALLOCATE_ARRAY
+
+#define MAX_ITEMS 256
+
+  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 |= 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,
+				     &bidi_state,
+				     items,
+				     script_tags,
+				     &item_count);
+  if (unlikely (FAILED (hr)))
+    FAIL ("ScriptItemizeOpenType() failed: 0x%08lx", hr);
+
+#undef MAX_ITEMS
+
+  hb_tag_t lang_tag;
+  unsigned int lang_count = 1;
+  hb_ot_tags_from_script_and_language (buffer->props.script,
+				       buffer->props.language,
+				       nullptr, nullptr,
+				       &lang_count, &lang_tag);
+  OPENTYPE_TAG language_tag = hb_uint32_swap (lang_count ? lang_tag : HB_TAG_NONE);
+  hb_vector_t<TEXTRANGE_PROPERTIES*> range_properties;
+  hb_vector_t<int> range_char_counts;
+
+  unsigned int glyphs_offset = 0;
+  unsigned int glyphs_len;
+  bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
+  for (int i = 0; i < item_count; i++)
+  {
+    unsigned int chars_offset = items[i].iCharPos;
+    unsigned int item_chars_len = items[i + 1].iCharPos - chars_offset;
+
+    if (num_features)
+    {
+      range_properties.shrink (0);
+      range_char_counts.shrink (0);
+
+      range_record_t *last_range = &range_records[0];
+
+      for (unsigned int k = chars_offset; k < chars_offset + item_chars_len; k++)
+      {
+	range_record_t *range = last_range;
+	while (log_clusters[k] < range->index_first)
+	  range--;
+	while (log_clusters[k] > range->index_last)
+	  range++;
+	if (!range_properties.length ||
+	    &range->props != range_properties[range_properties.length - 1])
+	{
+	  TEXTRANGE_PROPERTIES **props = range_properties.push ();
+	  int *c = range_char_counts.push ();
+	  if (unlikely (!props || !c))
+	  {
+	    range_properties.shrink (0);
+	    range_char_counts.shrink (0);
+	    break;
+	  }
+	  *props = &range->props;
+	  *c = 1;
+	}
+	else
+	{
+	  range_char_counts[range_char_counts.length - 1]++;
+	}
+
+	last_range = range;
+      }
+    }
+
+    /* Asking for glyphs in logical order circumvents at least
+     * one bug in Uniscribe. */
+    items[i].a.fLogicalOrder = true;
+
+  retry_shape:
+    hr = funcs->ScriptShapeOpenType (font_data->hdc,
+				     &font_data->script_cache,
+				     &items[i].a,
+				     script_tags[i],
+				     language_tag,
+				     range_char_counts.arrayZ (),
+				     range_properties.arrayZ (),
+				     range_properties.length,
+				     pchars + chars_offset,
+				     item_chars_len,
+				     glyphs_size - glyphs_offset,
+				     /* out */
+				     log_clusters + chars_offset,
+				     char_props + chars_offset,
+				     glyphs + glyphs_offset,
+				     glyph_props + glyphs_offset,
+				     (int *) &glyphs_len);
+
+    if (unlikely (items[i].a.fNoGlyphIndex))
+      FAIL ("ScriptShapeOpenType() set fNoGlyphIndex");
+    if (unlikely (hr == E_OUTOFMEMORY || hr == E_NOT_SUFFICIENT_BUFFER))
+    {
+      if (unlikely (!buffer->ensure (buffer->allocated * 2)))
+	FAIL ("Buffer resize failed");
+      goto retry;
+    }
+    if (unlikely (hr == USP_E_SCRIPT_NOT_IN_FONT))
+    {
+      if (items[i].a.eScript == SCRIPT_UNDEFINED)
+	FAIL ("ScriptShapeOpenType() failed: Font doesn't support script");
+      items[i].a.eScript = SCRIPT_UNDEFINED;
+      goto retry_shape;
+    }
+    if (unlikely (FAILED (hr)))
+    {
+      FAIL ("ScriptShapeOpenType() failed: 0x%08lx", hr);
+    }
+
+    for (unsigned int j = chars_offset; j < chars_offset + item_chars_len; j++)
+      log_clusters[j] += glyphs_offset;
+
+    hr = funcs->ScriptPlaceOpenType (font_data->hdc,
+				     &font_data->script_cache,
+				     &items[i].a,
+				     script_tags[i],
+				     language_tag,
+				     range_char_counts.arrayZ (),
+				     range_properties.arrayZ (),
+				     range_properties.length,
+				     pchars + chars_offset,
+				     log_clusters + chars_offset,
+				     char_props + chars_offset,
+				     item_chars_len,
+				     glyphs + glyphs_offset,
+				     glyph_props + glyphs_offset,
+				     glyphs_len,
+				     /* out */
+				     advances + glyphs_offset,
+				     offsets + glyphs_offset,
+				     nullptr);
+    if (unlikely (FAILED (hr)))
+      FAIL ("ScriptPlaceOpenType() failed: 0x%08lx", hr);
+
+    if (DEBUG_ENABLED (UNISCRIBE))
+      fprintf (stderr, "Item %d RTL %d LayoutRTL %d LogicalOrder %d ScriptTag %c%c%c%c\n",
+	       i,
+	       items[i].a.fRTL,
+	       items[i].a.fLayoutRTL,
+	       items[i].a.fLogicalOrder,
+	       HB_UNTAG (hb_uint32_swap (script_tags[i])));
+
+    glyphs_offset += glyphs_len;
+  }
+  glyphs_len = glyphs_offset;
+
+  /* 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 < glyphs_len; i++)
+    vis_clusters[i] = (uint32_t) -1;
+  for (unsigned int i = 0; i < buffer->len; i++) {
+    uint32_t *p = &vis_clusters[log_clusters[buffer->info[i].utf16_index()]];
+    *p = MIN (*p, buffer->info[i].cluster);
+  }
+  for (unsigned int i = 1; i < glyphs_len; i++)
+    if (vis_clusters[i] == (uint32_t) -1)
+      vis_clusters[i] = vis_clusters[i - 1];
+
+#undef utf16_index
+
+  if (unlikely (!buffer->ensure (glyphs_len)))
+    FAIL ("Buffer in error");
+
+#undef FAIL
+
+  /* Set glyph infos */
+  buffer->len = 0;
+  for (unsigned int i = 0; i < glyphs_len; i++)
+  {
+    hb_glyph_info_t *info = &buffer->info[buffer->len++];
+
+    info->codepoint = glyphs[i];
+    info->cluster = vis_clusters[i];
+
+    /* The rest is crap.  Let's store position info there for now. */
+    info->mask = advances[i];
+    info->var1.i32 = offsets[i].du;
+    info->var2.i32 = offsets[i].dv;
+  }
+
+  /* Set glyph positions */
+  buffer->clear_positions ();
+  double x_mult = font_data->x_mult, y_mult = font_data->y_mult;
+  for (unsigned int i = 0; i < glyphs_len; i++)
+  {
+    hb_glyph_info_t *info = &buffer->info[i];
+    hb_glyph_position_t *pos = &buffer->pos[i];
+
+    /* TODO vertical */
+    pos->x_advance = x_mult * (int32_t) info->mask;
+    pos->x_offset = x_mult * (backward ? -info->var1.i32 : info->var1.i32);
+    pos->y_offset = y_mult * info->var2.i32;
+  }
+
+  if (backward)
+    hb_buffer_reverse (buffer);
+
+  buffer->unsafe_to_break_all ();
+
+  /* Wow, done! */
+  return true;
+}
+
+
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-uniscribe.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-uniscribe.h
new file mode 100644
index 0000000..4e4ef99
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-uniscribe.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright © 2011  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_UNISCRIBE_H
+#define HB_UNISCRIBE_H
+
+#include "hb.h"
+
+#include <windows.h>
+
+HB_BEGIN_DECLS
+
+
+HB_EXTERN LOGFONTW *
+hb_uniscribe_font_get_logfontw (hb_font_t *font);
+
+HB_EXTERN HFONT
+hb_uniscribe_font_get_hfont (hb_font_t *font);
+
+
+HB_END_DECLS
+
+#endif /* HB_UNISCRIBE_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-utf.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-utf.hh
new file mode 100644
index 0000000..59ec75e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-utf.hh
@@ -0,0 +1,453 @@
+/*
+ * Copyright © 2011,2012,2014  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_UTF_HH
+#define HB_UTF_HH
+
+#include "hb.hh"
+
+#include "hb-open-type.hh"
+
+
+struct hb_utf8_t
+{
+  typedef uint8_t codepoint_t;
+
+  static const codepoint_t *
+  next (const codepoint_t *text,
+	const codepoint_t *end,
+	hb_codepoint_t *unicode,
+	hb_codepoint_t replacement)
+  {
+    /* Written to only accept well-formed sequences.
+     * Based on ideas from ICU's U8_NEXT.
+     * Generates one "replacement" for each ill-formed byte. */
+
+    hb_codepoint_t c = *text++;
+
+    if (c > 0x7Fu)
+    {
+      if (hb_in_range<hb_codepoint_t> (c, 0xC2u, 0xDFu)) /* Two-byte */
+      {
+	unsigned int t1;
+	if (likely (text < end &&
+		    (t1 = text[0] - 0x80u) <= 0x3Fu))
+	{
+	  c = ((c&0x1Fu)<<6) | t1;
+	  text++;
+	}
+	else
+	  goto error;
+      }
+      else if (hb_in_range<hb_codepoint_t> (c, 0xE0u, 0xEFu)) /* Three-byte */
+      {
+	unsigned int t1, t2;
+	if (likely (1 < end - text &&
+		    (t1 = text[0] - 0x80u) <= 0x3Fu &&
+		    (t2 = text[1] - 0x80u) <= 0x3Fu))
+	{
+	  c = ((c&0xFu)<<12) | (t1<<6) | t2;
+	  if (unlikely (c < 0x0800u || hb_in_range<hb_codepoint_t> (c, 0xD800u, 0xDFFFu)))
+	    goto error;
+	  text += 2;
+	}
+	else
+	  goto error;
+      }
+      else if (hb_in_range<hb_codepoint_t> (c, 0xF0u, 0xF4u)) /* Four-byte */
+      {
+	unsigned int t1, t2, t3;
+	if (likely (2 < end - text &&
+		    (t1 = text[0] - 0x80u) <= 0x3Fu &&
+		    (t2 = text[1] - 0x80u) <= 0x3Fu &&
+		    (t3 = text[2] - 0x80u) <= 0x3Fu))
+	{
+	  c = ((c&0x7u)<<18) | (t1<<12) | (t2<<6) | t3;
+	  if (unlikely (!hb_in_range<hb_codepoint_t> (c, 0x10000u, 0x10FFFFu)))
+	    goto error;
+	  text += 3;
+	}
+	else
+	  goto error;
+      }
+      else
+	goto error;
+    }
+
+    *unicode = c;
+    return text;
+
+  error:
+    *unicode = replacement;
+    return text;
+  }
+
+  static const codepoint_t *
+  prev (const codepoint_t *text,
+	const codepoint_t *start,
+	hb_codepoint_t *unicode,
+	hb_codepoint_t replacement)
+  {
+    const codepoint_t *end = text--;
+    while (start < text && (*text & 0xc0) == 0x80 && end - text < 4)
+      text--;
+
+    if (likely (next (text, end, unicode, replacement) == end))
+      return text;
+
+    *unicode = replacement;
+    return end - 1;
+  }
+
+  static unsigned int
+  strlen (const codepoint_t *text)
+  { return ::strlen ((const char *) text); }
+
+  static unsigned int
+  encode_len (hb_codepoint_t unicode)
+  {
+    if (unicode <   0x0080u) return 1;
+    if (unicode <   0x0800u) return 2;
+    if (unicode <  0x10000u) return 3;
+    if (unicode < 0x110000u) return 4;
+    return 3;
+  }
+
+  static codepoint_t *
+  encode (codepoint_t *text,
+	  const codepoint_t *end,
+	  hb_codepoint_t unicode)
+  {
+    if (unlikely (unicode >= 0xD800u && (unicode <= 0xDFFFu || unicode > 0x10FFFFu)))
+      unicode = 0xFFFDu;
+    if (unicode < 0x0080u)
+     *text++ = unicode;
+    else if (unicode < 0x0800u)
+    {
+      if (end - text >= 2)
+      {
+	*text++ =  0xC0u + (0x1Fu & (unicode >>  6));
+	*text++ =  0x80u + (0x3Fu & (unicode      ));
+      }
+    }
+    else if (unicode < 0x10000u)
+    {
+      if (end - text >= 3)
+      {
+	*text++ =  0xE0u + (0x0Fu & (unicode >> 12));
+	*text++ =  0x80u + (0x3Fu & (unicode >>  6));
+	*text++ =  0x80u + (0x3Fu & (unicode      ));
+      }
+    }
+    else
+    {
+      if (end - text >= 4)
+      {
+	*text++ =  0xF0u + (0x07u & (unicode >> 18));
+	*text++ =  0x80u + (0x3Fu & (unicode >> 12));
+	*text++ =  0x80u + (0x3Fu & (unicode >>  6));
+	*text++ =  0x80u + (0x3Fu & (unicode      ));
+      }
+    }
+    return text;
+  }
+};
+
+
+template <typename TCodepoint>
+struct hb_utf16_xe_t
+{
+  static_assert (sizeof (TCodepoint) == 2, "");
+  typedef TCodepoint codepoint_t;
+
+  static const codepoint_t *
+  next (const codepoint_t *text,
+	const codepoint_t *end,
+	hb_codepoint_t *unicode,
+	hb_codepoint_t replacement)
+  {
+    hb_codepoint_t c = *text++;
+
+    if (likely (!hb_in_range<hb_codepoint_t> (c, 0xD800u, 0xDFFFu)))
+    {
+      *unicode = c;
+      return text;
+    }
+
+    if (likely (c <= 0xDBFFu && text < end))
+    {
+      /* High-surrogate in c */
+      hb_codepoint_t l = *text;
+      if (likely (hb_in_range<hb_codepoint_t> (l, 0xDC00u, 0xDFFFu)))
+      {
+	/* Low-surrogate in l */
+	*unicode = (c << 10) + l - ((0xD800u << 10) - 0x10000u + 0xDC00u);
+	 text++;
+	 return text;
+      }
+    }
+
+    /* Lonely / out-of-order surrogate. */
+    *unicode = replacement;
+    return text;
+  }
+
+  static const codepoint_t *
+  prev (const codepoint_t *text,
+	const codepoint_t *start,
+	hb_codepoint_t *unicode,
+	hb_codepoint_t replacement)
+  {
+    hb_codepoint_t c = *--text;
+
+    if (likely (!hb_in_range<hb_codepoint_t> (c, 0xD800u, 0xDFFFu)))
+    {
+      *unicode = c;
+      return text;
+    }
+
+    if (likely (c >= 0xDC00u && start < text))
+    {
+      /* Low-surrogate in c */
+      hb_codepoint_t h = text[-1];
+      if (likely (hb_in_range<hb_codepoint_t> (h, 0xD800u, 0xDBFFu)))
+      {
+        /* High-surrogate in h */
+        *unicode = (h << 10) + c - ((0xD800u << 10) - 0x10000u + 0xDC00u);
+        text--;
+        return text;
+      }
+    }
+
+    /* Lonely / out-of-order surrogate. */
+    *unicode = replacement;
+    return text;
+  }
+
+
+  static unsigned int
+  strlen (const codepoint_t *text)
+  {
+    unsigned int l = 0;
+    while (*text++) l++;
+    return l;
+  }
+
+  static unsigned int
+  encode_len (hb_codepoint_t unicode)
+  {
+    return unicode < 0x10000 ? 1 : 2;
+  }
+
+  static codepoint_t *
+  encode (codepoint_t *text,
+	  const codepoint_t *end,
+	  hb_codepoint_t unicode)
+  {
+    if (unlikely (unicode >= 0xD800u && (unicode <= 0xDFFFu || unicode > 0x10FFFFu)))
+      unicode = 0xFFFDu;
+    if (unicode < 0x10000u)
+     *text++ = unicode;
+    else if (end - text >= 2)
+    {
+      unicode -= 0x10000u;
+      *text++ =  0xD800u + (unicode >> 10);
+      *text++ =  0xDC00u + (unicode & 0x03FFu);
+    }
+    return text;
+  }
+};
+
+typedef hb_utf16_xe_t<uint16_t> hb_utf16_t;
+typedef hb_utf16_xe_t<OT::HBUINT16> hb_utf16_be_t;
+
+
+template <typename TCodepoint, bool validate=true>
+struct hb_utf32_xe_t
+{
+  static_assert (sizeof (TCodepoint) == 4, "");
+  typedef TCodepoint codepoint_t;
+
+  static const TCodepoint *
+  next (const TCodepoint *text,
+	const TCodepoint *end HB_UNUSED,
+	hb_codepoint_t *unicode,
+	hb_codepoint_t replacement)
+  {
+    hb_codepoint_t c = *unicode = *text++;
+    if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
+      *unicode = replacement;
+    return text;
+  }
+
+  static const TCodepoint *
+  prev (const TCodepoint *text,
+	const TCodepoint *start HB_UNUSED,
+	hb_codepoint_t *unicode,
+	hb_codepoint_t replacement)
+  {
+    hb_codepoint_t c = *unicode = *--text;
+    if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
+      *unicode = replacement;
+    return text;
+  }
+
+  static unsigned int
+  strlen (const TCodepoint *text)
+  {
+    unsigned int l = 0;
+    while (*text++) l++;
+    return l;
+  }
+
+  static unsigned int
+  encode_len (hb_codepoint_t unicode HB_UNUSED)
+  {
+    return 1;
+  }
+
+  static codepoint_t *
+  encode (codepoint_t *text,
+	  const codepoint_t *end HB_UNUSED,
+	  hb_codepoint_t unicode)
+  {
+    if (validate && unlikely (unicode >= 0xD800u && (unicode <= 0xDFFFu || unicode > 0x10FFFFu)))
+      unicode = 0xFFFDu;
+    *text++ = unicode;
+    return text;
+  }
+};
+
+typedef hb_utf32_xe_t<uint32_t> hb_utf32_t;
+typedef hb_utf32_xe_t<uint32_t, false> hb_utf32_novalidate_t;
+
+
+struct hb_latin1_t
+{
+  typedef uint8_t codepoint_t;
+
+  static const codepoint_t *
+  next (const codepoint_t *text,
+	const codepoint_t *end HB_UNUSED,
+	hb_codepoint_t *unicode,
+	hb_codepoint_t replacement HB_UNUSED)
+  {
+    *unicode = *text++;
+    return text;
+  }
+
+  static const codepoint_t *
+  prev (const codepoint_t *text,
+	const codepoint_t *start HB_UNUSED,
+	hb_codepoint_t *unicode,
+	hb_codepoint_t replacement HB_UNUSED)
+  {
+    *unicode = *--text;
+    return text;
+  }
+
+  static unsigned int
+  strlen (const codepoint_t *text)
+  {
+    unsigned int l = 0;
+    while (*text++) l++;
+    return l;
+  }
+
+  static unsigned int
+  encode_len (hb_codepoint_t unicode HB_UNUSED)
+  {
+    return 1;
+  }
+
+  static codepoint_t *
+  encode (codepoint_t *text,
+	  const codepoint_t *end HB_UNUSED,
+	  hb_codepoint_t unicode)
+  {
+    if (unlikely (unicode >= 0x0100u))
+      unicode = '?';
+    *text++ = unicode;
+    return text;
+  }
+};
+
+
+struct hb_ascii_t
+{
+  typedef uint8_t codepoint_t;
+
+  static const codepoint_t *
+  next (const codepoint_t *text,
+	const codepoint_t *end HB_UNUSED,
+	hb_codepoint_t *unicode,
+	hb_codepoint_t replacement HB_UNUSED)
+  {
+    *unicode = *text++;
+    if (*unicode >= 0x0080u)
+      *unicode = replacement;
+    return text;
+  }
+
+  static const codepoint_t *
+  prev (const codepoint_t *text,
+	const codepoint_t *start HB_UNUSED,
+	hb_codepoint_t *unicode,
+	hb_codepoint_t replacement)
+  {
+    *unicode = *--text;
+    if (*unicode >= 0x0080u)
+      *unicode = replacement;
+    return text;
+  }
+
+  static unsigned int
+  strlen (const codepoint_t *text)
+  {
+    unsigned int l = 0;
+    while (*text++) l++;
+    return l;
+  }
+
+  static unsigned int
+  encode_len (hb_codepoint_t unicode HB_UNUSED)
+  {
+    return 1;
+  }
+
+  static codepoint_t *
+  encode (codepoint_t *text,
+	  const codepoint_t *end HB_UNUSED,
+	  hb_codepoint_t unicode)
+  {
+    if (unlikely (unicode >= 0x0080u))
+      unicode = '?';
+    *text++ = unicode;
+    return text;
+  }
+};
+
+#endif /* HB_UTF_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-vector.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-vector.hh
new file mode 100644
index 0000000..2fd739b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-vector.hh
@@ -0,0 +1,260 @@
+/*
+ * Copyright © 2017,2018  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_VECTOR_HH
+#define HB_VECTOR_HH
+
+#include "hb.hh"
+#include "hb-array.hh"
+#include "hb-null.hh"
+
+
+template <typename Type>
+struct hb_vector_t
+{
+  typedef Type item_t;
+  static constexpr unsigned item_size = hb_static_size (Type);
+
+  HB_NO_COPY_ASSIGN_TEMPLATE (hb_vector_t, Type);
+  hb_vector_t ()  { init (); }
+  ~hb_vector_t () { fini (); }
+
+  unsigned int length;
+  private:
+  int allocated; /* == -1 means allocation failed. */
+  Type *arrayZ_;
+  public:
+
+  void init ()
+  {
+    allocated = length = 0;
+    arrayZ_ = nullptr;
+  }
+
+  void fini ()
+  {
+    if (arrayZ_)
+      free (arrayZ_);
+    init ();
+  }
+  void fini_deep ()
+  {
+    Type *array = arrayZ();
+    unsigned int count = length;
+    for (unsigned int i = 0; i < count; i++)
+      array[i].fini ();
+    fini ();
+  }
+
+  const Type * arrayZ () const { return arrayZ_; }
+        Type * arrayZ ()       { return arrayZ_; }
+
+  Type& operator [] (int i_)
+  {
+    unsigned int i = (unsigned int) i_;
+    if (unlikely (i >= length))
+      return Crap (Type);
+    return arrayZ()[i];
+  }
+  const Type& operator [] (int i_) const
+  {
+    unsigned int i = (unsigned int) i_;
+    if (unlikely (i >= length))
+      return Null(Type);
+    return arrayZ()[i];
+  }
+
+  explicit_operator bool () const { return length; }
+
+  hb_array_t<Type> as_array ()
+  { return hb_array (arrayZ(), length); }
+  hb_array_t<const Type> as_array () const
+  { return hb_array (arrayZ(), length); }
+
+  hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
+  { return as_array ().sub_array (start_offset, count);}
+  hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const
+  { return as_array ().sub_array (start_offset, count);}
+  hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
+  { return as_array ().sub_array (start_offset, count);}
+  hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */)
+  { return as_array ().sub_array (start_offset, count);}
+
+  hb_sorted_array_t<Type> as_sorted_array ()
+  { return hb_sorted_array (arrayZ(), length); }
+  hb_sorted_array_t<const Type> as_sorted_array () const
+  { return hb_sorted_array (arrayZ(), length); }
+
+  hb_array_t<const Type> sorted_sub_array (unsigned int start_offset, unsigned int count) const
+  { return as_sorted_array ().sorted_sub_array (start_offset, count);}
+  hb_array_t<const Type> sorted_sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const
+  { return as_sorted_array ().sorted_sub_array (start_offset, count);}
+  hb_array_t<Type> sorted_sub_array (unsigned int start_offset, unsigned int count)
+  { return as_sorted_array ().sorted_sub_array (start_offset, count);}
+  hb_array_t<Type> sorted_sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */)
+  { return as_sorted_array ().sorted_sub_array (start_offset, count);}
+
+  template <typename T> explicit_operator T * () { return arrayZ(); }
+  template <typename T> explicit_operator const T * () const { return arrayZ(); }
+  operator hb_array_t<Type> ()             { return as_array (); }
+  operator hb_array_t<const Type> () const { return as_array (); }
+
+  Type * operator  + (unsigned int i) { return arrayZ() + i; }
+  const Type * operator  + (unsigned int i) const { return arrayZ() + i; }
+
+  Type *push ()
+  {
+    if (unlikely (!resize (length + 1)))
+      return &Crap(Type);
+    return &arrayZ()[length - 1];
+  }
+  Type *push (const Type& v)
+  {
+    Type *p = push ();
+    *p = v;
+    return p;
+  }
+
+  bool in_error () const { return allocated < 0; }
+
+  /* Allocate for size but don't adjust length. */
+  bool alloc (unsigned int size)
+  {
+    if (unlikely (allocated < 0))
+      return false;
+
+    if (likely (size <= (unsigned) allocated))
+      return true;
+
+    /* Reallocate */
+
+    unsigned int new_allocated = allocated;
+    while (size >= new_allocated)
+      new_allocated += (new_allocated >> 1) + 8;
+
+    Type *new_array = nullptr;
+    bool overflows =
+      (int) new_allocated < 0 ||
+      (new_allocated < (unsigned) allocated) ||
+      hb_unsigned_mul_overflows (new_allocated, sizeof (Type));
+    if (likely (!overflows))
+      new_array = (Type *) realloc (arrayZ_, new_allocated * sizeof (Type));
+
+    if (unlikely (!new_array))
+    {
+      allocated = -1;
+      return false;
+    }
+
+    arrayZ_ = new_array;
+    allocated = new_allocated;
+
+    return true;
+  }
+
+  bool resize (int size_)
+  {
+    unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
+    if (!alloc (size))
+      return false;
+
+    if (size > length)
+      memset (arrayZ() + length, 0, (size - length) * sizeof (*arrayZ()));
+
+    length = size;
+    return true;
+  }
+
+  void pop ()
+  {
+    if (!length) return;
+    length--;
+  }
+
+  void remove (unsigned int i)
+  {
+    if (unlikely (i >= length))
+      return;
+    Type *array = arrayZ();
+    memmove (static_cast<void *> (&array[i]),
+	     static_cast<void *> (&array[i + 1]),
+	     (length - i - 1) * sizeof (Type));
+    length--;
+  }
+
+  void shrink (int size_)
+  {
+    unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
+     if (size < length)
+       length = size;
+  }
+
+  template <typename T>
+  Type *find (T v)
+  {
+    Type *array = arrayZ();
+    for (unsigned int i = 0; i < length; i++)
+      if (array[i] == v)
+	return &array[i];
+    return nullptr;
+  }
+  template <typename T>
+  const Type *find (T v) const
+  {
+    const Type *array = arrayZ();
+    for (unsigned int i = 0; i < length; i++)
+      if (array[i] == v)
+	return &array[i];
+    return nullptr;
+  }
+
+  void qsort (int (*cmp)(const void*, const void*))
+  { as_array ().qsort (cmp); }
+  void qsort (unsigned int start = 0, unsigned int end = (unsigned int) -1)
+  { as_array ().qsort (start, end); }
+
+  template <typename T>
+  Type *lsearch (const T &x, Type *not_found = nullptr)
+  { return as_array ().lsearch (x, not_found); }
+  template <typename T>
+  const Type *lsearch (const T &x, const Type *not_found = nullptr) const
+  { return as_array ().lsearch (x, not_found); }
+
+  template <typename T>
+  Type *bsearch (const T &x, Type *not_found = nullptr)
+  { return as_sorted_array ().bsearch (x, not_found); }
+  template <typename T>
+  const Type *bsearch (const T &x, const Type *not_found = nullptr) const
+  { return as_sorted_array ().bsearch (x, not_found); }
+  template <typename T>
+  bool bfind (const T &x, unsigned int *i = nullptr,
+		     hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+		     unsigned int to_store = (unsigned int) -1) const
+  { return as_sorted_array ().bfind (x, i, not_found, to_store); }
+};
+
+
+#endif /* HB_VECTOR_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-version.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-version.h
new file mode 100644
index 0000000..13db8ce
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-version.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright © 2011  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_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_VERSION_H
+#define HB_VERSION_H
+
+#include "hb-common.h"
+
+HB_BEGIN_DECLS
+
+
+#define HB_VERSION_MAJOR 2
+#define HB_VERSION_MINOR 3
+#define HB_VERSION_MICRO 1
+
+#define HB_VERSION_STRING "2.3.1"
+
+#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,
+	    unsigned int *minor,
+	    unsigned int *micro);
+
+HB_EXTERN const char *
+hb_version_string (void);
+
+HB_EXTERN hb_bool_t
+hb_version_atleast (unsigned int major,
+		    unsigned int minor,
+		    unsigned int micro);
+
+
+HB_END_DECLS
+
+#endif /* HB_VERSION_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-version.h.in b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-version.h.in
new file mode 100644
index 0000000..0ffd889
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-version.h.in
@@ -0,0 +1,66 @@
+/*
+ * Copyright © 2011  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_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_VERSION_H
+#define HB_VERSION_H
+
+#include "hb-common.h"
+
+HB_BEGIN_DECLS
+
+
+#define HB_VERSION_MAJOR @HB_VERSION_MAJOR@
+#define HB_VERSION_MINOR @HB_VERSION_MINOR@
+#define HB_VERSION_MICRO @HB_VERSION_MICRO@
+
+#define HB_VERSION_STRING "@HB_VERSION@"
+
+#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,
+	    unsigned int *minor,
+	    unsigned int *micro);
+
+HB_EXTERN const char *
+hb_version_string (void);
+
+HB_EXTERN hb_bool_t
+hb_version_atleast (unsigned int major,
+		    unsigned int minor,
+		    unsigned int micro);
+
+
+HB_END_DECLS
+
+#endif /* HB_VERSION_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-warning.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-warning.cc
new file mode 100644
index 0000000..9fb4100
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb-warning.cc
@@ -0,0 +1,37 @@
+/*
+ * Copyright © 2012  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
+ */
+
+#include "hb.hh"
+
+#if defined(HB_ATOMIC_INT_NIL)
+#error "Could not find any system to define atomic_int macros, library WILL NOT be thread-safe"
+#error "Check hb-atomic.hh for possible resolutions."
+#endif
+
+#if defined(HB_MUTEX_IMPL_NIL)
+#error "Could not find any system to define mutex macros, library WILL NOT be thread-safe"
+#error "Check hb-mutex.hh for possible resolutions."
+#endif
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb.h b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb.h
new file mode 100644
index 0000000..c5e7072
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright © 2009  Red Hat, 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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_H
+#define HB_H
+#define HB_H_IN
+
+#include "hb-blob.h"
+#include "hb-buffer.h"
+#include "hb-common.h"
+#include "hb-deprecated.h"
+#include "hb-face.h"
+#include "hb-font.h"
+#include "hb-map.h"
+#include "hb-set.h"
+#include "hb-shape.h"
+#include "hb-shape-plan.h"
+#include "hb-unicode.h"
+#include "hb-version.h"
+
+HB_BEGIN_DECLS
+HB_END_DECLS
+
+#undef HB_H_IN
+#endif /* HB_H */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb.hh
new file mode 100644
index 0000000..5b66ba8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/hb.hh
@@ -0,0 +1,658 @@
+/*
+ * Copyright © 2007,2008,2009  Red Hat, Inc.
+ * Copyright © 2011,2012  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_HH
+#define HB_HH
+
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC
+#if defined(_MSC_VER)
+#pragma warning( disable: 4068 ) /* Unknown pragma */
+#endif
+#if defined(__GNUC__) || defined(__clang__)
+/* Rules:
+ *
+ * - All pragmas are declared GCC even if they are clang ones.  Otherwise GCC
+ *   nags, even though we instruct it to ignore -Wunknown-pragmas. ¯\_(ツ)_/¯
+ *
+ * - Within each category, keep sorted.
+ *
+ * - Warnings whose scope can be expanded in future compiler versions shall
+ *   be declared as "warning".  Otherwise, either ignored or error.
+ */
+
+/* Setup.  Don't sort order within this category. */
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_WARNING
+#pragma GCC diagnostic warning "-Wall"
+#pragma GCC diagnostic warning "-Wextra"
+#endif
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED
+#pragma GCC diagnostic ignored "-Wpragmas"
+#pragma GCC diagnostic ignored "-Wunknown-pragmas"
+#pragma GCC diagnostic ignored "-Wunknown-warning-option"
+#endif
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_WARNING
+//#pragma GCC diagnostic warning "-Weverything"
+#endif
+
+/* Error.  Should never happen. */
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_ERROR
+#pragma GCC diagnostic error   "-Wc++11-narrowing"
+#pragma GCC diagnostic error   "-Wcast-align"
+#pragma GCC diagnostic error   "-Wcast-function-type"
+#pragma GCC diagnostic error   "-Wdelete-non-virtual-dtor"
+#pragma GCC diagnostic error   "-Wformat-security"
+#pragma GCC diagnostic error   "-Wimplicit-function-declaration"
+#pragma GCC diagnostic error   "-Winit-self"
+#pragma GCC diagnostic error   "-Wmissing-braces"
+#pragma GCC diagnostic error   "-Wmissing-declarations"
+#pragma GCC diagnostic error   "-Wmissing-prototypes"
+#pragma GCC diagnostic error   "-Wnested-externs"
+#pragma GCC diagnostic error   "-Wold-style-definition"
+#pragma GCC diagnostic error   "-Wpointer-arith"
+#pragma GCC diagnostic error   "-Wredundant-decls"
+#pragma GCC diagnostic error   "-Wreorder"
+#pragma GCC diagnostic error   "-Wsign-compare"
+#pragma GCC diagnostic error   "-Wstrict-prototypes"
+#pragma GCC diagnostic error   "-Wstring-conversion"
+#pragma GCC diagnostic error   "-Wswitch-enum"
+#pragma GCC diagnostic error   "-Wtautological-overlap-compare"
+#pragma GCC diagnostic error   "-Wunneeded-internal-declaration"
+#pragma GCC diagnostic error   "-Wunused"
+#pragma GCC diagnostic error   "-Wunused-local-typedefs"
+#pragma GCC diagnostic error   "-Wunused-value"
+#pragma GCC diagnostic error   "-Wunused-variable"
+#pragma GCC diagnostic error   "-Wvla"
+#pragma GCC diagnostic error   "-Wwrite-strings"
+#endif
+
+/* Warning.  To be investigated if happens. */
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_WARNING
+#pragma GCC diagnostic warning "-Wbuiltin-macro-redefined"
+#pragma GCC diagnostic warning "-Wdisabled-optimization"
+#pragma GCC diagnostic warning "-Wformat=2"
+#pragma GCC diagnostic warning "-Wignored-pragma-optimize"
+#pragma GCC diagnostic warning "-Wlogical-op"
+#pragma GCC diagnostic warning "-Wmaybe-uninitialized"
+#pragma GCC diagnostic warning "-Wmissing-format-attribute"
+#pragma GCC diagnostic warning "-Wundef"
+#endif
+
+/* Ignored currently, but should be fixed at some point. */
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED
+#pragma GCC diagnostic ignored "-Wconversion"			// TODO fix
+#pragma GCC diagnostic ignored "-Wformat-signedness"		// TODO fix
+#pragma GCC diagnostic ignored "-Wshadow"			// TODO fix
+#pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations"	// TODO fix
+#pragma GCC diagnostic ignored "-Wunused-parameter"		// TODO fix
+#endif
+
+/* Ignored intentionally. */
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED
+#pragma GCC diagnostic ignored "-Wclass-memaccess"
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+#pragma GCC diagnostic ignored "-Wformat-zero-length"
+#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+#pragma GCC diagnostic ignored "-Wpacked" // Erratic impl in clang
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic ignored "-Wtype-limits"
+#endif
+
+#endif
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/*
+ * Following added based on what AC_USE_SYSTEM_EXTENSIONS adds to
+ * config.h.in.  Copied here for the convenience of those embedding
+ * HarfBuzz and not using our build system.
+ */
+/* Enable extensions on AIX 3, Interix.  */
+#ifndef _ALL_SOURCE
+# define _ALL_SOURCE 1
+#endif
+/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+/* Enable threading extensions on Solaris.  */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# define _POSIX_PTHREAD_SEMANTICS 1
+#endif
+/* Enable extensions on HP NonStop.  */
+#ifndef _TANDEM_SOURCE
+# define _TANDEM_SOURCE 1
+#endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# define __EXTENSIONS__ 1
+#endif
+
+#if defined (_MSC_VER) && defined (HB_DLL_EXPORT)
+#define HB_EXTERN __declspec (dllexport) extern
+#endif
+
+#include "hb.h"
+#define HB_H_IN
+#include "hb-ot.h"
+#define HB_OT_H_IN
+#include "hb-aat.h"
+#define HB_AAT_H_IN
+
+#include "hb-aat.h"
+
+#include <math.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__)
+#include <intrin.h>
+#endif
+
+#define HB_PASTE1(a,b) a##b
+#define HB_PASTE(a,b) HB_PASTE1(a,b)
+
+
+/* Compile-time custom allocator support. */
+
+#if defined(hb_malloc_impl) \
+ && defined(hb_calloc_impl) \
+ && defined(hb_realloc_impl) \
+ && defined(hb_free_impl)
+extern "C" void* hb_malloc_impl(size_t size);
+extern "C" void* hb_calloc_impl(size_t nmemb, size_t size);
+extern "C" void* hb_realloc_impl(void *ptr, size_t size);
+extern "C" void  hb_free_impl(void *ptr);
+#define malloc hb_malloc_impl
+#define calloc hb_calloc_impl
+#define realloc hb_realloc_impl
+#define free hb_free_impl
+
+#if defined(hb_memalign_impl)
+extern "C" int hb_memalign_impl(void **memptr, size_t alignment, size_t size);
+#define posix_memalign hb_memalign_impl
+#else
+#undef HAVE_POSIX_MEMALIGN
+#endif
+
+#endif
+
+
+/*
+ * Compiler attributes
+ */
+
+#if __cplusplus < 201103L
+
+#ifndef nullptr
+#define nullptr NULL
+#endif
+
+#ifndef constexpr
+#define constexpr const
+#endif
+
+#ifndef static_assert
+#define static_assert(e, msg) \
+	HB_UNUSED typedef int HB_PASTE(static_assertion_failed_at_line_, __LINE__) [(e) ? 1 : -1]
+#endif // static_assert
+
+#if defined(__GNUC__)
+#if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8))
+#define thread_local __thread
+#endif
+#else
+#define thread_local
+#endif
+
+template <typename T>
+struct _hb_alignof
+{
+  struct s
+  {
+    char c;
+    T t;
+  };
+  static constexpr size_t value = offsetof (s, t);
+};
+#ifndef alignof
+#define alignof(x) (_hb_alignof<x>::value)
+#endif
+
+/* https://github.com/harfbuzz/harfbuzz/issues/1127 */
+#ifndef explicit_operator
+#define explicit_operator operator
+#endif
+
+#else /* __cplusplus >= 201103L */
+
+/* https://github.com/harfbuzz/harfbuzz/issues/1127 */
+#ifndef explicit_operator
+#define explicit_operator explicit operator
+#endif
+
+#endif /* __cplusplus < 201103L */
+
+
+#if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE__)
+#define likely(expr) (__builtin_expect (!!(expr), 1))
+#define unlikely(expr) (__builtin_expect (!!(expr), 0))
+#else
+#define likely(expr) (expr)
+#define unlikely(expr) (expr)
+#endif
+
+#if !defined(__GNUC__) && !defined(__clang__)
+#undef __attribute__
+#define __attribute__(x)
+#endif
+
+#if defined(__GNUC__) && (__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)))
+#else
+#define HB_PURE_FUNC
+#define HB_CONST_FUNC
+#define HB_PRINTF_FUNC(format_idx, arg_idx)
+#endif
+#if defined(__GNUC__) && (__GNUC__ >= 4)
+#define HB_UNUSED	__attribute__((unused))
+#elif defined(_MSC_VER) /* https://github.com/harfbuzz/harfbuzz/issues/635 */
+#define HB_UNUSED __pragma(warning(suppress: 4100 4101))
+#else
+#define HB_UNUSED
+#endif
+
+#ifndef HB_INTERNAL
+# if !defined(HB_NO_VISIBILITY) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(_MSC_VER) && !defined(__SUNPRO_CC)
+#  define HB_INTERNAL __attribute__((__visibility__("hidden")))
+# elif defined(__MINGW32__)
+   /* We use -export-symbols on mingw32, since it does not support visibility attributes. */
+#  define HB_INTERNAL
+# elif defined (_MSC_VER) && defined (HB_DLL_EXPORT)
+   /* We do not try to export internal symbols on Visual Studio */
+#  define HB_INTERNAL
+#else
+#  define HB_INTERNAL
+#  define HB_NO_VISIBILITY 1
+# endif
+#endif
+
+#if defined(__GNUC__) && (__GNUC__ >= 3)
+#define HB_FUNC __PRETTY_FUNCTION__
+#elif defined(_MSC_VER)
+#define HB_FUNC __FUNCSIG__
+#else
+#define HB_FUNC __func__
+#endif
+
+#if defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x5140)
+/* https://github.com/harfbuzz/harfbuzz/issues/630 */
+#define __restrict
+#endif
+
+/*
+ * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411
+ * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch
+ * cases that fall through without a break or return statement. HB_FALLTHROUGH
+ * is only needed on cases that have code:
+ *
+ * switch (foo) {
+ *   case 1: // These cases have no code. No fallthrough annotations are needed.
+ *   case 2:
+ *   case 3:
+ *     foo = 4; // This case has code, so a fallthrough annotation is needed:
+ *     HB_FALLTHROUGH;
+ *   default:
+ *     return foo;
+ * }
+ */
+#if defined(__clang__) && __cplusplus >= 201103L
+   /* clang's fallthrough annotations are only available starting in C++11. */
+#  define HB_FALLTHROUGH [[clang::fallthrough]]
+#elif defined(__GNUC__) && (__GNUC__ >= 7)
+   /* GNU fallthrough attribute is available from GCC7 */
+#  define HB_FALLTHROUGH __attribute__((fallthrough))
+#elif defined(_MSC_VER)
+   /*
+    * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis):
+    * https://msdn.microsoft.com/en-us/library/ms235402%28VS.80%29.aspx
+    */
+#  include <sal.h>
+#  define HB_FALLTHROUGH __fallthrough
+#else
+#  define HB_FALLTHROUGH /* FALLTHROUGH */
+#endif
+
+#if defined(__clang__)
+/* Disable certain sanitizer errors. */
+/* https://github.com/harfbuzz/harfbuzz/issues/1247 */
+#define HB_NO_SANITIZE_SIGNED_INTEGER_OVERFLOW __attribute__((no_sanitize("signed-integer-overflow")))
+#else
+#define HB_NO_SANITIZE_SIGNED_INTEGER_OVERFLOW
+#endif
+
+
+#ifdef _WIN32
+   /* We need Windows Vista for both Uniscribe backend and for
+    * MemoryBarrier.  We don't support compiling on Windows XP,
+    * though we run on it fine. */
+#  if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0600
+#    undef _WIN32_WINNT
+#  endif
+#  ifndef _WIN32_WINNT
+#    if !defined(WINAPI_FAMILY) || !(WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+#      define _WIN32_WINNT 0x0600
+#    endif
+#  endif
+#  ifndef WIN32_LEAN_AND_MEAN
+#    define WIN32_LEAN_AND_MEAN 1
+#  endif
+#  ifndef STRICT
+#    define STRICT 1
+#  endif
+
+#  if defined(_WIN32_WCE)
+     /* Some things not defined on Windows CE. */
+#    define vsnprintf _vsnprintf
+#    define getenv(Name) nullptr
+#    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) nullptr
+#  endif
+#  if defined(_MSC_VER) && _MSC_VER < 1900
+#    define snprintf _snprintf
+#  endif
+#endif
+
+#if defined(HAVE_ATEXIT) && !defined(HB_USE_ATEXIT)
+/* atexit() is only safe to be called from shared libraries on certain
+ * platforms.  Whitelist.
+ * https://bugs.freedesktop.org/show_bug.cgi?id=82246 */
+#  if defined(__linux) && defined(__GLIBC_PREREQ)
+#    if __GLIBC_PREREQ(2,3)
+/* From atexit() manpage, it's safe with glibc 2.2.3 on Linux. */
+#      define HB_USE_ATEXIT 1
+#    endif
+#  elif defined(_MSC_VER) || defined(__MINGW32__)
+/* For MSVC:
+ * https://msdn.microsoft.com/en-us/library/tze57ck3.aspx
+ * https://msdn.microsoft.com/en-us/library/zk17ww08.aspx
+ * mingw32 headers say atexit is safe to use in shared libraries.
+ */
+#    define HB_USE_ATEXIT 1
+#  elif defined(__ANDROID__)
+/* This is available since Android NKD r8 or r8b:
+ * https://issuetracker.google.com/code/p/android/issues/detail?id=6455
+ */
+#    define HB_USE_ATEXIT 1
+#  elif defined(__APPLE__)
+/* For macOS and related platforms, the atexit man page indicates
+ * that it will be invoked when the library is unloaded, not only
+ * at application exit.
+ */
+#    define HB_USE_ATEXIT 1
+#  endif
+#endif
+#ifdef HB_NO_ATEXIT
+#  undef HB_USE_ATEXIT
+#endif
+#ifndef HB_USE_ATEXIT
+#  define HB_USE_ATEXIT 0
+#endif
+
+#define HB_STMT_START do
+#define HB_STMT_END   while (0)
+
+/* Static-assert as expression. */
+template <unsigned int cond> class hb_assert_constant_t;
+template <> class hb_assert_constant_t<1> {};
+#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_constant_t<_cond>))
+
+/* Lets assert int types.  Saves trouble down the road. */
+static_assert ((sizeof (int8_t) == 1), "");
+static_assert ((sizeof (uint8_t) == 1), "");
+static_assert ((sizeof (int16_t) == 2), "");
+static_assert ((sizeof (uint16_t) == 2), "");
+static_assert ((sizeof (int32_t) == 4), "");
+static_assert ((sizeof (uint32_t) == 4), "");
+static_assert ((sizeof (int64_t) == 8), "");
+static_assert ((sizeof (uint64_t) == 8), "");
+static_assert ((sizeof (hb_codepoint_t) == 4), "");
+static_assert ((sizeof (hb_position_t) == 4), "");
+static_assert ((sizeof (hb_mask_t) == 4), "");
+static_assert ((sizeof (hb_var_int_t) == 4), "");
+
+
+#if __cplusplus >= 201103L
+
+/* We only enable these with C++11 or later, since earlier language
+ * does not allow structs with constructors in unions, and we need
+ * those. */
+
+#define HB_NO_COPY_ASSIGN(TypeName) \
+  TypeName(const TypeName&); \
+  void operator=(const TypeName&)
+#define HB_NO_COPY_ASSIGN_TEMPLATE(TypeName, T) \
+  TypeName(const TypeName<T>&); \
+  void operator=(const TypeName<T>&)
+#define HB_NO_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2) \
+  TypeName(const TypeName<T1, T2>&); \
+  void operator=(const TypeName<T1, T2>&)
+#define HB_NO_CREATE_COPY_ASSIGN(TypeName) \
+  TypeName(); \
+  TypeName(const TypeName&); \
+  void operator=(const TypeName&)
+#define HB_NO_CREATE_COPY_ASSIGN_TEMPLATE(TypeName, T) \
+  TypeName(); \
+  TypeName(const TypeName<T>&); \
+  void operator=(const TypeName<T>&)
+#define HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2) \
+  TypeName(); \
+  TypeName(const TypeName<T1, T2>&); \
+  void operator=(const TypeName<T1, T2>&)
+
+#else /* __cpluspplus >= 201103L */
+
+#define HB_NO_COPY_ASSIGN(TypeName) static_assert (true, "")
+#define HB_NO_COPY_ASSIGN_TEMPLATE(TypeName, T) static_assert (true, "")
+#define HB_NO_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2) static_assert (true, "")
+#define HB_NO_CREATE_COPY_ASSIGN(TypeName) static_assert (true, "")
+#define HB_NO_CREATE_COPY_ASSIGN_TEMPLATE(TypeName, T) static_assert (true, "")
+#define HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2) static_assert (true, "")
+
+#endif /* __cpluspplus >= 201103L */
+
+
+/*
+ * Compiler-assisted vectorization parameters.
+ */
+
+/*
+ * Disable vectorization for now.  To correctly use them, we should
+ * use posix_memalign() to allocate in hb_vector_t.  Otherwise, can
+ * cause misaligned access.
+ *
+ * https://bugs.chromium.org/p/chromium/issues/detail?id=860184
+ */
+#if !defined(HB_VECTOR_SIZE)
+#  define HB_VECTOR_SIZE 0
+#endif
+
+/* The `vector_size' attribute was introduced in gcc 3.1. */
+#if !defined(HB_VECTOR_SIZE)
+#  if defined( __GNUC__ ) && ( __GNUC__ >= 4 )
+#    define HB_VECTOR_SIZE 128
+#  else
+#    define HB_VECTOR_SIZE 0
+#  endif
+#endif
+static_assert (0 == (HB_VECTOR_SIZE & (HB_VECTOR_SIZE - 1)), "HB_VECTOR_SIZE is not power of 2.");
+static_assert (0 == (HB_VECTOR_SIZE % 64), "HB_VECTOR_SIZE is not multiple of 64.");
+#if HB_VECTOR_SIZE
+typedef uint64_t hb_vector_size_impl_t __attribute__((vector_size (HB_VECTOR_SIZE / 8)));
+#else
+typedef uint64_t hb_vector_size_impl_t;
+#endif
+
+
+/* HB_NDEBUG disables some sanity checks that are very safe to disable and
+ * should be disabled in production systems.  If NDEBUG is defined, enable
+ * HB_NDEBUG; but if it's desirable that normal assert()s (which are very
+ * light-weight) to be enabled, then HB_DEBUG can be defined to disable
+ * the costlier checks. */
+#ifdef NDEBUG
+#define HB_NDEBUG 1
+#endif
+
+
+/* Flags */
+
+/* Enable bitwise ops on enums marked as flags_t */
+/* To my surprise, looks like the function resolver is happy to silently cast
+ * one enum to another...  So this doesn't provide the type-checking that I
+ * originally had in mind... :(.
+ *
+ * For MSVC warnings, see: https://github.com/harfbuzz/harfbuzz/pull/163
+ */
+#ifdef _MSC_VER
+# pragma warning(disable:4200)
+# pragma warning(disable:4800)
+#endif
+#define HB_MARK_AS_FLAG_T(T) \
+	extern "C++" { \
+	  static inline T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \
+	  static inline T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
+	  static inline T operator ^ (T l, T r) { return T ((unsigned) l ^ (unsigned) r); } \
+	  static inline T operator ~ (T r) { return T (~(unsigned int) r); } \
+	  static inline T& operator |= (T &l, T r) { l = l | r; return l; } \
+	  static inline T& operator &= (T& l, T r) { l = l & r; return l; } \
+	  static inline T& operator ^= (T& l, T r) { l = l ^ r; return l; } \
+	} \
+	static_assert (true, "")
+
+/* Useful for set-operations on small enums.
+ * For example, for testing "x ∈ {x1, x2, x3}" use:
+ * (FLAG_UNSAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3)))
+ */
+#define FLAG(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
+#define FLAG_UNSAFE(x) ((unsigned)(x) < 32 ? (((uint32_t) 1U) << (unsigned)(x)) : 0)
+#define FLAG_RANGE(x,y) (ASSERT_STATIC_EXPR_ZERO ((x) < (y)) + FLAG(y+1) - FLAG(x))
+#define FLAG64(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned)(x) < 64) + (((uint64_t) 1ULL) << (unsigned)(x)))
+#define FLAG64_UNSAFE(x) ((unsigned)(x) < 64 ? (((uint64_t) 1ULL) << (unsigned)(x)) : 0)
+
+
+/* Size signifying variable-sized array */
+#define VAR 1
+
+
+/* fallback for round() */
+static inline double
+_hb_round (double x)
+{
+  if (x >= 0)
+    return floor (x + 0.5);
+  else
+    return ceil (x - 0.5);
+}
+#if !defined (HAVE_ROUND) && !defined (HAVE_DECL_ROUND)
+#define round(x) _hb_round(x)
+#endif
+
+
+/* fallback for posix_memalign() */
+static inline int
+_hb_memalign(void **memptr, size_t alignment, size_t size)
+{
+  if (unlikely (0 != (alignment & (alignment - 1)) ||
+		!alignment ||
+		0 != (alignment & (sizeof (void *) - 1))))
+    return EINVAL;
+
+  char *p = (char *) malloc (size + alignment - 1);
+  if (unlikely (!p))
+    return ENOMEM;
+
+  size_t off = (size_t) p & (alignment - 1);
+  if (off)
+    p += alignment - off;
+
+  *memptr = (void *) p;
+
+  return 0;
+}
+#if !defined(posix_memalign) && !defined(HAVE_POSIX_MEMALIGN)
+#define posix_memalign _hb_memalign
+#endif
+
+
+/*
+ * For lack of a better place, put Zawgyi script hack here.
+ * https://github.com/harfbuzz/harfbuzz/issues/1162
+ */
+
+#define HB_SCRIPT_MYANMAR_ZAWGYI	((hb_script_t) HB_TAG ('Q','a','a','g'))
+
+
+/* Some really basic things everyone wants. */
+template <typename T> struct hb_remove_const { typedef T value; };
+template <typename T> struct hb_remove_const<const T> { typedef T value; };
+#define hb_remove_const(T) hb_remove_const<T>::value
+template <typename T> struct hb_remove_reference { typedef T value; };
+template <typename T> struct hb_remove_reference<T &> { typedef T value; };
+#define hb_remove_reference(T) hb_remove_reference<T>::value
+template <typename T> struct hb_remove_pointer { typedef T value; };
+template <typename T> struct hb_remove_pointer<T *> { typedef T value; };
+#define hb_remove_pointer(T) hb_remove_pointer<T>::value
+
+
+/* Headers we include for everyone.  Keep topologically sorted by dependency.
+ * They express dependency amongst themselves, but no other file should include
+ * them directly.*/
+#include "hb-atomic.hh"
+#include "hb-mutex.hh"
+#include "hb-null.hh"
+#include "hb-dsalgs.hh"	// Requires: hb-null
+#include "hb-iter.hh"	// Requires: hb-null
+#include "hb-debug.hh"	// Requires: hb-atomic hb-dsalgs
+#include "hb-array.hh"	// Requires: hb-dsalgs hb-iter hb-null
+#include "hb-vector.hh"	// Requires: hb-array hb-null
+#include "hb-object.hh"	// Requires: hb-atomic hb-mutex hb-vector
+
+#endif /* HB_HH */
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/main.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/main.cc
new file mode 100644
index 0000000..490b76e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/main.cc
@@ -0,0 +1,194 @@
+/*
+ * Copyright © 2007,2008,2009  Red Hat, 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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ */
+
+#include "hb-static.cc"
+#include "hb-open-file.hh"
+#include "hb-ot-layout-gdef-table.hh"
+#include "hb-ot-layout-gsubgpos.hh"
+
+#ifdef HAVE_GLIB
+#include <glib.h>
+#endif
+#include <stdlib.h>
+#include <stdio.h>
+
+
+using namespace OT;
+
+int
+main (int argc, char **argv)
+{
+  if (argc != 2) {
+    fprintf (stderr, "usage: %s font-file.ttf\n", argv[0]);
+    exit (1);
+  }
+
+  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  unsigned int len;
+  const char *font_data = hb_blob_get_data (blob, &len);
+  printf ("Opened font file %s: %d bytes long\n", argv[1], len);
+
+  hb_blob_t *font_blob = hb_sanitize_context_t().sanitize_blob<OpenTypeFontFile> (blob);
+  const OpenTypeFontFile* sanitized = font_blob->as<OpenTypeFontFile> ();
+  if (!font_blob->data)
+  {
+    printf ("Sanitization of the file wasn't successful. Exit");
+    return 1;
+  }
+  const OpenTypeFontFile& ot = *sanitized;
+
+
+  switch (ot.get_tag ()) {
+  case OpenTypeFontFile::TrueTypeTag:
+    printf ("OpenType font with TrueType outlines\n");
+    break;
+  case OpenTypeFontFile::CFFTag:
+    printf ("OpenType font with CFF (Type1) outlines\n");
+    break;
+  case OpenTypeFontFile::TTCTag:
+    printf ("TrueType Collection of OpenType fonts\n");
+    break;
+  case OpenTypeFontFile::TrueTag:
+    printf ("Obsolete Apple TrueType font\n");
+    break;
+  case OpenTypeFontFile::Typ1Tag:
+    printf ("Obsolete Apple Type1 font in SFNT container\n");
+    break;
+  case OpenTypeFontFile::DFontTag:
+    printf ("DFont Mac Resource Fork\n");
+    break;
+  default:
+    printf ("Unknown font format\n");
+    break;
+  }
+
+  int num_fonts = ot.get_face_count ();
+  printf ("%d font(s) found in file\n", num_fonts);
+  for (int n_font = 0; n_font < num_fonts; n_font++) {
+    const OpenTypeFontFace &font = ot.get_face (n_font);
+    printf ("Font %d of %d:\n", n_font, num_fonts);
+
+    int num_tables = font.get_table_count ();
+    printf ("  %d table(s) found in font\n", num_tables);
+    for (int n_table = 0; n_table < num_tables; n_table++) {
+      const OpenTypeTable &table = font.get_table (n_table);
+      printf ("  Table %2d of %2d: %.4s (0x%08x+0x%08x)\n", n_table, num_tables,
+	      (const char *) table.tag,
+	      (unsigned int) table.offset,
+	      (unsigned int) table.length);
+
+      switch (table.tag) {
+
+      case HB_OT_TAG_GSUB:
+      case HB_OT_TAG_GPOS:
+	{
+
+	const GSUBGPOS &g = *CastP<GSUBGPOS> (font_data + table.offset);
+
+	int num_scripts = g.get_script_count ();
+	printf ("    %d script(s) found in table\n", num_scripts);
+	for (int n_script = 0; n_script < num_scripts; n_script++) {
+	  const Script &script = g.get_script (n_script);
+	  printf ("    Script %2d of %2d: %.4s\n", n_script, num_scripts,
+	          (const char *)g.get_script_tag(n_script));
+
+	  if (!script.has_default_lang_sys())
+	    printf ("      No default language system\n");
+	  int num_langsys = script.get_lang_sys_count ();
+	  printf ("      %d language system(s) found in script\n", num_langsys);
+	  for (int n_langsys = script.has_default_lang_sys() ? -1 : 0; n_langsys < num_langsys; n_langsys++) {
+	    const LangSys &langsys = n_langsys == -1
+				   ? script.get_default_lang_sys ()
+				   : script.get_lang_sys (n_langsys);
+	    if (n_langsys == -1)
+	      printf ("      Default Language System\n");
+	    else
+	      printf ("      Language System %2d of %2d: %.4s\n", n_langsys, num_langsys,
+		      (const char *)script.get_lang_sys_tag (n_langsys));
+	    if (!langsys.has_required_feature ())
+	      printf ("        No required feature\n");
+	    else
+	      printf ("        Required feature index: %d\n",
+		      langsys.get_required_feature_index ());
+
+	    int num_features = langsys.get_feature_count ();
+	    printf ("        %d feature(s) found in language system\n", num_features);
+	    for (int n_feature = 0; n_feature < num_features; n_feature++) {
+	      printf ("        Feature index %2d of %2d: %d\n", n_feature, num_features,
+	              langsys.get_feature_index (n_feature));
+	    }
+	  }
+	}
+
+	int num_features = g.get_feature_count ();
+	printf ("    %d feature(s) found in table\n", num_features);
+	for (int n_feature = 0; n_feature < num_features; n_feature++) {
+	  const Feature &feature = g.get_feature (n_feature);
+	  int num_lookups = feature.get_lookup_count ();
+	  printf ("    Feature %2d of %2d: %c%c%c%c\n", n_feature, num_features,
+	          HB_UNTAG(g.get_feature_tag(n_feature)));
+
+	  printf ("        %d lookup(s) found in feature\n", num_lookups);
+	  for (int n_lookup = 0; n_lookup < num_lookups; n_lookup++) {
+	    printf ("        Lookup index %2d of %2d: %d\n", n_lookup, num_lookups,
+	            feature.get_lookup_index (n_lookup));
+	  }
+	}
+
+	int num_lookups = g.get_lookup_count ();
+	printf ("    %d lookup(s) found in table\n", num_lookups);
+	for (int n_lookup = 0; n_lookup < num_lookups; n_lookup++) {
+	  const Lookup &lookup = g.get_lookup (n_lookup);
+	  printf ("    Lookup %2d of %2d: type %d, props 0x%04X\n", n_lookup, num_lookups,
+	          lookup.get_type(), lookup.get_props());
+	}
+
+	}
+	break;
+
+      case GDEF::tableTag:
+	{
+
+	const GDEF &gdef = *CastP<GDEF> (font_data + table.offset);
+
+	printf ("    Has %sglyph classes\n",
+		  gdef.has_glyph_classes () ? "" : "no ");
+	printf ("    Has %smark attachment types\n",
+		  gdef.has_mark_attachment_types () ? "" : "no ");
+	printf ("    Has %sattach points\n",
+		  gdef.has_attach_points () ? "" : "no ");
+	printf ("    Has %slig carets\n",
+		  gdef.has_lig_carets () ? "" : "no ");
+	printf ("    Has %smark sets\n",
+		  gdef.has_mark_sets () ? "" : "no ");
+	break;
+	}
+      }
+    }
+  }
+
+  return 0;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-buffer-serialize.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-buffer-serialize.cc
new file mode 100644
index 0000000..a91f4f7
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-buffer-serialize.cc
@@ -0,0 +1,89 @@
+/*
+ * Copyright © 2010,2011,2013  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
+ */
+
+#include "hb.hh"
+
+#include "hb.h"
+#include "hb-ot.h"
+#ifdef HAVE_FREETYPE
+#include "hb-ft.h"
+#endif
+
+#include <stdio.h>
+
+int
+main (int argc, char **argv)
+{
+  if (argc != 2) {
+    fprintf (stderr, "usage: %s font-file\n", argv[0]);
+    exit (1);
+  }
+
+  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  hb_face_t *face = hb_face_create (blob, 0 /* first face */);
+  hb_blob_destroy (blob);
+  blob = nullptr;
+
+  unsigned int upem = hb_face_get_upem (face);
+  hb_font_t *font = hb_font_create (face);
+  hb_face_destroy (face);
+  hb_font_set_scale (font, upem, upem);
+  hb_ot_font_set_funcs (font);
+#ifdef HAVE_FREETYPE
+  //hb_ft_font_set_funcs (font);
+#endif
+
+  hb_buffer_t *buf;
+  buf = hb_buffer_create ();
+
+  bool ret = true;
+  char line[BUFSIZ], out[BUFSIZ];
+  while (fgets (line, sizeof(line), stdin) != nullptr)
+  {
+    hb_buffer_clear_contents (buf);
+
+    const char *p = line;
+    while (hb_buffer_deserialize_glyphs (buf,
+					 p, -1, &p,
+					 font,
+					 HB_BUFFER_SERIALIZE_FORMAT_JSON))
+      ;
+    if (*p && *p != '\n')
+      ret = false;
+
+    hb_buffer_serialize_glyphs (buf, 0, hb_buffer_get_length (buf),
+				out, sizeof (out), nullptr,
+				font, HB_BUFFER_SERIALIZE_FORMAT_JSON,
+				HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
+    puts (out);
+  }
+
+  hb_buffer_destroy (buf);
+
+  hb_font_destroy (font);
+
+  return !ret;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-iter.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-iter.cc
new file mode 100644
index 0000000..05430b0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-iter.cc
@@ -0,0 +1,84 @@
+/*
+ * Copyright © 2018  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
+ */
+
+#include "hb.hh"
+#include "hb-iter.hh"
+
+#include "hb-array.hh"
+#include "hb-set.hh"
+
+
+template <typename T>
+struct array_iter_t : hb_iter_t<array_iter_t<T>, T>, hb_iter_mixin_t<array_iter_t<T>, T>
+{
+  array_iter_t (hb_array_t<T> arr_) : arr (arr_) {}
+
+  typedef T __item_type__;
+  T& __item_at__ (unsigned i) const { return arr[i]; }
+  void __forward__ (unsigned n) { arr += n; }
+  void __rewind__ (unsigned n) { arr -= n; }
+  unsigned __len__ () const { return arr.length; }
+  bool __random_access__ () const { return true; }
+
+  private:
+  hb_array_t<T> arr;
+};
+
+template <typename T>
+struct some_array_t
+{
+  some_array_t (hb_array_t<T> arr_) : arr (arr_) {}
+
+  typedef array_iter_t<T> iter_t;
+  array_iter_t<T> iter () { return array_iter_t<T> (arr); }
+  operator array_iter_t<T> () { return iter (); }
+  operator hb_iter_t<array_iter_t<T> > () { return iter (); }
+
+  private:
+  hb_array_t<T> arr;
+};
+
+int
+main (int argc, char **argv)
+{
+  const int src[10] = {};
+  int dst[20];
+  hb_vector_t<int> v;
+
+  array_iter_t<const int> s (src); /* Implicit conversion from static array. */
+  array_iter_t<const int> s2 (v); /* Implicit conversion from vector. */
+  array_iter_t<int> t (dst);
+
+  some_array_t<const int> a (src);
+
+  s2 = s;
+
+  hb_fill (t, 42);
+  hb_copy (t, s);
+ // hb_copy (t, a.iter ());
+
+  return 0;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-name-table.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-name-table.cc
new file mode 100644
index 0000000..518e4eb
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-name-table.cc
@@ -0,0 +1,69 @@
+/*
+ * Copyright © 2018  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
+ */
+
+#include "hb.hh"
+#include "hb-ot.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+int
+main (int argc, char **argv)
+{
+  if (argc != 2) {
+    fprintf (stderr, "usage: %s font-file\n", argv[0]);
+    exit (1);
+  }
+
+  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  hb_face_t *face = hb_face_create (blob, 0 /* first face */);
+  hb_blob_destroy (blob);
+  blob = nullptr;
+
+  unsigned int count;
+  const hb_ot_name_entry_t *entries = hb_ot_name_list_names (face, &count);
+
+  for (unsigned int i = 0; i < count; i++)
+  {
+    printf ("%u	%s	",
+	    entries[i].name_id,
+	    hb_language_to_string (entries[i].language));
+
+    char buf[64];
+    unsigned int buf_size = sizeof (buf);
+    hb_ot_name_get_utf8 (face,
+			 entries[i].name_id,
+			 entries[i].language,
+			 &buf_size,
+			 buf);
+
+    printf ("%s\n", buf);
+  }
+
+  hb_face_destroy (face);
+
+  return count ? 0 : 1;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-ot-color.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-ot-color.cc
new file mode 100644
index 0000000..4050a66
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-ot-color.cc
@@ -0,0 +1,336 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ * Copyright © 2018  Khaled Hosny
+ *
+ *  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.
+ */
+
+#include "hb.h"
+#include "hb-ot.h"
+
+#include "hb-ft.h"
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_GLYPH_H
+
+#include <cairo.h>
+#include <cairo-ft.h>
+#include <cairo-svg.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+static void
+svg_dump (hb_face_t *face, unsigned int face_index)
+{
+  unsigned glyph_count = hb_face_get_glyph_count (face);
+
+  for (unsigned int glyph_id = 0; glyph_id < glyph_count; glyph_id++)
+  {
+    hb_blob_t *blob = hb_ot_color_glyph_reference_svg (face, glyph_id);
+
+    if (hb_blob_get_length (blob) == 0) continue;
+
+    unsigned int length;
+    const char *data = hb_blob_get_data (blob, &length);
+
+    char output_path[255];
+    sprintf (output_path, "out/svg-%u-%u.svg%s",
+	     glyph_id,
+	     face_index,
+	     // append "z" if the content is gzipped, https://stackoverflow.com/a/6059405
+	     (length > 2 && (data[0] == '\x1F') && (data[1] == '\x8B')) ? "z" : "");
+
+    FILE *f = fopen (output_path, "wb");
+    fwrite (data, 1, length, f);
+    fclose (f);
+
+    hb_blob_destroy (blob);
+  }
+}
+
+/* _png API is so easy to use unlike the below code, don't get confused */
+static void
+png_dump (hb_face_t *face, unsigned int face_index)
+{
+  unsigned glyph_count = hb_face_get_glyph_count (face);
+  hb_font_t *font = hb_font_create (face);
+
+  /* scans the font for strikes */
+  unsigned int sample_glyph_id;
+  /* we don't care about different strikes for different glyphs at this point */
+  for (sample_glyph_id = 0; sample_glyph_id < glyph_count; sample_glyph_id++)
+  {
+    hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, sample_glyph_id);
+    unsigned int blob_length = hb_blob_get_length (blob);
+    hb_blob_destroy (blob);
+    if (blob_length != 0)
+      break;
+  }
+
+  unsigned int upem = hb_face_get_upem (face);
+  unsigned int blob_length = 0;
+  unsigned int strike = 0;
+  for (unsigned int ppem = 1; ppem < upem; ppem++)
+  {
+    hb_font_set_ppem (font, ppem, ppem);
+    hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, sample_glyph_id);
+    unsigned int new_blob_length = hb_blob_get_length (blob);
+    hb_blob_destroy (blob);
+    if (new_blob_length != blob_length)
+    {
+      for (unsigned int glyph_id = 0; glyph_id < glyph_count; glyph_id++)
+      {
+	hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, glyph_id);
+
+	if (hb_blob_get_length (blob) == 0) continue;
+
+	unsigned int length;
+	const char *data = hb_blob_get_data (blob, &length);
+
+	char output_path[255];
+	sprintf (output_path, "out/png-%u-%u-%u.png", glyph_id, strike, face_index);
+
+	FILE *f = fopen (output_path, "wb");
+	fwrite (data, 1, length, f);
+	fclose (f);
+
+	hb_blob_destroy (blob);
+      }
+
+      strike++;
+      blob_length = new_blob_length;
+    }
+  }
+
+  hb_font_destroy (font);
+}
+
+static void
+layered_glyph_dump (hb_face_t *face, cairo_font_face_t *cairo_face, unsigned int face_index)
+{
+  unsigned int upem = hb_face_get_upem (face);
+
+  unsigned glyph_count = hb_face_get_glyph_count (face);
+  for (hb_codepoint_t gid = 0; gid < glyph_count; ++gid)
+  {
+    unsigned int num_layers = hb_ot_color_glyph_get_layers (face, gid, 0, NULL, NULL);
+    if (!num_layers)
+      continue;
+
+    hb_ot_color_layer_t *layers = (hb_ot_color_layer_t*) malloc (num_layers * sizeof (hb_ot_color_layer_t));
+
+    hb_ot_color_glyph_get_layers (face, gid, 0, &num_layers, layers);
+    if (num_layers)
+    {
+      // Measure
+      cairo_text_extents_t extents;
+      {
+	cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
+	cairo_t *cr = cairo_create (surface);
+	cairo_set_font_face (cr, cairo_face);
+	cairo_set_font_size (cr, upem);
+
+	cairo_glyph_t *glyphs = (cairo_glyph_t *) calloc (num_layers, sizeof (cairo_glyph_t));
+	for (unsigned int j = 0; j < num_layers; ++j)
+	  glyphs[j].index = layers[j].glyph;
+	cairo_glyph_extents (cr, glyphs, num_layers, &extents);
+	free (glyphs);
+	cairo_surface_destroy (surface);
+	cairo_destroy (cr);
+      }
+
+      // Add a slight margin
+      extents.width += extents.width / 10;
+      extents.height += extents.height / 10;
+      extents.x_bearing -= extents.width / 20;
+      extents.y_bearing -= extents.height / 20;
+
+      // Render
+      unsigned int palette_count = hb_ot_color_palette_get_count (face);
+      for (unsigned int palette = 0; palette < palette_count; palette++)
+      {
+	unsigned int num_colors = hb_ot_color_palette_get_colors (face, palette, 0, NULL, NULL);
+	if (!num_colors)
+	  continue;
+
+	hb_color_t *colors = (hb_color_t*) calloc (num_colors, sizeof (hb_color_t));
+	hb_ot_color_palette_get_colors (face, palette, 0, &num_colors, colors);
+	if (num_colors)
+	{
+	  char output_path[255];
+	  sprintf (output_path, "out/colr-%u-%u-%u.svg", gid, palette, face_index);
+
+	  cairo_surface_t *surface = cairo_svg_surface_create (output_path, extents.width, extents.height);
+	  cairo_t *cr = cairo_create (surface);
+	  cairo_set_font_face (cr, cairo_face);
+	  cairo_set_font_size (cr, upem);
+
+	  for (unsigned int layer = 0; layer < num_layers; ++layer)
+	  {
+	    hb_color_t color = 0x000000FF;
+	    if (layers[layer].color_index != 0xFFFF)
+	      color = colors[layers[layer].color_index];
+	    cairo_set_source_rgba (cr,
+				   hb_color_get_red (color) / 255.,
+				   hb_color_get_green (color) / 255.,
+				   hb_color_get_blue (color) / 255.,
+				   hb_color_get_alpha (color) / 255.);
+
+	    cairo_glyph_t glyph;
+	    glyph.index = layers[layer].glyph;
+	    glyph.x = -extents.x_bearing;
+	    glyph.y = -extents.y_bearing;
+	    cairo_show_glyphs (cr, &glyph, 1);
+	  }
+
+	  cairo_surface_destroy (surface);
+	  cairo_destroy (cr);
+	}
+	free (colors);
+      }
+    }
+
+    free (layers);
+  }
+}
+
+static void
+dump_glyphs (cairo_font_face_t *cairo_face, unsigned int upem,
+	     unsigned int num_glyphs, unsigned int face_index)
+{
+  for (unsigned int i = 0; i < num_glyphs; ++i)
+  {
+    cairo_text_extents_t extents;
+    cairo_glyph_t glyph = {0};
+    glyph.index = i;
+
+    // Measure
+    {
+      cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
+      cairo_t *cr = cairo_create (surface);
+      cairo_set_font_face (cr, cairo_face);
+      cairo_set_font_size (cr, upem);
+
+      cairo_glyph_extents (cr, &glyph, 1, &extents);
+      cairo_surface_destroy (surface);
+      cairo_destroy (cr);
+    }
+
+    // Add a slight margin
+    extents.width += extents.width / 10;
+    extents.height += extents.height / 10;
+    extents.x_bearing -= extents.width / 20;
+    extents.y_bearing -= extents.height / 20;
+
+    // Render
+    {
+      char output_path[255];
+      sprintf (output_path, "out/%u-%u.svg", face_index, i);
+      cairo_surface_t *surface = cairo_svg_surface_create (output_path, extents.width, extents.height);
+      cairo_t *cr = cairo_create (surface);
+      cairo_set_font_face (cr, cairo_face);
+      cairo_set_font_size (cr, upem);
+      glyph.x = -extents.x_bearing;
+      glyph.y = -extents.y_bearing;
+      cairo_show_glyphs (cr, &glyph, 1);
+      cairo_surface_destroy (surface);
+      cairo_destroy (cr);
+    }
+  }
+}
+
+int
+main (int argc, char **argv)
+{
+  if (argc != 2) {
+    fprintf (stderr, "usage: %s font-file.ttf\n"
+		     "run it like `rm -rf out && mkdir out && %s font-file.ttf`\n",
+		     argv[0], argv[0]);
+    exit (1);
+  }
+
+
+  FILE *font_name_file = fopen ("out/.dumped_font_name", "r");
+  if (font_name_file != NULL)
+  {
+    fprintf (stderr, "Purge or move ./out folder in order to run a new dump\n");
+    exit (1);
+  }
+
+  font_name_file = fopen ("out/.dumped_font_name", "w");
+  if (font_name_file == NULL)
+  {
+    fprintf (stderr, "./out is not accessible as a folder, create it please\n");
+    exit (1);
+  }
+  fwrite (argv[1], 1, strlen (argv[1]), font_name_file);
+  fclose (font_name_file);
+
+  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  unsigned int num_faces = hb_face_count (blob);
+  if (num_faces == 0)
+  {
+    fprintf (stderr, "error: The file (%s) was corrupted, empty or not found", argv[1]);
+    exit (1);
+  }
+
+  for (unsigned int face_index = 0; face_index < hb_face_count (blob); face_index++)
+  {
+    hb_face_t *face = hb_face_create (blob, face_index);
+    hb_font_t *font = hb_font_create (face);
+
+    if (hb_ot_color_has_png (face)) printf ("Dumping png (cbdt/sbix)...\n");
+    png_dump (face, face_index);
+
+    if (hb_ot_color_has_svg (face)) printf ("Dumping svg...\n");
+    svg_dump (face, face_index);
+
+    cairo_font_face_t *cairo_face;
+    {
+      FT_Library library;
+      FT_Init_FreeType (&library);
+      FT_Face ft_face;
+      FT_New_Face (library, argv[1], 0, &ft_face);
+      cairo_face = cairo_ft_font_face_create_for_ft_face (ft_face, 0);
+    }
+    if (hb_ot_color_has_layers (face) && hb_ot_color_has_palettes (face))
+      printf ("Dumping layered color glyphs...\n");
+    layered_glyph_dump (face, cairo_face, face_index);
+
+    unsigned int num_glyphs = hb_face_get_glyph_count (face);
+    unsigned int upem = hb_face_get_upem (face);
+
+    // disabled when color font as cairo rendering of NotoColorEmoji is soooo slow
+    if (!hb_ot_color_has_layers (face) &&
+        !hb_ot_color_has_png (face) &&
+        !hb_ot_color_has_svg (face))
+      dump_glyphs (cairo_face, upem, num_glyphs, face_index);
+
+    hb_font_destroy (font);
+    hb_face_destroy (face);
+    }
+
+  hb_blob_destroy (blob);
+
+  return 0;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-size-params.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-size-params.cc
new file mode 100644
index 0000000..12eec61
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-size-params.cc
@@ -0,0 +1,54 @@
+/*
+ * Copyright © 2010,2011  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
+ */
+
+#include "hb.hh"
+
+#include "hb.h"
+#include "hb-ot.h"
+
+#include <stdio.h>
+
+int
+main (int argc, char **argv)
+{
+  if (argc != 2) {
+    fprintf (stderr, "usage: %s font-file\n", argv[0]);
+    exit (1);
+  }
+
+  /* Create the face */
+  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  hb_face_t *face = hb_face_create (blob, 0 /* first face */);
+  hb_blob_destroy (blob);
+  blob = nullptr;
+
+  unsigned int p[5];
+  bool ret = hb_ot_layout_get_size_params (face, p, p+1, (p+2), p+3, p+4);
+
+  printf ("%g %u %u %g %g\n", p[0]/10., p[1], p[2], p[3]/10., p[4]/10.);
+
+  return !ret;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-unicode-ranges.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-unicode-ranges.cc
new file mode 100644
index 0000000..0eef8c2
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-unicode-ranges.cc
@@ -0,0 +1,66 @@
+/*
+ * Copyright © 2018  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): Garret Rieger
+ */
+
+#include "hb.hh"
+#include "hb-ot-os2-unicode-ranges.hh"
+
+static void
+test (hb_codepoint_t cp, unsigned int bit)
+{
+  if (OT::_hb_ot_os2_get_unicode_range_bit (cp) != bit)
+  {
+    fprintf (stderr, "got incorrect bit (%d) for cp 0x%X. Should have been %d.",
+             OT::_hb_ot_os2_get_unicode_range_bit (cp),
+             cp,
+             bit);
+    abort();
+  }
+}
+
+static void
+test_get_unicode_range_bit ()
+{
+  test (0x0000, 0);
+  test (0x0042, 0);
+  test (0x007F, 0);
+  test (0x0080, 1);
+
+  test (0x30A0, 50);
+  test (0x30B1, 50);
+  test (0x30FF, 50);
+
+  test (0x10FFFD, 90);
+
+  test (0x30000, -1);
+  test (0x110000, -1);
+}
+
+int
+main ()
+{
+  test_get_unicode_range_bit ();
+  return 0;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-would-substitute.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-would-substitute.cc
new file mode 100644
index 0000000..268f7db
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test-would-substitute.cc
@@ -0,0 +1,64 @@
+/*
+ * Copyright © 2010,2011  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
+ */
+
+#include "hb.hh"
+
+#include "hb.h"
+#include "hb-ot.h"
+
+#include <stdio.h>
+
+#ifdef HAVE_FREETYPE
+#include "hb-ft.h"
+#endif
+
+int
+main (int argc, char **argv)
+{
+  if (argc != 4 && argc != 5) {
+    fprintf (stderr, "usage: %s font-file lookup-index first-glyph [second-glyph]\n", argv[0]);
+    exit (1);
+  }
+
+  /* Create the face */
+  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  hb_face_t *face = hb_face_create (blob, 0 /* first face */);
+  hb_blob_destroy (blob);
+  blob = nullptr;
+
+  hb_font_t *font = hb_font_create (face);
+#ifdef HAVE_FREETYPE
+  hb_ft_font_set_funcs (font);
+#endif
+
+  unsigned int len = argc - 3;
+  hb_codepoint_t glyphs[2];
+  if (!hb_font_glyph_from_string (font, argv[3], -1, &glyphs[0]) ||
+      (argc > 4 &&
+       !hb_font_glyph_from_string (font, argv[4], -1, &glyphs[1])))
+    return 2;
+  return !hb_ot_layout_lookup_would_substitute (face, strtol (argv[2], nullptr, 0), glyphs, len, false);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test.cc
new file mode 100644
index 0000000..f0eace8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/src/test.cc
@@ -0,0 +1,94 @@
+/*
+ * Copyright © 2010,2011  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
+ */
+
+#include "hb.hh"
+
+#include "hb.h"
+
+#include <stdio.h>
+
+#ifdef HAVE_FREETYPE
+#include "hb-ft.h"
+#endif
+
+int
+main (int argc, char **argv)
+{
+  if (argc != 2) {
+    fprintf (stderr, "usage: %s font-file.ttf\n", argv[0]);
+    exit (1);
+  }
+
+  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  printf ("Opened font file %s: %u bytes long\n", argv[1], hb_blob_get_length (blob));
+
+  /* Create the face */
+  hb_face_t *face = hb_face_create (blob, 0 /* first face */);
+  hb_blob_destroy (blob);
+  blob = nullptr;
+  unsigned int upem = hb_face_get_upem (face);
+
+  hb_font_t *font = hb_font_create (face);
+  hb_font_set_scale (font, upem, upem);
+
+#ifdef HAVE_FREETYPE
+  hb_ft_font_set_funcs (font);
+#endif
+
+  hb_buffer_t *buffer = hb_buffer_create ();
+
+  hb_buffer_add_utf8 (buffer, "\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\x95", -1, 0, -1);
+  hb_buffer_guess_segment_properties (buffer);
+
+  hb_shape (font, buffer, nullptr, 0);
+
+  unsigned int count = hb_buffer_get_length (buffer);
+  hb_glyph_info_t *infos = hb_buffer_get_glyph_infos (buffer, nullptr);
+  hb_glyph_position_t *positions = hb_buffer_get_glyph_positions (buffer, nullptr);
+
+  for (unsigned int i = 0; i < count; i++)
+  {
+    hb_glyph_info_t *info = &infos[i];
+    hb_glyph_position_t *pos = &positions[i];
+
+    printf ("cluster %d	glyph 0x%x at	(%d,%d)+(%d,%d)\n",
+	    info->cluster,
+	    info->codepoint,
+	    pos->x_offset,
+	    pos->y_offset,
+	    pos->x_advance,
+	    pos->y_advance);
+
+  }
+
+  hb_buffer_destroy (buffer);
+  hb_font_destroy (font);
+  hb_face_destroy (face);
+
+  return 0;
+}
+
+
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/test-driver b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/test-driver
new file mode 100755
index 0000000..8e575b0
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/test-driver
@@ -0,0 +1,148 @@
+#! /bin/sh
+# test-driver - basic testsuite driver script.
+
+scriptversion=2013-07-13.22; # UTC
+
+# Copyright (C) 2011-2014 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+# Make unconditional expansion of undefined variables an error.  This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+usage_error ()
+{
+  echo "$0: $*" >&2
+  print_usage >&2
+  exit 2
+}
+
+print_usage ()
+{
+  cat <<END
+Usage:
+  test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
+              [--expect-failure={yes|no}] [--color-tests={yes|no}]
+              [--enable-hard-errors={yes|no}] [--]
+              TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
+The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+END
+}
+
+test_name= # Used for reporting.
+log_file=  # Where to save the output of the test script.
+trs_file=  # Where to save the metadata of the test run.
+expect_failure=no
+color_tests=no
+enable_hard_errors=yes
+while test $# -gt 0; do
+  case $1 in
+  --help) print_usage; exit $?;;
+  --version) echo "test-driver $scriptversion"; exit $?;;
+  --test-name) test_name=$2; shift;;
+  --log-file) log_file=$2; shift;;
+  --trs-file) trs_file=$2; shift;;
+  --color-tests) color_tests=$2; shift;;
+  --expect-failure) expect_failure=$2; shift;;
+  --enable-hard-errors) enable_hard_errors=$2; shift;;
+  --) shift; break;;
+  -*) usage_error "invalid option: '$1'";;
+   *) break;;
+  esac
+  shift
+done
+
+missing_opts=
+test x"$test_name" = x && missing_opts="$missing_opts --test-name"
+test x"$log_file"  = x && missing_opts="$missing_opts --log-file"
+test x"$trs_file"  = x && missing_opts="$missing_opts --trs-file"
+if test x"$missing_opts" != x; then
+  usage_error "the following mandatory options are missing:$missing_opts"
+fi
+
+if test $# -eq 0; then
+  usage_error "missing argument"
+fi
+
+if test $color_tests = yes; then
+  # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
+  red='' # Red.
+  grn='' # Green.
+  lgn='' # Light green.
+  blu='' # Blue.
+  mgn='' # Magenta.
+  std=''     # No color.
+else
+  red= grn= lgn= blu= mgn= std=
+fi
+
+do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
+trap "st=129; $do_exit" 1
+trap "st=130; $do_exit" 2
+trap "st=141; $do_exit" 13
+trap "st=143; $do_exit" 15
+
+# Test script is run here.
+"$@" >$log_file 2>&1
+estatus=$?
+
+if test $enable_hard_errors = no && test $estatus -eq 99; then
+  tweaked_estatus=1
+else
+  tweaked_estatus=$estatus
+fi
+
+case $tweaked_estatus:$expect_failure in
+  0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
+  0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;
+  77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;
+  99:*)  col=$mgn res=ERROR recheck=yes gcopy=yes;;
+  *:yes) col=$lgn res=XFAIL recheck=no  gcopy=yes;;
+  *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;
+esac
+
+# Report the test outcome and exit status in the logs, so that one can
+# know whether the test passed or failed simply by looking at the '.log'
+# file, without the need of also peaking into the corresponding '.trs'
+# file (automake bug#11814).
+echo "$res $test_name (exit status: $estatus)" >>$log_file
+
+# Report outcome to console.
+echo "${col}${res}${std}: $test_name"
+
+# Register the test result, and other relevant metadata.
+echo ":test-result: $res" > $trs_file
+echo ":global-test-result: $res" >> $trs_file
+echo ":recheck: $recheck" >> $trs_file
+echo ":copy-in-global-log: $gcopy" >> $trs_file
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/Makefile.am b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/Makefile.am
new file mode 100644
index 0000000..e24a6f3
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/Makefile.am
@@ -0,0 +1,75 @@
+# Process this file with automake to produce Makefile.in
+
+NULL =
+EXTRA_DIST =
+CLEANFILES =
+DISTCLEANFILES =
+MAINTAINERCLEANFILES =
+
+include Makefile.sources
+
+# Convenience targets:
+lib:
+	@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+libs:
+	@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
+
+bin_PROGRAMS =
+
+AM_CPPFLAGS = \
+	-DHB_DISABLE_DEPRECATED \
+	-I$(top_srcdir)/src/ \
+	-I$(top_builddir)/src/ \
+	$(GLIB_CFLAGS) \
+	$(FREETYPE_CFLAGS) \
+	$(CAIRO_FT_CFLAGS) \
+	$(NULL)
+LDADD = \
+	$(top_builddir)/src/libharfbuzz.la \
+	-lm \
+	$(GLIB_LIBS) \
+	$(FREETYPE_LIBS) \
+	$(NULL)
+
+if HAVE_GLIB
+
+if HAVE_FREETYPE
+if HAVE_CAIRO_FT
+hb_view_SOURCES = $(HB_VIEW_sources)
+hb_view_LDADD = \
+	$(LDADD) \
+	$(CAIRO_LIBS) \
+	$(CAIRO_FT_LIBS) \
+	$(NULL)
+bin_PROGRAMS += hb-view
+endif # HAVE_CAIRO_FT
+endif # HAVE_FREETYPE
+
+hb_shape_SOURCES = $(HB_SHAPE_sources)
+bin_PROGRAMS += hb-shape
+
+hb_subset_SOURCES = $(HB_SUBSET_CLI_sources)
+hb_subset_LDADD = \
+	$(LDADD) \
+	$(top_builddir)/src/libharfbuzz-subset.la
+bin_PROGRAMS += hb-subset
+
+hb_ot_shape_closure_SOURCES = $(HB_OT_SHAPE_CLOSURE_sources)
+bin_PROGRAMS += hb-ot-shape-closure
+
+endif # HAVE_GLIB
+
+#if HAVE_FONTCONFIG
+#hb_fc_list_SOURCES = \
+#	hb-fc.cc \
+#	hb-fc.h \
+#	hb-fc-list.c \
+#	$(NULL)
+#hb_fc_list_LDADD = \
+#	$(LDADD) \
+#	$(FONTCONFIG_LIBS) \
+#	$(NULL)
+#bin_PROGRAMS += hb-fc-list
+#endif # HAVE_FONTCONFIG
+
+-include $(top_srcdir)/git.mk
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/Makefile.in b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/Makefile.in
new file mode 100644
index 0000000..820a5a8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/Makefile.in
@@ -0,0 +1,904 @@
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am__append_1 = hb-view
+@HAVE_GLIB_TRUE@am__append_2 = hb-shape hb-subset hb-ot-shape-closure
+subdir = util
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
+	$(top_srcdir)/m4/ax_code_coverage.m4 \
+	$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am__EXEEXT_1 = hb-view$(EXEEXT)
+@HAVE_GLIB_TRUE@am__EXEEXT_2 = hb-shape$(EXEEXT) hb-subset$(EXEEXT) \
+@HAVE_GLIB_TRUE@	hb-ot-shape-closure$(EXEEXT)
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+am__hb_ot_shape_closure_SOURCES_DIST = hb-ot-shape-closure.cc \
+	options.cc options.hh main-font-text.hh
+am__objects_1 =
+am__objects_2 = hb-ot-shape-closure.$(OBJEXT) options.$(OBJEXT) \
+	$(am__objects_1)
+@HAVE_GLIB_TRUE@am_hb_ot_shape_closure_OBJECTS = $(am__objects_2)
+hb_ot_shape_closure_OBJECTS = $(am_hb_ot_shape_closure_OBJECTS)
+hb_ot_shape_closure_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+hb_ot_shape_closure_DEPENDENCIES = $(top_builddir)/src/libharfbuzz.la \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am__hb_shape_SOURCES_DIST = hb-shape.cc options.cc options.hh \
+	main-font-text.hh shape-consumer.hh
+am__objects_3 = hb-shape.$(OBJEXT) options.$(OBJEXT) $(am__objects_1)
+@HAVE_GLIB_TRUE@am_hb_shape_OBJECTS = $(am__objects_3)
+hb_shape_OBJECTS = $(am_hb_shape_OBJECTS)
+hb_shape_LDADD = $(LDADD)
+hb_shape_DEPENDENCIES = $(top_builddir)/src/libharfbuzz.la \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1)
+am__hb_subset_SOURCES_DIST = hb-subset.cc options.cc options.hh \
+	main-font-text.hh
+am__objects_4 = hb-subset.$(OBJEXT) options.$(OBJEXT) $(am__objects_1)
+@HAVE_GLIB_TRUE@am_hb_subset_OBJECTS = $(am__objects_4)
+hb_subset_OBJECTS = $(am_hb_subset_OBJECTS)
+am__DEPENDENCIES_2 = $(top_builddir)/src/libharfbuzz.la \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1)
+@HAVE_GLIB_TRUE@hb_subset_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@HAVE_GLIB_TRUE@	$(top_builddir)/src/libharfbuzz-subset.la
+am__hb_view_SOURCES_DIST = hb-view.cc options.cc options.hh \
+	main-font-text.hh shape-consumer.hh ansi-print.cc \
+	ansi-print.hh helper-cairo.cc helper-cairo.hh \
+	helper-cairo-ansi.cc helper-cairo-ansi.hh view-cairo.cc \
+	view-cairo.hh
+am__objects_5 = hb-view.$(OBJEXT) options.$(OBJEXT) \
+	ansi-print.$(OBJEXT) helper-cairo.$(OBJEXT) \
+	helper-cairo-ansi.$(OBJEXT) view-cairo.$(OBJEXT) \
+	$(am__objects_1)
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am_hb_view_OBJECTS = $(am__objects_5)
+hb_view_OBJECTS = $(am_hb_view_OBJECTS)
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@hb_view_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@	$(am__DEPENDENCIES_1) \
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@	$(am__DEPENDENCIES_1) \
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@	$(am__DEPENDENCIES_1)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(hb_ot_shape_closure_SOURCES) $(hb_shape_SOURCES) \
+	$(hb_subset_SOURCES) $(hb_view_SOURCES)
+DIST_SOURCES = $(am__hb_ot_shape_closure_SOURCES_DIST) \
+	$(am__hb_shape_SOURCES_DIST) $(am__hb_subset_SOURCES_DIST) \
+	$(am__hb_view_SOURCES_DIST)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
+	$(top_srcdir)/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_CONFIG = @ICU_CONFIG@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL = 
+EXTRA_DIST = 
+CLEANFILES = 
+DISTCLEANFILES = 
+MAINTAINERCLEANFILES = 
+HB_VIEW_sources = \
+	hb-view.cc \
+	options.cc \
+	options.hh \
+	main-font-text.hh \
+	shape-consumer.hh \
+	ansi-print.cc \
+	ansi-print.hh \
+	helper-cairo.cc \
+	helper-cairo.hh \
+	helper-cairo-ansi.cc \
+	helper-cairo-ansi.hh \
+	view-cairo.cc \
+	view-cairo.hh \
+	$(NULL)
+
+HB_SHAPE_sources = \
+	hb-shape.cc \
+	options.cc \
+	options.hh \
+	main-font-text.hh \
+	shape-consumer.hh \
+	$(NULL)
+
+HB_OT_SHAPE_CLOSURE_sources = \
+	hb-ot-shape-closure.cc \
+	options.cc \
+	options.hh \
+	main-font-text.hh \
+	$(NULL)
+
+HB_SUBSET_CLI_sources = \
+	hb-subset.cc \
+	options.cc \
+	options.hh \
+	main-font-text.hh \
+	$(NULL)
+
+AM_CPPFLAGS = \
+	-DHB_DISABLE_DEPRECATED \
+	-I$(top_srcdir)/src/ \
+	-I$(top_builddir)/src/ \
+	$(GLIB_CFLAGS) \
+	$(FREETYPE_CFLAGS) \
+	$(CAIRO_FT_CFLAGS) \
+	$(NULL)
+
+LDADD = \
+	$(top_builddir)/src/libharfbuzz.la \
+	-lm \
+	$(GLIB_LIBS) \
+	$(FREETYPE_LIBS) \
+	$(NULL)
+
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@hb_view_SOURCES = $(HB_VIEW_sources)
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@hb_view_LDADD = \
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@	$(LDADD) \
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@	$(CAIRO_LIBS) \
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@	$(CAIRO_FT_LIBS) \
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@	$(NULL)
+
+@HAVE_GLIB_TRUE@hb_shape_SOURCES = $(HB_SHAPE_sources)
+@HAVE_GLIB_TRUE@hb_subset_SOURCES = $(HB_SUBSET_CLI_sources)
+@HAVE_GLIB_TRUE@hb_subset_LDADD = \
+@HAVE_GLIB_TRUE@	$(LDADD) \
+@HAVE_GLIB_TRUE@	$(top_builddir)/src/libharfbuzz-subset.la
+
+@HAVE_GLIB_TRUE@hb_ot_shape_closure_SOURCES = $(HB_OT_SHAPE_CLOSURE_sources)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits util/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnits util/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+$(srcdir)/Makefile.sources $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+installcheck-binPROGRAMS: $(bin_PROGRAMS)
+	bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \
+	  case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \
+	   *" $$p "* | *" $(srcdir)/$$p "*) continue;; \
+	  esac; \
+	  f=`echo "$$p" | \
+	     sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  for opt in --help --version; do \
+	    if "$(DESTDIR)$(bindir)/$$f" $$opt >c$${pid}_.out \
+	         2>c$${pid}_.err </dev/null \
+		 && test -n "`cat c$${pid}_.out`" \
+		 && test -z "`cat c$${pid}_.err`"; then :; \
+	    else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \
+	  done; \
+	done; rm -f c$${pid}_.???; exit $$bad
+
+hb-ot-shape-closure$(EXEEXT): $(hb_ot_shape_closure_OBJECTS) $(hb_ot_shape_closure_DEPENDENCIES) $(EXTRA_hb_ot_shape_closure_DEPENDENCIES) 
+	@rm -f hb-ot-shape-closure$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(hb_ot_shape_closure_OBJECTS) $(hb_ot_shape_closure_LDADD) $(LIBS)
+
+hb-shape$(EXEEXT): $(hb_shape_OBJECTS) $(hb_shape_DEPENDENCIES) $(EXTRA_hb_shape_DEPENDENCIES) 
+	@rm -f hb-shape$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(hb_shape_OBJECTS) $(hb_shape_LDADD) $(LIBS)
+
+hb-subset$(EXEEXT): $(hb_subset_OBJECTS) $(hb_subset_DEPENDENCIES) $(EXTRA_hb_subset_DEPENDENCIES) 
+	@rm -f hb-subset$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(hb_subset_OBJECTS) $(hb_subset_LDADD) $(LIBS)
+
+hb-view$(EXEEXT): $(hb_view_OBJECTS) $(hb_view_DEPENDENCIES) $(EXTRA_hb_view_DEPENDENCIES) 
+	@rm -f hb-view$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(hb_view_OBJECTS) $(hb_view_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ansi-print.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-ot-shape-closure.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-shape.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-subset.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-view.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helper-cairo-ansi.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helper-cairo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/options.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/view-cairo.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am: installcheck-binPROGRAMS
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+	clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installcheck-binPROGRAMS \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am uninstall-binPROGRAMS
+
+.PRECIOUS: Makefile
+
+
+# Convenience targets:
+lib:
+	@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+libs:
+	@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
+
+#if HAVE_FONTCONFIG
+#hb_fc_list_SOURCES = \
+#	hb-fc.cc \
+#	hb-fc.h \
+#	hb-fc-list.c \
+#	$(NULL)
+#hb_fc_list_LDADD = \
+#	$(LDADD) \
+#	$(FONTCONFIG_LIBS) \
+#	$(NULL)
+#bin_PROGRAMS += hb-fc-list
+#endif # HAVE_FONTCONFIG
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/Makefile.sources b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/Makefile.sources
new file mode 100644
index 0000000..6c815d2
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/Makefile.sources
@@ -0,0 +1,37 @@
+HB_VIEW_sources = \
+	hb-view.cc \
+	options.cc \
+	options.hh \
+	main-font-text.hh \
+	shape-consumer.hh \
+	ansi-print.cc \
+	ansi-print.hh \
+	helper-cairo.cc \
+	helper-cairo.hh \
+	helper-cairo-ansi.cc \
+	helper-cairo-ansi.hh \
+	view-cairo.cc \
+	view-cairo.hh \
+	$(NULL)
+
+HB_SHAPE_sources = \
+	hb-shape.cc \
+	options.cc \
+	options.hh \
+	main-font-text.hh \
+	shape-consumer.hh \
+	$(NULL)
+
+HB_OT_SHAPE_CLOSURE_sources = \
+	hb-ot-shape-closure.cc \
+	options.cc \
+	options.hh \
+	main-font-text.hh \
+	$(NULL)
+
+HB_SUBSET_CLI_sources = \
+	hb-subset.cc \
+	options.cc \
+	options.hh \
+	main-font-text.hh \
+	$(NULL)
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/ansi-print.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/ansi-print.cc
new file mode 100644
index 0000000..49a0477
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/ansi-print.cc
@@ -0,0 +1,427 @@
+/*
+ * Copyright © 2012  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
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "ansi-print.hh"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+#include <fcntl.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h> /* for isatty() */
+#endif
+
+#if defined (_MSC_VER) && (_MSC_VER < 1800)
+static inline long int
+lround (double x)
+{
+  if (x >= 0)
+    return floor (x + 0.5);
+  else
+    return ceil (x - 0.5);
+}
+#endif
+
+#define ESC_E (char)27
+
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+
+#define CELL_W 8
+#define CELL_H (2 * CELL_W)
+
+struct color_diff_t
+{
+  int dot (const color_diff_t &o)
+  { return v[0]*o.v[0] + v[1]*o.v[1] + v[2]*o.v[2] + v[3]*o.v[3]; }
+
+  int v[4];
+};
+
+struct color_t
+{
+  static color_t from_ansi (unsigned int x)
+  {
+    color_t c = {(0xFFu<<24) | ((0xFFu*(x&1))<<16) | ((0xFFu*((x >> 1)&1))<<8) | (0xFFu*((x >> 2)&1))};
+    return c;
+  }
+  unsigned int to_ansi ()
+  {
+    return ((v >> 23) & 1) | ((v >> 14)&2) | ((v >> 5)&4);
+  }
+
+  color_diff_t diff (const color_t &o)
+  {
+    color_diff_t d;
+    for (unsigned int i = 0; i < 4; i++)
+      d.v[i] = (int) ((v >> (i*8))&0xFF) - (int) ((o.v >> (i*8))&0xFF);
+    return d;
+  }
+
+  uint32_t v;
+};
+
+struct image_t
+{
+  public:
+
+  image_t (unsigned int width_,
+	   unsigned int height_,
+	   const uint32_t *data_,
+	   unsigned int stride_) :
+		width (width_),
+		height (height_),
+		own_data (false),
+		data ((color_t *) data_),
+		stride (stride_) {}
+  image_t (unsigned int width_,
+	   unsigned int height_) :
+		width (width_),
+		height (height_),
+		own_data (true),
+		data ((color_t *) malloc (sizeof (data[0]) * width * height)),
+		stride (width) {}
+  ~image_t ()
+  { if (own_data) free (data); }
+
+  color_t &operator () (unsigned int x, unsigned int y)
+  { return data[x + y * stride]; }
+
+  color_t operator () (unsigned int x, unsigned int y) const
+  { return data[x + y * stride]; }
+
+  void
+  copy_sub_image (const image_t &s,
+		  unsigned int x, unsigned int y,
+		  unsigned int w, unsigned int h)
+  {
+    assert (x < width);
+    assert (y < height);
+    for (unsigned int row = 0; row < h; row++) {
+      color_t *p = data + x + MIN (y + row, height - 1) * stride;
+      color_t *q = s.data + row * s.stride;
+      if (x + w <= width)
+	for (unsigned int col = 0; col < w; col++)
+	  *q++ = *p++;
+      else {
+        unsigned int limit = width - x;
+	for (unsigned int col = 0; col < limit; col++)
+	  *q++ = *p++;
+	p--;
+	for (unsigned int col = limit; col < w; col++)
+	  *q++ = *p;
+      }
+    }
+  }
+
+  const unsigned int width;
+  const unsigned int height;
+
+  private:
+  bool own_data;
+  color_t * const data;
+  const unsigned int stride;
+};
+
+struct biimage_t
+{
+  public:
+
+  biimage_t (unsigned int width, unsigned int height) :
+		width (width),
+		height (height),
+		bg (0), fg (0), unicolor (true),
+		data ((uint8_t *) malloc (sizeof (data[0]) * width * height)) {}
+  ~biimage_t ()
+  { free (data); }
+
+  void set (const image_t &image)
+  {
+    assert (image.width == width);
+    assert (image.height == height);
+    int freq[8] = {0};
+    for (unsigned int y = 0; y < height; y++)
+      for (unsigned int x = 0; x < width; x++) {
+        color_t c = image (x, y);
+        freq[c.to_ansi ()]++;
+      }
+    bg = 0;
+    for (unsigned int i = 1; i < 8; i++)
+      if (freq[bg] < freq[i])
+        bg = i;
+    fg = 0;
+    for (unsigned int i = 1; i < 8; i++)
+      if (i != bg && freq[fg] < freq[i])
+        fg = i;
+    if (fg == bg || freq[fg] == 0) {
+      fg = bg;
+      unicolor = true;
+    }
+    else
+      unicolor = false;
+
+    /* Set the data... */
+
+    if (unicolor) {
+      memset (data, 0, sizeof (data[0]) * width * height);
+      return;
+    }
+
+    color_t bgc = color_t::from_ansi (bg);
+    color_t fgc = color_t::from_ansi (fg);
+    color_diff_t diff = fgc.diff (bgc);
+    int dd = diff.dot (diff);
+    for (unsigned int y = 0; y < height; y++)
+      for (unsigned int x = 0; x < width; x++) {
+        int d = diff.dot (image (x, y).diff (bgc));
+	(*this)(x, y) = d < 0 ? 0 : d > dd ? 255 : lround (d * 255. / dd);
+      }
+  }
+
+  uint8_t &operator () (unsigned int x, unsigned int y)
+  { return data[x + y * width]; }
+
+  uint8_t operator () (unsigned int x, unsigned int y) const
+  { return data[x + y * width]; }
+
+  const unsigned int width;
+  const unsigned int height;
+  unsigned int bg;
+  unsigned int fg;
+  bool unicolor;
+
+  private:
+  uint8_t * const data;
+};
+
+static const char *
+block_best (const biimage_t &bi, bool *inverse)
+{
+  assert (bi.width  <= CELL_W);
+  assert (bi.height <= CELL_H);
+
+  unsigned int score = (unsigned int) -1;
+  unsigned int row_sum[CELL_H] = {0};
+  unsigned int col_sum[CELL_W] = {0};
+  unsigned int row_sum_i[CELL_H] = {0};
+  unsigned int col_sum_i[CELL_W] = {0};
+  unsigned int quad[2][2] = {{0}};
+  unsigned int quad_i[2][2] = {{0}};
+  unsigned int total = 0;
+  unsigned int total_i = 0;
+  for (unsigned int y = 0; y < bi.height; y++)
+    for (unsigned int x = 0; x < bi.width; x++) {
+      unsigned int c = bi (x, y);
+      unsigned int c_i = 255 - c;
+      row_sum[y] += c;
+      row_sum_i[y] += c_i;
+      col_sum[x] += c;
+      col_sum_i[x] += c_i;
+      quad[2 * y / bi.height][2 * x / bi.width] += c;
+      quad_i[2 * y / bi.height][2 * x / bi.width] += c_i;
+      total += c;
+      total_i += c_i;
+    }
+
+  /* Make the sums cummulative */
+  for (unsigned int i = 1; i < bi.height; i++) {
+    row_sum[i] += row_sum[i - 1];
+    row_sum_i[i] += row_sum_i[i - 1];
+  }
+  for (unsigned int i = 1; i < bi.width;  i++) {
+    col_sum[i] += col_sum[i - 1];
+    col_sum_i[i] += col_sum_i[i - 1];
+  }
+
+  const char *best_c = " ";
+
+  /* Maybe empty is better! */
+  if (total < score) {
+    score = total;
+    *inverse = false;
+    best_c = " ";
+  }
+  /* Maybe full is better! */
+  if (total_i < score) {
+    score = total_i;
+    *inverse = true;
+    best_c = " ";
+  }
+
+  /* Find best lower line */
+  if (1) {
+    unsigned int best_s = (unsigned int) -1;
+    bool best_inv = false;
+    int best_i = 0;
+    for (unsigned int i = 0; i < bi.height - 1; i++)
+    {
+      unsigned int s;
+      s = row_sum[i] + total_i - row_sum_i[i];
+      if (s < best_s) {
+        best_s = s;
+	best_i = i;
+	best_inv = false;
+      }
+      s = row_sum_i[i] + total - row_sum[i];
+      if (s < best_s) {
+        best_s = s;
+	best_i = i;
+	best_inv = true;
+      }
+    }
+    if (best_s < score) {
+      static const char *lower[7] = {"▁", "▂", "▃", "▄", "▅", "▆", "▇"};
+      unsigned int which = lround ((double) ((best_i + 1) * 8) / bi.height);
+      if (1 <= which && which <= 7) {
+	score = best_s;
+	*inverse = best_inv;
+	best_c = lower[7 - which];
+      }
+    }
+  }
+
+  /* Find best left line */
+  if (1) {
+    unsigned int best_s = (unsigned int) -1;
+    bool best_inv = false;
+    int best_i = 0;
+    for (unsigned int i = 0; i < bi.width - 1; i++)
+    {
+      unsigned int s;
+      s = col_sum[i] + total_i - col_sum_i[i];
+      if (s < best_s) {
+        best_s = s;
+	best_i = i;
+	best_inv = true;
+      }
+      s = col_sum_i[i] + total - col_sum[i];
+      if (s < best_s) {
+        best_s = s;
+	best_i = i;
+	best_inv = false;
+      }
+    }
+    if (best_s < score) {
+      static const char *left [7] = {"▏", "▎", "▍", "▌", "▋", "▊", "▉"};
+      unsigned int which = lround ((double) ((best_i + 1) * 8) / bi.width);
+      if (1 <= which && which <= 7) {
+	score = best_s;
+	*inverse = best_inv;
+	best_c = left[which - 1];
+      }
+    }
+  }
+
+  /* Find best quadrant */
+  if (1) {
+    unsigned int q = 0;
+    unsigned int qs = 0;
+    for (unsigned int i = 0; i < 2; i++)
+      for (unsigned int j = 0; j < 2; j++)
+	if (quad[i][j] > quad_i[i][j]) {
+	  q += 1 << (2 * i + j);
+	  qs += quad_i[i][j];
+	} else
+	  qs += quad[i][j];
+    if (qs < score) {
+      const char *c = nullptr;
+      bool inv = false;
+      switch (q) {
+	case 1:  c = "▟"; inv = true;  break;
+	case 2:  c = "▙"; inv = true;  break;
+	case 4:  c = "▖"; inv = false; break;
+	case 8:  c = "▗"; inv = false; break;
+	case 9:  c = "▚"; inv = false; break;
+	case 6:  c = "▞"; inv = false; break;
+	case 7:  c = "▜"; inv = true;  break;
+	case 11: c = "▜"; inv = true;  break;
+	case 13: c = "▙"; inv = true;  break;
+	case 14: c = "▟"; inv = true;  break;
+      }
+      if (c) {
+	score = qs;
+	*inverse = inv;
+	best_c = c;
+      }
+    }
+  }
+
+  return best_c;
+}
+
+void
+ansi_print_image_rgb24 (const uint32_t *data,
+			unsigned int width,
+			unsigned int height,
+			unsigned int stride)
+{
+  image_t image (width, height, data, stride);
+
+  unsigned int rows = (height + CELL_H - 1) / CELL_H;
+  unsigned int cols = (width +  CELL_W - 1) / CELL_W;
+  image_t cell (CELL_W, CELL_H);
+  biimage_t bi (CELL_W, CELL_H);
+  unsigned int last_bg = -1, last_fg = -1;
+  for (unsigned int row = 0; row < rows; row++) {
+    for (unsigned int col = 0; col < cols; col++) {
+      image.copy_sub_image (cell, col * CELL_W, row * CELL_H, CELL_W, CELL_H);
+      bi.set (cell);
+      if (bi.unicolor) {
+        if (last_bg != bi.bg) {
+	  printf ("%c[%dm", ESC_E, 40 + bi.bg);
+	  last_bg = bi.bg;
+	}
+	printf (" ");
+      } else {
+        /* Figure out the closest character to the biimage */
+	bool inverse = false;
+        const char *c = block_best (bi, &inverse);
+	if (inverse) {
+	  if (last_bg != bi.fg || last_fg != bi.bg) {
+	    printf ("%c[%d;%dm", ESC_E, 30 + bi.bg, 40 + bi.fg);
+	    last_bg = bi.fg;
+	    last_fg = bi.bg;
+	  }
+	} else {
+	  if (last_bg != bi.bg || last_fg != bi.fg) {
+	    printf ("%c[%d;%dm", ESC_E, 40 + bi.bg, 30 + bi.fg);
+	    last_bg = bi.bg;
+	    last_fg = bi.fg;
+	  }
+	}
+	printf ("%s", c);
+      }
+    }
+    printf ("%c[0m\n", ESC_E); /* Reset */
+    last_bg = last_fg = -1;
+  }
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/ansi-print.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/ansi-print.hh
new file mode 100644
index 0000000..9640d89
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/ansi-print.hh
@@ -0,0 +1,39 @@
+/*
+ * Copyright © 2012  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 ANSI_PRINT_HH
+#define ANSI_PRINT_HH
+
+#include "hb.hh"
+
+void
+ansi_print_image_rgb24 (const uint32_t *data,
+			unsigned int width,
+			unsigned int height,
+			unsigned int stride);
+
+
+#endif
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/hb-ot-shape-closure.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/hb-ot-shape-closure.cc
new file mode 100644
index 0000000..77ca201
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/hb-ot-shape-closure.cc
@@ -0,0 +1,119 @@
+/*
+ * Copyright © 2012  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
+ */
+
+#include "main-font-text.hh"
+
+#ifdef HAVE_FREETYPE
+#include <hb-ft.h>
+#endif
+
+struct shape_closure_consumer_t : option_group_t
+{
+  shape_closure_consumer_t (option_parser_t *parser) :
+			    shaper (parser),
+			    show_glyph_names (true)
+  {
+    add_options (parser);
+  }
+
+  void add_options (struct option_parser_t *parser)
+  {
+    GOptionEntry entries[] =
+    {
+      {"no-glyph-names",	0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE,	&this->show_glyph_names,	"Use glyph indices instead of names",	nullptr},
+      {nullptr}
+    };
+    parser->add_group (entries,
+		       "format",
+		       "Format options:",
+		       "Options controlling output formatting",
+		       this);
+  }
+
+  void init (hb_buffer_t  *buffer_,
+	     const font_options_t *font_opts)
+  {
+    glyphs = hb_set_create ();
+    font = hb_font_reference (font_opts->get_font ());
+    failed = false;
+    buffer = hb_buffer_reference (buffer_);
+  }
+  void consume_line (const char   *text,
+		     unsigned int  text_len,
+		     const char   *text_before,
+		     const char   *text_after)
+  {
+    hb_set_clear (glyphs);
+    shaper.shape_closure (text, text_len, font, buffer, glyphs);
+
+    if (hb_set_is_empty (glyphs))
+      return;
+
+    /* Print it out! */
+    bool first = true;
+    for (hb_codepoint_t i = -1; hb_set_next (glyphs, &i);)
+    {
+      if (first)
+	first = false;
+      else
+	printf (" ");
+      if (show_glyph_names)
+      {
+	char glyph_name[64];
+	hb_font_glyph_to_string (font, i, glyph_name, sizeof (glyph_name));
+	printf ("%s", glyph_name);
+      } else
+	printf ("%u", i);
+    }
+  }
+  void finish (const font_options_t *font_opts)
+  {
+    printf ("\n");
+    hb_font_destroy (font);
+    font = nullptr;
+    hb_set_destroy (glyphs);
+    glyphs = nullptr;
+    hb_buffer_destroy (buffer);
+    buffer = nullptr;
+  }
+
+  bool failed;
+
+  protected:
+  shape_options_t shaper;
+  hb_bool_t show_glyph_names;
+
+  hb_set_t *glyphs;
+  hb_font_t *font;
+  hb_buffer_t *buffer;
+};
+
+int
+main (int argc, char **argv)
+{
+  main_font_text_t<shape_closure_consumer_t, FONT_SIZE_NONE, 0> driver;
+  return driver.main (argc, argv);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/hb-shape.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/hb-shape.cc
new file mode 100644
index 0000000..3ae3fa1b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/hb-shape.cc
@@ -0,0 +1,190 @@
+/*
+ * Copyright © 2010  Behdad Esfahbod
+ * Copyright © 2011,2012  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
+ */
+
+#include "main-font-text.hh"
+#include "shape-consumer.hh"
+
+struct output_buffer_t
+{
+  output_buffer_t (option_parser_t *parser)
+		  : options (parser, hb_buffer_serialize_list_formats ()),
+		    format (parser),
+		    gs (nullptr),
+		    line_no (0),
+		    font (nullptr),
+		    output_format (HB_BUFFER_SERIALIZE_FORMAT_INVALID),
+		    format_flags (HB_BUFFER_SERIALIZE_FLAG_DEFAULT) {}
+
+  void init (hb_buffer_t *buffer, const font_options_t *font_opts)
+  {
+    options.get_file_handle ();
+    gs = g_string_new (nullptr);
+    line_no = 0;
+    font = hb_font_reference (font_opts->get_font ());
+
+    if (!options.output_format)
+      output_format = HB_BUFFER_SERIALIZE_FORMAT_TEXT;
+    else
+      output_format = hb_buffer_serialize_format_from_string (options.output_format, -1);
+    /* An empty "output_format" parameter basically skips output generating.
+     * Useful for benchmarking. */
+    if ((!options.output_format || *options.output_format) &&
+	!hb_buffer_serialize_format_to_string (output_format))
+    {
+      if (options.explicit_output_format)
+	fail (false, "Unknown output format `%s'; supported formats are: %s",
+	      options.output_format,
+	      g_strjoinv ("/", const_cast<char**> (options.supported_formats)));
+      else
+	/* Just default to TEXT if not explicitly requested and the
+	 * file extension is not recognized. */
+	output_format = HB_BUFFER_SERIALIZE_FORMAT_TEXT;
+    }
+
+    unsigned int flags = HB_BUFFER_SERIALIZE_FLAG_DEFAULT;
+    if (!format.show_glyph_names)
+      flags |= HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES;
+    if (!format.show_clusters)
+      flags |= HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS;
+    if (!format.show_positions)
+      flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS;
+    if (!format.show_advances)
+      flags |= HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES;
+    if (format.show_extents)
+      flags |= HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS;
+    if (format.show_flags)
+      flags |= HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS;
+    format_flags = (hb_buffer_serialize_flags_t) flags;
+
+    if (format.trace)
+      hb_buffer_set_message_func (buffer, message_func, this, nullptr);
+  }
+  void new_line () { line_no++; }
+  void consume_text (hb_buffer_t  *buffer,
+		     const char   *text,
+		     unsigned int  text_len,
+		     hb_bool_t     utf8_clusters)
+  {
+    g_string_set_size (gs, 0);
+    format.serialize_buffer_of_text (buffer, line_no, text, text_len, font, gs);
+    fprintf (options.fp, "%s", gs->str);
+  }
+  void error (const char *message)
+  {
+    g_string_set_size (gs, 0);
+    format.serialize_message (line_no, "error", message, gs);
+    fprintf (options.fp, "%s", gs->str);
+  }
+  void consume_glyphs (hb_buffer_t  *buffer,
+		       const char   *text,
+		       unsigned int  text_len,
+		       hb_bool_t     utf8_clusters)
+  {
+    g_string_set_size (gs, 0);
+    format.serialize_buffer_of_glyphs (buffer, line_no, text, text_len, font,
+				       output_format, format_flags, gs);
+    fprintf (options.fp, "%s", gs->str);
+  }
+  void finish (hb_buffer_t *buffer, const font_options_t *font_opts)
+  {
+    hb_buffer_set_message_func (buffer, nullptr, nullptr, nullptr);
+    hb_font_destroy (font);
+    g_string_free (gs, true);
+    gs = nullptr;
+    font = nullptr;
+  }
+
+  static hb_bool_t
+  message_func (hb_buffer_t *buffer,
+		hb_font_t *font,
+		const char *message,
+		void *user_data)
+  {
+    output_buffer_t *that = (output_buffer_t *) user_data;
+    that->trace (buffer, font, message);
+    return true;
+  }
+
+  void
+  trace (hb_buffer_t *buffer,
+	 hb_font_t *font,
+	 const char *message)
+  {
+    g_string_set_size (gs, 0);
+    format.serialize_line_no (line_no, gs);
+    g_string_append_printf (gs, "trace: %s	buffer: ", message);
+    format.serialize_glyphs (buffer, font, output_format, format_flags, gs);
+    g_string_append_c (gs, '\n');
+    fprintf (options.fp, "%s", gs->str);
+  }
+
+
+  protected:
+  output_options_t options;
+  format_options_t format;
+
+  GString *gs;
+  unsigned int line_no;
+  hb_font_t *font;
+  hb_buffer_serialize_format_t output_format;
+  hb_buffer_serialize_flags_t format_flags;
+};
+
+int
+main (int argc, char **argv)
+{
+  if (argc == 2 && !strcmp (argv[1], "--batch"))
+  {
+    unsigned int ret = 0;
+    char buf[4092];
+    while (fgets (buf, sizeof (buf), stdin))
+    {
+      size_t l = strlen (buf);
+      if (l && buf[l - 1] == '\n') buf[l - 1] = '\0';
+      main_font_text_t<shape_consumer_t<output_buffer_t>, FONT_SIZE_UPEM, 0> driver;
+      char *args[32];
+      argc = 0;
+      char *p = buf, *e;
+      args[argc++] = p;
+      while ((e = strchr (p, ' ')) && argc < (int) (int) ARRAY_LENGTH (args))
+      {
+	*e++ = '\0';
+	while (*e == ' ')
+	  e++;
+	args[argc++] = p = e;
+      }
+      ret |= driver.main (argc, args);
+      fflush (stdout);
+
+      if (ret)
+        break;
+    }
+    return ret;
+  }
+  main_font_text_t<shape_consumer_t<output_buffer_t>, FONT_SIZE_UPEM, 0> driver;
+  return driver.main (argc, argv);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/hb-subset.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/hb-subset.cc
new file mode 100644
index 0000000..b7d9eb9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/hb-subset.cc
@@ -0,0 +1,126 @@
+/*
+ * Copyright © 2010  Behdad Esfahbod
+ * Copyright © 2011,2012  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): Garret Rieger, Rod Sheeter
+ */
+
+#include <stdio.h>
+
+#include "main-font-text.hh"
+#include "hb-subset.h"
+
+/*
+ * Command line interface to the harfbuzz font subsetter.
+ */
+
+struct subset_consumer_t
+{
+  subset_consumer_t (option_parser_t *parser)
+      : failed (false), options (parser), subset_options (parser), font (nullptr), input (nullptr) {}
+
+  void init (hb_buffer_t  *buffer_,
+             const font_options_t *font_opts)
+  {
+    font = hb_font_reference (font_opts->get_font ());
+    input = hb_subset_input_create_or_fail ();
+  }
+
+  void consume_line (const char   *text,
+                     unsigned int  text_len,
+                     const char   *text_before,
+                     const char   *text_after)
+  {
+    // TODO(Q1) does this only get called with at least 1 codepoint?
+    hb_set_t *codepoints = hb_subset_input_unicode_set (input);
+    gchar *c = (gchar *)text;
+    do {
+      gunichar cp = g_utf8_get_char(c);
+      hb_codepoint_t hb_cp = cp;
+      hb_set_add (codepoints, hb_cp);
+    } while ((c = g_utf8_find_next_char(c, text + text_len)) != nullptr);
+  }
+
+  hb_bool_t
+  write_file (const char *output_file, hb_blob_t *blob) {
+    unsigned int data_length;
+    const char* data = hb_blob_get_data (blob, &data_length);
+
+    FILE *fp_out = fopen(output_file, "wb");
+    if (fp_out == nullptr) {
+      fprintf(stderr, "Unable to open output file\n");
+      return false;
+    }
+    int bytes_written = fwrite(data, 1, data_length, fp_out);
+
+    fclose (fp_out);
+
+    if (bytes_written == -1) {
+      fprintf(stderr, "Unable to write output file\n");
+      return false;
+    }
+    if ((unsigned int) bytes_written != data_length) {
+      fprintf(stderr, "Expected %u bytes written, got %d\n", data_length,
+              bytes_written);
+      return false;
+    }
+    return true;
+  }
+
+  void finish (const font_options_t *font_opts)
+  {
+    hb_subset_input_set_drop_layout (input, !subset_options.keep_layout);
+    hb_subset_input_set_drop_hints (input, subset_options.drop_hints);
+    hb_subset_input_set_desubroutinize (input, subset_options.desubroutinize);
+
+    hb_face_t *face = hb_font_get_face (font);
+
+    hb_face_t *new_face = hb_subset (face, input);
+    hb_blob_t *result = hb_face_reference_blob (new_face);
+
+    failed = !hb_blob_get_length (result);
+    if (!failed)
+      write_file (options.output_file, result);
+
+    hb_subset_input_destroy (input);
+    hb_blob_destroy (result);
+    hb_face_destroy (new_face);
+    hb_font_destroy (font);
+  }
+
+  public:
+  bool failed;
+
+  private:
+  output_options_t options;
+  subset_options_t subset_options;
+  hb_font_t *font;
+  hb_subset_input_t *input;
+};
+
+int
+main (int argc, char **argv)
+{
+  main_font_text_t<subset_consumer_t, 10, 0> driver;
+  return driver.main (argc, argv);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/hb-view.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/hb-view.cc
new file mode 100644
index 0000000..69a4c95
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/hb-view.cc
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2010  Behdad Esfahbod
+ * Copyright © 2011,2012  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
+ */
+
+#include "main-font-text.hh"
+#include "shape-consumer.hh"
+#include "view-cairo.hh"
+
+#define DEFAULT_FONT_SIZE 256
+#define SUBPIXEL_BITS 6
+
+int
+main (int argc, char **argv)
+{
+  main_font_text_t<shape_consumer_t<view_cairo_t>, DEFAULT_FONT_SIZE, SUBPIXEL_BITS> driver;
+  return driver.main (argc, argv);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/helper-cairo-ansi.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/helper-cairo-ansi.cc
new file mode 100644
index 0000000..50f9eb44
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/helper-cairo-ansi.cc
@@ -0,0 +1,102 @@
+/*
+ * Copyright © 2012  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
+ */
+
+#include "helper-cairo-ansi.hh"
+#include "options.hh"
+
+#include "ansi-print.hh"
+
+
+cairo_status_t
+helper_cairo_surface_write_to_ansi_stream (cairo_surface_t	*surface,
+					   cairo_write_func_t	write_func,
+					   void			*closure)
+{
+  unsigned int width = cairo_image_surface_get_width (surface);
+  unsigned int height = cairo_image_surface_get_height (surface);
+  if (cairo_image_surface_get_format (surface) != CAIRO_FORMAT_RGB24) {
+    cairo_surface_t *new_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
+    cairo_t *cr = cairo_create (new_surface);
+    if (cairo_image_surface_get_format (surface) == CAIRO_FORMAT_A8) {
+      cairo_set_source_rgb (cr, 0., 0., 0.);
+      cairo_paint (cr);
+      cairo_set_source_rgb (cr, 1., 1., 1.);
+      cairo_mask_surface (cr, surface, 0, 0);
+    } else {
+      cairo_set_source_rgb (cr, 1., 1., 1.);
+      cairo_paint (cr);
+      cairo_set_source_surface (cr, surface, 0, 0);
+      cairo_paint (cr);
+    }
+    cairo_destroy (cr);
+    surface = new_surface;
+  } else
+    cairo_surface_reference (surface);
+
+  unsigned int stride = cairo_image_surface_get_stride (surface);
+  const uint32_t *data = (uint32_t *) (void *) cairo_image_surface_get_data (surface);
+
+  /* We don't have rows to spare on the terminal window...
+   * Find the tight image top/bottom and only print in between. */
+
+  /* Use corner color as background color. */
+  uint32_t bg_color = data ? * (uint32_t *) data : 0;
+
+  /* Drop first row while empty */
+  while (height)
+  {
+    unsigned int i;
+    for (i = 0; i < width; i++)
+      if (data[i] != bg_color)
+        break;
+    if (i < width)
+      break;
+    data += stride / 4;
+    height--;
+  }
+
+  /* Drop last row while empty */
+  unsigned int orig_height = height;
+  while (height)
+  {
+    const uint32_t *row = data + (height - 1) * stride / 4;
+    unsigned int i;
+    for (i = 0; i < width; i++)
+      if (row[i] != bg_color)
+        break;
+    if (i < width)
+      break;
+    height--;
+  }
+  if (height < orig_height)
+    height++; /* Add one last blank row for padding. */
+
+  if (width && height)
+    ansi_print_image_rgb24 (data, width, height, stride / 4);
+
+  cairo_surface_destroy (surface);
+  return CAIRO_STATUS_SUCCESS;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/helper-cairo-ansi.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/helper-cairo-ansi.hh
new file mode 100644
index 0000000..bc23132
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/helper-cairo-ansi.hh
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2012  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 HELPER_CAIRO_ANSI_HH
+#define HELPER_CAIRO_ANSI_HH
+
+#include "hb.hh"
+
+#include <cairo.h>
+
+cairo_status_t
+helper_cairo_surface_write_to_ansi_stream (cairo_surface_t	*surface,
+					   cairo_write_func_t	write_func,
+					   void			*closure);
+
+
+#endif
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/helper-cairo.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/helper-cairo.cc
new file mode 100644
index 0000000..b4f94a9
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/helper-cairo.cc
@@ -0,0 +1,561 @@
+/*
+ * Copyright © 2011  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
+ */
+
+#include "helper-cairo.hh"
+
+#include <cairo-ft.h>
+#include <hb-ft.h>
+#include FT_MULTIPLE_MASTERS_H
+
+#include "helper-cairo-ansi.hh"
+#ifdef CAIRO_HAS_SVG_SURFACE
+#  include <cairo-svg.h>
+#endif
+#ifdef CAIRO_HAS_PDF_SURFACE
+#  include <cairo-pdf.h>
+#endif
+#ifdef CAIRO_HAS_PS_SURFACE
+#  include <cairo-ps.h>
+#  if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1,6,0)
+#    define HAS_EPS 1
+
+static cairo_surface_t *
+_cairo_eps_surface_create_for_stream (cairo_write_func_t  write_func,
+				      void               *closure,
+				      double              width,
+				      double              height)
+{
+  cairo_surface_t *surface;
+
+  surface = cairo_ps_surface_create_for_stream (write_func, closure, width, height);
+  cairo_ps_surface_set_eps (surface, true);
+
+  return surface;
+}
+
+#  else
+#    undef HAS_EPS
+#  endif
+#endif
+
+
+static FT_Library ft_library;
+
+#ifdef HAVE_ATEXIT
+static inline
+void free_ft_library ()
+{
+  FT_Done_FreeType (ft_library);
+}
+#endif
+
+cairo_scaled_font_t *
+helper_cairo_create_scaled_font (const font_options_t *font_opts)
+{
+  hb_font_t *font = hb_font_reference (font_opts->get_font ());
+
+  cairo_font_face_t *cairo_face;
+  /* We cannot use the FT_Face from hb_font_t, as doing so will confuse hb_font_t because
+   * cairo will reset the face size.  As such, create new face...
+   * TODO Perhaps add API to hb-ft to encapsulate this code. */
+  FT_Face ft_face = nullptr;//hb_ft_font_get_face (font);
+  if (!ft_face)
+  {
+    if (!ft_library)
+    {
+      FT_Init_FreeType (&ft_library);
+#ifdef HAVE_ATEXIT
+      atexit (free_ft_library);
+#endif
+    }
+
+    unsigned int blob_length;
+    const char *blob_data = hb_blob_get_data (font_opts->blob, &blob_length);
+
+    if (FT_New_Memory_Face (ft_library,
+			    (const FT_Byte *) blob_data,
+                            blob_length,
+			    font_opts->face_index,
+			    &ft_face))
+      fail (false, "FT_New_Memory_Face fail");
+  }
+  if (!ft_face)
+  {
+    /* This allows us to get some boxes at least... */
+    cairo_face = cairo_toy_font_face_create ("@cairo:sans",
+					     CAIRO_FONT_SLANT_NORMAL,
+					     CAIRO_FONT_WEIGHT_NORMAL);
+  }
+  else
+  {
+#ifdef HAVE_FT_SET_VAR_BLEND_COORDINATES
+    unsigned int num_coords;
+    const int *coords = hb_font_get_var_coords_normalized (font, &num_coords);
+    if (num_coords)
+    {
+      FT_Fixed *ft_coords = (FT_Fixed *) calloc (num_coords, sizeof (FT_Fixed));
+      if (ft_coords)
+      {
+	for (unsigned int i = 0; i < num_coords; i++)
+	  ft_coords[i] = coords[i] << 2;
+	FT_Set_Var_Blend_Coordinates (ft_face, num_coords, ft_coords);
+	free (ft_coords);
+      }
+    }
+#endif
+
+    cairo_face = cairo_ft_font_face_create_for_ft_face (ft_face, font_opts->ft_load_flags);
+  }
+  cairo_matrix_t ctm, font_matrix;
+  cairo_font_options_t *font_options;
+
+  cairo_matrix_init_identity (&ctm);
+  cairo_matrix_init_scale (&font_matrix,
+			   font_opts->font_size_x,
+			   font_opts->font_size_y);
+  font_options = cairo_font_options_create ();
+  cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_NONE);
+  cairo_font_options_set_hint_metrics (font_options, CAIRO_HINT_METRICS_OFF);
+
+  cairo_scaled_font_t *scaled_font = cairo_scaled_font_create (cairo_face,
+							       &font_matrix,
+							       &ctm,
+							       font_options);
+
+  cairo_font_options_destroy (font_options);
+  cairo_font_face_destroy (cairo_face);
+
+  static cairo_user_data_key_t key;
+  if (cairo_scaled_font_set_user_data (scaled_font,
+				       &key,
+				       (void *) font,
+				       (cairo_destroy_func_t) hb_font_destroy))
+    hb_font_destroy (font);
+
+  return scaled_font;
+}
+
+bool
+helper_cairo_scaled_font_has_color (cairo_scaled_font_t *scaled_font)
+{
+  bool ret = false;
+#ifdef FT_HAS_COLOR
+  FT_Face ft_face = cairo_ft_scaled_font_lock_face (scaled_font);
+  if (ft_face)
+  {
+    if (FT_HAS_COLOR (ft_face))
+      ret = true;
+    cairo_ft_scaled_font_unlock_face (scaled_font);
+  }
+#endif
+  return ret;
+}
+
+
+struct finalize_closure_t {
+  void (*callback)(finalize_closure_t *);
+  cairo_surface_t *surface;
+  cairo_write_func_t write_func;
+  void *closure;
+};
+static cairo_user_data_key_t finalize_closure_key;
+
+
+static void
+finalize_ansi (finalize_closure_t *closure)
+{
+  cairo_status_t status;
+  status = helper_cairo_surface_write_to_ansi_stream (closure->surface,
+						      closure->write_func,
+						      closure->closure);
+  if (status != CAIRO_STATUS_SUCCESS)
+    fail (false, "Failed to write output: %s",
+	  cairo_status_to_string (status));
+}
+
+static cairo_surface_t *
+_cairo_ansi_surface_create_for_stream (cairo_write_func_t write_func,
+				       void *closure,
+				       double width,
+				       double height,
+				       cairo_content_t content)
+{
+  cairo_surface_t *surface;
+  int w = ceil (width);
+  int h = ceil (height);
+
+  switch (content) {
+    case CAIRO_CONTENT_ALPHA:
+      surface = cairo_image_surface_create (CAIRO_FORMAT_A8, w, h);
+      break;
+    default:
+    case CAIRO_CONTENT_COLOR:
+      surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h);
+      break;
+    case CAIRO_CONTENT_COLOR_ALPHA:
+      surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
+      break;
+  }
+  cairo_status_t status = cairo_surface_status (surface);
+  if (status != CAIRO_STATUS_SUCCESS)
+    fail (false, "Failed to create cairo surface: %s",
+	  cairo_status_to_string (status));
+
+  finalize_closure_t *ansi_closure = g_new0 (finalize_closure_t, 1);
+  ansi_closure->callback = finalize_ansi;
+  ansi_closure->surface = surface;
+  ansi_closure->write_func = write_func;
+  ansi_closure->closure = closure;
+
+  if (cairo_surface_set_user_data (surface,
+				   &finalize_closure_key,
+				   (void *) ansi_closure,
+				   (cairo_destroy_func_t) g_free))
+    g_free ((void *) closure);
+
+  return surface;
+}
+
+
+#ifdef CAIRO_HAS_PNG_FUNCTIONS
+
+static void
+finalize_png (finalize_closure_t *closure)
+{
+  cairo_status_t status;
+  status = cairo_surface_write_to_png_stream (closure->surface,
+					      closure->write_func,
+					      closure->closure);
+  if (status != CAIRO_STATUS_SUCCESS)
+    fail (false, "Failed to write output: %s",
+	  cairo_status_to_string (status));
+}
+
+static cairo_surface_t *
+_cairo_png_surface_create_for_stream (cairo_write_func_t write_func,
+				      void *closure,
+				      double width,
+				      double height,
+				      cairo_content_t content)
+{
+  cairo_surface_t *surface;
+  int w = ceil (width);
+  int h = ceil (height);
+
+  switch (content) {
+    case CAIRO_CONTENT_ALPHA:
+      surface = cairo_image_surface_create (CAIRO_FORMAT_A8, w, h);
+      break;
+    default:
+    case CAIRO_CONTENT_COLOR:
+      surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h);
+      break;
+    case CAIRO_CONTENT_COLOR_ALPHA:
+      surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
+      break;
+  }
+  cairo_status_t status = cairo_surface_status (surface);
+  if (status != CAIRO_STATUS_SUCCESS)
+    fail (false, "Failed to create cairo surface: %s",
+	  cairo_status_to_string (status));
+
+  finalize_closure_t *png_closure = g_new0 (finalize_closure_t, 1);
+  png_closure->callback = finalize_png;
+  png_closure->surface = surface;
+  png_closure->write_func = write_func;
+  png_closure->closure = closure;
+
+  if (cairo_surface_set_user_data (surface,
+				   &finalize_closure_key,
+				   (void *) png_closure,
+				   (cairo_destroy_func_t) g_free))
+    g_free ((void *) closure);
+
+  return surface;
+}
+
+#endif
+
+static cairo_status_t
+stdio_write_func (void                *closure,
+		  const unsigned char *data,
+		  unsigned int         size)
+{
+  FILE *fp = (FILE *) closure;
+
+  while (size) {
+    size_t ret = fwrite (data, 1, size, fp);
+    size -= ret;
+    data += ret;
+    if (size && ferror (fp))
+      fail (false, "Failed to write output: %s", strerror (errno));
+  }
+
+  return CAIRO_STATUS_SUCCESS;
+}
+
+const char *helper_cairo_supported_formats[] =
+{
+  "ansi",
+  #ifdef CAIRO_HAS_PNG_FUNCTIONS
+  "png",
+  #endif
+  #ifdef CAIRO_HAS_SVG_SURFACE
+  "svg",
+  #endif
+  #ifdef CAIRO_HAS_PDF_SURFACE
+  "pdf",
+  #endif
+  #ifdef CAIRO_HAS_PS_SURFACE
+  "ps",
+   #ifdef HAS_EPS
+    "eps",
+   #endif
+  #endif
+  nullptr
+};
+
+cairo_t *
+helper_cairo_create_context (double w, double h,
+			     view_options_t *view_opts,
+			     output_options_t *out_opts,
+			     cairo_content_t content)
+{
+  cairo_surface_t *(*constructor) (cairo_write_func_t write_func,
+				   void *closure,
+				   double width,
+				   double height) = nullptr;
+  cairo_surface_t *(*constructor2) (cairo_write_func_t write_func,
+				    void *closure,
+				    double width,
+				    double height,
+				    cairo_content_t content) = nullptr;
+
+  const char *extension = out_opts->output_format;
+  if (!extension) {
+#if HAVE_ISATTY
+    if (isatty (fileno (out_opts->get_file_handle ())))
+      extension = "ansi";
+    else
+#endif
+    {
+#ifdef CAIRO_HAS_PNG_FUNCTIONS
+      extension = "png";
+#else
+      extension = "ansi";
+#endif
+    }
+  }
+  if (0)
+    ;
+    else if (0 == g_ascii_strcasecmp (extension, "ansi"))
+      constructor2 = _cairo_ansi_surface_create_for_stream;
+  #ifdef CAIRO_HAS_PNG_FUNCTIONS
+    else if (0 == g_ascii_strcasecmp (extension, "png"))
+      constructor2 = _cairo_png_surface_create_for_stream;
+  #endif
+  #ifdef CAIRO_HAS_SVG_SURFACE
+    else if (0 == g_ascii_strcasecmp (extension, "svg"))
+      constructor = cairo_svg_surface_create_for_stream;
+  #endif
+  #ifdef CAIRO_HAS_PDF_SURFACE
+    else if (0 == g_ascii_strcasecmp (extension, "pdf"))
+      constructor = cairo_pdf_surface_create_for_stream;
+  #endif
+  #ifdef CAIRO_HAS_PS_SURFACE
+    else if (0 == g_ascii_strcasecmp (extension, "ps"))
+      constructor = cairo_ps_surface_create_for_stream;
+   #ifdef HAS_EPS
+    else if (0 == g_ascii_strcasecmp (extension, "eps"))
+      constructor = _cairo_eps_surface_create_for_stream;
+   #endif
+  #endif
+
+
+  unsigned int fr, fg, fb, fa, br, bg, bb, ba;
+  const char *color;
+  br = bg = bb = 0; ba = 255;
+  color = view_opts->back ? view_opts->back : DEFAULT_BACK;
+  sscanf (color + (*color=='#'), "%2x%2x%2x%2x", &br, &bg, &bb, &ba);
+  fr = fg = fb = 0; fa = 255;
+  color = view_opts->fore ? view_opts->fore : DEFAULT_FORE;
+  sscanf (color + (*color=='#'), "%2x%2x%2x%2x", &fr, &fg, &fb, &fa);
+
+  if (content == CAIRO_CONTENT_ALPHA)
+  {
+    if (view_opts->annotate ||
+	br != bg || bg != bb ||
+	fr != fg || fg != fb)
+      content = CAIRO_CONTENT_COLOR;
+  }
+  if (ba != 255)
+    content = CAIRO_CONTENT_COLOR_ALPHA;
+
+  cairo_surface_t *surface;
+  FILE *f = out_opts->get_file_handle ();
+  if (constructor)
+    surface = constructor (stdio_write_func, f, w, h);
+  else if (constructor2)
+    surface = constructor2 (stdio_write_func, f, w, h, content);
+  else
+    fail (false, "Unknown output format `%s'; supported formats are: %s%s",
+	  extension,
+	  g_strjoinv ("/", const_cast<char**> (helper_cairo_supported_formats)),
+	  out_opts->explicit_output_format ? "" :
+	  "\nTry setting format using --output-format");
+
+  cairo_t *cr = cairo_create (surface);
+  content = cairo_surface_get_content (surface);
+
+  switch (content) {
+    case CAIRO_CONTENT_ALPHA:
+      cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+      cairo_set_source_rgba (cr, 1., 1., 1., br / 255.);
+      cairo_paint (cr);
+      cairo_set_source_rgba (cr, 1., 1., 1.,
+			     (fr / 255.) * (fa / 255.) + (br / 255) * (1 - (fa / 255.)));
+      break;
+    default:
+    case CAIRO_CONTENT_COLOR:
+    case CAIRO_CONTENT_COLOR_ALPHA:
+      cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+      cairo_set_source_rgba (cr, br / 255., bg / 255., bb / 255., ba / 255.);
+      cairo_paint (cr);
+      cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+      cairo_set_source_rgba (cr, fr / 255., fg / 255., fb / 255., fa / 255.);
+      break;
+  }
+
+  cairo_surface_destroy (surface);
+  return cr;
+}
+
+void
+helper_cairo_destroy_context (cairo_t *cr)
+{
+  finalize_closure_t *closure = (finalize_closure_t *)
+				cairo_surface_get_user_data (cairo_get_target (cr),
+							     &finalize_closure_key);
+  if (closure)
+    closure->callback (closure);
+
+  cairo_status_t status = cairo_status (cr);
+  if (status != CAIRO_STATUS_SUCCESS)
+    fail (false, "Failed: %s",
+	  cairo_status_to_string (status));
+  cairo_destroy (cr);
+}
+
+
+void
+helper_cairo_line_from_buffer (helper_cairo_line_t *l,
+			       hb_buffer_t         *buffer,
+			       const char          *text,
+			       unsigned int         text_len,
+			       int                  scale_bits,
+			       hb_bool_t            utf8_clusters)
+{
+  memset (l, 0, sizeof (*l));
+
+  l->num_glyphs = hb_buffer_get_length (buffer);
+  hb_glyph_info_t *hb_glyph = hb_buffer_get_glyph_infos (buffer, nullptr);
+  hb_glyph_position_t *hb_position = hb_buffer_get_glyph_positions (buffer, nullptr);
+  l->glyphs = cairo_glyph_allocate (l->num_glyphs + 1);
+
+  if (text) {
+    l->utf8 = g_strndup (text, text_len);
+    l->utf8_len = text_len;
+    l->num_clusters = l->num_glyphs ? 1 : 0;
+    for (unsigned int i = 1; i < l->num_glyphs; i++)
+      if (hb_glyph[i].cluster != hb_glyph[i-1].cluster)
+	l->num_clusters++;
+    l->clusters = cairo_text_cluster_allocate (l->num_clusters);
+  }
+
+  if ((l->num_glyphs && !l->glyphs) ||
+      (l->utf8_len && !l->utf8) ||
+      (l->num_clusters && !l->clusters))
+  {
+    l->finish ();
+    return;
+  }
+
+  hb_position_t x = 0, y = 0;
+  int i;
+  for (i = 0; i < (int) l->num_glyphs; i++)
+  {
+    l->glyphs[i].index = hb_glyph[i].codepoint;
+    l->glyphs[i].x = scalbn ((double)  hb_position->x_offset + x, scale_bits);
+    l->glyphs[i].y = scalbn ((double) -hb_position->y_offset + y, scale_bits);
+    x +=  hb_position->x_advance;
+    y += -hb_position->y_advance;
+
+    hb_position++;
+  }
+  l->glyphs[i].index = -1;
+  l->glyphs[i].x = scalbn ((double) x, scale_bits);
+  l->glyphs[i].y = scalbn ((double) y, scale_bits);
+
+  if (l->num_clusters) {
+    memset ((void *) l->clusters, 0, l->num_clusters * sizeof (l->clusters[0]));
+    hb_bool_t backward = HB_DIRECTION_IS_BACKWARD (hb_buffer_get_direction (buffer));
+    l->cluster_flags = backward ? CAIRO_TEXT_CLUSTER_FLAG_BACKWARD : (cairo_text_cluster_flags_t) 0;
+    unsigned int cluster = 0;
+    const char *start = l->utf8, *end;
+    l->clusters[cluster].num_glyphs++;
+    if (backward) {
+      for (i = l->num_glyphs - 2; i >= 0; i--) {
+	if (hb_glyph[i].cluster != hb_glyph[i+1].cluster) {
+	  g_assert (hb_glyph[i].cluster > hb_glyph[i+1].cluster);
+	  if (utf8_clusters)
+	    end = start + hb_glyph[i].cluster - hb_glyph[i+1].cluster;
+	  else
+	    end = g_utf8_offset_to_pointer (start, hb_glyph[i].cluster - hb_glyph[i+1].cluster);
+	  l->clusters[cluster].num_bytes = end - start;
+	  start = end;
+	  cluster++;
+	}
+	l->clusters[cluster].num_glyphs++;
+      }
+      l->clusters[cluster].num_bytes = l->utf8 + text_len - start;
+    } else {
+      for (i = 1; i < (int) l->num_glyphs; i++) {
+	if (hb_glyph[i].cluster != hb_glyph[i-1].cluster) {
+	  g_assert (hb_glyph[i].cluster > hb_glyph[i-1].cluster);
+	  if (utf8_clusters)
+	    end = start + hb_glyph[i].cluster - hb_glyph[i-1].cluster;
+	  else
+	    end = g_utf8_offset_to_pointer (start, hb_glyph[i].cluster - hb_glyph[i-1].cluster);
+	  l->clusters[cluster].num_bytes = end - start;
+	  start = end;
+	  cluster++;
+	}
+	l->clusters[cluster].num_glyphs++;
+      }
+      l->clusters[cluster].num_bytes = l->utf8 + text_len - start;
+    }
+  }
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/helper-cairo.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/helper-cairo.hh
new file mode 100644
index 0000000..5bfbf7b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/helper-cairo.hh
@@ -0,0 +1,86 @@
+/*
+ * Copyright © 2011  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 HELPER_CAIRO_HH
+#define HELPER_CAIRO_HH
+
+#include "hb.hh"
+#include "options.hh"
+
+#include <cairo.h>
+
+
+cairo_scaled_font_t *
+helper_cairo_create_scaled_font (const font_options_t *font_opts);
+
+bool
+helper_cairo_scaled_font_has_color (cairo_scaled_font_t *scaled_font);
+
+extern const char *helper_cairo_supported_formats[];
+
+cairo_t *
+helper_cairo_create_context (double w, double h,
+			     view_options_t *view_opts,
+			     output_options_t *out_opts,
+			     cairo_content_t content);
+
+void
+helper_cairo_destroy_context (cairo_t *cr);
+
+
+struct helper_cairo_line_t {
+  cairo_glyph_t *glyphs;
+  unsigned int num_glyphs;
+  char *utf8;
+  unsigned int utf8_len;
+  cairo_text_cluster_t *clusters;
+  unsigned int num_clusters;
+  cairo_text_cluster_flags_t cluster_flags;
+
+  void finish () {
+    if (glyphs)
+      cairo_glyph_free (glyphs);
+    if (clusters)
+      cairo_text_cluster_free (clusters);
+    if (utf8)
+      g_free (utf8);
+  }
+
+  void get_advance (double *x_advance, double *y_advance) {
+    *x_advance = glyphs[num_glyphs].x;
+    *y_advance = glyphs[num_glyphs].y;
+  }
+};
+
+void
+helper_cairo_line_from_buffer (helper_cairo_line_t *l,
+			       hb_buffer_t         *buffer,
+			       const char          *text,
+			       unsigned int         text_len,
+			       int                  scale_bits,
+			       hb_bool_t            utf8_clusters);
+
+#endif
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/main-font-text.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/main-font-text.hh
new file mode 100644
index 0000000..36b654b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/main-font-text.hh
@@ -0,0 +1,96 @@
+/*
+ * Copyright © 2011,2012  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_MAIN_FONT_TEXT_HH
+#define HB_MAIN_FONT_TEXT_HH
+
+#include "hb.hh"
+#include "options.hh"
+
+/* main() body for utilities taking font and processing text.*/
+
+static char *
+locale_to_utf8 (char *s)
+{
+  char *t;
+  GError *error = nullptr;
+
+  t = g_locale_to_utf8 (s, -1, nullptr, nullptr, &error);
+  if (!t)
+  {
+     fail (true, "Failed converting text to UTF-8");
+  }
+
+  return t;
+}
+
+template <typename consumer_t, int default_font_size, int subpixel_bits>
+struct main_font_text_t
+{
+  main_font_text_t ()
+		  : options ("[FONT-FILE] [TEXT]"),
+		    font_opts (&options, default_font_size, subpixel_bits),
+		    input (&options),
+		    consumer (&options) {}
+
+  int
+  main (int argc, char **argv)
+  {
+    options.parse (&argc, &argv);
+
+    argc--, argv++;
+    if (argc && !font_opts.font_file) font_opts.font_file = locale_to_utf8 (argv[0]), argc--, argv++;
+    if (argc && !input.text && !input.text_file) input.text = locale_to_utf8 (argv[0]), argc--, argv++;
+    if (argc)
+      fail (true, "Too many arguments on the command line");
+    if (!font_opts.font_file)
+      options.usage ();
+    if (!input.text && !input.text_file)
+      input.text_file = g_strdup ("-");
+
+    hb_buffer_t *buffer = hb_buffer_create ();
+    consumer.init (buffer, &font_opts);
+    hb_buffer_destroy (buffer);
+
+    unsigned int text_len;
+    const char *text;
+    while ((text = input.get_line (&text_len)))
+      consumer.consume_line (text, text_len, input.text_before, input.text_after);
+
+    consumer.finish (&font_opts);
+
+    return consumer.failed ? 1 : 0;
+  }
+
+  protected:
+  option_parser_t options;
+  font_options_t font_opts;
+  text_options_t input;
+  consumer_t consumer;
+};
+
+#endif
+
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/options.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/options.cc
new file mode 100644
index 0000000..04ddcf6
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/options.cc
@@ -0,0 +1,989 @@
+/*
+ * Copyright © 2011,2012  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
+ */
+
+#include "options.hh"
+
+#ifdef HAVE_FREETYPE
+#include <hb-ft.h>
+#endif
+#include <hb-ot.h>
+
+static struct supported_font_funcs_t {
+	char name[4];
+	void (*func) (hb_font_t *);
+} supported_font_funcs[] =
+{
+#ifdef HAVE_FREETYPE
+  {"ft",	hb_ft_font_set_funcs},
+#endif
+  {"ot",	hb_ot_font_set_funcs},
+};
+
+
+void
+fail (hb_bool_t suggest_help, const char *format, ...)
+{
+  const char *msg;
+
+  va_list vap;
+  va_start (vap, format);
+  msg = g_strdup_vprintf (format, vap);
+  va_end (vap);
+  const char *prgname = g_get_prgname ();
+  g_printerr ("%s: %s\n", prgname, msg);
+  if (suggest_help)
+    g_printerr ("Try `%s --help' for more information.\n", prgname);
+
+  exit (1);
+}
+
+
+static gchar *
+shapers_to_string ()
+{
+  GString *shapers = g_string_new (nullptr);
+  const char **shaper_list = hb_shape_list_shapers ();
+
+  for (; *shaper_list; shaper_list++) {
+    g_string_append (shapers, *shaper_list);
+    g_string_append_c (shapers, ',');
+  }
+  g_string_truncate (shapers, MAX (0, (gint)shapers->len - 1));
+
+  return g_string_free (shapers, false);
+}
+
+static G_GNUC_NORETURN gboolean
+show_version (const char *name G_GNUC_UNUSED,
+	      const char *arg G_GNUC_UNUSED,
+	      gpointer    data G_GNUC_UNUSED,
+	      GError    **error G_GNUC_UNUSED)
+{
+  g_printf ("%s (%s) %s\n", g_get_prgname (), PACKAGE_NAME, PACKAGE_VERSION);
+
+  char *shapers = shapers_to_string ();
+  g_printf ("Available shapers: %s\n", shapers);
+  g_free (shapers);
+  if (strcmp (HB_VERSION_STRING, hb_version_string ()))
+    g_printf ("Linked HarfBuzz library has a different version: %s\n", hb_version_string ());
+
+  exit(0);
+}
+
+
+void
+option_parser_t::add_main_options ()
+{
+  GOptionEntry entries[] =
+  {
+    {"version",		0, G_OPTION_FLAG_NO_ARG,
+			      G_OPTION_ARG_CALLBACK,	(gpointer) &show_version,	"Show version numbers",			nullptr},
+    {nullptr}
+  };
+  g_option_context_add_main_entries (context, entries, nullptr);
+}
+
+static gboolean
+pre_parse (GOptionContext *context G_GNUC_UNUSED,
+	   GOptionGroup *group G_GNUC_UNUSED,
+	   gpointer data,
+	   GError **error)
+{
+  option_group_t *option_group = (option_group_t *) data;
+  option_group->pre_parse (error);
+  return *error == nullptr;
+}
+
+static gboolean
+post_parse (GOptionContext *context G_GNUC_UNUSED,
+	    GOptionGroup *group G_GNUC_UNUSED,
+	    gpointer data,
+	    GError **error)
+{
+  option_group_t *option_group = static_cast<option_group_t *>(data);
+  option_group->post_parse (error);
+  return *error == nullptr;
+}
+
+void
+option_parser_t::add_group (GOptionEntry   *entries,
+			    const gchar    *name,
+			    const gchar    *description,
+			    const gchar    *help_description,
+			    option_group_t *option_group)
+{
+  GOptionGroup *group = g_option_group_new (name, description, help_description,
+					    static_cast<gpointer>(option_group), nullptr);
+  g_option_group_add_entries (group, entries);
+  g_option_group_set_parse_hooks (group, pre_parse, post_parse);
+  g_option_context_add_group (context, group);
+}
+
+void
+option_parser_t::parse (int *argc, char ***argv)
+{
+  setlocale (LC_ALL, "");
+
+  GError *parse_error = nullptr;
+  if (!g_option_context_parse (context, argc, argv, &parse_error))
+  {
+    if (parse_error != nullptr) {
+      fail (true, "%s", parse_error->message);
+      //g_error_free (parse_error);
+    } else
+      fail (true, "Option parse error");
+  }
+}
+
+
+static gboolean
+parse_margin (const char *name G_GNUC_UNUSED,
+	      const char *arg,
+	      gpointer    data,
+	      GError    **error G_GNUC_UNUSED)
+{
+  view_options_t *view_opts = (view_options_t *) data;
+  view_options_t::margin_t &m = view_opts->margin;
+  switch (sscanf (arg, "%lf%*[ ,]%lf%*[ ,]%lf%*[ ,]%lf", &m.t, &m.r, &m.b, &m.l)) {
+    case 1: m.r = m.t; HB_FALLTHROUGH;
+    case 2: m.b = m.t; HB_FALLTHROUGH;
+    case 3: m.l = m.r; HB_FALLTHROUGH;
+    case 4: return true;
+    default:
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+		   "%s argument should be one to four space-separated numbers",
+		   name);
+      return false;
+  }
+}
+
+
+static gboolean
+parse_shapers (const char *name G_GNUC_UNUSED,
+	       const char *arg,
+	       gpointer    data,
+	       GError    **error)
+{
+  shape_options_t *shape_opts = (shape_options_t *) data;
+  char **shapers = g_strsplit (arg, ",", 0);
+
+  for (char **shaper = shapers; *shaper; shaper++) {
+    bool found = false;
+    for (const char **hb_shaper = hb_shape_list_shapers (); *hb_shaper; hb_shaper++) {
+      if (strcmp (*shaper, *hb_shaper) == 0) {
+        found = true;
+        break;
+      }
+    }
+    if (!found) {
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+		   "Unknown or unsupported shaper: %s", *shaper);
+      g_strfreev (shapers);
+      return false;
+    }
+  }
+
+  g_strfreev (shape_opts->shapers);
+  shape_opts->shapers = shapers;
+  return true;
+}
+
+static G_GNUC_NORETURN gboolean
+list_shapers (const char *name G_GNUC_UNUSED,
+	      const char *arg G_GNUC_UNUSED,
+	      gpointer    data G_GNUC_UNUSED,
+	      GError    **error G_GNUC_UNUSED)
+{
+  for (const char **shaper = hb_shape_list_shapers (); *shaper; shaper++)
+    g_printf ("%s\n", *shaper);
+
+  exit(0);
+}
+
+
+static gboolean
+parse_features (const char *name G_GNUC_UNUSED,
+	        const char *arg,
+	        gpointer    data,
+	        GError    **error G_GNUC_UNUSED)
+{
+  shape_options_t *shape_opts = (shape_options_t *) data;
+  char *s = (char *) arg;
+  char *p;
+
+  shape_opts->num_features = 0;
+  g_free (shape_opts->features);
+  shape_opts->features = nullptr;
+
+  if (!*s)
+    return true;
+
+  /* count the features first, so we can allocate memory */
+  p = s;
+  do {
+    shape_opts->num_features++;
+    p = strchr (p, ',');
+    if (p)
+      p++;
+  } while (p);
+
+  shape_opts->features = (hb_feature_t *) calloc (shape_opts->num_features, sizeof (*shape_opts->features));
+  if (!shape_opts->features)
+    return false;
+
+  /* now do the actual parsing */
+  p = s;
+  shape_opts->num_features = 0;
+  while (p && *p) {
+    char *end = strchr (p, ',');
+    if (hb_feature_from_string (p, end ? end - p : -1, &shape_opts->features[shape_opts->num_features]))
+      shape_opts->num_features++;
+    p = end ? end + 1 : nullptr;
+  }
+
+  return true;
+}
+
+static gboolean
+parse_variations (const char *name G_GNUC_UNUSED,
+	        const char *arg,
+	        gpointer    data,
+	        GError    **error G_GNUC_UNUSED)
+{
+  font_options_t *font_opts = (font_options_t *) data;
+  char *s = (char *) arg;
+  char *p;
+
+  font_opts->num_variations = 0;
+  g_free (font_opts->variations);
+  font_opts->variations = nullptr;
+
+  if (!*s)
+    return true;
+
+  /* count the variations first, so we can allocate memory */
+  p = s;
+  do {
+    font_opts->num_variations++;
+    p = strchr (p, ',');
+    if (p)
+      p++;
+  } while (p);
+
+  font_opts->variations = (hb_variation_t *) calloc (font_opts->num_variations, sizeof (*font_opts->variations));
+  if (!font_opts->variations)
+    return false;
+
+  /* now do the actual parsing */
+  p = s;
+  font_opts->num_variations = 0;
+  while (p && *p) {
+    char *end = strchr (p, ',');
+    if (hb_variation_from_string (p, end ? end - p : -1, &font_opts->variations[font_opts->num_variations]))
+      font_opts->num_variations++;
+    p = end ? end + 1 : nullptr;
+  }
+
+  return true;
+}
+
+static gboolean
+parse_text (const char *name G_GNUC_UNUSED,
+	    const char *arg,
+	    gpointer    data,
+	    GError    **error G_GNUC_UNUSED)
+{
+  text_options_t *text_opts = (text_options_t *) data;
+
+  if (text_opts->text)
+  {
+    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+		 "Either --text or --unicodes can be provided but not both");
+    return false;
+  }
+
+  text_opts->text_len = -1;
+  text_opts->text = g_strdup (arg);
+  return true;
+}
+
+
+static gboolean
+parse_unicodes (const char *name G_GNUC_UNUSED,
+	        const char *arg,
+	        gpointer    data,
+	        GError    **error G_GNUC_UNUSED)
+{
+  text_options_t *text_opts = (text_options_t *) data;
+
+  if (text_opts->text)
+  {
+    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+		 "Either --text or --unicodes can be provided but not both");
+    return false;
+  }
+
+  GString *gs = g_string_new (nullptr);
+  char *s = (char *) arg;
+  char *p;
+
+  while (s && *s)
+  {
+    while (*s && strchr ("<+>{},;&#\\xXuUnNiI\n\t\v\f\r ", *s))
+      s++;
+    if (!*s)
+      break;
+
+    errno = 0;
+    hb_codepoint_t u = strtoul (s, &p, 16);
+    if (errno || s == p)
+    {
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+		   "Failed parsing Unicode values at: '%s'", s);
+      return false;
+    }
+
+    g_string_append_unichar (gs, u);
+
+    s = p;
+  }
+
+  text_opts->text_len = gs->len;
+  text_opts->text = g_string_free (gs, FALSE);
+  return true;
+}
+
+
+void
+view_options_t::add_options (option_parser_t *parser)
+{
+  GOptionEntry entries[] =
+  {
+    {"annotate",	0, 0, G_OPTION_ARG_NONE,	&this->annotate,		"Annotate output rendering",				nullptr},
+    {"background",	0, 0, G_OPTION_ARG_STRING,	&this->back,			"Set background color (default: " DEFAULT_BACK ")",	"rrggbb/rrggbbaa"},
+    {"foreground",	0, 0, G_OPTION_ARG_STRING,	&this->fore,			"Set foreground color (default: " DEFAULT_FORE ")",	"rrggbb/rrggbbaa"},
+    {"line-space",	0, 0, G_OPTION_ARG_DOUBLE,	&this->line_space,		"Set space between lines (default: 0)",			"units"},
+    {"margin",		0, 0, G_OPTION_ARG_CALLBACK,	(gpointer) &parse_margin,	"Margin around output (default: " G_STRINGIFY(DEFAULT_MARGIN) ")","one to four numbers"},
+    {nullptr}
+  };
+  parser->add_group (entries,
+		     "view",
+		     "View options:",
+		     "Options for output rendering",
+		     this);
+}
+
+void
+shape_options_t::add_options (option_parser_t *parser)
+{
+  GOptionEntry entries[] =
+  {
+    {"list-shapers",	0, G_OPTION_FLAG_NO_ARG,
+			      G_OPTION_ARG_CALLBACK,	(gpointer) &list_shapers,	"List available shapers and quit",	nullptr},
+    {"shaper",		0, G_OPTION_FLAG_HIDDEN,
+			      G_OPTION_ARG_CALLBACK,	(gpointer) &parse_shapers,	"Hidden duplicate of --shapers",	nullptr},
+    {"shapers",		0, 0, G_OPTION_ARG_CALLBACK,	(gpointer) &parse_shapers,	"Set comma-separated list of shapers to try","list"},
+    {"direction",	0, 0, G_OPTION_ARG_STRING,	&this->direction,		"Set text direction (default: auto)",	"ltr/rtl/ttb/btt"},
+    {"language",	0, 0, G_OPTION_ARG_STRING,	&this->language,		"Set text language (default: $LANG)",	"langstr"},
+    {"script",		0, 0, G_OPTION_ARG_STRING,	&this->script,			"Set text script (default: auto)",	"ISO-15924 tag"},
+    {"bot",		0, 0, G_OPTION_ARG_NONE,	&this->bot,			"Treat text as beginning-of-paragraph",	nullptr},
+    {"eot",		0, 0, G_OPTION_ARG_NONE,	&this->eot,			"Treat text as end-of-paragraph",	nullptr},
+    {"preserve-default-ignorables",0, 0, G_OPTION_ARG_NONE,	&this->preserve_default_ignorables,	"Preserve Default-Ignorable characters",	nullptr},
+    {"remove-default-ignorables",0, 0, G_OPTION_ARG_NONE,	&this->remove_default_ignorables,	"Remove Default-Ignorable characters",	nullptr},
+    {"invisible-glyph",	0, 0, G_OPTION_ARG_INT,		&this->invisible_glyph,		"Glyph value to replace Default-Ignorables with",	nullptr},
+    {"utf8-clusters",	0, 0, G_OPTION_ARG_NONE,	&this->utf8_clusters,		"Use UTF8 byte indices, not char indices",	nullptr},
+    {"cluster-level",	0, 0, G_OPTION_ARG_INT,		&this->cluster_level,		"Cluster merging level (default: 0)",	"0/1/2"},
+    {"normalize-glyphs",0, 0, G_OPTION_ARG_NONE,	&this->normalize_glyphs,	"Rearrange glyph clusters in nominal order",	nullptr},
+    {"verify",		0, 0, G_OPTION_ARG_NONE,	&this->verify,			"Perform sanity checks on shaping results",	nullptr},
+    {"num-iterations", 'n', 0, G_OPTION_ARG_INT,		&this->num_iterations,		"Run shaper N times (default: 1)",	"N"},
+    {nullptr}
+  };
+  parser->add_group (entries,
+		     "shape",
+		     "Shape options:",
+		     "Options for the shaping process",
+		     this);
+
+  const gchar *features_help = "Comma-separated list of font features\n"
+    "\n"
+    "    Features can be enabled or disabled, either globally or limited to\n"
+    "    specific character ranges.  The format for specifying feature settings\n"
+    "    follows.  All valid CSS font-feature-settings values other than 'normal'\n"
+    "    and 'inherited' are also accepted, though, not documented below.\n"
+    "\n"
+    "    The range indices refer to the positions between Unicode characters,\n"
+    "    unless the --utf8-clusters is provided, in which case range indices\n"
+    "    refer to UTF-8 byte indices. The position before the first character\n"
+    "    is always 0.\n"
+    "\n"
+    "    The format is Python-esque.  Here is how it all works:\n"
+    "\n"
+    "      Syntax:       Value:    Start:    End:\n"
+    "\n"
+    "    Setting value:\n"
+    "      \"kern\"        1         0         ∞         # Turn feature on\n"
+    "      \"+kern\"       1         0         ∞         # Turn feature on\n"
+    "      \"-kern\"       0         0         ∞         # Turn feature off\n"
+    "      \"kern=0\"      0         0         ∞         # Turn feature off\n"
+    "      \"kern=1\"      1         0         ∞         # Turn feature on\n"
+    "      \"aalt=2\"      2         0         ∞         # Choose 2nd alternate\n"
+    "\n"
+    "    Setting index:\n"
+    "      \"kern[]\"      1         0         ∞         # Turn feature on\n"
+    "      \"kern[:]\"     1         0         ∞         # Turn feature on\n"
+    "      \"kern[5:]\"    1         5         ∞         # Turn feature on, partial\n"
+    "      \"kern[:5]\"    1         0         5         # Turn feature on, partial\n"
+    "      \"kern[3:5]\"   1         3         5         # Turn feature on, range\n"
+    "      \"kern[3]\"     1         3         3+1       # Turn feature on, single char\n"
+    "\n"
+    "    Mixing it all:\n"
+    "\n"
+    "      \"aalt[3:5]=2\" 2         3         5         # Turn 2nd alternate on for range";
+
+  GOptionEntry entries2[] =
+  {
+    {"features",	0, 0, G_OPTION_ARG_CALLBACK,	(gpointer) &parse_features,	features_help,	"list"},
+    {nullptr}
+  };
+  parser->add_group (entries2,
+		     "features",
+		     "Features options:",
+		     "Options for font features used",
+		     this);
+}
+
+static gboolean
+parse_font_size (const char *name G_GNUC_UNUSED,
+		 const char *arg,
+		 gpointer    data,
+		 GError    **error G_GNUC_UNUSED)
+{
+  font_options_t *font_opts = (font_options_t *) data;
+  if (0 == strcmp (arg, "upem"))
+  {
+    font_opts->font_size_y = font_opts->font_size_x = FONT_SIZE_UPEM;
+    return true;
+  }
+  switch (sscanf (arg, "%lf%*[ ,]%lf", &font_opts->font_size_x, &font_opts->font_size_y)) {
+    case 1: font_opts->font_size_y = font_opts->font_size_x; HB_FALLTHROUGH;
+    case 2: return true;
+    default:
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+		   "%s argument should be one or two space-separated numbers",
+		   name);
+      return false;
+  }
+}
+
+static gboolean
+parse_font_ppem (const char *name G_GNUC_UNUSED,
+		 const char *arg,
+		 gpointer    data,
+		 GError    **error G_GNUC_UNUSED)
+{
+  font_options_t *font_opts = (font_options_t *) data;
+  switch (sscanf (arg, "%d%*[ ,]%d", &font_opts->x_ppem, &font_opts->y_ppem)) {
+    case 1: font_opts->y_ppem = font_opts->x_ppem; HB_FALLTHROUGH;
+    case 2: return true;
+    default:
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+		   "%s argument should be one or two space-separated numbers",
+		   name);
+      return false;
+  }
+}
+
+void
+font_options_t::add_options (option_parser_t *parser)
+{
+  char *text = nullptr;
+
+  {
+    static_assert ((ARRAY_LENGTH_CONST (supported_font_funcs) > 0),
+		   "No supported font-funcs found.");
+    GString *s = g_string_new (nullptr);
+    g_string_printf (s, "Set font functions implementation to use (default: %s)\n\n    Supported font function implementations are: %s",
+		     supported_font_funcs[0].name,
+		     supported_font_funcs[0].name);
+    for (unsigned int i = 1; i < ARRAY_LENGTH (supported_font_funcs); i++)
+    {
+      g_string_append_c (s, '/');
+      g_string_append (s, supported_font_funcs[i].name);
+    }
+    text = g_string_free (s, FALSE);
+    parser->free_later (text);
+  }
+
+  char *font_size_text;
+  if (default_font_size == FONT_SIZE_UPEM)
+    font_size_text = (char *) "Font size (default: upem)";
+  else
+  {
+    font_size_text = g_strdup_printf ("Font size (default: %d)", default_font_size);
+    parser->free_later (font_size_text);
+  }
+
+  GOptionEntry entries[] =
+  {
+    {"font-file",	0, 0, G_OPTION_ARG_STRING,	&this->font_file,		"Set font file-name",				"filename"},
+    {"face-index",	0, 0, G_OPTION_ARG_INT,		&this->face_index,		"Set face index (default: 0)",			"index"},
+    {"font-size",	0, default_font_size ? 0 : G_OPTION_FLAG_HIDDEN,
+			      G_OPTION_ARG_CALLBACK,	(gpointer) &parse_font_size,	font_size_text,					"1/2 integers or 'upem'"},
+    {"font-ppem",	0, 0, G_OPTION_ARG_CALLBACK,	(gpointer) &parse_font_ppem,	"Set x,y pixels per EM (default: 0; disabled)",	"1/2 integers"},
+    {"font-ptem",	0, 0, G_OPTION_ARG_DOUBLE,	&this->ptem,			"Set font point-size (default: 0; disabled)",	"point-size"},
+    {"font-funcs",	0, 0, G_OPTION_ARG_STRING,	&this->font_funcs,		text,						"impl"},
+    {"ft-load-flags",	0, 0, G_OPTION_ARG_INT,		&this->ft_load_flags,		"Set FreeType load-flags (default: 2)",		"integer"},
+    {nullptr}
+  };
+  parser->add_group (entries,
+		     "font",
+		     "Font options:",
+		     "Options for the font",
+		     this);
+
+  const gchar *variations_help = "Comma-separated list of font variations\n"
+    "\n"
+    "    Variations are set globally. The format for specifying variation settings\n"
+    "    follows.  All valid CSS font-variation-settings values other than 'normal'\n"
+    "    and 'inherited' are also accepted, though, not documented below.\n"
+    "\n"
+    "    The format is a tag, optionally followed by an equals sign, followed by a\n"
+    "    number. For example:\n"
+    "\n"
+    "      \"wght=500\"\n"
+    "      \"slnt=-7.5\"\n";
+
+  GOptionEntry entries2[] =
+  {
+    {"variations",	0, 0, G_OPTION_ARG_CALLBACK,	(gpointer) &parse_variations,	variations_help,	"list"},
+    {nullptr}
+  };
+  parser->add_group (entries2,
+		     "variations",
+		     "Variations options:",
+		     "Options for font variations used",
+		     this);
+}
+
+void
+text_options_t::add_options (option_parser_t *parser)
+{
+  GOptionEntry entries[] =
+  {
+    {"text",		0, 0, G_OPTION_ARG_CALLBACK,	(gpointer) &parse_text,		"Set input text",			"string"},
+    {"text-file",	0, 0, G_OPTION_ARG_STRING,	&this->text_file,		"Set input text file-name\n\n    If no text is provided, standard input is used for input.\n",		"filename"},
+    {"unicodes",      'u', 0, G_OPTION_ARG_CALLBACK,	(gpointer) &parse_unicodes,		"Set input Unicode codepoints",		"list of hex numbers"},
+    {"text-before",	0, 0, G_OPTION_ARG_STRING,	&this->text_before,		"Set text context before each line",	"string"},
+    {"text-after",	0, 0, G_OPTION_ARG_STRING,	&this->text_after,		"Set text context after each line",	"string"},
+    {nullptr}
+  };
+  parser->add_group (entries,
+		     "text",
+		     "Text options:",
+		     "Options for the input text",
+		     this);
+}
+
+void
+output_options_t::add_options (option_parser_t *parser)
+{
+  const char *text;
+
+  if (nullptr == supported_formats)
+    text = "Set output serialization format";
+  else
+  {
+    char *items = g_strjoinv ("/", const_cast<char **> (supported_formats));
+    text = g_strdup_printf ("Set output format\n\n    Supported output formats are: %s", items);
+    g_free (items);
+    parser->free_later ((char *) text);
+  }
+
+  GOptionEntry entries[] =
+  {
+    {"output-file",   'o', 0, G_OPTION_ARG_STRING,	&this->output_file,		"Set output file-name (default: stdout)","filename"},
+    {"output-format", 'O', 0, G_OPTION_ARG_STRING,	&this->output_format,		text,					"format"},
+    {nullptr}
+  };
+  parser->add_group (entries,
+		     "output",
+		     "Output destination & format options:",
+		     "Options for the destination & form of the output",
+		     this);
+}
+
+
+
+hb_font_t *
+font_options_t::get_font () const
+{
+  if (font)
+    return font;
+
+  /* Create the blob */
+  if (!font_file)
+    fail (true, "No font file set");
+
+  const char *font_path = font_file;
+
+  if (0 == strcmp (font_path, "-"))
+  {
+#if defined(_WIN32) || defined(__CYGWIN__)
+    setmode (fileno (stdin), O_BINARY);
+    font_path = "STDIN";
+#else
+    font_path = "/dev/stdin";
+#endif
+  }
+
+  blob = hb_blob_create_from_file (font_path);
+
+  if (blob == hb_blob_get_empty ())
+    fail (false, "Couldn't read or find %s, or it was empty.", font_path);
+
+  /* Create the face */
+  hb_face_t *face = hb_face_create (blob, face_index);
+  hb_blob_destroy (blob);
+
+
+  font = hb_font_create (face);
+
+  if (font_size_x == FONT_SIZE_UPEM)
+    font_size_x = hb_face_get_upem (face);
+  if (font_size_y == FONT_SIZE_UPEM)
+    font_size_y = hb_face_get_upem (face);
+
+  hb_font_set_ppem (font, x_ppem, y_ppem);
+  hb_font_set_ptem (font, ptem);
+
+  int scale_x = (int) scalbnf (font_size_x, subpixel_bits);
+  int scale_y = (int) scalbnf (font_size_y, subpixel_bits);
+  hb_font_set_scale (font, scale_x, scale_y);
+  hb_face_destroy (face);
+
+  hb_font_set_variations (font, variations, num_variations);
+
+  void (*set_font_funcs) (hb_font_t *) = nullptr;
+  if (!font_funcs)
+  {
+    set_font_funcs = supported_font_funcs[0].func;
+  }
+  else
+  {
+    for (unsigned int i = 0; i < ARRAY_LENGTH (supported_font_funcs); i++)
+      if (0 == g_ascii_strcasecmp (font_funcs, supported_font_funcs[i].name))
+      {
+	set_font_funcs = supported_font_funcs[i].func;
+	break;
+      }
+    if (!set_font_funcs)
+    {
+      GString *s = g_string_new (nullptr);
+      for (unsigned int i = 0; i < ARRAY_LENGTH (supported_font_funcs); i++)
+      {
+        if (i)
+	  g_string_append_c (s, '/');
+	g_string_append (s, supported_font_funcs[i].name);
+      }
+      char *p = g_string_free (s, FALSE);
+      fail (false, "Unknown font function implementation `%s'; supported values are: %s; default is %s",
+	    font_funcs,
+	    p,
+	    supported_font_funcs[0].name);
+      //free (p);
+    }
+  }
+  set_font_funcs (font);
+#ifdef HAVE_FREETYPE
+  hb_ft_font_set_load_flags (font, ft_load_flags);
+#endif
+
+  return font;
+}
+
+
+const char *
+text_options_t::get_line (unsigned int *len)
+{
+  if (text) {
+    if (!line)
+    {
+      line = text;
+      line_len = text_len;
+    }
+    if (line_len == (unsigned int) -1)
+      line_len = strlen (line);
+
+    if (!line_len) {
+      *len = 0;
+      return nullptr;
+    }
+
+    const char *ret = line;
+    const char *p = (const char *) memchr (line, '\n', line_len);
+    unsigned int ret_len;
+    if (!p) {
+      ret_len = line_len;
+      line += ret_len;
+      line_len = 0;
+    } else {
+      ret_len = p - ret;
+      line += ret_len + 1;
+      line_len -= ret_len + 1;
+    }
+
+    *len = ret_len;
+    return ret;
+  }
+
+  if (!fp) {
+    if (!text_file)
+      fail (true, "At least one of text or text-file must be set");
+
+    if (0 != strcmp (text_file, "-"))
+      fp = fopen (text_file, "r");
+    else
+      fp = stdin;
+
+    if (!fp)
+      fail (false, "Failed opening text file `%s': %s",
+	    text_file, strerror (errno));
+
+    gs = g_string_new (nullptr);
+  }
+
+  g_string_set_size (gs, 0);
+  char buf[BUFSIZ];
+  while (fgets (buf, sizeof (buf), fp)) {
+    unsigned int bytes = strlen (buf);
+    if (bytes && buf[bytes - 1] == '\n') {
+      bytes--;
+      g_string_append_len (gs, buf, bytes);
+      break;
+    }
+      g_string_append_len (gs, buf, bytes);
+  }
+  if (ferror (fp))
+    fail (false, "Failed reading text: %s",
+	  strerror (errno));
+  *len = gs->len;
+  return !*len && feof (fp) ? nullptr : gs->str;
+}
+
+
+FILE *
+output_options_t::get_file_handle ()
+{
+  if (fp)
+    return fp;
+
+  if (output_file)
+    fp = fopen (output_file, "wb");
+  else {
+#if defined(_WIN32) || defined(__CYGWIN__)
+    setmode (fileno (stdout), O_BINARY);
+#endif
+    fp = stdout;
+  }
+  if (!fp)
+    fail (false, "Cannot open output file `%s': %s",
+	  g_filename_display_name (output_file), strerror (errno));
+
+  return fp;
+}
+
+static gboolean
+parse_verbose (const char *name G_GNUC_UNUSED,
+	       const char *arg G_GNUC_UNUSED,
+	       gpointer    data G_GNUC_UNUSED,
+	       GError    **error G_GNUC_UNUSED)
+{
+  format_options_t *format_opts = (format_options_t *) data;
+  format_opts->show_text = format_opts->show_unicode = format_opts->show_line_num = true;
+  return true;
+}
+
+static gboolean
+parse_ned (const char *name G_GNUC_UNUSED,
+	   const char *arg G_GNUC_UNUSED,
+	   gpointer    data G_GNUC_UNUSED,
+	   GError    **error G_GNUC_UNUSED)
+{
+  format_options_t *format_opts = (format_options_t *) data;
+  format_opts->show_clusters = format_opts->show_advances = false;
+  return true;
+}
+
+void
+format_options_t::add_options (option_parser_t *parser)
+{
+  GOptionEntry entries[] =
+  {
+    {"show-text",	0, 0, G_OPTION_ARG_NONE,	&this->show_text,		"Prefix each line of output with its corresponding input text",		nullptr},
+    {"show-unicode",	0, 0, G_OPTION_ARG_NONE,	&this->show_unicode,		"Prefix each line of output with its corresponding input codepoint(s)",	nullptr},
+    {"show-line-num",	0, 0, G_OPTION_ARG_NONE,	&this->show_line_num,		"Prefix each line of output with its corresponding input line number",	nullptr},
+    {"verbose",	      'v', G_OPTION_FLAG_NO_ARG,
+			      G_OPTION_ARG_CALLBACK,	(gpointer) &parse_verbose,	"Prefix each line of output with all of the above",			nullptr},
+    {"no-glyph-names",	0, G_OPTION_FLAG_REVERSE,
+			      G_OPTION_ARG_NONE,	&this->show_glyph_names,	"Output glyph indices instead of names",				nullptr},
+    {"no-positions",	0, G_OPTION_FLAG_REVERSE,
+			      G_OPTION_ARG_NONE,	&this->show_positions,		"Do not output glyph positions",					nullptr},
+    {"no-advances",	0, G_OPTION_FLAG_REVERSE,
+			      G_OPTION_ARG_NONE,	&this->show_advances,		"Do not output glyph advances",						nullptr},
+    {"no-clusters",	0, G_OPTION_FLAG_REVERSE,
+			      G_OPTION_ARG_NONE,	&this->show_clusters,		"Do not output cluster indices",					nullptr},
+    {"show-extents",	0, 0, G_OPTION_ARG_NONE,	&this->show_extents,		"Output glyph extents",							nullptr},
+    {"show-flags",	0, 0, G_OPTION_ARG_NONE,	&this->show_flags,		"Output glyph flags",							nullptr},
+    {"ned",	      'v', G_OPTION_FLAG_NO_ARG,
+			      G_OPTION_ARG_CALLBACK,	(gpointer) &parse_ned,		"No Extra Data; Do not output clusters or advances",			nullptr},
+    {"trace",	      'V', 0, G_OPTION_ARG_NONE,	&this->trace,			"Output interim shaping results",					nullptr},
+    {nullptr}
+  };
+  parser->add_group (entries,
+		     "output-syntax",
+		     "Output syntax:\n"
+         "    text: [<glyph name or index>=<glyph cluster index within input>@<horizontal displacement>,<vertical displacement>+<horizontal advance>,<vertical advance>|...]\n"
+         "    json: [{\"g\": <glyph name or index>, \"ax\": <horizontal advance>, \"ay\": <vertical advance>, \"dx\": <horizontal displacement>, \"dy\": <vertical displacement>, \"cl\": <glyph cluster index within input>}, ...]\n"
+         "\nOutput syntax options:",
+		     "Options for the syntax of the output",
+		     this);
+}
+
+void
+format_options_t::serialize_unicode (hb_buffer_t *buffer,
+				     GString     *gs)
+{
+  unsigned int num_glyphs = hb_buffer_get_length (buffer);
+  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
+
+  g_string_append_c (gs, '<');
+  for (unsigned int i = 0; i < num_glyphs; i++)
+  {
+    if (i)
+      g_string_append_c (gs, ',');
+    g_string_append_printf (gs, "U+%04X", info->codepoint);
+    info++;
+  }
+  g_string_append_c (gs, '>');
+}
+
+void
+format_options_t::serialize_glyphs (hb_buffer_t *buffer,
+				    hb_font_t   *font,
+				    hb_buffer_serialize_format_t output_format,
+				    hb_buffer_serialize_flags_t flags,
+				    GString     *gs)
+{
+  g_string_append_c (gs, '[');
+  unsigned int num_glyphs = hb_buffer_get_length (buffer);
+  unsigned int start = 0;
+
+  while (start < num_glyphs)
+  {
+    char buf[1024];
+    unsigned int consumed;
+    start += hb_buffer_serialize_glyphs (buffer, start, num_glyphs,
+					 buf, sizeof (buf), &consumed,
+					 font, output_format, flags);
+    if (!consumed)
+      break;
+    g_string_append (gs, buf);
+  }
+  g_string_append_c (gs, ']');
+}
+void
+format_options_t::serialize_line_no (unsigned int  line_no,
+				     GString      *gs)
+{
+  if (show_line_num)
+    g_string_append_printf (gs, "%d: ", line_no);
+}
+void
+format_options_t::serialize_buffer_of_text (hb_buffer_t  *buffer,
+					    unsigned int  line_no,
+					    const char   *text,
+					    unsigned int  text_len,
+					    hb_font_t    *font,
+					    GString      *gs)
+{
+  if (show_text)
+  {
+    serialize_line_no (line_no, gs);
+    g_string_append_c (gs, '(');
+    g_string_append_len (gs, text, text_len);
+    g_string_append_c (gs, ')');
+    g_string_append_c (gs, '\n');
+  }
+
+  if (show_unicode)
+  {
+    serialize_line_no (line_no, gs);
+    serialize_unicode (buffer, gs);
+    g_string_append_c (gs, '\n');
+  }
+}
+void
+format_options_t::serialize_message (unsigned int  line_no,
+				     const char   *type,
+				     const char   *msg,
+				     GString      *gs)
+{
+  serialize_line_no (line_no, gs);
+  g_string_append_printf (gs, "%s: %s", type, msg);
+  g_string_append_c (gs, '\n');
+}
+void
+format_options_t::serialize_buffer_of_glyphs (hb_buffer_t  *buffer,
+					      unsigned int  line_no,
+					      const char   *text,
+					      unsigned int  text_len,
+					      hb_font_t    *font,
+					      hb_buffer_serialize_format_t output_format,
+					      hb_buffer_serialize_flags_t format_flags,
+					      GString      *gs)
+{
+  serialize_line_no (line_no, gs);
+  serialize_glyphs (buffer, font, output_format, format_flags, gs);
+  g_string_append_c (gs, '\n');
+}
+
+void
+subset_options_t::add_options (option_parser_t *parser)
+{
+  GOptionEntry entries[] =
+  {
+    {"layout", 0, 0, G_OPTION_ARG_NONE,  &this->keep_layout,   "Keep OpenType Layout tables",   nullptr},
+    {"no-hinting", 0, 0, G_OPTION_ARG_NONE,  &this->drop_hints,   "Whether to drop hints",   nullptr},
+    {"desubroutinize", 0, 0, G_OPTION_ARG_NONE,  &this->desubroutinize,   "Remove CFF/CFF2 use of subroutines",   nullptr},
+
+    {nullptr}
+  };
+  parser->add_group (entries,
+         "subset",
+         "Subset options:",
+         "Options subsetting",
+         this);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/options.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/options.hh
new file mode 100644
index 0000000..e846258
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/options.hh
@@ -0,0 +1,708 @@
+/*
+ * Copyright © 2011  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 OPTIONS_HH
+#define OPTIONS_HH
+
+#include "hb.hh"
+
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <math.h>
+#include <locale.h>
+#include <errno.h>
+#include <fcntl.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h> /* for isatty() */
+#endif
+#if defined(_WIN32) || defined(__CYGWIN__)
+#include <io.h> /* for setmode() under Windows */
+#endif
+
+#include <hb.h>
+#include <hb-ot.h>
+#include <glib.h>
+#include <glib/gprintf.h>
+
+void fail (hb_bool_t suggest_help, const char *format, ...) G_GNUC_NORETURN G_GNUC_PRINTF (2, 3);
+
+struct option_group_t
+{
+  virtual ~option_group_t () {}
+
+  virtual void add_options (struct option_parser_t *parser) = 0;
+
+  virtual void pre_parse (GError **error G_GNUC_UNUSED) {}
+  virtual void post_parse (GError **error G_GNUC_UNUSED) {}
+};
+
+
+struct option_parser_t
+{
+  option_parser_t (const char *usage)
+  {
+    memset (this, 0, sizeof (*this));
+    usage_str = usage;
+    context = g_option_context_new (usage);
+    to_free = g_ptr_array_new ();
+
+    add_main_options ();
+  }
+
+  static void _g_free_g_func (void *p, void * G_GNUC_UNUSED) { g_free (p); }
+
+  ~option_parser_t ()
+  {
+    g_option_context_free (context);
+    g_ptr_array_foreach (to_free, _g_free_g_func, nullptr);
+    g_ptr_array_free (to_free, TRUE);
+  }
+
+  void add_main_options ();
+
+  void add_group (GOptionEntry   *entries,
+		  const gchar    *name,
+		  const gchar    *description,
+		  const gchar    *help_description,
+		  option_group_t *option_group);
+
+  void free_later (char *p) {
+    g_ptr_array_add (to_free, p);
+  }
+
+  void parse (int *argc, char ***argv);
+
+  G_GNUC_NORETURN void usage () {
+    g_printerr ("Usage: %s [OPTION...] %s\n", g_get_prgname (), usage_str);
+    exit (1);
+  }
+
+  private:
+  const char *usage_str;
+  GOptionContext *context;
+  GPtrArray *to_free;
+};
+
+
+#define DEFAULT_MARGIN 16
+#define DEFAULT_FORE "#000000"
+#define DEFAULT_BACK "#FFFFFF"
+#define FONT_SIZE_UPEM 0x7FFFFFFF
+#define FONT_SIZE_NONE 0
+
+struct view_options_t : option_group_t
+{
+  view_options_t (option_parser_t *parser)
+  {
+    annotate = false;
+    fore = nullptr;
+    back = nullptr;
+    line_space = 0;
+    margin.t = margin.r = margin.b = margin.l = DEFAULT_MARGIN;
+
+    add_options (parser);
+  }
+  virtual ~view_options_t ()
+  {
+    g_free (fore);
+    g_free (back);
+  }
+
+  void add_options (option_parser_t *parser);
+
+  hb_bool_t annotate;
+  char *fore;
+  char *back;
+  double line_space;
+  struct margin_t {
+    double t, r, b, l;
+  } margin;
+};
+
+
+struct shape_options_t : option_group_t
+{
+  shape_options_t (option_parser_t *parser)
+  {
+    direction = language = script = nullptr;
+    bot = eot = preserve_default_ignorables = remove_default_ignorables = false;
+    features = nullptr;
+    num_features = 0;
+    shapers = nullptr;
+    utf8_clusters = false;
+    invisible_glyph = 0;
+    cluster_level = HB_BUFFER_CLUSTER_LEVEL_DEFAULT;
+    normalize_glyphs = false;
+    verify = false;
+    num_iterations = 1;
+
+    add_options (parser);
+  }
+  virtual ~shape_options_t ()
+  {
+    g_free (direction);
+    g_free (language);
+    g_free (script);
+    free (features);
+    g_strfreev (shapers);
+  }
+
+  void add_options (option_parser_t *parser);
+
+  void setup_buffer (hb_buffer_t *buffer)
+  {
+    hb_buffer_set_direction (buffer, hb_direction_from_string (direction, -1));
+    hb_buffer_set_script (buffer, hb_script_from_string (script, -1));
+    hb_buffer_set_language (buffer, hb_language_from_string (language, -1));
+    hb_buffer_set_flags (buffer, (hb_buffer_flags_t)
+				 (HB_BUFFER_FLAG_DEFAULT |
+				  (bot ? HB_BUFFER_FLAG_BOT : 0) |
+				  (eot ? HB_BUFFER_FLAG_EOT : 0) |
+				  (preserve_default_ignorables ? HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES : 0) |
+				  (remove_default_ignorables ? HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES : 0) |
+				  0));
+    hb_buffer_set_invisible_glyph (buffer, invisible_glyph);
+    hb_buffer_set_cluster_level (buffer, cluster_level);
+    hb_buffer_guess_segment_properties (buffer);
+  }
+
+  static void copy_buffer_properties (hb_buffer_t *dst, hb_buffer_t *src)
+  {
+    hb_segment_properties_t props;
+    hb_buffer_get_segment_properties (src, &props);
+    hb_buffer_set_segment_properties (dst, &props);
+    hb_buffer_set_flags (dst, hb_buffer_get_flags (src));
+    hb_buffer_set_cluster_level (dst, hb_buffer_get_cluster_level (src));
+  }
+
+  void populate_buffer (hb_buffer_t *buffer, const char *text, int text_len,
+			const char *text_before, const char *text_after)
+  {
+    hb_buffer_clear_contents (buffer);
+    if (text_before) {
+      unsigned int len = strlen (text_before);
+      hb_buffer_add_utf8 (buffer, text_before, len, len, 0);
+    }
+    hb_buffer_add_utf8 (buffer, text, text_len, 0, text_len);
+    if (text_after) {
+      hb_buffer_add_utf8 (buffer, text_after, -1, 0, 0);
+    }
+
+    if (!utf8_clusters) {
+      /* Reset cluster values to refer to Unicode character index
+       * instead of UTF-8 index. */
+      unsigned int num_glyphs = hb_buffer_get_length (buffer);
+      hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
+      for (unsigned int i = 0; i < num_glyphs; i++)
+      {
+	info->cluster = i;
+	info++;
+      }
+    }
+
+    setup_buffer (buffer);
+  }
+
+  hb_bool_t shape (hb_font_t *font, hb_buffer_t *buffer, const char **error=nullptr)
+  {
+    hb_buffer_t *text_buffer = nullptr;
+    if (verify)
+    {
+      text_buffer = hb_buffer_create ();
+      hb_buffer_append (text_buffer, buffer, 0, -1);
+    }
+
+    if (!hb_shape_full (font, buffer, features, num_features, shapers))
+    {
+      if (error)
+        *error = "all shapers failed.";
+      goto fail;
+    }
+
+    if (normalize_glyphs)
+      hb_buffer_normalize_glyphs (buffer);
+
+    if (verify && !verify_buffer (buffer, text_buffer, font, error))
+      goto fail;
+
+    if (text_buffer)
+      hb_buffer_destroy (text_buffer);
+
+    return true;
+
+  fail:
+    if (text_buffer)
+      hb_buffer_destroy (text_buffer);
+
+    return false;
+  }
+
+  bool verify_buffer (hb_buffer_t  *buffer,
+		      hb_buffer_t  *text_buffer,
+		      hb_font_t    *font,
+		      const char  **error=nullptr)
+  {
+    if (!verify_buffer_monotone (buffer, error))
+      return false;
+    if (!verify_buffer_safe_to_break (buffer, text_buffer, font, error))
+      return false;
+    return true;
+  }
+
+  bool verify_buffer_monotone (hb_buffer_t *buffer, const char **error=nullptr)
+  {
+    /* Check that clusters are monotone. */
+    if (cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES ||
+	cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
+    {
+      bool is_forward = HB_DIRECTION_IS_FORWARD (hb_buffer_get_direction (buffer));
+
+      unsigned int num_glyphs;
+      hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, &num_glyphs);
+
+      for (unsigned int i = 1; i < num_glyphs; i++)
+	if (info[i-1].cluster != info[i].cluster &&
+	    (info[i-1].cluster < info[i].cluster) != is_forward)
+	{
+	  if (error)
+	    *error = "clusters are not monotone.";
+	  return false;
+	}
+    }
+
+    return true;
+  }
+
+  bool verify_buffer_safe_to_break (hb_buffer_t  *buffer,
+				    hb_buffer_t  *text_buffer,
+				    hb_font_t    *font,
+				    const char  **error=nullptr)
+  {
+    if (cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES &&
+	cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
+    {
+      /* Cannot perform this check without monotone clusters.
+       * Then again, unsafe-to-break flag is much harder to use without
+       * monotone clusters. */
+      return true;
+    }
+
+    /* Check that breaking up shaping at safe-to-break is indeed safe. */
+
+    hb_buffer_t *fragment = hb_buffer_create ();
+    hb_buffer_t *reconstruction = hb_buffer_create ();
+    copy_buffer_properties (reconstruction, buffer);
+
+    unsigned int num_glyphs;
+    hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, &num_glyphs);
+
+    unsigned int num_chars;
+    hb_glyph_info_t *text = hb_buffer_get_glyph_infos (text_buffer, &num_chars);
+
+    /* Chop text and shape fragments. */
+    bool forward = HB_DIRECTION_IS_FORWARD (hb_buffer_get_direction (buffer));
+    unsigned int start = 0;
+    unsigned int text_start = forward ? 0 : num_chars;
+    unsigned int text_end = text_start;
+    for (unsigned int end = 1; end < num_glyphs + 1; end++)
+    {
+      if (end < num_glyphs &&
+	  (info[end].cluster == info[end-1].cluster ||
+	   info[end-(forward?0:1)].mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK))
+	  continue;
+
+      /* Shape segment corresponding to glyphs start..end. */
+      if (end == num_glyphs)
+      {
+        if (forward)
+	  text_end = num_chars;
+	else
+	  text_start = 0;
+      }
+      else
+      {
+	if (forward)
+	{
+	  unsigned int cluster = info[end].cluster;
+	  while (text_end < num_chars && text[text_end].cluster < cluster)
+	    text_end++;
+	}
+	else
+	{
+	  unsigned int cluster = info[end - 1].cluster;
+	  while (text_start && text[text_start - 1].cluster >= cluster)
+	    text_start--;
+	}
+      }
+      assert (text_start < text_end);
+
+      if (0)
+	printf("start %d end %d text start %d end %d\n", start, end, text_start, text_end);
+
+      hb_buffer_clear_contents (fragment);
+      copy_buffer_properties (fragment, buffer);
+
+      /* TODO: Add pre/post context text. */
+      hb_buffer_flags_t flags = hb_buffer_get_flags (fragment);
+      if (0 < text_start)
+        flags = (hb_buffer_flags_t) (flags & ~HB_BUFFER_FLAG_BOT);
+      if (text_end < num_chars)
+        flags = (hb_buffer_flags_t) (flags & ~HB_BUFFER_FLAG_EOT);
+      hb_buffer_set_flags (fragment, flags);
+
+      hb_buffer_append (fragment, text_buffer, text_start, text_end);
+      if (!hb_shape_full (font, fragment, features, num_features, shapers))
+      {
+	if (error)
+	  *error = "all shapers failed while shaping fragment.";
+	hb_buffer_destroy (reconstruction);
+	hb_buffer_destroy (fragment);
+	return false;
+      }
+      hb_buffer_append (reconstruction, fragment, 0, -1);
+
+      start = end;
+      if (forward)
+	text_start = text_end;
+      else
+	text_end = text_start;
+    }
+
+    bool ret = true;
+    hb_buffer_diff_flags_t diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0);
+    if (diff)
+    {
+      if (error)
+	*error = "Safe-to-break test failed.";
+      ret = false;
+
+      /* Return the reconstructed result instead so it can be inspected. */
+      hb_buffer_set_length (buffer, 0);
+      hb_buffer_append (buffer, reconstruction, 0, -1);
+    }
+
+    hb_buffer_destroy (reconstruction);
+    hb_buffer_destroy (fragment);
+
+    return ret;
+  }
+
+  void shape_closure (const char *text, int text_len,
+		      hb_font_t *font, hb_buffer_t *buffer,
+		      hb_set_t *glyphs)
+  {
+    hb_buffer_reset (buffer);
+    hb_buffer_add_utf8 (buffer, text, text_len, 0, text_len);
+    setup_buffer (buffer);
+    hb_ot_shape_glyphs_closure (font, buffer, features, num_features, glyphs);
+  }
+
+  /* Buffer properties */
+  char *direction;
+  char *language;
+  char *script;
+
+  /* Buffer flags */
+  hb_bool_t bot;
+  hb_bool_t eot;
+  hb_bool_t preserve_default_ignorables;
+  hb_bool_t remove_default_ignorables;
+
+  hb_feature_t *features;
+  unsigned int num_features;
+  char **shapers;
+  hb_bool_t utf8_clusters;
+  hb_codepoint_t invisible_glyph;
+  hb_buffer_cluster_level_t cluster_level;
+  hb_bool_t normalize_glyphs;
+  hb_bool_t verify;
+  unsigned int num_iterations;
+};
+
+
+struct font_options_t : option_group_t
+{
+  font_options_t (option_parser_t *parser,
+		  int default_font_size_,
+		  unsigned int subpixel_bits_)
+  {
+    variations = nullptr;
+    num_variations = 0;
+    default_font_size = default_font_size_;
+    x_ppem = 0;
+    y_ppem = 0;
+    ptem = 0.;
+    subpixel_bits = subpixel_bits_;
+    font_file = nullptr;
+    face_index = 0;
+    font_size_x = font_size_y = default_font_size;
+    font_funcs = nullptr;
+    ft_load_flags = 2;
+
+    blob = nullptr;
+    font = nullptr;
+
+    add_options (parser);
+  }
+  virtual ~font_options_t ()
+  {
+    g_free (font_file);
+    free (variations);
+    g_free (font_funcs);
+    hb_font_destroy (font);
+  }
+
+  void add_options (option_parser_t *parser);
+
+  hb_font_t *get_font () const;
+
+  char *font_file;
+  mutable hb_blob_t *blob;
+  int face_index;
+  hb_variation_t *variations;
+  unsigned int num_variations;
+  int default_font_size;
+  int x_ppem;
+  int y_ppem;
+  double ptem;
+  unsigned int subpixel_bits;
+  mutable double font_size_x;
+  mutable double font_size_y;
+  char *font_funcs;
+  int ft_load_flags;
+
+  private:
+  mutable hb_font_t *font;
+};
+
+
+struct text_options_t : option_group_t
+{
+  text_options_t (option_parser_t *parser)
+  {
+    text_before = nullptr;
+    text_after = nullptr;
+
+    text_len = -1;
+    text = nullptr;
+    text_file = nullptr;
+
+    fp = nullptr;
+    gs = nullptr;
+    line = nullptr;
+    line_len = (unsigned int) -1;
+
+    add_options (parser);
+  }
+  virtual ~text_options_t ()
+  {
+    g_free (text_before);
+    g_free (text_after);
+    g_free (text);
+    g_free (text_file);
+    if (gs)
+      g_string_free (gs, true);
+    if (fp && fp != stdin)
+      fclose (fp);
+  }
+
+  void add_options (option_parser_t *parser);
+
+  void post_parse (GError **error G_GNUC_UNUSED) {
+    if (text && text_file)
+      g_set_error (error,
+		   G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+		   "Only one of text and text-file can be set");
+  }
+
+  const char *get_line (unsigned int *len);
+
+  char *text_before;
+  char *text_after;
+
+  int text_len;
+  char *text;
+  char *text_file;
+
+  private:
+  FILE *fp;
+  GString *gs;
+  char *line;
+  unsigned int line_len;
+};
+
+struct output_options_t : option_group_t
+{
+  output_options_t (option_parser_t *parser,
+		    const char **supported_formats_ = nullptr)
+  {
+    output_file = nullptr;
+    output_format = nullptr;
+    supported_formats = supported_formats_;
+    explicit_output_format = false;
+
+    fp = nullptr;
+
+    add_options (parser);
+  }
+  virtual ~output_options_t ()
+  {
+    g_free (output_file);
+    g_free (output_format);
+    if (fp && fp != stdout)
+      fclose (fp);
+  }
+
+  void add_options (option_parser_t *parser);
+
+  void post_parse (GError **error G_GNUC_UNUSED)
+  {
+    if (output_format)
+      explicit_output_format = true;
+
+    if (output_file && !output_format) {
+      output_format = strrchr (output_file, '.');
+      if (output_format)
+      {
+	  output_format++; /* skip the dot */
+	  output_format = g_strdup (output_format);
+      }
+    }
+
+    if (output_file && 0 == strcmp (output_file, "-"))
+      output_file = nullptr; /* STDOUT */
+  }
+
+  FILE *get_file_handle ();
+
+  char *output_file;
+  char *output_format;
+  const char **supported_formats;
+  bool explicit_output_format;
+
+  mutable FILE *fp;
+};
+
+struct format_options_t : option_group_t
+{
+  format_options_t (option_parser_t *parser) {
+    show_glyph_names = true;
+    show_positions = true;
+    show_advances = true;
+    show_clusters = true;
+    show_text = false;
+    show_unicode = false;
+    show_line_num = false;
+    show_extents = false;
+    show_flags = false;
+    trace = false;
+
+    add_options (parser);
+  }
+
+  void add_options (option_parser_t *parser);
+
+  void serialize_unicode (hb_buffer_t  *buffer,
+			  GString      *gs);
+  void serialize_glyphs (hb_buffer_t  *buffer,
+			 hb_font_t    *font,
+			 hb_buffer_serialize_format_t format,
+			 hb_buffer_serialize_flags_t flags,
+			 GString      *gs);
+  void serialize_line_no (unsigned int  line_no,
+			  GString      *gs);
+  void serialize_buffer_of_text (hb_buffer_t  *buffer,
+				 unsigned int  line_no,
+				 const char   *text,
+				 unsigned int  text_len,
+				 hb_font_t    *font,
+				 GString      *gs);
+  void serialize_message (unsigned int  line_no,
+			  const char   *type,
+			  const char   *msg,
+			  GString      *gs);
+  void serialize_buffer_of_glyphs (hb_buffer_t  *buffer,
+				   unsigned int  line_no,
+				   const char   *text,
+				   unsigned int  text_len,
+				   hb_font_t    *font,
+				   hb_buffer_serialize_format_t output_format,
+				   hb_buffer_serialize_flags_t format_flags,
+				   GString      *gs);
+
+
+  hb_bool_t show_glyph_names;
+  hb_bool_t show_positions;
+  hb_bool_t show_advances;
+  hb_bool_t show_clusters;
+  hb_bool_t show_text;
+  hb_bool_t show_unicode;
+  hb_bool_t show_line_num;
+  hb_bool_t show_extents;
+  hb_bool_t show_flags;
+  hb_bool_t trace;
+};
+
+struct subset_options_t : option_group_t
+{
+  subset_options_t (option_parser_t *parser)
+  {
+    keep_layout = false;
+    drop_hints = false;
+    desubroutinize = false;
+
+    add_options (parser);
+  }
+
+  void add_options (option_parser_t *parser);
+
+  hb_bool_t keep_layout;
+  hb_bool_t drop_hints;
+  hb_bool_t desubroutinize;
+};
+
+/* fallback implementation for scalbn()/scalbnf() for pre-2013 MSVC */
+#if defined (_MSC_VER) && (_MSC_VER < 1800)
+
+#ifndef FLT_RADIX
+#define FLT_RADIX 2
+#endif
+
+__inline long double scalbn (long double x, int exp)
+{
+  return x * (pow ((long double) FLT_RADIX, exp));
+}
+
+__inline float scalbnf (float x, int exp)
+{
+  return x * (pow ((float) FLT_RADIX, exp));
+}
+#endif
+
+#endif
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/shape-consumer.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/shape-consumer.hh
new file mode 100644
index 0000000..da0d880
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/shape-consumer.hh
@@ -0,0 +1,101 @@
+/*
+ * Copyright © 2011,2012  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_SHAPE_CONSUMER_HH
+#define HB_SHAPE_CONSUMER_HH
+
+#include "hb.hh"
+#include "options.hh"
+
+
+template <typename output_t>
+struct shape_consumer_t
+{
+  shape_consumer_t (option_parser_t *parser)
+		  : failed (false),
+		    shaper (parser),
+		    output (parser),
+		    font (nullptr),
+		    buffer (nullptr) {}
+
+  void init (hb_buffer_t  *buffer_,
+	     const font_options_t *font_opts)
+  {
+    font = hb_font_reference (font_opts->get_font ());
+    failed = false;
+    buffer = hb_buffer_reference (buffer_);
+
+    output.init (buffer, font_opts);
+  }
+  void consume_line (const char   *text,
+		     unsigned int  text_len,
+		     const char   *text_before,
+		     const char   *text_after)
+  {
+    output.new_line ();
+
+    for (unsigned int n = shaper.num_iterations; n; n--)
+    {
+      const char *error = nullptr;
+
+      shaper.populate_buffer (buffer, text, text_len, text_before, text_after);
+      if (n == 1)
+	output.consume_text (buffer, text, text_len, shaper.utf8_clusters);
+      if (!shaper.shape (font, buffer, &error))
+      {
+	failed = true;
+	output.error (error);
+	if (hb_buffer_get_content_type (buffer) == HB_BUFFER_CONTENT_TYPE_GLYPHS)
+	  break;
+	else
+	  return;
+      }
+    }
+
+    output.consume_glyphs (buffer, text, text_len, shaper.utf8_clusters);
+  }
+  void finish (const font_options_t *font_opts)
+  {
+    output.finish (buffer, font_opts);
+    hb_font_destroy (font);
+    font = nullptr;
+    hb_buffer_destroy (buffer);
+    buffer = nullptr;
+  }
+
+  public:
+  bool failed;
+
+  protected:
+  shape_options_t shaper;
+  output_t output;
+
+  hb_font_t *font;
+  hb_buffer_t *buffer;
+};
+
+
+#endif
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/view-cairo.cc b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/view-cairo.cc
new file mode 100644
index 0000000..e8e334b
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/view-cairo.cc
@@ -0,0 +1,133 @@
+/*
+ * Copyright © 2011  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
+ */
+
+#include "view-cairo.hh"
+
+#include <assert.h>
+
+
+void
+view_cairo_t::render (const font_options_t *font_opts)
+{
+  bool vertical = HB_DIRECTION_IS_VERTICAL (direction);
+  int vert  = vertical ? 1 : 0;
+  int horiz = vertical ? 0 : 1;
+
+  int x_sign = font_opts->font_size_x < 0 ? -1 : +1;
+  int y_sign = font_opts->font_size_y < 0 ? -1 : +1;
+
+  hb_font_t *font = font_opts->get_font();
+  hb_font_extents_t extents;
+  hb_font_get_extents_for_direction (font, direction, &extents);
+
+  double ascent = y_sign * scalbn ((double) extents.ascender, scale_bits);
+  double descent = y_sign * -scalbn ((double) extents.descender, scale_bits);
+  double font_height = y_sign * scalbn ((double) extents.ascender - extents.descender + extents.line_gap, scale_bits);
+  double leading = font_height + view_options.line_space;
+
+  /* Calculate surface size. */
+  double w = 0, h = 0;
+  (vertical ? w : h) = (int) lines->len * leading - view_options.line_space;
+  (vertical ? h : w) = 0;
+  for (unsigned int i = 0; i < lines->len; i++) {
+    helper_cairo_line_t &line = g_array_index (lines, helper_cairo_line_t, i);
+    double x_advance, y_advance;
+    line.get_advance (&x_advance, &y_advance);
+    if (vertical)
+      h =  MAX (h, y_sign * y_advance);
+    else
+      w =  MAX (w, x_sign * x_advance);
+  }
+
+  cairo_scaled_font_t *scaled_font = helper_cairo_create_scaled_font (font_opts);
+
+  /* See if font needs color. */
+  cairo_content_t content = CAIRO_CONTENT_ALPHA;
+  if (helper_cairo_scaled_font_has_color (scaled_font))
+    content = CAIRO_CONTENT_COLOR;
+
+  /* Create surface. */
+  cairo_t *cr = helper_cairo_create_context (w + view_options.margin.l + view_options.margin.r,
+					     h + view_options.margin.t + view_options.margin.b,
+					     &view_options, &output_options, content);
+  cairo_set_scaled_font (cr, scaled_font);
+
+  /* Setup coordinate system. */
+  cairo_translate (cr, view_options.margin.l, view_options.margin.t);
+  if (vertical)
+    cairo_translate (cr,
+		     w /* We stack lines right to left */
+		     -font_height * .5 /* "ascent" for vertical */,
+		     y_sign < 0 ? h : 0);
+  else
+   {
+    cairo_translate (cr,
+		     x_sign < 0 ? w : 0,
+		     y_sign < 0 ? descent : ascent);
+   }
+
+  /* Draw. */
+  cairo_translate (cr, +vert * leading, -horiz * leading);
+  for (unsigned int i = 0; i < lines->len; i++)
+  {
+    helper_cairo_line_t &l = g_array_index (lines, helper_cairo_line_t, i);
+
+    cairo_translate (cr, -vert * leading, +horiz * leading);
+
+    if (view_options.annotate) {
+      cairo_save (cr);
+
+      /* Draw actual glyph origins */
+      cairo_set_source_rgba (cr, 1., 0., 0., .5);
+      cairo_set_line_width (cr, 5);
+      cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
+      for (unsigned i = 0; i < l.num_glyphs; i++) {
+	cairo_move_to (cr, l.glyphs[i].x, l.glyphs[i].y);
+	cairo_rel_line_to (cr, 0, 0);
+      }
+      cairo_stroke (cr);
+
+      cairo_restore (cr);
+    }
+
+    if (0 && cairo_surface_get_type (cairo_get_target (cr)) == CAIRO_SURFACE_TYPE_IMAGE) {
+      /* cairo_show_glyphs() doesn't support subpixel positioning */
+      cairo_glyph_path (cr, l.glyphs, l.num_glyphs);
+      cairo_fill (cr);
+    } else if (l.num_clusters)
+      cairo_show_text_glyphs (cr,
+			      l.utf8, l.utf8_len,
+			      l.glyphs, l.num_glyphs,
+			      l.clusters, l.num_clusters,
+			      l.cluster_flags);
+    else
+      cairo_show_glyphs (cr, l.glyphs, l.num_glyphs);
+  }
+
+  /* Clean up. */
+  helper_cairo_destroy_context (cr);
+  cairo_scaled_font_destroy (scaled_font);
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/view-cairo.hh b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/view-cairo.hh
new file mode 100644
index 0000000..1f51f0e
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/harfbuzz/util/view-cairo.hh
@@ -0,0 +1,95 @@
+/*
+ * Copyright © 2011  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 VIEW_CAIRO_HH
+#define VIEW_CAIRO_HH
+
+#include "hb.hh"
+#include "options.hh"
+#include "helper-cairo.hh"
+
+
+struct view_cairo_t
+{
+  view_cairo_t (option_parser_t *parser)
+	       : output_options (parser, helper_cairo_supported_formats),
+		 view_options (parser),
+		 direction (HB_DIRECTION_INVALID),
+		 lines (0), scale_bits (0) {}
+  ~view_cairo_t () {
+    cairo_debug_reset_static_data ();
+  }
+
+  void init (hb_buffer_t *buffer, const font_options_t *font_opts)
+  {
+    lines = g_array_new (false, false, sizeof (helper_cairo_line_t));
+    scale_bits = - (int) font_opts->subpixel_bits;
+  }
+  void new_line () {}
+  void consume_text (hb_buffer_t  *buffer,
+		     const char   *text,
+		     unsigned int  text_len,
+		     hb_bool_t     utf8_clusters) {}
+  void error (const char *message)
+  { g_printerr ("%s: %s\n", g_get_prgname (), message); }
+  void consume_glyphs (hb_buffer_t  *buffer,
+		       const char   *text,
+		       unsigned int  text_len,
+		       hb_bool_t     utf8_clusters)
+  {
+    direction = hb_buffer_get_direction (buffer);
+    helper_cairo_line_t l;
+    helper_cairo_line_from_buffer (&l, buffer, text, text_len, scale_bits, utf8_clusters);
+    g_array_append_val (lines, l);
+  }
+  void finish (hb_buffer_t *buffer, const font_options_t *font_opts)
+  {
+    render (font_opts);
+
+    for (unsigned int i = 0; i < lines->len; i++) {
+      helper_cairo_line_t &line = g_array_index (lines, helper_cairo_line_t, i);
+      line.finish ();
+    }
+#if GLIB_CHECK_VERSION (2, 22, 0)
+    g_array_unref (lines);
+#else
+    g_array_free (lines, TRUE);
+#endif
+  }
+
+  protected:
+
+  output_options_t output_options;
+  view_options_t view_options;
+
+  void render (const font_options_t *font_opts);
+
+  hb_direction_t direction; // Remove this, make segment_properties accessible
+  GArray *lines;
+  int scale_bits;
+};
+
+#endif
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/makefile.cargo b/third_party/rust_crates/vendor/harfbuzz-sys/makefile.cargo
new file mode 100644
index 0000000..ae74a34
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/makefile.cargo
@@ -0,0 +1,63 @@
+FLAGS = -fPIC
+
+ifeq (armv7-linux-androideabi,$(TARGET))
+	# Reset TARGET variable because armv7 target name used by Rust is not 
+	# the same as the target name needed for the CXX toolchain.
+	TARGET = arm-linux-androideabi
+	FLAGS += -march=armv7-a -mfpu=neon --target=$(TARGET)
+endif
+
+ifneq ($(HOST),$(TARGET))
+  CXX ?= $(TARGET)-g++
+  CC ?= $(TARGET)-gcc
+  AR ?= $(TARGET)-ar
+else
+  CXX ?= g++
+  CC ?= gcc
+  AR ?= ar
+endif
+
+ifeq ($(DEBUG),true)
+  FLAGS += -g
+else
+  FLAGS += -O2
+endif
+
+CFLAGS += $(FLAGS)
+CXXFLAGS += $(FLAGS)
+
+CONFIGURE_FLAGS = \
+	--prefix=$(OUT_DIR) \
+	--host=$(TARGET) \
+	--enable-static \
+	--disable-shared \
+	--without-icu \
+	--without-freetype \
+	--without-glib \
+	--with-coretext=auto
+
+all:
+	touch -r harfbuzz/configure $(AUTOMAKE_FILES)
+	cd $(OUT_DIR) && $(CARGO_MANIFEST_DIR)/harfbuzz/configure $(CONFIGURE_FLAGS) \
+		CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" CPPFLAGS="$(CPPFLAGS)"
+	cd $(OUT_DIR) && make -j$(NUM_JOBS)
+	cd $(OUT_DIR) && make install
+
+# If the timestamp on these files is incorrect (because git does not preserve timestamps)
+# then the configure script will incorrectly try to run automake commands to regenerate them.
+# We `touch` these files to prevent this.
+AUTOMAKE_FILES = $(wildcard \
+	harfbuzz/configure.ac \
+	harfbuzz/m4/*.m4 \
+	harfbuzz/aclocal.m4 \
+	harfbuzz/configure \
+	harfbuzz/config.h.in \
+	harfbuzz/Makefile.* \
+	harfbuzz/*/Makefile.* \
+	harfbuzz/*/*/Makefile.* \
+	harfbuzz/*/*/*/Makefile.* \
+	harfbuzz/*/*/*/*/Makefile.* \
+	harfbuzz/gtk-doc.make \
+	)
+
+.PHONY: all
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/src/coretext.rs b/third_party/rust_crates/vendor/harfbuzz-sys/src/coretext.rs
new file mode 100644
index 0000000..56129ce
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/src/coretext.rs
@@ -0,0 +1,18 @@
+extern crate core_graphics;
+extern crate core_text;
+extern crate foreign_types;
+
+use {hb_face_t, hb_font_t};
+
+use self::core_text::font::CTFontRef;
+use self::foreign_types::ForeignType;
+use self::core_graphics::font::CGFont;
+
+type CGFontRef = *mut <CGFont as ForeignType>::CType;
+
+extern "C" {
+    pub fn hb_coretext_face_create(cg_font: CGFontRef) -> *mut hb_face_t;
+    pub fn hb_coretext_font_create(ct_font: CTFontRef) -> *mut hb_font_t;
+    pub fn hb_coretext_face_get_cg_font(face: *mut hb_face_t) -> CGFontRef;
+    pub fn hb_coretext_font_get_ct_font(font: *mut hb_font_t) -> CTFontRef;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz-sys/src/lib.rs b/third_party/rust_crates/vendor/harfbuzz-sys/src/lib.rs
new file mode 100644
index 0000000..227b722
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz-sys/src/lib.rs
@@ -0,0 +1,4494 @@
+#![allow(non_camel_case_types)]
+#![cfg_attr(feature = "cargo-clippy", allow(unreadable_literal))]
+
+#[cfg(any(target_os = "android", all(unix, not(target_os = "macos"))))]
+extern crate freetype;
+
+#[cfg(target_os = "macos")]
+pub mod coretext;
+
+#[cfg(any(target_os = "android", all(unix, not(target_os = "macos"))))]
+extern "C" {
+    pub fn hb_ft_font_create_referenced(face: freetype::freetype::FT_Face) -> *mut hb_font_t;
+}
+
+/* automatically generated by rust-bindgen */
+
+pub const HB_FEATURE_GLOBAL_START: u32 = 0;
+pub const HB_UNICODE_MAX: u32 = 1114111;
+pub const HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT: u32 = 65533;
+pub const HB_OT_MAX_TAGS_PER_SCRIPT: u32 = 3;
+pub const HB_OT_MAX_TAGS_PER_LANGUAGE: u32 = 3;
+pub const HB_OT_LAYOUT_NO_SCRIPT_INDEX: u32 = 65535;
+pub const HB_OT_LAYOUT_NO_FEATURE_INDEX: u32 = 65535;
+pub const HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX: u32 = 65535;
+pub const HB_OT_LAYOUT_NO_VARIATIONS_INDEX: u32 = 4294967295;
+pub const HB_AAT_LAYOUT_NO_SELECTOR_INDEX: u32 = 65535;
+pub type hb_bool_t = ::std::os::raw::c_int;
+pub type hb_codepoint_t = u32;
+pub type hb_position_t = i32;
+pub type hb_mask_t = u32;
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub union _hb_var_int_t {
+    pub u32: u32,
+    pub i32: i32,
+    pub u16: [u16; 2usize],
+    pub i16: [i16; 2usize],
+    pub u8: [u8; 4usize],
+    pub i8: [i8; 4usize],
+    _bindgen_union_align: u32,
+}
+#[allow(non_snake_case)]
+#[test]
+fn bindgen_test_layout__hb_var_int_t() {
+    assert_eq!(
+        ::std::mem::size_of::<_hb_var_int_t>(),
+        4usize,
+        concat!("Size of: ", stringify!(_hb_var_int_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<_hb_var_int_t>(),
+        4usize,
+        concat!("Alignment of ", stringify!(_hb_var_int_t))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_hb_var_int_t>())).u32 as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_hb_var_int_t),
+            "::",
+            stringify!(u32)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_hb_var_int_t>())).i32 as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_hb_var_int_t),
+            "::",
+            stringify!(i32)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_hb_var_int_t>())).u16 as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_hb_var_int_t),
+            "::",
+            stringify!(u16)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_hb_var_int_t>())).i16 as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_hb_var_int_t),
+            "::",
+            stringify!(i16)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_hb_var_int_t>())).u8 as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_hb_var_int_t),
+            "::",
+            stringify!(u8)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_hb_var_int_t>())).i8 as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_hb_var_int_t),
+            "::",
+            stringify!(i8)
+        )
+    );
+}
+impl ::std::fmt::Debug for _hb_var_int_t {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+        write!(f, "_hb_var_int_t {{ ... }}")
+    }
+}
+pub type hb_var_int_t = _hb_var_int_t;
+pub type hb_tag_t = u32;
+extern "C" {
+    pub fn hb_tag_from_string(
+        str: *const ::std::os::raw::c_char,
+        len: ::std::os::raw::c_int,
+    ) -> hb_tag_t;
+}
+extern "C" {
+    pub fn hb_tag_to_string(tag: hb_tag_t, buf: *mut ::std::os::raw::c_char);
+}
+pub const HB_DIRECTION_INVALID: hb_direction_t = 0;
+pub const HB_DIRECTION_LTR: hb_direction_t = 4;
+pub const HB_DIRECTION_RTL: hb_direction_t = 5;
+pub const HB_DIRECTION_TTB: hb_direction_t = 6;
+pub const HB_DIRECTION_BTT: hb_direction_t = 7;
+/// hb_direction_t:
+/// @HB_DIRECTION_INVALID: Initial, unset direction.
+/// @HB_DIRECTION_LTR: Text is set horizontally from left to right.
+/// @HB_DIRECTION_RTL: Text is set horizontally from right to left.
+/// @HB_DIRECTION_TTB: Text is set vertically from top to bottom.
+/// @HB_DIRECTION_BTT: Text is set vertically from bottom to top.
+pub type hb_direction_t = u32;
+extern "C" {
+    pub fn hb_direction_from_string(
+        str: *const ::std::os::raw::c_char,
+        len: ::std::os::raw::c_int,
+    ) -> hb_direction_t;
+}
+extern "C" {
+    pub fn hb_direction_to_string(direction: hb_direction_t) -> *const ::std::os::raw::c_char;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_language_impl_t {
+    _unused: [u8; 0],
+}
+pub type hb_language_t = *const hb_language_impl_t;
+extern "C" {
+    pub fn hb_language_from_string(
+        str: *const ::std::os::raw::c_char,
+        len: ::std::os::raw::c_int,
+    ) -> hb_language_t;
+}
+extern "C" {
+    pub fn hb_language_to_string(language: hb_language_t) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+    pub fn hb_language_get_default() -> hb_language_t;
+}
+pub const HB_SCRIPT_COMMON: hb_script_t = 1517910393;
+pub const HB_SCRIPT_INHERITED: hb_script_t = 1516858984;
+pub const HB_SCRIPT_UNKNOWN: hb_script_t = 1517976186;
+pub const HB_SCRIPT_ARABIC: hb_script_t = 1098015074;
+pub const HB_SCRIPT_ARMENIAN: hb_script_t = 1098018158;
+pub const HB_SCRIPT_BENGALI: hb_script_t = 1113943655;
+pub const HB_SCRIPT_CYRILLIC: hb_script_t = 1132032620;
+pub const HB_SCRIPT_DEVANAGARI: hb_script_t = 1147500129;
+pub const HB_SCRIPT_GEORGIAN: hb_script_t = 1197830002;
+pub const HB_SCRIPT_GREEK: hb_script_t = 1198679403;
+pub const HB_SCRIPT_GUJARATI: hb_script_t = 1198877298;
+pub const HB_SCRIPT_GURMUKHI: hb_script_t = 1198879349;
+pub const HB_SCRIPT_HANGUL: hb_script_t = 1214344807;
+pub const HB_SCRIPT_HAN: hb_script_t = 1214344809;
+pub const HB_SCRIPT_HEBREW: hb_script_t = 1214603890;
+pub const HB_SCRIPT_HIRAGANA: hb_script_t = 1214870113;
+pub const HB_SCRIPT_KANNADA: hb_script_t = 1265525857;
+pub const HB_SCRIPT_KATAKANA: hb_script_t = 1264676449;
+pub const HB_SCRIPT_LAO: hb_script_t = 1281453935;
+pub const HB_SCRIPT_LATIN: hb_script_t = 1281455214;
+pub const HB_SCRIPT_MALAYALAM: hb_script_t = 1298954605;
+pub const HB_SCRIPT_ORIYA: hb_script_t = 1332902241;
+pub const HB_SCRIPT_TAMIL: hb_script_t = 1415671148;
+pub const HB_SCRIPT_TELUGU: hb_script_t = 1415933045;
+pub const HB_SCRIPT_THAI: hb_script_t = 1416126825;
+pub const HB_SCRIPT_TIBETAN: hb_script_t = 1416192628;
+pub const HB_SCRIPT_BOPOMOFO: hb_script_t = 1114599535;
+pub const HB_SCRIPT_BRAILLE: hb_script_t = 1114792297;
+pub const HB_SCRIPT_CANADIAN_SYLLABICS: hb_script_t = 1130458739;
+pub const HB_SCRIPT_CHEROKEE: hb_script_t = 1130915186;
+pub const HB_SCRIPT_ETHIOPIC: hb_script_t = 1165256809;
+pub const HB_SCRIPT_KHMER: hb_script_t = 1265134962;
+pub const HB_SCRIPT_MONGOLIAN: hb_script_t = 1299148391;
+pub const HB_SCRIPT_MYANMAR: hb_script_t = 1299803506;
+pub const HB_SCRIPT_OGHAM: hb_script_t = 1332175213;
+pub const HB_SCRIPT_RUNIC: hb_script_t = 1383427698;
+pub const HB_SCRIPT_SINHALA: hb_script_t = 1399418472;
+pub const HB_SCRIPT_SYRIAC: hb_script_t = 1400468067;
+pub const HB_SCRIPT_THAANA: hb_script_t = 1416126817;
+pub const HB_SCRIPT_YI: hb_script_t = 1500080489;
+pub const HB_SCRIPT_DESERET: hb_script_t = 1148416628;
+pub const HB_SCRIPT_GOTHIC: hb_script_t = 1198486632;
+pub const HB_SCRIPT_OLD_ITALIC: hb_script_t = 1232363884;
+pub const HB_SCRIPT_BUHID: hb_script_t = 1114990692;
+pub const HB_SCRIPT_HANUNOO: hb_script_t = 1214344815;
+pub const HB_SCRIPT_TAGALOG: hb_script_t = 1416064103;
+pub const HB_SCRIPT_TAGBANWA: hb_script_t = 1415669602;
+pub const HB_SCRIPT_CYPRIOT: hb_script_t = 1131442804;
+pub const HB_SCRIPT_LIMBU: hb_script_t = 1281977698;
+pub const HB_SCRIPT_LINEAR_B: hb_script_t = 1281977954;
+pub const HB_SCRIPT_OSMANYA: hb_script_t = 1332964705;
+pub const HB_SCRIPT_SHAVIAN: hb_script_t = 1399349623;
+pub const HB_SCRIPT_TAI_LE: hb_script_t = 1415670885;
+pub const HB_SCRIPT_UGARITIC: hb_script_t = 1432838514;
+pub const HB_SCRIPT_BUGINESE: hb_script_t = 1114990441;
+pub const HB_SCRIPT_COPTIC: hb_script_t = 1131376756;
+pub const HB_SCRIPT_GLAGOLITIC: hb_script_t = 1198285159;
+pub const HB_SCRIPT_KHAROSHTHI: hb_script_t = 1265131890;
+pub const HB_SCRIPT_NEW_TAI_LUE: hb_script_t = 1415670901;
+pub const HB_SCRIPT_OLD_PERSIAN: hb_script_t = 1483761007;
+pub const HB_SCRIPT_SYLOTI_NAGRI: hb_script_t = 1400466543;
+pub const HB_SCRIPT_TIFINAGH: hb_script_t = 1415999079;
+pub const HB_SCRIPT_BALINESE: hb_script_t = 1113681001;
+pub const HB_SCRIPT_CUNEIFORM: hb_script_t = 1483961720;
+pub const HB_SCRIPT_NKO: hb_script_t = 1315663727;
+pub const HB_SCRIPT_PHAGS_PA: hb_script_t = 1349017959;
+pub const HB_SCRIPT_PHOENICIAN: hb_script_t = 1349021304;
+pub const HB_SCRIPT_CARIAN: hb_script_t = 1130459753;
+pub const HB_SCRIPT_CHAM: hb_script_t = 1130914157;
+pub const HB_SCRIPT_KAYAH_LI: hb_script_t = 1264675945;
+pub const HB_SCRIPT_LEPCHA: hb_script_t = 1281716323;
+pub const HB_SCRIPT_LYCIAN: hb_script_t = 1283023721;
+pub const HB_SCRIPT_LYDIAN: hb_script_t = 1283023977;
+pub const HB_SCRIPT_OL_CHIKI: hb_script_t = 1332503403;
+pub const HB_SCRIPT_REJANG: hb_script_t = 1382706791;
+pub const HB_SCRIPT_SAURASHTRA: hb_script_t = 1398895986;
+pub const HB_SCRIPT_SUNDANESE: hb_script_t = 1400204900;
+pub const HB_SCRIPT_VAI: hb_script_t = 1449224553;
+pub const HB_SCRIPT_AVESTAN: hb_script_t = 1098281844;
+pub const HB_SCRIPT_BAMUM: hb_script_t = 1113681269;
+pub const HB_SCRIPT_EGYPTIAN_HIEROGLYPHS: hb_script_t = 1164409200;
+pub const HB_SCRIPT_IMPERIAL_ARAMAIC: hb_script_t = 1098018153;
+pub const HB_SCRIPT_INSCRIPTIONAL_PAHLAVI: hb_script_t = 1349020777;
+pub const HB_SCRIPT_INSCRIPTIONAL_PARTHIAN: hb_script_t = 1349678185;
+pub const HB_SCRIPT_JAVANESE: hb_script_t = 1247901281;
+pub const HB_SCRIPT_KAITHI: hb_script_t = 1265920105;
+pub const HB_SCRIPT_LISU: hb_script_t = 1281979253;
+pub const HB_SCRIPT_MEETEI_MAYEK: hb_script_t = 1299473769;
+pub const HB_SCRIPT_OLD_SOUTH_ARABIAN: hb_script_t = 1398895202;
+pub const HB_SCRIPT_OLD_TURKIC: hb_script_t = 1332898664;
+pub const HB_SCRIPT_SAMARITAN: hb_script_t = 1398893938;
+pub const HB_SCRIPT_TAI_THAM: hb_script_t = 1281453665;
+pub const HB_SCRIPT_TAI_VIET: hb_script_t = 1415673460;
+pub const HB_SCRIPT_BATAK: hb_script_t = 1113683051;
+pub const HB_SCRIPT_BRAHMI: hb_script_t = 1114792296;
+pub const HB_SCRIPT_MANDAIC: hb_script_t = 1298230884;
+pub const HB_SCRIPT_CHAKMA: hb_script_t = 1130457965;
+pub const HB_SCRIPT_MEROITIC_CURSIVE: hb_script_t = 1298494051;
+pub const HB_SCRIPT_MEROITIC_HIEROGLYPHS: hb_script_t = 1298494063;
+pub const HB_SCRIPT_MIAO: hb_script_t = 1349284452;
+pub const HB_SCRIPT_SHARADA: hb_script_t = 1399353956;
+pub const HB_SCRIPT_SORA_SOMPENG: hb_script_t = 1399812705;
+pub const HB_SCRIPT_TAKRI: hb_script_t = 1415670642;
+pub const HB_SCRIPT_BASSA_VAH: hb_script_t = 1113682803;
+pub const HB_SCRIPT_CAUCASIAN_ALBANIAN: hb_script_t = 1097295970;
+pub const HB_SCRIPT_DUPLOYAN: hb_script_t = 1148547180;
+pub const HB_SCRIPT_ELBASAN: hb_script_t = 1164730977;
+pub const HB_SCRIPT_GRANTHA: hb_script_t = 1198678382;
+pub const HB_SCRIPT_KHOJKI: hb_script_t = 1265135466;
+pub const HB_SCRIPT_KHUDAWADI: hb_script_t = 1399418468;
+pub const HB_SCRIPT_LINEAR_A: hb_script_t = 1281977953;
+pub const HB_SCRIPT_MAHAJANI: hb_script_t = 1298229354;
+pub const HB_SCRIPT_MANICHAEAN: hb_script_t = 1298230889;
+pub const HB_SCRIPT_MENDE_KIKAKUI: hb_script_t = 1298493028;
+pub const HB_SCRIPT_MODI: hb_script_t = 1299145833;
+pub const HB_SCRIPT_MRO: hb_script_t = 1299345263;
+pub const HB_SCRIPT_NABATAEAN: hb_script_t = 1315070324;
+pub const HB_SCRIPT_OLD_NORTH_ARABIAN: hb_script_t = 1315009122;
+pub const HB_SCRIPT_OLD_PERMIC: hb_script_t = 1348825709;
+pub const HB_SCRIPT_PAHAWH_HMONG: hb_script_t = 1215131239;
+pub const HB_SCRIPT_PALMYRENE: hb_script_t = 1348562029;
+pub const HB_SCRIPT_PAU_CIN_HAU: hb_script_t = 1348564323;
+pub const HB_SCRIPT_PSALTER_PAHLAVI: hb_script_t = 1349020784;
+pub const HB_SCRIPT_SIDDHAM: hb_script_t = 1399415908;
+pub const HB_SCRIPT_TIRHUTA: hb_script_t = 1416196712;
+pub const HB_SCRIPT_WARANG_CITI: hb_script_t = 1466004065;
+pub const HB_SCRIPT_AHOM: hb_script_t = 1097363309;
+pub const HB_SCRIPT_ANATOLIAN_HIEROGLYPHS: hb_script_t = 1215067511;
+pub const HB_SCRIPT_HATRAN: hb_script_t = 1214346354;
+pub const HB_SCRIPT_MULTANI: hb_script_t = 1299541108;
+pub const HB_SCRIPT_OLD_HUNGARIAN: hb_script_t = 1215655527;
+pub const HB_SCRIPT_SIGNWRITING: hb_script_t = 1399287415;
+pub const HB_SCRIPT_ADLAM: hb_script_t = 1097100397;
+pub const HB_SCRIPT_BHAIKSUKI: hb_script_t = 1114139507;
+pub const HB_SCRIPT_MARCHEN: hb_script_t = 1298231907;
+pub const HB_SCRIPT_OSAGE: hb_script_t = 1332963173;
+pub const HB_SCRIPT_TANGUT: hb_script_t = 1415671399;
+pub const HB_SCRIPT_NEWA: hb_script_t = 1315272545;
+pub const HB_SCRIPT_MASARAM_GONDI: hb_script_t = 1198485101;
+pub const HB_SCRIPT_NUSHU: hb_script_t = 1316186229;
+pub const HB_SCRIPT_SOYOMBO: hb_script_t = 1399814511;
+pub const HB_SCRIPT_ZANABAZAR_SQUARE: hb_script_t = 1516334690;
+pub const HB_SCRIPT_DOGRA: hb_script_t = 1148151666;
+pub const HB_SCRIPT_GUNJALA_GONDI: hb_script_t = 1198485095;
+pub const HB_SCRIPT_HANIFI_ROHINGYA: hb_script_t = 1383032935;
+pub const HB_SCRIPT_MAKASAR: hb_script_t = 1298230113;
+pub const HB_SCRIPT_MEDEFAIDRIN: hb_script_t = 1298490470;
+pub const HB_SCRIPT_OLD_SOGDIAN: hb_script_t = 1399809903;
+pub const HB_SCRIPT_SOGDIAN: hb_script_t = 1399809892;
+pub const HB_SCRIPT_INVALID: hb_script_t = 0;
+pub const _HB_SCRIPT_MAX_VALUE: hb_script_t = 2147483647;
+pub const _HB_SCRIPT_MAX_VALUE_SIGNED: hb_script_t = 2147483647;
+pub type hb_script_t = u32;
+extern "C" {
+    pub fn hb_script_from_iso15924_tag(tag: hb_tag_t) -> hb_script_t;
+}
+extern "C" {
+    pub fn hb_script_from_string(
+        str: *const ::std::os::raw::c_char,
+        len: ::std::os::raw::c_int,
+    ) -> hb_script_t;
+}
+extern "C" {
+    pub fn hb_script_to_iso15924_tag(script: hb_script_t) -> hb_tag_t;
+}
+extern "C" {
+    pub fn hb_script_get_horizontal_direction(script: hb_script_t) -> hb_direction_t;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_user_data_key_t {
+    pub unused: ::std::os::raw::c_char,
+}
+#[test]
+fn bindgen_test_layout_hb_user_data_key_t() {
+    assert_eq!(
+        ::std::mem::size_of::<hb_user_data_key_t>(),
+        1usize,
+        concat!("Size of: ", stringify!(hb_user_data_key_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<hb_user_data_key_t>(),
+        1usize,
+        concat!("Alignment of ", stringify!(hb_user_data_key_t))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_user_data_key_t>())).unused as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_user_data_key_t),
+            "::",
+            stringify!(unused)
+        )
+    );
+}
+pub type hb_destroy_func_t =
+    ::std::option::Option<unsafe extern "C" fn(user_data: *mut ::std::os::raw::c_void)>;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_feature_t {
+    pub tag: hb_tag_t,
+    pub value: u32,
+    pub start: ::std::os::raw::c_uint,
+    pub end: ::std::os::raw::c_uint,
+}
+#[test]
+fn bindgen_test_layout_hb_feature_t() {
+    assert_eq!(
+        ::std::mem::size_of::<hb_feature_t>(),
+        16usize,
+        concat!("Size of: ", stringify!(hb_feature_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<hb_feature_t>(),
+        4usize,
+        concat!("Alignment of ", stringify!(hb_feature_t))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_feature_t>())).tag as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_feature_t),
+            "::",
+            stringify!(tag)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_feature_t>())).value as *const _ as usize },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_feature_t),
+            "::",
+            stringify!(value)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_feature_t>())).start as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_feature_t),
+            "::",
+            stringify!(start)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_feature_t>())).end as *const _ as usize },
+        12usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_feature_t),
+            "::",
+            stringify!(end)
+        )
+    );
+}
+extern "C" {
+    pub fn hb_feature_from_string(
+        str: *const ::std::os::raw::c_char,
+        len: ::std::os::raw::c_int,
+        feature: *mut hb_feature_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_feature_to_string(
+        feature: *mut hb_feature_t,
+        buf: *mut ::std::os::raw::c_char,
+        size: ::std::os::raw::c_uint,
+    );
+}
+/// hb_variation_t:
+///
+/// Since: 1.4.2
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_variation_t {
+    pub tag: hb_tag_t,
+    pub value: f32,
+}
+#[test]
+fn bindgen_test_layout_hb_variation_t() {
+    assert_eq!(
+        ::std::mem::size_of::<hb_variation_t>(),
+        8usize,
+        concat!("Size of: ", stringify!(hb_variation_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<hb_variation_t>(),
+        4usize,
+        concat!("Alignment of ", stringify!(hb_variation_t))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_variation_t>())).tag as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_variation_t),
+            "::",
+            stringify!(tag)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_variation_t>())).value as *const _ as usize },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_variation_t),
+            "::",
+            stringify!(value)
+        )
+    );
+}
+extern "C" {
+    pub fn hb_variation_from_string(
+        str: *const ::std::os::raw::c_char,
+        len: ::std::os::raw::c_int,
+        variation: *mut hb_variation_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_variation_to_string(
+        variation: *mut hb_variation_t,
+        buf: *mut ::std::os::raw::c_char,
+        size: ::std::os::raw::c_uint,
+    );
+}
+/// hb_color_t:
+///
+/// Data type for holding color values.
+///
+/// Since: 2.1.0
+pub type hb_color_t = u32;
+pub const HB_MEMORY_MODE_DUPLICATE: hb_memory_mode_t = 0;
+pub const HB_MEMORY_MODE_READONLY: hb_memory_mode_t = 1;
+pub const HB_MEMORY_MODE_WRITABLE: hb_memory_mode_t = 2;
+pub const HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE: hb_memory_mode_t = 3;
+pub type hb_memory_mode_t = u32;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_blob_t {
+    _unused: [u8; 0],
+}
+extern "C" {
+    pub fn hb_blob_create(
+        data: *const ::std::os::raw::c_char,
+        length: ::std::os::raw::c_uint,
+        mode: hb_memory_mode_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    ) -> *mut hb_blob_t;
+}
+extern "C" {
+    pub fn hb_blob_create_sub_blob(
+        parent: *mut hb_blob_t,
+        offset: ::std::os::raw::c_uint,
+        length: ::std::os::raw::c_uint,
+    ) -> *mut hb_blob_t;
+}
+extern "C" {
+    pub fn hb_blob_copy_writable_or_fail(blob: *mut hb_blob_t) -> *mut hb_blob_t;
+}
+extern "C" {
+    pub fn hb_blob_get_empty() -> *mut hb_blob_t;
+}
+extern "C" {
+    pub fn hb_blob_reference(blob: *mut hb_blob_t) -> *mut hb_blob_t;
+}
+extern "C" {
+    pub fn hb_blob_destroy(blob: *mut hb_blob_t);
+}
+extern "C" {
+    pub fn hb_blob_set_user_data(
+        blob: *mut hb_blob_t,
+        key: *mut hb_user_data_key_t,
+        data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+        replace: hb_bool_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_blob_get_user_data(
+        blob: *mut hb_blob_t,
+        key: *mut hb_user_data_key_t,
+    ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+    pub fn hb_blob_make_immutable(blob: *mut hb_blob_t);
+}
+extern "C" {
+    pub fn hb_blob_is_immutable(blob: *mut hb_blob_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_blob_get_length(blob: *mut hb_blob_t) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_blob_get_data(
+        blob: *mut hb_blob_t,
+        length: *mut ::std::os::raw::c_uint,
+    ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+    pub fn hb_blob_get_data_writable(
+        blob: *mut hb_blob_t,
+        length: *mut ::std::os::raw::c_uint,
+    ) -> *mut ::std::os::raw::c_char;
+}
+extern "C" {
+    pub fn hb_blob_create_from_file(file_name: *const ::std::os::raw::c_char) -> *mut hb_blob_t;
+}
+pub const HB_UNICODE_GENERAL_CATEGORY_CONTROL: hb_unicode_general_category_t = 0;
+pub const HB_UNICODE_GENERAL_CATEGORY_FORMAT: hb_unicode_general_category_t = 1;
+pub const HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED: hb_unicode_general_category_t = 2;
+pub const HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE: hb_unicode_general_category_t = 3;
+pub const HB_UNICODE_GENERAL_CATEGORY_SURROGATE: hb_unicode_general_category_t = 4;
+pub const HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER: hb_unicode_general_category_t = 5;
+pub const HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER: hb_unicode_general_category_t = 6;
+pub const HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER: hb_unicode_general_category_t = 7;
+pub const HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER: hb_unicode_general_category_t = 8;
+pub const HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER: hb_unicode_general_category_t = 9;
+pub const HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK: hb_unicode_general_category_t = 10;
+pub const HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK: hb_unicode_general_category_t = 11;
+pub const HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK: hb_unicode_general_category_t = 12;
+pub const HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER: hb_unicode_general_category_t = 13;
+pub const HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER: hb_unicode_general_category_t = 14;
+pub const HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER: hb_unicode_general_category_t = 15;
+pub const HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION: hb_unicode_general_category_t = 16;
+pub const HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION: hb_unicode_general_category_t = 17;
+pub const HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION: hb_unicode_general_category_t = 18;
+pub const HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION: hb_unicode_general_category_t = 19;
+pub const HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION: hb_unicode_general_category_t = 20;
+pub const HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION: hb_unicode_general_category_t = 21;
+pub const HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION: hb_unicode_general_category_t = 22;
+pub const HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL: hb_unicode_general_category_t = 23;
+pub const HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL: hb_unicode_general_category_t = 24;
+pub const HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL: hb_unicode_general_category_t = 25;
+pub const HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL: hb_unicode_general_category_t = 26;
+pub const HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR: hb_unicode_general_category_t = 27;
+pub const HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR: hb_unicode_general_category_t = 28;
+pub const HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR: hb_unicode_general_category_t = 29;
+pub type hb_unicode_general_category_t = u32;
+pub const HB_UNICODE_COMBINING_CLASS_NOT_REORDERED: hb_unicode_combining_class_t = 0;
+pub const HB_UNICODE_COMBINING_CLASS_OVERLAY: hb_unicode_combining_class_t = 1;
+pub const HB_UNICODE_COMBINING_CLASS_NUKTA: hb_unicode_combining_class_t = 7;
+pub const HB_UNICODE_COMBINING_CLASS_KANA_VOICING: hb_unicode_combining_class_t = 8;
+pub const HB_UNICODE_COMBINING_CLASS_VIRAMA: hb_unicode_combining_class_t = 9;
+pub const HB_UNICODE_COMBINING_CLASS_CCC10: hb_unicode_combining_class_t = 10;
+pub const HB_UNICODE_COMBINING_CLASS_CCC11: hb_unicode_combining_class_t = 11;
+pub const HB_UNICODE_COMBINING_CLASS_CCC12: hb_unicode_combining_class_t = 12;
+pub const HB_UNICODE_COMBINING_CLASS_CCC13: hb_unicode_combining_class_t = 13;
+pub const HB_UNICODE_COMBINING_CLASS_CCC14: hb_unicode_combining_class_t = 14;
+pub const HB_UNICODE_COMBINING_CLASS_CCC15: hb_unicode_combining_class_t = 15;
+pub const HB_UNICODE_COMBINING_CLASS_CCC16: hb_unicode_combining_class_t = 16;
+pub const HB_UNICODE_COMBINING_CLASS_CCC17: hb_unicode_combining_class_t = 17;
+pub const HB_UNICODE_COMBINING_CLASS_CCC18: hb_unicode_combining_class_t = 18;
+pub const HB_UNICODE_COMBINING_CLASS_CCC19: hb_unicode_combining_class_t = 19;
+pub const HB_UNICODE_COMBINING_CLASS_CCC20: hb_unicode_combining_class_t = 20;
+pub const HB_UNICODE_COMBINING_CLASS_CCC21: hb_unicode_combining_class_t = 21;
+pub const HB_UNICODE_COMBINING_CLASS_CCC22: hb_unicode_combining_class_t = 22;
+pub const HB_UNICODE_COMBINING_CLASS_CCC23: hb_unicode_combining_class_t = 23;
+pub const HB_UNICODE_COMBINING_CLASS_CCC24: hb_unicode_combining_class_t = 24;
+pub const HB_UNICODE_COMBINING_CLASS_CCC25: hb_unicode_combining_class_t = 25;
+pub const HB_UNICODE_COMBINING_CLASS_CCC26: hb_unicode_combining_class_t = 26;
+pub const HB_UNICODE_COMBINING_CLASS_CCC27: hb_unicode_combining_class_t = 27;
+pub const HB_UNICODE_COMBINING_CLASS_CCC28: hb_unicode_combining_class_t = 28;
+pub const HB_UNICODE_COMBINING_CLASS_CCC29: hb_unicode_combining_class_t = 29;
+pub const HB_UNICODE_COMBINING_CLASS_CCC30: hb_unicode_combining_class_t = 30;
+pub const HB_UNICODE_COMBINING_CLASS_CCC31: hb_unicode_combining_class_t = 31;
+pub const HB_UNICODE_COMBINING_CLASS_CCC32: hb_unicode_combining_class_t = 32;
+pub const HB_UNICODE_COMBINING_CLASS_CCC33: hb_unicode_combining_class_t = 33;
+pub const HB_UNICODE_COMBINING_CLASS_CCC34: hb_unicode_combining_class_t = 34;
+pub const HB_UNICODE_COMBINING_CLASS_CCC35: hb_unicode_combining_class_t = 35;
+pub const HB_UNICODE_COMBINING_CLASS_CCC36: hb_unicode_combining_class_t = 36;
+pub const HB_UNICODE_COMBINING_CLASS_CCC84: hb_unicode_combining_class_t = 84;
+pub const HB_UNICODE_COMBINING_CLASS_CCC91: hb_unicode_combining_class_t = 91;
+pub const HB_UNICODE_COMBINING_CLASS_CCC103: hb_unicode_combining_class_t = 103;
+pub const HB_UNICODE_COMBINING_CLASS_CCC107: hb_unicode_combining_class_t = 107;
+pub const HB_UNICODE_COMBINING_CLASS_CCC118: hb_unicode_combining_class_t = 118;
+pub const HB_UNICODE_COMBINING_CLASS_CCC122: hb_unicode_combining_class_t = 122;
+pub const HB_UNICODE_COMBINING_CLASS_CCC129: hb_unicode_combining_class_t = 129;
+pub const HB_UNICODE_COMBINING_CLASS_CCC130: hb_unicode_combining_class_t = 130;
+pub const HB_UNICODE_COMBINING_CLASS_CCC133: hb_unicode_combining_class_t = 132;
+pub const HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT: hb_unicode_combining_class_t = 200;
+pub const HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW: hb_unicode_combining_class_t = 202;
+pub const HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE: hb_unicode_combining_class_t = 214;
+pub const HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT: hb_unicode_combining_class_t = 216;
+pub const HB_UNICODE_COMBINING_CLASS_BELOW_LEFT: hb_unicode_combining_class_t = 218;
+pub const HB_UNICODE_COMBINING_CLASS_BELOW: hb_unicode_combining_class_t = 220;
+pub const HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT: hb_unicode_combining_class_t = 222;
+pub const HB_UNICODE_COMBINING_CLASS_LEFT: hb_unicode_combining_class_t = 224;
+pub const HB_UNICODE_COMBINING_CLASS_RIGHT: hb_unicode_combining_class_t = 226;
+pub const HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT: hb_unicode_combining_class_t = 228;
+pub const HB_UNICODE_COMBINING_CLASS_ABOVE: hb_unicode_combining_class_t = 230;
+pub const HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT: hb_unicode_combining_class_t = 232;
+pub const HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW: hb_unicode_combining_class_t = 233;
+pub const HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE: hb_unicode_combining_class_t = 234;
+pub const HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT: hb_unicode_combining_class_t = 240;
+pub const HB_UNICODE_COMBINING_CLASS_INVALID: hb_unicode_combining_class_t = 255;
+pub type hb_unicode_combining_class_t = u32;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_unicode_funcs_t {
+    _unused: [u8; 0],
+}
+extern "C" {
+    pub fn hb_unicode_funcs_get_default() -> *mut hb_unicode_funcs_t;
+}
+extern "C" {
+    pub fn hb_unicode_funcs_create(parent: *mut hb_unicode_funcs_t) -> *mut hb_unicode_funcs_t;
+}
+extern "C" {
+    pub fn hb_unicode_funcs_get_empty() -> *mut hb_unicode_funcs_t;
+}
+extern "C" {
+    pub fn hb_unicode_funcs_reference(ufuncs: *mut hb_unicode_funcs_t) -> *mut hb_unicode_funcs_t;
+}
+extern "C" {
+    pub fn hb_unicode_funcs_destroy(ufuncs: *mut hb_unicode_funcs_t);
+}
+extern "C" {
+    pub fn hb_unicode_funcs_set_user_data(
+        ufuncs: *mut hb_unicode_funcs_t,
+        key: *mut hb_user_data_key_t,
+        data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+        replace: hb_bool_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_unicode_funcs_get_user_data(
+        ufuncs: *mut hb_unicode_funcs_t,
+        key: *mut hb_user_data_key_t,
+    ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+    pub fn hb_unicode_funcs_make_immutable(ufuncs: *mut hb_unicode_funcs_t);
+}
+extern "C" {
+    pub fn hb_unicode_funcs_is_immutable(ufuncs: *mut hb_unicode_funcs_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_unicode_funcs_get_parent(ufuncs: *mut hb_unicode_funcs_t) -> *mut hb_unicode_funcs_t;
+}
+pub type hb_unicode_combining_class_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        ufuncs: *mut hb_unicode_funcs_t,
+        unicode: hb_codepoint_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_unicode_combining_class_t,
+>;
+pub type hb_unicode_general_category_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        ufuncs: *mut hb_unicode_funcs_t,
+        unicode: hb_codepoint_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_unicode_general_category_t,
+>;
+pub type hb_unicode_mirroring_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        ufuncs: *mut hb_unicode_funcs_t,
+        unicode: hb_codepoint_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_codepoint_t,
+>;
+pub type hb_unicode_script_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        ufuncs: *mut hb_unicode_funcs_t,
+        unicode: hb_codepoint_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_script_t,
+>;
+pub type hb_unicode_compose_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        ufuncs: *mut hb_unicode_funcs_t,
+        a: hb_codepoint_t,
+        b: hb_codepoint_t,
+        ab: *mut hb_codepoint_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_bool_t,
+>;
+pub type hb_unicode_decompose_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        ufuncs: *mut hb_unicode_funcs_t,
+        ab: hb_codepoint_t,
+        a: *mut hb_codepoint_t,
+        b: *mut hb_codepoint_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_bool_t,
+>;
+extern "C" {
+    /// hb_unicode_funcs_set_combining_class_func:
+    /// @ufuncs: a Unicode function structure
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 0.9.2
+    pub fn hb_unicode_funcs_set_combining_class_func(
+        ufuncs: *mut hb_unicode_funcs_t,
+        func: hb_unicode_combining_class_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_unicode_funcs_set_general_category_func:
+    /// @ufuncs: a Unicode function structure
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 0.9.2
+    pub fn hb_unicode_funcs_set_general_category_func(
+        ufuncs: *mut hb_unicode_funcs_t,
+        func: hb_unicode_general_category_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_unicode_funcs_set_mirroring_func:
+    /// @ufuncs: a Unicode function structure
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 0.9.2
+    pub fn hb_unicode_funcs_set_mirroring_func(
+        ufuncs: *mut hb_unicode_funcs_t,
+        func: hb_unicode_mirroring_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_unicode_funcs_set_script_func:
+    /// @ufuncs: a Unicode function structure
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 0.9.2
+    pub fn hb_unicode_funcs_set_script_func(
+        ufuncs: *mut hb_unicode_funcs_t,
+        func: hb_unicode_script_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_unicode_funcs_set_compose_func:
+    /// @ufuncs: a Unicode function structure
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 0.9.2
+    pub fn hb_unicode_funcs_set_compose_func(
+        ufuncs: *mut hb_unicode_funcs_t,
+        func: hb_unicode_compose_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_unicode_funcs_set_decompose_func:
+    /// @ufuncs: a Unicode function structure
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 0.9.2
+    pub fn hb_unicode_funcs_set_decompose_func(
+        ufuncs: *mut hb_unicode_funcs_t,
+        func: hb_unicode_decompose_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_unicode_combining_class:
+    ///
+    /// Since: 0.9.2
+    pub fn hb_unicode_combining_class(
+        ufuncs: *mut hb_unicode_funcs_t,
+        unicode: hb_codepoint_t,
+    ) -> hb_unicode_combining_class_t;
+}
+extern "C" {
+    /// hb_unicode_general_category:
+    ///
+    /// Since: 0.9.2
+    pub fn hb_unicode_general_category(
+        ufuncs: *mut hb_unicode_funcs_t,
+        unicode: hb_codepoint_t,
+    ) -> hb_unicode_general_category_t;
+}
+extern "C" {
+    /// hb_unicode_mirroring:
+    ///
+    /// Since: 0.9.2
+    pub fn hb_unicode_mirroring(
+        ufuncs: *mut hb_unicode_funcs_t,
+        unicode: hb_codepoint_t,
+    ) -> hb_codepoint_t;
+}
+extern "C" {
+    /// hb_unicode_script:
+    ///
+    /// Since: 0.9.2
+    pub fn hb_unicode_script(
+        ufuncs: *mut hb_unicode_funcs_t,
+        unicode: hb_codepoint_t,
+    ) -> hb_script_t;
+}
+extern "C" {
+    pub fn hb_unicode_compose(
+        ufuncs: *mut hb_unicode_funcs_t,
+        a: hb_codepoint_t,
+        b: hb_codepoint_t,
+        ab: *mut hb_codepoint_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_unicode_decompose(
+        ufuncs: *mut hb_unicode_funcs_t,
+        ab: hb_codepoint_t,
+        a: *mut hb_codepoint_t,
+        b: *mut hb_codepoint_t,
+    ) -> hb_bool_t;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_set_t {
+    _unused: [u8; 0],
+}
+extern "C" {
+    pub fn hb_set_create() -> *mut hb_set_t;
+}
+extern "C" {
+    pub fn hb_set_get_empty() -> *mut hb_set_t;
+}
+extern "C" {
+    pub fn hb_set_reference(set: *mut hb_set_t) -> *mut hb_set_t;
+}
+extern "C" {
+    pub fn hb_set_destroy(set: *mut hb_set_t);
+}
+extern "C" {
+    pub fn hb_set_set_user_data(
+        set: *mut hb_set_t,
+        key: *mut hb_user_data_key_t,
+        data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+        replace: hb_bool_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_set_get_user_data(
+        set: *mut hb_set_t,
+        key: *mut hb_user_data_key_t,
+    ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+    pub fn hb_set_allocation_successful(set: *const hb_set_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_set_clear(set: *mut hb_set_t);
+}
+extern "C" {
+    pub fn hb_set_is_empty(set: *const hb_set_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_set_has(set: *const hb_set_t, codepoint: hb_codepoint_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_set_add(set: *mut hb_set_t, codepoint: hb_codepoint_t);
+}
+extern "C" {
+    pub fn hb_set_add_range(set: *mut hb_set_t, first: hb_codepoint_t, last: hb_codepoint_t);
+}
+extern "C" {
+    pub fn hb_set_del(set: *mut hb_set_t, codepoint: hb_codepoint_t);
+}
+extern "C" {
+    pub fn hb_set_del_range(set: *mut hb_set_t, first: hb_codepoint_t, last: hb_codepoint_t);
+}
+extern "C" {
+    pub fn hb_set_is_equal(set: *const hb_set_t, other: *const hb_set_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_set_is_subset(set: *const hb_set_t, larger_set: *const hb_set_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_set_set(set: *mut hb_set_t, other: *const hb_set_t);
+}
+extern "C" {
+    pub fn hb_set_union(set: *mut hb_set_t, other: *const hb_set_t);
+}
+extern "C" {
+    pub fn hb_set_intersect(set: *mut hb_set_t, other: *const hb_set_t);
+}
+extern "C" {
+    pub fn hb_set_subtract(set: *mut hb_set_t, other: *const hb_set_t);
+}
+extern "C" {
+    pub fn hb_set_symmetric_difference(set: *mut hb_set_t, other: *const hb_set_t);
+}
+extern "C" {
+    pub fn hb_set_get_population(set: *const hb_set_t) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_set_get_min(set: *const hb_set_t) -> hb_codepoint_t;
+}
+extern "C" {
+    pub fn hb_set_get_max(set: *const hb_set_t) -> hb_codepoint_t;
+}
+extern "C" {
+    pub fn hb_set_next(set: *const hb_set_t, codepoint: *mut hb_codepoint_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_set_previous(set: *const hb_set_t, codepoint: *mut hb_codepoint_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_set_next_range(
+        set: *const hb_set_t,
+        first: *mut hb_codepoint_t,
+        last: *mut hb_codepoint_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_set_previous_range(
+        set: *const hb_set_t,
+        first: *mut hb_codepoint_t,
+        last: *mut hb_codepoint_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_face_count(blob: *mut hb_blob_t) -> ::std::os::raw::c_uint;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_face_t {
+    _unused: [u8; 0],
+}
+extern "C" {
+    pub fn hb_face_create(blob: *mut hb_blob_t, index: ::std::os::raw::c_uint) -> *mut hb_face_t;
+}
+pub type hb_reference_table_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        face: *mut hb_face_t,
+        tag: hb_tag_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> *mut hb_blob_t,
+>;
+extern "C" {
+    pub fn hb_face_create_for_tables(
+        reference_table_func: hb_reference_table_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    ) -> *mut hb_face_t;
+}
+extern "C" {
+    pub fn hb_face_get_empty() -> *mut hb_face_t;
+}
+extern "C" {
+    pub fn hb_face_reference(face: *mut hb_face_t) -> *mut hb_face_t;
+}
+extern "C" {
+    pub fn hb_face_destroy(face: *mut hb_face_t);
+}
+extern "C" {
+    pub fn hb_face_set_user_data(
+        face: *mut hb_face_t,
+        key: *mut hb_user_data_key_t,
+        data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+        replace: hb_bool_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_face_get_user_data(
+        face: *const hb_face_t,
+        key: *mut hb_user_data_key_t,
+    ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+    pub fn hb_face_make_immutable(face: *mut hb_face_t);
+}
+extern "C" {
+    pub fn hb_face_is_immutable(face: *const hb_face_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_face_reference_table(face: *const hb_face_t, tag: hb_tag_t) -> *mut hb_blob_t;
+}
+extern "C" {
+    pub fn hb_face_reference_blob(face: *mut hb_face_t) -> *mut hb_blob_t;
+}
+extern "C" {
+    pub fn hb_face_set_index(face: *mut hb_face_t, index: ::std::os::raw::c_uint);
+}
+extern "C" {
+    pub fn hb_face_get_index(face: *const hb_face_t) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_face_set_upem(face: *mut hb_face_t, upem: ::std::os::raw::c_uint);
+}
+extern "C" {
+    pub fn hb_face_get_upem(face: *const hb_face_t) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_face_set_glyph_count(face: *mut hb_face_t, glyph_count: ::std::os::raw::c_uint);
+}
+extern "C" {
+    pub fn hb_face_get_glyph_count(face: *const hb_face_t) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_face_get_table_tags(
+        face: *const hb_face_t,
+        start_offset: ::std::os::raw::c_uint,
+        table_count: *mut ::std::os::raw::c_uint,
+        table_tags: *mut hb_tag_t,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_face_collect_unicodes(face: *mut hb_face_t, out: *mut hb_set_t);
+}
+extern "C" {
+    pub fn hb_face_collect_variation_selectors(face: *mut hb_face_t, out: *mut hb_set_t);
+}
+extern "C" {
+    pub fn hb_face_collect_variation_unicodes(
+        face: *mut hb_face_t,
+        variation_selector: hb_codepoint_t,
+        out: *mut hb_set_t,
+    );
+}
+extern "C" {
+    pub fn hb_face_builder_create() -> *mut hb_face_t;
+}
+extern "C" {
+    pub fn hb_face_builder_add_table(
+        face: *mut hb_face_t,
+        tag: hb_tag_t,
+        blob: *mut hb_blob_t,
+    ) -> hb_bool_t;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_font_t {
+    _unused: [u8; 0],
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_font_funcs_t {
+    _unused: [u8; 0],
+}
+extern "C" {
+    pub fn hb_font_funcs_create() -> *mut hb_font_funcs_t;
+}
+extern "C" {
+    pub fn hb_font_funcs_get_empty() -> *mut hb_font_funcs_t;
+}
+extern "C" {
+    pub fn hb_font_funcs_reference(ffuncs: *mut hb_font_funcs_t) -> *mut hb_font_funcs_t;
+}
+extern "C" {
+    pub fn hb_font_funcs_destroy(ffuncs: *mut hb_font_funcs_t);
+}
+extern "C" {
+    pub fn hb_font_funcs_set_user_data(
+        ffuncs: *mut hb_font_funcs_t,
+        key: *mut hb_user_data_key_t,
+        data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+        replace: hb_bool_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_funcs_get_user_data(
+        ffuncs: *mut hb_font_funcs_t,
+        key: *mut hb_user_data_key_t,
+    ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+    pub fn hb_font_funcs_make_immutable(ffuncs: *mut hb_font_funcs_t);
+}
+extern "C" {
+    pub fn hb_font_funcs_is_immutable(ffuncs: *mut hb_font_funcs_t) -> hb_bool_t;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_font_extents_t {
+    pub ascender: hb_position_t,
+    pub descender: hb_position_t,
+    pub line_gap: hb_position_t,
+    pub reserved9: hb_position_t,
+    pub reserved8: hb_position_t,
+    pub reserved7: hb_position_t,
+    pub reserved6: hb_position_t,
+    pub reserved5: hb_position_t,
+    pub reserved4: hb_position_t,
+    pub reserved3: hb_position_t,
+    pub reserved2: hb_position_t,
+    pub reserved1: hb_position_t,
+}
+#[test]
+fn bindgen_test_layout_hb_font_extents_t() {
+    assert_eq!(
+        ::std::mem::size_of::<hb_font_extents_t>(),
+        48usize,
+        concat!("Size of: ", stringify!(hb_font_extents_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<hb_font_extents_t>(),
+        4usize,
+        concat!("Alignment of ", stringify!(hb_font_extents_t))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_font_extents_t>())).ascender as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_font_extents_t),
+            "::",
+            stringify!(ascender)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_font_extents_t>())).descender as *const _ as usize },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_font_extents_t),
+            "::",
+            stringify!(descender)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_font_extents_t>())).line_gap as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_font_extents_t),
+            "::",
+            stringify!(line_gap)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_font_extents_t>())).reserved9 as *const _ as usize },
+        12usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_font_extents_t),
+            "::",
+            stringify!(reserved9)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_font_extents_t>())).reserved8 as *const _ as usize },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_font_extents_t),
+            "::",
+            stringify!(reserved8)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_font_extents_t>())).reserved7 as *const _ as usize },
+        20usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_font_extents_t),
+            "::",
+            stringify!(reserved7)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_font_extents_t>())).reserved6 as *const _ as usize },
+        24usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_font_extents_t),
+            "::",
+            stringify!(reserved6)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_font_extents_t>())).reserved5 as *const _ as usize },
+        28usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_font_extents_t),
+            "::",
+            stringify!(reserved5)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_font_extents_t>())).reserved4 as *const _ as usize },
+        32usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_font_extents_t),
+            "::",
+            stringify!(reserved4)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_font_extents_t>())).reserved3 as *const _ as usize },
+        36usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_font_extents_t),
+            "::",
+            stringify!(reserved3)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_font_extents_t>())).reserved2 as *const _ as usize },
+        40usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_font_extents_t),
+            "::",
+            stringify!(reserved2)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_font_extents_t>())).reserved1 as *const _ as usize },
+        44usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_font_extents_t),
+            "::",
+            stringify!(reserved1)
+        )
+    );
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_glyph_extents_t {
+    pub x_bearing: hb_position_t,
+    pub y_bearing: hb_position_t,
+    pub width: hb_position_t,
+    pub height: hb_position_t,
+}
+#[test]
+fn bindgen_test_layout_hb_glyph_extents_t() {
+    assert_eq!(
+        ::std::mem::size_of::<hb_glyph_extents_t>(),
+        16usize,
+        concat!("Size of: ", stringify!(hb_glyph_extents_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<hb_glyph_extents_t>(),
+        4usize,
+        concat!("Alignment of ", stringify!(hb_glyph_extents_t))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_glyph_extents_t>())).x_bearing as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_glyph_extents_t),
+            "::",
+            stringify!(x_bearing)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_glyph_extents_t>())).y_bearing as *const _ as usize },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_glyph_extents_t),
+            "::",
+            stringify!(y_bearing)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_glyph_extents_t>())).width as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_glyph_extents_t),
+            "::",
+            stringify!(width)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_glyph_extents_t>())).height as *const _ as usize },
+        12usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_glyph_extents_t),
+            "::",
+            stringify!(height)
+        )
+    );
+}
+pub type hb_font_get_font_extents_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        font: *mut hb_font_t,
+        font_data: *mut ::std::os::raw::c_void,
+        extents: *mut hb_font_extents_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_bool_t,
+>;
+pub type hb_font_get_font_h_extents_func_t = hb_font_get_font_extents_func_t;
+pub type hb_font_get_font_v_extents_func_t = hb_font_get_font_extents_func_t;
+pub type hb_font_get_nominal_glyph_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        font: *mut hb_font_t,
+        font_data: *mut ::std::os::raw::c_void,
+        unicode: hb_codepoint_t,
+        glyph: *mut hb_codepoint_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_bool_t,
+>;
+pub type hb_font_get_variation_glyph_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        font: *mut hb_font_t,
+        font_data: *mut ::std::os::raw::c_void,
+        unicode: hb_codepoint_t,
+        variation_selector: hb_codepoint_t,
+        glyph: *mut hb_codepoint_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_bool_t,
+>;
+pub type hb_font_get_nominal_glyphs_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        font: *mut hb_font_t,
+        font_data: *mut ::std::os::raw::c_void,
+        count: ::std::os::raw::c_uint,
+        first_unicode: *const hb_codepoint_t,
+        unicode_stride: ::std::os::raw::c_uint,
+        first_glyph: *mut hb_codepoint_t,
+        glyph_stride: ::std::os::raw::c_uint,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> ::std::os::raw::c_uint,
+>;
+pub type hb_font_get_glyph_advance_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        font: *mut hb_font_t,
+        font_data: *mut ::std::os::raw::c_void,
+        glyph: hb_codepoint_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_position_t,
+>;
+pub type hb_font_get_glyph_h_advance_func_t = hb_font_get_glyph_advance_func_t;
+pub type hb_font_get_glyph_v_advance_func_t = hb_font_get_glyph_advance_func_t;
+pub type hb_font_get_glyph_advances_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        font: *mut hb_font_t,
+        font_data: *mut ::std::os::raw::c_void,
+        count: ::std::os::raw::c_uint,
+        first_glyph: *const hb_codepoint_t,
+        glyph_stride: ::std::os::raw::c_uint,
+        first_advance: *mut hb_position_t,
+        advance_stride: ::std::os::raw::c_uint,
+        user_data: *mut ::std::os::raw::c_void,
+    ),
+>;
+pub type hb_font_get_glyph_h_advances_func_t = hb_font_get_glyph_advances_func_t;
+pub type hb_font_get_glyph_v_advances_func_t = hb_font_get_glyph_advances_func_t;
+pub type hb_font_get_glyph_origin_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        font: *mut hb_font_t,
+        font_data: *mut ::std::os::raw::c_void,
+        glyph: hb_codepoint_t,
+        x: *mut hb_position_t,
+        y: *mut hb_position_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_bool_t,
+>;
+pub type hb_font_get_glyph_h_origin_func_t = hb_font_get_glyph_origin_func_t;
+pub type hb_font_get_glyph_v_origin_func_t = hb_font_get_glyph_origin_func_t;
+pub type hb_font_get_glyph_extents_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        font: *mut hb_font_t,
+        font_data: *mut ::std::os::raw::c_void,
+        glyph: hb_codepoint_t,
+        extents: *mut hb_glyph_extents_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_bool_t,
+>;
+pub type hb_font_get_glyph_contour_point_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        font: *mut hb_font_t,
+        font_data: *mut ::std::os::raw::c_void,
+        glyph: hb_codepoint_t,
+        point_index: ::std::os::raw::c_uint,
+        x: *mut hb_position_t,
+        y: *mut hb_position_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_bool_t,
+>;
+pub type hb_font_get_glyph_name_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        font: *mut hb_font_t,
+        font_data: *mut ::std::os::raw::c_void,
+        glyph: hb_codepoint_t,
+        name: *mut ::std::os::raw::c_char,
+        size: ::std::os::raw::c_uint,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_bool_t,
+>;
+pub type hb_font_get_glyph_from_name_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        font: *mut hb_font_t,
+        font_data: *mut ::std::os::raw::c_void,
+        name: *const ::std::os::raw::c_char,
+        len: ::std::os::raw::c_int,
+        glyph: *mut hb_codepoint_t,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_bool_t,
+>;
+extern "C" {
+    /// hb_font_funcs_set_font_h_extents_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 1.1.2
+    pub fn hb_font_funcs_set_font_h_extents_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_font_h_extents_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_font_funcs_set_font_v_extents_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 1.1.2
+    pub fn hb_font_funcs_set_font_v_extents_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_font_v_extents_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_font_funcs_set_nominal_glyph_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 1.2.3
+    pub fn hb_font_funcs_set_nominal_glyph_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_nominal_glyph_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_font_funcs_set_nominal_glyphs_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 2.0.0
+    pub fn hb_font_funcs_set_nominal_glyphs_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_nominal_glyphs_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_font_funcs_set_variation_glyph_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 1.2.3
+    pub fn hb_font_funcs_set_variation_glyph_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_variation_glyph_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_font_funcs_set_glyph_h_advance_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 0.9.2
+    pub fn hb_font_funcs_set_glyph_h_advance_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_glyph_h_advance_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_font_funcs_set_glyph_v_advance_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 0.9.2
+    pub fn hb_font_funcs_set_glyph_v_advance_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_glyph_v_advance_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_font_funcs_set_glyph_h_advances_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 1.8.6
+    pub fn hb_font_funcs_set_glyph_h_advances_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_glyph_h_advances_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_font_funcs_set_glyph_v_advances_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 1.8.6
+    pub fn hb_font_funcs_set_glyph_v_advances_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_glyph_v_advances_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_font_funcs_set_glyph_h_origin_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 0.9.2
+    pub fn hb_font_funcs_set_glyph_h_origin_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_glyph_h_origin_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_font_funcs_set_glyph_v_origin_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 0.9.2
+    pub fn hb_font_funcs_set_glyph_v_origin_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_glyph_v_origin_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_font_funcs_set_glyph_extents_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 0.9.2
+    pub fn hb_font_funcs_set_glyph_extents_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_glyph_extents_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_font_funcs_set_glyph_contour_point_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 0.9.2
+    pub fn hb_font_funcs_set_glyph_contour_point_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_glyph_contour_point_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_font_funcs_set_glyph_name_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 0.9.2
+    pub fn hb_font_funcs_set_glyph_name_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_glyph_name_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    /// hb_font_funcs_set_glyph_from_name_func:
+    /// @ffuncs: font functions.
+    /// @func: (closure user_data) (destroy destroy) (scope notified):
+    /// @user_data:
+    /// @destroy:
+    ///
+    ///
+    ///
+    /// Since: 0.9.2
+    pub fn hb_font_funcs_set_glyph_from_name_func(
+        ffuncs: *mut hb_font_funcs_t,
+        func: hb_font_get_glyph_from_name_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    pub fn hb_font_get_h_extents(
+        font: *mut hb_font_t,
+        extents: *mut hb_font_extents_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_get_v_extents(
+        font: *mut hb_font_t,
+        extents: *mut hb_font_extents_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_get_nominal_glyph(
+        font: *mut hb_font_t,
+        unicode: hb_codepoint_t,
+        glyph: *mut hb_codepoint_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_get_variation_glyph(
+        font: *mut hb_font_t,
+        unicode: hb_codepoint_t,
+        variation_selector: hb_codepoint_t,
+        glyph: *mut hb_codepoint_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_get_glyph_h_advance(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+    ) -> hb_position_t;
+}
+extern "C" {
+    pub fn hb_font_get_glyph_v_advance(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+    ) -> hb_position_t;
+}
+extern "C" {
+    pub fn hb_font_get_glyph_h_advances(
+        font: *mut hb_font_t,
+        count: ::std::os::raw::c_uint,
+        first_glyph: *const hb_codepoint_t,
+        glyph_stride: ::std::os::raw::c_uint,
+        first_advance: *mut hb_position_t,
+        advance_stride: ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_font_get_glyph_v_advances(
+        font: *mut hb_font_t,
+        count: ::std::os::raw::c_uint,
+        first_glyph: *const hb_codepoint_t,
+        glyph_stride: ::std::os::raw::c_uint,
+        first_advance: *mut hb_position_t,
+        advance_stride: ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_font_get_glyph_h_origin(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        x: *mut hb_position_t,
+        y: *mut hb_position_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_get_glyph_v_origin(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        x: *mut hb_position_t,
+        y: *mut hb_position_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_get_glyph_extents(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        extents: *mut hb_glyph_extents_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_get_glyph_contour_point(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        point_index: ::std::os::raw::c_uint,
+        x: *mut hb_position_t,
+        y: *mut hb_position_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_get_glyph_name(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        name: *mut ::std::os::raw::c_char,
+        size: ::std::os::raw::c_uint,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_get_glyph_from_name(
+        font: *mut hb_font_t,
+        name: *const ::std::os::raw::c_char,
+        len: ::std::os::raw::c_int,
+        glyph: *mut hb_codepoint_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_get_glyph(
+        font: *mut hb_font_t,
+        unicode: hb_codepoint_t,
+        variation_selector: hb_codepoint_t,
+        glyph: *mut hb_codepoint_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_get_extents_for_direction(
+        font: *mut hb_font_t,
+        direction: hb_direction_t,
+        extents: *mut hb_font_extents_t,
+    );
+}
+extern "C" {
+    pub fn hb_font_get_glyph_advance_for_direction(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        direction: hb_direction_t,
+        x: *mut hb_position_t,
+        y: *mut hb_position_t,
+    );
+}
+extern "C" {
+    pub fn hb_font_get_glyph_advances_for_direction(
+        font: *mut hb_font_t,
+        direction: hb_direction_t,
+        count: ::std::os::raw::c_uint,
+        first_glyph: *const hb_codepoint_t,
+        glyph_stride: ::std::os::raw::c_uint,
+        first_advance: *mut hb_position_t,
+        advance_stride: ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_font_get_glyph_origin_for_direction(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        direction: hb_direction_t,
+        x: *mut hb_position_t,
+        y: *mut hb_position_t,
+    );
+}
+extern "C" {
+    pub fn hb_font_add_glyph_origin_for_direction(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        direction: hb_direction_t,
+        x: *mut hb_position_t,
+        y: *mut hb_position_t,
+    );
+}
+extern "C" {
+    pub fn hb_font_subtract_glyph_origin_for_direction(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        direction: hb_direction_t,
+        x: *mut hb_position_t,
+        y: *mut hb_position_t,
+    );
+}
+extern "C" {
+    pub fn hb_font_get_glyph_extents_for_origin(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        direction: hb_direction_t,
+        extents: *mut hb_glyph_extents_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_get_glyph_contour_point_for_origin(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        point_index: ::std::os::raw::c_uint,
+        direction: hb_direction_t,
+        x: *mut hb_position_t,
+        y: *mut hb_position_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_glyph_to_string(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        s: *mut ::std::os::raw::c_char,
+        size: ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_font_glyph_from_string(
+        font: *mut hb_font_t,
+        s: *const ::std::os::raw::c_char,
+        len: ::std::os::raw::c_int,
+        glyph: *mut hb_codepoint_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_create(face: *mut hb_face_t) -> *mut hb_font_t;
+}
+extern "C" {
+    pub fn hb_font_create_sub_font(parent: *mut hb_font_t) -> *mut hb_font_t;
+}
+extern "C" {
+    pub fn hb_font_get_empty() -> *mut hb_font_t;
+}
+extern "C" {
+    pub fn hb_font_reference(font: *mut hb_font_t) -> *mut hb_font_t;
+}
+extern "C" {
+    pub fn hb_font_destroy(font: *mut hb_font_t);
+}
+extern "C" {
+    pub fn hb_font_set_user_data(
+        font: *mut hb_font_t,
+        key: *mut hb_user_data_key_t,
+        data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+        replace: hb_bool_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_get_user_data(
+        font: *mut hb_font_t,
+        key: *mut hb_user_data_key_t,
+    ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+    pub fn hb_font_make_immutable(font: *mut hb_font_t);
+}
+extern "C" {
+    pub fn hb_font_is_immutable(font: *mut hb_font_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_font_set_parent(font: *mut hb_font_t, parent: *mut hb_font_t);
+}
+extern "C" {
+    pub fn hb_font_get_parent(font: *mut hb_font_t) -> *mut hb_font_t;
+}
+extern "C" {
+    pub fn hb_font_set_face(font: *mut hb_font_t, face: *mut hb_face_t);
+}
+extern "C" {
+    pub fn hb_font_get_face(font: *mut hb_font_t) -> *mut hb_face_t;
+}
+extern "C" {
+    pub fn hb_font_set_funcs(
+        font: *mut hb_font_t,
+        klass: *mut hb_font_funcs_t,
+        font_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    pub fn hb_font_set_funcs_data(
+        font: *mut hb_font_t,
+        font_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+extern "C" {
+    pub fn hb_font_set_scale(
+        font: *mut hb_font_t,
+        x_scale: ::std::os::raw::c_int,
+        y_scale: ::std::os::raw::c_int,
+    );
+}
+extern "C" {
+    pub fn hb_font_get_scale(
+        font: *mut hb_font_t,
+        x_scale: *mut ::std::os::raw::c_int,
+        y_scale: *mut ::std::os::raw::c_int,
+    );
+}
+extern "C" {
+    pub fn hb_font_set_ppem(
+        font: *mut hb_font_t,
+        x_ppem: ::std::os::raw::c_uint,
+        y_ppem: ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_font_get_ppem(
+        font: *mut hb_font_t,
+        x_ppem: *mut ::std::os::raw::c_uint,
+        y_ppem: *mut ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_font_set_ptem(font: *mut hb_font_t, ptem: f32);
+}
+extern "C" {
+    pub fn hb_font_get_ptem(font: *mut hb_font_t) -> f32;
+}
+extern "C" {
+    pub fn hb_font_set_variations(
+        font: *mut hb_font_t,
+        variations: *const hb_variation_t,
+        variations_length: ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_font_set_var_coords_design(
+        font: *mut hb_font_t,
+        coords: *const f32,
+        coords_length: ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_font_set_var_coords_normalized(
+        font: *mut hb_font_t,
+        coords: *const ::std::os::raw::c_int,
+        coords_length: ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_font_get_var_coords_normalized(
+        font: *mut hb_font_t,
+        length: *mut ::std::os::raw::c_uint,
+    ) -> *const ::std::os::raw::c_int;
+}
+/// hb_glyph_info_t:
+/// @codepoint: either a Unicode code point (before shaping) or a glyph index
+///             (after shaping).
+/// @mask:
+/// @cluster: the index of the character in the original text that corresponds
+///           to this `hb_glyph_info_t`, or whatever the client passes to
+///           hb_buffer_add(). More than one `hb_glyph_info_t` can have the same
+///           @cluster value, if they resulted from the same character (e.g. one
+///           to many glyph substitution), and when more than one character gets
+///           merged in the same glyph (e.g. many to one glyph substitution) the
+///           `hb_glyph_info_t` will have the smallest cluster value of them.
+///           By default some characters are merged into the same cluster
+///           (e.g. combining marks have the same cluster as their bases)
+///           even if they are separate glyphs, hb_buffer_set_cluster_level()
+///           allow selecting more fine-grained cluster handling.
+///
+/// The `hb_glyph_info_t` is the structure that holds information about the
+/// glyphs and their relation to input text.
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_glyph_info_t {
+    pub codepoint: hb_codepoint_t,
+    pub mask: hb_mask_t,
+    pub cluster: u32,
+    pub var1: hb_var_int_t,
+    pub var2: hb_var_int_t,
+}
+#[test]
+fn bindgen_test_layout_hb_glyph_info_t() {
+    assert_eq!(
+        ::std::mem::size_of::<hb_glyph_info_t>(),
+        20usize,
+        concat!("Size of: ", stringify!(hb_glyph_info_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<hb_glyph_info_t>(),
+        4usize,
+        concat!("Alignment of ", stringify!(hb_glyph_info_t))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_glyph_info_t>())).codepoint as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_glyph_info_t),
+            "::",
+            stringify!(codepoint)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_glyph_info_t>())).mask as *const _ as usize },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_glyph_info_t),
+            "::",
+            stringify!(mask)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_glyph_info_t>())).cluster as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_glyph_info_t),
+            "::",
+            stringify!(cluster)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_glyph_info_t>())).var1 as *const _ as usize },
+        12usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_glyph_info_t),
+            "::",
+            stringify!(var1)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_glyph_info_t>())).var2 as *const _ as usize },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_glyph_info_t),
+            "::",
+            stringify!(var2)
+        )
+    );
+}
+pub const HB_GLYPH_FLAG_UNSAFE_TO_BREAK: hb_glyph_flags_t = 1;
+pub const HB_GLYPH_FLAG_DEFINED: hb_glyph_flags_t = 1;
+/// hb_glyph_flags_t:
+/// @HB_GLYPH_FLAG_UNSAFE_TO_BREAK: Indicates that if input text is broken at the
+/// beginning of the cluster this glyph is part of,
+/// then both sides need to be re-shaped, as the
+/// result might be different.  On the flip side,
+/// it means that when this flag is not present,
+/// then it's safe to break the glyph-run at the
+/// beginning of this cluster, and the two sides
+/// represent the exact same result one would get
+/// if breaking input text at the beginning of
+/// this cluster and shaping the two sides
+/// separately.  This can be used to optimize
+/// paragraph layout, by avoiding re-shaping
+/// of each line after line-breaking, or limiting
+/// the reshaping to a small piece around the
+/// breaking point only.
+/// @HB_GLYPH_FLAG_DEFINED: All the currently defined flags.
+///
+/// Since: 1.5.0
+pub type hb_glyph_flags_t = u32;
+extern "C" {
+    pub fn hb_glyph_info_get_glyph_flags(info: *const hb_glyph_info_t) -> hb_glyph_flags_t;
+}
+/// hb_glyph_position_t:
+/// @x_advance: how much the line advances after drawing this glyph when setting
+///             text in horizontal direction.
+/// @y_advance: how much the line advances after drawing this glyph when setting
+///             text in vertical direction.
+/// @x_offset: how much the glyph moves on the X-axis before drawing it, this
+///            should not affect how much the line advances.
+/// @y_offset: how much the glyph moves on the Y-axis before drawing it, this
+///            should not affect how much the line advances.
+///
+/// The `hb_glyph_position_t` is the structure that holds the positions of the
+/// glyph in both horizontal and vertical directions. All positions in
+/// `hb_glyph_position_t` are relative to the current point.
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_glyph_position_t {
+    pub x_advance: hb_position_t,
+    pub y_advance: hb_position_t,
+    pub x_offset: hb_position_t,
+    pub y_offset: hb_position_t,
+    pub var: hb_var_int_t,
+}
+#[test]
+fn bindgen_test_layout_hb_glyph_position_t() {
+    assert_eq!(
+        ::std::mem::size_of::<hb_glyph_position_t>(),
+        20usize,
+        concat!("Size of: ", stringify!(hb_glyph_position_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<hb_glyph_position_t>(),
+        4usize,
+        concat!("Alignment of ", stringify!(hb_glyph_position_t))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_glyph_position_t>())).x_advance as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_glyph_position_t),
+            "::",
+            stringify!(x_advance)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_glyph_position_t>())).y_advance as *const _ as usize },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_glyph_position_t),
+            "::",
+            stringify!(y_advance)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_glyph_position_t>())).x_offset as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_glyph_position_t),
+            "::",
+            stringify!(x_offset)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_glyph_position_t>())).y_offset as *const _ as usize },
+        12usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_glyph_position_t),
+            "::",
+            stringify!(y_offset)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_glyph_position_t>())).var as *const _ as usize },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_glyph_position_t),
+            "::",
+            stringify!(var)
+        )
+    );
+}
+/// hb_segment_properties_t:
+/// @direction: the `hb_direction_t` of the buffer, see hb_buffer_set_direction().
+/// @script: the `hb_script_t` of the buffer, see hb_buffer_set_script().
+/// @language: the `hb_language_t` of the buffer, see hb_buffer_set_language().
+///
+/// The structure that holds various text properties of an `hb_buffer_t`. Can be
+/// set and retrieved using hb_buffer_set_segment_properties() and
+/// hb_buffer_get_segment_properties(), respectively.
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_segment_properties_t {
+    pub direction: hb_direction_t,
+    pub script: hb_script_t,
+    pub language: hb_language_t,
+    pub reserved1: *mut ::std::os::raw::c_void,
+    pub reserved2: *mut ::std::os::raw::c_void,
+}
+#[test]
+fn bindgen_test_layout_hb_segment_properties_t() {
+    assert_eq!(
+        ::std::mem::size_of::<hb_segment_properties_t>(),
+        32usize,
+        concat!("Size of: ", stringify!(hb_segment_properties_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<hb_segment_properties_t>(),
+        8usize,
+        concat!("Alignment of ", stringify!(hb_segment_properties_t))
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_segment_properties_t>())).direction as *const _ as usize
+        },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_segment_properties_t),
+            "::",
+            stringify!(direction)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_segment_properties_t>())).script as *const _ as usize },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_segment_properties_t),
+            "::",
+            stringify!(script)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_segment_properties_t>())).language as *const _ as usize
+        },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_segment_properties_t),
+            "::",
+            stringify!(language)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_segment_properties_t>())).reserved1 as *const _ as usize
+        },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_segment_properties_t),
+            "::",
+            stringify!(reserved1)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_segment_properties_t>())).reserved2 as *const _ as usize
+        },
+        24usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_segment_properties_t),
+            "::",
+            stringify!(reserved2)
+        )
+    );
+}
+extern "C" {
+    pub fn hb_segment_properties_equal(
+        a: *const hb_segment_properties_t,
+        b: *const hb_segment_properties_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_segment_properties_hash(p: *const hb_segment_properties_t) -> ::std::os::raw::c_uint;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_buffer_t {
+    _unused: [u8; 0],
+}
+extern "C" {
+    pub fn hb_buffer_create() -> *mut hb_buffer_t;
+}
+extern "C" {
+    pub fn hb_buffer_get_empty() -> *mut hb_buffer_t;
+}
+extern "C" {
+    pub fn hb_buffer_reference(buffer: *mut hb_buffer_t) -> *mut hb_buffer_t;
+}
+extern "C" {
+    pub fn hb_buffer_destroy(buffer: *mut hb_buffer_t);
+}
+extern "C" {
+    pub fn hb_buffer_set_user_data(
+        buffer: *mut hb_buffer_t,
+        key: *mut hb_user_data_key_t,
+        data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+        replace: hb_bool_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_buffer_get_user_data(
+        buffer: *mut hb_buffer_t,
+        key: *mut hb_user_data_key_t,
+    ) -> *mut ::std::os::raw::c_void;
+}
+pub const HB_BUFFER_CONTENT_TYPE_INVALID: hb_buffer_content_type_t = 0;
+pub const HB_BUFFER_CONTENT_TYPE_UNICODE: hb_buffer_content_type_t = 1;
+pub const HB_BUFFER_CONTENT_TYPE_GLYPHS: hb_buffer_content_type_t = 2;
+/// hb_buffer_content_type_t:
+/// @HB_BUFFER_CONTENT_TYPE_INVALID: Initial value for new buffer.
+/// @HB_BUFFER_CONTENT_TYPE_UNICODE: The buffer contains input characters (before shaping).
+/// @HB_BUFFER_CONTENT_TYPE_GLYPHS: The buffer contains output glyphs (after shaping).
+pub type hb_buffer_content_type_t = u32;
+extern "C" {
+    pub fn hb_buffer_set_content_type(
+        buffer: *mut hb_buffer_t,
+        content_type: hb_buffer_content_type_t,
+    );
+}
+extern "C" {
+    pub fn hb_buffer_get_content_type(buffer: *mut hb_buffer_t) -> hb_buffer_content_type_t;
+}
+extern "C" {
+    pub fn hb_buffer_set_unicode_funcs(
+        buffer: *mut hb_buffer_t,
+        unicode_funcs: *mut hb_unicode_funcs_t,
+    );
+}
+extern "C" {
+    pub fn hb_buffer_get_unicode_funcs(buffer: *mut hb_buffer_t) -> *mut hb_unicode_funcs_t;
+}
+extern "C" {
+    pub fn hb_buffer_set_direction(buffer: *mut hb_buffer_t, direction: hb_direction_t);
+}
+extern "C" {
+    pub fn hb_buffer_get_direction(buffer: *mut hb_buffer_t) -> hb_direction_t;
+}
+extern "C" {
+    pub fn hb_buffer_set_script(buffer: *mut hb_buffer_t, script: hb_script_t);
+}
+extern "C" {
+    pub fn hb_buffer_get_script(buffer: *mut hb_buffer_t) -> hb_script_t;
+}
+extern "C" {
+    pub fn hb_buffer_set_language(buffer: *mut hb_buffer_t, language: hb_language_t);
+}
+extern "C" {
+    pub fn hb_buffer_get_language(buffer: *mut hb_buffer_t) -> hb_language_t;
+}
+extern "C" {
+    pub fn hb_buffer_set_segment_properties(
+        buffer: *mut hb_buffer_t,
+        props: *const hb_segment_properties_t,
+    );
+}
+extern "C" {
+    pub fn hb_buffer_get_segment_properties(
+        buffer: *mut hb_buffer_t,
+        props: *mut hb_segment_properties_t,
+    );
+}
+extern "C" {
+    pub fn hb_buffer_guess_segment_properties(buffer: *mut hb_buffer_t);
+}
+pub const HB_BUFFER_FLAG_DEFAULT: hb_buffer_flags_t = 0;
+pub const HB_BUFFER_FLAG_BOT: hb_buffer_flags_t = 1;
+pub const HB_BUFFER_FLAG_EOT: hb_buffer_flags_t = 2;
+pub const HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES: hb_buffer_flags_t = 4;
+pub const HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES: hb_buffer_flags_t = 8;
+/// hb_buffer_flags_t:
+/// @HB_BUFFER_FLAG_DEFAULT: the default buffer flag.
+/// @HB_BUFFER_FLAG_BOT: flag indicating that special handling of the beginning
+///                      of text paragraph can be applied to this buffer. Should usually
+///                      be set, unless you are passing to the buffer only part
+///                      of the text without the full context.
+/// @HB_BUFFER_FLAG_EOT: flag indicating that special handling of the end of text
+/// paragraph can be applied to this buffer, similar to
+/// @HB_BUFFER_FLAG_BOT.
+/// @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES:
+/// flag indication that character with Default_Ignorable
+/// Unicode property should use the corresponding glyph
+/// from the font, instead of hiding them (done by
+/// replacing them with the space glyph and zeroing the
+/// advance width.)  This flag takes precedence over
+/// @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES.
+/// @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES:
+/// flag indication that character with Default_Ignorable
+/// Unicode property should be removed from glyph string
+/// instead of hiding them (done by replacing them with the
+/// space glyph and zeroing the advance width.)
+/// @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES takes
+/// precedence over this flag. Since: 1.8.0
+///
+/// Since: 0.9.20
+pub type hb_buffer_flags_t = u32;
+extern "C" {
+    pub fn hb_buffer_set_flags(buffer: *mut hb_buffer_t, flags: hb_buffer_flags_t);
+}
+extern "C" {
+    pub fn hb_buffer_get_flags(buffer: *mut hb_buffer_t) -> hb_buffer_flags_t;
+}
+pub const HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES: hb_buffer_cluster_level_t = 0;
+pub const HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS: hb_buffer_cluster_level_t = 1;
+pub const HB_BUFFER_CLUSTER_LEVEL_CHARACTERS: hb_buffer_cluster_level_t = 2;
+pub const HB_BUFFER_CLUSTER_LEVEL_DEFAULT: hb_buffer_cluster_level_t = 0;
+/// hb_buffer_cluster_level_t:
+/// @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES: Return cluster values grouped by graphemes into
+/// monotone order.
+/// @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS: Return cluster values grouped into monotone order.
+/// @HB_BUFFER_CLUSTER_LEVEL_CHARACTERS: Don't group cluster values.
+/// @HB_BUFFER_CLUSTER_LEVEL_DEFAULT: Default cluster level,
+/// equal to @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES.
+///
+/// Since: 0.9.42
+pub type hb_buffer_cluster_level_t = u32;
+extern "C" {
+    pub fn hb_buffer_set_cluster_level(
+        buffer: *mut hb_buffer_t,
+        cluster_level: hb_buffer_cluster_level_t,
+    );
+}
+extern "C" {
+    pub fn hb_buffer_get_cluster_level(buffer: *mut hb_buffer_t) -> hb_buffer_cluster_level_t;
+}
+extern "C" {
+    pub fn hb_buffer_set_replacement_codepoint(
+        buffer: *mut hb_buffer_t,
+        replacement: hb_codepoint_t,
+    );
+}
+extern "C" {
+    pub fn hb_buffer_get_replacement_codepoint(buffer: *mut hb_buffer_t) -> hb_codepoint_t;
+}
+extern "C" {
+    pub fn hb_buffer_set_invisible_glyph(buffer: *mut hb_buffer_t, invisible: hb_codepoint_t);
+}
+extern "C" {
+    pub fn hb_buffer_get_invisible_glyph(buffer: *mut hb_buffer_t) -> hb_codepoint_t;
+}
+extern "C" {
+    pub fn hb_buffer_reset(buffer: *mut hb_buffer_t);
+}
+extern "C" {
+    pub fn hb_buffer_clear_contents(buffer: *mut hb_buffer_t);
+}
+extern "C" {
+    pub fn hb_buffer_pre_allocate(
+        buffer: *mut hb_buffer_t,
+        size: ::std::os::raw::c_uint,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_buffer_allocation_successful(buffer: *mut hb_buffer_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_buffer_reverse(buffer: *mut hb_buffer_t);
+}
+extern "C" {
+    pub fn hb_buffer_reverse_range(
+        buffer: *mut hb_buffer_t,
+        start: ::std::os::raw::c_uint,
+        end: ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_buffer_reverse_clusters(buffer: *mut hb_buffer_t);
+}
+extern "C" {
+    pub fn hb_buffer_add(
+        buffer: *mut hb_buffer_t,
+        codepoint: hb_codepoint_t,
+        cluster: ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_buffer_add_utf8(
+        buffer: *mut hb_buffer_t,
+        text: *const ::std::os::raw::c_char,
+        text_length: ::std::os::raw::c_int,
+        item_offset: ::std::os::raw::c_uint,
+        item_length: ::std::os::raw::c_int,
+    );
+}
+extern "C" {
+    pub fn hb_buffer_add_utf16(
+        buffer: *mut hb_buffer_t,
+        text: *const u16,
+        text_length: ::std::os::raw::c_int,
+        item_offset: ::std::os::raw::c_uint,
+        item_length: ::std::os::raw::c_int,
+    );
+}
+extern "C" {
+    pub fn hb_buffer_add_utf32(
+        buffer: *mut hb_buffer_t,
+        text: *const u32,
+        text_length: ::std::os::raw::c_int,
+        item_offset: ::std::os::raw::c_uint,
+        item_length: ::std::os::raw::c_int,
+    );
+}
+extern "C" {
+    pub fn hb_buffer_add_latin1(
+        buffer: *mut hb_buffer_t,
+        text: *const u8,
+        text_length: ::std::os::raw::c_int,
+        item_offset: ::std::os::raw::c_uint,
+        item_length: ::std::os::raw::c_int,
+    );
+}
+extern "C" {
+    pub fn hb_buffer_add_codepoints(
+        buffer: *mut hb_buffer_t,
+        text: *const hb_codepoint_t,
+        text_length: ::std::os::raw::c_int,
+        item_offset: ::std::os::raw::c_uint,
+        item_length: ::std::os::raw::c_int,
+    );
+}
+extern "C" {
+    pub fn hb_buffer_append(
+        buffer: *mut hb_buffer_t,
+        source: *mut hb_buffer_t,
+        start: ::std::os::raw::c_uint,
+        end: ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_buffer_set_length(
+        buffer: *mut hb_buffer_t,
+        length: ::std::os::raw::c_uint,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_buffer_get_length(buffer: *mut hb_buffer_t) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_buffer_get_glyph_infos(
+        buffer: *mut hb_buffer_t,
+        length: *mut ::std::os::raw::c_uint,
+    ) -> *mut hb_glyph_info_t;
+}
+extern "C" {
+    pub fn hb_buffer_get_glyph_positions(
+        buffer: *mut hb_buffer_t,
+        length: *mut ::std::os::raw::c_uint,
+    ) -> *mut hb_glyph_position_t;
+}
+extern "C" {
+    pub fn hb_buffer_normalize_glyphs(buffer: *mut hb_buffer_t);
+}
+pub const HB_BUFFER_SERIALIZE_FLAG_DEFAULT: hb_buffer_serialize_flags_t = 0;
+pub const HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS: hb_buffer_serialize_flags_t = 1;
+pub const HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: hb_buffer_serialize_flags_t = 2;
+pub const HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: hb_buffer_serialize_flags_t = 4;
+pub const HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: hb_buffer_serialize_flags_t = 8;
+pub const HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS: hb_buffer_serialize_flags_t = 16;
+pub const HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES: hb_buffer_serialize_flags_t = 32;
+/// hb_buffer_serialize_flags_t:
+/// @HB_BUFFER_SERIALIZE_FLAG_DEFAULT: serialize glyph names, clusters and positions.
+/// @HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS: do not serialize glyph cluster.
+/// @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information.
+/// @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name.
+/// @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents.
+/// @HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS: serialize glyph flags. Since: 1.5.0
+/// @HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES: do not serialize glyph advances,
+/// glyph offsets will reflect absolute glyph positions. Since: 1.8.0
+///
+/// Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().
+///
+/// Since: 0.9.20
+pub type hb_buffer_serialize_flags_t = u32;
+pub const HB_BUFFER_SERIALIZE_FORMAT_TEXT: hb_buffer_serialize_format_t = 1413830740;
+pub const HB_BUFFER_SERIALIZE_FORMAT_JSON: hb_buffer_serialize_format_t = 1246973774;
+pub const HB_BUFFER_SERIALIZE_FORMAT_INVALID: hb_buffer_serialize_format_t = 0;
+/// hb_buffer_serialize_format_t:
+/// @HB_BUFFER_SERIALIZE_FORMAT_TEXT: a human-readable, plain text format.
+/// @HB_BUFFER_SERIALIZE_FORMAT_JSON: a machine-readable JSON format.
+/// @HB_BUFFER_SERIALIZE_FORMAT_INVALID: invalid format.
+///
+/// The buffer serialization and de-serialization format used in
+/// hb_buffer_serialize_glyphs() and hb_buffer_deserialize_glyphs().
+///
+/// Since: 0.9.2
+pub type hb_buffer_serialize_format_t = u32;
+extern "C" {
+    pub fn hb_buffer_serialize_format_from_string(
+        str: *const ::std::os::raw::c_char,
+        len: ::std::os::raw::c_int,
+    ) -> hb_buffer_serialize_format_t;
+}
+extern "C" {
+    pub fn hb_buffer_serialize_format_to_string(
+        format: hb_buffer_serialize_format_t,
+    ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+    pub fn hb_buffer_serialize_list_formats() -> *mut *const ::std::os::raw::c_char;
+}
+extern "C" {
+    pub fn hb_buffer_serialize_glyphs(
+        buffer: *mut hb_buffer_t,
+        start: ::std::os::raw::c_uint,
+        end: ::std::os::raw::c_uint,
+        buf: *mut ::std::os::raw::c_char,
+        buf_size: ::std::os::raw::c_uint,
+        buf_consumed: *mut ::std::os::raw::c_uint,
+        font: *mut hb_font_t,
+        format: hb_buffer_serialize_format_t,
+        flags: hb_buffer_serialize_flags_t,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_buffer_deserialize_glyphs(
+        buffer: *mut hb_buffer_t,
+        buf: *const ::std::os::raw::c_char,
+        buf_len: ::std::os::raw::c_int,
+        end_ptr: *mut *const ::std::os::raw::c_char,
+        font: *mut hb_font_t,
+        format: hb_buffer_serialize_format_t,
+    ) -> hb_bool_t;
+}
+pub const HB_BUFFER_DIFF_FLAG_EQUAL: hb_buffer_diff_flags_t = 0;
+pub const HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH: hb_buffer_diff_flags_t = 1;
+pub const HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH: hb_buffer_diff_flags_t = 2;
+pub const HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT: hb_buffer_diff_flags_t = 4;
+pub const HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT: hb_buffer_diff_flags_t = 8;
+pub const HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH: hb_buffer_diff_flags_t = 16;
+pub const HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH: hb_buffer_diff_flags_t = 32;
+pub const HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH: hb_buffer_diff_flags_t = 64;
+pub const HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH: hb_buffer_diff_flags_t = 128;
+pub type hb_buffer_diff_flags_t = u32;
+extern "C" {
+    pub fn hb_buffer_diff(
+        buffer: *mut hb_buffer_t,
+        reference: *mut hb_buffer_t,
+        dottedcircle_glyph: hb_codepoint_t,
+        position_fuzz: ::std::os::raw::c_uint,
+    ) -> hb_buffer_diff_flags_t;
+}
+pub type hb_buffer_message_func_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        buffer: *mut hb_buffer_t,
+        font: *mut hb_font_t,
+        message: *const ::std::os::raw::c_char,
+        user_data: *mut ::std::os::raw::c_void,
+    ) -> hb_bool_t,
+>;
+extern "C" {
+    pub fn hb_buffer_set_message_func(
+        buffer: *mut hb_buffer_t,
+        func: hb_buffer_message_func_t,
+        user_data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+    );
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_map_t {
+    _unused: [u8; 0],
+}
+extern "C" {
+    pub fn hb_map_create() -> *mut hb_map_t;
+}
+extern "C" {
+    pub fn hb_map_get_empty() -> *mut hb_map_t;
+}
+extern "C" {
+    pub fn hb_map_reference(map: *mut hb_map_t) -> *mut hb_map_t;
+}
+extern "C" {
+    pub fn hb_map_destroy(map: *mut hb_map_t);
+}
+extern "C" {
+    pub fn hb_map_set_user_data(
+        map: *mut hb_map_t,
+        key: *mut hb_user_data_key_t,
+        data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+        replace: hb_bool_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_map_get_user_data(
+        map: *mut hb_map_t,
+        key: *mut hb_user_data_key_t,
+    ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+    pub fn hb_map_allocation_successful(map: *const hb_map_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_map_clear(map: *mut hb_map_t);
+}
+extern "C" {
+    pub fn hb_map_is_empty(map: *const hb_map_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_map_get_population(map: *const hb_map_t) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_map_set(map: *mut hb_map_t, key: hb_codepoint_t, value: hb_codepoint_t);
+}
+extern "C" {
+    pub fn hb_map_get(map: *const hb_map_t, key: hb_codepoint_t) -> hb_codepoint_t;
+}
+extern "C" {
+    pub fn hb_map_del(map: *mut hb_map_t, key: hb_codepoint_t);
+}
+extern "C" {
+    pub fn hb_map_has(map: *const hb_map_t, key: hb_codepoint_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_shape(
+        font: *mut hb_font_t,
+        buffer: *mut hb_buffer_t,
+        features: *const hb_feature_t,
+        num_features: ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_shape_full(
+        font: *mut hb_font_t,
+        buffer: *mut hb_buffer_t,
+        features: *const hb_feature_t,
+        num_features: ::std::os::raw::c_uint,
+        shaper_list: *const *const ::std::os::raw::c_char,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_shape_list_shapers() -> *mut *const ::std::os::raw::c_char;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_shape_plan_t {
+    _unused: [u8; 0],
+}
+extern "C" {
+    pub fn hb_shape_plan_create(
+        face: *mut hb_face_t,
+        props: *const hb_segment_properties_t,
+        user_features: *const hb_feature_t,
+        num_user_features: ::std::os::raw::c_uint,
+        shaper_list: *const *const ::std::os::raw::c_char,
+    ) -> *mut hb_shape_plan_t;
+}
+extern "C" {
+    pub fn hb_shape_plan_create_cached(
+        face: *mut hb_face_t,
+        props: *const hb_segment_properties_t,
+        user_features: *const hb_feature_t,
+        num_user_features: ::std::os::raw::c_uint,
+        shaper_list: *const *const ::std::os::raw::c_char,
+    ) -> *mut hb_shape_plan_t;
+}
+extern "C" {
+    pub fn hb_shape_plan_create2(
+        face: *mut hb_face_t,
+        props: *const hb_segment_properties_t,
+        user_features: *const hb_feature_t,
+        num_user_features: ::std::os::raw::c_uint,
+        coords: *const ::std::os::raw::c_int,
+        num_coords: ::std::os::raw::c_uint,
+        shaper_list: *const *const ::std::os::raw::c_char,
+    ) -> *mut hb_shape_plan_t;
+}
+extern "C" {
+    pub fn hb_shape_plan_create_cached2(
+        face: *mut hb_face_t,
+        props: *const hb_segment_properties_t,
+        user_features: *const hb_feature_t,
+        num_user_features: ::std::os::raw::c_uint,
+        coords: *const ::std::os::raw::c_int,
+        num_coords: ::std::os::raw::c_uint,
+        shaper_list: *const *const ::std::os::raw::c_char,
+    ) -> *mut hb_shape_plan_t;
+}
+extern "C" {
+    pub fn hb_shape_plan_get_empty() -> *mut hb_shape_plan_t;
+}
+extern "C" {
+    pub fn hb_shape_plan_reference(shape_plan: *mut hb_shape_plan_t) -> *mut hb_shape_plan_t;
+}
+extern "C" {
+    pub fn hb_shape_plan_destroy(shape_plan: *mut hb_shape_plan_t);
+}
+extern "C" {
+    pub fn hb_shape_plan_set_user_data(
+        shape_plan: *mut hb_shape_plan_t,
+        key: *mut hb_user_data_key_t,
+        data: *mut ::std::os::raw::c_void,
+        destroy: hb_destroy_func_t,
+        replace: hb_bool_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_shape_plan_get_user_data(
+        shape_plan: *mut hb_shape_plan_t,
+        key: *mut hb_user_data_key_t,
+    ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+    pub fn hb_shape_plan_execute(
+        shape_plan: *mut hb_shape_plan_t,
+        font: *mut hb_font_t,
+        buffer: *mut hb_buffer_t,
+        features: *const hb_feature_t,
+        num_features: ::std::os::raw::c_uint,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_shape_plan_get_shaper(
+        shape_plan: *mut hb_shape_plan_t,
+    ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+    pub fn hb_version(
+        major: *mut ::std::os::raw::c_uint,
+        minor: *mut ::std::os::raw::c_uint,
+        micro: *mut ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_version_string() -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+    pub fn hb_version_atleast(
+        major: ::std::os::raw::c_uint,
+        minor: ::std::os::raw::c_uint,
+        micro: ::std::os::raw::c_uint,
+    ) -> hb_bool_t;
+}
+pub const HB_OT_NAME_ID_COPYRIGHT: _bindgen_ty_1 = 0;
+pub const HB_OT_NAME_ID_FONT_FAMILY: _bindgen_ty_1 = 1;
+pub const HB_OT_NAME_ID_FONT_SUBFAMILY: _bindgen_ty_1 = 2;
+pub const HB_OT_NAME_ID_UNIQUE_ID: _bindgen_ty_1 = 3;
+pub const HB_OT_NAME_ID_FULL_NAME: _bindgen_ty_1 = 4;
+pub const HB_OT_NAME_ID_VERSION_STRING: _bindgen_ty_1 = 5;
+pub const HB_OT_NAME_ID_POSTSCRIPT_NAME: _bindgen_ty_1 = 6;
+pub const HB_OT_NAME_ID_TRADEMARK: _bindgen_ty_1 = 7;
+pub const HB_OT_NAME_ID_MANUFACTURER: _bindgen_ty_1 = 8;
+pub const HB_OT_NAME_ID_DESIGNER: _bindgen_ty_1 = 9;
+pub const HB_OT_NAME_ID_DESCRIPTION: _bindgen_ty_1 = 10;
+pub const HB_OT_NAME_ID_VENDOR_URL: _bindgen_ty_1 = 11;
+pub const HB_OT_NAME_ID_DESIGNER_URL: _bindgen_ty_1 = 12;
+pub const HB_OT_NAME_ID_LICENSE: _bindgen_ty_1 = 13;
+pub const HB_OT_NAME_ID_LICENSE_URL: _bindgen_ty_1 = 14;
+pub const HB_OT_NAME_ID_TYPOGRAPHIC_FAMILY: _bindgen_ty_1 = 16;
+pub const HB_OT_NAME_ID_TYPOGRAPHIC_SUBFAMILY: _bindgen_ty_1 = 17;
+pub const HB_OT_NAME_ID_MAC_FULL_NAME: _bindgen_ty_1 = 18;
+pub const HB_OT_NAME_ID_SAMPLE_TEXT: _bindgen_ty_1 = 19;
+pub const HB_OT_NAME_ID_CID_FINDFONT_NAME: _bindgen_ty_1 = 20;
+pub const HB_OT_NAME_ID_WWS_FAMILY: _bindgen_ty_1 = 21;
+pub const HB_OT_NAME_ID_WWS_SUBFAMILY: _bindgen_ty_1 = 22;
+pub const HB_OT_NAME_ID_LIGHT_BACKGROUND: _bindgen_ty_1 = 23;
+pub const HB_OT_NAME_ID_DARK_BACKGROUND: _bindgen_ty_1 = 24;
+pub const HB_OT_NAME_ID_VARIATIONS_PS_PREFIX: _bindgen_ty_1 = 25;
+pub const HB_OT_NAME_ID_INVALID: _bindgen_ty_1 = 65535;
+/// hb_ot_name_id_t:
+/// @HB_OT_NAME_ID_INVALID: Value to represent a nonexistent name ID.
+///
+/// An integral type representing an OpenType 'name' table name identifier.
+/// There are predefined name IDs, as well as name IDs return from other
+/// API.  These can be used to fetch name strings from a font face.
+///
+/// Since: 2.0.0
+pub type _bindgen_ty_1 = u32;
+pub type hb_ot_name_id_t = ::std::os::raw::c_uint;
+/// hb_ot_name_entry_t:
+/// @name_id: name ID
+/// @language: language
+///
+/// Structure representing a name ID in a particular language.
+///
+/// Since: 2.1.0
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct hb_ot_name_entry_t {
+    pub name_id: hb_ot_name_id_t,
+    pub var: hb_var_int_t,
+    pub language: hb_language_t,
+}
+#[test]
+fn bindgen_test_layout_hb_ot_name_entry_t() {
+    assert_eq!(
+        ::std::mem::size_of::<hb_ot_name_entry_t>(),
+        16usize,
+        concat!("Size of: ", stringify!(hb_ot_name_entry_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<hb_ot_name_entry_t>(),
+        8usize,
+        concat!("Alignment of ", stringify!(hb_ot_name_entry_t))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_ot_name_entry_t>())).name_id as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_name_entry_t),
+            "::",
+            stringify!(name_id)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_ot_name_entry_t>())).var as *const _ as usize },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_name_entry_t),
+            "::",
+            stringify!(var)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_ot_name_entry_t>())).language as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_name_entry_t),
+            "::",
+            stringify!(language)
+        )
+    );
+}
+extern "C" {
+    pub fn hb_ot_name_list_names(
+        face: *mut hb_face_t,
+        num_entries: *mut ::std::os::raw::c_uint,
+    ) -> *const hb_ot_name_entry_t;
+}
+extern "C" {
+    pub fn hb_ot_name_get_utf8(
+        face: *mut hb_face_t,
+        name_id: hb_ot_name_id_t,
+        language: hb_language_t,
+        text_size: *mut ::std::os::raw::c_uint,
+        text: *mut ::std::os::raw::c_char,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_name_get_utf16(
+        face: *mut hb_face_t,
+        name_id: hb_ot_name_id_t,
+        language: hb_language_t,
+        text_size: *mut ::std::os::raw::c_uint,
+        text: *mut u16,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_name_get_utf32(
+        face: *mut hb_face_t,
+        name_id: hb_ot_name_id_t,
+        language: hb_language_t,
+        text_size: *mut ::std::os::raw::c_uint,
+        text: *mut u32,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_color_has_palettes(face: *mut hb_face_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_color_palette_get_count(face: *mut hb_face_t) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_color_palette_get_name_id(
+        face: *mut hb_face_t,
+        palette_index: ::std::os::raw::c_uint,
+    ) -> hb_ot_name_id_t;
+}
+extern "C" {
+    pub fn hb_ot_color_palette_color_get_name_id(
+        face: *mut hb_face_t,
+        color_index: ::std::os::raw::c_uint,
+    ) -> hb_ot_name_id_t;
+}
+pub const HB_OT_COLOR_PALETTE_FLAG_DEFAULT: hb_ot_color_palette_flags_t = 0;
+pub const HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND: hb_ot_color_palette_flags_t = 1;
+pub const HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND: hb_ot_color_palette_flags_t = 2;
+/// hb_ot_color_palette_flags_t:
+/// @HB_OT_COLOR_PALETTE_FLAG_DEFAULT: default indicating that there is nothing special
+/// to note about a color palette.
+/// @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND: flag indicating that the color
+/// palette is appropriate to use when displaying the font on a light background such as white.
+/// @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND: flag indicating that the color
+/// palette is appropriate to use when displaying the font on a dark background such as black.
+///
+/// Since: 2.1.0
+pub type hb_ot_color_palette_flags_t = u32;
+extern "C" {
+    pub fn hb_ot_color_palette_get_flags(
+        face: *mut hb_face_t,
+        palette_index: ::std::os::raw::c_uint,
+    ) -> hb_ot_color_palette_flags_t;
+}
+extern "C" {
+    pub fn hb_ot_color_palette_get_colors(
+        face: *mut hb_face_t,
+        palette_index: ::std::os::raw::c_uint,
+        start_offset: ::std::os::raw::c_uint,
+        color_count: *mut ::std::os::raw::c_uint,
+        colors: *mut hb_color_t,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_color_has_layers(face: *mut hb_face_t) -> hb_bool_t;
+}
+/// hb_ot_color_layer_t:
+///
+/// Pairs of glyph and color index.
+///
+/// Since: 2.1.0
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_ot_color_layer_t {
+    pub glyph: hb_codepoint_t,
+    pub color_index: ::std::os::raw::c_uint,
+}
+#[test]
+fn bindgen_test_layout_hb_ot_color_layer_t() {
+    assert_eq!(
+        ::std::mem::size_of::<hb_ot_color_layer_t>(),
+        8usize,
+        concat!("Size of: ", stringify!(hb_ot_color_layer_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<hb_ot_color_layer_t>(),
+        4usize,
+        concat!("Alignment of ", stringify!(hb_ot_color_layer_t))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_ot_color_layer_t>())).glyph as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_color_layer_t),
+            "::",
+            stringify!(glyph)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_ot_color_layer_t>())).color_index as *const _ as usize },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_color_layer_t),
+            "::",
+            stringify!(color_index)
+        )
+    );
+}
+extern "C" {
+    pub fn hb_ot_color_glyph_get_layers(
+        face: *mut hb_face_t,
+        glyph: hb_codepoint_t,
+        start_offset: ::std::os::raw::c_uint,
+        count: *mut ::std::os::raw::c_uint,
+        layers: *mut hb_ot_color_layer_t,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_color_has_svg(face: *mut hb_face_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_color_glyph_reference_svg(
+        face: *mut hb_face_t,
+        glyph: hb_codepoint_t,
+    ) -> *mut hb_blob_t;
+}
+extern "C" {
+    pub fn hb_ot_color_has_png(face: *mut hb_face_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_color_glyph_reference_png(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+    ) -> *mut hb_blob_t;
+}
+extern "C" {
+    pub fn hb_ot_font_set_funcs(font: *mut hb_font_t);
+}
+extern "C" {
+    pub fn hb_ot_tags_from_script_and_language(
+        script: hb_script_t,
+        language: hb_language_t,
+        script_count: *mut ::std::os::raw::c_uint,
+        script_tags: *mut hb_tag_t,
+        language_count: *mut ::std::os::raw::c_uint,
+        language_tags: *mut hb_tag_t,
+    );
+}
+extern "C" {
+    pub fn hb_ot_tag_to_script(tag: hb_tag_t) -> hb_script_t;
+}
+extern "C" {
+    pub fn hb_ot_tag_to_language(tag: hb_tag_t) -> hb_language_t;
+}
+extern "C" {
+    pub fn hb_ot_tags_to_script_and_language(
+        script_tag: hb_tag_t,
+        language_tag: hb_tag_t,
+        script: *mut hb_script_t,
+        language: *mut hb_language_t,
+    );
+}
+extern "C" {
+    pub fn hb_ot_layout_has_glyph_classes(face: *mut hb_face_t) -> hb_bool_t;
+}
+pub const HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED: hb_ot_layout_glyph_class_t = 0;
+pub const HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH: hb_ot_layout_glyph_class_t = 1;
+pub const HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE: hb_ot_layout_glyph_class_t = 2;
+pub const HB_OT_LAYOUT_GLYPH_CLASS_MARK: hb_ot_layout_glyph_class_t = 3;
+pub const HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT: hb_ot_layout_glyph_class_t = 4;
+pub type hb_ot_layout_glyph_class_t = u32;
+extern "C" {
+    pub fn hb_ot_layout_get_glyph_class(
+        face: *mut hb_face_t,
+        glyph: hb_codepoint_t,
+    ) -> hb_ot_layout_glyph_class_t;
+}
+extern "C" {
+    pub fn hb_ot_layout_get_glyphs_in_class(
+        face: *mut hb_face_t,
+        klass: hb_ot_layout_glyph_class_t,
+        glyphs: *mut hb_set_t,
+    );
+}
+extern "C" {
+    pub fn hb_ot_layout_get_attach_points(
+        face: *mut hb_face_t,
+        glyph: hb_codepoint_t,
+        start_offset: ::std::os::raw::c_uint,
+        point_count: *mut ::std::os::raw::c_uint,
+        point_array: *mut ::std::os::raw::c_uint,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_layout_get_ligature_carets(
+        font: *mut hb_font_t,
+        direction: hb_direction_t,
+        glyph: hb_codepoint_t,
+        start_offset: ::std::os::raw::c_uint,
+        caret_count: *mut ::std::os::raw::c_uint,
+        caret_array: *mut hb_position_t,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_layout_table_get_script_tags(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        start_offset: ::std::os::raw::c_uint,
+        script_count: *mut ::std::os::raw::c_uint,
+        script_tags: *mut hb_tag_t,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_layout_table_find_script(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        script_tag: hb_tag_t,
+        script_index: *mut ::std::os::raw::c_uint,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_layout_table_select_script(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        script_count: ::std::os::raw::c_uint,
+        script_tags: *const hb_tag_t,
+        script_index: *mut ::std::os::raw::c_uint,
+        chosen_script: *mut hb_tag_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_layout_table_get_feature_tags(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        start_offset: ::std::os::raw::c_uint,
+        feature_count: *mut ::std::os::raw::c_uint,
+        feature_tags: *mut hb_tag_t,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_layout_script_get_language_tags(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        script_index: ::std::os::raw::c_uint,
+        start_offset: ::std::os::raw::c_uint,
+        language_count: *mut ::std::os::raw::c_uint,
+        language_tags: *mut hb_tag_t,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_layout_script_select_language(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        script_index: ::std::os::raw::c_uint,
+        language_count: ::std::os::raw::c_uint,
+        language_tags: *const hb_tag_t,
+        language_index: *mut ::std::os::raw::c_uint,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_layout_language_get_required_feature_index(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        script_index: ::std::os::raw::c_uint,
+        language_index: ::std::os::raw::c_uint,
+        feature_index: *mut ::std::os::raw::c_uint,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_layout_language_get_required_feature(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        script_index: ::std::os::raw::c_uint,
+        language_index: ::std::os::raw::c_uint,
+        feature_index: *mut ::std::os::raw::c_uint,
+        feature_tag: *mut hb_tag_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_layout_language_get_feature_indexes(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        script_index: ::std::os::raw::c_uint,
+        language_index: ::std::os::raw::c_uint,
+        start_offset: ::std::os::raw::c_uint,
+        feature_count: *mut ::std::os::raw::c_uint,
+        feature_indexes: *mut ::std::os::raw::c_uint,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_layout_language_get_feature_tags(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        script_index: ::std::os::raw::c_uint,
+        language_index: ::std::os::raw::c_uint,
+        start_offset: ::std::os::raw::c_uint,
+        feature_count: *mut ::std::os::raw::c_uint,
+        feature_tags: *mut hb_tag_t,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_layout_language_find_feature(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        script_index: ::std::os::raw::c_uint,
+        language_index: ::std::os::raw::c_uint,
+        feature_tag: hb_tag_t,
+        feature_index: *mut ::std::os::raw::c_uint,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_layout_feature_get_lookups(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        feature_index: ::std::os::raw::c_uint,
+        start_offset: ::std::os::raw::c_uint,
+        lookup_count: *mut ::std::os::raw::c_uint,
+        lookup_indexes: *mut ::std::os::raw::c_uint,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_layout_table_get_lookup_count(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_layout_collect_features(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        scripts: *const hb_tag_t,
+        languages: *const hb_tag_t,
+        features: *const hb_tag_t,
+        feature_indexes: *mut hb_set_t,
+    );
+}
+extern "C" {
+    pub fn hb_ot_layout_collect_lookups(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        scripts: *const hb_tag_t,
+        languages: *const hb_tag_t,
+        features: *const hb_tag_t,
+        lookup_indexes: *mut hb_set_t,
+    );
+}
+extern "C" {
+    pub fn hb_ot_layout_lookup_collect_glyphs(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        lookup_index: ::std::os::raw::c_uint,
+        glyphs_before: *mut hb_set_t,
+        glyphs_input: *mut hb_set_t,
+        glyphs_after: *mut hb_set_t,
+        glyphs_output: *mut hb_set_t,
+    );
+}
+extern "C" {
+    pub fn hb_ot_layout_table_find_feature_variations(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        coords: *const ::std::os::raw::c_int,
+        num_coords: ::std::os::raw::c_uint,
+        variations_index: *mut ::std::os::raw::c_uint,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_layout_feature_with_variations_get_lookups(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        feature_index: ::std::os::raw::c_uint,
+        variations_index: ::std::os::raw::c_uint,
+        start_offset: ::std::os::raw::c_uint,
+        lookup_count: *mut ::std::os::raw::c_uint,
+        lookup_indexes: *mut ::std::os::raw::c_uint,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_layout_has_substitution(face: *mut hb_face_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_layout_lookup_would_substitute(
+        face: *mut hb_face_t,
+        lookup_index: ::std::os::raw::c_uint,
+        glyphs: *const hb_codepoint_t,
+        glyphs_length: ::std::os::raw::c_uint,
+        zero_context: hb_bool_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_layout_lookup_substitute_closure(
+        face: *mut hb_face_t,
+        lookup_index: ::std::os::raw::c_uint,
+        glyphs: *mut hb_set_t,
+    );
+}
+extern "C" {
+    pub fn hb_ot_layout_lookups_substitute_closure(
+        face: *mut hb_face_t,
+        lookups: *const hb_set_t,
+        glyphs: *mut hb_set_t,
+    );
+}
+extern "C" {
+    pub fn hb_ot_layout_has_positioning(face: *mut hb_face_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_layout_get_size_params(
+        face: *mut hb_face_t,
+        design_size: *mut ::std::os::raw::c_uint,
+        subfamily_id: *mut ::std::os::raw::c_uint,
+        subfamily_name_id: *mut hb_ot_name_id_t,
+        range_start: *mut ::std::os::raw::c_uint,
+        range_end: *mut ::std::os::raw::c_uint,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_layout_feature_get_name_ids(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        feature_index: ::std::os::raw::c_uint,
+        label_id: *mut hb_ot_name_id_t,
+        tooltip_id: *mut hb_ot_name_id_t,
+        sample_id: *mut hb_ot_name_id_t,
+        num_named_parameters: *mut ::std::os::raw::c_uint,
+        first_param_id: *mut hb_ot_name_id_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_layout_feature_get_characters(
+        face: *mut hb_face_t,
+        table_tag: hb_tag_t,
+        feature_index: ::std::os::raw::c_uint,
+        start_offset: ::std::os::raw::c_uint,
+        char_count: *mut ::std::os::raw::c_uint,
+        characters: *mut hb_codepoint_t,
+    ) -> ::std::os::raw::c_uint;
+}
+pub const HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN: hb_ot_math_constant_t = 0;
+pub const HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN: hb_ot_math_constant_t = 1;
+pub const HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT: hb_ot_math_constant_t = 2;
+pub const HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT: hb_ot_math_constant_t = 3;
+pub const HB_OT_MATH_CONSTANT_MATH_LEADING: hb_ot_math_constant_t = 4;
+pub const HB_OT_MATH_CONSTANT_AXIS_HEIGHT: hb_ot_math_constant_t = 5;
+pub const HB_OT_MATH_CONSTANT_ACCENT_BASE_HEIGHT: hb_ot_math_constant_t = 6;
+pub const HB_OT_MATH_CONSTANT_FLATTENED_ACCENT_BASE_HEIGHT: hb_ot_math_constant_t = 7;
+pub const HB_OT_MATH_CONSTANT_SUBSCRIPT_SHIFT_DOWN: hb_ot_math_constant_t = 8;
+pub const HB_OT_MATH_CONSTANT_SUBSCRIPT_TOP_MAX: hb_ot_math_constant_t = 9;
+pub const HB_OT_MATH_CONSTANT_SUBSCRIPT_BASELINE_DROP_MIN: hb_ot_math_constant_t = 10;
+pub const HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP: hb_ot_math_constant_t = 11;
+pub const HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP_CRAMPED: hb_ot_math_constant_t = 12;
+pub const HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MIN: hb_ot_math_constant_t = 13;
+pub const HB_OT_MATH_CONSTANT_SUPERSCRIPT_BASELINE_DROP_MAX: hb_ot_math_constant_t = 14;
+pub const HB_OT_MATH_CONSTANT_SUB_SUPERSCRIPT_GAP_MIN: hb_ot_math_constant_t = 15;
+pub const HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MAX_WITH_SUBSCRIPT: hb_ot_math_constant_t = 16;
+pub const HB_OT_MATH_CONSTANT_SPACE_AFTER_SCRIPT: hb_ot_math_constant_t = 17;
+pub const HB_OT_MATH_CONSTANT_UPPER_LIMIT_GAP_MIN: hb_ot_math_constant_t = 18;
+pub const HB_OT_MATH_CONSTANT_UPPER_LIMIT_BASELINE_RISE_MIN: hb_ot_math_constant_t = 19;
+pub const HB_OT_MATH_CONSTANT_LOWER_LIMIT_GAP_MIN: hb_ot_math_constant_t = 20;
+pub const HB_OT_MATH_CONSTANT_LOWER_LIMIT_BASELINE_DROP_MIN: hb_ot_math_constant_t = 21;
+pub const HB_OT_MATH_CONSTANT_STACK_TOP_SHIFT_UP: hb_ot_math_constant_t = 22;
+pub const HB_OT_MATH_CONSTANT_STACK_TOP_DISPLAY_STYLE_SHIFT_UP: hb_ot_math_constant_t = 23;
+pub const HB_OT_MATH_CONSTANT_STACK_BOTTOM_SHIFT_DOWN: hb_ot_math_constant_t = 24;
+pub const HB_OT_MATH_CONSTANT_STACK_BOTTOM_DISPLAY_STYLE_SHIFT_DOWN: hb_ot_math_constant_t = 25;
+pub const HB_OT_MATH_CONSTANT_STACK_GAP_MIN: hb_ot_math_constant_t = 26;
+pub const HB_OT_MATH_CONSTANT_STACK_DISPLAY_STYLE_GAP_MIN: hb_ot_math_constant_t = 27;
+pub const HB_OT_MATH_CONSTANT_STRETCH_STACK_TOP_SHIFT_UP: hb_ot_math_constant_t = 28;
+pub const HB_OT_MATH_CONSTANT_STRETCH_STACK_BOTTOM_SHIFT_DOWN: hb_ot_math_constant_t = 29;
+pub const HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_ABOVE_MIN: hb_ot_math_constant_t = 30;
+pub const HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_BELOW_MIN: hb_ot_math_constant_t = 31;
+pub const HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_SHIFT_UP: hb_ot_math_constant_t = 32;
+pub const HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_DISPLAY_STYLE_SHIFT_UP: hb_ot_math_constant_t = 33;
+pub const HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_SHIFT_DOWN: hb_ot_math_constant_t = 34;
+pub const HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_DISPLAY_STYLE_SHIFT_DOWN: hb_ot_math_constant_t =
+    35;
+pub const HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_GAP_MIN: hb_ot_math_constant_t = 36;
+pub const HB_OT_MATH_CONSTANT_FRACTION_NUM_DISPLAY_STYLE_GAP_MIN: hb_ot_math_constant_t = 37;
+pub const HB_OT_MATH_CONSTANT_FRACTION_RULE_THICKNESS: hb_ot_math_constant_t = 38;
+pub const HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_GAP_MIN: hb_ot_math_constant_t = 39;
+pub const HB_OT_MATH_CONSTANT_FRACTION_DENOM_DISPLAY_STYLE_GAP_MIN: hb_ot_math_constant_t = 40;
+pub const HB_OT_MATH_CONSTANT_SKEWED_FRACTION_HORIZONTAL_GAP: hb_ot_math_constant_t = 41;
+pub const HB_OT_MATH_CONSTANT_SKEWED_FRACTION_VERTICAL_GAP: hb_ot_math_constant_t = 42;
+pub const HB_OT_MATH_CONSTANT_OVERBAR_VERTICAL_GAP: hb_ot_math_constant_t = 43;
+pub const HB_OT_MATH_CONSTANT_OVERBAR_RULE_THICKNESS: hb_ot_math_constant_t = 44;
+pub const HB_OT_MATH_CONSTANT_OVERBAR_EXTRA_ASCENDER: hb_ot_math_constant_t = 45;
+pub const HB_OT_MATH_CONSTANT_UNDERBAR_VERTICAL_GAP: hb_ot_math_constant_t = 46;
+pub const HB_OT_MATH_CONSTANT_UNDERBAR_RULE_THICKNESS: hb_ot_math_constant_t = 47;
+pub const HB_OT_MATH_CONSTANT_UNDERBAR_EXTRA_DESCENDER: hb_ot_math_constant_t = 48;
+pub const HB_OT_MATH_CONSTANT_RADICAL_VERTICAL_GAP: hb_ot_math_constant_t = 49;
+pub const HB_OT_MATH_CONSTANT_RADICAL_DISPLAY_STYLE_VERTICAL_GAP: hb_ot_math_constant_t = 50;
+pub const HB_OT_MATH_CONSTANT_RADICAL_RULE_THICKNESS: hb_ot_math_constant_t = 51;
+pub const HB_OT_MATH_CONSTANT_RADICAL_EXTRA_ASCENDER: hb_ot_math_constant_t = 52;
+pub const HB_OT_MATH_CONSTANT_RADICAL_KERN_BEFORE_DEGREE: hb_ot_math_constant_t = 53;
+pub const HB_OT_MATH_CONSTANT_RADICAL_KERN_AFTER_DEGREE: hb_ot_math_constant_t = 54;
+pub const HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT: hb_ot_math_constant_t = 55;
+/// hb_ot_math_constant_t:
+///
+/// Since: 1.3.3
+pub type hb_ot_math_constant_t = u32;
+pub const HB_OT_MATH_KERN_TOP_RIGHT: hb_ot_math_kern_t = 0;
+pub const HB_OT_MATH_KERN_TOP_LEFT: hb_ot_math_kern_t = 1;
+pub const HB_OT_MATH_KERN_BOTTOM_RIGHT: hb_ot_math_kern_t = 2;
+pub const HB_OT_MATH_KERN_BOTTOM_LEFT: hb_ot_math_kern_t = 3;
+/// hb_ot_math_kern_t:
+///
+/// Since: 1.3.3
+pub type hb_ot_math_kern_t = u32;
+/// hb_ot_math_glyph_variant_t:
+///
+/// Since: 1.3.3
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_ot_math_glyph_variant_t {
+    pub glyph: hb_codepoint_t,
+    pub advance: hb_position_t,
+}
+#[test]
+fn bindgen_test_layout_hb_ot_math_glyph_variant_t() {
+    assert_eq!(
+        ::std::mem::size_of::<hb_ot_math_glyph_variant_t>(),
+        8usize,
+        concat!("Size of: ", stringify!(hb_ot_math_glyph_variant_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<hb_ot_math_glyph_variant_t>(),
+        4usize,
+        concat!("Alignment of ", stringify!(hb_ot_math_glyph_variant_t))
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_ot_math_glyph_variant_t>())).glyph as *const _ as usize
+        },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_math_glyph_variant_t),
+            "::",
+            stringify!(glyph)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_ot_math_glyph_variant_t>())).advance as *const _ as usize
+        },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_math_glyph_variant_t),
+            "::",
+            stringify!(advance)
+        )
+    );
+}
+pub const HB_MATH_GLYPH_PART_FLAG_EXTENDER: hb_ot_math_glyph_part_flags_t = 1;
+/// hb_ot_math_glyph_part_flags_t:
+///
+/// Since: 1.3.3
+pub type hb_ot_math_glyph_part_flags_t = u32;
+/// hb_ot_math_glyph_part_t:
+///
+/// Since: 1.3.3
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_ot_math_glyph_part_t {
+    pub glyph: hb_codepoint_t,
+    pub start_connector_length: hb_position_t,
+    pub end_connector_length: hb_position_t,
+    pub full_advance: hb_position_t,
+    pub flags: hb_ot_math_glyph_part_flags_t,
+}
+#[test]
+fn bindgen_test_layout_hb_ot_math_glyph_part_t() {
+    assert_eq!(
+        ::std::mem::size_of::<hb_ot_math_glyph_part_t>(),
+        20usize,
+        concat!("Size of: ", stringify!(hb_ot_math_glyph_part_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<hb_ot_math_glyph_part_t>(),
+        4usize,
+        concat!("Alignment of ", stringify!(hb_ot_math_glyph_part_t))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_ot_math_glyph_part_t>())).glyph as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_math_glyph_part_t),
+            "::",
+            stringify!(glyph)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_ot_math_glyph_part_t>())).start_connector_length as *const _
+                as usize
+        },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_math_glyph_part_t),
+            "::",
+            stringify!(start_connector_length)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_ot_math_glyph_part_t>())).end_connector_length as *const _
+                as usize
+        },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_math_glyph_part_t),
+            "::",
+            stringify!(end_connector_length)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_ot_math_glyph_part_t>())).full_advance as *const _ as usize
+        },
+        12usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_math_glyph_part_t),
+            "::",
+            stringify!(full_advance)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_ot_math_glyph_part_t>())).flags as *const _ as usize },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_math_glyph_part_t),
+            "::",
+            stringify!(flags)
+        )
+    );
+}
+extern "C" {
+    pub fn hb_ot_math_has_data(face: *mut hb_face_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_math_get_constant(
+        font: *mut hb_font_t,
+        constant: hb_ot_math_constant_t,
+    ) -> hb_position_t;
+}
+extern "C" {
+    pub fn hb_ot_math_get_glyph_italics_correction(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+    ) -> hb_position_t;
+}
+extern "C" {
+    pub fn hb_ot_math_get_glyph_top_accent_attachment(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+    ) -> hb_position_t;
+}
+extern "C" {
+    pub fn hb_ot_math_is_glyph_extended_shape(
+        face: *mut hb_face_t,
+        glyph: hb_codepoint_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_math_get_glyph_kerning(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        kern: hb_ot_math_kern_t,
+        correction_height: hb_position_t,
+    ) -> hb_position_t;
+}
+extern "C" {
+    pub fn hb_ot_math_get_glyph_variants(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        direction: hb_direction_t,
+        start_offset: ::std::os::raw::c_uint,
+        variants_count: *mut ::std::os::raw::c_uint,
+        variants: *mut hb_ot_math_glyph_variant_t,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_math_get_min_connector_overlap(
+        font: *mut hb_font_t,
+        direction: hb_direction_t,
+    ) -> hb_position_t;
+}
+extern "C" {
+    pub fn hb_ot_math_get_glyph_assembly(
+        font: *mut hb_font_t,
+        glyph: hb_codepoint_t,
+        direction: hb_direction_t,
+        start_offset: ::std::os::raw::c_uint,
+        parts_count: *mut ::std::os::raw::c_uint,
+        parts: *mut hb_ot_math_glyph_part_t,
+        italics_correction: *mut hb_position_t,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_shape_glyphs_closure(
+        font: *mut hb_font_t,
+        buffer: *mut hb_buffer_t,
+        features: *const hb_feature_t,
+        num_features: ::std::os::raw::c_uint,
+        glyphs: *mut hb_set_t,
+    );
+}
+extern "C" {
+    pub fn hb_ot_shape_plan_collect_lookups(
+        shape_plan: *mut hb_shape_plan_t,
+        table_tag: hb_tag_t,
+        lookup_indexes: *mut hb_set_t,
+    );
+}
+extern "C" {
+    pub fn hb_ot_var_has_data(face: *mut hb_face_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_var_get_axis_count(face: *mut hb_face_t) -> ::std::os::raw::c_uint;
+}
+pub const HB_OT_VAR_AXIS_FLAG_HIDDEN: hb_ot_var_axis_flags_t = 1;
+pub const _HB_OT_VAR_AXIS_FLAG_MAX_VALUE: hb_ot_var_axis_flags_t = 2147483647;
+/// hb_ot_var_axis_flags_t:
+/// @HB_OT_VAR_AXIS_FLAG_HIDDEN: The axis should not be exposed directly in user interfaces.
+///
+/// Since: 2.2.0
+pub type hb_ot_var_axis_flags_t = u32;
+/// hb_ot_var_axis_info_t:
+///
+/// Since: 2.2.0
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_ot_var_axis_info_t {
+    pub axis_index: ::std::os::raw::c_uint,
+    pub tag: hb_tag_t,
+    pub name_id: hb_ot_name_id_t,
+    pub flags: hb_ot_var_axis_flags_t,
+    pub min_value: f32,
+    pub default_value: f32,
+    pub max_value: f32,
+    pub reserved: ::std::os::raw::c_uint,
+}
+#[test]
+fn bindgen_test_layout_hb_ot_var_axis_info_t() {
+    assert_eq!(
+        ::std::mem::size_of::<hb_ot_var_axis_info_t>(),
+        32usize,
+        concat!("Size of: ", stringify!(hb_ot_var_axis_info_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<hb_ot_var_axis_info_t>(),
+        4usize,
+        concat!("Alignment of ", stringify!(hb_ot_var_axis_info_t))
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_ot_var_axis_info_t>())).axis_index as *const _ as usize
+        },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_var_axis_info_t),
+            "::",
+            stringify!(axis_index)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_ot_var_axis_info_t>())).tag as *const _ as usize },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_var_axis_info_t),
+            "::",
+            stringify!(tag)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_ot_var_axis_info_t>())).name_id as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_var_axis_info_t),
+            "::",
+            stringify!(name_id)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_ot_var_axis_info_t>())).flags as *const _ as usize },
+        12usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_var_axis_info_t),
+            "::",
+            stringify!(flags)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_ot_var_axis_info_t>())).min_value as *const _ as usize },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_var_axis_info_t),
+            "::",
+            stringify!(min_value)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_ot_var_axis_info_t>())).default_value as *const _ as usize
+        },
+        20usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_var_axis_info_t),
+            "::",
+            stringify!(default_value)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_ot_var_axis_info_t>())).max_value as *const _ as usize },
+        24usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_var_axis_info_t),
+            "::",
+            stringify!(max_value)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<hb_ot_var_axis_info_t>())).reserved as *const _ as usize },
+        28usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_ot_var_axis_info_t),
+            "::",
+            stringify!(reserved)
+        )
+    );
+}
+extern "C" {
+    pub fn hb_ot_var_get_axis_infos(
+        face: *mut hb_face_t,
+        start_offset: ::std::os::raw::c_uint,
+        axes_count: *mut ::std::os::raw::c_uint,
+        axes_array: *mut hb_ot_var_axis_info_t,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_var_find_axis_info(
+        face: *mut hb_face_t,
+        axis_tag: hb_tag_t,
+        axis_info: *mut hb_ot_var_axis_info_t,
+    ) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_ot_var_get_named_instance_count(face: *mut hb_face_t) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_var_named_instance_get_subfamily_name_id(
+        face: *mut hb_face_t,
+        instance_index: ::std::os::raw::c_uint,
+    ) -> hb_ot_name_id_t;
+}
+extern "C" {
+    pub fn hb_ot_var_named_instance_get_postscript_name_id(
+        face: *mut hb_face_t,
+        instance_index: ::std::os::raw::c_uint,
+    ) -> hb_ot_name_id_t;
+}
+extern "C" {
+    pub fn hb_ot_var_named_instance_get_design_coords(
+        face: *mut hb_face_t,
+        instance_index: ::std::os::raw::c_uint,
+        coords_length: *mut ::std::os::raw::c_uint,
+        coords: *mut f32,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_ot_var_normalize_variations(
+        face: *mut hb_face_t,
+        variations: *const hb_variation_t,
+        variations_length: ::std::os::raw::c_uint,
+        coords: *mut ::std::os::raw::c_int,
+        coords_length: ::std::os::raw::c_uint,
+    );
+}
+extern "C" {
+    pub fn hb_ot_var_normalize_coords(
+        face: *mut hb_face_t,
+        coords_length: ::std::os::raw::c_uint,
+        design_coords: *const f32,
+        normalized_coords: *mut ::std::os::raw::c_int,
+    );
+}
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_INVALID: hb_aat_layout_feature_type_t = 65535;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC: hb_aat_layout_feature_type_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES: hb_aat_layout_feature_type_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION: hb_aat_layout_feature_type_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE: hb_aat_layout_feature_type_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION: hb_aat_layout_feature_type_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT: hb_aat_layout_feature_type_t = 5;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING: hb_aat_layout_feature_type_t = 6;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE: hb_aat_layout_feature_type_t = 8;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE: hb_aat_layout_feature_type_t = 9;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION: hb_aat_layout_feature_type_t = 10;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS: hb_aat_layout_feature_type_t = 11;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE: hb_aat_layout_feature_type_t = 13;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS: hb_aat_layout_feature_type_t = 14;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS: hb_aat_layout_feature_type_t = 15;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE: hb_aat_layout_feature_type_t = 16;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES: hb_aat_layout_feature_type_t = 17;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE: hb_aat_layout_feature_type_t = 18;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS: hb_aat_layout_feature_type_t = 19;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE: hb_aat_layout_feature_type_t = 20;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE: hb_aat_layout_feature_type_t = 21;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING: hb_aat_layout_feature_type_t = 22;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION: hb_aat_layout_feature_type_t = 23;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE: hb_aat_layout_feature_type_t = 24;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE: hb_aat_layout_feature_type_t = 25;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE: hb_aat_layout_feature_type_t = 26;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE: hb_aat_layout_feature_type_t = 27;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA: hb_aat_layout_feature_type_t = 28;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE: hb_aat_layout_feature_type_t =
+    29;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE: hb_aat_layout_feature_type_t =
+    30;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE:
+    hb_aat_layout_feature_type_t = 31;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN: hb_aat_layout_feature_type_t = 32;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT: hb_aat_layout_feature_type_t = 33;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA: hb_aat_layout_feature_type_t = 34;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES: hb_aat_layout_feature_type_t = 35;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES: hb_aat_layout_feature_type_t = 36;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE: hb_aat_layout_feature_type_t = 37;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE: hb_aat_layout_feature_type_t = 38;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE: hb_aat_layout_feature_type_t = 39;
+pub const HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE: hb_aat_layout_feature_type_t = 103;
+pub const _HB_AAT_LAYOUT_FEATURE_TYPE_MAX_VALUE: hb_aat_layout_feature_type_t = 2147483647;
+/// hb_aat_layout_feature_type_t:
+///
+///
+/// Since: 2.2.0
+pub type hb_aat_layout_feature_type_t = u32;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID: hb_aat_layout_feature_selector_t = 65535;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_ON: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_OFF: hb_aat_layout_feature_selector_t =
+    1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_ON: hb_aat_layout_feature_selector_t =
+    0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_OFF: hb_aat_layout_feature_selector_t =
+    1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF: hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON: hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF: hb_aat_layout_feature_selector_t = 5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_ON: hb_aat_layout_feature_selector_t = 6;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_OFF: hb_aat_layout_feature_selector_t = 7;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_ON: hb_aat_layout_feature_selector_t = 8;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_OFF: hb_aat_layout_feature_selector_t = 9;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_ON: hb_aat_layout_feature_selector_t =
+    10;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_OFF: hb_aat_layout_feature_selector_t =
+    11;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_ON: hb_aat_layout_feature_selector_t =
+    12;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_OFF: hb_aat_layout_feature_selector_t =
+    13;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_ON:
+    hb_aat_layout_feature_selector_t = 14;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_OFF:
+    hb_aat_layout_feature_selector_t = 15;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_ON: hb_aat_layout_feature_selector_t = 16;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_OFF: hb_aat_layout_feature_selector_t =
+    17;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON: hb_aat_layout_feature_selector_t =
+    18;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF:
+    hb_aat_layout_feature_selector_t = 19;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON: hb_aat_layout_feature_selector_t =
+    20;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF:
+    hb_aat_layout_feature_selector_t = 21;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_UNCONNECTED: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_PARTIALLY_CONNECTED: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CURSIVE: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_AND_LOWER_CASE: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_CAPS: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_LOWER_CASE: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS: hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS: hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS_AND_SMALL_CAPS:
+    hb_aat_layout_feature_selector_t = 5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON:
+    hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF:
+    hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_ON:
+    hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_OFF:
+    hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_NUMBERS: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_NUMBERS: hb_aat_layout_feature_selector_t =
+    3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_ON: hb_aat_layout_feature_selector_t =
+    0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_OFF:
+    hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_ON: hb_aat_layout_feature_selector_t =
+    2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_OFF: hb_aat_layout_feature_selector_t =
+    3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_ON: hb_aat_layout_feature_selector_t =
+    4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_OFF:
+    hb_aat_layout_feature_selector_t = 5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_ON: hb_aat_layout_feature_selector_t =
+    6;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_OFF: hb_aat_layout_feature_selector_t =
+    7;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_ON: hb_aat_layout_feature_selector_t = 8;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_OFF: hb_aat_layout_feature_selector_t =
+    9;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SHOW_DIACRITICS: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HIDE_DIACRITICS: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DECOMPOSE_DIACRITICS: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS: hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS: hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_ON: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_OFF: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_ON: hb_aat_layout_feature_selector_t =
+    0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_OFF: hb_aat_layout_feature_selector_t =
+    1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_ON: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_OFF: hb_aat_layout_feature_selector_t =
+    3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON: hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF: hb_aat_layout_feature_selector_t = 5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_ON: hb_aat_layout_feature_selector_t = 6;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_OFF: hb_aat_layout_feature_selector_t = 7;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_ON: hb_aat_layout_feature_selector_t = 8;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_OFF: hb_aat_layout_feature_selector_t = 9;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_ON: hb_aat_layout_feature_selector_t =
+    10;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_OFF: hb_aat_layout_feature_selector_t =
+    11;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_ON: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_OFF: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_ON: hb_aat_layout_feature_selector_t =
+    2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_OFF:
+    hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_ON: hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_OFF: hb_aat_layout_feature_selector_t = 5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_ON: hb_aat_layout_feature_selector_t =
+    6;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_OFF:
+    hb_aat_layout_feature_selector_t = 7;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_ON: hb_aat_layout_feature_selector_t = 8;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_OFF: hb_aat_layout_feature_selector_t = 9;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON: hb_aat_layout_feature_selector_t =
+    10;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF: hb_aat_layout_feature_selector_t =
+    11;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ORNAMENTS: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DINGBATS: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_PI_CHARACTERS: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_FLEURONS: hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DECORATIVE_BORDERS: hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_INTERNATIONAL_SYMBOLS: hb_aat_layout_feature_selector_t =
+    5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_MATH_SYMBOLS: hb_aat_layout_feature_selector_t = 6;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ALTERNATES: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL1: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL2: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL3: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL4: hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL5: hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DISPLAY_TEXT: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ENGRAVED_TEXT: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ILLUMINATED_CAPS: hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS: hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_TALL_CAPS: hb_aat_layout_feature_selector_t = 5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS: hb_aat_layout_feature_selector_t =
+    0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS: hb_aat_layout_feature_selector_t =
+    1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS: hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS: hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_ONE: hb_aat_layout_feature_selector_t = 5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_TWO: hb_aat_layout_feature_selector_t = 6;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_THREE: hb_aat_layout_feature_selector_t =
+    7;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FOUR: hb_aat_layout_feature_selector_t = 8;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FIVE: hb_aat_layout_feature_selector_t = 9;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS: hb_aat_layout_feature_selector_t = 10;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS: hb_aat_layout_feature_selector_t = 11;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS: hb_aat_layout_feature_selector_t = 12;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS: hb_aat_layout_feature_selector_t = 13;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS:
+    hb_aat_layout_feature_selector_t = 14;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT: hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT: hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT: hb_aat_layout_feature_selector_t =
+    5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT: hb_aat_layout_feature_selector_t = 6;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HIRAGANA_TO_KATAKANA: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_KATAKANA_TO_HIRAGANA: hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_KANA_TO_ROMANIZATION: hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_HIRAGANA:
+    hb_aat_layout_feature_selector_t = 5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_KATAKANA:
+    hb_aat_layout_feature_selector_t = 6;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_ONE: hb_aat_layout_feature_selector_t =
+    7;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_TWO: hb_aat_layout_feature_selector_t =
+    8;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_THREE:
+    hb_aat_layout_feature_selector_t = 9;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ANNOTATION: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_BOX_ANNOTATION: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ROUNDED_BOX_ANNOTATION: hb_aat_layout_feature_selector_t =
+    2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CIRCLE_ANNOTATION: hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_CIRCLE_ANNOTATION:
+    hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_PARENTHESIS_ANNOTATION: hb_aat_layout_feature_selector_t =
+    5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIOD_ANNOTATION: hb_aat_layout_feature_selector_t = 6;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMAN_NUMERAL_ANNOTATION:
+    hb_aat_layout_feature_selector_t = 7;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAMOND_ANNOTATION: hb_aat_layout_feature_selector_t = 8;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_BOX_ANNOTATION: hb_aat_layout_feature_selector_t =
+    9;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_ROUNDED_BOX_ANNOTATION:
+    hb_aat_layout_feature_selector_t = 10;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_KANA: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_KANA: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_IDEOGRAPHS: hb_aat_layout_feature_selector_t =
+    0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_IDEOGRAPHS: hb_aat_layout_feature_selector_t =
+    1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_IDEOGRAPHS: hb_aat_layout_feature_selector_t =
+    2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_ON:
+    hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_OFF:
+    hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_ON:
+    hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_OFF:
+    hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_ON:
+    hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_OFF:
+    hb_aat_layout_feature_selector_t = 5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_RUBY_KANA: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF: hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_SYMBOL_ALTERNATIVES:
+    hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_ONE: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_TWO: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_THREE: hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FOUR: hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FIVE: hb_aat_layout_feature_selector_t = 5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_IDEOGRAPHIC_ALTERNATIVES:
+    hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_ONE: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_TWO: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_THREE: hb_aat_layout_feature_selector_t =
+    3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FOUR: hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FIVE: hb_aat_layout_feature_selector_t = 5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_CENTERED:
+    hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_HBASELINE:
+    hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_ITALIC_ROMAN: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN: hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF: hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON:
+    hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF:
+    hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON:
+    hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF:
+    hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON: hb_aat_layout_feature_selector_t =
+    0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF:
+    hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON: hb_aat_layout_feature_selector_t =
+    2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF: hb_aat_layout_feature_selector_t =
+    3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLISTIC_ALTERNATES: hb_aat_layout_feature_selector_t =
+    0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF: hb_aat_layout_feature_selector_t =
+    3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON: hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF: hb_aat_layout_feature_selector_t =
+    5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON: hb_aat_layout_feature_selector_t =
+    6;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF: hb_aat_layout_feature_selector_t =
+    7;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON: hb_aat_layout_feature_selector_t =
+    8;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF: hb_aat_layout_feature_selector_t =
+    9;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON: hb_aat_layout_feature_selector_t =
+    10;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF: hb_aat_layout_feature_selector_t =
+    11;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON: hb_aat_layout_feature_selector_t =
+    12;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF: hb_aat_layout_feature_selector_t =
+    13;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON: hb_aat_layout_feature_selector_t =
+    14;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF: hb_aat_layout_feature_selector_t =
+    15;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON: hb_aat_layout_feature_selector_t =
+    16;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF: hb_aat_layout_feature_selector_t =
+    17;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON: hb_aat_layout_feature_selector_t =
+    18;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF: hb_aat_layout_feature_selector_t =
+    19;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON: hb_aat_layout_feature_selector_t =
+    20;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF: hb_aat_layout_feature_selector_t =
+    21;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON: hb_aat_layout_feature_selector_t =
+    22;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF:
+    hb_aat_layout_feature_selector_t = 23;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON: hb_aat_layout_feature_selector_t =
+    24;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF:
+    hb_aat_layout_feature_selector_t = 25;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON:
+    hb_aat_layout_feature_selector_t = 26;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF:
+    hb_aat_layout_feature_selector_t = 27;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON:
+    hb_aat_layout_feature_selector_t = 28;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF:
+    hb_aat_layout_feature_selector_t = 29;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON:
+    hb_aat_layout_feature_selector_t = 30;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF:
+    hb_aat_layout_feature_selector_t = 31;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON:
+    hb_aat_layout_feature_selector_t = 32;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF:
+    hb_aat_layout_feature_selector_t = 33;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON:
+    hb_aat_layout_feature_selector_t = 34;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF:
+    hb_aat_layout_feature_selector_t = 35;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON:
+    hb_aat_layout_feature_selector_t = 36;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF:
+    hb_aat_layout_feature_selector_t = 37;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON:
+    hb_aat_layout_feature_selector_t = 38;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF:
+    hb_aat_layout_feature_selector_t = 39;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON: hb_aat_layout_feature_selector_t =
+    40;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF:
+    hb_aat_layout_feature_selector_t = 41;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON:
+    hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF:
+    hb_aat_layout_feature_selector_t = 1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF: hb_aat_layout_feature_selector_t = 3;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON:
+    hb_aat_layout_feature_selector_t = 4;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF:
+    hb_aat_layout_feature_selector_t = 5;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS: hb_aat_layout_feature_selector_t =
+    1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS: hb_aat_layout_feature_selector_t =
+    2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS: hb_aat_layout_feature_selector_t =
+    1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS: hb_aat_layout_feature_selector_t =
+    2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_CJK_ROMAN: hb_aat_layout_feature_selector_t = 0;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_CJK_ROMAN: hb_aat_layout_feature_selector_t =
+    1;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN: hb_aat_layout_feature_selector_t = 2;
+pub const HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN: hb_aat_layout_feature_selector_t = 3;
+pub const _HB_AAT_LAYOUT_FEATURE_SELECTOR_MAX_VALUE: hb_aat_layout_feature_selector_t = 2147483647;
+/// hb_aat_layout_feature_selector_t:
+///
+///
+/// Since: 2.2.0
+pub type hb_aat_layout_feature_selector_t = u32;
+extern "C" {
+    pub fn hb_aat_layout_get_feature_types(
+        face: *mut hb_face_t,
+        start_offset: ::std::os::raw::c_uint,
+        feature_count: *mut ::std::os::raw::c_uint,
+        features: *mut hb_aat_layout_feature_type_t,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_aat_layout_feature_type_get_name_id(
+        face: *mut hb_face_t,
+        feature_type: hb_aat_layout_feature_type_t,
+    ) -> hb_ot_name_id_t;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hb_aat_layout_feature_selector_info_t {
+    pub name_id: hb_ot_name_id_t,
+    pub enable: hb_aat_layout_feature_selector_t,
+    pub disable: hb_aat_layout_feature_selector_t,
+    pub reserved: ::std::os::raw::c_uint,
+}
+#[test]
+fn bindgen_test_layout_hb_aat_layout_feature_selector_info_t() {
+    assert_eq!(
+        ::std::mem::size_of::<hb_aat_layout_feature_selector_info_t>(),
+        16usize,
+        concat!(
+            "Size of: ",
+            stringify!(hb_aat_layout_feature_selector_info_t)
+        )
+    );
+    assert_eq!(
+        ::std::mem::align_of::<hb_aat_layout_feature_selector_info_t>(),
+        4usize,
+        concat!(
+            "Alignment of ",
+            stringify!(hb_aat_layout_feature_selector_info_t)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_aat_layout_feature_selector_info_t>())).name_id as *const _
+                as usize
+        },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_aat_layout_feature_selector_info_t),
+            "::",
+            stringify!(name_id)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_aat_layout_feature_selector_info_t>())).enable as *const _
+                as usize
+        },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_aat_layout_feature_selector_info_t),
+            "::",
+            stringify!(enable)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_aat_layout_feature_selector_info_t>())).disable as *const _
+                as usize
+        },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_aat_layout_feature_selector_info_t),
+            "::",
+            stringify!(disable)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<hb_aat_layout_feature_selector_info_t>())).reserved as *const _
+                as usize
+        },
+        12usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(hb_aat_layout_feature_selector_info_t),
+            "::",
+            stringify!(reserved)
+        )
+    );
+}
+extern "C" {
+    pub fn hb_aat_layout_feature_type_get_selector_infos(
+        face: *mut hb_face_t,
+        feature_type: hb_aat_layout_feature_type_t,
+        start_offset: ::std::os::raw::c_uint,
+        selector_count: *mut ::std::os::raw::c_uint,
+        selectors: *mut hb_aat_layout_feature_selector_info_t,
+        default_index: *mut ::std::os::raw::c_uint,
+    ) -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    pub fn hb_aat_layout_has_substitution(face: *mut hb_face_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_aat_layout_has_positioning(face: *mut hb_face_t) -> hb_bool_t;
+}
+extern "C" {
+    pub fn hb_aat_layout_has_tracking(face: *mut hb_face_t) -> hb_bool_t;
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz/.cargo-checksum.json b/third_party/rust_crates/vendor/harfbuzz/.cargo-checksum.json
new file mode 100644
index 0000000..ce3fd92
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"Cargo.toml":"944b8e399480403324af40b99b7b43c92619490d4b501703091cc06bd7b19d1c","src/blob.rs":"39cbd64046cfbdcb3d50122a80dea431b52775063654a6e8d1b5ced49f8aeada","src/buffer.rs":"8940e3932fbffa6fab3f7ff640a63e3a1695ff423fddaa8507c28ec1c1085d29","src/direction.rs":"e71b632d6044d4810b5779dcf275bc2180200ae35d4b623b343c556f2d190ed7","src/language.rs":"c892e23a4ff5e9cc4f2ef19ba525cdb6008e17b33df447357b90d105f8d7e16d","src/lib.rs":"802e6a9c1ce4983e8395795b40dbb013bd96c9770c77fdad3cb3f0c491e9922d"},"package":"46f7426266a5ece3e49eae6f48e602c0f8c39917354a847eac9c06437dcde8da"}
\ No newline at end of file
diff --git a/third_party/rust_crates/vendor/harfbuzz/Cargo.toml b/third_party/rust_crates/vendor/harfbuzz/Cargo.toml
new file mode 100644
index 0000000..bf628f8
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz/Cargo.toml
@@ -0,0 +1,29 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "harfbuzz"
+version = "0.3.1"
+authors = ["The Servo Project Developers"]
+description = "Rust bindings to the HarfBuzz text shaping engine"
+documentation = "https://docs.rs/harfbuzz/"
+keywords = ["opentype", "font", "text", "layout", "unicode"]
+license = "MIT / Apache-2.0"
+repository = "https://github.com/servo/rust-harfbuzz"
+[dependencies.harfbuzz-sys]
+version = "0.3.1"
+default-features = false
+
+[features]
+build-native-freetype = ["harfbuzz-sys/build-native-freetype"]
+build-native-harfbuzz = ["harfbuzz-sys/build-native-harfbuzz"]
+default = ["build-native-harfbuzz", "build-native-freetype"]
diff --git a/third_party/rust_crates/vendor/harfbuzz/LICENSE b/third_party/rust_crates/vendor/harfbuzz/LICENSE
new file mode 100644
index 0000000..916d2b6
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz/LICENSE
@@ -0,0 +1,231 @@
+https://raw.githubusercontent.com/servo/rust-harfbuzz/master/LICENSE-APACHE:
+
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+========================================
+https://raw.githubusercontent.com/servo/rust-harfbuzz/master/LICENSE-MIT:
+
+Copyright (c) 2012-2013 Mozilla Foundation
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/third_party/rust_crates/vendor/harfbuzz/src/blob.rs b/third_party/rust_crates/vendor/harfbuzz/src/blob.rs
new file mode 100644
index 0000000..05cf025
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz/src/blob.rs
@@ -0,0 +1,159 @@
+// Copyright 2018 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::marker::PhantomData;
+use std::os::raw::{c_char, c_uint, c_void};
+use std::sync::Arc;
+use std::{mem, ops, ptr, slice};
+use sys;
+
+/// Blobs wrap a chunk of binary data to handle lifecycle management of data
+/// while it is passed between client and HarfBuzz.
+///
+/// Blobs are primarily used to create font faces, but also to access font face
+/// tables, as well as pass around other binary data.
+pub struct Blob<'a> {
+    raw: *mut sys::hb_blob_t,
+    phantom: PhantomData<&'a [u8]>,
+}
+
+impl<'a> Blob<'a> {
+    /// Create a new read-only blob.
+    ///
+    /// The data is not copied, so it must outlive the
+    /// `Blob`.
+    ///
+    /// ```
+    /// # use harfbuzz::Blob;
+    /// let data = vec![1; 256];
+    /// let blob = Blob::new_read_only(&data);
+    /// assert_eq!(blob.len(), 256);
+    /// assert!(!blob.is_empty());
+    /// ```
+    pub fn new_read_only(data: &'a [u8]) -> Blob<'a> {
+        assert!(data.len() <= c_uint::max_value() as usize);
+        unsafe {
+            Blob::from_raw(sys::hb_blob_create(
+                data.as_ptr() as *const c_char,
+                data.len() as c_uint,
+                sys::HB_MEMORY_MODE_READONLY,
+                ptr::null_mut(), // user data
+                None, // destroy callback
+            ))
+        }
+    }
+
+    /// Create a blob wrapping an `Arc<Vec<u8>>`.
+    ///
+    /// This method allows creation of a blob without copying, where the
+    /// data may be shared by Rust code and the blob. The `Vec` is freed
+    /// when all references are dropped.
+    ///
+    /// ```
+    /// # use std::sync::Arc;
+    /// # use harfbuzz::Blob;
+    /// let data = vec![1; 256];
+    /// let blob = Blob::new_from_arc_vec(Arc::new(data));
+    /// assert_eq!(blob.len(), 256);
+    /// assert!(!blob.is_empty());
+    /// ```
+    pub fn new_from_arc_vec(data: Arc<Vec<u8>>) -> Blob<'static> {
+        let len = data.len();
+        assert!(len <= c_uint::max_value() as usize);
+        unsafe {
+            let data_ptr = data.as_ptr();
+            let ptr = Arc::into_raw(data);
+
+            // This has type hb_destroy_func_t
+            unsafe extern "C" fn arc_vec_blob_destroy(user_data: *mut c_void) {
+                drop(Arc::from_raw(user_data as *const Vec<u8>))
+            }
+
+            let hb_blob = sys::hb_blob_create(
+                data_ptr as *const c_char,
+                len as c_uint,
+                sys::HB_MEMORY_MODE_READONLY,
+                ptr as *mut c_void,
+                Some(arc_vec_blob_destroy),
+            );
+            Blob::from_raw(hb_blob)
+        }
+    }
+
+    /// Construct a `Blob` from a raw pointer. Takes ownership of the blob.
+    pub unsafe fn from_raw(raw: *mut sys::hb_blob_t) -> Self {
+        Blob {
+            raw,
+            phantom: PhantomData,
+        }
+    }
+
+    /// Returns the size of the blob in bytes.
+    pub fn len(&self) -> usize {
+        unsafe { sys::hb_blob_get_length(self.raw) as usize }
+    }
+
+    /// Returns true if the length is zero.
+    pub fn is_empty(&self) -> bool {
+        self.len() == 0
+    }
+
+    /// Make this blob immutable.
+    pub fn make_immutable(&mut self) {
+        unsafe { sys::hb_blob_make_immutable(self.raw); }
+    }
+
+    /// Returns true if the blob is immutable.
+    pub fn is_immutable(&self) -> bool {
+        unsafe { sys::hb_blob_is_immutable(self.raw) != 0 }
+    }
+
+    /// Borrows a raw pointer to the blob.
+    pub fn as_raw(&self) -> *mut sys::hb_blob_t {
+        self.raw
+    }
+
+    /// Gives up ownership and returns a raw pointer to the blob.
+    pub fn into_raw(self) -> *mut sys::hb_blob_t {
+        let raw = self.raw;
+        mem::forget(self);
+        raw
+    }
+}
+
+impl<'a> ops::Deref for Blob<'a> {
+    type Target = [u8];
+
+    fn deref(&self) -> &[u8] {
+        unsafe {
+            let mut len = 0;
+            let ptr = sys::hb_blob_get_data(self.raw, &mut len);
+            assert!(!ptr.is_null(), "hb_blob_get_data failed");
+            slice::from_raw_parts(ptr as *const u8, len as usize)
+        }
+    }
+}
+
+impl<'a> ops::DerefMut for Blob<'a> {
+    fn deref_mut(&mut self) -> &mut [u8] {
+        unsafe {
+            let mut len = 0;
+            let ptr = sys::hb_blob_get_data_writable(self.raw, &mut len);
+            assert!(!ptr.is_null(), "hb_blob_get_data_writable failed");
+            slice::from_raw_parts_mut(ptr as *mut u8, len as usize)
+        }
+    }
+}
+
+impl<'a> Drop for Blob<'a> {
+    /// Decrement the reference count, and destroy the blob if the reference count is zero.
+    fn drop(&mut self) {
+        unsafe { sys::hb_blob_destroy(self.raw); }
+    }
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz/src/buffer.rs b/third_party/rust_crates/vendor/harfbuzz/src/buffer.rs
new file mode 100644
index 0000000..12c1965
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz/src/buffer.rs
@@ -0,0 +1,326 @@
+// Copyright 2018 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std;
+use sys;
+
+use {Direction, Language};
+
+/// A series of Unicode characters.
+///
+/// ## Adding Text
+///
+/// Since in Rust, a value of type `&str` must contain valid UTF-8
+/// text, adding text to a `Buffer` is simple:
+///
+/// ```
+/// # use harfbuzz::Buffer;
+/// let mut b = Buffer::new();
+/// b.add_str("Hello World");
+/// assert_eq!(b.is_empty(), false);
+/// ```
+///
+/// or, more simply:
+///
+/// ```
+/// # use harfbuzz::Buffer;
+/// let b = Buffer::with("Hello World");
+/// assert_eq!(b.is_empty(), false);
+/// ```
+///
+/// ## Segment Properties
+///
+/// In addition to the text itself, there are three important properties
+/// that influence how a piece of text is shaped:
+///
+/// * Direction: The direction in which the output glyphs flow. This is
+///   typically left to right or right to left. This is controlled via
+///   the [`set_direction`] method on `Buffer`.
+/// * Script: Script is crucial for choosing the proper shaping behaviour
+///   for scripts that require it (e.g. Arabic) and the which OpenType
+///   features defined in the font to be applied. This is controlled via
+///   the [`set_script`] method on `Buffer`.
+/// * Language: Languages are crucial for selecting which OpenType feature
+///   to apply to the buffer which can result in applying language-specific
+///   behaviour. Languages are orthogonal to the scripts, and though they
+///   are related, they are different concepts and should not be confused
+///   with each other. This is controlled via the [`set_language`] method
+///   on `Buffer`.
+///
+/// Additionally, Harfbuzz can attempt to infer the values for these
+/// properties using the [`guess_segment_properties`] method on `Buffer`:
+///
+/// ```
+/// # use harfbuzz::{Buffer, Direction, sys};
+/// let mut b = Buffer::with("مساء الخير");
+/// b.guess_segment_properties();
+/// assert_eq!(b.get_direction(), Direction::RTL);
+/// assert_eq!(b.get_script(), sys::HB_SCRIPT_ARABIC);
+/// ```
+///
+/// [`set_direction`]: #method.set_direction
+/// [`set_script`]: #method.set_script
+/// [`set_language`]: #method.set_language
+/// [`guess_segment_properties`]: #method.guess_segment_properties
+pub struct Buffer {
+    /// The underlying `hb_buffer_t` from the `harfbuzz-sys` crate.
+    ///
+    /// This isn't commonly needed unless interfacing directly with
+    /// functions from the `harfbuzz-sys` crate that haven't been
+    /// safely exposed.
+    raw: *mut sys::hb_buffer_t,
+}
+
+impl Buffer {
+    /// Create a new, empty buffer.
+    ///
+    /// ```
+    /// # use harfbuzz::Buffer;
+    /// let b = Buffer::new();
+    /// assert!(b.is_empty());
+    /// ```
+    pub fn new() -> Self {
+        Buffer::default()
+    }
+
+    /// Construct a `Buffer` from a raw pointer. Takes ownership of the buffer.
+    pub unsafe fn from_raw(raw: *mut sys::hb_buffer_t) -> Self {
+        Buffer { raw }
+    }
+
+    /// Borrows a raw pointer to the buffer.
+    pub fn as_ptr(&self) -> *mut sys::hb_buffer_t {
+        self.raw
+    }
+
+    /// Gives up ownership and returns a raw pointer to the buffer.
+    pub fn into_raw(self) -> *mut sys::hb_buffer_t {
+        let raw = self.raw;
+        std::mem::forget(self);
+        raw
+    }
+
+    /// Create a new buffer with the given text.
+    pub fn with(text: &str) -> Self {
+        let mut b = Buffer::new();
+        b.add_str(text);
+        b
+    }
+
+    /// Create a new, empty buffer with the specified capacity.
+    pub fn with_capacity(capacity: usize) -> Self {
+        let mut b = Buffer::default();
+        b.reserve(capacity);
+        b
+    }
+
+    /// Add UTF-8 encoded text to the buffer.
+    pub fn add_str(&mut self, text: &str) {
+        unsafe {
+            sys::hb_buffer_add_utf8(
+                self.raw,
+                text.as_ptr() as *const std::os::raw::c_char,
+                text.len() as std::os::raw::c_int,
+                0,
+                text.len() as std::os::raw::c_int,
+            )
+        };
+    }
+
+    /// Append part of the contents of another buffer to this one.
+    ///
+    /// ```
+    /// # use harfbuzz::Buffer;
+    /// let mut b1 = Buffer::with("butter");
+    /// let b2 = Buffer::with("fly");
+    /// b1.append(&b2, 0, 3);
+    /// assert_eq!(b1.len(), "butterfly".len());
+    /// ```
+    pub fn append(&mut self, other: &Buffer, start: usize, end: usize) {
+        unsafe {
+            sys::hb_buffer_append(
+                self.raw,
+                other.raw,
+                start as std::os::raw::c_uint,
+                end as std::os::raw::c_uint,
+            )
+        };
+    }
+
+    /// Throw away text stored in the buffer, but maintain the
+    /// currently configured Unicode functions and flags.
+    ///
+    /// Text, glyph info, and segment properties will be discarded.
+    pub fn clear_contents(&mut self) {
+        unsafe { sys::hb_buffer_clear_contents(self.raw) };
+    }
+
+    /// Throw away all data stored in the buffer as well as configuration
+    /// parameters like Unicode functions, flags, and segment properties.
+    pub fn reset(&mut self) {
+        unsafe { sys::hb_buffer_reset(self.raw) };
+    }
+
+    /// Preallocate space to fit at least *size* number of items.
+    ///
+    /// FIXME: Does this correctly match the expected semantics?
+    pub fn reserve(&mut self, size: usize) {
+        unsafe { sys::hb_buffer_pre_allocate(self.raw, size as u32) };
+    }
+
+    /// Returns the number of elements in the buffer, also referred to as its 'length'.
+    pub fn len(&self) -> usize {
+        unsafe { sys::hb_buffer_get_length(self.raw) as usize }
+    }
+
+    /// Returns `true` if the buffer contains no data.
+    pub fn is_empty(&self) -> bool {
+        self.len() == 0
+    }
+
+    /// Sets unset buffer segment properties based on buffer Unicode
+    /// contents.
+    ///
+    /// If buffer is not empty, it must have content type
+    /// `HB_BUFFER_CONTENT_TYPE_UNICODE`.
+    ///
+    /// If buffer script is not set (ie. is `HB_SCRIPT_INVALID`), it will
+    /// be set to the Unicode script of the first character in the buffer
+    /// that has a script other than `HB_SCRIPT_COMMON`,
+    /// `HB_SCRIPT_INHERITED`, and `HB_SCRIPT_UNKNOWN`.
+    ///
+    /// Next, if buffer direction is not set (ie. is `Direction::Invalid`),
+    /// it will be set to the natural horizontal direction of the buffer
+    /// script as returned by `hb_script_get_horizontal_direction()`.
+    ///
+    /// Finally, if buffer language is not set (ie. is `HB_LANGUAGE_INVALID`),
+    /// it will be set to the process's default language as returned by
+    /// `hb_language_get_default()`. This may change in the future by
+    /// taking buffer script into consideration when choosing a language.
+    ///
+    /// ```
+    /// # use harfbuzz::{Buffer, Direction, sys};
+    /// let mut b = Buffer::with("Hello, world!");
+    /// b.guess_segment_properties();
+    /// assert_eq!(b.get_direction(), Direction::LTR);
+    /// assert_eq!(b.get_script(), sys::HB_SCRIPT_LATIN);
+    /// ```
+    ///
+    /// See also:
+    ///
+    /// * [`get_direction`](#method.get_direction)
+    /// * [`set_direction`](#method.set_direction)
+    /// * [`get_script`](#method.get_script)
+    /// * [`set_script`](#method.set_script)
+    /// * [`get_language`](#method.get_language)
+    /// * [`set_language`](#method.set_language)
+    pub fn guess_segment_properties(&mut self) {
+        unsafe { sys::hb_buffer_guess_segment_properties(self.raw) };
+    }
+
+    /// Set the text flow direction of the buffer.
+    ///
+    /// No shaping can happen without setting buffer direction, and
+    /// it controls the visual direction for the output glyphs; for
+    /// RTL direction the glyphs will be reversed. Many layout features
+    /// depend on the proper setting of the direction, for example,
+    /// reversing RTL text before shaping, then shaping with LTR direction
+    /// is not the same as keeping the text in logical order and shaping
+    /// with RTL direction.
+    ///
+    /// See also:
+    ///
+    /// * [`get_direction`](#method.get_direction)
+    /// * [`guess_segment_properties`](#method.guess_segment_properties)
+    pub fn set_direction(&mut self, direction: Direction) {
+        unsafe { sys::hb_buffer_set_direction(self.raw, direction.into()) };
+    }
+
+    /// Get the text flow direction for the buffer.
+    ///
+    /// See also:
+    ///
+    /// * [`set_direction`](#method.set_direction)
+    pub fn get_direction(&self) -> Direction {
+        (unsafe { sys::hb_buffer_get_direction(self.raw) }).into()
+    }
+
+    /// Sets the script of buffer to *script*.
+    ///
+    /// Script is crucial for choosing the proper shaping behaviour
+    /// for scripts that require it (e.g. Arabic) and the which
+    /// OpenType features defined in the font to be applied.
+    ///
+    /// See also:
+    ///
+    /// * [`get_script`](#method.get_script)
+    /// * [`guess_segment_properties`](#method.guess_segment_properties)
+    pub fn set_script(&mut self, script: sys::hb_script_t) {
+        unsafe { sys::hb_buffer_set_script(self.raw, script) };
+    }
+
+    /// Get the script for the buffer.
+    ///
+    /// See also:
+    ///
+    /// * [`set_script`](#method.set_script)
+    pub fn get_script(&self) -> sys::hb_script_t {
+        unsafe { sys::hb_buffer_get_script(self.raw) }
+    }
+
+    /// Sets the language of buffer to *language*.
+    ///
+    /// Languages are crucial for selecting which OpenType feature
+    /// to apply to the buffer which can result in applying
+    /// language-specific behaviour. Languages are orthogonal to
+    /// the scripts, and though they are related, they are different
+    /// concepts and should not be confused with each other.
+    ///
+    /// See also:
+    ///
+    /// * [`get_language`](#method.get_language)
+    /// * [`guess_segment_properties`](#method.guess_segment_properties)
+    pub fn set_language(&mut self, language: Language) {
+        unsafe { sys::hb_buffer_set_language(self.raw, language.as_raw()) };
+    }
+
+    /// Get the language for the buffer.
+    ///
+    /// See also:
+    ///
+    /// * [`set_language`](#method.set_language)
+    pub fn get_language(&self) -> Language {
+        unsafe { Language::from_raw(sys::hb_buffer_get_language(self.raw)) }
+    }
+}
+
+impl std::fmt::Debug for Buffer {
+    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
+        fmt.debug_struct("Buffer")
+            .field("direction", &self.get_direction())
+            .field("script", &self.get_script())
+            .field("language", &self.get_language())
+            .finish()
+    }
+}
+
+impl Default for Buffer {
+    /// Create a new, empty buffer.
+    fn default() -> Self {
+        Buffer {
+            raw: unsafe { sys::hb_buffer_create() },
+        }
+    }
+}
+
+impl Drop for Buffer {
+    fn drop(&mut self) {
+        unsafe { sys::hb_buffer_destroy(self.raw) }
+    }
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz/src/direction.rs b/third_party/rust_crates/vendor/harfbuzz/src/direction.rs
new file mode 100644
index 0000000..2bcf01d
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz/src/direction.rs
@@ -0,0 +1,92 @@
+// Copyright 2018 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use sys;
+
+/// Direction of text flow during layout.
+///
+/// This maps to the [`hb_direction_t`] from
+/// [`harfbuzz-sys`]. It can be converted to
+/// or from `hb_direction_t` using the [`From`]
+/// and [`Into`] traits:
+///
+/// ```
+/// # use harfbuzz::{Direction, sys};
+/// assert_eq!(Direction::from(sys::HB_DIRECTION_LTR), Direction::LTR);
+/// assert_eq!(sys::hb_direction_t::from(Direction::BTT), sys::HB_DIRECTION_BTT);
+///
+/// let hb_dir: sys::hb_direction_t = Direction::LTR.into();
+/// assert_eq!(hb_dir, sys::HB_DIRECTION_LTR);
+///
+/// let dir: Direction = sys::HB_DIRECTION_TTB.into();
+/// assert_eq!(dir, Direction::TTB);
+/// ```
+///
+/// [`hb_direction_t`]: ../harfbuzz_sys/type.hb_direction_t.html
+/// [`harfbuzz-sys`]: ../harfbuzz_sys/index.html
+/// [`From`]: https://doc.rust-lang.org/std/convert/trait.From.html
+/// [`Into`]: https://doc.rust-lang.org/std/convert/trait.Into.html
+#[derive(Copy, Clone, Debug, PartialEq, PartialOrd)]
+pub enum Direction {
+    /// Initial, unset direction.
+    ///
+    /// This corresponds to [`HB_DIRECTION_INVALID`].
+    ///
+    /// [`HB_DIRECTION_INVALID`]: ../harfbuzz_sys/constant.HB_DIRECTION_INVALID.html
+    Invalid,
+    /// Text is set horizontally from left to right.
+    ///
+    /// This corresponds to [`HB_DIRECTION_LTR`].
+    ///
+    /// [`HB_DIRECTION_LTR`]: ../harfbuzz_sys/constant.HB_DIRECTION_LTR.html
+    LTR,
+    /// Text is set horizontally from right to left.
+    ///
+    /// This corresponds to [`HB_DIRECTION_RTL`].
+    ///
+    /// [`HB_DIRECTION_RTL`]: ../harfbuzz_sys/constant.HB_DIRECTION_RTL.html
+    RTL,
+    /// Text is set vertically from top to bottom.
+    ///
+    /// This corresponds to [`HB_DIRECTION_TTB`].
+    ///
+    /// [`HB_DIRECTION_TTB`]: ../harfbuzz_sys/constant.HB_DIRECTION_TTB.html
+    TTB,
+    /// Text is set vertically from bottom to top.
+    ///
+    /// This corresponds to [`HB_DIRECTION_BTT`].
+    ///
+    /// [`HB_DIRECTION_BTT`]: ../harfbuzz_sys/constant.HB_DIRECTION_BTT.html
+    BTT,
+}
+
+impl From<sys::hb_direction_t> for Direction {
+    fn from(s: sys::hb_direction_t) -> Self {
+        match s {
+            sys::HB_DIRECTION_INVALID => Direction::Invalid,
+            sys::HB_DIRECTION_LTR => Direction::LTR,
+            sys::HB_DIRECTION_RTL => Direction::RTL,
+            sys::HB_DIRECTION_TTB => Direction::TTB,
+            sys::HB_DIRECTION_BTT => Direction::BTT,
+            _ => Direction::Invalid,
+        }
+    }
+}
+
+impl From<Direction> for sys::hb_direction_t {
+    fn from(s: Direction) -> Self {
+        match s {
+            Direction::Invalid => sys::HB_DIRECTION_INVALID,
+            Direction::LTR => sys::HB_DIRECTION_LTR,
+            Direction::RTL => sys::HB_DIRECTION_RTL,
+            Direction::TTB => sys::HB_DIRECTION_TTB,
+            Direction::BTT => sys::HB_DIRECTION_BTT,
+        }
+    }
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz/src/language.rs b/third_party/rust_crates/vendor/harfbuzz/src/language.rs
new file mode 100644
index 0000000..6bf9337
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz/src/language.rs
@@ -0,0 +1,77 @@
+// Copyright 2018 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(missing_docs)]
+
+use std;
+use sys;
+
+#[derive(Copy, Clone, PartialEq, PartialOrd)]
+pub struct Language {
+    /// The underlying `hb_language_t` from the `harfbuzz-sys` crate.
+    ///
+    /// This isn't commonly needed unless interfacing directly with
+    /// functions from the `harfbuzz-sys` crate that haven't been
+    /// safely exposed.
+    raw: sys::hb_language_t,
+}
+
+impl Language {
+    pub fn from_string(lang: &str) -> Self {
+        Language {
+            raw: unsafe {
+                sys::hb_language_from_string(
+                    lang.as_ptr() as *const std::os::raw::c_char,
+                    lang.len() as std::os::raw::c_int,
+                )
+            },
+        }
+    }
+
+    pub fn to_string(&self) -> &str {
+        unsafe { std::ffi::CStr::from_ptr(sys::hb_language_to_string(self.raw)) }
+            .to_str()
+            .unwrap()
+    }
+
+    pub unsafe fn from_raw(raw: sys::hb_language_t) -> Self {
+        Language { raw }
+    }
+
+    pub fn as_raw(self) -> sys::hb_language_t {
+        self.raw
+    }
+
+    pub fn get_process_default() -> Self {
+        Language {
+            raw: unsafe { sys::hb_language_get_default() },
+        }
+    }
+
+    pub fn is_valid(self) -> bool {
+        !self.raw.is_null()
+    }
+}
+
+impl std::fmt::Debug for Language {
+    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
+        fmt.write_str(self.to_string())
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::Language;
+
+    #[test]
+    fn test_lookup() {
+        let en = Language::from_string("en_US");
+        assert!(en.is_valid());
+    }
+}
diff --git a/third_party/rust_crates/vendor/harfbuzz/src/lib.rs b/third_party/rust_crates/vendor/harfbuzz/src/lib.rs
new file mode 100644
index 0000000..2e8e7ff
--- /dev/null
+++ b/third_party/rust_crates/vendor/harfbuzz/src/lib.rs
@@ -0,0 +1,28 @@
+// Copyright 2018 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! HarfBuzz is a text shaping engine. It solves the problem of selecting
+//! and positioning glyphs from a font given a Unicode string.
+
+#![warn(missing_docs)]
+#![deny(trivial_numeric_casts, unstable_features, unused_import_braces, unused_qualifications)]
+
+pub extern crate harfbuzz_sys as sys;
+
+mod buffer;
+pub use self::buffer::Buffer;
+
+mod direction;
+pub use self::direction::Direction;
+
+mod language;
+pub use self::language::Language;
+
+mod blob;
+pub use self::blob::Blob;